Merge pull request #293 from raphinesse/remove-bundled-dependencies

Remove bundled dependencies
diff --git a/.gitignore b/.gitignore
index 198f042..9ea7f23 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,82 +9,8 @@
 Thumbs.db
 /.idea/
 
-# Skip node_modules .bin folder and dev dependencies
-node_modules/.bin
-node_modules/istanbul/
-node_modules/jasmine-node/
-node_modules/jasmine/
-node_modules/jasmine-core/
-node_modules/jshint/
-node_modules/rewire/
-node_modules/align-text/
-node_modules/amdefine/
-node_modules/argparse/
-node_modules/async/
-node_modules/camelcase/
-node_modules/center-align/
-node_modules/cli/
-node_modules/cliui/
-node_modules/coffee-script/
-node_modules/console-browserify/
-node_modules/core-util-is/
-node_modules/date-now/
-node_modules/decamelize/
-node_modules/deep-is/
-node_modules/dom-serializer/
-node_modules/domelementtype/
-node_modules/domhandler/
-node_modules/domutils/
-node_modules/entities/
-node_modules/escodegen/
-node_modules/esprima/
-node_modules/estraverse/
-node_modules/esutils/
-node_modules/exit/
-node_modules/fast-levenshtein/
-node_modules/fileset/
-node_modules/fs.realpath/
-node_modules/gaze/
-node_modules/growl/
-node_modules/handlebars/
-node_modules/has-flag/
-node_modules/htmlparser2/
-node_modules/is-buffer/
-node_modules/isarray/
-node_modules/isexe/
-node_modules/jasmine-growl-reporter/
-node_modules/jasmine-reporters/
-node_modules/js-yaml/
-node_modules/kind-of/
-node_modules/lazy-cache/
-node_modules/levn/
-node_modules/longest/
-node_modules/lru-cache/
-node_modules/minimist/
-node_modules/mkdirp/
-node_modules/optimist/
-node_modules/optionator/
-node_modules/prelude-ls/
-node_modules/readable-stream/
-node_modules/repeat-string/
-node_modules/requirejs/
-node_modules/resolve/
-node_modules/right-align/
-node_modules/sigmund/
-node_modules/source-map/
-node_modules/sprintf-js/
-node_modules/string_decoder/
-node_modules/strip-json-comments/
-node_modules/supports-color/
-node_modules/type-check/
-node_modules/uglify-js/
-node_modules/uglify-to-browserify/
-node_modules/walkdir/
-node_modules/which/
-node_modules/window-size/
-node_modules/wordwrap/
-node_modules/yargs/
-
+# Skip node_modules folder
+node_modules/
 npm-debug.log
 
 # Skip testing stuff
diff --git a/node_modules/abbrev/LICENSE b/node_modules/abbrev/LICENSE
deleted file mode 100644
index 19129e3..0000000
--- a/node_modules/abbrev/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/abbrev/README.md b/node_modules/abbrev/README.md
deleted file mode 100644
index 99746fe..0000000
--- a/node_modules/abbrev/README.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# abbrev-js
-
-Just like [ruby's Abbrev](http://apidock.com/ruby/Abbrev).
-
-Usage:
-
-    var abbrev = require("abbrev");
-    abbrev("foo", "fool", "folding", "flop");
-    
-    // returns:
-    { fl: 'flop'
-    , flo: 'flop'
-    , flop: 'flop'
-    , fol: 'folding'
-    , fold: 'folding'
-    , foldi: 'folding'
-    , foldin: 'folding'
-    , folding: 'folding'
-    , foo: 'foo'
-    , fool: 'fool'
-    }
-
-This is handy for command-line scripts, or other cases where you want to be able to accept shorthands.
diff --git a/node_modules/abbrev/abbrev.js b/node_modules/abbrev/abbrev.js
deleted file mode 100644
index 69cfeac..0000000
--- a/node_modules/abbrev/abbrev.js
+++ /dev/null
@@ -1,62 +0,0 @@
-
-module.exports = exports = abbrev.abbrev = abbrev
-
-abbrev.monkeyPatch = monkeyPatch
-
-function monkeyPatch () {
-  Object.defineProperty(Array.prototype, 'abbrev', {
-    value: function () { return abbrev(this) },
-    enumerable: false, configurable: true, writable: true
-  })
-
-  Object.defineProperty(Object.prototype, 'abbrev', {
-    value: function () { return abbrev(Object.keys(this)) },
-    enumerable: false, configurable: true, writable: true
-  })
-}
-
-function abbrev (list) {
-  if (arguments.length !== 1 || !Array.isArray(list)) {
-    list = Array.prototype.slice.call(arguments, 0)
-  }
-  for (var i = 0, l = list.length, args = [] ; i < l ; i ++) {
-    args[i] = typeof list[i] === "string" ? list[i] : String(list[i])
-  }
-
-  // sort them lexicographically, so that they're next to their nearest kin
-  args = args.sort(lexSort)
-
-  // walk through each, seeing how much it has in common with the next and previous
-  var abbrevs = {}
-    , prev = ""
-  for (var i = 0, l = args.length ; i < l ; i ++) {
-    var current = args[i]
-      , next = args[i + 1] || ""
-      , nextMatches = true
-      , prevMatches = true
-    if (current === next) continue
-    for (var j = 0, cl = current.length ; j < cl ; j ++) {
-      var curChar = current.charAt(j)
-      nextMatches = nextMatches && curChar === next.charAt(j)
-      prevMatches = prevMatches && curChar === prev.charAt(j)
-      if (!nextMatches && !prevMatches) {
-        j ++
-        break
-      }
-    }
-    prev = current
-    if (j === cl) {
-      abbrevs[current] = current
-      continue
-    }
-    for (var a = current.substr(0, j) ; j <= cl ; j ++) {
-      abbrevs[a] = current
-      a += current.charAt(j)
-    }
-  }
-  return abbrevs
-}
-
-function lexSort (a, b) {
-  return a === b ? 0 : a > b ? 1 : -1
-}
diff --git a/node_modules/abbrev/package.json b/node_modules/abbrev/package.json
deleted file mode 100644
index 3e90537..0000000
--- a/node_modules/abbrev/package.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
-  "_args": [
-    [
-      "abbrev@1.0.9",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "abbrev@1.0.9",
-  "_id": "abbrev@1.0.9",
-  "_inBundle": false,
-  "_integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
-  "_location": "/abbrev",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "abbrev@1.0.9",
-    "name": "abbrev",
-    "escapedName": "abbrev",
-    "rawSpec": "1.0.9",
-    "saveSpec": null,
-    "fetchSpec": "1.0.9"
-  },
-  "_requiredBy": [
-    "/nopt"
-  ],
-  "_resolved": "http://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
-  "_spec": "1.0.9",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Isaac Z. Schlueter",
-    "email": "i@izs.me"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/abbrev-js/issues"
-  },
-  "description": "Like ruby's abbrev module, but in js",
-  "devDependencies": {
-    "tap": "^5.7.2"
-  },
-  "files": [
-    "abbrev.js"
-  ],
-  "homepage": "https://github.com/isaacs/abbrev-js#readme",
-  "license": "ISC",
-  "main": "abbrev.js",
-  "name": "abbrev",
-  "repository": {
-    "type": "git",
-    "url": "git+ssh://git@github.com/isaacs/abbrev-js.git"
-  },
-  "scripts": {
-    "test": "tap test.js --cov"
-  },
-  "version": "1.0.9"
-}
diff --git a/node_modules/ansi/.jshintrc b/node_modules/ansi/.jshintrc
deleted file mode 100644
index 248c542..0000000
--- a/node_modules/ansi/.jshintrc
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "laxcomma": true,
-  "asi": true
-}
diff --git a/node_modules/ansi/.npmignore b/node_modules/ansi/.npmignore
deleted file mode 100644
index 3c3629e..0000000
--- a/node_modules/ansi/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/node_modules/ansi/History.md b/node_modules/ansi/History.md
deleted file mode 100644
index aea8aaf..0000000
--- a/node_modules/ansi/History.md
+++ /dev/null
@@ -1,23 +0,0 @@
-
-0.3.1 / 2016-01-14
-==================
-
-  * add MIT LICENSE file (#23, @kasicka)
-  * preserve chaining after redundant style-method calls (#19, @drewblaisdell)
-  * package: add "license" field (#16, @BenjaminTsai)
-
-0.3.0 / 2014-05-09
-==================
-
-  * package: remove "test" script and "devDependencies"
-  * package: remove "engines" section
-  * pacakge: remove "bin" section
-  * package: beautify
-  * examples: remove `starwars` example (#15)
-  * Documented goto, horizontalAbsolute, and eraseLine methods in README.md (#12, @Jammerwoch)
-  * add `.jshintrc` file
-
-< 0.3.0
-=======
-
-  * Prehistoric
diff --git a/node_modules/ansi/LICENSE b/node_modules/ansi/LICENSE
deleted file mode 100644
index 2ea4dc5..0000000
--- a/node_modules/ansi/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net>
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/ansi/README.md b/node_modules/ansi/README.md
deleted file mode 100644
index 6ce1940..0000000
--- a/node_modules/ansi/README.md
+++ /dev/null
@@ -1,98 +0,0 @@
-ansi.js
-=========
-### Advanced ANSI formatting tool for Node.js
-
-`ansi.js` is a module for Node.js that provides an easy-to-use API for
-writing ANSI escape codes to `Stream` instances. ANSI escape codes are used to do
-fancy things in a terminal window, like render text in colors, delete characters,
-lines, the entire window, or hide and show the cursor, and lots more!
-
-#### Features:
-
- * 256 color support for the terminal!
- * Make a beep sound from your terminal!
- * Works with *any* writable `Stream` instance.
- * Allows you to move the cursor anywhere on the terminal window.
- * Allows you to delete existing contents from the terminal window.
- * Allows you to hide and show the cursor.
- * Converts CSS color codes and RGB values into ANSI escape codes.
- * Low-level; you are in control of when escape codes are used, it's not abstracted.
-
-
-Installation
-------------
-
-Install with `npm`:
-
-``` bash
-$ npm install ansi
-```
-
-
-Example
--------
-
-``` js
-var ansi = require('ansi')
-  , cursor = ansi(process.stdout)
-
-// You can chain your calls forever:
-cursor
-  .red()                 // Set font color to red
-  .bg.grey()             // Set background color to grey
-  .write('Hello World!') // Write 'Hello World!' to stdout
-  .bg.reset()            // Reset the bgcolor before writing the trailing \n,
-                         //      to avoid Terminal glitches
-  .write('\n')           // And a final \n to wrap things up
-
-// Rendering modes are persistent:
-cursor.hex('#660000').bold().underline()
-
-// You can use the regular logging functions, text will be green:
-console.log('This is blood red, bold text')
-
-// To reset just the foreground color:
-cursor.fg.reset()
-
-console.log('This will still be bold')
-
-// to go to a location (x,y) on the console
-// note: 1-indexed, not 0-indexed:
-cursor.goto(10, 5).write('Five down, ten over')
-
-// to clear the current line:
-cursor.horizontalAbsolute(0).eraseLine().write('Starting again')
-
-// to go to a different column on the current line:
-cursor.horizontalAbsolute(5).write('column five')
-
-// Clean up after yourself!
-cursor.reset()
-```
-
-
-License
--------
-
-(The MIT License)
-
-Copyright (c) 2012 Nathan Rajlich &lt;nathan@tootallnate.net&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/ansi/examples/beep/index.js b/node_modules/ansi/examples/beep/index.js
deleted file mode 100755
index c1ec929..0000000
--- a/node_modules/ansi/examples/beep/index.js
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env node
-
-/**
- * Invokes the terminal "beep" sound once per second on every exact second.
- */
-
-process.title = 'beep'
-
-var cursor = require('../../')(process.stdout)
-
-function beep () {
-  cursor.beep()
-  setTimeout(beep, 1000 - (new Date()).getMilliseconds())
-}
-
-setTimeout(beep, 1000 - (new Date()).getMilliseconds())
diff --git a/node_modules/ansi/examples/clear/index.js b/node_modules/ansi/examples/clear/index.js
deleted file mode 100755
index 6ac21ff..0000000
--- a/node_modules/ansi/examples/clear/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env node
-
-/**
- * Like GNU ncurses "clear" command.
- * https://github.com/mscdex/node-ncurses/blob/master/deps/ncurses/progs/clear.c
- */
-
-process.title = 'clear'
-
-function lf () { return '\n' }
-
-require('../../')(process.stdout)
-  .write(Array.apply(null, Array(process.stdout.getWindowSize()[1])).map(lf).join(''))
-  .eraseData(2)
-  .goto(1, 1)
diff --git a/node_modules/ansi/examples/cursorPosition.js b/node_modules/ansi/examples/cursorPosition.js
deleted file mode 100755
index 50f9644..0000000
--- a/node_modules/ansi/examples/cursorPosition.js
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env node
-
-var tty = require('tty')
-var cursor = require('../')(process.stdout)
-
-// listen for the queryPosition report on stdin
-process.stdin.resume()
-raw(true)
-
-process.stdin.once('data', function (b) {
-  var match = /\[(\d+)\;(\d+)R$/.exec(b.toString())
-  if (match) {
-    var xy = match.slice(1, 3).reverse().map(Number)
-    console.error(xy)
-  }
-
-  // cleanup and close stdin
-  raw(false)
-  process.stdin.pause()
-})
-
-
-// send the query position request code to stdout
-cursor.queryPosition()
-
-function raw (mode) {
-  if (process.stdin.setRawMode) {
-    process.stdin.setRawMode(mode)
-  } else {
-    tty.setRawMode(mode)
-  }
-}
diff --git a/node_modules/ansi/examples/progress/index.js b/node_modules/ansi/examples/progress/index.js
deleted file mode 100644
index d28dbda..0000000
--- a/node_modules/ansi/examples/progress/index.js
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/usr/bin/env node
-
-var assert = require('assert')
-  , ansi = require('../../')
-
-function Progress (stream, width) {
-  this.cursor = ansi(stream)
-  this.delta = this.cursor.newlines
-  this.width = width | 0 || 10
-  this.open = '['
-  this.close = ']'
-  this.complete = '█'
-  this.incomplete = '_'
-
-  // initial render
-  this.progress = 0
-}
-
-Object.defineProperty(Progress.prototype, 'progress', {
-    get: get
-  , set: set
-  , configurable: true
-  , enumerable: true
-})
-
-function get () {
-  return this._progress
-}
-
-function set (v) {
-  this._progress = Math.max(0, Math.min(v, 100))
-
-  var w = this.width - this.complete.length - this.incomplete.length
-    , n = w * (this._progress / 100) | 0
-    , i = w - n
-    , com = c(this.complete, n)
-    , inc = c(this.incomplete, i)
-    , delta = this.cursor.newlines - this.delta
-
-  assert.equal(com.length + inc.length, w)
-
-  if (delta > 0) {
-    this.cursor.up(delta)
-    this.delta = this.cursor.newlines
-  }
-
-  this.cursor
-    .horizontalAbsolute(0)
-    .eraseLine(2)
-    .fg.white()
-    .write(this.open)
-    .fg.grey()
-    .bold()
-    .write(com)
-    .resetBold()
-    .write(inc)
-    .fg.white()
-    .write(this.close)
-    .fg.reset()
-    .write('\n')
-}
-
-function c (char, length) {
-  return Array.apply(null, Array(length)).map(function () {
-    return char
-  }).join('')
-}
-
-
-
-
-// Usage
-var width = parseInt(process.argv[2], 10) || process.stdout.getWindowSize()[0] / 2
-  , p = new Progress(process.stdout, width)
-
-;(function tick () {
-  p.progress += Math.random() * 5
-  p.cursor
-    .eraseLine(2)
-    .write('Progress: ')
-    .bold().write(p.progress.toFixed(2))
-    .write('%')
-    .resetBold()
-    .write('\n')
-  if (p.progress < 100)
-    setTimeout(tick, 100)
-})()
diff --git a/node_modules/ansi/lib/ansi.js b/node_modules/ansi/lib/ansi.js
deleted file mode 100644
index b1714e3..0000000
--- a/node_modules/ansi/lib/ansi.js
+++ /dev/null
@@ -1,405 +0,0 @@
-
-/**
- * References:
- *
- *   - http://en.wikipedia.org/wiki/ANSI_escape_code
- *   - http://www.termsys.demon.co.uk/vtansi.htm
- *
- */
-
-/**
- * Module dependencies.
- */
-
-var emitNewlineEvents = require('./newlines')
-  , prefix = '\x1b[' // For all escape codes
-  , suffix = 'm'     // Only for color codes
-
-/**
- * The ANSI escape sequences.
- */
-
-var codes = {
-    up: 'A'
-  , down: 'B'
-  , forward: 'C'
-  , back: 'D'
-  , nextLine: 'E'
-  , previousLine: 'F'
-  , horizontalAbsolute: 'G'
-  , eraseData: 'J'
-  , eraseLine: 'K'
-  , scrollUp: 'S'
-  , scrollDown: 'T'
-  , savePosition: 's'
-  , restorePosition: 'u'
-  , queryPosition: '6n'
-  , hide: '?25l'
-  , show: '?25h'
-}
-
-/**
- * Rendering ANSI codes.
- */
-
-var styles = {
-    bold: 1
-  , italic: 3
-  , underline: 4
-  , inverse: 7
-}
-
-/**
- * The negating ANSI code for the rendering modes.
- */
-
-var reset = {
-    bold: 22
-  , italic: 23
-  , underline: 24
-  , inverse: 27
-}
-
-/**
- * The standard, styleable ANSI colors.
- */
-
-var colors = {
-    white: 37
-  , black: 30
-  , blue: 34
-  , cyan: 36
-  , green: 32
-  , magenta: 35
-  , red: 31
-  , yellow: 33
-  , grey: 90
-  , brightBlack: 90
-  , brightRed: 91
-  , brightGreen: 92
-  , brightYellow: 93
-  , brightBlue: 94
-  , brightMagenta: 95
-  , brightCyan: 96
-  , brightWhite: 97
-}
-
-
-/**
- * Creates a Cursor instance based off the given `writable stream` instance.
- */
-
-function ansi (stream, options) {
-  if (stream._ansicursor) {
-    return stream._ansicursor
-  } else {
-    return stream._ansicursor = new Cursor(stream, options)
-  }
-}
-module.exports = exports = ansi
-
-/**
- * The `Cursor` class.
- */
-
-function Cursor (stream, options) {
-  if (!(this instanceof Cursor)) {
-    return new Cursor(stream, options)
-  }
-  if (typeof stream != 'object' || typeof stream.write != 'function') {
-    throw new Error('a valid Stream instance must be passed in')
-  }
-
-  // the stream to use
-  this.stream = stream
-
-  // when 'enabled' is false then all the functions are no-ops except for write()
-  this.enabled = options && options.enabled
-  if (typeof this.enabled === 'undefined') {
-    this.enabled = stream.isTTY
-  }
-  this.enabled = !!this.enabled
-
-  // then `buffering` is true, then `write()` calls are buffered in
-  // memory until `flush()` is invoked
-  this.buffering = !!(options && options.buffering)
-  this._buffer = []
-
-  // controls the foreground and background colors
-  this.fg = this.foreground = new Colorer(this, 0)
-  this.bg = this.background = new Colorer(this, 10)
-
-  // defaults
-  this.Bold = false
-  this.Italic = false
-  this.Underline = false
-  this.Inverse = false
-
-  // keep track of the number of "newlines" that get encountered
-  this.newlines = 0
-  emitNewlineEvents(stream)
-  stream.on('newline', function () {
-    this.newlines++
-  }.bind(this))
-}
-exports.Cursor = Cursor
-
-/**
- * Helper function that calls `write()` on the underlying Stream.
- * Returns `this` instead of the write() return value to keep
- * the chaining going.
- */
-
-Cursor.prototype.write = function (data) {
-  if (this.buffering) {
-    this._buffer.push(arguments)
-  } else {
-    this.stream.write.apply(this.stream, arguments)
-  }
-  return this
-}
-
-/**
- * Buffer `write()` calls into memory.
- *
- * @api public
- */
-
-Cursor.prototype.buffer = function () {
-  this.buffering = true
-  return this
-}
-
-/**
- * Write out the in-memory buffer.
- *
- * @api public
- */
-
-Cursor.prototype.flush = function () {
-  this.buffering = false
-  var str = this._buffer.map(function (args) {
-    if (args.length != 1) throw new Error('unexpected args length! ' + args.length);
-    return args[0];
-  }).join('');
-  this._buffer.splice(0); // empty
-  this.write(str);
-  return this
-}
-
-
-/**
- * The `Colorer` class manages both the background and foreground colors.
- */
-
-function Colorer (cursor, base) {
-  this.current = null
-  this.cursor = cursor
-  this.base = base
-}
-exports.Colorer = Colorer
-
-/**
- * Write an ANSI color code, ensuring that the same code doesn't get rewritten.
- */
-
-Colorer.prototype._setColorCode = function setColorCode (code) {
-  var c = String(code)
-  if (this.current === c) return
-  this.cursor.enabled && this.cursor.write(prefix + c + suffix)
-  this.current = c
-  return this
-}
-
-
-/**
- * Set up the positional ANSI codes.
- */
-
-Object.keys(codes).forEach(function (name) {
-  var code = String(codes[name])
-  Cursor.prototype[name] = function () {
-    var c = code
-    if (arguments.length > 0) {
-      c = toArray(arguments).map(Math.round).join(';') + code
-    }
-    this.enabled && this.write(prefix + c)
-    return this
-  }
-})
-
-/**
- * Set up the functions for the rendering ANSI codes.
- */
-
-Object.keys(styles).forEach(function (style) {
-  var name = style[0].toUpperCase() + style.substring(1)
-    , c = styles[style]
-    , r = reset[style]
-
-  Cursor.prototype[style] = function () {
-    if (this[name]) return this
-    this.enabled && this.write(prefix + c + suffix)
-    this[name] = true
-    return this
-  }
-
-  Cursor.prototype['reset' + name] = function () {
-    if (!this[name]) return this
-    this.enabled && this.write(prefix + r + suffix)
-    this[name] = false
-    return this
-  }
-})
-
-/**
- * Setup the functions for the standard colors.
- */
-
-Object.keys(colors).forEach(function (color) {
-  var code = colors[color]
-
-  Colorer.prototype[color] = function () {
-    this._setColorCode(this.base + code)
-    return this.cursor
-  }
-
-  Cursor.prototype[color] = function () {
-    return this.foreground[color]()
-  }
-})
-
-/**
- * Makes a beep sound!
- */
-
-Cursor.prototype.beep = function () {
-  this.enabled && this.write('\x07')
-  return this
-}
-
-/**
- * Moves cursor to specific position
- */
-
-Cursor.prototype.goto = function (x, y) {
-  x = x | 0
-  y = y | 0
-  this.enabled && this.write(prefix + y + ';' + x + 'H')
-  return this
-}
-
-/**
- * Resets the color.
- */
-
-Colorer.prototype.reset = function () {
-  this._setColorCode(this.base + 39)
-  return this.cursor
-}
-
-/**
- * Resets all ANSI formatting on the stream.
- */
-
-Cursor.prototype.reset = function () {
-  this.enabled && this.write(prefix + '0' + suffix)
-  this.Bold = false
-  this.Italic = false
-  this.Underline = false
-  this.Inverse = false
-  this.foreground.current = null
-  this.background.current = null
-  return this
-}
-
-/**
- * Sets the foreground color with the given RGB values.
- * The closest match out of the 216 colors is picked.
- */
-
-Colorer.prototype.rgb = function (r, g, b) {
-  var base = this.base + 38
-    , code = rgb(r, g, b)
-  this._setColorCode(base + ';5;' + code)
-  return this.cursor
-}
-
-/**
- * Same as `cursor.fg.rgb(r, g, b)`.
- */
-
-Cursor.prototype.rgb = function (r, g, b) {
-  return this.foreground.rgb(r, g, b)
-}
-
-/**
- * Accepts CSS color codes for use with ANSI escape codes.
- * For example: `#FF000` would be bright red.
- */
-
-Colorer.prototype.hex = function (color) {
-  return this.rgb.apply(this, hex(color))
-}
-
-/**
- * Same as `cursor.fg.hex(color)`.
- */
-
-Cursor.prototype.hex = function (color) {
-  return this.foreground.hex(color)
-}
-
-
-// UTIL FUNCTIONS //
-
-/**
- * Translates a 255 RGB value to a 0-5 ANSI RGV value,
- * then returns the single ANSI color code to use.
- */
-
-function rgb (r, g, b) {
-  var red = r / 255 * 5
-    , green = g / 255 * 5
-    , blue = b / 255 * 5
-  return rgb5(red, green, blue)
-}
-
-/**
- * Turns rgb 0-5 values into a single ANSI color code to use.
- */
-
-function rgb5 (r, g, b) {
-  var red = Math.round(r)
-    , green = Math.round(g)
-    , blue = Math.round(b)
-  return 16 + (red*36) + (green*6) + blue
-}
-
-/**
- * Accepts a hex CSS color code string (# is optional) and
- * translates it into an Array of 3 RGB 0-255 values, which
- * can then be used with rgb().
- */
-
-function hex (color) {
-  var c = color[0] === '#' ? color.substring(1) : color
-    , r = c.substring(0, 2)
-    , g = c.substring(2, 4)
-    , b = c.substring(4, 6)
-  return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16)]
-}
-
-/**
- * Turns an array-like object into a real array.
- */
-
-function toArray (a) {
-  var i = 0
-    , l = a.length
-    , rtn = []
-  for (; i<l; i++) {
-    rtn.push(a[i])
-  }
-  return rtn
-}
diff --git a/node_modules/ansi/lib/newlines.js b/node_modules/ansi/lib/newlines.js
deleted file mode 100644
index 4e37a0a..0000000
--- a/node_modules/ansi/lib/newlines.js
+++ /dev/null
@@ -1,71 +0,0 @@
-
-/**
- * Accepts any node Stream instance and hijacks its "write()" function,
- * so that it can count any newlines that get written to the output.
- *
- * When a '\n' byte is encountered, then a "newline" event will be emitted
- * on the stream, with no arguments. It is up to the listeners to determine
- * any necessary deltas required for their use-case.
- *
- * Ex:
- *
- *   var cursor = ansi(process.stdout)
- *     , ln = 0
- *   process.stdout.on('newline', function () {
- *    ln++
- *   })
- */
-
-/**
- * Module dependencies.
- */
-
-var assert = require('assert')
-var NEWLINE = '\n'.charCodeAt(0)
-
-function emitNewlineEvents (stream) {
-  if (stream._emittingNewlines) {
-    // already emitting newline events
-    return
-  }
-
-  var write = stream.write
-
-  stream.write = function (data) {
-    // first write the data
-    var rtn = write.apply(stream, arguments)
-
-    if (stream.listeners('newline').length > 0) {
-      var len = data.length
-        , i = 0
-      // now try to calculate any deltas
-      if (typeof data == 'string') {
-        for (; i<len; i++) {
-          processByte(stream, data.charCodeAt(i))
-        }
-      } else {
-        // buffer
-        for (; i<len; i++) {
-          processByte(stream, data[i])
-        }
-      }
-    }
-
-    return rtn
-  }
-
-  stream._emittingNewlines = true
-}
-module.exports = emitNewlineEvents
-
-
-/**
- * Processes an individual byte being written to a stream
- */
-
-function processByte (stream, b) {
-  assert.equal(typeof b, 'number')
-  if (b === NEWLINE) {
-    stream.emit('newline')
-  }
-}
diff --git a/node_modules/ansi/package.json b/node_modules/ansi/package.json
deleted file mode 100644
index 3a08976..0000000
--- a/node_modules/ansi/package.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
-  "_args": [
-    [
-      "ansi@0.3.1",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "ansi@0.3.1",
-  "_id": "ansi@0.3.1",
-  "_inBundle": false,
-  "_integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=",
-  "_location": "/ansi",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "ansi@0.3.1",
-    "name": "ansi",
-    "escapedName": "ansi",
-    "rawSpec": "0.3.1",
-    "saveSpec": null,
-    "fetchSpec": "0.3.1"
-  },
-  "_requiredBy": [
-    "/cordova-common"
-  ],
-  "_resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz",
-  "_spec": "0.3.1",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Nathan Rajlich",
-    "email": "nathan@tootallnate.net",
-    "url": "http://tootallnate.net"
-  },
-  "bugs": {
-    "url": "https://github.com/TooTallNate/ansi.js/issues"
-  },
-  "description": "Advanced ANSI formatting tool for Node.js",
-  "homepage": "https://github.com/TooTallNate/ansi.js#readme",
-  "keywords": [
-    "ansi",
-    "formatting",
-    "cursor",
-    "color",
-    "terminal",
-    "rgb",
-    "256",
-    "stream"
-  ],
-  "license": "MIT",
-  "main": "./lib/ansi.js",
-  "name": "ansi",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/TooTallNate/ansi.js.git"
-  },
-  "version": "0.3.1"
-}
diff --git a/node_modules/balanced-match/.npmignore b/node_modules/balanced-match/.npmignore
deleted file mode 100644
index ae5d8c3..0000000
--- a/node_modules/balanced-match/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-test
-.gitignore
-.travis.yml
-Makefile
-example.js
diff --git a/node_modules/balanced-match/LICENSE.md b/node_modules/balanced-match/LICENSE.md
deleted file mode 100644
index 2cdc8e4..0000000
--- a/node_modules/balanced-match/LICENSE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-(MIT)
-
-Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/node_modules/balanced-match/README.md b/node_modules/balanced-match/README.md
deleted file mode 100644
index 08e918c..0000000
--- a/node_modules/balanced-match/README.md
+++ /dev/null
@@ -1,91 +0,0 @@
-# balanced-match
-
-Match balanced string pairs, like `{` and `}` or `<b>` and `</b>`. Supports regular expressions as well!
-
-[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match)
-[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match)
-
-[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match)
-
-## Example
-
-Get the first matching pair of braces:
-
-```js
-var balanced = require('balanced-match');
-
-console.log(balanced('{', '}', 'pre{in{nested}}post'));
-console.log(balanced('{', '}', 'pre{first}between{second}post'));
-console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre  {   in{nest}   }  post'));
-```
-
-The matches are:
-
-```bash
-$ node example.js
-{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }
-{ start: 3,
-  end: 9,
-  pre: 'pre',
-  body: 'first',
-  post: 'between{second}post' }
-{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }
-```
-
-## API
-
-### var m = balanced(a, b, str)
-
-For the first non-nested matching pair of `a` and `b` in `str`, return an
-object with those keys:
-
-* **start** the index of the first match of `a`
-* **end** the index of the matching `b`
-* **pre** the preamble, `a` and `b` not included
-* **body** the match, `a` and `b` not included
-* **post** the postscript, `a` and `b` not included
-
-If there's no match, `undefined` will be returned.
-
-If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`.
-
-### var r = balanced.range(a, b, str)
-
-For the first non-nested matching pair of `a` and `b` in `str`, return an
-array with indexes: `[ <a index>, <b index> ]`.
-
-If there's no match, `undefined` will be returned.
-
-If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`.
-
-## Installation
-
-With [npm](https://npmjs.org) do:
-
-```bash
-npm install balanced-match
-```
-
-## License
-
-(MIT)
-
-Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/node_modules/balanced-match/index.js b/node_modules/balanced-match/index.js
deleted file mode 100644
index e8d8587..0000000
--- a/node_modules/balanced-match/index.js
+++ /dev/null
@@ -1,58 +0,0 @@
-module.exports = balanced;
-function balanced(a, b, str) {
-  if (a instanceof RegExp) a = maybeMatch(a, str);
-  if (b instanceof RegExp) b = maybeMatch(b, str);
-
-  var r = range(a, b, str);
-
-  return r && {
-    start: r[0],
-    end: r[1],
-    pre: str.slice(0, r[0]),
-    body: str.slice(r[0] + a.length, r[1]),
-    post: str.slice(r[1] + b.length)
-  };
-}
-
-function maybeMatch(reg, str) {
-  var m = str.match(reg);
-  return m ? m[0] : null;
-}
-
-balanced.range = range;
-function range(a, b, str) {
-  var begs, beg, left, right, result;
-  var ai = str.indexOf(a);
-  var bi = str.indexOf(b, ai + 1);
-  var i = ai;
-
-  if (ai >= 0 && bi > 0) {
-    begs = [];
-    left = str.length;
-
-    while (i >= 0 && !result) {
-      if (i == ai) {
-        begs.push(i);
-        ai = str.indexOf(a, i + 1);
-      } else if (begs.length == 1) {
-        result = [ begs.pop(), bi ];
-      } else {
-        beg = begs.pop();
-        if (beg < left) {
-          left = beg;
-          right = bi;
-        }
-
-        bi = str.indexOf(b, i + 1);
-      }
-
-      i = ai < bi && ai >= 0 ? ai : bi;
-    }
-
-    if (begs.length) {
-      result = [ left, right ];
-    }
-  }
-
-  return result;
-}
diff --git a/node_modules/balanced-match/package.json b/node_modules/balanced-match/package.json
deleted file mode 100644
index c6c7fb9..0000000
--- a/node_modules/balanced-match/package.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
-  "_args": [
-    [
-      "balanced-match@0.4.2",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "balanced-match@0.4.2",
-  "_id": "balanced-match@0.4.2",
-  "_inBundle": false,
-  "_integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
-  "_location": "/balanced-match",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "balanced-match@0.4.2",
-    "name": "balanced-match",
-    "escapedName": "balanced-match",
-    "rawSpec": "0.4.2",
-    "saveSpec": null,
-    "fetchSpec": "0.4.2"
-  },
-  "_requiredBy": [
-    "/brace-expansion"
-  ],
-  "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
-  "_spec": "0.4.2",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Julian Gruber",
-    "email": "mail@juliangruber.com",
-    "url": "http://juliangruber.com"
-  },
-  "bugs": {
-    "url": "https://github.com/juliangruber/balanced-match/issues"
-  },
-  "dependencies": {},
-  "description": "Match balanced character pairs, like \"{\" and \"}\"",
-  "devDependencies": {
-    "tape": "^4.6.0"
-  },
-  "homepage": "https://github.com/juliangruber/balanced-match",
-  "keywords": [
-    "match",
-    "regexp",
-    "test",
-    "balanced",
-    "parse"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "balanced-match",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/juliangruber/balanced-match.git"
-  },
-  "scripts": {
-    "test": "make test"
-  },
-  "testling": {
-    "files": "test/*.js",
-    "browsers": [
-      "ie/8..latest",
-      "firefox/20..latest",
-      "firefox/nightly",
-      "chrome/25..latest",
-      "chrome/canary",
-      "opera/12..latest",
-      "opera/next",
-      "safari/5.1..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "android-browser/4.2..latest"
-    ]
-  },
-  "version": "0.4.2"
-}
diff --git a/node_modules/base64-js/.travis.yml b/node_modules/base64-js/.travis.yml
deleted file mode 100644
index 939cb51..0000000
--- a/node_modules/base64-js/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-node_js:
-  - "0.8"
-  - "0.10"
-  - "0.11"
\ No newline at end of file
diff --git a/node_modules/base64-js/LICENSE.MIT b/node_modules/base64-js/LICENSE.MIT
deleted file mode 100644
index 96d3f68..0000000
--- a/node_modules/base64-js/LICENSE.MIT
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/node_modules/base64-js/README.md b/node_modules/base64-js/README.md
deleted file mode 100644
index ed31d1a..0000000
--- a/node_modules/base64-js/README.md
+++ /dev/null
@@ -1,31 +0,0 @@
-base64-js
-=========
-
-`base64-js` does basic base64 encoding/decoding in pure JS.
-
-[![build status](https://secure.travis-ci.org/beatgammit/base64-js.png)](http://travis-ci.org/beatgammit/base64-js)
-
-[![testling badge](https://ci.testling.com/beatgammit/base64-js.png)](https://ci.testling.com/beatgammit/base64-js)
-
-Many browsers already have base64 encoding/decoding functionality, but it is for text data, not all-purpose binary data.
-
-Sometimes encoding/decoding binary data in the browser is useful, and that is what this module does.
-
-## install
-
-With [npm](https://npmjs.org) do:
-
-`npm install base64-js`
-
-## methods
-
-`var base64 = require('base64-js')`
-
-`base64` has two exposed functions, `toByteArray` and `fromByteArray`, which both take a single argument.
-
-* `toByteArray` - Takes a base64 string and returns a byte array
-* `fromByteArray` - Takes a byte array and returns a base64 string
-
-## license
-
-MIT
\ No newline at end of file
diff --git a/node_modules/base64-js/bench/bench.js b/node_modules/base64-js/bench/bench.js
deleted file mode 100644
index 0689e08..0000000
--- a/node_modules/base64-js/bench/bench.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var random = require('crypto').pseudoRandomBytes
-
-var b64 = require('../')
-var fs = require('fs')
-var path = require('path')
-var data = random(1e6).toString('base64')
-//fs.readFileSync(path.join(__dirname, 'example.b64'), 'ascii').split('\n').join('')
-var start = Date.now()
-var raw = b64.toByteArray(data)
-var middle = Date.now()
-var data = b64.fromByteArray(raw)
-var end = Date.now()
-
-console.log('decode ms, decode ops/ms, encode ms, encode ops/ms')
-console.log(
-	middle - start,  data.length / (middle - start), 
-	end - middle,  data.length / (end - middle))
-//console.log(data)
-
diff --git a/node_modules/base64-js/lib/b64.js b/node_modules/base64-js/lib/b64.js
deleted file mode 100644
index 46001d2..0000000
--- a/node_modules/base64-js/lib/b64.js
+++ /dev/null
@@ -1,124 +0,0 @@
-var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
-
-;(function (exports) {
-	'use strict';
-
-  var Arr = (typeof Uint8Array !== 'undefined')
-    ? Uint8Array
-    : Array
-
-	var PLUS   = '+'.charCodeAt(0)
-	var SLASH  = '/'.charCodeAt(0)
-	var NUMBER = '0'.charCodeAt(0)
-	var LOWER  = 'a'.charCodeAt(0)
-	var UPPER  = 'A'.charCodeAt(0)
-	var PLUS_URL_SAFE = '-'.charCodeAt(0)
-	var SLASH_URL_SAFE = '_'.charCodeAt(0)
-
-	function decode (elt) {
-		var code = elt.charCodeAt(0)
-		if (code === PLUS ||
-		    code === PLUS_URL_SAFE)
-			return 62 // '+'
-		if (code === SLASH ||
-		    code === SLASH_URL_SAFE)
-			return 63 // '/'
-		if (code < NUMBER)
-			return -1 //no match
-		if (code < NUMBER + 10)
-			return code - NUMBER + 26 + 26
-		if (code < UPPER + 26)
-			return code - UPPER
-		if (code < LOWER + 26)
-			return code - LOWER + 26
-	}
-
-	function b64ToByteArray (b64) {
-		var i, j, l, tmp, placeHolders, arr
-
-		if (b64.length % 4 > 0) {
-			throw new Error('Invalid string. Length must be a multiple of 4')
-		}
-
-		// the number of equal signs (place holders)
-		// if there are two placeholders, than the two characters before it
-		// represent one byte
-		// if there is only one, then the three characters before it represent 2 bytes
-		// this is just a cheap hack to not do indexOf twice
-		var len = b64.length
-		placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
-
-		// base64 is 4/3 + up to two characters of the original data
-		arr = new Arr(b64.length * 3 / 4 - placeHolders)
-
-		// if there are placeholders, only get up to the last complete 4 chars
-		l = placeHolders > 0 ? b64.length - 4 : b64.length
-
-		var L = 0
-
-		function push (v) {
-			arr[L++] = v
-		}
-
-		for (i = 0, j = 0; i < l; i += 4, j += 3) {
-			tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
-			push((tmp & 0xFF0000) >> 16)
-			push((tmp & 0xFF00) >> 8)
-			push(tmp & 0xFF)
-		}
-
-		if (placeHolders === 2) {
-			tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
-			push(tmp & 0xFF)
-		} else if (placeHolders === 1) {
-			tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
-			push((tmp >> 8) & 0xFF)
-			push(tmp & 0xFF)
-		}
-
-		return arr
-	}
-
-	function uint8ToBase64 (uint8) {
-		var i,
-			extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
-			output = "",
-			temp, length
-
-		function encode (num) {
-			return lookup.charAt(num)
-		}
-
-		function tripletToBase64 (num) {
-			return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
-		}
-
-		// go through the array every three bytes, we'll deal with trailing stuff later
-		for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
-			temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
-			output += tripletToBase64(temp)
-		}
-
-		// pad the end with zeros, but make sure to not forget the extra bytes
-		switch (extraBytes) {
-			case 1:
-				temp = uint8[uint8.length - 1]
-				output += encode(temp >> 2)
-				output += encode((temp << 4) & 0x3F)
-				output += '=='
-				break
-			case 2:
-				temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
-				output += encode(temp >> 10)
-				output += encode((temp >> 4) & 0x3F)
-				output += encode((temp << 2) & 0x3F)
-				output += '='
-				break
-		}
-
-		return output
-	}
-
-	exports.toByteArray = b64ToByteArray
-	exports.fromByteArray = uint8ToBase64
-}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
diff --git a/node_modules/base64-js/package.json b/node_modules/base64-js/package.json
deleted file mode 100644
index 801b9a1..0000000
--- a/node_modules/base64-js/package.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "_args": [
-    [
-      "base64-js@0.0.8",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "base64-js@0.0.8",
-  "_id": "base64-js@0.0.8",
-  "_inBundle": false,
-  "_integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=",
-  "_location": "/base64-js",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "base64-js@0.0.8",
-    "name": "base64-js",
-    "escapedName": "base64-js",
-    "rawSpec": "0.0.8",
-    "saveSpec": null,
-    "fetchSpec": "0.0.8"
-  },
-  "_requiredBy": [
-    "/plist"
-  ],
-  "_resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
-  "_spec": "0.0.8",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "T. Jameson Little",
-    "email": "t.jameson.little@gmail.com"
-  },
-  "bugs": {
-    "url": "https://github.com/beatgammit/base64-js/issues"
-  },
-  "dependencies": {},
-  "description": "Base64 encoding/decoding in pure JS",
-  "devDependencies": {
-    "tape": "~2.3.2"
-  },
-  "engines": {
-    "node": ">= 0.4"
-  },
-  "homepage": "https://github.com/beatgammit/base64-js#readme",
-  "license": "MIT",
-  "main": "lib/b64.js",
-  "name": "base64-js",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/beatgammit/base64-js.git"
-  },
-  "scripts": {
-    "test": "tape test/*.js"
-  },
-  "testling": {
-    "files": "test/*.js",
-    "browsers": [
-      "ie/6..latest",
-      "chrome/4..latest",
-      "firefox/3..latest",
-      "safari/5.1..latest",
-      "opera/11.0..latest",
-      "iphone/6",
-      "ipad/6"
-    ]
-  },
-  "version": "0.0.8"
-}
diff --git a/node_modules/base64-js/test/convert.js b/node_modules/base64-js/test/convert.js
deleted file mode 100644
index 60b09c0..0000000
--- a/node_modules/base64-js/test/convert.js
+++ /dev/null
@@ -1,51 +0,0 @@
-var test = require('tape'),
-  b64 = require('../lib/b64'),
-	checks = [
-		'a',
-		'aa',
-		'aaa',
-		'hi',
-		'hi!',
-		'hi!!',
-		'sup',
-		'sup?',
-		'sup?!'
-	];
-
-test('convert to base64 and back', function (t) {
-  t.plan(checks.length);
-
-  for (var i = 0; i < checks.length; i++) {
-    var check = checks[i],
-      b64Str,
-      arr,
-      str;
-
-    b64Str = b64.fromByteArray(map(check, function (char) { return char.charCodeAt(0); }));
-
-    arr = b64.toByteArray(b64Str);
-    str = map(arr, function (byte) { return String.fromCharCode(byte); }).join('');
-
-    t.equal(check, str, 'Checked ' + check);
-  }
-
-});
-
-function map (arr, callback) {
-	var res = [],
-    kValue,
-    mappedValue;
-
-	for (var k = 0, len = arr.length; k < len; k++) {
-		if ((typeof arr === 'string' && !!arr.charAt(k))) {
-			kValue = arr.charAt(k);
-			mappedValue = callback(kValue, k, arr);
-			res[k] = mappedValue;
-		} else if (typeof arr !== 'string' && k in arr) {
-			kValue = arr[k];
-			mappedValue = callback(kValue, k, arr);
-			res[k] = mappedValue;
-		}
-	}
-	return res;
-}
diff --git a/node_modules/base64-js/test/url-safe.js b/node_modules/base64-js/test/url-safe.js
deleted file mode 100644
index dc437e9..0000000
--- a/node_modules/base64-js/test/url-safe.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var test = require('tape'),
-  b64 = require('../lib/b64');
-
-test('decode url-safe style base64 strings', function (t) {
-  var expected = [0xff, 0xff, 0xbe, 0xff, 0xef, 0xbf, 0xfb, 0xef, 0xff];
-
-  var actual = b64.toByteArray('//++/++/++//');
-  for (var i = 0; i < actual.length; i++) {
-    t.equal(actual[i], expected[i])
-  }
-
-  actual = b64.toByteArray('__--_--_--__');
-  for (var i = 0; i < actual.length; i++) {
-    t.equal(actual[i], expected[i])
-  }
-  
-  t.end();
-});
diff --git a/node_modules/big-integer/BigInteger.d.ts b/node_modules/big-integer/BigInteger.d.ts
deleted file mode 100644
index d70e401..0000000
--- a/node_modules/big-integer/BigInteger.d.ts
+++ /dev/null
@@ -1,2369 +0,0 @@
-/**
- * Type definitions for BigInteger.js
- * Definitions by: Tommy Frazier <https://github.com/toefraz>
- */
-export = bigInt;
-export as namespace bigInt;
-
-declare var bigInt: bigInt.BigIntegerStatic;
-
-declare namespace bigInt {
-    type BigNumber = number | string | BigInteger;
-
-    interface BigIntegerStatic {
-        /**
-         * Equivalent to bigInt(0).
-         */
-        (): BigInteger;
-
-        /**
-         * Parse a Javascript number into a bigInt.
-         */
-        (number: number): BigInteger;
-
-        /**
-         * Parse a string into a bigInt.
-         */
-        (string: string, base?: BigNumber): BigInteger;
-
-        /**
-         * no-op.
-         */
-        (bigInt: BigInteger): BigInteger;
-
-        /**
-         * Constructs a bigInt from an array of digits in specified base.
-         * The optional isNegative flag will make the number negative.
-         */
-        fromArray: (digits: BigNumber[], base?: BigNumber, isNegative?: boolean) => BigInteger;
-
-        /**
-         * Finds the greatest common denominator of a and b.
-         */
-        gcd: (a: BigNumber, b: BigNumber) => BigInteger;
-
-
-        /**
-         * Returns true if x is a BigInteger, false otherwise.
-         */
-        isInstance: (x: any) => boolean;
-
-        /**
-         * Finds the least common multiple of a and b.
-         */
-        lcm: (a: BigNumber, b: BigNumber) => BigInteger;
-
-        /**
-         * Returns the largest of a and b.
-         */
-        max: (a: BigNumber, b: BigNumber) => BigInteger;
-
-        /**
-         * Returns the smallest of a and b.
-         */
-        min: (a: BigNumber, b: BigNumber) => BigInteger;
-
-        /**
-         * Equivalent to bigInt(-1).
-         */
-        minusOne:  BigInteger;
-
-        /**
-         * Equivalent to bigInt(1).
-         */
-        one:  BigInteger;
-
-        /**
-         * Returns a random number between min and max.
-         */
-        randBetween: (min: BigNumber, max: BigNumber) => BigInteger;
-
-        /**
-         * Equivalent to bigInt(0).
-         */
-        zero: BigInteger;
-    }
-
-    interface BigInteger {
-        /**
-         * Returns the absolute value of a bigInt.
-         */
-        abs(): BigInteger;
-
-        /**
-         * Performs addition.
-         */
-        add(number: BigNumber): BigInteger;
-
-        /**
-         * Performs the bitwise AND operation.
-         */
-        and(number: BigNumber): BigInteger;
-
-        /**
-         * Performs a comparison between two numbers. If the numbers are equal, it returns 0.
-         * If the first number is greater, it returns 1. If the first number is lesser, it returns -1.
-         */
-        compare(number: BigNumber): number;
-
-        /**
-         * Performs a comparison between the absolute value of two numbers.
-         */
-        compareAbs(number: BigNumber): number;
-
-        /**
-         * Alias for the compare method.
-         */
-        compareTo(number: BigNumber): number;
-
-        /**
-         * Performs integer division, disregarding the remainder.
-         */
-        divide(number: BigNumber): BigInteger;
-
-        /**
-         * Performs division and returns an object with two properties: quotient and remainder.
-         * The sign of the remainder will match the sign of the dividend.
-         */
-        divmod(number: BigNumber): {quotient: BigInteger, remainder: BigInteger};
-
-        /**
-         * Alias for the equals method.
-         */
-        eq(number: BigNumber): boolean;
-
-        /**
-         * Checks if two numbers are equal.
-         */
-        equals(number: BigNumber): boolean;
-
-        /**
-         * Alias for the greaterOrEquals method.
-         */
-        geq(number: BigNumber): boolean;
-
-        /**
-         * Checks if the first number is greater than the second.
-         */
-        greater(number: BigNumber): boolean;
-
-        /**
-         * Checks if the first number is greater than or equal to the second.
-         */
-        greaterOrEquals(number: BigNumber): boolean;
-
-        /**
-         * Alias for the greater method.
-         */
-        gt(number: BigNumber): boolean;
-
-        /**
-         * Returns true if the first number is divisible by the second number, false otherwise.
-         */
-        isDivisibleBy(number: BigNumber): boolean;
-
-        /**
-         * Returns true if the number is even, false otherwise.
-         */
-        isEven(): boolean;
-
-        /**
-         * Returns true if the number is negative, false otherwise.
-         * Returns false for 0 and true for -0.
-         */
-        isNegative(): boolean;
-
-        /**
-         * Returns true if the number is odd, false otherwise.
-         */
-        isOdd(): boolean;
-
-        /**
-         * Return true if the number is positive, false otherwise.
-         * Returns true for 0 and false for -0.
-         */
-        isPositive(): boolean;
-
-        /**
-         * Returns true if the number is prime, false otherwise.
-         */
-        isPrime(): boolean;
-
-        /**
-         * Returns true if the number is very likely to be prime, false otherwise.
-         */
-        isProbablePrime(iterations?: number): boolean;
-
-        /**
-         * Returns true if the number is 1 or -1, false otherwise.
-         */
-        isUnit(): boolean;
-
-        /**
-         * Return true if the number is 0 or -0, false otherwise.
-         */
-        isZero(): boolean;
-
-        /**
-         * Alias for the lesserOrEquals method.
-         */
-        leq(number: BigNumber): boolean;
-
-        /**
-         * Checks if the first number is lesser than the second.
-         */
-        lesser(number: BigNumber): boolean;
-
-        /**
-         * Checks if the first number is less than or equal to the second.
-         */
-        lesserOrEquals(number: BigNumber): boolean;
-
-        /**
-         * Alias for the lesser method.
-         */
-        lt(number: BigNumber): boolean;
-
-        /**
-         * Alias for the subtract method.
-         */
-        minus(number: BigNumber): BigInteger;
-
-        /**
-         * Performs division and returns the remainder, disregarding the quotient.
-         * The sign of the remainder will match the sign of the dividend.
-         */
-        mod(number: BigNumber): BigInteger;
-
-        /**
-         * Finds the multiplicative inverse of the number modulo mod.
-         */
-        modInv(number: BigNumber): BigInteger;
-
-        /**
-         * Takes the number to the power exp modulo mod.
-         */
-        modPow(exp: BigNumber, mod: BigNumber): BigInteger;
-
-        /**
-         * Performs multiplication.
-         */
-        multiply(number: BigNumber): BigInteger;
-
-        /**
-         * Reverses the sign of the number.
-         */
-        negate(): BigInteger;
-
-        /**
-         * Alias for the notEquals method.
-         */
-        neq(number: BigNumber): boolean;
-
-        /**
-         * Adds one to the number.
-         */
-        next(): BigInteger;
-
-        /**
-         * Performs the bitwise NOT operation.
-         */
-        not(): BigInteger;
-
-        /**
-         * Checks if two numbers are not equal.
-         */
-        notEquals(number: BigNumber): boolean;
-
-        /**
-         * Performs the bitwise OR operation.
-         */
-        or(number: BigNumber): BigInteger;
-
-        /**
-         * Alias for the divide method.
-         */
-        over(number: BigNumber): BigInteger;
-
-        /**
-         * Alias for the add method.
-         */
-        plus(number: BigNumber): BigInteger;
-
-        /**
-         * Performs exponentiation. If the exponent is less than 0, pow returns 0.
-         * bigInt.zero.pow(0) returns 1.
-         */
-        pow(number: BigNumber): BigInteger;
-
-        /**
-         * Subtracts one from the number.
-         */
-        prev(): BigInteger;
-
-        /**
-         * Alias for the mod method.
-         */
-        remainder(number: BigNumber): BigInteger;
-
-        /**
-         * Shifts the number left by n places in its binary representation.
-         * If a negative number is provided, it will shift right.
-         *
-         * Throws an error if number is outside of the range [-9007199254740992, 9007199254740992].
-         */
-        shiftLeft(number: BigNumber): BigInteger;
-
-        /**
-         * Shifts the number right by n places in its binary representation.
-         * If a negative number is provided, it will shift left.
-         *
-         * Throws an error if number is outside of the range [-9007199254740992, 9007199254740992].
-         */
-        shiftRight(number: BigNumber): BigInteger;
-
-        /**
-         * Squares the number.
-         */
-        square(): BigInteger;
-
-        /**
-         * Performs subtraction.
-         */
-        subtract(number: BigNumber): BigInteger;
-
-        /**
-         * Alias for the multiply method.
-         */
-        times(number: BigNumber): BigInteger;
-
-        /**
-         * Converts a bigInt into a native Javascript number. Loses precision for numbers outside the range.
-         */
-        toJSNumber(): number;
-
-        /**
-         * Converts a bigInt to a string.
-         */
-        toString(radix?: number): string;
-		
-		/**
-         * Converts a bigInt to a string. This method is called behind the scenes in JSON.stringify.
-         */
-        toJSON(): string;
-
-        /**
-         * Converts a bigInt to a native Javascript number. This override allows you to use native
-         * arithmetic operators without explicit conversion.
-         */
-        valueOf(): number;
-
-        /**
-         * Performs the bitwise XOR operation.
-         */
-        xor(number: BigNumber): BigInteger;
-    }
-
-    // Array constant accessors
-    interface BigIntegerStatic {
-        '-999': BigInteger;
-        '-998': BigInteger;
-        '-997': BigInteger;
-        '-996': BigInteger;
-        '-995': BigInteger;
-        '-994': BigInteger;
-        '-993': BigInteger;
-        '-992': BigInteger;
-        '-991': BigInteger;
-        '-990': BigInteger;
-        '-989': BigInteger;
-        '-988': BigInteger;
-        '-987': BigInteger;
-        '-986': BigInteger;
-        '-985': BigInteger;
-        '-984': BigInteger;
-        '-983': BigInteger;
-        '-982': BigInteger;
-        '-981': BigInteger;
-        '-980': BigInteger;
-        '-979': BigInteger;
-        '-978': BigInteger;
-        '-977': BigInteger;
-        '-976': BigInteger;
-        '-975': BigInteger;
-        '-974': BigInteger;
-        '-973': BigInteger;
-        '-972': BigInteger;
-        '-971': BigInteger;
-        '-970': BigInteger;
-        '-969': BigInteger;
-        '-968': BigInteger;
-        '-967': BigInteger;
-        '-966': BigInteger;
-        '-965': BigInteger;
-        '-964': BigInteger;
-        '-963': BigInteger;
-        '-962': BigInteger;
-        '-961': BigInteger;
-        '-960': BigInteger;
-        '-959': BigInteger;
-        '-958': BigInteger;
-        '-957': BigInteger;
-        '-956': BigInteger;
-        '-955': BigInteger;
-        '-954': BigInteger;
-        '-953': BigInteger;
-        '-952': BigInteger;
-        '-951': BigInteger;
-        '-950': BigInteger;
-        '-949': BigInteger;
-        '-948': BigInteger;
-        '-947': BigInteger;
-        '-946': BigInteger;
-        '-945': BigInteger;
-        '-944': BigInteger;
-        '-943': BigInteger;
-        '-942': BigInteger;
-        '-941': BigInteger;
-        '-940': BigInteger;
-        '-939': BigInteger;
-        '-938': BigInteger;
-        '-937': BigInteger;
-        '-936': BigInteger;
-        '-935': BigInteger;
-        '-934': BigInteger;
-        '-933': BigInteger;
-        '-932': BigInteger;
-        '-931': BigInteger;
-        '-930': BigInteger;
-        '-929': BigInteger;
-        '-928': BigInteger;
-        '-927': BigInteger;
-        '-926': BigInteger;
-        '-925': BigInteger;
-        '-924': BigInteger;
-        '-923': BigInteger;
-        '-922': BigInteger;
-        '-921': BigInteger;
-        '-920': BigInteger;
-        '-919': BigInteger;
-        '-918': BigInteger;
-        '-917': BigInteger;
-        '-916': BigInteger;
-        '-915': BigInteger;
-        '-914': BigInteger;
-        '-913': BigInteger;
-        '-912': BigInteger;
-        '-911': BigInteger;
-        '-910': BigInteger;
-        '-909': BigInteger;
-        '-908': BigInteger;
-        '-907': BigInteger;
-        '-906': BigInteger;
-        '-905': BigInteger;
-        '-904': BigInteger;
-        '-903': BigInteger;
-        '-902': BigInteger;
-        '-901': BigInteger;
-        '-900': BigInteger;
-        '-899': BigInteger;
-        '-898': BigInteger;
-        '-897': BigInteger;
-        '-896': BigInteger;
-        '-895': BigInteger;
-        '-894': BigInteger;
-        '-893': BigInteger;
-        '-892': BigInteger;
-        '-891': BigInteger;
-        '-890': BigInteger;
-        '-889': BigInteger;
-        '-888': BigInteger;
-        '-887': BigInteger;
-        '-886': BigInteger;
-        '-885': BigInteger;
-        '-884': BigInteger;
-        '-883': BigInteger;
-        '-882': BigInteger;
-        '-881': BigInteger;
-        '-880': BigInteger;
-        '-879': BigInteger;
-        '-878': BigInteger;
-        '-877': BigInteger;
-        '-876': BigInteger;
-        '-875': BigInteger;
-        '-874': BigInteger;
-        '-873': BigInteger;
-        '-872': BigInteger;
-        '-871': BigInteger;
-        '-870': BigInteger;
-        '-869': BigInteger;
-        '-868': BigInteger;
-        '-867': BigInteger;
-        '-866': BigInteger;
-        '-865': BigInteger;
-        '-864': BigInteger;
-        '-863': BigInteger;
-        '-862': BigInteger;
-        '-861': BigInteger;
-        '-860': BigInteger;
-        '-859': BigInteger;
-        '-858': BigInteger;
-        '-857': BigInteger;
-        '-856': BigInteger;
-        '-855': BigInteger;
-        '-854': BigInteger;
-        '-853': BigInteger;
-        '-852': BigInteger;
-        '-851': BigInteger;
-        '-850': BigInteger;
-        '-849': BigInteger;
-        '-848': BigInteger;
-        '-847': BigInteger;
-        '-846': BigInteger;
-        '-845': BigInteger;
-        '-844': BigInteger;
-        '-843': BigInteger;
-        '-842': BigInteger;
-        '-841': BigInteger;
-        '-840': BigInteger;
-        '-839': BigInteger;
-        '-838': BigInteger;
-        '-837': BigInteger;
-        '-836': BigInteger;
-        '-835': BigInteger;
-        '-834': BigInteger;
-        '-833': BigInteger;
-        '-832': BigInteger;
-        '-831': BigInteger;
-        '-830': BigInteger;
-        '-829': BigInteger;
-        '-828': BigInteger;
-        '-827': BigInteger;
-        '-826': BigInteger;
-        '-825': BigInteger;
-        '-824': BigInteger;
-        '-823': BigInteger;
-        '-822': BigInteger;
-        '-821': BigInteger;
-        '-820': BigInteger;
-        '-819': BigInteger;
-        '-818': BigInteger;
-        '-817': BigInteger;
-        '-816': BigInteger;
-        '-815': BigInteger;
-        '-814': BigInteger;
-        '-813': BigInteger;
-        '-812': BigInteger;
-        '-811': BigInteger;
-        '-810': BigInteger;
-        '-809': BigInteger;
-        '-808': BigInteger;
-        '-807': BigInteger;
-        '-806': BigInteger;
-        '-805': BigInteger;
-        '-804': BigInteger;
-        '-803': BigInteger;
-        '-802': BigInteger;
-        '-801': BigInteger;
-        '-800': BigInteger;
-        '-799': BigInteger;
-        '-798': BigInteger;
-        '-797': BigInteger;
-        '-796': BigInteger;
-        '-795': BigInteger;
-        '-794': BigInteger;
-        '-793': BigInteger;
-        '-792': BigInteger;
-        '-791': BigInteger;
-        '-790': BigInteger;
-        '-789': BigInteger;
-        '-788': BigInteger;
-        '-787': BigInteger;
-        '-786': BigInteger;
-        '-785': BigInteger;
-        '-784': BigInteger;
-        '-783': BigInteger;
-        '-782': BigInteger;
-        '-781': BigInteger;
-        '-780': BigInteger;
-        '-779': BigInteger;
-        '-778': BigInteger;
-        '-777': BigInteger;
-        '-776': BigInteger;
-        '-775': BigInteger;
-        '-774': BigInteger;
-        '-773': BigInteger;
-        '-772': BigInteger;
-        '-771': BigInteger;
-        '-770': BigInteger;
-        '-769': BigInteger;
-        '-768': BigInteger;
-        '-767': BigInteger;
-        '-766': BigInteger;
-        '-765': BigInteger;
-        '-764': BigInteger;
-        '-763': BigInteger;
-        '-762': BigInteger;
-        '-761': BigInteger;
-        '-760': BigInteger;
-        '-759': BigInteger;
-        '-758': BigInteger;
-        '-757': BigInteger;
-        '-756': BigInteger;
-        '-755': BigInteger;
-        '-754': BigInteger;
-        '-753': BigInteger;
-        '-752': BigInteger;
-        '-751': BigInteger;
-        '-750': BigInteger;
-        '-749': BigInteger;
-        '-748': BigInteger;
-        '-747': BigInteger;
-        '-746': BigInteger;
-        '-745': BigInteger;
-        '-744': BigInteger;
-        '-743': BigInteger;
-        '-742': BigInteger;
-        '-741': BigInteger;
-        '-740': BigInteger;
-        '-739': BigInteger;
-        '-738': BigInteger;
-        '-737': BigInteger;
-        '-736': BigInteger;
-        '-735': BigInteger;
-        '-734': BigInteger;
-        '-733': BigInteger;
-        '-732': BigInteger;
-        '-731': BigInteger;
-        '-730': BigInteger;
-        '-729': BigInteger;
-        '-728': BigInteger;
-        '-727': BigInteger;
-        '-726': BigInteger;
-        '-725': BigInteger;
-        '-724': BigInteger;
-        '-723': BigInteger;
-        '-722': BigInteger;
-        '-721': BigInteger;
-        '-720': BigInteger;
-        '-719': BigInteger;
-        '-718': BigInteger;
-        '-717': BigInteger;
-        '-716': BigInteger;
-        '-715': BigInteger;
-        '-714': BigInteger;
-        '-713': BigInteger;
-        '-712': BigInteger;
-        '-711': BigInteger;
-        '-710': BigInteger;
-        '-709': BigInteger;
-        '-708': BigInteger;
-        '-707': BigInteger;
-        '-706': BigInteger;
-        '-705': BigInteger;
-        '-704': BigInteger;
-        '-703': BigInteger;
-        '-702': BigInteger;
-        '-701': BigInteger;
-        '-700': BigInteger;
-        '-699': BigInteger;
-        '-698': BigInteger;
-        '-697': BigInteger;
-        '-696': BigInteger;
-        '-695': BigInteger;
-        '-694': BigInteger;
-        '-693': BigInteger;
-        '-692': BigInteger;
-        '-691': BigInteger;
-        '-690': BigInteger;
-        '-689': BigInteger;
-        '-688': BigInteger;
-        '-687': BigInteger;
-        '-686': BigInteger;
-        '-685': BigInteger;
-        '-684': BigInteger;
-        '-683': BigInteger;
-        '-682': BigInteger;
-        '-681': BigInteger;
-        '-680': BigInteger;
-        '-679': BigInteger;
-        '-678': BigInteger;
-        '-677': BigInteger;
-        '-676': BigInteger;
-        '-675': BigInteger;
-        '-674': BigInteger;
-        '-673': BigInteger;
-        '-672': BigInteger;
-        '-671': BigInteger;
-        '-670': BigInteger;
-        '-669': BigInteger;
-        '-668': BigInteger;
-        '-667': BigInteger;
-        '-666': BigInteger;
-        '-665': BigInteger;
-        '-664': BigInteger;
-        '-663': BigInteger;
-        '-662': BigInteger;
-        '-661': BigInteger;
-        '-660': BigInteger;
-        '-659': BigInteger;
-        '-658': BigInteger;
-        '-657': BigInteger;
-        '-656': BigInteger;
-        '-655': BigInteger;
-        '-654': BigInteger;
-        '-653': BigInteger;
-        '-652': BigInteger;
-        '-651': BigInteger;
-        '-650': BigInteger;
-        '-649': BigInteger;
-        '-648': BigInteger;
-        '-647': BigInteger;
-        '-646': BigInteger;
-        '-645': BigInteger;
-        '-644': BigInteger;
-        '-643': BigInteger;
-        '-642': BigInteger;
-        '-641': BigInteger;
-        '-640': BigInteger;
-        '-639': BigInteger;
-        '-638': BigInteger;
-        '-637': BigInteger;
-        '-636': BigInteger;
-        '-635': BigInteger;
-        '-634': BigInteger;
-        '-633': BigInteger;
-        '-632': BigInteger;
-        '-631': BigInteger;
-        '-630': BigInteger;
-        '-629': BigInteger;
-        '-628': BigInteger;
-        '-627': BigInteger;
-        '-626': BigInteger;
-        '-625': BigInteger;
-        '-624': BigInteger;
-        '-623': BigInteger;
-        '-622': BigInteger;
-        '-621': BigInteger;
-        '-620': BigInteger;
-        '-619': BigInteger;
-        '-618': BigInteger;
-        '-617': BigInteger;
-        '-616': BigInteger;
-        '-615': BigInteger;
-        '-614': BigInteger;
-        '-613': BigInteger;
-        '-612': BigInteger;
-        '-611': BigInteger;
-        '-610': BigInteger;
-        '-609': BigInteger;
-        '-608': BigInteger;
-        '-607': BigInteger;
-        '-606': BigInteger;
-        '-605': BigInteger;
-        '-604': BigInteger;
-        '-603': BigInteger;
-        '-602': BigInteger;
-        '-601': BigInteger;
-        '-600': BigInteger;
-        '-599': BigInteger;
-        '-598': BigInteger;
-        '-597': BigInteger;
-        '-596': BigInteger;
-        '-595': BigInteger;
-        '-594': BigInteger;
-        '-593': BigInteger;
-        '-592': BigInteger;
-        '-591': BigInteger;
-        '-590': BigInteger;
-        '-589': BigInteger;
-        '-588': BigInteger;
-        '-587': BigInteger;
-        '-586': BigInteger;
-        '-585': BigInteger;
-        '-584': BigInteger;
-        '-583': BigInteger;
-        '-582': BigInteger;
-        '-581': BigInteger;
-        '-580': BigInteger;
-        '-579': BigInteger;
-        '-578': BigInteger;
-        '-577': BigInteger;
-        '-576': BigInteger;
-        '-575': BigInteger;
-        '-574': BigInteger;
-        '-573': BigInteger;
-        '-572': BigInteger;
-        '-571': BigInteger;
-        '-570': BigInteger;
-        '-569': BigInteger;
-        '-568': BigInteger;
-        '-567': BigInteger;
-        '-566': BigInteger;
-        '-565': BigInteger;
-        '-564': BigInteger;
-        '-563': BigInteger;
-        '-562': BigInteger;
-        '-561': BigInteger;
-        '-560': BigInteger;
-        '-559': BigInteger;
-        '-558': BigInteger;
-        '-557': BigInteger;
-        '-556': BigInteger;
-        '-555': BigInteger;
-        '-554': BigInteger;
-        '-553': BigInteger;
-        '-552': BigInteger;
-        '-551': BigInteger;
-        '-550': BigInteger;
-        '-549': BigInteger;
-        '-548': BigInteger;
-        '-547': BigInteger;
-        '-546': BigInteger;
-        '-545': BigInteger;
-        '-544': BigInteger;
-        '-543': BigInteger;
-        '-542': BigInteger;
-        '-541': BigInteger;
-        '-540': BigInteger;
-        '-539': BigInteger;
-        '-538': BigInteger;
-        '-537': BigInteger;
-        '-536': BigInteger;
-        '-535': BigInteger;
-        '-534': BigInteger;
-        '-533': BigInteger;
-        '-532': BigInteger;
-        '-531': BigInteger;
-        '-530': BigInteger;
-        '-529': BigInteger;
-        '-528': BigInteger;
-        '-527': BigInteger;
-        '-526': BigInteger;
-        '-525': BigInteger;
-        '-524': BigInteger;
-        '-523': BigInteger;
-        '-522': BigInteger;
-        '-521': BigInteger;
-        '-520': BigInteger;
-        '-519': BigInteger;
-        '-518': BigInteger;
-        '-517': BigInteger;
-        '-516': BigInteger;
-        '-515': BigInteger;
-        '-514': BigInteger;
-        '-513': BigInteger;
-        '-512': BigInteger;
-        '-511': BigInteger;
-        '-510': BigInteger;
-        '-509': BigInteger;
-        '-508': BigInteger;
-        '-507': BigInteger;
-        '-506': BigInteger;
-        '-505': BigInteger;
-        '-504': BigInteger;
-        '-503': BigInteger;
-        '-502': BigInteger;
-        '-501': BigInteger;
-        '-500': BigInteger;
-        '-499': BigInteger;
-        '-498': BigInteger;
-        '-497': BigInteger;
-        '-496': BigInteger;
-        '-495': BigInteger;
-        '-494': BigInteger;
-        '-493': BigInteger;
-        '-492': BigInteger;
-        '-491': BigInteger;
-        '-490': BigInteger;
-        '-489': BigInteger;
-        '-488': BigInteger;
-        '-487': BigInteger;
-        '-486': BigInteger;
-        '-485': BigInteger;
-        '-484': BigInteger;
-        '-483': BigInteger;
-        '-482': BigInteger;
-        '-481': BigInteger;
-        '-480': BigInteger;
-        '-479': BigInteger;
-        '-478': BigInteger;
-        '-477': BigInteger;
-        '-476': BigInteger;
-        '-475': BigInteger;
-        '-474': BigInteger;
-        '-473': BigInteger;
-        '-472': BigInteger;
-        '-471': BigInteger;
-        '-470': BigInteger;
-        '-469': BigInteger;
-        '-468': BigInteger;
-        '-467': BigInteger;
-        '-466': BigInteger;
-        '-465': BigInteger;
-        '-464': BigInteger;
-        '-463': BigInteger;
-        '-462': BigInteger;
-        '-461': BigInteger;
-        '-460': BigInteger;
-        '-459': BigInteger;
-        '-458': BigInteger;
-        '-457': BigInteger;
-        '-456': BigInteger;
-        '-455': BigInteger;
-        '-454': BigInteger;
-        '-453': BigInteger;
-        '-452': BigInteger;
-        '-451': BigInteger;
-        '-450': BigInteger;
-        '-449': BigInteger;
-        '-448': BigInteger;
-        '-447': BigInteger;
-        '-446': BigInteger;
-        '-445': BigInteger;
-        '-444': BigInteger;
-        '-443': BigInteger;
-        '-442': BigInteger;
-        '-441': BigInteger;
-        '-440': BigInteger;
-        '-439': BigInteger;
-        '-438': BigInteger;
-        '-437': BigInteger;
-        '-436': BigInteger;
-        '-435': BigInteger;
-        '-434': BigInteger;
-        '-433': BigInteger;
-        '-432': BigInteger;
-        '-431': BigInteger;
-        '-430': BigInteger;
-        '-429': BigInteger;
-        '-428': BigInteger;
-        '-427': BigInteger;
-        '-426': BigInteger;
-        '-425': BigInteger;
-        '-424': BigInteger;
-        '-423': BigInteger;
-        '-422': BigInteger;
-        '-421': BigInteger;
-        '-420': BigInteger;
-        '-419': BigInteger;
-        '-418': BigInteger;
-        '-417': BigInteger;
-        '-416': BigInteger;
-        '-415': BigInteger;
-        '-414': BigInteger;
-        '-413': BigInteger;
-        '-412': BigInteger;
-        '-411': BigInteger;
-        '-410': BigInteger;
-        '-409': BigInteger;
-        '-408': BigInteger;
-        '-407': BigInteger;
-        '-406': BigInteger;
-        '-405': BigInteger;
-        '-404': BigInteger;
-        '-403': BigInteger;
-        '-402': BigInteger;
-        '-401': BigInteger;
-        '-400': BigInteger;
-        '-399': BigInteger;
-        '-398': BigInteger;
-        '-397': BigInteger;
-        '-396': BigInteger;
-        '-395': BigInteger;
-        '-394': BigInteger;
-        '-393': BigInteger;
-        '-392': BigInteger;
-        '-391': BigInteger;
-        '-390': BigInteger;
-        '-389': BigInteger;
-        '-388': BigInteger;
-        '-387': BigInteger;
-        '-386': BigInteger;
-        '-385': BigInteger;
-        '-384': BigInteger;
-        '-383': BigInteger;
-        '-382': BigInteger;
-        '-381': BigInteger;
-        '-380': BigInteger;
-        '-379': BigInteger;
-        '-378': BigInteger;
-        '-377': BigInteger;
-        '-376': BigInteger;
-        '-375': BigInteger;
-        '-374': BigInteger;
-        '-373': BigInteger;
-        '-372': BigInteger;
-        '-371': BigInteger;
-        '-370': BigInteger;
-        '-369': BigInteger;
-        '-368': BigInteger;
-        '-367': BigInteger;
-        '-366': BigInteger;
-        '-365': BigInteger;
-        '-364': BigInteger;
-        '-363': BigInteger;
-        '-362': BigInteger;
-        '-361': BigInteger;
-        '-360': BigInteger;
-        '-359': BigInteger;
-        '-358': BigInteger;
-        '-357': BigInteger;
-        '-356': BigInteger;
-        '-355': BigInteger;
-        '-354': BigInteger;
-        '-353': BigInteger;
-        '-352': BigInteger;
-        '-351': BigInteger;
-        '-350': BigInteger;
-        '-349': BigInteger;
-        '-348': BigInteger;
-        '-347': BigInteger;
-        '-346': BigInteger;
-        '-345': BigInteger;
-        '-344': BigInteger;
-        '-343': BigInteger;
-        '-342': BigInteger;
-        '-341': BigInteger;
-        '-340': BigInteger;
-        '-339': BigInteger;
-        '-338': BigInteger;
-        '-337': BigInteger;
-        '-336': BigInteger;
-        '-335': BigInteger;
-        '-334': BigInteger;
-        '-333': BigInteger;
-        '-332': BigInteger;
-        '-331': BigInteger;
-        '-330': BigInteger;
-        '-329': BigInteger;
-        '-328': BigInteger;
-        '-327': BigInteger;
-        '-326': BigInteger;
-        '-325': BigInteger;
-        '-324': BigInteger;
-        '-323': BigInteger;
-        '-322': BigInteger;
-        '-321': BigInteger;
-        '-320': BigInteger;
-        '-319': BigInteger;
-        '-318': BigInteger;
-        '-317': BigInteger;
-        '-316': BigInteger;
-        '-315': BigInteger;
-        '-314': BigInteger;
-        '-313': BigInteger;
-        '-312': BigInteger;
-        '-311': BigInteger;
-        '-310': BigInteger;
-        '-309': BigInteger;
-        '-308': BigInteger;
-        '-307': BigInteger;
-        '-306': BigInteger;
-        '-305': BigInteger;
-        '-304': BigInteger;
-        '-303': BigInteger;
-        '-302': BigInteger;
-        '-301': BigInteger;
-        '-300': BigInteger;
-        '-299': BigInteger;
-        '-298': BigInteger;
-        '-297': BigInteger;
-        '-296': BigInteger;
-        '-295': BigInteger;
-        '-294': BigInteger;
-        '-293': BigInteger;
-        '-292': BigInteger;
-        '-291': BigInteger;
-        '-290': BigInteger;
-        '-289': BigInteger;
-        '-288': BigInteger;
-        '-287': BigInteger;
-        '-286': BigInteger;
-        '-285': BigInteger;
-        '-284': BigInteger;
-        '-283': BigInteger;
-        '-282': BigInteger;
-        '-281': BigInteger;
-        '-280': BigInteger;
-        '-279': BigInteger;
-        '-278': BigInteger;
-        '-277': BigInteger;
-        '-276': BigInteger;
-        '-275': BigInteger;
-        '-274': BigInteger;
-        '-273': BigInteger;
-        '-272': BigInteger;
-        '-271': BigInteger;
-        '-270': BigInteger;
-        '-269': BigInteger;
-        '-268': BigInteger;
-        '-267': BigInteger;
-        '-266': BigInteger;
-        '-265': BigInteger;
-        '-264': BigInteger;
-        '-263': BigInteger;
-        '-262': BigInteger;
-        '-261': BigInteger;
-        '-260': BigInteger;
-        '-259': BigInteger;
-        '-258': BigInteger;
-        '-257': BigInteger;
-        '-256': BigInteger;
-        '-255': BigInteger;
-        '-254': BigInteger;
-        '-253': BigInteger;
-        '-252': BigInteger;
-        '-251': BigInteger;
-        '-250': BigInteger;
-        '-249': BigInteger;
-        '-248': BigInteger;
-        '-247': BigInteger;
-        '-246': BigInteger;
-        '-245': BigInteger;
-        '-244': BigInteger;
-        '-243': BigInteger;
-        '-242': BigInteger;
-        '-241': BigInteger;
-        '-240': BigInteger;
-        '-239': BigInteger;
-        '-238': BigInteger;
-        '-237': BigInteger;
-        '-236': BigInteger;
-        '-235': BigInteger;
-        '-234': BigInteger;
-        '-233': BigInteger;
-        '-232': BigInteger;
-        '-231': BigInteger;
-        '-230': BigInteger;
-        '-229': BigInteger;
-        '-228': BigInteger;
-        '-227': BigInteger;
-        '-226': BigInteger;
-        '-225': BigInteger;
-        '-224': BigInteger;
-        '-223': BigInteger;
-        '-222': BigInteger;
-        '-221': BigInteger;
-        '-220': BigInteger;
-        '-219': BigInteger;
-        '-218': BigInteger;
-        '-217': BigInteger;
-        '-216': BigInteger;
-        '-215': BigInteger;
-        '-214': BigInteger;
-        '-213': BigInteger;
-        '-212': BigInteger;
-        '-211': BigInteger;
-        '-210': BigInteger;
-        '-209': BigInteger;
-        '-208': BigInteger;
-        '-207': BigInteger;
-        '-206': BigInteger;
-        '-205': BigInteger;
-        '-204': BigInteger;
-        '-203': BigInteger;
-        '-202': BigInteger;
-        '-201': BigInteger;
-        '-200': BigInteger;
-        '-199': BigInteger;
-        '-198': BigInteger;
-        '-197': BigInteger;
-        '-196': BigInteger;
-        '-195': BigInteger;
-        '-194': BigInteger;
-        '-193': BigInteger;
-        '-192': BigInteger;
-        '-191': BigInteger;
-        '-190': BigInteger;
-        '-189': BigInteger;
-        '-188': BigInteger;
-        '-187': BigInteger;
-        '-186': BigInteger;
-        '-185': BigInteger;
-        '-184': BigInteger;
-        '-183': BigInteger;
-        '-182': BigInteger;
-        '-181': BigInteger;
-        '-180': BigInteger;
-        '-179': BigInteger;
-        '-178': BigInteger;
-        '-177': BigInteger;
-        '-176': BigInteger;
-        '-175': BigInteger;
-        '-174': BigInteger;
-        '-173': BigInteger;
-        '-172': BigInteger;
-        '-171': BigInteger;
-        '-170': BigInteger;
-        '-169': BigInteger;
-        '-168': BigInteger;
-        '-167': BigInteger;
-        '-166': BigInteger;
-        '-165': BigInteger;
-        '-164': BigInteger;
-        '-163': BigInteger;
-        '-162': BigInteger;
-        '-161': BigInteger;
-        '-160': BigInteger;
-        '-159': BigInteger;
-        '-158': BigInteger;
-        '-157': BigInteger;
-        '-156': BigInteger;
-        '-155': BigInteger;
-        '-154': BigInteger;
-        '-153': BigInteger;
-        '-152': BigInteger;
-        '-151': BigInteger;
-        '-150': BigInteger;
-        '-149': BigInteger;
-        '-148': BigInteger;
-        '-147': BigInteger;
-        '-146': BigInteger;
-        '-145': BigInteger;
-        '-144': BigInteger;
-        '-143': BigInteger;
-        '-142': BigInteger;
-        '-141': BigInteger;
-        '-140': BigInteger;
-        '-139': BigInteger;
-        '-138': BigInteger;
-        '-137': BigInteger;
-        '-136': BigInteger;
-        '-135': BigInteger;
-        '-134': BigInteger;
-        '-133': BigInteger;
-        '-132': BigInteger;
-        '-131': BigInteger;
-        '-130': BigInteger;
-        '-129': BigInteger;
-        '-128': BigInteger;
-        '-127': BigInteger;
-        '-126': BigInteger;
-        '-125': BigInteger;
-        '-124': BigInteger;
-        '-123': BigInteger;
-        '-122': BigInteger;
-        '-121': BigInteger;
-        '-120': BigInteger;
-        '-119': BigInteger;
-        '-118': BigInteger;
-        '-117': BigInteger;
-        '-116': BigInteger;
-        '-115': BigInteger;
-        '-114': BigInteger;
-        '-113': BigInteger;
-        '-112': BigInteger;
-        '-111': BigInteger;
-        '-110': BigInteger;
-        '-109': BigInteger;
-        '-108': BigInteger;
-        '-107': BigInteger;
-        '-106': BigInteger;
-        '-105': BigInteger;
-        '-104': BigInteger;
-        '-103': BigInteger;
-        '-102': BigInteger;
-        '-101': BigInteger;
-        '-100': BigInteger;
-        '-99': BigInteger;
-        '-98': BigInteger;
-        '-97': BigInteger;
-        '-96': BigInteger;
-        '-95': BigInteger;
-        '-94': BigInteger;
-        '-93': BigInteger;
-        '-92': BigInteger;
-        '-91': BigInteger;
-        '-90': BigInteger;
-        '-89': BigInteger;
-        '-88': BigInteger;
-        '-87': BigInteger;
-        '-86': BigInteger;
-        '-85': BigInteger;
-        '-84': BigInteger;
-        '-83': BigInteger;
-        '-82': BigInteger;
-        '-81': BigInteger;
-        '-80': BigInteger;
-        '-79': BigInteger;
-        '-78': BigInteger;
-        '-77': BigInteger;
-        '-76': BigInteger;
-        '-75': BigInteger;
-        '-74': BigInteger;
-        '-73': BigInteger;
-        '-72': BigInteger;
-        '-71': BigInteger;
-        '-70': BigInteger;
-        '-69': BigInteger;
-        '-68': BigInteger;
-        '-67': BigInteger;
-        '-66': BigInteger;
-        '-65': BigInteger;
-        '-64': BigInteger;
-        '-63': BigInteger;
-        '-62': BigInteger;
-        '-61': BigInteger;
-        '-60': BigInteger;
-        '-59': BigInteger;
-        '-58': BigInteger;
-        '-57': BigInteger;
-        '-56': BigInteger;
-        '-55': BigInteger;
-        '-54': BigInteger;
-        '-53': BigInteger;
-        '-52': BigInteger;
-        '-51': BigInteger;
-        '-50': BigInteger;
-        '-49': BigInteger;
-        '-48': BigInteger;
-        '-47': BigInteger;
-        '-46': BigInteger;
-        '-45': BigInteger;
-        '-44': BigInteger;
-        '-43': BigInteger;
-        '-42': BigInteger;
-        '-41': BigInteger;
-        '-40': BigInteger;
-        '-39': BigInteger;
-        '-38': BigInteger;
-        '-37': BigInteger;
-        '-36': BigInteger;
-        '-35': BigInteger;
-        '-34': BigInteger;
-        '-33': BigInteger;
-        '-32': BigInteger;
-        '-31': BigInteger;
-        '-30': BigInteger;
-        '-29': BigInteger;
-        '-28': BigInteger;
-        '-27': BigInteger;
-        '-26': BigInteger;
-        '-25': BigInteger;
-        '-24': BigInteger;
-        '-23': BigInteger;
-        '-22': BigInteger;
-        '-21': BigInteger;
-        '-20': BigInteger;
-        '-19': BigInteger;
-        '-18': BigInteger;
-        '-17': BigInteger;
-        '-16': BigInteger;
-        '-15': BigInteger;
-        '-14': BigInteger;
-        '-13': BigInteger;
-        '-12': BigInteger;
-        '-11': BigInteger;
-        '-10': BigInteger;
-        '-9': BigInteger;
-        '-8': BigInteger;
-        '-7': BigInteger;
-        '-6': BigInteger;
-        '-5': BigInteger;
-        '-4': BigInteger;
-        '-3': BigInteger;
-        '-2': BigInteger;
-        '-1': BigInteger;
-        '0': BigInteger;
-        '1': BigInteger;
-        '2': BigInteger;
-        '3': BigInteger;
-        '4': BigInteger;
-        '5': BigInteger;
-        '6': BigInteger;
-        '7': BigInteger;
-        '8': BigInteger;
-        '9': BigInteger;
-        '10': BigInteger;
-        '11': BigInteger;
-        '12': BigInteger;
-        '13': BigInteger;
-        '14': BigInteger;
-        '15': BigInteger;
-        '16': BigInteger;
-        '17': BigInteger;
-        '18': BigInteger;
-        '19': BigInteger;
-        '20': BigInteger;
-        '21': BigInteger;
-        '22': BigInteger;
-        '23': BigInteger;
-        '24': BigInteger;
-        '25': BigInteger;
-        '26': BigInteger;
-        '27': BigInteger;
-        '28': BigInteger;
-        '29': BigInteger;
-        '30': BigInteger;
-        '31': BigInteger;
-        '32': BigInteger;
-        '33': BigInteger;
-        '34': BigInteger;
-        '35': BigInteger;
-        '36': BigInteger;
-        '37': BigInteger;
-        '38': BigInteger;
-        '39': BigInteger;
-        '40': BigInteger;
-        '41': BigInteger;
-        '42': BigInteger;
-        '43': BigInteger;
-        '44': BigInteger;
-        '45': BigInteger;
-        '46': BigInteger;
-        '47': BigInteger;
-        '48': BigInteger;
-        '49': BigInteger;
-        '50': BigInteger;
-        '51': BigInteger;
-        '52': BigInteger;
-        '53': BigInteger;
-        '54': BigInteger;
-        '55': BigInteger;
-        '56': BigInteger;
-        '57': BigInteger;
-        '58': BigInteger;
-        '59': BigInteger;
-        '60': BigInteger;
-        '61': BigInteger;
-        '62': BigInteger;
-        '63': BigInteger;
-        '64': BigInteger;
-        '65': BigInteger;
-        '66': BigInteger;
-        '67': BigInteger;
-        '68': BigInteger;
-        '69': BigInteger;
-        '70': BigInteger;
-        '71': BigInteger;
-        '72': BigInteger;
-        '73': BigInteger;
-        '74': BigInteger;
-        '75': BigInteger;
-        '76': BigInteger;
-        '77': BigInteger;
-        '78': BigInteger;
-        '79': BigInteger;
-        '80': BigInteger;
-        '81': BigInteger;
-        '82': BigInteger;
-        '83': BigInteger;
-        '84': BigInteger;
-        '85': BigInteger;
-        '86': BigInteger;
-        '87': BigInteger;
-        '88': BigInteger;
-        '89': BigInteger;
-        '90': BigInteger;
-        '91': BigInteger;
-        '92': BigInteger;
-        '93': BigInteger;
-        '94': BigInteger;
-        '95': BigInteger;
-        '96': BigInteger;
-        '97': BigInteger;
-        '98': BigInteger;
-        '99': BigInteger;
-        '100': BigInteger;
-        '101': BigInteger;
-        '102': BigInteger;
-        '103': BigInteger;
-        '104': BigInteger;
-        '105': BigInteger;
-        '106': BigInteger;
-        '107': BigInteger;
-        '108': BigInteger;
-        '109': BigInteger;
-        '110': BigInteger;
-        '111': BigInteger;
-        '112': BigInteger;
-        '113': BigInteger;
-        '114': BigInteger;
-        '115': BigInteger;
-        '116': BigInteger;
-        '117': BigInteger;
-        '118': BigInteger;
-        '119': BigInteger;
-        '120': BigInteger;
-        '121': BigInteger;
-        '122': BigInteger;
-        '123': BigInteger;
-        '124': BigInteger;
-        '125': BigInteger;
-        '126': BigInteger;
-        '127': BigInteger;
-        '128': BigInteger;
-        '129': BigInteger;
-        '130': BigInteger;
-        '131': BigInteger;
-        '132': BigInteger;
-        '133': BigInteger;
-        '134': BigInteger;
-        '135': BigInteger;
-        '136': BigInteger;
-        '137': BigInteger;
-        '138': BigInteger;
-        '139': BigInteger;
-        '140': BigInteger;
-        '141': BigInteger;
-        '142': BigInteger;
-        '143': BigInteger;
-        '144': BigInteger;
-        '145': BigInteger;
-        '146': BigInteger;
-        '147': BigInteger;
-        '148': BigInteger;
-        '149': BigInteger;
-        '150': BigInteger;
-        '151': BigInteger;
-        '152': BigInteger;
-        '153': BigInteger;
-        '154': BigInteger;
-        '155': BigInteger;
-        '156': BigInteger;
-        '157': BigInteger;
-        '158': BigInteger;
-        '159': BigInteger;
-        '160': BigInteger;
-        '161': BigInteger;
-        '162': BigInteger;
-        '163': BigInteger;
-        '164': BigInteger;
-        '165': BigInteger;
-        '166': BigInteger;
-        '167': BigInteger;
-        '168': BigInteger;
-        '169': BigInteger;
-        '170': BigInteger;
-        '171': BigInteger;
-        '172': BigInteger;
-        '173': BigInteger;
-        '174': BigInteger;
-        '175': BigInteger;
-        '176': BigInteger;
-        '177': BigInteger;
-        '178': BigInteger;
-        '179': BigInteger;
-        '180': BigInteger;
-        '181': BigInteger;
-        '182': BigInteger;
-        '183': BigInteger;
-        '184': BigInteger;
-        '185': BigInteger;
-        '186': BigInteger;
-        '187': BigInteger;
-        '188': BigInteger;
-        '189': BigInteger;
-        '190': BigInteger;
-        '191': BigInteger;
-        '192': BigInteger;
-        '193': BigInteger;
-        '194': BigInteger;
-        '195': BigInteger;
-        '196': BigInteger;
-        '197': BigInteger;
-        '198': BigInteger;
-        '199': BigInteger;
-        '200': BigInteger;
-        '201': BigInteger;
-        '202': BigInteger;
-        '203': BigInteger;
-        '204': BigInteger;
-        '205': BigInteger;
-        '206': BigInteger;
-        '207': BigInteger;
-        '208': BigInteger;
-        '209': BigInteger;
-        '210': BigInteger;
-        '211': BigInteger;
-        '212': BigInteger;
-        '213': BigInteger;
-        '214': BigInteger;
-        '215': BigInteger;
-        '216': BigInteger;
-        '217': BigInteger;
-        '218': BigInteger;
-        '219': BigInteger;
-        '220': BigInteger;
-        '221': BigInteger;
-        '222': BigInteger;
-        '223': BigInteger;
-        '224': BigInteger;
-        '225': BigInteger;
-        '226': BigInteger;
-        '227': BigInteger;
-        '228': BigInteger;
-        '229': BigInteger;
-        '230': BigInteger;
-        '231': BigInteger;
-        '232': BigInteger;
-        '233': BigInteger;
-        '234': BigInteger;
-        '235': BigInteger;
-        '236': BigInteger;
-        '237': BigInteger;
-        '238': BigInteger;
-        '239': BigInteger;
-        '240': BigInteger;
-        '241': BigInteger;
-        '242': BigInteger;
-        '243': BigInteger;
-        '244': BigInteger;
-        '245': BigInteger;
-        '246': BigInteger;
-        '247': BigInteger;
-        '248': BigInteger;
-        '249': BigInteger;
-        '250': BigInteger;
-        '251': BigInteger;
-        '252': BigInteger;
-        '253': BigInteger;
-        '254': BigInteger;
-        '255': BigInteger;
-        '256': BigInteger;
-        '257': BigInteger;
-        '258': BigInteger;
-        '259': BigInteger;
-        '260': BigInteger;
-        '261': BigInteger;
-        '262': BigInteger;
-        '263': BigInteger;
-        '264': BigInteger;
-        '265': BigInteger;
-        '266': BigInteger;
-        '267': BigInteger;
-        '268': BigInteger;
-        '269': BigInteger;
-        '270': BigInteger;
-        '271': BigInteger;
-        '272': BigInteger;
-        '273': BigInteger;
-        '274': BigInteger;
-        '275': BigInteger;
-        '276': BigInteger;
-        '277': BigInteger;
-        '278': BigInteger;
-        '279': BigInteger;
-        '280': BigInteger;
-        '281': BigInteger;
-        '282': BigInteger;
-        '283': BigInteger;
-        '284': BigInteger;
-        '285': BigInteger;
-        '286': BigInteger;
-        '287': BigInteger;
-        '288': BigInteger;
-        '289': BigInteger;
-        '290': BigInteger;
-        '291': BigInteger;
-        '292': BigInteger;
-        '293': BigInteger;
-        '294': BigInteger;
-        '295': BigInteger;
-        '296': BigInteger;
-        '297': BigInteger;
-        '298': BigInteger;
-        '299': BigInteger;
-        '300': BigInteger;
-        '301': BigInteger;
-        '302': BigInteger;
-        '303': BigInteger;
-        '304': BigInteger;
-        '305': BigInteger;
-        '306': BigInteger;
-        '307': BigInteger;
-        '308': BigInteger;
-        '309': BigInteger;
-        '310': BigInteger;
-        '311': BigInteger;
-        '312': BigInteger;
-        '313': BigInteger;
-        '314': BigInteger;
-        '315': BigInteger;
-        '316': BigInteger;
-        '317': BigInteger;
-        '318': BigInteger;
-        '319': BigInteger;
-        '320': BigInteger;
-        '321': BigInteger;
-        '322': BigInteger;
-        '323': BigInteger;
-        '324': BigInteger;
-        '325': BigInteger;
-        '326': BigInteger;
-        '327': BigInteger;
-        '328': BigInteger;
-        '329': BigInteger;
-        '330': BigInteger;
-        '331': BigInteger;
-        '332': BigInteger;
-        '333': BigInteger;
-        '334': BigInteger;
-        '335': BigInteger;
-        '336': BigInteger;
-        '337': BigInteger;
-        '338': BigInteger;
-        '339': BigInteger;
-        '340': BigInteger;
-        '341': BigInteger;
-        '342': BigInteger;
-        '343': BigInteger;
-        '344': BigInteger;
-        '345': BigInteger;
-        '346': BigInteger;
-        '347': BigInteger;
-        '348': BigInteger;
-        '349': BigInteger;
-        '350': BigInteger;
-        '351': BigInteger;
-        '352': BigInteger;
-        '353': BigInteger;
-        '354': BigInteger;
-        '355': BigInteger;
-        '356': BigInteger;
-        '357': BigInteger;
-        '358': BigInteger;
-        '359': BigInteger;
-        '360': BigInteger;
-        '361': BigInteger;
-        '362': BigInteger;
-        '363': BigInteger;
-        '364': BigInteger;
-        '365': BigInteger;
-        '366': BigInteger;
-        '367': BigInteger;
-        '368': BigInteger;
-        '369': BigInteger;
-        '370': BigInteger;
-        '371': BigInteger;
-        '372': BigInteger;
-        '373': BigInteger;
-        '374': BigInteger;
-        '375': BigInteger;
-        '376': BigInteger;
-        '377': BigInteger;
-        '378': BigInteger;
-        '379': BigInteger;
-        '380': BigInteger;
-        '381': BigInteger;
-        '382': BigInteger;
-        '383': BigInteger;
-        '384': BigInteger;
-        '385': BigInteger;
-        '386': BigInteger;
-        '387': BigInteger;
-        '388': BigInteger;
-        '389': BigInteger;
-        '390': BigInteger;
-        '391': BigInteger;
-        '392': BigInteger;
-        '393': BigInteger;
-        '394': BigInteger;
-        '395': BigInteger;
-        '396': BigInteger;
-        '397': BigInteger;
-        '398': BigInteger;
-        '399': BigInteger;
-        '400': BigInteger;
-        '401': BigInteger;
-        '402': BigInteger;
-        '403': BigInteger;
-        '404': BigInteger;
-        '405': BigInteger;
-        '406': BigInteger;
-        '407': BigInteger;
-        '408': BigInteger;
-        '409': BigInteger;
-        '410': BigInteger;
-        '411': BigInteger;
-        '412': BigInteger;
-        '413': BigInteger;
-        '414': BigInteger;
-        '415': BigInteger;
-        '416': BigInteger;
-        '417': BigInteger;
-        '418': BigInteger;
-        '419': BigInteger;
-        '420': BigInteger;
-        '421': BigInteger;
-        '422': BigInteger;
-        '423': BigInteger;
-        '424': BigInteger;
-        '425': BigInteger;
-        '426': BigInteger;
-        '427': BigInteger;
-        '428': BigInteger;
-        '429': BigInteger;
-        '430': BigInteger;
-        '431': BigInteger;
-        '432': BigInteger;
-        '433': BigInteger;
-        '434': BigInteger;
-        '435': BigInteger;
-        '436': BigInteger;
-        '437': BigInteger;
-        '438': BigInteger;
-        '439': BigInteger;
-        '440': BigInteger;
-        '441': BigInteger;
-        '442': BigInteger;
-        '443': BigInteger;
-        '444': BigInteger;
-        '445': BigInteger;
-        '446': BigInteger;
-        '447': BigInteger;
-        '448': BigInteger;
-        '449': BigInteger;
-        '450': BigInteger;
-        '451': BigInteger;
-        '452': BigInteger;
-        '453': BigInteger;
-        '454': BigInteger;
-        '455': BigInteger;
-        '456': BigInteger;
-        '457': BigInteger;
-        '458': BigInteger;
-        '459': BigInteger;
-        '460': BigInteger;
-        '461': BigInteger;
-        '462': BigInteger;
-        '463': BigInteger;
-        '464': BigInteger;
-        '465': BigInteger;
-        '466': BigInteger;
-        '467': BigInteger;
-        '468': BigInteger;
-        '469': BigInteger;
-        '470': BigInteger;
-        '471': BigInteger;
-        '472': BigInteger;
-        '473': BigInteger;
-        '474': BigInteger;
-        '475': BigInteger;
-        '476': BigInteger;
-        '477': BigInteger;
-        '478': BigInteger;
-        '479': BigInteger;
-        '480': BigInteger;
-        '481': BigInteger;
-        '482': BigInteger;
-        '483': BigInteger;
-        '484': BigInteger;
-        '485': BigInteger;
-        '486': BigInteger;
-        '487': BigInteger;
-        '488': BigInteger;
-        '489': BigInteger;
-        '490': BigInteger;
-        '491': BigInteger;
-        '492': BigInteger;
-        '493': BigInteger;
-        '494': BigInteger;
-        '495': BigInteger;
-        '496': BigInteger;
-        '497': BigInteger;
-        '498': BigInteger;
-        '499': BigInteger;
-        '500': BigInteger;
-        '501': BigInteger;
-        '502': BigInteger;
-        '503': BigInteger;
-        '504': BigInteger;
-        '505': BigInteger;
-        '506': BigInteger;
-        '507': BigInteger;
-        '508': BigInteger;
-        '509': BigInteger;
-        '510': BigInteger;
-        '511': BigInteger;
-        '512': BigInteger;
-        '513': BigInteger;
-        '514': BigInteger;
-        '515': BigInteger;
-        '516': BigInteger;
-        '517': BigInteger;
-        '518': BigInteger;
-        '519': BigInteger;
-        '520': BigInteger;
-        '521': BigInteger;
-        '522': BigInteger;
-        '523': BigInteger;
-        '524': BigInteger;
-        '525': BigInteger;
-        '526': BigInteger;
-        '527': BigInteger;
-        '528': BigInteger;
-        '529': BigInteger;
-        '530': BigInteger;
-        '531': BigInteger;
-        '532': BigInteger;
-        '533': BigInteger;
-        '534': BigInteger;
-        '535': BigInteger;
-        '536': BigInteger;
-        '537': BigInteger;
-        '538': BigInteger;
-        '539': BigInteger;
-        '540': BigInteger;
-        '541': BigInteger;
-        '542': BigInteger;
-        '543': BigInteger;
-        '544': BigInteger;
-        '545': BigInteger;
-        '546': BigInteger;
-        '547': BigInteger;
-        '548': BigInteger;
-        '549': BigInteger;
-        '550': BigInteger;
-        '551': BigInteger;
-        '552': BigInteger;
-        '553': BigInteger;
-        '554': BigInteger;
-        '555': BigInteger;
-        '556': BigInteger;
-        '557': BigInteger;
-        '558': BigInteger;
-        '559': BigInteger;
-        '560': BigInteger;
-        '561': BigInteger;
-        '562': BigInteger;
-        '563': BigInteger;
-        '564': BigInteger;
-        '565': BigInteger;
-        '566': BigInteger;
-        '567': BigInteger;
-        '568': BigInteger;
-        '569': BigInteger;
-        '570': BigInteger;
-        '571': BigInteger;
-        '572': BigInteger;
-        '573': BigInteger;
-        '574': BigInteger;
-        '575': BigInteger;
-        '576': BigInteger;
-        '577': BigInteger;
-        '578': BigInteger;
-        '579': BigInteger;
-        '580': BigInteger;
-        '581': BigInteger;
-        '582': BigInteger;
-        '583': BigInteger;
-        '584': BigInteger;
-        '585': BigInteger;
-        '586': BigInteger;
-        '587': BigInteger;
-        '588': BigInteger;
-        '589': BigInteger;
-        '590': BigInteger;
-        '591': BigInteger;
-        '592': BigInteger;
-        '593': BigInteger;
-        '594': BigInteger;
-        '595': BigInteger;
-        '596': BigInteger;
-        '597': BigInteger;
-        '598': BigInteger;
-        '599': BigInteger;
-        '600': BigInteger;
-        '601': BigInteger;
-        '602': BigInteger;
-        '603': BigInteger;
-        '604': BigInteger;
-        '605': BigInteger;
-        '606': BigInteger;
-        '607': BigInteger;
-        '608': BigInteger;
-        '609': BigInteger;
-        '610': BigInteger;
-        '611': BigInteger;
-        '612': BigInteger;
-        '613': BigInteger;
-        '614': BigInteger;
-        '615': BigInteger;
-        '616': BigInteger;
-        '617': BigInteger;
-        '618': BigInteger;
-        '619': BigInteger;
-        '620': BigInteger;
-        '621': BigInteger;
-        '622': BigInteger;
-        '623': BigInteger;
-        '624': BigInteger;
-        '625': BigInteger;
-        '626': BigInteger;
-        '627': BigInteger;
-        '628': BigInteger;
-        '629': BigInteger;
-        '630': BigInteger;
-        '631': BigInteger;
-        '632': BigInteger;
-        '633': BigInteger;
-        '634': BigInteger;
-        '635': BigInteger;
-        '636': BigInteger;
-        '637': BigInteger;
-        '638': BigInteger;
-        '639': BigInteger;
-        '640': BigInteger;
-        '641': BigInteger;
-        '642': BigInteger;
-        '643': BigInteger;
-        '644': BigInteger;
-        '645': BigInteger;
-        '646': BigInteger;
-        '647': BigInteger;
-        '648': BigInteger;
-        '649': BigInteger;
-        '650': BigInteger;
-        '651': BigInteger;
-        '652': BigInteger;
-        '653': BigInteger;
-        '654': BigInteger;
-        '655': BigInteger;
-        '656': BigInteger;
-        '657': BigInteger;
-        '658': BigInteger;
-        '659': BigInteger;
-        '660': BigInteger;
-        '661': BigInteger;
-        '662': BigInteger;
-        '663': BigInteger;
-        '664': BigInteger;
-        '665': BigInteger;
-        '666': BigInteger;
-        '667': BigInteger;
-        '668': BigInteger;
-        '669': BigInteger;
-        '670': BigInteger;
-        '671': BigInteger;
-        '672': BigInteger;
-        '673': BigInteger;
-        '674': BigInteger;
-        '675': BigInteger;
-        '676': BigInteger;
-        '677': BigInteger;
-        '678': BigInteger;
-        '679': BigInteger;
-        '680': BigInteger;
-        '681': BigInteger;
-        '682': BigInteger;
-        '683': BigInteger;
-        '684': BigInteger;
-        '685': BigInteger;
-        '686': BigInteger;
-        '687': BigInteger;
-        '688': BigInteger;
-        '689': BigInteger;
-        '690': BigInteger;
-        '691': BigInteger;
-        '692': BigInteger;
-        '693': BigInteger;
-        '694': BigInteger;
-        '695': BigInteger;
-        '696': BigInteger;
-        '697': BigInteger;
-        '698': BigInteger;
-        '699': BigInteger;
-        '700': BigInteger;
-        '701': BigInteger;
-        '702': BigInteger;
-        '703': BigInteger;
-        '704': BigInteger;
-        '705': BigInteger;
-        '706': BigInteger;
-        '707': BigInteger;
-        '708': BigInteger;
-        '709': BigInteger;
-        '710': BigInteger;
-        '711': BigInteger;
-        '712': BigInteger;
-        '713': BigInteger;
-        '714': BigInteger;
-        '715': BigInteger;
-        '716': BigInteger;
-        '717': BigInteger;
-        '718': BigInteger;
-        '719': BigInteger;
-        '720': BigInteger;
-        '721': BigInteger;
-        '722': BigInteger;
-        '723': BigInteger;
-        '724': BigInteger;
-        '725': BigInteger;
-        '726': BigInteger;
-        '727': BigInteger;
-        '728': BigInteger;
-        '729': BigInteger;
-        '730': BigInteger;
-        '731': BigInteger;
-        '732': BigInteger;
-        '733': BigInteger;
-        '734': BigInteger;
-        '735': BigInteger;
-        '736': BigInteger;
-        '737': BigInteger;
-        '738': BigInteger;
-        '739': BigInteger;
-        '740': BigInteger;
-        '741': BigInteger;
-        '742': BigInteger;
-        '743': BigInteger;
-        '744': BigInteger;
-        '745': BigInteger;
-        '746': BigInteger;
-        '747': BigInteger;
-        '748': BigInteger;
-        '749': BigInteger;
-        '750': BigInteger;
-        '751': BigInteger;
-        '752': BigInteger;
-        '753': BigInteger;
-        '754': BigInteger;
-        '755': BigInteger;
-        '756': BigInteger;
-        '757': BigInteger;
-        '758': BigInteger;
-        '759': BigInteger;
-        '760': BigInteger;
-        '761': BigInteger;
-        '762': BigInteger;
-        '763': BigInteger;
-        '764': BigInteger;
-        '765': BigInteger;
-        '766': BigInteger;
-        '767': BigInteger;
-        '768': BigInteger;
-        '769': BigInteger;
-        '770': BigInteger;
-        '771': BigInteger;
-        '772': BigInteger;
-        '773': BigInteger;
-        '774': BigInteger;
-        '775': BigInteger;
-        '776': BigInteger;
-        '777': BigInteger;
-        '778': BigInteger;
-        '779': BigInteger;
-        '780': BigInteger;
-        '781': BigInteger;
-        '782': BigInteger;
-        '783': BigInteger;
-        '784': BigInteger;
-        '785': BigInteger;
-        '786': BigInteger;
-        '787': BigInteger;
-        '788': BigInteger;
-        '789': BigInteger;
-        '790': BigInteger;
-        '791': BigInteger;
-        '792': BigInteger;
-        '793': BigInteger;
-        '794': BigInteger;
-        '795': BigInteger;
-        '796': BigInteger;
-        '797': BigInteger;
-        '798': BigInteger;
-        '799': BigInteger;
-        '800': BigInteger;
-        '801': BigInteger;
-        '802': BigInteger;
-        '803': BigInteger;
-        '804': BigInteger;
-        '805': BigInteger;
-        '806': BigInteger;
-        '807': BigInteger;
-        '808': BigInteger;
-        '809': BigInteger;
-        '810': BigInteger;
-        '811': BigInteger;
-        '812': BigInteger;
-        '813': BigInteger;
-        '814': BigInteger;
-        '815': BigInteger;
-        '816': BigInteger;
-        '817': BigInteger;
-        '818': BigInteger;
-        '819': BigInteger;
-        '820': BigInteger;
-        '821': BigInteger;
-        '822': BigInteger;
-        '823': BigInteger;
-        '824': BigInteger;
-        '825': BigInteger;
-        '826': BigInteger;
-        '827': BigInteger;
-        '828': BigInteger;
-        '829': BigInteger;
-        '830': BigInteger;
-        '831': BigInteger;
-        '832': BigInteger;
-        '833': BigInteger;
-        '834': BigInteger;
-        '835': BigInteger;
-        '836': BigInteger;
-        '837': BigInteger;
-        '838': BigInteger;
-        '839': BigInteger;
-        '840': BigInteger;
-        '841': BigInteger;
-        '842': BigInteger;
-        '843': BigInteger;
-        '844': BigInteger;
-        '845': BigInteger;
-        '846': BigInteger;
-        '847': BigInteger;
-        '848': BigInteger;
-        '849': BigInteger;
-        '850': BigInteger;
-        '851': BigInteger;
-        '852': BigInteger;
-        '853': BigInteger;
-        '854': BigInteger;
-        '855': BigInteger;
-        '856': BigInteger;
-        '857': BigInteger;
-        '858': BigInteger;
-        '859': BigInteger;
-        '860': BigInteger;
-        '861': BigInteger;
-        '862': BigInteger;
-        '863': BigInteger;
-        '864': BigInteger;
-        '865': BigInteger;
-        '866': BigInteger;
-        '867': BigInteger;
-        '868': BigInteger;
-        '869': BigInteger;
-        '870': BigInteger;
-        '871': BigInteger;
-        '872': BigInteger;
-        '873': BigInteger;
-        '874': BigInteger;
-        '875': BigInteger;
-        '876': BigInteger;
-        '877': BigInteger;
-        '878': BigInteger;
-        '879': BigInteger;
-        '880': BigInteger;
-        '881': BigInteger;
-        '882': BigInteger;
-        '883': BigInteger;
-        '884': BigInteger;
-        '885': BigInteger;
-        '886': BigInteger;
-        '887': BigInteger;
-        '888': BigInteger;
-        '889': BigInteger;
-        '890': BigInteger;
-        '891': BigInteger;
-        '892': BigInteger;
-        '893': BigInteger;
-        '894': BigInteger;
-        '895': BigInteger;
-        '896': BigInteger;
-        '897': BigInteger;
-        '898': BigInteger;
-        '899': BigInteger;
-        '900': BigInteger;
-        '901': BigInteger;
-        '902': BigInteger;
-        '903': BigInteger;
-        '904': BigInteger;
-        '905': BigInteger;
-        '906': BigInteger;
-        '907': BigInteger;
-        '908': BigInteger;
-        '909': BigInteger;
-        '910': BigInteger;
-        '911': BigInteger;
-        '912': BigInteger;
-        '913': BigInteger;
-        '914': BigInteger;
-        '915': BigInteger;
-        '916': BigInteger;
-        '917': BigInteger;
-        '918': BigInteger;
-        '919': BigInteger;
-        '920': BigInteger;
-        '921': BigInteger;
-        '922': BigInteger;
-        '923': BigInteger;
-        '924': BigInteger;
-        '925': BigInteger;
-        '926': BigInteger;
-        '927': BigInteger;
-        '928': BigInteger;
-        '929': BigInteger;
-        '930': BigInteger;
-        '931': BigInteger;
-        '932': BigInteger;
-        '933': BigInteger;
-        '934': BigInteger;
-        '935': BigInteger;
-        '936': BigInteger;
-        '937': BigInteger;
-        '938': BigInteger;
-        '939': BigInteger;
-        '940': BigInteger;
-        '941': BigInteger;
-        '942': BigInteger;
-        '943': BigInteger;
-        '944': BigInteger;
-        '945': BigInteger;
-        '946': BigInteger;
-        '947': BigInteger;
-        '948': BigInteger;
-        '949': BigInteger;
-        '950': BigInteger;
-        '951': BigInteger;
-        '952': BigInteger;
-        '953': BigInteger;
-        '954': BigInteger;
-        '955': BigInteger;
-        '956': BigInteger;
-        '957': BigInteger;
-        '958': BigInteger;
-        '959': BigInteger;
-        '960': BigInteger;
-        '961': BigInteger;
-        '962': BigInteger;
-        '963': BigInteger;
-        '964': BigInteger;
-        '965': BigInteger;
-        '966': BigInteger;
-        '967': BigInteger;
-        '968': BigInteger;
-        '969': BigInteger;
-        '970': BigInteger;
-        '971': BigInteger;
-        '972': BigInteger;
-        '973': BigInteger;
-        '974': BigInteger;
-        '975': BigInteger;
-        '976': BigInteger;
-        '977': BigInteger;
-        '978': BigInteger;
-        '979': BigInteger;
-        '980': BigInteger;
-        '981': BigInteger;
-        '982': BigInteger;
-        '983': BigInteger;
-        '984': BigInteger;
-        '985': BigInteger;
-        '986': BigInteger;
-        '987': BigInteger;
-        '988': BigInteger;
-        '989': BigInteger;
-        '990': BigInteger;
-        '991': BigInteger;
-        '992': BigInteger;
-        '993': BigInteger;
-        '994': BigInteger;
-        '995': BigInteger;
-        '996': BigInteger;
-        '997': BigInteger;
-        '998': BigInteger;
-        '999': BigInteger;
-    }
-}
diff --git a/node_modules/big-integer/BigInteger.js b/node_modules/big-integer/BigInteger.js
deleted file mode 100644
index 9a65a5f..0000000
--- a/node_modules/big-integer/BigInteger.js
+++ /dev/null
@@ -1,1251 +0,0 @@
-var bigInt = (function (undefined) {
-    "use strict";
-
-    var BASE = 1e7,
-        LOG_BASE = 7,
-        MAX_INT = 9007199254740992,
-        MAX_INT_ARR = smallToArray(MAX_INT),
-        LOG_MAX_INT = Math.log(MAX_INT);
-
-    function Integer(v, radix) {
-        if (typeof v === "undefined") return Integer[0];
-        if (typeof radix !== "undefined") return +radix === 10 ? parseValue(v) : parseBase(v, radix);
-        return parseValue(v);
-    }
-
-    function BigInteger(value, sign) {
-        this.value = value;
-        this.sign = sign;
-        this.isSmall = false;
-    }
-    BigInteger.prototype = Object.create(Integer.prototype);
-
-    function SmallInteger(value) {
-        this.value = value;
-        this.sign = value < 0;
-        this.isSmall = true;
-    }
-    SmallInteger.prototype = Object.create(Integer.prototype);
-
-    function isPrecise(n) {
-        return -MAX_INT < n && n < MAX_INT;
-    }
-
-    function smallToArray(n) { // For performance reasons doesn't reference BASE, need to change this function if BASE changes
-        if (n < 1e7)
-            return [n];
-        if (n < 1e14)
-            return [n % 1e7, Math.floor(n / 1e7)];
-        return [n % 1e7, Math.floor(n / 1e7) % 1e7, Math.floor(n / 1e14)];
-    }
-
-    function arrayToSmall(arr) { // If BASE changes this function may need to change
-        trim(arr);
-        var length = arr.length;
-        if (length < 4 && compareAbs(arr, MAX_INT_ARR) < 0) {
-            switch (length) {
-                case 0: return 0;
-                case 1: return arr[0];
-                case 2: return arr[0] + arr[1] * BASE;
-                default: return arr[0] + (arr[1] + arr[2] * BASE) * BASE;
-            }
-        }
-        return arr;
-    }
-
-    function trim(v) {
-        var i = v.length;
-        while (v[--i] === 0);
-        v.length = i + 1;
-    }
-
-    function createArray(length) { // function shamelessly stolen from Yaffle's library https://github.com/Yaffle/BigInteger
-        var x = new Array(length);
-        var i = -1;
-        while (++i < length) {
-            x[i] = 0;
-        }
-        return x;
-    }
-
-    function truncate(n) {
-        if (n > 0) return Math.floor(n);
-        return Math.ceil(n);
-    }
-
-    function add(a, b) { // assumes a and b are arrays with a.length >= b.length
-        var l_a = a.length,
-            l_b = b.length,
-            r = new Array(l_a),
-            carry = 0,
-            base = BASE,
-            sum, i;
-        for (i = 0; i < l_b; i++) {
-            sum = a[i] + b[i] + carry;
-            carry = sum >= base ? 1 : 0;
-            r[i] = sum - carry * base;
-        }
-        while (i < l_a) {
-            sum = a[i] + carry;
-            carry = sum === base ? 1 : 0;
-            r[i++] = sum - carry * base;
-        }
-        if (carry > 0) r.push(carry);
-        return r;
-    }
-
-    function addAny(a, b) {
-        if (a.length >= b.length) return add(a, b);
-        return add(b, a);
-    }
-
-    function addSmall(a, carry) { // assumes a is array, carry is number with 0 <= carry < MAX_INT
-        var l = a.length,
-            r = new Array(l),
-            base = BASE,
-            sum, i;
-        for (i = 0; i < l; i++) {
-            sum = a[i] - base + carry;
-            carry = Math.floor(sum / base);
-            r[i] = sum - carry * base;
-            carry += 1;
-        }
-        while (carry > 0) {
-            r[i++] = carry % base;
-            carry = Math.floor(carry / base);
-        }
-        return r;
-    }
-
-    BigInteger.prototype.add = function (v) {
-        var n = parseValue(v);
-        if (this.sign !== n.sign) {
-            return this.subtract(n.negate());
-        }
-        var a = this.value, b = n.value;
-        if (n.isSmall) {
-            return new BigInteger(addSmall(a, Math.abs(b)), this.sign);
-        }
-        return new BigInteger(addAny(a, b), this.sign);
-    };
-    BigInteger.prototype.plus = BigInteger.prototype.add;
-
-    SmallInteger.prototype.add = function (v) {
-        var n = parseValue(v);
-        var a = this.value;
-        if (a < 0 !== n.sign) {
-            return this.subtract(n.negate());
-        }
-        var b = n.value;
-        if (n.isSmall) {
-            if (isPrecise(a + b)) return new SmallInteger(a + b);
-            b = smallToArray(Math.abs(b));
-        }
-        return new BigInteger(addSmall(b, Math.abs(a)), a < 0);
-    };
-    SmallInteger.prototype.plus = SmallInteger.prototype.add;
-
-    function subtract(a, b) { // assumes a and b are arrays with a >= b
-        var a_l = a.length,
-            b_l = b.length,
-            r = new Array(a_l),
-            borrow = 0,
-            base = BASE,
-            i, difference;
-        for (i = 0; i < b_l; i++) {
-            difference = a[i] - borrow - b[i];
-            if (difference < 0) {
-                difference += base;
-                borrow = 1;
-            } else borrow = 0;
-            r[i] = difference;
-        }
-        for (i = b_l; i < a_l; i++) {
-            difference = a[i] - borrow;
-            if (difference < 0) difference += base;
-            else {
-                r[i++] = difference;
-                break;
-            }
-            r[i] = difference;
-        }
-        for (; i < a_l; i++) {
-            r[i] = a[i];
-        }
-        trim(r);
-        return r;
-    }
-
-    function subtractAny(a, b, sign) {
-        var value;
-        if (compareAbs(a, b) >= 0) {
-            value = subtract(a,b);
-        } else {
-            value = subtract(b, a);
-            sign = !sign;
-        }
-        value = arrayToSmall(value);
-        if (typeof value === "number") {
-            if (sign) value = -value;
-            return new SmallInteger(value);
-        }
-        return new BigInteger(value, sign);
-    }
-
-    function subtractSmall(a, b, sign) { // assumes a is array, b is number with 0 <= b < MAX_INT
-        var l = a.length,
-            r = new Array(l),
-            carry = -b,
-            base = BASE,
-            i, difference;
-        for (i = 0; i < l; i++) {
-            difference = a[i] + carry;
-            carry = Math.floor(difference / base);
-            difference %= base;
-            r[i] = difference < 0 ? difference + base : difference;
-        }
-        r = arrayToSmall(r);
-        if (typeof r === "number") {
-            if (sign) r = -r;
-            return new SmallInteger(r);
-        } return new BigInteger(r, sign);
-    }
-
-    BigInteger.prototype.subtract = function (v) {
-        var n = parseValue(v);
-        if (this.sign !== n.sign) {
-            return this.add(n.negate());
-        }
-        var a = this.value, b = n.value;
-        if (n.isSmall)
-            return subtractSmall(a, Math.abs(b), this.sign);
-        return subtractAny(a, b, this.sign);
-    };
-    BigInteger.prototype.minus = BigInteger.prototype.subtract;
-
-    SmallInteger.prototype.subtract = function (v) {
-        var n = parseValue(v);
-        var a = this.value;
-        if (a < 0 !== n.sign) {
-            return this.add(n.negate());
-        }
-        var b = n.value;
-        if (n.isSmall) {
-            return new SmallInteger(a - b);
-        }
-        return subtractSmall(b, Math.abs(a), a >= 0);
-    };
-    SmallInteger.prototype.minus = SmallInteger.prototype.subtract;
-
-    BigInteger.prototype.negate = function () {
-        return new BigInteger(this.value, !this.sign);
-    };
-    SmallInteger.prototype.negate = function () {
-        var sign = this.sign;
-        var small = new SmallInteger(-this.value);
-        small.sign = !sign;
-        return small;
-    };
-
-    BigInteger.prototype.abs = function () {
-        return new BigInteger(this.value, false);
-    };
-    SmallInteger.prototype.abs = function () {
-        return new SmallInteger(Math.abs(this.value));
-    };
-
-    function multiplyLong(a, b) {
-        var a_l = a.length,
-            b_l = b.length,
-            l = a_l + b_l,
-            r = createArray(l),
-            base = BASE,
-            product, carry, i, a_i, b_j;
-        for (i = 0; i < a_l; ++i) {
-            a_i = a[i];
-            for (var j = 0; j < b_l; ++j) {
-                b_j = b[j];
-                product = a_i * b_j + r[i + j];
-                carry = Math.floor(product / base);
-                r[i + j] = product - carry * base;
-                r[i + j + 1] += carry;
-            }
-        }
-        trim(r);
-        return r;
-    }
-
-    function multiplySmall(a, b) { // assumes a is array, b is number with |b| < BASE
-        var l = a.length,
-            r = new Array(l),
-            base = BASE,
-            carry = 0,
-            product, i;
-        for (i = 0; i < l; i++) {
-            product = a[i] * b + carry;
-            carry = Math.floor(product / base);
-            r[i] = product - carry * base;
-        }
-        while (carry > 0) {
-            r[i++] = carry % base;
-            carry = Math.floor(carry / base);
-        }
-        return r;
-    }
-
-    function shiftLeft(x, n) {
-        var r = [];
-        while (n-- > 0) r.push(0);
-        return r.concat(x);
-    }
-
-    function multiplyKaratsuba(x, y) {
-        var n = Math.max(x.length, y.length);
-
-        if (n <= 30) return multiplyLong(x, y);
-        n = Math.ceil(n / 2);
-
-        var b = x.slice(n),
-            a = x.slice(0, n),
-            d = y.slice(n),
-            c = y.slice(0, n);
-
-        var ac = multiplyKaratsuba(a, c),
-            bd = multiplyKaratsuba(b, d),
-            abcd = multiplyKaratsuba(addAny(a, b), addAny(c, d));
-
-        var product = addAny(addAny(ac, shiftLeft(subtract(subtract(abcd, ac), bd), n)), shiftLeft(bd, 2 * n));
-        trim(product);
-        return product;
-    }
-
-    // The following function is derived from a surface fit of a graph plotting the performance difference
-    // between long multiplication and karatsuba multiplication versus the lengths of the two arrays.
-    function useKaratsuba(l1, l2) {
-        return -0.012 * l1 - 0.012 * l2 + 0.000015 * l1 * l2 > 0;
-    }
-
-    BigInteger.prototype.multiply = function (v) {
-        var n = parseValue(v),
-            a = this.value, b = n.value,
-            sign = this.sign !== n.sign,
-            abs;
-        if (n.isSmall) {
-            if (b === 0) return Integer[0];
-            if (b === 1) return this;
-            if (b === -1) return this.negate();
-            abs = Math.abs(b);
-            if (abs < BASE) {
-                return new BigInteger(multiplySmall(a, abs), sign);
-            }
-            b = smallToArray(abs);
-        }
-        if (useKaratsuba(a.length, b.length)) // Karatsuba is only faster for certain array sizes
-            return new BigInteger(multiplyKaratsuba(a, b), sign);
-        return new BigInteger(multiplyLong(a, b), sign);
-    };
-
-    BigInteger.prototype.times = BigInteger.prototype.multiply;
-
-    function multiplySmallAndArray(a, b, sign) { // a >= 0
-        if (a < BASE) {
-            return new BigInteger(multiplySmall(b, a), sign);
-        }
-        return new BigInteger(multiplyLong(b, smallToArray(a)), sign);
-    }
-    SmallInteger.prototype._multiplyBySmall = function (a) {
-            if (isPrecise(a.value * this.value)) {
-                return new SmallInteger(a.value * this.value);
-            }
-            return multiplySmallAndArray(Math.abs(a.value), smallToArray(Math.abs(this.value)), this.sign !== a.sign);
-    };
-    BigInteger.prototype._multiplyBySmall = function (a) {
-            if (a.value === 0) return Integer[0];
-            if (a.value === 1) return this;
-            if (a.value === -1) return this.negate();
-            return multiplySmallAndArray(Math.abs(a.value), this.value, this.sign !== a.sign);
-    };
-    SmallInteger.prototype.multiply = function (v) {
-        return parseValue(v)._multiplyBySmall(this);
-    };
-    SmallInteger.prototype.times = SmallInteger.prototype.multiply;
-
-    function square(a) {
-        var l = a.length,
-            r = createArray(l + l),
-            base = BASE,
-            product, carry, i, a_i, a_j;
-        for (i = 0; i < l; i++) {
-            a_i = a[i];
-            for (var j = 0; j < l; j++) {
-                a_j = a[j];
-                product = a_i * a_j + r[i + j];
-                carry = Math.floor(product / base);
-                r[i + j] = product - carry * base;
-                r[i + j + 1] += carry;
-            }
-        }
-        trim(r);
-        return r;
-    }
-
-    BigInteger.prototype.square = function () {
-        return new BigInteger(square(this.value), false);
-    };
-
-    SmallInteger.prototype.square = function () {
-        var value = this.value * this.value;
-        if (isPrecise(value)) return new SmallInteger(value);
-        return new BigInteger(square(smallToArray(Math.abs(this.value))), false);
-    };
-
-    function divMod1(a, b) { // Left over from previous version. Performs faster than divMod2 on smaller input sizes.
-        var a_l = a.length,
-            b_l = b.length,
-            base = BASE,
-            result = createArray(b.length),
-            divisorMostSignificantDigit = b[b_l - 1],
-            // normalization
-            lambda = Math.ceil(base / (2 * divisorMostSignificantDigit)),
-            remainder = multiplySmall(a, lambda),
-            divisor = multiplySmall(b, lambda),
-            quotientDigit, shift, carry, borrow, i, l, q;
-        if (remainder.length <= a_l) remainder.push(0);
-        divisor.push(0);
-        divisorMostSignificantDigit = divisor[b_l - 1];
-        for (shift = a_l - b_l; shift >= 0; shift--) {
-            quotientDigit = base - 1;
-            if (remainder[shift + b_l] !== divisorMostSignificantDigit) {
-              quotientDigit = Math.floor((remainder[shift + b_l] * base + remainder[shift + b_l - 1]) / divisorMostSignificantDigit);
-            }
-            // quotientDigit <= base - 1
-            carry = 0;
-            borrow = 0;
-            l = divisor.length;
-            for (i = 0; i < l; i++) {
-                carry += quotientDigit * divisor[i];
-                q = Math.floor(carry / base);
-                borrow += remainder[shift + i] - (carry - q * base);
-                carry = q;
-                if (borrow < 0) {
-                    remainder[shift + i] = borrow + base;
-                    borrow = -1;
-                } else {
-                    remainder[shift + i] = borrow;
-                    borrow = 0;
-                }
-            }
-            while (borrow !== 0) {
-                quotientDigit -= 1;
-                carry = 0;
-                for (i = 0; i < l; i++) {
-                    carry += remainder[shift + i] - base + divisor[i];
-                    if (carry < 0) {
-                        remainder[shift + i] = carry + base;
-                        carry = 0;
-                    } else {
-                        remainder[shift + i] = carry;
-                        carry = 1;
-                    }
-                }
-                borrow += carry;
-            }
-            result[shift] = quotientDigit;
-        }
-        // denormalization
-        remainder = divModSmall(remainder, lambda)[0];
-        return [arrayToSmall(result), arrayToSmall(remainder)];
-    }
-
-    function divMod2(a, b) { // Implementation idea shamelessly stolen from Silent Matt's library http://silentmatt.com/biginteger/
-        // Performs faster than divMod1 on larger input sizes.
-        var a_l = a.length,
-            b_l = b.length,
-            result = [],
-            part = [],
-            base = BASE,
-            guess, xlen, highx, highy, check;
-        while (a_l) {
-            part.unshift(a[--a_l]);
-            trim(part);
-            if (compareAbs(part, b) < 0) {
-                result.push(0);
-                continue;
-            }
-            xlen = part.length;
-            highx = part[xlen - 1] * base + part[xlen - 2];
-            highy = b[b_l - 1] * base + b[b_l - 2];
-            if (xlen > b_l) {
-                highx = (highx + 1) * base;
-            }
-            guess = Math.ceil(highx / highy);
-            do {
-                check = multiplySmall(b, guess);
-                if (compareAbs(check, part) <= 0) break;
-                guess--;
-            } while (guess);
-            result.push(guess);
-            part = subtract(part, check);
-        }
-        result.reverse();
-        return [arrayToSmall(result), arrayToSmall(part)];
-    }
-
-    function divModSmall(value, lambda) {
-        var length = value.length,
-            quotient = createArray(length),
-            base = BASE,
-            i, q, remainder, divisor;
-        remainder = 0;
-        for (i = length - 1; i >= 0; --i) {
-            divisor = remainder * base + value[i];
-            q = truncate(divisor / lambda);
-            remainder = divisor - q * lambda;
-            quotient[i] = q | 0;
-        }
-        return [quotient, remainder | 0];
-    }
-
-    function divModAny(self, v) {
-        var value, n = parseValue(v);
-        var a = self.value, b = n.value;
-        var quotient;
-        if (b === 0) throw new Error("Cannot divide by zero");
-        if (self.isSmall) {
-            if (n.isSmall) {
-                return [new SmallInteger(truncate(a / b)), new SmallInteger(a % b)];
-            }
-            return [Integer[0], self];
-        }
-        if (n.isSmall) {
-            if (b === 1) return [self, Integer[0]];
-            if (b == -1) return [self.negate(), Integer[0]];
-            var abs = Math.abs(b);
-            if (abs < BASE) {
-                value = divModSmall(a, abs);
-                quotient = arrayToSmall(value[0]);
-                var remainder = value[1];
-                if (self.sign) remainder = -remainder;
-                if (typeof quotient === "number") {
-                    if (self.sign !== n.sign) quotient = -quotient;
-                    return [new SmallInteger(quotient), new SmallInteger(remainder)];
-                }
-                return [new BigInteger(quotient, self.sign !== n.sign), new SmallInteger(remainder)];
-            }
-            b = smallToArray(abs);
-        }
-        var comparison = compareAbs(a, b);
-        if (comparison === -1) return [Integer[0], self];
-        if (comparison === 0) return [Integer[self.sign === n.sign ? 1 : -1], Integer[0]];
-
-        // divMod1 is faster on smaller input sizes
-        if (a.length + b.length <= 200)
-            value = divMod1(a, b);
-        else value = divMod2(a, b);
-
-        quotient = value[0];
-        var qSign = self.sign !== n.sign,
-            mod = value[1],
-            mSign = self.sign;
-        if (typeof quotient === "number") {
-            if (qSign) quotient = -quotient;
-            quotient = new SmallInteger(quotient);
-        } else quotient = new BigInteger(quotient, qSign);
-        if (typeof mod === "number") {
-            if (mSign) mod = -mod;
-            mod = new SmallInteger(mod);
-        } else mod = new BigInteger(mod, mSign);
-        return [quotient, mod];
-    }
-
-    BigInteger.prototype.divmod = function (v) {
-        var result = divModAny(this, v);
-        return {
-            quotient: result[0],
-            remainder: result[1]
-        };
-    };
-    SmallInteger.prototype.divmod = BigInteger.prototype.divmod;
-
-    BigInteger.prototype.divide = function (v) {
-        return divModAny(this, v)[0];
-    };
-    SmallInteger.prototype.over = SmallInteger.prototype.divide = BigInteger.prototype.over = BigInteger.prototype.divide;
-
-    BigInteger.prototype.mod = function (v) {
-        return divModAny(this, v)[1];
-    };
-    SmallInteger.prototype.remainder = SmallInteger.prototype.mod = BigInteger.prototype.remainder = BigInteger.prototype.mod;
-
-    BigInteger.prototype.pow = function (v) {
-        var n = parseValue(v),
-            a = this.value,
-            b = n.value,
-            value, x, y;
-        if (b === 0) return Integer[1];
-        if (a === 0) return Integer[0];
-        if (a === 1) return Integer[1];
-        if (a === -1) return n.isEven() ? Integer[1] : Integer[-1];
-        if (n.sign) {
-            return Integer[0];
-        }
-        if (!n.isSmall) throw new Error("The exponent " + n.toString() + " is too large.");
-        if (this.isSmall) {
-            if (isPrecise(value = Math.pow(a, b)))
-                return new SmallInteger(truncate(value));
-        }
-        x = this;
-        y = Integer[1];
-        while (true) {
-            if (b & 1 === 1) {
-                y = y.times(x);
-                --b;
-            }
-            if (b === 0) break;
-            b /= 2;
-            x = x.square();
-        }
-        return y;
-    };
-    SmallInteger.prototype.pow = BigInteger.prototype.pow;
-
-    BigInteger.prototype.modPow = function (exp, mod) {
-        exp = parseValue(exp);
-        mod = parseValue(mod);
-        if (mod.isZero()) throw new Error("Cannot take modPow with modulus 0");
-        var r = Integer[1],
-            base = this.mod(mod);
-        while (exp.isPositive()) {
-            if (base.isZero()) return Integer[0];
-            if (exp.isOdd()) r = r.multiply(base).mod(mod);
-            exp = exp.divide(2);
-            base = base.square().mod(mod);
-        }
-        return r;
-    };
-    SmallInteger.prototype.modPow = BigInteger.prototype.modPow;
-
-    function compareAbs(a, b) {
-        if (a.length !== b.length) {
-            return a.length > b.length ? 1 : -1;
-        }
-        for (var i = a.length - 1; i >= 0; i--) {
-            if (a[i] !== b[i]) return a[i] > b[i] ? 1 : -1;
-        }
-        return 0;
-    }
-
-    BigInteger.prototype.compareAbs = function (v) {
-        var n = parseValue(v),
-            a = this.value,
-            b = n.value;
-        if (n.isSmall) return 1;
-        return compareAbs(a, b);
-    };
-    SmallInteger.prototype.compareAbs = function (v) {
-        var n = parseValue(v),
-            a = Math.abs(this.value),
-            b = n.value;
-        if (n.isSmall) {
-            b = Math.abs(b);
-            return a === b ? 0 : a > b ? 1 : -1;
-        }
-        return -1;
-    };
-
-    BigInteger.prototype.compare = function (v) {
-        // See discussion about comparison with Infinity:
-        // https://github.com/peterolson/BigInteger.js/issues/61
-        if (v === Infinity) {
-            return -1;
-        }
-        if (v === -Infinity) {
-            return 1;
-        }
-
-        var n = parseValue(v),
-            a = this.value,
-            b = n.value;
-        if (this.sign !== n.sign) {
-            return n.sign ? 1 : -1;
-        }
-        if (n.isSmall) {
-            return this.sign ? -1 : 1;
-        }
-        return compareAbs(a, b) * (this.sign ? -1 : 1);
-    };
-    BigInteger.prototype.compareTo = BigInteger.prototype.compare;
-
-    SmallInteger.prototype.compare = function (v) {
-        if (v === Infinity) {
-            return -1;
-        }
-        if (v === -Infinity) {
-            return 1;
-        }
-
-        var n = parseValue(v),
-            a = this.value,
-            b = n.value;
-        if (n.isSmall) {
-            return a == b ? 0 : a > b ? 1 : -1;
-        }
-        if (a < 0 !== n.sign) {
-            return a < 0 ? -1 : 1;
-        }
-        return a < 0 ? 1 : -1;
-    };
-    SmallInteger.prototype.compareTo = SmallInteger.prototype.compare;
-
-    BigInteger.prototype.equals = function (v) {
-        return this.compare(v) === 0;
-    };
-    SmallInteger.prototype.eq = SmallInteger.prototype.equals = BigInteger.prototype.eq = BigInteger.prototype.equals;
-
-    BigInteger.prototype.notEquals = function (v) {
-        return this.compare(v) !== 0;
-    };
-    SmallInteger.prototype.neq = SmallInteger.prototype.notEquals = BigInteger.prototype.neq = BigInteger.prototype.notEquals;
-
-    BigInteger.prototype.greater = function (v) {
-        return this.compare(v) > 0;
-    };
-    SmallInteger.prototype.gt = SmallInteger.prototype.greater = BigInteger.prototype.gt = BigInteger.prototype.greater;
-
-    BigInteger.prototype.lesser = function (v) {
-        return this.compare(v) < 0;
-    };
-    SmallInteger.prototype.lt = SmallInteger.prototype.lesser = BigInteger.prototype.lt = BigInteger.prototype.lesser;
-
-    BigInteger.prototype.greaterOrEquals = function (v) {
-        return this.compare(v) >= 0;
-    };
-    SmallInteger.prototype.geq = SmallInteger.prototype.greaterOrEquals = BigInteger.prototype.geq = BigInteger.prototype.greaterOrEquals;
-
-    BigInteger.prototype.lesserOrEquals = function (v) {
-        return this.compare(v) <= 0;
-    };
-    SmallInteger.prototype.leq = SmallInteger.prototype.lesserOrEquals = BigInteger.prototype.leq = BigInteger.prototype.lesserOrEquals;
-
-    BigInteger.prototype.isEven = function () {
-        return (this.value[0] & 1) === 0;
-    };
-    SmallInteger.prototype.isEven = function () {
-        return (this.value & 1) === 0;
-    };
-
-    BigInteger.prototype.isOdd = function () {
-        return (this.value[0] & 1) === 1;
-    };
-    SmallInteger.prototype.isOdd = function () {
-        return (this.value & 1) === 1;
-    };
-
-    BigInteger.prototype.isPositive = function () {
-        return !this.sign;
-    };
-    SmallInteger.prototype.isPositive = function () {
-        return this.value > 0;
-    };
-
-    BigInteger.prototype.isNegative = function () {
-        return this.sign;
-    };
-    SmallInteger.prototype.isNegative = function () {
-        return this.value < 0;
-    };
-
-    BigInteger.prototype.isUnit = function () {
-        return false;
-    };
-    SmallInteger.prototype.isUnit = function () {
-        return Math.abs(this.value) === 1;
-    };
-
-    BigInteger.prototype.isZero = function () {
-        return false;
-    };
-    SmallInteger.prototype.isZero = function () {
-        return this.value === 0;
-    };
-    BigInteger.prototype.isDivisibleBy = function (v) {
-        var n = parseValue(v);
-        var value = n.value;
-        if (value === 0) return false;
-        if (value === 1) return true;
-        if (value === 2) return this.isEven();
-        return this.mod(n).equals(Integer[0]);
-    };
-    SmallInteger.prototype.isDivisibleBy = BigInteger.prototype.isDivisibleBy;
-
-    function isBasicPrime(v) {
-        var n = v.abs();
-        if (n.isUnit()) return false;
-        if (n.equals(2) || n.equals(3) || n.equals(5)) return true;
-        if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5)) return false;
-        if (n.lesser(25)) return true;
-        // we don't know if it's prime: let the other functions figure it out
-    }
-
-    BigInteger.prototype.isPrime = function () {
-        var isPrime = isBasicPrime(this);
-        if (isPrime !== undefined) return isPrime;
-        var n = this.abs(),
-            nPrev = n.prev();
-        var a = [2, 3, 5, 7, 11, 13, 17, 19],
-            b = nPrev,
-            d, t, i, x;
-        while (b.isEven()) b = b.divide(2);
-        for (i = 0; i < a.length; i++) {
-            x = bigInt(a[i]).modPow(b, n);
-            if (x.equals(Integer[1]) || x.equals(nPrev)) continue;
-            for (t = true, d = b; t && d.lesser(nPrev) ; d = d.multiply(2)) {
-                x = x.square().mod(n);
-                if (x.equals(nPrev)) t = false;
-            }
-            if (t) return false;
-        }
-        return true;
-    };
-    SmallInteger.prototype.isPrime = BigInteger.prototype.isPrime;
-
-    BigInteger.prototype.isProbablePrime = function (iterations) {
-        var isPrime = isBasicPrime(this);
-        if (isPrime !== undefined) return isPrime;
-        var n = this.abs();
-        var t = iterations === undefined ? 5 : iterations;
-        // use the Fermat primality test
-        for (var i = 0; i < t; i++) {
-            var a = bigInt.randBetween(2, n.minus(2));
-            if (!a.modPow(n.prev(), n).isUnit()) return false; // definitely composite
-        }
-        return true; // large chance of being prime
-    };
-    SmallInteger.prototype.isProbablePrime = BigInteger.prototype.isProbablePrime;
-
-    BigInteger.prototype.modInv = function (n) {
-        var t = bigInt.zero, newT = bigInt.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR;
-        while (!newR.equals(bigInt.zero)) {
-            q = r.divide(newR);
-            lastT = t;
-            lastR = r;
-            t = newT;
-            r = newR;
-            newT = lastT.subtract(q.multiply(newT));
-            newR = lastR.subtract(q.multiply(newR));
-        }
-        if (!r.equals(1)) throw new Error(this.toString() + " and " + n.toString() + " are not co-prime");
-        if (t.compare(0) === -1) {
-            t = t.add(n);
-        }
-        if (this.isNegative()) {
-            return t.negate();
-        }
-        return t;
-    };
-
-    SmallInteger.prototype.modInv = BigInteger.prototype.modInv;
-
-    BigInteger.prototype.next = function () {
-        var value = this.value;
-        if (this.sign) {
-            return subtractSmall(value, 1, this.sign);
-        }
-        return new BigInteger(addSmall(value, 1), this.sign);
-    };
-    SmallInteger.prototype.next = function () {
-        var value = this.value;
-        if (value + 1 < MAX_INT) return new SmallInteger(value + 1);
-        return new BigInteger(MAX_INT_ARR, false);
-    };
-
-    BigInteger.prototype.prev = function () {
-        var value = this.value;
-        if (this.sign) {
-            return new BigInteger(addSmall(value, 1), true);
-        }
-        return subtractSmall(value, 1, this.sign);
-    };
-    SmallInteger.prototype.prev = function () {
-        var value = this.value;
-        if (value - 1 > -MAX_INT) return new SmallInteger(value - 1);
-        return new BigInteger(MAX_INT_ARR, true);
-    };
-
-    var powersOfTwo = [1];
-    while (2 * powersOfTwo[powersOfTwo.length - 1] <= BASE) powersOfTwo.push(2 * powersOfTwo[powersOfTwo.length - 1]);
-    var powers2Length = powersOfTwo.length, highestPower2 = powersOfTwo[powers2Length - 1];
-
-    function shift_isSmall(n) {
-        return ((typeof n === "number" || typeof n === "string") && +Math.abs(n) <= BASE) ||
-            (n instanceof BigInteger && n.value.length <= 1);
-    }
-
-    BigInteger.prototype.shiftLeft = function (n) {
-        if (!shift_isSmall(n)) {
-            throw new Error(String(n) + " is too large for shifting.");
-        }
-        n = +n;
-        if (n < 0) return this.shiftRight(-n);
-        var result = this;
-        while (n >= powers2Length) {
-            result = result.multiply(highestPower2);
-            n -= powers2Length - 1;
-        }
-        return result.multiply(powersOfTwo[n]);
-    };
-    SmallInteger.prototype.shiftLeft = BigInteger.prototype.shiftLeft;
-
-    BigInteger.prototype.shiftRight = function (n) {
-        var remQuo;
-        if (!shift_isSmall(n)) {
-            throw new Error(String(n) + " is too large for shifting.");
-        }
-        n = +n;
-        if (n < 0) return this.shiftLeft(-n);
-        var result = this;
-        while (n >= powers2Length) {
-            if (result.isZero()) return result;
-            remQuo = divModAny(result, highestPower2);
-            result = remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];
-            n -= powers2Length - 1;
-        }
-        remQuo = divModAny(result, powersOfTwo[n]);
-        return remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];
-    };
-    SmallInteger.prototype.shiftRight = BigInteger.prototype.shiftRight;
-
-    function bitwise(x, y, fn) {
-        y = parseValue(y);
-        var xSign = x.isNegative(), ySign = y.isNegative();
-        var xRem = xSign ? x.not() : x,
-            yRem = ySign ? y.not() : y;
-        var xDigit = 0, yDigit = 0;
-        var xDivMod = null, yDivMod = null;
-        var result = [];
-        while (!xRem.isZero() || !yRem.isZero()) {
-            xDivMod = divModAny(xRem, highestPower2);
-            xDigit = xDivMod[1].toJSNumber();
-            if (xSign) {
-                xDigit = highestPower2 - 1 - xDigit; // two's complement for negative numbers
-            }
-
-            yDivMod = divModAny(yRem, highestPower2);
-            yDigit = yDivMod[1].toJSNumber();
-            if (ySign) {
-                yDigit = highestPower2 - 1 - yDigit; // two's complement for negative numbers
-            }
-
-            xRem = xDivMod[0];
-            yRem = yDivMod[0];
-            result.push(fn(xDigit, yDigit));
-        }
-        var sum = fn(xSign ? 1 : 0, ySign ? 1 : 0) !== 0 ? bigInt(-1) : bigInt(0);
-        for (var i = result.length - 1; i >= 0; i -= 1) {
-            sum = sum.multiply(highestPower2).add(bigInt(result[i]));
-        }
-        return sum;
-    }
-
-    BigInteger.prototype.not = function () {
-        return this.negate().prev();
-    };
-    SmallInteger.prototype.not = BigInteger.prototype.not;
-
-    BigInteger.prototype.and = function (n) {
-        return bitwise(this, n, function (a, b) { return a & b; });
-    };
-    SmallInteger.prototype.and = BigInteger.prototype.and;
-
-    BigInteger.prototype.or = function (n) {
-        return bitwise(this, n, function (a, b) { return a | b; });
-    };
-    SmallInteger.prototype.or = BigInteger.prototype.or;
-
-    BigInteger.prototype.xor = function (n) {
-        return bitwise(this, n, function (a, b) { return a ^ b; });
-    };
-    SmallInteger.prototype.xor = BigInteger.prototype.xor;
-
-    var LOBMASK_I = 1 << 30, LOBMASK_BI = (BASE & -BASE) * (BASE & -BASE) | LOBMASK_I;
-    function roughLOB(n) { // get lowestOneBit (rough)
-        // SmallInteger: return Min(lowestOneBit(n), 1 << 30)
-        // BigInteger: return Min(lowestOneBit(n), 1 << 14) [BASE=1e7]
-        var v = n.value, x = typeof v === "number" ? v | LOBMASK_I : v[0] + v[1] * BASE | LOBMASK_BI;
-        return x & -x;
-    }
-
-    function max(a, b) {
-        a = parseValue(a);
-        b = parseValue(b);
-        return a.greater(b) ? a : b;
-    }
-    function min(a, b) {
-        a = parseValue(a);
-        b = parseValue(b);
-        return a.lesser(b) ? a : b;
-    }
-    function gcd(a, b) {
-        a = parseValue(a).abs();
-        b = parseValue(b).abs();
-        if (a.equals(b)) return a;
-        if (a.isZero()) return b;
-        if (b.isZero()) return a;
-        var c = Integer[1], d, t;
-        while (a.isEven() && b.isEven()) {
-            d = Math.min(roughLOB(a), roughLOB(b));
-            a = a.divide(d);
-            b = b.divide(d);
-            c = c.multiply(d);
-        }
-        while (a.isEven()) {
-            a = a.divide(roughLOB(a));
-        }
-        do {
-            while (b.isEven()) {
-                b = b.divide(roughLOB(b));
-            }
-            if (a.greater(b)) {
-                t = b; b = a; a = t;
-            }
-            b = b.subtract(a);
-        } while (!b.isZero());
-        return c.isUnit() ? a : a.multiply(c);
-    }
-    function lcm(a, b) {
-        a = parseValue(a).abs();
-        b = parseValue(b).abs();
-        return a.divide(gcd(a, b)).multiply(b);
-    }
-    function randBetween(a, b) {
-        a = parseValue(a);
-        b = parseValue(b);
-        var low = min(a, b), high = max(a, b);
-        var range = high.subtract(low).add(1);
-        if (range.isSmall) return low.add(Math.floor(Math.random() * range));
-        var length = range.value.length - 1;
-        var result = [], restricted = true;
-        for (var i = length; i >= 0; i--) {
-            var top = restricted ? range.value[i] : BASE;
-            var digit = truncate(Math.random() * top);
-            result.unshift(digit);
-            if (digit < top) restricted = false;
-        }
-        result = arrayToSmall(result);
-        return low.add(typeof result === "number" ? new SmallInteger(result) : new BigInteger(result, false));
-    }
-    var parseBase = function (text, base) {
-        var length = text.length;
-		var i;
-		var absBase = Math.abs(base);
-		for(var i = 0; i < length; i++) {
-			var c = text[i].toLowerCase();
-			if(c === "-") continue;
-			if(/[a-z0-9]/.test(c)) {
-			    if(/[0-9]/.test(c) && +c >= absBase) {
-					if(c === "1" && absBase === 1) continue;
-                    throw new Error(c + " is not a valid digit in base " + base + ".");
-				} else if(c.charCodeAt(0) - 87 >= absBase) {
-					throw new Error(c + " is not a valid digit in base " + base + ".");
-				}
-			}
-		}
-        if (2 <= base && base <= 36) {
-            if (length <= LOG_MAX_INT / Math.log(base)) {
-				var result = parseInt(text, base);
-				if(isNaN(result)) {
-					throw new Error(c + " is not a valid digit in base " + base + ".");
-				}
-                return new SmallInteger(parseInt(text, base));
-            }
-        }
-        base = parseValue(base);
-        var digits = [];
-        var isNegative = text[0] === "-";
-        for (i = isNegative ? 1 : 0; i < text.length; i++) {
-            var c = text[i].toLowerCase(),
-                charCode = c.charCodeAt(0);
-            if (48 <= charCode && charCode <= 57) digits.push(parseValue(c));
-            else if (97 <= charCode && charCode <= 122) digits.push(parseValue(c.charCodeAt(0) - 87));
-            else if (c === "<") {
-                var start = i;
-                do { i++; } while (text[i] !== ">");
-                digits.push(parseValue(text.slice(start + 1, i)));
-            }
-            else throw new Error(c + " is not a valid character");
-        }
-        return parseBaseFromArray(digits, base, isNegative);
-    };
-
-    function parseBaseFromArray(digits, base, isNegative) {
-        var val = Integer[0], pow = Integer[1], i;
-        for (i = digits.length - 1; i >= 0; i--) {
-            val = val.add(digits[i].times(pow));
-            pow = pow.times(base);
-        }
-        return isNegative ? val.negate() : val;
-    }
-
-    function stringify(digit) {
-        var v = digit.value;
-        if (typeof v === "number") v = [v];
-        if (v.length === 1 && v[0] <= 35) {
-            return "0123456789abcdefghijklmnopqrstuvwxyz".charAt(v[0]);
-        }
-        return "<" + v + ">";
-    }
-    function toBase(n, base) {
-        base = bigInt(base);
-        if (base.isZero()) {
-            if (n.isZero()) return "0";
-            throw new Error("Cannot convert nonzero numbers to base 0.");
-        }
-        if (base.equals(-1)) {
-            if (n.isZero()) return "0";
-            if (n.isNegative()) return new Array(1 - n).join("10");
-            return "1" + new Array(+n).join("01");
-        }
-        var minusSign = "";
-        if (n.isNegative() && base.isPositive()) {
-            minusSign = "-";
-            n = n.abs();
-        }
-        if (base.equals(1)) {
-            if (n.isZero()) return "0";
-            return minusSign + new Array(+n + 1).join(1);
-        }
-        var out = [];
-        var left = n, divmod;
-        while (left.isNegative() || left.compareAbs(base) >= 0) {
-            divmod = left.divmod(base);
-            left = divmod.quotient;
-            var digit = divmod.remainder;
-            if (digit.isNegative()) {
-                digit = base.minus(digit).abs();
-                left = left.next();
-            }
-            out.push(stringify(digit));
-        }
-        out.push(stringify(left));
-        return minusSign + out.reverse().join("");
-    }
-
-    BigInteger.prototype.toString = function (radix) {
-        if (radix === undefined) radix = 10;
-        if (radix !== 10) return toBase(this, radix);
-        var v = this.value, l = v.length, str = String(v[--l]), zeros = "0000000", digit;
-        while (--l >= 0) {
-            digit = String(v[l]);
-            str += zeros.slice(digit.length) + digit;
-        }
-        var sign = this.sign ? "-" : "";
-        return sign + str;
-    };
-
-    SmallInteger.prototype.toString = function (radix) {
-        if (radix === undefined) radix = 10;
-        if (radix != 10) return toBase(this, radix);
-        return String(this.value);
-    };
-    BigInteger.prototype.toJSON = SmallInteger.prototype.toJSON = function() { return this.toString(); }
-
-    BigInteger.prototype.valueOf = function () {
-        return +this.toString();
-    };
-    BigInteger.prototype.toJSNumber = BigInteger.prototype.valueOf;
-
-    SmallInteger.prototype.valueOf = function () {
-        return this.value;
-    };
-    SmallInteger.prototype.toJSNumber = SmallInteger.prototype.valueOf;
-
-    function parseStringValue(v) {
-            if (isPrecise(+v)) {
-                var x = +v;
-                if (x === truncate(x))
-                    return new SmallInteger(x);
-                throw "Invalid integer: " + v;
-            }
-            var sign = v[0] === "-";
-            if (sign) v = v.slice(1);
-            var split = v.split(/e/i);
-            if (split.length > 2) throw new Error("Invalid integer: " + split.join("e"));
-            if (split.length === 2) {
-                var exp = split[1];
-                if (exp[0] === "+") exp = exp.slice(1);
-                exp = +exp;
-                if (exp !== truncate(exp) || !isPrecise(exp)) throw new Error("Invalid integer: " + exp + " is not a valid exponent.");
-                var text = split[0];
-                var decimalPlace = text.indexOf(".");
-                if (decimalPlace >= 0) {
-                    exp -= text.length - decimalPlace - 1;
-                    text = text.slice(0, decimalPlace) + text.slice(decimalPlace + 1);
-                }
-                if (exp < 0) throw new Error("Cannot include negative exponent part for integers");
-                text += (new Array(exp + 1)).join("0");
-                v = text;
-            }
-            var isValid = /^([0-9][0-9]*)$/.test(v);
-            if (!isValid) throw new Error("Invalid integer: " + v);
-            var r = [], max = v.length, l = LOG_BASE, min = max - l;
-            while (max > 0) {
-                r.push(+v.slice(min, max));
-                min -= l;
-                if (min < 0) min = 0;
-                max -= l;
-            }
-            trim(r);
-            return new BigInteger(r, sign);
-    }
-
-    function parseNumberValue(v) {
-        if (isPrecise(v)) {
-            if (v !== truncate(v)) throw new Error(v + " is not an integer.");
-            return new SmallInteger(v);
-        }
-        return parseStringValue(v.toString());
-    }
-
-    function parseValue(v) {
-        if (typeof v === "number") {
-            return parseNumberValue(v);
-        }
-        if (typeof v === "string") {
-            return parseStringValue(v);
-        }
-        return v;
-    }
-    // Pre-define numbers in range [-999,999]
-    for (var i = 0; i < 1000; i++) {
-        Integer[i] = new SmallInteger(i);
-        if (i > 0) Integer[-i] = new SmallInteger(-i);
-    }
-    // Backwards compatibility
-    Integer.one = Integer[1];
-    Integer.zero = Integer[0];
-    Integer.minusOne = Integer[-1];
-    Integer.max = max;
-    Integer.min = min;
-    Integer.gcd = gcd;
-    Integer.lcm = lcm;
-    Integer.isInstance = function (x) { return x instanceof BigInteger || x instanceof SmallInteger; };
-    Integer.randBetween = randBetween;
-
-    Integer.fromArray = function (digits, base, isNegative) {
-        return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative);
-    };
-
-    return Integer;
-})();
-
-// Node.js check
-if (typeof module !== "undefined" && module.hasOwnProperty("exports")) {
-    module.exports = bigInt;
-}
-
-//amd check
-if ( typeof define === "function" && define.amd ) {
-  define( "big-integer", [], function() {
-    return bigInt;
-  });
-}
diff --git a/node_modules/big-integer/BigInteger.min.js b/node_modules/big-integer/BigInteger.min.js
deleted file mode 100644
index a868e44..0000000
--- a/node_modules/big-integer/BigInteger.min.js
+++ /dev/null
@@ -1 +0,0 @@
-var bigInt=function(undefined){"use strict";var BASE=1e7,LOG_BASE=7,MAX_INT=9007199254740992,MAX_INT_ARR=smallToArray(MAX_INT),LOG_MAX_INT=Math.log(MAX_INT);function Integer(v,radix){if(typeof v==="undefined")return Integer[0];if(typeof radix!=="undefined")return+radix===10?parseValue(v):parseBase(v,radix);return parseValue(v)}function BigInteger(value,sign){this.value=value;this.sign=sign;this.isSmall=false}BigInteger.prototype=Object.create(Integer.prototype);function SmallInteger(value){this.value=value;this.sign=value<0;this.isSmall=true}SmallInteger.prototype=Object.create(Integer.prototype);function isPrecise(n){return-MAX_INT<n&&n<MAX_INT}function smallToArray(n){if(n<1e7)return[n];if(n<1e14)return[n%1e7,Math.floor(n/1e7)];return[n%1e7,Math.floor(n/1e7)%1e7,Math.floor(n/1e14)]}function arrayToSmall(arr){trim(arr);var length=arr.length;if(length<4&&compareAbs(arr,MAX_INT_ARR)<0){switch(length){case 0:return 0;case 1:return arr[0];case 2:return arr[0]+arr[1]*BASE;default:return arr[0]+(arr[1]+arr[2]*BASE)*BASE}}return arr}function trim(v){var i=v.length;while(v[--i]===0);v.length=i+1}function createArray(length){var x=new Array(length);var i=-1;while(++i<length){x[i]=0}return x}function truncate(n){if(n>0)return Math.floor(n);return Math.ceil(n)}function add(a,b){var l_a=a.length,l_b=b.length,r=new Array(l_a),carry=0,base=BASE,sum,i;for(i=0;i<l_b;i++){sum=a[i]+b[i]+carry;carry=sum>=base?1:0;r[i]=sum-carry*base}while(i<l_a){sum=a[i]+carry;carry=sum===base?1:0;r[i++]=sum-carry*base}if(carry>0)r.push(carry);return r}function addAny(a,b){if(a.length>=b.length)return add(a,b);return add(b,a)}function addSmall(a,carry){var l=a.length,r=new Array(l),base=BASE,sum,i;for(i=0;i<l;i++){sum=a[i]-base+carry;carry=Math.floor(sum/base);r[i]=sum-carry*base;carry+=1}while(carry>0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}BigInteger.prototype.add=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.subtract(n.negate())}var a=this.value,b=n.value;if(n.isSmall){return new BigInteger(addSmall(a,Math.abs(b)),this.sign)}return new BigInteger(addAny(a,b),this.sign)};BigInteger.prototype.plus=BigInteger.prototype.add;SmallInteger.prototype.add=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.subtract(n.negate())}var b=n.value;if(n.isSmall){if(isPrecise(a+b))return new SmallInteger(a+b);b=smallToArray(Math.abs(b))}return new BigInteger(addSmall(b,Math.abs(a)),a<0)};SmallInteger.prototype.plus=SmallInteger.prototype.add;function subtract(a,b){var a_l=a.length,b_l=b.length,r=new Array(a_l),borrow=0,base=BASE,i,difference;for(i=0;i<b_l;i++){difference=a[i]-borrow-b[i];if(difference<0){difference+=base;borrow=1}else borrow=0;r[i]=difference}for(i=b_l;i<a_l;i++){difference=a[i]-borrow;if(difference<0)difference+=base;else{r[i++]=difference;break}r[i]=difference}for(;i<a_l;i++){r[i]=a[i]}trim(r);return r}function subtractAny(a,b,sign){var value;if(compareAbs(a,b)>=0){value=subtract(a,b)}else{value=subtract(b,a);sign=!sign}value=arrayToSmall(value);if(typeof value==="number"){if(sign)value=-value;return new SmallInteger(value)}return new BigInteger(value,sign)}function subtractSmall(a,b,sign){var l=a.length,r=new Array(l),carry=-b,base=BASE,i,difference;for(i=0;i<l;i++){difference=a[i]+carry;carry=Math.floor(difference/base);difference%=base;r[i]=difference<0?difference+base:difference}r=arrayToSmall(r);if(typeof r==="number"){if(sign)r=-r;return new SmallInteger(r)}return new BigInteger(r,sign)}BigInteger.prototype.subtract=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.add(n.negate())}var a=this.value,b=n.value;if(n.isSmall)return subtractSmall(a,Math.abs(b),this.sign);return subtractAny(a,b,this.sign)};BigInteger.prototype.minus=BigInteger.prototype.subtract;SmallInteger.prototype.subtract=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.add(n.negate())}var b=n.value;if(n.isSmall){return new SmallInteger(a-b)}return subtractSmall(b,Math.abs(a),a>=0)};SmallInteger.prototype.minus=SmallInteger.prototype.subtract;BigInteger.prototype.negate=function(){return new BigInteger(this.value,!this.sign)};SmallInteger.prototype.negate=function(){var sign=this.sign;var small=new SmallInteger(-this.value);small.sign=!sign;return small};BigInteger.prototype.abs=function(){return new BigInteger(this.value,false)};SmallInteger.prototype.abs=function(){return new SmallInteger(Math.abs(this.value))};function multiplyLong(a,b){var a_l=a.length,b_l=b.length,l=a_l+b_l,r=createArray(l),base=BASE,product,carry,i,a_i,b_j;for(i=0;i<a_l;++i){a_i=a[i];for(var j=0;j<b_l;++j){b_j=b[j];product=a_i*b_j+r[i+j];carry=Math.floor(product/base);r[i+j]=product-carry*base;r[i+j+1]+=carry}}trim(r);return r}function multiplySmall(a,b){var l=a.length,r=new Array(l),base=BASE,carry=0,product,i;for(i=0;i<l;i++){product=a[i]*b+carry;carry=Math.floor(product/base);r[i]=product-carry*base}while(carry>0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}function shiftLeft(x,n){var r=[];while(n-- >0)r.push(0);return r.concat(x)}function multiplyKaratsuba(x,y){var n=Math.max(x.length,y.length);if(n<=30)return multiplyLong(x,y);n=Math.ceil(n/2);var b=x.slice(n),a=x.slice(0,n),d=y.slice(n),c=y.slice(0,n);var ac=multiplyKaratsuba(a,c),bd=multiplyKaratsuba(b,d),abcd=multiplyKaratsuba(addAny(a,b),addAny(c,d));var product=addAny(addAny(ac,shiftLeft(subtract(subtract(abcd,ac),bd),n)),shiftLeft(bd,2*n));trim(product);return product}function useKaratsuba(l1,l2){return-.012*l1-.012*l2+15e-6*l1*l2>0}BigInteger.prototype.multiply=function(v){var n=parseValue(v),a=this.value,b=n.value,sign=this.sign!==n.sign,abs;if(n.isSmall){if(b===0)return Integer[0];if(b===1)return this;if(b===-1)return this.negate();abs=Math.abs(b);if(abs<BASE){return new BigInteger(multiplySmall(a,abs),sign)}b=smallToArray(abs)}if(useKaratsuba(a.length,b.length))return new BigInteger(multiplyKaratsuba(a,b),sign);return new BigInteger(multiplyLong(a,b),sign)};BigInteger.prototype.times=BigInteger.prototype.multiply;function multiplySmallAndArray(a,b,sign){if(a<BASE){return new BigInteger(multiplySmall(b,a),sign)}return new BigInteger(multiplyLong(b,smallToArray(a)),sign)}SmallInteger.prototype._multiplyBySmall=function(a){if(isPrecise(a.value*this.value)){return new SmallInteger(a.value*this.value)}return multiplySmallAndArray(Math.abs(a.value),smallToArray(Math.abs(this.value)),this.sign!==a.sign)};BigInteger.prototype._multiplyBySmall=function(a){if(a.value===0)return Integer[0];if(a.value===1)return this;if(a.value===-1)return this.negate();return multiplySmallAndArray(Math.abs(a.value),this.value,this.sign!==a.sign)};SmallInteger.prototype.multiply=function(v){return parseValue(v)._multiplyBySmall(this)};SmallInteger.prototype.times=SmallInteger.prototype.multiply;function square(a){var l=a.length,r=createArray(l+l),base=BASE,product,carry,i,a_i,a_j;for(i=0;i<l;i++){a_i=a[i];for(var j=0;j<l;j++){a_j=a[j];product=a_i*a_j+r[i+j];carry=Math.floor(product/base);r[i+j]=product-carry*base;r[i+j+1]+=carry}}trim(r);return r}BigInteger.prototype.square=function(){return new BigInteger(square(this.value),false)};SmallInteger.prototype.square=function(){var value=this.value*this.value;if(isPrecise(value))return new SmallInteger(value);return new BigInteger(square(smallToArray(Math.abs(this.value))),false)};function divMod1(a,b){var a_l=a.length,b_l=b.length,base=BASE,result=createArray(b.length),divisorMostSignificantDigit=b[b_l-1],lambda=Math.ceil(base/(2*divisorMostSignificantDigit)),remainder=multiplySmall(a,lambda),divisor=multiplySmall(b,lambda),quotientDigit,shift,carry,borrow,i,l,q;if(remainder.length<=a_l)remainder.push(0);divisor.push(0);divisorMostSignificantDigit=divisor[b_l-1];for(shift=a_l-b_l;shift>=0;shift--){quotientDigit=base-1;if(remainder[shift+b_l]!==divisorMostSignificantDigit){quotientDigit=Math.floor((remainder[shift+b_l]*base+remainder[shift+b_l-1])/divisorMostSignificantDigit)}carry=0;borrow=0;l=divisor.length;for(i=0;i<l;i++){carry+=quotientDigit*divisor[i];q=Math.floor(carry/base);borrow+=remainder[shift+i]-(carry-q*base);carry=q;if(borrow<0){remainder[shift+i]=borrow+base;borrow=-1}else{remainder[shift+i]=borrow;borrow=0}}while(borrow!==0){quotientDigit-=1;carry=0;for(i=0;i<l;i++){carry+=remainder[shift+i]-base+divisor[i];if(carry<0){remainder[shift+i]=carry+base;carry=0}else{remainder[shift+i]=carry;carry=1}}borrow+=carry}result[shift]=quotientDigit}remainder=divModSmall(remainder,lambda)[0];return[arrayToSmall(result),arrayToSmall(remainder)]}function divMod2(a,b){var a_l=a.length,b_l=b.length,result=[],part=[],base=BASE,guess,xlen,highx,highy,check;while(a_l){part.unshift(a[--a_l]);trim(part);if(compareAbs(part,b)<0){result.push(0);continue}xlen=part.length;highx=part[xlen-1]*base+part[xlen-2];highy=b[b_l-1]*base+b[b_l-2];if(xlen>b_l){highx=(highx+1)*base}guess=Math.ceil(highx/highy);do{check=multiplySmall(b,guess);if(compareAbs(check,part)<=0)break;guess--}while(guess);result.push(guess);part=subtract(part,check)}result.reverse();return[arrayToSmall(result),arrayToSmall(part)]}function divModSmall(value,lambda){var length=value.length,quotient=createArray(length),base=BASE,i,q,remainder,divisor;remainder=0;for(i=length-1;i>=0;--i){divisor=remainder*base+value[i];q=truncate(divisor/lambda);remainder=divisor-q*lambda;quotient[i]=q|0}return[quotient,remainder|0]}function divModAny(self,v){var value,n=parseValue(v);var a=self.value,b=n.value;var quotient;if(b===0)throw new Error("Cannot divide by zero");if(self.isSmall){if(n.isSmall){return[new SmallInteger(truncate(a/b)),new SmallInteger(a%b)]}return[Integer[0],self]}if(n.isSmall){if(b===1)return[self,Integer[0]];if(b==-1)return[self.negate(),Integer[0]];var abs=Math.abs(b);if(abs<BASE){value=divModSmall(a,abs);quotient=arrayToSmall(value[0]);var remainder=value[1];if(self.sign)remainder=-remainder;if(typeof quotient==="number"){if(self.sign!==n.sign)quotient=-quotient;return[new SmallInteger(quotient),new SmallInteger(remainder)]}return[new BigInteger(quotient,self.sign!==n.sign),new SmallInteger(remainder)]}b=smallToArray(abs)}var comparison=compareAbs(a,b);if(comparison===-1)return[Integer[0],self];if(comparison===0)return[Integer[self.sign===n.sign?1:-1],Integer[0]];if(a.length+b.length<=200)value=divMod1(a,b);else value=divMod2(a,b);quotient=value[0];var qSign=self.sign!==n.sign,mod=value[1],mSign=self.sign;if(typeof quotient==="number"){if(qSign)quotient=-quotient;quotient=new SmallInteger(quotient)}else quotient=new BigInteger(quotient,qSign);if(typeof mod==="number"){if(mSign)mod=-mod;mod=new SmallInteger(mod)}else mod=new BigInteger(mod,mSign);return[quotient,mod]}BigInteger.prototype.divmod=function(v){var result=divModAny(this,v);return{quotient:result[0],remainder:result[1]}};SmallInteger.prototype.divmod=BigInteger.prototype.divmod;BigInteger.prototype.divide=function(v){return divModAny(this,v)[0]};SmallInteger.prototype.over=SmallInteger.prototype.divide=BigInteger.prototype.over=BigInteger.prototype.divide;BigInteger.prototype.mod=function(v){return divModAny(this,v)[1]};SmallInteger.prototype.remainder=SmallInteger.prototype.mod=BigInteger.prototype.remainder=BigInteger.prototype.mod;BigInteger.prototype.pow=function(v){var n=parseValue(v),a=this.value,b=n.value,value,x,y;if(b===0)return Integer[1];if(a===0)return Integer[0];if(a===1)return Integer[1];if(a===-1)return n.isEven()?Integer[1]:Integer[-1];if(n.sign){return Integer[0]}if(!n.isSmall)throw new Error("The exponent "+n.toString()+" is too large.");if(this.isSmall){if(isPrecise(value=Math.pow(a,b)))return new SmallInteger(truncate(value))}x=this;y=Integer[1];while(true){if(b&1===1){y=y.times(x);--b}if(b===0)break;b/=2;x=x.square()}return y};SmallInteger.prototype.pow=BigInteger.prototype.pow;BigInteger.prototype.modPow=function(exp,mod){exp=parseValue(exp);mod=parseValue(mod);if(mod.isZero())throw new Error("Cannot take modPow with modulus 0");var r=Integer[1],base=this.mod(mod);while(exp.isPositive()){if(base.isZero())return Integer[0];if(exp.isOdd())r=r.multiply(base).mod(mod);exp=exp.divide(2);base=base.square().mod(mod)}return r};SmallInteger.prototype.modPow=BigInteger.prototype.modPow;function compareAbs(a,b){if(a.length!==b.length){return a.length>b.length?1:-1}for(var i=a.length-1;i>=0;i--){if(a[i]!==b[i])return a[i]>b[i]?1:-1}return 0}BigInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall)return 1;return compareAbs(a,b)};SmallInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=Math.abs(this.value),b=n.value;if(n.isSmall){b=Math.abs(b);return a===b?0:a>b?1:-1}return-1};BigInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(this.sign!==n.sign){return n.sign?1:-1}if(n.isSmall){return this.sign?-1:1}return compareAbs(a,b)*(this.sign?-1:1)};BigInteger.prototype.compareTo=BigInteger.prototype.compare;SmallInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall){return a==b?0:a>b?1:-1}if(a<0!==n.sign){return a<0?-1:1}return a<0?1:-1};SmallInteger.prototype.compareTo=SmallInteger.prototype.compare;BigInteger.prototype.equals=function(v){return this.compare(v)===0};SmallInteger.prototype.eq=SmallInteger.prototype.equals=BigInteger.prototype.eq=BigInteger.prototype.equals;BigInteger.prototype.notEquals=function(v){return this.compare(v)!==0};SmallInteger.prototype.neq=SmallInteger.prototype.notEquals=BigInteger.prototype.neq=BigInteger.prototype.notEquals;BigInteger.prototype.greater=function(v){return this.compare(v)>0};SmallInteger.prototype.gt=SmallInteger.prototype.greater=BigInteger.prototype.gt=BigInteger.prototype.greater;BigInteger.prototype.lesser=function(v){return this.compare(v)<0};SmallInteger.prototype.lt=SmallInteger.prototype.lesser=BigInteger.prototype.lt=BigInteger.prototype.lesser;BigInteger.prototype.greaterOrEquals=function(v){return this.compare(v)>=0};SmallInteger.prototype.geq=SmallInteger.prototype.greaterOrEquals=BigInteger.prototype.geq=BigInteger.prototype.greaterOrEquals;BigInteger.prototype.lesserOrEquals=function(v){return this.compare(v)<=0};SmallInteger.prototype.leq=SmallInteger.prototype.lesserOrEquals=BigInteger.prototype.leq=BigInteger.prototype.lesserOrEquals;BigInteger.prototype.isEven=function(){return(this.value[0]&1)===0};SmallInteger.prototype.isEven=function(){return(this.value&1)===0};BigInteger.prototype.isOdd=function(){return(this.value[0]&1)===1};SmallInteger.prototype.isOdd=function(){return(this.value&1)===1};BigInteger.prototype.isPositive=function(){return!this.sign};SmallInteger.prototype.isPositive=function(){return this.value>0};BigInteger.prototype.isNegative=function(){return this.sign};SmallInteger.prototype.isNegative=function(){return this.value<0};BigInteger.prototype.isUnit=function(){return false};SmallInteger.prototype.isUnit=function(){return Math.abs(this.value)===1};BigInteger.prototype.isZero=function(){return false};SmallInteger.prototype.isZero=function(){return this.value===0};BigInteger.prototype.isDivisibleBy=function(v){var n=parseValue(v);var value=n.value;if(value===0)return false;if(value===1)return true;if(value===2)return this.isEven();return this.mod(n).equals(Integer[0])};SmallInteger.prototype.isDivisibleBy=BigInteger.prototype.isDivisibleBy;function isBasicPrime(v){var n=v.abs();if(n.isUnit())return false;if(n.equals(2)||n.equals(3)||n.equals(5))return true;if(n.isEven()||n.isDivisibleBy(3)||n.isDivisibleBy(5))return false;if(n.lesser(25))return true}BigInteger.prototype.isPrime=function(){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs(),nPrev=n.prev();var a=[2,3,5,7,11,13,17,19],b=nPrev,d,t,i,x;while(b.isEven())b=b.divide(2);for(i=0;i<a.length;i++){x=bigInt(a[i]).modPow(b,n);if(x.equals(Integer[1])||x.equals(nPrev))continue;for(t=true,d=b;t&&d.lesser(nPrev);d=d.multiply(2)){x=x.square().mod(n);if(x.equals(nPrev))t=false}if(t)return false}return true};SmallInteger.prototype.isPrime=BigInteger.prototype.isPrime;BigInteger.prototype.isProbablePrime=function(iterations){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs();var t=iterations===undefined?5:iterations;for(var i=0;i<t;i++){var a=bigInt.randBetween(2,n.minus(2));if(!a.modPow(n.prev(),n).isUnit())return false}return true};SmallInteger.prototype.isProbablePrime=BigInteger.prototype.isProbablePrime;BigInteger.prototype.modInv=function(n){var t=bigInt.zero,newT=bigInt.one,r=parseValue(n),newR=this.abs(),q,lastT,lastR;while(!newR.equals(bigInt.zero)){q=r.divide(newR);lastT=t;lastR=r;t=newT;r=newR;newT=lastT.subtract(q.multiply(newT));newR=lastR.subtract(q.multiply(newR))}if(!r.equals(1))throw new Error(this.toString()+" and "+n.toString()+" are not co-prime");if(t.compare(0)===-1){t=t.add(n)}if(this.isNegative()){return t.negate()}return t};SmallInteger.prototype.modInv=BigInteger.prototype.modInv;BigInteger.prototype.next=function(){var value=this.value;if(this.sign){return subtractSmall(value,1,this.sign)}return new BigInteger(addSmall(value,1),this.sign)};SmallInteger.prototype.next=function(){var value=this.value;if(value+1<MAX_INT)return new SmallInteger(value+1);return new BigInteger(MAX_INT_ARR,false)};BigInteger.prototype.prev=function(){var value=this.value;if(this.sign){return new BigInteger(addSmall(value,1),true)}return subtractSmall(value,1,this.sign)};SmallInteger.prototype.prev=function(){var value=this.value;if(value-1>-MAX_INT)return new SmallInteger(value-1);return new BigInteger(MAX_INT_ARR,true)};var powersOfTwo=[1];while(2*powersOfTwo[powersOfTwo.length-1]<=BASE)powersOfTwo.push(2*powersOfTwo[powersOfTwo.length-1]);var powers2Length=powersOfTwo.length,highestPower2=powersOfTwo[powers2Length-1];function shift_isSmall(n){return(typeof n==="number"||typeof n==="string")&&+Math.abs(n)<=BASE||n instanceof BigInteger&&n.value.length<=1}BigInteger.prototype.shiftLeft=function(n){if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}n=+n;if(n<0)return this.shiftRight(-n);var result=this;while(n>=powers2Length){result=result.multiply(highestPower2);n-=powers2Length-1}return result.multiply(powersOfTwo[n])};SmallInteger.prototype.shiftLeft=BigInteger.prototype.shiftLeft;BigInteger.prototype.shiftRight=function(n){var remQuo;if(!shift_isSmall(n)){throw new Error(String(n)+" is too large for shifting.")}n=+n;if(n<0)return this.shiftLeft(-n);var result=this;while(n>=powers2Length){if(result.isZero())return result;remQuo=divModAny(result,highestPower2);result=remQuo[1].isNegative()?remQuo[0].prev():remQuo[0];n-=powers2Length-1}remQuo=divModAny(result,powersOfTwo[n]);return remQuo[1].isNegative()?remQuo[0].prev():remQuo[0]};SmallInteger.prototype.shiftRight=BigInteger.prototype.shiftRight;function bitwise(x,y,fn){y=parseValue(y);var xSign=x.isNegative(),ySign=y.isNegative();var xRem=xSign?x.not():x,yRem=ySign?y.not():y;var xDigit=0,yDigit=0;var xDivMod=null,yDivMod=null;var result=[];while(!xRem.isZero()||!yRem.isZero()){xDivMod=divModAny(xRem,highestPower2);xDigit=xDivMod[1].toJSNumber();if(xSign){xDigit=highestPower2-1-xDigit}yDivMod=divModAny(yRem,highestPower2);yDigit=yDivMod[1].toJSNumber();if(ySign){yDigit=highestPower2-1-yDigit}xRem=xDivMod[0];yRem=yDivMod[0];result.push(fn(xDigit,yDigit))}var sum=fn(xSign?1:0,ySign?1:0)!==0?bigInt(-1):bigInt(0);for(var i=result.length-1;i>=0;i-=1){sum=sum.multiply(highestPower2).add(bigInt(result[i]))}return sum}BigInteger.prototype.not=function(){return this.negate().prev()};SmallInteger.prototype.not=BigInteger.prototype.not;BigInteger.prototype.and=function(n){return bitwise(this,n,function(a,b){return a&b})};SmallInteger.prototype.and=BigInteger.prototype.and;BigInteger.prototype.or=function(n){return bitwise(this,n,function(a,b){return a|b})};SmallInteger.prototype.or=BigInteger.prototype.or;BigInteger.prototype.xor=function(n){return bitwise(this,n,function(a,b){return a^b})};SmallInteger.prototype.xor=BigInteger.prototype.xor;var LOBMASK_I=1<<30,LOBMASK_BI=(BASE&-BASE)*(BASE&-BASE)|LOBMASK_I;function roughLOB(n){var v=n.value,x=typeof v==="number"?v|LOBMASK_I:v[0]+v[1]*BASE|LOBMASK_BI;return x&-x}function max(a,b){a=parseValue(a);b=parseValue(b);return a.greater(b)?a:b}function min(a,b){a=parseValue(a);b=parseValue(b);return a.lesser(b)?a:b}function gcd(a,b){a=parseValue(a).abs();b=parseValue(b).abs();if(a.equals(b))return a;if(a.isZero())return b;if(b.isZero())return a;var c=Integer[1],d,t;while(a.isEven()&&b.isEven()){d=Math.min(roughLOB(a),roughLOB(b));a=a.divide(d);b=b.divide(d);c=c.multiply(d)}while(a.isEven()){a=a.divide(roughLOB(a))}do{while(b.isEven()){b=b.divide(roughLOB(b))}if(a.greater(b)){t=b;b=a;a=t}b=b.subtract(a)}while(!b.isZero());return c.isUnit()?a:a.multiply(c)}function lcm(a,b){a=parseValue(a).abs();b=parseValue(b).abs();return a.divide(gcd(a,b)).multiply(b)}function randBetween(a,b){a=parseValue(a);b=parseValue(b);var low=min(a,b),high=max(a,b);var range=high.subtract(low).add(1);if(range.isSmall)return low.add(Math.floor(Math.random()*range));var length=range.value.length-1;var result=[],restricted=true;for(var i=length;i>=0;i--){var top=restricted?range.value[i]:BASE;var digit=truncate(Math.random()*top);result.unshift(digit);if(digit<top)restricted=false}result=arrayToSmall(result);return low.add(typeof result==="number"?new SmallInteger(result):new BigInteger(result,false))}var parseBase=function(text,base){var length=text.length;var i;var absBase=Math.abs(base);for(var i=0;i<length;i++){var c=text[i].toLowerCase();if(c==="-")continue;if(/[a-z0-9]/.test(c)){if(/[0-9]/.test(c)&&+c>=absBase){if(c==="1"&&absBase===1)continue;throw new Error(c+" is not a valid digit in base "+base+".")}else if(c.charCodeAt(0)-87>=absBase){throw new Error(c+" is not a valid digit in base "+base+".")}}}if(2<=base&&base<=36){if(length<=LOG_MAX_INT/Math.log(base)){var result=parseInt(text,base);if(isNaN(result)){throw new Error(c+" is not a valid digit in base "+base+".")}return new SmallInteger(parseInt(text,base))}}base=parseValue(base);var digits=[];var isNegative=text[0]==="-";for(i=isNegative?1:0;i<text.length;i++){var c=text[i].toLowerCase(),charCode=c.charCodeAt(0);if(48<=charCode&&charCode<=57)digits.push(parseValue(c));else if(97<=charCode&&charCode<=122)digits.push(parseValue(c.charCodeAt(0)-87));else if(c==="<"){var start=i;do{i++}while(text[i]!==">");digits.push(parseValue(text.slice(start+1,i)))}else throw new Error(c+" is not a valid character")}return parseBaseFromArray(digits,base,isNegative)};function parseBaseFromArray(digits,base,isNegative){var val=Integer[0],pow=Integer[1],i;for(i=digits.length-1;i>=0;i--){val=val.add(digits[i].times(pow));pow=pow.times(base)}return isNegative?val.negate():val}function stringify(digit){var v=digit.value;if(typeof v==="number")v=[v];if(v.length===1&&v[0]<=35){return"0123456789abcdefghijklmnopqrstuvwxyz".charAt(v[0])}return"<"+v+">"}function toBase(n,base){base=bigInt(base);if(base.isZero()){if(n.isZero())return"0";throw new Error("Cannot convert nonzero numbers to base 0.")}if(base.equals(-1)){if(n.isZero())return"0";if(n.isNegative())return new Array(1-n).join("10");return"1"+new Array(+n).join("01")}var minusSign="";if(n.isNegative()&&base.isPositive()){minusSign="-";n=n.abs()}if(base.equals(1)){if(n.isZero())return"0";return minusSign+new Array(+n+1).join(1)}var out=[];var left=n,divmod;while(left.isNegative()||left.compareAbs(base)>=0){divmod=left.divmod(base);left=divmod.quotient;var digit=divmod.remainder;if(digit.isNegative()){digit=base.minus(digit).abs();left=left.next()}out.push(stringify(digit))}out.push(stringify(left));return minusSign+out.reverse().join("")}BigInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!==10)return toBase(this,radix);var v=this.value,l=v.length,str=String(v[--l]),zeros="0000000",digit;while(--l>=0){digit=String(v[l]);str+=zeros.slice(digit.length)+digit}var sign=this.sign?"-":"";return sign+str};SmallInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!=10)return toBase(this,radix);return String(this.value)};BigInteger.prototype.toJSON=SmallInteger.prototype.toJSON=function(){return this.toString()};BigInteger.prototype.valueOf=function(){return+this.toString()};BigInteger.prototype.toJSNumber=BigInteger.prototype.valueOf;SmallInteger.prototype.valueOf=function(){return this.value};SmallInteger.prototype.toJSNumber=SmallInteger.prototype.valueOf;function parseStringValue(v){if(isPrecise(+v)){var x=+v;if(x===truncate(x))return new SmallInteger(x);throw"Invalid integer: "+v}var sign=v[0]==="-";if(sign)v=v.slice(1);var split=v.split(/e/i);if(split.length>2)throw new Error("Invalid integer: "+split.join("e"));if(split.length===2){var exp=split[1];if(exp[0]==="+")exp=exp.slice(1);exp=+exp;if(exp!==truncate(exp)||!isPrecise(exp))throw new Error("Invalid integer: "+exp+" is not a valid exponent.");var text=split[0];var decimalPlace=text.indexOf(".");if(decimalPlace>=0){exp-=text.length-decimalPlace-1;text=text.slice(0,decimalPlace)+text.slice(decimalPlace+1)}if(exp<0)throw new Error("Cannot include negative exponent part for integers");text+=new Array(exp+1).join("0");v=text}var isValid=/^([0-9][0-9]*)$/.test(v);if(!isValid)throw new Error("Invalid integer: "+v);var r=[],max=v.length,l=LOG_BASE,min=max-l;while(max>0){r.push(+v.slice(min,max));min-=l;if(min<0)min=0;max-=l}trim(r);return new BigInteger(r,sign)}function parseNumberValue(v){if(isPrecise(v)){if(v!==truncate(v))throw new Error(v+" is not an integer.");return new SmallInteger(v)}return parseStringValue(v.toString())}function parseValue(v){if(typeof v==="number"){return parseNumberValue(v)}if(typeof v==="string"){return parseStringValue(v)}return v}for(var i=0;i<1e3;i++){Integer[i]=new SmallInteger(i);if(i>0)Integer[-i]=new SmallInteger(-i)}Integer.one=Integer[1];Integer.zero=Integer[0];Integer.minusOne=Integer[-1];Integer.max=max;Integer.min=min;Integer.gcd=gcd;Integer.lcm=lcm;Integer.isInstance=function(x){return x instanceof BigInteger||x instanceof SmallInteger};Integer.randBetween=randBetween;Integer.fromArray=function(digits,base,isNegative){return parseBaseFromArray(digits.map(parseValue),parseValue(base||10),isNegative)};return Integer}();if(typeof module!=="undefined"&&module.hasOwnProperty("exports")){module.exports=bigInt}if(typeof define==="function"&&define.amd){define("big-integer",[],function(){return bigInt})}
\ No newline at end of file
diff --git a/node_modules/big-integer/LICENSE b/node_modules/big-integer/LICENSE
deleted file mode 100644
index cf1ab25..0000000
--- a/node_modules/big-integer/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-This is free and unencumbered software released into the public domain.
-
-Anyone is free to copy, modify, publish, use, compile, sell, or
-distribute this software, either in source code form or as a compiled
-binary, for any purpose, commercial or non-commercial, and by any
-means.
-
-In jurisdictions that recognize copyright laws, the author or authors
-of this software dedicate any and all copyright interest in the
-software to the public domain. We make this dedication for the benefit
-of the public at large and to the detriment of our heirs and
-successors. We intend this dedication to be an overt act of
-relinquishment in perpetuity of all present and future rights to this
-software under copyright law.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-For more information, please refer to <http://unlicense.org>
diff --git a/node_modules/big-integer/README.md b/node_modules/big-integer/README.md
deleted file mode 100644
index 5824f7e..0000000
--- a/node_modules/big-integer/README.md
+++ /dev/null
@@ -1,520 +0,0 @@
-# BigInteger.js [![Build Status][travis-img]][travis-url] [![Coverage Status][coveralls-img]][coveralls-url] [![Monthly Downloads][downloads-img]][downloads-url]
-
-[travis-url]: https://travis-ci.org/peterolson/BigInteger.js
-[travis-img]: https://travis-ci.org/peterolson/BigInteger.js.svg?branch=master
-[coveralls-url]: https://coveralls.io/github/peterolson/BigInteger.js?branch=master
-[coveralls-img]: https://coveralls.io/repos/peterolson/BigInteger.js/badge.svg?branch=master&service=github
-[downloads-url]: https://www.npmjs.com/package/big-integer
-[downloads-img]: https://img.shields.io/npm/dm/big-integer.svg
-
-**BigInteger.js** is an arbitrary-length integer library for Javascript, allowing arithmetic operations on integers of unlimited size, notwithstanding memory and time limitations.
-
-## Installation
-
-If you are using a browser, you can download [BigInteger.js from GitHub](http://peterolson.github.com/BigInteger.js/BigInteger.min.js) or just hotlink to it:
-
-	<script src="http://peterolson.github.com/BigInteger.js/BigInteger.min.js"></script>
-
-If you are using node, you can install BigInteger with [npm](https://npmjs.org/).
-
-    npm install big-integer
-
-Then you can include it in your code:
-
-	var bigInt = require("big-integer");
-
-
-## Usage
-### `bigInt(number, [base])`
-
-You can create a bigInt by calling the `bigInt` function. You can pass in
-
- - a string, which it will parse as an bigInt and throw an `"Invalid integer"` error if the parsing fails.
- - a Javascript number, which it will parse as an bigInt and throw an `"Invalid integer"` error if the parsing fails.
- - another bigInt.
- - nothing, and it will return `bigInt.zero`.
-
- If you provide a second parameter, then it will parse `number` as a number in base `base`. Note that `base` can be any bigInt (even negative or zero). The letters "a-z" and "A-Z" will be interpreted as the numbers 10 to 35. Higher digits can be specified in angle brackets (`<` and `>`).
-
-Examples:
-
-    var zero = bigInt();
-    var ninetyThree = bigInt(93);
-	var largeNumber = bigInt("75643564363473453456342378564387956906736546456235345");
-	var googol = bigInt("1e100");
-	var bigNumber = bigInt(largeNumber);
-	 
-	var maximumByte = bigInt("FF", 16);
-	var fiftyFiveGoogol = bigInt("<55>0", googol);
-
-Note that Javascript numbers larger than `9007199254740992` and smaller than `-9007199254740992` are not precisely represented numbers and will not produce exact results. If you are dealing with numbers outside that range, it is better to pass in strings.
-
-### Method Chaining
-
-Note that bigInt operations return bigInts, which allows you to chain methods, for example:
-
-    var salary = bigInt(dollarsPerHour).times(hoursWorked).plus(randomBonuses)
-
-### Constants
-
-There are three named constants already stored that you do not have to construct with the `bigInt` function yourself:
-
- - `bigInt.one`, equivalent to `bigInt(1)`
- - `bigInt.zero`, equivalent to `bigInt(0)`
- - `bigInt.minusOne`, equivalent to `bigInt(-1)`
- 
-The numbers from -999 to 999 are also already prestored and can be accessed using `bigInt[index]`, for example:
-
- - `bigInt[-999]`, equivalent to `bigInt(-999)`
- - `bigInt[256]`, equivalent to `bigInt(256)`
-
-### Methods
-
-#### `abs()`
-
-Returns the absolute value of a bigInt.
-
- - `bigInt(-45).abs()` => `45`
- - `bigInt(45).abs()` => `45`
-
-#### `add(number)`
-
-Performs addition.
-
- - `bigInt(5).add(7)` => `12`
- 
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Addition)
-
-#### `and(number)`
-
-Performs the bitwise AND operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement).
-
- - `bigInt(6).and(3)` => `2`
- - `bigInt(6).and(-3)` => `4`
-
-#### `compare(number)`
-
-Performs a comparison between two numbers. If the numbers are equal, it returns `0`. If the first number is greater, it returns `1`. If the first number is lesser, it returns `-1`.
-
- - `bigInt(5).compare(5)` => `0`
- - `bigInt(5).compare(4)` => `1`
- - `bigInt(4).compare(5)` => `-1`
-
-#### `compareAbs(number)`
-
-Performs a comparison between the absolute value of two numbers.
-
- - `bigInt(5).compareAbs(-5)` => `0`
- - `bigInt(5).compareAbs(4)` => `1`
- - `bigInt(4).compareAbs(-5)` => `-1`
-
-#### `compareTo(number)`
-
-Alias for the `compare` method.
-
-#### `divide(number)`
-
-Performs integer division, disregarding the remainder.
-
- - `bigInt(59).divide(5)` => `11`
- 
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division)
-
-#### `divmod(number)`
-
-Performs division and returns an object with two properties: `quotient` and `remainder`. The sign of the remainder will match the sign of the dividend.
-
- - `bigInt(59).divmod(5)` => `{quotient: bigInt(11), remainder: bigInt(4) }`
- - `bigInt(-5).divmod(2)` => `{quotient: bigInt(-2), remainder: bigInt(-1) }`
- 
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division)
-
-#### `eq(number)`
-
-Alias for the `equals` method.
-
-#### `equals(number)`
-
-Checks if two numbers are equal.
-
- - `bigInt(5).equals(5)` => `true`
- - `bigInt(4).equals(7)` => `false`
-
-#### `geq(number)`
-
-Alias for the `greaterOrEquals` method.
-
-
-#### `greater(number)`
-
-Checks if the first number is greater than the second.
-
- - `bigInt(5).greater(6)` => `false`
- - `bigInt(5).greater(5)` => `false`
- - `bigInt(5).greater(4)` => `true`
-
-#### `greaterOrEquals(number)`
-
-Checks if the first number is greater than or equal to the second.
-
- - `bigInt(5).greaterOrEquals(6)` => `false`
- - `bigInt(5).greaterOrEquals(5)` => `true`
- - `bigInt(5).greaterOrEquals(4)` => `true`
-
-#### `gt(number)`
-
-Alias for the `greater` method.
-
-#### `isDivisibleBy(number)`
-
-Returns `true` if the first number is divisible by the second number, `false` otherwise.
-
- - `bigInt(999).isDivisibleBy(333)` => `true`
- - `bigInt(99).isDivisibleBy(5)` => `false`
-
-#### `isEven()`
-
-Returns `true` if the number is even, `false` otherwise.
-
- - `bigInt(6).isEven()` => `true`
- - `bigInt(3).isEven()` => `false`
-
-#### `isNegative()`
-
-Returns `true` if the number is negative, `false` otherwise.
-Returns `false` for `0` and `-0`.
-
- - `bigInt(-23).isNegative()` => `true`
- - `bigInt(50).isNegative()` => `false`
-
-#### `isOdd()`
-
-Returns `true` if the number is odd, `false` otherwise.
-
- - `bigInt(13).isOdd()` => `true`
- - `bigInt(40).isOdd()` => `false`
-
-#### `isPositive()`
-
-Return `true` if the number is positive, `false` otherwise.
-Returns `false` for `0` and `-0`.
-
- - `bigInt(54).isPositive()` => `true`
- - `bigInt(-1).isPositive()` => `false`
-
-#### `isPrime()`
-
-Returns `true` if the number is prime, `false` otherwise.
-
- - `bigInt(5).isPrime()` => `true`
- - `bigInt(6).isPrime()` => `false`
-
-#### `isProbablePrime([iterations])`
-
-Returns `true` if the number is very likely to be prime, `false` otherwise.
-Argument is optional and determines the amount of iterations of the test (default: `5`). The more iterations, the lower chance of getting a false positive.
-This uses the [Fermat primality test](https://en.wikipedia.org/wiki/Fermat_primality_test).
-
- - `bigInt(5).isProbablePrime()` => `true`
- - `bigInt(49).isProbablePrime()` => `false`
- - `bigInt(1729).isProbablePrime(50)` => `false`
- 
-Note that this function is not deterministic, since it relies on random sampling of factors, so the result for some numbers is not always the same. [Carmichael numbers](https://en.wikipedia.org/wiki/Carmichael_number) are particularly prone to give unreliable results.
-
-For example, `bigInt(1729).isProbablePrime()` returns `false` about 76% of the time and `true` about 24% of the time. The correct result is `false`.
-
-#### `isUnit()`
-
-Returns `true` if the number is `1` or `-1`, `false` otherwise.
-
- - `bigInt.one.isUnit()` => `true`
- - `bigInt.minusOne.isUnit()` => `true`
- - `bigInt(5).isUnit()` => `false`
-
-#### `isZero()`
-
-Return `true` if the number is `0` or `-0`, `false` otherwise.
-
- - `bigInt.zero.isZero()` => `true`
- - `bigInt("-0").isZero()` => `true`
- - `bigInt(50).isZero()` => `false`
-
-#### `leq(number)`
-
-Alias for the `lesserOrEquals` method.
-
-#### `lesser(number)`
-
-Checks if the first number is lesser than the second.
-
- - `bigInt(5).lesser(6)` => `true`
- - `bigInt(5).lesser(5)` => `false`
- - `bigInt(5).lesser(4)` => `false`
-
-#### `lesserOrEquals(number)`
-
-Checks if the first number is less than or equal to the second.
-
- - `bigInt(5).lesserOrEquals(6)` => `true`
- - `bigInt(5).lesserOrEquals(5)` => `true`
- - `bigInt(5).lesserOrEquals(4)` => `false`
-
-#### `lt(number)`
-
-Alias for the `lesser` method.
-
-#### `minus(number)`
-
-Alias for the `subtract` method.
-
- - `bigInt(3).minus(5)` => `-2`
- 
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Subtraction)
-
-#### `mod(number)`
-
-Performs division and returns the remainder, disregarding the quotient. The sign of the remainder will match the sign of the dividend.
-
- - `bigInt(59).mod(5)` =>  `4`
- - `bigInt(-5).mod(2)` => `-1`
- 
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division)
-
-#### `modInv(mod)`
-
-Finds the [multiplicative inverse](https://en.wikipedia.org/wiki/Modular_multiplicative_inverse) of the number modulo `mod`.
-
- - `bigInt(3).modInv(11)` => `4`
- - `bigInt(42).modInv(2017)` => `1969`
-
-#### `modPow(exp, mod)`
-
-Takes the number to the power `exp` modulo `mod`.
-
- - `bigInt(10).modPow(3, 30)` => `10`
-
-#### `multiply(number)`
-
-Performs multiplication.
-
- - `bigInt(111).multiply(111)` => `12321`
-
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Multiplication)
-
-#### `neq(number)`
-
-Alias for the `notEquals` method.
-
-#### `next()`
-
-Adds one to the number.
-
- - `bigInt(6).next()` => `7`
-
-#### `not()`
-
-Performs the bitwise NOT operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement).
-
- - `bigInt(10).not()` => `-11`
- - `bigInt(0).not()` => `-1`
-
-#### `notEquals(number)`
-
-Checks if two numbers are not equal.
-
- - `bigInt(5).notEquals(5)` => `false`
- - `bigInt(4).notEquals(7)` => `true`
-
-#### `or(number)`
-
-Performs the bitwise OR operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement).
-
- - `bigInt(13).or(10)` => `15`
- - `bigInt(13).or(-8)` => `-3`
-
-#### `over(number)`
-
-Alias for the `divide` method.
-
- - `bigInt(59).over(5)` => `11`
- 
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division)
-
-#### `plus(number)`
-
-Alias for the `add` method.
-
- - `bigInt(5).plus(7)` => `12`
- 
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Addition)
-
-#### `pow(number)`
-
-Performs exponentiation. If the exponent is less than `0`, `pow` returns `0`. `bigInt.zero.pow(0)` returns `1`.
-
- - `bigInt(16).pow(16)` => `18446744073709551616`
-
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Exponentiation)
-
-#### `prev(number)`
-
-Subtracts one from the number.
-
- - `bigInt(6).prev()` => `5`
-
-#### `remainder(number)`
-
-Alias for the `mod` method.
-
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Division)
-
-#### `shiftLeft(n)`
-
-Shifts the number left by `n` places in its binary representation. If a negative number is provided, it will shift right. Throws an error if `n` is outside of the range `[-9007199254740992, 9007199254740992]`.
-
- - `bigInt(8).shiftLeft(2)` => `32`
- - `bigInt(8).shiftLeft(-2)` => `2`
-
-#### `shiftRight(n)`
-
-Shifts the number right by `n` places in its binary representation. If a negative number is provided, it will shift left. Throws an error if `n` is outside of the range `[-9007199254740992, 9007199254740992]`.
-
- - `bigInt(8).shiftRight(2)` => `2`
- - `bigInt(8).shiftRight(-2)` => `32`
-
-#### `square()`
-
-Squares the number
-
- - `bigInt(3).square()` => `9`
- 
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Squaring)
-
-#### `subtract(number)`
-
-Performs subtraction.
-
- - `bigInt(3).subtract(5)` => `-2`
- 
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Subtraction)
-
-#### `times(number)`
-
-Alias for the `multiply` method.
-
- - `bigInt(111).times(111)` => `12321`
- 
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#Multiplication)
-
-#### `toJSNumber()`
-
-Converts a bigInt into a native Javascript number. Loses precision for numbers outside the range `[-9007199254740992, 9007199254740992]`.
-
- - `bigInt("18446744073709551616").toJSNumber()` => `18446744073709552000`
-
-#### `xor(number)`
-
-Performs the bitwise XOR operation. The operands are treated as if they were represented using [two's complement representation](http://en.wikipedia.org/wiki/Two%27s_complement).
-
- - `bigInt(12).xor(5)` => `9`
- - `bigInt(12).xor(-5)` => `-9`
- 
-### Static Methods
-
-#### `fromArray(digits, base = 10, isNegative?)`
-
-Constructs a bigInt from an array of digits in base `base`. The optional `isNegative` flag will make the number negative.
-
- - `bigInt.fromArray([1, 2, 3, 4, 5], 10)` => `12345`
- - `bigInt.fromArray([1, 0, 0], 2, true)` => `-4`
-
-#### `gcd(a, b)`
-
-Finds the greatest common denominator of `a` and `b`.
-
- - `bigInt.gcd(42,56)` => `14`
-
-#### `isInstance(x)`
-
-Returns `true` if `x` is a BigInteger, `false` otherwise.
-
- - `bigInt.isInstance(bigInt(14))` => `true`
- - `bigInt.isInstance(14)` => `false`
- 
-#### `lcm(a,b)`
-
-Finds the least common multiple of `a` and `b`.
- 
- - `bigInt.lcm(21, 6)` => `42`
- 
-#### `max(a,b)`
-
-Returns the largest of `a` and `b`.
-
- - `bigInt.max(77, 432)` => `432`
-
-#### `min(a,b)`
-
-Returns the smallest of `a` and `b`.
-
- - `bigInt.min(77, 432)` => `77`
-
-#### `randBetween(min, max)`
-
-Returns a random number between `min` and `max`.
-
- - `bigInt.randBetween("-1e100", "1e100")` => (for example) `8494907165436643479673097939554427056789510374838494147955756275846226209006506706784609314471378745`
-
-
-### Override Methods
-
-#### `toString(radix = 10)`
-
-Converts a bigInt to a string. There is an optional radix parameter (which defaults to 10) that converts the number to the given radix. Digits in the range `10-35` will use the letters `a-z`.
-
- - `bigInt("1e9").toString()` => `"1000000000"`
- - `bigInt("1e9").toString(16)` => `"3b9aca00"`
-
-**Note that arithmetical operators will trigger the `valueOf` function rather than the `toString` function.** When converting a bigInteger to a string, you should use the `toString` method or the `String` function instead of adding the empty string.
-
- - `bigInt("999999999999999999").toString()` => `"999999999999999999"`
- - `String(bigInt("999999999999999999"))` => `"999999999999999999"`
- - `bigInt("999999999999999999") + ""` => `1000000000000000000`
-
-Bases larger than 36 are supported. If a digit is greater than or equal to 36, it will be enclosed in angle brackets.
-
- - `bigInt(567890).toString(100)` => `"<56><78><90>"`
-
-Negative bases are also supported.
-
- - `bigInt(12345).toString(-10)` => `"28465"`
-
-Base 1 and base -1 are also supported.
-
- - `bigInt(-15).toString(1)` => `"-111111111111111"`
- - `bigInt(-15).toString(-1)` => `"101010101010101010101010101010"`
-
-Base 0 is only allowed for the number zero.
-
- - `bigInt(0).toString(0)` => `0`
- - `bigInt(1).toString(0)` => `Error: Cannot convert nonzero numbers to base 0.`
- 
-[View benchmarks for this method](http://peterolson.github.io/BigInteger.js/benchmark/#toString)
- 
-#### `valueOf()`
-
-Converts a bigInt to a native Javascript number. This override allows you to use native arithmetic operators without explicit conversion:
-
- - `bigInt("100") + bigInt("200") === 300; //true`
-
-## Contributors
-
-To contribute, just fork the project, make some changes, and submit a pull request. Please verify that the unit tests pass before submitting.
-
-The unit tests are contained in the `spec/spec.js` file. You can run them locally by opening the `spec/SpecRunner.html` or file or running `npm test`. You can also [run the tests online from GitHub](http://peterolson.github.io/BigInteger.js/spec/SpecRunner.html).
-
-There are performance benchmarks that can be viewed from the `benchmarks/index.html` page. You can [run them online from GitHub](http://peterolson.github.io/BigInteger.js/benchmark/).
-
-## License
-
-This project is public domain. For more details, read about the [Unlicense](http://unlicense.org/).
diff --git a/node_modules/big-integer/bower.json b/node_modules/big-integer/bower.json
deleted file mode 100644
index 22dc58f..0000000
--- a/node_modules/big-integer/bower.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  "name": "big-integer",
-  "description": "An arbitrary length integer library for Javascript",
-  "main": "./BigInteger.js",
-  "authors": [
-    "Peter Olson"
-  ],
-  "license": "Unlicense",
-  "keywords": [
-    "math",
-    "big",
-    "bignum",
-    "bigint",
-    "biginteger",
-    "integer",
-    "arbitrary",
-    "precision",
-    "arithmetic"
-  ],
-  "homepage": "https://github.com/peterolson/BigInteger.js",
-  "ignore": [
-    "**/.*",
-    "node_modules",
-    "bower_components",
-    "test",
-    "coverage",
-    "tests"
-  ]
-}
diff --git a/node_modules/big-integer/package.json b/node_modules/big-integer/package.json
deleted file mode 100644
index 623f4c2..0000000
--- a/node_modules/big-integer/package.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
-  "_args": [
-    [
-      "big-integer@1.6.26",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "big-integer@1.6.26",
-  "_id": "big-integer@1.6.26",
-  "_inBundle": false,
-  "_integrity": "sha1-OvFnL6Ytry1eyvrPblqg0l4Cwcg=",
-  "_location": "/big-integer",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "big-integer@1.6.26",
-    "name": "big-integer",
-    "escapedName": "big-integer",
-    "rawSpec": "1.6.26",
-    "saveSpec": null,
-    "fetchSpec": "1.6.26"
-  },
-  "_requiredBy": [
-    "/bplist-parser"
-  ],
-  "_resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.26.tgz",
-  "_spec": "1.6.26",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Peter Olson",
-    "email": "peter.e.c.olson+npm@gmail.com"
-  },
-  "bin": {},
-  "bugs": {
-    "url": "https://github.com/peterolson/BigInteger.js/issues"
-  },
-  "contributors": [],
-  "description": "An arbitrary length integer library for Javascript",
-  "devDependencies": {
-    "@types/lodash": "^4.14.64",
-    "@types/node": "^7.0.22",
-    "coveralls": "^2.11.4",
-    "jasmine": "2.1.x",
-    "jasmine-core": "^2.3.4",
-    "karma": "^0.13.3",
-    "karma-coverage": "^0.4.2",
-    "karma-jasmine": "^0.3.6",
-    "karma-phantomjs-launcher": "^1.0.4",
-    "lodash": "^4.17.4",
-    "typescript": "^2.3.3",
-    "uglifyjs": "^2.4.10"
-  },
-  "engines": {
-    "node": ">=0.6"
-  },
-  "homepage": "https://github.com/peterolson/BigInteger.js#readme",
-  "keywords": [
-    "math",
-    "big",
-    "bignum",
-    "bigint",
-    "biginteger",
-    "integer",
-    "arbitrary",
-    "precision",
-    "arithmetic"
-  ],
-  "license": "Unlicense",
-  "main": "./BigInteger",
-  "name": "big-integer",
-  "repository": {
-    "type": "git",
-    "url": "git+ssh://git@github.com/peterolson/BigInteger.js.git"
-  },
-  "scripts": {
-    "minify": "uglifyjs BigInteger.js -o BigInteger.min.js",
-    "test": "tsc && node_modules/.bin/karma start my.conf.js && node spec/tsDefinitions.js"
-  },
-  "typings": "./BigInteger.d.ts",
-  "version": "1.6.26"
-}
diff --git a/node_modules/big-integer/tsconfig.json b/node_modules/big-integer/tsconfig.json
deleted file mode 100644
index 62636e8..0000000
--- a/node_modules/big-integer/tsconfig.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "compilerOptions": {
-        "module": "commonjs",
-        "lib": [
-            "es6"
-        ],
-        "noImplicitAny": true,
-        "noImplicitThis": true,
-        "strictNullChecks": false,
-        "baseUrl": "./",
-        "moduleResolution": "node",
-        "allowJs": true,
-        "typeRoots": [
-            "./"
-        ],
-        "types": [
-            "node"
-        ],
-        "forceConsistentCasingInFileNames": true
-    },
-    "files": [
-        "BigInteger.d.ts",
-        "spec/tsDefinitions.ts"
-    ]
-}
\ No newline at end of file
diff --git a/node_modules/bplist-parser/.npmignore b/node_modules/bplist-parser/.npmignore
deleted file mode 100644
index a9b46ea..0000000
--- a/node_modules/bplist-parser/.npmignore
+++ /dev/null
@@ -1,8 +0,0 @@
-/build/*
-node_modules
-*.node
-*.sh
-*.swp
-.lock*
-npm-debug.log
-.idea
diff --git a/node_modules/bplist-parser/README.md b/node_modules/bplist-parser/README.md
deleted file mode 100644
index 37e5e1c..0000000
--- a/node_modules/bplist-parser/README.md
+++ /dev/null
@@ -1,47 +0,0 @@
-bplist-parser
-=============
-
-Binary Mac OS X Plist (property list) parser.
-
-## Installation
-
-```bash
-$ npm install bplist-parser
-```
-
-## Quick Examples
-
-```javascript
-var bplist = require('bplist-parser');
-
-bplist.parseFile('myPlist.bplist', function(err, obj) {
-  if (err) throw err;
-
-  console.log(JSON.stringify(obj));
-});
-```
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2012 Near Infinity Corporation
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/bplist-parser/bplistParser.js b/node_modules/bplist-parser/bplistParser.js
deleted file mode 100644
index f8335bc..0000000
--- a/node_modules/bplist-parser/bplistParser.js
+++ /dev/null
@@ -1,357 +0,0 @@
-'use strict';
-
-// adapted from http://code.google.com/p/plist/source/browse/trunk/src/com/dd/plist/BinaryPropertyListParser.java
-
-var fs = require('fs');
-var bigInt = require("big-integer");
-var debug = false;
-
-exports.maxObjectSize = 100 * 1000 * 1000; // 100Meg
-exports.maxObjectCount = 32768;
-
-// EPOCH = new SimpleDateFormat("yyyy MM dd zzz").parse("2001 01 01 GMT").getTime();
-// ...but that's annoying in a static initializer because it can throw exceptions, ick.
-// So we just hardcode the correct value.
-var EPOCH = 978307200000;
-
-// UID object definition
-var UID = exports.UID = function(id) {
-  this.UID = id;
-}
-
-var parseFile = exports.parseFile = function (fileNameOrBuffer, callback) {
-  function tryParseBuffer(buffer) {
-    var err = null;
-    var result;
-    try {
-      result = parseBuffer(buffer);
-    } catch (ex) {
-      err = ex;
-    }
-    callback(err, result);
-  }
-
-  if (Buffer.isBuffer(fileNameOrBuffer)) {
-    return tryParseBuffer(fileNameOrBuffer);
-  } else {
-    fs.readFile(fileNameOrBuffer, function (err, data) {
-      if (err) { return callback(err); }
-      tryParseBuffer(data);
-    });
-  }
-};
-
-var parseBuffer = exports.parseBuffer = function (buffer) {
-  var result = {};
-
-  // check header
-  var header = buffer.slice(0, 'bplist'.length).toString('utf8');
-  if (header !== 'bplist') {
-    throw new Error("Invalid binary plist. Expected 'bplist' at offset 0.");
-  }
-
-  // Handle trailer, last 32 bytes of the file
-  var trailer = buffer.slice(buffer.length - 32, buffer.length);
-  // 6 null bytes (index 0 to 5)
-  var offsetSize = trailer.readUInt8(6);
-  if (debug) {
-    console.log("offsetSize: " + offsetSize);
-  }
-  var objectRefSize = trailer.readUInt8(7);
-  if (debug) {
-    console.log("objectRefSize: " + objectRefSize);
-  }
-  var numObjects = readUInt64BE(trailer, 8);
-  if (debug) {
-    console.log("numObjects: " + numObjects);
-  }
-  var topObject = readUInt64BE(trailer, 16);
-  if (debug) {
-    console.log("topObject: " + topObject);
-  }
-  var offsetTableOffset = readUInt64BE(trailer, 24);
-  if (debug) {
-    console.log("offsetTableOffset: " + offsetTableOffset);
-  }
-
-  if (numObjects > exports.maxObjectCount) {
-    throw new Error("maxObjectCount exceeded");
-  }
-
-  // Handle offset table
-  var offsetTable = [];
-
-  for (var i = 0; i < numObjects; i++) {
-    var offsetBytes = buffer.slice(offsetTableOffset + i * offsetSize, offsetTableOffset + (i + 1) * offsetSize);
-    offsetTable[i] = readUInt(offsetBytes, 0);
-    if (debug) {
-      console.log("Offset for Object #" + i + " is " + offsetTable[i] + " [" + offsetTable[i].toString(16) + "]");
-    }
-  }
-
-  // Parses an object inside the currently parsed binary property list.
-  // For the format specification check
-  // <a href="http://www.opensource.apple.com/source/CF/CF-635/CFBinaryPList.c">
-  // Apple's binary property list parser implementation</a>.
-  function parseObject(tableOffset) {
-    var offset = offsetTable[tableOffset];
-    var type = buffer[offset];
-    var objType = (type & 0xF0) >> 4; //First  4 bits
-    var objInfo = (type & 0x0F);      //Second 4 bits
-    switch (objType) {
-    case 0x0:
-      return parseSimple();
-    case 0x1:
-      return parseInteger();
-    case 0x8:
-      return parseUID();
-    case 0x2:
-      return parseReal();
-    case 0x3:
-      return parseDate();
-    case 0x4:
-      return parseData();
-    case 0x5: // ASCII
-      return parsePlistString();
-    case 0x6: // UTF-16
-      return parsePlistString(true);
-    case 0xA:
-      return parseArray();
-    case 0xD:
-      return parseDictionary();
-    default:
-      throw new Error("Unhandled type 0x" + objType.toString(16));
-    }
-
-    function parseSimple() {
-      //Simple
-      switch (objInfo) {
-      case 0x0: // null
-        return null;
-      case 0x8: // false
-        return false;
-      case 0x9: // true
-        return true;
-      case 0xF: // filler byte
-        return null;
-      default:
-        throw new Error("Unhandled simple type 0x" + objType.toString(16));
-      }
-    }
-
-    function bufferToHexString(buffer) {
-      var str = '';
-      var i;
-      for (i = 0; i < buffer.length; i++) {
-        if (buffer[i] != 0x00) {
-          break;
-        }
-      }
-      for (; i < buffer.length; i++) {
-        var part = '00' + buffer[i].toString(16);
-        str += part.substr(part.length - 2);
-      }
-      return str;
-    }
-
-    function parseInteger() {
-      var length = Math.pow(2, objInfo);
-      if (length > 4) {
-        var data = buffer.slice(offset + 1, offset + 1 + length);
-        var str = bufferToHexString(data);
-        return bigInt(str, 16);
-      } if (length < exports.maxObjectSize) {
-        return readUInt(buffer.slice(offset + 1, offset + 1 + length));
-      } else {
-        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
-      }
-    }
-
-    function parseUID() {
-      var length = objInfo + 1;
-      if (length < exports.maxObjectSize) {
-        return new UID(readUInt(buffer.slice(offset + 1, offset + 1 + length)));
-      } else {
-        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
-      }
-    }
-
-    function parseReal() {
-      var length = Math.pow(2, objInfo);
-      if (length < exports.maxObjectSize) {
-        var realBuffer = buffer.slice(offset + 1, offset + 1 + length);
-        if (length === 4) {
-          return realBuffer.readFloatBE(0);
-        }
-        else if (length === 8) {
-          return realBuffer.readDoubleBE(0);
-        }
-      } else {
-        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
-      }
-    }
-
-    function parseDate() {
-      if (objInfo != 0x3) {
-        console.error("Unknown date type :" + objInfo + ". Parsing anyway...");
-      }
-      var dateBuffer = buffer.slice(offset + 1, offset + 9);
-      return new Date(EPOCH + (1000 * dateBuffer.readDoubleBE(0)));
-    }
-
-    function parseData() {
-      var dataoffset = 1;
-      var length = objInfo;
-      if (objInfo == 0xF) {
-        var int_type = buffer[offset + 1];
-        var intType = (int_type & 0xF0) / 0x10;
-        if (intType != 0x1) {
-          console.error("0x4: UNEXPECTED LENGTH-INT TYPE! " + intType);
-        }
-        var intInfo = int_type & 0x0F;
-        var intLength = Math.pow(2, intInfo);
-        dataoffset = 2 + intLength;
-        if (intLength < 3) {
-          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
-        } else {
-          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
-        }
-      }
-      if (length < exports.maxObjectSize) {
-        return buffer.slice(offset + dataoffset, offset + dataoffset + length);
-      } else {
-        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
-      }
-    }
-
-    function parsePlistString (isUtf16) {
-      isUtf16 = isUtf16 || 0;
-      var enc = "utf8";
-      var length = objInfo;
-      var stroffset = 1;
-      if (objInfo == 0xF) {
-        var int_type = buffer[offset + 1];
-        var intType = (int_type & 0xF0) / 0x10;
-        if (intType != 0x1) {
-          console.err("UNEXPECTED LENGTH-INT TYPE! " + intType);
-        }
-        var intInfo = int_type & 0x0F;
-        var intLength = Math.pow(2, intInfo);
-        var stroffset = 2 + intLength;
-        if (intLength < 3) {
-          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
-        } else {
-          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
-        }
-      }
-      // length is String length -> to get byte length multiply by 2, as 1 character takes 2 bytes in UTF-16
-      length *= (isUtf16 + 1);
-      if (length < exports.maxObjectSize) {
-        var plistString = new Buffer(buffer.slice(offset + stroffset, offset + stroffset + length));
-        if (isUtf16) {
-          plistString = swapBytes(plistString);
-          enc = "ucs2";
-        }
-        return plistString.toString(enc);
-      } else {
-        throw new Error("To little heap space available! Wanted to read " + length + " bytes, but only " + exports.maxObjectSize + " are available.");
-      }
-    }
-
-    function parseArray() {
-      var length = objInfo;
-      var arrayoffset = 1;
-      if (objInfo == 0xF) {
-        var int_type = buffer[offset + 1];
-        var intType = (int_type & 0xF0) / 0x10;
-        if (intType != 0x1) {
-          console.error("0xa: UNEXPECTED LENGTH-INT TYPE! " + intType);
-        }
-        var intInfo = int_type & 0x0F;
-        var intLength = Math.pow(2, intInfo);
-        arrayoffset = 2 + intLength;
-        if (intLength < 3) {
-          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
-        } else {
-          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
-        }
-      }
-      if (length * objectRefSize > exports.maxObjectSize) {
-        throw new Error("To little heap space available!");
-      }
-      var array = [];
-      for (var i = 0; i < length; i++) {
-        var objRef = readUInt(buffer.slice(offset + arrayoffset + i * objectRefSize, offset + arrayoffset + (i + 1) * objectRefSize));
-        array[i] = parseObject(objRef);
-      }
-      return array;
-    }
-
-    function parseDictionary() {
-      var length = objInfo;
-      var dictoffset = 1;
-      if (objInfo == 0xF) {
-        var int_type = buffer[offset + 1];
-        var intType = (int_type & 0xF0) / 0x10;
-        if (intType != 0x1) {
-          console.error("0xD: UNEXPECTED LENGTH-INT TYPE! " + intType);
-        }
-        var intInfo = int_type & 0x0F;
-        var intLength = Math.pow(2, intInfo);
-        dictoffset = 2 + intLength;
-        if (intLength < 3) {
-          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
-        } else {
-          length = readUInt(buffer.slice(offset + 2, offset + 2 + intLength));
-        }
-      }
-      if (length * 2 * objectRefSize > exports.maxObjectSize) {
-        throw new Error("To little heap space available!");
-      }
-      if (debug) {
-        console.log("Parsing dictionary #" + tableOffset);
-      }
-      var dict = {};
-      for (var i = 0; i < length; i++) {
-        var keyRef = readUInt(buffer.slice(offset + dictoffset + i * objectRefSize, offset + dictoffset + (i + 1) * objectRefSize));
-        var valRef = readUInt(buffer.slice(offset + dictoffset + (length * objectRefSize) + i * objectRefSize, offset + dictoffset + (length * objectRefSize) + (i + 1) * objectRefSize));
-        var key = parseObject(keyRef);
-        var val = parseObject(valRef);
-        if (debug) {
-          console.log("  DICT #" + tableOffset + ": Mapped " + key + " to " + val);
-        }
-        dict[key] = val;
-      }
-      return dict;
-    }
-  }
-
-  return [ parseObject(topObject) ];
-};
-
-function readUInt(buffer, start) {
-  start = start || 0;
-
-  var l = 0;
-  for (var i = start; i < buffer.length; i++) {
-    l <<= 8;
-    l |= buffer[i] & 0xFF;
-  }
-  return l;
-}
-
-// we're just going to toss the high order bits because javascript doesn't have 64-bit ints
-function readUInt64BE(buffer, start) {
-  var data = buffer.slice(start, start + 8);
-  return data.readUInt32BE(4, 8);
-}
-
-function swapBytes(buffer) {
-  var len = buffer.length;
-  for (var i = 0; i < len; i += 2) {
-    var a = buffer[i];
-    buffer[i] = buffer[i+1];
-    buffer[i+1] = a;
-  }
-  return buffer;
-}
diff --git a/node_modules/bplist-parser/package.json b/node_modules/bplist-parser/package.json
deleted file mode 100644
index 8a48455..0000000
--- a/node_modules/bplist-parser/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "_args": [
-    [
-      "bplist-parser@0.1.1",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "bplist-parser@0.1.1",
-  "_id": "bplist-parser@0.1.1",
-  "_inBundle": false,
-  "_integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=",
-  "_location": "/bplist-parser",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "bplist-parser@0.1.1",
-    "name": "bplist-parser",
-    "escapedName": "bplist-parser",
-    "rawSpec": "0.1.1",
-    "saveSpec": null,
-    "fetchSpec": "0.1.1"
-  },
-  "_requiredBy": [
-    "/cordova-common"
-  ],
-  "_resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz",
-  "_spec": "0.1.1",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Joe Ferner",
-    "email": "joe.ferner@nearinfinity.com"
-  },
-  "bugs": {
-    "url": "https://github.com/nearinfinity/node-bplist-parser/issues"
-  },
-  "dependencies": {
-    "big-integer": "^1.6.7"
-  },
-  "description": "Binary plist parser.",
-  "devDependencies": {
-    "nodeunit": "~0.9.1"
-  },
-  "homepage": "https://github.com/nearinfinity/node-bplist-parser#readme",
-  "keywords": [
-    "bplist",
-    "plist",
-    "parser"
-  ],
-  "license": "MIT",
-  "main": "bplistParser.js",
-  "name": "bplist-parser",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/nearinfinity/node-bplist-parser.git"
-  },
-  "scripts": {
-    "test": "./node_modules/nodeunit/bin/nodeunit test"
-  },
-  "version": "0.1.1"
-}
diff --git a/node_modules/bplist-parser/test/airplay.bplist b/node_modules/bplist-parser/test/airplay.bplist
deleted file mode 100644
index 931adea..0000000
--- a/node_modules/bplist-parser/test/airplay.bplist
+++ /dev/null
Binary files differ
diff --git a/node_modules/bplist-parser/test/iTunes-small.bplist b/node_modules/bplist-parser/test/iTunes-small.bplist
deleted file mode 100644
index b7edb14..0000000
--- a/node_modules/bplist-parser/test/iTunes-small.bplist
+++ /dev/null
Binary files differ
diff --git a/node_modules/bplist-parser/test/int64.bplist b/node_modules/bplist-parser/test/int64.bplist
deleted file mode 100644
index 6da9c04..0000000
--- a/node_modules/bplist-parser/test/int64.bplist
+++ /dev/null
Binary files differ
diff --git a/node_modules/bplist-parser/test/int64.xml b/node_modules/bplist-parser/test/int64.xml
deleted file mode 100644
index cc6cb03..0000000
--- a/node_modules/bplist-parser/test/int64.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-  <dict>
-    <key>zero</key>
-    <integer>0</integer>
-    <key>int64item</key>
-    <integer>12345678901234567890</integer>
-  </dict>
-</plist>
diff --git a/node_modules/bplist-parser/test/parseTest.js b/node_modules/bplist-parser/test/parseTest.js
deleted file mode 100644
index 67e7bfa..0000000
--- a/node_modules/bplist-parser/test/parseTest.js
+++ /dev/null
@@ -1,159 +0,0 @@
-'use strict';
-
-// tests are adapted from https://github.com/TooTallNate/node-plist
-
-var path = require('path');
-var nodeunit = require('nodeunit');
-var bplist = require('../');
-
-module.exports = {
-  'iTunes Small': function (test) {
-    var file = path.join(__dirname, "iTunes-small.bplist");
-    var startTime1 = new Date();
-
-    bplist.parseFile(file, function (err, dicts) {
-      if (err) {
-        throw err;
-      }
-
-      var endTime = new Date();
-      console.log('Parsed "' + file + '" in ' + (endTime - startTime1) + 'ms');
-      var dict = dicts[0];
-      test.equal(dict['Application Version'], "9.0.3");
-      test.equal(dict['Library Persistent ID'], "6F81D37F95101437");
-      test.done();
-    });
-  },
-
-  'sample1': function (test) {
-    var file = path.join(__dirname, "sample1.bplist");
-    var startTime = new Date();
-
-    bplist.parseFile(file, function (err, dicts) {
-      if (err) {
-        throw err;
-      }
-
-      var endTime = new Date();
-      console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
-      var dict = dicts[0];
-      test.equal(dict['CFBundleIdentifier'], 'com.apple.dictionary.MySample');
-      test.done();
-    });
-  },
-
-  'sample2': function (test) {
-    var file = path.join(__dirname, "sample2.bplist");
-    var startTime = new Date();
-
-    bplist.parseFile(file, function (err, dicts) {
-      if (err) {
-        throw err;
-      }
-
-      var endTime = new Date();
-      console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
-      var dict = dicts[0];
-      test.equal(dict['PopupMenu'][2]['Key'], "\n        #import <Cocoa/Cocoa.h>\n\n#import <MacRuby/MacRuby.h>\n\nint main(int argc, char *argv[])\n{\n  return macruby_main(\"rb_main.rb\", argc, argv);\n}\n");
-      test.done();
-    });
-  },
-
-  'airplay': function (test) {
-    var file = path.join(__dirname, "airplay.bplist");
-    var startTime = new Date();
-
-    bplist.parseFile(file, function (err, dicts) {
-      if (err) {
-        throw err;
-      }
-
-      var endTime = new Date();
-      console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
-
-      var dict = dicts[0];
-      test.equal(dict['duration'], 5555.0495000000001);
-      test.equal(dict['position'], 4.6269989039999997);
-      test.done();
-    });
-  },
-
-  'utf16': function (test) {
-    var file = path.join(__dirname, "utf16.bplist");
-    var startTime = new Date();
-
-    bplist.parseFile(file, function (err, dicts) {
-      if (err) {
-        throw err;
-      }
-
-      var endTime = new Date();
-      console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
-
-      var dict = dicts[0];
-      test.equal(dict['CFBundleName'], 'sellStuff');
-      test.equal(dict['CFBundleShortVersionString'], '2.6.1');
-      test.equal(dict['NSHumanReadableCopyright'], '©2008-2012, sellStuff, Inc.');
-      test.done();
-    });
-  },
-
-  'utf16chinese': function (test) {
-    var file = path.join(__dirname, "utf16_chinese.plist");
-    var startTime = new Date();
-
-    bplist.parseFile(file, function (err, dicts) {
-      if (err) {
-        throw err;
-      }
-
-      var endTime = new Date();
-      console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
-
-      var dict = dicts[0];
-      test.equal(dict['CFBundleName'], '天翼阅读');
-      test.equal(dict['CFBundleDisplayName'], '天翼阅读');
-      test.done();
-    });
-  },
-
-
-
-  'uid': function (test) {
-    var file = path.join(__dirname, "uid.bplist");
-    var startTime = new Date();
-
-    bplist.parseFile(file, function (err, dicts) {
-      if (err) {
-        throw err;
-      }
-
-      var endTime = new Date();
-      console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
-
-      var dict = dicts[0];
-      test.deepEqual(dict['$objects'][1]['NS.keys'], [{UID:2}, {UID:3}, {UID:4}]);
-      test.deepEqual(dict['$objects'][1]['NS.objects'], [{UID: 5}, {UID:6}, {UID:7}]);
-      test.deepEqual(dict['$top']['root'], {UID:1});
-      test.done();
-    });
-  },
-  
-  'int64': function (test) {
-    var file = path.join(__dirname, "int64.bplist");
-    var startTime = new Date();
-
-    bplist.parseFile(file, function (err, dicts) {
-      if (err) {
-        throw err;
-      }
-
-      var endTime = new Date();
-      console.log('Parsed "' + file + '" in ' + (endTime - startTime) + 'ms');
-      var dict = dicts[0];
-      test.equal(dict['zero'], '0');
-      test.equal(dict['int64item'], '12345678901234567890');
-      test.done();
-    });
-  }
-};
diff --git a/node_modules/bplist-parser/test/sample1.bplist b/node_modules/bplist-parser/test/sample1.bplist
deleted file mode 100644
index 5b808ff..0000000
--- a/node_modules/bplist-parser/test/sample1.bplist
+++ /dev/null
Binary files differ
diff --git a/node_modules/bplist-parser/test/sample2.bplist b/node_modules/bplist-parser/test/sample2.bplist
deleted file mode 100644
index fc42979..0000000
--- a/node_modules/bplist-parser/test/sample2.bplist
+++ /dev/null
Binary files differ
diff --git a/node_modules/bplist-parser/test/uid.bplist b/node_modules/bplist-parser/test/uid.bplist
deleted file mode 100644
index 59f341e..0000000
--- a/node_modules/bplist-parser/test/uid.bplist
+++ /dev/null
Binary files differ
diff --git a/node_modules/bplist-parser/test/utf16.bplist b/node_modules/bplist-parser/test/utf16.bplist
deleted file mode 100644
index ba4bcfa..0000000
--- a/node_modules/bplist-parser/test/utf16.bplist
+++ /dev/null
Binary files differ
diff --git a/node_modules/bplist-parser/test/utf16_chinese.plist b/node_modules/bplist-parser/test/utf16_chinese.plist
deleted file mode 100755
index ba1e2d7..0000000
--- a/node_modules/bplist-parser/test/utf16_chinese.plist
+++ /dev/null
Binary files differ
diff --git a/node_modules/brace-expansion/README.md b/node_modules/brace-expansion/README.md
deleted file mode 100644
index 1793929..0000000
--- a/node_modules/brace-expansion/README.md
+++ /dev/null
@@ -1,122 +0,0 @@
-# brace-expansion
-
-[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), 
-as known from sh/bash, in JavaScript.
-
-[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion)
-[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion)
-
-[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion)
-
-## Example
-
-```js
-var expand = require('brace-expansion');
-
-expand('file-{a,b,c}.jpg')
-// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
-
-expand('-v{,,}')
-// => ['-v', '-v', '-v']
-
-expand('file{0..2}.jpg')
-// => ['file0.jpg', 'file1.jpg', 'file2.jpg']
-
-expand('file-{a..c}.jpg')
-// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
-
-expand('file{2..0}.jpg')
-// => ['file2.jpg', 'file1.jpg', 'file0.jpg']
-
-expand('file{0..4..2}.jpg')
-// => ['file0.jpg', 'file2.jpg', 'file4.jpg']
-
-expand('file-{a..e..2}.jpg')
-// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']
-
-expand('file{00..10..5}.jpg')
-// => ['file00.jpg', 'file05.jpg', 'file10.jpg']
-
-expand('{{A..C},{a..c}}')
-// => ['A', 'B', 'C', 'a', 'b', 'c']
-
-expand('ppp{,config,oe{,conf}}')
-// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']
-```
-
-## API
-
-```js
-var expand = require('brace-expansion');
-```
-
-### var expanded = expand(str)
-
-Return an array of all possible and valid expansions of `str`. If none are
-found, `[str]` is returned.
-
-Valid expansions are:
-
-```js
-/^(.*,)+(.+)?$/
-// {a,b,...}
-```
-
-A comma seperated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.
-
-```js
-/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
-// {x..y[..incr]}
-```
-
-A numeric sequence from `x` to `y` inclusive, with optional increment.
-If `x` or `y` start with a leading `0`, all the numbers will be padded
-to have equal length. Negative numbers and backwards iteration work too.
-
-```js
-/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
-// {x..y[..incr]}
-```
-
-An alphabetic sequence from `x` to `y` inclusive, with optional increment.
-`x` and `y` must be exactly one character, and if given, `incr` must be a
-number.
-
-For compatibility reasons, the string `${` is not eligible for brace expansion.
-
-## Installation
-
-With [npm](https://npmjs.org) do:
-
-```bash
-npm install brace-expansion
-```
-
-## Contributors
-
-- [Julian Gruber](https://github.com/juliangruber)
-- [Isaac Z. Schlueter](https://github.com/isaacs)
-
-## License
-
-(MIT)
-
-Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/node_modules/brace-expansion/index.js b/node_modules/brace-expansion/index.js
deleted file mode 100644
index 955f27c..0000000
--- a/node_modules/brace-expansion/index.js
+++ /dev/null
@@ -1,201 +0,0 @@
-var concatMap = require('concat-map');
-var balanced = require('balanced-match');
-
-module.exports = expandTop;
-
-var escSlash = '\0SLASH'+Math.random()+'\0';
-var escOpen = '\0OPEN'+Math.random()+'\0';
-var escClose = '\0CLOSE'+Math.random()+'\0';
-var escComma = '\0COMMA'+Math.random()+'\0';
-var escPeriod = '\0PERIOD'+Math.random()+'\0';
-
-function numeric(str) {
-  return parseInt(str, 10) == str
-    ? parseInt(str, 10)
-    : str.charCodeAt(0);
-}
-
-function escapeBraces(str) {
-  return str.split('\\\\').join(escSlash)
-            .split('\\{').join(escOpen)
-            .split('\\}').join(escClose)
-            .split('\\,').join(escComma)
-            .split('\\.').join(escPeriod);
-}
-
-function unescapeBraces(str) {
-  return str.split(escSlash).join('\\')
-            .split(escOpen).join('{')
-            .split(escClose).join('}')
-            .split(escComma).join(',')
-            .split(escPeriod).join('.');
-}
-
-
-// Basically just str.split(","), but handling cases
-// where we have nested braced sections, which should be
-// treated as individual members, like {a,{b,c},d}
-function parseCommaParts(str) {
-  if (!str)
-    return [''];
-
-  var parts = [];
-  var m = balanced('{', '}', str);
-
-  if (!m)
-    return str.split(',');
-
-  var pre = m.pre;
-  var body = m.body;
-  var post = m.post;
-  var p = pre.split(',');
-
-  p[p.length-1] += '{' + body + '}';
-  var postParts = parseCommaParts(post);
-  if (post.length) {
-    p[p.length-1] += postParts.shift();
-    p.push.apply(p, postParts);
-  }
-
-  parts.push.apply(parts, p);
-
-  return parts;
-}
-
-function expandTop(str) {
-  if (!str)
-    return [];
-
-  // I don't know why Bash 4.3 does this, but it does.
-  // Anything starting with {} will have the first two bytes preserved
-  // but *only* at the top level, so {},a}b will not expand to anything,
-  // but a{},b}c will be expanded to [a}c,abc].
-  // One could argue that this is a bug in Bash, but since the goal of
-  // this module is to match Bash's rules, we escape a leading {}
-  if (str.substr(0, 2) === '{}') {
-    str = '\\{\\}' + str.substr(2);
-  }
-
-  return expand(escapeBraces(str), true).map(unescapeBraces);
-}
-
-function identity(e) {
-  return e;
-}
-
-function embrace(str) {
-  return '{' + str + '}';
-}
-function isPadded(el) {
-  return /^-?0\d/.test(el);
-}
-
-function lte(i, y) {
-  return i <= y;
-}
-function gte(i, y) {
-  return i >= y;
-}
-
-function expand(str, isTop) {
-  var expansions = [];
-
-  var m = balanced('{', '}', str);
-  if (!m || /\$$/.test(m.pre)) return [str];
-
-  var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
-  var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
-  var isSequence = isNumericSequence || isAlphaSequence;
-  var isOptions = /^(.*,)+(.+)?$/.test(m.body);
-  if (!isSequence && !isOptions) {
-    // {a},b}
-    if (m.post.match(/,.*\}/)) {
-      str = m.pre + '{' + m.body + escClose + m.post;
-      return expand(str);
-    }
-    return [str];
-  }
-
-  var n;
-  if (isSequence) {
-    n = m.body.split(/\.\./);
-  } else {
-    n = parseCommaParts(m.body);
-    if (n.length === 1) {
-      // x{{a,b}}y ==> x{a}y x{b}y
-      n = expand(n[0], false).map(embrace);
-      if (n.length === 1) {
-        var post = m.post.length
-          ? expand(m.post, false)
-          : [''];
-        return post.map(function(p) {
-          return m.pre + n[0] + p;
-        });
-      }
-    }
-  }
-
-  // at this point, n is the parts, and we know it's not a comma set
-  // with a single entry.
-
-  // no need to expand pre, since it is guaranteed to be free of brace-sets
-  var pre = m.pre;
-  var post = m.post.length
-    ? expand(m.post, false)
-    : [''];
-
-  var N;
-
-  if (isSequence) {
-    var x = numeric(n[0]);
-    var y = numeric(n[1]);
-    var width = Math.max(n[0].length, n[1].length)
-    var incr = n.length == 3
-      ? Math.abs(numeric(n[2]))
-      : 1;
-    var test = lte;
-    var reverse = y < x;
-    if (reverse) {
-      incr *= -1;
-      test = gte;
-    }
-    var pad = n.some(isPadded);
-
-    N = [];
-
-    for (var i = x; test(i, y); i += incr) {
-      var c;
-      if (isAlphaSequence) {
-        c = String.fromCharCode(i);
-        if (c === '\\')
-          c = '';
-      } else {
-        c = String(i);
-        if (pad) {
-          var need = width - c.length;
-          if (need > 0) {
-            var z = new Array(need + 1).join('0');
-            if (i < 0)
-              c = '-' + z + c.slice(1);
-            else
-              c = z + c;
-          }
-        }
-      }
-      N.push(c);
-    }
-  } else {
-    N = concatMap(n, function(el) { return expand(el, false) });
-  }
-
-  for (var j = 0; j < N.length; j++) {
-    for (var k = 0; k < post.length; k++) {
-      var expansion = pre + N[j] + post[k];
-      if (!isTop || isSequence || expansion)
-        expansions.push(expansion);
-    }
-  }
-
-  return expansions;
-}
-
diff --git a/node_modules/brace-expansion/package.json b/node_modules/brace-expansion/package.json
deleted file mode 100644
index a680fc9..0000000
--- a/node_modules/brace-expansion/package.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "_args": [
-    [
-      "brace-expansion@1.1.6",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "brace-expansion@1.1.6",
-  "_id": "brace-expansion@1.1.6",
-  "_inBundle": false,
-  "_integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=",
-  "_location": "/brace-expansion",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "brace-expansion@1.1.6",
-    "name": "brace-expansion",
-    "escapedName": "brace-expansion",
-    "rawSpec": "1.1.6",
-    "saveSpec": null,
-    "fetchSpec": "1.1.6"
-  },
-  "_requiredBy": [
-    "/minimatch"
-  ],
-  "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz",
-  "_spec": "1.1.6",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Julian Gruber",
-    "email": "mail@juliangruber.com",
-    "url": "http://juliangruber.com"
-  },
-  "bugs": {
-    "url": "https://github.com/juliangruber/brace-expansion/issues"
-  },
-  "dependencies": {
-    "balanced-match": "^0.4.1",
-    "concat-map": "0.0.1"
-  },
-  "description": "Brace expansion as known from sh/bash",
-  "devDependencies": {
-    "tape": "^4.6.0"
-  },
-  "homepage": "https://github.com/juliangruber/brace-expansion",
-  "keywords": [],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "brace-expansion",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/juliangruber/brace-expansion.git"
-  },
-  "scripts": {
-    "gentest": "bash test/generate.sh",
-    "test": "tape test/*.js"
-  },
-  "testling": {
-    "files": "test/*.js",
-    "browsers": [
-      "ie/8..latest",
-      "firefox/20..latest",
-      "firefox/nightly",
-      "chrome/25..latest",
-      "chrome/canary",
-      "opera/12..latest",
-      "opera/next",
-      "safari/5.1..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "android-browser/4.2..latest"
-    ]
-  },
-  "version": "1.1.6"
-}
diff --git a/node_modules/concat-map/.travis.yml b/node_modules/concat-map/.travis.yml
deleted file mode 100644
index f1d0f13..0000000
--- a/node_modules/concat-map/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - 0.4
-  - 0.6
diff --git a/node_modules/concat-map/LICENSE b/node_modules/concat-map/LICENSE
deleted file mode 100644
index ee27ba4..0000000
--- a/node_modules/concat-map/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-This software is released under the MIT license:
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/concat-map/README.markdown b/node_modules/concat-map/README.markdown
deleted file mode 100644
index 408f70a..0000000
--- a/node_modules/concat-map/README.markdown
+++ /dev/null
@@ -1,62 +0,0 @@
-concat-map
-==========
-
-Concatenative mapdashery.
-
-[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map)
-
-[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map)
-
-example
-=======
-
-``` js
-var concatMap = require('concat-map');
-var xs = [ 1, 2, 3, 4, 5, 6 ];
-var ys = concatMap(xs, function (x) {
-    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
-});
-console.dir(ys);
-```
-
-***
-
-```
-[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]
-```
-
-methods
-=======
-
-``` js
-var concatMap = require('concat-map')
-```
-
-concatMap(xs, fn)
------------------
-
-Return an array of concatenated elements by calling `fn(x, i)` for each element
-`x` and each index `i` in the array `xs`.
-
-When `fn(x, i)` returns an array, its result will be concatenated with the
-result array. If `fn(x, i)` returns anything else, that value will be pushed
-onto the end of the result array.
-
-install
-=======
-
-With [npm](http://npmjs.org) do:
-
-```
-npm install concat-map
-```
-
-license
-=======
-
-MIT
-
-notes
-=====
-
-This module was written while sitting high above the ground in a tree.
diff --git a/node_modules/concat-map/example/map.js b/node_modules/concat-map/example/map.js
deleted file mode 100644
index 3365621..0000000
--- a/node_modules/concat-map/example/map.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var concatMap = require('../');
-var xs = [ 1, 2, 3, 4, 5, 6 ];
-var ys = concatMap(xs, function (x) {
-    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
-});
-console.dir(ys);
diff --git a/node_modules/concat-map/index.js b/node_modules/concat-map/index.js
deleted file mode 100644
index b29a781..0000000
--- a/node_modules/concat-map/index.js
+++ /dev/null
@@ -1,13 +0,0 @@
-module.exports = function (xs, fn) {
-    var res = [];
-    for (var i = 0; i < xs.length; i++) {
-        var x = fn(xs[i], i);
-        if (isArray(x)) res.push.apply(res, x);
-        else res.push(x);
-    }
-    return res;
-};
-
-var isArray = Array.isArray || function (xs) {
-    return Object.prototype.toString.call(xs) === '[object Array]';
-};
diff --git a/node_modules/concat-map/package.json b/node_modules/concat-map/package.json
deleted file mode 100644
index 0d21359..0000000
--- a/node_modules/concat-map/package.json
+++ /dev/null
@@ -1,96 +0,0 @@
-{
-  "_args": [
-    [
-      "concat-map@0.0.1",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "concat-map@0.0.1",
-  "_id": "concat-map@0.0.1",
-  "_inBundle": false,
-  "_integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-  "_location": "/concat-map",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "concat-map@0.0.1",
-    "name": "concat-map",
-    "escapedName": "concat-map",
-    "rawSpec": "0.0.1",
-    "saveSpec": null,
-    "fetchSpec": "0.0.1"
-  },
-  "_requiredBy": [
-    "/brace-expansion",
-    "/eslint-plugin-node/brace-expansion",
-    "/eslint/brace-expansion",
-    "/globby/brace-expansion",
-    "/jasmine/brace-expansion",
-    "/rimraf/brace-expansion"
-  ],
-  "_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-  "_spec": "0.0.1",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "James Halliday",
-    "email": "mail@substack.net",
-    "url": "http://substack.net"
-  },
-  "bugs": {
-    "url": "https://github.com/substack/node-concat-map/issues"
-  },
-  "description": "concatenative mapdashery",
-  "devDependencies": {
-    "tape": "~2.4.0"
-  },
-  "directories": {
-    "example": "example",
-    "test": "test"
-  },
-  "homepage": "https://github.com/substack/node-concat-map#readme",
-  "keywords": [
-    "concat",
-    "concatMap",
-    "map",
-    "functional",
-    "higher-order"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "concat-map",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/substack/node-concat-map.git"
-  },
-  "scripts": {
-    "test": "tape test/*.js"
-  },
-  "testling": {
-    "files": "test/*.js",
-    "browsers": {
-      "ie": [
-        6,
-        7,
-        8,
-        9
-      ],
-      "ff": [
-        3.5,
-        10,
-        15
-      ],
-      "chrome": [
-        10,
-        22
-      ],
-      "safari": [
-        5.1
-      ],
-      "opera": [
-        12
-      ]
-    }
-  },
-  "version": "0.0.1"
-}
diff --git a/node_modules/concat-map/test/map.js b/node_modules/concat-map/test/map.js
deleted file mode 100644
index fdbd702..0000000
--- a/node_modules/concat-map/test/map.js
+++ /dev/null
@@ -1,39 +0,0 @@
-var concatMap = require('../');
-var test = require('tape');
-
-test('empty or not', function (t) {
-    var xs = [ 1, 2, 3, 4, 5, 6 ];
-    var ixes = [];
-    var ys = concatMap(xs, function (x, ix) {
-        ixes.push(ix);
-        return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
-    });
-    t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]);
-    t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]);
-    t.end();
-});
-
-test('always something', function (t) {
-    var xs = [ 'a', 'b', 'c', 'd' ];
-    var ys = concatMap(xs, function (x) {
-        return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ];
-    });
-    t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
-    t.end();
-});
-
-test('scalars', function (t) {
-    var xs = [ 'a', 'b', 'c', 'd' ];
-    var ys = concatMap(xs, function (x) {
-        return x === 'b' ? [ 'B', 'B', 'B' ] : x;
-    });
-    t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
-    t.end();
-});
-
-test('undefs', function (t) {
-    var xs = [ 'a', 'b', 'c', 'd' ];
-    var ys = concatMap(xs, function () {});
-    t.same(ys, [ undefined, undefined, undefined, undefined ]);
-    t.end();
-});
diff --git a/node_modules/cordova-common/.eslintignore b/node_modules/cordova-common/.eslintignore
deleted file mode 100644
index 161d0c6..0000000
--- a/node_modules/cordova-common/.eslintignore
+++ /dev/null
@@ -1 +0,0 @@
-spec/fixtures/*
\ No newline at end of file
diff --git a/node_modules/cordova-common/.eslintrc.yml b/node_modules/cordova-common/.eslintrc.yml
deleted file mode 100644
index 7701c82..0000000
--- a/node_modules/cordova-common/.eslintrc.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-root: true
-extends: semistandard
-rules:
-  indent:
-    - error
-    - 4
-  camelcase: off
-  padded-blocks: off
-  operator-linebreak: off
-  no-throw-literal: off
-  
\ No newline at end of file
diff --git a/node_modules/cordova-common/.jscs.json b/node_modules/cordova-common/.jscs.json
deleted file mode 100644
index 5cc7e26..0000000
--- a/node_modules/cordova-common/.jscs.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-    "disallowMixedSpacesAndTabs": true,
-    "disallowTrailingWhitespace": true,
-    "validateLineBreaks": "LF",
-    "validateIndentation": 4,
-    "requireLineFeedAtFileEnd": true,
-
-    "disallowSpaceAfterPrefixUnaryOperators": true,
-    "disallowSpaceBeforePostfixUnaryOperators": true,
-    "requireSpaceAfterLineComment": true,
-    "requireCapitalizedConstructors": true,
-
-    "disallowSpacesInNamedFunctionExpression": {
-        "beforeOpeningRoundBrace": true
-    },
-
-    "requireSpaceAfterKeywords": [
-      "if",
-      "else",
-      "for",
-      "while",
-      "do"
-    ]
-}
diff --git a/node_modules/cordova-common/.ratignore b/node_modules/cordova-common/.ratignore
deleted file mode 100644
index f107416..0000000
--- a/node_modules/cordova-common/.ratignore
+++ /dev/null
@@ -1,4 +0,0 @@
-fixtures
-coverage
-jasmine.json
-appveyor.yml
diff --git a/node_modules/cordova-common/.travis.yml b/node_modules/cordova-common/.travis.yml
deleted file mode 100644
index 4592c3e..0000000
--- a/node_modules/cordova-common/.travis.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-language: node_js
-sudo: false
-git:
-  depth: 10
-node_js:
-  - "4"
-  - "6"
-  - "8"
-install:
-  - npm install
-  - npm install -g codecov
-script:
-  - npm test
-  - npm run cover
-after_script:
-  - codecov
diff --git a/node_modules/cordova-common/README.md b/node_modules/cordova-common/README.md
deleted file mode 100644
index 5659c57..0000000
--- a/node_modules/cordova-common/README.md
+++ /dev/null
@@ -1,157 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#  KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
--->
-
-[![Build status](https://ci.appveyor.com/api/projects/status/wxkmo0jalsr8gane?svg=true)](https://ci.appveyor.com/project/ApacheSoftwareFoundation/cordova-common/branch/master)
-[![Build Status](https://travis-ci.org/apache/cordova-common.svg?branch=master)](https://travis-ci.org/apache/cordova-common)
-[![NPM](https://nodei.co/npm/cordova-common.png)](https://nodei.co/npm/cordova-common/)
-
-# cordova-common
-Expoeses shared functionality used by [cordova-lib](https://github.com/apache/cordova-lib/) and Cordova platforms.
-## Exposed APIs
-
-### `events`
-  
-Represents special instance of NodeJS EventEmitter which is intended to be used to post events to cordova-lib and cordova-cli
-
-Usage:
-```js
-var events = require('cordova-common').events;
-events.emit('warn', 'Some warning message')
-```
-
-There are the following events supported by cordova-cli: `verbose`, `log`, `info`, `warn`, `error`.
-
-### `CordovaError`
-
-An error class used by Cordova to throw cordova-specific errors. The CordovaError class is inherited from Error, so CordovaError instances is also valid Error instances (`instanceof` check succeeds).
-
-Usage:
-
-```js
-var CordovaError = require('cordova-common').CordovaError;
-throw new CordovaError('Some error message', SOME_ERR_CODE);
-```
-
-See [CordovaError](src/CordovaError/CordovaError.js) for supported error codes.
-
-### `ConfigParser`
-
-Exposes functionality to deal with cordova project `config.xml` files. For ConfigParser API reference check [ConfigParser Readme](src/ConfigParser/README.md).
-
-Usage:
-```js
-var ConfigParser = require('cordova-common').ConfigParser;
-var appConfig = new ConfigParser('path/to/cordova-app/config.xml');
-console.log(appconfig.name() + ':' + appConfig.version());
-```
-
-### `PluginInfoProvider` and `PluginInfo`
-
-`PluginInfo` is a wrapper for cordova plugins' `plugin.xml` files. This class may be instantiated directly or via `PluginInfoProvider`. The difference is that `PluginInfoProvider` caches `PluginInfo` instances based on plugin source directory.
-
-Usage:
-```js
-var PluginInfo: require('cordova-common').PluginInfo;
-var PluginInfoProvider: require('cordova-common').PluginInfoProvider;
-
-// The following instances are equal
-var plugin1 = new PluginInfo('path/to/plugin_directory');
-var plugin2 = new PluginInfoProvider().get('path/to/plugin_directory');
-
-console.log('The plugin ' + plugin1.id + ' has version ' + plugin1.version)
-```
-
-### `ActionStack`
-
-Utility module for dealing with sequential tasks. Provides a set of tasks that are needed to be done and reverts all tasks that are already completed if one of those tasks fail to complete. Used internally by cordova-lib and platform's plugin installation routines.
-
-Usage:
-```js
-var ActionStack = require('cordova-common').ActionStack;
-var stack = new ActionStack()
-
-var action1 = stack.createAction(task1, [<task parameters>], task1_reverter, [<reverter_parameters>]);
-var action2 = stack.createAction(task2, [<task parameters>], task2_reverter, [<reverter_parameters>]);
-
-stack.push(action1);
-stack.push(action2);
-
-stack.process()
-.then(function() {
-    // all actions succeded
-})
-.catch(function(error){
-    // One of actions failed with error
-})
-```
-
-### `superspawn`
-
-Module for spawning child processes with some advanced logic.
-
-Usage:
-```js
-var superspawn = require('cordova-common').superspawn;
-superspawn.spawn('adb', ['devices'])
-.progress(function(data){
-    if (data.stderr)
-        console.error('"adb devices" raised an error: ' + data.stderr);
-})
-.then(function(devices){
-    // Do something...
-})
-```
-
-### `xmlHelpers`
-
-A set of utility methods for dealing with xml files.
-
-Usage:
-```js
-var xml = require('cordova-common').xmlHelpers;
-
-var xmlDoc1 = xml.parseElementtreeSync('some/xml/file');
-var xmlDoc2 = xml.parseElementtreeSync('another/xml/file');
-
-xml.mergeXml(doc1, doc2); // doc2 now contains all the nodes from doc1
-```
-
-### Other APIs
-
-The APIs listed below are also exposed but are intended to be only used internally by cordova plugin installation routines.
-
-```
-PlatformJson
-ConfigChanges
-ConfigKeeper
-ConfigFile
-mungeUtil
-```
-
-## Setup
-* Clone this repository onto your local machine
-    `git clone https://git-wip-us.apache.org/repos/asf/cordova-lib.git`
-* In terminal, navigate to the inner cordova-common directory
-    `cd cordova-lib/cordova-common`
-* Install dependencies and npm-link
-    `npm install && npm link`
-* Navigate to cordova-lib directory and link cordova-common
-    `cd ../cordova-lib && npm link cordova-common && npm install`
diff --git a/node_modules/cordova-common/RELEASENOTES.md b/node_modules/cordova-common/RELEASENOTES.md
deleted file mode 100644
index 5dda362..0000000
--- a/node_modules/cordova-common/RELEASENOTES.md
+++ /dev/null
@@ -1,130 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#  KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
--->
-# Cordova-common Release Notes
-
-### 2.2.1 (Dec 14, 2017)
-* [CB-13674](https://issues.apache.org/jira/browse/CB-13674): updated dependencies
-
-### 2.2.0 (Nov 22, 2017)
-* [CB-13471](https://issues.apache.org/jira/browse/CB-13471) File Provider fix belongs in cordova-common 
-* [CB-11244](https://issues.apache.org/jira/browse/CB-11244) Spot fix for upcoming `cordova-android@7` changes. https://github.com/apache/cordova-android/pull/389
-
-### 2.1.1 (Oct 04, 2017)
-* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added `getFrameworks` to unit tests
-* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added variable replacing to framework tag
-
-### 2.1.0 (August 30, 2017)
-* [CB-13145](https://issues.apache.org/jira/browse/CB-13145) added variable replacing to `framework` tag
-* [CB-13211](https://issues.apache.org/jira/browse/CB-13211) Add `allows-arbitrary-loads-for-media` attribute parsing for `getAccesses`
-* [CB-11968](https://issues.apache.org/jira/browse/CB-11968) Added support for `<config-file>` in `config.xml`
-* [CB-12895](https://issues.apache.org/jira/browse/CB-12895) set up `eslint` and removed `jshint`
-* [CB-12785](https://issues.apache.org/jira/browse/CB-12785) added `.gitignore`, `travis`, and `appveyor` support
-* [CB-12250](https://issues.apache.org/jira/browse/CB-12250) & [CB-12409](https://issues.apache.org/jira/browse/CB-12409) *iOS*: Fix bug with escaping properties from `plist` file
-* [CB-12762](https://issues.apache.org/jira/browse/CB-12762) updated `common`, `fetch`, and `serve` `pkgJson` to point `pkgJson` repo items to github mirrors
-* [CB-12766](https://issues.apache.org/jira/browse/CB-12766) Consistently write `JSON` with 2 spaces indentation
-
-### 2.0.3 (May 02, 2017)
-* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Add option to get `resource-file` from `root`
-* [CB-11908](https://issues.apache.org/jira/browse/CB-11908) Add tests for `edit-config` in `config.xml`
-* [CB-12665](https://issues.apache.org/jira/browse/CB-12665) removed `enginestrict` since it is deprecated
-
-### 2.0.2 (Apr 14, 2017)
-* [CB-11233](https://issues.apache.org/jira/browse/CB-11233) - Support installing frameworks into 'Embedded Binaries' section of the Xcode project
-* [CB-10438](https://issues.apache.org/jira/browse/CB-10438) - Install correct dependency version. Removed shell.remove, added pkg.json to dependency tests 1-3, and updated install.js (.replace) to fix tests in uninstall.spec.js and update to workw with jasmine 2.0
-* [CB-11120](https://issues.apache.org/jira/browse/CB-11120) - Allow short/display name in config.xml
-* [CB-11346](https://issues.apache.org/jira/browse/CB-11346) - Remove known platforms check
-* [CB-11977](https://issues.apache.org/jira/browse/CB-11977) - updated engines and enginescript for common, fetch, and serve
-
-### 2.0.1 (Mar 09, 2017)
-* [CB-12557](https://issues.apache.org/jira/browse/CB-12557) add both stdout and stderr properties to the error object passed to superspawn reject handler.
-
-### 2.0.0 (Jan 17, 2017)
-* [CB-8978](https://issues.apache.org/jira/browse/CB-8978) Add `resource-file` parsing to `config.xml`
-* [CB-12018](https://issues.apache.org/jira/browse/CB-12018): updated `jshint` and updated tests to work with `jasmine@2` instead of `jasmine-node`
-* [CB-12163](https://issues.apache.org/jira/browse/CB-12163) Add reference attrib to `resource-file` for **Windows**
-* Move windows-specific logic to `cordova-windows`
-* [CB-12189](https://issues.apache.org/jira/browse/CB-12189) Add implementation attribute to framework
-
-### 1.5.1 (Oct 12, 2016)
-* [CB-12002](https://issues.apache.org/jira/browse/CB-12002) Add `getAllowIntents()` to `ConfigParser`
-* [CB-11998](https://issues.apache.org/jira/browse/CB-11998) `cordova platform add` error with `cordova-common@1.5.0`
-
-### 1.5.0 (Oct 06, 2016)
-* [CB-11776](https://issues.apache.org/jira/browse/CB-11776) Add test case for different `edit-config` targets
-* [CB-11908](https://issues.apache.org/jira/browse/CB-11908) Add `edit-config` to `config.xml`
-* [CB-11936](https://issues.apache.org/jira/browse/CB-11936) Support four new **App Transport Security (ATS)** keys
-* update `config.xml` location if it is a **Android Studio** project.
-* use `array` methods and `object.keys` for iterating. avoiding `for-in` loops
-* [CB-11517](https://issues.apache.org/jira/browse/CB-11517) Allow `.folder` matches
-* [CB-11776](https://issues.apache.org/jira/browse/CB-11776) check `edit-config` target exists
-
-### 1.4.1 (Aug 09, 2016)
-* Add general purpose `ConfigParser.getAttribute` API
-* [CB-11653](https://issues.apache.org/jira/browse/CB-11653) moved `findProjectRoot` from `cordova-lib` to `cordova-common`
-* [CB-11636](https://issues.apache.org/jira/browse/CB-11636) Handle attributes with quotes correctly
-* [CB-11645](https://issues.apache.org/jira/browse/CB-11645) added check to see if `getEditConfig` exists before trying to use it
-* [CB-9825](https://issues.apache.org/jira/browse/CB-9825) framework tag spec parsing
-
-### 1.4.0 (Jul 12, 2016)
-* [CB-11023](https://issues.apache.org/jira/browse/CB-11023) Add edit-config functionality
-
-### 1.3.0 (May 12, 2016)
-* [CB-11259](https://issues.apache.org/jira/browse/CB-11259): Improving prepare and build logging
-* [CB-11194](https://issues.apache.org/jira/browse/CB-11194) Improve cordova load time
-* [CB-1117](https://issues.apache.org/jira/browse/CB-1117) Add `FileUpdater` module to `cordova-common`.
-* [CB-11131](https://issues.apache.org/jira/browse/CB-11131) Fix `TypeError: message.toUpperCase` is not a function in `CordovaLogger`
-
-### 1.2.0 (Apr 18, 2016)
-* [CB-11022](https://issues.apache.org/jira/browse/CB-11022) Save modulesMetadata to both www and platform_www when necessary
-* [CB-10833](https://issues.apache.org/jira/browse/CB-10833) Deduplicate common logic for plugin installation/uninstallation
-* [CB-10822](https://issues.apache.org/jira/browse/CB-10822) Manage plugins/modules metadata using PlatformJson
-* [CB-10940](https://issues.apache.org/jira/browse/CB-10940) Can't add Android platform from path
-* [CB-10965](https://issues.apache.org/jira/browse/CB-10965) xml helper allows multiple instances to be merge in config.xml
-
-### 1.1.1 (Mar 18, 2016)
-* [CB-10694](https://issues.apache.org/jira/browse/CB-10694) Update test to reflect merging of [CB-9264](https://issues.apache.org/jira/browse/CB-9264) fix
-* [CB-10694](https://issues.apache.org/jira/browse/CB-10694) Platform-specific configuration preferences don't override global settings
-* [CB-9264](https://issues.apache.org/jira/browse/CB-9264) Duplicate entries in `config.xml`
-* [CB-10791](https://issues.apache.org/jira/browse/CB-10791) Add `adjustLoggerLevel` to `cordova-common.CordovaLogger`
-* [CB-10662](https://issues.apache.org/jira/browse/CB-10662) Add tests for `ConfigParser.getStaticResources`
-* [CB-10622](https://issues.apache.org/jira/browse/CB-10622) fix target attribute being ignored for images in `config.xml`.
-* [CB-10583](https://issues.apache.org/jira/browse/CB-10583) Protect plugin preferences from adding extra Array properties.
-
-### 1.1.0 (Feb 16, 2016)
-* [CB-10482](https://issues.apache.org/jira/browse/CB-10482) Remove references to windows8 from cordova-lib/cli
-* [CB-10430](https://issues.apache.org/jira/browse/CB-10430) Adds forwardEvents method to easily connect two EventEmitters
-* [CB-10176](https://issues.apache.org/jira/browse/CB-10176) Adds CordovaLogger class, based on logger module from cordova-cli
-* [CB-10052](https://issues.apache.org/jira/browse/CB-10052) Expose child process' io streams via promise progress notification
-* [CB-10497](https://issues.apache.org/jira/browse/CB-10497) Prefer .bat over .cmd on windows platform
-* [CB-9984](https://issues.apache.org/jira/browse/CB-9984) Bumps plist version and fixes failing cordova-common test
-
-### 1.0.0 (Oct 29, 2015)
-
-* [CB-9890](https://issues.apache.org/jira/browse/CB-9890) Documents cordova-common
-* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Correct cordova-lib -> cordova-common in README
-* Pick ConfigParser changes from apache@0c3614e
-* [CB-9743](https://issues.apache.org/jira/browse/CB-9743) Removes system frameworks handling from ConfigChanges
-* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Cleans out code which has been moved to `cordova-common`
-* Pick ConfigParser changes from apache@ddb027b
-* Picking CordovaError changes from apache@a3b1fca
-* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Adds tests and fixtures based on existing cordova-lib ones
-* [CB-9598](https://issues.apache.org/jira/browse/CB-9598) Initial implementation for cordova-common
-
diff --git a/node_modules/cordova-common/appveyor.yml b/node_modules/cordova-common/appveyor.yml
deleted file mode 100644
index ffe5194..0000000
--- a/node_modules/cordova-common/appveyor.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-# appveyor file
-# http://www.appveyor.com/docs/appveyor-yml
-
-environment:
-  matrix:
-  - nodejs_version: "4"
-  - nodejs_version: "6"
-  - nodejs_version: "8"
-  
-install:
-  - ps: Install-Product node $env:nodejs_version
-  - npm install
-
-build: off
-
-test_script:
-  - node --version
-  - npm --version
-  - npm test
diff --git a/node_modules/cordova-common/cordova-common.js b/node_modules/cordova-common/cordova-common.js
deleted file mode 100644
index 801d510..0000000
--- a/node_modules/cordova-common/cordova-common.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*/
-
-var addProperty = require('./src/util/addProperty');
-
-module.exports = { };
-
-addProperty(module, 'events', './src/events');
-addProperty(module, 'superspawn', './src/superspawn');
-
-addProperty(module, 'ActionStack', './src/ActionStack');
-addProperty(module, 'CordovaError', './src/CordovaError/CordovaError');
-addProperty(module, 'CordovaLogger', './src/CordovaLogger');
-addProperty(module, 'CordovaCheck', './src/CordovaCheck');
-addProperty(module, 'CordovaExternalToolErrorContext', './src/CordovaError/CordovaExternalToolErrorContext');
-addProperty(module, 'PlatformJson', './src/PlatformJson');
-addProperty(module, 'ConfigParser', './src/ConfigParser/ConfigParser');
-addProperty(module, 'FileUpdater', './src/FileUpdater');
-
-addProperty(module, 'PluginInfo', './src/PluginInfo/PluginInfo');
-addProperty(module, 'PluginInfoProvider', './src/PluginInfo/PluginInfoProvider');
-
-addProperty(module, 'PluginManager', './src/PluginManager');
-
-addProperty(module, 'ConfigChanges', './src/ConfigChanges/ConfigChanges');
-addProperty(module, 'ConfigKeeper', './src/ConfigChanges/ConfigKeeper');
-addProperty(module, 'ConfigFile', './src/ConfigChanges/ConfigFile');
-addProperty(module, 'mungeUtil', './src/ConfigChanges/munge-util');
-
-addProperty(module, 'xmlHelpers', './src/util/xml-helpers');
-
diff --git a/node_modules/cordova-common/node_modules/elementtree/.npmignore b/node_modules/cordova-common/node_modules/elementtree/.npmignore
deleted file mode 100644
index 3c3629e..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/node_modules/cordova-common/node_modules/elementtree/.travis.yml b/node_modules/cordova-common/node_modules/elementtree/.travis.yml
deleted file mode 100644
index 6f27c96..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/.travis.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-language: node_js
-
-node_js:
-  - 0.6
-
-script: make test
-
-notifications:
-  email:
-    - tomaz+travisci@tomaz.me
diff --git a/node_modules/cordova-common/node_modules/elementtree/CHANGES.md b/node_modules/cordova-common/node_modules/elementtree/CHANGES.md
deleted file mode 100644
index 50d415d..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/CHANGES.md
+++ /dev/null
@@ -1,39 +0,0 @@
-elementtree v0.1.6 (in development)
-
-* Add support for CData elements. (#14)
-  [hermannpencole]
-
-elementtree v0.1.5 - 2012-11-14
-
-* Fix a bug in the find() and findtext() method which could manifest itself
-  under some conditions.
-  [metagriffin]
-
-elementtree v0.1.4 - 2012-10-15
-
-* Allow user to use namespaced attributes when using find* functions.
-  [Andrew Lunny]
-
-elementtree v0.1.3 - 2012-09-21
-
-* Improve the output of text content in the tags (strip unnecessary line break
-  characters).
-
-[Darryl Pogue]
-
-elementtree v0.1.2 - 2012-09-04
-
- * Allow user to pass 'indent' option to ElementTree.write method. If this
-   option is specified (e.g. {'indent': 4}). XML will be pretty printed.
-   [Darryl Pogue, Tomaz Muraus]
-
- * Bump sax dependency version.
-
-elementtree v0.1.1 - 2011-09-23
-
- * Improve special character escaping.
-   [Ryan Phillips]
-
-elementtree v0.1.0 - 2011-09-05
-
- * Initial release.
diff --git a/node_modules/cordova-common/node_modules/elementtree/LICENSE.txt b/node_modules/cordova-common/node_modules/elementtree/LICENSE.txt
deleted file mode 100644
index 6b0b127..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/LICENSE.txt
+++ /dev/null
@@ -1,203 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
diff --git a/node_modules/cordova-common/node_modules/elementtree/Makefile b/node_modules/cordova-common/node_modules/elementtree/Makefile
deleted file mode 100644
index ab7c4e0..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-TESTS := \
-	tests/test-simple.js
-
-
-
-PATH := ./node_modules/.bin:$(PATH)
-
-WHISKEY := $(shell bash -c 'PATH=$(PATH) type -p whiskey')
-
-default: test
-
-test:
-	NODE_PATH=`pwd`/lib/ ${WHISKEY} --scope-leaks --sequential --real-time --tests "${TESTS}"
-
-tap:
-	NODE_PATH=`pwd`/lib/ ${WHISKEY} --test-reporter tap --sequential --real-time --tests "${TESTS}"
-
-coverage:
-	NODE_PATH=`pwd`/lib/ ${WHISKEY} --sequential --coverage  --coverage-reporter html --coverage-dir coverage_html --tests "${TESTS}"
-
-.PHONY: default test coverage tap scope
diff --git a/node_modules/cordova-common/node_modules/elementtree/NOTICE b/node_modules/cordova-common/node_modules/elementtree/NOTICE
deleted file mode 100644
index 28ad70a..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/NOTICE
+++ /dev/null
@@ -1,5 +0,0 @@
-node-elementtree
-Copyright (c) 2011, Rackspace, Inc.
-
-The ElementTree toolkit is Copyright (c) 1999-2007 by Fredrik Lundh
-
diff --git a/node_modules/cordova-common/node_modules/elementtree/README.md b/node_modules/cordova-common/node_modules/elementtree/README.md
deleted file mode 100644
index 738420c..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/README.md
+++ /dev/null
@@ -1,141 +0,0 @@
-node-elementtree
-====================
-
-node-elementtree is a [Node.js](http://nodejs.org) XML parser and serializer based upon the [Python ElementTree v1.3](http://effbot.org/zone/element-index.htm) module.
-
-Installation
-====================
-
-    $ npm install elementtree
-    
-Using the library
-====================
-
-For the usage refer to the Python ElementTree library documentation - [http://effbot.org/zone/element-index.htm#usage](http://effbot.org/zone/element-index.htm#usage).
-
-Supported XPath expressions in `find`, `findall` and `findtext` methods are listed on [http://effbot.org/zone/element-xpath.htm](http://effbot.org/zone/element-xpath.htm).
-
-Example 1 – Creating An XML Document
-====================
-
-This example shows how to build a valid XML document that can be published to
-Atom Hopper. Atom Hopper is used internally as a bridge from products all the
-way to collecting revenue, called “Usage.”  MaaS and other products send similar
-events to it every time user performs an action on a resource
-(e.g. creates,updates or deletes). Below is an example of leveraging the API
-to create a new XML document.
-
-```javascript
-var et = require('elementtree');
-var XML = et.XML;
-var ElementTree = et.ElementTree;
-var element = et.Element;
-var subElement = et.SubElement;
-
-var date, root, tenantId, serviceName, eventType, usageId, dataCenter, region,
-checks, resourceId, category, startTime, resourceName, etree, xml;
-
-date = new Date();
-
-root = element('entry');
-root.set('xmlns', 'http://www.w3.org/2005/Atom');
-
-tenantId = subElement(root, 'TenantId');
-tenantId.text = '12345';
-
-serviceName = subElement(root, 'ServiceName');
-serviceName.text = 'MaaS';
-
-resourceId = subElement(root, 'ResourceID');
-resourceId.text = 'enAAAA';
-
-usageId = subElement(root, 'UsageID');
-usageId.text = '550e8400-e29b-41d4-a716-446655440000';
-
-eventType = subElement(root, 'EventType');
-eventType.text = 'create';
-
-category = subElement(root, 'category');
-category.set('term', 'monitoring.entity.create');
-
-dataCenter = subElement(root, 'DataCenter');
-dataCenter.text = 'global';
-
-region = subElement(root, 'Region');
-region.text = 'global';
-
-startTime = subElement(root, 'StartTime');
-startTime.text = date;
-
-resourceName = subElement(root, 'ResourceName');
-resourceName.text = 'entity';
-
-etree = new ElementTree(root);
-xml = etree.write({'xml_declaration': false});
-console.log(xml);
-```
-
-As you can see, both et.Element and et.SubElement are factory methods which
-return a new instance of Element and SubElement class, respectively.
-When you create a new element (tag) you can use set method to set an attribute.
-To set the tag value, assign a value to the .text attribute.
-
-This example would output a document that looks like this:
-
-```xml
-<entry xmlns="http://www.w3.org/2005/Atom">
-  <TenantId>12345</TenantId>
-  <ServiceName>MaaS</ServiceName>
-  <ResourceID>enAAAA</ResourceID>
-  <UsageID>550e8400-e29b-41d4-a716-446655440000</UsageID>
-  <EventType>create</EventType>
-  <category term="monitoring.entity.create"/>
-  <DataCenter>global</DataCenter>
-  <Region>global</Region>
-  <StartTime>Sun Apr 29 2012 16:37:32 GMT-0700 (PDT)</StartTime>
-  <ResourceName>entity</ResourceName>
-</entry>
-```
-
-Example 2 – Parsing An XML Document
-====================
-
-This example shows how to parse an XML document and use simple XPath selectors.
-For demonstration purposes, we will use the XML document located at
-https://gist.github.com/2554343.
-
-Behind the scenes, node-elementtree uses Isaac’s sax library for parsing XML,
-but the library has a concept of “parsers,” which means it’s pretty simple to
-add support for a different parser.
-
-```javascript
-var fs = require('fs');
-
-var et = require('elementtree');
-
-var XML = et.XML;
-var ElementTree = et.ElementTree;
-var element = et.Element;
-var subElement = et.SubElement;
-
-var data, etree;
-
-data = fs.readFileSync('document.xml').toString();
-etree = et.parse(data);
-
-console.log(etree.findall('./entry/TenantId').length); // 2
-console.log(etree.findtext('./entry/ServiceName')); // MaaS
-console.log(etree.findall('./entry/category')[0].get('term')); // monitoring.entity.create
-console.log(etree.findall('*/category/[@term="monitoring.entity.update"]').length); // 1
-```
-
-Build status
-====================
-
-[![Build Status](https://secure.travis-ci.org/racker/node-elementtree.png)](http://travis-ci.org/racker/node-elementtree)
-
-
-License
-====================
-
-node-elementtree is distributed under the [Apache license](http://www.apache.org/licenses/LICENSE-2.0.html).
diff --git a/node_modules/cordova-common/node_modules/elementtree/lib/constants.js b/node_modules/cordova-common/node_modules/elementtree/lib/constants.js
deleted file mode 100644
index b057faf..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/lib/constants.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-var DEFAULT_PARSER = 'sax';
-
-exports.DEFAULT_PARSER = DEFAULT_PARSER;
diff --git a/node_modules/cordova-common/node_modules/elementtree/lib/elementpath.js b/node_modules/cordova-common/node_modules/elementtree/lib/elementpath.js
deleted file mode 100644
index 2e93f47..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/lib/elementpath.js
+++ /dev/null
@@ -1,343 +0,0 @@
-/**
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-var sprintf = require('./sprintf').sprintf;
-
-var utils = require('./utils');
-var SyntaxError = require('./errors').SyntaxError;
-
-var _cache = {};
-
-var RE = new RegExp(
-  "(" +
-  "'[^']*'|\"[^\"]*\"|" +
-  "::|" +
-  "//?|" +
-  "\\.\\.|" +
-  "\\(\\)|" +
-  "[/.*:\\[\\]\\(\\)@=])|" +
-  "((?:\\{[^}]+\\})?[^/\\[\\]\\(\\)@=\\s]+)|" +
-  "\\s+", 'g'
-);
-
-var xpath_tokenizer = utils.findall.bind(null, RE);
-
-function prepare_tag(next, token) {
-  var tag = token[0];
-
-  function select(context, result) {
-    var i, len, elem, rv = [];
-
-    for (i = 0, len = result.length; i < len; i++) {
-      elem = result[i];
-      elem._children.forEach(function(e) {
-        if (e.tag === tag) {
-          rv.push(e);
-        }
-      });
-    }
-
-    return rv;
-  }
-
-  return select;
-}
-
-function prepare_star(next, token) {
-  function select(context, result) {
-    var i, len, elem, rv = [];
-
-    for (i = 0, len = result.length; i < len; i++) {
-      elem = result[i];
-      elem._children.forEach(function(e) {
-        rv.push(e);
-      });
-    }
-
-    return rv;
-  }
-
-  return select;
-}
-
-function prepare_dot(next, token) {
-  function select(context, result) {
-    var i, len, elem, rv = [];
-
-    for (i = 0, len = result.length; i < len; i++) {
-      elem = result[i];
-      rv.push(elem);
-    }
-
-    return rv;
-  }
-
-  return select;
-}
-
-function prepare_iter(next, token) {
-  var tag;
-  token = next();
-
-  if (token[1] === '*') {
-    tag = '*';
-  }
-  else if (!token[1]) {
-    tag = token[0] || '';
-  }
-  else {
-    throw new SyntaxError(token);
-  }
-
-  function select(context, result) {
-    var i, len, elem, rv = [];
-
-    for (i = 0, len = result.length; i < len; i++) {
-      elem = result[i];
-      elem.iter(tag, function(e) {
-        if (e !== elem) {
-          rv.push(e);
-        }
-      });
-    }
-
-    return rv;
-  }
-
-  return select;
-}
-
-function prepare_dot_dot(next, token) {
-  function select(context, result) {
-    var i, len, elem, rv = [], parent_map = context.parent_map;
-
-    if (!parent_map) {
-      context.parent_map = parent_map = {};
-
-      context.root.iter(null, function(p) {
-        p._children.forEach(function(e) {
-          parent_map[e] = p;
-        });
-      });
-    }
-
-    for (i = 0, len = result.length; i < len; i++) {
-      elem = result[i];
-
-      if (parent_map.hasOwnProperty(elem)) {
-        rv.push(parent_map[elem]);
-      }
-    }
-
-    return rv;
-  }
-
-  return select;
-}
-
-
-function prepare_predicate(next, token) {
-  var tag, key, value, select;
-  token = next();
-
-  if (token[1] === '@') {
-    // attribute
-    token = next();
-
-    if (token[1]) {
-      throw new SyntaxError(token, 'Invalid attribute predicate');
-    }
-
-    key = token[0];
-    token = next();
-
-    if (token[1] === ']') {
-      select = function(context, result) {
-        var i, len, elem, rv = [];
-
-        for (i = 0, len = result.length; i < len; i++) {
-          elem = result[i];
-
-          if (elem.get(key)) {
-            rv.push(elem);
-          }
-        }
-
-        return rv;
-      };
-    }
-    else if (token[1] === '=') {
-      value = next()[1];
-
-      if (value[0] === '"' || value[value.length - 1] === '\'') {
-        value = value.slice(1, value.length - 1);
-      }
-      else {
-        throw new SyntaxError(token, 'Ivalid comparison target');
-      }
-
-      token = next();
-      select = function(context, result) {
-        var i, len, elem, rv = [];
-
-        for (i = 0, len = result.length; i < len; i++) {
-          elem = result[i];
-
-          if (elem.get(key) === value) {
-            rv.push(elem);
-          }
-        }
-
-        return rv;
-      };
-    }
-
-    if (token[1] !== ']') {
-      throw new SyntaxError(token, 'Invalid attribute predicate');
-    }
-  }
-  else if (!token[1]) {
-    tag = token[0] || '';
-    token = next();
-
-    if (token[1] !== ']') {
-      throw new SyntaxError(token, 'Invalid node predicate');
-    }
-
-    select = function(context, result) {
-      var i, len, elem, rv = [];
-
-      for (i = 0, len = result.length; i < len; i++) {
-        elem = result[i];
-
-        if (elem.find(tag)) {
-          rv.push(elem);
-        }
-      }
-
-      return rv;
-    };
-  }
-  else {
-    throw new SyntaxError(null, 'Invalid predicate');
-  }
-
-  return select;
-}
-
-
-
-var ops = {
-  "": prepare_tag,
-  "*": prepare_star,
-  ".": prepare_dot,
-  "..": prepare_dot_dot,
-  "//": prepare_iter,
-  "[": prepare_predicate,
-};
-
-function _SelectorContext(root) {
-  this.parent_map = null;
-  this.root = root;
-}
-
-function findall(elem, path) {
-  var selector, result, i, len, token, value, select, context;
-
-  if (_cache.hasOwnProperty(path)) {
-    selector = _cache[path];
-  }
-  else {
-    // TODO: Use smarter cache purging approach
-    if (Object.keys(_cache).length > 100) {
-      _cache = {};
-    }
-
-    if (path.charAt(0) === '/') {
-      throw new SyntaxError(null, 'Cannot use absolute path on element');
-    }
-
-    result = xpath_tokenizer(path);
-    selector = [];
-
-    function getToken() {
-      return result.shift();
-    }
-
-    token = getToken();
-    while (true) {
-      var c = token[1] || '';
-      value = ops[c](getToken, token);
-
-      if (!value) {
-        throw new SyntaxError(null, sprintf('Invalid path: %s', path));
-      }
-
-      selector.push(value);
-      token = getToken();
-
-      if (!token) {
-        break;
-      }
-      else if (token[1] === '/') {
-        token = getToken();
-      }
-
-      if (!token) {
-        break;
-      }
-    }
-
-    _cache[path] = selector;
-  }
-
-  // Execute slector pattern
-  result = [elem];
-  context = new _SelectorContext(elem);
-
-  for (i = 0, len = selector.length; i < len; i++) {
-    select = selector[i];
-    result = select(context, result);
-  }
-
-  return result || [];
-}
-
-function find(element, path) {
-  var resultElements = findall(element, path);
-
-  if (resultElements && resultElements.length > 0) {
-    return resultElements[0];
-  }
-
-  return null;
-}
-
-function findtext(element, path, defvalue) {
-  var resultElements = findall(element, path);
-
-  if (resultElements && resultElements.length > 0) {
-    return resultElements[0].text;
-  }
-
-  return defvalue;
-}
-
-
-exports.find = find;
-exports.findall = findall;
-exports.findtext = findtext;
diff --git a/node_modules/cordova-common/node_modules/elementtree/lib/elementtree.js b/node_modules/cordova-common/node_modules/elementtree/lib/elementtree.js
deleted file mode 100644
index 61d9276..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/lib/elementtree.js
+++ /dev/null
@@ -1,611 +0,0 @@
-/**
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-var sprintf = require('./sprintf').sprintf;
-
-var utils = require('./utils');
-var ElementPath = require('./elementpath');
-var TreeBuilder = require('./treebuilder').TreeBuilder;
-var get_parser = require('./parser').get_parser;
-var constants = require('./constants');
-
-var element_ids = 0;
-
-function Element(tag, attrib)
-{
-  this._id = element_ids++;
-  this.tag = tag;
-  this.attrib = {};
-  this.text = null;
-  this.tail = null;
-  this._children = [];
-
-  if (attrib) {
-    this.attrib = utils.merge(this.attrib, attrib);
-  }
-}
-
-Element.prototype.toString = function()
-{
-  return sprintf("<Element %s at %s>", this.tag, this._id);
-};
-
-Element.prototype.makeelement = function(tag, attrib)
-{
-  return new Element(tag, attrib);
-};
-
-Element.prototype.len = function()
-{
-  return this._children.length;
-};
-
-Element.prototype.getItem = function(index)
-{
-  return this._children[index];
-};
-
-Element.prototype.setItem = function(index, element)
-{
-  this._children[index] = element;
-};
-
-Element.prototype.delItem = function(index)
-{
-  this._children.splice(index, 1);
-};
-
-Element.prototype.getSlice = function(start, stop)
-{
-  return this._children.slice(start, stop);
-};
-
-Element.prototype.setSlice = function(start, stop, elements)
-{
-  var i;
-  var k = 0;
-  for (i = start; i < stop; i++, k++) {
-    this._children[i] = elements[k];
-  }
-};
-
-Element.prototype.delSlice = function(start, stop)
-{
-  this._children.splice(start, stop - start);
-};
-
-Element.prototype.append = function(element)
-{
-  this._children.push(element);
-};
-
-Element.prototype.extend = function(elements)
-{
-  this._children.concat(elements);
-};
-
-Element.prototype.insert = function(index, element)
-{
-  this._children[index] = element;
-};
-
-Element.prototype.remove = function(element)
-{
-  this._children = this._children.filter(function(e) {
-    /* TODO: is this the right way to do this? */
-    if (e._id === element._id) {
-      return false;
-    }
-    return true;
-  });
-};
-
-Element.prototype.getchildren = function() {
-  return this._children;
-};
-
-Element.prototype.find = function(path)
-{
-  return ElementPath.find(this, path);
-};
-
-Element.prototype.findtext = function(path, defvalue)
-{
-  return ElementPath.findtext(this, path, defvalue);
-};
-
-Element.prototype.findall = function(path, defvalue)
-{
-  return ElementPath.findall(this, path, defvalue);
-};
-
-Element.prototype.clear = function()
-{
-  this.attrib = {};
-  this._children = [];
-  this.text = null;
-  this.tail = null;
-};
-
-Element.prototype.get = function(key, defvalue)
-{
-  if (this.attrib[key] !== undefined) {
-    return this.attrib[key];
-  }
-  else {
-    return defvalue;
-  }
-};
-
-Element.prototype.set = function(key, value)
-{
-  this.attrib[key] = value;
-};
-
-Element.prototype.keys = function()
-{
-  return Object.keys(this.attrib);
-};
-
-Element.prototype.items = function()
-{
-  return utils.items(this.attrib);
-};
-
-/*
- * In python this uses a generator, but in v8 we don't have em,
- * so we use a callback instead.
- **/
-Element.prototype.iter = function(tag, callback)
-{
-  var self = this;
-  var i, child;
-
-  if (tag === "*") {
-    tag = null;
-  }
-
-  if (tag === null || this.tag === tag) {
-    callback(self);
-  }
-
-  for (i = 0; i < this._children.length; i++) {
-    child = this._children[i];
-    child.iter(tag, function(e) {
-      callback(e);
-    });
-  }
-};
-
-Element.prototype.itertext = function(callback)
-{
-  this.iter(null, function(e) {
-    if (e.text) {
-      callback(e.text);
-    }
-
-    if (e.tail) {
-      callback(e.tail);
-    }
-  });
-};
-
-
-function SubElement(parent, tag, attrib) {
-  var element = parent.makeelement(tag, attrib);
-  parent.append(element);
-  return element;
-}
-
-function Comment(text) {
-  var element = new Element(Comment);
-  if (text) {
-    element.text = text;
-  }
-  return element;
-}
-
-function CData(text) {
-  var element = new Element(CData);
-  if (text) {
-    element.text = text;
-  }
-  return element;
-}
-
-function ProcessingInstruction(target, text)
-{
-  var element = new Element(ProcessingInstruction);
-  element.text = target;
-  if (text) {
-    element.text = element.text + " " + text;
-  }
-  return element;
-}
-
-function QName(text_or_uri, tag)
-{
-  if (tag) {
-    text_or_uri = sprintf("{%s}%s", text_or_uri, tag);
-  }
-  this.text = text_or_uri;
-}
-
-QName.prototype.toString = function() {
-  return this.text;
-};
-
-function ElementTree(element)
-{
-  this._root = element;
-}
-
-ElementTree.prototype.getroot = function() {
-  return this._root;
-};
-
-ElementTree.prototype._setroot = function(element) {
-  this._root = element;
-};
-
-ElementTree.prototype.parse = function(source, parser) {
-  if (!parser) {
-    parser = get_parser(constants.DEFAULT_PARSER);
-    parser = new parser.XMLParser(new TreeBuilder());
-  }
-
-  parser.feed(source);
-  this._root = parser.close();
-  return this._root;
-};
-
-ElementTree.prototype.iter = function(tag, callback) {
-  this._root.iter(tag, callback);
-};
-
-ElementTree.prototype.find = function(path) {
-  return this._root.find(path);
-};
-
-ElementTree.prototype.findtext = function(path, defvalue) {
-  return this._root.findtext(path, defvalue);
-};
-
-ElementTree.prototype.findall = function(path) {
-  return this._root.findall(path);
-};
-
-/**
- * Unlike ElementTree, we don't write to a file, we return you a string.
- */
-ElementTree.prototype.write = function(options) {
-  var sb = [];
-  options = utils.merge({
-    encoding: 'utf-8',
-    xml_declaration: null,
-    default_namespace: null,
-    method: 'xml'}, options);
-
-  if (options.xml_declaration !== false) {
-    sb.push("<?xml version='1.0' encoding='"+options.encoding +"'?>\n");
-  }
-
-  if (options.method === "text") {
-    _serialize_text(sb, self._root, encoding);
-  }
-  else {
-    var qnames, namespaces, indent, indent_string;
-    var x = _namespaces(this._root, options.encoding, options.default_namespace);
-    qnames = x[0];
-    namespaces = x[1];
-
-    if (options.hasOwnProperty('indent')) {
-      indent = 0;
-      indent_string = new Array(options.indent + 1).join(' ');
-    }
-    else {
-      indent = false;
-    }
-
-    if (options.method === "xml") {
-      _serialize_xml(function(data) {
-        sb.push(data);
-      }, this._root, options.encoding, qnames, namespaces, indent, indent_string);
-    }
-    else {
-      /* TODO: html */
-      throw new Error("unknown serialization method "+ options.method);
-    }
-  }
-
-  return sb.join("");
-};
-
-var _namespace_map = {
-    /* "well-known" namespace prefixes */
-    "http://www.w3.org/XML/1998/namespace": "xml",
-    "http://www.w3.org/1999/xhtml": "html",
-    "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf",
-    "http://schemas.xmlsoap.org/wsdl/": "wsdl",
-    /* xml schema */
-    "http://www.w3.org/2001/XMLSchema": "xs",
-    "http://www.w3.org/2001/XMLSchema-instance": "xsi",
-    /* dublic core */
-    "http://purl.org/dc/elements/1.1/": "dc",
-};
-
-function register_namespace(prefix, uri) {
-  if (/ns\d+$/.test(prefix)) {
-    throw new Error('Prefix format reserved for internal use');
-  }
-
-  if (_namespace_map.hasOwnProperty(uri) && _namespace_map[uri] === prefix) {
-    delete _namespace_map[uri];
-  }
-
-  _namespace_map[uri] = prefix;
-}
-
-
-function _escape(text, encoding, isAttribute, isText) {
-  if (text) {
-    text = text.toString();
-    text = text.replace(/&/g, '&amp;');
-    text = text.replace(/</g, '&lt;');
-    text = text.replace(/>/g, '&gt;');
-    if (!isText) {
-        text = text.replace(/\n/g, '&#xA;');
-        text = text.replace(/\r/g, '&#xD;');
-    }
-    if (isAttribute) {
-      text = text.replace(/"/g, '&quot;');
-    }
-  }
-  return text;
-}
-
-/* TODO: benchmark single regex */
-function _escape_attrib(text, encoding) {
-  return _escape(text, encoding, true);
-}
-
-function _escape_cdata(text, encoding) {
-  return _escape(text, encoding, false);
-}
-
-function _escape_text(text, encoding) {
-  return _escape(text, encoding, false, true);
-}
-
-function _namespaces(elem, encoding, default_namespace) {
-  var qnames = {};
-  var namespaces = {};
-
-  if (default_namespace) {
-    namespaces[default_namespace] = "";
-  }
-
-  function encode(text) {
-    return text;
-  }
-
-  function add_qname(qname) {
-    if (qname[0] === "{") {
-      var tmp = qname.substring(1).split("}", 2);
-      var uri = tmp[0];
-      var tag = tmp[1];
-      var prefix = namespaces[uri];
-
-      if (prefix === undefined) {
-        prefix = _namespace_map[uri];
-        if (prefix === undefined) {
-          prefix = "ns" + Object.keys(namespaces).length;
-        }
-        if (prefix !== "xml") {
-          namespaces[uri] = prefix;
-        }
-      }
-
-      if (prefix) {
-        qnames[qname] = sprintf("%s:%s", prefix, tag);
-      }
-      else {
-        qnames[qname] = tag;
-      }
-    }
-    else {
-      if (default_namespace) {
-        throw new Error('cannot use non-qualified names with default_namespace option');
-      }
-
-      qnames[qname] = qname;
-    }
-  }
-
-
-  elem.iter(null, function(e) {
-    var i;
-    var tag = e.tag;
-    var text = e.text;
-    var items = e.items();
-
-    if (tag instanceof QName && qnames[tag.text] === undefined) {
-      add_qname(tag.text);
-    }
-    else if (typeof(tag) === "string") {
-      add_qname(tag);
-    }
-    else if (tag !== null && tag !== Comment && tag !== CData && tag !== ProcessingInstruction) {
-      throw new Error('Invalid tag type for serialization: '+ tag);
-    }
-
-    if (text instanceof QName && qnames[text.text] === undefined) {
-      add_qname(text.text);
-    }
-
-    items.forEach(function(item) {
-      var key = item[0],
-          value = item[1];
-      if (key instanceof QName) {
-        key = key.text;
-      }
-
-      if (qnames[key] === undefined) {
-        add_qname(key);
-      }
-
-      if (value instanceof QName && qnames[value.text] === undefined) {
-        add_qname(value.text);
-      }
-    });
-  });
-  return [qnames, namespaces];
-}
-
-function _serialize_xml(write, elem, encoding, qnames, namespaces, indent, indent_string) {
-  var tag = elem.tag;
-  var text = elem.text;
-  var items;
-  var i;
-
-  var newlines = indent || (indent === 0);
-  write(Array(indent + 1).join(indent_string));
-
-  if (tag === Comment) {
-    write(sprintf("<!--%s-->", _escape_cdata(text, encoding)));
-  }
-  else if (tag === ProcessingInstruction) {
-    write(sprintf("<?%s?>", _escape_cdata(text, encoding)));
-  }
-  else if (tag === CData) {
-    text = text || '';
-    write(sprintf("<![CDATA[%s]]>", text));
-  }
-  else {
-    tag = qnames[tag];
-    if (tag === undefined) {
-      if (text) {
-        write(_escape_text(text, encoding));
-      }
-      elem.iter(function(e) {
-        _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string);
-      });
-    }
-    else {
-      write("<" + tag);
-      items = elem.items();
-
-      if (items || namespaces) {
-        items.sort(); // lexical order
-
-        items.forEach(function(item) {
-          var k = item[0],
-              v = item[1];
-
-            if (k instanceof QName) {
-              k = k.text;
-            }
-
-            if (v instanceof QName) {
-              v = qnames[v.text];
-            }
-            else {
-              v = _escape_attrib(v, encoding);
-            }
-            write(sprintf(" %s=\"%s\"", qnames[k], v));
-        });
-
-        if (namespaces) {
-          items = utils.items(namespaces);
-          items.sort(function(a, b) { return a[1] < b[1]; });
-
-          items.forEach(function(item) {
-            var k = item[1],
-                v = item[0];
-
-            if (k) {
-              k = ':' + k;
-            }
-
-            write(sprintf(" xmlns%s=\"%s\"", k, _escape_attrib(v, encoding)));
-          });
-        }
-      }
-
-      if (text || elem.len()) {
-        if (text && text.toString().match(/^\s*$/)) {
-            text = null;
-        }
-
-        write(">");
-        if (!text && newlines) {
-          write("\n");
-        }
-
-        if (text) {
-          write(_escape_text(text, encoding));
-        }
-        elem._children.forEach(function(e) {
-          _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string);
-        });
-
-        if (!text && indent) {
-          write(Array(indent + 1).join(indent_string));
-        }
-        write("</" + tag + ">");
-      }
-      else {
-        write(" />");
-      }
-    }
-  }
-
-  if (newlines) {
-    write("\n");
-  }
-}
-
-function parse(source, parser) {
-  var tree = new ElementTree();
-  tree.parse(source, parser);
-  return tree;
-}
-
-function tostring(element, options) {
-  return new ElementTree(element).write(options);
-}
-
-exports.PI = ProcessingInstruction;
-exports.Comment = Comment;
-exports.CData = CData;
-exports.ProcessingInstruction = ProcessingInstruction;
-exports.SubElement = SubElement;
-exports.QName = QName;
-exports.ElementTree = ElementTree;
-exports.ElementPath = ElementPath;
-exports.Element = function(tag, attrib) {
-  return new Element(tag, attrib);
-};
-
-exports.XML = function(data) {
-  var et = new ElementTree();
-  return et.parse(data);
-};
-
-exports.parse = parse;
-exports.register_namespace = register_namespace;
-exports.tostring = tostring;
diff --git a/node_modules/cordova-common/node_modules/elementtree/lib/errors.js b/node_modules/cordova-common/node_modules/elementtree/lib/errors.js
deleted file mode 100644
index e8742be..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/lib/errors.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-var util = require('util');
-
-var sprintf = require('./sprintf').sprintf;
-
-function SyntaxError(token, msg) {
-  msg = msg || sprintf('Syntax Error at token %s', token.toString());
-  this.token = token;
-  this.message = msg;
-  Error.call(this, msg);
-}
-
-util.inherits(SyntaxError, Error);
-
-exports.SyntaxError = SyntaxError;
diff --git a/node_modules/cordova-common/node_modules/elementtree/lib/parser.js b/node_modules/cordova-common/node_modules/elementtree/lib/parser.js
deleted file mode 100644
index 7307ee4..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/lib/parser.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-/* TODO: support node-expat C++ module optionally */
-
-var util = require('util');
-var parsers = require('./parsers/index');
-
-function get_parser(name) {
-  if (name === 'sax') {
-    return parsers.sax;
-  }
-  else {
-    throw new Error('Invalid parser: ' + name);
-  }
-}
-
-
-exports.get_parser = get_parser;
diff --git a/node_modules/cordova-common/node_modules/elementtree/lib/parsers/index.js b/node_modules/cordova-common/node_modules/elementtree/lib/parsers/index.js
deleted file mode 100644
index 5eac5c8..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/lib/parsers/index.js
+++ /dev/null
@@ -1 +0,0 @@
-exports.sax = require('./sax');
diff --git a/node_modules/cordova-common/node_modules/elementtree/lib/parsers/sax.js b/node_modules/cordova-common/node_modules/elementtree/lib/parsers/sax.js
deleted file mode 100644
index 69b0a59..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/lib/parsers/sax.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var util = require('util');
-
-var sax = require('sax');
-
-var TreeBuilder = require('./../treebuilder').TreeBuilder;
-
-function XMLParser(target) {
-  this.parser = sax.parser(true);
-
-  this.target = (target) ? target : new TreeBuilder();
-
-  this.parser.onopentag = this._handleOpenTag.bind(this);
-  this.parser.ontext = this._handleText.bind(this);
-  this.parser.oncdata = this._handleCdata.bind(this);
-  this.parser.ondoctype = this._handleDoctype.bind(this);
-  this.parser.oncomment = this._handleComment.bind(this);
-  this.parser.onclosetag = this._handleCloseTag.bind(this);
-  this.parser.onerror = this._handleError.bind(this);
-}
-
-XMLParser.prototype._handleOpenTag = function(tag) {
-  this.target.start(tag.name, tag.attributes);
-};
-
-XMLParser.prototype._handleText = function(text) {
-  this.target.data(text);
-};
-
-XMLParser.prototype._handleCdata = function(text) {
-  this.target.data(text);
-};
-
-XMLParser.prototype._handleDoctype = function(text) {
-};
-
-XMLParser.prototype._handleComment = function(comment) {
-};
-
-XMLParser.prototype._handleCloseTag = function(tag) {
-  this.target.end(tag);
-};
-
-XMLParser.prototype._handleError = function(err) {
-  throw err;
-};
-
-XMLParser.prototype.feed = function(chunk) {
-  this.parser.write(chunk);
-};
-
-XMLParser.prototype.close = function() {
-  this.parser.close();
-  return this.target.close();
-};
-
-exports.XMLParser = XMLParser;
diff --git a/node_modules/cordova-common/node_modules/elementtree/lib/sprintf.js b/node_modules/cordova-common/node_modules/elementtree/lib/sprintf.js
deleted file mode 100644
index f802c1b..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/lib/sprintf.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-var cache = {};
-
-
-// Do any others need escaping?
-var TO_ESCAPE = {
-  '\'': '\\\'',
-  '\n': '\\n'
-};
-
-
-function populate(formatter) {
-  var i, type,
-      key = formatter,
-      prev = 0,
-      arg = 1,
-      builder = 'return \'';
-
-  for (i = 0; i < formatter.length; i++) {
-    if (formatter[i] === '%') {
-      type = formatter[i + 1];
-
-      switch (type) {
-        case 's':
-          builder += formatter.slice(prev, i) + '\' + arguments[' + arg + '] + \'';
-          prev = i + 2;
-          arg++;
-          break;
-        case 'j':
-          builder += formatter.slice(prev, i) + '\' + JSON.stringify(arguments[' + arg + ']) + \'';
-          prev = i + 2;
-          arg++;
-          break;
-        case '%':
-          builder += formatter.slice(prev, i + 1);
-          prev = i + 2;
-          i++;
-          break;
-      }
-
-
-    } else if (TO_ESCAPE[formatter[i]]) {
-      builder += formatter.slice(prev, i) + TO_ESCAPE[formatter[i]];
-      prev = i + 1;
-    }
-  }
-
-  builder += formatter.slice(prev) + '\';';
-  cache[key] = new Function(builder);
-}
-
-
-/**
- * A fast version of sprintf(), which currently only supports the %s and %j.
- * This caches a formatting function for each format string that is used, so
- * you should only use this sprintf() will be called many times with a single
- * format string and a limited number of format strings will ever be used (in
- * general this means that format strings should be string literals).
- *
- * @param {String} formatter A format string.
- * @param {...String} var_args Values that will be formatted by %s and %j.
- * @return {String} The formatted output.
- */
-exports.sprintf = function(formatter, var_args) {
-  if (!cache[formatter]) {
-    populate(formatter);
-  }
-
-  return cache[formatter].apply(null, arguments);
-};
diff --git a/node_modules/cordova-common/node_modules/elementtree/lib/treebuilder.js b/node_modules/cordova-common/node_modules/elementtree/lib/treebuilder.js
deleted file mode 100644
index 393a98f..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/lib/treebuilder.js
+++ /dev/null
@@ -1,60 +0,0 @@
-function TreeBuilder(element_factory) {
-  this._data = [];
-  this._elem = [];
-  this._last = null;
-  this._tail = null;
-  if (!element_factory) {
-    /* evil circular dep */
-    element_factory = require('./elementtree').Element;
-  }
-  this._factory = element_factory;
-}
-
-TreeBuilder.prototype.close = function() {
-  return this._last;
-};
-
-TreeBuilder.prototype._flush = function() {
-  if (this._data) {
-    if (this._last !== null) {
-      var text = this._data.join("");
-      if (this._tail) {
-        this._last.tail = text;
-      }
-      else {
-        this._last.text = text;
-      }
-    }
-    this._data = [];
-  }
-};
-
-TreeBuilder.prototype.data = function(data) {
-  this._data.push(data);
-};
-
-TreeBuilder.prototype.start = function(tag, attrs) {
-  this._flush();
-  var elem = this._factory(tag, attrs);
-  this._last = elem;
-
-  if (this._elem.length) {
-    this._elem[this._elem.length - 1].append(elem);
-  }
-
-  this._elem.push(elem);
-
-  this._tail = null;
-};
-
-TreeBuilder.prototype.end = function(tag) {
-  this._flush();
-  this._last = this._elem.pop();
-  if (this._last.tag !== tag) {
-    throw new Error("end tag mismatch");
-  }
-  this._tail = 1;
-  return this._last;
-};
-
-exports.TreeBuilder = TreeBuilder;
diff --git a/node_modules/cordova-common/node_modules/elementtree/lib/utils.js b/node_modules/cordova-common/node_modules/elementtree/lib/utils.js
deleted file mode 100644
index b08a670..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/lib/utils.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-/**
- * @param {Object} hash.
- * @param {Array} ignored.
- */
-function items(hash, ignored) {
-  ignored = ignored || null;
-  var k, rv = [];
-
-  function is_ignored(key) {
-    if (!ignored || ignored.length === 0) {
-      return false;
-    }
-
-    return ignored.indexOf(key);
-  }
-
-  for (k in hash) {
-    if (hash.hasOwnProperty(k) && !(is_ignored(ignored))) {
-      rv.push([k, hash[k]]);
-    }
-  }
-
-  return rv;
-}
-
-
-function findall(re, str) {
-  var match, matches = [];
-
-  while ((match = re.exec(str))) {
-      matches.push(match);
-  }
-
-  return matches;
-}
-
-function merge(a, b) {
-  var c = {}, attrname;
-
-  for (attrname in a) {
-    if (a.hasOwnProperty(attrname)) {
-      c[attrname] = a[attrname];
-    }
-  }
-  for (attrname in b) {
-    if (b.hasOwnProperty(attrname)) {
-      c[attrname] = b[attrname];
-    }
-  }
-  return c;
-}
-
-exports.items = items;
-exports.findall = findall;
-exports.merge = merge;
diff --git a/node_modules/cordova-common/node_modules/elementtree/package.json b/node_modules/cordova-common/node_modules/elementtree/package.json
deleted file mode 100644
index 244b02f..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/package.json
+++ /dev/null
@@ -1,83 +0,0 @@
-{
-  "_args": [
-    [
-      "elementtree@0.1.6",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "elementtree@0.1.6",
-  "_id": "elementtree@0.1.6",
-  "_inBundle": false,
-  "_integrity": "sha1-KsTEbqMFFsjEy9teOsdBjlkt4gw=",
-  "_location": "/cordova-common/elementtree",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "elementtree@0.1.6",
-    "name": "elementtree",
-    "escapedName": "elementtree",
-    "rawSpec": "0.1.6",
-    "saveSpec": null,
-    "fetchSpec": "0.1.6"
-  },
-  "_requiredBy": [
-    "/cordova-common"
-  ],
-  "_resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.6.tgz",
-  "_spec": "0.1.6",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Rackspace US, Inc."
-  },
-  "bugs": {
-    "url": "https://github.com/racker/node-elementtree/issues"
-  },
-  "contributors": [
-    {
-      "name": "Paul Querna",
-      "email": "paul.querna@rackspace.com"
-    },
-    {
-      "name": "Tomaz Muraus",
-      "email": "tomaz.muraus@rackspace.com"
-    }
-  ],
-  "dependencies": {
-    "sax": "0.3.5"
-  },
-  "description": "XML Serialization and Parsing module based on Python's ElementTree.",
-  "devDependencies": {
-    "whiskey": "0.8.x"
-  },
-  "directories": {
-    "lib": "lib"
-  },
-  "engines": {
-    "node": ">= 0.4.0"
-  },
-  "homepage": "https://github.com/racker/node-elementtree",
-  "keywords": [
-    "xml",
-    "sax",
-    "parser",
-    "seralization",
-    "elementtree"
-  ],
-  "licenses": [
-    {
-      "type": "Apache",
-      "url": "http://www.apache.org/licenses/LICENSE-2.0.html"
-    }
-  ],
-  "main": "lib/elementtree.js",
-  "name": "elementtree",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/racker/node-elementtree.git"
-  },
-  "scripts": {
-    "test": "make test"
-  },
-  "version": "0.1.6"
-}
diff --git a/node_modules/cordova-common/node_modules/elementtree/tests/data/xml1.xml b/node_modules/cordova-common/node_modules/elementtree/tests/data/xml1.xml
deleted file mode 100644
index 72c33ae..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/tests/data/xml1.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0"?>
-<container name="test_container_1" xmlns:android="http://schemas.android.com/apk/res/android">
-  <object>dd
-    <name>test_object_1</name>
-    <hash>4281c348eaf83e70ddce0e07221c3d28</hash>
-    <bytes android:type="cool">14</bytes>
-    <content_type>application/octetstream</content_type>
-    <last_modified>2009-02-03T05:26:32.612278</last_modified>
-  </object>
-  <object>
-    <name>test_object_2</name>
-    <hash>b039efe731ad111bc1b0ef221c3849d0</hash>
-    <bytes android:type="lame">64</bytes>
-    <content_type>application/octetstream</content_type>
-    <last_modified>2009-02-03T05:26:32.612278</last_modified>
-  </object>
-</container>
diff --git a/node_modules/cordova-common/node_modules/elementtree/tests/data/xml2.xml b/node_modules/cordova-common/node_modules/elementtree/tests/data/xml2.xml
deleted file mode 100644
index 5f94bbd..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/tests/data/xml2.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0"?>
-<object>
-    <title>
-        Hello World
-    </title>
-    <children>
-        <object id="obj1" />
-        <object id="obj2" />
-        <object id="obj3" />
-    </children>
-    <text><![CDATA[
-        Test & Test & Test
-    ]]></text>
-</object>
diff --git a/node_modules/cordova-common/node_modules/elementtree/tests/test-simple.js b/node_modules/cordova-common/node_modules/elementtree/tests/test-simple.js
deleted file mode 100644
index 1fc04b8..0000000
--- a/node_modules/cordova-common/node_modules/elementtree/tests/test-simple.js
+++ /dev/null
@@ -1,339 +0,0 @@
-/**
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-var fs = require('fs');
-var path = require('path');
-
-var sprintf = require('./../lib/sprintf').sprintf;
-var et = require('elementtree');
-var XML = et.XML;
-var ElementTree = et.ElementTree;
-var Element = et.Element;
-var SubElement = et.SubElement;
-var SyntaxError = require('./../lib/errors').SyntaxError;
-
-function readFile(name) {
-  return fs.readFileSync(path.join(__dirname, '/data/', name), 'utf8');
-}
-
-exports['test_simplest'] = function(test, assert) {
-  /* Ported from <https://github.com/lxml/lxml/blob/master/src/lxml/tests/test_elementtree.py> */
-  var Element = et.Element;
-  var root = Element('root');
-  root.append(Element('one'));
-  root.append(Element('two'));
-  root.append(Element('three'));
-  assert.equal(3, root.len());
-  assert.equal('one', root.getItem(0).tag);
-  assert.equal('two', root.getItem(1).tag);
-  assert.equal('three', root.getItem(2).tag);
-  test.finish();
-};
-
-
-exports['test_attribute_values'] = function(test, assert) {
-  var XML = et.XML;
-  var root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>');
-  assert.equal('Alpha', root.attrib['alpha']);
-  assert.equal('Beta', root.attrib['beta']);
-  assert.equal('Gamma', root.attrib['gamma']);
-  test.finish();
-};
-
-
-exports['test_findall'] = function(test, assert) {
-  var XML = et.XML;
-  var root = XML('<a><b><c/></b><b/><c><b/></c></a>');
-
-  assert.equal(root.findall("c").length, 1);
-  assert.equal(root.findall(".//c").length, 2);
-  assert.equal(root.findall(".//b").length, 3);
-  assert.equal(root.findall(".//b")[0]._children.length, 1);
-  assert.equal(root.findall(".//b")[1]._children.length, 0);
-  assert.equal(root.findall(".//b")[2]._children.length, 0);
-  assert.deepEqual(root.findall('.//b')[0], root.getchildren()[0]);
-
-  test.finish();
-};
-
-exports['test_find'] = function(test, assert) {
-  var a = Element('a');
-  var b = SubElement(a, 'b');
-  var c = SubElement(a, 'c');
-
-  assert.deepEqual(a.find('./b/..'), a);
-  test.finish();
-};
-
-exports['test_elementtree_find_qname'] = function(test, assert) {
-  var tree = new et.ElementTree(XML('<a><b><c/></b><b/><c><b/></c></a>'));
-  assert.deepEqual(tree.find(new et.QName('c')), tree.getroot()._children[2]);
-  test.finish();
-};
-
-exports['test_attrib_ns_clear'] = function(test, assert) {
-  var attribNS = '{http://foo/bar}x';
-
-  var par = Element('par');
-  par.set(attribNS, 'a');
-  var child = SubElement(par, 'child');
-  child.set(attribNS, 'b');
-
-  assert.equal('a', par.get(attribNS));
-  assert.equal('b', child.get(attribNS));
-
-  par.clear();
-  assert.equal(null, par.get(attribNS));
-  assert.equal('b', child.get(attribNS));
-  test.finish();
-};
-
-exports['test_create_tree_and_parse_simple'] = function(test, assert) {
-  var i = 0;
-  var e = new Element('bar', {});
-  var expected = "<?xml version='1.0' encoding='utf-8'?>\n" +
-    '<bar><blah a="11" /><blah a="12" /><gag a="13" b="abc">ponies</gag></bar>';
-
-  SubElement(e, "blah", {a: 11});
-  SubElement(e, "blah", {a: 12});
-  var se = et.SubElement(e, "gag", {a: '13', b: 'abc'});
-  se.text = 'ponies';
-
-  se.itertext(function(text) {
-    assert.equal(text, 'ponies');
-    i++;
-  });
-
-  assert.equal(i, 1);
-  var etree = new ElementTree(e);
-  var xml = etree.write();
-  assert.equal(xml, expected);
-  test.finish();
-};
-
-exports['test_write_with_options'] = function(test, assert) {
-  var i = 0;
-  var e = new Element('bar', {});
-  var expected1 = "<?xml version='1.0' encoding='utf-8'?>\n" +
-    '<bar>\n' +
-    '    <blah a="11">\n' +
-    '        <baz d="11">test</baz>\n' +
-    '    </blah>\n' +
-    '    <blah a="12" />\n' +
-    '    <gag a="13" b="abc">ponies</gag>\n' +
-    '</bar>\n';
-    var expected2 = "<?xml version='1.0' encoding='utf-8'?>\n" +
-    '<bar>\n' +
-    '  <blah a="11">\n' +
-    '    <baz d="11">test</baz>\n' +
-    '  </blah>\n' +
-    '  <blah a="12" />\n' +
-    '  <gag a="13" b="abc">ponies</gag>\n' +
-    '</bar>\n';
-
-    var expected3 = "<?xml version='1.0' encoding='utf-8'?>\n" +
-    '<object>\n' +
-    '    <title>\n' +
-    '        Hello World\n' +
-    '    </title>\n' +
-    '    <children>\n' +
-    '        <object id="obj1" />\n' +
-    '        <object id="obj2" />\n' +
-    '        <object id="obj3" />\n' +
-    '    </children>\n' +
-    '    <text>\n' +
-    '        Test &amp; Test &amp; Test\n' +
-    '    </text>\n' +
-    '</object>\n';
-
-  var se1 = SubElement(e, "blah", {a: 11});
-  var se2 = SubElement(se1, "baz", {d: 11});
-  se2.text = 'test';
-  SubElement(e, "blah", {a: 12});
-  var se = et.SubElement(e, "gag", {a: '13', b: 'abc'});
-  se.text = 'ponies';
-
-  se.itertext(function(text) {
-    assert.equal(text, 'ponies');
-    i++;
-  });
-
-  assert.equal(i, 1);
-  var etree = new ElementTree(e);
-  var xml1 = etree.write({'indent': 4});
-  var xml2 = etree.write({'indent': 2});
-  assert.equal(xml1, expected1);
-  assert.equal(xml2, expected2);
-
-  var file = readFile('xml2.xml');
-  var etree2 = et.parse(file);
-  var xml3 = etree2.write({'indent': 4});
-  assert.equal(xml3, expected3);
-  test.finish();
-};
-
-exports['test_parse_and_find_2'] = function(test, assert) {
-  var data = readFile('xml1.xml');
-  var etree = et.parse(data);
-
-  assert.equal(etree.findall('./object').length, 2);
-  assert.equal(etree.findall('[@name]').length, 1);
-  assert.equal(etree.findall('[@name="test_container_1"]').length, 1);
-  assert.equal(etree.findall('[@name=\'test_container_1\']').length, 1);
-  assert.equal(etree.findall('./object')[0].findtext('name'), 'test_object_1');
-  assert.equal(etree.findtext('./object/name'), 'test_object_1');
-  assert.equal(etree.findall('.//bytes').length, 2);
-  assert.equal(etree.findall('*/bytes').length, 2);
-  assert.equal(etree.findall('*/foobar').length, 0);
-
-  test.finish();
-};
-
-exports['test_namespaced_attribute'] = function(test, assert) {
-  var data = readFile('xml1.xml');
-  var etree = et.parse(data);
-
-  assert.equal(etree.findall('*/bytes[@android:type="cool"]').length, 1);
-
-  test.finish();
-}
-
-exports['test_syntax_errors'] = function(test, assert) {
-  var expressions = [ './/@bar', '[@bar', '[@foo=bar]', '[@', '/bar' ];
-  var errCount = 0;
-  var data = readFile('xml1.xml');
-  var etree = et.parse(data);
-
-  expressions.forEach(function(expression) {
-    try {
-      etree.findall(expression);
-    }
-    catch (err) {
-      errCount++;
-    }
-  });
-
-  assert.equal(errCount, expressions.length);
-  test.finish();
-};
-
-exports['test_register_namespace'] = function(test, assert){
-  var prefix = 'TESTPREFIX';
-  var namespace = 'http://seriously.unknown/namespace/URI';
-  var errCount = 0;
-
-  var etree = Element(sprintf('{%s}test', namespace));
-  assert.equal(et.tostring(etree, { 'xml_declaration': false}),
-               sprintf('<ns0:test xmlns:ns0="%s" />', namespace));
-
-  et.register_namespace(prefix, namespace);
-  var etree = Element(sprintf('{%s}test', namespace));
-  assert.equal(et.tostring(etree, { 'xml_declaration': false}),
-               sprintf('<%s:test xmlns:%s="%s" />', prefix, prefix, namespace));
-
-  try {
-    et.register_namespace('ns25', namespace);
-  }
-  catch (err) {
-    errCount++;
-  }
-
-  assert.equal(errCount, 1, 'Reserved prefix used, but exception was not thrown');
-  test.finish();
-};
-
-exports['test_tostring'] = function(test, assert) {
-  var a = Element('a');
-  var b = SubElement(a, 'b');
-  var c = SubElement(a, 'c');
-  c.text = 543;
-
-  assert.equal(et.tostring(a, { 'xml_declaration': false }), '<a><b /><c>543</c></a>');
-  assert.equal(et.tostring(c, { 'xml_declaration': false }), '<c>543</c>');
-  test.finish();
-};
-
-exports['test_escape'] = function(test, assert) {
-  var a = Element('a');
-  var b = SubElement(a, 'b');
-  b.text = '&&&&<>"\n\r';
-
-  assert.equal(et.tostring(a, { 'xml_declaration': false }), '<a><b>&amp;&amp;&amp;&amp;&lt;&gt;\"\n\r</b></a>');
-  test.finish();
-};
-
-exports['test_find_null'] = function(test, assert) {
-  var root = Element('root');
-  var node = SubElement(root, 'node');
-  var leaf  = SubElement(node, 'leaf');
-  leaf.text = 'ipsum';
-
-  assert.equal(root.find('node/leaf'), leaf);
-  assert.equal(root.find('no-such-node/leaf'), null);
-  test.finish();
-};
-
-exports['test_findtext_null'] = function(test, assert) {
-  var root = Element('root');
-  var node = SubElement(root, 'node');
-  var leaf  = SubElement(node, 'leaf');
-  leaf.text = 'ipsum';
-
-  assert.equal(root.findtext('node/leaf'), 'ipsum');
-  assert.equal(root.findtext('no-such-node/leaf'), null);
-  test.finish();
-};
-
-exports['test_remove'] = function(test, assert) {
-  var root = Element('root');
-  var node1 = SubElement(root, 'node1');
-  var node2 = SubElement(root, 'node2');
-  var node3 = SubElement(root, 'node3');
-
-  assert.equal(root.len(), 3);
-
-  root.remove(node2);
-
-  assert.equal(root.len(), 2);
-  assert.equal(root.getItem(0).tag, 'node1')
-  assert.equal(root.getItem(1).tag, 'node3')
-
-  test.finish();
-};
-
-exports['test_cdata_write'] = function(test, assert) {
-  var root, etree, xml, values, value, i;
-
-  values = [
-    'if(0>1) then true;',
-    '<test1>ponies hello</test1>',
-    ''
-  ];
-
-  for (i = 0; i < values.length; i++) {
-    value = values[i];
-
-    root = Element('root');
-    root.append(et.CData(value));
-    etree = new ElementTree(root);
-    xml = etree.write({'xml_declaration': false});
-
-    assert.equal(xml, sprintf('<root><![CDATA[%s]]></root>', value));
-  }
-
-  test.finish();
-};
diff --git a/node_modules/cordova-common/package.json b/node_modules/cordova-common/package.json
deleted file mode 100644
index 11f7fca..0000000
--- a/node_modules/cordova-common/package.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
-  "_args": [
-    [
-      "cordova-common@2.2.1",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "cordova-common@2.2.1",
-  "_id": "cordova-common@2.2.1",
-  "_inBundle": false,
-  "_integrity": "sha1-cAm8WRcpyqcoWliM/Wp7VM2DTww=",
-  "_location": "/cordova-common",
-  "_phantomChildren": {
-    "sax": "0.3.5"
-  },
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "cordova-common@2.2.1",
-    "name": "cordova-common",
-    "escapedName": "cordova-common",
-    "rawSpec": "2.2.1",
-    "saveSpec": null,
-    "fetchSpec": "2.2.1"
-  },
-  "_requiredBy": [
-    "/"
-  ],
-  "_resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-2.2.1.tgz",
-  "_spec": "2.2.1",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Apache Software Foundation"
-  },
-  "bugs": {
-    "url": "https://issues.apache.org/jira/browse/CB",
-    "email": "dev@cordova.apache.org"
-  },
-  "contributors": [],
-  "dependencies": {
-    "ansi": "^0.3.1",
-    "bplist-parser": "^0.1.0",
-    "cordova-registry-mapper": "^1.1.8",
-    "elementtree": "0.1.6",
-    "glob": "^5.0.13",
-    "minimatch": "^3.0.0",
-    "osenv": "^0.1.3",
-    "plist": "^1.2.0",
-    "q": "^1.4.1",
-    "semver": "^5.0.1",
-    "shelljs": "^0.5.3",
-    "underscore": "^1.8.3",
-    "unorm": "^1.3.3"
-  },
-  "description": "Apache Cordova tools and platforms shared routines",
-  "devDependencies": {
-    "eslint": "^4.0.0",
-    "eslint-config-semistandard": "^11.0.0",
-    "eslint-config-standard": "^10.2.1",
-    "eslint-plugin-import": "^2.3.0",
-    "eslint-plugin-node": "^5.0.0",
-    "eslint-plugin-promise": "^3.5.0",
-    "eslint-plugin-standard": "^3.0.1",
-    "istanbul": "^0.4.5",
-    "jasmine": "^2.5.2",
-    "promise-matchers": "^0.9.6",
-    "rewire": "^2.5.1"
-  },
-  "engines": {
-    "node": ">=4.0.0"
-  },
-  "homepage": "https://github.com/apache/cordova-lib#readme",
-  "license": "Apache-2.0",
-  "main": "cordova-common.js",
-  "name": "cordova-common",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/apache/cordova-lib.git"
-  },
-  "scripts": {
-    "cover": "istanbul cover --root src --print detail jasmine",
-    "eslint": "eslint src && eslint spec",
-    "jasmine": "jasmine JASMINE_CONFIG_PATH=spec/support/jasmine.json",
-    "test": "npm run eslint && npm run jasmine"
-  },
-  "version": "2.2.1"
-}
diff --git a/node_modules/cordova-common/src/ActionStack.js b/node_modules/cordova-common/src/ActionStack.js
deleted file mode 100644
index 6983c5c..0000000
--- a/node_modules/cordova-common/src/ActionStack.js
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*/
-
-/* jshint quotmark:false */
-
-var events = require('./events');
-var Q = require('q');
-
-function ActionStack () {
-    this.stack = [];
-    this.completed = [];
-}
-
-ActionStack.prototype = {
-    createAction: function (handler, action_params, reverter, revert_params) {
-        return {
-            handler: {
-                run: handler,
-                params: action_params
-            },
-            reverter: {
-                run: reverter,
-                params: revert_params
-            }
-        };
-    },
-    push: function (tx) {
-        this.stack.push(tx);
-    },
-    // Returns a promise.
-    process: function (platform) {
-        events.emit('verbose', 'Beginning processing of action stack for ' + platform + ' project...');
-
-        while (this.stack.length) {
-            var action = this.stack.shift();
-            var handler = action.handler.run;
-            var action_params = action.handler.params;
-
-            try {
-                handler.apply(null, action_params);
-            } catch (e) {
-                events.emit('warn', 'Error during processing of action! Attempting to revert...');
-                this.stack.unshift(action);
-                var issue = 'Uh oh!\n';
-                // revert completed tasks
-                while (this.completed.length) {
-                    var undo = this.completed.shift();
-                    var revert = undo.reverter.run;
-                    var revert_params = undo.reverter.params;
-
-                    try {
-                        revert.apply(null, revert_params);
-                    } catch (err) {
-                        events.emit('warn', 'Error during reversion of action! We probably really messed up your project now, sorry! D:');
-                        issue += 'A reversion action failed: ' + err.message + '\n';
-                    }
-                }
-                e.message = issue + e.message;
-                return Q.reject(e);
-            }
-            this.completed.push(action);
-        }
-        events.emit('verbose', 'Action stack processing complete.');
-
-        return Q();
-    }
-};
-
-module.exports = ActionStack;
diff --git a/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js b/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js
deleted file mode 100644
index 1780d25..0000000
--- a/node_modules/cordova-common/src/ConfigChanges/ConfigChanges.js
+++ /dev/null
@@ -1,424 +0,0 @@
-/**
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*/
-
-/*
- * This module deals with shared configuration / dependency "stuff". That is:
- * - XML configuration files such as config.xml, AndroidManifest.xml or WMAppManifest.xml.
- * - plist files in iOS
- * Essentially, any type of shared resources that we need to handle with awareness
- * of how potentially multiple plugins depend on a single shared resource, should be
- * handled in this module.
- *
- * The implementation uses an object as a hash table, with "leaves" of the table tracking
- * reference counts.
- */
-
-var path = require('path');
-var et = require('elementtree');
-var ConfigKeeper = require('./ConfigKeeper');
-var events = require('../events');
-
-var mungeutil = require('./munge-util');
-var xml_helpers = require('../util/xml-helpers');
-
-exports.PlatformMunger = PlatformMunger;
-
-exports.process = function (plugins_dir, project_dir, platform, platformJson, pluginInfoProvider) {
-    var munger = new PlatformMunger(platform, project_dir, platformJson, pluginInfoProvider);
-    munger.process(plugins_dir);
-    munger.save_all();
-};
-
-/******************************************************************************
-* PlatformMunger class
-*
-* Can deal with config file of a single project.
-* Parsed config files are cached in a ConfigKeeper object.
-******************************************************************************/
-function PlatformMunger (platform, project_dir, platformJson, pluginInfoProvider) {
-    this.platform = platform;
-    this.project_dir = project_dir;
-    this.config_keeper = new ConfigKeeper(project_dir);
-    this.platformJson = platformJson;
-    this.pluginInfoProvider = pluginInfoProvider;
-}
-
-// Write out all unsaved files.
-PlatformMunger.prototype.save_all = PlatformMunger_save_all;
-function PlatformMunger_save_all () {
-    this.config_keeper.save_all();
-    this.platformJson.save();
-}
-
-// Apply a munge object to a single config file.
-// The remove parameter tells whether to add the change or remove it.
-PlatformMunger.prototype.apply_file_munge = PlatformMunger_apply_file_munge;
-function PlatformMunger_apply_file_munge (file, munge, remove) {
-    var self = this;
-
-    for (var selector in munge.parents) {
-        for (var xml_child in munge.parents[selector]) {
-            // this xml child is new, graft it (only if config file exists)
-            var config_file = self.config_keeper.get(self.project_dir, self.platform, file);
-            if (config_file.exists) {
-                if (remove) config_file.prune_child(selector, munge.parents[selector][xml_child]);
-                else config_file.graft_child(selector, munge.parents[selector][xml_child]);
-            }
-        }
-    }
-}
-
-PlatformMunger.prototype.remove_plugin_changes = remove_plugin_changes;
-function remove_plugin_changes (pluginInfo, is_top_level) {
-    var self = this;
-    var platform_config = self.platformJson.root;
-    var plugin_vars = is_top_level ?
-        platform_config.installed_plugins[pluginInfo.id] :
-        platform_config.dependent_plugins[pluginInfo.id];
-    var edit_config_changes = null;
-    if (pluginInfo.getEditConfigs) {
-        edit_config_changes = pluginInfo.getEditConfigs(self.platform);
-    }
-
-    // get config munge, aka how did this plugin change various config files
-    var config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes);
-    // global munge looks at all plugins' changes to config files
-    var global_munge = platform_config.config_munge;
-    var munge = mungeutil.decrement_munge(global_munge, config_munge);
-
-    for (var file in munge.files) {
-        self.apply_file_munge(file, munge.files[file], /* remove = */ true);
-    }
-
-    // Remove from installed_plugins
-    self.platformJson.removePlugin(pluginInfo.id, is_top_level);
-    return self;
-}
-
-PlatformMunger.prototype.add_plugin_changes = add_plugin_changes;
-function add_plugin_changes (pluginInfo, plugin_vars, is_top_level, should_increment, plugin_force) {
-    var self = this;
-    var platform_config = self.platformJson.root;
-
-    var edit_config_changes = null;
-    if (pluginInfo.getEditConfigs) {
-        edit_config_changes = pluginInfo.getEditConfigs(self.platform);
-    }
-
-    var config_munge;
-
-    if (!edit_config_changes || edit_config_changes.length === 0) {
-        // get config munge, aka how should this plugin change various config files
-        config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars);
-    } else {
-        var isConflictingInfo = is_conflicting(edit_config_changes, platform_config.config_munge, self, plugin_force);
-
-        if (isConflictingInfo.conflictWithConfigxml) {
-            throw new Error(pluginInfo.id +
-                ' cannot be added. <edit-config> changes in this plugin conflicts with <edit-config> changes in config.xml. Conflicts must be resolved before plugin can be added.');
-        }
-        if (plugin_force) {
-            events.emit('warn', '--force is used. edit-config will overwrite conflicts if any. Conflicting plugins may not work as expected.');
-
-            // remove conflicting munges
-            var conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.conflictingMunge);
-            for (var conflict_file in conflict_munge.files) {
-                self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true);
-            }
-
-            // force add new munges
-            config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes);
-        } else if (isConflictingInfo.conflictFound) {
-            throw new Error('There was a conflict trying to modify attributes with <edit-config> in plugin ' + pluginInfo.id +
-            '. The conflicting plugin, ' + isConflictingInfo.conflictingPlugin + ', already modified the same attributes. The conflict must be resolved before ' +
-            pluginInfo.id + ' can be added. You may use --force to add the plugin and overwrite the conflicting attributes.');
-        } else {
-            // no conflicts, will handle edit-config
-            config_munge = self.generate_plugin_config_munge(pluginInfo, plugin_vars, edit_config_changes);
-        }
-    }
-
-    self = munge_helper(should_increment, self, platform_config, config_munge);
-
-    // Move to installed/dependent_plugins
-    self.platformJson.addPlugin(pluginInfo.id, plugin_vars || {}, is_top_level);
-    return self;
-}
-
-// Handle edit-config changes from config.xml
-PlatformMunger.prototype.add_config_changes = add_config_changes;
-function add_config_changes (config, should_increment) {
-    var self = this;
-    var platform_config = self.platformJson.root;
-
-    var config_munge;
-    var changes = [];
-
-    if (config.getEditConfigs) {
-        var edit_config_changes = config.getEditConfigs(self.platform);
-        if (edit_config_changes) {
-            changes = changes.concat(edit_config_changes);
-        }
-    }
-
-    if (config.getConfigFiles) {
-        var config_files_changes = config.getConfigFiles(self.platform);
-        if (config_files_changes) {
-            changes = changes.concat(config_files_changes);
-        }
-    }
-
-    if (changes && changes.length > 0) {
-        var isConflictingInfo = is_conflicting(changes, platform_config.config_munge, self, true /* always force overwrite other edit-config */);
-        if (isConflictingInfo.conflictFound) {
-            var conflict_munge;
-            var conflict_file;
-
-            if (Object.keys(isConflictingInfo.configxmlMunge.files).length !== 0) {
-                // silently remove conflicting config.xml munges so new munges can be added
-                conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.configxmlMunge);
-                for (conflict_file in conflict_munge.files) {
-                    self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true);
-                }
-            }
-            if (Object.keys(isConflictingInfo.conflictingMunge.files).length !== 0) {
-                events.emit('warn', 'Conflict found, edit-config changes from config.xml will overwrite plugin.xml changes');
-
-                // remove conflicting plugin.xml munges
-                conflict_munge = mungeutil.decrement_munge(platform_config.config_munge, isConflictingInfo.conflictingMunge);
-                for (conflict_file in conflict_munge.files) {
-                    self.apply_file_munge(conflict_file, conflict_munge.files[conflict_file], /* remove = */ true);
-                }
-            }
-        }
-    }
-
-    // Add config.xml edit-config and config-file munges
-    config_munge = self.generate_config_xml_munge(config, changes, 'config.xml');
-    self = munge_helper(should_increment, self, platform_config, config_munge);
-
-    // Move to installed/dependent_plugins
-    return self;
-}
-
-function munge_helper (should_increment, self, platform_config, config_munge) {
-    // global munge looks at all changes to config files
-
-    // TODO: The should_increment param is only used by cordova-cli and is going away soon.
-    // If should_increment is set to false, avoid modifying the global_munge (use clone)
-    // and apply the entire config_munge because it's already a proper subset of the global_munge.
-    var munge, global_munge;
-    if (should_increment) {
-        global_munge = platform_config.config_munge;
-        munge = mungeutil.increment_munge(global_munge, config_munge);
-    } else {
-        global_munge = mungeutil.clone_munge(platform_config.config_munge);
-        munge = config_munge;
-    }
-
-    for (var file in munge.files) {
-        self.apply_file_munge(file, munge.files[file]);
-    }
-
-    return self;
-}
-
-// Load the global munge from platform json and apply all of it.
-// Used by cordova prepare to re-generate some config file from platform
-// defaults and the global munge.
-PlatformMunger.prototype.reapply_global_munge = reapply_global_munge;
-function reapply_global_munge () {
-    var self = this;
-
-    var platform_config = self.platformJson.root;
-    var global_munge = platform_config.config_munge;
-    for (var file in global_munge.files) {
-        self.apply_file_munge(file, global_munge.files[file]);
-    }
-
-    return self;
-}
-
-// generate_plugin_config_munge
-// Generate the munge object from config.xml
-PlatformMunger.prototype.generate_config_xml_munge = generate_config_xml_munge;
-function generate_config_xml_munge (config, config_changes, type) {
-    var munge = { files: {} };
-    var id;
-
-    if (!config_changes) {
-        return munge;
-    }
-
-    if (type === 'config.xml') {
-        id = type;
-    } else {
-        id = config.id;
-    }
-
-    config_changes.forEach(function (change) {
-        change.xmls.forEach(function (xml) {
-            // 1. stringify each xml
-            var stringified = (new et.ElementTree(xml)).write({xml_declaration: false});
-            // 2. add into munge
-            if (change.mode) {
-                mungeutil.deep_add(munge, change.file, change.target, { xml: stringified, count: 1, mode: change.mode, id: id });
-            } else {
-                mungeutil.deep_add(munge, change.target, change.parent, { xml: stringified, count: 1, after: change.after });
-            }
-        });
-    });
-    return munge;
-}
-
-// generate_plugin_config_munge
-// Generate the munge object from plugin.xml + vars
-PlatformMunger.prototype.generate_plugin_config_munge = generate_plugin_config_munge;
-function generate_plugin_config_munge (pluginInfo, vars, edit_config_changes) {
-    var self = this;
-
-    vars = vars || {};
-    var munge = { files: {} };
-    var changes = pluginInfo.getConfigFiles(self.platform);
-
-    if (edit_config_changes) {
-        Array.prototype.push.apply(changes, edit_config_changes);
-    }
-
-    changes.forEach(function (change) {
-        change.xmls.forEach(function (xml) {
-            // 1. stringify each xml
-            var stringified = (new et.ElementTree(xml)).write({xml_declaration: false});
-            // interp vars
-            if (vars) {
-                Object.keys(vars).forEach(function (key) {
-                    var regExp = new RegExp('\\$' + key, 'g');
-                    stringified = stringified.replace(regExp, vars[key]);
-                });
-            }
-            // 2. add into munge
-            if (change.mode) {
-                if (change.mode !== 'remove') {
-                    mungeutil.deep_add(munge, change.file, change.target, { xml: stringified, count: 1, mode: change.mode, plugin: pluginInfo.id });
-                }
-            } else {
-                mungeutil.deep_add(munge, change.target, change.parent, { xml: stringified, count: 1, after: change.after });
-            }
-        });
-    });
-    return munge;
-}
-
-function is_conflicting (editchanges, config_munge, self, force) {
-    var files = config_munge.files;
-    var conflictFound = false;
-    var conflictWithConfigxml = false;
-    var conflictingMunge = { files: {} };
-    var configxmlMunge = { files: {} };
-    var conflictingParent;
-    var conflictingPlugin;
-
-    editchanges.forEach(function (editchange) {
-        if (files[editchange.file]) {
-            var parents = files[editchange.file].parents;
-            var target = parents[editchange.target];
-
-            // Check if the edit target will resolve to an existing target
-            if (!target || target.length === 0) {
-                var file_xml = self.config_keeper.get(self.project_dir, self.platform, editchange.file).data;
-                var resolveEditTarget = xml_helpers.resolveParent(file_xml, editchange.target);
-                var resolveTarget;
-
-                if (resolveEditTarget) {
-                    for (var parent in parents) {
-                        resolveTarget = xml_helpers.resolveParent(file_xml, parent);
-                        if (resolveEditTarget === resolveTarget) {
-                            conflictingParent = parent;
-                            target = parents[parent];
-                            break;
-                        }
-                    }
-                }
-            } else {
-                conflictingParent = editchange.target;
-            }
-
-            if (target && target.length !== 0) {
-                // conflict has been found
-                conflictFound = true;
-
-                if (editchange.id === 'config.xml') {
-                    if (target[0].id === 'config.xml') {
-                        // Keep track of config.xml/config.xml edit-config conflicts
-                        mungeutil.deep_add(configxmlMunge, editchange.file, conflictingParent, target[0]);
-                    } else {
-                        // Keep track of config.xml x plugin.xml edit-config conflicts
-                        mungeutil.deep_add(conflictingMunge, editchange.file, conflictingParent, target[0]);
-                    }
-                } else {
-                    if (target[0].id === 'config.xml') {
-                        // plugin.xml cannot overwrite config.xml changes even if --force is used
-                        conflictWithConfigxml = true;
-                        return;
-                    }
-
-                    if (force) {
-                        // Need to find all conflicts when --force is used, track conflicting munges
-                        mungeutil.deep_add(conflictingMunge, editchange.file, conflictingParent, target[0]);
-                    } else {
-                        // plugin cannot overwrite other plugin changes without --force
-                        conflictingPlugin = target[0].plugin;
-
-                    }
-                }
-            }
-        }
-    });
-
-    return {conflictFound: conflictFound,
-        conflictingPlugin: conflictingPlugin,
-        conflictingMunge: conflictingMunge,
-        configxmlMunge: configxmlMunge,
-        conflictWithConfigxml: conflictWithConfigxml};
-}
-
-// Go over the prepare queue and apply the config munges for each plugin
-// that has been (un)installed.
-PlatformMunger.prototype.process = PlatformMunger_process;
-function PlatformMunger_process (plugins_dir) {
-    var self = this;
-    var platform_config = self.platformJson.root;
-
-    // Uninstallation first
-    platform_config.prepare_queue.uninstalled.forEach(function (u) {
-        var pluginInfo = self.pluginInfoProvider.get(path.join(plugins_dir, u.plugin));
-        self.remove_plugin_changes(pluginInfo, u.topLevel);
-    });
-
-    // Now handle installation
-    platform_config.prepare_queue.installed.forEach(function (u) {
-        var pluginInfo = self.pluginInfoProvider.get(path.join(plugins_dir, u.plugin));
-        self.add_plugin_changes(pluginInfo, u.vars, u.topLevel, true, u.force);
-    });
-
-    // Empty out installed/ uninstalled queues.
-    platform_config.prepare_queue.uninstalled = [];
-    platform_config.prepare_queue.installed = [];
-}
-/** ** END of PlatformMunger ****/
diff --git a/node_modules/cordova-common/src/ConfigChanges/ConfigFile.js b/node_modules/cordova-common/src/ConfigChanges/ConfigFile.js
deleted file mode 100644
index ec4a28a..0000000
--- a/node_modules/cordova-common/src/ConfigChanges/ConfigFile.js
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-/* eslint no-control-regex: 0 */
-
-var fs = require('fs');
-var path = require('path');
-
-var modules = {};
-var addProperty = require('../util/addProperty');
-
-// Use delay loading to ensure plist and other node modules to not get loaded
-// on Android, Windows platforms
-addProperty(module, 'bplist', 'bplist-parser', modules);
-addProperty(module, 'et', 'elementtree', modules);
-addProperty(module, 'glob', 'glob', modules);
-addProperty(module, 'plist', 'plist', modules);
-addProperty(module, 'plist_helpers', '../util/plist-helpers', modules);
-addProperty(module, 'xml_helpers', '../util/xml-helpers', modules);
-
-/******************************************************************************
-* ConfigFile class
-*
-* Can load and keep various types of config files. Provides some functionality
-* specific to some file types such as grafting XML children. In most cases it
-* should be instantiated by ConfigKeeper.
-*
-* For plugin.xml files use as:
-* plugin_config = self.config_keeper.get(plugin_dir, '', 'plugin.xml');
-*
-* TODO: Consider moving it out to a separate file and maybe partially with
-* overrides in platform handlers.
-******************************************************************************/
-function ConfigFile (project_dir, platform, file_tag) {
-    this.project_dir = project_dir;
-    this.platform = platform;
-    this.file_tag = file_tag;
-    this.is_changed = false;
-
-    this.load();
-}
-
-// ConfigFile.load()
-ConfigFile.prototype.load = ConfigFile_load;
-function ConfigFile_load () {
-    var self = this;
-
-    // config file may be in a place not exactly specified in the target
-    var filepath = self.filepath = resolveConfigFilePath(self.project_dir, self.platform, self.file_tag);
-
-    if (!filepath || !fs.existsSync(filepath)) {
-        self.exists = false;
-        return;
-    }
-    self.exists = true;
-    self.mtime = fs.statSync(self.filepath).mtime;
-
-    var ext = path.extname(filepath);
-    // Windows8 uses an appxmanifest, and wp8 will likely use
-    // the same in a future release
-    if (ext === '.xml' || ext === '.appxmanifest') {
-        self.type = 'xml';
-        self.data = modules.xml_helpers.parseElementtreeSync(filepath);
-    } else {
-        // plist file
-        self.type = 'plist';
-        // TODO: isBinaryPlist() reads the file and then parse re-reads it again.
-        //       We always write out text plist, not binary.
-        //       Do we still need to support binary plist?
-        //       If yes, use plist.parseStringSync() and read the file once.
-        self.data = isBinaryPlist(filepath) ?
-            modules.bplist.parseBuffer(fs.readFileSync(filepath)) :
-            modules.plist.parse(fs.readFileSync(filepath, 'utf8'));
-    }
-}
-
-ConfigFile.prototype.save = function ConfigFile_save () {
-    var self = this;
-    if (self.type === 'xml') {
-        fs.writeFileSync(self.filepath, self.data.write({indent: 4}), 'utf-8');
-    } else {
-        // plist
-        var regExp = new RegExp('<string>[ \t\r\n]+?</string>', 'g');
-        fs.writeFileSync(self.filepath, modules.plist.build(self.data).replace(regExp, '<string></string>'));
-    }
-    self.is_changed = false;
-};
-
-ConfigFile.prototype.graft_child = function ConfigFile_graft_child (selector, xml_child) {
-    var self = this;
-    var filepath = self.filepath;
-    var result;
-    if (self.type === 'xml') {
-        var xml_to_graft = [modules.et.XML(xml_child.xml)];
-        switch (xml_child.mode) {
-        case 'merge':
-            result = modules.xml_helpers.graftXMLMerge(self.data, xml_to_graft, selector, xml_child);
-            break;
-        case 'overwrite':
-            result = modules.xml_helpers.graftXMLOverwrite(self.data, xml_to_graft, selector, xml_child);
-            break;
-        case 'remove':
-            result = modules.xml_helpers.pruneXMLRemove(self.data, selector, xml_to_graft);
-            break;
-        default:
-            result = modules.xml_helpers.graftXML(self.data, xml_to_graft, selector, xml_child.after);
-        }
-        if (!result) {
-            throw new Error('Unable to graft xml at selector "' + selector + '" from "' + filepath + '" during config install');
-        }
-    } else {
-        // plist file
-        result = modules.plist_helpers.graftPLIST(self.data, xml_child.xml, selector);
-        if (!result) {
-            throw new Error('Unable to graft plist "' + filepath + '" during config install');
-        }
-    }
-    self.is_changed = true;
-};
-
-ConfigFile.prototype.prune_child = function ConfigFile_prune_child (selector, xml_child) {
-    var self = this;
-    var filepath = self.filepath;
-    var result;
-    if (self.type === 'xml') {
-        var xml_to_graft = [modules.et.XML(xml_child.xml)];
-        switch (xml_child.mode) {
-        case 'merge':
-        case 'overwrite':
-            result = modules.xml_helpers.pruneXMLRestore(self.data, selector, xml_child);
-            break;
-        case 'remove':
-            result = modules.xml_helpers.pruneXMLRemove(self.data, selector, xml_to_graft);
-            break;
-        default:
-            result = modules.xml_helpers.pruneXML(self.data, xml_to_graft, selector);
-        }
-    } else {
-        // plist file
-        result = modules.plist_helpers.prunePLIST(self.data, xml_child.xml, selector);
-    }
-    if (!result) {
-        var err_msg = 'Pruning at selector "' + selector + '" from "' + filepath + '" went bad.';
-        throw new Error(err_msg);
-    }
-    self.is_changed = true;
-};
-
-// Some config-file target attributes are not qualified with a full leading directory, or contain wildcards.
-// Resolve to a real path in this function.
-// TODO: getIOSProjectname is slow because of glob, try to avoid calling it several times per project.
-function resolveConfigFilePath (project_dir, platform, file) {
-    var filepath = path.join(project_dir, file);
-    var matches;
-
-    if (file.indexOf('*') > -1) {
-        // handle wildcards in targets using glob.
-        matches = modules.glob.sync(path.join(project_dir, '**', file));
-        if (matches.length) filepath = matches[0];
-
-        // [CB-5989] multiple Info.plist files may exist. default to $PROJECT_NAME-Info.plist
-        if (matches.length > 1 && file.indexOf('-Info.plist') > -1) {
-            var plistName = getIOSProjectname(project_dir) + '-Info.plist';
-            for (var i = 0; i < matches.length; i++) {
-                if (matches[i].indexOf(plistName) > -1) {
-                    filepath = matches[i];
-                    break;
-                }
-            }
-        }
-        return filepath;
-    }
-
-    // XXX this checks for android studio projects
-    // only if none of the options above are satisfied does this get called
-    // TODO: Move this out of cordova-common and into the platforms somehow
-    if (platform === 'android' && !fs.existsSync(filepath)) {
-        if (file === 'AndroidManifest.xml') {
-            filepath = path.join(project_dir, 'app', 'src', 'main', 'AndroidManifest.xml');
-        } else if (file.endsWith('config.xml')) {
-            filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'xml', 'config.xml');
-        } else if (file.endsWith('strings.xml')) {
-            // Plugins really shouldn't mess with strings.xml, since it's able to be localized
-            filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'values', 'strings.xml');
-        } else if (file.match(/res\/xml/)) {
-            // Catch-all for all other stored XML configuration in legacy plugins
-            var config_file = path.basename(file);
-            filepath = path.join(project_dir, 'app', 'src', 'main', 'res', 'xml', config_file);
-        }
-        return filepath;
-    }
-
-    // special-case config.xml target that is just "config.xml" for other platforms. This should
-    // be resolved to the real location of the file.
-    // TODO: Move this out of cordova-common into platforms
-    if (file === 'config.xml') {
-        if (platform === 'ubuntu') {
-            filepath = path.join(project_dir, 'config.xml');
-        } else if (platform === 'ios') {
-            var iospath = module.exports.getIOSProjectname(project_dir);
-            filepath = path.join(project_dir, iospath, 'config.xml');
-        } else {
-            matches = modules.glob.sync(path.join(project_dir, '**', 'config.xml'));
-            if (matches.length) filepath = matches[0];
-        }
-        return filepath;
-    }
-
-    // None of the special cases matched, returning project_dir/file.
-    return filepath;
-}
-
-// Find out the real name of an iOS project
-// TODO: glob is slow, need a better way or caching, or avoid using more than once.
-function getIOSProjectname (project_dir) {
-    var matches = modules.glob.sync(path.join(project_dir, '*.xcodeproj'));
-    var iospath;
-    if (matches.length === 1) {
-        iospath = path.basename(matches[0], '.xcodeproj');
-    } else {
-        var msg;
-        if (matches.length === 0) {
-            msg = 'Does not appear to be an xcode project, no xcode project file in ' + project_dir;
-        } else {
-            msg = 'There are multiple *.xcodeproj dirs in ' + project_dir;
-        }
-        throw new Error(msg);
-    }
-    return iospath;
-}
-
-// determine if a plist file is binary
-function isBinaryPlist (filename) {
-    // I wish there was a synchronous way to read only the first 6 bytes of a
-    // file. This is wasteful :/
-    var buf = '' + fs.readFileSync(filename, 'utf8');
-    // binary plists start with a magic header, "bplist"
-    return buf.substring(0, 6) === 'bplist';
-}
-
-module.exports = ConfigFile;
-module.exports.isBinaryPlist = isBinaryPlist;
-module.exports.getIOSProjectname = getIOSProjectname;
-module.exports.resolveConfigFilePath = resolveConfigFilePath;
diff --git a/node_modules/cordova-common/src/ConfigChanges/ConfigKeeper.js b/node_modules/cordova-common/src/ConfigChanges/ConfigKeeper.js
deleted file mode 100644
index 0ef0435..0000000
--- a/node_modules/cordova-common/src/ConfigChanges/ConfigKeeper.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-/* jshint sub:true */
-
-var path = require('path');
-var ConfigFile = require('./ConfigFile');
-
-/******************************************************************************
-* ConfigKeeper class
-*
-* Used to load and store config files to avoid re-parsing and writing them out
-* multiple times.
-*
-* The config files are referred to by a fake path constructed as
-* project_dir/platform/file
-* where file is the name used for the file in config munges.
-******************************************************************************/
-function ConfigKeeper (project_dir, plugins_dir) {
-    this.project_dir = project_dir;
-    this.plugins_dir = plugins_dir;
-    this._cached = {};
-}
-
-ConfigKeeper.prototype.get = function ConfigKeeper_get (project_dir, platform, file) {
-    var self = this;
-
-    // This fixes a bug with older plugins - when specifying config xml instead of res/xml/config.xml
-    // https://issues.apache.org/jira/browse/CB-6414
-    if (file === 'config.xml' && platform === 'android') {
-        file = 'res/xml/config.xml';
-    }
-    var fake_path = path.join(project_dir, platform, file);
-
-    if (self._cached[fake_path]) {
-        return self._cached[fake_path];
-    }
-    // File was not cached, need to load.
-    var config_file = new ConfigFile(project_dir, platform, file);
-    self._cached[fake_path] = config_file;
-    return config_file;
-};
-
-ConfigKeeper.prototype.save_all = function ConfigKeeper_save_all () {
-    var self = this;
-    Object.keys(self._cached).forEach(function (fake_path) {
-        var config_file = self._cached[fake_path];
-        if (config_file.is_changed) config_file.save();
-    });
-};
-
-module.exports = ConfigKeeper;
diff --git a/node_modules/cordova-common/src/ConfigChanges/munge-util.js b/node_modules/cordova-common/src/ConfigChanges/munge-util.js
deleted file mode 100644
index 62648d8..0000000
--- a/node_modules/cordova-common/src/ConfigChanges/munge-util.js
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-/* jshint sub:true  */
-
-var _ = require('underscore');
-
-// add the count of [key1][key2]...[keyN] to obj
-// return true if it didn't exist before
-exports.deep_add = function deep_add (obj, keys /* or key1, key2 .... */) {
-    if (!Array.isArray(keys)) {
-        keys = Array.prototype.slice.call(arguments, 1);
-    }
-
-    return exports.process_munge(obj, true/* createParents */, function (parentArray, k) {
-        var found = _.find(parentArray, function (element) {
-            return element.xml === k.xml;
-        });
-        if (found) {
-            found.after = found.after || k.after;
-            found.count += k.count;
-        } else {
-            parentArray.push(k);
-        }
-        return !found;
-    }, keys);
-};
-
-// decrement the count of [key1][key2]...[keyN] from obj and remove if it reaches 0
-// return true if it was removed or not found
-exports.deep_remove = function deep_remove (obj, keys /* or key1, key2 .... */) {
-    if (!Array.isArray(keys)) {
-        keys = Array.prototype.slice.call(arguments, 1);
-    }
-
-    var result = exports.process_munge(obj, false/* createParents */, function (parentArray, k) {
-        var index = -1;
-        var found = _.find(parentArray, function (element) {
-            index++;
-            return element.xml === k.xml;
-        });
-        if (found) {
-            if (parentArray[index].oldAttrib) {
-                k.oldAttrib = _.extend({}, parentArray[index].oldAttrib);
-            }
-            found.count -= k.count;
-            if (found.count > 0) {
-                return false;
-            } else {
-                parentArray.splice(index, 1);
-            }
-        }
-        return undefined;
-    }, keys);
-
-    return typeof result === 'undefined' ? true : result;
-};
-
-// search for [key1][key2]...[keyN]
-// return the object or undefined if not found
-exports.deep_find = function deep_find (obj, keys /* or key1, key2 .... */) {
-    if (!Array.isArray(keys)) {
-        keys = Array.prototype.slice.call(arguments, 1);
-    }
-
-    return exports.process_munge(obj, false/* createParents? */, function (parentArray, k) {
-        return _.find(parentArray, function (element) {
-            return element.xml === (k.xml || k);
-        });
-    }, keys);
-};
-
-// Execute func passing it the parent array and the xmlChild key.
-// When createParents is true, add the file and parent items  they are missing
-// When createParents is false, stop and return undefined if the file and/or parent items are missing
-
-exports.process_munge = function process_munge (obj, createParents, func, keys /* or key1, key2 .... */) {
-    if (!Array.isArray(keys)) {
-        keys = Array.prototype.slice.call(arguments, 1);
-    }
-    var k = keys[0];
-    if (keys.length === 1) {
-        return func(obj, k);
-    } else if (keys.length === 2) {
-        if (!obj.parents[k] && !createParents) {
-            return undefined;
-        }
-        obj.parents[k] = obj.parents[k] || [];
-        return exports.process_munge(obj.parents[k], createParents, func, keys.slice(1));
-    } else if (keys.length === 3) {
-        if (!obj.files[k] && !createParents) {
-            return undefined;
-        }
-        obj.files[k] = obj.files[k] || { parents: {} };
-        return exports.process_munge(obj.files[k], createParents, func, keys.slice(1));
-    } else {
-        throw new Error('Invalid key format. Must contain at most 3 elements (file, parent, xmlChild).');
-    }
-};
-
-// All values from munge are added to base as
-// base[file][selector][child] += munge[file][selector][child]
-// Returns a munge object containing values that exist in munge
-// but not in base.
-exports.increment_munge = function increment_munge (base, munge) {
-    var diff = { files: {} };
-
-    for (var file in munge.files) {
-        for (var selector in munge.files[file].parents) {
-            for (var xml_child in munge.files[file].parents[selector]) {
-                var val = munge.files[file].parents[selector][xml_child];
-                // if node not in base, add it to diff and base
-                // else increment it's value in base without adding to diff
-                var newlyAdded = exports.deep_add(base, [file, selector, val]);
-                if (newlyAdded) {
-                    exports.deep_add(diff, file, selector, val);
-                }
-            }
-        }
-    }
-    return diff;
-};
-
-// Update the base munge object as
-// base[file][selector][child] -= munge[file][selector][child]
-// nodes that reached zero value are removed from base and added to the returned munge
-// object.
-exports.decrement_munge = function decrement_munge (base, munge) {
-    var zeroed = { files: {} };
-
-    for (var file in munge.files) {
-        for (var selector in munge.files[file].parents) {
-            for (var xml_child in munge.files[file].parents[selector]) {
-                var val = munge.files[file].parents[selector][xml_child];
-                // if node not in base, add it to diff and base
-                // else increment it's value in base without adding to diff
-                var removed = exports.deep_remove(base, [file, selector, val]);
-                if (removed) {
-                    exports.deep_add(zeroed, file, selector, val);
-                }
-            }
-        }
-    }
-    return zeroed;
-};
-
-// For better readability where used
-exports.clone_munge = function clone_munge (munge) {
-    return exports.increment_munge({}, munge);
-};
diff --git a/node_modules/cordova-common/src/ConfigParser/ConfigParser.js b/node_modules/cordova-common/src/ConfigParser/ConfigParser.js
deleted file mode 100644
index 095ccf2..0000000
--- a/node_modules/cordova-common/src/ConfigParser/ConfigParser.js
+++ /dev/null
@@ -1,615 +0,0 @@
-/**
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*/
-
-var et = require('elementtree');
-var xml = require('../util/xml-helpers');
-var CordovaError = require('../CordovaError/CordovaError');
-var fs = require('fs');
-var events = require('../events');
-
-/** Wraps a config.xml file */
-function ConfigParser (path) {
-    this.path = path;
-    try {
-        this.doc = xml.parseElementtreeSync(path);
-        this.cdvNamespacePrefix = getCordovaNamespacePrefix(this.doc);
-        et.register_namespace(this.cdvNamespacePrefix, 'http://cordova.apache.org/ns/1.0');
-    } catch (e) {
-        events.emit('error', 'Parsing ' + path + ' failed');
-        throw e;
-    }
-    var r = this.doc.getroot();
-    if (r.tag !== 'widget') {
-        throw new CordovaError(path + ' has incorrect root node name (expected "widget", was "' + r.tag + '")');
-    }
-}
-
-function getNodeTextSafe (el) {
-    return el && el.text && el.text.trim();
-}
-
-function findOrCreate (doc, name) {
-    var ret = doc.find(name);
-    if (!ret) {
-        ret = new et.Element(name);
-        doc.getroot().append(ret);
-    }
-    return ret;
-}
-
-function getCordovaNamespacePrefix (doc) {
-    var rootAtribs = Object.getOwnPropertyNames(doc.getroot().attrib);
-    var prefix = 'cdv';
-    for (var j = 0; j < rootAtribs.length; j++) {
-        if (rootAtribs[j].indexOf('xmlns:') === 0 &&
-            doc.getroot().attrib[rootAtribs[j]] === 'http://cordova.apache.org/ns/1.0') {
-            var strings = rootAtribs[j].split(':');
-            prefix = strings[1];
-            break;
-        }
-    }
-    return prefix;
-}
-
-/**
- * Finds the value of an element's attribute
- * @param  {String} attributeName Name of the attribute to search for
- * @param  {Array}  elems         An array of ElementTree nodes
- * @return {String}
- */
-function findElementAttributeValue (attributeName, elems) {
-
-    elems = Array.isArray(elems) ? elems : [ elems ];
-
-    var value = elems.filter(function (elem) {
-        return elem.attrib.name.toLowerCase() === attributeName.toLowerCase();
-    }).map(function (filteredElems) {
-        return filteredElems.attrib.value;
-    }).pop();
-
-    return value || '';
-}
-
-ConfigParser.prototype = {
-    getAttribute: function (attr) {
-        return this.doc.getroot().attrib[attr];
-    },
-
-    packageName: function (id) {
-        return this.getAttribute('id');
-    },
-    setPackageName: function (id) {
-        this.doc.getroot().attrib['id'] = id;
-    },
-    android_packageName: function () {
-        return this.getAttribute('android-packageName');
-    },
-    android_activityName: function () {
-        return this.getAttribute('android-activityName');
-    },
-    ios_CFBundleIdentifier: function () {
-        return this.getAttribute('ios-CFBundleIdentifier');
-    },
-    name: function () {
-        return getNodeTextSafe(this.doc.find('name'));
-    },
-    setName: function (name) {
-        var el = findOrCreate(this.doc, 'name');
-        el.text = name;
-    },
-    shortName: function () {
-        return this.doc.find('name').attrib['short'] || this.name();
-    },
-    setShortName: function (shortname) {
-        var el = findOrCreate(this.doc, 'name');
-        if (!el.text) {
-            el.text = shortname;
-        }
-        el.attrib['short'] = shortname;
-    },
-    description: function () {
-        return getNodeTextSafe(this.doc.find('description'));
-    },
-    setDescription: function (text) {
-        var el = findOrCreate(this.doc, 'description');
-        el.text = text;
-    },
-    version: function () {
-        return this.getAttribute('version');
-    },
-    windows_packageVersion: function () {
-        return this.getAttribute('windows-packageVersion');
-    },
-    android_versionCode: function () {
-        return this.getAttribute('android-versionCode');
-    },
-    ios_CFBundleVersion: function () {
-        return this.getAttribute('ios-CFBundleVersion');
-    },
-    setVersion: function (value) {
-        this.doc.getroot().attrib['version'] = value;
-    },
-    author: function () {
-        return getNodeTextSafe(this.doc.find('author'));
-    },
-    getGlobalPreference: function (name) {
-        return findElementAttributeValue(name, this.doc.findall('preference'));
-    },
-    setGlobalPreference: function (name, value) {
-        var pref = this.doc.find('preference[@name="' + name + '"]');
-        if (!pref) {
-            pref = new et.Element('preference');
-            pref.attrib.name = name;
-            this.doc.getroot().append(pref);
-        }
-        pref.attrib.value = value;
-    },
-    getPlatformPreference: function (name, platform) {
-        return findElementAttributeValue(name, this.doc.findall('platform[@name=\'' + platform + '\']/preference'));
-    },
-    getPreference: function (name, platform) {
-
-        var platformPreference = '';
-
-        if (platform) {
-            platformPreference = this.getPlatformPreference(name, platform);
-        }
-
-        return platformPreference || this.getGlobalPreference(name);
-
-    },
-    /**
-     * Returns all resources for the platform specified.
-     * @param  {String} platform     The platform.
-     * @param {string}  resourceName Type of static resources to return.
-     *                               "icon" and "splash" currently supported.
-     * @return {Array}               Resources for the platform specified.
-     */
-    getStaticResources: function (platform, resourceName) {
-        var ret = [];
-        var staticResources = [];
-        if (platform) { // platform specific icons
-            this.doc.findall('platform[@name=\'' + platform + '\']/' + resourceName).forEach(function (elt) {
-                elt.platform = platform; // mark as platform specific resource
-                staticResources.push(elt);
-            });
-        }
-        // root level resources
-        staticResources = staticResources.concat(this.doc.findall(resourceName));
-        // parse resource elements
-        var that = this;
-        staticResources.forEach(function (elt) {
-            var res = {};
-            res.src = elt.attrib.src;
-            res.target = elt.attrib.target || undefined;
-            res.density = elt.attrib['density'] || elt.attrib[that.cdvNamespacePrefix + ':density'] || elt.attrib['gap:density'];
-            res.platform = elt.platform || null; // null means icon represents default icon (shared between platforms)
-            res.width = +elt.attrib.width || undefined;
-            res.height = +elt.attrib.height || undefined;
-
-            // default icon
-            if (!res.width && !res.height && !res.density) {
-                ret.defaultResource = res;
-            }
-            ret.push(res);
-        });
-
-        /**
-         * Returns resource with specified width and/or height.
-         * @param  {number} width Width of resource.
-         * @param  {number} height Height of resource.
-         * @return {Resource} Resource object or null if not found.
-         */
-        ret.getBySize = function (width, height) {
-            return ret.filter(function (res) {
-                if (!res.width && !res.height) {
-                    return false;
-                }
-                return ((!res.width || (width === res.width)) &&
-                    (!res.height || (height === res.height)));
-            })[0] || null;
-        };
-
-        /**
-         * Returns resource with specified density.
-         * @param  {string} density Density of resource.
-         * @return {Resource}       Resource object or null if not found.
-         */
-        ret.getByDensity = function (density) {
-            return ret.filter(function (res) {
-                return res.density === density;
-            })[0] || null;
-        };
-
-        /** Returns default icons */
-        ret.getDefault = function () {
-            return ret.defaultResource;
-        };
-
-        return ret;
-    },
-
-    /**
-     * Returns all icons for specific platform.
-     * @param  {string} platform Platform name
-     * @return {Resource[]}      Array of icon objects.
-     */
-    getIcons: function (platform) {
-        return this.getStaticResources(platform, 'icon');
-    },
-
-    /**
-     * Returns all splash images for specific platform.
-     * @param  {string} platform Platform name
-     * @return {Resource[]}      Array of Splash objects.
-     */
-    getSplashScreens: function (platform) {
-        return this.getStaticResources(platform, 'splash');
-    },
-
-    /**
-     * Returns all resource-files for a specific platform.
-     * @param  {string} platform Platform name
-     * @param  {boolean} includeGlobal Whether to return resource-files at the
-     *                                 root level.
-     * @return {Resource[]}      Array of resource file objects.
-     */
-    getFileResources: function (platform, includeGlobal) {
-        var fileResources = [];
-
-        if (platform) { // platform specific resources
-            fileResources = this.doc.findall('platform[@name=\'' + platform + '\']/resource-file').map(function (tag) {
-                return {
-                    platform: platform,
-                    src: tag.attrib.src,
-                    target: tag.attrib.target,
-                    versions: tag.attrib.versions,
-                    deviceTarget: tag.attrib['device-target'],
-                    arch: tag.attrib.arch
-                };
-            });
-        }
-
-        if (includeGlobal) {
-            this.doc.findall('resource-file').forEach(function (tag) {
-                fileResources.push({
-                    platform: platform || null,
-                    src: tag.attrib.src,
-                    target: tag.attrib.target,
-                    versions: tag.attrib.versions,
-                    deviceTarget: tag.attrib['device-target'],
-                    arch: tag.attrib.arch
-                });
-            });
-        }
-
-        return fileResources;
-    },
-
-    /**
-     * Returns all hook scripts for the hook type specified.
-     * @param  {String} hook     The hook type.
-     * @param {Array}  platforms Platforms to look for scripts into (root scripts will be included as well).
-     * @return {Array}               Script elements.
-     */
-    getHookScripts: function (hook, platforms) {
-        var self = this;
-        var scriptElements = self.doc.findall('./hook');
-
-        if (platforms) {
-            platforms.forEach(function (platform) {
-                scriptElements = scriptElements.concat(self.doc.findall('./platform[@name="' + platform + '"]/hook'));
-            });
-        }
-
-        function filterScriptByHookType (el) {
-            return el.attrib.src && el.attrib.type && el.attrib.type.toLowerCase() === hook;
-        }
-
-        return scriptElements.filter(filterScriptByHookType);
-    },
-    /**
-    * Returns a list of plugin (IDs).
-    *
-    * This function also returns any plugin's that
-    * were defined using the legacy <feature> tags.
-    * @return {string[]} Array of plugin IDs
-    */
-    getPluginIdList: function () {
-        var plugins = this.doc.findall('plugin');
-        var result = plugins.map(function (plugin) {
-            return plugin.attrib.name;
-        });
-        var features = this.doc.findall('feature');
-        features.forEach(function (element) {
-            var idTag = element.find('./param[@name="id"]');
-            if (idTag) {
-                result.push(idTag.attrib.value);
-            }
-        });
-        return result;
-    },
-    getPlugins: function () {
-        return this.getPluginIdList().map(function (pluginId) {
-            return this.getPlugin(pluginId);
-        }, this);
-    },
-    /**
-     * Adds a plugin element. Does not check for duplicates.
-     * @name addPlugin
-     * @function
-     * @param {object} attributes name and spec are supported
-     * @param {Array|object} variables name, value or arbitary object
-     */
-    addPlugin: function (attributes, variables) {
-        if (!attributes && !attributes.name) return;
-        var el = new et.Element('plugin');
-        el.attrib.name = attributes.name;
-        if (attributes.spec) {
-            el.attrib.spec = attributes.spec;
-        }
-
-        // support arbitrary object as variables source
-        if (variables && typeof variables === 'object' && !Array.isArray(variables)) {
-            variables = Object.keys(variables)
-                .map(function (variableName) {
-                    return {name: variableName, value: variables[variableName]};
-                });
-        }
-
-        if (variables) {
-            variables.forEach(function (variable) {
-                el.append(new et.Element('variable', { name: variable.name, value: variable.value }));
-            });
-        }
-        this.doc.getroot().append(el);
-    },
-    /**
-     * Retrives the plugin with the given id or null if not found.
-     *
-     * This function also returns any plugin's that
-     * were defined using the legacy <feature> tags.
-     * @name getPlugin
-     * @function
-     * @param {String} id
-     * @returns {object} plugin including any variables
-     */
-    getPlugin: function (id) {
-        if (!id) {
-            return undefined;
-        }
-        var pluginElement = this.doc.find('./plugin/[@name="' + id + '"]');
-        if (pluginElement === null) {
-            var legacyFeature = this.doc.find('./feature/param[@name="id"][@value="' + id + '"]/..');
-            if (legacyFeature) {
-                events.emit('log', 'Found deprecated feature entry for ' + id + ' in config.xml.');
-                return featureToPlugin(legacyFeature);
-            }
-            return undefined;
-        }
-        var plugin = {};
-
-        plugin.name = pluginElement.attrib.name;
-        plugin.spec = pluginElement.attrib.spec || pluginElement.attrib.src || pluginElement.attrib.version;
-        plugin.variables = {};
-        var variableElements = pluginElement.findall('variable');
-        variableElements.forEach(function (varElement) {
-            var name = varElement.attrib.name;
-            var value = varElement.attrib.value;
-            if (name) {
-                plugin.variables[name] = value;
-            }
-        });
-        return plugin;
-    },
-    /**
-     * Remove the plugin entry with give name (id).
-     *
-     * This function also operates on any plugin's that
-     * were defined using the legacy <feature> tags.
-     * @name removePlugin
-     * @function
-     * @param id name of the plugin
-     */
-    removePlugin: function (id) {
-        if (id) {
-            var plugins = this.doc.findall('./plugin/[@name="' + id + '"]')
-                .concat(this.doc.findall('./feature/param[@name="id"][@value="' + id + '"]/..'));
-            var children = this.doc.getroot().getchildren();
-            plugins.forEach(function (plugin) {
-                var idx = children.indexOf(plugin);
-                if (idx > -1) {
-                    children.splice(idx, 1);
-                }
-            });
-        }
-    },
-
-    // Add any element to the root
-    addElement: function (name, attributes) {
-        var el = et.Element(name);
-        for (var a in attributes) {
-            el.attrib[a] = attributes[a];
-        }
-        this.doc.getroot().append(el);
-    },
-
-    /**
-     * Adds an engine. Does not check for duplicates.
-     * @param  {String} name the engine name
-     * @param  {String} spec engine source location or version (optional)
-     */
-    addEngine: function (name, spec) {
-        if (!name) return;
-        var el = et.Element('engine');
-        el.attrib.name = name;
-        if (spec) {
-            el.attrib.spec = spec;
-        }
-        this.doc.getroot().append(el);
-    },
-    /**
-     * Removes all the engines with given name
-     * @param  {String} name the engine name.
-     */
-    removeEngine: function (name) {
-        var engines = this.doc.findall('./engine/[@name="' + name + '"]');
-        for (var i = 0; i < engines.length; i++) {
-            var children = this.doc.getroot().getchildren();
-            var idx = children.indexOf(engines[i]);
-            if (idx > -1) {
-                children.splice(idx, 1);
-            }
-        }
-    },
-    getEngines: function () {
-        var engines = this.doc.findall('./engine');
-        return engines.map(function (engine) {
-            var spec = engine.attrib.spec || engine.attrib.version;
-            return {
-                'name': engine.attrib.name,
-                'spec': spec || null
-            };
-        });
-    },
-    /* Get all the access tags */
-    getAccesses: function () {
-        var accesses = this.doc.findall('./access');
-        return accesses.map(function (access) {
-            var minimum_tls_version = access.attrib['minimum-tls-version']; /* String */
-            var requires_forward_secrecy = access.attrib['requires-forward-secrecy']; /* Boolean */
-            var requires_certificate_transparency = access.attrib['requires-certificate-transparency']; /* Boolean */
-            var allows_arbitrary_loads_in_web_content = access.attrib['allows-arbitrary-loads-in-web-content']; /* Boolean */
-            var allows_arbitrary_loads_in_media = access.attrib['allows-arbitrary-loads-in-media']; /* Boolean (DEPRECATED) */
-            var allows_arbitrary_loads_for_media = access.attrib['allows-arbitrary-loads-for-media']; /* Boolean */
-            var allows_local_networking = access.attrib['allows-local-networking']; /* Boolean */
-
-            return {
-                'origin': access.attrib.origin,
-                'minimum_tls_version': minimum_tls_version,
-                'requires_forward_secrecy': requires_forward_secrecy,
-                'requires_certificate_transparency': requires_certificate_transparency,
-                'allows_arbitrary_loads_in_web_content': allows_arbitrary_loads_in_web_content,
-                'allows_arbitrary_loads_in_media': allows_arbitrary_loads_in_media,
-                'allows_arbitrary_loads_for_media': allows_arbitrary_loads_for_media,
-                'allows_local_networking': allows_local_networking
-            };
-        });
-    },
-    /* Get all the allow-navigation tags */
-    getAllowNavigations: function () {
-        var allow_navigations = this.doc.findall('./allow-navigation');
-        return allow_navigations.map(function (allow_navigation) {
-            var minimum_tls_version = allow_navigation.attrib['minimum-tls-version']; /* String */
-            var requires_forward_secrecy = allow_navigation.attrib['requires-forward-secrecy']; /* Boolean */
-            var requires_certificate_transparency = allow_navigation.attrib['requires-certificate-transparency']; /* Boolean */
-
-            return {
-                'href': allow_navigation.attrib.href,
-                'minimum_tls_version': minimum_tls_version,
-                'requires_forward_secrecy': requires_forward_secrecy,
-                'requires_certificate_transparency': requires_certificate_transparency
-            };
-        });
-    },
-    /* Get all the allow-intent tags */
-    getAllowIntents: function () {
-        var allow_intents = this.doc.findall('./allow-intent');
-        return allow_intents.map(function (allow_intent) {
-            return {
-                'href': allow_intent.attrib.href
-            };
-        });
-    },
-    /* Get all edit-config tags */
-    getEditConfigs: function (platform) {
-        var platform_tag = this.doc.find('./platform[@name="' + platform + '"]');
-        var platform_edit_configs = platform_tag ? platform_tag.findall('edit-config') : [];
-
-        var edit_configs = this.doc.findall('edit-config').concat(platform_edit_configs);
-
-        return edit_configs.map(function (tag) {
-            var editConfig =
-                {
-                    file: tag.attrib['file'],
-                    target: tag.attrib['target'],
-                    mode: tag.attrib['mode'],
-                    id: 'config.xml',
-                    xmls: tag.getchildren()
-                };
-            return editConfig;
-        });
-    },
-
-    /* Get all config-file tags */
-    getConfigFiles: function (platform) {
-        var platform_tag = this.doc.find('./platform[@name="' + platform + '"]');
-        var platform_config_files = platform_tag ? platform_tag.findall('config-file') : [];
-
-        var config_files = this.doc.findall('config-file').concat(platform_config_files);
-
-        return config_files.map(function (tag) {
-            var configFile =
-                {
-                    target: tag.attrib['target'],
-                    parent: tag.attrib['parent'],
-                    after: tag.attrib['after'],
-                    xmls: tag.getchildren(),
-                    // To support demuxing via versions
-                    versions: tag.attrib['versions'],
-                    deviceTarget: tag.attrib['device-target']
-                };
-            return configFile;
-        });
-    },
-
-    write: function () {
-        fs.writeFileSync(this.path, this.doc.write({indent: 4}), 'utf-8');
-    }
-};
-
-function featureToPlugin (featureElement) {
-    var plugin = {};
-    plugin.variables = [];
-    var pluginVersion,
-        pluginSrc;
-
-    var nodes = featureElement.findall('param');
-    nodes.forEach(function (element) {
-        var n = element.attrib.name;
-        var v = element.attrib.value;
-        if (n === 'id') {
-            plugin.name = v;
-        } else if (n === 'version') {
-            pluginVersion = v;
-        } else if (n === 'url' || n === 'installPath') {
-            pluginSrc = v;
-        } else {
-            plugin.variables[n] = v;
-        }
-    });
-
-    var spec = pluginSrc || pluginVersion;
-    if (spec) {
-        plugin.spec = spec;
-    }
-
-    return plugin;
-}
-module.exports = ConfigParser;
diff --git a/node_modules/cordova-common/src/ConfigParser/README.md b/node_modules/cordova-common/src/ConfigParser/README.md
deleted file mode 100644
index e5cd1bf..0000000
--- a/node_modules/cordova-common/src/ConfigParser/README.md
+++ /dev/null
@@ -1,86 +0,0 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#  KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
--->
-
-# Cordova-Lib
-
-## ConfigParser
-
-wraps a valid cordova config.xml file 
-
-### Usage
-
-### Include the ConfigParser module in a projet
-
-    var ConfigParser = require('cordova-lib').configparser;
-
-### Create a new ConfigParser
-
-    var config = new ConfigParser('path/to/config/xml/');
-    
-### Utility Functions
-
-#### packageName(id)
-returns document root 'id' attribute value
-#### Usage
-
-    config.packageName: function(id) 
-
-/*
- * sets document root element 'id' attribute to @id
- *
- * @id - new id value
- *
- */
-#### setPackageName(id)
-set document root 'id' attribute to 
- function(id) {
-        this.doc.getroot().attrib['id'] = id;
-    },
-
-### 
-    name: function() {
-        return getNodeTextSafe(this.doc.find('name'));
-    },
-    setName: function(name) {
-        var el = findOrCreate(this.doc, 'name');
-        el.text = name;
-    },
-
-### read the description element
-    
-    config.description()
-
-    var text = "New and improved description of App"
-    setDescription(text)
-    
-### version management
-    version()
-    android_versionCode()
-    ios_CFBundleVersion()
-    setVersion()
-    
-### read author element
-
-   config.author();
-
-### read preference
-
-    config.getPreference(name);
diff --git a/node_modules/cordova-common/src/CordovaCheck.js b/node_modules/cordova-common/src/CordovaCheck.js
deleted file mode 100644
index 28f629d..0000000
--- a/node_modules/cordova-common/src/CordovaCheck.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*/
-
-var fs = require('fs');
-var path = require('path');
-
-function isRootDir (dir) {
-    if (fs.existsSync(path.join(dir, 'www'))) {
-        if (fs.existsSync(path.join(dir, 'config.xml'))) {
-            // For sure is.
-            if (fs.existsSync(path.join(dir, 'platforms'))) {
-                return 2;
-            } else {
-                return 1;
-            }
-        }
-        // Might be (or may be under platforms/).
-        if (fs.existsSync(path.join(dir, 'www', 'config.xml'))) {
-            return 1;
-        }
-    }
-    return 0;
-}
-
-// Runs up the directory chain looking for a .cordova directory.
-// IF it is found we are in a Cordova project.
-// Omit argument to use CWD.
-function isCordova (dir) {
-    if (!dir) {
-        // Prefer PWD over cwd so that symlinked dirs within your PWD work correctly (CB-5687).
-        var pwd = process.env.PWD;
-        var cwd = process.cwd();
-        if (pwd && pwd !== cwd && pwd !== 'undefined') {
-            return isCordova(pwd) || isCordova(cwd);
-        }
-        return isCordova(cwd);
-    }
-    var bestReturnValueSoFar = false;
-    for (var i = 0; i < 1000; ++i) {
-        var result = isRootDir(dir);
-        if (result === 2) {
-            return dir;
-        }
-        if (result === 1) {
-            bestReturnValueSoFar = dir;
-        }
-        var parentDir = path.normalize(path.join(dir, '..'));
-        // Detect fs root.
-        if (parentDir === dir) {
-            return bestReturnValueSoFar;
-        }
-        dir = parentDir;
-    }
-    console.error('Hit an unhandled case in CordovaCheck.isCordova');
-    return false;
-}
-
-module.exports = {
-    findProjectRoot: isCordova
-};
diff --git a/node_modules/cordova-common/src/CordovaError/CordovaError.js b/node_modules/cordova-common/src/CordovaError/CordovaError.js
deleted file mode 100644
index 24de6af..0000000
--- a/node_modules/cordova-common/src/CordovaError/CordovaError.js
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*/
-
-/* eslint no-proto: 0 */
-
-var EOL = require('os').EOL;
-
-/**
- * A derived exception class. See usage example in cli.js
- * Based on:
- * stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/8460753#8460753
- * @param {String} message Error message
- * @param {Number} [code=0] Error code
- * @param {CordovaExternalToolErrorContext} [context] External tool error context object
- * @constructor
- */
-function CordovaError (message, code, context) {
-    Error.captureStackTrace(this, this.constructor);
-    this.name = this.constructor.name;
-    this.message = message;
-    this.code = code || CordovaError.UNKNOWN_ERROR;
-    this.context = context;
-}
-CordovaError.prototype.__proto__ = Error.prototype;
-
-// TODO: Extend error codes according the projects specifics
-CordovaError.UNKNOWN_ERROR = 0;
-CordovaError.EXTERNAL_TOOL_ERROR = 1;
-
-/**
- * Translates instance's error code number into error code name, e.g. 0 -> UNKNOWN_ERROR
- * @returns {string} Error code string name
- */
-CordovaError.prototype.getErrorCodeName = function () {
-    for (var key in CordovaError) {
-        if (CordovaError.hasOwnProperty(key)) {
-            if (CordovaError[key] === this.code) {
-                return key;
-            }
-        }
-    }
-};
-
-/**
- * Converts CordovaError instance to string representation
- * @param   {Boolean}  [isVerbose]  Set up verbose mode. Used to provide more
- *   details including information about error code name and context
- * @return  {String}              Stringified error representation
- */
-CordovaError.prototype.toString = function (isVerbose) {
-    var message = '';
-    var codePrefix = '';
-
-    if (this.code !== CordovaError.UNKNOWN_ERROR) {
-        codePrefix = 'code: ' + this.code + (isVerbose ? (' (' + this.getErrorCodeName() + ')') : '') + ' ';
-    }
-
-    if (this.code === CordovaError.EXTERNAL_TOOL_ERROR) {
-        if (typeof this.context !== 'undefined') {
-            if (isVerbose) {
-                message = codePrefix + EOL + this.context.toString(isVerbose) + '\n failed with an error: ' +
-                    this.message + EOL + 'Stack trace: ' + this.stack;
-            } else {
-                message = codePrefix + '\'' + this.context.toString(isVerbose) + '\' ' + this.message;
-            }
-        } else {
-            message = 'External tool failed with an error: ' + this.message;
-        }
-    } else {
-        message = isVerbose ? codePrefix + this.stack : codePrefix + this.message;
-    }
-
-    return message;
-};
-
-module.exports = CordovaError;
diff --git a/node_modules/cordova-common/src/CordovaError/CordovaExternalToolErrorContext.js b/node_modules/cordova-common/src/CordovaError/CordovaExternalToolErrorContext.js
deleted file mode 100644
index 30699b4..0000000
--- a/node_modules/cordova-common/src/CordovaError/CordovaExternalToolErrorContext.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-/* jshint proto:true */
-
-var path = require('path');
-
-/**
- * @param {String} cmd Command full path
- * @param {String[]} args Command args
- * @param {String} [cwd] Command working directory
- * @constructor
- */
-function CordovaExternalToolErrorContext (cmd, args, cwd) {
-    this.cmd = cmd;
-    // Helper field for readability
-    this.cmdShortName = path.basename(cmd);
-    this.args = args;
-    this.cwd = cwd;
-}
-
-CordovaExternalToolErrorContext.prototype.toString = function (isVerbose) {
-    if (isVerbose) {
-        return 'External tool \'' + this.cmdShortName + '\'' +
-            '\nCommand full path: ' + this.cmd + '\nCommand args: ' + this.args +
-            (typeof this.cwd !== 'undefined' ? '\nCommand cwd: ' + this.cwd : '');
-    }
-
-    return this.cmdShortName;
-};
-
-module.exports = CordovaExternalToolErrorContext;
diff --git a/node_modules/cordova-common/src/CordovaLogger.js b/node_modules/cordova-common/src/CordovaLogger.js
deleted file mode 100644
index ea6e9ce..0000000
--- a/node_modules/cordova-common/src/CordovaLogger.js
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-var ansi = require('ansi');
-var EventEmitter = require('events').EventEmitter;
-var CordovaError = require('./CordovaError/CordovaError');
-var EOL = require('os').EOL;
-
-var INSTANCE;
-
-/**
- * @class CordovaLogger
- *
- * Implements logging facility that anybody could use. Should not be
- *   instantiated directly, `CordovaLogger.get()` method should be used instead
- *   to acquire logger instance
- */
-function CordovaLogger () {
-    this.levels = {};
-    this.colors = {};
-    this.stdout = process.stdout;
-    this.stderr = process.stderr;
-
-    this.stdoutCursor = ansi(this.stdout);
-    this.stderrCursor = ansi(this.stderr);
-
-    this.addLevel('verbose', 1000, 'grey');
-    this.addLevel('normal', 2000);
-    this.addLevel('warn', 2000, 'yellow');
-    this.addLevel('info', 3000, 'blue');
-    this.addLevel('error', 5000, 'red');
-    this.addLevel('results', 10000);
-
-    this.setLevel('normal');
-}
-
-/**
- * Static method to create new or acquire existing instance.
- *
- * @return  {CordovaLogger}  Logger instance
- */
-CordovaLogger.get = function () {
-    return INSTANCE || (INSTANCE = new CordovaLogger());
-};
-
-CordovaLogger.VERBOSE = 'verbose';
-CordovaLogger.NORMAL = 'normal';
-CordovaLogger.WARN = 'warn';
-CordovaLogger.INFO = 'info';
-CordovaLogger.ERROR = 'error';
-CordovaLogger.RESULTS = 'results';
-
-/**
- * Emits log message to process' stdout/stderr depending on message's severity
- *   and current log level. If severity is less than current logger's level,
- *   then the message is ignored.
- *
- * @param   {String}  logLevel  The message's log level. The logger should have
- *   corresponding level added (via logger.addLevel), otherwise
- *   `CordovaLogger.NORMAL` level will be used.
- * @param   {String}  message   The message, that should be logged to process'
- *   stdio
- *
- * @return  {CordovaLogger}     Current instance, to allow calls chaining.
- */
-CordovaLogger.prototype.log = function (logLevel, message) {
-    // if there is no such logLevel defined, or provided level has
-    // less severity than active level, then just ignore this call and return
-    if (!this.levels[logLevel] || this.levels[logLevel] < this.levels[this.logLevel]) {
-        // return instance to allow to chain calls
-        return this;
-    }
-
-    var isVerbose = this.logLevel === 'verbose';
-    var cursor = this.stdoutCursor;
-
-    if (message instanceof Error || logLevel === CordovaLogger.ERROR) {
-        message = formatError(message, isVerbose);
-        cursor = this.stderrCursor;
-    }
-
-    var color = this.colors[logLevel];
-    if (color) {
-        cursor.bold().fg[color]();
-    }
-
-    cursor.write(message).reset().write(EOL);
-
-    return this;
-};
-
-/**
- * Adds a new level to logger instance. This method also creates a shortcut
- *   method to log events with the level provided (i.e. after adding new level
- *   'debug', the method `debug(message)`, equal to logger.log('debug', message),
- *   will be added to logger instance)
- *
- * @param  {String}  level     A log level name. The levels with the following
- *   names added by default to every instance: 'verbose', 'normal', 'warn',
- *   'info', 'error', 'results'
- * @param  {Number}  severity  A number that represents level's severity.
- * @param  {String}  color     A valid color name, that will be used to log
- *   messages with this level. Any CSS color code or RGB value is allowed
- *   (according to ansi documentation:
- *   https://github.com/TooTallNate/ansi.js#features)
- *
- * @return  {CordovaLogger}     Current instance, to allow calls chaining.
- */
-CordovaLogger.prototype.addLevel = function (level, severity, color) {
-
-    this.levels[level] = severity;
-
-    if (color) {
-        this.colors[level] = color;
-    }
-
-    // Define own method with corresponding name
-    if (!this[level]) {
-        this[level] = this.log.bind(this, level);
-    }
-
-    return this;
-};
-
-/**
- * Sets the current logger level to provided value. If logger doesn't have level
- *   with this name, `CordovaLogger.NORMAL` will be used.
- *
- * @param  {String}  logLevel  Level name. The level with this name should be
- *   added to logger before.
- *
- * @return  {CordovaLogger}     Current instance, to allow calls chaining.
- */
-CordovaLogger.prototype.setLevel = function (logLevel) {
-    this.logLevel = this.levels[logLevel] ? logLevel : CordovaLogger.NORMAL;
-
-    return this;
-};
-
-/**
- * Adjusts the current logger level according to the passed options.
- *
- * @param   {Object|Array}  opts  An object or args array with options
- *
- * @return  {CordovaLogger}     Current instance, to allow calls chaining.
- */
-CordovaLogger.prototype.adjustLevel = function (opts) {
-    if (opts.verbose || (Array.isArray(opts) && opts.indexOf('--verbose') !== -1)) {
-        this.setLevel('verbose');
-    } else if (opts.silent || (Array.isArray(opts) && opts.indexOf('--silent') !== -1)) {
-        this.setLevel('error');
-    }
-
-    return this;
-};
-
-/**
- * Attaches logger to EventEmitter instance provided.
- *
- * @param   {EventEmitter}  eventEmitter  An EventEmitter instance to attach
- *   logger to.
- *
- * @return  {CordovaLogger}     Current instance, to allow calls chaining.
- */
-CordovaLogger.prototype.subscribe = function (eventEmitter) {
-
-    if (!(eventEmitter instanceof EventEmitter)) { throw new Error('Subscribe method only accepts an EventEmitter instance as argument'); }
-
-    eventEmitter.on('verbose', this.verbose)
-        .on('log', this.normal)
-        .on('info', this.info)
-        .on('warn', this.warn)
-        .on('warning', this.warn)
-        // Set up event handlers for logging and results emitted as events.
-        .on('results', this.results);
-
-    return this;
-};
-
-function formatError (error, isVerbose) {
-    var message = '';
-
-    if (error instanceof CordovaError) {
-        message = error.toString(isVerbose);
-    } else if (error instanceof Error) {
-        if (isVerbose) {
-            message = error.stack;
-        } else {
-            message = error.message;
-        }
-    } else {
-        // Plain text error message
-        message = error;
-    }
-
-    if (typeof message === 'string' && message.toUpperCase().indexOf('ERROR:') !== 0) {
-        // Needed for backward compatibility with external tools
-        message = 'Error: ' + message;
-    }
-
-    return message;
-}
-
-module.exports = CordovaLogger;
diff --git a/node_modules/cordova-common/src/FileUpdater.js b/node_modules/cordova-common/src/FileUpdater.js
deleted file mode 100644
index c4eeb97..0000000
--- a/node_modules/cordova-common/src/FileUpdater.js
+++ /dev/null
@@ -1,415 +0,0 @@
-/**
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*/
-
-'use strict';
-
-var fs = require('fs');
-var path = require('path');
-var shell = require('shelljs');
-var minimatch = require('minimatch');
-
-/**
- * Logging callback used in the FileUpdater methods.
- * @callback loggingCallback
- * @param {string} message A message describing a single file update operation.
- */
-
-/**
- * Updates a target file or directory with a source file or directory. (Directory updates are
- * not recursive.) Stats for target and source items must be passed in. This is an internal
- * helper function used by other methods in this module.
- *
- * @param {?string} sourcePath Source file or directory to be used to update the
- *     destination. If the source is null, then the destination is deleted if it exists.
- * @param {?fs.Stats} sourceStats An instance of fs.Stats for the source path, or null if
- *     the source does not exist.
- * @param {string} targetPath Required destination file or directory to be updated. If it does
- *     not exist, it will be created.
- * @param {?fs.Stats} targetStats An instance of fs.Stats for the target path, or null if
- *     the target does not exist.
- * @param {Object} [options] Optional additional parameters for the update.
- * @param {string} [options.rootDir] Optional root directory (such as a project) to which target
- *     and source path parameters are relative; may be omitted if the paths are absolute. The
- *     rootDir is always omitted from any logged paths, to make the logs easier to read.
- * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
- *     Otherwise, a file is copied if the source's last-modified time is greather than or
- *     equal to the target's last-modified time, or if the file sizes are different.
- * @param {loggingCallback} [log] Optional logging callback that takes a string message
- *     describing any file operations that are performed.
- * @return {boolean} true if any changes were made, or false if the force flag is not set
- *     and everything was up to date
- */
-function updatePathWithStats (sourcePath, sourceStats, targetPath, targetStats, options, log) {
-    var updated = false;
-
-    var rootDir = (options && options.rootDir) || '';
-    var copyAll = (options && options.all) || false;
-
-    var targetFullPath = path.join(rootDir || '', targetPath);
-
-    if (sourceStats) {
-        var sourceFullPath = path.join(rootDir || '', sourcePath);
-
-        if (targetStats) {
-            // The target exists. But if the directory status doesn't match the source, delete it.
-            if (targetStats.isDirectory() && !sourceStats.isDirectory()) {
-                log('rmdir  ' + targetPath + ' (source is a file)');
-                shell.rm('-rf', targetFullPath);
-                targetStats = null;
-                updated = true;
-            } else if (!targetStats.isDirectory() && sourceStats.isDirectory()) {
-                log('delete ' + targetPath + ' (source is a directory)');
-                shell.rm('-f', targetFullPath);
-                targetStats = null;
-                updated = true;
-            }
-        }
-
-        if (!targetStats) {
-            if (sourceStats.isDirectory()) {
-                // The target directory does not exist, so it should be created.
-                log('mkdir ' + targetPath);
-                shell.mkdir('-p', targetFullPath);
-                updated = true;
-            } else if (sourceStats.isFile()) {
-                // The target file does not exist, so it should be copied from the source.
-                log('copy  ' + sourcePath + ' ' + targetPath + (copyAll ? '' : ' (new file)'));
-                shell.cp('-f', sourceFullPath, targetFullPath);
-                updated = true;
-            }
-        } else if (sourceStats.isFile() && targetStats.isFile()) {
-            // The source and target paths both exist and are files.
-            if (copyAll) {
-                // The caller specified all files should be copied.
-                log('copy  ' + sourcePath + ' ' + targetPath);
-                shell.cp('-f', sourceFullPath, targetFullPath);
-                updated = true;
-            } else {
-                // Copy if the source has been modified since it was copied to the target, or if
-                // the file sizes are different. (The latter catches most cases in which something
-                // was done to the file after copying.) Comparison is >= rather than > to allow
-                // for timestamps lacking sub-second precision in some filesystems.
-                if (sourceStats.mtime.getTime() >= targetStats.mtime.getTime() ||
-                        sourceStats.size !== targetStats.size) {
-                    log('copy  ' + sourcePath + ' ' + targetPath + ' (updated file)');
-                    shell.cp('-f', sourceFullPath, targetFullPath);
-                    updated = true;
-                }
-            }
-        }
-    } else if (targetStats) {
-        // The target exists but the source is null, so the target should be deleted.
-        if (targetStats.isDirectory()) {
-            log('rmdir  ' + targetPath + (copyAll ? '' : ' (no source)'));
-            shell.rm('-rf', targetFullPath);
-        } else {
-            log('delete ' + targetPath + (copyAll ? '' : ' (no source)'));
-            shell.rm('-f', targetFullPath);
-        }
-        updated = true;
-    }
-
-    return updated;
-}
-
-/**
- * Helper for updatePath and updatePaths functions. Queries stats for source and target
- * and ensures target directory exists before copying a file.
- */
-function updatePathInternal (sourcePath, targetPath, options, log) {
-    var rootDir = (options && options.rootDir) || '';
-    var targetFullPath = path.join(rootDir, targetPath);
-    var targetStats = fs.existsSync(targetFullPath) ? fs.statSync(targetFullPath) : null;
-    var sourceStats = null;
-
-    if (sourcePath) {
-        // A non-null source path was specified. It should exist.
-        var sourceFullPath = path.join(rootDir, sourcePath);
-        if (!fs.existsSync(sourceFullPath)) {
-            throw new Error('Source path does not exist: ' + sourcePath);
-        }
-
-        sourceStats = fs.statSync(sourceFullPath);
-
-        // Create the target's parent directory if it doesn't exist.
-        var parentDir = path.dirname(targetFullPath);
-        if (!fs.existsSync(parentDir)) {
-            shell.mkdir('-p', parentDir);
-        }
-    }
-
-    return updatePathWithStats(sourcePath, sourceStats, targetPath, targetStats, options, log);
-}
-
-/**
- * Updates a target file or directory with a source file or directory. (Directory updates are
- * not recursive.)
- *
- * @param {?string} sourcePath Source file or directory to be used to update the
- *     destination. If the source is null, then the destination is deleted if it exists.
- * @param {string} targetPath Required destination file or directory to be updated. If it does
- *     not exist, it will be created.
- * @param {Object} [options] Optional additional parameters for the update.
- * @param {string} [options.rootDir] Optional root directory (such as a project) to which target
- *     and source path parameters are relative; may be omitted if the paths are absolute. The
- *     rootDir is always omitted from any logged paths, to make the logs easier to read.
- * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
- *     Otherwise, a file is copied if the source's last-modified time is greather than or
- *     equal to the target's last-modified time, or if the file sizes are different.
- * @param {loggingCallback} [log] Optional logging callback that takes a string message
- *     describing any file operations that are performed.
- * @return {boolean} true if any changes were made, or false if the force flag is not set
- *     and everything was up to date
- */
-function updatePath (sourcePath, targetPath, options, log) {
-    if (sourcePath !== null && typeof sourcePath !== 'string') {
-        throw new Error('A source path (or null) is required.');
-    }
-
-    if (!targetPath || typeof targetPath !== 'string') {
-        throw new Error('A target path is required.');
-    }
-
-    log = log || function (message) { };
-
-    return updatePathInternal(sourcePath, targetPath, options, log);
-}
-
-/**
- * Updates files and directories based on a mapping from target paths to source paths. Targets
- * with null sources in the map are deleted.
- *
- * @param {Object} pathMap A dictionary mapping from target paths to source paths.
- * @param {Object} [options] Optional additional parameters for the update.
- * @param {string} [options.rootDir] Optional root directory (such as a project) to which target
- *     and source path parameters are relative; may be omitted if the paths are absolute. The
- *     rootDir is always omitted from any logged paths, to make the logs easier to read.
- * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
- *     Otherwise, a file is copied if the source's last-modified time is greather than or
- *     equal to the target's last-modified time, or if the file sizes are different.
- * @param {loggingCallback} [log] Optional logging callback that takes a string message
- *     describing any file operations that are performed.
- * @return {boolean} true if any changes were made, or false if the force flag is not set
- *     and everything was up to date
- */
-function updatePaths (pathMap, options, log) {
-    if (!pathMap || typeof pathMap !== 'object' || Array.isArray(pathMap)) {
-        throw new Error('An object mapping from target paths to source paths is required.');
-    }
-
-    log = log || function (message) { };
-
-    var updated = false;
-
-    // Iterate in sorted order to ensure directories are created before files under them.
-    Object.keys(pathMap).sort().forEach(function (targetPath) {
-        var sourcePath = pathMap[targetPath];
-        updated = updatePathInternal(sourcePath, targetPath, options, log) || updated;
-    });
-
-    return updated;
-}
-
-/**
- * Updates a target directory with merged files and subdirectories from source directories.
- *
- * @param {string|string[]} sourceDirs Required source directory or array of source directories
- *     to be merged into the target. The directories are listed in order of precedence; files in
- *     directories later in the array supersede files in directories earlier in the array
- *     (regardless of timestamps).
- * @param {string} targetDir Required destination directory to be updated. If it does not exist,
- *     it will be created. If it exists, newer files from source directories will be copied over,
- *     and files missing in the source directories will be deleted.
- * @param {Object} [options] Optional additional parameters for the update.
- * @param {string} [options.rootDir] Optional root directory (such as a project) to which target
- *     and source path parameters are relative; may be omitted if the paths are absolute. The
- *     rootDir is always omitted from any logged paths, to make the logs easier to read.
- * @param {boolean} [options.all] If true, all files are copied regardless of last-modified times.
- *     Otherwise, a file is copied if the source's last-modified time is greather than or
- *     equal to the target's last-modified time, or if the file sizes are different.
- * @param {string|string[]} [options.include] Optional glob string or array of glob strings that
- *     are tested against both target and source relative paths to determine if they are included
- *     in the merge-and-update. If unspecified, all items are included.
- * @param {string|string[]} [options.exclude] Optional glob string or array of glob strings that
- *     are tested against both target and source relative paths to determine if they are excluded
- *     from the merge-and-update. Exclusions override inclusions. If unspecified, no items are
- *     excluded.
- * @param {loggingCallback} [log] Optional logging callback that takes a string message
- *     describing any file operations that are performed.
- * @return {boolean} true if any changes were made, or false if the force flag is not set
- *     and everything was up to date
- */
-function mergeAndUpdateDir (sourceDirs, targetDir, options, log) {
-    if (sourceDirs && typeof sourceDirs === 'string') {
-        sourceDirs = [ sourceDirs ];
-    } else if (!Array.isArray(sourceDirs)) {
-        throw new Error('A source directory path or array of paths is required.');
-    }
-
-    if (!targetDir || typeof targetDir !== 'string') {
-        throw new Error('A target directory path is required.');
-    }
-
-    log = log || function (message) { };
-
-    var rootDir = (options && options.rootDir) || '';
-
-    var include = (options && options.include) || [ '**' ];
-    if (typeof include === 'string') {
-        include = [ include ];
-    } else if (!Array.isArray(include)) {
-        throw new Error('Include parameter must be a glob string or array of glob strings.');
-    }
-
-    var exclude = (options && options.exclude) || [];
-    if (typeof exclude === 'string') {
-        exclude = [ exclude ];
-    } else if (!Array.isArray(exclude)) {
-        throw new Error('Exclude parameter must be a glob string or array of glob strings.');
-    }
-
-    // Scan the files in each of the source directories.
-    var sourceMaps = sourceDirs.map(function (sourceDir) {
-        return path.join(rootDir, sourceDir);
-    }).map(function (sourcePath) {
-        if (!fs.existsSync(sourcePath)) {
-            throw new Error('Source directory does not exist: ' + sourcePath);
-        }
-        return mapDirectory(rootDir, path.relative(rootDir, sourcePath), include, exclude);
-    });
-
-    // Scan the files in the target directory, if it exists.
-    var targetMap = {};
-    var targetFullPath = path.join(rootDir, targetDir);
-    if (fs.existsSync(targetFullPath)) {
-        targetMap = mapDirectory(rootDir, targetDir, include, exclude);
-    }
-
-    var pathMap = mergePathMaps(sourceMaps, targetMap, targetDir);
-
-    var updated = false;
-
-    // Iterate in sorted order to ensure directories are created before files under them.
-    Object.keys(pathMap).sort().forEach(function (subPath) {
-        var entry = pathMap[subPath];
-        updated = updatePathWithStats(
-            entry.sourcePath,
-            entry.sourceStats,
-            entry.targetPath,
-            entry.targetStats,
-            options,
-            log) || updated;
-    });
-
-    return updated;
-}
-
-/**
- * Creates a dictionary map of all files and directories under a path.
- */
-function mapDirectory (rootDir, subDir, include, exclude) {
-    var dirMap = { '': { subDir: subDir, stats: fs.statSync(path.join(rootDir, subDir)) } };
-    mapSubdirectory(rootDir, subDir, '', include, exclude, dirMap);
-    return dirMap;
-
-    function mapSubdirectory (rootDir, subDir, relativeDir, include, exclude, dirMap) {
-        var itemMapped = false;
-        var items = fs.readdirSync(path.join(rootDir, subDir, relativeDir));
-
-        items.forEach(function (item) {
-            var relativePath = path.join(relativeDir, item);
-            if (!matchGlobArray(relativePath, exclude)) {
-                // Stats obtained here (required at least to know where to recurse in directories)
-                // are saved for later, where the modified times may also be used. This minimizes
-                // the number of file I/O operations performed.
-                var fullPath = path.join(rootDir, subDir, relativePath);
-                var stats = fs.statSync(fullPath);
-
-                if (stats.isDirectory()) {
-                    // Directories are included if either something under them is included or they
-                    // match an include glob.
-                    if (mapSubdirectory(rootDir, subDir, relativePath, include, exclude, dirMap) ||
-                            matchGlobArray(relativePath, include)) {
-                        dirMap[relativePath] = { subDir: subDir, stats: stats };
-                        itemMapped = true;
-                    }
-                } else if (stats.isFile()) {
-                    // Files are included only if they match an include glob.
-                    if (matchGlobArray(relativePath, include)) {
-                        dirMap[relativePath] = { subDir: subDir, stats: stats };
-                        itemMapped = true;
-                    }
-                }
-            }
-        });
-        return itemMapped;
-    }
-
-    function matchGlobArray (path, globs) {
-        return globs.some(function (elem) {
-            return minimatch(path, elem, {dot: true});
-        });
-    }
-}
-
-/**
- * Merges together multiple source maps and a target map into a single mapping from
- * relative paths to objects with target and source paths and stats.
- */
-function mergePathMaps (sourceMaps, targetMap, targetDir) {
-    // Merge multiple source maps together, along with target path info.
-    // Entries in later source maps override those in earlier source maps.
-    // Target stats will be filled in below for targets that exist.
-    var pathMap = {};
-    sourceMaps.forEach(function (sourceMap) {
-        Object.keys(sourceMap).forEach(function (sourceSubPath) {
-            var sourceEntry = sourceMap[sourceSubPath];
-            pathMap[sourceSubPath] = {
-                targetPath: path.join(targetDir, sourceSubPath),
-                targetStats: null,
-                sourcePath: path.join(sourceEntry.subDir, sourceSubPath),
-                sourceStats: sourceEntry.stats
-            };
-        });
-    });
-
-    // Fill in target stats for targets that exist, and create entries
-    // for targets that don't have any corresponding sources.
-    Object.keys(targetMap).forEach(function (subPath) {
-        var entry = pathMap[subPath];
-        if (entry) {
-            entry.targetStats = targetMap[subPath].stats;
-        } else {
-            pathMap[subPath] = {
-                targetPath: path.join(targetDir, subPath),
-                targetStats: targetMap[subPath].stats,
-                sourcePath: null,
-                sourceStats: null
-            };
-        }
-    });
-
-    return pathMap;
-}
-
-module.exports = {
-    updatePath: updatePath,
-    updatePaths: updatePaths,
-    mergeAndUpdateDir: mergeAndUpdateDir
-};
diff --git a/node_modules/cordova-common/src/PlatformJson.js b/node_modules/cordova-common/src/PlatformJson.js
deleted file mode 100644
index 7eaf1a2..0000000
--- a/node_modules/cordova-common/src/PlatformJson.js
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
-*/
-
-var fs = require('fs');
-var path = require('path');
-var shelljs = require('shelljs');
-var mungeutil = require('./ConfigChanges/munge-util');
-var pluginMappernto = require('cordova-registry-mapper').newToOld;
-var pluginMapperotn = require('cordova-registry-mapper').oldToNew;
-
-function PlatformJson (filePath, platform, root) {
-    this.filePath = filePath;
-    this.platform = platform;
-    this.root = fix_munge(root || {});
-}
-
-PlatformJson.load = function (plugins_dir, platform) {
-    var filePath = path.join(plugins_dir, platform + '.json');
-    var root = null;
-    if (fs.existsSync(filePath)) {
-        root = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
-    }
-    return new PlatformJson(filePath, platform, root);
-};
-
-PlatformJson.prototype.save = function () {
-    shelljs.mkdir('-p', path.dirname(this.filePath));
-    fs.writeFileSync(this.filePath, JSON.stringify(this.root, null, 2), 'utf-8');
-};
-
-/**
- * Indicates whether the specified plugin is installed as a top-level (not as
- *  dependency to others)
- * @method function
- * @param  {String} pluginId A plugin id to check for.
- * @return {Boolean} true if plugin installed as top-level, otherwise false.
- */
-PlatformJson.prototype.isPluginTopLevel = function (pluginId) {
-    var installedPlugins = this.root.installed_plugins;
-    return installedPlugins[pluginId] ||
-        installedPlugins[pluginMappernto[pluginId]] ||
-        installedPlugins[pluginMapperotn[pluginId]];
-};
-
-/**
- * Indicates whether the specified plugin is installed as a dependency to other
- *  plugin.
- * @method function
- * @param  {String} pluginId A plugin id to check for.
- * @return {Boolean} true if plugin installed as a dependency, otherwise false.
- */
-PlatformJson.prototype.isPluginDependent = function (pluginId) {
-    var dependentPlugins = this.root.dependent_plugins;
-    return dependentPlugins[pluginId] ||
-        dependentPlugins[pluginMappernto[pluginId]] ||
-        dependentPlugins[pluginMapperotn[pluginId]];
-};
-
-/**
- * Indicates whether plugin is installed either as top-level or as dependency.
- * @method function
- * @param  {String} pluginId A plugin id to check for.
- * @return {Boolean} true if plugin installed, otherwise false.
- */
-PlatformJson.prototype.isPluginInstalled = function (pluginId) {
-    return this.isPluginTopLevel(pluginId) ||
-        this.isPluginDependent(pluginId);
-};
-
-PlatformJson.prototype.addPlugin = function (pluginId, variables, isTopLevel) {
-    var pluginsList = isTopLevel ?
-        this.root.installed_plugins :
-        this.root.dependent_plugins;
-
-    pluginsList[pluginId] = variables;
-
-    return this;
-};
-
-/**
- * @chaining
- * Generates and adds metadata for provided plugin into associated <platform>.json file
- *
- * @param   {PluginInfo}  pluginInfo  A pluginInfo instance to add metadata from
- * @returns {this} Current PlatformJson instance to allow calls chaining
- */
-PlatformJson.prototype.addPluginMetadata = function (pluginInfo) {
-
-    var installedModules = this.root.modules || [];
-
-    var installedPaths = installedModules.map(function (installedModule) {
-        return installedModule.file;
-    });
-
-    var modulesToInstall = pluginInfo.getJsModules(this.platform)
-        .map(function (module) {
-            return new ModuleMetadata(pluginInfo.id, module);
-        })
-        .filter(function (metadata) {
-            // Filter out modules which are already added to metadata
-            return installedPaths.indexOf(metadata.file) === -1;
-        });
-
-    this.root.modules = installedModules.concat(modulesToInstall);
-
-    this.root.plugin_metadata = this.root.plugin_metadata || {};
-    this.root.plugin_metadata[pluginInfo.id] = pluginInfo.version;
-
-    return this;
-};
-
-PlatformJson.prototype.removePlugin = function (pluginId, isTopLevel) {
-    var pluginsList = isTopLevel ?
-        this.root.installed_plugins :
-        this.root.dependent_plugins;
-
-    delete pluginsList[pluginId];
-
-    return this;
-};
-
-/**
- * @chaining
- * Removes metadata for provided plugin from associated file
- *
- * @param   {PluginInfo}  pluginInfo A PluginInfo instance to which modules' metadata
- *   we need to remove
- *
- * @returns {this} Current PlatformJson instance to allow calls chaining
- */
-PlatformJson.prototype.removePluginMetadata = function (pluginInfo) {
-    var modulesToRemove = pluginInfo.getJsModules(this.platform)
-        .map(function (jsModule) {
-            return ['plugins', pluginInfo.id, jsModule.src].join('/');
-        });
-
-    var installedModules = this.root.modules || [];
-    this.root.modules = installedModules
-        .filter(function (installedModule) {
-            // Leave only those metadatas which 'file' is not in removed modules
-            return (modulesToRemove.indexOf(installedModule.file) === -1);
-        });
-
-    if (this.root.plugin_metadata) {
-        delete this.root.plugin_metadata[pluginInfo.id];
-    }
-
-    return this;
-};
-
-PlatformJson.prototype.addInstalledPluginToPrepareQueue = function (pluginDirName, vars, is_top_level, force) {
-    this.root.prepare_queue.installed.push({'plugin': pluginDirName, 'vars': vars, 'topLevel': is_top_level, 'force': force});
-};
-
-PlatformJson.prototype.addUninstalledPluginToPrepareQueue = function (pluginId, is_top_level) {
-    this.root.prepare_queue.uninstalled.push({'plugin': pluginId, 'id': pluginId, 'topLevel': is_top_level});
-};
-
-/**
- * Moves plugin, specified by id to top-level plugins. If plugin is top-level
- *  already, then does nothing.
- * @method function
- * @param  {String} pluginId A plugin id to make top-level.
- * @return {PlatformJson} PlatformJson instance.
- */
-PlatformJson.prototype.makeTopLevel = function (pluginId) {
-    var plugin = this.root.dependent_plugins[pluginId];
-    if (plugin) {
-        delete this.root.dependent_plugins[pluginId];
-        this.root.installed_plugins[pluginId] = plugin;
-    }
-    return this;
-};
-
-/**
- * Generates a metadata for all installed plugins and js modules. The resultant
- *   string is ready to be written to 'cordova_plugins.js'
- *
- * @returns {String} cordova_plugins.js contents
- */
-PlatformJson.prototype.generateMetadata = function () {
-    return [
-        'cordova.define(\'cordova/plugin_list\', function(require, exports, module) {',
-        'module.exports = ' + JSON.stringify(this.root.modules, null, 2) + ';',
-        'module.exports.metadata = ',
-        '// TOP OF METADATA',
-        JSON.stringify(this.root.plugin_metadata, null, 2) + ';',
-        '// BOTTOM OF METADATA',
-        '});' // Close cordova.define.
-    ].join('\n');
-};
-
-/**
- * @chaining
- * Generates and then saves metadata to specified file. Doesn't check if file exists.
- *
- * @param {String} destination  File metadata will be written to
- * @return {PlatformJson} PlatformJson instance
- */
-PlatformJson.prototype.generateAndSaveMetadata = function (destination) {
-    var meta = this.generateMetadata();
-    shelljs.mkdir('-p', path.dirname(destination));
-    fs.writeFileSync(destination, meta, 'utf-8');
-
-    return this;
-};
-
-// convert a munge from the old format ([file][parent][xml] = count) to the current one
-function fix_munge (root) {
-    root.prepare_queue = root.prepare_queue || {installed: [], uninstalled: []};
-    root.config_munge = root.config_munge || {files: {}};
-    root.installed_plugins = root.installed_plugins || {};
-    root.dependent_plugins = root.dependent_plugins || {};
-
-    var munge = root.config_munge;
-    if (!munge.files) {
-        var new_munge = { files: {} };
-        for (var file in munge) {
-            for (var selector in munge[file]) {
-                for (var xml_child in munge[file][selector]) {
-                    var val = parseInt(munge[file][selector][xml_child]);
-                    for (var i = 0; i < val; i++) {
-                        mungeutil.deep_add(new_munge, [file, selector, { xml: xml_child, count: val }]);
-                    }
-                }
-            }
-        }
-        root.config_munge = new_munge;
-    }
-
-    return root;
-}
-
-/**
- * @constructor
- * @class ModuleMetadata
- *
- * Creates a ModuleMetadata object that represents module entry in 'cordova_plugins.js'
- *   file at run time
- *
- * @param {String}  pluginId  Plugin id where this module installed from
- * @param (JsModule|Object)  jsModule  A js-module entry from PluginInfo class to generate metadata for
- */
-function ModuleMetadata (pluginId, jsModule) {
-
-    if (!pluginId) throw new TypeError('pluginId argument must be a valid plugin id');
-    if (!jsModule.src && !jsModule.name) throw new TypeError('jsModule argument must contain src or/and name properties');
-
-    this.id = pluginId + '.' + (jsModule.name || jsModule.src.match(/([^\/]+)\.js/)[1]); /* eslint no-useless-escape: 0 */
-    this.file = ['plugins', pluginId, jsModule.src].join('/');
-    this.pluginId = pluginId;
-
-    if (jsModule.clobbers && jsModule.clobbers.length > 0) {
-        this.clobbers = jsModule.clobbers.map(function (o) { return o.target; });
-    }
-    if (jsModule.merges && jsModule.merges.length > 0) {
-        this.merges = jsModule.merges.map(function (o) { return o.target; });
-    }
-    if (jsModule.runs) {
-        this.runs = true;
-    }
-}
-
-module.exports = PlatformJson;
diff --git a/node_modules/cordova-common/src/PluginInfo/PluginInfo.js b/node_modules/cordova-common/src/PluginInfo/PluginInfo.js
deleted file mode 100644
index 7e9754d..0000000
--- a/node_modules/cordova-common/src/PluginInfo/PluginInfo.js
+++ /dev/null
@@ -1,439 +0,0 @@
-/**
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*/
-
-/*
-A class for holidng the information currently stored in plugin.xml
-It should also be able to answer questions like whether the plugin
-is compatible with a given engine version.
-
-TODO (kamrik): refactor this to not use sync functions and return promises.
-*/
-
-var path = require('path');
-var fs = require('fs');
-var xml_helpers = require('../util/xml-helpers');
-var CordovaError = require('../CordovaError/CordovaError');
-
-function PluginInfo (dirname) {
-    var self = this;
-
-    // METHODS
-    // Defined inside the constructor to avoid the "this" binding problems.
-
-    // <preference> tag
-    // Example: <preference name="API_KEY" />
-    // Used to require a variable to be specified via --variable when installing the plugin.
-    // returns { key : default | null}
-    self.getPreferences = getPreferences;
-    function getPreferences (platform) {
-        return _getTags(self._et, 'preference', platform, _parsePreference)
-            .reduce(function (preferences, pref) {
-                preferences[pref.preference] = pref.default;
-                return preferences;
-            }, {});
-    }
-
-    function _parsePreference (prefTag) {
-        var name = prefTag.attrib.name.toUpperCase();
-        var def = prefTag.attrib.default || null;
-        return {preference: name, default: def};
-    }
-
-    // <asset>
-    self.getAssets = getAssets;
-    function getAssets (platform) {
-        var assets = _getTags(self._et, 'asset', platform, _parseAsset);
-        return assets;
-    }
-
-    function _parseAsset (tag) {
-        var src = tag.attrib.src;
-        var target = tag.attrib.target;
-
-        if (!src || !target) {
-            var msg =
-                'Malformed <asset> tag. Both "src" and "target" attributes'
-                + 'must be specified in\n'
-                + self.filepath
-                ;
-            throw new Error(msg);
-        }
-
-        var asset = {
-            itemType: 'asset',
-            src: src,
-            target: target
-        };
-        return asset;
-    }
-
-    // <dependency>
-    // Example:
-    // <dependency id="com.plugin.id"
-    //     url="https://github.com/myuser/someplugin"
-    //     commit="428931ada3891801"
-    //     subdir="some/path/here" />
-    self.getDependencies = getDependencies;
-    function getDependencies (platform) {
-        var deps = _getTags(
-            self._et,
-            'dependency',
-            platform,
-            _parseDependency
-        );
-        return deps;
-    }
-
-    function _parseDependency (tag) {
-        var dep =
-            { id: tag.attrib.id,
-                version: tag.attrib.version || '',
-                url: tag.attrib.url || '',
-                subdir: tag.attrib.subdir || '',
-                commit: tag.attrib.commit
-            };
-
-        dep.git_ref = dep.commit;
-
-        if (!dep.id) {
-            var msg =
-                '<dependency> tag is missing id attribute in '
-                + self.filepath
-                ;
-            throw new CordovaError(msg);
-        }
-        return dep;
-    }
-
-    // <config-file> tag
-    self.getConfigFiles = getConfigFiles;
-    function getConfigFiles (platform) {
-        var configFiles = _getTags(self._et, 'config-file', platform, _parseConfigFile);
-        return configFiles;
-    }
-
-    function _parseConfigFile (tag) {
-        var configFile =
-            { target: tag.attrib['target'],
-                parent: tag.attrib['parent'],
-                after: tag.attrib['after'],
-                xmls: tag.getchildren(),
-                // To support demuxing via versions
-                versions: tag.attrib['versions'],
-                deviceTarget: tag.attrib['device-target']
-            };
-        return configFile;
-    }
-
-    self.getEditConfigs = getEditConfigs;
-    function getEditConfigs (platform) {
-        var editConfigs = _getTags(self._et, 'edit-config', platform, _parseEditConfigs);
-        return editConfigs;
-    }
-
-    function _parseEditConfigs (tag) {
-        var editConfig =
-            { file: tag.attrib['file'],
-                target: tag.attrib['target'],
-                mode: tag.attrib['mode'],
-                xmls: tag.getchildren()
-            };
-        return editConfig;
-    }
-
-    // <info> tags, both global and within a <platform>
-    // TODO (kamrik): Do we ever use <info> under <platform>? Example wanted.
-    self.getInfo = getInfo;
-    function getInfo (platform) {
-        var infos = _getTags(
-            self._et,
-            'info',
-            platform,
-            function (elem) { return elem.text; }
-        );
-        // Filter out any undefined or empty strings.
-        infos = infos.filter(Boolean);
-        return infos;
-    }
-
-    // <source-file>
-    // Examples:
-    // <source-file src="src/ios/someLib.a" framework="true" />
-    // <source-file src="src/ios/someLib.a" compiler-flags="-fno-objc-arc" />
-    self.getSourceFiles = getSourceFiles;
-    function getSourceFiles (platform) {
-        var sourceFiles = _getTagsInPlatform(self._et, 'source-file', platform, _parseSourceFile);
-        return sourceFiles;
-    }
-
-    function _parseSourceFile (tag) {
-        return {
-            itemType: 'source-file',
-            src: tag.attrib.src,
-            framework: isStrTrue(tag.attrib.framework),
-            weak: isStrTrue(tag.attrib.weak),
-            compilerFlags: tag.attrib['compiler-flags'],
-            targetDir: tag.attrib['target-dir']
-        };
-    }
-
-    // <header-file>
-    // Example:
-    // <header-file src="CDVFoo.h" />
-    self.getHeaderFiles = getHeaderFiles;
-    function getHeaderFiles (platform) {
-        var headerFiles = _getTagsInPlatform(self._et, 'header-file', platform, function (tag) {
-            return {
-                itemType: 'header-file',
-                src: tag.attrib.src,
-                targetDir: tag.attrib['target-dir']
-            };
-        });
-        return headerFiles;
-    }
-
-    // <resource-file>
-    // Example:
-    // <resource-file src="FooPluginStrings.xml" target="res/values/FooPluginStrings.xml" device-target="win" arch="x86" versions="&gt;=8.1" />
-    self.getResourceFiles = getResourceFiles;
-    function getResourceFiles (platform) {
-        var resourceFiles = _getTagsInPlatform(self._et, 'resource-file', platform, function (tag) {
-            return {
-                itemType: 'resource-file',
-                src: tag.attrib.src,
-                target: tag.attrib.target,
-                versions: tag.attrib.versions,
-                deviceTarget: tag.attrib['device-target'],
-                arch: tag.attrib.arch,
-                reference: tag.attrib.reference
-            };
-        });
-        return resourceFiles;
-    }
-
-    // <lib-file>
-    // Example:
-    // <lib-file src="src/BlackBerry10/native/device/libfoo.so" arch="device" />
-    self.getLibFiles = getLibFiles;
-    function getLibFiles (platform) {
-        var libFiles = _getTagsInPlatform(self._et, 'lib-file', platform, function (tag) {
-            return {
-                itemType: 'lib-file',
-                src: tag.attrib.src,
-                arch: tag.attrib.arch,
-                Include: tag.attrib.Include,
-                versions: tag.attrib.versions,
-                deviceTarget: tag.attrib['device-target'] || tag.attrib.target
-            };
-        });
-        return libFiles;
-    }
-
-    // <hook>
-    // Example:
-    // <hook type="before_build" src="scripts/beforeBuild.js" />
-    self.getHookScripts = getHookScripts;
-    function getHookScripts (hook, platforms) {
-        var scriptElements = self._et.findall('./hook');
-
-        if (platforms) {
-            platforms.forEach(function (platform) {
-                scriptElements = scriptElements.concat(self._et.findall('./platform[@name="' + platform + '"]/hook'));
-            });
-        }
-
-        function filterScriptByHookType (el) {
-            return el.attrib.src && el.attrib.type && el.attrib.type.toLowerCase() === hook;
-        }
-
-        return scriptElements.filter(filterScriptByHookType);
-    }
-
-    self.getJsModules = getJsModules;
-    function getJsModules (platform) {
-        var modules = _getTags(self._et, 'js-module', platform, _parseJsModule);
-        return modules;
-    }
-
-    function _parseJsModule (tag) {
-        var ret = {
-            itemType: 'js-module',
-            name: tag.attrib.name,
-            src: tag.attrib.src,
-            clobbers: tag.findall('clobbers').map(function (tag) { return { target: tag.attrib.target }; }),
-            merges: tag.findall('merges').map(function (tag) { return { target: tag.attrib.target }; }),
-            runs: tag.findall('runs').length > 0
-        };
-
-        return ret;
-    }
-
-    self.getEngines = function () {
-        return self._et.findall('engines/engine').map(function (n) {
-            return {
-                name: n.attrib.name,
-                version: n.attrib.version,
-                platform: n.attrib.platform,
-                scriptSrc: n.attrib.scriptSrc
-            };
-        });
-    };
-
-    self.getPlatforms = function () {
-        return self._et.findall('platform').map(function (n) {
-            return { name: n.attrib.name };
-        });
-    };
-
-    self.getPlatformsArray = function () {
-        return self._et.findall('platform').map(function (n) {
-            return n.attrib.name;
-        });
-    };
-
-    self.getFrameworks = function (platform, options) {
-        return _getTags(self._et, 'framework', platform, function (el) {
-            var src = el.attrib.src;
-            if (options) {
-                var vars = options.cli_variables || {};
-
-                if (Object.keys(vars).length === 0) {
-                    // get variable defaults from plugin.xml for removal
-                    vars = self.getPreferences(platform);
-                }
-                var regExp;
-                // Iterate over plugin variables.
-                // Replace them in framework src if they exist
-                Object.keys(vars).forEach(function (name) {
-                    if (vars[name]) {
-                        regExp = new RegExp('\\$' + name, 'g');
-                        src = src.replace(regExp, vars[name]);
-                    }
-                });
-            }
-            var ret = {
-                itemType: 'framework',
-                type: el.attrib.type,
-                parent: el.attrib.parent,
-                custom: isStrTrue(el.attrib.custom),
-                embed: isStrTrue(el.attrib.embed),
-                src: src,
-                spec: el.attrib.spec,
-                weak: isStrTrue(el.attrib.weak),
-                versions: el.attrib.versions,
-                targetDir: el.attrib['target-dir'],
-                deviceTarget: el.attrib['device-target'] || el.attrib.target,
-                arch: el.attrib.arch,
-                implementation: el.attrib.implementation
-            };
-            return ret;
-        });
-    };
-
-    self.getFilesAndFrameworks = getFilesAndFrameworks;
-    function getFilesAndFrameworks (platform, options) {
-        // Please avoid changing the order of the calls below, files will be
-        // installed in this order.
-        var items = [].concat(
-            self.getSourceFiles(platform),
-            self.getHeaderFiles(platform),
-            self.getResourceFiles(platform),
-            self.getFrameworks(platform, options),
-            self.getLibFiles(platform)
-        );
-        return items;
-    }
-    /// // End of PluginInfo methods /////
-
-    /// // PluginInfo Constructor logic  /////
-    self.filepath = path.join(dirname, 'plugin.xml');
-    if (!fs.existsSync(self.filepath)) {
-        throw new CordovaError('Cannot find plugin.xml for plugin "' + path.basename(dirname) + '". Please try adding it again.');
-    }
-
-    self.dir = dirname;
-    var et = self._et = xml_helpers.parseElementtreeSync(self.filepath);
-    var pelem = et.getroot();
-    self.id = pelem.attrib.id;
-    self.version = pelem.attrib.version;
-
-    // Optional fields
-    self.name = pelem.findtext('name');
-    self.description = pelem.findtext('description');
-    self.license = pelem.findtext('license');
-    self.repo = pelem.findtext('repo');
-    self.issue = pelem.findtext('issue');
-    self.keywords = pelem.findtext('keywords');
-    self.info = pelem.findtext('info');
-    if (self.keywords) {
-        self.keywords = self.keywords.split(',').map(function (s) { return s.trim(); });
-    }
-    self.getKeywordsAndPlatforms = function () {
-        var ret = self.keywords || [];
-        return ret.concat('ecosystem:cordova').concat(addCordova(self.getPlatformsArray()));
-    };
-} // End of PluginInfo constructor.
-
-// Helper function used to prefix every element of an array with cordova-
-// Useful when we want to modify platforms to be cordova-platform
-function addCordova (someArray) {
-    var newArray = someArray.map(function (element) {
-        return 'cordova-' + element;
-    });
-    return newArray;
-}
-
-// Helper function used by most of the getSomething methods of PluginInfo.
-// Get all elements of a given name. Both in root and in platform sections
-// for the given platform. If transform is given and is a function, it is
-// applied to each element.
-function _getTags (pelem, tag, platform, transform) {
-    var platformTag = pelem.find('./platform[@name="' + platform + '"]');
-    var tagsInRoot = pelem.findall(tag);
-    tagsInRoot = tagsInRoot || [];
-    var tagsInPlatform = platformTag ? platformTag.findall(tag) : [];
-    var tags = tagsInRoot.concat(tagsInPlatform);
-    if (typeof transform === 'function') {
-        tags = tags.map(transform);
-    }
-    return tags;
-}
-
-// Same as _getTags() but only looks inside a platform section.
-function _getTagsInPlatform (pelem, tag, platform, transform) {
-    var platformTag = pelem.find('./platform[@name="' + platform + '"]');
-    var tags = platformTag ? platformTag.findall(tag) : [];
-    if (typeof transform === 'function') {
-        tags = tags.map(transform);
-    }
-    return tags;
-}
-
-// Check if x is a string 'true'.
-function isStrTrue (x) {
-    return String(x).toLowerCase() === 'true';
-}
-
-module.exports = PluginInfo;
-// Backwards compat:
-PluginInfo.PluginInfo = PluginInfo;
-PluginInfo.loadPluginsDir = function (dir) {
-    var PluginInfoProvider = require('./PluginInfoProvider');
-    return new PluginInfoProvider().getAllWithinSearchPath(dir);
-};
diff --git a/node_modules/cordova-common/src/PluginInfo/PluginInfoProvider.js b/node_modules/cordova-common/src/PluginInfo/PluginInfoProvider.js
deleted file mode 100644
index 5d3f329..0000000
--- a/node_modules/cordova-common/src/PluginInfo/PluginInfoProvider.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*/
-
-/* jshint sub:true, laxcomma:true, laxbreak:true */
-
-var fs = require('fs');
-var path = require('path');
-var PluginInfo = require('./PluginInfo');
-var events = require('../events');
-
-function PluginInfoProvider () {
-    this._cache = {};
-    this._getAllCache = {};
-}
-
-PluginInfoProvider.prototype.get = function (dirName) {
-    var absPath = path.resolve(dirName);
-    if (!this._cache[absPath]) {
-        this._cache[absPath] = new PluginInfo(dirName);
-    }
-    return this._cache[absPath];
-};
-
-// Normally you don't need to put() entries, but it's used
-// when copying plugins, and in unit tests.
-PluginInfoProvider.prototype.put = function (pluginInfo) {
-    var absPath = path.resolve(pluginInfo.dir);
-    this._cache[absPath] = pluginInfo;
-};
-
-// Used for plugin search path processing.
-// Given a dir containing multiple plugins, create a PluginInfo object for
-// each of them and return as array.
-// Should load them all in parallel and return a promise, but not yet.
-PluginInfoProvider.prototype.getAllWithinSearchPath = function (dirName) {
-    var absPath = path.resolve(dirName);
-    if (!this._getAllCache[absPath]) {
-        this._getAllCache[absPath] = getAllHelper(absPath, this);
-    }
-    return this._getAllCache[absPath];
-};
-
-function getAllHelper (absPath, provider) {
-    if (!fs.existsSync(absPath)) {
-        return [];
-    }
-    // If dir itself is a plugin, return it in an array with one element.
-    if (fs.existsSync(path.join(absPath, 'plugin.xml'))) {
-        return [provider.get(absPath)];
-    }
-    var subdirs = fs.readdirSync(absPath);
-    var plugins = [];
-    subdirs.forEach(function (subdir) {
-        var d = path.join(absPath, subdir);
-        if (fs.existsSync(path.join(d, 'plugin.xml'))) {
-            try {
-                plugins.push(provider.get(d));
-            } catch (e) {
-                events.emit('warn', 'Error parsing ' + path.join(d, 'plugin.xml.\n' + e.stack));
-            }
-        }
-    });
-    return plugins;
-}
-
-module.exports = PluginInfoProvider;
diff --git a/node_modules/cordova-common/src/PluginManager.js b/node_modules/cordova-common/src/PluginManager.js
deleted file mode 100644
index 0097db4..0000000
--- a/node_modules/cordova-common/src/PluginManager.js
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
-*/
-
-var Q = require('q');
-var fs = require('fs');
-var path = require('path');
-
-var ActionStack = require('./ActionStack');
-var PlatformJson = require('./PlatformJson');
-var CordovaError = require('./CordovaError/CordovaError');
-var PlatformMunger = require('./ConfigChanges/ConfigChanges').PlatformMunger;
-var PluginInfoProvider = require('./PluginInfo/PluginInfoProvider');
-
-/**
- * @constructor
- * @class PluginManager
- * Represents an entity for adding/removing plugins for platforms
- *
- * @param {String} platform Platform name
- * @param {Object} locations - Platform files and directories
- * @param {IDEProject} ideProject The IDE project to add/remove plugin changes to/from
- */
-function PluginManager (platform, locations, ideProject) {
-    this.platform = platform;
-    this.locations = locations;
-    this.project = ideProject;
-
-    var platformJson = PlatformJson.load(locations.root, platform);
-    this.munger = new PlatformMunger(platform, locations.root, platformJson, new PluginInfoProvider());
-}
-
-/**
- * @constructs PluginManager
- * A convenience shortcut to new PluginManager(...)
- *
- * @param {String} platform Platform name
- * @param {Object} locations - Platform files and directories
- * @param {IDEProject} ideProject The IDE project to add/remove plugin changes to/from
- * @returns new PluginManager instance
- */
-PluginManager.get = function (platform, locations, ideProject) {
-    return new PluginManager(platform, locations, ideProject);
-};
-
-PluginManager.INSTALL = 'install';
-PluginManager.UNINSTALL = 'uninstall';
-
-module.exports = PluginManager;
-
-/**
- * Describes and implements common plugin installation/uninstallation routine. The flow is the following:
- *  * Validate and set defaults for options. Note that options are empty by default. Everything
- *    needed for platform IDE project must be passed from outside. Plugin variables (which
- *    are the part of the options) also must be already populated with 'PACKAGE_NAME' variable.
- *  * Collect all plugin's native and web files, get installers/uninstallers and process
- *    all these via ActionStack.
- *  * Save the IDE project, so the changes made by installers are persisted.
- *  * Generate config changes munge for plugin and apply it to all required files
- *  * Generate metadata for plugin and plugin modules and save it to 'cordova_plugins.js'
- *
- * @param {PluginInfo} plugin A PluginInfo structure representing plugin to install
- * @param {Object} [options={}] An installation options. It is expected but is not necessary
- *   that options would contain 'variables' inner object with 'PACKAGE_NAME' field set by caller.
- *
- * @returns {Promise} Returns a Q promise, either resolved in case of success, rejected otherwise.
- */
-PluginManager.prototype.doOperation = function (operation, plugin, options) {
-    if (operation !== PluginManager.INSTALL && operation !== PluginManager.UNINSTALL) { return Q.reject(new CordovaError('The parameter is incorrect. The opeation must be either "add" or "remove"')); }
-
-    if (!plugin || plugin.constructor.name !== 'PluginInfo') { return Q.reject(new CordovaError('The parameter is incorrect. The first parameter should be a PluginInfo instance')); }
-
-    // Set default to empty object to play safe when accesing properties
-    options = options || {};
-
-    var self = this;
-    var actions = new ActionStack();
-
-    // gather all files need to be handled during operation ...
-    plugin.getFilesAndFrameworks(this.platform, options)
-        .concat(plugin.getAssets(this.platform))
-        .concat(plugin.getJsModules(this.platform))
-        // ... put them into stack ...
-        .forEach(function (item) {
-            var installer = self.project.getInstaller(item.itemType);
-            var uninstaller = self.project.getUninstaller(item.itemType);
-            var actionArgs = [item, plugin, self.project, options];
-
-            var action;
-            if (operation === PluginManager.INSTALL) {
-                action = actions.createAction.apply(actions, [installer, actionArgs, uninstaller, actionArgs]); /* eslint no-useless-call: 0 */
-            } else /* op === PluginManager.UNINSTALL */{
-                action = actions.createAction.apply(actions, [uninstaller, actionArgs, installer, actionArgs]); /* eslint no-useless-call: 0 */
-            }
-            actions.push(action);
-        });
-
-    // ... and run through the action stack
-    return actions.process(this.platform)
-        .then(function () {
-            if (self.project.write) {
-                self.project.write();
-            }
-
-            if (operation === PluginManager.INSTALL) {
-                // Ignore passed `is_top_level` option since platform itself doesn't know
-                // anything about managing dependencies - it's responsibility of caller.
-                self.munger.add_plugin_changes(plugin, options.variables, /* is_top_level= */true, /* should_increment= */true, options.force);
-                self.munger.platformJson.addPluginMetadata(plugin);
-            } else {
-                self.munger.remove_plugin_changes(plugin, /* is_top_level= */true);
-                self.munger.platformJson.removePluginMetadata(plugin);
-            }
-
-            // Save everything (munge and plugin/modules metadata)
-            self.munger.save_all();
-
-            var metadata = self.munger.platformJson.generateMetadata();
-            fs.writeFileSync(path.join(self.locations.www, 'cordova_plugins.js'), metadata, 'utf-8');
-
-            // CB-11022 save plugin metadata to both www and platform_www if options.usePlatformWww is specified
-            if (options.usePlatformWww) {
-                fs.writeFileSync(path.join(self.locations.platformWww, 'cordova_plugins.js'), metadata, 'utf-8');
-            }
-        });
-};
-
-PluginManager.prototype.addPlugin = function (plugin, installOptions) {
-    return this.doOperation(PluginManager.INSTALL, plugin, installOptions);
-};
-
-PluginManager.prototype.removePlugin = function (plugin, uninstallOptions) {
-    return this.doOperation(PluginManager.UNINSTALL, plugin, uninstallOptions);
-};
diff --git a/node_modules/cordova-common/src/events.js b/node_modules/cordova-common/src/events.js
deleted file mode 100644
index 7038643..0000000
--- a/node_modules/cordova-common/src/events.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*/
-
-var EventEmitter = require('events').EventEmitter;
-
-var INSTANCE = new EventEmitter();
-INSTANCE.setMaxListeners(20);
-var EVENTS_RECEIVER;
-
-module.exports = INSTANCE;
-
-/**
- * Sets up current instance to forward emitted events to another EventEmitter
- *   instance.
- *
- * @param   {EventEmitter}  [eventEmitter]  The emitter instance to forward
- *   events to. Falsy value, when passed, disables forwarding.
- */
-module.exports.forwardEventsTo = function (eventEmitter) {
-
-    // If no argument is specified disable events forwarding
-    if (!eventEmitter) {
-        EVENTS_RECEIVER = undefined;
-        return;
-    }
-
-    if (!(eventEmitter instanceof EventEmitter)) { throw new Error('Cordova events can be redirected to another EventEmitter instance only'); }
-
-    // CB-10940 Skipping forwarding to self to avoid infinite recursion.
-    // This is the case when the modules are npm-linked.
-    if (this !== eventEmitter) {
-        EVENTS_RECEIVER = eventEmitter;
-    } else {
-        // Reset forwarding if we are subscribing to self
-        EVENTS_RECEIVER = undefined;
-    }
-};
-
-var emit = INSTANCE.emit;
-
-/**
- * This method replaces original 'emit' method to allow events forwarding.
- *
- * @return  {eventEmitter}  Current instance to allow calls chaining, as
- *   original 'emit' does
- */
-module.exports.emit = function () {
-
-    var args = Array.prototype.slice.call(arguments);
-
-    if (EVENTS_RECEIVER) {
-        EVENTS_RECEIVER.emit.apply(EVENTS_RECEIVER, args);
-    }
-
-    return emit.apply(this, args);
-};
diff --git a/node_modules/cordova-common/src/superspawn.js b/node_modules/cordova-common/src/superspawn.js
deleted file mode 100644
index 424934e..0000000
--- a/node_modules/cordova-common/src/superspawn.js
+++ /dev/null
@@ -1,189 +0,0 @@
-/**
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*/
-
-var child_process = require('child_process');
-var fs = require('fs');
-var path = require('path');
-var _ = require('underscore');
-var Q = require('q');
-var shell = require('shelljs');
-var events = require('./events');
-var iswin32 = process.platform === 'win32';
-
-// On Windows, spawn() for batch files requires absolute path & having the extension.
-function resolveWindowsExe (cmd) {
-    var winExtensions = ['.exe', '.bat', '.cmd', '.js', '.vbs'];
-    function isValidExe (c) {
-        return winExtensions.indexOf(path.extname(c)) !== -1 && fs.existsSync(c);
-    }
-    if (isValidExe(cmd)) {
-        return cmd;
-    }
-    cmd = shell.which(cmd) || cmd;
-    if (!isValidExe(cmd)) {
-        winExtensions.some(function (ext) {
-            if (fs.existsSync(cmd + ext)) {
-                cmd = cmd + ext;
-                return true;
-            }
-        });
-    }
-    return cmd;
-}
-
-function maybeQuote (a) {
-    if (/^[^"].*[ &].*[^"]/.test(a)) return '"' + a + '"';
-    return a;
-}
-
-/**
- * A special implementation for child_process.spawn that handles
- *   Windows-specific issues with batch files and spaces in paths. Returns a
- *   promise that succeeds only for return code 0. It is also possible to
- *   subscribe on spawned process' stdout and stderr streams using progress
- *   handler for resultant promise.
- *
- * @example spawn('mycommand', [], {stdio: 'pipe'}) .progress(function (stdio){
- *   if (stdio.stderr) { console.error(stdio.stderr); } })
- *   .then(function(result){ // do other stuff })
- *
- * @param   {String}   cmd       A command to spawn
- * @param   {String[]} [args=[]]  An array of arguments, passed to spawned
- *   process
- * @param   {Object}   [opts={}]  A configuration object
- * @param   {String|String[]|Object} opts.stdio Property that configures how
- *   spawned process' stdio will behave. Has the same meaning and possible
- *   values as 'stdio' options for child_process.spawn method
- *   (https://nodejs.org/api/child_process.html#child_process_options_stdio).
- * @param {Object}     [env={}]  A map of extra environment variables
- * @param {String}     [cwd=process.cwd()]  Working directory for the command
- * @param {Boolean}    [chmod=false]  If truthy, will attempt to set the execute
- *   bit before executing on non-Windows platforms
- *
- * @return  {Promise}        A promise that is either fulfilled if the spawned
- *   process is exited with zero error code or rejected otherwise. If the
- *   'stdio' option set to 'default' or 'pipe', the promise also emits progress
- *   messages with the following contents:
- *   {
- *       'stdout': ...,
- *       'stderr': ...
- *   }
- */
-exports.spawn = function (cmd, args, opts) {
-    args = args || [];
-    opts = opts || {};
-    var spawnOpts = {};
-    var d = Q.defer();
-
-    if (iswin32) {
-        cmd = resolveWindowsExe(cmd);
-        // If we couldn't find the file, likely we'll end up failing,
-        // but for things like "del", cmd will do the trick.
-        if (path.extname(cmd) !== '.exe') {
-            var cmdArgs = '"' + [cmd].concat(args).map(maybeQuote).join(' ') + '"';
-            // We need to use /s to ensure that spaces are parsed properly with cmd spawned content
-            args = [['/s', '/c', cmdArgs].join(' ')];
-            cmd = 'cmd';
-            spawnOpts.windowsVerbatimArguments = true;
-        } else if (!fs.existsSync(cmd)) {
-            // We need to use /s to ensure that spaces are parsed properly with cmd spawned content
-            args = ['/s', '/c', cmd].concat(args).map(maybeQuote);
-        }
-    }
-
-    if (opts.stdio !== 'default') {
-        // Ignore 'default' value for stdio because it corresponds to child_process's default 'pipe' option
-        spawnOpts.stdio = opts.stdio;
-    }
-
-    if (opts.cwd) {
-        spawnOpts.cwd = opts.cwd;
-    }
-
-    if (opts.env) {
-        spawnOpts.env = _.extend(_.extend({}, process.env), opts.env);
-    }
-
-    if (opts.chmod && !iswin32) {
-        try {
-            // This fails when module is installed in a system directory (e.g. via sudo npm install)
-            fs.chmodSync(cmd, '755');
-        } catch (e) {
-            // If the perms weren't set right, then this will come as an error upon execution.
-        }
-    }
-
-    events.emit(opts.printCommand ? 'log' : 'verbose', 'Running command: ' + maybeQuote(cmd) + ' ' + args.map(maybeQuote).join(' '));
-
-    var child = child_process.spawn(cmd, args, spawnOpts);
-    var capturedOut = '';
-    var capturedErr = '';
-
-    if (child.stdout) {
-        child.stdout.setEncoding('utf8');
-        child.stdout.on('data', function (data) {
-            capturedOut += data;
-            d.notify({'stdout': data});
-        });
-    }
-
-    if (child.stderr) {
-        child.stderr.setEncoding('utf8');
-        child.stderr.on('data', function (data) {
-            capturedErr += data;
-            d.notify({'stderr': data});
-        });
-    }
-
-    child.on('close', whenDone);
-    child.on('error', whenDone);
-    function whenDone (arg) {
-        child.removeListener('close', whenDone);
-        child.removeListener('error', whenDone);
-        var code = typeof arg === 'number' ? arg : arg && arg.code;
-
-        events.emit('verbose', 'Command finished with error code ' + code + ': ' + cmd + ' ' + args);
-        if (code === 0) {
-            d.resolve(capturedOut.trim());
-        } else {
-            var errMsg = cmd + ': Command failed with exit code ' + code;
-            if (capturedErr) {
-                errMsg += ' Error output:\n' + capturedErr.trim();
-            }
-            var err = new Error(errMsg);
-            if (capturedErr) {
-                err.stderr = capturedErr;
-            }
-            if (capturedOut) {
-                err.stdout = capturedOut;
-            }
-            err.code = code;
-            d.reject(err);
-        }
-    }
-
-    return d.promise;
-};
-
-exports.maybeSpawn = function (cmd, args, opts) {
-    if (fs.existsSync(cmd)) {
-        return exports.spawn(cmd, args, opts);
-    }
-    return Q(null);
-};
diff --git a/node_modules/cordova-common/src/util/addProperty.js b/node_modules/cordova-common/src/util/addProperty.js
deleted file mode 100644
index 3e48174..0000000
--- a/node_modules/cordova-common/src/util/addProperty.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
-*/
-
-module.exports = function addProperty (module, property, modulePath, obj) {
-
-    obj = obj || module.exports;
-    // Add properties as getter to delay load the modules on first invocation
-    Object.defineProperty(obj, property, {
-        configurable: true,
-        get: function () {
-            var delayLoadedModule = module.require(modulePath);
-            obj[property] = delayLoadedModule;
-            return delayLoadedModule;
-        }
-    });
-};
diff --git a/node_modules/cordova-common/src/util/plist-helpers.js b/node_modules/cordova-common/src/util/plist-helpers.js
deleted file mode 100644
index 5ec4c1d..0000000
--- a/node_modules/cordova-common/src/util/plist-helpers.js
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*/
-/* eslint no-useless-escape: 0 */
-
-// contains PLIST utility functions
-var __ = require('underscore');
-var plist = require('plist');
-
-// adds node to doc at selector
-module.exports.graftPLIST = graftPLIST;
-function graftPLIST (doc, xml, selector) {
-    var obj = plist.parse('<plist>' + xml + '</plist>');
-
-    var node = doc[selector];
-    if (node && Array.isArray(node) && Array.isArray(obj)) {
-        node = node.concat(obj);
-        for (var i = 0; i < node.length; i++) {
-            for (var j = i + 1; j < node.length; ++j) {
-                if (nodeEqual(node[i], node[j])) { node.splice(j--, 1); }
-            }
-        }
-        doc[selector] = node;
-    } else {
-        // plist uses objects for <dict>. If we have two dicts we merge them instead of
-        // overriding the old one. See CB-6472
-        if (node && __.isObject(node) && __.isObject(obj) && !__.isDate(node) && !__.isDate(obj)) { // arrays checked above
-            __.extend(obj, node);
-        }
-        doc[selector] = obj;
-    }
-
-    return true;
-}
-
-// removes node from doc at selector
-module.exports.prunePLIST = prunePLIST;
-function prunePLIST (doc, xml, selector) {
-    var obj = plist.parse('<plist>' + xml + '</plist>');
-
-    pruneOBJECT(doc, selector, obj);
-
-    return true;
-}
-
-function pruneOBJECT (doc, selector, fragment) {
-    if (Array.isArray(fragment) && Array.isArray(doc[selector])) {
-        var empty = true;
-        for (var i in fragment) {
-            for (var j in doc[selector]) {
-                empty = pruneOBJECT(doc[selector], j, fragment[i]) && empty;
-            }
-        }
-        if (empty) {
-            delete doc[selector];
-            return true;
-        }
-    } else if (nodeEqual(doc[selector], fragment)) {
-        delete doc[selector];
-        return true;
-    }
-
-    return false;
-}
-
-function nodeEqual (node1, node2) {
-    if (typeof node1 !== typeof node2) { return false; } else if (typeof node1 === 'string') {
-        node2 = escapeRE(node2).replace(/\\\$\S+/gm, '(.*?)');
-        return new RegExp('^' + node2 + '$').test(node1);
-    } else {
-        for (var key in node2) {
-            if (!nodeEqual(node1[key], node2[key])) return false;
-        }
-        return true;
-    }
-}
-
-// escape string for use in regex
-function escapeRE (str) {
-    return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
-}
diff --git a/node_modules/cordova-common/src/util/xml-helpers.js b/node_modules/cordova-common/src/util/xml-helpers.js
deleted file mode 100644
index e2c8fd3..0000000
--- a/node_modules/cordova-common/src/util/xml-helpers.js
+++ /dev/null
@@ -1,365 +0,0 @@
-/**
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*/
-
-/**
- * contains XML utility functions, some of which are specific to elementtree
- */
-
-var fs = require('fs');
-var path = require('path');
-var _ = require('underscore');
-var et = require('elementtree');
-
-/* eslint-disable no-useless-escape */
-var ROOT = /^\/([^\/]*)/;
-var ABSOLUTE = /^\/([^\/]*)\/(.*)/;
-/* eslint-enable no-useless-escape */
-
-module.exports = {
-    // compare two et.XML nodes, see if they match
-    // compares tagName, text, attributes and children (recursively)
-    equalNodes: function (one, two) {
-        if (one.tag !== two.tag) {
-            return false;
-        } else if (one.text.trim() !== two.text.trim()) {
-            return false;
-        } else if (one._children.length !== two._children.length) {
-            return false;
-        }
-
-        if (!attribMatch(one, two)) return false;
-
-        for (var i = 0; i < one._children.length; i++) {
-            if (!module.exports.equalNodes(one._children[i], two._children[i])) {
-                return false;
-            }
-        }
-
-        return true;
-    },
-
-    // adds node to doc at selector, creating parent if it doesn't exist
-    graftXML: function (doc, nodes, selector, after) {
-        var parent = module.exports.resolveParent(doc, selector);
-        if (!parent) {
-            // Try to create the parent recursively if necessary
-            try {
-                var parentToCreate = et.XML('<' + path.basename(selector) + '>');
-                var parentSelector = path.dirname(selector);
-
-                this.graftXML(doc, [parentToCreate], parentSelector);
-            } catch (e) {
-                return false;
-            }
-            parent = module.exports.resolveParent(doc, selector);
-            if (!parent) return false;
-        }
-
-        nodes.forEach(function (node) {
-            // check if child is unique first
-            if (uniqueChild(node, parent)) {
-                var children = parent.getchildren();
-                var insertIdx = after ? findInsertIdx(children, after) : children.length;
-
-                // TODO: replace with parent.insert after the bug in ElementTree is fixed
-                parent.getchildren().splice(insertIdx, 0, node);
-            }
-        });
-
-        return true;
-    },
-
-    // adds new attributes to doc at selector
-    // Will only merge if attribute has not been modified already or --force is used
-    graftXMLMerge: function (doc, nodes, selector, xml) {
-        var target = module.exports.resolveParent(doc, selector);
-        if (!target) return false;
-
-        // saves the attributes of the original xml before making changes
-        xml.oldAttrib = _.extend({}, target.attrib);
-
-        nodes.forEach(function (node) {
-            var attributes = node.attrib;
-            for (var attribute in attributes) {
-                target.attrib[attribute] = node.attrib[attribute];
-            }
-        });
-
-        return true;
-    },
-
-    // overwrite all attributes to doc at selector with new attributes
-    // Will only overwrite if attribute has not been modified already or --force is used
-    graftXMLOverwrite: function (doc, nodes, selector, xml) {
-        var target = module.exports.resolveParent(doc, selector);
-        if (!target) return false;
-
-        // saves the attributes of the original xml before making changes
-        xml.oldAttrib = _.extend({}, target.attrib);
-
-        // remove old attributes from target
-        var targetAttributes = target.attrib;
-        for (var targetAttribute in targetAttributes) {
-            delete targetAttributes[targetAttribute];
-        }
-
-        // add new attributes to target
-        nodes.forEach(function (node) {
-            var attributes = node.attrib;
-            for (var attribute in attributes) {
-                target.attrib[attribute] = node.attrib[attribute];
-            }
-        });
-
-        return true;
-    },
-
-    // removes node from doc at selector
-    pruneXML: function (doc, nodes, selector) {
-        var parent = module.exports.resolveParent(doc, selector);
-        if (!parent) return false;
-
-        nodes.forEach(function (node) {
-            var matchingKid = null;
-            if ((matchingKid = findChild(node, parent)) !== null) {
-                // stupid elementtree takes an index argument it doesn't use
-                // and does not conform to the python lib
-                parent.remove(matchingKid);
-            }
-        });
-
-        return true;
-    },
-
-    // restores attributes from doc at selector
-    pruneXMLRestore: function (doc, selector, xml) {
-        var target = module.exports.resolveParent(doc, selector);
-        if (!target) return false;
-
-        if (xml.oldAttrib) {
-            target.attrib = _.extend({}, xml.oldAttrib);
-        }
-
-        return true;
-    },
-
-    pruneXMLRemove: function (doc, selector, nodes) {
-        var target = module.exports.resolveParent(doc, selector);
-        if (!target) return false;
-
-        nodes.forEach(function (node) {
-            var attributes = node.attrib;
-            for (var attribute in attributes) {
-                if (target.attrib[attribute]) {
-                    delete target.attrib[attribute];
-                }
-            }
-        });
-
-        return true;
-
-    },
-
-    parseElementtreeSync: function (filename) {
-        var contents = fs.readFileSync(filename, 'utf-8');
-        if (contents) {
-            // Windows is the BOM. Skip the Byte Order Mark.
-            contents = contents.substring(contents.indexOf('<'));
-        }
-        return new et.ElementTree(et.XML(contents));
-    },
-
-    resolveParent: function (doc, selector) {
-        var parent, tagName, subSelector;
-
-        // handle absolute selector (which elementtree doesn't like)
-        if (ROOT.test(selector)) {
-            tagName = selector.match(ROOT)[1];
-            // test for wildcard "any-tag" root selector
-            if (tagName === '*' || tagName === doc._root.tag) {
-                parent = doc._root;
-
-                // could be an absolute path, but not selecting the root
-                if (ABSOLUTE.test(selector)) {
-                    subSelector = selector.match(ABSOLUTE)[2];
-                    parent = parent.find(subSelector);
-                }
-            } else {
-                return false;
-            }
-        } else {
-            parent = doc.find(selector);
-        }
-        return parent;
-    }
-};
-
-function findChild (node, parent) {
-    var matchingKids = parent.findall(node.tag);
-    var i;
-    var j;
-
-    for (i = 0, j = matchingKids.length; i < j; i++) {
-        if (module.exports.equalNodes(node, matchingKids[i])) {
-            return matchingKids[i];
-        }
-    }
-    return null;
-}
-
-function uniqueChild (node, parent) {
-    var matchingKids = parent.findall(node.tag);
-    var i = 0;
-
-    if (matchingKids.length === 0) {
-        return true;
-    } else {
-        for (i; i < matchingKids.length; i++) {
-            if (module.exports.equalNodes(node, matchingKids[i])) {
-                return false;
-            }
-        }
-        return true;
-    }
-}
-
-// Find the index at which to insert an entry. After is a ;-separated priority list
-// of tags after which the insertion should be made. E.g. If we need to
-// insert an element C, and the rule is that the order of children has to be
-// As, Bs, Cs. After will be equal to "C;B;A".
-function findInsertIdx (children, after) {
-    var childrenTags = children.map(function (child) { return child.tag; });
-    var afters = after.split(';');
-    var afterIndexes = afters.map(function (current) { return childrenTags.lastIndexOf(current); });
-    var foundIndex = _.find(afterIndexes, function (index) { return index !== -1; });
-
-    // add to the beginning if no matching nodes are found
-    return typeof foundIndex === 'undefined' ? 0 : foundIndex + 1;
-}
-
-var BLACKLIST = ['platform', 'feature', 'plugin', 'engine'];
-var SINGLETONS = ['content', 'author', 'name'];
-function mergeXml (src, dest, platform, clobber) {
-    // Do nothing for blacklisted tags.
-    if (BLACKLIST.indexOf(src.tag) !== -1) return;
-
-    // Handle attributes
-    Object.getOwnPropertyNames(src.attrib).forEach(function (attribute) {
-        if (clobber || !dest.attrib[attribute]) {
-            dest.attrib[attribute] = src.attrib[attribute];
-        }
-    });
-    // Handle text
-    if (src.text && (clobber || !dest.text)) {
-        dest.text = src.text;
-    }
-    // Handle children
-    src.getchildren().forEach(mergeChild);
-
-    // Handle platform
-    if (platform) {
-        src.findall('platform[@name="' + platform + '"]').forEach(function (platformElement) {
-            platformElement.getchildren().forEach(mergeChild);
-        });
-    }
-
-    // Handle duplicate preference tags (by name attribute)
-    removeDuplicatePreferences(dest);
-
-    function mergeChild (srcChild) {
-        var srcTag = srcChild.tag;
-        var destChild = new et.Element(srcTag);
-        var foundChild;
-        var query = srcTag + '';
-        var shouldMerge = true;
-
-        if (BLACKLIST.indexOf(srcTag) !== -1) return;
-
-        if (SINGLETONS.indexOf(srcTag) !== -1) {
-            foundChild = dest.find(query);
-            if (foundChild) {
-                destChild = foundChild;
-                dest.remove(destChild);
-            }
-        } else {
-            // Check for an exact match and if you find one don't add
-            var mergeCandidates = dest.findall(query)
-                .filter(function (foundChild) {
-                    return foundChild && textMatch(srcChild, foundChild) && attribMatch(srcChild, foundChild);
-                });
-
-            if (mergeCandidates.length > 0) {
-                destChild = mergeCandidates[0];
-                dest.remove(destChild);
-                shouldMerge = false;
-            }
-        }
-
-        mergeXml(srcChild, destChild, platform, clobber && shouldMerge);
-        dest.append(destChild);
-    }
-
-    function removeDuplicatePreferences (xml) {
-        // reduce preference tags to a hashtable to remove dupes
-        var prefHash = xml.findall('preference[@name][@value]').reduce(function (previousValue, currentValue) {
-            previousValue[ currentValue.attrib.name ] = currentValue.attrib.value;
-            return previousValue;
-        }, {});
-
-        // remove all preferences
-        xml.findall('preference[@name][@value]').forEach(function (pref) {
-            xml.remove(pref);
-        });
-
-        // write new preferences
-        Object.keys(prefHash).forEach(function (key, index) {
-            var element = et.SubElement(xml, 'preference');
-            element.set('name', key);
-            element.set('value', this[key]);
-        }, prefHash);
-    }
-}
-
-// Expose for testing.
-module.exports.mergeXml = mergeXml;
-
-function textMatch (elm1, elm2) {
-    var text1 = elm1.text ? elm1.text.replace(/\s+/, '') : '';
-    var text2 = elm2.text ? elm2.text.replace(/\s+/, '') : '';
-    return (text1 === '' || text1 === text2);
-}
-
-function attribMatch (one, two) {
-    var oneAttribKeys = Object.keys(one.attrib);
-    var twoAttribKeys = Object.keys(two.attrib);
-
-    if (oneAttribKeys.length !== twoAttribKeys.length) {
-        return false;
-    }
-
-    for (var i = 0; i < oneAttribKeys.length; i++) {
-        var attribName = oneAttribKeys[i];
-
-        if (one.attrib[attribName] !== two.attrib[attribName]) {
-            return false;
-        }
-    }
-
-    return true;
-}
diff --git a/node_modules/cordova-registry-mapper/.npmignore b/node_modules/cordova-registry-mapper/.npmignore
deleted file mode 100644
index 3c3629e..0000000
--- a/node_modules/cordova-registry-mapper/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/node_modules/cordova-registry-mapper/.travis.yml b/node_modules/cordova-registry-mapper/.travis.yml
deleted file mode 100644
index ae381fc..0000000
--- a/node_modules/cordova-registry-mapper/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: node_js
-sudo: false 
-node_js:
-  - "0.10"
-install: npm install
-script:
-  - npm test
diff --git a/node_modules/cordova-registry-mapper/README.md b/node_modules/cordova-registry-mapper/README.md
deleted file mode 100644
index 3b93e5f..0000000
--- a/node_modules/cordova-registry-mapper/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-[![Build Status](https://travis-ci.org/stevengill/cordova-registry-mapper.svg?branch=master)](https://travis-ci.org/stevengill/cordova-registry-mapper)
-
-#Cordova Registry Mapper
-
-This module is used to map Cordova plugin ids to package names and vice versa.
-
-When Cordova users add plugins to their projects using ids
-(e.g. `cordova plugin add org.apache.cordova.device`),
-this module will map that id to the corresponding package name so `cordova-lib` knows what to fetch from **npm**.
-
-This module was created so the Apache Cordova project could migrate its plugins from
-the [Cordova Registry](http://registry.cordova.io/)
-to [npm](https://registry.npmjs.com/)
-instead of having to maintain a registry.
diff --git a/node_modules/cordova-registry-mapper/index.js b/node_modules/cordova-registry-mapper/index.js
deleted file mode 100644
index 4550774..0000000
--- a/node_modules/cordova-registry-mapper/index.js
+++ /dev/null
@@ -1,204 +0,0 @@
-var map = {
-    'org.apache.cordova.battery-status':'cordova-plugin-battery-status',
-    'org.apache.cordova.camera':'cordova-plugin-camera',
-    'org.apache.cordova.console':'cordova-plugin-console',
-    'org.apache.cordova.contacts':'cordova-plugin-contacts',
-    'org.apache.cordova.device':'cordova-plugin-device',
-    'org.apache.cordova.device-motion':'cordova-plugin-device-motion',
-    'org.apache.cordova.device-orientation':'cordova-plugin-device-orientation',
-    'org.apache.cordova.dialogs':'cordova-plugin-dialogs',
-    'org.apache.cordova.file':'cordova-plugin-file',
-    'org.apache.cordova.file-transfer':'cordova-plugin-file-transfer',
-    'org.apache.cordova.geolocation':'cordova-plugin-geolocation',
-    'org.apache.cordova.globalization':'cordova-plugin-globalization',
-    'org.apache.cordova.inappbrowser':'cordova-plugin-inappbrowser',
-    'org.apache.cordova.media':'cordova-plugin-media',
-    'org.apache.cordova.media-capture':'cordova-plugin-media-capture',
-    'org.apache.cordova.network-information':'cordova-plugin-network-information',
-    'org.apache.cordova.splashscreen':'cordova-plugin-splashscreen',
-    'org.apache.cordova.statusbar':'cordova-plugin-statusbar',
-    'org.apache.cordova.vibration':'cordova-plugin-vibration',
-    'org.apache.cordova.test-framework':'cordova-plugin-test-framework',
-    'com.msopentech.websql' : 'cordova-plugin-websql',
-    'com.msopentech.indexeddb' : 'cordova-plugin-indexeddb',
-    'com.microsoft.aad.adal' : 'cordova-plugin-ms-adal',
-    'com.microsoft.capptain' : 'capptain-cordova',
-    'com.microsoft.services.aadgraph' : 'cordova-plugin-ms-aad-graph',
-    'com.microsoft.services.files' : 'cordova-plugin-ms-files',
-    'om.microsoft.services.outlook' : 'cordova-plugin-ms-outlook',
-    'com.pbakondy.sim' : 'cordova-plugin-sim',
-    'android.support.v4' : 'cordova-plugin-android-support-v4',
-    'android.support.v7-appcompat' : 'cordova-plugin-android-support-v7-appcompat',
-    'com.google.playservices' : 'cordova-plugin-googleplayservices',
-    'com.google.cordova.admob' : 'cordova-plugin-admobpro',
-    'com.rjfun.cordova.extension' : 'cordova-plugin-extension',
-    'com.rjfun.cordova.plugin.admob' : 'cordova-plugin-admob',
-    'com.rjfun.cordova.flurryads' : 'cordova-plugin-flurry',
-    'com.rjfun.cordova.facebookads' : 'cordova-plugin-facebookads',
-    'com.rjfun.cordova.httpd' : 'cordova-plugin-httpd',
-    'com.rjfun.cordova.iad' : 'cordova-plugin-iad',
-    'com.rjfun.cordova.iflyspeech' : 'cordova-plugin-iflyspeech',
-    'com.rjfun.cordova.lianlianpay' : 'cordova-plugin-lianlianpay',
-    'com.rjfun.cordova.mobfox' : 'cordova-plugin-mobfox',
-    'com.rjfun.cordova.mopub' : 'cordova-plugin-mopub',
-    'com.rjfun.cordova.mmedia' : 'cordova-plugin-mmedia',
-    'com.rjfun.cordova.nativeaudio' : 'cordova-plugin-nativeaudio',
-    'com.rjfun.cordova.plugin.paypalmpl' : 'cordova-plugin-paypalmpl',
-    'com.rjfun.cordova.smartadserver' : 'cordova-plugin-smartadserver',
-    'com.rjfun.cordova.sms' : 'cordova-plugin-sms',
-    'com.rjfun.cordova.wifi' : 'cordova-plugin-wifi',
-    'com.ohh2ahh.plugins.appavailability' : 'cordova-plugin-appavailability',
-    'org.adapt-it.cordova.fonts' : 'cordova-plugin-fonts',
-    'de.martinreinhardt.cordova.plugins.barcodeScanner' : 'cordova-plugin-barcodescanner',
-    'de.martinreinhardt.cordova.plugins.urlhandler' : 'cordova-plugin-urlhandler',
-    'de.martinreinhardt.cordova.plugins.email' : 'cordova-plugin-email',
-    'de.martinreinhardt.cordova.plugins.certificates' : 'cordova-plugin-certificates',
-    'de.martinreinhardt.cordova.plugins.sqlite' : 'cordova-plugin-sqlite',
-    'fr.smile.cordova.fileopener' : 'cordova-plugin-fileopener',
-    'org.smile.websqldatabase.initializer' : 'cordova-plugin-websqldatabase-initializer',
-    'org.smile.websqldatabase.wpdb' : 'cordova-plugin-websqldatabase',
-    'org.jboss.aerogear.cordova.push' : 'aerogear-cordova-push',
-    'org.jboss.aerogear.cordova.oauth2' : 'aerogear-cordova-oauth2',
-    'org.jboss.aerogear.cordova.geo' : 'aerogear-cordova-geo',
-    'org.jboss.aerogear.cordova.crypto' : 'aerogear-cordova-crypto',
-    'org.jboss.aerogaer.cordova.otp' : 'aerogear-cordova-otp',
-    'uk.co.ilee.applewatch' : 'cordova-plugin-apple-watch',
-    'uk.co.ilee.directions' : 'cordova-plugin-directions',
-    'uk.co.ilee.gamecenter' : 'cordova-plugin-game-center',
-    'uk.co.ilee.jailbreakdetection' : 'cordova-plugin-jailbreak-detection',
-    'uk.co.ilee.nativetransitions' : 'cordova-plugin-native-transitions',
-    'uk.co.ilee.pedometer' : 'cordova-plugin-pedometer',
-    'uk.co.ilee.shake' : 'cordova-plugin-shake',
-    'uk.co.ilee.touchid' : 'cordova-plugin-touchid',
-    'com.knowledgecode.cordova.websocket' : 'cordova-plugin-websocket',
-    'com.elixel.plugins.settings' : 'cordova-plugin-settings',
-    'com.cowbell.cordova.geofence' : 'cordova-plugin-geofence',
-    'com.blackberry.community.preventsleep' : 'cordova-plugin-preventsleep',
-    'com.blackberry.community.gamepad' : 'cordova-plugin-gamepad',
-    'com.blackberry.community.led' : 'cordova-plugin-led',
-    'com.blackberry.community.thumbnail' : 'cordova-plugin-thumbnail',
-    'com.blackberry.community.mediakeys' : 'cordova-plugin-mediakeys',
-    'com.blackberry.community.simplebtlehrplugin' : 'cordova-plugin-bluetoothheartmonitor',
-    'com.blackberry.community.simplebeaconplugin' : 'cordova-plugin-bluetoothibeacon',
-    'com.blackberry.community.simplebtsppplugin' : 'cordova-plugin-bluetoothspp',
-    'com.blackberry.community.clipboard' : 'cordova-plugin-clipboard',
-    'com.blackberry.community.curl' : 'cordova-plugin-curl',
-    'com.blackberry.community.qt' : 'cordova-plugin-qtbridge',
-    'com.blackberry.community.upnp' : 'cordova-plugin-upnp',
-    'com.blackberry.community.PasswordCrypto' : 'cordova-plugin-password-crypto',
-    'com.blackberry.community.deviceinfoplugin' : 'cordova-plugin-deviceinfo',
-    'com.blackberry.community.gsecrypto' : 'cordova-plugin-bb-crypto',
-    'com.blackberry.community.mongoose' : 'cordova-plugin-mongoose',
-    'com.blackberry.community.sysdialog' : 'cordova-plugin-bb-sysdialog',
-    'com.blackberry.community.screendisplay' : 'cordova-plugin-screendisplay',
-    'com.blackberry.community.messageplugin' : 'cordova-plugin-bb-messageretrieve',
-    'com.blackberry.community.emailsenderplugin' : 'cordova-plugin-emailsender',
-    'com.blackberry.community.audiometadata' : 'cordova-plugin-audiometadata',
-    'com.blackberry.community.deviceemails' : 'cordova-plugin-deviceemails',
-    'com.blackberry.community.audiorecorder' : 'cordova-plugin-audiorecorder',
-    'com.blackberry.community.vibration' : 'cordova-plugin-vibrate-intense',
-    'com.blackberry.community.SMSPlugin' : 'cordova-plugin-bb-sms',
-    'com.blackberry.community.extractZipFile' : 'cordova-plugin-bb-zip',
-    'com.blackberry.community.lowlatencyaudio' : 'cordova-plugin-bb-nativeaudio',
-    'com.blackberry.community.barcodescanner' : 'phonegap-plugin-barcodescanner',
-    'com.blackberry.app' : 'cordova-plugin-bb-app',
-    'com.blackberry.bbm.platform' : 'cordova-plugin-bbm',
-    'com.blackberry.connection' : 'cordova-plugin-bb-connection',
-    'com.blackberry.identity' : 'cordova-plugin-bb-identity',
-    'com.blackberry.invoke.card' : 'cordova-plugin-bb-card',
-    'com.blackberry.invoke' : 'cordova-plugin-bb-invoke',
-    'com.blackberry.invoked' : 'cordova-plugin-bb-invoked',
-    'com.blackberry.io.filetransfer' : 'cordova-plugin-bb-filetransfer',
-    'com.blackberry.io' : 'cordova-plugin-bb-io',
-    'com.blackberry.notification' : 'cordova-plugin-bb-notification',
-    'com.blackberry.payment' : 'cordova-plugin-bb-payment',
-    'com.blackberry.pim.calendar' : 'cordova-plugin-bb-calendar',
-    'com.blackberry.pim.contacts' : 'cordova-plugin-bb-contacts',
-    'com.blackberry.pim.lib' : 'cordova-plugin-bb-pimlib',
-    'com.blackberry.push' : 'cordova-plugin-bb-push',
-    'com.blackberry.screenshot' : 'cordova-plugin-screenshot',
-    'com.blackberry.sensors' : 'cordova-plugin-bb-sensors',
-    'com.blackberry.system' : 'cordova-plugin-bb-system',
-    'com.blackberry.ui.contextmenu' : 'cordova-plugin-bb-ctxmenu',
-    'com.blackberry.ui.cover' : 'cordova-plugin-bb-cover',
-    'com.blackberry.ui.dialog' : 'cordova-plugin-bb-dialog',
-    'com.blackberry.ui.input' : 'cordova-plugin-touch-keyboard',
-    'com.blackberry.ui.toast' : 'cordova-plugin-toast',
-    'com.blackberry.user.identity' : 'cordova-plugin-bb-idservice',
-    'com.blackberry.utils' : 'cordova-plugin-bb-utils',
-    'net.yoik.cordova.plugins.screenorientation' : 'cordova-plugin-screen-orientation',
-    'com.phonegap.plugins.barcodescanner' : 'phonegap-plugin-barcodescanner',
-    'com.manifoldjs.hostedwebapp' : 'cordova-plugin-hostedwebapp',
-    'com.initialxy.cordova.themeablebrowser' : 'cordova-plugin-themeablebrowser',
-    'gr.denton.photosphere' : 'cordova-plugin-panoramaviewer',
-    'nl.x-services.plugins.actionsheet' : 'cordova-plugin-actionsheet',
-    'nl.x-services.plugins.socialsharing' : 'cordova-plugin-x-socialsharing',
-    'nl.x-services.plugins.googleplus' : 'cordova-plugin-googleplus',
-    'nl.x-services.plugins.insomnia' : 'cordova-plugin-insomnia',
-    'nl.x-services.plugins.toast' : 'cordova-plugin-x-toast',
-    'nl.x-services.plugins.calendar' : 'cordova-plugin-calendar',
-    'nl.x-services.plugins.launchmyapp' : 'cordova-plugin-customurlscheme',
-    'nl.x-services.plugins.flashlight' : 'cordova-plugin-flashlight',
-    'nl.x-services.plugins.sslcertificatechecker' : 'cordova-plugin-sslcertificatechecker',
-    'com.bridge.open' : 'cordova-open',
-    'com.bridge.safe' : 'cordova-safe',
-    'com.disusered.open' : 'cordova-open',
-    'com.disusered.safe' : 'cordova-safe',
-    'me.apla.cordova.app-preferences' : 'cordova-plugin-app-preferences',
-    'com.konotor.cordova' : 'cordova-plugin-konotor',
-    'io.intercom.cordova' : 'cordova-plugin-intercom',
-    'com.onesignal.plugins.onesignal' : 'onesignal-cordova-plugin',
-    'com.danjarvis.document-contract': 'cordova-plugin-document-contract',
-    'com.eface2face.iosrtc' : 'cordova-plugin-iosrtc',
-    'com.mobileapptracking.matplugin' : 'cordova-plugin-tune',
-    'com.marianhello.cordova.background-geolocation' : 'cordova-plugin-mauron85-background-geolocation',
-    'fr.louisbl.cordova.locationservices' : 'cordova-plugin-locationservices',
-    'fr.louisbl.cordova.gpslocation' : 'cordova-plugin-gpslocation',
-    'com.hiliaox.weibo' : 'cordova-plugin-weibo',
-    'com.uxcam.cordova.plugin' : 'cordova-uxcam',
-    'de.fastr.phonegap.plugins.downloader' : 'cordova-plugin-fastrde-downloader',
-    'de.fastr.phonegap.plugins.injectView' : 'cordova-plugin-fastrde-injectview',
-    'de.fastr.phonegap.plugins.CheckGPS' : 'cordova-plugin-fastrde-checkgps',
-    'de.fastr.phonegap.plugins.md5chksum' : 'cordova-plugin-fastrde-md5',
-    'io.repro.cordova' : 'cordova-plugin-repro',
-    're.notifica.cordova': 'cordova-plugin-notificare-push',
-    'com.megster.cordova.ble': 'cordova-plugin-ble-central',
-    'com.megster.cordova.bluetoothserial': 'cordova-plugin-bluetooth-serial',
-    'com.megster.cordova.rfduino': 'cordova-plugin-rfduino',
-    'cz.velda.cordova.plugin.devicefeedback': 'cordova-plugin-velda-devicefeedback',
-    'cz.Velda.cordova.plugin.devicefeedback': 'cordova-plugin-velda-devicefeedback',
-    'org.scriptotek.appinfo': 'cordova-plugin-appinfo',
-    'com.yezhiming.cordova.appinfo': 'cordova-plugin-appinfo',
-    'pl.makingwaves.estimotebeacons': 'cordova-plugin-estimote',
-    'com.evothings.ble': 'cordova-plugin-ble',
-    'com.appsee.plugin' : 'cordova-plugin-appsee',
-    'am.armsoft.plugins.listpicker': 'cordova-plugin-listpicker',
-    'com.pushbots.push': 'pushbots-cordova-plugin',
-    'com.admob.google': 'cordova-admob',
-    'admob.ads.google': 'cordova-admob-ads',
-    'admob.google.plugin': 'admob-google',
-    'com.admob.admobads': 'admob-ads',
-    'com.connectivity.monitor': 'cordova-connectivity-monitor',
-    'com.ios.libgoogleadmobads': 'cordova-libgoogleadmobads',
-    'com.google.play.services': 'cordova-google-play-services',
-    'android.support.v13': 'cordova-android-support-v13',
-    'android.support.v4': 'cordova-android-support-v4', // Duplicated key ;)
-    'com.analytics.google': 'cordova-plugin-analytics',
-    'com.analytics.adid.google': 'cordova-plugin-analytics-adid',
-    'com.chariotsolutions.nfc.plugin': 'phonegap-nfc',
-    'com.samz.mixpanel': 'cordova-plugin-mixpanel',
-    'de.appplant.cordova.common.RegisterUserNotificationSettings': 'cordova-plugin-registerusernotificationsettings',
-    'plugin.google.maps': 'cordova-plugin-googlemaps',
-    'xu.li.cordova.wechat': 'cordova-plugin-wechat',
-    'es.keensoft.fullscreenimage': 'cordova-plugin-fullscreenimage',
-    'com.arcoirislabs.plugin.mqtt' : 'cordova-plugin-mqtt'
-};
-
-module.exports.oldToNew = map;
-
-var reverseMap = {};
-Object.keys(map).forEach(function(elem){
-    reverseMap[map[elem]] = elem;
-});
-
-module.exports.newToOld = reverseMap;
diff --git a/node_modules/cordova-registry-mapper/package.json b/node_modules/cordova-registry-mapper/package.json
deleted file mode 100644
index 8bdee00..0000000
--- a/node_modules/cordova-registry-mapper/package.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
-  "_args": [
-    [
-      "cordova-registry-mapper@1.1.15",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "cordova-registry-mapper@1.1.15",
-  "_id": "cordova-registry-mapper@1.1.15",
-  "_inBundle": false,
-  "_integrity": "sha1-4kS5GFuBdUc7/2B5MkkFEV+D3Hw=",
-  "_location": "/cordova-registry-mapper",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "cordova-registry-mapper@1.1.15",
-    "name": "cordova-registry-mapper",
-    "escapedName": "cordova-registry-mapper",
-    "rawSpec": "1.1.15",
-    "saveSpec": null,
-    "fetchSpec": "1.1.15"
-  },
-  "_requiredBy": [
-    "/cordova-common"
-  ],
-  "_resolved": "https://registry.npmjs.org/cordova-registry-mapper/-/cordova-registry-mapper-1.1.15.tgz",
-  "_spec": "1.1.15",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Steve Gill"
-  },
-  "bugs": {
-    "url": "https://github.com/stevengill/cordova-registry-mapper/issues"
-  },
-  "description": "Maps old plugin ids to new plugin names for fetching from npm",
-  "devDependencies": {
-    "tape": "^3.5.0"
-  },
-  "homepage": "https://github.com/stevengill/cordova-registry-mapper#readme",
-  "keywords": [
-    "cordova",
-    "plugins"
-  ],
-  "license": "Apache version 2.0",
-  "main": "index.js",
-  "name": "cordova-registry-mapper",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/stevengill/cordova-registry-mapper.git"
-  },
-  "scripts": {
-    "test": "node tests/test.js"
-  },
-  "version": "1.1.15"
-}
diff --git a/node_modules/cordova-registry-mapper/tests/test.js b/node_modules/cordova-registry-mapper/tests/test.js
deleted file mode 100644
index 35343be..0000000
--- a/node_modules/cordova-registry-mapper/tests/test.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var test = require('tape');
-var oldToNew = require('../index').oldToNew;
-var newToOld = require('../index').newToOld;
-
-test('plugin mappings exist', function(t) {
-    t.plan(2);
-
-    t.equal('cordova-plugin-device', oldToNew['org.apache.cordova.device']);
-
-    t.equal('org.apache.cordova.device', newToOld['cordova-plugin-device']);
-})
diff --git a/node_modules/elementtree/.npmignore b/node_modules/elementtree/.npmignore
deleted file mode 100644
index 3c3629e..0000000
--- a/node_modules/elementtree/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/node_modules/elementtree/.travis.yml b/node_modules/elementtree/.travis.yml
deleted file mode 100644
index 1ab2652..0000000
--- a/node_modules/elementtree/.travis.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-language: node_js
-sudo: false
-
-node_js:
-  - "0.10"
-  - "0.11"
-  - "0.12"
-  - "iojs"
-
-script: make test
-
-notifications:
-  email:
-    - tomaz+travisci@tomaz.me
diff --git a/node_modules/elementtree/CHANGES.md b/node_modules/elementtree/CHANGES.md
deleted file mode 100644
index 08fdb1f..0000000
--- a/node_modules/elementtree/CHANGES.md
+++ /dev/null
@@ -1,39 +0,0 @@
-elementtree v0.1.6 - 2014-02-06
-
-* Add support for CData elements. (#14)
-  [hermannpencole]
-
-elementtree v0.1.5 - 2012-11-14
-
-* Fix a bug in the find() and findtext() method which could manifest itself
-  under some conditions.
-  [metagriffin]
-
-elementtree v0.1.4 - 2012-10-15
-
-* Allow user to use namespaced attributes when using find* functions.
-  [Andrew Lunny]
-
-elementtree v0.1.3 - 2012-09-21
-
-* Improve the output of text content in the tags (strip unnecessary line break
-  characters).
-
-[Darryl Pogue]
-
-elementtree v0.1.2 - 2012-09-04
-
- * Allow user to pass 'indent' option to ElementTree.write method. If this
-   option is specified (e.g. {'indent': 4}). XML will be pretty printed.
-   [Darryl Pogue, Tomaz Muraus]
-
- * Bump sax dependency version.
-
-elementtree v0.1.1 - 2011-09-23
-
- * Improve special character escaping.
-   [Ryan Phillips]
-
-elementtree v0.1.0 - 2011-09-05
-
- * Initial release.
diff --git a/node_modules/elementtree/LICENSE.txt b/node_modules/elementtree/LICENSE.txt
deleted file mode 100644
index 6b0b127..0000000
--- a/node_modules/elementtree/LICENSE.txt
+++ /dev/null
@@ -1,203 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
diff --git a/node_modules/elementtree/Makefile b/node_modules/elementtree/Makefile
deleted file mode 100755
index ab7c4e0..0000000
--- a/node_modules/elementtree/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-TESTS := \
-	tests/test-simple.js
-
-
-
-PATH := ./node_modules/.bin:$(PATH)
-
-WHISKEY := $(shell bash -c 'PATH=$(PATH) type -p whiskey')
-
-default: test
-
-test:
-	NODE_PATH=`pwd`/lib/ ${WHISKEY} --scope-leaks --sequential --real-time --tests "${TESTS}"
-
-tap:
-	NODE_PATH=`pwd`/lib/ ${WHISKEY} --test-reporter tap --sequential --real-time --tests "${TESTS}"
-
-coverage:
-	NODE_PATH=`pwd`/lib/ ${WHISKEY} --sequential --coverage  --coverage-reporter html --coverage-dir coverage_html --tests "${TESTS}"
-
-.PHONY: default test coverage tap scope
diff --git a/node_modules/elementtree/NOTICE b/node_modules/elementtree/NOTICE
deleted file mode 100644
index 28ad70a..0000000
--- a/node_modules/elementtree/NOTICE
+++ /dev/null
@@ -1,5 +0,0 @@
-node-elementtree
-Copyright (c) 2011, Rackspace, Inc.
-
-The ElementTree toolkit is Copyright (c) 1999-2007 by Fredrik Lundh
-
diff --git a/node_modules/elementtree/README.md b/node_modules/elementtree/README.md
deleted file mode 100644
index 738420c..0000000
--- a/node_modules/elementtree/README.md
+++ /dev/null
@@ -1,141 +0,0 @@
-node-elementtree
-====================
-
-node-elementtree is a [Node.js](http://nodejs.org) XML parser and serializer based upon the [Python ElementTree v1.3](http://effbot.org/zone/element-index.htm) module.
-
-Installation
-====================
-
-    $ npm install elementtree
-    
-Using the library
-====================
-
-For the usage refer to the Python ElementTree library documentation - [http://effbot.org/zone/element-index.htm#usage](http://effbot.org/zone/element-index.htm#usage).
-
-Supported XPath expressions in `find`, `findall` and `findtext` methods are listed on [http://effbot.org/zone/element-xpath.htm](http://effbot.org/zone/element-xpath.htm).
-
-Example 1 – Creating An XML Document
-====================
-
-This example shows how to build a valid XML document that can be published to
-Atom Hopper. Atom Hopper is used internally as a bridge from products all the
-way to collecting revenue, called “Usage.”  MaaS and other products send similar
-events to it every time user performs an action on a resource
-(e.g. creates,updates or deletes). Below is an example of leveraging the API
-to create a new XML document.
-
-```javascript
-var et = require('elementtree');
-var XML = et.XML;
-var ElementTree = et.ElementTree;
-var element = et.Element;
-var subElement = et.SubElement;
-
-var date, root, tenantId, serviceName, eventType, usageId, dataCenter, region,
-checks, resourceId, category, startTime, resourceName, etree, xml;
-
-date = new Date();
-
-root = element('entry');
-root.set('xmlns', 'http://www.w3.org/2005/Atom');
-
-tenantId = subElement(root, 'TenantId');
-tenantId.text = '12345';
-
-serviceName = subElement(root, 'ServiceName');
-serviceName.text = 'MaaS';
-
-resourceId = subElement(root, 'ResourceID');
-resourceId.text = 'enAAAA';
-
-usageId = subElement(root, 'UsageID');
-usageId.text = '550e8400-e29b-41d4-a716-446655440000';
-
-eventType = subElement(root, 'EventType');
-eventType.text = 'create';
-
-category = subElement(root, 'category');
-category.set('term', 'monitoring.entity.create');
-
-dataCenter = subElement(root, 'DataCenter');
-dataCenter.text = 'global';
-
-region = subElement(root, 'Region');
-region.text = 'global';
-
-startTime = subElement(root, 'StartTime');
-startTime.text = date;
-
-resourceName = subElement(root, 'ResourceName');
-resourceName.text = 'entity';
-
-etree = new ElementTree(root);
-xml = etree.write({'xml_declaration': false});
-console.log(xml);
-```
-
-As you can see, both et.Element and et.SubElement are factory methods which
-return a new instance of Element and SubElement class, respectively.
-When you create a new element (tag) you can use set method to set an attribute.
-To set the tag value, assign a value to the .text attribute.
-
-This example would output a document that looks like this:
-
-```xml
-<entry xmlns="http://www.w3.org/2005/Atom">
-  <TenantId>12345</TenantId>
-  <ServiceName>MaaS</ServiceName>
-  <ResourceID>enAAAA</ResourceID>
-  <UsageID>550e8400-e29b-41d4-a716-446655440000</UsageID>
-  <EventType>create</EventType>
-  <category term="monitoring.entity.create"/>
-  <DataCenter>global</DataCenter>
-  <Region>global</Region>
-  <StartTime>Sun Apr 29 2012 16:37:32 GMT-0700 (PDT)</StartTime>
-  <ResourceName>entity</ResourceName>
-</entry>
-```
-
-Example 2 – Parsing An XML Document
-====================
-
-This example shows how to parse an XML document and use simple XPath selectors.
-For demonstration purposes, we will use the XML document located at
-https://gist.github.com/2554343.
-
-Behind the scenes, node-elementtree uses Isaac’s sax library for parsing XML,
-but the library has a concept of “parsers,” which means it’s pretty simple to
-add support for a different parser.
-
-```javascript
-var fs = require('fs');
-
-var et = require('elementtree');
-
-var XML = et.XML;
-var ElementTree = et.ElementTree;
-var element = et.Element;
-var subElement = et.SubElement;
-
-var data, etree;
-
-data = fs.readFileSync('document.xml').toString();
-etree = et.parse(data);
-
-console.log(etree.findall('./entry/TenantId').length); // 2
-console.log(etree.findtext('./entry/ServiceName')); // MaaS
-console.log(etree.findall('./entry/category')[0].get('term')); // monitoring.entity.create
-console.log(etree.findall('*/category/[@term="monitoring.entity.update"]').length); // 1
-```
-
-Build status
-====================
-
-[![Build Status](https://secure.travis-ci.org/racker/node-elementtree.png)](http://travis-ci.org/racker/node-elementtree)
-
-
-License
-====================
-
-node-elementtree is distributed under the [Apache license](http://www.apache.org/licenses/LICENSE-2.0.html).
diff --git a/node_modules/elementtree/lib/constants.js b/node_modules/elementtree/lib/constants.js
deleted file mode 100644
index b057faf..0000000
--- a/node_modules/elementtree/lib/constants.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-var DEFAULT_PARSER = 'sax';
-
-exports.DEFAULT_PARSER = DEFAULT_PARSER;
diff --git a/node_modules/elementtree/lib/elementpath.js b/node_modules/elementtree/lib/elementpath.js
deleted file mode 100644
index 2e93f47..0000000
--- a/node_modules/elementtree/lib/elementpath.js
+++ /dev/null
@@ -1,343 +0,0 @@
-/**
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-var sprintf = require('./sprintf').sprintf;
-
-var utils = require('./utils');
-var SyntaxError = require('./errors').SyntaxError;
-
-var _cache = {};
-
-var RE = new RegExp(
-  "(" +
-  "'[^']*'|\"[^\"]*\"|" +
-  "::|" +
-  "//?|" +
-  "\\.\\.|" +
-  "\\(\\)|" +
-  "[/.*:\\[\\]\\(\\)@=])|" +
-  "((?:\\{[^}]+\\})?[^/\\[\\]\\(\\)@=\\s]+)|" +
-  "\\s+", 'g'
-);
-
-var xpath_tokenizer = utils.findall.bind(null, RE);
-
-function prepare_tag(next, token) {
-  var tag = token[0];
-
-  function select(context, result) {
-    var i, len, elem, rv = [];
-
-    for (i = 0, len = result.length; i < len; i++) {
-      elem = result[i];
-      elem._children.forEach(function(e) {
-        if (e.tag === tag) {
-          rv.push(e);
-        }
-      });
-    }
-
-    return rv;
-  }
-
-  return select;
-}
-
-function prepare_star(next, token) {
-  function select(context, result) {
-    var i, len, elem, rv = [];
-
-    for (i = 0, len = result.length; i < len; i++) {
-      elem = result[i];
-      elem._children.forEach(function(e) {
-        rv.push(e);
-      });
-    }
-
-    return rv;
-  }
-
-  return select;
-}
-
-function prepare_dot(next, token) {
-  function select(context, result) {
-    var i, len, elem, rv = [];
-
-    for (i = 0, len = result.length; i < len; i++) {
-      elem = result[i];
-      rv.push(elem);
-    }
-
-    return rv;
-  }
-
-  return select;
-}
-
-function prepare_iter(next, token) {
-  var tag;
-  token = next();
-
-  if (token[1] === '*') {
-    tag = '*';
-  }
-  else if (!token[1]) {
-    tag = token[0] || '';
-  }
-  else {
-    throw new SyntaxError(token);
-  }
-
-  function select(context, result) {
-    var i, len, elem, rv = [];
-
-    for (i = 0, len = result.length; i < len; i++) {
-      elem = result[i];
-      elem.iter(tag, function(e) {
-        if (e !== elem) {
-          rv.push(e);
-        }
-      });
-    }
-
-    return rv;
-  }
-
-  return select;
-}
-
-function prepare_dot_dot(next, token) {
-  function select(context, result) {
-    var i, len, elem, rv = [], parent_map = context.parent_map;
-
-    if (!parent_map) {
-      context.parent_map = parent_map = {};
-
-      context.root.iter(null, function(p) {
-        p._children.forEach(function(e) {
-          parent_map[e] = p;
-        });
-      });
-    }
-
-    for (i = 0, len = result.length; i < len; i++) {
-      elem = result[i];
-
-      if (parent_map.hasOwnProperty(elem)) {
-        rv.push(parent_map[elem]);
-      }
-    }
-
-    return rv;
-  }
-
-  return select;
-}
-
-
-function prepare_predicate(next, token) {
-  var tag, key, value, select;
-  token = next();
-
-  if (token[1] === '@') {
-    // attribute
-    token = next();
-
-    if (token[1]) {
-      throw new SyntaxError(token, 'Invalid attribute predicate');
-    }
-
-    key = token[0];
-    token = next();
-
-    if (token[1] === ']') {
-      select = function(context, result) {
-        var i, len, elem, rv = [];
-
-        for (i = 0, len = result.length; i < len; i++) {
-          elem = result[i];
-
-          if (elem.get(key)) {
-            rv.push(elem);
-          }
-        }
-
-        return rv;
-      };
-    }
-    else if (token[1] === '=') {
-      value = next()[1];
-
-      if (value[0] === '"' || value[value.length - 1] === '\'') {
-        value = value.slice(1, value.length - 1);
-      }
-      else {
-        throw new SyntaxError(token, 'Ivalid comparison target');
-      }
-
-      token = next();
-      select = function(context, result) {
-        var i, len, elem, rv = [];
-
-        for (i = 0, len = result.length; i < len; i++) {
-          elem = result[i];
-
-          if (elem.get(key) === value) {
-            rv.push(elem);
-          }
-        }
-
-        return rv;
-      };
-    }
-
-    if (token[1] !== ']') {
-      throw new SyntaxError(token, 'Invalid attribute predicate');
-    }
-  }
-  else if (!token[1]) {
-    tag = token[0] || '';
-    token = next();
-
-    if (token[1] !== ']') {
-      throw new SyntaxError(token, 'Invalid node predicate');
-    }
-
-    select = function(context, result) {
-      var i, len, elem, rv = [];
-
-      for (i = 0, len = result.length; i < len; i++) {
-        elem = result[i];
-
-        if (elem.find(tag)) {
-          rv.push(elem);
-        }
-      }
-
-      return rv;
-    };
-  }
-  else {
-    throw new SyntaxError(null, 'Invalid predicate');
-  }
-
-  return select;
-}
-
-
-
-var ops = {
-  "": prepare_tag,
-  "*": prepare_star,
-  ".": prepare_dot,
-  "..": prepare_dot_dot,
-  "//": prepare_iter,
-  "[": prepare_predicate,
-};
-
-function _SelectorContext(root) {
-  this.parent_map = null;
-  this.root = root;
-}
-
-function findall(elem, path) {
-  var selector, result, i, len, token, value, select, context;
-
-  if (_cache.hasOwnProperty(path)) {
-    selector = _cache[path];
-  }
-  else {
-    // TODO: Use smarter cache purging approach
-    if (Object.keys(_cache).length > 100) {
-      _cache = {};
-    }
-
-    if (path.charAt(0) === '/') {
-      throw new SyntaxError(null, 'Cannot use absolute path on element');
-    }
-
-    result = xpath_tokenizer(path);
-    selector = [];
-
-    function getToken() {
-      return result.shift();
-    }
-
-    token = getToken();
-    while (true) {
-      var c = token[1] || '';
-      value = ops[c](getToken, token);
-
-      if (!value) {
-        throw new SyntaxError(null, sprintf('Invalid path: %s', path));
-      }
-
-      selector.push(value);
-      token = getToken();
-
-      if (!token) {
-        break;
-      }
-      else if (token[1] === '/') {
-        token = getToken();
-      }
-
-      if (!token) {
-        break;
-      }
-    }
-
-    _cache[path] = selector;
-  }
-
-  // Execute slector pattern
-  result = [elem];
-  context = new _SelectorContext(elem);
-
-  for (i = 0, len = selector.length; i < len; i++) {
-    select = selector[i];
-    result = select(context, result);
-  }
-
-  return result || [];
-}
-
-function find(element, path) {
-  var resultElements = findall(element, path);
-
-  if (resultElements && resultElements.length > 0) {
-    return resultElements[0];
-  }
-
-  return null;
-}
-
-function findtext(element, path, defvalue) {
-  var resultElements = findall(element, path);
-
-  if (resultElements && resultElements.length > 0) {
-    return resultElements[0].text;
-  }
-
-  return defvalue;
-}
-
-
-exports.find = find;
-exports.findall = findall;
-exports.findtext = findtext;
diff --git a/node_modules/elementtree/lib/elementtree.js b/node_modules/elementtree/lib/elementtree.js
deleted file mode 100644
index 61d9276..0000000
--- a/node_modules/elementtree/lib/elementtree.js
+++ /dev/null
@@ -1,611 +0,0 @@
-/**
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-var sprintf = require('./sprintf').sprintf;
-
-var utils = require('./utils');
-var ElementPath = require('./elementpath');
-var TreeBuilder = require('./treebuilder').TreeBuilder;
-var get_parser = require('./parser').get_parser;
-var constants = require('./constants');
-
-var element_ids = 0;
-
-function Element(tag, attrib)
-{
-  this._id = element_ids++;
-  this.tag = tag;
-  this.attrib = {};
-  this.text = null;
-  this.tail = null;
-  this._children = [];
-
-  if (attrib) {
-    this.attrib = utils.merge(this.attrib, attrib);
-  }
-}
-
-Element.prototype.toString = function()
-{
-  return sprintf("<Element %s at %s>", this.tag, this._id);
-};
-
-Element.prototype.makeelement = function(tag, attrib)
-{
-  return new Element(tag, attrib);
-};
-
-Element.prototype.len = function()
-{
-  return this._children.length;
-};
-
-Element.prototype.getItem = function(index)
-{
-  return this._children[index];
-};
-
-Element.prototype.setItem = function(index, element)
-{
-  this._children[index] = element;
-};
-
-Element.prototype.delItem = function(index)
-{
-  this._children.splice(index, 1);
-};
-
-Element.prototype.getSlice = function(start, stop)
-{
-  return this._children.slice(start, stop);
-};
-
-Element.prototype.setSlice = function(start, stop, elements)
-{
-  var i;
-  var k = 0;
-  for (i = start; i < stop; i++, k++) {
-    this._children[i] = elements[k];
-  }
-};
-
-Element.prototype.delSlice = function(start, stop)
-{
-  this._children.splice(start, stop - start);
-};
-
-Element.prototype.append = function(element)
-{
-  this._children.push(element);
-};
-
-Element.prototype.extend = function(elements)
-{
-  this._children.concat(elements);
-};
-
-Element.prototype.insert = function(index, element)
-{
-  this._children[index] = element;
-};
-
-Element.prototype.remove = function(element)
-{
-  this._children = this._children.filter(function(e) {
-    /* TODO: is this the right way to do this? */
-    if (e._id === element._id) {
-      return false;
-    }
-    return true;
-  });
-};
-
-Element.prototype.getchildren = function() {
-  return this._children;
-};
-
-Element.prototype.find = function(path)
-{
-  return ElementPath.find(this, path);
-};
-
-Element.prototype.findtext = function(path, defvalue)
-{
-  return ElementPath.findtext(this, path, defvalue);
-};
-
-Element.prototype.findall = function(path, defvalue)
-{
-  return ElementPath.findall(this, path, defvalue);
-};
-
-Element.prototype.clear = function()
-{
-  this.attrib = {};
-  this._children = [];
-  this.text = null;
-  this.tail = null;
-};
-
-Element.prototype.get = function(key, defvalue)
-{
-  if (this.attrib[key] !== undefined) {
-    return this.attrib[key];
-  }
-  else {
-    return defvalue;
-  }
-};
-
-Element.prototype.set = function(key, value)
-{
-  this.attrib[key] = value;
-};
-
-Element.prototype.keys = function()
-{
-  return Object.keys(this.attrib);
-};
-
-Element.prototype.items = function()
-{
-  return utils.items(this.attrib);
-};
-
-/*
- * In python this uses a generator, but in v8 we don't have em,
- * so we use a callback instead.
- **/
-Element.prototype.iter = function(tag, callback)
-{
-  var self = this;
-  var i, child;
-
-  if (tag === "*") {
-    tag = null;
-  }
-
-  if (tag === null || this.tag === tag) {
-    callback(self);
-  }
-
-  for (i = 0; i < this._children.length; i++) {
-    child = this._children[i];
-    child.iter(tag, function(e) {
-      callback(e);
-    });
-  }
-};
-
-Element.prototype.itertext = function(callback)
-{
-  this.iter(null, function(e) {
-    if (e.text) {
-      callback(e.text);
-    }
-
-    if (e.tail) {
-      callback(e.tail);
-    }
-  });
-};
-
-
-function SubElement(parent, tag, attrib) {
-  var element = parent.makeelement(tag, attrib);
-  parent.append(element);
-  return element;
-}
-
-function Comment(text) {
-  var element = new Element(Comment);
-  if (text) {
-    element.text = text;
-  }
-  return element;
-}
-
-function CData(text) {
-  var element = new Element(CData);
-  if (text) {
-    element.text = text;
-  }
-  return element;
-}
-
-function ProcessingInstruction(target, text)
-{
-  var element = new Element(ProcessingInstruction);
-  element.text = target;
-  if (text) {
-    element.text = element.text + " " + text;
-  }
-  return element;
-}
-
-function QName(text_or_uri, tag)
-{
-  if (tag) {
-    text_or_uri = sprintf("{%s}%s", text_or_uri, tag);
-  }
-  this.text = text_or_uri;
-}
-
-QName.prototype.toString = function() {
-  return this.text;
-};
-
-function ElementTree(element)
-{
-  this._root = element;
-}
-
-ElementTree.prototype.getroot = function() {
-  return this._root;
-};
-
-ElementTree.prototype._setroot = function(element) {
-  this._root = element;
-};
-
-ElementTree.prototype.parse = function(source, parser) {
-  if (!parser) {
-    parser = get_parser(constants.DEFAULT_PARSER);
-    parser = new parser.XMLParser(new TreeBuilder());
-  }
-
-  parser.feed(source);
-  this._root = parser.close();
-  return this._root;
-};
-
-ElementTree.prototype.iter = function(tag, callback) {
-  this._root.iter(tag, callback);
-};
-
-ElementTree.prototype.find = function(path) {
-  return this._root.find(path);
-};
-
-ElementTree.prototype.findtext = function(path, defvalue) {
-  return this._root.findtext(path, defvalue);
-};
-
-ElementTree.prototype.findall = function(path) {
-  return this._root.findall(path);
-};
-
-/**
- * Unlike ElementTree, we don't write to a file, we return you a string.
- */
-ElementTree.prototype.write = function(options) {
-  var sb = [];
-  options = utils.merge({
-    encoding: 'utf-8',
-    xml_declaration: null,
-    default_namespace: null,
-    method: 'xml'}, options);
-
-  if (options.xml_declaration !== false) {
-    sb.push("<?xml version='1.0' encoding='"+options.encoding +"'?>\n");
-  }
-
-  if (options.method === "text") {
-    _serialize_text(sb, self._root, encoding);
-  }
-  else {
-    var qnames, namespaces, indent, indent_string;
-    var x = _namespaces(this._root, options.encoding, options.default_namespace);
-    qnames = x[0];
-    namespaces = x[1];
-
-    if (options.hasOwnProperty('indent')) {
-      indent = 0;
-      indent_string = new Array(options.indent + 1).join(' ');
-    }
-    else {
-      indent = false;
-    }
-
-    if (options.method === "xml") {
-      _serialize_xml(function(data) {
-        sb.push(data);
-      }, this._root, options.encoding, qnames, namespaces, indent, indent_string);
-    }
-    else {
-      /* TODO: html */
-      throw new Error("unknown serialization method "+ options.method);
-    }
-  }
-
-  return sb.join("");
-};
-
-var _namespace_map = {
-    /* "well-known" namespace prefixes */
-    "http://www.w3.org/XML/1998/namespace": "xml",
-    "http://www.w3.org/1999/xhtml": "html",
-    "http://www.w3.org/1999/02/22-rdf-syntax-ns#": "rdf",
-    "http://schemas.xmlsoap.org/wsdl/": "wsdl",
-    /* xml schema */
-    "http://www.w3.org/2001/XMLSchema": "xs",
-    "http://www.w3.org/2001/XMLSchema-instance": "xsi",
-    /* dublic core */
-    "http://purl.org/dc/elements/1.1/": "dc",
-};
-
-function register_namespace(prefix, uri) {
-  if (/ns\d+$/.test(prefix)) {
-    throw new Error('Prefix format reserved for internal use');
-  }
-
-  if (_namespace_map.hasOwnProperty(uri) && _namespace_map[uri] === prefix) {
-    delete _namespace_map[uri];
-  }
-
-  _namespace_map[uri] = prefix;
-}
-
-
-function _escape(text, encoding, isAttribute, isText) {
-  if (text) {
-    text = text.toString();
-    text = text.replace(/&/g, '&amp;');
-    text = text.replace(/</g, '&lt;');
-    text = text.replace(/>/g, '&gt;');
-    if (!isText) {
-        text = text.replace(/\n/g, '&#xA;');
-        text = text.replace(/\r/g, '&#xD;');
-    }
-    if (isAttribute) {
-      text = text.replace(/"/g, '&quot;');
-    }
-  }
-  return text;
-}
-
-/* TODO: benchmark single regex */
-function _escape_attrib(text, encoding) {
-  return _escape(text, encoding, true);
-}
-
-function _escape_cdata(text, encoding) {
-  return _escape(text, encoding, false);
-}
-
-function _escape_text(text, encoding) {
-  return _escape(text, encoding, false, true);
-}
-
-function _namespaces(elem, encoding, default_namespace) {
-  var qnames = {};
-  var namespaces = {};
-
-  if (default_namespace) {
-    namespaces[default_namespace] = "";
-  }
-
-  function encode(text) {
-    return text;
-  }
-
-  function add_qname(qname) {
-    if (qname[0] === "{") {
-      var tmp = qname.substring(1).split("}", 2);
-      var uri = tmp[0];
-      var tag = tmp[1];
-      var prefix = namespaces[uri];
-
-      if (prefix === undefined) {
-        prefix = _namespace_map[uri];
-        if (prefix === undefined) {
-          prefix = "ns" + Object.keys(namespaces).length;
-        }
-        if (prefix !== "xml") {
-          namespaces[uri] = prefix;
-        }
-      }
-
-      if (prefix) {
-        qnames[qname] = sprintf("%s:%s", prefix, tag);
-      }
-      else {
-        qnames[qname] = tag;
-      }
-    }
-    else {
-      if (default_namespace) {
-        throw new Error('cannot use non-qualified names with default_namespace option');
-      }
-
-      qnames[qname] = qname;
-    }
-  }
-
-
-  elem.iter(null, function(e) {
-    var i;
-    var tag = e.tag;
-    var text = e.text;
-    var items = e.items();
-
-    if (tag instanceof QName && qnames[tag.text] === undefined) {
-      add_qname(tag.text);
-    }
-    else if (typeof(tag) === "string") {
-      add_qname(tag);
-    }
-    else if (tag !== null && tag !== Comment && tag !== CData && tag !== ProcessingInstruction) {
-      throw new Error('Invalid tag type for serialization: '+ tag);
-    }
-
-    if (text instanceof QName && qnames[text.text] === undefined) {
-      add_qname(text.text);
-    }
-
-    items.forEach(function(item) {
-      var key = item[0],
-          value = item[1];
-      if (key instanceof QName) {
-        key = key.text;
-      }
-
-      if (qnames[key] === undefined) {
-        add_qname(key);
-      }
-
-      if (value instanceof QName && qnames[value.text] === undefined) {
-        add_qname(value.text);
-      }
-    });
-  });
-  return [qnames, namespaces];
-}
-
-function _serialize_xml(write, elem, encoding, qnames, namespaces, indent, indent_string) {
-  var tag = elem.tag;
-  var text = elem.text;
-  var items;
-  var i;
-
-  var newlines = indent || (indent === 0);
-  write(Array(indent + 1).join(indent_string));
-
-  if (tag === Comment) {
-    write(sprintf("<!--%s-->", _escape_cdata(text, encoding)));
-  }
-  else if (tag === ProcessingInstruction) {
-    write(sprintf("<?%s?>", _escape_cdata(text, encoding)));
-  }
-  else if (tag === CData) {
-    text = text || '';
-    write(sprintf("<![CDATA[%s]]>", text));
-  }
-  else {
-    tag = qnames[tag];
-    if (tag === undefined) {
-      if (text) {
-        write(_escape_text(text, encoding));
-      }
-      elem.iter(function(e) {
-        _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string);
-      });
-    }
-    else {
-      write("<" + tag);
-      items = elem.items();
-
-      if (items || namespaces) {
-        items.sort(); // lexical order
-
-        items.forEach(function(item) {
-          var k = item[0],
-              v = item[1];
-
-            if (k instanceof QName) {
-              k = k.text;
-            }
-
-            if (v instanceof QName) {
-              v = qnames[v.text];
-            }
-            else {
-              v = _escape_attrib(v, encoding);
-            }
-            write(sprintf(" %s=\"%s\"", qnames[k], v));
-        });
-
-        if (namespaces) {
-          items = utils.items(namespaces);
-          items.sort(function(a, b) { return a[1] < b[1]; });
-
-          items.forEach(function(item) {
-            var k = item[1],
-                v = item[0];
-
-            if (k) {
-              k = ':' + k;
-            }
-
-            write(sprintf(" xmlns%s=\"%s\"", k, _escape_attrib(v, encoding)));
-          });
-        }
-      }
-
-      if (text || elem.len()) {
-        if (text && text.toString().match(/^\s*$/)) {
-            text = null;
-        }
-
-        write(">");
-        if (!text && newlines) {
-          write("\n");
-        }
-
-        if (text) {
-          write(_escape_text(text, encoding));
-        }
-        elem._children.forEach(function(e) {
-          _serialize_xml(write, e, encoding, qnames, null, newlines ? indent + 1 : false, indent_string);
-        });
-
-        if (!text && indent) {
-          write(Array(indent + 1).join(indent_string));
-        }
-        write("</" + tag + ">");
-      }
-      else {
-        write(" />");
-      }
-    }
-  }
-
-  if (newlines) {
-    write("\n");
-  }
-}
-
-function parse(source, parser) {
-  var tree = new ElementTree();
-  tree.parse(source, parser);
-  return tree;
-}
-
-function tostring(element, options) {
-  return new ElementTree(element).write(options);
-}
-
-exports.PI = ProcessingInstruction;
-exports.Comment = Comment;
-exports.CData = CData;
-exports.ProcessingInstruction = ProcessingInstruction;
-exports.SubElement = SubElement;
-exports.QName = QName;
-exports.ElementTree = ElementTree;
-exports.ElementPath = ElementPath;
-exports.Element = function(tag, attrib) {
-  return new Element(tag, attrib);
-};
-
-exports.XML = function(data) {
-  var et = new ElementTree();
-  return et.parse(data);
-};
-
-exports.parse = parse;
-exports.register_namespace = register_namespace;
-exports.tostring = tostring;
diff --git a/node_modules/elementtree/lib/errors.js b/node_modules/elementtree/lib/errors.js
deleted file mode 100644
index e8742be..0000000
--- a/node_modules/elementtree/lib/errors.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-var util = require('util');
-
-var sprintf = require('./sprintf').sprintf;
-
-function SyntaxError(token, msg) {
-  msg = msg || sprintf('Syntax Error at token %s', token.toString());
-  this.token = token;
-  this.message = msg;
-  Error.call(this, msg);
-}
-
-util.inherits(SyntaxError, Error);
-
-exports.SyntaxError = SyntaxError;
diff --git a/node_modules/elementtree/lib/parser.js b/node_modules/elementtree/lib/parser.js
deleted file mode 100644
index 7307ee4..0000000
--- a/node_modules/elementtree/lib/parser.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-/* TODO: support node-expat C++ module optionally */
-
-var util = require('util');
-var parsers = require('./parsers/index');
-
-function get_parser(name) {
-  if (name === 'sax') {
-    return parsers.sax;
-  }
-  else {
-    throw new Error('Invalid parser: ' + name);
-  }
-}
-
-
-exports.get_parser = get_parser;
diff --git a/node_modules/elementtree/lib/parsers/index.js b/node_modules/elementtree/lib/parsers/index.js
deleted file mode 100644
index 5eac5c8..0000000
--- a/node_modules/elementtree/lib/parsers/index.js
+++ /dev/null
@@ -1 +0,0 @@
-exports.sax = require('./sax');
diff --git a/node_modules/elementtree/lib/parsers/sax.js b/node_modules/elementtree/lib/parsers/sax.js
deleted file mode 100644
index 69b0a59..0000000
--- a/node_modules/elementtree/lib/parsers/sax.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var util = require('util');
-
-var sax = require('sax');
-
-var TreeBuilder = require('./../treebuilder').TreeBuilder;
-
-function XMLParser(target) {
-  this.parser = sax.parser(true);
-
-  this.target = (target) ? target : new TreeBuilder();
-
-  this.parser.onopentag = this._handleOpenTag.bind(this);
-  this.parser.ontext = this._handleText.bind(this);
-  this.parser.oncdata = this._handleCdata.bind(this);
-  this.parser.ondoctype = this._handleDoctype.bind(this);
-  this.parser.oncomment = this._handleComment.bind(this);
-  this.parser.onclosetag = this._handleCloseTag.bind(this);
-  this.parser.onerror = this._handleError.bind(this);
-}
-
-XMLParser.prototype._handleOpenTag = function(tag) {
-  this.target.start(tag.name, tag.attributes);
-};
-
-XMLParser.prototype._handleText = function(text) {
-  this.target.data(text);
-};
-
-XMLParser.prototype._handleCdata = function(text) {
-  this.target.data(text);
-};
-
-XMLParser.prototype._handleDoctype = function(text) {
-};
-
-XMLParser.prototype._handleComment = function(comment) {
-};
-
-XMLParser.prototype._handleCloseTag = function(tag) {
-  this.target.end(tag);
-};
-
-XMLParser.prototype._handleError = function(err) {
-  throw err;
-};
-
-XMLParser.prototype.feed = function(chunk) {
-  this.parser.write(chunk);
-};
-
-XMLParser.prototype.close = function() {
-  this.parser.close();
-  return this.target.close();
-};
-
-exports.XMLParser = XMLParser;
diff --git a/node_modules/elementtree/lib/sprintf.js b/node_modules/elementtree/lib/sprintf.js
deleted file mode 100644
index f802c1b..0000000
--- a/node_modules/elementtree/lib/sprintf.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-var cache = {};
-
-
-// Do any others need escaping?
-var TO_ESCAPE = {
-  '\'': '\\\'',
-  '\n': '\\n'
-};
-
-
-function populate(formatter) {
-  var i, type,
-      key = formatter,
-      prev = 0,
-      arg = 1,
-      builder = 'return \'';
-
-  for (i = 0; i < formatter.length; i++) {
-    if (formatter[i] === '%') {
-      type = formatter[i + 1];
-
-      switch (type) {
-        case 's':
-          builder += formatter.slice(prev, i) + '\' + arguments[' + arg + '] + \'';
-          prev = i + 2;
-          arg++;
-          break;
-        case 'j':
-          builder += formatter.slice(prev, i) + '\' + JSON.stringify(arguments[' + arg + ']) + \'';
-          prev = i + 2;
-          arg++;
-          break;
-        case '%':
-          builder += formatter.slice(prev, i + 1);
-          prev = i + 2;
-          i++;
-          break;
-      }
-
-
-    } else if (TO_ESCAPE[formatter[i]]) {
-      builder += formatter.slice(prev, i) + TO_ESCAPE[formatter[i]];
-      prev = i + 1;
-    }
-  }
-
-  builder += formatter.slice(prev) + '\';';
-  cache[key] = new Function(builder);
-}
-
-
-/**
- * A fast version of sprintf(), which currently only supports the %s and %j.
- * This caches a formatting function for each format string that is used, so
- * you should only use this sprintf() will be called many times with a single
- * format string and a limited number of format strings will ever be used (in
- * general this means that format strings should be string literals).
- *
- * @param {String} formatter A format string.
- * @param {...String} var_args Values that will be formatted by %s and %j.
- * @return {String} The formatted output.
- */
-exports.sprintf = function(formatter, var_args) {
-  if (!cache[formatter]) {
-    populate(formatter);
-  }
-
-  return cache[formatter].apply(null, arguments);
-};
diff --git a/node_modules/elementtree/lib/treebuilder.js b/node_modules/elementtree/lib/treebuilder.js
deleted file mode 100644
index 393a98f..0000000
--- a/node_modules/elementtree/lib/treebuilder.js
+++ /dev/null
@@ -1,60 +0,0 @@
-function TreeBuilder(element_factory) {
-  this._data = [];
-  this._elem = [];
-  this._last = null;
-  this._tail = null;
-  if (!element_factory) {
-    /* evil circular dep */
-    element_factory = require('./elementtree').Element;
-  }
-  this._factory = element_factory;
-}
-
-TreeBuilder.prototype.close = function() {
-  return this._last;
-};
-
-TreeBuilder.prototype._flush = function() {
-  if (this._data) {
-    if (this._last !== null) {
-      var text = this._data.join("");
-      if (this._tail) {
-        this._last.tail = text;
-      }
-      else {
-        this._last.text = text;
-      }
-    }
-    this._data = [];
-  }
-};
-
-TreeBuilder.prototype.data = function(data) {
-  this._data.push(data);
-};
-
-TreeBuilder.prototype.start = function(tag, attrs) {
-  this._flush();
-  var elem = this._factory(tag, attrs);
-  this._last = elem;
-
-  if (this._elem.length) {
-    this._elem[this._elem.length - 1].append(elem);
-  }
-
-  this._elem.push(elem);
-
-  this._tail = null;
-};
-
-TreeBuilder.prototype.end = function(tag) {
-  this._flush();
-  this._last = this._elem.pop();
-  if (this._last.tag !== tag) {
-    throw new Error("end tag mismatch");
-  }
-  this._tail = 1;
-  return this._last;
-};
-
-exports.TreeBuilder = TreeBuilder;
diff --git a/node_modules/elementtree/lib/utils.js b/node_modules/elementtree/lib/utils.js
deleted file mode 100644
index b08a670..0000000
--- a/node_modules/elementtree/lib/utils.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-/**
- * @param {Object} hash.
- * @param {Array} ignored.
- */
-function items(hash, ignored) {
-  ignored = ignored || null;
-  var k, rv = [];
-
-  function is_ignored(key) {
-    if (!ignored || ignored.length === 0) {
-      return false;
-    }
-
-    return ignored.indexOf(key);
-  }
-
-  for (k in hash) {
-    if (hash.hasOwnProperty(k) && !(is_ignored(ignored))) {
-      rv.push([k, hash[k]]);
-    }
-  }
-
-  return rv;
-}
-
-
-function findall(re, str) {
-  var match, matches = [];
-
-  while ((match = re.exec(str))) {
-      matches.push(match);
-  }
-
-  return matches;
-}
-
-function merge(a, b) {
-  var c = {}, attrname;
-
-  for (attrname in a) {
-    if (a.hasOwnProperty(attrname)) {
-      c[attrname] = a[attrname];
-    }
-  }
-  for (attrname in b) {
-    if (b.hasOwnProperty(attrname)) {
-      c[attrname] = b[attrname];
-    }
-  }
-  return c;
-}
-
-exports.items = items;
-exports.findall = findall;
-exports.merge = merge;
diff --git a/node_modules/elementtree/node_modules/sax/LICENSE b/node_modules/elementtree/node_modules/sax/LICENSE
deleted file mode 100644
index ccffa08..0000000
--- a/node_modules/elementtree/node_modules/sax/LICENSE
+++ /dev/null
@@ -1,41 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-====
-
-`String.fromCodePoint` by Mathias Bynens used according to terms of MIT
-License, as follows:
-
-    Copyright Mathias Bynens <https://mathiasbynens.be/>
-
-    Permission is hereby granted, free of charge, to any person obtaining
-    a copy of this software and associated documentation files (the
-    "Software"), to deal in the Software without restriction, including
-    without limitation the rights to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of the Software, and to
-    permit persons to whom the Software is furnished to do so, subject to
-    the following conditions:
-
-    The above copyright notice and this permission notice shall be
-    included in all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/elementtree/node_modules/sax/LICENSE-W3C.html b/node_modules/elementtree/node_modules/sax/LICENSE-W3C.html
deleted file mode 100644
index a611e3f..0000000
--- a/node_modules/elementtree/node_modules/sax/LICENSE-W3C.html
+++ /dev/null
@@ -1,188 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta name="generator" content="HTML Tidy for Mac OS X (vers 31 October 2006 - Apple Inc. build 13), see www.w3.org" /><title>W3C Software Notice and License</title><link rel="stylesheet" href="/2008/site/css/minimum" type="text/css" media="handheld, all" /><style type="text/css" media="print, screen and (min-width: 481px)" xml:space="preserve">
-     @import url("/2008/site/css/advanced");
-</style><link href="/2008/site/css/minimum" rel="stylesheet" type="text/css" media="handheld, only screen and (max-device-width: 480px)" /><meta name="viewport" content="width=device-width" /><link rel="stylesheet" href="/2008/site/css/print" type="text/css" media="print" /><link rel="shortcut icon" href="/2008/site/images/favicon.ico" type="image/x-icon" /></head><body id="www-w3-org" class="w3c_public"><div id="w3c_container">
-    
-    
-
-         <div id="w3c_mast">
-            <h1 class="logo">
-               <a tabindex="2" accesskey="1" href="/"><img src="/2008/site/images/logo-w3c-mobile-lg" width="90" height="53" alt="W3C" /></a>
-               <span class="alt-logo">W3C</span>
-            </h1>
-
-            <div id="w3c_nav">
-               
-               
-
-               <form action="/Help/search" method="get" enctype="application/x-www-form-urlencoded"><div class="w3c_sec_nav"><!-- --></div><ul class="main_nav"><li class="first-item">
-                        <a href="/standards/">Standards</a>
-                     </li><li>
-                        <a href="/participate/">Participate</a>
-                     </li><li>
-                        <a href="/Consortium/membership">Membership</a>
-                     </li><li class="last-item">
-                        <a href="/Consortium/">About W3C</a>
-                     </li><li class="search-item">
-                        <div id="search-form">
-                           <input tabindex="3" class="text" name="q" value="" title="Search" type="text" />
-                           <button id="search-submit" name="search-submit" type="submit"><img class="submit" src="/2008/site/images/search-button" alt="Search" width="21" height="17" /></button>
-                        </div>
-                     </li></ul></form>
-            </div>
-            
-         </div>
-         
-
-         <div id="w3c_main">
-            <div id="w3c_logo_shadow" class="w3c_leftCol">
-               <img height="32" alt="" src="/2008/site/images/logo-shadow" />
-            </div>
-            
-            <div class="w3c_leftCol"><h2 class="offscreen">Site Navigation</h2>
-    <h3 class="category"><span class="ribbon"><a href="/Consortium/Legal/ipr-notice.html" title="Up to Policies and Legal Information">Policies and Legal Information <img src="/2008/site/images/header-link" alt="Header link" width="13" height="13" class="header-link" /></a></span></h3>
-       <ul class="theme">
-        <li><a href="/Consortium/Legal/2008/04-testsuite-copyright.html">Licenses for W3C Test Suites</a></li>
-        <li><a href="/2004/10/27-testcases.html">Policies for Contribution of Test Cases to W3C</a></li>
-        <li><a href="/Consortium/Legal/IPR-FAQ-20000620.html">Intellectual Rights FAQ</a></li>
-        <li><a href="/Consortium/Legal/privacy-statement-20000612.html">W3C Privacy Statements</a></li>
-        <li><a href="/Consortium/Legal/2002/copyright-documents-20021231.html">W3C Document License</a></li>
-        <li><a href="/Consortium/Legal/2002/trademarks-20021231.html">W3C Trademarks and Generic Terms</a></li>
-        <li><a href="/Consortium/Legal/2002/trademark-license-20021231.html">W3C&#xAE; Trademark and Service Mark License</a></li>
-        <li><a class="current">W3C Software Notice and License</a></li>
-        <li><a href="/Consortium/Legal/2002/collaborators-agreement-20021231.html">W3C Invited Expert and Collaborators Agreement</a></li>
-        <li><a href="/Consortium/Persistence.html">W3C URI Persistence Policy</a></li>
-        <li><a href="/1999/10/21-mirroring-policy.html">Mirroring the W3C Site</a></li>
-        <li><a href="/Consortium/Legal/2006/08-copyright-translations.html">Translations of the Copyright Notice</a></li>
-       </ul>
-       <br /></div>
-            <div class="w3c_mainCol">
-               <div id="w3c_crumbs">
-       <div id="w3c_crumbs_frame">
-        <ul class="bct"> <!-- .bct / Breadcrumbs -->
-          <li class="skip"><a tabindex="1" accesskey="2" title="Skip to content (e.g., when browsing via audio)" href="#w3c_content_body">Skip</a></li>
-          <li><a href="/">W3C</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
-          <li><a href="/Consortium/">About&#xA0;W3C</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
-          <li><a href="/Consortium/facts.html">Facts&#xA0;About&#xA0;W3C</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
-          <li><a href="/Consortium/Legal/ipr-notice.html">Policies&#xA0;and&#xA0;Legal&#xA0;Information</a>&#xA0;<span class="cr">&#xBB;</span>&#xA0;</li>
-          <li class="current">W3C Software Notice and License</li>
-        </ul>            
-     </div>
-    </div>
-               <h1 class="title">W3C Software Notice and License</h1>
-               <div id="w3c_content_body">
-                  <div class="line">
-                     <p class="intro tPadding">This work (and included software, documentation such as READMEs, or other
-related items) is being provided by the copyright holders under the following
-license.</p>
-<h2>License</h2>
-                     
-                     <p class="tPadding">
-By obtaining, using and/or copying this work, you (the licensee)
-agree that you have read, understood, and will comply with the following
-terms and conditions.</p>
-
-                     <p>Permission to copy, modify, and distribute this software and its
-documentation, with or without modification,&#xA0;for any purpose and without
-fee or royalty is hereby granted, provided that you include the following on
-ALL copies of the software and documentation or portions thereof, including
-modifications:</p>
-
-                     <ul class="show_items"><li>The full text of this NOTICE in a location viewable to users of the
-    redistributed or derivative work.</li><li>Any pre-existing intellectual property disclaimers, notices, or terms
-    and conditions. If none exist, the <a href="copyright-software-short-notice-20021231.html">W3C Software Short
-    Notice</a> should be included (hypertext is preferred, text is permitted)
-    within the body of any redistributed or derivative code.</li><li>Notice of any changes or modifications to the files, including the date
-    changes were made. (We recommend you provide URIs to the location from
-    which the code is derived.)</li></ul>
-
-<h2>Disclaimers</h2>
-
-                     <p>THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
-MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
-PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE
-ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.</p>
-
-                     <p>COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
-DOCUMENTATION.</p>
-
-                     <p>The name and trademarks of copyright holders may NOT be used in
-advertising or publicity pertaining to the software without specific, written
-prior permission. Title to copyright in this software and any associated
-documentation will at all times remain with copyright holders.</p>
-
-                     <h2>Notes</h2>
-
-	                    <p>This version: http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231</p>
-
-                     <p>This formulation of W3C's notice and license became active on December 31
-2002. This version removes the copyright ownership notice such that this
-license can be used with materials other than those owned by the W3C,
-reflects that ERCIM is now a host of the W3C, includes references to this
-specific dated version of the license, and removes the ambiguous grant of
-"use". Otherwise, this version is the same as the <a href="http://www.w3.org/Consortium/Legal/copyright-software-19980720">previous
-version</a> and is written so as to preserve the <a href="http://www.gnu.org/philosophy/license-list.html#GPLCompatibleLicenses">Free
-Software Foundation's assessment of GPL compatibility</a> and <a href="http://www.opensource.org/licenses/W3C.php">OSI's certification</a>
-under the <a href="http://www.opensource.org/docs/definition.php">Open Source
-Definition</a>.</p>
-                  </div>
-               </div>
-            </div>
-         </div>
-         
-         
-         
-      </div><div id="w3c_footer">
-         <div id="w3c_footer-inner">
-            <h2 class="offscreen">Footer Navigation</h2>
-            <div class="w3c_footer-nav">
-               <h3>Navigation</h3>
-               <ul class="footer_top_nav"><li>
-                     <a href="/">Home</a>
-                  </li><li>
-                     <a href="/standards/">Standards</a>
-                  </li><li>
-                     <a href="/participate/">Participate</a>
-                  </li><li>
-                     <a href="/Consortium/membership">Membership</a>
-                  </li><li class="last-item">
-                     <a href="/Consortium/">About W3C</a>
-                  </li></ul>
-            </div>
-            <div class="w3c_footer-nav">
-               <h3>Contact W3C</h3>
-               <ul class="footer_bottom_nav"><li>
-                     <a href="/Consortium/contact">Contact</a>
-                  </li><li>
-                     <a accesskey="0" href="/Help/">Help and FAQ</a>
-                  </li><li>
-                     <a href="/Consortium/sponsor/">Sponsor / Donate</a>
-                  </li><li>
-                     <a href="/Consortium/siteindex">Site Map</a>
-                  </li><li>
-                     <address id="w3c_signature">
-                        <a href="http://lists.w3.org/Archives/Public/site-comments/">Feedback</a></address>
-                  </li></ul>
-            </div>
-            <div class="w3c_footer-nav">
-               <h3>W3C Updates</h3>
-               <ul class="footer_follow_nav"><li>
-                     <a href="http://twitter.com/W3C" title="Follow W3C on Twitter">
-                        <img src="/2008/site/images/twitter-bird" alt="Twitter" width="78" height="83" class="social-icon" />
-                     </a>
-                     <a href="http://identi.ca/w3c" title="See W3C on Identica">
-                        <img src="/2008/site/images/identica-logo" alt="Identica" width="91" height="83" class="social-icon" />
-                     </a>
-                  </li></ul>
-            </div>
-            <p class="copyright">Copyright &#xA9; 2012 W3C <sup>&#xAE;</sup> (<a href="http://www.csail.mit.edu/">
-                  <acronym title="Massachusetts Institute of Technology">MIT</acronym>
-               </a>, <a href="http://www.ercim.org/">
-                  <acronym title="European Research Consortium for Informatics and Mathematics"> ERCIM</acronym>
-               </a>, <a href="http://www.keio.ac.jp/">Keio</a>) <a href="/Consortium/Legal/ipr-notice">Usage policies apply</a>.</p>
-         </div>
-      </div><!-- Generated from data/scripts.php, ../../smarty/{scripts.tpl} --><!-- At the bottom for performance reasons --><div id="w3c_scripts">
-         <script type="text/javascript" src="/2008/site/js/main" xml:space="preserve"><!-- --></script>
-      </div></body></html>
diff --git a/node_modules/elementtree/node_modules/sax/README.md b/node_modules/elementtree/node_modules/sax/README.md
deleted file mode 100644
index 91a0314..0000000
--- a/node_modules/elementtree/node_modules/sax/README.md
+++ /dev/null
@@ -1,220 +0,0 @@
-# sax js
-
-A sax-style parser for XML and HTML.
-
-Designed with [node](http://nodejs.org/) in mind, but should work fine in
-the browser or other CommonJS implementations.
-
-## What This Is
-
-* A very simple tool to parse through an XML string.
-* A stepping stone to a streaming HTML parser.
-* A handy way to deal with RSS and other mostly-ok-but-kinda-broken XML
-  docs.
-
-## What This Is (probably) Not
-
-* An HTML Parser - That's a fine goal, but this isn't it.  It's just
-  XML.
-* A DOM Builder - You can use it to build an object model out of XML,
-  but it doesn't do that out of the box.
-* XSLT - No DOM = no querying.
-* 100% Compliant with (some other SAX implementation) - Most SAX
-  implementations are in Java and do a lot more than this does.
-* An XML Validator - It does a little validation when in strict mode, but
-  not much.
-* A Schema-Aware XSD Thing - Schemas are an exercise in fetishistic
-  masochism.
-* A DTD-aware Thing - Fetching DTDs is a much bigger job.
-
-## Regarding `<!DOCTYPE`s and `<!ENTITY`s
-
-The parser will handle the basic XML entities in text nodes and attribute
-values: `&amp; &lt; &gt; &apos; &quot;`. It's possible to define additional
-entities in XML by putting them in the DTD. This parser doesn't do anything
-with that. If you want to listen to the `ondoctype` event, and then fetch
-the doctypes, and read the entities and add them to `parser.ENTITIES`, then
-be my guest.
-
-Unknown entities will fail in strict mode, and in loose mode, will pass
-through unmolested.
-
-## Usage
-
-```javascript
-var sax = require("./lib/sax"),
-  strict = true, // set to false for html-mode
-  parser = sax.parser(strict);
-
-parser.onerror = function (e) {
-  // an error happened.
-};
-parser.ontext = function (t) {
-  // got some text.  t is the string of text.
-};
-parser.onopentag = function (node) {
-  // opened a tag.  node has "name" and "attributes"
-};
-parser.onattribute = function (attr) {
-  // an attribute.  attr has "name" and "value"
-};
-parser.onend = function () {
-  // parser stream is done, and ready to have more stuff written to it.
-};
-
-parser.write('<xml>Hello, <who name="world">world</who>!</xml>').close();
-
-// stream usage
-// takes the same options as the parser
-var saxStream = require("sax").createStream(strict, options)
-saxStream.on("error", function (e) {
-  // unhandled errors will throw, since this is a proper node
-  // event emitter.
-  console.error("error!", e)
-  // clear the error
-  this._parser.error = null
-  this._parser.resume()
-})
-saxStream.on("opentag", function (node) {
-  // same object as above
-})
-// pipe is supported, and it's readable/writable
-// same chunks coming in also go out.
-fs.createReadStream("file.xml")
-  .pipe(saxStream)
-  .pipe(fs.createWriteStream("file-copy.xml"))
-```
-
-
-## Arguments
-
-Pass the following arguments to the parser function.  All are optional.
-
-`strict` - Boolean. Whether or not to be a jerk. Default: `false`.
-
-`opt` - Object bag of settings regarding string formatting.  All default to `false`.
-
-Settings supported:
-
-* `trim` - Boolean. Whether or not to trim text and comment nodes.
-* `normalize` - Boolean. If true, then turn any whitespace into a single
-  space.
-* `lowercase` - Boolean. If true, then lowercase tag names and attribute names
-  in loose mode, rather than uppercasing them.
-* `xmlns` - Boolean. If true, then namespaces are supported.
-* `position` - Boolean. If false, then don't track line/col/position.
-* `strictEntities` - Boolean. If true, only parse [predefined XML
-  entities](http://www.w3.org/TR/REC-xml/#sec-predefined-ent)
-  (`&amp;`, `&apos;`, `&gt;`, `&lt;`, and `&quot;`)
-
-## Methods
-
-`write` - Write bytes onto the stream. You don't have to do this all at
-once. You can keep writing as much as you want.
-
-`close` - Close the stream. Once closed, no more data may be written until
-it is done processing the buffer, which is signaled by the `end` event.
-
-`resume` - To gracefully handle errors, assign a listener to the `error`
-event. Then, when the error is taken care of, you can call `resume` to
-continue parsing. Otherwise, the parser will not continue while in an error
-state.
-
-## Members
-
-At all times, the parser object will have the following members:
-
-`line`, `column`, `position` - Indications of the position in the XML
-document where the parser currently is looking.
-
-`startTagPosition` - Indicates the position where the current tag starts.
-
-`closed` - Boolean indicating whether or not the parser can be written to.
-If it's `true`, then wait for the `ready` event to write again.
-
-`strict` - Boolean indicating whether or not the parser is a jerk.
-
-`opt` - Any options passed into the constructor.
-
-`tag` - The current tag being dealt with.
-
-And a bunch of other stuff that you probably shouldn't touch.
-
-## Events
-
-All events emit with a single argument. To listen to an event, assign a
-function to `on<eventname>`. Functions get executed in the this-context of
-the parser object. The list of supported events are also in the exported
-`EVENTS` array.
-
-When using the stream interface, assign handlers using the EventEmitter
-`on` function in the normal fashion.
-
-`error` - Indication that something bad happened. The error will be hanging
-out on `parser.error`, and must be deleted before parsing can continue. By
-listening to this event, you can keep an eye on that kind of stuff. Note:
-this happens *much* more in strict mode. Argument: instance of `Error`.
-
-`text` - Text node. Argument: string of text.
-
-`doctype` - The `<!DOCTYPE` declaration. Argument: doctype string.
-
-`processinginstruction` - Stuff like `<?xml foo="blerg" ?>`. Argument:
-object with `name` and `body` members. Attributes are not parsed, as
-processing instructions have implementation dependent semantics.
-
-`sgmldeclaration` - Random SGML declarations. Stuff like `<!ENTITY p>`
-would trigger this kind of event. This is a weird thing to support, so it
-might go away at some point. SAX isn't intended to be used to parse SGML,
-after all.
-
-`opentag` - An opening tag. Argument: object with `name` and `attributes`.
-In non-strict mode, tag names are uppercased, unless the `lowercase`
-option is set.  If the `xmlns` option is set, then it will contain
-namespace binding information on the `ns` member, and will have a
-`local`, `prefix`, and `uri` member.
-
-`closetag` - A closing tag. In loose mode, tags are auto-closed if their
-parent closes. In strict mode, well-formedness is enforced. Note that
-self-closing tags will have `closeTag` emitted immediately after `openTag`.
-Argument: tag name.
-
-`attribute` - An attribute node.  Argument: object with `name` and `value`.
-In non-strict mode, attribute names are uppercased, unless the `lowercase`
-option is set.  If the `xmlns` option is set, it will also contains namespace
-information.
-
-`comment` - A comment node.  Argument: the string of the comment.
-
-`opencdata` - The opening tag of a `<![CDATA[` block.
-
-`cdata` - The text of a `<![CDATA[` block. Since `<![CDATA[` blocks can get
-quite large, this event may fire multiple times for a single block, if it
-is broken up into multiple `write()`s. Argument: the string of random
-character data.
-
-`closecdata` - The closing tag (`]]>`) of a `<![CDATA[` block.
-
-`opennamespace` - If the `xmlns` option is set, then this event will
-signal the start of a new namespace binding.
-
-`closenamespace` - If the `xmlns` option is set, then this event will
-signal the end of a namespace binding.
-
-`end` - Indication that the closed stream has ended.
-
-`ready` - Indication that the stream has reset, and is ready to be written
-to.
-
-`noscript` - In non-strict mode, `<script>` tags trigger a `"script"`
-event, and their contents are not checked for special xml characters.
-If you pass `noscript: true`, then this behavior is suppressed.
-
-## Reporting Problems
-
-It's best to write a failing test if you find an issue.  I will always
-accept pull requests with failing tests if they demonstrate intended
-behavior, but it is very hard to figure out what issue you're describing
-without a test.  Writing a test is also the best way for you yourself
-to figure out if you really understand the issue you think you have with
-sax-js.
diff --git a/node_modules/elementtree/node_modules/sax/lib/sax.js b/node_modules/elementtree/node_modules/sax/lib/sax.js
deleted file mode 100644
index 5c08d5f..0000000
--- a/node_modules/elementtree/node_modules/sax/lib/sax.js
+++ /dev/null
@@ -1,1563 +0,0 @@
-;(function (sax) { // wrapper for non-node envs
-  sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
-  sax.SAXParser = SAXParser
-  sax.SAXStream = SAXStream
-  sax.createStream = createStream
-
-  // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
-  // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
-  // since that's the earliest that a buffer overrun could occur.  This way, checks are
-  // as rare as required, but as often as necessary to ensure never crossing this bound.
-  // Furthermore, buffers are only tested at most once per write(), so passing a very
-  // large string into write() might have undesirable effects, but this is manageable by
-  // the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme
-  // edge case, result in creating at most one complete copy of the string passed in.
-  // Set to Infinity to have unlimited buffers.
-  sax.MAX_BUFFER_LENGTH = 64 * 1024
-
-  var buffers = [
-    'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',
-    'procInstName', 'procInstBody', 'entity', 'attribName',
-    'attribValue', 'cdata', 'script'
-  ]
-
-  sax.EVENTS = [
-    'text',
-    'processinginstruction',
-    'sgmldeclaration',
-    'doctype',
-    'comment',
-    'attribute',
-    'opentag',
-    'closetag',
-    'opencdata',
-    'cdata',
-    'closecdata',
-    'error',
-    'end',
-    'ready',
-    'script',
-    'opennamespace',
-    'closenamespace'
-  ]
-
-  function SAXParser (strict, opt) {
-    if (!(this instanceof SAXParser)) {
-      return new SAXParser(strict, opt)
-    }
-
-    var parser = this
-    clearBuffers(parser)
-    parser.q = parser.c = ''
-    parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
-    parser.opt = opt || {}
-    parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
-    parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'
-    parser.tags = []
-    parser.closed = parser.closedRoot = parser.sawRoot = false
-    parser.tag = parser.error = null
-    parser.strict = !!strict
-    parser.noscript = !!(strict || parser.opt.noscript)
-    parser.state = S.BEGIN
-    parser.strictEntities = parser.opt.strictEntities
-    parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)
-    parser.attribList = []
-
-    // namespaces form a prototype chain.
-    // it always points at the current tag,
-    // which protos to its parent tag.
-    if (parser.opt.xmlns) {
-      parser.ns = Object.create(rootNS)
-    }
-
-    // mostly just for error reporting
-    parser.trackPosition = parser.opt.position !== false
-    if (parser.trackPosition) {
-      parser.position = parser.line = parser.column = 0
-    }
-    emit(parser, 'onready')
-  }
-
-  if (!Object.create) {
-    Object.create = function (o) {
-      function F () {}
-      F.prototype = o
-      var newf = new F()
-      return newf
-    }
-  }
-
-  if (!Object.keys) {
-    Object.keys = function (o) {
-      var a = []
-      for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
-      return a
-    }
-  }
-
-  function checkBufferLength (parser) {
-    var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
-    var maxActual = 0
-    for (var i = 0, l = buffers.length; i < l; i++) {
-      var len = parser[buffers[i]].length
-      if (len > maxAllowed) {
-        // Text/cdata nodes can get big, and since they're buffered,
-        // we can get here under normal conditions.
-        // Avoid issues by emitting the text node now,
-        // so at least it won't get any bigger.
-        switch (buffers[i]) {
-          case 'textNode':
-            closeText(parser)
-            break
-
-          case 'cdata':
-            emitNode(parser, 'oncdata', parser.cdata)
-            parser.cdata = ''
-            break
-
-          case 'script':
-            emitNode(parser, 'onscript', parser.script)
-            parser.script = ''
-            break
-
-          default:
-            error(parser, 'Max buffer length exceeded: ' + buffers[i])
-        }
-      }
-      maxActual = Math.max(maxActual, len)
-    }
-    // schedule the next check for the earliest possible buffer overrun.
-    var m = sax.MAX_BUFFER_LENGTH - maxActual
-    parser.bufferCheckPosition = m + parser.position
-  }
-
-  function clearBuffers (parser) {
-    for (var i = 0, l = buffers.length; i < l; i++) {
-      parser[buffers[i]] = ''
-    }
-  }
-
-  function flushBuffers (parser) {
-    closeText(parser)
-    if (parser.cdata !== '') {
-      emitNode(parser, 'oncdata', parser.cdata)
-      parser.cdata = ''
-    }
-    if (parser.script !== '') {
-      emitNode(parser, 'onscript', parser.script)
-      parser.script = ''
-    }
-  }
-
-  SAXParser.prototype = {
-    end: function () { end(this) },
-    write: write,
-    resume: function () { this.error = null; return this },
-    close: function () { return this.write(null) },
-    flush: function () { flushBuffers(this) }
-  }
-
-  var Stream
-  try {
-    Stream = require('stream').Stream
-  } catch (ex) {
-    Stream = function () {}
-  }
-
-  var streamWraps = sax.EVENTS.filter(function (ev) {
-    return ev !== 'error' && ev !== 'end'
-  })
-
-  function createStream (strict, opt) {
-    return new SAXStream(strict, opt)
-  }
-
-  function SAXStream (strict, opt) {
-    if (!(this instanceof SAXStream)) {
-      return new SAXStream(strict, opt)
-    }
-
-    Stream.apply(this)
-
-    this._parser = new SAXParser(strict, opt)
-    this.writable = true
-    this.readable = true
-
-    var me = this
-
-    this._parser.onend = function () {
-      me.emit('end')
-    }
-
-    this._parser.onerror = function (er) {
-      me.emit('error', er)
-
-      // if didn't throw, then means error was handled.
-      // go ahead and clear error, so we can write again.
-      me._parser.error = null
-    }
-
-    this._decoder = null
-
-    streamWraps.forEach(function (ev) {
-      Object.defineProperty(me, 'on' + ev, {
-        get: function () {
-          return me._parser['on' + ev]
-        },
-        set: function (h) {
-          if (!h) {
-            me.removeAllListeners(ev)
-            me._parser['on' + ev] = h
-            return h
-          }
-          me.on(ev, h)
-        },
-        enumerable: true,
-        configurable: false
-      })
-    })
-  }
-
-  SAXStream.prototype = Object.create(Stream.prototype, {
-    constructor: {
-      value: SAXStream
-    }
-  })
-
-  SAXStream.prototype.write = function (data) {
-    if (typeof Buffer === 'function' &&
-      typeof Buffer.isBuffer === 'function' &&
-      Buffer.isBuffer(data)) {
-      if (!this._decoder) {
-        var SD = require('string_decoder').StringDecoder
-        this._decoder = new SD('utf8')
-      }
-      data = this._decoder.write(data)
-    }
-
-    this._parser.write(data.toString())
-    this.emit('data', data)
-    return true
-  }
-
-  SAXStream.prototype.end = function (chunk) {
-    if (chunk && chunk.length) {
-      this.write(chunk)
-    }
-    this._parser.end()
-    return true
-  }
-
-  SAXStream.prototype.on = function (ev, handler) {
-    var me = this
-    if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {
-      me._parser['on' + ev] = function () {
-        var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)
-        args.splice(0, 0, ev)
-        me.emit.apply(me, args)
-      }
-    }
-
-    return Stream.prototype.on.call(me, ev, handler)
-  }
-
-  // character classes and tokens
-  var whitespace = '\r\n\t '
-
-  // this really needs to be replaced with character classes.
-  // XML allows all manner of ridiculous numbers and digits.
-  var number = '0124356789'
-  var letter = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
-
-  // (Letter | "_" | ":")
-  var quote = '\'"'
-  var attribEnd = whitespace + '>'
-  var CDATA = '[CDATA['
-  var DOCTYPE = 'DOCTYPE'
-  var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'
-  var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'
-  var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }
-
-  // turn all the string character sets into character class objects.
-  whitespace = charClass(whitespace)
-  number = charClass(number)
-  letter = charClass(letter)
-
-  // http://www.w3.org/TR/REC-xml/#NT-NameStartChar
-  // This implementation works on strings, a single character at a time
-  // as such, it cannot ever support astral-plane characters (10000-EFFFF)
-  // without a significant breaking change to either this  parser, or the
-  // JavaScript language.  Implementation of an emoji-capable xml parser
-  // is left as an exercise for the reader.
-  var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
-
-  var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/
-
-  var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
-  var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/
-
-  quote = charClass(quote)
-  attribEnd = charClass(attribEnd)
-
-  function charClass (str) {
-    return str.split('').reduce(function (s, c) {
-      s[c] = true
-      return s
-    }, {})
-  }
-
-  function isRegExp (c) {
-    return Object.prototype.toString.call(c) === '[object RegExp]'
-  }
-
-  function is (charclass, c) {
-    return isRegExp(charclass) ? !!c.match(charclass) : charclass[c]
-  }
-
-  function not (charclass, c) {
-    return !is(charclass, c)
-  }
-
-  var S = 0
-  sax.STATE = {
-    BEGIN: S++, // leading byte order mark or whitespace
-    BEGIN_WHITESPACE: S++, // leading whitespace
-    TEXT: S++, // general stuff
-    TEXT_ENTITY: S++, // &amp and such.
-    OPEN_WAKA: S++, // <
-    SGML_DECL: S++, // <!BLARG
-    SGML_DECL_QUOTED: S++, // <!BLARG foo "bar
-    DOCTYPE: S++, // <!DOCTYPE
-    DOCTYPE_QUOTED: S++, // <!DOCTYPE "//blah
-    DOCTYPE_DTD: S++, // <!DOCTYPE "//blah" [ ...
-    DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE "//blah" [ "foo
-    COMMENT_STARTING: S++, // <!-
-    COMMENT: S++, // <!--
-    COMMENT_ENDING: S++, // <!-- blah -
-    COMMENT_ENDED: S++, // <!-- blah --
-    CDATA: S++, // <![CDATA[ something
-    CDATA_ENDING: S++, // ]
-    CDATA_ENDING_2: S++, // ]]
-    PROC_INST: S++, // <?hi
-    PROC_INST_BODY: S++, // <?hi there
-    PROC_INST_ENDING: S++, // <?hi "there" ?
-    OPEN_TAG: S++, // <strong
-    OPEN_TAG_SLASH: S++, // <strong /
-    ATTRIB: S++, // <a
-    ATTRIB_NAME: S++, // <a foo
-    ATTRIB_NAME_SAW_WHITE: S++, // <a foo _
-    ATTRIB_VALUE: S++, // <a foo=
-    ATTRIB_VALUE_QUOTED: S++, // <a foo="bar
-    ATTRIB_VALUE_CLOSED: S++, // <a foo="bar"
-    ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar
-    ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar="&quot;"
-    ATTRIB_VALUE_ENTITY_U: S++, // <foo bar=&quot
-    CLOSE_TAG: S++, // </a
-    CLOSE_TAG_SAW_WHITE: S++, // </a   >
-    SCRIPT: S++, // <script> ...
-    SCRIPT_ENDING: S++ // <script> ... <
-  }
-
-  sax.XML_ENTITIES = {
-    'amp': '&',
-    'gt': '>',
-    'lt': '<',
-    'quot': '"',
-    'apos': "'"
-  }
-
-  sax.ENTITIES = {
-    'amp': '&',
-    'gt': '>',
-    'lt': '<',
-    'quot': '"',
-    'apos': "'",
-    'AElig': 198,
-    'Aacute': 193,
-    'Acirc': 194,
-    'Agrave': 192,
-    'Aring': 197,
-    'Atilde': 195,
-    'Auml': 196,
-    'Ccedil': 199,
-    'ETH': 208,
-    'Eacute': 201,
-    'Ecirc': 202,
-    'Egrave': 200,
-    'Euml': 203,
-    'Iacute': 205,
-    'Icirc': 206,
-    'Igrave': 204,
-    'Iuml': 207,
-    'Ntilde': 209,
-    'Oacute': 211,
-    'Ocirc': 212,
-    'Ograve': 210,
-    'Oslash': 216,
-    'Otilde': 213,
-    'Ouml': 214,
-    'THORN': 222,
-    'Uacute': 218,
-    'Ucirc': 219,
-    'Ugrave': 217,
-    'Uuml': 220,
-    'Yacute': 221,
-    'aacute': 225,
-    'acirc': 226,
-    'aelig': 230,
-    'agrave': 224,
-    'aring': 229,
-    'atilde': 227,
-    'auml': 228,
-    'ccedil': 231,
-    'eacute': 233,
-    'ecirc': 234,
-    'egrave': 232,
-    'eth': 240,
-    'euml': 235,
-    'iacute': 237,
-    'icirc': 238,
-    'igrave': 236,
-    'iuml': 239,
-    'ntilde': 241,
-    'oacute': 243,
-    'ocirc': 244,
-    'ograve': 242,
-    'oslash': 248,
-    'otilde': 245,
-    'ouml': 246,
-    'szlig': 223,
-    'thorn': 254,
-    'uacute': 250,
-    'ucirc': 251,
-    'ugrave': 249,
-    'uuml': 252,
-    'yacute': 253,
-    'yuml': 255,
-    'copy': 169,
-    'reg': 174,
-    'nbsp': 160,
-    'iexcl': 161,
-    'cent': 162,
-    'pound': 163,
-    'curren': 164,
-    'yen': 165,
-    'brvbar': 166,
-    'sect': 167,
-    'uml': 168,
-    'ordf': 170,
-    'laquo': 171,
-    'not': 172,
-    'shy': 173,
-    'macr': 175,
-    'deg': 176,
-    'plusmn': 177,
-    'sup1': 185,
-    'sup2': 178,
-    'sup3': 179,
-    'acute': 180,
-    'micro': 181,
-    'para': 182,
-    'middot': 183,
-    'cedil': 184,
-    'ordm': 186,
-    'raquo': 187,
-    'frac14': 188,
-    'frac12': 189,
-    'frac34': 190,
-    'iquest': 191,
-    'times': 215,
-    'divide': 247,
-    'OElig': 338,
-    'oelig': 339,
-    'Scaron': 352,
-    'scaron': 353,
-    'Yuml': 376,
-    'fnof': 402,
-    'circ': 710,
-    'tilde': 732,
-    'Alpha': 913,
-    'Beta': 914,
-    'Gamma': 915,
-    'Delta': 916,
-    'Epsilon': 917,
-    'Zeta': 918,
-    'Eta': 919,
-    'Theta': 920,
-    'Iota': 921,
-    'Kappa': 922,
-    'Lambda': 923,
-    'Mu': 924,
-    'Nu': 925,
-    'Xi': 926,
-    'Omicron': 927,
-    'Pi': 928,
-    'Rho': 929,
-    'Sigma': 931,
-    'Tau': 932,
-    'Upsilon': 933,
-    'Phi': 934,
-    'Chi': 935,
-    'Psi': 936,
-    'Omega': 937,
-    'alpha': 945,
-    'beta': 946,
-    'gamma': 947,
-    'delta': 948,
-    'epsilon': 949,
-    'zeta': 950,
-    'eta': 951,
-    'theta': 952,
-    'iota': 953,
-    'kappa': 954,
-    'lambda': 955,
-    'mu': 956,
-    'nu': 957,
-    'xi': 958,
-    'omicron': 959,
-    'pi': 960,
-    'rho': 961,
-    'sigmaf': 962,
-    'sigma': 963,
-    'tau': 964,
-    'upsilon': 965,
-    'phi': 966,
-    'chi': 967,
-    'psi': 968,
-    'omega': 969,
-    'thetasym': 977,
-    'upsih': 978,
-    'piv': 982,
-    'ensp': 8194,
-    'emsp': 8195,
-    'thinsp': 8201,
-    'zwnj': 8204,
-    'zwj': 8205,
-    'lrm': 8206,
-    'rlm': 8207,
-    'ndash': 8211,
-    'mdash': 8212,
-    'lsquo': 8216,
-    'rsquo': 8217,
-    'sbquo': 8218,
-    'ldquo': 8220,
-    'rdquo': 8221,
-    'bdquo': 8222,
-    'dagger': 8224,
-    'Dagger': 8225,
-    'bull': 8226,
-    'hellip': 8230,
-    'permil': 8240,
-    'prime': 8242,
-    'Prime': 8243,
-    'lsaquo': 8249,
-    'rsaquo': 8250,
-    'oline': 8254,
-    'frasl': 8260,
-    'euro': 8364,
-    'image': 8465,
-    'weierp': 8472,
-    'real': 8476,
-    'trade': 8482,
-    'alefsym': 8501,
-    'larr': 8592,
-    'uarr': 8593,
-    'rarr': 8594,
-    'darr': 8595,
-    'harr': 8596,
-    'crarr': 8629,
-    'lArr': 8656,
-    'uArr': 8657,
-    'rArr': 8658,
-    'dArr': 8659,
-    'hArr': 8660,
-    'forall': 8704,
-    'part': 8706,
-    'exist': 8707,
-    'empty': 8709,
-    'nabla': 8711,
-    'isin': 8712,
-    'notin': 8713,
-    'ni': 8715,
-    'prod': 8719,
-    'sum': 8721,
-    'minus': 8722,
-    'lowast': 8727,
-    'radic': 8730,
-    'prop': 8733,
-    'infin': 8734,
-    'ang': 8736,
-    'and': 8743,
-    'or': 8744,
-    'cap': 8745,
-    'cup': 8746,
-    'int': 8747,
-    'there4': 8756,
-    'sim': 8764,
-    'cong': 8773,
-    'asymp': 8776,
-    'ne': 8800,
-    'equiv': 8801,
-    'le': 8804,
-    'ge': 8805,
-    'sub': 8834,
-    'sup': 8835,
-    'nsub': 8836,
-    'sube': 8838,
-    'supe': 8839,
-    'oplus': 8853,
-    'otimes': 8855,
-    'perp': 8869,
-    'sdot': 8901,
-    'lceil': 8968,
-    'rceil': 8969,
-    'lfloor': 8970,
-    'rfloor': 8971,
-    'lang': 9001,
-    'rang': 9002,
-    'loz': 9674,
-    'spades': 9824,
-    'clubs': 9827,
-    'hearts': 9829,
-    'diams': 9830
-  }
-
-  Object.keys(sax.ENTITIES).forEach(function (key) {
-    var e = sax.ENTITIES[key]
-    var s = typeof e === 'number' ? String.fromCharCode(e) : e
-    sax.ENTITIES[key] = s
-  })
-
-  for (var s in sax.STATE) {
-    sax.STATE[sax.STATE[s]] = s
-  }
-
-  // shorthand
-  S = sax.STATE
-
-  function emit (parser, event, data) {
-    parser[event] && parser[event](data)
-  }
-
-  function emitNode (parser, nodeType, data) {
-    if (parser.textNode) closeText(parser)
-    emit(parser, nodeType, data)
-  }
-
-  function closeText (parser) {
-    parser.textNode = textopts(parser.opt, parser.textNode)
-    if (parser.textNode) emit(parser, 'ontext', parser.textNode)
-    parser.textNode = ''
-  }
-
-  function textopts (opt, text) {
-    if (opt.trim) text = text.trim()
-    if (opt.normalize) text = text.replace(/\s+/g, ' ')
-    return text
-  }
-
-  function error (parser, er) {
-    closeText(parser)
-    if (parser.trackPosition) {
-      er += '\nLine: ' + parser.line +
-        '\nColumn: ' + parser.column +
-        '\nChar: ' + parser.c
-    }
-    er = new Error(er)
-    parser.error = er
-    emit(parser, 'onerror', er)
-    return parser
-  }
-
-  function end (parser) {
-    if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')
-    if ((parser.state !== S.BEGIN) &&
-      (parser.state !== S.BEGIN_WHITESPACE) &&
-      (parser.state !== S.TEXT)) {
-      error(parser, 'Unexpected end')
-    }
-    closeText(parser)
-    parser.c = ''
-    parser.closed = true
-    emit(parser, 'onend')
-    SAXParser.call(parser, parser.strict, parser.opt)
-    return parser
-  }
-
-  function strictFail (parser, message) {
-    if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {
-      throw new Error('bad call to strictFail')
-    }
-    if (parser.strict) {
-      error(parser, message)
-    }
-  }
-
-  function newTag (parser) {
-    if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()
-    var parent = parser.tags[parser.tags.length - 1] || parser
-    var tag = parser.tag = { name: parser.tagName, attributes: {} }
-
-    // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
-    if (parser.opt.xmlns) {
-      tag.ns = parent.ns
-    }
-    parser.attribList.length = 0
-  }
-
-  function qname (name, attribute) {
-    var i = name.indexOf(':')
-    var qualName = i < 0 ? [ '', name ] : name.split(':')
-    var prefix = qualName[0]
-    var local = qualName[1]
-
-    // <x "xmlns"="http://foo">
-    if (attribute && name === 'xmlns') {
-      prefix = 'xmlns'
-      local = ''
-    }
-
-    return { prefix: prefix, local: local }
-  }
-
-  function attrib (parser) {
-    if (!parser.strict) {
-      parser.attribName = parser.attribName[parser.looseCase]()
-    }
-
-    if (parser.attribList.indexOf(parser.attribName) !== -1 ||
-      parser.tag.attributes.hasOwnProperty(parser.attribName)) {
-      parser.attribName = parser.attribValue = ''
-      return
-    }
-
-    if (parser.opt.xmlns) {
-      var qn = qname(parser.attribName, true)
-      var prefix = qn.prefix
-      var local = qn.local
-
-      if (prefix === 'xmlns') {
-        // namespace binding attribute. push the binding into scope
-        if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {
-          strictFail(parser,
-            'xml: prefix must be bound to ' + XML_NAMESPACE + '\n' +
-            'Actual: ' + parser.attribValue)
-        } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {
-          strictFail(parser,
-            'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\n' +
-            'Actual: ' + parser.attribValue)
-        } else {
-          var tag = parser.tag
-          var parent = parser.tags[parser.tags.length - 1] || parser
-          if (tag.ns === parent.ns) {
-            tag.ns = Object.create(parent.ns)
-          }
-          tag.ns[local] = parser.attribValue
-        }
-      }
-
-      // defer onattribute events until all attributes have been seen
-      // so any new bindings can take effect. preserve attribute order
-      // so deferred events can be emitted in document order
-      parser.attribList.push([parser.attribName, parser.attribValue])
-    } else {
-      // in non-xmlns mode, we can emit the event right away
-      parser.tag.attributes[parser.attribName] = parser.attribValue
-      emitNode(parser, 'onattribute', {
-        name: parser.attribName,
-        value: parser.attribValue
-      })
-    }
-
-    parser.attribName = parser.attribValue = ''
-  }
-
-  function openTag (parser, selfClosing) {
-    if (parser.opt.xmlns) {
-      // emit namespace binding events
-      var tag = parser.tag
-
-      // add namespace info to tag
-      var qn = qname(parser.tagName)
-      tag.prefix = qn.prefix
-      tag.local = qn.local
-      tag.uri = tag.ns[qn.prefix] || ''
-
-      if (tag.prefix && !tag.uri) {
-        strictFail(parser, 'Unbound namespace prefix: ' +
-          JSON.stringify(parser.tagName))
-        tag.uri = qn.prefix
-      }
-
-      var parent = parser.tags[parser.tags.length - 1] || parser
-      if (tag.ns && parent.ns !== tag.ns) {
-        Object.keys(tag.ns).forEach(function (p) {
-          emitNode(parser, 'onopennamespace', {
-            prefix: p,
-            uri: tag.ns[p]
-          })
-        })
-      }
-
-      // handle deferred onattribute events
-      // Note: do not apply default ns to attributes:
-      //   http://www.w3.org/TR/REC-xml-names/#defaulting
-      for (var i = 0, l = parser.attribList.length; i < l; i++) {
-        var nv = parser.attribList[i]
-        var name = nv[0]
-        var value = nv[1]
-        var qualName = qname(name, true)
-        var prefix = qualName.prefix
-        var local = qualName.local
-        var uri = prefix === '' ? '' : (tag.ns[prefix] || '')
-        var a = {
-          name: name,
-          value: value,
-          prefix: prefix,
-          local: local,
-          uri: uri
-        }
-
-        // if there's any attributes with an undefined namespace,
-        // then fail on them now.
-        if (prefix && prefix !== 'xmlns' && !uri) {
-          strictFail(parser, 'Unbound namespace prefix: ' +
-            JSON.stringify(prefix))
-          a.uri = prefix
-        }
-        parser.tag.attributes[name] = a
-        emitNode(parser, 'onattribute', a)
-      }
-      parser.attribList.length = 0
-    }
-
-    parser.tag.isSelfClosing = !!selfClosing
-
-    // process the tag
-    parser.sawRoot = true
-    parser.tags.push(parser.tag)
-    emitNode(parser, 'onopentag', parser.tag)
-    if (!selfClosing) {
-      // special case for <script> in non-strict mode.
-      if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {
-        parser.state = S.SCRIPT
-      } else {
-        parser.state = S.TEXT
-      }
-      parser.tag = null
-      parser.tagName = ''
-    }
-    parser.attribName = parser.attribValue = ''
-    parser.attribList.length = 0
-  }
-
-  function closeTag (parser) {
-    if (!parser.tagName) {
-      strictFail(parser, 'Weird empty close tag.')
-      parser.textNode += '</>'
-      parser.state = S.TEXT
-      return
-    }
-
-    if (parser.script) {
-      if (parser.tagName !== 'script') {
-        parser.script += '</' + parser.tagName + '>'
-        parser.tagName = ''
-        parser.state = S.SCRIPT
-        return
-      }
-      emitNode(parser, 'onscript', parser.script)
-      parser.script = ''
-    }
-
-    // first make sure that the closing tag actually exists.
-    // <a><b></c></b></a> will close everything, otherwise.
-    var t = parser.tags.length
-    var tagName = parser.tagName
-    if (!parser.strict) {
-      tagName = tagName[parser.looseCase]()
-    }
-    var closeTo = tagName
-    while (t--) {
-      var close = parser.tags[t]
-      if (close.name !== closeTo) {
-        // fail the first time in strict mode
-        strictFail(parser, 'Unexpected close tag')
-      } else {
-        break
-      }
-    }
-
-    // didn't find it.  we already failed for strict, so just abort.
-    if (t < 0) {
-      strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)
-      parser.textNode += '</' + parser.tagName + '>'
-      parser.state = S.TEXT
-      return
-    }
-    parser.tagName = tagName
-    var s = parser.tags.length
-    while (s-- > t) {
-      var tag = parser.tag = parser.tags.pop()
-      parser.tagName = parser.tag.name
-      emitNode(parser, 'onclosetag', parser.tagName)
-
-      var x = {}
-      for (var i in tag.ns) {
-        x[i] = tag.ns[i]
-      }
-
-      var parent = parser.tags[parser.tags.length - 1] || parser
-      if (parser.opt.xmlns && tag.ns !== parent.ns) {
-        // remove namespace bindings introduced by tag
-        Object.keys(tag.ns).forEach(function (p) {
-          var n = tag.ns[p]
-          emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })
-        })
-      }
-    }
-    if (t === 0) parser.closedRoot = true
-    parser.tagName = parser.attribValue = parser.attribName = ''
-    parser.attribList.length = 0
-    parser.state = S.TEXT
-  }
-
-  function parseEntity (parser) {
-    var entity = parser.entity
-    var entityLC = entity.toLowerCase()
-    var num
-    var numStr = ''
-
-    if (parser.ENTITIES[entity]) {
-      return parser.ENTITIES[entity]
-    }
-    if (parser.ENTITIES[entityLC]) {
-      return parser.ENTITIES[entityLC]
-    }
-    entity = entityLC
-    if (entity.charAt(0) === '#') {
-      if (entity.charAt(1) === 'x') {
-        entity = entity.slice(2)
-        num = parseInt(entity, 16)
-        numStr = num.toString(16)
-      } else {
-        entity = entity.slice(1)
-        num = parseInt(entity, 10)
-        numStr = num.toString(10)
-      }
-    }
-    entity = entity.replace(/^0+/, '')
-    if (numStr.toLowerCase() !== entity) {
-      strictFail(parser, 'Invalid character entity')
-      return '&' + parser.entity + ';'
-    }
-
-    return String.fromCodePoint(num)
-  }
-
-  function beginWhiteSpace (parser, c) {
-    if (c === '<') {
-      parser.state = S.OPEN_WAKA
-      parser.startTagPosition = parser.position
-    } else if (not(whitespace, c)) {
-      // have to process this as a text node.
-      // weird, but happens.
-      strictFail(parser, 'Non-whitespace before first tag.')
-      parser.textNode = c
-      parser.state = S.TEXT
-    }
-  }
-
-  function write (chunk) {
-    var parser = this
-    if (this.error) {
-      throw this.error
-    }
-    if (parser.closed) {
-      return error(parser,
-        'Cannot write after close. Assign an onready handler.')
-    }
-    if (chunk === null) {
-      return end(parser)
-    }
-    var i = 0
-    var c = ''
-    while (true) {
-      c = chunk.charAt(i++)
-      parser.c = c
-      if (!c) {
-        break
-      }
-      if (parser.trackPosition) {
-        parser.position++
-        if (c === '\n') {
-          parser.line++
-          parser.column = 0
-        } else {
-          parser.column++
-        }
-      }
-      switch (parser.state) {
-        case S.BEGIN:
-          parser.state = S.BEGIN_WHITESPACE
-          if (c === '\uFEFF') {
-            continue
-          }
-          beginWhiteSpace(parser, c)
-          continue
-
-        case S.BEGIN_WHITESPACE:
-          beginWhiteSpace(parser, c)
-          continue
-
-        case S.TEXT:
-          if (parser.sawRoot && !parser.closedRoot) {
-            var starti = i - 1
-            while (c && c !== '<' && c !== '&') {
-              c = chunk.charAt(i++)
-              if (c && parser.trackPosition) {
-                parser.position++
-                if (c === '\n') {
-                  parser.line++
-                  parser.column = 0
-                } else {
-                  parser.column++
-                }
-              }
-            }
-            parser.textNode += chunk.substring(starti, i - 1)
-          }
-          if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {
-            parser.state = S.OPEN_WAKA
-            parser.startTagPosition = parser.position
-          } else {
-            if (not(whitespace, c) && (!parser.sawRoot || parser.closedRoot)) {
-              strictFail(parser, 'Text data outside of root node.')
-            }
-            if (c === '&') {
-              parser.state = S.TEXT_ENTITY
-            } else {
-              parser.textNode += c
-            }
-          }
-          continue
-
-        case S.SCRIPT:
-          // only non-strict
-          if (c === '<') {
-            parser.state = S.SCRIPT_ENDING
-          } else {
-            parser.script += c
-          }
-          continue
-
-        case S.SCRIPT_ENDING:
-          if (c === '/') {
-            parser.state = S.CLOSE_TAG
-          } else {
-            parser.script += '<' + c
-            parser.state = S.SCRIPT
-          }
-          continue
-
-        case S.OPEN_WAKA:
-          // either a /, ?, !, or text is coming next.
-          if (c === '!') {
-            parser.state = S.SGML_DECL
-            parser.sgmlDecl = ''
-          } else if (is(whitespace, c)) {
-            // wait for it...
-          } else if (is(nameStart, c)) {
-            parser.state = S.OPEN_TAG
-            parser.tagName = c
-          } else if (c === '/') {
-            parser.state = S.CLOSE_TAG
-            parser.tagName = ''
-          } else if (c === '?') {
-            parser.state = S.PROC_INST
-            parser.procInstName = parser.procInstBody = ''
-          } else {
-            strictFail(parser, 'Unencoded <')
-            // if there was some whitespace, then add that in.
-            if (parser.startTagPosition + 1 < parser.position) {
-              var pad = parser.position - parser.startTagPosition
-              c = new Array(pad).join(' ') + c
-            }
-            parser.textNode += '<' + c
-            parser.state = S.TEXT
-          }
-          continue
-
-        case S.SGML_DECL:
-          if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {
-            emitNode(parser, 'onopencdata')
-            parser.state = S.CDATA
-            parser.sgmlDecl = ''
-            parser.cdata = ''
-          } else if (parser.sgmlDecl + c === '--') {
-            parser.state = S.COMMENT
-            parser.comment = ''
-            parser.sgmlDecl = ''
-          } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {
-            parser.state = S.DOCTYPE
-            if (parser.doctype || parser.sawRoot) {
-              strictFail(parser,
-                'Inappropriately located doctype declaration')
-            }
-            parser.doctype = ''
-            parser.sgmlDecl = ''
-          } else if (c === '>') {
-            emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)
-            parser.sgmlDecl = ''
-            parser.state = S.TEXT
-          } else if (is(quote, c)) {
-            parser.state = S.SGML_DECL_QUOTED
-            parser.sgmlDecl += c
-          } else {
-            parser.sgmlDecl += c
-          }
-          continue
-
-        case S.SGML_DECL_QUOTED:
-          if (c === parser.q) {
-            parser.state = S.SGML_DECL
-            parser.q = ''
-          }
-          parser.sgmlDecl += c
-          continue
-
-        case S.DOCTYPE:
-          if (c === '>') {
-            parser.state = S.TEXT
-            emitNode(parser, 'ondoctype', parser.doctype)
-            parser.doctype = true // just remember that we saw it.
-          } else {
-            parser.doctype += c
-            if (c === '[') {
-              parser.state = S.DOCTYPE_DTD
-            } else if (is(quote, c)) {
-              parser.state = S.DOCTYPE_QUOTED
-              parser.q = c
-            }
-          }
-          continue
-
-        case S.DOCTYPE_QUOTED:
-          parser.doctype += c
-          if (c === parser.q) {
-            parser.q = ''
-            parser.state = S.DOCTYPE
-          }
-          continue
-
-        case S.DOCTYPE_DTD:
-          parser.doctype += c
-          if (c === ']') {
-            parser.state = S.DOCTYPE
-          } else if (is(quote, c)) {
-            parser.state = S.DOCTYPE_DTD_QUOTED
-            parser.q = c
-          }
-          continue
-
-        case S.DOCTYPE_DTD_QUOTED:
-          parser.doctype += c
-          if (c === parser.q) {
-            parser.state = S.DOCTYPE_DTD
-            parser.q = ''
-          }
-          continue
-
-        case S.COMMENT:
-          if (c === '-') {
-            parser.state = S.COMMENT_ENDING
-          } else {
-            parser.comment += c
-          }
-          continue
-
-        case S.COMMENT_ENDING:
-          if (c === '-') {
-            parser.state = S.COMMENT_ENDED
-            parser.comment = textopts(parser.opt, parser.comment)
-            if (parser.comment) {
-              emitNode(parser, 'oncomment', parser.comment)
-            }
-            parser.comment = ''
-          } else {
-            parser.comment += '-' + c
-            parser.state = S.COMMENT
-          }
-          continue
-
-        case S.COMMENT_ENDED:
-          if (c !== '>') {
-            strictFail(parser, 'Malformed comment')
-            // allow <!-- blah -- bloo --> in non-strict mode,
-            // which is a comment of " blah -- bloo "
-            parser.comment += '--' + c
-            parser.state = S.COMMENT
-          } else {
-            parser.state = S.TEXT
-          }
-          continue
-
-        case S.CDATA:
-          if (c === ']') {
-            parser.state = S.CDATA_ENDING
-          } else {
-            parser.cdata += c
-          }
-          continue
-
-        case S.CDATA_ENDING:
-          if (c === ']') {
-            parser.state = S.CDATA_ENDING_2
-          } else {
-            parser.cdata += ']' + c
-            parser.state = S.CDATA
-          }
-          continue
-
-        case S.CDATA_ENDING_2:
-          if (c === '>') {
-            if (parser.cdata) {
-              emitNode(parser, 'oncdata', parser.cdata)
-            }
-            emitNode(parser, 'onclosecdata')
-            parser.cdata = ''
-            parser.state = S.TEXT
-          } else if (c === ']') {
-            parser.cdata += ']'
-          } else {
-            parser.cdata += ']]' + c
-            parser.state = S.CDATA
-          }
-          continue
-
-        case S.PROC_INST:
-          if (c === '?') {
-            parser.state = S.PROC_INST_ENDING
-          } else if (is(whitespace, c)) {
-            parser.state = S.PROC_INST_BODY
-          } else {
-            parser.procInstName += c
-          }
-          continue
-
-        case S.PROC_INST_BODY:
-          if (!parser.procInstBody && is(whitespace, c)) {
-            continue
-          } else if (c === '?') {
-            parser.state = S.PROC_INST_ENDING
-          } else {
-            parser.procInstBody += c
-          }
-          continue
-
-        case S.PROC_INST_ENDING:
-          if (c === '>') {
-            emitNode(parser, 'onprocessinginstruction', {
-              name: parser.procInstName,
-              body: parser.procInstBody
-            })
-            parser.procInstName = parser.procInstBody = ''
-            parser.state = S.TEXT
-          } else {
-            parser.procInstBody += '?' + c
-            parser.state = S.PROC_INST_BODY
-          }
-          continue
-
-        case S.OPEN_TAG:
-          if (is(nameBody, c)) {
-            parser.tagName += c
-          } else {
-            newTag(parser)
-            if (c === '>') {
-              openTag(parser)
-            } else if (c === '/') {
-              parser.state = S.OPEN_TAG_SLASH
-            } else {
-              if (not(whitespace, c)) {
-                strictFail(parser, 'Invalid character in tag name')
-              }
-              parser.state = S.ATTRIB
-            }
-          }
-          continue
-
-        case S.OPEN_TAG_SLASH:
-          if (c === '>') {
-            openTag(parser, true)
-            closeTag(parser)
-          } else {
-            strictFail(parser, 'Forward-slash in opening tag not followed by >')
-            parser.state = S.ATTRIB
-          }
-          continue
-
-        case S.ATTRIB:
-          // haven't read the attribute name yet.
-          if (is(whitespace, c)) {
-            continue
-          } else if (c === '>') {
-            openTag(parser)
-          } else if (c === '/') {
-            parser.state = S.OPEN_TAG_SLASH
-          } else if (is(nameStart, c)) {
-            parser.attribName = c
-            parser.attribValue = ''
-            parser.state = S.ATTRIB_NAME
-          } else {
-            strictFail(parser, 'Invalid attribute name')
-          }
-          continue
-
-        case S.ATTRIB_NAME:
-          if (c === '=') {
-            parser.state = S.ATTRIB_VALUE
-          } else if (c === '>') {
-            strictFail(parser, 'Attribute without value')
-            parser.attribValue = parser.attribName
-            attrib(parser)
-            openTag(parser)
-          } else if (is(whitespace, c)) {
-            parser.state = S.ATTRIB_NAME_SAW_WHITE
-          } else if (is(nameBody, c)) {
-            parser.attribName += c
-          } else {
-            strictFail(parser, 'Invalid attribute name')
-          }
-          continue
-
-        case S.ATTRIB_NAME_SAW_WHITE:
-          if (c === '=') {
-            parser.state = S.ATTRIB_VALUE
-          } else if (is(whitespace, c)) {
-            continue
-          } else {
-            strictFail(parser, 'Attribute without value')
-            parser.tag.attributes[parser.attribName] = ''
-            parser.attribValue = ''
-            emitNode(parser, 'onattribute', {
-              name: parser.attribName,
-              value: ''
-            })
-            parser.attribName = ''
-            if (c === '>') {
-              openTag(parser)
-            } else if (is(nameStart, c)) {
-              parser.attribName = c
-              parser.state = S.ATTRIB_NAME
-            } else {
-              strictFail(parser, 'Invalid attribute name')
-              parser.state = S.ATTRIB
-            }
-          }
-          continue
-
-        case S.ATTRIB_VALUE:
-          if (is(whitespace, c)) {
-            continue
-          } else if (is(quote, c)) {
-            parser.q = c
-            parser.state = S.ATTRIB_VALUE_QUOTED
-          } else {
-            strictFail(parser, 'Unquoted attribute value')
-            parser.state = S.ATTRIB_VALUE_UNQUOTED
-            parser.attribValue = c
-          }
-          continue
-
-        case S.ATTRIB_VALUE_QUOTED:
-          if (c !== parser.q) {
-            if (c === '&') {
-              parser.state = S.ATTRIB_VALUE_ENTITY_Q
-            } else {
-              parser.attribValue += c
-            }
-            continue
-          }
-          attrib(parser)
-          parser.q = ''
-          parser.state = S.ATTRIB_VALUE_CLOSED
-          continue
-
-        case S.ATTRIB_VALUE_CLOSED:
-          if (is(whitespace, c)) {
-            parser.state = S.ATTRIB
-          } else if (c === '>') {
-            openTag(parser)
-          } else if (c === '/') {
-            parser.state = S.OPEN_TAG_SLASH
-          } else if (is(nameStart, c)) {
-            strictFail(parser, 'No whitespace between attributes')
-            parser.attribName = c
-            parser.attribValue = ''
-            parser.state = S.ATTRIB_NAME
-          } else {
-            strictFail(parser, 'Invalid attribute name')
-          }
-          continue
-
-        case S.ATTRIB_VALUE_UNQUOTED:
-          if (not(attribEnd, c)) {
-            if (c === '&') {
-              parser.state = S.ATTRIB_VALUE_ENTITY_U
-            } else {
-              parser.attribValue += c
-            }
-            continue
-          }
-          attrib(parser)
-          if (c === '>') {
-            openTag(parser)
-          } else {
-            parser.state = S.ATTRIB
-          }
-          continue
-
-        case S.CLOSE_TAG:
-          if (!parser.tagName) {
-            if (is(whitespace, c)) {
-              continue
-            } else if (not(nameStart, c)) {
-              if (parser.script) {
-                parser.script += '</' + c
-                parser.state = S.SCRIPT
-              } else {
-                strictFail(parser, 'Invalid tagname in closing tag.')
-              }
-            } else {
-              parser.tagName = c
-            }
-          } else if (c === '>') {
-            closeTag(parser)
-          } else if (is(nameBody, c)) {
-            parser.tagName += c
-          } else if (parser.script) {
-            parser.script += '</' + parser.tagName
-            parser.tagName = ''
-            parser.state = S.SCRIPT
-          } else {
-            if (not(whitespace, c)) {
-              strictFail(parser, 'Invalid tagname in closing tag')
-            }
-            parser.state = S.CLOSE_TAG_SAW_WHITE
-          }
-          continue
-
-        case S.CLOSE_TAG_SAW_WHITE:
-          if (is(whitespace, c)) {
-            continue
-          }
-          if (c === '>') {
-            closeTag(parser)
-          } else {
-            strictFail(parser, 'Invalid characters in closing tag')
-          }
-          continue
-
-        case S.TEXT_ENTITY:
-        case S.ATTRIB_VALUE_ENTITY_Q:
-        case S.ATTRIB_VALUE_ENTITY_U:
-          var returnState
-          var buffer
-          switch (parser.state) {
-            case S.TEXT_ENTITY:
-              returnState = S.TEXT
-              buffer = 'textNode'
-              break
-
-            case S.ATTRIB_VALUE_ENTITY_Q:
-              returnState = S.ATTRIB_VALUE_QUOTED
-              buffer = 'attribValue'
-              break
-
-            case S.ATTRIB_VALUE_ENTITY_U:
-              returnState = S.ATTRIB_VALUE_UNQUOTED
-              buffer = 'attribValue'
-              break
-          }
-
-          if (c === ';') {
-            parser[buffer] += parseEntity(parser)
-            parser.entity = ''
-            parser.state = returnState
-          } else if (is(parser.entity.length ? entityBody : entityStart, c)) {
-            parser.entity += c
-          } else {
-            strictFail(parser, 'Invalid character in entity name')
-            parser[buffer] += '&' + parser.entity + c
-            parser.entity = ''
-            parser.state = returnState
-          }
-
-          continue
-
-        default:
-          throw new Error(parser, 'Unknown state: ' + parser.state)
-      }
-    } // while
-
-    if (parser.position >= parser.bufferCheckPosition) {
-      checkBufferLength(parser)
-    }
-    return parser
-  }
-
-  /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
-  if (!String.fromCodePoint) {
-    (function () {
-      var stringFromCharCode = String.fromCharCode
-      var floor = Math.floor
-      var fromCodePoint = function () {
-        var MAX_SIZE = 0x4000
-        var codeUnits = []
-        var highSurrogate
-        var lowSurrogate
-        var index = -1
-        var length = arguments.length
-        if (!length) {
-          return ''
-        }
-        var result = ''
-        while (++index < length) {
-          var codePoint = Number(arguments[index])
-          if (
-            !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`
-            codePoint < 0 || // not a valid Unicode code point
-            codePoint > 0x10FFFF || // not a valid Unicode code point
-            floor(codePoint) !== codePoint // not an integer
-          ) {
-            throw RangeError('Invalid code point: ' + codePoint)
-          }
-          if (codePoint <= 0xFFFF) { // BMP code point
-            codeUnits.push(codePoint)
-          } else { // Astral code point; split in surrogate halves
-            // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
-            codePoint -= 0x10000
-            highSurrogate = (codePoint >> 10) + 0xD800
-            lowSurrogate = (codePoint % 0x400) + 0xDC00
-            codeUnits.push(highSurrogate, lowSurrogate)
-          }
-          if (index + 1 === length || codeUnits.length > MAX_SIZE) {
-            result += stringFromCharCode.apply(null, codeUnits)
-            codeUnits.length = 0
-          }
-        }
-        return result
-      }
-      if (Object.defineProperty) {
-        Object.defineProperty(String, 'fromCodePoint', {
-          value: fromCodePoint,
-          configurable: true,
-          writable: true
-        })
-      } else {
-        String.fromCodePoint = fromCodePoint
-      }
-    }())
-  }
-})(typeof exports === 'undefined' ? this.sax = {} : exports)
diff --git a/node_modules/elementtree/node_modules/sax/package.json b/node_modules/elementtree/node_modules/sax/package.json
deleted file mode 100644
index 4e053ed..0000000
--- a/node_modules/elementtree/node_modules/sax/package.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "_args": [
-    [
-      "sax@1.1.4",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "sax@1.1.4",
-  "_id": "sax@1.1.4",
-  "_inBundle": false,
-  "_integrity": "sha1-dLbTPJrh4AFRDxeakRaFiPGu2qk=",
-  "_location": "/elementtree/sax",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "sax@1.1.4",
-    "name": "sax",
-    "escapedName": "sax",
-    "rawSpec": "1.1.4",
-    "saveSpec": null,
-    "fetchSpec": "1.1.4"
-  },
-  "_requiredBy": [
-    "/elementtree"
-  ],
-  "_resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz",
-  "_spec": "1.1.4",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Isaac Z. Schlueter",
-    "email": "i@izs.me",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/sax-js/issues"
-  },
-  "description": "An evented streaming XML parser in JavaScript",
-  "devDependencies": {
-    "standard": "^5.3.1",
-    "tap": "^2.1.1"
-  },
-  "files": [
-    "lib/sax.js",
-    "LICENSE",
-    "LICENSE-W3C.html",
-    "README.md"
-  ],
-  "homepage": "https://github.com/isaacs/sax-js#readme",
-  "license": "ISC",
-  "main": "lib/sax.js",
-  "name": "sax",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/sax-js.git"
-  },
-  "scripts": {
-    "lint": "standard -F test/*.js lib/*.js",
-    "posttest": "npm run lint",
-    "test": "tap test/*.js"
-  },
-  "version": "1.1.4"
-}
diff --git a/node_modules/elementtree/package.json b/node_modules/elementtree/package.json
deleted file mode 100644
index 7fa0354..0000000
--- a/node_modules/elementtree/package.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
-  "_args": [
-    [
-      "elementtree@0.1.7",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "elementtree@0.1.7",
-  "_id": "elementtree@0.1.7",
-  "_inBundle": false,
-  "_integrity": "sha1-mskb5uUvtuYkTE5UpKw+2K6OKcA=",
-  "_location": "/elementtree",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "elementtree@0.1.7",
-    "name": "elementtree",
-    "escapedName": "elementtree",
-    "rawSpec": "0.1.7",
-    "saveSpec": null,
-    "fetchSpec": "0.1.7"
-  },
-  "_requiredBy": [
-    "/"
-  ],
-  "_resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz",
-  "_spec": "0.1.7",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Rackspace US, Inc."
-  },
-  "bugs": {
-    "url": "https://github.com/racker/node-elementtree/issues"
-  },
-  "contributors": [
-    {
-      "name": "Paul Querna",
-      "email": "paul.querna@rackspace.com"
-    },
-    {
-      "name": "Tomaz Muraus",
-      "email": "tomaz.muraus@rackspace.com"
-    }
-  ],
-  "dependencies": {
-    "sax": "1.1.4"
-  },
-  "description": "XML Serialization and Parsing module based on Python's ElementTree.",
-  "devDependencies": {
-    "whiskey": "0.8.x"
-  },
-  "directories": {
-    "lib": "lib"
-  },
-  "engines": {
-    "node": ">= 0.4.0"
-  },
-  "homepage": "https://github.com/racker/node-elementtree",
-  "keywords": [
-    "xml",
-    "sax",
-    "parser",
-    "seralization",
-    "elementtree"
-  ],
-  "license": "Apache-2.0",
-  "main": "lib/elementtree.js",
-  "name": "elementtree",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/racker/node-elementtree.git"
-  },
-  "scripts": {
-    "test": "make test"
-  },
-  "version": "0.1.7"
-}
diff --git a/node_modules/elementtree/tests/data/bom-xml.xml b/node_modules/elementtree/tests/data/bom-xml.xml
deleted file mode 100644
index 122cce6..0000000
--- a/node_modules/elementtree/tests/data/bom-xml.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0"?>
-<container name="test_container_1" xmlns:android="http://schemas.android.com/apk/res/android">
-  <object>dd
-    <name>test_object_1</name>
-    <hash>4281c348eaf83e70ddce0e07221c3d28</hash>
-    <bytes android:type="cool">14</bytes>
-    <content_type>application/octetstream</content_type>
-    <last_modified>2009-02-03T05:26:32.612278</last_modified>
-  </object>
-  <object>
-    <name>test_object_2</name>
-    <hash>b039efe731ad111bc1b0ef221c3849d0</hash>
-    <bytes android:type="lame">64</bytes>
-    <content_type>application/octetstream</content_type>
-    <last_modified>2009-02-03T05:26:32.612278</last_modified>
-  </object>
-</container>
diff --git a/node_modules/elementtree/tests/data/xml1.xml b/node_modules/elementtree/tests/data/xml1.xml
deleted file mode 100644
index 72c33ae..0000000
--- a/node_modules/elementtree/tests/data/xml1.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0"?>
-<container name="test_container_1" xmlns:android="http://schemas.android.com/apk/res/android">
-  <object>dd
-    <name>test_object_1</name>
-    <hash>4281c348eaf83e70ddce0e07221c3d28</hash>
-    <bytes android:type="cool">14</bytes>
-    <content_type>application/octetstream</content_type>
-    <last_modified>2009-02-03T05:26:32.612278</last_modified>
-  </object>
-  <object>
-    <name>test_object_2</name>
-    <hash>b039efe731ad111bc1b0ef221c3849d0</hash>
-    <bytes android:type="lame">64</bytes>
-    <content_type>application/octetstream</content_type>
-    <last_modified>2009-02-03T05:26:32.612278</last_modified>
-  </object>
-</container>
diff --git a/node_modules/elementtree/tests/data/xml2.xml b/node_modules/elementtree/tests/data/xml2.xml
deleted file mode 100644
index 5f94bbd..0000000
--- a/node_modules/elementtree/tests/data/xml2.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0"?>
-<object>
-    <title>
-        Hello World
-    </title>
-    <children>
-        <object id="obj1" />
-        <object id="obj2" />
-        <object id="obj3" />
-    </children>
-    <text><![CDATA[
-        Test & Test & Test
-    ]]></text>
-</object>
diff --git a/node_modules/elementtree/tests/test-simple.js b/node_modules/elementtree/tests/test-simple.js
deleted file mode 100644
index 629a208..0000000
--- a/node_modules/elementtree/tests/test-simple.js
+++ /dev/null
@@ -1,348 +0,0 @@
-/**
- *  Copyright 2011 Rackspace
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-var fs = require('fs');
-var path = require('path');
-
-var sprintf = require('./../lib/sprintf').sprintf;
-var et = require('elementtree');
-var XML = et.XML;
-var ElementTree = et.ElementTree;
-var Element = et.Element;
-var SubElement = et.SubElement;
-var SyntaxError = require('./../lib/errors').SyntaxError;
-
-function readFile(name) {
-  return fs.readFileSync(path.join(__dirname, '/data/', name), 'utf8');
-}
-
-exports['test_simplest'] = function(test, assert) {
-  /* Ported from <https://github.com/lxml/lxml/blob/master/src/lxml/tests/test_elementtree.py> */
-  var Element = et.Element;
-  var root = Element('root');
-  root.append(Element('one'));
-  root.append(Element('two'));
-  root.append(Element('three'));
-  assert.equal(3, root.len());
-  assert.equal('one', root.getItem(0).tag);
-  assert.equal('two', root.getItem(1).tag);
-  assert.equal('three', root.getItem(2).tag);
-  test.finish();
-};
-
-
-exports['test_attribute_values'] = function(test, assert) {
-  var XML = et.XML;
-  var root = XML('<doc alpha="Alpha" beta="Beta" gamma="Gamma"/>');
-  assert.equal('Alpha', root.attrib['alpha']);
-  assert.equal('Beta', root.attrib['beta']);
-  assert.equal('Gamma', root.attrib['gamma']);
-  test.finish();
-};
-
-
-exports['test_findall'] = function(test, assert) {
-  var XML = et.XML;
-  var root = XML('<a><b><c/></b><b/><c><b/></c></a>');
-
-  assert.equal(root.findall("c").length, 1);
-  assert.equal(root.findall(".//c").length, 2);
-  assert.equal(root.findall(".//b").length, 3);
-  assert.equal(root.findall(".//b")[0]._children.length, 1);
-  assert.equal(root.findall(".//b")[1]._children.length, 0);
-  assert.equal(root.findall(".//b")[2]._children.length, 0);
-  assert.deepEqual(root.findall('.//b')[0], root.getchildren()[0]);
-
-  test.finish();
-};
-
-exports['test_find'] = function(test, assert) {
-  var a = Element('a');
-  var b = SubElement(a, 'b');
-  var c = SubElement(a, 'c');
-
-  assert.deepEqual(a.find('./b/..'), a);
-  test.finish();
-};
-
-exports['test_elementtree_find_qname'] = function(test, assert) {
-  var tree = new et.ElementTree(XML('<a><b><c/></b><b/><c><b/></c></a>'));
-  assert.deepEqual(tree.find(new et.QName('c')), tree.getroot()._children[2]);
-  test.finish();
-};
-
-exports['test_attrib_ns_clear'] = function(test, assert) {
-  var attribNS = '{http://foo/bar}x';
-
-  var par = Element('par');
-  par.set(attribNS, 'a');
-  var child = SubElement(par, 'child');
-  child.set(attribNS, 'b');
-
-  assert.equal('a', par.get(attribNS));
-  assert.equal('b', child.get(attribNS));
-
-  par.clear();
-  assert.equal(null, par.get(attribNS));
-  assert.equal('b', child.get(attribNS));
-  test.finish();
-};
-
-exports['test_create_tree_and_parse_simple'] = function(test, assert) {
-  var i = 0;
-  var e = new Element('bar', {});
-  var expected = "<?xml version='1.0' encoding='utf-8'?>\n" +
-    '<bar><blah a="11" /><blah a="12" /><gag a="13" b="abc">ponies</gag></bar>';
-
-  SubElement(e, "blah", {a: 11});
-  SubElement(e, "blah", {a: 12});
-  var se = et.SubElement(e, "gag", {a: '13', b: 'abc'});
-  se.text = 'ponies';
-
-  se.itertext(function(text) {
-    assert.equal(text, 'ponies');
-    i++;
-  });
-
-  assert.equal(i, 1);
-  var etree = new ElementTree(e);
-  var xml = etree.write();
-  assert.equal(xml, expected);
-  test.finish();
-};
-
-exports['test_write_with_options'] = function(test, assert) {
-  var i = 0;
-  var e = new Element('bar', {});
-  var expected1 = "<?xml version='1.0' encoding='utf-8'?>\n" +
-    '<bar>\n' +
-    '    <blah a="11">\n' +
-    '        <baz d="11">test</baz>\n' +
-    '    </blah>\n' +
-    '    <blah a="12" />\n' +
-    '    <gag a="13" b="abc">ponies</gag>\n' +
-    '</bar>\n';
-    var expected2 = "<?xml version='1.0' encoding='utf-8'?>\n" +
-    '<bar>\n' +
-    '  <blah a="11">\n' +
-    '    <baz d="11">test</baz>\n' +
-    '  </blah>\n' +
-    '  <blah a="12" />\n' +
-    '  <gag a="13" b="abc">ponies</gag>\n' +
-    '</bar>\n';
-
-    var expected3 = "<?xml version='1.0' encoding='utf-8'?>\n" +
-    '<object>\n' +
-    '    <title>\n' +
-    '        Hello World\n' +
-    '    </title>\n' +
-    '    <children>\n' +
-    '        <object id="obj1" />\n' +
-    '        <object id="obj2" />\n' +
-    '        <object id="obj3" />\n' +
-    '    </children>\n' +
-    '    <text>\n' +
-    '        Test &amp; Test &amp; Test\n' +
-    '    </text>\n' +
-    '</object>\n';
-
-  var se1 = SubElement(e, "blah", {a: 11});
-  var se2 = SubElement(se1, "baz", {d: 11});
-  se2.text = 'test';
-  SubElement(e, "blah", {a: 12});
-  var se = et.SubElement(e, "gag", {a: '13', b: 'abc'});
-  se.text = 'ponies';
-
-  se.itertext(function(text) {
-    assert.equal(text, 'ponies');
-    i++;
-  });
-
-  assert.equal(i, 1);
-  var etree = new ElementTree(e);
-  var xml1 = etree.write({'indent': 4});
-  var xml2 = etree.write({'indent': 2});
-  assert.equal(xml1, expected1);
-  assert.equal(xml2, expected2);
-
-  var file = readFile('xml2.xml');
-  var etree2 = et.parse(file);
-  var xml3 = etree2.write({'indent': 4});
-  assert.equal(xml3, expected3);
-  test.finish();
-};
-
-exports['test_parse_and_find_2'] = function(test, assert) {
-  var data = readFile('xml1.xml');
-  var etree = et.parse(data);
-
-  assert.equal(etree.findall('./object').length, 2);
-  assert.equal(etree.findall('[@name]').length, 1);
-  assert.equal(etree.findall('[@name="test_container_1"]').length, 1);
-  assert.equal(etree.findall('[@name=\'test_container_1\']').length, 1);
-  assert.equal(etree.findall('./object')[0].findtext('name'), 'test_object_1');
-  assert.equal(etree.findtext('./object/name'), 'test_object_1');
-  assert.equal(etree.findall('.//bytes').length, 2);
-  assert.equal(etree.findall('*/bytes').length, 2);
-  assert.equal(etree.findall('*/foobar').length, 0);
-
-  test.finish();
-};
-
-exports['test_namespaced_attribute'] = function(test, assert) {
-  var data = readFile('xml1.xml');
-  var etree = et.parse(data);
-
-  assert.equal(etree.findall('*/bytes[@android:type="cool"]').length, 1);
-
-  test.finish();
-}
-
-exports['test_syntax_errors'] = function(test, assert) {
-  var expressions = [ './/@bar', '[@bar', '[@foo=bar]', '[@', '/bar' ];
-  var errCount = 0;
-  var data = readFile('xml1.xml');
-  var etree = et.parse(data);
-
-  expressions.forEach(function(expression) {
-    try {
-      etree.findall(expression);
-    }
-    catch (err) {
-      errCount++;
-    }
-  });
-
-  assert.equal(errCount, expressions.length);
-  test.finish();
-};
-
-exports['test_register_namespace'] = function(test, assert){
-  var prefix = 'TESTPREFIX';
-  var namespace = 'http://seriously.unknown/namespace/URI';
-  var errCount = 0;
-
-  var etree = Element(sprintf('{%s}test', namespace));
-  assert.equal(et.tostring(etree, { 'xml_declaration': false}),
-               sprintf('<ns0:test xmlns:ns0="%s" />', namespace));
-
-  et.register_namespace(prefix, namespace);
-  var etree = Element(sprintf('{%s}test', namespace));
-  assert.equal(et.tostring(etree, { 'xml_declaration': false}),
-               sprintf('<%s:test xmlns:%s="%s" />', prefix, prefix, namespace));
-
-  try {
-    et.register_namespace('ns25', namespace);
-  }
-  catch (err) {
-    errCount++;
-  }
-
-  assert.equal(errCount, 1, 'Reserved prefix used, but exception was not thrown');
-  test.finish();
-};
-
-exports['test_tostring'] = function(test, assert) {
-  var a = Element('a');
-  var b = SubElement(a, 'b');
-  var c = SubElement(a, 'c');
-  c.text = 543;
-
-  assert.equal(et.tostring(a, { 'xml_declaration': false }), '<a><b /><c>543</c></a>');
-  assert.equal(et.tostring(c, { 'xml_declaration': false }), '<c>543</c>');
-  test.finish();
-};
-
-exports['test_escape'] = function(test, assert) {
-  var a = Element('a');
-  var b = SubElement(a, 'b');
-  b.text = '&&&&<>"\n\r';
-
-  assert.equal(et.tostring(a, { 'xml_declaration': false }), '<a><b>&amp;&amp;&amp;&amp;&lt;&gt;\"\n\r</b></a>');
-  test.finish();
-};
-
-exports['test_find_null'] = function(test, assert) {
-  var root = Element('root');
-  var node = SubElement(root, 'node');
-  var leaf  = SubElement(node, 'leaf');
-  leaf.text = 'ipsum';
-
-  assert.equal(root.find('node/leaf'), leaf);
-  assert.equal(root.find('no-such-node/leaf'), null);
-  test.finish();
-};
-
-exports['test_findtext_null'] = function(test, assert) {
-  var root = Element('root');
-  var node = SubElement(root, 'node');
-  var leaf  = SubElement(node, 'leaf');
-  leaf.text = 'ipsum';
-
-  assert.equal(root.findtext('node/leaf'), 'ipsum');
-  assert.equal(root.findtext('no-such-node/leaf'), null);
-  test.finish();
-};
-
-exports['test_remove'] = function(test, assert) {
-  var root = Element('root');
-  var node1 = SubElement(root, 'node1');
-  var node2 = SubElement(root, 'node2');
-  var node3 = SubElement(root, 'node3');
-
-  assert.equal(root.len(), 3);
-
-  root.remove(node2);
-
-  assert.equal(root.len(), 2);
-  assert.equal(root.getItem(0).tag, 'node1')
-  assert.equal(root.getItem(1).tag, 'node3')
-
-  test.finish();
-};
-
-exports['test_cdata_write'] = function(test, assert) {
-  var root, etree, xml, values, value, i;
-
-  values = [
-    'if(0>1) then true;',
-    '<test1>ponies hello</test1>',
-    ''
-  ];
-
-  for (i = 0; i < values.length; i++) {
-    value = values[i];
-
-    root = Element('root');
-    root.append(et.CData(value));
-    etree = new ElementTree(root);
-    xml = etree.write({'xml_declaration': false});
-
-    assert.equal(xml, sprintf('<root><![CDATA[%s]]></root>', value));
-  }
-
-  test.finish();
-};
-
-exports['test_read_bom'] = function(test, assert) {
-  var file = readFile('bom-xml.xml');
-  var etree = et.parse(file);
-
-  // If parse finished, test was successful
-
-  test.finish();
-};
diff --git a/node_modules/glob/LICENSE b/node_modules/glob/LICENSE
deleted file mode 100644
index 19129e3..0000000
--- a/node_modules/glob/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/glob/README.md b/node_modules/glob/README.md
deleted file mode 100644
index 063cf95..0000000
--- a/node_modules/glob/README.md
+++ /dev/null
@@ -1,377 +0,0 @@
-[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Dependency Status](https://david-dm.org/isaacs/node-glob.svg)](https://david-dm.org/isaacs/node-glob) [![devDependency Status](https://david-dm.org/isaacs/node-glob/dev-status.svg)](https://david-dm.org/isaacs/node-glob#info=devDependencies) [![optionalDependency Status](https://david-dm.org/isaacs/node-glob/optional-status.svg)](https://david-dm.org/isaacs/node-glob#info=optionalDependencies)
-
-# Glob
-
-Match files using the patterns the shell uses, like stars and stuff.
-
-This is a glob implementation in JavaScript.  It uses the `minimatch`
-library to do its matching.
-
-![](oh-my-glob.gif)
-
-## Usage
-
-```javascript
-var glob = require("glob")
-
-// options is optional
-glob("**/*.js", options, function (er, files) {
-  // files is an array of filenames.
-  // If the `nonull` option is set, and nothing
-  // was found, then files is ["**/*.js"]
-  // er is an error object or null.
-})
-```
-
-## Glob Primer
-
-"Globs" are the patterns you type when you do stuff like `ls *.js` on
-the command line, or put `build/*` in a `.gitignore` file.
-
-Before parsing the path part patterns, braced sections are expanded
-into a set.  Braced sections start with `{` and end with `}`, with any
-number of comma-delimited sections within.  Braced sections may contain
-slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`.
-
-The following characters have special magic meaning when used in a
-path portion:
-
-* `*` Matches 0 or more characters in a single path portion
-* `?` Matches 1 character
-* `[...]` Matches a range of characters, similar to a RegExp range.
-  If the first character of the range is `!` or `^` then it matches
-  any character not in the range.
-* `!(pattern|pattern|pattern)` Matches anything that does not match
-  any of the patterns provided.
-* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the
-  patterns provided.
-* `+(pattern|pattern|pattern)` Matches one or more occurrences of the
-  patterns provided.
-* `*(a|b|c)` Matches zero or more occurrences of the patterns provided
-* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns
-  provided
-* `**` If a "globstar" is alone in a path portion, then it matches
-  zero or more directories and subdirectories searching for matches.
-  It does not crawl symlinked directories.
-
-### Dots
-
-If a file or directory path portion has a `.` as the first character,
-then it will not match any glob pattern unless that pattern's
-corresponding path part also has a `.` as its first character.
-
-For example, the pattern `a/.*/c` would match the file at `a/.b/c`.
-However the pattern `a/*/c` would not, because `*` does not start with
-a dot character.
-
-You can make glob treat dots as normal characters by setting
-`dot:true` in the options.
-
-### Basename Matching
-
-If you set `matchBase:true` in the options, and the pattern has no
-slashes in it, then it will seek for any file anywhere in the tree
-with a matching basename.  For example, `*.js` would match
-`test/simple/basic.js`.
-
-### Negation
-
-The intent for negation would be for a pattern starting with `!` to
-match everything that *doesn't* match the supplied pattern.  However,
-the implementation is weird, and for the time being, this should be
-avoided.  The behavior is deprecated in version 5, and will be removed
-entirely in version 6.
-
-### Empty Sets
-
-If no matching files are found, then an empty array is returned.  This
-differs from the shell, where the pattern itself is returned.  For
-example:
-
-    $ echo a*s*d*f
-    a*s*d*f
-
-To get the bash-style behavior, set the `nonull:true` in the options.
-
-### See Also:
-
-* `man sh`
-* `man bash` (Search for "Pattern Matching")
-* `man 3 fnmatch`
-* `man 5 gitignore`
-* [minimatch documentation](https://github.com/isaacs/minimatch)
-
-## glob.hasMagic(pattern, [options])
-
-Returns `true` if there are any special characters in the pattern, and
-`false` otherwise.
-
-Note that the options affect the results.  If `noext:true` is set in
-the options object, then `+(a|b)` will not be considered a magic
-pattern.  If the pattern has a brace expansion, like `a/{b/c,x/y}`
-then that is considered magical, unless `nobrace:true` is set in the
-options.
-
-## glob(pattern, [options], cb)
-
-* `pattern` {String} Pattern to be matched
-* `options` {Object}
-* `cb` {Function}
-  * `err` {Error | null}
-  * `matches` {Array<String>} filenames found matching the pattern
-
-Perform an asynchronous glob search.
-
-## glob.sync(pattern, [options])
-
-* `pattern` {String} Pattern to be matched
-* `options` {Object}
-* return: {Array<String>} filenames found matching the pattern
-
-Perform a synchronous glob search.
-
-## Class: glob.Glob
-
-Create a Glob object by instantiating the `glob.Glob` class.
-
-```javascript
-var Glob = require("glob").Glob
-var mg = new Glob(pattern, options, cb)
-```
-
-It's an EventEmitter, and starts walking the filesystem to find matches
-immediately.
-
-### new glob.Glob(pattern, [options], [cb])
-
-* `pattern` {String} pattern to search for
-* `options` {Object}
-* `cb` {Function} Called when an error occurs, or matches are found
-  * `err` {Error | null}
-  * `matches` {Array<String>} filenames found matching the pattern
-
-Note that if the `sync` flag is set in the options, then matches will
-be immediately available on the `g.found` member.
-
-### Properties
-
-* `minimatch` The minimatch object that the glob uses.
-* `options` The options object passed in.
-* `aborted` Boolean which is set to true when calling `abort()`.  There
-  is no way at this time to continue a glob search after aborting, but
-  you can re-use the statCache to avoid having to duplicate syscalls.
-* `cache` Convenience object.  Each field has the following possible
-  values:
-  * `false` - Path does not exist
-  * `true` - Path exists
-  * `'DIR'` - Path exists, and is not a directory
-  * `'FILE'` - Path exists, and is a directory
-  * `[file, entries, ...]` - Path exists, is a directory, and the
-    array value is the results of `fs.readdir`
-* `statCache` Cache of `fs.stat` results, to prevent statting the same
-  path multiple times.
-* `symlinks` A record of which paths are symbolic links, which is
-  relevant in resolving `**` patterns.
-* `realpathCache` An optional object which is passed to `fs.realpath`
-  to minimize unnecessary syscalls.  It is stored on the instantiated
-  Glob object, and may be re-used.
-
-### Events
-
-* `end` When the matching is finished, this is emitted with all the
-  matches found.  If the `nonull` option is set, and no match was found,
-  then the `matches` list contains the original pattern.  The matches
-  are sorted, unless the `nosort` flag is set.
-* `match` Every time a match is found, this is emitted with the matched.
-* `error` Emitted when an unexpected error is encountered, or whenever
-  any fs error occurs if `options.strict` is set.
-* `abort` When `abort()` is called, this event is raised.
-
-### Methods
-
-* `pause` Temporarily stop the search
-* `resume` Resume the search
-* `abort` Stop the search forever
-
-### Options
-
-All the options that can be passed to Minimatch can also be passed to
-Glob to change pattern matching behavior.  Also, some have been added,
-or have glob-specific ramifications.
-
-All options are false by default, unless otherwise noted.
-
-All options are added to the Glob object, as well.
-
-If you are running many `glob` operations, you can pass a Glob object
-as the `options` argument to a subsequent operation to shortcut some
-`stat` and `readdir` calls.  At the very least, you may pass in shared
-`symlinks`, `statCache`, `realpathCache`, and `cache` options, so that
-parallel glob operations will be sped up by sharing information about
-the filesystem.
-
-* `cwd` The current working directory in which to search.  Defaults
-  to `process.cwd()`.
-* `root` The place where patterns starting with `/` will be mounted
-  onto.  Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix
-  systems, and `C:\` or some such on Windows.)
-* `dot` Include `.dot` files in normal matches and `globstar` matches.
-  Note that an explicit dot in a portion of the pattern will always
-  match dot files.
-* `nomount` By default, a pattern starting with a forward-slash will be
-  "mounted" onto the root setting, so that a valid filesystem path is
-  returned.  Set this flag to disable that behavior.
-* `mark` Add a `/` character to directory matches.  Note that this
-  requires additional stat calls.
-* `nosort` Don't sort the results.
-* `stat` Set to true to stat *all* results.  This reduces performance
-  somewhat, and is completely unnecessary, unless `readdir` is presumed
-  to be an untrustworthy indicator of file existence.
-* `silent` When an unusual error is encountered when attempting to
-  read a directory, a warning will be printed to stderr.  Set the
-  `silent` option to true to suppress these warnings.
-* `strict` When an unusual error is encountered when attempting to
-  read a directory, the process will just continue on in search of
-  other matches.  Set the `strict` option to raise an error in these
-  cases.
-* `cache` See `cache` property above.  Pass in a previously generated
-  cache object to save some fs calls.
-* `statCache` A cache of results of filesystem information, to prevent
-  unnecessary stat calls.  While it should not normally be necessary
-  to set this, you may pass the statCache from one glob() call to the
-  options object of another, if you know that the filesystem will not
-  change between calls.  (See "Race Conditions" below.)
-* `symlinks` A cache of known symbolic links.  You may pass in a
-  previously generated `symlinks` object to save `lstat` calls when
-  resolving `**` matches.
-* `sync` DEPRECATED: use `glob.sync(pattern, opts)` instead.
-* `nounique` In some cases, brace-expanded patterns can result in the
-  same file showing up multiple times in the result set.  By default,
-  this implementation prevents duplicates in the result set.  Set this
-  flag to disable that behavior.
-* `nonull` Set to never return an empty set, instead returning a set
-  containing the pattern itself.  This is the default in glob(3).
-* `debug` Set to enable debug logging in minimatch and glob.
-* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets.
-* `noglobstar` Do not match `**` against multiple filenames.  (Ie,
-  treat it as a normal `*` instead.)
-* `noext` Do not match `+(a|b)` "extglob" patterns.
-* `nocase` Perform a case-insensitive match.  Note: on
-  case-insensitive filesystems, non-magic patterns will match by
-  default, since `stat` and `readdir` will not raise errors.
-* `matchBase` Perform a basename-only match if the pattern does not
-  contain any slash characters.  That is, `*.js` would be treated as
-  equivalent to `**/*.js`, matching all js files in all directories.
-* `nodir` Do not match directories, only files.  (Note: to match
-  *only* directories, simply put a `/` at the end of the pattern.)
-* `ignore` Add a pattern or an array of patterns to exclude matches.
-* `follow` Follow symlinked directories when expanding `**` patterns.
-  Note that this can result in a lot of duplicate references in the
-  presence of cyclic links.
-* `realpath` Set to true to call `fs.realpath` on all of the results.
-  In the case of a symlink that cannot be resolved, the full absolute
-  path to the matched entry is returned (though it will usually be a
-  broken symlink)
-* `nonegate` Suppress deprecated `negate` behavior.  (See below.)
-  Default=true
-* `nocomment` Suppress deprecated `comment` behavior.  (See below.)
-  Default=true
-
-## Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a worthwhile
-goal, some discrepancies exist between node-glob and other
-implementations, and are intentional.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set.  This is supported in the manner of bsdglob
-and bash 4.3, where `**` only has special significance if it is the only
-thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.
-
-Note that symlinked directories are not crawled as part of a `**`,
-though their contents may match against subsequent portions of the
-pattern.  This prevents infinite loops and duplicates and the like.
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then glob returns the pattern as-provided, rather than
-interpreting the character escapes.  For example,
-`glob.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern.  Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity.  Since those two are valid, matching proceeds.
-
-### Comments and Negation
-
-**Note**: In version 5 of this module, negation and comments are
-**disabled** by default.  You can explicitly set `nonegate:false` or
-`nocomment:false` to re-enable them.  They are going away entirely in
-version 6.
-
-The intent for negation would be for a pattern starting with `!` to
-match everything that *doesn't* match the supplied pattern.  However,
-the implementation is weird.  It is better to use the `ignore` option
-to set a pattern or set of patterns to exclude from matches.  If you
-want the "everything except *x*" type of behavior, you can use `**` as
-the main pattern, and set an `ignore` for the things to exclude.
-
-The comments feature is added in minimatch, primarily to more easily
-support use cases like ignore files, where a `#` at the start of a
-line makes the pattern "empty".  However, in the context of a
-straightforward filesystem globber, "comments" don't make much sense.
-
-## Windows
-
-**Please only use forward-slashes in glob expressions.**
-
-Though windows uses either `/` or `\` as its path separator, only `/`
-characters are used by this glob implementation.  You must use
-forward-slashes **only** in glob expressions.  Back-slashes will always
-be interpreted as escape characters, not path separators.
-
-Results from absolute patterns such as `/foo/*` are mounted onto the
-root setting using `path.join`.  On windows, this will by default result
-in `/foo/*` matching `C:\foo\bar.txt`.
-
-## Race Conditions
-
-Glob searching, by its very nature, is susceptible to race conditions,
-since it relies on directory walking and such.
-
-As a result, it is possible that a file that exists when glob looks for
-it may have been deleted or modified by the time it returns the result.
-
-As part of its internal implementation, this program caches all stat
-and readdir calls that it makes, in order to cut down on system
-overhead.  However, this also makes it even more susceptible to races,
-especially if the cache or statCache objects are reused between glob
-calls.
-
-Users are thus advised not to use a glob result as a guarantee of
-filesystem state in the face of rapid changes.  For the vast majority
-of operations, this is never a problem.
-
-## Contributing
-
-Any change to behavior (including bugfixes) must come with a test.
-
-Patches that fail tests or reduce performance will be rejected.
-
-```
-# to run tests
-npm test
-
-# to re-generate test fixtures
-npm run test-regen
-
-# to benchmark against bash/zsh
-npm run bench
-
-# to profile javascript
-npm run prof
-```
diff --git a/node_modules/glob/common.js b/node_modules/glob/common.js
deleted file mode 100644
index e36a631..0000000
--- a/node_modules/glob/common.js
+++ /dev/null
@@ -1,245 +0,0 @@
-exports.alphasort = alphasort
-exports.alphasorti = alphasorti
-exports.setopts = setopts
-exports.ownProp = ownProp
-exports.makeAbs = makeAbs
-exports.finish = finish
-exports.mark = mark
-exports.isIgnored = isIgnored
-exports.childrenIgnored = childrenIgnored
-
-function ownProp (obj, field) {
-  return Object.prototype.hasOwnProperty.call(obj, field)
-}
-
-var path = require("path")
-var minimatch = require("minimatch")
-var isAbsolute = require("path-is-absolute")
-var Minimatch = minimatch.Minimatch
-
-function alphasorti (a, b) {
-  return a.toLowerCase().localeCompare(b.toLowerCase())
-}
-
-function alphasort (a, b) {
-  return a.localeCompare(b)
-}
-
-function setupIgnores (self, options) {
-  self.ignore = options.ignore || []
-
-  if (!Array.isArray(self.ignore))
-    self.ignore = [self.ignore]
-
-  if (self.ignore.length) {
-    self.ignore = self.ignore.map(ignoreMap)
-  }
-}
-
-function ignoreMap (pattern) {
-  var gmatcher = null
-  if (pattern.slice(-3) === '/**') {
-    var gpattern = pattern.replace(/(\/\*\*)+$/, '')
-    gmatcher = new Minimatch(gpattern)
-  }
-
-  return {
-    matcher: new Minimatch(pattern),
-    gmatcher: gmatcher
-  }
-}
-
-function setopts (self, pattern, options) {
-  if (!options)
-    options = {}
-
-  // base-matching: just use globstar for that.
-  if (options.matchBase && -1 === pattern.indexOf("/")) {
-    if (options.noglobstar) {
-      throw new Error("base matching requires globstar")
-    }
-    pattern = "**/" + pattern
-  }
-
-  self.silent = !!options.silent
-  self.pattern = pattern
-  self.strict = options.strict !== false
-  self.realpath = !!options.realpath
-  self.realpathCache = options.realpathCache || Object.create(null)
-  self.follow = !!options.follow
-  self.dot = !!options.dot
-  self.mark = !!options.mark
-  self.nodir = !!options.nodir
-  if (self.nodir)
-    self.mark = true
-  self.sync = !!options.sync
-  self.nounique = !!options.nounique
-  self.nonull = !!options.nonull
-  self.nosort = !!options.nosort
-  self.nocase = !!options.nocase
-  self.stat = !!options.stat
-  self.noprocess = !!options.noprocess
-
-  self.maxLength = options.maxLength || Infinity
-  self.cache = options.cache || Object.create(null)
-  self.statCache = options.statCache || Object.create(null)
-  self.symlinks = options.symlinks || Object.create(null)
-
-  setupIgnores(self, options)
-
-  self.changedCwd = false
-  var cwd = process.cwd()
-  if (!ownProp(options, "cwd"))
-    self.cwd = cwd
-  else {
-    self.cwd = options.cwd
-    self.changedCwd = path.resolve(options.cwd) !== cwd
-  }
-
-  self.root = options.root || path.resolve(self.cwd, "/")
-  self.root = path.resolve(self.root)
-  if (process.platform === "win32")
-    self.root = self.root.replace(/\\/g, "/")
-
-  self.nomount = !!options.nomount
-
-  // disable comments and negation unless the user explicitly
-  // passes in false as the option.
-  options.nonegate = options.nonegate === false ? false : true
-  options.nocomment = options.nocomment === false ? false : true
-  deprecationWarning(options)
-
-  self.minimatch = new Minimatch(pattern, options)
-  self.options = self.minimatch.options
-}
-
-// TODO(isaacs): remove entirely in v6
-// exported to reset in tests
-exports.deprecationWarned
-function deprecationWarning(options) {
-  if (!options.nonegate || !options.nocomment) {
-    if (process.noDeprecation !== true && !exports.deprecationWarned) {
-      var msg = 'glob WARNING: comments and negation will be disabled in v6'
-      if (process.throwDeprecation)
-        throw new Error(msg)
-      else if (process.traceDeprecation)
-        console.trace(msg)
-      else
-        console.error(msg)
-
-      exports.deprecationWarned = true
-    }
-  }
-}
-
-function finish (self) {
-  var nou = self.nounique
-  var all = nou ? [] : Object.create(null)
-
-  for (var i = 0, l = self.matches.length; i < l; i ++) {
-    var matches = self.matches[i]
-    if (!matches || Object.keys(matches).length === 0) {
-      if (self.nonull) {
-        // do like the shell, and spit out the literal glob
-        var literal = self.minimatch.globSet[i]
-        if (nou)
-          all.push(literal)
-        else
-          all[literal] = true
-      }
-    } else {
-      // had matches
-      var m = Object.keys(matches)
-      if (nou)
-        all.push.apply(all, m)
-      else
-        m.forEach(function (m) {
-          all[m] = true
-        })
-    }
-  }
-
-  if (!nou)
-    all = Object.keys(all)
-
-  if (!self.nosort)
-    all = all.sort(self.nocase ? alphasorti : alphasort)
-
-  // at *some* point we statted all of these
-  if (self.mark) {
-    for (var i = 0; i < all.length; i++) {
-      all[i] = self._mark(all[i])
-    }
-    if (self.nodir) {
-      all = all.filter(function (e) {
-        return !(/\/$/.test(e))
-      })
-    }
-  }
-
-  if (self.ignore.length)
-    all = all.filter(function(m) {
-      return !isIgnored(self, m)
-    })
-
-  self.found = all
-}
-
-function mark (self, p) {
-  var abs = makeAbs(self, p)
-  var c = self.cache[abs]
-  var m = p
-  if (c) {
-    var isDir = c === 'DIR' || Array.isArray(c)
-    var slash = p.slice(-1) === '/'
-
-    if (isDir && !slash)
-      m += '/'
-    else if (!isDir && slash)
-      m = m.slice(0, -1)
-
-    if (m !== p) {
-      var mabs = makeAbs(self, m)
-      self.statCache[mabs] = self.statCache[abs]
-      self.cache[mabs] = self.cache[abs]
-    }
-  }
-
-  return m
-}
-
-// lotta situps...
-function makeAbs (self, f) {
-  var abs = f
-  if (f.charAt(0) === '/') {
-    abs = path.join(self.root, f)
-  } else if (isAbsolute(f) || f === '') {
-    abs = f
-  } else if (self.changedCwd) {
-    abs = path.resolve(self.cwd, f)
-  } else {
-    abs = path.resolve(f)
-  }
-  return abs
-}
-
-
-// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
-// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
-function isIgnored (self, path) {
-  if (!self.ignore.length)
-    return false
-
-  return self.ignore.some(function(item) {
-    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
-  })
-}
-
-function childrenIgnored (self, path) {
-  if (!self.ignore.length)
-    return false
-
-  return self.ignore.some(function(item) {
-    return !!(item.gmatcher && item.gmatcher.match(path))
-  })
-}
diff --git a/node_modules/glob/glob.js b/node_modules/glob/glob.js
deleted file mode 100644
index 022d2ac..0000000
--- a/node_modules/glob/glob.js
+++ /dev/null
@@ -1,752 +0,0 @@
-// Approach:
-//
-// 1. Get the minimatch set
-// 2. For each pattern in the set, PROCESS(pattern, false)
-// 3. Store matches per-set, then uniq them
-//
-// PROCESS(pattern, inGlobStar)
-// Get the first [n] items from pattern that are all strings
-// Join these together.  This is PREFIX.
-//   If there is no more remaining, then stat(PREFIX) and
-//   add to matches if it succeeds.  END.
-//
-// If inGlobStar and PREFIX is symlink and points to dir
-//   set ENTRIES = []
-// else readdir(PREFIX) as ENTRIES
-//   If fail, END
-//
-// with ENTRIES
-//   If pattern[n] is GLOBSTAR
-//     // handle the case where the globstar match is empty
-//     // by pruning it out, and testing the resulting pattern
-//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
-//     // handle other cases.
-//     for ENTRY in ENTRIES (not dotfiles)
-//       // attach globstar + tail onto the entry
-//       // Mark that this entry is a globstar match
-//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
-//
-//   else // not globstar
-//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
-//       Test ENTRY against pattern[n]
-//       If fails, continue
-//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
-//
-// Caveat:
-//   Cache all stats and readdirs results to minimize syscall.  Since all
-//   we ever care about is existence and directory-ness, we can just keep
-//   `true` for files, and [children,...] for directories, or `false` for
-//   things that don't exist.
-
-module.exports = glob
-
-var fs = require('fs')
-var minimatch = require('minimatch')
-var Minimatch = minimatch.Minimatch
-var inherits = require('inherits')
-var EE = require('events').EventEmitter
-var path = require('path')
-var assert = require('assert')
-var isAbsolute = require('path-is-absolute')
-var globSync = require('./sync.js')
-var common = require('./common.js')
-var alphasort = common.alphasort
-var alphasorti = common.alphasorti
-var setopts = common.setopts
-var ownProp = common.ownProp
-var inflight = require('inflight')
-var util = require('util')
-var childrenIgnored = common.childrenIgnored
-var isIgnored = common.isIgnored
-
-var once = require('once')
-
-function glob (pattern, options, cb) {
-  if (typeof options === 'function') cb = options, options = {}
-  if (!options) options = {}
-
-  if (options.sync) {
-    if (cb)
-      throw new TypeError('callback provided to sync glob')
-    return globSync(pattern, options)
-  }
-
-  return new Glob(pattern, options, cb)
-}
-
-glob.sync = globSync
-var GlobSync = glob.GlobSync = globSync.GlobSync
-
-// old api surface
-glob.glob = glob
-
-glob.hasMagic = function (pattern, options_) {
-  var options = util._extend({}, options_)
-  options.noprocess = true
-
-  var g = new Glob(pattern, options)
-  var set = g.minimatch.set
-  if (set.length > 1)
-    return true
-
-  for (var j = 0; j < set[0].length; j++) {
-    if (typeof set[0][j] !== 'string')
-      return true
-  }
-
-  return false
-}
-
-glob.Glob = Glob
-inherits(Glob, EE)
-function Glob (pattern, options, cb) {
-  if (typeof options === 'function') {
-    cb = options
-    options = null
-  }
-
-  if (options && options.sync) {
-    if (cb)
-      throw new TypeError('callback provided to sync glob')
-    return new GlobSync(pattern, options)
-  }
-
-  if (!(this instanceof Glob))
-    return new Glob(pattern, options, cb)
-
-  setopts(this, pattern, options)
-  this._didRealPath = false
-
-  // process each pattern in the minimatch set
-  var n = this.minimatch.set.length
-
-  // The matches are stored as {<filename>: true,...} so that
-  // duplicates are automagically pruned.
-  // Later, we do an Object.keys() on these.
-  // Keep them as a list so we can fill in when nonull is set.
-  this.matches = new Array(n)
-
-  if (typeof cb === 'function') {
-    cb = once(cb)
-    this.on('error', cb)
-    this.on('end', function (matches) {
-      cb(null, matches)
-    })
-  }
-
-  var self = this
-  var n = this.minimatch.set.length
-  this._processing = 0
-  this.matches = new Array(n)
-
-  this._emitQueue = []
-  this._processQueue = []
-  this.paused = false
-
-  if (this.noprocess)
-    return this
-
-  if (n === 0)
-    return done()
-
-  for (var i = 0; i < n; i ++) {
-    this._process(this.minimatch.set[i], i, false, done)
-  }
-
-  function done () {
-    --self._processing
-    if (self._processing <= 0)
-      self._finish()
-  }
-}
-
-Glob.prototype._finish = function () {
-  assert(this instanceof Glob)
-  if (this.aborted)
-    return
-
-  if (this.realpath && !this._didRealpath)
-    return this._realpath()
-
-  common.finish(this)
-  this.emit('end', this.found)
-}
-
-Glob.prototype._realpath = function () {
-  if (this._didRealpath)
-    return
-
-  this._didRealpath = true
-
-  var n = this.matches.length
-  if (n === 0)
-    return this._finish()
-
-  var self = this
-  for (var i = 0; i < this.matches.length; i++)
-    this._realpathSet(i, next)
-
-  function next () {
-    if (--n === 0)
-      self._finish()
-  }
-}
-
-Glob.prototype._realpathSet = function (index, cb) {
-  var matchset = this.matches[index]
-  if (!matchset)
-    return cb()
-
-  var found = Object.keys(matchset)
-  var self = this
-  var n = found.length
-
-  if (n === 0)
-    return cb()
-
-  var set = this.matches[index] = Object.create(null)
-  found.forEach(function (p, i) {
-    // If there's a problem with the stat, then it means that
-    // one or more of the links in the realpath couldn't be
-    // resolved.  just return the abs value in that case.
-    p = self._makeAbs(p)
-    fs.realpath(p, self.realpathCache, function (er, real) {
-      if (!er)
-        set[real] = true
-      else if (er.syscall === 'stat')
-        set[p] = true
-      else
-        self.emit('error', er) // srsly wtf right here
-
-      if (--n === 0) {
-        self.matches[index] = set
-        cb()
-      }
-    })
-  })
-}
-
-Glob.prototype._mark = function (p) {
-  return common.mark(this, p)
-}
-
-Glob.prototype._makeAbs = function (f) {
-  return common.makeAbs(this, f)
-}
-
-Glob.prototype.abort = function () {
-  this.aborted = true
-  this.emit('abort')
-}
-
-Glob.prototype.pause = function () {
-  if (!this.paused) {
-    this.paused = true
-    this.emit('pause')
-  }
-}
-
-Glob.prototype.resume = function () {
-  if (this.paused) {
-    this.emit('resume')
-    this.paused = false
-    if (this._emitQueue.length) {
-      var eq = this._emitQueue.slice(0)
-      this._emitQueue.length = 0
-      for (var i = 0; i < eq.length; i ++) {
-        var e = eq[i]
-        this._emitMatch(e[0], e[1])
-      }
-    }
-    if (this._processQueue.length) {
-      var pq = this._processQueue.slice(0)
-      this._processQueue.length = 0
-      for (var i = 0; i < pq.length; i ++) {
-        var p = pq[i]
-        this._processing--
-        this._process(p[0], p[1], p[2], p[3])
-      }
-    }
-  }
-}
-
-Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
-  assert(this instanceof Glob)
-  assert(typeof cb === 'function')
-
-  if (this.aborted)
-    return
-
-  this._processing++
-  if (this.paused) {
-    this._processQueue.push([pattern, index, inGlobStar, cb])
-    return
-  }
-
-  //console.error('PROCESS %d', this._processing, pattern)
-
-  // Get the first [n] parts of pattern that are all strings.
-  var n = 0
-  while (typeof pattern[n] === 'string') {
-    n ++
-  }
-  // now n is the index of the first one that is *not* a string.
-
-  // see if there's anything else
-  var prefix
-  switch (n) {
-    // if not, then this is rather simple
-    case pattern.length:
-      this._processSimple(pattern.join('/'), index, cb)
-      return
-
-    case 0:
-      // pattern *starts* with some non-trivial item.
-      // going to readdir(cwd), but not include the prefix in matches.
-      prefix = null
-      break
-
-    default:
-      // pattern has some string bits in the front.
-      // whatever it starts with, whether that's 'absolute' like /foo/bar,
-      // or 'relative' like '../baz'
-      prefix = pattern.slice(0, n).join('/')
-      break
-  }
-
-  var remain = pattern.slice(n)
-
-  // get the list of entries.
-  var read
-  if (prefix === null)
-    read = '.'
-  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
-    if (!prefix || !isAbsolute(prefix))
-      prefix = '/' + prefix
-    read = prefix
-  } else
-    read = prefix
-
-  var abs = this._makeAbs(read)
-
-  //if ignored, skip _processing
-  if (childrenIgnored(this, read))
-    return cb()
-
-  var isGlobStar = remain[0] === minimatch.GLOBSTAR
-  if (isGlobStar)
-    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
-  else
-    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
-}
-
-Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
-  var self = this
-  this._readdir(abs, inGlobStar, function (er, entries) {
-    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
-  })
-}
-
-Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
-
-  // if the abs isn't a dir, then nothing can match!
-  if (!entries)
-    return cb()
-
-  // It will only match dot entries if it starts with a dot, or if
-  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
-  var pn = remain[0]
-  var negate = !!this.minimatch.negate
-  var rawGlob = pn._glob
-  var dotOk = this.dot || rawGlob.charAt(0) === '.'
-
-  var matchedEntries = []
-  for (var i = 0; i < entries.length; i++) {
-    var e = entries[i]
-    if (e.charAt(0) !== '.' || dotOk) {
-      var m
-      if (negate && !prefix) {
-        m = !e.match(pn)
-      } else {
-        m = e.match(pn)
-      }
-      if (m)
-        matchedEntries.push(e)
-    }
-  }
-
-  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
-
-  var len = matchedEntries.length
-  // If there are no matched entries, then nothing matches.
-  if (len === 0)
-    return cb()
-
-  // if this is the last remaining pattern bit, then no need for
-  // an additional stat *unless* the user has specified mark or
-  // stat explicitly.  We know they exist, since readdir returned
-  // them.
-
-  if (remain.length === 1 && !this.mark && !this.stat) {
-    if (!this.matches[index])
-      this.matches[index] = Object.create(null)
-
-    for (var i = 0; i < len; i ++) {
-      var e = matchedEntries[i]
-      if (prefix) {
-        if (prefix !== '/')
-          e = prefix + '/' + e
-        else
-          e = prefix + e
-      }
-
-      if (e.charAt(0) === '/' && !this.nomount) {
-        e = path.join(this.root, e)
-      }
-      this._emitMatch(index, e)
-    }
-    // This was the last one, and no stats were needed
-    return cb()
-  }
-
-  // now test all matched entries as stand-ins for that part
-  // of the pattern.
-  remain.shift()
-  for (var i = 0; i < len; i ++) {
-    var e = matchedEntries[i]
-    var newPattern
-    if (prefix) {
-      if (prefix !== '/')
-        e = prefix + '/' + e
-      else
-        e = prefix + e
-    }
-    this._process([e].concat(remain), index, inGlobStar, cb)
-  }
-  cb()
-}
-
-Glob.prototype._emitMatch = function (index, e) {
-  if (this.aborted)
-    return
-
-  if (this.matches[index][e])
-    return
-
-  if (isIgnored(this, e))
-    return
-
-  if (this.paused) {
-    this._emitQueue.push([index, e])
-    return
-  }
-
-  var abs = this._makeAbs(e)
-
-  if (this.nodir) {
-    var c = this.cache[abs]
-    if (c === 'DIR' || Array.isArray(c))
-      return
-  }
-
-  if (this.mark)
-    e = this._mark(e)
-
-  this.matches[index][e] = true
-
-  var st = this.statCache[abs]
-  if (st)
-    this.emit('stat', e, st)
-
-  this.emit('match', e)
-}
-
-Glob.prototype._readdirInGlobStar = function (abs, cb) {
-  if (this.aborted)
-    return
-
-  // follow all symlinked directories forever
-  // just proceed as if this is a non-globstar situation
-  if (this.follow)
-    return this._readdir(abs, false, cb)
-
-  var lstatkey = 'lstat\0' + abs
-  var self = this
-  var lstatcb = inflight(lstatkey, lstatcb_)
-
-  if (lstatcb)
-    fs.lstat(abs, lstatcb)
-
-  function lstatcb_ (er, lstat) {
-    if (er)
-      return cb()
-
-    var isSym = lstat.isSymbolicLink()
-    self.symlinks[abs] = isSym
-
-    // If it's not a symlink or a dir, then it's definitely a regular file.
-    // don't bother doing a readdir in that case.
-    if (!isSym && !lstat.isDirectory()) {
-      self.cache[abs] = 'FILE'
-      cb()
-    } else
-      self._readdir(abs, false, cb)
-  }
-}
-
-Glob.prototype._readdir = function (abs, inGlobStar, cb) {
-  if (this.aborted)
-    return
-
-  cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
-  if (!cb)
-    return
-
-  //console.error('RD %j %j', +inGlobStar, abs)
-  if (inGlobStar && !ownProp(this.symlinks, abs))
-    return this._readdirInGlobStar(abs, cb)
-
-  if (ownProp(this.cache, abs)) {
-    var c = this.cache[abs]
-    if (!c || c === 'FILE')
-      return cb()
-
-    if (Array.isArray(c))
-      return cb(null, c)
-  }
-
-  var self = this
-  fs.readdir(abs, readdirCb(this, abs, cb))
-}
-
-function readdirCb (self, abs, cb) {
-  return function (er, entries) {
-    if (er)
-      self._readdirError(abs, er, cb)
-    else
-      self._readdirEntries(abs, entries, cb)
-  }
-}
-
-Glob.prototype._readdirEntries = function (abs, entries, cb) {
-  if (this.aborted)
-    return
-
-  // if we haven't asked to stat everything, then just
-  // assume that everything in there exists, so we can avoid
-  // having to stat it a second time.
-  if (!this.mark && !this.stat) {
-    for (var i = 0; i < entries.length; i ++) {
-      var e = entries[i]
-      if (abs === '/')
-        e = abs + e
-      else
-        e = abs + '/' + e
-      this.cache[e] = true
-    }
-  }
-
-  this.cache[abs] = entries
-  return cb(null, entries)
-}
-
-Glob.prototype._readdirError = function (f, er, cb) {
-  if (this.aborted)
-    return
-
-  // handle errors, and cache the information
-  switch (er.code) {
-    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
-    case 'ENOTDIR': // totally normal. means it *does* exist.
-      this.cache[this._makeAbs(f)] = 'FILE'
-      break
-
-    case 'ENOENT': // not terribly unusual
-    case 'ELOOP':
-    case 'ENAMETOOLONG':
-    case 'UNKNOWN':
-      this.cache[this._makeAbs(f)] = false
-      break
-
-    default: // some unusual error.  Treat as failure.
-      this.cache[this._makeAbs(f)] = false
-      if (this.strict) {
-        this.emit('error', er)
-        // If the error is handled, then we abort
-        // if not, we threw out of here
-        this.abort()
-      }
-      if (!this.silent)
-        console.error('glob error', er)
-      break
-  }
-
-  return cb()
-}
-
-Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
-  var self = this
-  this._readdir(abs, inGlobStar, function (er, entries) {
-    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
-  })
-}
-
-
-Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
-  //console.error('pgs2', prefix, remain[0], entries)
-
-  // no entries means not a dir, so it can never have matches
-  // foo.txt/** doesn't match foo.txt
-  if (!entries)
-    return cb()
-
-  // test without the globstar, and with every child both below
-  // and replacing the globstar.
-  var remainWithoutGlobStar = remain.slice(1)
-  var gspref = prefix ? [ prefix ] : []
-  var noGlobStar = gspref.concat(remainWithoutGlobStar)
-
-  // the noGlobStar pattern exits the inGlobStar state
-  this._process(noGlobStar, index, false, cb)
-
-  var isSym = this.symlinks[abs]
-  var len = entries.length
-
-  // If it's a symlink, and we're in a globstar, then stop
-  if (isSym && inGlobStar)
-    return cb()
-
-  for (var i = 0; i < len; i++) {
-    var e = entries[i]
-    if (e.charAt(0) === '.' && !this.dot)
-      continue
-
-    // these two cases enter the inGlobStar state
-    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
-    this._process(instead, index, true, cb)
-
-    var below = gspref.concat(entries[i], remain)
-    this._process(below, index, true, cb)
-  }
-
-  cb()
-}
-
-Glob.prototype._processSimple = function (prefix, index, cb) {
-  // XXX review this.  Shouldn't it be doing the mounting etc
-  // before doing stat?  kinda weird?
-  var self = this
-  this._stat(prefix, function (er, exists) {
-    self._processSimple2(prefix, index, er, exists, cb)
-  })
-}
-Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
-
-  //console.error('ps2', prefix, exists)
-
-  if (!this.matches[index])
-    this.matches[index] = Object.create(null)
-
-  // If it doesn't exist, then just mark the lack of results
-  if (!exists)
-    return cb()
-
-  if (prefix && isAbsolute(prefix) && !this.nomount) {
-    var trail = /[\/\\]$/.test(prefix)
-    if (prefix.charAt(0) === '/') {
-      prefix = path.join(this.root, prefix)
-    } else {
-      prefix = path.resolve(this.root, prefix)
-      if (trail)
-        prefix += '/'
-    }
-  }
-
-  if (process.platform === 'win32')
-    prefix = prefix.replace(/\\/g, '/')
-
-  // Mark this as a match
-  this._emitMatch(index, prefix)
-  cb()
-}
-
-// Returns either 'DIR', 'FILE', or false
-Glob.prototype._stat = function (f, cb) {
-  var abs = this._makeAbs(f)
-  var needDir = f.slice(-1) === '/'
-
-  if (f.length > this.maxLength)
-    return cb()
-
-  if (!this.stat && ownProp(this.cache, abs)) {
-    var c = this.cache[abs]
-
-    if (Array.isArray(c))
-      c = 'DIR'
-
-    // It exists, but maybe not how we need it
-    if (!needDir || c === 'DIR')
-      return cb(null, c)
-
-    if (needDir && c === 'FILE')
-      return cb()
-
-    // otherwise we have to stat, because maybe c=true
-    // if we know it exists, but not what it is.
-  }
-
-  var exists
-  var stat = this.statCache[abs]
-  if (stat !== undefined) {
-    if (stat === false)
-      return cb(null, stat)
-    else {
-      var type = stat.isDirectory() ? 'DIR' : 'FILE'
-      if (needDir && type === 'FILE')
-        return cb()
-      else
-        return cb(null, type, stat)
-    }
-  }
-
-  var self = this
-  var statcb = inflight('stat\0' + abs, lstatcb_)
-  if (statcb)
-    fs.lstat(abs, statcb)
-
-  function lstatcb_ (er, lstat) {
-    if (lstat && lstat.isSymbolicLink()) {
-      // If it's a symlink, then treat it as the target, unless
-      // the target does not exist, then treat it as a file.
-      return fs.stat(abs, function (er, stat) {
-        if (er)
-          self._stat2(f, abs, null, lstat, cb)
-        else
-          self._stat2(f, abs, er, stat, cb)
-      })
-    } else {
-      self._stat2(f, abs, er, lstat, cb)
-    }
-  }
-}
-
-Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
-  if (er) {
-    this.statCache[abs] = false
-    return cb()
-  }
-
-  var needDir = f.slice(-1) === '/'
-  this.statCache[abs] = stat
-
-  if (abs.slice(-1) === '/' && !stat.isDirectory())
-    return cb(null, false, stat)
-
-  var c = stat.isDirectory() ? 'DIR' : 'FILE'
-  this.cache[abs] = this.cache[abs] || c
-
-  if (needDir && c !== 'DIR')
-    return cb()
-
-  return cb(null, c, stat)
-}
diff --git a/node_modules/glob/package.json b/node_modules/glob/package.json
deleted file mode 100644
index 7da0c77..0000000
--- a/node_modules/glob/package.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
-  "_args": [
-    [
-      "glob@5.0.15",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "glob@5.0.15",
-  "_id": "glob@5.0.15",
-  "_inBundle": false,
-  "_integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
-  "_location": "/glob",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "glob@5.0.15",
-    "name": "glob",
-    "escapedName": "glob",
-    "rawSpec": "5.0.15",
-    "saveSpec": null,
-    "fetchSpec": "5.0.15"
-  },
-  "_requiredBy": [
-    "/cordova-common",
-    "/istanbul"
-  ],
-  "_resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
-  "_spec": "5.0.15",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Isaac Z. Schlueter",
-    "email": "i@izs.me",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/node-glob/issues"
-  },
-  "dependencies": {
-    "inflight": "^1.0.4",
-    "inherits": "2",
-    "minimatch": "2 || 3",
-    "once": "^1.3.0",
-    "path-is-absolute": "^1.0.0"
-  },
-  "description": "a little globber",
-  "devDependencies": {
-    "mkdirp": "0",
-    "rimraf": "^2.2.8",
-    "tap": "^1.1.4",
-    "tick": "0.0.6"
-  },
-  "engines": {
-    "node": "*"
-  },
-  "files": [
-    "glob.js",
-    "sync.js",
-    "common.js"
-  ],
-  "homepage": "https://github.com/isaacs/node-glob#readme",
-  "license": "ISC",
-  "main": "glob.js",
-  "name": "glob",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/node-glob.git"
-  },
-  "scripts": {
-    "bench": "bash benchmark.sh",
-    "benchclean": "node benchclean.js",
-    "prepublish": "npm run benchclean",
-    "prof": "bash prof.sh && cat profile.txt",
-    "profclean": "rm -f v8.log profile.txt",
-    "test": "tap test/*.js --cov",
-    "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js"
-  },
-  "version": "5.0.15"
-}
diff --git a/node_modules/glob/sync.js b/node_modules/glob/sync.js
deleted file mode 100644
index 09883d2..0000000
--- a/node_modules/glob/sync.js
+++ /dev/null
@@ -1,460 +0,0 @@
-module.exports = globSync
-globSync.GlobSync = GlobSync
-
-var fs = require('fs')
-var minimatch = require('minimatch')
-var Minimatch = minimatch.Minimatch
-var Glob = require('./glob.js').Glob
-var util = require('util')
-var path = require('path')
-var assert = require('assert')
-var isAbsolute = require('path-is-absolute')
-var common = require('./common.js')
-var alphasort = common.alphasort
-var alphasorti = common.alphasorti
-var setopts = common.setopts
-var ownProp = common.ownProp
-var childrenIgnored = common.childrenIgnored
-
-function globSync (pattern, options) {
-  if (typeof options === 'function' || arguments.length === 3)
-    throw new TypeError('callback provided to sync glob\n'+
-                        'See: https://github.com/isaacs/node-glob/issues/167')
-
-  return new GlobSync(pattern, options).found
-}
-
-function GlobSync (pattern, options) {
-  if (!pattern)
-    throw new Error('must provide pattern')
-
-  if (typeof options === 'function' || arguments.length === 3)
-    throw new TypeError('callback provided to sync glob\n'+
-                        'See: https://github.com/isaacs/node-glob/issues/167')
-
-  if (!(this instanceof GlobSync))
-    return new GlobSync(pattern, options)
-
-  setopts(this, pattern, options)
-
-  if (this.noprocess)
-    return this
-
-  var n = this.minimatch.set.length
-  this.matches = new Array(n)
-  for (var i = 0; i < n; i ++) {
-    this._process(this.minimatch.set[i], i, false)
-  }
-  this._finish()
-}
-
-GlobSync.prototype._finish = function () {
-  assert(this instanceof GlobSync)
-  if (this.realpath) {
-    var self = this
-    this.matches.forEach(function (matchset, index) {
-      var set = self.matches[index] = Object.create(null)
-      for (var p in matchset) {
-        try {
-          p = self._makeAbs(p)
-          var real = fs.realpathSync(p, self.realpathCache)
-          set[real] = true
-        } catch (er) {
-          if (er.syscall === 'stat')
-            set[self._makeAbs(p)] = true
-          else
-            throw er
-        }
-      }
-    })
-  }
-  common.finish(this)
-}
-
-
-GlobSync.prototype._process = function (pattern, index, inGlobStar) {
-  assert(this instanceof GlobSync)
-
-  // Get the first [n] parts of pattern that are all strings.
-  var n = 0
-  while (typeof pattern[n] === 'string') {
-    n ++
-  }
-  // now n is the index of the first one that is *not* a string.
-
-  // See if there's anything else
-  var prefix
-  switch (n) {
-    // if not, then this is rather simple
-    case pattern.length:
-      this._processSimple(pattern.join('/'), index)
-      return
-
-    case 0:
-      // pattern *starts* with some non-trivial item.
-      // going to readdir(cwd), but not include the prefix in matches.
-      prefix = null
-      break
-
-    default:
-      // pattern has some string bits in the front.
-      // whatever it starts with, whether that's 'absolute' like /foo/bar,
-      // or 'relative' like '../baz'
-      prefix = pattern.slice(0, n).join('/')
-      break
-  }
-
-  var remain = pattern.slice(n)
-
-  // get the list of entries.
-  var read
-  if (prefix === null)
-    read = '.'
-  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
-    if (!prefix || !isAbsolute(prefix))
-      prefix = '/' + prefix
-    read = prefix
-  } else
-    read = prefix
-
-  var abs = this._makeAbs(read)
-
-  //if ignored, skip processing
-  if (childrenIgnored(this, read))
-    return
-
-  var isGlobStar = remain[0] === minimatch.GLOBSTAR
-  if (isGlobStar)
-    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
-  else
-    this._processReaddir(prefix, read, abs, remain, index, inGlobStar)
-}
-
-
-GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
-  var entries = this._readdir(abs, inGlobStar)
-
-  // if the abs isn't a dir, then nothing can match!
-  if (!entries)
-    return
-
-  // It will only match dot entries if it starts with a dot, or if
-  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
-  var pn = remain[0]
-  var negate = !!this.minimatch.negate
-  var rawGlob = pn._glob
-  var dotOk = this.dot || rawGlob.charAt(0) === '.'
-
-  var matchedEntries = []
-  for (var i = 0; i < entries.length; i++) {
-    var e = entries[i]
-    if (e.charAt(0) !== '.' || dotOk) {
-      var m
-      if (negate && !prefix) {
-        m = !e.match(pn)
-      } else {
-        m = e.match(pn)
-      }
-      if (m)
-        matchedEntries.push(e)
-    }
-  }
-
-  var len = matchedEntries.length
-  // If there are no matched entries, then nothing matches.
-  if (len === 0)
-    return
-
-  // if this is the last remaining pattern bit, then no need for
-  // an additional stat *unless* the user has specified mark or
-  // stat explicitly.  We know they exist, since readdir returned
-  // them.
-
-  if (remain.length === 1 && !this.mark && !this.stat) {
-    if (!this.matches[index])
-      this.matches[index] = Object.create(null)
-
-    for (var i = 0; i < len; i ++) {
-      var e = matchedEntries[i]
-      if (prefix) {
-        if (prefix.slice(-1) !== '/')
-          e = prefix + '/' + e
-        else
-          e = prefix + e
-      }
-
-      if (e.charAt(0) === '/' && !this.nomount) {
-        e = path.join(this.root, e)
-      }
-      this.matches[index][e] = true
-    }
-    // This was the last one, and no stats were needed
-    return
-  }
-
-  // now test all matched entries as stand-ins for that part
-  // of the pattern.
-  remain.shift()
-  for (var i = 0; i < len; i ++) {
-    var e = matchedEntries[i]
-    var newPattern
-    if (prefix)
-      newPattern = [prefix, e]
-    else
-      newPattern = [e]
-    this._process(newPattern.concat(remain), index, inGlobStar)
-  }
-}
-
-
-GlobSync.prototype._emitMatch = function (index, e) {
-  var abs = this._makeAbs(e)
-  if (this.mark)
-    e = this._mark(e)
-
-  if (this.matches[index][e])
-    return
-
-  if (this.nodir) {
-    var c = this.cache[this._makeAbs(e)]
-    if (c === 'DIR' || Array.isArray(c))
-      return
-  }
-
-  this.matches[index][e] = true
-  if (this.stat)
-    this._stat(e)
-}
-
-
-GlobSync.prototype._readdirInGlobStar = function (abs) {
-  // follow all symlinked directories forever
-  // just proceed as if this is a non-globstar situation
-  if (this.follow)
-    return this._readdir(abs, false)
-
-  var entries
-  var lstat
-  var stat
-  try {
-    lstat = fs.lstatSync(abs)
-  } catch (er) {
-    // lstat failed, doesn't exist
-    return null
-  }
-
-  var isSym = lstat.isSymbolicLink()
-  this.symlinks[abs] = isSym
-
-  // If it's not a symlink or a dir, then it's definitely a regular file.
-  // don't bother doing a readdir in that case.
-  if (!isSym && !lstat.isDirectory())
-    this.cache[abs] = 'FILE'
-  else
-    entries = this._readdir(abs, false)
-
-  return entries
-}
-
-GlobSync.prototype._readdir = function (abs, inGlobStar) {
-  var entries
-
-  if (inGlobStar && !ownProp(this.symlinks, abs))
-    return this._readdirInGlobStar(abs)
-
-  if (ownProp(this.cache, abs)) {
-    var c = this.cache[abs]
-    if (!c || c === 'FILE')
-      return null
-
-    if (Array.isArray(c))
-      return c
-  }
-
-  try {
-    return this._readdirEntries(abs, fs.readdirSync(abs))
-  } catch (er) {
-    this._readdirError(abs, er)
-    return null
-  }
-}
-
-GlobSync.prototype._readdirEntries = function (abs, entries) {
-  // if we haven't asked to stat everything, then just
-  // assume that everything in there exists, so we can avoid
-  // having to stat it a second time.
-  if (!this.mark && !this.stat) {
-    for (var i = 0; i < entries.length; i ++) {
-      var e = entries[i]
-      if (abs === '/')
-        e = abs + e
-      else
-        e = abs + '/' + e
-      this.cache[e] = true
-    }
-  }
-
-  this.cache[abs] = entries
-
-  // mark and cache dir-ness
-  return entries
-}
-
-GlobSync.prototype._readdirError = function (f, er) {
-  // handle errors, and cache the information
-  switch (er.code) {
-    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
-    case 'ENOTDIR': // totally normal. means it *does* exist.
-      this.cache[this._makeAbs(f)] = 'FILE'
-      break
-
-    case 'ENOENT': // not terribly unusual
-    case 'ELOOP':
-    case 'ENAMETOOLONG':
-    case 'UNKNOWN':
-      this.cache[this._makeAbs(f)] = false
-      break
-
-    default: // some unusual error.  Treat as failure.
-      this.cache[this._makeAbs(f)] = false
-      if (this.strict)
-        throw er
-      if (!this.silent)
-        console.error('glob error', er)
-      break
-  }
-}
-
-GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {
-
-  var entries = this._readdir(abs, inGlobStar)
-
-  // no entries means not a dir, so it can never have matches
-  // foo.txt/** doesn't match foo.txt
-  if (!entries)
-    return
-
-  // test without the globstar, and with every child both below
-  // and replacing the globstar.
-  var remainWithoutGlobStar = remain.slice(1)
-  var gspref = prefix ? [ prefix ] : []
-  var noGlobStar = gspref.concat(remainWithoutGlobStar)
-
-  // the noGlobStar pattern exits the inGlobStar state
-  this._process(noGlobStar, index, false)
-
-  var len = entries.length
-  var isSym = this.symlinks[abs]
-
-  // If it's a symlink, and we're in a globstar, then stop
-  if (isSym && inGlobStar)
-    return
-
-  for (var i = 0; i < len; i++) {
-    var e = entries[i]
-    if (e.charAt(0) === '.' && !this.dot)
-      continue
-
-    // these two cases enter the inGlobStar state
-    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
-    this._process(instead, index, true)
-
-    var below = gspref.concat(entries[i], remain)
-    this._process(below, index, true)
-  }
-}
-
-GlobSync.prototype._processSimple = function (prefix, index) {
-  // XXX review this.  Shouldn't it be doing the mounting etc
-  // before doing stat?  kinda weird?
-  var exists = this._stat(prefix)
-
-  if (!this.matches[index])
-    this.matches[index] = Object.create(null)
-
-  // If it doesn't exist, then just mark the lack of results
-  if (!exists)
-    return
-
-  if (prefix && isAbsolute(prefix) && !this.nomount) {
-    var trail = /[\/\\]$/.test(prefix)
-    if (prefix.charAt(0) === '/') {
-      prefix = path.join(this.root, prefix)
-    } else {
-      prefix = path.resolve(this.root, prefix)
-      if (trail)
-        prefix += '/'
-    }
-  }
-
-  if (process.platform === 'win32')
-    prefix = prefix.replace(/\\/g, '/')
-
-  // Mark this as a match
-  this.matches[index][prefix] = true
-}
-
-// Returns either 'DIR', 'FILE', or false
-GlobSync.prototype._stat = function (f) {
-  var abs = this._makeAbs(f)
-  var needDir = f.slice(-1) === '/'
-
-  if (f.length > this.maxLength)
-    return false
-
-  if (!this.stat && ownProp(this.cache, abs)) {
-    var c = this.cache[abs]
-
-    if (Array.isArray(c))
-      c = 'DIR'
-
-    // It exists, but maybe not how we need it
-    if (!needDir || c === 'DIR')
-      return c
-
-    if (needDir && c === 'FILE')
-      return false
-
-    // otherwise we have to stat, because maybe c=true
-    // if we know it exists, but not what it is.
-  }
-
-  var exists
-  var stat = this.statCache[abs]
-  if (!stat) {
-    var lstat
-    try {
-      lstat = fs.lstatSync(abs)
-    } catch (er) {
-      return false
-    }
-
-    if (lstat.isSymbolicLink()) {
-      try {
-        stat = fs.statSync(abs)
-      } catch (er) {
-        stat = lstat
-      }
-    } else {
-      stat = lstat
-    }
-  }
-
-  this.statCache[abs] = stat
-
-  var c = stat.isDirectory() ? 'DIR' : 'FILE'
-  this.cache[abs] = this.cache[abs] || c
-
-  if (needDir && c !== 'DIR')
-    return false
-
-  return c
-}
-
-GlobSync.prototype._mark = function (p) {
-  return common.mark(this, p)
-}
-
-GlobSync.prototype._makeAbs = function (f) {
-  return common.makeAbs(this, f)
-}
diff --git a/node_modules/inflight/LICENSE b/node_modules/inflight/LICENSE
deleted file mode 100644
index 05eeeb8..0000000
--- a/node_modules/inflight/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/inflight/README.md b/node_modules/inflight/README.md
deleted file mode 100644
index 6dc8929..0000000
--- a/node_modules/inflight/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# inflight
-
-Add callbacks to requests in flight to avoid async duplication
-
-## USAGE
-
-```javascript
-var inflight = require('inflight')
-
-// some request that does some stuff
-function req(key, callback) {
-  // key is any random string.  like a url or filename or whatever.
-  //
-  // will return either a falsey value, indicating that the
-  // request for this key is already in flight, or a new callback
-  // which when called will call all callbacks passed to inflightk
-  // with the same key
-  callback = inflight(key, callback)
-
-  // If we got a falsey value back, then there's already a req going
-  if (!callback) return
-
-  // this is where you'd fetch the url or whatever
-  // callback is also once()-ified, so it can safely be assigned
-  // to multiple events etc.  First call wins.
-  setTimeout(function() {
-    callback(null, key)
-  }, 100)
-}
-
-// only assigns a single setTimeout
-// when it dings, all cbs get called
-req('foo', cb1)
-req('foo', cb2)
-req('foo', cb3)
-req('foo', cb4)
-```
diff --git a/node_modules/inflight/inflight.js b/node_modules/inflight/inflight.js
deleted file mode 100644
index 48202b3..0000000
--- a/node_modules/inflight/inflight.js
+++ /dev/null
@@ -1,54 +0,0 @@
-var wrappy = require('wrappy')
-var reqs = Object.create(null)
-var once = require('once')
-
-module.exports = wrappy(inflight)
-
-function inflight (key, cb) {
-  if (reqs[key]) {
-    reqs[key].push(cb)
-    return null
-  } else {
-    reqs[key] = [cb]
-    return makeres(key)
-  }
-}
-
-function makeres (key) {
-  return once(function RES () {
-    var cbs = reqs[key]
-    var len = cbs.length
-    var args = slice(arguments)
-
-    // XXX It's somewhat ambiguous whether a new callback added in this
-    // pass should be queued for later execution if something in the
-    // list of callbacks throws, or if it should just be discarded.
-    // However, it's such an edge case that it hardly matters, and either
-    // choice is likely as surprising as the other.
-    // As it happens, we do go ahead and schedule it for later execution.
-    try {
-      for (var i = 0; i < len; i++) {
-        cbs[i].apply(null, args)
-      }
-    } finally {
-      if (cbs.length > len) {
-        // added more in the interim.
-        // de-zalgo, just in case, but don't call again.
-        cbs.splice(0, len)
-        process.nextTick(function () {
-          RES.apply(null, args)
-        })
-      } else {
-        delete reqs[key]
-      }
-    }
-  })
-}
-
-function slice (args) {
-  var length = args.length
-  var array = []
-
-  for (var i = 0; i < length; i++) array[i] = args[i]
-  return array
-}
diff --git a/node_modules/inflight/package.json b/node_modules/inflight/package.json
deleted file mode 100644
index 5b14383..0000000
--- a/node_modules/inflight/package.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
-  "_args": [
-    [
-      "inflight@1.0.6",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "inflight@1.0.6",
-  "_id": "inflight@1.0.6",
-  "_inBundle": false,
-  "_integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-  "_location": "/inflight",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "inflight@1.0.6",
-    "name": "inflight",
-    "escapedName": "inflight",
-    "rawSpec": "1.0.6",
-    "saveSpec": null,
-    "fetchSpec": "1.0.6"
-  },
-  "_requiredBy": [
-    "/eslint/glob",
-    "/glob",
-    "/globby/glob",
-    "/jasmine/glob",
-    "/rimraf/glob"
-  ],
-  "_resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-  "_spec": "1.0.6",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Isaac Z. Schlueter",
-    "email": "i@izs.me",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/inflight/issues"
-  },
-  "dependencies": {
-    "once": "^1.3.0",
-    "wrappy": "1"
-  },
-  "description": "Add callbacks to requests in flight to avoid async duplication",
-  "devDependencies": {
-    "tap": "^7.1.2"
-  },
-  "files": [
-    "inflight.js"
-  ],
-  "homepage": "https://github.com/isaacs/inflight",
-  "license": "ISC",
-  "main": "inflight.js",
-  "name": "inflight",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/inflight.git"
-  },
-  "scripts": {
-    "test": "tap test.js --100"
-  },
-  "version": "1.0.6"
-}
diff --git a/node_modules/inherits/LICENSE b/node_modules/inherits/LICENSE
deleted file mode 100644
index dea3013..0000000
--- a/node_modules/inherits/LICENSE
+++ /dev/null
@@ -1,16 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
diff --git a/node_modules/inherits/README.md b/node_modules/inherits/README.md
deleted file mode 100644
index b1c5665..0000000
--- a/node_modules/inherits/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-Browser-friendly inheritance fully compatible with standard node.js
-[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).
-
-This package exports standard `inherits` from node.js `util` module in
-node environment, but also provides alternative browser-friendly
-implementation through [browser
-field](https://gist.github.com/shtylman/4339901). Alternative
-implementation is a literal copy of standard one located in standalone
-module to avoid requiring of `util`. It also has a shim for old
-browsers with no `Object.create` support.
-
-While keeping you sure you are using standard `inherits`
-implementation in node.js environment, it allows bundlers such as
-[browserify](https://github.com/substack/node-browserify) to not
-include full `util` package to your client code if all you need is
-just `inherits` function. It worth, because browser shim for `util`
-package is large and `inherits` is often the single function you need
-from it.
-
-It's recommended to use this package instead of
-`require('util').inherits` for any code that has chances to be used
-not only in node.js but in browser too.
-
-## usage
-
-```js
-var inherits = require('inherits');
-// then use exactly as the standard one
-```
-
-## note on version ~1.0
-
-Version ~1.0 had completely different motivation and is not compatible
-neither with 2.0 nor with standard node.js `inherits`.
-
-If you are using version ~1.0 and planning to switch to ~2.0, be
-careful:
-
-* new version uses `super_` instead of `super` for referencing
-  superclass
-* new version overwrites current prototype while old one preserves any
-  existing fields on it
diff --git a/node_modules/inherits/inherits.js b/node_modules/inherits/inherits.js
deleted file mode 100644
index 3b94763..0000000
--- a/node_modules/inherits/inherits.js
+++ /dev/null
@@ -1,7 +0,0 @@
-try {
-  var util = require('util');
-  if (typeof util.inherits !== 'function') throw '';
-  module.exports = util.inherits;
-} catch (e) {
-  module.exports = require('./inherits_browser.js');
-}
diff --git a/node_modules/inherits/inherits_browser.js b/node_modules/inherits/inherits_browser.js
deleted file mode 100644
index c1e78a7..0000000
--- a/node_modules/inherits/inherits_browser.js
+++ /dev/null
@@ -1,23 +0,0 @@
-if (typeof Object.create === 'function') {
-  // implementation from standard node.js 'util' module
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    ctor.prototype = Object.create(superCtor.prototype, {
-      constructor: {
-        value: ctor,
-        enumerable: false,
-        writable: true,
-        configurable: true
-      }
-    });
-  };
-} else {
-  // old school shim for old browsers
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    var TempCtor = function () {}
-    TempCtor.prototype = superCtor.prototype
-    ctor.prototype = new TempCtor()
-    ctor.prototype.constructor = ctor
-  }
-}
diff --git a/node_modules/inherits/package.json b/node_modules/inherits/package.json
deleted file mode 100644
index b0575e5..0000000
--- a/node_modules/inherits/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "_args": [
-    [
-      "inherits@2.0.3",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "inherits@2.0.3",
-  "_id": "inherits@2.0.3",
-  "_inBundle": false,
-  "_integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-  "_location": "/inherits",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "inherits@2.0.3",
-    "name": "inherits",
-    "escapedName": "inherits",
-    "rawSpec": "2.0.3",
-    "saveSpec": null,
-    "fetchSpec": "2.0.3"
-  },
-  "_requiredBy": [
-    "/concat-stream",
-    "/eslint/glob",
-    "/glob",
-    "/globby/glob",
-    "/jasmine/glob",
-    "/readable-stream",
-    "/rimraf/glob"
-  ],
-  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-  "_spec": "2.0.3",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "browser": "./inherits_browser.js",
-  "bugs": {
-    "url": "https://github.com/isaacs/inherits/issues"
-  },
-  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
-  "devDependencies": {
-    "tap": "^7.1.0"
-  },
-  "files": [
-    "inherits.js",
-    "inherits_browser.js"
-  ],
-  "homepage": "https://github.com/isaacs/inherits#readme",
-  "keywords": [
-    "inheritance",
-    "class",
-    "klass",
-    "oop",
-    "object-oriented",
-    "inherits",
-    "browser",
-    "browserify"
-  ],
-  "license": "ISC",
-  "main": "./inherits.js",
-  "name": "inherits",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/inherits.git"
-  },
-  "scripts": {
-    "test": "node test"
-  },
-  "version": "2.0.3"
-}
diff --git a/node_modules/lodash/LICENSE b/node_modules/lodash/LICENSE
deleted file mode 100644
index 9cd87e5..0000000
--- a/node_modules/lodash/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
-Based on Underscore.js, copyright 2009-2015 Jeremy Ashkenas,
-DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/lodash/README.md b/node_modules/lodash/README.md
deleted file mode 100644
index fd98e5c..0000000
--- a/node_modules/lodash/README.md
+++ /dev/null
@@ -1,121 +0,0 @@
-# lodash v3.10.1
-
-The [modern build](https://github.com/lodash/lodash/wiki/Build-Differences) of [lodash](https://lodash.com/) exported as [Node.js](http://nodejs.org/)/[io.js](https://iojs.org/) modules.
-
-Generated using [lodash-cli](https://www.npmjs.com/package/lodash-cli):
-```bash
-$ lodash modularize modern exports=node -o ./
-$ lodash modern -d -o ./index.js
-```
-
-## Installation
-
-Using npm:
-
-```bash
-$ {sudo -H} npm i -g npm
-$ npm i --save lodash
-```
-
-In Node.js/io.js:
-
-```js
-// load the modern build
-var _ = require('lodash');
-// or a method category
-var array = require('lodash/array');
-// or a method (great for smaller builds with browserify/webpack)
-var chunk = require('lodash/array/chunk');
-```
-
-See the [package source](https://github.com/lodash/lodash/tree/3.10.1-npm) for more details.
-
-**Note:**<br>
-Don’t assign values to the [special variable](http://nodejs.org/api/repl.html#repl_repl_features) `_` when in the REPL.<br>
-Install [n_](https://www.npmjs.com/package/n_) for a REPL that includes lodash by default.
-
-## Module formats
-
-lodash is also available in a variety of other builds & module formats.
-
- * npm packages for [modern](https://www.npmjs.com/package/lodash), [compatibility](https://www.npmjs.com/package/lodash-compat), & [per method](https://www.npmjs.com/browse/keyword/lodash-modularized) builds
- * AMD modules for [modern](https://github.com/lodash/lodash/tree/3.10.1-amd) & [compatibility](https://github.com/lodash/lodash-compat/tree/3.10.1-amd) builds
- * ES modules for the [modern](https://github.com/lodash/lodash/tree/3.10.1-es) build
-
-## Further Reading
-
-  * [API Documentation](https://lodash.com/docs)
-  * [Build Differences](https://github.com/lodash/lodash/wiki/Build-Differences)
-  * [Changelog](https://github.com/lodash/lodash/wiki/Changelog)
-  * [Roadmap](https://github.com/lodash/lodash/wiki/Roadmap)
-  * [More Resources](https://github.com/lodash/lodash/wiki/Resources)
-
-## Features
-
- * ~100% [code coverage](https://coveralls.io/r/lodash)
- * Follows [semantic versioning](http://semver.org/) for releases
- * [Lazily evaluated](http://filimanjaro.com/blog/2014/introducing-lazy-evaluation/) chaining
- * [_(…)](https://lodash.com/docs#_) supports implicit chaining
- * [_.ary](https://lodash.com/docs#ary) & [_.rearg](https://lodash.com/docs#rearg) to change function argument limits & order
- * [_.at](https://lodash.com/docs#at) for cherry-picking collection values
- * [_.attempt](https://lodash.com/docs#attempt) to execute functions which may error without a try-catch
- * [_.before](https://lodash.com/docs#before) to complement [_.after](https://lodash.com/docs#after)
- * [_.bindKey](https://lodash.com/docs#bindKey) for binding [*“lazy”*](http://michaux.ca/articles/lazy-function-definition-pattern) defined methods
- * [_.chunk](https://lodash.com/docs#chunk) for splitting an array into chunks of a given size
- * [_.clone](https://lodash.com/docs#clone) supports shallow cloning of `Date` & `RegExp` objects
- * [_.cloneDeep](https://lodash.com/docs#cloneDeep) for deep cloning arrays & objects
- * [_.curry](https://lodash.com/docs#curry) & [_.curryRight](https://lodash.com/docs#curryRight) for creating [curried](http://hughfdjackson.com/javascript/why-curry-helps/) functions
- * [_.debounce](https://lodash.com/docs#debounce) & [_.throttle](https://lodash.com/docs#throttle) are cancelable & accept options for more control
- * [_.defaultsDeep](https://lodash.com/docs#defaultsDeep) for recursively assigning default properties
- * [_.fill](https://lodash.com/docs#fill) to fill arrays with values
- * [_.findKey](https://lodash.com/docs#findKey) for finding keys
- * [_.flow](https://lodash.com/docs#flow) to complement [_.flowRight](https://lodash.com/docs#flowRight) (a.k.a `_.compose`)
- * [_.forEach](https://lodash.com/docs#forEach) supports exiting early
- * [_.forIn](https://lodash.com/docs#forIn) for iterating all enumerable properties
- * [_.forOwn](https://lodash.com/docs#forOwn) for iterating own properties
- * [_.get](https://lodash.com/docs#get) & [_.set](https://lodash.com/docs#set) for deep property getting & setting
- * [_.gt](https://lodash.com/docs#gt), [_.gte](https://lodash.com/docs#gte), [_.lt](https://lodash.com/docs#lt), & [_.lte](https://lodash.com/docs#lte) relational methods
- * [_.inRange](https://lodash.com/docs#inRange) for checking whether a number is within a given range
- * [_.isNative](https://lodash.com/docs#isNative) to check for native functions
- * [_.isPlainObject](https://lodash.com/docs#isPlainObject) & [_.toPlainObject](https://lodash.com/docs#toPlainObject) to check for & convert to `Object` objects
- * [_.isTypedArray](https://lodash.com/docs#isTypedArray) to check for typed arrays
- * [_.mapKeys](https://lodash.com/docs#mapKeys) for mapping keys to an object
- * [_.matches](https://lodash.com/docs#matches) supports deep object comparisons
- * [_.matchesProperty](https://lodash.com/docs#matchesProperty) to complement [_.matches](https://lodash.com/docs#matches) & [_.property](https://lodash.com/docs#property)
- * [_.merge](https://lodash.com/docs#merge) for a deep [_.extend](https://lodash.com/docs#extend)
- * [_.method](https://lodash.com/docs#method) & [_.methodOf](https://lodash.com/docs#methodOf) to create functions that invoke methods
- * [_.modArgs](https://lodash.com/docs#modArgs) for more advanced functional composition
- * [_.parseInt](https://lodash.com/docs#parseInt) for consistent cross-environment behavior
- * [_.pull](https://lodash.com/docs#pull), [_.pullAt](https://lodash.com/docs#pullAt), & [_.remove](https://lodash.com/docs#remove) for mutating arrays
- * [_.random](https://lodash.com/docs#random) supports returning floating-point numbers
- * [_.restParam](https://lodash.com/docs#restParam) & [_.spread](https://lodash.com/docs#spread) for applying rest parameters & spreading arguments to functions
- * [_.runInContext](https://lodash.com/docs#runInContext) for collisionless mixins & easier mocking
- * [_.slice](https://lodash.com/docs#slice) for creating subsets of array-like values
- * [_.sortByAll](https://lodash.com/docs#sortByAll) & [_.sortByOrder](https://lodash.com/docs#sortByOrder) for sorting by multiple properties & orders
- * [_.support](https://lodash.com/docs#support) for flagging environment features
- * [_.template](https://lodash.com/docs#template) supports [*“imports”*](https://lodash.com/docs#templateSettings-imports) options & [ES template delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components)
- * [_.transform](https://lodash.com/docs#transform) as a powerful alternative to [_.reduce](https://lodash.com/docs#reduce) for transforming objects
- * [_.unzipWith](https://lodash.com/docs#unzipWith) & [_.zipWith](https://lodash.com/docs#zipWith) to specify how grouped values should be combined
- * [_.valuesIn](https://lodash.com/docs#valuesIn) for getting values of all enumerable properties
- * [_.xor](https://lodash.com/docs#xor) to complement [_.difference](https://lodash.com/docs#difference), [_.intersection](https://lodash.com/docs#intersection), & [_.union](https://lodash.com/docs#union)
- * [_.add](https://lodash.com/docs#add), [_.round](https://lodash.com/docs#round), [_.sum](https://lodash.com/docs#sum), &
-   [more](https://lodash.com/docs "_.ceil & _.floor") math methods
- * [_.bind](https://lodash.com/docs#bind), [_.curry](https://lodash.com/docs#curry), [_.partial](https://lodash.com/docs#partial), &
-   [more](https://lodash.com/docs "_.bindKey, _.curryRight, _.partialRight") support customizable argument placeholders
- * [_.capitalize](https://lodash.com/docs#capitalize), [_.trim](https://lodash.com/docs#trim), &
-   [more](https://lodash.com/docs "_.camelCase, _.deburr, _.endsWith, _.escapeRegExp, _.kebabCase, _.pad, _.padLeft, _.padRight, _.repeat, _.snakeCase, _.startCase, _.startsWith, _.trimLeft, _.trimRight, _.trunc, _.words") string methods
- * [_.clone](https://lodash.com/docs#clone), [_.isEqual](https://lodash.com/docs#isEqual), &
-   [more](https://lodash.com/docs "_.assign, _.cloneDeep, _.merge") accept customizer callbacks
- * [_.dropWhile](https://lodash.com/docs#dropWhile), [_.takeWhile](https://lodash.com/docs#takeWhile), &
-   [more](https://lodash.com/docs "_.drop, _.dropRight, _.dropRightWhile, _.take, _.takeRight, _.takeRightWhile") to complement [_.first](https://lodash.com/docs#first), [_.initial](https://lodash.com/docs#initial), [_.last](https://lodash.com/docs#last), & [_.rest](https://lodash.com/docs#rest)
- * [_.findLast](https://lodash.com/docs#findLast), [_.findLastKey](https://lodash.com/docs#findLastKey), &
-   [more](https://lodash.com/docs "_.curryRight, _.dropRight, _.dropRightWhile, _.flowRight, _.forEachRight, _.forInRight, _.forOwnRight, _.padRight, partialRight, _.takeRight, _.trimRight, _.takeRightWhile") right-associative methods
- * [_.includes](https://lodash.com/docs#includes), [_.toArray](https://lodash.com/docs#toArray), &
-   [more](https://lodash.com/docs "_.at, _.countBy, _.every, _.filter, _.find, _.findLast, _.findWhere, _.forEach, _.forEachRight, _.groupBy, _.indexBy, _.invoke, _.map, _.max, _.min, _.partition, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.size, _.some, _.sortBy, _.sortByAll, _.sortByOrder, _.sum, _.where") accept strings
- * [_#commit](https://lodash.com/docs#prototype-commit) & [_#plant](https://lodash.com/docs#prototype-plant) for working with chain sequences
- * [_#thru](https://lodash.com/docs#thru) to pass values thru a chain sequence
-
-## Support
-
-Tested in Chrome 43-44, Firefox 38-39, IE 6-11, MS Edge, Safari 5-8, ChakraNode 0.12.2, io.js 2.5.0, Node.js 0.8.28, 0.10.40, & 0.12.7, PhantomJS 1.9.8, RingoJS 0.11, & Rhino 1.7.6.
-Automated [browser](https://saucelabs.com/u/lodash) & [CI](https://travis-ci.org/lodash/lodash/) test runs are available. Special thanks to [Sauce Labs](https://saucelabs.com/) for providing automated browser testing.
diff --git a/node_modules/lodash/array.js b/node_modules/lodash/array.js
deleted file mode 100644
index e5121fa..0000000
--- a/node_modules/lodash/array.js
+++ /dev/null
@@ -1,44 +0,0 @@
-module.exports = {
-  'chunk': require('./array/chunk'),
-  'compact': require('./array/compact'),
-  'difference': require('./array/difference'),
-  'drop': require('./array/drop'),
-  'dropRight': require('./array/dropRight'),
-  'dropRightWhile': require('./array/dropRightWhile'),
-  'dropWhile': require('./array/dropWhile'),
-  'fill': require('./array/fill'),
-  'findIndex': require('./array/findIndex'),
-  'findLastIndex': require('./array/findLastIndex'),
-  'first': require('./array/first'),
-  'flatten': require('./array/flatten'),
-  'flattenDeep': require('./array/flattenDeep'),
-  'head': require('./array/head'),
-  'indexOf': require('./array/indexOf'),
-  'initial': require('./array/initial'),
-  'intersection': require('./array/intersection'),
-  'last': require('./array/last'),
-  'lastIndexOf': require('./array/lastIndexOf'),
-  'object': require('./array/object'),
-  'pull': require('./array/pull'),
-  'pullAt': require('./array/pullAt'),
-  'remove': require('./array/remove'),
-  'rest': require('./array/rest'),
-  'slice': require('./array/slice'),
-  'sortedIndex': require('./array/sortedIndex'),
-  'sortedLastIndex': require('./array/sortedLastIndex'),
-  'tail': require('./array/tail'),
-  'take': require('./array/take'),
-  'takeRight': require('./array/takeRight'),
-  'takeRightWhile': require('./array/takeRightWhile'),
-  'takeWhile': require('./array/takeWhile'),
-  'union': require('./array/union'),
-  'uniq': require('./array/uniq'),
-  'unique': require('./array/unique'),
-  'unzip': require('./array/unzip'),
-  'unzipWith': require('./array/unzipWith'),
-  'without': require('./array/without'),
-  'xor': require('./array/xor'),
-  'zip': require('./array/zip'),
-  'zipObject': require('./array/zipObject'),
-  'zipWith': require('./array/zipWith')
-};
diff --git a/node_modules/lodash/array/chunk.js b/node_modules/lodash/array/chunk.js
deleted file mode 100644
index c8be1fb..0000000
--- a/node_modules/lodash/array/chunk.js
+++ /dev/null
@@ -1,46 +0,0 @@
-var baseSlice = require('../internal/baseSlice'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeCeil = Math.ceil,
-    nativeFloor = Math.floor,
-    nativeMax = Math.max;
-
-/**
- * Creates an array of elements split into groups the length of `size`.
- * If `collection` can't be split evenly, the final chunk will be the remaining
- * elements.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to process.
- * @param {number} [size=1] The length of each chunk.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Array} Returns the new array containing chunks.
- * @example
- *
- * _.chunk(['a', 'b', 'c', 'd'], 2);
- * // => [['a', 'b'], ['c', 'd']]
- *
- * _.chunk(['a', 'b', 'c', 'd'], 3);
- * // => [['a', 'b', 'c'], ['d']]
- */
-function chunk(array, size, guard) {
-  if (guard ? isIterateeCall(array, size, guard) : size == null) {
-    size = 1;
-  } else {
-    size = nativeMax(nativeFloor(size) || 1, 1);
-  }
-  var index = 0,
-      length = array ? array.length : 0,
-      resIndex = -1,
-      result = Array(nativeCeil(length / size));
-
-  while (index < length) {
-    result[++resIndex] = baseSlice(array, index, (index += size));
-  }
-  return result;
-}
-
-module.exports = chunk;
diff --git a/node_modules/lodash/array/compact.js b/node_modules/lodash/array/compact.js
deleted file mode 100644
index 1dc1c55..0000000
--- a/node_modules/lodash/array/compact.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Creates an array with all falsey values removed. The values `false`, `null`,
- * `0`, `""`, `undefined`, and `NaN` are falsey.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to compact.
- * @returns {Array} Returns the new array of filtered values.
- * @example
- *
- * _.compact([0, 1, false, 2, '', 3]);
- * // => [1, 2, 3]
- */
-function compact(array) {
-  var index = -1,
-      length = array ? array.length : 0,
-      resIndex = -1,
-      result = [];
-
-  while (++index < length) {
-    var value = array[index];
-    if (value) {
-      result[++resIndex] = value;
-    }
-  }
-  return result;
-}
-
-module.exports = compact;
diff --git a/node_modules/lodash/array/difference.js b/node_modules/lodash/array/difference.js
deleted file mode 100644
index 128932a..0000000
--- a/node_modules/lodash/array/difference.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var baseDifference = require('../internal/baseDifference'),
-    baseFlatten = require('../internal/baseFlatten'),
-    isArrayLike = require('../internal/isArrayLike'),
-    isObjectLike = require('../internal/isObjectLike'),
-    restParam = require('../function/restParam');
-
-/**
- * Creates an array of unique `array` values not included in the other
- * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
- * for equality comparisons.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to inspect.
- * @param {...Array} [values] The arrays of values to exclude.
- * @returns {Array} Returns the new array of filtered values.
- * @example
- *
- * _.difference([1, 2, 3], [4, 2]);
- * // => [1, 3]
- */
-var difference = restParam(function(array, values) {
-  return (isObjectLike(array) && isArrayLike(array))
-    ? baseDifference(array, baseFlatten(values, false, true))
-    : [];
-});
-
-module.exports = difference;
diff --git a/node_modules/lodash/array/drop.js b/node_modules/lodash/array/drop.js
deleted file mode 100644
index 039a0b5..0000000
--- a/node_modules/lodash/array/drop.js
+++ /dev/null
@@ -1,39 +0,0 @@
-var baseSlice = require('../internal/baseSlice'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Creates a slice of `array` with `n` elements dropped from the beginning.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to query.
- * @param {number} [n=1] The number of elements to drop.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Array} Returns the slice of `array`.
- * @example
- *
- * _.drop([1, 2, 3]);
- * // => [2, 3]
- *
- * _.drop([1, 2, 3], 2);
- * // => [3]
- *
- * _.drop([1, 2, 3], 5);
- * // => []
- *
- * _.drop([1, 2, 3], 0);
- * // => [1, 2, 3]
- */
-function drop(array, n, guard) {
-  var length = array ? array.length : 0;
-  if (!length) {
-    return [];
-  }
-  if (guard ? isIterateeCall(array, n, guard) : n == null) {
-    n = 1;
-  }
-  return baseSlice(array, n < 0 ? 0 : n);
-}
-
-module.exports = drop;
diff --git a/node_modules/lodash/array/dropRight.js b/node_modules/lodash/array/dropRight.js
deleted file mode 100644
index 14b5eb6..0000000
--- a/node_modules/lodash/array/dropRight.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var baseSlice = require('../internal/baseSlice'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Creates a slice of `array` with `n` elements dropped from the end.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to query.
- * @param {number} [n=1] The number of elements to drop.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Array} Returns the slice of `array`.
- * @example
- *
- * _.dropRight([1, 2, 3]);
- * // => [1, 2]
- *
- * _.dropRight([1, 2, 3], 2);
- * // => [1]
- *
- * _.dropRight([1, 2, 3], 5);
- * // => []
- *
- * _.dropRight([1, 2, 3], 0);
- * // => [1, 2, 3]
- */
-function dropRight(array, n, guard) {
-  var length = array ? array.length : 0;
-  if (!length) {
-    return [];
-  }
-  if (guard ? isIterateeCall(array, n, guard) : n == null) {
-    n = 1;
-  }
-  n = length - (+n || 0);
-  return baseSlice(array, 0, n < 0 ? 0 : n);
-}
-
-module.exports = dropRight;
diff --git a/node_modules/lodash/array/dropRightWhile.js b/node_modules/lodash/array/dropRightWhile.js
deleted file mode 100644
index be158bd..0000000
--- a/node_modules/lodash/array/dropRightWhile.js
+++ /dev/null
@@ -1,59 +0,0 @@
-var baseCallback = require('../internal/baseCallback'),
-    baseWhile = require('../internal/baseWhile');
-
-/**
- * Creates a slice of `array` excluding elements dropped from the end.
- * Elements are dropped until `predicate` returns falsey. The predicate is
- * bound to `thisArg` and invoked with three arguments: (value, index, array).
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that match the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to query.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {Array} Returns the slice of `array`.
- * @example
- *
- * _.dropRightWhile([1, 2, 3], function(n) {
- *   return n > 1;
- * });
- * // => [1]
- *
- * var users = [
- *   { 'user': 'barney',  'active': true },
- *   { 'user': 'fred',    'active': false },
- *   { 'user': 'pebbles', 'active': false }
- * ];
- *
- * // using the `_.matches` callback shorthand
- * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');
- * // => ['barney', 'fred']
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.pluck(_.dropRightWhile(users, 'active', false), 'user');
- * // => ['barney']
- *
- * // using the `_.property` callback shorthand
- * _.pluck(_.dropRightWhile(users, 'active'), 'user');
- * // => ['barney', 'fred', 'pebbles']
- */
-function dropRightWhile(array, predicate, thisArg) {
-  return (array && array.length)
-    ? baseWhile(array, baseCallback(predicate, thisArg, 3), true, true)
-    : [];
-}
-
-module.exports = dropRightWhile;
diff --git a/node_modules/lodash/array/dropWhile.js b/node_modules/lodash/array/dropWhile.js
deleted file mode 100644
index d9eabae..0000000
--- a/node_modules/lodash/array/dropWhile.js
+++ /dev/null
@@ -1,59 +0,0 @@
-var baseCallback = require('../internal/baseCallback'),
-    baseWhile = require('../internal/baseWhile');
-
-/**
- * Creates a slice of `array` excluding elements dropped from the beginning.
- * Elements are dropped until `predicate` returns falsey. The predicate is
- * bound to `thisArg` and invoked with three arguments: (value, index, array).
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to query.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {Array} Returns the slice of `array`.
- * @example
- *
- * _.dropWhile([1, 2, 3], function(n) {
- *   return n < 3;
- * });
- * // => [3]
- *
- * var users = [
- *   { 'user': 'barney',  'active': false },
- *   { 'user': 'fred',    'active': false },
- *   { 'user': 'pebbles', 'active': true }
- * ];
- *
- * // using the `_.matches` callback shorthand
- * _.pluck(_.dropWhile(users, { 'user': 'barney', 'active': false }), 'user');
- * // => ['fred', 'pebbles']
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.pluck(_.dropWhile(users, 'active', false), 'user');
- * // => ['pebbles']
- *
- * // using the `_.property` callback shorthand
- * _.pluck(_.dropWhile(users, 'active'), 'user');
- * // => ['barney', 'fred', 'pebbles']
- */
-function dropWhile(array, predicate, thisArg) {
-  return (array && array.length)
-    ? baseWhile(array, baseCallback(predicate, thisArg, 3), true)
-    : [];
-}
-
-module.exports = dropWhile;
diff --git a/node_modules/lodash/array/fill.js b/node_modules/lodash/array/fill.js
deleted file mode 100644
index 2c8f6da..0000000
--- a/node_modules/lodash/array/fill.js
+++ /dev/null
@@ -1,44 +0,0 @@
-var baseFill = require('../internal/baseFill'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Fills elements of `array` with `value` from `start` up to, but not
- * including, `end`.
- *
- * **Note:** This method mutates `array`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to fill.
- * @param {*} value The value to fill `array` with.
- * @param {number} [start=0] The start position.
- * @param {number} [end=array.length] The end position.
- * @returns {Array} Returns `array`.
- * @example
- *
- * var array = [1, 2, 3];
- *
- * _.fill(array, 'a');
- * console.log(array);
- * // => ['a', 'a', 'a']
- *
- * _.fill(Array(3), 2);
- * // => [2, 2, 2]
- *
- * _.fill([4, 6, 8], '*', 1, 2);
- * // => [4, '*', 8]
- */
-function fill(array, value, start, end) {
-  var length = array ? array.length : 0;
-  if (!length) {
-    return [];
-  }
-  if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
-    start = 0;
-    end = length;
-  }
-  return baseFill(array, value, start, end);
-}
-
-module.exports = fill;
diff --git a/node_modules/lodash/array/findIndex.js b/node_modules/lodash/array/findIndex.js
deleted file mode 100644
index 2a6b8e1..0000000
--- a/node_modules/lodash/array/findIndex.js
+++ /dev/null
@@ -1,53 +0,0 @@
-var createFindIndex = require('../internal/createFindIndex');
-
-/**
- * This method is like `_.find` except that it returns the index of the first
- * element `predicate` returns truthy for instead of the element itself.
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to search.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {number} Returns the index of the found element, else `-1`.
- * @example
- *
- * var users = [
- *   { 'user': 'barney',  'active': false },
- *   { 'user': 'fred',    'active': false },
- *   { 'user': 'pebbles', 'active': true }
- * ];
- *
- * _.findIndex(users, function(chr) {
- *   return chr.user == 'barney';
- * });
- * // => 0
- *
- * // using the `_.matches` callback shorthand
- * _.findIndex(users, { 'user': 'fred', 'active': false });
- * // => 1
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.findIndex(users, 'active', false);
- * // => 0
- *
- * // using the `_.property` callback shorthand
- * _.findIndex(users, 'active');
- * // => 2
- */
-var findIndex = createFindIndex();
-
-module.exports = findIndex;
diff --git a/node_modules/lodash/array/findLastIndex.js b/node_modules/lodash/array/findLastIndex.js
deleted file mode 100644
index d6d8eca..0000000
--- a/node_modules/lodash/array/findLastIndex.js
+++ /dev/null
@@ -1,53 +0,0 @@
-var createFindIndex = require('../internal/createFindIndex');
-
-/**
- * This method is like `_.findIndex` except that it iterates over elements
- * of `collection` from right to left.
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to search.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {number} Returns the index of the found element, else `-1`.
- * @example
- *
- * var users = [
- *   { 'user': 'barney',  'active': true },
- *   { 'user': 'fred',    'active': false },
- *   { 'user': 'pebbles', 'active': false }
- * ];
- *
- * _.findLastIndex(users, function(chr) {
- *   return chr.user == 'pebbles';
- * });
- * // => 2
- *
- * // using the `_.matches` callback shorthand
- * _.findLastIndex(users, { 'user': 'barney', 'active': true });
- * // => 0
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.findLastIndex(users, 'active', false);
- * // => 2
- *
- * // using the `_.property` callback shorthand
- * _.findLastIndex(users, 'active');
- * // => 0
- */
-var findLastIndex = createFindIndex(true);
-
-module.exports = findLastIndex;
diff --git a/node_modules/lodash/array/first.js b/node_modules/lodash/array/first.js
deleted file mode 100644
index b3b9c79..0000000
--- a/node_modules/lodash/array/first.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Gets the first element of `array`.
- *
- * @static
- * @memberOf _
- * @alias head
- * @category Array
- * @param {Array} array The array to query.
- * @returns {*} Returns the first element of `array`.
- * @example
- *
- * _.first([1, 2, 3]);
- * // => 1
- *
- * _.first([]);
- * // => undefined
- */
-function first(array) {
-  return array ? array[0] : undefined;
-}
-
-module.exports = first;
diff --git a/node_modules/lodash/array/flatten.js b/node_modules/lodash/array/flatten.js
deleted file mode 100644
index dc2eff8..0000000
--- a/node_modules/lodash/array/flatten.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var baseFlatten = require('../internal/baseFlatten'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Flattens a nested array. If `isDeep` is `true` the array is recursively
- * flattened, otherwise it's only flattened a single level.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to flatten.
- * @param {boolean} [isDeep] Specify a deep flatten.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Array} Returns the new flattened array.
- * @example
- *
- * _.flatten([1, [2, 3, [4]]]);
- * // => [1, 2, 3, [4]]
- *
- * // using `isDeep`
- * _.flatten([1, [2, 3, [4]]], true);
- * // => [1, 2, 3, 4]
- */
-function flatten(array, isDeep, guard) {
-  var length = array ? array.length : 0;
-  if (guard && isIterateeCall(array, isDeep, guard)) {
-    isDeep = false;
-  }
-  return length ? baseFlatten(array, isDeep) : [];
-}
-
-module.exports = flatten;
diff --git a/node_modules/lodash/array/flattenDeep.js b/node_modules/lodash/array/flattenDeep.js
deleted file mode 100644
index 9f775fe..0000000
--- a/node_modules/lodash/array/flattenDeep.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var baseFlatten = require('../internal/baseFlatten');
-
-/**
- * Recursively flattens a nested array.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to recursively flatten.
- * @returns {Array} Returns the new flattened array.
- * @example
- *
- * _.flattenDeep([1, [2, 3, [4]]]);
- * // => [1, 2, 3, 4]
- */
-function flattenDeep(array) {
-  var length = array ? array.length : 0;
-  return length ? baseFlatten(array, true) : [];
-}
-
-module.exports = flattenDeep;
diff --git a/node_modules/lodash/array/head.js b/node_modules/lodash/array/head.js
deleted file mode 100644
index 1961b08..0000000
--- a/node_modules/lodash/array/head.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./first');
diff --git a/node_modules/lodash/array/indexOf.js b/node_modules/lodash/array/indexOf.js
deleted file mode 100644
index 4cfc682..0000000
--- a/node_modules/lodash/array/indexOf.js
+++ /dev/null
@@ -1,53 +0,0 @@
-var baseIndexOf = require('../internal/baseIndexOf'),
-    binaryIndex = require('../internal/binaryIndex');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
-
-/**
- * Gets the index at which the first occurrence of `value` is found in `array`
- * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
- * for equality comparisons. If `fromIndex` is negative, it's used as the offset
- * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`
- * performs a faster binary search.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to search.
- * @param {*} value The value to search for.
- * @param {boolean|number} [fromIndex=0] The index to search from or `true`
- *  to perform a binary search on a sorted array.
- * @returns {number} Returns the index of the matched value, else `-1`.
- * @example
- *
- * _.indexOf([1, 2, 1, 2], 2);
- * // => 1
- *
- * // using `fromIndex`
- * _.indexOf([1, 2, 1, 2], 2, 2);
- * // => 3
- *
- * // performing a binary search
- * _.indexOf([1, 1, 2, 2], 2, true);
- * // => 2
- */
-function indexOf(array, value, fromIndex) {
-  var length = array ? array.length : 0;
-  if (!length) {
-    return -1;
-  }
-  if (typeof fromIndex == 'number') {
-    fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
-  } else if (fromIndex) {
-    var index = binaryIndex(array, value);
-    if (index < length &&
-        (value === value ? (value === array[index]) : (array[index] !== array[index]))) {
-      return index;
-    }
-    return -1;
-  }
-  return baseIndexOf(array, value, fromIndex || 0);
-}
-
-module.exports = indexOf;
diff --git a/node_modules/lodash/array/initial.js b/node_modules/lodash/array/initial.js
deleted file mode 100644
index 59b7a7d..0000000
--- a/node_modules/lodash/array/initial.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var dropRight = require('./dropRight');
-
-/**
- * Gets all but the last element of `array`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to query.
- * @returns {Array} Returns the slice of `array`.
- * @example
- *
- * _.initial([1, 2, 3]);
- * // => [1, 2]
- */
-function initial(array) {
-  return dropRight(array, 1);
-}
-
-module.exports = initial;
diff --git a/node_modules/lodash/array/intersection.js b/node_modules/lodash/array/intersection.js
deleted file mode 100644
index f218432..0000000
--- a/node_modules/lodash/array/intersection.js
+++ /dev/null
@@ -1,58 +0,0 @@
-var baseIndexOf = require('../internal/baseIndexOf'),
-    cacheIndexOf = require('../internal/cacheIndexOf'),
-    createCache = require('../internal/createCache'),
-    isArrayLike = require('../internal/isArrayLike'),
-    restParam = require('../function/restParam');
-
-/**
- * Creates an array of unique values that are included in all of the provided
- * arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
- * for equality comparisons.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {...Array} [arrays] The arrays to inspect.
- * @returns {Array} Returns the new array of shared values.
- * @example
- * _.intersection([1, 2], [4, 2], [2, 1]);
- * // => [2]
- */
-var intersection = restParam(function(arrays) {
-  var othLength = arrays.length,
-      othIndex = othLength,
-      caches = Array(length),
-      indexOf = baseIndexOf,
-      isCommon = true,
-      result = [];
-
-  while (othIndex--) {
-    var value = arrays[othIndex] = isArrayLike(value = arrays[othIndex]) ? value : [];
-    caches[othIndex] = (isCommon && value.length >= 120) ? createCache(othIndex && value) : null;
-  }
-  var array = arrays[0],
-      index = -1,
-      length = array ? array.length : 0,
-      seen = caches[0];
-
-  outer:
-  while (++index < length) {
-    value = array[index];
-    if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {
-      var othIndex = othLength;
-      while (--othIndex) {
-        var cache = caches[othIndex];
-        if ((cache ? cacheIndexOf(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) {
-          continue outer;
-        }
-      }
-      if (seen) {
-        seen.push(value);
-      }
-      result.push(value);
-    }
-  }
-  return result;
-});
-
-module.exports = intersection;
diff --git a/node_modules/lodash/array/last.js b/node_modules/lodash/array/last.js
deleted file mode 100644
index 299af31..0000000
--- a/node_modules/lodash/array/last.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Gets the last element of `array`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to query.
- * @returns {*} Returns the last element of `array`.
- * @example
- *
- * _.last([1, 2, 3]);
- * // => 3
- */
-function last(array) {
-  var length = array ? array.length : 0;
-  return length ? array[length - 1] : undefined;
-}
-
-module.exports = last;
diff --git a/node_modules/lodash/array/lastIndexOf.js b/node_modules/lodash/array/lastIndexOf.js
deleted file mode 100644
index 02b8062..0000000
--- a/node_modules/lodash/array/lastIndexOf.js
+++ /dev/null
@@ -1,60 +0,0 @@
-var binaryIndex = require('../internal/binaryIndex'),
-    indexOfNaN = require('../internal/indexOfNaN');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max,
-    nativeMin = Math.min;
-
-/**
- * This method is like `_.indexOf` except that it iterates over elements of
- * `array` from right to left.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to search.
- * @param {*} value The value to search for.
- * @param {boolean|number} [fromIndex=array.length-1] The index to search from
- *  or `true` to perform a binary search on a sorted array.
- * @returns {number} Returns the index of the matched value, else `-1`.
- * @example
- *
- * _.lastIndexOf([1, 2, 1, 2], 2);
- * // => 3
- *
- * // using `fromIndex`
- * _.lastIndexOf([1, 2, 1, 2], 2, 2);
- * // => 1
- *
- * // performing a binary search
- * _.lastIndexOf([1, 1, 2, 2], 2, true);
- * // => 3
- */
-function lastIndexOf(array, value, fromIndex) {
-  var length = array ? array.length : 0;
-  if (!length) {
-    return -1;
-  }
-  var index = length;
-  if (typeof fromIndex == 'number') {
-    index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1;
-  } else if (fromIndex) {
-    index = binaryIndex(array, value, true) - 1;
-    var other = array[index];
-    if (value === value ? (value === other) : (other !== other)) {
-      return index;
-    }
-    return -1;
-  }
-  if (value !== value) {
-    return indexOfNaN(array, index, true);
-  }
-  while (index--) {
-    if (array[index] === value) {
-      return index;
-    }
-  }
-  return -1;
-}
-
-module.exports = lastIndexOf;
diff --git a/node_modules/lodash/array/object.js b/node_modules/lodash/array/object.js
deleted file mode 100644
index f4a3453..0000000
--- a/node_modules/lodash/array/object.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./zipObject');
diff --git a/node_modules/lodash/array/pull.js b/node_modules/lodash/array/pull.js
deleted file mode 100644
index 7bcbb4a..0000000
--- a/node_modules/lodash/array/pull.js
+++ /dev/null
@@ -1,52 +0,0 @@
-var baseIndexOf = require('../internal/baseIndexOf');
-
-/** Used for native method references. */
-var arrayProto = Array.prototype;
-
-/** Native method references. */
-var splice = arrayProto.splice;
-
-/**
- * Removes all provided values from `array` using
- * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
- * for equality comparisons.
- *
- * **Note:** Unlike `_.without`, this method mutates `array`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to modify.
- * @param {...*} [values] The values to remove.
- * @returns {Array} Returns `array`.
- * @example
- *
- * var array = [1, 2, 3, 1, 2, 3];
- *
- * _.pull(array, 2, 3);
- * console.log(array);
- * // => [1, 1]
- */
-function pull() {
-  var args = arguments,
-      array = args[0];
-
-  if (!(array && array.length)) {
-    return array;
-  }
-  var index = 0,
-      indexOf = baseIndexOf,
-      length = args.length;
-
-  while (++index < length) {
-    var fromIndex = 0,
-        value = args[index];
-
-    while ((fromIndex = indexOf(array, value, fromIndex)) > -1) {
-      splice.call(array, fromIndex, 1);
-    }
-  }
-  return array;
-}
-
-module.exports = pull;
diff --git a/node_modules/lodash/array/pullAt.js b/node_modules/lodash/array/pullAt.js
deleted file mode 100644
index 4ca2476..0000000
--- a/node_modules/lodash/array/pullAt.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var baseAt = require('../internal/baseAt'),
-    baseCompareAscending = require('../internal/baseCompareAscending'),
-    baseFlatten = require('../internal/baseFlatten'),
-    basePullAt = require('../internal/basePullAt'),
-    restParam = require('../function/restParam');
-
-/**
- * Removes elements from `array` corresponding to the given indexes and returns
- * an array of the removed elements. Indexes may be specified as an array of
- * indexes or as individual arguments.
- *
- * **Note:** Unlike `_.at`, this method mutates `array`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to modify.
- * @param {...(number|number[])} [indexes] The indexes of elements to remove,
- *  specified as individual indexes or arrays of indexes.
- * @returns {Array} Returns the new array of removed elements.
- * @example
- *
- * var array = [5, 10, 15, 20];
- * var evens = _.pullAt(array, 1, 3);
- *
- * console.log(array);
- * // => [5, 15]
- *
- * console.log(evens);
- * // => [10, 20]
- */
-var pullAt = restParam(function(array, indexes) {
-  indexes = baseFlatten(indexes);
-
-  var result = baseAt(array, indexes);
-  basePullAt(array, indexes.sort(baseCompareAscending));
-  return result;
-});
-
-module.exports = pullAt;
diff --git a/node_modules/lodash/array/remove.js b/node_modules/lodash/array/remove.js
deleted file mode 100644
index 0cf979b..0000000
--- a/node_modules/lodash/array/remove.js
+++ /dev/null
@@ -1,64 +0,0 @@
-var baseCallback = require('../internal/baseCallback'),
-    basePullAt = require('../internal/basePullAt');
-
-/**
- * Removes all elements from `array` that `predicate` returns truthy for
- * and returns an array of the removed elements. The predicate is bound to
- * `thisArg` and invoked with three arguments: (value, index, array).
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * **Note:** Unlike `_.filter`, this method mutates `array`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to modify.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {Array} Returns the new array of removed elements.
- * @example
- *
- * var array = [1, 2, 3, 4];
- * var evens = _.remove(array, function(n) {
- *   return n % 2 == 0;
- * });
- *
- * console.log(array);
- * // => [1, 3]
- *
- * console.log(evens);
- * // => [2, 4]
- */
-function remove(array, predicate, thisArg) {
-  var result = [];
-  if (!(array && array.length)) {
-    return result;
-  }
-  var index = -1,
-      indexes = [],
-      length = array.length;
-
-  predicate = baseCallback(predicate, thisArg, 3);
-  while (++index < length) {
-    var value = array[index];
-    if (predicate(value, index, array)) {
-      result.push(value);
-      indexes.push(index);
-    }
-  }
-  basePullAt(array, indexes);
-  return result;
-}
-
-module.exports = remove;
diff --git a/node_modules/lodash/array/rest.js b/node_modules/lodash/array/rest.js
deleted file mode 100644
index 9bfb734..0000000
--- a/node_modules/lodash/array/rest.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var drop = require('./drop');
-
-/**
- * Gets all but the first element of `array`.
- *
- * @static
- * @memberOf _
- * @alias tail
- * @category Array
- * @param {Array} array The array to query.
- * @returns {Array} Returns the slice of `array`.
- * @example
- *
- * _.rest([1, 2, 3]);
- * // => [2, 3]
- */
-function rest(array) {
-  return drop(array, 1);
-}
-
-module.exports = rest;
diff --git a/node_modules/lodash/array/slice.js b/node_modules/lodash/array/slice.js
deleted file mode 100644
index 48ef1a1..0000000
--- a/node_modules/lodash/array/slice.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var baseSlice = require('../internal/baseSlice'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Creates a slice of `array` from `start` up to, but not including, `end`.
- *
- * **Note:** This method is used instead of `Array#slice` to support node
- * lists in IE < 9 and to ensure dense arrays are returned.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to slice.
- * @param {number} [start=0] The start position.
- * @param {number} [end=array.length] The end position.
- * @returns {Array} Returns the slice of `array`.
- */
-function slice(array, start, end) {
-  var length = array ? array.length : 0;
-  if (!length) {
-    return [];
-  }
-  if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
-    start = 0;
-    end = length;
-  }
-  return baseSlice(array, start, end);
-}
-
-module.exports = slice;
diff --git a/node_modules/lodash/array/sortedIndex.js b/node_modules/lodash/array/sortedIndex.js
deleted file mode 100644
index 6903bca..0000000
--- a/node_modules/lodash/array/sortedIndex.js
+++ /dev/null
@@ -1,53 +0,0 @@
-var createSortedIndex = require('../internal/createSortedIndex');
-
-/**
- * Uses a binary search to determine the lowest index at which `value` should
- * be inserted into `array` in order to maintain its sort order. If an iteratee
- * function is provided it's invoked for `value` and each element of `array`
- * to compute their sort ranking. The iteratee is bound to `thisArg` and
- * invoked with one argument; (value).
- *
- * If a property name is provided for `iteratee` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `iteratee` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The sorted array to inspect.
- * @param {*} value The value to evaluate.
- * @param {Function|Object|string} [iteratee=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {number} Returns the index at which `value` should be inserted
- *  into `array`.
- * @example
- *
- * _.sortedIndex([30, 50], 40);
- * // => 1
- *
- * _.sortedIndex([4, 4, 5, 5], 5);
- * // => 2
- *
- * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } };
- *
- * // using an iteratee function
- * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) {
- *   return this.data[word];
- * }, dict);
- * // => 1
- *
- * // using the `_.property` callback shorthand
- * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
- * // => 1
- */
-var sortedIndex = createSortedIndex();
-
-module.exports = sortedIndex;
diff --git a/node_modules/lodash/array/sortedLastIndex.js b/node_modules/lodash/array/sortedLastIndex.js
deleted file mode 100644
index 81a4a86..0000000
--- a/node_modules/lodash/array/sortedLastIndex.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var createSortedIndex = require('../internal/createSortedIndex');
-
-/**
- * This method is like `_.sortedIndex` except that it returns the highest
- * index at which `value` should be inserted into `array` in order to
- * maintain its sort order.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The sorted array to inspect.
- * @param {*} value The value to evaluate.
- * @param {Function|Object|string} [iteratee=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {number} Returns the index at which `value` should be inserted
- *  into `array`.
- * @example
- *
- * _.sortedLastIndex([4, 4, 5, 5], 5);
- * // => 4
- */
-var sortedLastIndex = createSortedIndex(true);
-
-module.exports = sortedLastIndex;
diff --git a/node_modules/lodash/array/tail.js b/node_modules/lodash/array/tail.js
deleted file mode 100644
index c5dfe77..0000000
--- a/node_modules/lodash/array/tail.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./rest');
diff --git a/node_modules/lodash/array/take.js b/node_modules/lodash/array/take.js
deleted file mode 100644
index 875917a..0000000
--- a/node_modules/lodash/array/take.js
+++ /dev/null
@@ -1,39 +0,0 @@
-var baseSlice = require('../internal/baseSlice'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Creates a slice of `array` with `n` elements taken from the beginning.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to query.
- * @param {number} [n=1] The number of elements to take.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Array} Returns the slice of `array`.
- * @example
- *
- * _.take([1, 2, 3]);
- * // => [1]
- *
- * _.take([1, 2, 3], 2);
- * // => [1, 2]
- *
- * _.take([1, 2, 3], 5);
- * // => [1, 2, 3]
- *
- * _.take([1, 2, 3], 0);
- * // => []
- */
-function take(array, n, guard) {
-  var length = array ? array.length : 0;
-  if (!length) {
-    return [];
-  }
-  if (guard ? isIterateeCall(array, n, guard) : n == null) {
-    n = 1;
-  }
-  return baseSlice(array, 0, n < 0 ? 0 : n);
-}
-
-module.exports = take;
diff --git a/node_modules/lodash/array/takeRight.js b/node_modules/lodash/array/takeRight.js
deleted file mode 100644
index 6e89c87..0000000
--- a/node_modules/lodash/array/takeRight.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var baseSlice = require('../internal/baseSlice'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Creates a slice of `array` with `n` elements taken from the end.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to query.
- * @param {number} [n=1] The number of elements to take.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Array} Returns the slice of `array`.
- * @example
- *
- * _.takeRight([1, 2, 3]);
- * // => [3]
- *
- * _.takeRight([1, 2, 3], 2);
- * // => [2, 3]
- *
- * _.takeRight([1, 2, 3], 5);
- * // => [1, 2, 3]
- *
- * _.takeRight([1, 2, 3], 0);
- * // => []
- */
-function takeRight(array, n, guard) {
-  var length = array ? array.length : 0;
-  if (!length) {
-    return [];
-  }
-  if (guard ? isIterateeCall(array, n, guard) : n == null) {
-    n = 1;
-  }
-  n = length - (+n || 0);
-  return baseSlice(array, n < 0 ? 0 : n);
-}
-
-module.exports = takeRight;
diff --git a/node_modules/lodash/array/takeRightWhile.js b/node_modules/lodash/array/takeRightWhile.js
deleted file mode 100644
index 5464d13..0000000
--- a/node_modules/lodash/array/takeRightWhile.js
+++ /dev/null
@@ -1,59 +0,0 @@
-var baseCallback = require('../internal/baseCallback'),
-    baseWhile = require('../internal/baseWhile');
-
-/**
- * Creates a slice of `array` with elements taken from the end. Elements are
- * taken until `predicate` returns falsey. The predicate is bound to `thisArg`
- * and invoked with three arguments: (value, index, array).
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to query.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {Array} Returns the slice of `array`.
- * @example
- *
- * _.takeRightWhile([1, 2, 3], function(n) {
- *   return n > 1;
- * });
- * // => [2, 3]
- *
- * var users = [
- *   { 'user': 'barney',  'active': true },
- *   { 'user': 'fred',    'active': false },
- *   { 'user': 'pebbles', 'active': false }
- * ];
- *
- * // using the `_.matches` callback shorthand
- * _.pluck(_.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');
- * // => ['pebbles']
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.pluck(_.takeRightWhile(users, 'active', false), 'user');
- * // => ['fred', 'pebbles']
- *
- * // using the `_.property` callback shorthand
- * _.pluck(_.takeRightWhile(users, 'active'), 'user');
- * // => []
- */
-function takeRightWhile(array, predicate, thisArg) {
-  return (array && array.length)
-    ? baseWhile(array, baseCallback(predicate, thisArg, 3), false, true)
-    : [];
-}
-
-module.exports = takeRightWhile;
diff --git a/node_modules/lodash/array/takeWhile.js b/node_modules/lodash/array/takeWhile.js
deleted file mode 100644
index f7e28a1..0000000
--- a/node_modules/lodash/array/takeWhile.js
+++ /dev/null
@@ -1,59 +0,0 @@
-var baseCallback = require('../internal/baseCallback'),
-    baseWhile = require('../internal/baseWhile');
-
-/**
- * Creates a slice of `array` with elements taken from the beginning. Elements
- * are taken until `predicate` returns falsey. The predicate is bound to
- * `thisArg` and invoked with three arguments: (value, index, array).
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to query.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {Array} Returns the slice of `array`.
- * @example
- *
- * _.takeWhile([1, 2, 3], function(n) {
- *   return n < 3;
- * });
- * // => [1, 2]
- *
- * var users = [
- *   { 'user': 'barney',  'active': false },
- *   { 'user': 'fred',    'active': false},
- *   { 'user': 'pebbles', 'active': true }
- * ];
- *
- * // using the `_.matches` callback shorthand
- * _.pluck(_.takeWhile(users, { 'user': 'barney', 'active': false }), 'user');
- * // => ['barney']
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.pluck(_.takeWhile(users, 'active', false), 'user');
- * // => ['barney', 'fred']
- *
- * // using the `_.property` callback shorthand
- * _.pluck(_.takeWhile(users, 'active'), 'user');
- * // => []
- */
-function takeWhile(array, predicate, thisArg) {
-  return (array && array.length)
-    ? baseWhile(array, baseCallback(predicate, thisArg, 3))
-    : [];
-}
-
-module.exports = takeWhile;
diff --git a/node_modules/lodash/array/union.js b/node_modules/lodash/array/union.js
deleted file mode 100644
index 53cefe4..0000000
--- a/node_modules/lodash/array/union.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var baseFlatten = require('../internal/baseFlatten'),
-    baseUniq = require('../internal/baseUniq'),
-    restParam = require('../function/restParam');
-
-/**
- * Creates an array of unique values, in order, from all of the provided arrays
- * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
- * for equality comparisons.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {...Array} [arrays] The arrays to inspect.
- * @returns {Array} Returns the new array of combined values.
- * @example
- *
- * _.union([1, 2], [4, 2], [2, 1]);
- * // => [1, 2, 4]
- */
-var union = restParam(function(arrays) {
-  return baseUniq(baseFlatten(arrays, false, true));
-});
-
-module.exports = union;
diff --git a/node_modules/lodash/array/uniq.js b/node_modules/lodash/array/uniq.js
deleted file mode 100644
index ae937ef..0000000
--- a/node_modules/lodash/array/uniq.js
+++ /dev/null
@@ -1,71 +0,0 @@
-var baseCallback = require('../internal/baseCallback'),
-    baseUniq = require('../internal/baseUniq'),
-    isIterateeCall = require('../internal/isIterateeCall'),
-    sortedUniq = require('../internal/sortedUniq');
-
-/**
- * Creates a duplicate-free version of an array, using
- * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
- * for equality comparisons, in which only the first occurence of each element
- * is kept. Providing `true` for `isSorted` performs a faster search algorithm
- * for sorted arrays. If an iteratee function is provided it's invoked for
- * each element in the array to generate the criterion by which uniqueness
- * is computed. The `iteratee` is bound to `thisArg` and invoked with three
- * arguments: (value, index, array).
- *
- * If a property name is provided for `iteratee` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `iteratee` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @alias unique
- * @category Array
- * @param {Array} array The array to inspect.
- * @param {boolean} [isSorted] Specify the array is sorted.
- * @param {Function|Object|string} [iteratee] The function invoked per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Array} Returns the new duplicate-value-free array.
- * @example
- *
- * _.uniq([2, 1, 2]);
- * // => [2, 1]
- *
- * // using `isSorted`
- * _.uniq([1, 1, 2], true);
- * // => [1, 2]
- *
- * // using an iteratee function
- * _.uniq([1, 2.5, 1.5, 2], function(n) {
- *   return this.floor(n);
- * }, Math);
- * // => [1, 2.5]
- *
- * // using the `_.property` callback shorthand
- * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
- * // => [{ 'x': 1 }, { 'x': 2 }]
- */
-function uniq(array, isSorted, iteratee, thisArg) {
-  var length = array ? array.length : 0;
-  if (!length) {
-    return [];
-  }
-  if (isSorted != null && typeof isSorted != 'boolean') {
-    thisArg = iteratee;
-    iteratee = isIterateeCall(array, isSorted, thisArg) ? undefined : isSorted;
-    isSorted = false;
-  }
-  iteratee = iteratee == null ? iteratee : baseCallback(iteratee, thisArg, 3);
-  return (isSorted)
-    ? sortedUniq(array, iteratee)
-    : baseUniq(array, iteratee);
-}
-
-module.exports = uniq;
diff --git a/node_modules/lodash/array/unique.js b/node_modules/lodash/array/unique.js
deleted file mode 100644
index 396de1b..0000000
--- a/node_modules/lodash/array/unique.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./uniq');
diff --git a/node_modules/lodash/array/unzip.js b/node_modules/lodash/array/unzip.js
deleted file mode 100644
index 0a539fa..0000000
--- a/node_modules/lodash/array/unzip.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var arrayFilter = require('../internal/arrayFilter'),
-    arrayMap = require('../internal/arrayMap'),
-    baseProperty = require('../internal/baseProperty'),
-    isArrayLike = require('../internal/isArrayLike');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
-
-/**
- * This method is like `_.zip` except that it accepts an array of grouped
- * elements and creates an array regrouping the elements to their pre-zip
- * configuration.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array of grouped elements to process.
- * @returns {Array} Returns the new array of regrouped elements.
- * @example
- *
- * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);
- * // => [['fred', 30, true], ['barney', 40, false]]
- *
- * _.unzip(zipped);
- * // => [['fred', 'barney'], [30, 40], [true, false]]
- */
-function unzip(array) {
-  if (!(array && array.length)) {
-    return [];
-  }
-  var index = -1,
-      length = 0;
-
-  array = arrayFilter(array, function(group) {
-    if (isArrayLike(group)) {
-      length = nativeMax(group.length, length);
-      return true;
-    }
-  });
-  var result = Array(length);
-  while (++index < length) {
-    result[index] = arrayMap(array, baseProperty(index));
-  }
-  return result;
-}
-
-module.exports = unzip;
diff --git a/node_modules/lodash/array/unzipWith.js b/node_modules/lodash/array/unzipWith.js
deleted file mode 100644
index 324a2b1..0000000
--- a/node_modules/lodash/array/unzipWith.js
+++ /dev/null
@@ -1,41 +0,0 @@
-var arrayMap = require('../internal/arrayMap'),
-    arrayReduce = require('../internal/arrayReduce'),
-    bindCallback = require('../internal/bindCallback'),
-    unzip = require('./unzip');
-
-/**
- * This method is like `_.unzip` except that it accepts an iteratee to specify
- * how regrouped values should be combined. The `iteratee` is bound to `thisArg`
- * and invoked with four arguments: (accumulator, value, index, group).
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array of grouped elements to process.
- * @param {Function} [iteratee] The function to combine regrouped values.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Array} Returns the new array of regrouped elements.
- * @example
- *
- * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
- * // => [[1, 10, 100], [2, 20, 200]]
- *
- * _.unzipWith(zipped, _.add);
- * // => [3, 30, 300]
- */
-function unzipWith(array, iteratee, thisArg) {
-  var length = array ? array.length : 0;
-  if (!length) {
-    return [];
-  }
-  var result = unzip(array);
-  if (iteratee == null) {
-    return result;
-  }
-  iteratee = bindCallback(iteratee, thisArg, 4);
-  return arrayMap(result, function(group) {
-    return arrayReduce(group, iteratee, undefined, true);
-  });
-}
-
-module.exports = unzipWith;
diff --git a/node_modules/lodash/array/without.js b/node_modules/lodash/array/without.js
deleted file mode 100644
index 2ac3d11..0000000
--- a/node_modules/lodash/array/without.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var baseDifference = require('../internal/baseDifference'),
-    isArrayLike = require('../internal/isArrayLike'),
-    restParam = require('../function/restParam');
-
-/**
- * Creates an array excluding all provided values using
- * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
- * for equality comparisons.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to filter.
- * @param {...*} [values] The values to exclude.
- * @returns {Array} Returns the new array of filtered values.
- * @example
- *
- * _.without([1, 2, 1, 3], 1, 2);
- * // => [3]
- */
-var without = restParam(function(array, values) {
-  return isArrayLike(array)
-    ? baseDifference(array, values)
-    : [];
-});
-
-module.exports = without;
diff --git a/node_modules/lodash/array/xor.js b/node_modules/lodash/array/xor.js
deleted file mode 100644
index 04ef32a..0000000
--- a/node_modules/lodash/array/xor.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var arrayPush = require('../internal/arrayPush'),
-    baseDifference = require('../internal/baseDifference'),
-    baseUniq = require('../internal/baseUniq'),
-    isArrayLike = require('../internal/isArrayLike');
-
-/**
- * Creates an array of unique values that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
- * of the provided arrays.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {...Array} [arrays] The arrays to inspect.
- * @returns {Array} Returns the new array of values.
- * @example
- *
- * _.xor([1, 2], [4, 2]);
- * // => [1, 4]
- */
-function xor() {
-  var index = -1,
-      length = arguments.length;
-
-  while (++index < length) {
-    var array = arguments[index];
-    if (isArrayLike(array)) {
-      var result = result
-        ? arrayPush(baseDifference(result, array), baseDifference(array, result))
-        : array;
-    }
-  }
-  return result ? baseUniq(result) : [];
-}
-
-module.exports = xor;
diff --git a/node_modules/lodash/array/zip.js b/node_modules/lodash/array/zip.js
deleted file mode 100644
index 53a6f69..0000000
--- a/node_modules/lodash/array/zip.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var restParam = require('../function/restParam'),
-    unzip = require('./unzip');
-
-/**
- * Creates an array of grouped elements, the first of which contains the first
- * elements of the given arrays, the second of which contains the second elements
- * of the given arrays, and so on.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {...Array} [arrays] The arrays to process.
- * @returns {Array} Returns the new array of grouped elements.
- * @example
- *
- * _.zip(['fred', 'barney'], [30, 40], [true, false]);
- * // => [['fred', 30, true], ['barney', 40, false]]
- */
-var zip = restParam(unzip);
-
-module.exports = zip;
diff --git a/node_modules/lodash/array/zipObject.js b/node_modules/lodash/array/zipObject.js
deleted file mode 100644
index dec7a21..0000000
--- a/node_modules/lodash/array/zipObject.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var isArray = require('../lang/isArray');
-
-/**
- * The inverse of `_.pairs`; this method returns an object composed from arrays
- * of property names and values. Provide either a single two dimensional array,
- * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names
- * and one of corresponding values.
- *
- * @static
- * @memberOf _
- * @alias object
- * @category Array
- * @param {Array} props The property names.
- * @param {Array} [values=[]] The property values.
- * @returns {Object} Returns the new object.
- * @example
- *
- * _.zipObject([['fred', 30], ['barney', 40]]);
- * // => { 'fred': 30, 'barney': 40 }
- *
- * _.zipObject(['fred', 'barney'], [30, 40]);
- * // => { 'fred': 30, 'barney': 40 }
- */
-function zipObject(props, values) {
-  var index = -1,
-      length = props ? props.length : 0,
-      result = {};
-
-  if (length && !values && !isArray(props[0])) {
-    values = [];
-  }
-  while (++index < length) {
-    var key = props[index];
-    if (values) {
-      result[key] = values[index];
-    } else if (key) {
-      result[key[0]] = key[1];
-    }
-  }
-  return result;
-}
-
-module.exports = zipObject;
diff --git a/node_modules/lodash/array/zipWith.js b/node_modules/lodash/array/zipWith.js
deleted file mode 100644
index ad10374..0000000
--- a/node_modules/lodash/array/zipWith.js
+++ /dev/null
@@ -1,36 +0,0 @@
-var restParam = require('../function/restParam'),
-    unzipWith = require('./unzipWith');
-
-/**
- * This method is like `_.zip` except that it accepts an iteratee to specify
- * how grouped values should be combined. The `iteratee` is bound to `thisArg`
- * and invoked with four arguments: (accumulator, value, index, group).
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {...Array} [arrays] The arrays to process.
- * @param {Function} [iteratee] The function to combine grouped values.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Array} Returns the new array of grouped elements.
- * @example
- *
- * _.zipWith([1, 2], [10, 20], [100, 200], _.add);
- * // => [111, 222]
- */
-var zipWith = restParam(function(arrays) {
-  var length = arrays.length,
-      iteratee = length > 2 ? arrays[length - 2] : undefined,
-      thisArg = length > 1 ? arrays[length - 1] : undefined;
-
-  if (length > 2 && typeof iteratee == 'function') {
-    length -= 2;
-  } else {
-    iteratee = (length > 1 && typeof thisArg == 'function') ? (--length, thisArg) : undefined;
-    thisArg = undefined;
-  }
-  arrays.length = length;
-  return unzipWith(arrays, iteratee, thisArg);
-});
-
-module.exports = zipWith;
diff --git a/node_modules/lodash/chain.js b/node_modules/lodash/chain.js
deleted file mode 100644
index 6439627..0000000
--- a/node_modules/lodash/chain.js
+++ /dev/null
@@ -1,16 +0,0 @@
-module.exports = {
-  'chain': require('./chain/chain'),
-  'commit': require('./chain/commit'),
-  'concat': require('./chain/concat'),
-  'lodash': require('./chain/lodash'),
-  'plant': require('./chain/plant'),
-  'reverse': require('./chain/reverse'),
-  'run': require('./chain/run'),
-  'tap': require('./chain/tap'),
-  'thru': require('./chain/thru'),
-  'toJSON': require('./chain/toJSON'),
-  'toString': require('./chain/toString'),
-  'value': require('./chain/value'),
-  'valueOf': require('./chain/valueOf'),
-  'wrapperChain': require('./chain/wrapperChain')
-};
diff --git a/node_modules/lodash/chain/chain.js b/node_modules/lodash/chain/chain.js
deleted file mode 100644
index 453ba1e..0000000
--- a/node_modules/lodash/chain/chain.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var lodash = require('./lodash');
-
-/**
- * Creates a `lodash` object that wraps `value` with explicit method
- * chaining enabled.
- *
- * @static
- * @memberOf _
- * @category Chain
- * @param {*} value The value to wrap.
- * @returns {Object} Returns the new `lodash` wrapper instance.
- * @example
- *
- * var users = [
- *   { 'user': 'barney',  'age': 36 },
- *   { 'user': 'fred',    'age': 40 },
- *   { 'user': 'pebbles', 'age': 1 }
- * ];
- *
- * var youngest = _.chain(users)
- *   .sortBy('age')
- *   .map(function(chr) {
- *     return chr.user + ' is ' + chr.age;
- *   })
- *   .first()
- *   .value();
- * // => 'pebbles is 1'
- */
-function chain(value) {
-  var result = lodash(value);
-  result.__chain__ = true;
-  return result;
-}
-
-module.exports = chain;
diff --git a/node_modules/lodash/chain/commit.js b/node_modules/lodash/chain/commit.js
deleted file mode 100644
index c732d1b..0000000
--- a/node_modules/lodash/chain/commit.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./wrapperCommit');
diff --git a/node_modules/lodash/chain/concat.js b/node_modules/lodash/chain/concat.js
deleted file mode 100644
index 90607d1..0000000
--- a/node_modules/lodash/chain/concat.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./wrapperConcat');
diff --git a/node_modules/lodash/chain/lodash.js b/node_modules/lodash/chain/lodash.js
deleted file mode 100644
index 1c3467e..0000000
--- a/node_modules/lodash/chain/lodash.js
+++ /dev/null
@@ -1,125 +0,0 @@
-var LazyWrapper = require('../internal/LazyWrapper'),
-    LodashWrapper = require('../internal/LodashWrapper'),
-    baseLodash = require('../internal/baseLodash'),
-    isArray = require('../lang/isArray'),
-    isObjectLike = require('../internal/isObjectLike'),
-    wrapperClone = require('../internal/wrapperClone');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Creates a `lodash` object which wraps `value` to enable implicit chaining.
- * Methods that operate on and return arrays, collections, and functions can
- * be chained together. Methods that retrieve a single value or may return a
- * primitive value will automatically end the chain returning the unwrapped
- * value. Explicit chaining may be enabled using `_.chain`. The execution of
- * chained methods is lazy, that is, execution is deferred until `_#value`
- * is implicitly or explicitly called.
- *
- * Lazy evaluation allows several methods to support shortcut fusion. Shortcut
- * fusion is an optimization strategy which merge iteratee calls; this can help
- * to avoid the creation of intermediate data structures and greatly reduce the
- * number of iteratee executions.
- *
- * Chaining is supported in custom builds as long as the `_#value` method is
- * directly or indirectly included in the build.
- *
- * In addition to lodash methods, wrappers have `Array` and `String` methods.
- *
- * The wrapper `Array` methods are:
- * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`,
- * `splice`, and `unshift`
- *
- * The wrapper `String` methods are:
- * `replace` and `split`
- *
- * The wrapper methods that support shortcut fusion are:
- * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`,
- * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`,
- * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`,
- * and `where`
- *
- * The chainable wrapper methods are:
- * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`,
- * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`,
- * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defaultsDeep`,
- * `defer`, `delay`, `difference`, `drop`, `dropRight`, `dropRightWhile`,
- * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`,
- * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,
- * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,
- * `invoke`, `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`,
- * `matchesProperty`, `memoize`, `merge`, `method`, `methodOf`, `mixin`,
- * `modArgs`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`,
- * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,
- * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `restParam`,
- * `reverse`, `set`, `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`,
- * `sortByOrder`, `splice`, `spread`, `take`, `takeRight`, `takeRightWhile`,
- * `takeWhile`, `tap`, `throttle`, `thru`, `times`, `toArray`, `toPlainObject`,
- * `transform`, `union`, `uniq`, `unshift`, `unzip`, `unzipWith`, `values`,
- * `valuesIn`, `where`, `without`, `wrap`, `xor`, `zip`, `zipObject`, `zipWith`
- *
- * The wrapper methods that are **not** chainable by default are:
- * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clone`, `cloneDeep`,
- * `deburr`, `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`,
- * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`,
- * `floor`, `get`, `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`,
- * `inRange`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,
- * `isEmpty`, `isEqual`, `isError`, `isFinite` `isFunction`, `isMatch`,
- * `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, `isPlainObject`,
- * `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`,
- * `last`, `lastIndexOf`, `lt`, `lte`, `max`, `min`, `noConflict`, `noop`,
- * `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, `reduce`,
- * `reduceRight`, `repeat`, `result`, `round`, `runInContext`, `shift`, `size`,
- * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`,
- * `startsWith`, `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`,
- * `unescape`, `uniqueId`, `value`, and `words`
- *
- * The wrapper method `sample` will return a wrapped value when `n` is provided,
- * otherwise an unwrapped value is returned.
- *
- * @name _
- * @constructor
- * @category Chain
- * @param {*} value The value to wrap in a `lodash` instance.
- * @returns {Object} Returns the new `lodash` wrapper instance.
- * @example
- *
- * var wrapped = _([1, 2, 3]);
- *
- * // returns an unwrapped value
- * wrapped.reduce(function(total, n) {
- *   return total + n;
- * });
- * // => 6
- *
- * // returns a wrapped value
- * var squares = wrapped.map(function(n) {
- *   return n * n;
- * });
- *
- * _.isArray(squares);
- * // => false
- *
- * _.isArray(squares.value());
- * // => true
- */
-function lodash(value) {
-  if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
-    if (value instanceof LodashWrapper) {
-      return value;
-    }
-    if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) {
-      return wrapperClone(value);
-    }
-  }
-  return new LodashWrapper(value);
-}
-
-// Ensure wrappers are instances of `baseLodash`.
-lodash.prototype = baseLodash.prototype;
-
-module.exports = lodash;
diff --git a/node_modules/lodash/chain/plant.js b/node_modules/lodash/chain/plant.js
deleted file mode 100644
index 04099f2..0000000
--- a/node_modules/lodash/chain/plant.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./wrapperPlant');
diff --git a/node_modules/lodash/chain/reverse.js b/node_modules/lodash/chain/reverse.js
deleted file mode 100644
index f72a64a..0000000
--- a/node_modules/lodash/chain/reverse.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./wrapperReverse');
diff --git a/node_modules/lodash/chain/run.js b/node_modules/lodash/chain/run.js
deleted file mode 100644
index 5e751a2..0000000
--- a/node_modules/lodash/chain/run.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./wrapperValue');
diff --git a/node_modules/lodash/chain/tap.js b/node_modules/lodash/chain/tap.js
deleted file mode 100644
index 3d0257e..0000000
--- a/node_modules/lodash/chain/tap.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * This method invokes `interceptor` and returns `value`. The interceptor is
- * bound to `thisArg` and invoked with one argument; (value). The purpose of
- * this method is to "tap into" a method chain in order to perform operations
- * on intermediate results within the chain.
- *
- * @static
- * @memberOf _
- * @category Chain
- * @param {*} value The value to provide to `interceptor`.
- * @param {Function} interceptor The function to invoke.
- * @param {*} [thisArg] The `this` binding of `interceptor`.
- * @returns {*} Returns `value`.
- * @example
- *
- * _([1, 2, 3])
- *  .tap(function(array) {
- *    array.pop();
- *  })
- *  .reverse()
- *  .value();
- * // => [2, 1]
- */
-function tap(value, interceptor, thisArg) {
-  interceptor.call(thisArg, value);
-  return value;
-}
-
-module.exports = tap;
diff --git a/node_modules/lodash/chain/thru.js b/node_modules/lodash/chain/thru.js
deleted file mode 100644
index a715780..0000000
--- a/node_modules/lodash/chain/thru.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * This method is like `_.tap` except that it returns the result of `interceptor`.
- *
- * @static
- * @memberOf _
- * @category Chain
- * @param {*} value The value to provide to `interceptor`.
- * @param {Function} interceptor The function to invoke.
- * @param {*} [thisArg] The `this` binding of `interceptor`.
- * @returns {*} Returns the result of `interceptor`.
- * @example
- *
- * _('  abc  ')
- *  .chain()
- *  .trim()
- *  .thru(function(value) {
- *    return [value];
- *  })
- *  .value();
- * // => ['abc']
- */
-function thru(value, interceptor, thisArg) {
-  return interceptor.call(thisArg, value);
-}
-
-module.exports = thru;
diff --git a/node_modules/lodash/chain/toJSON.js b/node_modules/lodash/chain/toJSON.js
deleted file mode 100644
index 5e751a2..0000000
--- a/node_modules/lodash/chain/toJSON.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./wrapperValue');
diff --git a/node_modules/lodash/chain/toString.js b/node_modules/lodash/chain/toString.js
deleted file mode 100644
index c7bcbf9..0000000
--- a/node_modules/lodash/chain/toString.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./wrapperToString');
diff --git a/node_modules/lodash/chain/value.js b/node_modules/lodash/chain/value.js
deleted file mode 100644
index 5e751a2..0000000
--- a/node_modules/lodash/chain/value.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./wrapperValue');
diff --git a/node_modules/lodash/chain/valueOf.js b/node_modules/lodash/chain/valueOf.js
deleted file mode 100644
index 5e751a2..0000000
--- a/node_modules/lodash/chain/valueOf.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./wrapperValue');
diff --git a/node_modules/lodash/chain/wrapperChain.js b/node_modules/lodash/chain/wrapperChain.js
deleted file mode 100644
index 3823481..0000000
--- a/node_modules/lodash/chain/wrapperChain.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var chain = require('./chain');
-
-/**
- * Enables explicit method chaining on the wrapper object.
- *
- * @name chain
- * @memberOf _
- * @category Chain
- * @returns {Object} Returns the new `lodash` wrapper instance.
- * @example
- *
- * var users = [
- *   { 'user': 'barney', 'age': 36 },
- *   { 'user': 'fred',   'age': 40 }
- * ];
- *
- * // without explicit chaining
- * _(users).first();
- * // => { 'user': 'barney', 'age': 36 }
- *
- * // with explicit chaining
- * _(users).chain()
- *   .first()
- *   .pick('user')
- *   .value();
- * // => { 'user': 'barney' }
- */
-function wrapperChain() {
-  return chain(this);
-}
-
-module.exports = wrapperChain;
diff --git a/node_modules/lodash/chain/wrapperCommit.js b/node_modules/lodash/chain/wrapperCommit.js
deleted file mode 100644
index c3d2898..0000000
--- a/node_modules/lodash/chain/wrapperCommit.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var LodashWrapper = require('../internal/LodashWrapper');
-
-/**
- * Executes the chained sequence and returns the wrapped result.
- *
- * @name commit
- * @memberOf _
- * @category Chain
- * @returns {Object} Returns the new `lodash` wrapper instance.
- * @example
- *
- * var array = [1, 2];
- * var wrapped = _(array).push(3);
- *
- * console.log(array);
- * // => [1, 2]
- *
- * wrapped = wrapped.commit();
- * console.log(array);
- * // => [1, 2, 3]
- *
- * wrapped.last();
- * // => 3
- *
- * console.log(array);
- * // => [1, 2, 3]
- */
-function wrapperCommit() {
-  return new LodashWrapper(this.value(), this.__chain__);
-}
-
-module.exports = wrapperCommit;
diff --git a/node_modules/lodash/chain/wrapperConcat.js b/node_modules/lodash/chain/wrapperConcat.js
deleted file mode 100644
index 799156c..0000000
--- a/node_modules/lodash/chain/wrapperConcat.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var arrayConcat = require('../internal/arrayConcat'),
-    baseFlatten = require('../internal/baseFlatten'),
-    isArray = require('../lang/isArray'),
-    restParam = require('../function/restParam'),
-    toObject = require('../internal/toObject');
-
-/**
- * Creates a new array joining a wrapped array with any additional arrays
- * and/or values.
- *
- * @name concat
- * @memberOf _
- * @category Chain
- * @param {...*} [values] The values to concatenate.
- * @returns {Array} Returns the new concatenated array.
- * @example
- *
- * var array = [1];
- * var wrapped = _(array).concat(2, [3], [[4]]);
- *
- * console.log(wrapped.value());
- * // => [1, 2, 3, [4]]
- *
- * console.log(array);
- * // => [1]
- */
-var wrapperConcat = restParam(function(values) {
-  values = baseFlatten(values);
-  return this.thru(function(array) {
-    return arrayConcat(isArray(array) ? array : [toObject(array)], values);
-  });
-});
-
-module.exports = wrapperConcat;
diff --git a/node_modules/lodash/chain/wrapperPlant.js b/node_modules/lodash/chain/wrapperPlant.js
deleted file mode 100644
index 234fe41..0000000
--- a/node_modules/lodash/chain/wrapperPlant.js
+++ /dev/null
@@ -1,45 +0,0 @@
-var baseLodash = require('../internal/baseLodash'),
-    wrapperClone = require('../internal/wrapperClone');
-
-/**
- * Creates a clone of the chained sequence planting `value` as the wrapped value.
- *
- * @name plant
- * @memberOf _
- * @category Chain
- * @returns {Object} Returns the new `lodash` wrapper instance.
- * @example
- *
- * var array = [1, 2];
- * var wrapped = _(array).map(function(value) {
- *   return Math.pow(value, 2);
- * });
- *
- * var other = [3, 4];
- * var otherWrapped = wrapped.plant(other);
- *
- * otherWrapped.value();
- * // => [9, 16]
- *
- * wrapped.value();
- * // => [1, 4]
- */
-function wrapperPlant(value) {
-  var result,
-      parent = this;
-
-  while (parent instanceof baseLodash) {
-    var clone = wrapperClone(parent);
-    if (result) {
-      previous.__wrapped__ = clone;
-    } else {
-      result = clone;
-    }
-    var previous = clone;
-    parent = parent.__wrapped__;
-  }
-  previous.__wrapped__ = value;
-  return result;
-}
-
-module.exports = wrapperPlant;
diff --git a/node_modules/lodash/chain/wrapperReverse.js b/node_modules/lodash/chain/wrapperReverse.js
deleted file mode 100644
index 6ba546d..0000000
--- a/node_modules/lodash/chain/wrapperReverse.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var LazyWrapper = require('../internal/LazyWrapper'),
-    LodashWrapper = require('../internal/LodashWrapper'),
-    thru = require('./thru');
-
-/**
- * Reverses the wrapped array so the first element becomes the last, the
- * second element becomes the second to last, and so on.
- *
- * **Note:** This method mutates the wrapped array.
- *
- * @name reverse
- * @memberOf _
- * @category Chain
- * @returns {Object} Returns the new reversed `lodash` wrapper instance.
- * @example
- *
- * var array = [1, 2, 3];
- *
- * _(array).reverse().value()
- * // => [3, 2, 1]
- *
- * console.log(array);
- * // => [3, 2, 1]
- */
-function wrapperReverse() {
-  var value = this.__wrapped__;
-
-  var interceptor = function(value) {
-    return value.reverse();
-  };
-  if (value instanceof LazyWrapper) {
-    var wrapped = value;
-    if (this.__actions__.length) {
-      wrapped = new LazyWrapper(this);
-    }
-    wrapped = wrapped.reverse();
-    wrapped.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
-    return new LodashWrapper(wrapped, this.__chain__);
-  }
-  return this.thru(interceptor);
-}
-
-module.exports = wrapperReverse;
diff --git a/node_modules/lodash/chain/wrapperToString.js b/node_modules/lodash/chain/wrapperToString.js
deleted file mode 100644
index db975a5..0000000
--- a/node_modules/lodash/chain/wrapperToString.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Produces the result of coercing the unwrapped value to a string.
- *
- * @name toString
- * @memberOf _
- * @category Chain
- * @returns {string} Returns the coerced string value.
- * @example
- *
- * _([1, 2, 3]).toString();
- * // => '1,2,3'
- */
-function wrapperToString() {
-  return (this.value() + '');
-}
-
-module.exports = wrapperToString;
diff --git a/node_modules/lodash/chain/wrapperValue.js b/node_modules/lodash/chain/wrapperValue.js
deleted file mode 100644
index 2734e41..0000000
--- a/node_modules/lodash/chain/wrapperValue.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var baseWrapperValue = require('../internal/baseWrapperValue');
-
-/**
- * Executes the chained sequence to extract the unwrapped value.
- *
- * @name value
- * @memberOf _
- * @alias run, toJSON, valueOf
- * @category Chain
- * @returns {*} Returns the resolved unwrapped value.
- * @example
- *
- * _([1, 2, 3]).value();
- * // => [1, 2, 3]
- */
-function wrapperValue() {
-  return baseWrapperValue(this.__wrapped__, this.__actions__);
-}
-
-module.exports = wrapperValue;
diff --git a/node_modules/lodash/collection.js b/node_modules/lodash/collection.js
deleted file mode 100644
index 0338857..0000000
--- a/node_modules/lodash/collection.js
+++ /dev/null
@@ -1,44 +0,0 @@
-module.exports = {
-  'all': require('./collection/all'),
-  'any': require('./collection/any'),
-  'at': require('./collection/at'),
-  'collect': require('./collection/collect'),
-  'contains': require('./collection/contains'),
-  'countBy': require('./collection/countBy'),
-  'detect': require('./collection/detect'),
-  'each': require('./collection/each'),
-  'eachRight': require('./collection/eachRight'),
-  'every': require('./collection/every'),
-  'filter': require('./collection/filter'),
-  'find': require('./collection/find'),
-  'findLast': require('./collection/findLast'),
-  'findWhere': require('./collection/findWhere'),
-  'foldl': require('./collection/foldl'),
-  'foldr': require('./collection/foldr'),
-  'forEach': require('./collection/forEach'),
-  'forEachRight': require('./collection/forEachRight'),
-  'groupBy': require('./collection/groupBy'),
-  'include': require('./collection/include'),
-  'includes': require('./collection/includes'),
-  'indexBy': require('./collection/indexBy'),
-  'inject': require('./collection/inject'),
-  'invoke': require('./collection/invoke'),
-  'map': require('./collection/map'),
-  'max': require('./math/max'),
-  'min': require('./math/min'),
-  'partition': require('./collection/partition'),
-  'pluck': require('./collection/pluck'),
-  'reduce': require('./collection/reduce'),
-  'reduceRight': require('./collection/reduceRight'),
-  'reject': require('./collection/reject'),
-  'sample': require('./collection/sample'),
-  'select': require('./collection/select'),
-  'shuffle': require('./collection/shuffle'),
-  'size': require('./collection/size'),
-  'some': require('./collection/some'),
-  'sortBy': require('./collection/sortBy'),
-  'sortByAll': require('./collection/sortByAll'),
-  'sortByOrder': require('./collection/sortByOrder'),
-  'sum': require('./math/sum'),
-  'where': require('./collection/where')
-};
diff --git a/node_modules/lodash/collection/all.js b/node_modules/lodash/collection/all.js
deleted file mode 100644
index d0839f7..0000000
--- a/node_modules/lodash/collection/all.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./every');
diff --git a/node_modules/lodash/collection/any.js b/node_modules/lodash/collection/any.js
deleted file mode 100644
index 900ac25..0000000
--- a/node_modules/lodash/collection/any.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./some');
diff --git a/node_modules/lodash/collection/at.js b/node_modules/lodash/collection/at.js
deleted file mode 100644
index 29236e5..0000000
--- a/node_modules/lodash/collection/at.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var baseAt = require('../internal/baseAt'),
-    baseFlatten = require('../internal/baseFlatten'),
-    restParam = require('../function/restParam');
-
-/**
- * Creates an array of elements corresponding to the given keys, or indexes,
- * of `collection`. Keys may be specified as individual arguments or as arrays
- * of keys.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {...(number|number[]|string|string[])} [props] The property names
- *  or indexes of elements to pick, specified individually or in arrays.
- * @returns {Array} Returns the new array of picked elements.
- * @example
- *
- * _.at(['a', 'b', 'c'], [0, 2]);
- * // => ['a', 'c']
- *
- * _.at(['barney', 'fred', 'pebbles'], 0, 2);
- * // => ['barney', 'pebbles']
- */
-var at = restParam(function(collection, props) {
-  return baseAt(collection, baseFlatten(props));
-});
-
-module.exports = at;
diff --git a/node_modules/lodash/collection/collect.js b/node_modules/lodash/collection/collect.js
deleted file mode 100644
index 0d1e1ab..0000000
--- a/node_modules/lodash/collection/collect.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./map');
diff --git a/node_modules/lodash/collection/contains.js b/node_modules/lodash/collection/contains.js
deleted file mode 100644
index 594722a..0000000
--- a/node_modules/lodash/collection/contains.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./includes');
diff --git a/node_modules/lodash/collection/countBy.js b/node_modules/lodash/collection/countBy.js
deleted file mode 100644
index e97dbb7..0000000
--- a/node_modules/lodash/collection/countBy.js
+++ /dev/null
@@ -1,54 +0,0 @@
-var createAggregator = require('../internal/createAggregator');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Creates an object composed of keys generated from the results of running
- * each element of `collection` through `iteratee`. The corresponding value
- * of each key is the number of times the key was returned by `iteratee`.
- * The `iteratee` is bound to `thisArg` and invoked with three arguments:
- * (value, index|key, collection).
- *
- * If a property name is provided for `iteratee` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `iteratee` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [iteratee=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Object} Returns the composed aggregate object.
- * @example
- *
- * _.countBy([4.3, 6.1, 6.4], function(n) {
- *   return Math.floor(n);
- * });
- * // => { '4': 1, '6': 2 }
- *
- * _.countBy([4.3, 6.1, 6.4], function(n) {
- *   return this.floor(n);
- * }, Math);
- * // => { '4': 1, '6': 2 }
- *
- * _.countBy(['one', 'two', 'three'], 'length');
- * // => { '3': 2, '5': 1 }
- */
-var countBy = createAggregator(function(result, value, key) {
-  hasOwnProperty.call(result, key) ? ++result[key] : (result[key] = 1);
-});
-
-module.exports = countBy;
diff --git a/node_modules/lodash/collection/detect.js b/node_modules/lodash/collection/detect.js
deleted file mode 100644
index 2fb6303..0000000
--- a/node_modules/lodash/collection/detect.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./find');
diff --git a/node_modules/lodash/collection/each.js b/node_modules/lodash/collection/each.js
deleted file mode 100644
index 8800f42..0000000
--- a/node_modules/lodash/collection/each.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./forEach');
diff --git a/node_modules/lodash/collection/eachRight.js b/node_modules/lodash/collection/eachRight.js
deleted file mode 100644
index 3252b2a..0000000
--- a/node_modules/lodash/collection/eachRight.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./forEachRight');
diff --git a/node_modules/lodash/collection/every.js b/node_modules/lodash/collection/every.js
deleted file mode 100644
index 5a2d0f5..0000000
--- a/node_modules/lodash/collection/every.js
+++ /dev/null
@@ -1,66 +0,0 @@
-var arrayEvery = require('../internal/arrayEvery'),
-    baseCallback = require('../internal/baseCallback'),
-    baseEvery = require('../internal/baseEvery'),
-    isArray = require('../lang/isArray'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Checks if `predicate` returns truthy for **all** elements of `collection`.
- * The predicate is bound to `thisArg` and invoked with three arguments:
- * (value, index|key, collection).
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @alias all
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {boolean} Returns `true` if all elements pass the predicate check,
- *  else `false`.
- * @example
- *
- * _.every([true, 1, null, 'yes'], Boolean);
- * // => false
- *
- * var users = [
- *   { 'user': 'barney', 'active': false },
- *   { 'user': 'fred',   'active': false }
- * ];
- *
- * // using the `_.matches` callback shorthand
- * _.every(users, { 'user': 'barney', 'active': false });
- * // => false
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.every(users, 'active', false);
- * // => true
- *
- * // using the `_.property` callback shorthand
- * _.every(users, 'active');
- * // => false
- */
-function every(collection, predicate, thisArg) {
-  var func = isArray(collection) ? arrayEvery : baseEvery;
-  if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
-    predicate = undefined;
-  }
-  if (typeof predicate != 'function' || thisArg !== undefined) {
-    predicate = baseCallback(predicate, thisArg, 3);
-  }
-  return func(collection, predicate);
-}
-
-module.exports = every;
diff --git a/node_modules/lodash/collection/filter.js b/node_modules/lodash/collection/filter.js
deleted file mode 100644
index 7620aa7..0000000
--- a/node_modules/lodash/collection/filter.js
+++ /dev/null
@@ -1,61 +0,0 @@
-var arrayFilter = require('../internal/arrayFilter'),
-    baseCallback = require('../internal/baseCallback'),
-    baseFilter = require('../internal/baseFilter'),
-    isArray = require('../lang/isArray');
-
-/**
- * Iterates over elements of `collection`, returning an array of all elements
- * `predicate` returns truthy for. The predicate is bound to `thisArg` and
- * invoked with three arguments: (value, index|key, collection).
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @alias select
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {Array} Returns the new filtered array.
- * @example
- *
- * _.filter([4, 5, 6], function(n) {
- *   return n % 2 == 0;
- * });
- * // => [4, 6]
- *
- * var users = [
- *   { 'user': 'barney', 'age': 36, 'active': true },
- *   { 'user': 'fred',   'age': 40, 'active': false }
- * ];
- *
- * // using the `_.matches` callback shorthand
- * _.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user');
- * // => ['barney']
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.pluck(_.filter(users, 'active', false), 'user');
- * // => ['fred']
- *
- * // using the `_.property` callback shorthand
- * _.pluck(_.filter(users, 'active'), 'user');
- * // => ['barney']
- */
-function filter(collection, predicate, thisArg) {
-  var func = isArray(collection) ? arrayFilter : baseFilter;
-  predicate = baseCallback(predicate, thisArg, 3);
-  return func(collection, predicate);
-}
-
-module.exports = filter;
diff --git a/node_modules/lodash/collection/find.js b/node_modules/lodash/collection/find.js
deleted file mode 100644
index 7358cfe..0000000
--- a/node_modules/lodash/collection/find.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var baseEach = require('../internal/baseEach'),
-    createFind = require('../internal/createFind');
-
-/**
- * Iterates over elements of `collection`, returning the first element
- * `predicate` returns truthy for. The predicate is bound to `thisArg` and
- * invoked with three arguments: (value, index|key, collection).
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @alias detect
- * @category Collection
- * @param {Array|Object|string} collection The collection to search.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {*} Returns the matched element, else `undefined`.
- * @example
- *
- * var users = [
- *   { 'user': 'barney',  'age': 36, 'active': true },
- *   { 'user': 'fred',    'age': 40, 'active': false },
- *   { 'user': 'pebbles', 'age': 1,  'active': true }
- * ];
- *
- * _.result(_.find(users, function(chr) {
- *   return chr.age < 40;
- * }), 'user');
- * // => 'barney'
- *
- * // using the `_.matches` callback shorthand
- * _.result(_.find(users, { 'age': 1, 'active': true }), 'user');
- * // => 'pebbles'
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.result(_.find(users, 'active', false), 'user');
- * // => 'fred'
- *
- * // using the `_.property` callback shorthand
- * _.result(_.find(users, 'active'), 'user');
- * // => 'barney'
- */
-var find = createFind(baseEach);
-
-module.exports = find;
diff --git a/node_modules/lodash/collection/findLast.js b/node_modules/lodash/collection/findLast.js
deleted file mode 100644
index 75dbadc..0000000
--- a/node_modules/lodash/collection/findLast.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var baseEachRight = require('../internal/baseEachRight'),
-    createFind = require('../internal/createFind');
-
-/**
- * This method is like `_.find` except that it iterates over elements of
- * `collection` from right to left.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to search.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {*} Returns the matched element, else `undefined`.
- * @example
- *
- * _.findLast([1, 2, 3, 4], function(n) {
- *   return n % 2 == 1;
- * });
- * // => 3
- */
-var findLast = createFind(baseEachRight, true);
-
-module.exports = findLast;
diff --git a/node_modules/lodash/collection/findWhere.js b/node_modules/lodash/collection/findWhere.js
deleted file mode 100644
index 2d62065..0000000
--- a/node_modules/lodash/collection/findWhere.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var baseMatches = require('../internal/baseMatches'),
-    find = require('./find');
-
-/**
- * Performs a deep comparison between each element in `collection` and the
- * source object, returning the first element that has equivalent property
- * values.
- *
- * **Note:** This method supports comparing arrays, booleans, `Date` objects,
- * numbers, `Object` objects, regexes, and strings. Objects are compared by
- * their own, not inherited, enumerable properties. For comparing a single
- * own or inherited property value see `_.matchesProperty`.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to search.
- * @param {Object} source The object of property values to match.
- * @returns {*} Returns the matched element, else `undefined`.
- * @example
- *
- * var users = [
- *   { 'user': 'barney', 'age': 36, 'active': true },
- *   { 'user': 'fred',   'age': 40, 'active': false }
- * ];
- *
- * _.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user');
- * // => 'barney'
- *
- * _.result(_.findWhere(users, { 'age': 40, 'active': false }), 'user');
- * // => 'fred'
- */
-function findWhere(collection, source) {
-  return find(collection, baseMatches(source));
-}
-
-module.exports = findWhere;
diff --git a/node_modules/lodash/collection/foldl.js b/node_modules/lodash/collection/foldl.js
deleted file mode 100644
index 26f53cf..0000000
--- a/node_modules/lodash/collection/foldl.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./reduce');
diff --git a/node_modules/lodash/collection/foldr.js b/node_modules/lodash/collection/foldr.js
deleted file mode 100644
index 8fb199e..0000000
--- a/node_modules/lodash/collection/foldr.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./reduceRight');
diff --git a/node_modules/lodash/collection/forEach.js b/node_modules/lodash/collection/forEach.js
deleted file mode 100644
index 05a8e21..0000000
--- a/node_modules/lodash/collection/forEach.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var arrayEach = require('../internal/arrayEach'),
-    baseEach = require('../internal/baseEach'),
-    createForEach = require('../internal/createForEach');
-
-/**
- * Iterates over elements of `collection` invoking `iteratee` for each element.
- * The `iteratee` is bound to `thisArg` and invoked with three arguments:
- * (value, index|key, collection). Iteratee functions may exit iteration early
- * by explicitly returning `false`.
- *
- * **Note:** As with other "Collections" methods, objects with a "length" property
- * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
- * may be used for object iteration.
- *
- * @static
- * @memberOf _
- * @alias each
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} [iteratee=_.identity] The function invoked per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Array|Object|string} Returns `collection`.
- * @example
- *
- * _([1, 2]).forEach(function(n) {
- *   console.log(n);
- * }).value();
- * // => logs each value from left to right and returns the array
- *
- * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {
- *   console.log(n, key);
- * });
- * // => logs each value-key pair and returns the object (iteration order is not guaranteed)
- */
-var forEach = createForEach(arrayEach, baseEach);
-
-module.exports = forEach;
diff --git a/node_modules/lodash/collection/forEachRight.js b/node_modules/lodash/collection/forEachRight.js
deleted file mode 100644
index 3499711..0000000
--- a/node_modules/lodash/collection/forEachRight.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var arrayEachRight = require('../internal/arrayEachRight'),
-    baseEachRight = require('../internal/baseEachRight'),
-    createForEach = require('../internal/createForEach');
-
-/**
- * This method is like `_.forEach` except that it iterates over elements of
- * `collection` from right to left.
- *
- * @static
- * @memberOf _
- * @alias eachRight
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} [iteratee=_.identity] The function invoked per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Array|Object|string} Returns `collection`.
- * @example
- *
- * _([1, 2]).forEachRight(function(n) {
- *   console.log(n);
- * }).value();
- * // => logs each value from right to left and returns the array
- */
-var forEachRight = createForEach(arrayEachRight, baseEachRight);
-
-module.exports = forEachRight;
diff --git a/node_modules/lodash/collection/groupBy.js b/node_modules/lodash/collection/groupBy.js
deleted file mode 100644
index a925c89..0000000
--- a/node_modules/lodash/collection/groupBy.js
+++ /dev/null
@@ -1,59 +0,0 @@
-var createAggregator = require('../internal/createAggregator');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Creates an object composed of keys generated from the results of running
- * each element of `collection` through `iteratee`. The corresponding value
- * of each key is an array of the elements responsible for generating the key.
- * The `iteratee` is bound to `thisArg` and invoked with three arguments:
- * (value, index|key, collection).
- *
- * If a property name is provided for `iteratee` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `iteratee` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [iteratee=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Object} Returns the composed aggregate object.
- * @example
- *
- * _.groupBy([4.2, 6.1, 6.4], function(n) {
- *   return Math.floor(n);
- * });
- * // => { '4': [4.2], '6': [6.1, 6.4] }
- *
- * _.groupBy([4.2, 6.1, 6.4], function(n) {
- *   return this.floor(n);
- * }, Math);
- * // => { '4': [4.2], '6': [6.1, 6.4] }
- *
- * // using the `_.property` callback shorthand
- * _.groupBy(['one', 'two', 'three'], 'length');
- * // => { '3': ['one', 'two'], '5': ['three'] }
- */
-var groupBy = createAggregator(function(result, value, key) {
-  if (hasOwnProperty.call(result, key)) {
-    result[key].push(value);
-  } else {
-    result[key] = [value];
-  }
-});
-
-module.exports = groupBy;
diff --git a/node_modules/lodash/collection/include.js b/node_modules/lodash/collection/include.js
deleted file mode 100644
index 594722a..0000000
--- a/node_modules/lodash/collection/include.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./includes');
diff --git a/node_modules/lodash/collection/includes.js b/node_modules/lodash/collection/includes.js
deleted file mode 100644
index 329486a..0000000
--- a/node_modules/lodash/collection/includes.js
+++ /dev/null
@@ -1,57 +0,0 @@
-var baseIndexOf = require('../internal/baseIndexOf'),
-    getLength = require('../internal/getLength'),
-    isArray = require('../lang/isArray'),
-    isIterateeCall = require('../internal/isIterateeCall'),
-    isLength = require('../internal/isLength'),
-    isString = require('../lang/isString'),
-    values = require('../object/values');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
-
-/**
- * Checks if `target` is in `collection` using
- * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
- * for equality comparisons. If `fromIndex` is negative, it's used as the offset
- * from the end of `collection`.
- *
- * @static
- * @memberOf _
- * @alias contains, include
- * @category Collection
- * @param {Array|Object|string} collection The collection to search.
- * @param {*} target The value to search for.
- * @param {number} [fromIndex=0] The index to search from.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.
- * @returns {boolean} Returns `true` if a matching element is found, else `false`.
- * @example
- *
- * _.includes([1, 2, 3], 1);
- * // => true
- *
- * _.includes([1, 2, 3], 1, 2);
- * // => false
- *
- * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');
- * // => true
- *
- * _.includes('pebbles', 'eb');
- * // => true
- */
-function includes(collection, target, fromIndex, guard) {
-  var length = collection ? getLength(collection) : 0;
-  if (!isLength(length)) {
-    collection = values(collection);
-    length = collection.length;
-  }
-  if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) {
-    fromIndex = 0;
-  } else {
-    fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);
-  }
-  return (typeof collection == 'string' || !isArray(collection) && isString(collection))
-    ? (fromIndex <= length && collection.indexOf(target, fromIndex) > -1)
-    : (!!length && baseIndexOf(collection, target, fromIndex) > -1);
-}
-
-module.exports = includes;
diff --git a/node_modules/lodash/collection/indexBy.js b/node_modules/lodash/collection/indexBy.js
deleted file mode 100644
index 34a941e..0000000
--- a/node_modules/lodash/collection/indexBy.js
+++ /dev/null
@@ -1,53 +0,0 @@
-var createAggregator = require('../internal/createAggregator');
-
-/**
- * Creates an object composed of keys generated from the results of running
- * each element of `collection` through `iteratee`. The corresponding value
- * of each key is the last element responsible for generating the key. The
- * iteratee function is bound to `thisArg` and invoked with three arguments:
- * (value, index|key, collection).
- *
- * If a property name is provided for `iteratee` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `iteratee` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [iteratee=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Object} Returns the composed aggregate object.
- * @example
- *
- * var keyData = [
- *   { 'dir': 'left', 'code': 97 },
- *   { 'dir': 'right', 'code': 100 }
- * ];
- *
- * _.indexBy(keyData, 'dir');
- * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
- *
- * _.indexBy(keyData, function(object) {
- *   return String.fromCharCode(object.code);
- * });
- * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
- *
- * _.indexBy(keyData, function(object) {
- *   return this.fromCharCode(object.code);
- * }, String);
- * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
- */
-var indexBy = createAggregator(function(result, value, key) {
-  result[key] = value;
-});
-
-module.exports = indexBy;
diff --git a/node_modules/lodash/collection/inject.js b/node_modules/lodash/collection/inject.js
deleted file mode 100644
index 26f53cf..0000000
--- a/node_modules/lodash/collection/inject.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./reduce');
diff --git a/node_modules/lodash/collection/invoke.js b/node_modules/lodash/collection/invoke.js
deleted file mode 100644
index 6e71721..0000000
--- a/node_modules/lodash/collection/invoke.js
+++ /dev/null
@@ -1,42 +0,0 @@
-var baseEach = require('../internal/baseEach'),
-    invokePath = require('../internal/invokePath'),
-    isArrayLike = require('../internal/isArrayLike'),
-    isKey = require('../internal/isKey'),
-    restParam = require('../function/restParam');
-
-/**
- * Invokes the method at `path` of each element in `collection`, returning
- * an array of the results of each invoked method. Any additional arguments
- * are provided to each invoked method. If `methodName` is a function it's
- * invoked for, and `this` bound to, each element in `collection`.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Array|Function|string} path The path of the method to invoke or
- *  the function invoked per iteration.
- * @param {...*} [args] The arguments to invoke the method with.
- * @returns {Array} Returns the array of results.
- * @example
- *
- * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
- * // => [[1, 5, 7], [1, 2, 3]]
- *
- * _.invoke([123, 456], String.prototype.split, '');
- * // => [['1', '2', '3'], ['4', '5', '6']]
- */
-var invoke = restParam(function(collection, path, args) {
-  var index = -1,
-      isFunc = typeof path == 'function',
-      isProp = isKey(path),
-      result = isArrayLike(collection) ? Array(collection.length) : [];
-
-  baseEach(collection, function(value) {
-    var func = isFunc ? path : ((isProp && value != null) ? value[path] : undefined);
-    result[++index] = func ? func.apply(value, args) : invokePath(value, path, args);
-  });
-  return result;
-});
-
-module.exports = invoke;
diff --git a/node_modules/lodash/collection/map.js b/node_modules/lodash/collection/map.js
deleted file mode 100644
index 5381110..0000000
--- a/node_modules/lodash/collection/map.js
+++ /dev/null
@@ -1,68 +0,0 @@
-var arrayMap = require('../internal/arrayMap'),
-    baseCallback = require('../internal/baseCallback'),
-    baseMap = require('../internal/baseMap'),
-    isArray = require('../lang/isArray');
-
-/**
- * Creates an array of values by running each element in `collection` through
- * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three
- * arguments: (value, index|key, collection).
- *
- * If a property name is provided for `iteratee` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `iteratee` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * Many lodash methods are guarded to work as iteratees for methods like
- * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
- *
- * The guarded methods are:
- * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`,
- * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`,
- * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`,
- * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`,
- * `sum`, `uniq`, and `words`
- *
- * @static
- * @memberOf _
- * @alias collect
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [iteratee=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Array} Returns the new mapped array.
- * @example
- *
- * function timesThree(n) {
- *   return n * 3;
- * }
- *
- * _.map([1, 2], timesThree);
- * // => [3, 6]
- *
- * _.map({ 'a': 1, 'b': 2 }, timesThree);
- * // => [3, 6] (iteration order is not guaranteed)
- *
- * var users = [
- *   { 'user': 'barney' },
- *   { 'user': 'fred' }
- * ];
- *
- * // using the `_.property` callback shorthand
- * _.map(users, 'user');
- * // => ['barney', 'fred']
- */
-function map(collection, iteratee, thisArg) {
-  var func = isArray(collection) ? arrayMap : baseMap;
-  iteratee = baseCallback(iteratee, thisArg, 3);
-  return func(collection, iteratee);
-}
-
-module.exports = map;
diff --git a/node_modules/lodash/collection/max.js b/node_modules/lodash/collection/max.js
deleted file mode 100644
index bb1d213..0000000
--- a/node_modules/lodash/collection/max.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('../math/max');
diff --git a/node_modules/lodash/collection/min.js b/node_modules/lodash/collection/min.js
deleted file mode 100644
index eef13d0..0000000
--- a/node_modules/lodash/collection/min.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('../math/min');
diff --git a/node_modules/lodash/collection/partition.js b/node_modules/lodash/collection/partition.js
deleted file mode 100644
index ee35f27..0000000
--- a/node_modules/lodash/collection/partition.js
+++ /dev/null
@@ -1,66 +0,0 @@
-var createAggregator = require('../internal/createAggregator');
-
-/**
- * Creates an array of elements split into two groups, the first of which
- * contains elements `predicate` returns truthy for, while the second of which
- * contains elements `predicate` returns falsey for. The predicate is bound
- * to `thisArg` and invoked with three arguments: (value, index|key, collection).
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {Array} Returns the array of grouped elements.
- * @example
- *
- * _.partition([1, 2, 3], function(n) {
- *   return n % 2;
- * });
- * // => [[1, 3], [2]]
- *
- * _.partition([1.2, 2.3, 3.4], function(n) {
- *   return this.floor(n) % 2;
- * }, Math);
- * // => [[1.2, 3.4], [2.3]]
- *
- * var users = [
- *   { 'user': 'barney',  'age': 36, 'active': false },
- *   { 'user': 'fred',    'age': 40, 'active': true },
- *   { 'user': 'pebbles', 'age': 1,  'active': false }
- * ];
- *
- * var mapper = function(array) {
- *   return _.pluck(array, 'user');
- * };
- *
- * // using the `_.matches` callback shorthand
- * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper);
- * // => [['pebbles'], ['barney', 'fred']]
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.map(_.partition(users, 'active', false), mapper);
- * // => [['barney', 'pebbles'], ['fred']]
- *
- * // using the `_.property` callback shorthand
- * _.map(_.partition(users, 'active'), mapper);
- * // => [['fred'], ['barney', 'pebbles']]
- */
-var partition = createAggregator(function(result, value, key) {
-  result[key ? 0 : 1].push(value);
-}, function() { return [[], []]; });
-
-module.exports = partition;
diff --git a/node_modules/lodash/collection/pluck.js b/node_modules/lodash/collection/pluck.js
deleted file mode 100644
index 5ee1ec8..0000000
--- a/node_modules/lodash/collection/pluck.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var map = require('./map'),
-    property = require('../utility/property');
-
-/**
- * Gets the property value of `path` from all elements in `collection`.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Array|string} path The path of the property to pluck.
- * @returns {Array} Returns the property values.
- * @example
- *
- * var users = [
- *   { 'user': 'barney', 'age': 36 },
- *   { 'user': 'fred',   'age': 40 }
- * ];
- *
- * _.pluck(users, 'user');
- * // => ['barney', 'fred']
- *
- * var userIndex = _.indexBy(users, 'user');
- * _.pluck(userIndex, 'age');
- * // => [36, 40] (iteration order is not guaranteed)
- */
-function pluck(collection, path) {
-  return map(collection, property(path));
-}
-
-module.exports = pluck;
diff --git a/node_modules/lodash/collection/reduce.js b/node_modules/lodash/collection/reduce.js
deleted file mode 100644
index 5d5e8c9..0000000
--- a/node_modules/lodash/collection/reduce.js
+++ /dev/null
@@ -1,44 +0,0 @@
-var arrayReduce = require('../internal/arrayReduce'),
-    baseEach = require('../internal/baseEach'),
-    createReduce = require('../internal/createReduce');
-
-/**
- * Reduces `collection` to a value which is the accumulated result of running
- * each element in `collection` through `iteratee`, where each successive
- * invocation is supplied the return value of the previous. If `accumulator`
- * is not provided the first element of `collection` is used as the initial
- * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:
- * (accumulator, value, index|key, collection).
- *
- * Many lodash methods are guarded to work as iteratees for methods like
- * `_.reduce`, `_.reduceRight`, and `_.transform`.
- *
- * The guarded methods are:
- * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `sortByAll`,
- * and `sortByOrder`
- *
- * @static
- * @memberOf _
- * @alias foldl, inject
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} [iteratee=_.identity] The function invoked per iteration.
- * @param {*} [accumulator] The initial value.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {*} Returns the accumulated value.
- * @example
- *
- * _.reduce([1, 2], function(total, n) {
- *   return total + n;
- * });
- * // => 3
- *
- * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) {
- *   result[key] = n * 3;
- *   return result;
- * }, {});
- * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)
- */
-var reduce = createReduce(arrayReduce, baseEach);
-
-module.exports = reduce;
diff --git a/node_modules/lodash/collection/reduceRight.js b/node_modules/lodash/collection/reduceRight.js
deleted file mode 100644
index 5a5753b..0000000
--- a/node_modules/lodash/collection/reduceRight.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var arrayReduceRight = require('../internal/arrayReduceRight'),
-    baseEachRight = require('../internal/baseEachRight'),
-    createReduce = require('../internal/createReduce');
-
-/**
- * This method is like `_.reduce` except that it iterates over elements of
- * `collection` from right to left.
- *
- * @static
- * @memberOf _
- * @alias foldr
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} [iteratee=_.identity] The function invoked per iteration.
- * @param {*} [accumulator] The initial value.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {*} Returns the accumulated value.
- * @example
- *
- * var array = [[0, 1], [2, 3], [4, 5]];
- *
- * _.reduceRight(array, function(flattened, other) {
- *   return flattened.concat(other);
- * }, []);
- * // => [4, 5, 2, 3, 0, 1]
- */
-var reduceRight = createReduce(arrayReduceRight, baseEachRight);
-
-module.exports = reduceRight;
diff --git a/node_modules/lodash/collection/reject.js b/node_modules/lodash/collection/reject.js
deleted file mode 100644
index 5592453..0000000
--- a/node_modules/lodash/collection/reject.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var arrayFilter = require('../internal/arrayFilter'),
-    baseCallback = require('../internal/baseCallback'),
-    baseFilter = require('../internal/baseFilter'),
-    isArray = require('../lang/isArray');
-
-/**
- * The opposite of `_.filter`; this method returns the elements of `collection`
- * that `predicate` does **not** return truthy for.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {Array} Returns the new filtered array.
- * @example
- *
- * _.reject([1, 2, 3, 4], function(n) {
- *   return n % 2 == 0;
- * });
- * // => [1, 3]
- *
- * var users = [
- *   { 'user': 'barney', 'age': 36, 'active': false },
- *   { 'user': 'fred',   'age': 40, 'active': true }
- * ];
- *
- * // using the `_.matches` callback shorthand
- * _.pluck(_.reject(users, { 'age': 40, 'active': true }), 'user');
- * // => ['barney']
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.pluck(_.reject(users, 'active', false), 'user');
- * // => ['fred']
- *
- * // using the `_.property` callback shorthand
- * _.pluck(_.reject(users, 'active'), 'user');
- * // => ['barney']
- */
-function reject(collection, predicate, thisArg) {
-  var func = isArray(collection) ? arrayFilter : baseFilter;
-  predicate = baseCallback(predicate, thisArg, 3);
-  return func(collection, function(value, index, collection) {
-    return !predicate(value, index, collection);
-  });
-}
-
-module.exports = reject;
diff --git a/node_modules/lodash/collection/sample.js b/node_modules/lodash/collection/sample.js
deleted file mode 100644
index 8e01533..0000000
--- a/node_modules/lodash/collection/sample.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var baseRandom = require('../internal/baseRandom'),
-    isIterateeCall = require('../internal/isIterateeCall'),
-    toArray = require('../lang/toArray'),
-    toIterable = require('../internal/toIterable');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMin = Math.min;
-
-/**
- * Gets a random element or `n` random elements from a collection.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to sample.
- * @param {number} [n] The number of elements to sample.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {*} Returns the random sample(s).
- * @example
- *
- * _.sample([1, 2, 3, 4]);
- * // => 2
- *
- * _.sample([1, 2, 3, 4], 2);
- * // => [3, 1]
- */
-function sample(collection, n, guard) {
-  if (guard ? isIterateeCall(collection, n, guard) : n == null) {
-    collection = toIterable(collection);
-    var length = collection.length;
-    return length > 0 ? collection[baseRandom(0, length - 1)] : undefined;
-  }
-  var index = -1,
-      result = toArray(collection),
-      length = result.length,
-      lastIndex = length - 1;
-
-  n = nativeMin(n < 0 ? 0 : (+n || 0), length);
-  while (++index < n) {
-    var rand = baseRandom(index, lastIndex),
-        value = result[rand];
-
-    result[rand] = result[index];
-    result[index] = value;
-  }
-  result.length = n;
-  return result;
-}
-
-module.exports = sample;
diff --git a/node_modules/lodash/collection/select.js b/node_modules/lodash/collection/select.js
deleted file mode 100644
index ade80f6..0000000
--- a/node_modules/lodash/collection/select.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./filter');
diff --git a/node_modules/lodash/collection/shuffle.js b/node_modules/lodash/collection/shuffle.js
deleted file mode 100644
index 949689c..0000000
--- a/node_modules/lodash/collection/shuffle.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var sample = require('./sample');
-
-/** Used as references for `-Infinity` and `Infinity`. */
-var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
-
-/**
- * Creates an array of shuffled values, using a version of the
- * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to shuffle.
- * @returns {Array} Returns the new shuffled array.
- * @example
- *
- * _.shuffle([1, 2, 3, 4]);
- * // => [4, 1, 3, 2]
- */
-function shuffle(collection) {
-  return sample(collection, POSITIVE_INFINITY);
-}
-
-module.exports = shuffle;
diff --git a/node_modules/lodash/collection/size.js b/node_modules/lodash/collection/size.js
deleted file mode 100644
index 78dcf4c..0000000
--- a/node_modules/lodash/collection/size.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var getLength = require('../internal/getLength'),
-    isLength = require('../internal/isLength'),
-    keys = require('../object/keys');
-
-/**
- * Gets the size of `collection` by returning its length for array-like
- * values or the number of own enumerable properties for objects.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to inspect.
- * @returns {number} Returns the size of `collection`.
- * @example
- *
- * _.size([1, 2, 3]);
- * // => 3
- *
- * _.size({ 'a': 1, 'b': 2 });
- * // => 2
- *
- * _.size('pebbles');
- * // => 7
- */
-function size(collection) {
-  var length = collection ? getLength(collection) : 0;
-  return isLength(length) ? length : keys(collection).length;
-}
-
-module.exports = size;
diff --git a/node_modules/lodash/collection/some.js b/node_modules/lodash/collection/some.js
deleted file mode 100644
index d0b09a4..0000000
--- a/node_modules/lodash/collection/some.js
+++ /dev/null
@@ -1,67 +0,0 @@
-var arraySome = require('../internal/arraySome'),
-    baseCallback = require('../internal/baseCallback'),
-    baseSome = require('../internal/baseSome'),
-    isArray = require('../lang/isArray'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Checks if `predicate` returns truthy for **any** element of `collection`.
- * The function returns as soon as it finds a passing value and does not iterate
- * over the entire collection. The predicate is bound to `thisArg` and invoked
- * with three arguments: (value, index|key, collection).
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @alias any
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {boolean} Returns `true` if any element passes the predicate check,
- *  else `false`.
- * @example
- *
- * _.some([null, 0, 'yes', false], Boolean);
- * // => true
- *
- * var users = [
- *   { 'user': 'barney', 'active': true },
- *   { 'user': 'fred',   'active': false }
- * ];
- *
- * // using the `_.matches` callback shorthand
- * _.some(users, { 'user': 'barney', 'active': false });
- * // => false
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.some(users, 'active', false);
- * // => true
- *
- * // using the `_.property` callback shorthand
- * _.some(users, 'active');
- * // => true
- */
-function some(collection, predicate, thisArg) {
-  var func = isArray(collection) ? arraySome : baseSome;
-  if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
-    predicate = undefined;
-  }
-  if (typeof predicate != 'function' || thisArg !== undefined) {
-    predicate = baseCallback(predicate, thisArg, 3);
-  }
-  return func(collection, predicate);
-}
-
-module.exports = some;
diff --git a/node_modules/lodash/collection/sortBy.js b/node_modules/lodash/collection/sortBy.js
deleted file mode 100644
index 4401c77..0000000
--- a/node_modules/lodash/collection/sortBy.js
+++ /dev/null
@@ -1,71 +0,0 @@
-var baseCallback = require('../internal/baseCallback'),
-    baseMap = require('../internal/baseMap'),
-    baseSortBy = require('../internal/baseSortBy'),
-    compareAscending = require('../internal/compareAscending'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Creates an array of elements, sorted in ascending order by the results of
- * running each element in a collection through `iteratee`. This method performs
- * a stable sort, that is, it preserves the original sort order of equal elements.
- * The `iteratee` is bound to `thisArg` and invoked with three arguments:
- * (value, index|key, collection).
- *
- * If a property name is provided for `iteratee` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `iteratee` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [iteratee=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Array} Returns the new sorted array.
- * @example
- *
- * _.sortBy([1, 2, 3], function(n) {
- *   return Math.sin(n);
- * });
- * // => [3, 1, 2]
- *
- * _.sortBy([1, 2, 3], function(n) {
- *   return this.sin(n);
- * }, Math);
- * // => [3, 1, 2]
- *
- * var users = [
- *   { 'user': 'fred' },
- *   { 'user': 'pebbles' },
- *   { 'user': 'barney' }
- * ];
- *
- * // using the `_.property` callback shorthand
- * _.pluck(_.sortBy(users, 'user'), 'user');
- * // => ['barney', 'fred', 'pebbles']
- */
-function sortBy(collection, iteratee, thisArg) {
-  if (collection == null) {
-    return [];
-  }
-  if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
-    iteratee = undefined;
-  }
-  var index = -1;
-  iteratee = baseCallback(iteratee, thisArg, 3);
-
-  var result = baseMap(collection, function(value, key, collection) {
-    return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value };
-  });
-  return baseSortBy(result, compareAscending);
-}
-
-module.exports = sortBy;
diff --git a/node_modules/lodash/collection/sortByAll.js b/node_modules/lodash/collection/sortByAll.js
deleted file mode 100644
index 4766c20..0000000
--- a/node_modules/lodash/collection/sortByAll.js
+++ /dev/null
@@ -1,52 +0,0 @@
-var baseFlatten = require('../internal/baseFlatten'),
-    baseSortByOrder = require('../internal/baseSortByOrder'),
-    isIterateeCall = require('../internal/isIterateeCall'),
-    restParam = require('../function/restParam');
-
-/**
- * This method is like `_.sortBy` except that it can sort by multiple iteratees
- * or property names.
- *
- * If a property name is provided for an iteratee the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If an object is provided for an iteratee the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {...(Function|Function[]|Object|Object[]|string|string[])} iteratees
- *  The iteratees to sort by, specified as individual values or arrays of values.
- * @returns {Array} Returns the new sorted array.
- * @example
- *
- * var users = [
- *   { 'user': 'fred',   'age': 48 },
- *   { 'user': 'barney', 'age': 36 },
- *   { 'user': 'fred',   'age': 42 },
- *   { 'user': 'barney', 'age': 34 }
- * ];
- *
- * _.map(_.sortByAll(users, ['user', 'age']), _.values);
- * // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]]
- *
- * _.map(_.sortByAll(users, 'user', function(chr) {
- *   return Math.floor(chr.age / 10);
- * }), _.values);
- * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
- */
-var sortByAll = restParam(function(collection, iteratees) {
-  if (collection == null) {
-    return [];
-  }
-  var guard = iteratees[2];
-  if (guard && isIterateeCall(iteratees[0], iteratees[1], guard)) {
-    iteratees.length = 1;
-  }
-  return baseSortByOrder(collection, baseFlatten(iteratees), []);
-});
-
-module.exports = sortByAll;
diff --git a/node_modules/lodash/collection/sortByOrder.js b/node_modules/lodash/collection/sortByOrder.js
deleted file mode 100644
index 8b4fc19..0000000
--- a/node_modules/lodash/collection/sortByOrder.js
+++ /dev/null
@@ -1,55 +0,0 @@
-var baseSortByOrder = require('../internal/baseSortByOrder'),
-    isArray = require('../lang/isArray'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * This method is like `_.sortByAll` except that it allows specifying the
- * sort orders of the iteratees to sort by. If `orders` is unspecified, all
- * values are sorted in ascending order. Otherwise, a value is sorted in
- * ascending order if its corresponding order is "asc", and descending if "desc".
- *
- * If a property name is provided for an iteratee the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If an object is provided for an iteratee the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
- * @param {boolean[]} [orders] The sort orders of `iteratees`.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.
- * @returns {Array} Returns the new sorted array.
- * @example
- *
- * var users = [
- *   { 'user': 'fred',   'age': 48 },
- *   { 'user': 'barney', 'age': 34 },
- *   { 'user': 'fred',   'age': 42 },
- *   { 'user': 'barney', 'age': 36 }
- * ];
- *
- * // sort by `user` in ascending order and by `age` in descending order
- * _.map(_.sortByOrder(users, ['user', 'age'], ['asc', 'desc']), _.values);
- * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
- */
-function sortByOrder(collection, iteratees, orders, guard) {
-  if (collection == null) {
-    return [];
-  }
-  if (guard && isIterateeCall(iteratees, orders, guard)) {
-    orders = undefined;
-  }
-  if (!isArray(iteratees)) {
-    iteratees = iteratees == null ? [] : [iteratees];
-  }
-  if (!isArray(orders)) {
-    orders = orders == null ? [] : [orders];
-  }
-  return baseSortByOrder(collection, iteratees, orders);
-}
-
-module.exports = sortByOrder;
diff --git a/node_modules/lodash/collection/sum.js b/node_modules/lodash/collection/sum.js
deleted file mode 100644
index a2e9380..0000000
--- a/node_modules/lodash/collection/sum.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('../math/sum');
diff --git a/node_modules/lodash/collection/where.js b/node_modules/lodash/collection/where.js
deleted file mode 100644
index f603bf8..0000000
--- a/node_modules/lodash/collection/where.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var baseMatches = require('../internal/baseMatches'),
-    filter = require('./filter');
-
-/**
- * Performs a deep comparison between each element in `collection` and the
- * source object, returning an array of all elements that have equivalent
- * property values.
- *
- * **Note:** This method supports comparing arrays, booleans, `Date` objects,
- * numbers, `Object` objects, regexes, and strings. Objects are compared by
- * their own, not inherited, enumerable properties. For comparing a single
- * own or inherited property value see `_.matchesProperty`.
- *
- * @static
- * @memberOf _
- * @category Collection
- * @param {Array|Object|string} collection The collection to search.
- * @param {Object} source The object of property values to match.
- * @returns {Array} Returns the new filtered array.
- * @example
- *
- * var users = [
- *   { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] },
- *   { 'user': 'fred',   'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] }
- * ];
- *
- * _.pluck(_.where(users, { 'age': 36, 'active': false }), 'user');
- * // => ['barney']
- *
- * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user');
- * // => ['fred']
- */
-function where(collection, source) {
-  return filter(collection, baseMatches(source));
-}
-
-module.exports = where;
diff --git a/node_modules/lodash/date.js b/node_modules/lodash/date.js
deleted file mode 100644
index 195366e..0000000
--- a/node_modules/lodash/date.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
-  'now': require('./date/now')
-};
diff --git a/node_modules/lodash/date/now.js b/node_modules/lodash/date/now.js
deleted file mode 100644
index ffe3060..0000000
--- a/node_modules/lodash/date/now.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var getNative = require('../internal/getNative');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeNow = getNative(Date, 'now');
-
-/**
- * Gets the number of milliseconds that have elapsed since the Unix epoch
- * (1 January 1970 00:00:00 UTC).
- *
- * @static
- * @memberOf _
- * @category Date
- * @example
- *
- * _.defer(function(stamp) {
- *   console.log(_.now() - stamp);
- * }, _.now());
- * // => logs the number of milliseconds it took for the deferred function to be invoked
- */
-var now = nativeNow || function() {
-  return new Date().getTime();
-};
-
-module.exports = now;
diff --git a/node_modules/lodash/function.js b/node_modules/lodash/function.js
deleted file mode 100644
index 71f8ebe..0000000
--- a/node_modules/lodash/function.js
+++ /dev/null
@@ -1,28 +0,0 @@
-module.exports = {
-  'after': require('./function/after'),
-  'ary': require('./function/ary'),
-  'backflow': require('./function/backflow'),
-  'before': require('./function/before'),
-  'bind': require('./function/bind'),
-  'bindAll': require('./function/bindAll'),
-  'bindKey': require('./function/bindKey'),
-  'compose': require('./function/compose'),
-  'curry': require('./function/curry'),
-  'curryRight': require('./function/curryRight'),
-  'debounce': require('./function/debounce'),
-  'defer': require('./function/defer'),
-  'delay': require('./function/delay'),
-  'flow': require('./function/flow'),
-  'flowRight': require('./function/flowRight'),
-  'memoize': require('./function/memoize'),
-  'modArgs': require('./function/modArgs'),
-  'negate': require('./function/negate'),
-  'once': require('./function/once'),
-  'partial': require('./function/partial'),
-  'partialRight': require('./function/partialRight'),
-  'rearg': require('./function/rearg'),
-  'restParam': require('./function/restParam'),
-  'spread': require('./function/spread'),
-  'throttle': require('./function/throttle'),
-  'wrap': require('./function/wrap')
-};
diff --git a/node_modules/lodash/function/after.js b/node_modules/lodash/function/after.js
deleted file mode 100644
index 96a51fd..0000000
--- a/node_modules/lodash/function/after.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeIsFinite = global.isFinite;
-
-/**
- * The opposite of `_.before`; this method creates a function that invokes
- * `func` once it's called `n` or more times.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {number} n The number of calls before `func` is invoked.
- * @param {Function} func The function to restrict.
- * @returns {Function} Returns the new restricted function.
- * @example
- *
- * var saves = ['profile', 'settings'];
- *
- * var done = _.after(saves.length, function() {
- *   console.log('done saving!');
- * });
- *
- * _.forEach(saves, function(type) {
- *   asyncSave({ 'type': type, 'complete': done });
- * });
- * // => logs 'done saving!' after the two async saves have completed
- */
-function after(n, func) {
-  if (typeof func != 'function') {
-    if (typeof n == 'function') {
-      var temp = n;
-      n = func;
-      func = temp;
-    } else {
-      throw new TypeError(FUNC_ERROR_TEXT);
-    }
-  }
-  n = nativeIsFinite(n = +n) ? n : 0;
-  return function() {
-    if (--n < 1) {
-      return func.apply(this, arguments);
-    }
-  };
-}
-
-module.exports = after;
diff --git a/node_modules/lodash/function/ary.js b/node_modules/lodash/function/ary.js
deleted file mode 100644
index 53a6913..0000000
--- a/node_modules/lodash/function/ary.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var createWrapper = require('../internal/createWrapper'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var ARY_FLAG = 128;
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
-
-/**
- * Creates a function that accepts up to `n` arguments ignoring any
- * additional arguments.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to cap arguments for.
- * @param {number} [n=func.length] The arity cap.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Function} Returns the new function.
- * @example
- *
- * _.map(['6', '8', '10'], _.ary(parseInt, 1));
- * // => [6, 8, 10]
- */
-function ary(func, n, guard) {
-  if (guard && isIterateeCall(func, n, guard)) {
-    n = undefined;
-  }
-  n = (func && n == null) ? func.length : nativeMax(+n || 0, 0);
-  return createWrapper(func, ARY_FLAG, undefined, undefined, undefined, undefined, n);
-}
-
-module.exports = ary;
diff --git a/node_modules/lodash/function/backflow.js b/node_modules/lodash/function/backflow.js
deleted file mode 100644
index 1954e94..0000000
--- a/node_modules/lodash/function/backflow.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./flowRight');
diff --git a/node_modules/lodash/function/before.js b/node_modules/lodash/function/before.js
deleted file mode 100644
index 3d94216..0000000
--- a/node_modules/lodash/function/before.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/**
- * Creates a function that invokes `func`, with the `this` binding and arguments
- * of the created function, while it's called less than `n` times. Subsequent
- * calls to the created function return the result of the last `func` invocation.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {number} n The number of calls at which `func` is no longer invoked.
- * @param {Function} func The function to restrict.
- * @returns {Function} Returns the new restricted function.
- * @example
- *
- * jQuery('#add').on('click', _.before(5, addContactToList));
- * // => allows adding up to 4 contacts to the list
- */
-function before(n, func) {
-  var result;
-  if (typeof func != 'function') {
-    if (typeof n == 'function') {
-      var temp = n;
-      n = func;
-      func = temp;
-    } else {
-      throw new TypeError(FUNC_ERROR_TEXT);
-    }
-  }
-  return function() {
-    if (--n > 0) {
-      result = func.apply(this, arguments);
-    }
-    if (n <= 1) {
-      func = undefined;
-    }
-    return result;
-  };
-}
-
-module.exports = before;
diff --git a/node_modules/lodash/function/bind.js b/node_modules/lodash/function/bind.js
deleted file mode 100644
index 0de126a..0000000
--- a/node_modules/lodash/function/bind.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var createWrapper = require('../internal/createWrapper'),
-    replaceHolders = require('../internal/replaceHolders'),
-    restParam = require('./restParam');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var BIND_FLAG = 1,
-    PARTIAL_FLAG = 32;
-
-/**
- * Creates a function that invokes `func` with the `this` binding of `thisArg`
- * and prepends any additional `_.bind` arguments to those provided to the
- * bound function.
- *
- * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
- * may be used as a placeholder for partially applied arguments.
- *
- * **Note:** Unlike native `Function#bind` this method does not set the "length"
- * property of bound functions.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to bind.
- * @param {*} thisArg The `this` binding of `func`.
- * @param {...*} [partials] The arguments to be partially applied.
- * @returns {Function} Returns the new bound function.
- * @example
- *
- * var greet = function(greeting, punctuation) {
- *   return greeting + ' ' + this.user + punctuation;
- * };
- *
- * var object = { 'user': 'fred' };
- *
- * var bound = _.bind(greet, object, 'hi');
- * bound('!');
- * // => 'hi fred!'
- *
- * // using placeholders
- * var bound = _.bind(greet, object, _, '!');
- * bound('hi');
- * // => 'hi fred!'
- */
-var bind = restParam(function(func, thisArg, partials) {
-  var bitmask = BIND_FLAG;
-  if (partials.length) {
-    var holders = replaceHolders(partials, bind.placeholder);
-    bitmask |= PARTIAL_FLAG;
-  }
-  return createWrapper(func, bitmask, thisArg, partials, holders);
-});
-
-// Assign default placeholders.
-bind.placeholder = {};
-
-module.exports = bind;
diff --git a/node_modules/lodash/function/bindAll.js b/node_modules/lodash/function/bindAll.js
deleted file mode 100644
index a09e948..0000000
--- a/node_modules/lodash/function/bindAll.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var baseFlatten = require('../internal/baseFlatten'),
-    createWrapper = require('../internal/createWrapper'),
-    functions = require('../object/functions'),
-    restParam = require('./restParam');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var BIND_FLAG = 1;
-
-/**
- * Binds methods of an object to the object itself, overwriting the existing
- * method. Method names may be specified as individual arguments or as arrays
- * of method names. If no method names are provided all enumerable function
- * properties, own and inherited, of `object` are bound.
- *
- * **Note:** This method does not set the "length" property of bound functions.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Object} object The object to bind and assign the bound methods to.
- * @param {...(string|string[])} [methodNames] The object method names to bind,
- *  specified as individual method names or arrays of method names.
- * @returns {Object} Returns `object`.
- * @example
- *
- * var view = {
- *   'label': 'docs',
- *   'onClick': function() {
- *     console.log('clicked ' + this.label);
- *   }
- * };
- *
- * _.bindAll(view);
- * jQuery('#docs').on('click', view.onClick);
- * // => logs 'clicked docs' when the element is clicked
- */
-var bindAll = restParam(function(object, methodNames) {
-  methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object);
-
-  var index = -1,
-      length = methodNames.length;
-
-  while (++index < length) {
-    var key = methodNames[index];
-    object[key] = createWrapper(object[key], BIND_FLAG, object);
-  }
-  return object;
-});
-
-module.exports = bindAll;
diff --git a/node_modules/lodash/function/bindKey.js b/node_modules/lodash/function/bindKey.js
deleted file mode 100644
index b787fe7..0000000
--- a/node_modules/lodash/function/bindKey.js
+++ /dev/null
@@ -1,66 +0,0 @@
-var createWrapper = require('../internal/createWrapper'),
-    replaceHolders = require('../internal/replaceHolders'),
-    restParam = require('./restParam');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var BIND_FLAG = 1,
-    BIND_KEY_FLAG = 2,
-    PARTIAL_FLAG = 32;
-
-/**
- * Creates a function that invokes the method at `object[key]` and prepends
- * any additional `_.bindKey` arguments to those provided to the bound function.
- *
- * This method differs from `_.bind` by allowing bound functions to reference
- * methods that may be redefined or don't yet exist.
- * See [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
- * for more details.
- *
- * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
- * builds, may be used as a placeholder for partially applied arguments.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Object} object The object the method belongs to.
- * @param {string} key The key of the method.
- * @param {...*} [partials] The arguments to be partially applied.
- * @returns {Function} Returns the new bound function.
- * @example
- *
- * var object = {
- *   'user': 'fred',
- *   'greet': function(greeting, punctuation) {
- *     return greeting + ' ' + this.user + punctuation;
- *   }
- * };
- *
- * var bound = _.bindKey(object, 'greet', 'hi');
- * bound('!');
- * // => 'hi fred!'
- *
- * object.greet = function(greeting, punctuation) {
- *   return greeting + 'ya ' + this.user + punctuation;
- * };
- *
- * bound('!');
- * // => 'hiya fred!'
- *
- * // using placeholders
- * var bound = _.bindKey(object, 'greet', _, '!');
- * bound('hi');
- * // => 'hiya fred!'
- */
-var bindKey = restParam(function(object, key, partials) {
-  var bitmask = BIND_FLAG | BIND_KEY_FLAG;
-  if (partials.length) {
-    var holders = replaceHolders(partials, bindKey.placeholder);
-    bitmask |= PARTIAL_FLAG;
-  }
-  return createWrapper(key, bitmask, object, partials, holders);
-});
-
-// Assign default placeholders.
-bindKey.placeholder = {};
-
-module.exports = bindKey;
diff --git a/node_modules/lodash/function/compose.js b/node_modules/lodash/function/compose.js
deleted file mode 100644
index 1954e94..0000000
--- a/node_modules/lodash/function/compose.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./flowRight');
diff --git a/node_modules/lodash/function/curry.js b/node_modules/lodash/function/curry.js
deleted file mode 100644
index b7db3fd..0000000
--- a/node_modules/lodash/function/curry.js
+++ /dev/null
@@ -1,51 +0,0 @@
-var createCurry = require('../internal/createCurry');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var CURRY_FLAG = 8;
-
-/**
- * Creates a function that accepts one or more arguments of `func` that when
- * called either invokes `func` returning its result, if all `func` arguments
- * have been provided, or returns a function that accepts one or more of the
- * remaining `func` arguments, and so on. The arity of `func` may be specified
- * if `func.length` is not sufficient.
- *
- * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
- * may be used as a placeholder for provided arguments.
- *
- * **Note:** This method does not set the "length" property of curried functions.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to curry.
- * @param {number} [arity=func.length] The arity of `func`.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Function} Returns the new curried function.
- * @example
- *
- * var abc = function(a, b, c) {
- *   return [a, b, c];
- * };
- *
- * var curried = _.curry(abc);
- *
- * curried(1)(2)(3);
- * // => [1, 2, 3]
- *
- * curried(1, 2)(3);
- * // => [1, 2, 3]
- *
- * curried(1, 2, 3);
- * // => [1, 2, 3]
- *
- * // using placeholders
- * curried(1)(_, 3)(2);
- * // => [1, 2, 3]
- */
-var curry = createCurry(CURRY_FLAG);
-
-// Assign default placeholders.
-curry.placeholder = {};
-
-module.exports = curry;
diff --git a/node_modules/lodash/function/curryRight.js b/node_modules/lodash/function/curryRight.js
deleted file mode 100644
index 11c5403..0000000
--- a/node_modules/lodash/function/curryRight.js
+++ /dev/null
@@ -1,48 +0,0 @@
-var createCurry = require('../internal/createCurry');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var CURRY_RIGHT_FLAG = 16;
-
-/**
- * This method is like `_.curry` except that arguments are applied to `func`
- * in the manner of `_.partialRight` instead of `_.partial`.
- *
- * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
- * builds, may be used as a placeholder for provided arguments.
- *
- * **Note:** This method does not set the "length" property of curried functions.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to curry.
- * @param {number} [arity=func.length] The arity of `func`.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Function} Returns the new curried function.
- * @example
- *
- * var abc = function(a, b, c) {
- *   return [a, b, c];
- * };
- *
- * var curried = _.curryRight(abc);
- *
- * curried(3)(2)(1);
- * // => [1, 2, 3]
- *
- * curried(2, 3)(1);
- * // => [1, 2, 3]
- *
- * curried(1, 2, 3);
- * // => [1, 2, 3]
- *
- * // using placeholders
- * curried(3)(1, _)(2);
- * // => [1, 2, 3]
- */
-var curryRight = createCurry(CURRY_RIGHT_FLAG);
-
-// Assign default placeholders.
-curryRight.placeholder = {};
-
-module.exports = curryRight;
diff --git a/node_modules/lodash/function/debounce.js b/node_modules/lodash/function/debounce.js
deleted file mode 100644
index 163af90..0000000
--- a/node_modules/lodash/function/debounce.js
+++ /dev/null
@@ -1,181 +0,0 @@
-var isObject = require('../lang/isObject'),
-    now = require('../date/now');
-
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
-
-/**
- * Creates a debounced function that delays invoking `func` until after `wait`
- * milliseconds have elapsed since the last time the debounced function was
- * invoked. The debounced function comes with a `cancel` method to cancel
- * delayed invocations. Provide an options object to indicate that `func`
- * should be invoked on the leading and/or trailing edge of the `wait` timeout.
- * Subsequent calls to the debounced function return the result of the last
- * `func` invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
- * on the trailing edge of the timeout only if the the debounced function is
- * invoked more than once during the `wait` timeout.
- *
- * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
- * for details over the differences between `_.debounce` and `_.throttle`.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to debounce.
- * @param {number} [wait=0] The number of milliseconds to delay.
- * @param {Object} [options] The options object.
- * @param {boolean} [options.leading=false] Specify invoking on the leading
- *  edge of the timeout.
- * @param {number} [options.maxWait] The maximum time `func` is allowed to be
- *  delayed before it's invoked.
- * @param {boolean} [options.trailing=true] Specify invoking on the trailing
- *  edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * // avoid costly calculations while the window size is in flux
- * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
- *
- * // invoke `sendMail` when the click event is fired, debouncing subsequent calls
- * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
- *   'leading': true,
- *   'trailing': false
- * }));
- *
- * // ensure `batchLog` is invoked once after 1 second of debounced calls
- * var source = new EventSource('/stream');
- * jQuery(source).on('message', _.debounce(batchLog, 250, {
- *   'maxWait': 1000
- * }));
- *
- * // cancel a debounced call
- * var todoChanges = _.debounce(batchLog, 1000);
- * Object.observe(models.todo, todoChanges);
- *
- * Object.observe(models, function(changes) {
- *   if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {
- *     todoChanges.cancel();
- *   }
- * }, ['delete']);
- *
- * // ...at some point `models.todo` is changed
- * models.todo.completed = true;
- *
- * // ...before 1 second has passed `models.todo` is deleted
- * // which cancels the debounced `todoChanges` call
- * delete models.todo;
- */
-function debounce(func, wait, options) {
-  var args,
-      maxTimeoutId,
-      result,
-      stamp,
-      thisArg,
-      timeoutId,
-      trailingCall,
-      lastCalled = 0,
-      maxWait = false,
-      trailing = true;
-
-  if (typeof func != 'function') {
-    throw new TypeError(FUNC_ERROR_TEXT);
-  }
-  wait = wait < 0 ? 0 : (+wait || 0);
-  if (options === true) {
-    var leading = true;
-    trailing = false;
-  } else if (isObject(options)) {
-    leading = !!options.leading;
-    maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);
-    trailing = 'trailing' in options ? !!options.trailing : trailing;
-  }
-
-  function cancel() {
-    if (timeoutId) {
-      clearTimeout(timeoutId);
-    }
-    if (maxTimeoutId) {
-      clearTimeout(maxTimeoutId);
-    }
-    lastCalled = 0;
-    maxTimeoutId = timeoutId = trailingCall = undefined;
-  }
-
-  function complete(isCalled, id) {
-    if (id) {
-      clearTimeout(id);
-    }
-    maxTimeoutId = timeoutId = trailingCall = undefined;
-    if (isCalled) {
-      lastCalled = now();
-      result = func.apply(thisArg, args);
-      if (!timeoutId && !maxTimeoutId) {
-        args = thisArg = undefined;
-      }
-    }
-  }
-
-  function delayed() {
-    var remaining = wait - (now() - stamp);
-    if (remaining <= 0 || remaining > wait) {
-      complete(trailingCall, maxTimeoutId);
-    } else {
-      timeoutId = setTimeout(delayed, remaining);
-    }
-  }
-
-  function maxDelayed() {
-    complete(trailing, timeoutId);
-  }
-
-  function debounced() {
-    args = arguments;
-    stamp = now();
-    thisArg = this;
-    trailingCall = trailing && (timeoutId || !leading);
-
-    if (maxWait === false) {
-      var leadingCall = leading && !timeoutId;
-    } else {
-      if (!maxTimeoutId && !leading) {
-        lastCalled = stamp;
-      }
-      var remaining = maxWait - (stamp - lastCalled),
-          isCalled = remaining <= 0 || remaining > maxWait;
-
-      if (isCalled) {
-        if (maxTimeoutId) {
-          maxTimeoutId = clearTimeout(maxTimeoutId);
-        }
-        lastCalled = stamp;
-        result = func.apply(thisArg, args);
-      }
-      else if (!maxTimeoutId) {
-        maxTimeoutId = setTimeout(maxDelayed, remaining);
-      }
-    }
-    if (isCalled && timeoutId) {
-      timeoutId = clearTimeout(timeoutId);
-    }
-    else if (!timeoutId && wait !== maxWait) {
-      timeoutId = setTimeout(delayed, wait);
-    }
-    if (leadingCall) {
-      isCalled = true;
-      result = func.apply(thisArg, args);
-    }
-    if (isCalled && !timeoutId && !maxTimeoutId) {
-      args = thisArg = undefined;
-    }
-    return result;
-  }
-  debounced.cancel = cancel;
-  return debounced;
-}
-
-module.exports = debounce;
diff --git a/node_modules/lodash/function/defer.js b/node_modules/lodash/function/defer.js
deleted file mode 100644
index 3accbf9..0000000
--- a/node_modules/lodash/function/defer.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var baseDelay = require('../internal/baseDelay'),
-    restParam = require('./restParam');
-
-/**
- * Defers invoking the `func` until the current call stack has cleared. Any
- * additional arguments are provided to `func` when it's invoked.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to defer.
- * @param {...*} [args] The arguments to invoke the function with.
- * @returns {number} Returns the timer id.
- * @example
- *
- * _.defer(function(text) {
- *   console.log(text);
- * }, 'deferred');
- * // logs 'deferred' after one or more milliseconds
- */
-var defer = restParam(function(func, args) {
-  return baseDelay(func, 1, args);
-});
-
-module.exports = defer;
diff --git a/node_modules/lodash/function/delay.js b/node_modules/lodash/function/delay.js
deleted file mode 100644
index d5eef27..0000000
--- a/node_modules/lodash/function/delay.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var baseDelay = require('../internal/baseDelay'),
-    restParam = require('./restParam');
-
-/**
- * Invokes `func` after `wait` milliseconds. Any additional arguments are
- * provided to `func` when it's invoked.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to delay.
- * @param {number} wait The number of milliseconds to delay invocation.
- * @param {...*} [args] The arguments to invoke the function with.
- * @returns {number} Returns the timer id.
- * @example
- *
- * _.delay(function(text) {
- *   console.log(text);
- * }, 1000, 'later');
- * // => logs 'later' after one second
- */
-var delay = restParam(function(func, wait, args) {
-  return baseDelay(func, wait, args);
-});
-
-module.exports = delay;
diff --git a/node_modules/lodash/function/flow.js b/node_modules/lodash/function/flow.js
deleted file mode 100644
index a435a3d..0000000
--- a/node_modules/lodash/function/flow.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var createFlow = require('../internal/createFlow');
-
-/**
- * Creates a function that returns the result of invoking the provided
- * functions with the `this` binding of the created function, where each
- * successive invocation is supplied the return value of the previous.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {...Function} [funcs] Functions to invoke.
- * @returns {Function} Returns the new function.
- * @example
- *
- * function square(n) {
- *   return n * n;
- * }
- *
- * var addSquare = _.flow(_.add, square);
- * addSquare(1, 2);
- * // => 9
- */
-var flow = createFlow();
-
-module.exports = flow;
diff --git a/node_modules/lodash/function/flowRight.js b/node_modules/lodash/function/flowRight.js
deleted file mode 100644
index 23b9d76..0000000
--- a/node_modules/lodash/function/flowRight.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var createFlow = require('../internal/createFlow');
-
-/**
- * This method is like `_.flow` except that it creates a function that
- * invokes the provided functions from right to left.
- *
- * @static
- * @memberOf _
- * @alias backflow, compose
- * @category Function
- * @param {...Function} [funcs] Functions to invoke.
- * @returns {Function} Returns the new function.
- * @example
- *
- * function square(n) {
- *   return n * n;
- * }
- *
- * var addSquare = _.flowRight(square, _.add);
- * addSquare(1, 2);
- * // => 9
- */
-var flowRight = createFlow(true);
-
-module.exports = flowRight;
diff --git a/node_modules/lodash/function/memoize.js b/node_modules/lodash/function/memoize.js
deleted file mode 100644
index f3b8d69..0000000
--- a/node_modules/lodash/function/memoize.js
+++ /dev/null
@@ -1,80 +0,0 @@
-var MapCache = require('../internal/MapCache');
-
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/**
- * Creates a function that memoizes the result of `func`. If `resolver` is
- * provided it determines the cache key for storing the result based on the
- * arguments provided to the memoized function. By default, the first argument
- * provided to the memoized function is coerced to a string and used as the
- * cache key. The `func` is invoked with the `this` binding of the memoized
- * function.
- *
- * **Note:** The cache is exposed as the `cache` property on the memoized
- * function. Its creation may be customized by replacing the `_.memoize.Cache`
- * constructor with one whose instances implement the [`Map`](http://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-prototype-object)
- * method interface of `get`, `has`, and `set`.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to have its output memoized.
- * @param {Function} [resolver] The function to resolve the cache key.
- * @returns {Function} Returns the new memoizing function.
- * @example
- *
- * var upperCase = _.memoize(function(string) {
- *   return string.toUpperCase();
- * });
- *
- * upperCase('fred');
- * // => 'FRED'
- *
- * // modifying the result cache
- * upperCase.cache.set('fred', 'BARNEY');
- * upperCase('fred');
- * // => 'BARNEY'
- *
- * // replacing `_.memoize.Cache`
- * var object = { 'user': 'fred' };
- * var other = { 'user': 'barney' };
- * var identity = _.memoize(_.identity);
- *
- * identity(object);
- * // => { 'user': 'fred' }
- * identity(other);
- * // => { 'user': 'fred' }
- *
- * _.memoize.Cache = WeakMap;
- * var identity = _.memoize(_.identity);
- *
- * identity(object);
- * // => { 'user': 'fred' }
- * identity(other);
- * // => { 'user': 'barney' }
- */
-function memoize(func, resolver) {
-  if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
-    throw new TypeError(FUNC_ERROR_TEXT);
-  }
-  var memoized = function() {
-    var args = arguments,
-        key = resolver ? resolver.apply(this, args) : args[0],
-        cache = memoized.cache;
-
-    if (cache.has(key)) {
-      return cache.get(key);
-    }
-    var result = func.apply(this, args);
-    memoized.cache = cache.set(key, result);
-    return result;
-  };
-  memoized.cache = new memoize.Cache;
-  return memoized;
-}
-
-// Assign cache to `_.memoize`.
-memoize.Cache = MapCache;
-
-module.exports = memoize;
diff --git a/node_modules/lodash/function/modArgs.js b/node_modules/lodash/function/modArgs.js
deleted file mode 100644
index 49b9b5e..0000000
--- a/node_modules/lodash/function/modArgs.js
+++ /dev/null
@@ -1,58 +0,0 @@
-var arrayEvery = require('../internal/arrayEvery'),
-    baseFlatten = require('../internal/baseFlatten'),
-    baseIsFunction = require('../internal/baseIsFunction'),
-    restParam = require('./restParam');
-
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMin = Math.min;
-
-/**
- * Creates a function that runs each argument through a corresponding
- * transform function.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to wrap.
- * @param {...(Function|Function[])} [transforms] The functions to transform
- * arguments, specified as individual functions or arrays of functions.
- * @returns {Function} Returns the new function.
- * @example
- *
- * function doubled(n) {
- *   return n * 2;
- * }
- *
- * function square(n) {
- *   return n * n;
- * }
- *
- * var modded = _.modArgs(function(x, y) {
- *   return [x, y];
- * }, square, doubled);
- *
- * modded(1, 2);
- * // => [1, 4]
- *
- * modded(5, 10);
- * // => [25, 20]
- */
-var modArgs = restParam(function(func, transforms) {
-  transforms = baseFlatten(transforms);
-  if (typeof func != 'function' || !arrayEvery(transforms, baseIsFunction)) {
-    throw new TypeError(FUNC_ERROR_TEXT);
-  }
-  var length = transforms.length;
-  return restParam(function(args) {
-    var index = nativeMin(args.length, length);
-    while (index--) {
-      args[index] = transforms[index](args[index]);
-    }
-    return func.apply(this, args);
-  });
-});
-
-module.exports = modArgs;
diff --git a/node_modules/lodash/function/negate.js b/node_modules/lodash/function/negate.js
deleted file mode 100644
index 8247939..0000000
--- a/node_modules/lodash/function/negate.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/**
- * Creates a function that negates the result of the predicate `func`. The
- * `func` predicate is invoked with the `this` binding and arguments of the
- * created function.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} predicate The predicate to negate.
- * @returns {Function} Returns the new function.
- * @example
- *
- * function isEven(n) {
- *   return n % 2 == 0;
- * }
- *
- * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
- * // => [1, 3, 5]
- */
-function negate(predicate) {
-  if (typeof predicate != 'function') {
-    throw new TypeError(FUNC_ERROR_TEXT);
-  }
-  return function() {
-    return !predicate.apply(this, arguments);
-  };
-}
-
-module.exports = negate;
diff --git a/node_modules/lodash/function/once.js b/node_modules/lodash/function/once.js
deleted file mode 100644
index 0b5bd85..0000000
--- a/node_modules/lodash/function/once.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var before = require('./before');
-
-/**
- * Creates a function that is restricted to invoking `func` once. Repeat calls
- * to the function return the value of the first call. The `func` is invoked
- * with the `this` binding and arguments of the created function.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to restrict.
- * @returns {Function} Returns the new restricted function.
- * @example
- *
- * var initialize = _.once(createApplication);
- * initialize();
- * initialize();
- * // `initialize` invokes `createApplication` once
- */
-function once(func) {
-  return before(2, func);
-}
-
-module.exports = once;
diff --git a/node_modules/lodash/function/partial.js b/node_modules/lodash/function/partial.js
deleted file mode 100644
index fb1d04f..0000000
--- a/node_modules/lodash/function/partial.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var createPartial = require('../internal/createPartial');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var PARTIAL_FLAG = 32;
-
-/**
- * Creates a function that invokes `func` with `partial` arguments prepended
- * to those provided to the new function. This method is like `_.bind` except
- * it does **not** alter the `this` binding.
- *
- * The `_.partial.placeholder` value, which defaults to `_` in monolithic
- * builds, may be used as a placeholder for partially applied arguments.
- *
- * **Note:** This method does not set the "length" property of partially
- * applied functions.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to partially apply arguments to.
- * @param {...*} [partials] The arguments to be partially applied.
- * @returns {Function} Returns the new partially applied function.
- * @example
- *
- * var greet = function(greeting, name) {
- *   return greeting + ' ' + name;
- * };
- *
- * var sayHelloTo = _.partial(greet, 'hello');
- * sayHelloTo('fred');
- * // => 'hello fred'
- *
- * // using placeholders
- * var greetFred = _.partial(greet, _, 'fred');
- * greetFred('hi');
- * // => 'hi fred'
- */
-var partial = createPartial(PARTIAL_FLAG);
-
-// Assign default placeholders.
-partial.placeholder = {};
-
-module.exports = partial;
diff --git a/node_modules/lodash/function/partialRight.js b/node_modules/lodash/function/partialRight.js
deleted file mode 100644
index 634e6a4..0000000
--- a/node_modules/lodash/function/partialRight.js
+++ /dev/null
@@ -1,42 +0,0 @@
-var createPartial = require('../internal/createPartial');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var PARTIAL_RIGHT_FLAG = 64;
-
-/**
- * This method is like `_.partial` except that partially applied arguments
- * are appended to those provided to the new function.
- *
- * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
- * builds, may be used as a placeholder for partially applied arguments.
- *
- * **Note:** This method does not set the "length" property of partially
- * applied functions.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to partially apply arguments to.
- * @param {...*} [partials] The arguments to be partially applied.
- * @returns {Function} Returns the new partially applied function.
- * @example
- *
- * var greet = function(greeting, name) {
- *   return greeting + ' ' + name;
- * };
- *
- * var greetFred = _.partialRight(greet, 'fred');
- * greetFred('hi');
- * // => 'hi fred'
- *
- * // using placeholders
- * var sayHelloTo = _.partialRight(greet, 'hello', _);
- * sayHelloTo('fred');
- * // => 'hello fred'
- */
-var partialRight = createPartial(PARTIAL_RIGHT_FLAG);
-
-// Assign default placeholders.
-partialRight.placeholder = {};
-
-module.exports = partialRight;
diff --git a/node_modules/lodash/function/rearg.js b/node_modules/lodash/function/rearg.js
deleted file mode 100644
index f2bd9c4..0000000
--- a/node_modules/lodash/function/rearg.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var baseFlatten = require('../internal/baseFlatten'),
-    createWrapper = require('../internal/createWrapper'),
-    restParam = require('./restParam');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var REARG_FLAG = 256;
-
-/**
- * Creates a function that invokes `func` with arguments arranged according
- * to the specified indexes where the argument value at the first index is
- * provided as the first argument, the argument value at the second index is
- * provided as the second argument, and so on.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to rearrange arguments for.
- * @param {...(number|number[])} indexes The arranged argument indexes,
- *  specified as individual indexes or arrays of indexes.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var rearged = _.rearg(function(a, b, c) {
- *   return [a, b, c];
- * }, 2, 0, 1);
- *
- * rearged('b', 'c', 'a')
- * // => ['a', 'b', 'c']
- *
- * var map = _.rearg(_.map, [1, 0]);
- * map(function(n) {
- *   return n * 3;
- * }, [1, 2, 3]);
- * // => [3, 6, 9]
- */
-var rearg = restParam(function(func, indexes) {
-  return createWrapper(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes));
-});
-
-module.exports = rearg;
diff --git a/node_modules/lodash/function/restParam.js b/node_modules/lodash/function/restParam.js
deleted file mode 100644
index 8852286..0000000
--- a/node_modules/lodash/function/restParam.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
-
-/**
- * Creates a function that invokes `func` with the `this` binding of the
- * created function and arguments from `start` and beyond provided as an array.
- *
- * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to apply a rest parameter to.
- * @param {number} [start=func.length-1] The start position of the rest parameter.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var say = _.restParam(function(what, names) {
- *   return what + ' ' + _.initial(names).join(', ') +
- *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
- * });
- *
- * say('hello', 'fred', 'barney', 'pebbles');
- * // => 'hello fred, barney, & pebbles'
- */
-function restParam(func, start) {
-  if (typeof func != 'function') {
-    throw new TypeError(FUNC_ERROR_TEXT);
-  }
-  start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);
-  return function() {
-    var args = arguments,
-        index = -1,
-        length = nativeMax(args.length - start, 0),
-        rest = Array(length);
-
-    while (++index < length) {
-      rest[index] = args[start + index];
-    }
-    switch (start) {
-      case 0: return func.call(this, rest);
-      case 1: return func.call(this, args[0], rest);
-      case 2: return func.call(this, args[0], args[1], rest);
-    }
-    var otherArgs = Array(start + 1);
-    index = -1;
-    while (++index < start) {
-      otherArgs[index] = args[index];
-    }
-    otherArgs[start] = rest;
-    return func.apply(this, otherArgs);
-  };
-}
-
-module.exports = restParam;
diff --git a/node_modules/lodash/function/spread.js b/node_modules/lodash/function/spread.js
deleted file mode 100644
index 780f504..0000000
--- a/node_modules/lodash/function/spread.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/**
- * Creates a function that invokes `func` with the `this` binding of the created
- * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).
- *
- * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/Web/JavaScript/Reference/Operators/Spread_operator).
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to spread arguments over.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var say = _.spread(function(who, what) {
- *   return who + ' says ' + what;
- * });
- *
- * say(['fred', 'hello']);
- * // => 'fred says hello'
- *
- * // with a Promise
- * var numbers = Promise.all([
- *   Promise.resolve(40),
- *   Promise.resolve(36)
- * ]);
- *
- * numbers.then(_.spread(function(x, y) {
- *   return x + y;
- * }));
- * // => a Promise of 76
- */
-function spread(func) {
-  if (typeof func != 'function') {
-    throw new TypeError(FUNC_ERROR_TEXT);
-  }
-  return function(array) {
-    return func.apply(this, array);
-  };
-}
-
-module.exports = spread;
diff --git a/node_modules/lodash/function/throttle.js b/node_modules/lodash/function/throttle.js
deleted file mode 100644
index 1dd00ea..0000000
--- a/node_modules/lodash/function/throttle.js
+++ /dev/null
@@ -1,62 +0,0 @@
-var debounce = require('./debounce'),
-    isObject = require('../lang/isObject');
-
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/**
- * Creates a throttled function that only invokes `func` at most once per
- * every `wait` milliseconds. The throttled function comes with a `cancel`
- * method to cancel delayed invocations. Provide an options object to indicate
- * that `func` should be invoked on the leading and/or trailing edge of the
- * `wait` timeout. Subsequent calls to the throttled function return the
- * result of the last `func` call.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
- * on the trailing edge of the timeout only if the the throttled function is
- * invoked more than once during the `wait` timeout.
- *
- * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
- * for details over the differences between `_.throttle` and `_.debounce`.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to throttle.
- * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
- * @param {Object} [options] The options object.
- * @param {boolean} [options.leading=true] Specify invoking on the leading
- *  edge of the timeout.
- * @param {boolean} [options.trailing=true] Specify invoking on the trailing
- *  edge of the timeout.
- * @returns {Function} Returns the new throttled function.
- * @example
- *
- * // avoid excessively updating the position while scrolling
- * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
- *
- * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes
- * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
- *   'trailing': false
- * }));
- *
- * // cancel a trailing throttled call
- * jQuery(window).on('popstate', throttled.cancel);
- */
-function throttle(func, wait, options) {
-  var leading = true,
-      trailing = true;
-
-  if (typeof func != 'function') {
-    throw new TypeError(FUNC_ERROR_TEXT);
-  }
-  if (options === false) {
-    leading = false;
-  } else if (isObject(options)) {
-    leading = 'leading' in options ? !!options.leading : leading;
-    trailing = 'trailing' in options ? !!options.trailing : trailing;
-  }
-  return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });
-}
-
-module.exports = throttle;
diff --git a/node_modules/lodash/function/wrap.js b/node_modules/lodash/function/wrap.js
deleted file mode 100644
index 6a33c5e..0000000
--- a/node_modules/lodash/function/wrap.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var createWrapper = require('../internal/createWrapper'),
-    identity = require('../utility/identity');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var PARTIAL_FLAG = 32;
-
-/**
- * Creates a function that provides `value` to the wrapper function as its
- * first argument. Any additional arguments provided to the function are
- * appended to those provided to the wrapper function. The wrapper is invoked
- * with the `this` binding of the created function.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {*} value The value to wrap.
- * @param {Function} wrapper The wrapper function.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var p = _.wrap(_.escape, function(func, text) {
- *   return '<p>' + func(text) + '</p>';
- * });
- *
- * p('fred, barney, & pebbles');
- * // => '<p>fred, barney, &amp; pebbles</p>'
- */
-function wrap(value, wrapper) {
-  wrapper = wrapper == null ? identity : wrapper;
-  return createWrapper(wrapper, PARTIAL_FLAG, undefined, [value], []);
-}
-
-module.exports = wrap;
diff --git a/node_modules/lodash/index.js b/node_modules/lodash/index.js
deleted file mode 100644
index 5f17319..0000000
--- a/node_modules/lodash/index.js
+++ /dev/null
@@ -1,12351 +0,0 @@
-/**
- * @license
- * lodash 3.10.1 (Custom Build) <https://lodash.com/>
- * Build: `lodash modern -d -o ./index.js`
- * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license <https://lodash.com/license>
- */
-;(function() {
-
-  /** Used as a safe reference for `undefined` in pre-ES5 environments. */
-  var undefined;
-
-  /** Used as the semantic version number. */
-  var VERSION = '3.10.1';
-
-  /** Used to compose bitmasks for wrapper metadata. */
-  var BIND_FLAG = 1,
-      BIND_KEY_FLAG = 2,
-      CURRY_BOUND_FLAG = 4,
-      CURRY_FLAG = 8,
-      CURRY_RIGHT_FLAG = 16,
-      PARTIAL_FLAG = 32,
-      PARTIAL_RIGHT_FLAG = 64,
-      ARY_FLAG = 128,
-      REARG_FLAG = 256;
-
-  /** Used as default options for `_.trunc`. */
-  var DEFAULT_TRUNC_LENGTH = 30,
-      DEFAULT_TRUNC_OMISSION = '...';
-
-  /** Used to detect when a function becomes hot. */
-  var HOT_COUNT = 150,
-      HOT_SPAN = 16;
-
-  /** Used as the size to enable large array optimizations. */
-  var LARGE_ARRAY_SIZE = 200;
-
-  /** Used to indicate the type of lazy iteratees. */
-  var LAZY_FILTER_FLAG = 1,
-      LAZY_MAP_FLAG = 2;
-
-  /** Used as the `TypeError` message for "Functions" methods. */
-  var FUNC_ERROR_TEXT = 'Expected a function';
-
-  /** Used as the internal argument placeholder. */
-  var PLACEHOLDER = '__lodash_placeholder__';
-
-  /** `Object#toString` result references. */
-  var argsTag = '[object Arguments]',
-      arrayTag = '[object Array]',
-      boolTag = '[object Boolean]',
-      dateTag = '[object Date]',
-      errorTag = '[object Error]',
-      funcTag = '[object Function]',
-      mapTag = '[object Map]',
-      numberTag = '[object Number]',
-      objectTag = '[object Object]',
-      regexpTag = '[object RegExp]',
-      setTag = '[object Set]',
-      stringTag = '[object String]',
-      weakMapTag = '[object WeakMap]';
-
-  var arrayBufferTag = '[object ArrayBuffer]',
-      float32Tag = '[object Float32Array]',
-      float64Tag = '[object Float64Array]',
-      int8Tag = '[object Int8Array]',
-      int16Tag = '[object Int16Array]',
-      int32Tag = '[object Int32Array]',
-      uint8Tag = '[object Uint8Array]',
-      uint8ClampedTag = '[object Uint8ClampedArray]',
-      uint16Tag = '[object Uint16Array]',
-      uint32Tag = '[object Uint32Array]';
-
-  /** Used to match empty string literals in compiled template source. */
-  var reEmptyStringLeading = /\b__p \+= '';/g,
-      reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
-      reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
-
-  /** Used to match HTML entities and HTML characters. */
-  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39|#96);/g,
-      reUnescapedHtml = /[&<>"'`]/g,
-      reHasEscapedHtml = RegExp(reEscapedHtml.source),
-      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
-
-  /** Used to match template delimiters. */
-  var reEscape = /<%-([\s\S]+?)%>/g,
-      reEvaluate = /<%([\s\S]+?)%>/g,
-      reInterpolate = /<%=([\s\S]+?)%>/g;
-
-  /** Used to match property names within property paths. */
-  var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,
-      reIsPlainProp = /^\w*$/,
-      rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g;
-
-  /**
-   * Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns)
-   * and those outlined by [`EscapeRegExpPattern`](http://ecma-international.org/ecma-262/6.0/#sec-escaperegexppattern).
-   */
-  var reRegExpChars = /^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g,
-      reHasRegExpChars = RegExp(reRegExpChars.source);
-
-  /** Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). */
-  var reComboMark = /[\u0300-\u036f\ufe20-\ufe23]/g;
-
-  /** Used to match backslashes in property paths. */
-  var reEscapeChar = /\\(\\)?/g;
-
-  /** Used to match [ES template delimiters](http://ecma-international.org/ecma-262/6.0/#sec-template-literal-lexical-components). */
-  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
-
-  /** Used to match `RegExp` flags from their coerced string values. */
-  var reFlags = /\w*$/;
-
-  /** Used to detect hexadecimal string values. */
-  var reHasHexPrefix = /^0[xX]/;
-
-  /** Used to detect host constructors (Safari > 5). */
-  var reIsHostCtor = /^\[object .+?Constructor\]$/;
-
-  /** Used to detect unsigned integer values. */
-  var reIsUint = /^\d+$/;
-
-  /** Used to match latin-1 supplementary letters (excluding mathematical operators). */
-  var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g;
-
-  /** Used to ensure capturing order of template delimiters. */
-  var reNoMatch = /($^)/;
-
-  /** Used to match unescaped characters in compiled string literals. */
-  var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
-
-  /** Used to match words to create compound words. */
-  var reWords = (function() {
-    var upper = '[A-Z\\xc0-\\xd6\\xd8-\\xde]',
-        lower = '[a-z\\xdf-\\xf6\\xf8-\\xff]+';
-
-    return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');
-  }());
-
-  /** Used to assign default `context` object properties. */
-  var contextProps = [
-    'Array', 'ArrayBuffer', 'Date', 'Error', 'Float32Array', 'Float64Array',
-    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Math', 'Number',
-    'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'isFinite',
-    'parseFloat', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array',
-    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap'
-  ];
-
-  /** Used to make template sourceURLs easier to identify. */
-  var templateCounter = -1;
-
-  /** Used to identify `toStringTag` values of typed arrays. */
-  var typedArrayTags = {};
-  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
-  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
-  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
-  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
-  typedArrayTags[uint32Tag] = true;
-  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
-  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
-  typedArrayTags[dateTag] = typedArrayTags[errorTag] =
-  typedArrayTags[funcTag] = typedArrayTags[mapTag] =
-  typedArrayTags[numberTag] = typedArrayTags[objectTag] =
-  typedArrayTags[regexpTag] = typedArrayTags[setTag] =
-  typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
-
-  /** Used to identify `toStringTag` values supported by `_.clone`. */
-  var cloneableTags = {};
-  cloneableTags[argsTag] = cloneableTags[arrayTag] =
-  cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =
-  cloneableTags[dateTag] = cloneableTags[float32Tag] =
-  cloneableTags[float64Tag] = cloneableTags[int8Tag] =
-  cloneableTags[int16Tag] = cloneableTags[int32Tag] =
-  cloneableTags[numberTag] = cloneableTags[objectTag] =
-  cloneableTags[regexpTag] = cloneableTags[stringTag] =
-  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
-  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
-  cloneableTags[errorTag] = cloneableTags[funcTag] =
-  cloneableTags[mapTag] = cloneableTags[setTag] =
-  cloneableTags[weakMapTag] = false;
-
-  /** Used to map latin-1 supplementary letters to basic latin letters. */
-  var deburredLetters = {
-    '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
-    '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
-    '\xc7': 'C',  '\xe7': 'c',
-    '\xd0': 'D',  '\xf0': 'd',
-    '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
-    '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
-    '\xcC': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
-    '\xeC': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
-    '\xd1': 'N',  '\xf1': 'n',
-    '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
-    '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
-    '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
-    '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
-    '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
-    '\xc6': 'Ae', '\xe6': 'ae',
-    '\xde': 'Th', '\xfe': 'th',
-    '\xdf': 'ss'
-  };
-
-  /** Used to map characters to HTML entities. */
-  var htmlEscapes = {
-    '&': '&amp;',
-    '<': '&lt;',
-    '>': '&gt;',
-    '"': '&quot;',
-    "'": '&#39;',
-    '`': '&#96;'
-  };
-
-  /** Used to map HTML entities to characters. */
-  var htmlUnescapes = {
-    '&amp;': '&',
-    '&lt;': '<',
-    '&gt;': '>',
-    '&quot;': '"',
-    '&#39;': "'",
-    '&#96;': '`'
-  };
-
-  /** Used to determine if values are of the language type `Object`. */
-  var objectTypes = {
-    'function': true,
-    'object': true
-  };
-
-  /** Used to escape characters for inclusion in compiled regexes. */
-  var regexpEscapes = {
-    '0': 'x30', '1': 'x31', '2': 'x32', '3': 'x33', '4': 'x34',
-    '5': 'x35', '6': 'x36', '7': 'x37', '8': 'x38', '9': 'x39',
-    'A': 'x41', 'B': 'x42', 'C': 'x43', 'D': 'x44', 'E': 'x45', 'F': 'x46',
-    'a': 'x61', 'b': 'x62', 'c': 'x63', 'd': 'x64', 'e': 'x65', 'f': 'x66',
-    'n': 'x6e', 'r': 'x72', 't': 'x74', 'u': 'x75', 'v': 'x76', 'x': 'x78'
-  };
-
-  /** Used to escape characters for inclusion in compiled string literals. */
-  var stringEscapes = {
-    '\\': '\\',
-    "'": "'",
-    '\n': 'n',
-    '\r': 'r',
-    '\u2028': 'u2028',
-    '\u2029': 'u2029'
-  };
-
-  /** Detect free variable `exports`. */
-  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
-
-  /** Detect free variable `module`. */
-  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
-
-  /** Detect free variable `global` from Node.js. */
-  var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global;
-
-  /** Detect free variable `self`. */
-  var freeSelf = objectTypes[typeof self] && self && self.Object && self;
-
-  /** Detect free variable `window`. */
-  var freeWindow = objectTypes[typeof window] && window && window.Object && window;
-
-  /** Detect the popular CommonJS extension `module.exports`. */
-  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;
-
-  /**
-   * Used as a reference to the global object.
-   *
-   * The `this` value is used if it's the global object to avoid Greasemonkey's
-   * restricted `window` object, otherwise the `window` object is used.
-   */
-  var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * The base implementation of `compareAscending` which compares values and
-   * sorts them in ascending order without guaranteeing a stable sort.
-   *
-   * @private
-   * @param {*} value The value to compare.
-   * @param {*} other The other value to compare.
-   * @returns {number} Returns the sort order indicator for `value`.
-   */
-  function baseCompareAscending(value, other) {
-    if (value !== other) {
-      var valIsNull = value === null,
-          valIsUndef = value === undefined,
-          valIsReflexive = value === value;
-
-      var othIsNull = other === null,
-          othIsUndef = other === undefined,
-          othIsReflexive = other === other;
-
-      if ((value > other && !othIsNull) || !valIsReflexive ||
-          (valIsNull && !othIsUndef && othIsReflexive) ||
-          (valIsUndef && othIsReflexive)) {
-        return 1;
-      }
-      if ((value < other && !valIsNull) || !othIsReflexive ||
-          (othIsNull && !valIsUndef && valIsReflexive) ||
-          (othIsUndef && valIsReflexive)) {
-        return -1;
-      }
-    }
-    return 0;
-  }
-
-  /**
-   * The base implementation of `_.findIndex` and `_.findLastIndex` without
-   * support for callback shorthands and `this` binding.
-   *
-   * @private
-   * @param {Array} array The array to search.
-   * @param {Function} predicate The function invoked per iteration.
-   * @param {boolean} [fromRight] Specify iterating from right to left.
-   * @returns {number} Returns the index of the matched value, else `-1`.
-   */
-  function baseFindIndex(array, predicate, fromRight) {
-    var length = array.length,
-        index = fromRight ? length : -1;
-
-    while ((fromRight ? index-- : ++index < length)) {
-      if (predicate(array[index], index, array)) {
-        return index;
-      }
-    }
-    return -1;
-  }
-
-  /**
-   * The base implementation of `_.indexOf` without support for binary searches.
-   *
-   * @private
-   * @param {Array} array The array to search.
-   * @param {*} value The value to search for.
-   * @param {number} fromIndex The index to search from.
-   * @returns {number} Returns the index of the matched value, else `-1`.
-   */
-  function baseIndexOf(array, value, fromIndex) {
-    if (value !== value) {
-      return indexOfNaN(array, fromIndex);
-    }
-    var index = fromIndex - 1,
-        length = array.length;
-
-    while (++index < length) {
-      if (array[index] === value) {
-        return index;
-      }
-    }
-    return -1;
-  }
-
-  /**
-   * The base implementation of `_.isFunction` without support for environments
-   * with incorrect `typeof` results.
-   *
-   * @private
-   * @param {*} value The value to check.
-   * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
-   */
-  function baseIsFunction(value) {
-    // Avoid a Chakra JIT bug in compatibility modes of IE 11.
-    // See https://github.com/jashkenas/underscore/issues/1621 for more details.
-    return typeof value == 'function' || false;
-  }
-
-  /**
-   * Converts `value` to a string if it's not one. An empty string is returned
-   * for `null` or `undefined` values.
-   *
-   * @private
-   * @param {*} value The value to process.
-   * @returns {string} Returns the string.
-   */
-  function baseToString(value) {
-    return value == null ? '' : (value + '');
-  }
-
-  /**
-   * Used by `_.trim` and `_.trimLeft` to get the index of the first character
-   * of `string` that is not found in `chars`.
-   *
-   * @private
-   * @param {string} string The string to inspect.
-   * @param {string} chars The characters to find.
-   * @returns {number} Returns the index of the first character not found in `chars`.
-   */
-  function charsLeftIndex(string, chars) {
-    var index = -1,
-        length = string.length;
-
-    while (++index < length && chars.indexOf(string.charAt(index)) > -1) {}
-    return index;
-  }
-
-  /**
-   * Used by `_.trim` and `_.trimRight` to get the index of the last character
-   * of `string` that is not found in `chars`.
-   *
-   * @private
-   * @param {string} string The string to inspect.
-   * @param {string} chars The characters to find.
-   * @returns {number} Returns the index of the last character not found in `chars`.
-   */
-  function charsRightIndex(string, chars) {
-    var index = string.length;
-
-    while (index-- && chars.indexOf(string.charAt(index)) > -1) {}
-    return index;
-  }
-
-  /**
-   * Used by `_.sortBy` to compare transformed elements of a collection and stable
-   * sort them in ascending order.
-   *
-   * @private
-   * @param {Object} object The object to compare.
-   * @param {Object} other The other object to compare.
-   * @returns {number} Returns the sort order indicator for `object`.
-   */
-  function compareAscending(object, other) {
-    return baseCompareAscending(object.criteria, other.criteria) || (object.index - other.index);
-  }
-
-  /**
-   * Used by `_.sortByOrder` to compare multiple properties of a value to another
-   * and stable sort them.
-   *
-   * If `orders` is unspecified, all valuess are sorted in ascending order. Otherwise,
-   * a value is sorted in ascending order if its corresponding order is "asc", and
-   * descending if "desc".
-   *
-   * @private
-   * @param {Object} object The object to compare.
-   * @param {Object} other The other object to compare.
-   * @param {boolean[]} orders The order to sort by for each property.
-   * @returns {number} Returns the sort order indicator for `object`.
-   */
-  function compareMultiple(object, other, orders) {
-    var index = -1,
-        objCriteria = object.criteria,
-        othCriteria = other.criteria,
-        length = objCriteria.length,
-        ordersLength = orders.length;
-
-    while (++index < length) {
-      var result = baseCompareAscending(objCriteria[index], othCriteria[index]);
-      if (result) {
-        if (index >= ordersLength) {
-          return result;
-        }
-        var order = orders[index];
-        return result * ((order === 'asc' || order === true) ? 1 : -1);
-      }
-    }
-    // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
-    // that causes it, under certain circumstances, to provide the same value for
-    // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
-    // for more details.
-    //
-    // This also ensures a stable sort in V8 and other engines.
-    // See https://code.google.com/p/v8/issues/detail?id=90 for more details.
-    return object.index - other.index;
-  }
-
-  /**
-   * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.
-   *
-   * @private
-   * @param {string} letter The matched letter to deburr.
-   * @returns {string} Returns the deburred letter.
-   */
-  function deburrLetter(letter) {
-    return deburredLetters[letter];
-  }
-
-  /**
-   * Used by `_.escape` to convert characters to HTML entities.
-   *
-   * @private
-   * @param {string} chr The matched character to escape.
-   * @returns {string} Returns the escaped character.
-   */
-  function escapeHtmlChar(chr) {
-    return htmlEscapes[chr];
-  }
-
-  /**
-   * Used by `_.escapeRegExp` to escape characters for inclusion in compiled regexes.
-   *
-   * @private
-   * @param {string} chr The matched character to escape.
-   * @param {string} leadingChar The capture group for a leading character.
-   * @param {string} whitespaceChar The capture group for a whitespace character.
-   * @returns {string} Returns the escaped character.
-   */
-  function escapeRegExpChar(chr, leadingChar, whitespaceChar) {
-    if (leadingChar) {
-      chr = regexpEscapes[chr];
-    } else if (whitespaceChar) {
-      chr = stringEscapes[chr];
-    }
-    return '\\' + chr;
-  }
-
-  /**
-   * Used by `_.template` to escape characters for inclusion in compiled string literals.
-   *
-   * @private
-   * @param {string} chr The matched character to escape.
-   * @returns {string} Returns the escaped character.
-   */
-  function escapeStringChar(chr) {
-    return '\\' + stringEscapes[chr];
-  }
-
-  /**
-   * Gets the index at which the first occurrence of `NaN` is found in `array`.
-   *
-   * @private
-   * @param {Array} array The array to search.
-   * @param {number} fromIndex The index to search from.
-   * @param {boolean} [fromRight] Specify iterating from right to left.
-   * @returns {number} Returns the index of the matched `NaN`, else `-1`.
-   */
-  function indexOfNaN(array, fromIndex, fromRight) {
-    var length = array.length,
-        index = fromIndex + (fromRight ? 0 : -1);
-
-    while ((fromRight ? index-- : ++index < length)) {
-      var other = array[index];
-      if (other !== other) {
-        return index;
-      }
-    }
-    return -1;
-  }
-
-  /**
-   * Checks if `value` is object-like.
-   *
-   * @private
-   * @param {*} value The value to check.
-   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
-   */
-  function isObjectLike(value) {
-    return !!value && typeof value == 'object';
-  }
-
-  /**
-   * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a
-   * character code is whitespace.
-   *
-   * @private
-   * @param {number} charCode The character code to inspect.
-   * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`.
-   */
-  function isSpace(charCode) {
-    return ((charCode <= 160 && (charCode >= 9 && charCode <= 13) || charCode == 32 || charCode == 160) || charCode == 5760 || charCode == 6158 ||
-      (charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279)));
-  }
-
-  /**
-   * Replaces all `placeholder` elements in `array` with an internal placeholder
-   * and returns an array of their indexes.
-   *
-   * @private
-   * @param {Array} array The array to modify.
-   * @param {*} placeholder The placeholder to replace.
-   * @returns {Array} Returns the new array of placeholder indexes.
-   */
-  function replaceHolders(array, placeholder) {
-    var index = -1,
-        length = array.length,
-        resIndex = -1,
-        result = [];
-
-    while (++index < length) {
-      if (array[index] === placeholder) {
-        array[index] = PLACEHOLDER;
-        result[++resIndex] = index;
-      }
-    }
-    return result;
-  }
-
-  /**
-   * An implementation of `_.uniq` optimized for sorted arrays without support
-   * for callback shorthands and `this` binding.
-   *
-   * @private
-   * @param {Array} array The array to inspect.
-   * @param {Function} [iteratee] The function invoked per iteration.
-   * @returns {Array} Returns the new duplicate-value-free array.
-   */
-  function sortedUniq(array, iteratee) {
-    var seen,
-        index = -1,
-        length = array.length,
-        resIndex = -1,
-        result = [];
-
-    while (++index < length) {
-      var value = array[index],
-          computed = iteratee ? iteratee(value, index, array) : value;
-
-      if (!index || seen !== computed) {
-        seen = computed;
-        result[++resIndex] = value;
-      }
-    }
-    return result;
-  }
-
-  /**
-   * Used by `_.trim` and `_.trimLeft` to get the index of the first non-whitespace
-   * character of `string`.
-   *
-   * @private
-   * @param {string} string The string to inspect.
-   * @returns {number} Returns the index of the first non-whitespace character.
-   */
-  function trimmedLeftIndex(string) {
-    var index = -1,
-        length = string.length;
-
-    while (++index < length && isSpace(string.charCodeAt(index))) {}
-    return index;
-  }
-
-  /**
-   * Used by `_.trim` and `_.trimRight` to get the index of the last non-whitespace
-   * character of `string`.
-   *
-   * @private
-   * @param {string} string The string to inspect.
-   * @returns {number} Returns the index of the last non-whitespace character.
-   */
-  function trimmedRightIndex(string) {
-    var index = string.length;
-
-    while (index-- && isSpace(string.charCodeAt(index))) {}
-    return index;
-  }
-
-  /**
-   * Used by `_.unescape` to convert HTML entities to characters.
-   *
-   * @private
-   * @param {string} chr The matched character to unescape.
-   * @returns {string} Returns the unescaped character.
-   */
-  function unescapeHtmlChar(chr) {
-    return htmlUnescapes[chr];
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  /**
-   * Create a new pristine `lodash` function using the given `context` object.
-   *
-   * @static
-   * @memberOf _
-   * @category Utility
-   * @param {Object} [context=root] The context object.
-   * @returns {Function} Returns a new `lodash` function.
-   * @example
-   *
-   * _.mixin({ 'foo': _.constant('foo') });
-   *
-   * var lodash = _.runInContext();
-   * lodash.mixin({ 'bar': lodash.constant('bar') });
-   *
-   * _.isFunction(_.foo);
-   * // => true
-   * _.isFunction(_.bar);
-   * // => false
-   *
-   * lodash.isFunction(lodash.foo);
-   * // => false
-   * lodash.isFunction(lodash.bar);
-   * // => true
-   *
-   * // using `context` to mock `Date#getTime` use in `_.now`
-   * var mock = _.runInContext({
-   *   'Date': function() {
-   *     return { 'getTime': getTimeMock };
-   *   }
-   * });
-   *
-   * // or creating a suped-up `defer` in Node.js
-   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
-   */
-  function runInContext(context) {
-    // Avoid issues with some ES3 environments that attempt to use values, named
-    // after built-in constructors like `Object`, for the creation of literals.
-    // ES5 clears this up by stating that literals must use built-in constructors.
-    // See https://es5.github.io/#x11.1.5 for more details.
-    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;
-
-    /** Native constructor references. */
-    var Array = context.Array,
-        Date = context.Date,
-        Error = context.Error,
-        Function = context.Function,
-        Math = context.Math,
-        Number = context.Number,
-        Object = context.Object,
-        RegExp = context.RegExp,
-        String = context.String,
-        TypeError = context.TypeError;
-
-    /** Used for native method references. */
-    var arrayProto = Array.prototype,
-        objectProto = Object.prototype,
-        stringProto = String.prototype;
-
-    /** Used to resolve the decompiled source of functions. */
-    var fnToString = Function.prototype.toString;
-
-    /** Used to check objects for own properties. */
-    var hasOwnProperty = objectProto.hasOwnProperty;
-
-    /** Used to generate unique IDs. */
-    var idCounter = 0;
-
-    /**
-     * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
-     * of values.
-     */
-    var objToString = objectProto.toString;
-
-    /** Used to restore the original `_` reference in `_.noConflict`. */
-    var oldDash = root._;
-
-    /** Used to detect if a method is native. */
-    var reIsNative = RegExp('^' +
-      fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
-      .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
-    );
-
-    /** Native method references. */
-    var ArrayBuffer = context.ArrayBuffer,
-        clearTimeout = context.clearTimeout,
-        parseFloat = context.parseFloat,
-        pow = Math.pow,
-        propertyIsEnumerable = objectProto.propertyIsEnumerable,
-        Set = getNative(context, 'Set'),
-        setTimeout = context.setTimeout,
-        splice = arrayProto.splice,
-        Uint8Array = context.Uint8Array,
-        WeakMap = getNative(context, 'WeakMap');
-
-    /* Native method references for those with the same name as other `lodash` methods. */
-    var nativeCeil = Math.ceil,
-        nativeCreate = getNative(Object, 'create'),
-        nativeFloor = Math.floor,
-        nativeIsArray = getNative(Array, 'isArray'),
-        nativeIsFinite = context.isFinite,
-        nativeKeys = getNative(Object, 'keys'),
-        nativeMax = Math.max,
-        nativeMin = Math.min,
-        nativeNow = getNative(Date, 'now'),
-        nativeParseInt = context.parseInt,
-        nativeRandom = Math.random;
-
-    /** Used as references for `-Infinity` and `Infinity`. */
-    var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY,
-        POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
-
-    /** Used as references for the maximum length and index of an array. */
-    var MAX_ARRAY_LENGTH = 4294967295,
-        MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
-        HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
-
-    /**
-     * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
-     * of an array-like value.
-     */
-    var MAX_SAFE_INTEGER = 9007199254740991;
-
-    /** Used to store function metadata. */
-    var metaMap = WeakMap && new WeakMap;
-
-    /** Used to lookup unminified function names. */
-    var realNames = {};
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Creates a `lodash` object which wraps `value` to enable implicit chaining.
-     * Methods that operate on and return arrays, collections, and functions can
-     * be chained together. Methods that retrieve a single value or may return a
-     * primitive value will automatically end the chain returning the unwrapped
-     * value. Explicit chaining may be enabled using `_.chain`. The execution of
-     * chained methods is lazy, that is, execution is deferred until `_#value`
-     * is implicitly or explicitly called.
-     *
-     * Lazy evaluation allows several methods to support shortcut fusion. Shortcut
-     * fusion is an optimization strategy which merge iteratee calls; this can help
-     * to avoid the creation of intermediate data structures and greatly reduce the
-     * number of iteratee executions.
-     *
-     * Chaining is supported in custom builds as long as the `_#value` method is
-     * directly or indirectly included in the build.
-     *
-     * In addition to lodash methods, wrappers have `Array` and `String` methods.
-     *
-     * The wrapper `Array` methods are:
-     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`,
-     * `splice`, and `unshift`
-     *
-     * The wrapper `String` methods are:
-     * `replace` and `split`
-     *
-     * The wrapper methods that support shortcut fusion are:
-     * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`,
-     * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`,
-     * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`,
-     * and `where`
-     *
-     * The chainable wrapper methods are:
-     * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`,
-     * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`,
-     * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defaultsDeep`,
-     * `defer`, `delay`, `difference`, `drop`, `dropRight`, `dropRightWhile`,
-     * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`,
-     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,
-     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,
-     * `invoke`, `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`,
-     * `matchesProperty`, `memoize`, `merge`, `method`, `methodOf`, `mixin`,
-     * `modArgs`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`,
-     * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,
-     * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `restParam`,
-     * `reverse`, `set`, `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`,
-     * `sortByOrder`, `splice`, `spread`, `take`, `takeRight`, `takeRightWhile`,
-     * `takeWhile`, `tap`, `throttle`, `thru`, `times`, `toArray`, `toPlainObject`,
-     * `transform`, `union`, `uniq`, `unshift`, `unzip`, `unzipWith`, `values`,
-     * `valuesIn`, `where`, `without`, `wrap`, `xor`, `zip`, `zipObject`, `zipWith`
-     *
-     * The wrapper methods that are **not** chainable by default are:
-     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clone`, `cloneDeep`,
-     * `deburr`, `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`,
-     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`,
-     * `floor`, `get`, `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`,
-     * `inRange`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,
-     * `isEmpty`, `isEqual`, `isError`, `isFinite` `isFunction`, `isMatch`,
-     * `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, `isPlainObject`,
-     * `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`,
-     * `last`, `lastIndexOf`, `lt`, `lte`, `max`, `min`, `noConflict`, `noop`,
-     * `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, `reduce`,
-     * `reduceRight`, `repeat`, `result`, `round`, `runInContext`, `shift`, `size`,
-     * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`,
-     * `startsWith`, `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`,
-     * `unescape`, `uniqueId`, `value`, and `words`
-     *
-     * The wrapper method `sample` will return a wrapped value when `n` is provided,
-     * otherwise an unwrapped value is returned.
-     *
-     * @name _
-     * @constructor
-     * @category Chain
-     * @param {*} value The value to wrap in a `lodash` instance.
-     * @returns {Object} Returns the new `lodash` wrapper instance.
-     * @example
-     *
-     * var wrapped = _([1, 2, 3]);
-     *
-     * // returns an unwrapped value
-     * wrapped.reduce(function(total, n) {
-     *   return total + n;
-     * });
-     * // => 6
-     *
-     * // returns a wrapped value
-     * var squares = wrapped.map(function(n) {
-     *   return n * n;
-     * });
-     *
-     * _.isArray(squares);
-     * // => false
-     *
-     * _.isArray(squares.value());
-     * // => true
-     */
-    function lodash(value) {
-      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
-        if (value instanceof LodashWrapper) {
-          return value;
-        }
-        if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) {
-          return wrapperClone(value);
-        }
-      }
-      return new LodashWrapper(value);
-    }
-
-    /**
-     * The function whose prototype all chaining wrappers inherit from.
-     *
-     * @private
-     */
-    function baseLodash() {
-      // No operation performed.
-    }
-
-    /**
-     * The base constructor for creating `lodash` wrapper objects.
-     *
-     * @private
-     * @param {*} value The value to wrap.
-     * @param {boolean} [chainAll] Enable chaining for all wrapper methods.
-     * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.
-     */
-    function LodashWrapper(value, chainAll, actions) {
-      this.__wrapped__ = value;
-      this.__actions__ = actions || [];
-      this.__chain__ = !!chainAll;
-    }
-
-    /**
-     * An object environment feature flags.
-     *
-     * @static
-     * @memberOf _
-     * @type Object
-     */
-    var support = lodash.support = {};
-
-    /**
-     * By default, the template delimiters used by lodash are like those in
-     * embedded Ruby (ERB). Change the following template settings to use
-     * alternative delimiters.
-     *
-     * @static
-     * @memberOf _
-     * @type Object
-     */
-    lodash.templateSettings = {
-
-      /**
-       * Used to detect `data` property values to be HTML-escaped.
-       *
-       * @memberOf _.templateSettings
-       * @type RegExp
-       */
-      'escape': reEscape,
-
-      /**
-       * Used to detect code to be evaluated.
-       *
-       * @memberOf _.templateSettings
-       * @type RegExp
-       */
-      'evaluate': reEvaluate,
-
-      /**
-       * Used to detect `data` property values to inject.
-       *
-       * @memberOf _.templateSettings
-       * @type RegExp
-       */
-      'interpolate': reInterpolate,
-
-      /**
-       * Used to reference the data object in the template text.
-       *
-       * @memberOf _.templateSettings
-       * @type string
-       */
-      'variable': '',
-
-      /**
-       * Used to import variables into the compiled template.
-       *
-       * @memberOf _.templateSettings
-       * @type Object
-       */
-      'imports': {
-
-        /**
-         * A reference to the `lodash` function.
-         *
-         * @memberOf _.templateSettings.imports
-         * @type Function
-         */
-        '_': lodash
-      }
-    };
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
-     *
-     * @private
-     * @param {*} value The value to wrap.
-     */
-    function LazyWrapper(value) {
-      this.__wrapped__ = value;
-      this.__actions__ = [];
-      this.__dir__ = 1;
-      this.__filtered__ = false;
-      this.__iteratees__ = [];
-      this.__takeCount__ = POSITIVE_INFINITY;
-      this.__views__ = [];
-    }
-
-    /**
-     * Creates a clone of the lazy wrapper object.
-     *
-     * @private
-     * @name clone
-     * @memberOf LazyWrapper
-     * @returns {Object} Returns the cloned `LazyWrapper` object.
-     */
-    function lazyClone() {
-      var result = new LazyWrapper(this.__wrapped__);
-      result.__actions__ = arrayCopy(this.__actions__);
-      result.__dir__ = this.__dir__;
-      result.__filtered__ = this.__filtered__;
-      result.__iteratees__ = arrayCopy(this.__iteratees__);
-      result.__takeCount__ = this.__takeCount__;
-      result.__views__ = arrayCopy(this.__views__);
-      return result;
-    }
-
-    /**
-     * Reverses the direction of lazy iteration.
-     *
-     * @private
-     * @name reverse
-     * @memberOf LazyWrapper
-     * @returns {Object} Returns the new reversed `LazyWrapper` object.
-     */
-    function lazyReverse() {
-      if (this.__filtered__) {
-        var result = new LazyWrapper(this);
-        result.__dir__ = -1;
-        result.__filtered__ = true;
-      } else {
-        result = this.clone();
-        result.__dir__ *= -1;
-      }
-      return result;
-    }
-
-    /**
-     * Extracts the unwrapped value from its lazy wrapper.
-     *
-     * @private
-     * @name value
-     * @memberOf LazyWrapper
-     * @returns {*} Returns the unwrapped value.
-     */
-    function lazyValue() {
-      var array = this.__wrapped__.value(),
-          dir = this.__dir__,
-          isArr = isArray(array),
-          isRight = dir < 0,
-          arrLength = isArr ? array.length : 0,
-          view = getView(0, arrLength, this.__views__),
-          start = view.start,
-          end = view.end,
-          length = end - start,
-          index = isRight ? end : (start - 1),
-          iteratees = this.__iteratees__,
-          iterLength = iteratees.length,
-          resIndex = 0,
-          takeCount = nativeMin(length, this.__takeCount__);
-
-      if (!isArr || arrLength < LARGE_ARRAY_SIZE || (arrLength == length && takeCount == length)) {
-        return baseWrapperValue((isRight && isArr) ? array.reverse() : array, this.__actions__);
-      }
-      var result = [];
-
-      outer:
-      while (length-- && resIndex < takeCount) {
-        index += dir;
-
-        var iterIndex = -1,
-            value = array[index];
-
-        while (++iterIndex < iterLength) {
-          var data = iteratees[iterIndex],
-              iteratee = data.iteratee,
-              type = data.type,
-              computed = iteratee(value);
-
-          if (type == LAZY_MAP_FLAG) {
-            value = computed;
-          } else if (!computed) {
-            if (type == LAZY_FILTER_FLAG) {
-              continue outer;
-            } else {
-              break outer;
-            }
-          }
-        }
-        result[resIndex++] = value;
-      }
-      return result;
-    }
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Creates a cache object to store key/value pairs.
-     *
-     * @private
-     * @static
-     * @name Cache
-     * @memberOf _.memoize
-     */
-    function MapCache() {
-      this.__data__ = {};
-    }
-
-    /**
-     * Removes `key` and its value from the cache.
-     *
-     * @private
-     * @name delete
-     * @memberOf _.memoize.Cache
-     * @param {string} key The key of the value to remove.
-     * @returns {boolean} Returns `true` if the entry was removed successfully, else `false`.
-     */
-    function mapDelete(key) {
-      return this.has(key) && delete this.__data__[key];
-    }
-
-    /**
-     * Gets the cached value for `key`.
-     *
-     * @private
-     * @name get
-     * @memberOf _.memoize.Cache
-     * @param {string} key The key of the value to get.
-     * @returns {*} Returns the cached value.
-     */
-    function mapGet(key) {
-      return key == '__proto__' ? undefined : this.__data__[key];
-    }
-
-    /**
-     * Checks if a cached value for `key` exists.
-     *
-     * @private
-     * @name has
-     * @memberOf _.memoize.Cache
-     * @param {string} key The key of the entry to check.
-     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
-     */
-    function mapHas(key) {
-      return key != '__proto__' && hasOwnProperty.call(this.__data__, key);
-    }
-
-    /**
-     * Sets `value` to `key` of the cache.
-     *
-     * @private
-     * @name set
-     * @memberOf _.memoize.Cache
-     * @param {string} key The key of the value to cache.
-     * @param {*} value The value to cache.
-     * @returns {Object} Returns the cache object.
-     */
-    function mapSet(key, value) {
-      if (key != '__proto__') {
-        this.__data__[key] = value;
-      }
-      return this;
-    }
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     *
-     * Creates a cache object to store unique values.
-     *
-     * @private
-     * @param {Array} [values] The values to cache.
-     */
-    function SetCache(values) {
-      var length = values ? values.length : 0;
-
-      this.data = { 'hash': nativeCreate(null), 'set': new Set };
-      while (length--) {
-        this.push(values[length]);
-      }
-    }
-
-    /**
-     * Checks if `value` is in `cache` mimicking the return signature of
-     * `_.indexOf` by returning `0` if the value is found, else `-1`.
-     *
-     * @private
-     * @param {Object} cache The cache to search.
-     * @param {*} value The value to search for.
-     * @returns {number} Returns `0` if `value` is found, else `-1`.
-     */
-    function cacheIndexOf(cache, value) {
-      var data = cache.data,
-          result = (typeof value == 'string' || isObject(value)) ? data.set.has(value) : data.hash[value];
-
-      return result ? 0 : -1;
-    }
-
-    /**
-     * Adds `value` to the cache.
-     *
-     * @private
-     * @name push
-     * @memberOf SetCache
-     * @param {*} value The value to cache.
-     */
-    function cachePush(value) {
-      var data = this.data;
-      if (typeof value == 'string' || isObject(value)) {
-        data.set.add(value);
-      } else {
-        data.hash[value] = true;
-      }
-    }
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Creates a new array joining `array` with `other`.
-     *
-     * @private
-     * @param {Array} array The array to join.
-     * @param {Array} other The other array to join.
-     * @returns {Array} Returns the new concatenated array.
-     */
-    function arrayConcat(array, other) {
-      var index = -1,
-          length = array.length,
-          othIndex = -1,
-          othLength = other.length,
-          result = Array(length + othLength);
-
-      while (++index < length) {
-        result[index] = array[index];
-      }
-      while (++othIndex < othLength) {
-        result[index++] = other[othIndex];
-      }
-      return result;
-    }
-
-    /**
-     * Copies the values of `source` to `array`.
-     *
-     * @private
-     * @param {Array} source The array to copy values from.
-     * @param {Array} [array=[]] The array to copy values to.
-     * @returns {Array} Returns `array`.
-     */
-    function arrayCopy(source, array) {
-      var index = -1,
-          length = source.length;
-
-      array || (array = Array(length));
-      while (++index < length) {
-        array[index] = source[index];
-      }
-      return array;
-    }
-
-    /**
-     * A specialized version of `_.forEach` for arrays without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Array} array The array to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @returns {Array} Returns `array`.
-     */
-    function arrayEach(array, iteratee) {
-      var index = -1,
-          length = array.length;
-
-      while (++index < length) {
-        if (iteratee(array[index], index, array) === false) {
-          break;
-        }
-      }
-      return array;
-    }
-
-    /**
-     * A specialized version of `_.forEachRight` for arrays without support for
-     * callback shorthands and `this` binding.
-     *
-     * @private
-     * @param {Array} array The array to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @returns {Array} Returns `array`.
-     */
-    function arrayEachRight(array, iteratee) {
-      var length = array.length;
-
-      while (length--) {
-        if (iteratee(array[length], length, array) === false) {
-          break;
-        }
-      }
-      return array;
-    }
-
-    /**
-     * A specialized version of `_.every` for arrays without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Array} array The array to iterate over.
-     * @param {Function} predicate The function invoked per iteration.
-     * @returns {boolean} Returns `true` if all elements pass the predicate check,
-     *  else `false`.
-     */
-    function arrayEvery(array, predicate) {
-      var index = -1,
-          length = array.length;
-
-      while (++index < length) {
-        if (!predicate(array[index], index, array)) {
-          return false;
-        }
-      }
-      return true;
-    }
-
-    /**
-     * A specialized version of `baseExtremum` for arrays which invokes `iteratee`
-     * with one argument: (value).
-     *
-     * @private
-     * @param {Array} array The array to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @param {Function} comparator The function used to compare values.
-     * @param {*} exValue The initial extremum value.
-     * @returns {*} Returns the extremum value.
-     */
-    function arrayExtremum(array, iteratee, comparator, exValue) {
-      var index = -1,
-          length = array.length,
-          computed = exValue,
-          result = computed;
-
-      while (++index < length) {
-        var value = array[index],
-            current = +iteratee(value);
-
-        if (comparator(current, computed)) {
-          computed = current;
-          result = value;
-        }
-      }
-      return result;
-    }
-
-    /**
-     * A specialized version of `_.filter` for arrays without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Array} array The array to iterate over.
-     * @param {Function} predicate The function invoked per iteration.
-     * @returns {Array} Returns the new filtered array.
-     */
-    function arrayFilter(array, predicate) {
-      var index = -1,
-          length = array.length,
-          resIndex = -1,
-          result = [];
-
-      while (++index < length) {
-        var value = array[index];
-        if (predicate(value, index, array)) {
-          result[++resIndex] = value;
-        }
-      }
-      return result;
-    }
-
-    /**
-     * A specialized version of `_.map` for arrays without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Array} array The array to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @returns {Array} Returns the new mapped array.
-     */
-    function arrayMap(array, iteratee) {
-      var index = -1,
-          length = array.length,
-          result = Array(length);
-
-      while (++index < length) {
-        result[index] = iteratee(array[index], index, array);
-      }
-      return result;
-    }
-
-    /**
-     * Appends the elements of `values` to `array`.
-     *
-     * @private
-     * @param {Array} array The array to modify.
-     * @param {Array} values The values to append.
-     * @returns {Array} Returns `array`.
-     */
-    function arrayPush(array, values) {
-      var index = -1,
-          length = values.length,
-          offset = array.length;
-
-      while (++index < length) {
-        array[offset + index] = values[index];
-      }
-      return array;
-    }
-
-    /**
-     * A specialized version of `_.reduce` for arrays without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Array} array The array to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @param {*} [accumulator] The initial value.
-     * @param {boolean} [initFromArray] Specify using the first element of `array`
-     *  as the initial value.
-     * @returns {*} Returns the accumulated value.
-     */
-    function arrayReduce(array, iteratee, accumulator, initFromArray) {
-      var index = -1,
-          length = array.length;
-
-      if (initFromArray && length) {
-        accumulator = array[++index];
-      }
-      while (++index < length) {
-        accumulator = iteratee(accumulator, array[index], index, array);
-      }
-      return accumulator;
-    }
-
-    /**
-     * A specialized version of `_.reduceRight` for arrays without support for
-     * callback shorthands and `this` binding.
-     *
-     * @private
-     * @param {Array} array The array to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @param {*} [accumulator] The initial value.
-     * @param {boolean} [initFromArray] Specify using the last element of `array`
-     *  as the initial value.
-     * @returns {*} Returns the accumulated value.
-     */
-    function arrayReduceRight(array, iteratee, accumulator, initFromArray) {
-      var length = array.length;
-      if (initFromArray && length) {
-        accumulator = array[--length];
-      }
-      while (length--) {
-        accumulator = iteratee(accumulator, array[length], length, array);
-      }
-      return accumulator;
-    }
-
-    /**
-     * A specialized version of `_.some` for arrays without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Array} array The array to iterate over.
-     * @param {Function} predicate The function invoked per iteration.
-     * @returns {boolean} Returns `true` if any element passes the predicate check,
-     *  else `false`.
-     */
-    function arraySome(array, predicate) {
-      var index = -1,
-          length = array.length;
-
-      while (++index < length) {
-        if (predicate(array[index], index, array)) {
-          return true;
-        }
-      }
-      return false;
-    }
-
-    /**
-     * A specialized version of `_.sum` for arrays without support for callback
-     * shorthands and `this` binding..
-     *
-     * @private
-     * @param {Array} array The array to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @returns {number} Returns the sum.
-     */
-    function arraySum(array, iteratee) {
-      var length = array.length,
-          result = 0;
-
-      while (length--) {
-        result += +iteratee(array[length]) || 0;
-      }
-      return result;
-    }
-
-    /**
-     * Used by `_.defaults` to customize its `_.assign` use.
-     *
-     * @private
-     * @param {*} objectValue The destination object property value.
-     * @param {*} sourceValue The source object property value.
-     * @returns {*} Returns the value to assign to the destination object.
-     */
-    function assignDefaults(objectValue, sourceValue) {
-      return objectValue === undefined ? sourceValue : objectValue;
-    }
-
-    /**
-     * Used by `_.template` to customize its `_.assign` use.
-     *
-     * **Note:** This function is like `assignDefaults` except that it ignores
-     * inherited property values when checking if a property is `undefined`.
-     *
-     * @private
-     * @param {*} objectValue The destination object property value.
-     * @param {*} sourceValue The source object property value.
-     * @param {string} key The key associated with the object and source values.
-     * @param {Object} object The destination object.
-     * @returns {*} Returns the value to assign to the destination object.
-     */
-    function assignOwnDefaults(objectValue, sourceValue, key, object) {
-      return (objectValue === undefined || !hasOwnProperty.call(object, key))
-        ? sourceValue
-        : objectValue;
-    }
-
-    /**
-     * A specialized version of `_.assign` for customizing assigned values without
-     * support for argument juggling, multiple sources, and `this` binding `customizer`
-     * functions.
-     *
-     * @private
-     * @param {Object} object The destination object.
-     * @param {Object} source The source object.
-     * @param {Function} customizer The function to customize assigned values.
-     * @returns {Object} Returns `object`.
-     */
-    function assignWith(object, source, customizer) {
-      var index = -1,
-          props = keys(source),
-          length = props.length;
-
-      while (++index < length) {
-        var key = props[index],
-            value = object[key],
-            result = customizer(value, source[key], key, object, source);
-
-        if ((result === result ? (result !== value) : (value === value)) ||
-            (value === undefined && !(key in object))) {
-          object[key] = result;
-        }
-      }
-      return object;
-    }
-
-    /**
-     * The base implementation of `_.assign` without support for argument juggling,
-     * multiple sources, and `customizer` functions.
-     *
-     * @private
-     * @param {Object} object The destination object.
-     * @param {Object} source The source object.
-     * @returns {Object} Returns `object`.
-     */
-    function baseAssign(object, source) {
-      return source == null
-        ? object
-        : baseCopy(source, keys(source), object);
-    }
-
-    /**
-     * The base implementation of `_.at` without support for string collections
-     * and individual key arguments.
-     *
-     * @private
-     * @param {Array|Object} collection The collection to iterate over.
-     * @param {number[]|string[]} props The property names or indexes of elements to pick.
-     * @returns {Array} Returns the new array of picked elements.
-     */
-    function baseAt(collection, props) {
-      var index = -1,
-          isNil = collection == null,
-          isArr = !isNil && isArrayLike(collection),
-          length = isArr ? collection.length : 0,
-          propsLength = props.length,
-          result = Array(propsLength);
-
-      while(++index < propsLength) {
-        var key = props[index];
-        if (isArr) {
-          result[index] = isIndex(key, length) ? collection[key] : undefined;
-        } else {
-          result[index] = isNil ? undefined : collection[key];
-        }
-      }
-      return result;
-    }
-
-    /**
-     * Copies properties of `source` to `object`.
-     *
-     * @private
-     * @param {Object} source The object to copy properties from.
-     * @param {Array} props The property names to copy.
-     * @param {Object} [object={}] The object to copy properties to.
-     * @returns {Object} Returns `object`.
-     */
-    function baseCopy(source, props, object) {
-      object || (object = {});
-
-      var index = -1,
-          length = props.length;
-
-      while (++index < length) {
-        var key = props[index];
-        object[key] = source[key];
-      }
-      return object;
-    }
-
-    /**
-     * The base implementation of `_.callback` which supports specifying the
-     * number of arguments to provide to `func`.
-     *
-     * @private
-     * @param {*} [func=_.identity] The value to convert to a callback.
-     * @param {*} [thisArg] The `this` binding of `func`.
-     * @param {number} [argCount] The number of arguments to provide to `func`.
-     * @returns {Function} Returns the callback.
-     */
-    function baseCallback(func, thisArg, argCount) {
-      var type = typeof func;
-      if (type == 'function') {
-        return thisArg === undefined
-          ? func
-          : bindCallback(func, thisArg, argCount);
-      }
-      if (func == null) {
-        return identity;
-      }
-      if (type == 'object') {
-        return baseMatches(func);
-      }
-      return thisArg === undefined
-        ? property(func)
-        : baseMatchesProperty(func, thisArg);
-    }
-
-    /**
-     * The base implementation of `_.clone` without support for argument juggling
-     * and `this` binding `customizer` functions.
-     *
-     * @private
-     * @param {*} value The value to clone.
-     * @param {boolean} [isDeep] Specify a deep clone.
-     * @param {Function} [customizer] The function to customize cloning values.
-     * @param {string} [key] The key of `value`.
-     * @param {Object} [object] The object `value` belongs to.
-     * @param {Array} [stackA=[]] Tracks traversed source objects.
-     * @param {Array} [stackB=[]] Associates clones with source counterparts.
-     * @returns {*} Returns the cloned value.
-     */
-    function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {
-      var result;
-      if (customizer) {
-        result = object ? customizer(value, key, object) : customizer(value);
-      }
-      if (result !== undefined) {
-        return result;
-      }
-      if (!isObject(value)) {
-        return value;
-      }
-      var isArr = isArray(value);
-      if (isArr) {
-        result = initCloneArray(value);
-        if (!isDeep) {
-          return arrayCopy(value, result);
-        }
-      } else {
-        var tag = objToString.call(value),
-            isFunc = tag == funcTag;
-
-        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
-          result = initCloneObject(isFunc ? {} : value);
-          if (!isDeep) {
-            return baseAssign(result, value);
-          }
-        } else {
-          return cloneableTags[tag]
-            ? initCloneByTag(value, tag, isDeep)
-            : (object ? value : {});
-        }
-      }
-      // Check for circular references and return its corresponding clone.
-      stackA || (stackA = []);
-      stackB || (stackB = []);
-
-      var length = stackA.length;
-      while (length--) {
-        if (stackA[length] == value) {
-          return stackB[length];
-        }
-      }
-      // Add the source value to the stack of traversed objects and associate it with its clone.
-      stackA.push(value);
-      stackB.push(result);
-
-      // Recursively populate clone (susceptible to call stack limits).
-      (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {
-        result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);
-      });
-      return result;
-    }
-
-    /**
-     * The base implementation of `_.create` without support for assigning
-     * properties to the created object.
-     *
-     * @private
-     * @param {Object} prototype The object to inherit from.
-     * @returns {Object} Returns the new object.
-     */
-    var baseCreate = (function() {
-      function object() {}
-      return function(prototype) {
-        if (isObject(prototype)) {
-          object.prototype = prototype;
-          var result = new object;
-          object.prototype = undefined;
-        }
-        return result || {};
-      };
-    }());
-
-    /**
-     * The base implementation of `_.delay` and `_.defer` which accepts an index
-     * of where to slice the arguments to provide to `func`.
-     *
-     * @private
-     * @param {Function} func The function to delay.
-     * @param {number} wait The number of milliseconds to delay invocation.
-     * @param {Object} args The arguments provide to `func`.
-     * @returns {number} Returns the timer id.
-     */
-    function baseDelay(func, wait, args) {
-      if (typeof func != 'function') {
-        throw new TypeError(FUNC_ERROR_TEXT);
-      }
-      return setTimeout(function() { func.apply(undefined, args); }, wait);
-    }
-
-    /**
-     * The base implementation of `_.difference` which accepts a single array
-     * of values to exclude.
-     *
-     * @private
-     * @param {Array} array The array to inspect.
-     * @param {Array} values The values to exclude.
-     * @returns {Array} Returns the new array of filtered values.
-     */
-    function baseDifference(array, values) {
-      var length = array ? array.length : 0,
-          result = [];
-
-      if (!length) {
-        return result;
-      }
-      var index = -1,
-          indexOf = getIndexOf(),
-          isCommon = indexOf == baseIndexOf,
-          cache = (isCommon && values.length >= LARGE_ARRAY_SIZE) ? createCache(values) : null,
-          valuesLength = values.length;
-
-      if (cache) {
-        indexOf = cacheIndexOf;
-        isCommon = false;
-        values = cache;
-      }
-      outer:
-      while (++index < length) {
-        var value = array[index];
-
-        if (isCommon && value === value) {
-          var valuesIndex = valuesLength;
-          while (valuesIndex--) {
-            if (values[valuesIndex] === value) {
-              continue outer;
-            }
-          }
-          result.push(value);
-        }
-        else if (indexOf(values, value, 0) < 0) {
-          result.push(value);
-        }
-      }
-      return result;
-    }
-
-    /**
-     * The base implementation of `_.forEach` without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @returns {Array|Object|string} Returns `collection`.
-     */
-    var baseEach = createBaseEach(baseForOwn);
-
-    /**
-     * The base implementation of `_.forEachRight` without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @returns {Array|Object|string} Returns `collection`.
-     */
-    var baseEachRight = createBaseEach(baseForOwnRight, true);
-
-    /**
-     * The base implementation of `_.every` without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function} predicate The function invoked per iteration.
-     * @returns {boolean} Returns `true` if all elements pass the predicate check,
-     *  else `false`
-     */
-    function baseEvery(collection, predicate) {
-      var result = true;
-      baseEach(collection, function(value, index, collection) {
-        result = !!predicate(value, index, collection);
-        return result;
-      });
-      return result;
-    }
-
-    /**
-     * Gets the extremum value of `collection` invoking `iteratee` for each value
-     * in `collection` to generate the criterion by which the value is ranked.
-     * The `iteratee` is invoked with three arguments: (value, index|key, collection).
-     *
-     * @private
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @param {Function} comparator The function used to compare values.
-     * @param {*} exValue The initial extremum value.
-     * @returns {*} Returns the extremum value.
-     */
-    function baseExtremum(collection, iteratee, comparator, exValue) {
-      var computed = exValue,
-          result = computed;
-
-      baseEach(collection, function(value, index, collection) {
-        var current = +iteratee(value, index, collection);
-        if (comparator(current, computed) || (current === exValue && current === result)) {
-          computed = current;
-          result = value;
-        }
-      });
-      return result;
-    }
-
-    /**
-     * The base implementation of `_.fill` without an iteratee call guard.
-     *
-     * @private
-     * @param {Array} array The array to fill.
-     * @param {*} value The value to fill `array` with.
-     * @param {number} [start=0] The start position.
-     * @param {number} [end=array.length] The end position.
-     * @returns {Array} Returns `array`.
-     */
-    function baseFill(array, value, start, end) {
-      var length = array.length;
-
-      start = start == null ? 0 : (+start || 0);
-      if (start < 0) {
-        start = -start > length ? 0 : (length + start);
-      }
-      end = (end === undefined || end > length) ? length : (+end || 0);
-      if (end < 0) {
-        end += length;
-      }
-      length = start > end ? 0 : (end >>> 0);
-      start >>>= 0;
-
-      while (start < length) {
-        array[start++] = value;
-      }
-      return array;
-    }
-
-    /**
-     * The base implementation of `_.filter` without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function} predicate The function invoked per iteration.
-     * @returns {Array} Returns the new filtered array.
-     */
-    function baseFilter(collection, predicate) {
-      var result = [];
-      baseEach(collection, function(value, index, collection) {
-        if (predicate(value, index, collection)) {
-          result.push(value);
-        }
-      });
-      return result;
-    }
-
-    /**
-     * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,
-     * without support for callback shorthands and `this` binding, which iterates
-     * over `collection` using the provided `eachFunc`.
-     *
-     * @private
-     * @param {Array|Object|string} collection The collection to search.
-     * @param {Function} predicate The function invoked per iteration.
-     * @param {Function} eachFunc The function to iterate over `collection`.
-     * @param {boolean} [retKey] Specify returning the key of the found element
-     *  instead of the element itself.
-     * @returns {*} Returns the found element or its key, else `undefined`.
-     */
-    function baseFind(collection, predicate, eachFunc, retKey) {
-      var result;
-      eachFunc(collection, function(value, key, collection) {
-        if (predicate(value, key, collection)) {
-          result = retKey ? key : value;
-          return false;
-        }
-      });
-      return result;
-    }
-
-    /**
-     * The base implementation of `_.flatten` with added support for restricting
-     * flattening and specifying the start index.
-     *
-     * @private
-     * @param {Array} array The array to flatten.
-     * @param {boolean} [isDeep] Specify a deep flatten.
-     * @param {boolean} [isStrict] Restrict flattening to arrays-like objects.
-     * @param {Array} [result=[]] The initial result value.
-     * @returns {Array} Returns the new flattened array.
-     */
-    function baseFlatten(array, isDeep, isStrict, result) {
-      result || (result = []);
-
-      var index = -1,
-          length = array.length;
-
-      while (++index < length) {
-        var value = array[index];
-        if (isObjectLike(value) && isArrayLike(value) &&
-            (isStrict || isArray(value) || isArguments(value))) {
-          if (isDeep) {
-            // Recursively flatten arrays (susceptible to call stack limits).
-            baseFlatten(value, isDeep, isStrict, result);
-          } else {
-            arrayPush(result, value);
-          }
-        } else if (!isStrict) {
-          result[result.length] = value;
-        }
-      }
-      return result;
-    }
-
-    /**
-     * The base implementation of `baseForIn` and `baseForOwn` which iterates
-     * over `object` properties returned by `keysFunc` invoking `iteratee` for
-     * each property. Iteratee functions may exit iteration early by explicitly
-     * returning `false`.
-     *
-     * @private
-     * @param {Object} object The object to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @param {Function} keysFunc The function to get the keys of `object`.
-     * @returns {Object} Returns `object`.
-     */
-    var baseFor = createBaseFor();
-
-    /**
-     * This function is like `baseFor` except that it iterates over properties
-     * in the opposite order.
-     *
-     * @private
-     * @param {Object} object The object to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @param {Function} keysFunc The function to get the keys of `object`.
-     * @returns {Object} Returns `object`.
-     */
-    var baseForRight = createBaseFor(true);
-
-    /**
-     * The base implementation of `_.forIn` without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Object} object The object to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @returns {Object} Returns `object`.
-     */
-    function baseForIn(object, iteratee) {
-      return baseFor(object, iteratee, keysIn);
-    }
-
-    /**
-     * The base implementation of `_.forOwn` without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Object} object The object to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @returns {Object} Returns `object`.
-     */
-    function baseForOwn(object, iteratee) {
-      return baseFor(object, iteratee, keys);
-    }
-
-    /**
-     * The base implementation of `_.forOwnRight` without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Object} object The object to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @returns {Object} Returns `object`.
-     */
-    function baseForOwnRight(object, iteratee) {
-      return baseForRight(object, iteratee, keys);
-    }
-
-    /**
-     * The base implementation of `_.functions` which creates an array of
-     * `object` function property names filtered from those provided.
-     *
-     * @private
-     * @param {Object} object The object to inspect.
-     * @param {Array} props The property names to filter.
-     * @returns {Array} Returns the new array of filtered property names.
-     */
-    function baseFunctions(object, props) {
-      var index = -1,
-          length = props.length,
-          resIndex = -1,
-          result = [];
-
-      while (++index < length) {
-        var key = props[index];
-        if (isFunction(object[key])) {
-          result[++resIndex] = key;
-        }
-      }
-      return result;
-    }
-
-    /**
-     * The base implementation of `get` without support for string paths
-     * and default values.
-     *
-     * @private
-     * @param {Object} object The object to query.
-     * @param {Array} path The path of the property to get.
-     * @param {string} [pathKey] The key representation of path.
-     * @returns {*} Returns the resolved value.
-     */
-    function baseGet(object, path, pathKey) {
-      if (object == null) {
-        return;
-      }
-      if (pathKey !== undefined && pathKey in toObject(object)) {
-        path = [pathKey];
-      }
-      var index = 0,
-          length = path.length;
-
-      while (object != null && index < length) {
-        object = object[path[index++]];
-      }
-      return (index && index == length) ? object : undefined;
-    }
-
-    /**
-     * The base implementation of `_.isEqual` without support for `this` binding
-     * `customizer` functions.
-     *
-     * @private
-     * @param {*} value The value to compare.
-     * @param {*} other The other value to compare.
-     * @param {Function} [customizer] The function to customize comparing values.
-     * @param {boolean} [isLoose] Specify performing partial comparisons.
-     * @param {Array} [stackA] Tracks traversed `value` objects.
-     * @param {Array} [stackB] Tracks traversed `other` objects.
-     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
-     */
-    function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
-      if (value === other) {
-        return true;
-      }
-      if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
-        return value !== value && other !== other;
-      }
-      return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);
-    }
-
-    /**
-     * A specialized version of `baseIsEqual` for arrays and objects which performs
-     * deep comparisons and tracks traversed objects enabling objects with circular
-     * references to be compared.
-     *
-     * @private
-     * @param {Object} object The object to compare.
-     * @param {Object} other The other object to compare.
-     * @param {Function} equalFunc The function to determine equivalents of values.
-     * @param {Function} [customizer] The function to customize comparing objects.
-     * @param {boolean} [isLoose] Specify performing partial comparisons.
-     * @param {Array} [stackA=[]] Tracks traversed `value` objects.
-     * @param {Array} [stackB=[]] Tracks traversed `other` objects.
-     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
-     */
-    function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
-      var objIsArr = isArray(object),
-          othIsArr = isArray(other),
-          objTag = arrayTag,
-          othTag = arrayTag;
-
-      if (!objIsArr) {
-        objTag = objToString.call(object);
-        if (objTag == argsTag) {
-          objTag = objectTag;
-        } else if (objTag != objectTag) {
-          objIsArr = isTypedArray(object);
-        }
-      }
-      if (!othIsArr) {
-        othTag = objToString.call(other);
-        if (othTag == argsTag) {
-          othTag = objectTag;
-        } else if (othTag != objectTag) {
-          othIsArr = isTypedArray(other);
-        }
-      }
-      var objIsObj = objTag == objectTag,
-          othIsObj = othTag == objectTag,
-          isSameTag = objTag == othTag;
-
-      if (isSameTag && !(objIsArr || objIsObj)) {
-        return equalByTag(object, other, objTag);
-      }
-      if (!isLoose) {
-        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
-            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
-
-        if (objIsWrapped || othIsWrapped) {
-          return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
-        }
-      }
-      if (!isSameTag) {
-        return false;
-      }
-      // Assume cyclic values are equal.
-      // For more information on detecting circular references see https://es5.github.io/#JO.
-      stackA || (stackA = []);
-      stackB || (stackB = []);
-
-      var length = stackA.length;
-      while (length--) {
-        if (stackA[length] == object) {
-          return stackB[length] == other;
-        }
-      }
-      // Add `object` and `other` to the stack of traversed objects.
-      stackA.push(object);
-      stackB.push(other);
-
-      var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);
-
-      stackA.pop();
-      stackB.pop();
-
-      return result;
-    }
-
-    /**
-     * The base implementation of `_.isMatch` without support for callback
-     * shorthands and `this` binding.
-     *
-     * @private
-     * @param {Object} object The object to inspect.
-     * @param {Array} matchData The propery names, values, and compare flags to match.
-     * @param {Function} [customizer] The function to customize comparing objects.
-     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
-     */
-    function baseIsMatch(object, matchData, customizer) {
-      var index = matchData.length,
-          length = index,
-          noCustomizer = !customizer;
-
-      if (object == null) {
-        return !length;
-      }
-      object = toObject(object);
-      while (index--) {
-        var data = matchData[index];
-        if ((noCustomizer && data[2])
-              ? data[1] !== object[data[0]]
-              : !(data[0] in object)
-            ) {
-          return false;
-        }
-      }
-      while (++index < length) {
-        data = matchData[index];
-        var key = data[0],
-            objValue = object[key],
-            srcValue = data[1];
-
-        if (noCustomizer && data[2]) {
-          if (objValue === undefined && !(key in object)) {
-            return false;
-          }
-        } else {
-          var result = customizer ? customizer(objValue, srcValue, key) : undefined;
-          if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {
-            return false;
-          }
-        }
-      }
-      return true;
-    }
-
-    /**
-     * The base implementation of `_.map` without support for callback shorthands
-     * and `this` binding.
-     *
-     * @private
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @returns {Array} Returns the new mapped array.
-     */
-    function baseMap(collection, iteratee) {
-      var index = -1,
-          result = isArrayLike(collection) ? Array(collection.length) : [];
-
-      baseEach(collection, function(value, key, collection) {
-        result[++index] = iteratee(value, key, collection);
-      });
-      return result;
-    }
-
-    /**
-     * The base implementation of `_.matches` which does not clone `source`.
-     *
-     * @private
-     * @param {Object} source The object of property values to match.
-     * @returns {Function} Returns the new function.
-     */
-    function baseMatches(source) {
-      var matchData = getMatchData(source);
-      if (matchData.length == 1 && matchData[0][2]) {
-        var key = matchData[0][0],
-            value = matchData[0][1];
-
-        return function(object) {
-          if (object == null) {
-            return false;
-          }
-          return object[key] === value && (value !== undefined || (key in toObject(object)));
-        };
-      }
-      return function(object) {
-        return baseIsMatch(object, matchData);
-      };
-    }
-
-    /**
-     * The base implementation of `_.matchesProperty` which does not clone `srcValue`.
-     *
-     * @private
-     * @param {string} path The path of the property to get.
-     * @param {*} srcValue The value to compare.
-     * @returns {Function} Returns the new function.
-     */
-    function baseMatchesProperty(path, srcValue) {
-      var isArr = isArray(path),
-          isCommon = isKey(path) && isStrictComparable(srcValue),
-          pathKey = (path + '');
-
-      path = toPath(path);
-      return function(object) {
-        if (object == null) {
-          return false;
-        }
-        var key = pathKey;
-        object = toObject(object);
-        if ((isArr || !isCommon) && !(key in object)) {
-          object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
-          if (object == null) {
-            return false;
-          }
-          key = last(path);
-          object = toObject(object);
-        }
-        return object[key] === srcValue
-          ? (srcValue !== undefined || (key in object))
-          : baseIsEqual(srcValue, object[key], undefined, true);
-      };
-    }
-
-    /**
-     * The base implementation of `_.merge` without support for argument juggling,
-     * multiple sources, and `this` binding `customizer` functions.
-     *
-     * @private
-     * @param {Object} object The destination object.
-     * @param {Object} source The source object.
-     * @param {Function} [customizer] The function to customize merged values.
-     * @param {Array} [stackA=[]] Tracks traversed source objects.
-     * @param {Array} [stackB=[]] Associates values with source counterparts.
-     * @returns {Object} Returns `object`.
-     */
-    function baseMerge(object, source, customizer, stackA, stackB) {
-      if (!isObject(object)) {
-        return object;
-      }
-      var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
-          props = isSrcArr ? undefined : keys(source);
-
-      arrayEach(props || source, function(srcValue, key) {
-        if (props) {
-          key = srcValue;
-          srcValue = source[key];
-        }
-        if (isObjectLike(srcValue)) {
-          stackA || (stackA = []);
-          stackB || (stackB = []);
-          baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
-        }
-        else {
-          var value = object[key],
-              result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
-              isCommon = result === undefined;
-
-          if (isCommon) {
-            result = srcValue;
-          }
-          if ((result !== undefined || (isSrcArr && !(key in object))) &&
-              (isCommon || (result === result ? (result !== value) : (value === value)))) {
-            object[key] = result;
-          }
-        }
-      });
-      return object;
-    }
-
-    /**
-     * A specialized version of `baseMerge` for arrays and objects which performs
-     * deep merges and tracks traversed objects enabling objects with circular
-     * references to be merged.
-     *
-     * @private
-     * @param {Object} object The destination object.
-     * @param {Object} source The source object.
-     * @param {string} key The key of the value to merge.
-     * @param {Function} mergeFunc The function to merge values.
-     * @param {Function} [customizer] The function to customize merged values.
-     * @param {Array} [stackA=[]] Tracks traversed source objects.
-     * @param {Array} [stackB=[]] Associates values with source counterparts.
-     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
-     */
-    function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {
-      var length = stackA.length,
-          srcValue = source[key];
-
-      while (length--) {
-        if (stackA[length] == srcValue) {
-          object[key] = stackB[length];
-          return;
-        }
-      }
-      var value = object[key],
-          result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
-          isCommon = result === undefined;
-
-      if (isCommon) {
-        result = srcValue;
-        if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {
-          result = isArray(value)
-            ? value
-            : (isArrayLike(value) ? arrayCopy(value) : []);
-        }
-        else if (isPlainObject(srcValue) || isArguments(srcValue)) {
-          result = isArguments(value)
-            ? toPlainObject(value)
-            : (isPlainObject(value) ? value : {});
-        }
-        else {
-          isCommon = false;
-        }
-      }
-      // Add the source value to the stack of traversed objects and associate
-      // it with its merged value.
-      stackA.push(srcValue);
-      stackB.push(result);
-
-      if (isCommon) {
-        // Recursively merge objects and arrays (susceptible to call stack limits).
-        object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);
-      } else if (result === result ? (result !== value) : (value === value)) {
-        object[key] = result;
-      }
-    }
-
-    /**
-     * The base implementation of `_.property` without support for deep paths.
-     *
-     * @private
-     * @param {string} key The key of the property to get.
-     * @returns {Function} Returns the new function.
-     */
-    function baseProperty(key) {
-      return function(object) {
-        return object == null ? undefined : object[key];
-      };
-    }
-
-    /**
-     * A specialized version of `baseProperty` which supports deep paths.
-     *
-     * @private
-     * @param {Array|string} path The path of the property to get.
-     * @returns {Function} Returns the new function.
-     */
-    function basePropertyDeep(path) {
-      var pathKey = (path + '');
-      path = toPath(path);
-      return function(object) {
-        return baseGet(object, path, pathKey);
-      };
-    }
-
-    /**
-     * The base implementation of `_.pullAt` without support for individual
-     * index arguments and capturing the removed elements.
-     *
-     * @private
-     * @param {Array} array The array to modify.
-     * @param {number[]} indexes The indexes of elements to remove.
-     * @returns {Array} Returns `array`.
-     */
-    function basePullAt(array, indexes) {
-      var length = array ? indexes.length : 0;
-      while (length--) {
-        var index = indexes[length];
-        if (index != previous && isIndex(index)) {
-          var previous = index;
-          splice.call(array, index, 1);
-        }
-      }
-      return array;
-    }
-
-    /**
-     * The base implementation of `_.random` without support for argument juggling
-     * and returning floating-point numbers.
-     *
-     * @private
-     * @param {number} min The minimum possible value.
-     * @param {number} max The maximum possible value.
-     * @returns {number} Returns the random number.
-     */
-    function baseRandom(min, max) {
-      return min + nativeFloor(nativeRandom() * (max - min + 1));
-    }
-
-    /**
-     * The base implementation of `_.reduce` and `_.reduceRight` without support
-     * for callback shorthands and `this` binding, which iterates over `collection`
-     * using the provided `eachFunc`.
-     *
-     * @private
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @param {*} accumulator The initial value.
-     * @param {boolean} initFromCollection Specify using the first or last element
-     *  of `collection` as the initial value.
-     * @param {Function} eachFunc The function to iterate over `collection`.
-     * @returns {*} Returns the accumulated value.
-     */
-    function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {
-      eachFunc(collection, function(value, index, collection) {
-        accumulator = initFromCollection
-          ? (initFromCollection = false, value)
-          : iteratee(accumulator, value, index, collection);
-      });
-      return accumulator;
-    }
-
-    /**
-     * The base implementation of `setData` without support for hot loop detection.
-     *
-     * @private
-     * @param {Function} func The function to associate metadata with.
-     * @param {*} data The metadata.
-     * @returns {Function} Returns `func`.
-     */
-    var baseSetData = !metaMap ? identity : function(func, data) {
-      metaMap.set(func, data);
-      return func;
-    };
-
-    /**
-     * The base implementation of `_.slice` without an iteratee call guard.
-     *
-     * @private
-     * @param {Array} array The array to slice.
-     * @param {number} [start=0] The start position.
-     * @param {number} [end=array.length] The end position.
-     * @returns {Array} Returns the slice of `array`.
-     */
-    function baseSlice(array, start, end) {
-      var index = -1,
-          length = array.length;
-
-      start = start == null ? 0 : (+start || 0);
-      if (start < 0) {
-        start = -start > length ? 0 : (length + start);
-      }
-      end = (end === undefined || end > length) ? length : (+end || 0);
-      if (end < 0) {
-        end += length;
-      }
-      length = start > end ? 0 : ((end - start) >>> 0);
-      start >>>= 0;
-
-      var result = Array(length);
-      while (++index < length) {
-        result[index] = array[index + start];
-      }
-      return result;
-    }
-
-    /**
-     * The base implementation of `_.some` without support for callback shorthands
-     * and `this` binding.
-     *
-     * @private
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function} predicate The function invoked per iteration.
-     * @returns {boolean} Returns `true` if any element passes the predicate check,
-     *  else `false`.
-     */
-    function baseSome(collection, predicate) {
-      var result;
-
-      baseEach(collection, function(value, index, collection) {
-        result = predicate(value, index, collection);
-        return !result;
-      });
-      return !!result;
-    }
-
-    /**
-     * The base implementation of `_.sortBy` which uses `comparer` to define
-     * the sort order of `array` and replaces criteria objects with their
-     * corresponding values.
-     *
-     * @private
-     * @param {Array} array The array to sort.
-     * @param {Function} comparer The function to define sort order.
-     * @returns {Array} Returns `array`.
-     */
-    function baseSortBy(array, comparer) {
-      var length = array.length;
-
-      array.sort(comparer);
-      while (length--) {
-        array[length] = array[length].value;
-      }
-      return array;
-    }
-
-    /**
-     * The base implementation of `_.sortByOrder` without param guards.
-     *
-     * @private
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
-     * @param {boolean[]} orders The sort orders of `iteratees`.
-     * @returns {Array} Returns the new sorted array.
-     */
-    function baseSortByOrder(collection, iteratees, orders) {
-      var callback = getCallback(),
-          index = -1;
-
-      iteratees = arrayMap(iteratees, function(iteratee) { return callback(iteratee); });
-
-      var result = baseMap(collection, function(value) {
-        var criteria = arrayMap(iteratees, function(iteratee) { return iteratee(value); });
-        return { 'criteria': criteria, 'index': ++index, 'value': value };
-      });
-
-      return baseSortBy(result, function(object, other) {
-        return compareMultiple(object, other, orders);
-      });
-    }
-
-    /**
-     * The base implementation of `_.sum` without support for callback shorthands
-     * and `this` binding.
-     *
-     * @private
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @returns {number} Returns the sum.
-     */
-    function baseSum(collection, iteratee) {
-      var result = 0;
-      baseEach(collection, function(value, index, collection) {
-        result += +iteratee(value, index, collection) || 0;
-      });
-      return result;
-    }
-
-    /**
-     * The base implementation of `_.uniq` without support for callback shorthands
-     * and `this` binding.
-     *
-     * @private
-     * @param {Array} array The array to inspect.
-     * @param {Function} [iteratee] The function invoked per iteration.
-     * @returns {Array} Returns the new duplicate-value-free array.
-     */
-    function baseUniq(array, iteratee) {
-      var index = -1,
-          indexOf = getIndexOf(),
-          length = array.length,
-          isCommon = indexOf == baseIndexOf,
-          isLarge = isCommon && length >= LARGE_ARRAY_SIZE,
-          seen = isLarge ? createCache() : null,
-          result = [];
-
-      if (seen) {
-        indexOf = cacheIndexOf;
-        isCommon = false;
-      } else {
-        isLarge = false;
-        seen = iteratee ? [] : result;
-      }
-      outer:
-      while (++index < length) {
-        var value = array[index],
-            computed = iteratee ? iteratee(value, index, array) : value;
-
-        if (isCommon && value === value) {
-          var seenIndex = seen.length;
-          while (seenIndex--) {
-            if (seen[seenIndex] === computed) {
-              continue outer;
-            }
-          }
-          if (iteratee) {
-            seen.push(computed);
-          }
-          result.push(value);
-        }
-        else if (indexOf(seen, computed, 0) < 0) {
-          if (iteratee || isLarge) {
-            seen.push(computed);
-          }
-          result.push(value);
-        }
-      }
-      return result;
-    }
-
-    /**
-     * The base implementation of `_.values` and `_.valuesIn` which creates an
-     * array of `object` property values corresponding to the property names
-     * of `props`.
-     *
-     * @private
-     * @param {Object} object The object to query.
-     * @param {Array} props The property names to get values for.
-     * @returns {Object} Returns the array of property values.
-     */
-    function baseValues(object, props) {
-      var index = -1,
-          length = props.length,
-          result = Array(length);
-
-      while (++index < length) {
-        result[index] = object[props[index]];
-      }
-      return result;
-    }
-
-    /**
-     * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`,
-     * and `_.takeWhile` without support for callback shorthands and `this` binding.
-     *
-     * @private
-     * @param {Array} array The array to query.
-     * @param {Function} predicate The function invoked per iteration.
-     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
-     * @param {boolean} [fromRight] Specify iterating from right to left.
-     * @returns {Array} Returns the slice of `array`.
-     */
-    function baseWhile(array, predicate, isDrop, fromRight) {
-      var length = array.length,
-          index = fromRight ? length : -1;
-
-      while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}
-      return isDrop
-        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
-        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
-    }
-
-    /**
-     * The base implementation of `wrapperValue` which returns the result of
-     * performing a sequence of actions on the unwrapped `value`, where each
-     * successive action is supplied the return value of the previous.
-     *
-     * @private
-     * @param {*} value The unwrapped value.
-     * @param {Array} actions Actions to peform to resolve the unwrapped value.
-     * @returns {*} Returns the resolved value.
-     */
-    function baseWrapperValue(value, actions) {
-      var result = value;
-      if (result instanceof LazyWrapper) {
-        result = result.value();
-      }
-      var index = -1,
-          length = actions.length;
-
-      while (++index < length) {
-        var action = actions[index];
-        result = action.func.apply(action.thisArg, arrayPush([result], action.args));
-      }
-      return result;
-    }
-
-    /**
-     * Performs a binary search of `array` to determine the index at which `value`
-     * should be inserted into `array` in order to maintain its sort order.
-     *
-     * @private
-     * @param {Array} array The sorted array to inspect.
-     * @param {*} value The value to evaluate.
-     * @param {boolean} [retHighest] Specify returning the highest qualified index.
-     * @returns {number} Returns the index at which `value` should be inserted
-     *  into `array`.
-     */
-    function binaryIndex(array, value, retHighest) {
-      var low = 0,
-          high = array ? array.length : low;
-
-      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
-        while (low < high) {
-          var mid = (low + high) >>> 1,
-              computed = array[mid];
-
-          if ((retHighest ? (computed <= value) : (computed < value)) && computed !== null) {
-            low = mid + 1;
-          } else {
-            high = mid;
-          }
-        }
-        return high;
-      }
-      return binaryIndexBy(array, value, identity, retHighest);
-    }
-
-    /**
-     * This function is like `binaryIndex` except that it invokes `iteratee` for
-     * `value` and each element of `array` to compute their sort ranking. The
-     * iteratee is invoked with one argument; (value).
-     *
-     * @private
-     * @param {Array} array The sorted array to inspect.
-     * @param {*} value The value to evaluate.
-     * @param {Function} iteratee The function invoked per iteration.
-     * @param {boolean} [retHighest] Specify returning the highest qualified index.
-     * @returns {number} Returns the index at which `value` should be inserted
-     *  into `array`.
-     */
-    function binaryIndexBy(array, value, iteratee, retHighest) {
-      value = iteratee(value);
-
-      var low = 0,
-          high = array ? array.length : 0,
-          valIsNaN = value !== value,
-          valIsNull = value === null,
-          valIsUndef = value === undefined;
-
-      while (low < high) {
-        var mid = nativeFloor((low + high) / 2),
-            computed = iteratee(array[mid]),
-            isDef = computed !== undefined,
-            isReflexive = computed === computed;
-
-        if (valIsNaN) {
-          var setLow = isReflexive || retHighest;
-        } else if (valIsNull) {
-          setLow = isReflexive && isDef && (retHighest || computed != null);
-        } else if (valIsUndef) {
-          setLow = isReflexive && (retHighest || isDef);
-        } else if (computed == null) {
-          setLow = false;
-        } else {
-          setLow = retHighest ? (computed <= value) : (computed < value);
-        }
-        if (setLow) {
-          low = mid + 1;
-        } else {
-          high = mid;
-        }
-      }
-      return nativeMin(high, MAX_ARRAY_INDEX);
-    }
-
-    /**
-     * A specialized version of `baseCallback` which only supports `this` binding
-     * and specifying the number of arguments to provide to `func`.
-     *
-     * @private
-     * @param {Function} func The function to bind.
-     * @param {*} thisArg The `this` binding of `func`.
-     * @param {number} [argCount] The number of arguments to provide to `func`.
-     * @returns {Function} Returns the callback.
-     */
-    function bindCallback(func, thisArg, argCount) {
-      if (typeof func != 'function') {
-        return identity;
-      }
-      if (thisArg === undefined) {
-        return func;
-      }
-      switch (argCount) {
-        case 1: return function(value) {
-          return func.call(thisArg, value);
-        };
-        case 3: return function(value, index, collection) {
-          return func.call(thisArg, value, index, collection);
-        };
-        case 4: return function(accumulator, value, index, collection) {
-          return func.call(thisArg, accumulator, value, index, collection);
-        };
-        case 5: return function(value, other, key, object, source) {
-          return func.call(thisArg, value, other, key, object, source);
-        };
-      }
-      return function() {
-        return func.apply(thisArg, arguments);
-      };
-    }
-
-    /**
-     * Creates a clone of the given array buffer.
-     *
-     * @private
-     * @param {ArrayBuffer} buffer The array buffer to clone.
-     * @returns {ArrayBuffer} Returns the cloned array buffer.
-     */
-    function bufferClone(buffer) {
-      var result = new ArrayBuffer(buffer.byteLength),
-          view = new Uint8Array(result);
-
-      view.set(new Uint8Array(buffer));
-      return result;
-    }
-
-    /**
-     * Creates an array that is the composition of partially applied arguments,
-     * placeholders, and provided arguments into a single array of arguments.
-     *
-     * @private
-     * @param {Array|Object} args The provided arguments.
-     * @param {Array} partials The arguments to prepend to those provided.
-     * @param {Array} holders The `partials` placeholder indexes.
-     * @returns {Array} Returns the new array of composed arguments.
-     */
-    function composeArgs(args, partials, holders) {
-      var holdersLength = holders.length,
-          argsIndex = -1,
-          argsLength = nativeMax(args.length - holdersLength, 0),
-          leftIndex = -1,
-          leftLength = partials.length,
-          result = Array(leftLength + argsLength);
-
-      while (++leftIndex < leftLength) {
-        result[leftIndex] = partials[leftIndex];
-      }
-      while (++argsIndex < holdersLength) {
-        result[holders[argsIndex]] = args[argsIndex];
-      }
-      while (argsLength--) {
-        result[leftIndex++] = args[argsIndex++];
-      }
-      return result;
-    }
-
-    /**
-     * This function is like `composeArgs` except that the arguments composition
-     * is tailored for `_.partialRight`.
-     *
-     * @private
-     * @param {Array|Object} args The provided arguments.
-     * @param {Array} partials The arguments to append to those provided.
-     * @param {Array} holders The `partials` placeholder indexes.
-     * @returns {Array} Returns the new array of composed arguments.
-     */
-    function composeArgsRight(args, partials, holders) {
-      var holdersIndex = -1,
-          holdersLength = holders.length,
-          argsIndex = -1,
-          argsLength = nativeMax(args.length - holdersLength, 0),
-          rightIndex = -1,
-          rightLength = partials.length,
-          result = Array(argsLength + rightLength);
-
-      while (++argsIndex < argsLength) {
-        result[argsIndex] = args[argsIndex];
-      }
-      var offset = argsIndex;
-      while (++rightIndex < rightLength) {
-        result[offset + rightIndex] = partials[rightIndex];
-      }
-      while (++holdersIndex < holdersLength) {
-        result[offset + holders[holdersIndex]] = args[argsIndex++];
-      }
-      return result;
-    }
-
-    /**
-     * Creates a `_.countBy`, `_.groupBy`, `_.indexBy`, or `_.partition` function.
-     *
-     * @private
-     * @param {Function} setter The function to set keys and values of the accumulator object.
-     * @param {Function} [initializer] The function to initialize the accumulator object.
-     * @returns {Function} Returns the new aggregator function.
-     */
-    function createAggregator(setter, initializer) {
-      return function(collection, iteratee, thisArg) {
-        var result = initializer ? initializer() : {};
-        iteratee = getCallback(iteratee, thisArg, 3);
-
-        if (isArray(collection)) {
-          var index = -1,
-              length = collection.length;
-
-          while (++index < length) {
-            var value = collection[index];
-            setter(result, value, iteratee(value, index, collection), collection);
-          }
-        } else {
-          baseEach(collection, function(value, key, collection) {
-            setter(result, value, iteratee(value, key, collection), collection);
-          });
-        }
-        return result;
-      };
-    }
-
-    /**
-     * Creates a `_.assign`, `_.defaults`, or `_.merge` function.
-     *
-     * @private
-     * @param {Function} assigner The function to assign values.
-     * @returns {Function} Returns the new assigner function.
-     */
-    function createAssigner(assigner) {
-      return restParam(function(object, sources) {
-        var index = -1,
-            length = object == null ? 0 : sources.length,
-            customizer = length > 2 ? sources[length - 2] : undefined,
-            guard = length > 2 ? sources[2] : undefined,
-            thisArg = length > 1 ? sources[length - 1] : undefined;
-
-        if (typeof customizer == 'function') {
-          customizer = bindCallback(customizer, thisArg, 5);
-          length -= 2;
-        } else {
-          customizer = typeof thisArg == 'function' ? thisArg : undefined;
-          length -= (customizer ? 1 : 0);
-        }
-        if (guard && isIterateeCall(sources[0], sources[1], guard)) {
-          customizer = length < 3 ? undefined : customizer;
-          length = 1;
-        }
-        while (++index < length) {
-          var source = sources[index];
-          if (source) {
-            assigner(object, source, customizer);
-          }
-        }
-        return object;
-      });
-    }
-
-    /**
-     * Creates a `baseEach` or `baseEachRight` function.
-     *
-     * @private
-     * @param {Function} eachFunc The function to iterate over a collection.
-     * @param {boolean} [fromRight] Specify iterating from right to left.
-     * @returns {Function} Returns the new base function.
-     */
-    function createBaseEach(eachFunc, fromRight) {
-      return function(collection, iteratee) {
-        var length = collection ? getLength(collection) : 0;
-        if (!isLength(length)) {
-          return eachFunc(collection, iteratee);
-        }
-        var index = fromRight ? length : -1,
-            iterable = toObject(collection);
-
-        while ((fromRight ? index-- : ++index < length)) {
-          if (iteratee(iterable[index], index, iterable) === false) {
-            break;
-          }
-        }
-        return collection;
-      };
-    }
-
-    /**
-     * Creates a base function for `_.forIn` or `_.forInRight`.
-     *
-     * @private
-     * @param {boolean} [fromRight] Specify iterating from right to left.
-     * @returns {Function} Returns the new base function.
-     */
-    function createBaseFor(fromRight) {
-      return function(object, iteratee, keysFunc) {
-        var iterable = toObject(object),
-            props = keysFunc(object),
-            length = props.length,
-            index = fromRight ? length : -1;
-
-        while ((fromRight ? index-- : ++index < length)) {
-          var key = props[index];
-          if (iteratee(iterable[key], key, iterable) === false) {
-            break;
-          }
-        }
-        return object;
-      };
-    }
-
-    /**
-     * Creates a function that wraps `func` and invokes it with the `this`
-     * binding of `thisArg`.
-     *
-     * @private
-     * @param {Function} func The function to bind.
-     * @param {*} [thisArg] The `this` binding of `func`.
-     * @returns {Function} Returns the new bound function.
-     */
-    function createBindWrapper(func, thisArg) {
-      var Ctor = createCtorWrapper(func);
-
-      function wrapper() {
-        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
-        return fn.apply(thisArg, arguments);
-      }
-      return wrapper;
-    }
-
-    /**
-     * Creates a `Set` cache object to optimize linear searches of large arrays.
-     *
-     * @private
-     * @param {Array} [values] The values to cache.
-     * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`.
-     */
-    function createCache(values) {
-      return (nativeCreate && Set) ? new SetCache(values) : null;
-    }
-
-    /**
-     * Creates a function that produces compound words out of the words in a
-     * given string.
-     *
-     * @private
-     * @param {Function} callback The function to combine each word.
-     * @returns {Function} Returns the new compounder function.
-     */
-    function createCompounder(callback) {
-      return function(string) {
-        var index = -1,
-            array = words(deburr(string)),
-            length = array.length,
-            result = '';
-
-        while (++index < length) {
-          result = callback(result, array[index], index);
-        }
-        return result;
-      };
-    }
-
-    /**
-     * Creates a function that produces an instance of `Ctor` regardless of
-     * whether it was invoked as part of a `new` expression or by `call` or `apply`.
-     *
-     * @private
-     * @param {Function} Ctor The constructor to wrap.
-     * @returns {Function} Returns the new wrapped function.
-     */
-    function createCtorWrapper(Ctor) {
-      return function() {
-        // Use a `switch` statement to work with class constructors.
-        // See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
-        // for more details.
-        var args = arguments;
-        switch (args.length) {
-          case 0: return new Ctor;
-          case 1: return new Ctor(args[0]);
-          case 2: return new Ctor(args[0], args[1]);
-          case 3: return new Ctor(args[0], args[1], args[2]);
-          case 4: return new Ctor(args[0], args[1], args[2], args[3]);
-          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
-          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
-          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
-        }
-        var thisBinding = baseCreate(Ctor.prototype),
-            result = Ctor.apply(thisBinding, args);
-
-        // Mimic the constructor's `return` behavior.
-        // See https://es5.github.io/#x13.2.2 for more details.
-        return isObject(result) ? result : thisBinding;
-      };
-    }
-
-    /**
-     * Creates a `_.curry` or `_.curryRight` function.
-     *
-     * @private
-     * @param {boolean} flag The curry bit flag.
-     * @returns {Function} Returns the new curry function.
-     */
-    function createCurry(flag) {
-      function curryFunc(func, arity, guard) {
-        if (guard && isIterateeCall(func, arity, guard)) {
-          arity = undefined;
-        }
-        var result = createWrapper(func, flag, undefined, undefined, undefined, undefined, undefined, arity);
-        result.placeholder = curryFunc.placeholder;
-        return result;
-      }
-      return curryFunc;
-    }
-
-    /**
-     * Creates a `_.defaults` or `_.defaultsDeep` function.
-     *
-     * @private
-     * @param {Function} assigner The function to assign values.
-     * @param {Function} customizer The function to customize assigned values.
-     * @returns {Function} Returns the new defaults function.
-     */
-    function createDefaults(assigner, customizer) {
-      return restParam(function(args) {
-        var object = args[0];
-        if (object == null) {
-          return object;
-        }
-        args.push(customizer);
-        return assigner.apply(undefined, args);
-      });
-    }
-
-    /**
-     * Creates a `_.max` or `_.min` function.
-     *
-     * @private
-     * @param {Function} comparator The function used to compare values.
-     * @param {*} exValue The initial extremum value.
-     * @returns {Function} Returns the new extremum function.
-     */
-    function createExtremum(comparator, exValue) {
-      return function(collection, iteratee, thisArg) {
-        if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
-          iteratee = undefined;
-        }
-        iteratee = getCallback(iteratee, thisArg, 3);
-        if (iteratee.length == 1) {
-          collection = isArray(collection) ? collection : toIterable(collection);
-          var result = arrayExtremum(collection, iteratee, comparator, exValue);
-          if (!(collection.length && result === exValue)) {
-            return result;
-          }
-        }
-        return baseExtremum(collection, iteratee, comparator, exValue);
-      };
-    }
-
-    /**
-     * Creates a `_.find` or `_.findLast` function.
-     *
-     * @private
-     * @param {Function} eachFunc The function to iterate over a collection.
-     * @param {boolean} [fromRight] Specify iterating from right to left.
-     * @returns {Function} Returns the new find function.
-     */
-    function createFind(eachFunc, fromRight) {
-      return function(collection, predicate, thisArg) {
-        predicate = getCallback(predicate, thisArg, 3);
-        if (isArray(collection)) {
-          var index = baseFindIndex(collection, predicate, fromRight);
-          return index > -1 ? collection[index] : undefined;
-        }
-        return baseFind(collection, predicate, eachFunc);
-      };
-    }
-
-    /**
-     * Creates a `_.findIndex` or `_.findLastIndex` function.
-     *
-     * @private
-     * @param {boolean} [fromRight] Specify iterating from right to left.
-     * @returns {Function} Returns the new find function.
-     */
-    function createFindIndex(fromRight) {
-      return function(array, predicate, thisArg) {
-        if (!(array && array.length)) {
-          return -1;
-        }
-        predicate = getCallback(predicate, thisArg, 3);
-        return baseFindIndex(array, predicate, fromRight);
-      };
-    }
-
-    /**
-     * Creates a `_.findKey` or `_.findLastKey` function.
-     *
-     * @private
-     * @param {Function} objectFunc The function to iterate over an object.
-     * @returns {Function} Returns the new find function.
-     */
-    function createFindKey(objectFunc) {
-      return function(object, predicate, thisArg) {
-        predicate = getCallback(predicate, thisArg, 3);
-        return baseFind(object, predicate, objectFunc, true);
-      };
-    }
-
-    /**
-     * Creates a `_.flow` or `_.flowRight` function.
-     *
-     * @private
-     * @param {boolean} [fromRight] Specify iterating from right to left.
-     * @returns {Function} Returns the new flow function.
-     */
-    function createFlow(fromRight) {
-      return function() {
-        var wrapper,
-            length = arguments.length,
-            index = fromRight ? length : -1,
-            leftIndex = 0,
-            funcs = Array(length);
-
-        while ((fromRight ? index-- : ++index < length)) {
-          var func = funcs[leftIndex++] = arguments[index];
-          if (typeof func != 'function') {
-            throw new TypeError(FUNC_ERROR_TEXT);
-          }
-          if (!wrapper && LodashWrapper.prototype.thru && getFuncName(func) == 'wrapper') {
-            wrapper = new LodashWrapper([], true);
-          }
-        }
-        index = wrapper ? -1 : length;
-        while (++index < length) {
-          func = funcs[index];
-
-          var funcName = getFuncName(func),
-              data = funcName == 'wrapper' ? getData(func) : undefined;
-
-          if (data && isLaziable(data[0]) && data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && !data[4].length && data[9] == 1) {
-            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
-          } else {
-            wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func);
-          }
-        }
-        return function() {
-          var args = arguments,
-              value = args[0];
-
-          if (wrapper && args.length == 1 && isArray(value) && value.length >= LARGE_ARRAY_SIZE) {
-            return wrapper.plant(value).value();
-          }
-          var index = 0,
-              result = length ? funcs[index].apply(this, args) : value;
-
-          while (++index < length) {
-            result = funcs[index].call(this, result);
-          }
-          return result;
-        };
-      };
-    }
-
-    /**
-     * Creates a function for `_.forEach` or `_.forEachRight`.
-     *
-     * @private
-     * @param {Function} arrayFunc The function to iterate over an array.
-     * @param {Function} eachFunc The function to iterate over a collection.
-     * @returns {Function} Returns the new each function.
-     */
-    function createForEach(arrayFunc, eachFunc) {
-      return function(collection, iteratee, thisArg) {
-        return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))
-          ? arrayFunc(collection, iteratee)
-          : eachFunc(collection, bindCallback(iteratee, thisArg, 3));
-      };
-    }
-
-    /**
-     * Creates a function for `_.forIn` or `_.forInRight`.
-     *
-     * @private
-     * @param {Function} objectFunc The function to iterate over an object.
-     * @returns {Function} Returns the new each function.
-     */
-    function createForIn(objectFunc) {
-      return function(object, iteratee, thisArg) {
-        if (typeof iteratee != 'function' || thisArg !== undefined) {
-          iteratee = bindCallback(iteratee, thisArg, 3);
-        }
-        return objectFunc(object, iteratee, keysIn);
-      };
-    }
-
-    /**
-     * Creates a function for `_.forOwn` or `_.forOwnRight`.
-     *
-     * @private
-     * @param {Function} objectFunc The function to iterate over an object.
-     * @returns {Function} Returns the new each function.
-     */
-    function createForOwn(objectFunc) {
-      return function(object, iteratee, thisArg) {
-        if (typeof iteratee != 'function' || thisArg !== undefined) {
-          iteratee = bindCallback(iteratee, thisArg, 3);
-        }
-        return objectFunc(object, iteratee);
-      };
-    }
-
-    /**
-     * Creates a function for `_.mapKeys` or `_.mapValues`.
-     *
-     * @private
-     * @param {boolean} [isMapKeys] Specify mapping keys instead of values.
-     * @returns {Function} Returns the new map function.
-     */
-    function createObjectMapper(isMapKeys) {
-      return function(object, iteratee, thisArg) {
-        var result = {};
-        iteratee = getCallback(iteratee, thisArg, 3);
-
-        baseForOwn(object, function(value, key, object) {
-          var mapped = iteratee(value, key, object);
-          key = isMapKeys ? mapped : key;
-          value = isMapKeys ? value : mapped;
-          result[key] = value;
-        });
-        return result;
-      };
-    }
-
-    /**
-     * Creates a function for `_.padLeft` or `_.padRight`.
-     *
-     * @private
-     * @param {boolean} [fromRight] Specify padding from the right.
-     * @returns {Function} Returns the new pad function.
-     */
-    function createPadDir(fromRight) {
-      return function(string, length, chars) {
-        string = baseToString(string);
-        return (fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string);
-      };
-    }
-
-    /**
-     * Creates a `_.partial` or `_.partialRight` function.
-     *
-     * @private
-     * @param {boolean} flag The partial bit flag.
-     * @returns {Function} Returns the new partial function.
-     */
-    function createPartial(flag) {
-      var partialFunc = restParam(function(func, partials) {
-        var holders = replaceHolders(partials, partialFunc.placeholder);
-        return createWrapper(func, flag, undefined, partials, holders);
-      });
-      return partialFunc;
-    }
-
-    /**
-     * Creates a function for `_.reduce` or `_.reduceRight`.
-     *
-     * @private
-     * @param {Function} arrayFunc The function to iterate over an array.
-     * @param {Function} eachFunc The function to iterate over a collection.
-     * @returns {Function} Returns the new each function.
-     */
-    function createReduce(arrayFunc, eachFunc) {
-      return function(collection, iteratee, accumulator, thisArg) {
-        var initFromArray = arguments.length < 3;
-        return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))
-          ? arrayFunc(collection, iteratee, accumulator, initFromArray)
-          : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);
-      };
-    }
-
-    /**
-     * Creates a function that wraps `func` and invokes it with optional `this`
-     * binding of, partial application, and currying.
-     *
-     * @private
-     * @param {Function|string} func The function or method name to reference.
-     * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.
-     * @param {*} [thisArg] The `this` binding of `func`.
-     * @param {Array} [partials] The arguments to prepend to those provided to the new function.
-     * @param {Array} [holders] The `partials` placeholder indexes.
-     * @param {Array} [partialsRight] The arguments to append to those provided to the new function.
-     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
-     * @param {Array} [argPos] The argument positions of the new function.
-     * @param {number} [ary] The arity cap of `func`.
-     * @param {number} [arity] The arity of `func`.
-     * @returns {Function} Returns the new wrapped function.
-     */
-    function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
-      var isAry = bitmask & ARY_FLAG,
-          isBind = bitmask & BIND_FLAG,
-          isBindKey = bitmask & BIND_KEY_FLAG,
-          isCurry = bitmask & CURRY_FLAG,
-          isCurryBound = bitmask & CURRY_BOUND_FLAG,
-          isCurryRight = bitmask & CURRY_RIGHT_FLAG,
-          Ctor = isBindKey ? undefined : createCtorWrapper(func);
-
-      function wrapper() {
-        // Avoid `arguments` object use disqualifying optimizations by
-        // converting it to an array before providing it to other functions.
-        var length = arguments.length,
-            index = length,
-            args = Array(length);
-
-        while (index--) {
-          args[index] = arguments[index];
-        }
-        if (partials) {
-          args = composeArgs(args, partials, holders);
-        }
-        if (partialsRight) {
-          args = composeArgsRight(args, partialsRight, holdersRight);
-        }
-        if (isCurry || isCurryRight) {
-          var placeholder = wrapper.placeholder,
-              argsHolders = replaceHolders(args, placeholder);
-
-          length -= argsHolders.length;
-          if (length < arity) {
-            var newArgPos = argPos ? arrayCopy(argPos) : undefined,
-                newArity = nativeMax(arity - length, 0),
-                newsHolders = isCurry ? argsHolders : undefined,
-                newHoldersRight = isCurry ? undefined : argsHolders,
-                newPartials = isCurry ? args : undefined,
-                newPartialsRight = isCurry ? undefined : args;
-
-            bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);
-            bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);
-
-            if (!isCurryBound) {
-              bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);
-            }
-            var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],
-                result = createHybridWrapper.apply(undefined, newData);
-
-            if (isLaziable(func)) {
-              setData(result, newData);
-            }
-            result.placeholder = placeholder;
-            return result;
-          }
-        }
-        var thisBinding = isBind ? thisArg : this,
-            fn = isBindKey ? thisBinding[func] : func;
-
-        if (argPos) {
-          args = reorder(args, argPos);
-        }
-        if (isAry && ary < args.length) {
-          args.length = ary;
-        }
-        if (this && this !== root && this instanceof wrapper) {
-          fn = Ctor || createCtorWrapper(func);
-        }
-        return fn.apply(thisBinding, args);
-      }
-      return wrapper;
-    }
-
-    /**
-     * Creates the padding required for `string` based on the given `length`.
-     * The `chars` string is truncated if the number of characters exceeds `length`.
-     *
-     * @private
-     * @param {string} string The string to create padding for.
-     * @param {number} [length=0] The padding length.
-     * @param {string} [chars=' '] The string used as padding.
-     * @returns {string} Returns the pad for `string`.
-     */
-    function createPadding(string, length, chars) {
-      var strLength = string.length;
-      length = +length;
-
-      if (strLength >= length || !nativeIsFinite(length)) {
-        return '';
-      }
-      var padLength = length - strLength;
-      chars = chars == null ? ' ' : (chars + '');
-      return repeat(chars, nativeCeil(padLength / chars.length)).slice(0, padLength);
-    }
-
-    /**
-     * Creates a function that wraps `func` and invokes it with the optional `this`
-     * binding of `thisArg` and the `partials` prepended to those provided to
-     * the wrapper.
-     *
-     * @private
-     * @param {Function} func The function to partially apply arguments to.
-     * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.
-     * @param {*} thisArg The `this` binding of `func`.
-     * @param {Array} partials The arguments to prepend to those provided to the new function.
-     * @returns {Function} Returns the new bound function.
-     */
-    function createPartialWrapper(func, bitmask, thisArg, partials) {
-      var isBind = bitmask & BIND_FLAG,
-          Ctor = createCtorWrapper(func);
-
-      function wrapper() {
-        // Avoid `arguments` object use disqualifying optimizations by
-        // converting it to an array before providing it `func`.
-        var argsIndex = -1,
-            argsLength = arguments.length,
-            leftIndex = -1,
-            leftLength = partials.length,
-            args = Array(leftLength + argsLength);
-
-        while (++leftIndex < leftLength) {
-          args[leftIndex] = partials[leftIndex];
-        }
-        while (argsLength--) {
-          args[leftIndex++] = arguments[++argsIndex];
-        }
-        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
-        return fn.apply(isBind ? thisArg : this, args);
-      }
-      return wrapper;
-    }
-
-    /**
-     * Creates a `_.ceil`, `_.floor`, or `_.round` function.
-     *
-     * @private
-     * @param {string} methodName The name of the `Math` method to use when rounding.
-     * @returns {Function} Returns the new round function.
-     */
-    function createRound(methodName) {
-      var func = Math[methodName];
-      return function(number, precision) {
-        precision = precision === undefined ? 0 : (+precision || 0);
-        if (precision) {
-          precision = pow(10, precision);
-          return func(number * precision) / precision;
-        }
-        return func(number);
-      };
-    }
-
-    /**
-     * Creates a `_.sortedIndex` or `_.sortedLastIndex` function.
-     *
-     * @private
-     * @param {boolean} [retHighest] Specify returning the highest qualified index.
-     * @returns {Function} Returns the new index function.
-     */
-    function createSortedIndex(retHighest) {
-      return function(array, value, iteratee, thisArg) {
-        var callback = getCallback(iteratee);
-        return (iteratee == null && callback === baseCallback)
-          ? binaryIndex(array, value, retHighest)
-          : binaryIndexBy(array, value, callback(iteratee, thisArg, 1), retHighest);
-      };
-    }
-
-    /**
-     * Creates a function that either curries or invokes `func` with optional
-     * `this` binding and partially applied arguments.
-     *
-     * @private
-     * @param {Function|string} func The function or method name to reference.
-     * @param {number} bitmask The bitmask of flags.
-     *  The bitmask may be composed of the following flags:
-     *     1 - `_.bind`
-     *     2 - `_.bindKey`
-     *     4 - `_.curry` or `_.curryRight` of a bound function
-     *     8 - `_.curry`
-     *    16 - `_.curryRight`
-     *    32 - `_.partial`
-     *    64 - `_.partialRight`
-     *   128 - `_.rearg`
-     *   256 - `_.ary`
-     * @param {*} [thisArg] The `this` binding of `func`.
-     * @param {Array} [partials] The arguments to be partially applied.
-     * @param {Array} [holders] The `partials` placeholder indexes.
-     * @param {Array} [argPos] The argument positions of the new function.
-     * @param {number} [ary] The arity cap of `func`.
-     * @param {number} [arity] The arity of `func`.
-     * @returns {Function} Returns the new wrapped function.
-     */
-    function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
-      var isBindKey = bitmask & BIND_KEY_FLAG;
-      if (!isBindKey && typeof func != 'function') {
-        throw new TypeError(FUNC_ERROR_TEXT);
-      }
-      var length = partials ? partials.length : 0;
-      if (!length) {
-        bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);
-        partials = holders = undefined;
-      }
-      length -= (holders ? holders.length : 0);
-      if (bitmask & PARTIAL_RIGHT_FLAG) {
-        var partialsRight = partials,
-            holdersRight = holders;
-
-        partials = holders = undefined;
-      }
-      var data = isBindKey ? undefined : getData(func),
-          newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];
-
-      if (data) {
-        mergeData(newData, data);
-        bitmask = newData[1];
-        arity = newData[9];
-      }
-      newData[9] = arity == null
-        ? (isBindKey ? 0 : func.length)
-        : (nativeMax(arity - length, 0) || 0);
-
-      if (bitmask == BIND_FLAG) {
-        var result = createBindWrapper(newData[0], newData[2]);
-      } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {
-        result = createPartialWrapper.apply(undefined, newData);
-      } else {
-        result = createHybridWrapper.apply(undefined, newData);
-      }
-      var setter = data ? baseSetData : setData;
-      return setter(result, newData);
-    }
-
-    /**
-     * A specialized version of `baseIsEqualDeep` for arrays with support for
-     * partial deep comparisons.
-     *
-     * @private
-     * @param {Array} array The array to compare.
-     * @param {Array} other The other array to compare.
-     * @param {Function} equalFunc The function to determine equivalents of values.
-     * @param {Function} [customizer] The function to customize comparing arrays.
-     * @param {boolean} [isLoose] Specify performing partial comparisons.
-     * @param {Array} [stackA] Tracks traversed `value` objects.
-     * @param {Array} [stackB] Tracks traversed `other` objects.
-     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
-     */
-    function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {
-      var index = -1,
-          arrLength = array.length,
-          othLength = other.length;
-
-      if (arrLength != othLength && !(isLoose && othLength > arrLength)) {
-        return false;
-      }
-      // Ignore non-index properties.
-      while (++index < arrLength) {
-        var arrValue = array[index],
-            othValue = other[index],
-            result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;
-
-        if (result !== undefined) {
-          if (result) {
-            continue;
-          }
-          return false;
-        }
-        // Recursively compare arrays (susceptible to call stack limits).
-        if (isLoose) {
-          if (!arraySome(other, function(othValue) {
-                return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
-              })) {
-            return false;
-          }
-        } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {
-          return false;
-        }
-      }
-      return true;
-    }
-
-    /**
-     * A specialized version of `baseIsEqualDeep` for comparing objects of
-     * the same `toStringTag`.
-     *
-     * **Note:** This function only supports comparing values with tags of
-     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
-     *
-     * @private
-     * @param {Object} object The object to compare.
-     * @param {Object} other The other object to compare.
-     * @param {string} tag The `toStringTag` of the objects to compare.
-     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
-     */
-    function equalByTag(object, other, tag) {
-      switch (tag) {
-        case boolTag:
-        case dateTag:
-          // Coerce dates and booleans to numbers, dates to milliseconds and booleans
-          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.
-          return +object == +other;
-
-        case errorTag:
-          return object.name == other.name && object.message == other.message;
-
-        case numberTag:
-          // Treat `NaN` vs. `NaN` as equal.
-          return (object != +object)
-            ? other != +other
-            : object == +other;
-
-        case regexpTag:
-        case stringTag:
-          // Coerce regexes to strings and treat strings primitives and string
-          // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.
-          return object == (other + '');
-      }
-      return false;
-    }
-
-    /**
-     * A specialized version of `baseIsEqualDeep` for objects with support for
-     * partial deep comparisons.
-     *
-     * @private
-     * @param {Object} object The object to compare.
-     * @param {Object} other The other object to compare.
-     * @param {Function} equalFunc The function to determine equivalents of values.
-     * @param {Function} [customizer] The function to customize comparing values.
-     * @param {boolean} [isLoose] Specify performing partial comparisons.
-     * @param {Array} [stackA] Tracks traversed `value` objects.
-     * @param {Array} [stackB] Tracks traversed `other` objects.
-     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
-     */
-    function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
-      var objProps = keys(object),
-          objLength = objProps.length,
-          othProps = keys(other),
-          othLength = othProps.length;
-
-      if (objLength != othLength && !isLoose) {
-        return false;
-      }
-      var index = objLength;
-      while (index--) {
-        var key = objProps[index];
-        if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {
-          return false;
-        }
-      }
-      var skipCtor = isLoose;
-      while (++index < objLength) {
-        key = objProps[index];
-        var objValue = object[key],
-            othValue = other[key],
-            result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;
-
-        // Recursively compare objects (susceptible to call stack limits).
-        if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {
-          return false;
-        }
-        skipCtor || (skipCtor = key == 'constructor');
-      }
-      if (!skipCtor) {
-        var objCtor = object.constructor,
-            othCtor = other.constructor;
-
-        // Non `Object` object instances with different constructors are not equal.
-        if (objCtor != othCtor &&
-            ('constructor' in object && 'constructor' in other) &&
-            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
-              typeof othCtor == 'function' && othCtor instanceof othCtor)) {
-          return false;
-        }
-      }
-      return true;
-    }
-
-    /**
-     * Gets the appropriate "callback" function. If the `_.callback` method is
-     * customized this function returns the custom method, otherwise it returns
-     * the `baseCallback` function. If arguments are provided the chosen function
-     * is invoked with them and its result is returned.
-     *
-     * @private
-     * @returns {Function} Returns the chosen function or its result.
-     */
-    function getCallback(func, thisArg, argCount) {
-      var result = lodash.callback || callback;
-      result = result === callback ? baseCallback : result;
-      return argCount ? result(func, thisArg, argCount) : result;
-    }
-
-    /**
-     * Gets metadata for `func`.
-     *
-     * @private
-     * @param {Function} func The function to query.
-     * @returns {*} Returns the metadata for `func`.
-     */
-    var getData = !metaMap ? noop : function(func) {
-      return metaMap.get(func);
-    };
-
-    /**
-     * Gets the name of `func`.
-     *
-     * @private
-     * @param {Function} func The function to query.
-     * @returns {string} Returns the function name.
-     */
-    function getFuncName(func) {
-      var result = func.name,
-          array = realNames[result],
-          length = array ? array.length : 0;
-
-      while (length--) {
-        var data = array[length],
-            otherFunc = data.func;
-        if (otherFunc == null || otherFunc == func) {
-          return data.name;
-        }
-      }
-      return result;
-    }
-
-    /**
-     * Gets the appropriate "indexOf" function. If the `_.indexOf` method is
-     * customized this function returns the custom method, otherwise it returns
-     * the `baseIndexOf` function. If arguments are provided the chosen function
-     * is invoked with them and its result is returned.
-     *
-     * @private
-     * @returns {Function|number} Returns the chosen function or its result.
-     */
-    function getIndexOf(collection, target, fromIndex) {
-      var result = lodash.indexOf || indexOf;
-      result = result === indexOf ? baseIndexOf : result;
-      return collection ? result(collection, target, fromIndex) : result;
-    }
-
-    /**
-     * Gets the "length" property value of `object`.
-     *
-     * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
-     * that affects Safari on at least iOS 8.1-8.3 ARM64.
-     *
-     * @private
-     * @param {Object} object The object to query.
-     * @returns {*} Returns the "length" value.
-     */
-    var getLength = baseProperty('length');
-
-    /**
-     * Gets the propery names, values, and compare flags of `object`.
-     *
-     * @private
-     * @param {Object} object The object to query.
-     * @returns {Array} Returns the match data of `object`.
-     */
-    function getMatchData(object) {
-      var result = pairs(object),
-          length = result.length;
-
-      while (length--) {
-        result[length][2] = isStrictComparable(result[length][1]);
-      }
-      return result;
-    }
-
-    /**
-     * Gets the native function at `key` of `object`.
-     *
-     * @private
-     * @param {Object} object The object to query.
-     * @param {string} key The key of the method to get.
-     * @returns {*} Returns the function if it's native, else `undefined`.
-     */
-    function getNative(object, key) {
-      var value = object == null ? undefined : object[key];
-      return isNative(value) ? value : undefined;
-    }
-
-    /**
-     * Gets the view, applying any `transforms` to the `start` and `end` positions.
-     *
-     * @private
-     * @param {number} start The start of the view.
-     * @param {number} end The end of the view.
-     * @param {Array} transforms The transformations to apply to the view.
-     * @returns {Object} Returns an object containing the `start` and `end`
-     *  positions of the view.
-     */
-    function getView(start, end, transforms) {
-      var index = -1,
-          length = transforms.length;
-
-      while (++index < length) {
-        var data = transforms[index],
-            size = data.size;
-
-        switch (data.type) {
-          case 'drop':      start += size; break;
-          case 'dropRight': end -= size; break;
-          case 'take':      end = nativeMin(end, start + size); break;
-          case 'takeRight': start = nativeMax(start, end - size); break;
-        }
-      }
-      return { 'start': start, 'end': end };
-    }
-
-    /**
-     * Initializes an array clone.
-     *
-     * @private
-     * @param {Array} array The array to clone.
-     * @returns {Array} Returns the initialized clone.
-     */
-    function initCloneArray(array) {
-      var length = array.length,
-          result = new array.constructor(length);
-
-      // Add array properties assigned by `RegExp#exec`.
-      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
-        result.index = array.index;
-        result.input = array.input;
-      }
-      return result;
-    }
-
-    /**
-     * Initializes an object clone.
-     *
-     * @private
-     * @param {Object} object The object to clone.
-     * @returns {Object} Returns the initialized clone.
-     */
-    function initCloneObject(object) {
-      var Ctor = object.constructor;
-      if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {
-        Ctor = Object;
-      }
-      return new Ctor;
-    }
-
-    /**
-     * Initializes an object clone based on its `toStringTag`.
-     *
-     * **Note:** This function only supports cloning values with tags of
-     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
-     *
-     * @private
-     * @param {Object} object The object to clone.
-     * @param {string} tag The `toStringTag` of the object to clone.
-     * @param {boolean} [isDeep] Specify a deep clone.
-     * @returns {Object} Returns the initialized clone.
-     */
-    function initCloneByTag(object, tag, isDeep) {
-      var Ctor = object.constructor;
-      switch (tag) {
-        case arrayBufferTag:
-          return bufferClone(object);
-
-        case boolTag:
-        case dateTag:
-          return new Ctor(+object);
-
-        case float32Tag: case float64Tag:
-        case int8Tag: case int16Tag: case int32Tag:
-        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
-          var buffer = object.buffer;
-          return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);
-
-        case numberTag:
-        case stringTag:
-          return new Ctor(object);
-
-        case regexpTag:
-          var result = new Ctor(object.source, reFlags.exec(object));
-          result.lastIndex = object.lastIndex;
-      }
-      return result;
-    }
-
-    /**
-     * Invokes the method at `path` on `object`.
-     *
-     * @private
-     * @param {Object} object The object to query.
-     * @param {Array|string} path The path of the method to invoke.
-     * @param {Array} args The arguments to invoke the method with.
-     * @returns {*} Returns the result of the invoked method.
-     */
-    function invokePath(object, path, args) {
-      if (object != null && !isKey(path, object)) {
-        path = toPath(path);
-        object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
-        path = last(path);
-      }
-      var func = object == null ? object : object[path];
-      return func == null ? undefined : func.apply(object, args);
-    }
-
-    /**
-     * Checks if `value` is array-like.
-     *
-     * @private
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
-     */
-    function isArrayLike(value) {
-      return value != null && isLength(getLength(value));
-    }
-
-    /**
-     * Checks if `value` is a valid array-like index.
-     *
-     * @private
-     * @param {*} value The value to check.
-     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
-     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
-     */
-    function isIndex(value, length) {
-      value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
-      length = length == null ? MAX_SAFE_INTEGER : length;
-      return value > -1 && value % 1 == 0 && value < length;
-    }
-
-    /**
-     * Checks if the provided arguments are from an iteratee call.
-     *
-     * @private
-     * @param {*} value The potential iteratee value argument.
-     * @param {*} index The potential iteratee index or key argument.
-     * @param {*} object The potential iteratee object argument.
-     * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
-     */
-    function isIterateeCall(value, index, object) {
-      if (!isObject(object)) {
-        return false;
-      }
-      var type = typeof index;
-      if (type == 'number'
-          ? (isArrayLike(object) && isIndex(index, object.length))
-          : (type == 'string' && index in object)) {
-        var other = object[index];
-        return value === value ? (value === other) : (other !== other);
-      }
-      return false;
-    }
-
-    /**
-     * Checks if `value` is a property name and not a property path.
-     *
-     * @private
-     * @param {*} value The value to check.
-     * @param {Object} [object] The object to query keys on.
-     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
-     */
-    function isKey(value, object) {
-      var type = typeof value;
-      if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {
-        return true;
-      }
-      if (isArray(value)) {
-        return false;
-      }
-      var result = !reIsDeepProp.test(value);
-      return result || (object != null && value in toObject(object));
-    }
-
-    /**
-     * Checks if `func` has a lazy counterpart.
-     *
-     * @private
-     * @param {Function} func The function to check.
-     * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.
-     */
-    function isLaziable(func) {
-      var funcName = getFuncName(func);
-      if (!(funcName in LazyWrapper.prototype)) {
-        return false;
-      }
-      var other = lodash[funcName];
-      if (func === other) {
-        return true;
-      }
-      var data = getData(other);
-      return !!data && func === data[0];
-    }
-
-    /**
-     * Checks if `value` is a valid array-like length.
-     *
-     * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
-     *
-     * @private
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
-     */
-    function isLength(value) {
-      return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
-    }
-
-    /**
-     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
-     *
-     * @private
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` if suitable for strict
-     *  equality comparisons, else `false`.
-     */
-    function isStrictComparable(value) {
-      return value === value && !isObject(value);
-    }
-
-    /**
-     * Merges the function metadata of `source` into `data`.
-     *
-     * Merging metadata reduces the number of wrappers required to invoke a function.
-     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
-     * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`
-     * augment function arguments, making the order in which they are executed important,
-     * preventing the merging of metadata. However, we make an exception for a safe
-     * common case where curried functions have `_.ary` and or `_.rearg` applied.
-     *
-     * @private
-     * @param {Array} data The destination metadata.
-     * @param {Array} source The source metadata.
-     * @returns {Array} Returns `data`.
-     */
-    function mergeData(data, source) {
-      var bitmask = data[1],
-          srcBitmask = source[1],
-          newBitmask = bitmask | srcBitmask,
-          isCommon = newBitmask < ARY_FLAG;
-
-      var isCombo =
-        (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) ||
-        (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) ||
-        (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG);
-
-      // Exit early if metadata can't be merged.
-      if (!(isCommon || isCombo)) {
-        return data;
-      }
-      // Use source `thisArg` if available.
-      if (srcBitmask & BIND_FLAG) {
-        data[2] = source[2];
-        // Set when currying a bound function.
-        newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG;
-      }
-      // Compose partial arguments.
-      var value = source[3];
-      if (value) {
-        var partials = data[3];
-        data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value);
-        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]);
-      }
-      // Compose partial right arguments.
-      value = source[5];
-      if (value) {
-        partials = data[5];
-        data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value);
-        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]);
-      }
-      // Use source `argPos` if available.
-      value = source[7];
-      if (value) {
-        data[7] = arrayCopy(value);
-      }
-      // Use source `ary` if it's smaller.
-      if (srcBitmask & ARY_FLAG) {
-        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
-      }
-      // Use source `arity` if one is not provided.
-      if (data[9] == null) {
-        data[9] = source[9];
-      }
-      // Use source `func` and merge bitmasks.
-      data[0] = source[0];
-      data[1] = newBitmask;
-
-      return data;
-    }
-
-    /**
-     * Used by `_.defaultsDeep` to customize its `_.merge` use.
-     *
-     * @private
-     * @param {*} objectValue The destination object property value.
-     * @param {*} sourceValue The source object property value.
-     * @returns {*} Returns the value to assign to the destination object.
-     */
-    function mergeDefaults(objectValue, sourceValue) {
-      return objectValue === undefined ? sourceValue : merge(objectValue, sourceValue, mergeDefaults);
-    }
-
-    /**
-     * A specialized version of `_.pick` which picks `object` properties specified
-     * by `props`.
-     *
-     * @private
-     * @param {Object} object The source object.
-     * @param {string[]} props The property names to pick.
-     * @returns {Object} Returns the new object.
-     */
-    function pickByArray(object, props) {
-      object = toObject(object);
-
-      var index = -1,
-          length = props.length,
-          result = {};
-
-      while (++index < length) {
-        var key = props[index];
-        if (key in object) {
-          result[key] = object[key];
-        }
-      }
-      return result;
-    }
-
-    /**
-     * A specialized version of `_.pick` which picks `object` properties `predicate`
-     * returns truthy for.
-     *
-     * @private
-     * @param {Object} object The source object.
-     * @param {Function} predicate The function invoked per iteration.
-     * @returns {Object} Returns the new object.
-     */
-    function pickByCallback(object, predicate) {
-      var result = {};
-      baseForIn(object, function(value, key, object) {
-        if (predicate(value, key, object)) {
-          result[key] = value;
-        }
-      });
-      return result;
-    }
-
-    /**
-     * Reorder `array` according to the specified indexes where the element at
-     * the first index is assigned as the first element, the element at
-     * the second index is assigned as the second element, and so on.
-     *
-     * @private
-     * @param {Array} array The array to reorder.
-     * @param {Array} indexes The arranged array indexes.
-     * @returns {Array} Returns `array`.
-     */
-    function reorder(array, indexes) {
-      var arrLength = array.length,
-          length = nativeMin(indexes.length, arrLength),
-          oldArray = arrayCopy(array);
-
-      while (length--) {
-        var index = indexes[length];
-        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
-      }
-      return array;
-    }
-
-    /**
-     * Sets metadata for `func`.
-     *
-     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
-     * period of time, it will trip its breaker and transition to an identity function
-     * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070)
-     * for more details.
-     *
-     * @private
-     * @param {Function} func The function to associate metadata with.
-     * @param {*} data The metadata.
-     * @returns {Function} Returns `func`.
-     */
-    var setData = (function() {
-      var count = 0,
-          lastCalled = 0;
-
-      return function(key, value) {
-        var stamp = now(),
-            remaining = HOT_SPAN - (stamp - lastCalled);
-
-        lastCalled = stamp;
-        if (remaining > 0) {
-          if (++count >= HOT_COUNT) {
-            return key;
-          }
-        } else {
-          count = 0;
-        }
-        return baseSetData(key, value);
-      };
-    }());
-
-    /**
-     * A fallback implementation of `Object.keys` which creates an array of the
-     * own enumerable property names of `object`.
-     *
-     * @private
-     * @param {Object} object The object to query.
-     * @returns {Array} Returns the array of property names.
-     */
-    function shimKeys(object) {
-      var props = keysIn(object),
-          propsLength = props.length,
-          length = propsLength && object.length;
-
-      var allowIndexes = !!length && isLength(length) &&
-        (isArray(object) || isArguments(object));
-
-      var index = -1,
-          result = [];
-
-      while (++index < propsLength) {
-        var key = props[index];
-        if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
-          result.push(key);
-        }
-      }
-      return result;
-    }
-
-    /**
-     * Converts `value` to an array-like object if it's not one.
-     *
-     * @private
-     * @param {*} value The value to process.
-     * @returns {Array|Object} Returns the array-like object.
-     */
-    function toIterable(value) {
-      if (value == null) {
-        return [];
-      }
-      if (!isArrayLike(value)) {
-        return values(value);
-      }
-      return isObject(value) ? value : Object(value);
-    }
-
-    /**
-     * Converts `value` to an object if it's not one.
-     *
-     * @private
-     * @param {*} value The value to process.
-     * @returns {Object} Returns the object.
-     */
-    function toObject(value) {
-      return isObject(value) ? value : Object(value);
-    }
-
-    /**
-     * Converts `value` to property path array if it's not one.
-     *
-     * @private
-     * @param {*} value The value to process.
-     * @returns {Array} Returns the property path array.
-     */
-    function toPath(value) {
-      if (isArray(value)) {
-        return value;
-      }
-      var result = [];
-      baseToString(value).replace(rePropName, function(match, number, quote, string) {
-        result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
-      });
-      return result;
-    }
-
-    /**
-     * Creates a clone of `wrapper`.
-     *
-     * @private
-     * @param {Object} wrapper The wrapper to clone.
-     * @returns {Object} Returns the cloned wrapper.
-     */
-    function wrapperClone(wrapper) {
-      return wrapper instanceof LazyWrapper
-        ? wrapper.clone()
-        : new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__, arrayCopy(wrapper.__actions__));
-    }
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Creates an array of elements split into groups the length of `size`.
-     * If `collection` can't be split evenly, the final chunk will be the remaining
-     * elements.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to process.
-     * @param {number} [size=1] The length of each chunk.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {Array} Returns the new array containing chunks.
-     * @example
-     *
-     * _.chunk(['a', 'b', 'c', 'd'], 2);
-     * // => [['a', 'b'], ['c', 'd']]
-     *
-     * _.chunk(['a', 'b', 'c', 'd'], 3);
-     * // => [['a', 'b', 'c'], ['d']]
-     */
-    function chunk(array, size, guard) {
-      if (guard ? isIterateeCall(array, size, guard) : size == null) {
-        size = 1;
-      } else {
-        size = nativeMax(nativeFloor(size) || 1, 1);
-      }
-      var index = 0,
-          length = array ? array.length : 0,
-          resIndex = -1,
-          result = Array(nativeCeil(length / size));
-
-      while (index < length) {
-        result[++resIndex] = baseSlice(array, index, (index += size));
-      }
-      return result;
-    }
-
-    /**
-     * Creates an array with all falsey values removed. The values `false`, `null`,
-     * `0`, `""`, `undefined`, and `NaN` are falsey.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to compact.
-     * @returns {Array} Returns the new array of filtered values.
-     * @example
-     *
-     * _.compact([0, 1, false, 2, '', 3]);
-     * // => [1, 2, 3]
-     */
-    function compact(array) {
-      var index = -1,
-          length = array ? array.length : 0,
-          resIndex = -1,
-          result = [];
-
-      while (++index < length) {
-        var value = array[index];
-        if (value) {
-          result[++resIndex] = value;
-        }
-      }
-      return result;
-    }
-
-    /**
-     * Creates an array of unique `array` values not included in the other
-     * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
-     * for equality comparisons.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to inspect.
-     * @param {...Array} [values] The arrays of values to exclude.
-     * @returns {Array} Returns the new array of filtered values.
-     * @example
-     *
-     * _.difference([1, 2, 3], [4, 2]);
-     * // => [1, 3]
-     */
-    var difference = restParam(function(array, values) {
-      return (isObjectLike(array) && isArrayLike(array))
-        ? baseDifference(array, baseFlatten(values, false, true))
-        : [];
-    });
-
-    /**
-     * Creates a slice of `array` with `n` elements dropped from the beginning.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to query.
-     * @param {number} [n=1] The number of elements to drop.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {Array} Returns the slice of `array`.
-     * @example
-     *
-     * _.drop([1, 2, 3]);
-     * // => [2, 3]
-     *
-     * _.drop([1, 2, 3], 2);
-     * // => [3]
-     *
-     * _.drop([1, 2, 3], 5);
-     * // => []
-     *
-     * _.drop([1, 2, 3], 0);
-     * // => [1, 2, 3]
-     */
-    function drop(array, n, guard) {
-      var length = array ? array.length : 0;
-      if (!length) {
-        return [];
-      }
-      if (guard ? isIterateeCall(array, n, guard) : n == null) {
-        n = 1;
-      }
-      return baseSlice(array, n < 0 ? 0 : n);
-    }
-
-    /**
-     * Creates a slice of `array` with `n` elements dropped from the end.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to query.
-     * @param {number} [n=1] The number of elements to drop.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {Array} Returns the slice of `array`.
-     * @example
-     *
-     * _.dropRight([1, 2, 3]);
-     * // => [1, 2]
-     *
-     * _.dropRight([1, 2, 3], 2);
-     * // => [1]
-     *
-     * _.dropRight([1, 2, 3], 5);
-     * // => []
-     *
-     * _.dropRight([1, 2, 3], 0);
-     * // => [1, 2, 3]
-     */
-    function dropRight(array, n, guard) {
-      var length = array ? array.length : 0;
-      if (!length) {
-        return [];
-      }
-      if (guard ? isIterateeCall(array, n, guard) : n == null) {
-        n = 1;
-      }
-      n = length - (+n || 0);
-      return baseSlice(array, 0, n < 0 ? 0 : n);
-    }
-
-    /**
-     * Creates a slice of `array` excluding elements dropped from the end.
-     * Elements are dropped until `predicate` returns falsey. The predicate is
-     * bound to `thisArg` and invoked with three arguments: (value, index, array).
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that match the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to query.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {Array} Returns the slice of `array`.
-     * @example
-     *
-     * _.dropRightWhile([1, 2, 3], function(n) {
-     *   return n > 1;
-     * });
-     * // => [1]
-     *
-     * var users = [
-     *   { 'user': 'barney',  'active': true },
-     *   { 'user': 'fred',    'active': false },
-     *   { 'user': 'pebbles', 'active': false }
-     * ];
-     *
-     * // using the `_.matches` callback shorthand
-     * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');
-     * // => ['barney', 'fred']
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.pluck(_.dropRightWhile(users, 'active', false), 'user');
-     * // => ['barney']
-     *
-     * // using the `_.property` callback shorthand
-     * _.pluck(_.dropRightWhile(users, 'active'), 'user');
-     * // => ['barney', 'fred', 'pebbles']
-     */
-    function dropRightWhile(array, predicate, thisArg) {
-      return (array && array.length)
-        ? baseWhile(array, getCallback(predicate, thisArg, 3), true, true)
-        : [];
-    }
-
-    /**
-     * Creates a slice of `array` excluding elements dropped from the beginning.
-     * Elements are dropped until `predicate` returns falsey. The predicate is
-     * bound to `thisArg` and invoked with three arguments: (value, index, array).
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to query.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {Array} Returns the slice of `array`.
-     * @example
-     *
-     * _.dropWhile([1, 2, 3], function(n) {
-     *   return n < 3;
-     * });
-     * // => [3]
-     *
-     * var users = [
-     *   { 'user': 'barney',  'active': false },
-     *   { 'user': 'fred',    'active': false },
-     *   { 'user': 'pebbles', 'active': true }
-     * ];
-     *
-     * // using the `_.matches` callback shorthand
-     * _.pluck(_.dropWhile(users, { 'user': 'barney', 'active': false }), 'user');
-     * // => ['fred', 'pebbles']
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.pluck(_.dropWhile(users, 'active', false), 'user');
-     * // => ['pebbles']
-     *
-     * // using the `_.property` callback shorthand
-     * _.pluck(_.dropWhile(users, 'active'), 'user');
-     * // => ['barney', 'fred', 'pebbles']
-     */
-    function dropWhile(array, predicate, thisArg) {
-      return (array && array.length)
-        ? baseWhile(array, getCallback(predicate, thisArg, 3), true)
-        : [];
-    }
-
-    /**
-     * Fills elements of `array` with `value` from `start` up to, but not
-     * including, `end`.
-     *
-     * **Note:** This method mutates `array`.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to fill.
-     * @param {*} value The value to fill `array` with.
-     * @param {number} [start=0] The start position.
-     * @param {number} [end=array.length] The end position.
-     * @returns {Array} Returns `array`.
-     * @example
-     *
-     * var array = [1, 2, 3];
-     *
-     * _.fill(array, 'a');
-     * console.log(array);
-     * // => ['a', 'a', 'a']
-     *
-     * _.fill(Array(3), 2);
-     * // => [2, 2, 2]
-     *
-     * _.fill([4, 6, 8], '*', 1, 2);
-     * // => [4, '*', 8]
-     */
-    function fill(array, value, start, end) {
-      var length = array ? array.length : 0;
-      if (!length) {
-        return [];
-      }
-      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
-        start = 0;
-        end = length;
-      }
-      return baseFill(array, value, start, end);
-    }
-
-    /**
-     * This method is like `_.find` except that it returns the index of the first
-     * element `predicate` returns truthy for instead of the element itself.
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to search.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {number} Returns the index of the found element, else `-1`.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'barney',  'active': false },
-     *   { 'user': 'fred',    'active': false },
-     *   { 'user': 'pebbles', 'active': true }
-     * ];
-     *
-     * _.findIndex(users, function(chr) {
-     *   return chr.user == 'barney';
-     * });
-     * // => 0
-     *
-     * // using the `_.matches` callback shorthand
-     * _.findIndex(users, { 'user': 'fred', 'active': false });
-     * // => 1
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.findIndex(users, 'active', false);
-     * // => 0
-     *
-     * // using the `_.property` callback shorthand
-     * _.findIndex(users, 'active');
-     * // => 2
-     */
-    var findIndex = createFindIndex();
-
-    /**
-     * This method is like `_.findIndex` except that it iterates over elements
-     * of `collection` from right to left.
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to search.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {number} Returns the index of the found element, else `-1`.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'barney',  'active': true },
-     *   { 'user': 'fred',    'active': false },
-     *   { 'user': 'pebbles', 'active': false }
-     * ];
-     *
-     * _.findLastIndex(users, function(chr) {
-     *   return chr.user == 'pebbles';
-     * });
-     * // => 2
-     *
-     * // using the `_.matches` callback shorthand
-     * _.findLastIndex(users, { 'user': 'barney', 'active': true });
-     * // => 0
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.findLastIndex(users, 'active', false);
-     * // => 2
-     *
-     * // using the `_.property` callback shorthand
-     * _.findLastIndex(users, 'active');
-     * // => 0
-     */
-    var findLastIndex = createFindIndex(true);
-
-    /**
-     * Gets the first element of `array`.
-     *
-     * @static
-     * @memberOf _
-     * @alias head
-     * @category Array
-     * @param {Array} array The array to query.
-     * @returns {*} Returns the first element of `array`.
-     * @example
-     *
-     * _.first([1, 2, 3]);
-     * // => 1
-     *
-     * _.first([]);
-     * // => undefined
-     */
-    function first(array) {
-      return array ? array[0] : undefined;
-    }
-
-    /**
-     * Flattens a nested array. If `isDeep` is `true` the array is recursively
-     * flattened, otherwise it is only flattened a single level.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to flatten.
-     * @param {boolean} [isDeep] Specify a deep flatten.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {Array} Returns the new flattened array.
-     * @example
-     *
-     * _.flatten([1, [2, 3, [4]]]);
-     * // => [1, 2, 3, [4]]
-     *
-     * // using `isDeep`
-     * _.flatten([1, [2, 3, [4]]], true);
-     * // => [1, 2, 3, 4]
-     */
-    function flatten(array, isDeep, guard) {
-      var length = array ? array.length : 0;
-      if (guard && isIterateeCall(array, isDeep, guard)) {
-        isDeep = false;
-      }
-      return length ? baseFlatten(array, isDeep) : [];
-    }
-
-    /**
-     * Recursively flattens a nested array.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to recursively flatten.
-     * @returns {Array} Returns the new flattened array.
-     * @example
-     *
-     * _.flattenDeep([1, [2, 3, [4]]]);
-     * // => [1, 2, 3, 4]
-     */
-    function flattenDeep(array) {
-      var length = array ? array.length : 0;
-      return length ? baseFlatten(array, true) : [];
-    }
-
-    /**
-     * Gets the index at which the first occurrence of `value` is found in `array`
-     * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
-     * for equality comparisons. If `fromIndex` is negative, it is used as the offset
-     * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`
-     * performs a faster binary search.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to search.
-     * @param {*} value The value to search for.
-     * @param {boolean|number} [fromIndex=0] The index to search from or `true`
-     *  to perform a binary search on a sorted array.
-     * @returns {number} Returns the index of the matched value, else `-1`.
-     * @example
-     *
-     * _.indexOf([1, 2, 1, 2], 2);
-     * // => 1
-     *
-     * // using `fromIndex`
-     * _.indexOf([1, 2, 1, 2], 2, 2);
-     * // => 3
-     *
-     * // performing a binary search
-     * _.indexOf([1, 1, 2, 2], 2, true);
-     * // => 2
-     */
-    function indexOf(array, value, fromIndex) {
-      var length = array ? array.length : 0;
-      if (!length) {
-        return -1;
-      }
-      if (typeof fromIndex == 'number') {
-        fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
-      } else if (fromIndex) {
-        var index = binaryIndex(array, value);
-        if (index < length &&
-            (value === value ? (value === array[index]) : (array[index] !== array[index]))) {
-          return index;
-        }
-        return -1;
-      }
-      return baseIndexOf(array, value, fromIndex || 0);
-    }
-
-    /**
-     * Gets all but the last element of `array`.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to query.
-     * @returns {Array} Returns the slice of `array`.
-     * @example
-     *
-     * _.initial([1, 2, 3]);
-     * // => [1, 2]
-     */
-    function initial(array) {
-      return dropRight(array, 1);
-    }
-
-    /**
-     * Creates an array of unique values that are included in all of the provided
-     * arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
-     * for equality comparisons.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {...Array} [arrays] The arrays to inspect.
-     * @returns {Array} Returns the new array of shared values.
-     * @example
-     * _.intersection([1, 2], [4, 2], [2, 1]);
-     * // => [2]
-     */
-    var intersection = restParam(function(arrays) {
-      var othLength = arrays.length,
-          othIndex = othLength,
-          caches = Array(length),
-          indexOf = getIndexOf(),
-          isCommon = indexOf == baseIndexOf,
-          result = [];
-
-      while (othIndex--) {
-        var value = arrays[othIndex] = isArrayLike(value = arrays[othIndex]) ? value : [];
-        caches[othIndex] = (isCommon && value.length >= 120) ? createCache(othIndex && value) : null;
-      }
-      var array = arrays[0],
-          index = -1,
-          length = array ? array.length : 0,
-          seen = caches[0];
-
-      outer:
-      while (++index < length) {
-        value = array[index];
-        if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {
-          var othIndex = othLength;
-          while (--othIndex) {
-            var cache = caches[othIndex];
-            if ((cache ? cacheIndexOf(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) {
-              continue outer;
-            }
-          }
-          if (seen) {
-            seen.push(value);
-          }
-          result.push(value);
-        }
-      }
-      return result;
-    });
-
-    /**
-     * Gets the last element of `array`.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to query.
-     * @returns {*} Returns the last element of `array`.
-     * @example
-     *
-     * _.last([1, 2, 3]);
-     * // => 3
-     */
-    function last(array) {
-      var length = array ? array.length : 0;
-      return length ? array[length - 1] : undefined;
-    }
-
-    /**
-     * This method is like `_.indexOf` except that it iterates over elements of
-     * `array` from right to left.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to search.
-     * @param {*} value The value to search for.
-     * @param {boolean|number} [fromIndex=array.length-1] The index to search from
-     *  or `true` to perform a binary search on a sorted array.
-     * @returns {number} Returns the index of the matched value, else `-1`.
-     * @example
-     *
-     * _.lastIndexOf([1, 2, 1, 2], 2);
-     * // => 3
-     *
-     * // using `fromIndex`
-     * _.lastIndexOf([1, 2, 1, 2], 2, 2);
-     * // => 1
-     *
-     * // performing a binary search
-     * _.lastIndexOf([1, 1, 2, 2], 2, true);
-     * // => 3
-     */
-    function lastIndexOf(array, value, fromIndex) {
-      var length = array ? array.length : 0;
-      if (!length) {
-        return -1;
-      }
-      var index = length;
-      if (typeof fromIndex == 'number') {
-        index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1;
-      } else if (fromIndex) {
-        index = binaryIndex(array, value, true) - 1;
-        var other = array[index];
-        if (value === value ? (value === other) : (other !== other)) {
-          return index;
-        }
-        return -1;
-      }
-      if (value !== value) {
-        return indexOfNaN(array, index, true);
-      }
-      while (index--) {
-        if (array[index] === value) {
-          return index;
-        }
-      }
-      return -1;
-    }
-
-    /**
-     * Removes all provided values from `array` using
-     * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
-     * for equality comparisons.
-     *
-     * **Note:** Unlike `_.without`, this method mutates `array`.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to modify.
-     * @param {...*} [values] The values to remove.
-     * @returns {Array} Returns `array`.
-     * @example
-     *
-     * var array = [1, 2, 3, 1, 2, 3];
-     *
-     * _.pull(array, 2, 3);
-     * console.log(array);
-     * // => [1, 1]
-     */
-    function pull() {
-      var args = arguments,
-          array = args[0];
-
-      if (!(array && array.length)) {
-        return array;
-      }
-      var index = 0,
-          indexOf = getIndexOf(),
-          length = args.length;
-
-      while (++index < length) {
-        var fromIndex = 0,
-            value = args[index];
-
-        while ((fromIndex = indexOf(array, value, fromIndex)) > -1) {
-          splice.call(array, fromIndex, 1);
-        }
-      }
-      return array;
-    }
-
-    /**
-     * Removes elements from `array` corresponding to the given indexes and returns
-     * an array of the removed elements. Indexes may be specified as an array of
-     * indexes or as individual arguments.
-     *
-     * **Note:** Unlike `_.at`, this method mutates `array`.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to modify.
-     * @param {...(number|number[])} [indexes] The indexes of elements to remove,
-     *  specified as individual indexes or arrays of indexes.
-     * @returns {Array} Returns the new array of removed elements.
-     * @example
-     *
-     * var array = [5, 10, 15, 20];
-     * var evens = _.pullAt(array, 1, 3);
-     *
-     * console.log(array);
-     * // => [5, 15]
-     *
-     * console.log(evens);
-     * // => [10, 20]
-     */
-    var pullAt = restParam(function(array, indexes) {
-      indexes = baseFlatten(indexes);
-
-      var result = baseAt(array, indexes);
-      basePullAt(array, indexes.sort(baseCompareAscending));
-      return result;
-    });
-
-    /**
-     * Removes all elements from `array` that `predicate` returns truthy for
-     * and returns an array of the removed elements. The predicate is bound to
-     * `thisArg` and invoked with three arguments: (value, index, array).
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * **Note:** Unlike `_.filter`, this method mutates `array`.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to modify.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {Array} Returns the new array of removed elements.
-     * @example
-     *
-     * var array = [1, 2, 3, 4];
-     * var evens = _.remove(array, function(n) {
-     *   return n % 2 == 0;
-     * });
-     *
-     * console.log(array);
-     * // => [1, 3]
-     *
-     * console.log(evens);
-     * // => [2, 4]
-     */
-    function remove(array, predicate, thisArg) {
-      var result = [];
-      if (!(array && array.length)) {
-        return result;
-      }
-      var index = -1,
-          indexes = [],
-          length = array.length;
-
-      predicate = getCallback(predicate, thisArg, 3);
-      while (++index < length) {
-        var value = array[index];
-        if (predicate(value, index, array)) {
-          result.push(value);
-          indexes.push(index);
-        }
-      }
-      basePullAt(array, indexes);
-      return result;
-    }
-
-    /**
-     * Gets all but the first element of `array`.
-     *
-     * @static
-     * @memberOf _
-     * @alias tail
-     * @category Array
-     * @param {Array} array The array to query.
-     * @returns {Array} Returns the slice of `array`.
-     * @example
-     *
-     * _.rest([1, 2, 3]);
-     * // => [2, 3]
-     */
-    function rest(array) {
-      return drop(array, 1);
-    }
-
-    /**
-     * Creates a slice of `array` from `start` up to, but not including, `end`.
-     *
-     * **Note:** This method is used instead of `Array#slice` to support node
-     * lists in IE < 9 and to ensure dense arrays are returned.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to slice.
-     * @param {number} [start=0] The start position.
-     * @param {number} [end=array.length] The end position.
-     * @returns {Array} Returns the slice of `array`.
-     */
-    function slice(array, start, end) {
-      var length = array ? array.length : 0;
-      if (!length) {
-        return [];
-      }
-      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
-        start = 0;
-        end = length;
-      }
-      return baseSlice(array, start, end);
-    }
-
-    /**
-     * Uses a binary search to determine the lowest index at which `value` should
-     * be inserted into `array` in order to maintain its sort order. If an iteratee
-     * function is provided it is invoked for `value` and each element of `array`
-     * to compute their sort ranking. The iteratee is bound to `thisArg` and
-     * invoked with one argument; (value).
-     *
-     * If a property name is provided for `iteratee` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `iteratee` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The sorted array to inspect.
-     * @param {*} value The value to evaluate.
-     * @param {Function|Object|string} [iteratee=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {number} Returns the index at which `value` should be inserted
-     *  into `array`.
-     * @example
-     *
-     * _.sortedIndex([30, 50], 40);
-     * // => 1
-     *
-     * _.sortedIndex([4, 4, 5, 5], 5);
-     * // => 2
-     *
-     * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } };
-     *
-     * // using an iteratee function
-     * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) {
-     *   return this.data[word];
-     * }, dict);
-     * // => 1
-     *
-     * // using the `_.property` callback shorthand
-     * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
-     * // => 1
-     */
-    var sortedIndex = createSortedIndex();
-
-    /**
-     * This method is like `_.sortedIndex` except that it returns the highest
-     * index at which `value` should be inserted into `array` in order to
-     * maintain its sort order.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The sorted array to inspect.
-     * @param {*} value The value to evaluate.
-     * @param {Function|Object|string} [iteratee=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {number} Returns the index at which `value` should be inserted
-     *  into `array`.
-     * @example
-     *
-     * _.sortedLastIndex([4, 4, 5, 5], 5);
-     * // => 4
-     */
-    var sortedLastIndex = createSortedIndex(true);
-
-    /**
-     * Creates a slice of `array` with `n` elements taken from the beginning.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to query.
-     * @param {number} [n=1] The number of elements to take.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {Array} Returns the slice of `array`.
-     * @example
-     *
-     * _.take([1, 2, 3]);
-     * // => [1]
-     *
-     * _.take([1, 2, 3], 2);
-     * // => [1, 2]
-     *
-     * _.take([1, 2, 3], 5);
-     * // => [1, 2, 3]
-     *
-     * _.take([1, 2, 3], 0);
-     * // => []
-     */
-    function take(array, n, guard) {
-      var length = array ? array.length : 0;
-      if (!length) {
-        return [];
-      }
-      if (guard ? isIterateeCall(array, n, guard) : n == null) {
-        n = 1;
-      }
-      return baseSlice(array, 0, n < 0 ? 0 : n);
-    }
-
-    /**
-     * Creates a slice of `array` with `n` elements taken from the end.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to query.
-     * @param {number} [n=1] The number of elements to take.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {Array} Returns the slice of `array`.
-     * @example
-     *
-     * _.takeRight([1, 2, 3]);
-     * // => [3]
-     *
-     * _.takeRight([1, 2, 3], 2);
-     * // => [2, 3]
-     *
-     * _.takeRight([1, 2, 3], 5);
-     * // => [1, 2, 3]
-     *
-     * _.takeRight([1, 2, 3], 0);
-     * // => []
-     */
-    function takeRight(array, n, guard) {
-      var length = array ? array.length : 0;
-      if (!length) {
-        return [];
-      }
-      if (guard ? isIterateeCall(array, n, guard) : n == null) {
-        n = 1;
-      }
-      n = length - (+n || 0);
-      return baseSlice(array, n < 0 ? 0 : n);
-    }
-
-    /**
-     * Creates a slice of `array` with elements taken from the end. Elements are
-     * taken until `predicate` returns falsey. The predicate is bound to `thisArg`
-     * and invoked with three arguments: (value, index, array).
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to query.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {Array} Returns the slice of `array`.
-     * @example
-     *
-     * _.takeRightWhile([1, 2, 3], function(n) {
-     *   return n > 1;
-     * });
-     * // => [2, 3]
-     *
-     * var users = [
-     *   { 'user': 'barney',  'active': true },
-     *   { 'user': 'fred',    'active': false },
-     *   { 'user': 'pebbles', 'active': false }
-     * ];
-     *
-     * // using the `_.matches` callback shorthand
-     * _.pluck(_.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');
-     * // => ['pebbles']
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.pluck(_.takeRightWhile(users, 'active', false), 'user');
-     * // => ['fred', 'pebbles']
-     *
-     * // using the `_.property` callback shorthand
-     * _.pluck(_.takeRightWhile(users, 'active'), 'user');
-     * // => []
-     */
-    function takeRightWhile(array, predicate, thisArg) {
-      return (array && array.length)
-        ? baseWhile(array, getCallback(predicate, thisArg, 3), false, true)
-        : [];
-    }
-
-    /**
-     * Creates a slice of `array` with elements taken from the beginning. Elements
-     * are taken until `predicate` returns falsey. The predicate is bound to
-     * `thisArg` and invoked with three arguments: (value, index, array).
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to query.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {Array} Returns the slice of `array`.
-     * @example
-     *
-     * _.takeWhile([1, 2, 3], function(n) {
-     *   return n < 3;
-     * });
-     * // => [1, 2]
-     *
-     * var users = [
-     *   { 'user': 'barney',  'active': false },
-     *   { 'user': 'fred',    'active': false},
-     *   { 'user': 'pebbles', 'active': true }
-     * ];
-     *
-     * // using the `_.matches` callback shorthand
-     * _.pluck(_.takeWhile(users, { 'user': 'barney', 'active': false }), 'user');
-     * // => ['barney']
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.pluck(_.takeWhile(users, 'active', false), 'user');
-     * // => ['barney', 'fred']
-     *
-     * // using the `_.property` callback shorthand
-     * _.pluck(_.takeWhile(users, 'active'), 'user');
-     * // => []
-     */
-    function takeWhile(array, predicate, thisArg) {
-      return (array && array.length)
-        ? baseWhile(array, getCallback(predicate, thisArg, 3))
-        : [];
-    }
-
-    /**
-     * Creates an array of unique values, in order, from all of the provided arrays
-     * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
-     * for equality comparisons.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {...Array} [arrays] The arrays to inspect.
-     * @returns {Array} Returns the new array of combined values.
-     * @example
-     *
-     * _.union([1, 2], [4, 2], [2, 1]);
-     * // => [1, 2, 4]
-     */
-    var union = restParam(function(arrays) {
-      return baseUniq(baseFlatten(arrays, false, true));
-    });
-
-    /**
-     * Creates a duplicate-free version of an array, using
-     * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
-     * for equality comparisons, in which only the first occurence of each element
-     * is kept. Providing `true` for `isSorted` performs a faster search algorithm
-     * for sorted arrays. If an iteratee function is provided it is invoked for
-     * each element in the array to generate the criterion by which uniqueness
-     * is computed. The `iteratee` is bound to `thisArg` and invoked with three
-     * arguments: (value, index, array).
-     *
-     * If a property name is provided for `iteratee` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `iteratee` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @alias unique
-     * @category Array
-     * @param {Array} array The array to inspect.
-     * @param {boolean} [isSorted] Specify the array is sorted.
-     * @param {Function|Object|string} [iteratee] The function invoked per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Array} Returns the new duplicate-value-free array.
-     * @example
-     *
-     * _.uniq([2, 1, 2]);
-     * // => [2, 1]
-     *
-     * // using `isSorted`
-     * _.uniq([1, 1, 2], true);
-     * // => [1, 2]
-     *
-     * // using an iteratee function
-     * _.uniq([1, 2.5, 1.5, 2], function(n) {
-     *   return this.floor(n);
-     * }, Math);
-     * // => [1, 2.5]
-     *
-     * // using the `_.property` callback shorthand
-     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
-     * // => [{ 'x': 1 }, { 'x': 2 }]
-     */
-    function uniq(array, isSorted, iteratee, thisArg) {
-      var length = array ? array.length : 0;
-      if (!length) {
-        return [];
-      }
-      if (isSorted != null && typeof isSorted != 'boolean') {
-        thisArg = iteratee;
-        iteratee = isIterateeCall(array, isSorted, thisArg) ? undefined : isSorted;
-        isSorted = false;
-      }
-      var callback = getCallback();
-      if (!(iteratee == null && callback === baseCallback)) {
-        iteratee = callback(iteratee, thisArg, 3);
-      }
-      return (isSorted && getIndexOf() == baseIndexOf)
-        ? sortedUniq(array, iteratee)
-        : baseUniq(array, iteratee);
-    }
-
-    /**
-     * This method is like `_.zip` except that it accepts an array of grouped
-     * elements and creates an array regrouping the elements to their pre-zip
-     * configuration.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array of grouped elements to process.
-     * @returns {Array} Returns the new array of regrouped elements.
-     * @example
-     *
-     * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);
-     * // => [['fred', 30, true], ['barney', 40, false]]
-     *
-     * _.unzip(zipped);
-     * // => [['fred', 'barney'], [30, 40], [true, false]]
-     */
-    function unzip(array) {
-      if (!(array && array.length)) {
-        return [];
-      }
-      var index = -1,
-          length = 0;
-
-      array = arrayFilter(array, function(group) {
-        if (isArrayLike(group)) {
-          length = nativeMax(group.length, length);
-          return true;
-        }
-      });
-      var result = Array(length);
-      while (++index < length) {
-        result[index] = arrayMap(array, baseProperty(index));
-      }
-      return result;
-    }
-
-    /**
-     * This method is like `_.unzip` except that it accepts an iteratee to specify
-     * how regrouped values should be combined. The `iteratee` is bound to `thisArg`
-     * and invoked with four arguments: (accumulator, value, index, group).
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array of grouped elements to process.
-     * @param {Function} [iteratee] The function to combine regrouped values.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Array} Returns the new array of regrouped elements.
-     * @example
-     *
-     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
-     * // => [[1, 10, 100], [2, 20, 200]]
-     *
-     * _.unzipWith(zipped, _.add);
-     * // => [3, 30, 300]
-     */
-    function unzipWith(array, iteratee, thisArg) {
-      var length = array ? array.length : 0;
-      if (!length) {
-        return [];
-      }
-      var result = unzip(array);
-      if (iteratee == null) {
-        return result;
-      }
-      iteratee = bindCallback(iteratee, thisArg, 4);
-      return arrayMap(result, function(group) {
-        return arrayReduce(group, iteratee, undefined, true);
-      });
-    }
-
-    /**
-     * Creates an array excluding all provided values using
-     * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
-     * for equality comparisons.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {Array} array The array to filter.
-     * @param {...*} [values] The values to exclude.
-     * @returns {Array} Returns the new array of filtered values.
-     * @example
-     *
-     * _.without([1, 2, 1, 3], 1, 2);
-     * // => [3]
-     */
-    var without = restParam(function(array, values) {
-      return isArrayLike(array)
-        ? baseDifference(array, values)
-        : [];
-    });
-
-    /**
-     * Creates an array of unique values that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
-     * of the provided arrays.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {...Array} [arrays] The arrays to inspect.
-     * @returns {Array} Returns the new array of values.
-     * @example
-     *
-     * _.xor([1, 2], [4, 2]);
-     * // => [1, 4]
-     */
-    function xor() {
-      var index = -1,
-          length = arguments.length;
-
-      while (++index < length) {
-        var array = arguments[index];
-        if (isArrayLike(array)) {
-          var result = result
-            ? arrayPush(baseDifference(result, array), baseDifference(array, result))
-            : array;
-        }
-      }
-      return result ? baseUniq(result) : [];
-    }
-
-    /**
-     * Creates an array of grouped elements, the first of which contains the first
-     * elements of the given arrays, the second of which contains the second elements
-     * of the given arrays, and so on.
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {...Array} [arrays] The arrays to process.
-     * @returns {Array} Returns the new array of grouped elements.
-     * @example
-     *
-     * _.zip(['fred', 'barney'], [30, 40], [true, false]);
-     * // => [['fred', 30, true], ['barney', 40, false]]
-     */
-    var zip = restParam(unzip);
-
-    /**
-     * The inverse of `_.pairs`; this method returns an object composed from arrays
-     * of property names and values. Provide either a single two dimensional array,
-     * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names
-     * and one of corresponding values.
-     *
-     * @static
-     * @memberOf _
-     * @alias object
-     * @category Array
-     * @param {Array} props The property names.
-     * @param {Array} [values=[]] The property values.
-     * @returns {Object} Returns the new object.
-     * @example
-     *
-     * _.zipObject([['fred', 30], ['barney', 40]]);
-     * // => { 'fred': 30, 'barney': 40 }
-     *
-     * _.zipObject(['fred', 'barney'], [30, 40]);
-     * // => { 'fred': 30, 'barney': 40 }
-     */
-    function zipObject(props, values) {
-      var index = -1,
-          length = props ? props.length : 0,
-          result = {};
-
-      if (length && !values && !isArray(props[0])) {
-        values = [];
-      }
-      while (++index < length) {
-        var key = props[index];
-        if (values) {
-          result[key] = values[index];
-        } else if (key) {
-          result[key[0]] = key[1];
-        }
-      }
-      return result;
-    }
-
-    /**
-     * This method is like `_.zip` except that it accepts an iteratee to specify
-     * how grouped values should be combined. The `iteratee` is bound to `thisArg`
-     * and invoked with four arguments: (accumulator, value, index, group).
-     *
-     * @static
-     * @memberOf _
-     * @category Array
-     * @param {...Array} [arrays] The arrays to process.
-     * @param {Function} [iteratee] The function to combine grouped values.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Array} Returns the new array of grouped elements.
-     * @example
-     *
-     * _.zipWith([1, 2], [10, 20], [100, 200], _.add);
-     * // => [111, 222]
-     */
-    var zipWith = restParam(function(arrays) {
-      var length = arrays.length,
-          iteratee = length > 2 ? arrays[length - 2] : undefined,
-          thisArg = length > 1 ? arrays[length - 1] : undefined;
-
-      if (length > 2 && typeof iteratee == 'function') {
-        length -= 2;
-      } else {
-        iteratee = (length > 1 && typeof thisArg == 'function') ? (--length, thisArg) : undefined;
-        thisArg = undefined;
-      }
-      arrays.length = length;
-      return unzipWith(arrays, iteratee, thisArg);
-    });
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Creates a `lodash` object that wraps `value` with explicit method
-     * chaining enabled.
-     *
-     * @static
-     * @memberOf _
-     * @category Chain
-     * @param {*} value The value to wrap.
-     * @returns {Object} Returns the new `lodash` wrapper instance.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'barney',  'age': 36 },
-     *   { 'user': 'fred',    'age': 40 },
-     *   { 'user': 'pebbles', 'age': 1 }
-     * ];
-     *
-     * var youngest = _.chain(users)
-     *   .sortBy('age')
-     *   .map(function(chr) {
-     *     return chr.user + ' is ' + chr.age;
-     *   })
-     *   .first()
-     *   .value();
-     * // => 'pebbles is 1'
-     */
-    function chain(value) {
-      var result = lodash(value);
-      result.__chain__ = true;
-      return result;
-    }
-
-    /**
-     * This method invokes `interceptor` and returns `value`. The interceptor is
-     * bound to `thisArg` and invoked with one argument; (value). The purpose of
-     * this method is to "tap into" a method chain in order to perform operations
-     * on intermediate results within the chain.
-     *
-     * @static
-     * @memberOf _
-     * @category Chain
-     * @param {*} value The value to provide to `interceptor`.
-     * @param {Function} interceptor The function to invoke.
-     * @param {*} [thisArg] The `this` binding of `interceptor`.
-     * @returns {*} Returns `value`.
-     * @example
-     *
-     * _([1, 2, 3])
-     *  .tap(function(array) {
-     *    array.pop();
-     *  })
-     *  .reverse()
-     *  .value();
-     * // => [2, 1]
-     */
-    function tap(value, interceptor, thisArg) {
-      interceptor.call(thisArg, value);
-      return value;
-    }
-
-    /**
-     * This method is like `_.tap` except that it returns the result of `interceptor`.
-     *
-     * @static
-     * @memberOf _
-     * @category Chain
-     * @param {*} value The value to provide to `interceptor`.
-     * @param {Function} interceptor The function to invoke.
-     * @param {*} [thisArg] The `this` binding of `interceptor`.
-     * @returns {*} Returns the result of `interceptor`.
-     * @example
-     *
-     * _('  abc  ')
-     *  .chain()
-     *  .trim()
-     *  .thru(function(value) {
-     *    return [value];
-     *  })
-     *  .value();
-     * // => ['abc']
-     */
-    function thru(value, interceptor, thisArg) {
-      return interceptor.call(thisArg, value);
-    }
-
-    /**
-     * Enables explicit method chaining on the wrapper object.
-     *
-     * @name chain
-     * @memberOf _
-     * @category Chain
-     * @returns {Object} Returns the new `lodash` wrapper instance.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'barney', 'age': 36 },
-     *   { 'user': 'fred',   'age': 40 }
-     * ];
-     *
-     * // without explicit chaining
-     * _(users).first();
-     * // => { 'user': 'barney', 'age': 36 }
-     *
-     * // with explicit chaining
-     * _(users).chain()
-     *   .first()
-     *   .pick('user')
-     *   .value();
-     * // => { 'user': 'barney' }
-     */
-    function wrapperChain() {
-      return chain(this);
-    }
-
-    /**
-     * Executes the chained sequence and returns the wrapped result.
-     *
-     * @name commit
-     * @memberOf _
-     * @category Chain
-     * @returns {Object} Returns the new `lodash` wrapper instance.
-     * @example
-     *
-     * var array = [1, 2];
-     * var wrapped = _(array).push(3);
-     *
-     * console.log(array);
-     * // => [1, 2]
-     *
-     * wrapped = wrapped.commit();
-     * console.log(array);
-     * // => [1, 2, 3]
-     *
-     * wrapped.last();
-     * // => 3
-     *
-     * console.log(array);
-     * // => [1, 2, 3]
-     */
-    function wrapperCommit() {
-      return new LodashWrapper(this.value(), this.__chain__);
-    }
-
-    /**
-     * Creates a new array joining a wrapped array with any additional arrays
-     * and/or values.
-     *
-     * @name concat
-     * @memberOf _
-     * @category Chain
-     * @param {...*} [values] The values to concatenate.
-     * @returns {Array} Returns the new concatenated array.
-     * @example
-     *
-     * var array = [1];
-     * var wrapped = _(array).concat(2, [3], [[4]]);
-     *
-     * console.log(wrapped.value());
-     * // => [1, 2, 3, [4]]
-     *
-     * console.log(array);
-     * // => [1]
-     */
-    var wrapperConcat = restParam(function(values) {
-      values = baseFlatten(values);
-      return this.thru(function(array) {
-        return arrayConcat(isArray(array) ? array : [toObject(array)], values);
-      });
-    });
-
-    /**
-     * Creates a clone of the chained sequence planting `value` as the wrapped value.
-     *
-     * @name plant
-     * @memberOf _
-     * @category Chain
-     * @returns {Object} Returns the new `lodash` wrapper instance.
-     * @example
-     *
-     * var array = [1, 2];
-     * var wrapped = _(array).map(function(value) {
-     *   return Math.pow(value, 2);
-     * });
-     *
-     * var other = [3, 4];
-     * var otherWrapped = wrapped.plant(other);
-     *
-     * otherWrapped.value();
-     * // => [9, 16]
-     *
-     * wrapped.value();
-     * // => [1, 4]
-     */
-    function wrapperPlant(value) {
-      var result,
-          parent = this;
-
-      while (parent instanceof baseLodash) {
-        var clone = wrapperClone(parent);
-        if (result) {
-          previous.__wrapped__ = clone;
-        } else {
-          result = clone;
-        }
-        var previous = clone;
-        parent = parent.__wrapped__;
-      }
-      previous.__wrapped__ = value;
-      return result;
-    }
-
-    /**
-     * Reverses the wrapped array so the first element becomes the last, the
-     * second element becomes the second to last, and so on.
-     *
-     * **Note:** This method mutates the wrapped array.
-     *
-     * @name reverse
-     * @memberOf _
-     * @category Chain
-     * @returns {Object} Returns the new reversed `lodash` wrapper instance.
-     * @example
-     *
-     * var array = [1, 2, 3];
-     *
-     * _(array).reverse().value()
-     * // => [3, 2, 1]
-     *
-     * console.log(array);
-     * // => [3, 2, 1]
-     */
-    function wrapperReverse() {
-      var value = this.__wrapped__;
-
-      var interceptor = function(value) {
-        return (wrapped && wrapped.__dir__ < 0) ? value : value.reverse();
-      };
-      if (value instanceof LazyWrapper) {
-        var wrapped = value;
-        if (this.__actions__.length) {
-          wrapped = new LazyWrapper(this);
-        }
-        wrapped = wrapped.reverse();
-        wrapped.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
-        return new LodashWrapper(wrapped, this.__chain__);
-      }
-      return this.thru(interceptor);
-    }
-
-    /**
-     * Produces the result of coercing the unwrapped value to a string.
-     *
-     * @name toString
-     * @memberOf _
-     * @category Chain
-     * @returns {string} Returns the coerced string value.
-     * @example
-     *
-     * _([1, 2, 3]).toString();
-     * // => '1,2,3'
-     */
-    function wrapperToString() {
-      return (this.value() + '');
-    }
-
-    /**
-     * Executes the chained sequence to extract the unwrapped value.
-     *
-     * @name value
-     * @memberOf _
-     * @alias run, toJSON, valueOf
-     * @category Chain
-     * @returns {*} Returns the resolved unwrapped value.
-     * @example
-     *
-     * _([1, 2, 3]).value();
-     * // => [1, 2, 3]
-     */
-    function wrapperValue() {
-      return baseWrapperValue(this.__wrapped__, this.__actions__);
-    }
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Creates an array of elements corresponding to the given keys, or indexes,
-     * of `collection`. Keys may be specified as individual arguments or as arrays
-     * of keys.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {...(number|number[]|string|string[])} [props] The property names
-     *  or indexes of elements to pick, specified individually or in arrays.
-     * @returns {Array} Returns the new array of picked elements.
-     * @example
-     *
-     * _.at(['a', 'b', 'c'], [0, 2]);
-     * // => ['a', 'c']
-     *
-     * _.at(['barney', 'fred', 'pebbles'], 0, 2);
-     * // => ['barney', 'pebbles']
-     */
-    var at = restParam(function(collection, props) {
-      return baseAt(collection, baseFlatten(props));
-    });
-
-    /**
-     * Creates an object composed of keys generated from the results of running
-     * each element of `collection` through `iteratee`. The corresponding value
-     * of each key is the number of times the key was returned by `iteratee`.
-     * The `iteratee` is bound to `thisArg` and invoked with three arguments:
-     * (value, index|key, collection).
-     *
-     * If a property name is provided for `iteratee` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `iteratee` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function|Object|string} [iteratee=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Object} Returns the composed aggregate object.
-     * @example
-     *
-     * _.countBy([4.3, 6.1, 6.4], function(n) {
-     *   return Math.floor(n);
-     * });
-     * // => { '4': 1, '6': 2 }
-     *
-     * _.countBy([4.3, 6.1, 6.4], function(n) {
-     *   return this.floor(n);
-     * }, Math);
-     * // => { '4': 1, '6': 2 }
-     *
-     * _.countBy(['one', 'two', 'three'], 'length');
-     * // => { '3': 2, '5': 1 }
-     */
-    var countBy = createAggregator(function(result, value, key) {
-      hasOwnProperty.call(result, key) ? ++result[key] : (result[key] = 1);
-    });
-
-    /**
-     * Checks if `predicate` returns truthy for **all** elements of `collection`.
-     * The predicate is bound to `thisArg` and invoked with three arguments:
-     * (value, index|key, collection).
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @alias all
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {boolean} Returns `true` if all elements pass the predicate check,
-     *  else `false`.
-     * @example
-     *
-     * _.every([true, 1, null, 'yes'], Boolean);
-     * // => false
-     *
-     * var users = [
-     *   { 'user': 'barney', 'active': false },
-     *   { 'user': 'fred',   'active': false }
-     * ];
-     *
-     * // using the `_.matches` callback shorthand
-     * _.every(users, { 'user': 'barney', 'active': false });
-     * // => false
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.every(users, 'active', false);
-     * // => true
-     *
-     * // using the `_.property` callback shorthand
-     * _.every(users, 'active');
-     * // => false
-     */
-    function every(collection, predicate, thisArg) {
-      var func = isArray(collection) ? arrayEvery : baseEvery;
-      if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
-        predicate = undefined;
-      }
-      if (typeof predicate != 'function' || thisArg !== undefined) {
-        predicate = getCallback(predicate, thisArg, 3);
-      }
-      return func(collection, predicate);
-    }
-
-    /**
-     * Iterates over elements of `collection`, returning an array of all elements
-     * `predicate` returns truthy for. The predicate is bound to `thisArg` and
-     * invoked with three arguments: (value, index|key, collection).
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @alias select
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {Array} Returns the new filtered array.
-     * @example
-     *
-     * _.filter([4, 5, 6], function(n) {
-     *   return n % 2 == 0;
-     * });
-     * // => [4, 6]
-     *
-     * var users = [
-     *   { 'user': 'barney', 'age': 36, 'active': true },
-     *   { 'user': 'fred',   'age': 40, 'active': false }
-     * ];
-     *
-     * // using the `_.matches` callback shorthand
-     * _.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user');
-     * // => ['barney']
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.pluck(_.filter(users, 'active', false), 'user');
-     * // => ['fred']
-     *
-     * // using the `_.property` callback shorthand
-     * _.pluck(_.filter(users, 'active'), 'user');
-     * // => ['barney']
-     */
-    function filter(collection, predicate, thisArg) {
-      var func = isArray(collection) ? arrayFilter : baseFilter;
-      predicate = getCallback(predicate, thisArg, 3);
-      return func(collection, predicate);
-    }
-
-    /**
-     * Iterates over elements of `collection`, returning the first element
-     * `predicate` returns truthy for. The predicate is bound to `thisArg` and
-     * invoked with three arguments: (value, index|key, collection).
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @alias detect
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to search.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {*} Returns the matched element, else `undefined`.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'barney',  'age': 36, 'active': true },
-     *   { 'user': 'fred',    'age': 40, 'active': false },
-     *   { 'user': 'pebbles', 'age': 1,  'active': true }
-     * ];
-     *
-     * _.result(_.find(users, function(chr) {
-     *   return chr.age < 40;
-     * }), 'user');
-     * // => 'barney'
-     *
-     * // using the `_.matches` callback shorthand
-     * _.result(_.find(users, { 'age': 1, 'active': true }), 'user');
-     * // => 'pebbles'
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.result(_.find(users, 'active', false), 'user');
-     * // => 'fred'
-     *
-     * // using the `_.property` callback shorthand
-     * _.result(_.find(users, 'active'), 'user');
-     * // => 'barney'
-     */
-    var find = createFind(baseEach);
-
-    /**
-     * This method is like `_.find` except that it iterates over elements of
-     * `collection` from right to left.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to search.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {*} Returns the matched element, else `undefined`.
-     * @example
-     *
-     * _.findLast([1, 2, 3, 4], function(n) {
-     *   return n % 2 == 1;
-     * });
-     * // => 3
-     */
-    var findLast = createFind(baseEachRight, true);
-
-    /**
-     * Performs a deep comparison between each element in `collection` and the
-     * source object, returning the first element that has equivalent property
-     * values.
-     *
-     * **Note:** This method supports comparing arrays, booleans, `Date` objects,
-     * numbers, `Object` objects, regexes, and strings. Objects are compared by
-     * their own, not inherited, enumerable properties. For comparing a single
-     * own or inherited property value see `_.matchesProperty`.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to search.
-     * @param {Object} source The object of property values to match.
-     * @returns {*} Returns the matched element, else `undefined`.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'barney', 'age': 36, 'active': true },
-     *   { 'user': 'fred',   'age': 40, 'active': false }
-     * ];
-     *
-     * _.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user');
-     * // => 'barney'
-     *
-     * _.result(_.findWhere(users, { 'age': 40, 'active': false }), 'user');
-     * // => 'fred'
-     */
-    function findWhere(collection, source) {
-      return find(collection, baseMatches(source));
-    }
-
-    /**
-     * Iterates over elements of `collection` invoking `iteratee` for each element.
-     * The `iteratee` is bound to `thisArg` and invoked with three arguments:
-     * (value, index|key, collection). Iteratee functions may exit iteration early
-     * by explicitly returning `false`.
-     *
-     * **Note:** As with other "Collections" methods, objects with a "length" property
-     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
-     * may be used for object iteration.
-     *
-     * @static
-     * @memberOf _
-     * @alias each
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Array|Object|string} Returns `collection`.
-     * @example
-     *
-     * _([1, 2]).forEach(function(n) {
-     *   console.log(n);
-     * }).value();
-     * // => logs each value from left to right and returns the array
-     *
-     * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {
-     *   console.log(n, key);
-     * });
-     * // => logs each value-key pair and returns the object (iteration order is not guaranteed)
-     */
-    var forEach = createForEach(arrayEach, baseEach);
-
-    /**
-     * This method is like `_.forEach` except that it iterates over elements of
-     * `collection` from right to left.
-     *
-     * @static
-     * @memberOf _
-     * @alias eachRight
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Array|Object|string} Returns `collection`.
-     * @example
-     *
-     * _([1, 2]).forEachRight(function(n) {
-     *   console.log(n);
-     * }).value();
-     * // => logs each value from right to left and returns the array
-     */
-    var forEachRight = createForEach(arrayEachRight, baseEachRight);
-
-    /**
-     * Creates an object composed of keys generated from the results of running
-     * each element of `collection` through `iteratee`. The corresponding value
-     * of each key is an array of the elements responsible for generating the key.
-     * The `iteratee` is bound to `thisArg` and invoked with three arguments:
-     * (value, index|key, collection).
-     *
-     * If a property name is provided for `iteratee` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `iteratee` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function|Object|string} [iteratee=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Object} Returns the composed aggregate object.
-     * @example
-     *
-     * _.groupBy([4.2, 6.1, 6.4], function(n) {
-     *   return Math.floor(n);
-     * });
-     * // => { '4': [4.2], '6': [6.1, 6.4] }
-     *
-     * _.groupBy([4.2, 6.1, 6.4], function(n) {
-     *   return this.floor(n);
-     * }, Math);
-     * // => { '4': [4.2], '6': [6.1, 6.4] }
-     *
-     * // using the `_.property` callback shorthand
-     * _.groupBy(['one', 'two', 'three'], 'length');
-     * // => { '3': ['one', 'two'], '5': ['three'] }
-     */
-    var groupBy = createAggregator(function(result, value, key) {
-      if (hasOwnProperty.call(result, key)) {
-        result[key].push(value);
-      } else {
-        result[key] = [value];
-      }
-    });
-
-    /**
-     * Checks if `value` is in `collection` using
-     * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
-     * for equality comparisons. If `fromIndex` is negative, it is used as the offset
-     * from the end of `collection`.
-     *
-     * @static
-     * @memberOf _
-     * @alias contains, include
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to search.
-     * @param {*} target The value to search for.
-     * @param {number} [fromIndex=0] The index to search from.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.
-     * @returns {boolean} Returns `true` if a matching element is found, else `false`.
-     * @example
-     *
-     * _.includes([1, 2, 3], 1);
-     * // => true
-     *
-     * _.includes([1, 2, 3], 1, 2);
-     * // => false
-     *
-     * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');
-     * // => true
-     *
-     * _.includes('pebbles', 'eb');
-     * // => true
-     */
-    function includes(collection, target, fromIndex, guard) {
-      var length = collection ? getLength(collection) : 0;
-      if (!isLength(length)) {
-        collection = values(collection);
-        length = collection.length;
-      }
-      if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) {
-        fromIndex = 0;
-      } else {
-        fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);
-      }
-      return (typeof collection == 'string' || !isArray(collection) && isString(collection))
-        ? (fromIndex <= length && collection.indexOf(target, fromIndex) > -1)
-        : (!!length && getIndexOf(collection, target, fromIndex) > -1);
-    }
-
-    /**
-     * Creates an object composed of keys generated from the results of running
-     * each element of `collection` through `iteratee`. The corresponding value
-     * of each key is the last element responsible for generating the key. The
-     * iteratee function is bound to `thisArg` and invoked with three arguments:
-     * (value, index|key, collection).
-     *
-     * If a property name is provided for `iteratee` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `iteratee` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function|Object|string} [iteratee=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Object} Returns the composed aggregate object.
-     * @example
-     *
-     * var keyData = [
-     *   { 'dir': 'left', 'code': 97 },
-     *   { 'dir': 'right', 'code': 100 }
-     * ];
-     *
-     * _.indexBy(keyData, 'dir');
-     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
-     *
-     * _.indexBy(keyData, function(object) {
-     *   return String.fromCharCode(object.code);
-     * });
-     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
-     *
-     * _.indexBy(keyData, function(object) {
-     *   return this.fromCharCode(object.code);
-     * }, String);
-     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
-     */
-    var indexBy = createAggregator(function(result, value, key) {
-      result[key] = value;
-    });
-
-    /**
-     * Invokes the method at `path` of each element in `collection`, returning
-     * an array of the results of each invoked method. Any additional arguments
-     * are provided to each invoked method. If `methodName` is a function it is
-     * invoked for, and `this` bound to, each element in `collection`.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Array|Function|string} path The path of the method to invoke or
-     *  the function invoked per iteration.
-     * @param {...*} [args] The arguments to invoke the method with.
-     * @returns {Array} Returns the array of results.
-     * @example
-     *
-     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
-     * // => [[1, 5, 7], [1, 2, 3]]
-     *
-     * _.invoke([123, 456], String.prototype.split, '');
-     * // => [['1', '2', '3'], ['4', '5', '6']]
-     */
-    var invoke = restParam(function(collection, path, args) {
-      var index = -1,
-          isFunc = typeof path == 'function',
-          isProp = isKey(path),
-          result = isArrayLike(collection) ? Array(collection.length) : [];
-
-      baseEach(collection, function(value) {
-        var func = isFunc ? path : ((isProp && value != null) ? value[path] : undefined);
-        result[++index] = func ? func.apply(value, args) : invokePath(value, path, args);
-      });
-      return result;
-    });
-
-    /**
-     * Creates an array of values by running each element in `collection` through
-     * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three
-     * arguments: (value, index|key, collection).
-     *
-     * If a property name is provided for `iteratee` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `iteratee` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * Many lodash methods are guarded to work as iteratees for methods like
-     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
-     *
-     * The guarded methods are:
-     * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`,
-     * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`,
-     * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`,
-     * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`,
-     * `sum`, `uniq`, and `words`
-     *
-     * @static
-     * @memberOf _
-     * @alias collect
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function|Object|string} [iteratee=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Array} Returns the new mapped array.
-     * @example
-     *
-     * function timesThree(n) {
-     *   return n * 3;
-     * }
-     *
-     * _.map([1, 2], timesThree);
-     * // => [3, 6]
-     *
-     * _.map({ 'a': 1, 'b': 2 }, timesThree);
-     * // => [3, 6] (iteration order is not guaranteed)
-     *
-     * var users = [
-     *   { 'user': 'barney' },
-     *   { 'user': 'fred' }
-     * ];
-     *
-     * // using the `_.property` callback shorthand
-     * _.map(users, 'user');
-     * // => ['barney', 'fred']
-     */
-    function map(collection, iteratee, thisArg) {
-      var func = isArray(collection) ? arrayMap : baseMap;
-      iteratee = getCallback(iteratee, thisArg, 3);
-      return func(collection, iteratee);
-    }
-
-    /**
-     * Creates an array of elements split into two groups, the first of which
-     * contains elements `predicate` returns truthy for, while the second of which
-     * contains elements `predicate` returns falsey for. The predicate is bound
-     * to `thisArg` and invoked with three arguments: (value, index|key, collection).
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {Array} Returns the array of grouped elements.
-     * @example
-     *
-     * _.partition([1, 2, 3], function(n) {
-     *   return n % 2;
-     * });
-     * // => [[1, 3], [2]]
-     *
-     * _.partition([1.2, 2.3, 3.4], function(n) {
-     *   return this.floor(n) % 2;
-     * }, Math);
-     * // => [[1.2, 3.4], [2.3]]
-     *
-     * var users = [
-     *   { 'user': 'barney',  'age': 36, 'active': false },
-     *   { 'user': 'fred',    'age': 40, 'active': true },
-     *   { 'user': 'pebbles', 'age': 1,  'active': false }
-     * ];
-     *
-     * var mapper = function(array) {
-     *   return _.pluck(array, 'user');
-     * };
-     *
-     * // using the `_.matches` callback shorthand
-     * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper);
-     * // => [['pebbles'], ['barney', 'fred']]
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.map(_.partition(users, 'active', false), mapper);
-     * // => [['barney', 'pebbles'], ['fred']]
-     *
-     * // using the `_.property` callback shorthand
-     * _.map(_.partition(users, 'active'), mapper);
-     * // => [['fred'], ['barney', 'pebbles']]
-     */
-    var partition = createAggregator(function(result, value, key) {
-      result[key ? 0 : 1].push(value);
-    }, function() { return [[], []]; });
-
-    /**
-     * Gets the property value of `path` from all elements in `collection`.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Array|string} path The path of the property to pluck.
-     * @returns {Array} Returns the property values.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'barney', 'age': 36 },
-     *   { 'user': 'fred',   'age': 40 }
-     * ];
-     *
-     * _.pluck(users, 'user');
-     * // => ['barney', 'fred']
-     *
-     * var userIndex = _.indexBy(users, 'user');
-     * _.pluck(userIndex, 'age');
-     * // => [36, 40] (iteration order is not guaranteed)
-     */
-    function pluck(collection, path) {
-      return map(collection, property(path));
-    }
-
-    /**
-     * Reduces `collection` to a value which is the accumulated result of running
-     * each element in `collection` through `iteratee`, where each successive
-     * invocation is supplied the return value of the previous. If `accumulator`
-     * is not provided the first element of `collection` is used as the initial
-     * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:
-     * (accumulator, value, index|key, collection).
-     *
-     * Many lodash methods are guarded to work as iteratees for methods like
-     * `_.reduce`, `_.reduceRight`, and `_.transform`.
-     *
-     * The guarded methods are:
-     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `sortByAll`,
-     * and `sortByOrder`
-     *
-     * @static
-     * @memberOf _
-     * @alias foldl, inject
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
-     * @param {*} [accumulator] The initial value.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {*} Returns the accumulated value.
-     * @example
-     *
-     * _.reduce([1, 2], function(total, n) {
-     *   return total + n;
-     * });
-     * // => 3
-     *
-     * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) {
-     *   result[key] = n * 3;
-     *   return result;
-     * }, {});
-     * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)
-     */
-    var reduce = createReduce(arrayReduce, baseEach);
-
-    /**
-     * This method is like `_.reduce` except that it iterates over elements of
-     * `collection` from right to left.
-     *
-     * @static
-     * @memberOf _
-     * @alias foldr
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
-     * @param {*} [accumulator] The initial value.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {*} Returns the accumulated value.
-     * @example
-     *
-     * var array = [[0, 1], [2, 3], [4, 5]];
-     *
-     * _.reduceRight(array, function(flattened, other) {
-     *   return flattened.concat(other);
-     * }, []);
-     * // => [4, 5, 2, 3, 0, 1]
-     */
-    var reduceRight = createReduce(arrayReduceRight, baseEachRight);
-
-    /**
-     * The opposite of `_.filter`; this method returns the elements of `collection`
-     * that `predicate` does **not** return truthy for.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {Array} Returns the new filtered array.
-     * @example
-     *
-     * _.reject([1, 2, 3, 4], function(n) {
-     *   return n % 2 == 0;
-     * });
-     * // => [1, 3]
-     *
-     * var users = [
-     *   { 'user': 'barney', 'age': 36, 'active': false },
-     *   { 'user': 'fred',   'age': 40, 'active': true }
-     * ];
-     *
-     * // using the `_.matches` callback shorthand
-     * _.pluck(_.reject(users, { 'age': 40, 'active': true }), 'user');
-     * // => ['barney']
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.pluck(_.reject(users, 'active', false), 'user');
-     * // => ['fred']
-     *
-     * // using the `_.property` callback shorthand
-     * _.pluck(_.reject(users, 'active'), 'user');
-     * // => ['barney']
-     */
-    function reject(collection, predicate, thisArg) {
-      var func = isArray(collection) ? arrayFilter : baseFilter;
-      predicate = getCallback(predicate, thisArg, 3);
-      return func(collection, function(value, index, collection) {
-        return !predicate(value, index, collection);
-      });
-    }
-
-    /**
-     * Gets a random element or `n` random elements from a collection.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to sample.
-     * @param {number} [n] The number of elements to sample.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {*} Returns the random sample(s).
-     * @example
-     *
-     * _.sample([1, 2, 3, 4]);
-     * // => 2
-     *
-     * _.sample([1, 2, 3, 4], 2);
-     * // => [3, 1]
-     */
-    function sample(collection, n, guard) {
-      if (guard ? isIterateeCall(collection, n, guard) : n == null) {
-        collection = toIterable(collection);
-        var length = collection.length;
-        return length > 0 ? collection[baseRandom(0, length - 1)] : undefined;
-      }
-      var index = -1,
-          result = toArray(collection),
-          length = result.length,
-          lastIndex = length - 1;
-
-      n = nativeMin(n < 0 ? 0 : (+n || 0), length);
-      while (++index < n) {
-        var rand = baseRandom(index, lastIndex),
-            value = result[rand];
-
-        result[rand] = result[index];
-        result[index] = value;
-      }
-      result.length = n;
-      return result;
-    }
-
-    /**
-     * Creates an array of shuffled values, using a version of the
-     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to shuffle.
-     * @returns {Array} Returns the new shuffled array.
-     * @example
-     *
-     * _.shuffle([1, 2, 3, 4]);
-     * // => [4, 1, 3, 2]
-     */
-    function shuffle(collection) {
-      return sample(collection, POSITIVE_INFINITY);
-    }
-
-    /**
-     * Gets the size of `collection` by returning its length for array-like
-     * values or the number of own enumerable properties for objects.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to inspect.
-     * @returns {number} Returns the size of `collection`.
-     * @example
-     *
-     * _.size([1, 2, 3]);
-     * // => 3
-     *
-     * _.size({ 'a': 1, 'b': 2 });
-     * // => 2
-     *
-     * _.size('pebbles');
-     * // => 7
-     */
-    function size(collection) {
-      var length = collection ? getLength(collection) : 0;
-      return isLength(length) ? length : keys(collection).length;
-    }
-
-    /**
-     * Checks if `predicate` returns truthy for **any** element of `collection`.
-     * The function returns as soon as it finds a passing value and does not iterate
-     * over the entire collection. The predicate is bound to `thisArg` and invoked
-     * with three arguments: (value, index|key, collection).
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @alias any
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {boolean} Returns `true` if any element passes the predicate check,
-     *  else `false`.
-     * @example
-     *
-     * _.some([null, 0, 'yes', false], Boolean);
-     * // => true
-     *
-     * var users = [
-     *   { 'user': 'barney', 'active': true },
-     *   { 'user': 'fred',   'active': false }
-     * ];
-     *
-     * // using the `_.matches` callback shorthand
-     * _.some(users, { 'user': 'barney', 'active': false });
-     * // => false
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.some(users, 'active', false);
-     * // => true
-     *
-     * // using the `_.property` callback shorthand
-     * _.some(users, 'active');
-     * // => true
-     */
-    function some(collection, predicate, thisArg) {
-      var func = isArray(collection) ? arraySome : baseSome;
-      if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
-        predicate = undefined;
-      }
-      if (typeof predicate != 'function' || thisArg !== undefined) {
-        predicate = getCallback(predicate, thisArg, 3);
-      }
-      return func(collection, predicate);
-    }
-
-    /**
-     * Creates an array of elements, sorted in ascending order by the results of
-     * running each element in a collection through `iteratee`. This method performs
-     * a stable sort, that is, it preserves the original sort order of equal elements.
-     * The `iteratee` is bound to `thisArg` and invoked with three arguments:
-     * (value, index|key, collection).
-     *
-     * If a property name is provided for `iteratee` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `iteratee` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function|Object|string} [iteratee=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Array} Returns the new sorted array.
-     * @example
-     *
-     * _.sortBy([1, 2, 3], function(n) {
-     *   return Math.sin(n);
-     * });
-     * // => [3, 1, 2]
-     *
-     * _.sortBy([1, 2, 3], function(n) {
-     *   return this.sin(n);
-     * }, Math);
-     * // => [3, 1, 2]
-     *
-     * var users = [
-     *   { 'user': 'fred' },
-     *   { 'user': 'pebbles' },
-     *   { 'user': 'barney' }
-     * ];
-     *
-     * // using the `_.property` callback shorthand
-     * _.pluck(_.sortBy(users, 'user'), 'user');
-     * // => ['barney', 'fred', 'pebbles']
-     */
-    function sortBy(collection, iteratee, thisArg) {
-      if (collection == null) {
-        return [];
-      }
-      if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
-        iteratee = undefined;
-      }
-      var index = -1;
-      iteratee = getCallback(iteratee, thisArg, 3);
-
-      var result = baseMap(collection, function(value, key, collection) {
-        return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value };
-      });
-      return baseSortBy(result, compareAscending);
-    }
-
-    /**
-     * This method is like `_.sortBy` except that it can sort by multiple iteratees
-     * or property names.
-     *
-     * If a property name is provided for an iteratee the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If an object is provided for an iteratee the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {...(Function|Function[]|Object|Object[]|string|string[])} iteratees
-     *  The iteratees to sort by, specified as individual values or arrays of values.
-     * @returns {Array} Returns the new sorted array.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'fred',   'age': 48 },
-     *   { 'user': 'barney', 'age': 36 },
-     *   { 'user': 'fred',   'age': 42 },
-     *   { 'user': 'barney', 'age': 34 }
-     * ];
-     *
-     * _.map(_.sortByAll(users, ['user', 'age']), _.values);
-     * // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]]
-     *
-     * _.map(_.sortByAll(users, 'user', function(chr) {
-     *   return Math.floor(chr.age / 10);
-     * }), _.values);
-     * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
-     */
-    var sortByAll = restParam(function(collection, iteratees) {
-      if (collection == null) {
-        return [];
-      }
-      var guard = iteratees[2];
-      if (guard && isIterateeCall(iteratees[0], iteratees[1], guard)) {
-        iteratees.length = 1;
-      }
-      return baseSortByOrder(collection, baseFlatten(iteratees), []);
-    });
-
-    /**
-     * This method is like `_.sortByAll` except that it allows specifying the
-     * sort orders of the iteratees to sort by. If `orders` is unspecified, all
-     * values are sorted in ascending order. Otherwise, a value is sorted in
-     * ascending order if its corresponding order is "asc", and descending if "desc".
-     *
-     * If a property name is provided for an iteratee the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If an object is provided for an iteratee the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
-     * @param {boolean[]} [orders] The sort orders of `iteratees`.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.
-     * @returns {Array} Returns the new sorted array.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'fred',   'age': 48 },
-     *   { 'user': 'barney', 'age': 34 },
-     *   { 'user': 'fred',   'age': 42 },
-     *   { 'user': 'barney', 'age': 36 }
-     * ];
-     *
-     * // sort by `user` in ascending order and by `age` in descending order
-     * _.map(_.sortByOrder(users, ['user', 'age'], ['asc', 'desc']), _.values);
-     * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
-     */
-    function sortByOrder(collection, iteratees, orders, guard) {
-      if (collection == null) {
-        return [];
-      }
-      if (guard && isIterateeCall(iteratees, orders, guard)) {
-        orders = undefined;
-      }
-      if (!isArray(iteratees)) {
-        iteratees = iteratees == null ? [] : [iteratees];
-      }
-      if (!isArray(orders)) {
-        orders = orders == null ? [] : [orders];
-      }
-      return baseSortByOrder(collection, iteratees, orders);
-    }
-
-    /**
-     * Performs a deep comparison between each element in `collection` and the
-     * source object, returning an array of all elements that have equivalent
-     * property values.
-     *
-     * **Note:** This method supports comparing arrays, booleans, `Date` objects,
-     * numbers, `Object` objects, regexes, and strings. Objects are compared by
-     * their own, not inherited, enumerable properties. For comparing a single
-     * own or inherited property value see `_.matchesProperty`.
-     *
-     * @static
-     * @memberOf _
-     * @category Collection
-     * @param {Array|Object|string} collection The collection to search.
-     * @param {Object} source The object of property values to match.
-     * @returns {Array} Returns the new filtered array.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] },
-     *   { 'user': 'fred',   'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] }
-     * ];
-     *
-     * _.pluck(_.where(users, { 'age': 36, 'active': false }), 'user');
-     * // => ['barney']
-     *
-     * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user');
-     * // => ['fred']
-     */
-    function where(collection, source) {
-      return filter(collection, baseMatches(source));
-    }
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Gets the number of milliseconds that have elapsed since the Unix epoch
-     * (1 January 1970 00:00:00 UTC).
-     *
-     * @static
-     * @memberOf _
-     * @category Date
-     * @example
-     *
-     * _.defer(function(stamp) {
-     *   console.log(_.now() - stamp);
-     * }, _.now());
-     * // => logs the number of milliseconds it took for the deferred function to be invoked
-     */
-    var now = nativeNow || function() {
-      return new Date().getTime();
-    };
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * The opposite of `_.before`; this method creates a function that invokes
-     * `func` once it is called `n` or more times.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {number} n The number of calls before `func` is invoked.
-     * @param {Function} func The function to restrict.
-     * @returns {Function} Returns the new restricted function.
-     * @example
-     *
-     * var saves = ['profile', 'settings'];
-     *
-     * var done = _.after(saves.length, function() {
-     *   console.log('done saving!');
-     * });
-     *
-     * _.forEach(saves, function(type) {
-     *   asyncSave({ 'type': type, 'complete': done });
-     * });
-     * // => logs 'done saving!' after the two async saves have completed
-     */
-    function after(n, func) {
-      if (typeof func != 'function') {
-        if (typeof n == 'function') {
-          var temp = n;
-          n = func;
-          func = temp;
-        } else {
-          throw new TypeError(FUNC_ERROR_TEXT);
-        }
-      }
-      n = nativeIsFinite(n = +n) ? n : 0;
-      return function() {
-        if (--n < 1) {
-          return func.apply(this, arguments);
-        }
-      };
-    }
-
-    /**
-     * Creates a function that accepts up to `n` arguments ignoring any
-     * additional arguments.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to cap arguments for.
-     * @param {number} [n=func.length] The arity cap.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * _.map(['6', '8', '10'], _.ary(parseInt, 1));
-     * // => [6, 8, 10]
-     */
-    function ary(func, n, guard) {
-      if (guard && isIterateeCall(func, n, guard)) {
-        n = undefined;
-      }
-      n = (func && n == null) ? func.length : nativeMax(+n || 0, 0);
-      return createWrapper(func, ARY_FLAG, undefined, undefined, undefined, undefined, n);
-    }
-
-    /**
-     * Creates a function that invokes `func`, with the `this` binding and arguments
-     * of the created function, while it is called less than `n` times. Subsequent
-     * calls to the created function return the result of the last `func` invocation.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {number} n The number of calls at which `func` is no longer invoked.
-     * @param {Function} func The function to restrict.
-     * @returns {Function} Returns the new restricted function.
-     * @example
-     *
-     * jQuery('#add').on('click', _.before(5, addContactToList));
-     * // => allows adding up to 4 contacts to the list
-     */
-    function before(n, func) {
-      var result;
-      if (typeof func != 'function') {
-        if (typeof n == 'function') {
-          var temp = n;
-          n = func;
-          func = temp;
-        } else {
-          throw new TypeError(FUNC_ERROR_TEXT);
-        }
-      }
-      return function() {
-        if (--n > 0) {
-          result = func.apply(this, arguments);
-        }
-        if (n <= 1) {
-          func = undefined;
-        }
-        return result;
-      };
-    }
-
-    /**
-     * Creates a function that invokes `func` with the `this` binding of `thisArg`
-     * and prepends any additional `_.bind` arguments to those provided to the
-     * bound function.
-     *
-     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
-     * may be used as a placeholder for partially applied arguments.
-     *
-     * **Note:** Unlike native `Function#bind` this method does not set the "length"
-     * property of bound functions.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to bind.
-     * @param {*} thisArg The `this` binding of `func`.
-     * @param {...*} [partials] The arguments to be partially applied.
-     * @returns {Function} Returns the new bound function.
-     * @example
-     *
-     * var greet = function(greeting, punctuation) {
-     *   return greeting + ' ' + this.user + punctuation;
-     * };
-     *
-     * var object = { 'user': 'fred' };
-     *
-     * var bound = _.bind(greet, object, 'hi');
-     * bound('!');
-     * // => 'hi fred!'
-     *
-     * // using placeholders
-     * var bound = _.bind(greet, object, _, '!');
-     * bound('hi');
-     * // => 'hi fred!'
-     */
-    var bind = restParam(function(func, thisArg, partials) {
-      var bitmask = BIND_FLAG;
-      if (partials.length) {
-        var holders = replaceHolders(partials, bind.placeholder);
-        bitmask |= PARTIAL_FLAG;
-      }
-      return createWrapper(func, bitmask, thisArg, partials, holders);
-    });
-
-    /**
-     * Binds methods of an object to the object itself, overwriting the existing
-     * method. Method names may be specified as individual arguments or as arrays
-     * of method names. If no method names are provided all enumerable function
-     * properties, own and inherited, of `object` are bound.
-     *
-     * **Note:** This method does not set the "length" property of bound functions.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Object} object The object to bind and assign the bound methods to.
-     * @param {...(string|string[])} [methodNames] The object method names to bind,
-     *  specified as individual method names or arrays of method names.
-     * @returns {Object} Returns `object`.
-     * @example
-     *
-     * var view = {
-     *   'label': 'docs',
-     *   'onClick': function() {
-     *     console.log('clicked ' + this.label);
-     *   }
-     * };
-     *
-     * _.bindAll(view);
-     * jQuery('#docs').on('click', view.onClick);
-     * // => logs 'clicked docs' when the element is clicked
-     */
-    var bindAll = restParam(function(object, methodNames) {
-      methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object);
-
-      var index = -1,
-          length = methodNames.length;
-
-      while (++index < length) {
-        var key = methodNames[index];
-        object[key] = createWrapper(object[key], BIND_FLAG, object);
-      }
-      return object;
-    });
-
-    /**
-     * Creates a function that invokes the method at `object[key]` and prepends
-     * any additional `_.bindKey` arguments to those provided to the bound function.
-     *
-     * This method differs from `_.bind` by allowing bound functions to reference
-     * methods that may be redefined or don't yet exist.
-     * See [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
-     * for more details.
-     *
-     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
-     * builds, may be used as a placeholder for partially applied arguments.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Object} object The object the method belongs to.
-     * @param {string} key The key of the method.
-     * @param {...*} [partials] The arguments to be partially applied.
-     * @returns {Function} Returns the new bound function.
-     * @example
-     *
-     * var object = {
-     *   'user': 'fred',
-     *   'greet': function(greeting, punctuation) {
-     *     return greeting + ' ' + this.user + punctuation;
-     *   }
-     * };
-     *
-     * var bound = _.bindKey(object, 'greet', 'hi');
-     * bound('!');
-     * // => 'hi fred!'
-     *
-     * object.greet = function(greeting, punctuation) {
-     *   return greeting + 'ya ' + this.user + punctuation;
-     * };
-     *
-     * bound('!');
-     * // => 'hiya fred!'
-     *
-     * // using placeholders
-     * var bound = _.bindKey(object, 'greet', _, '!');
-     * bound('hi');
-     * // => 'hiya fred!'
-     */
-    var bindKey = restParam(function(object, key, partials) {
-      var bitmask = BIND_FLAG | BIND_KEY_FLAG;
-      if (partials.length) {
-        var holders = replaceHolders(partials, bindKey.placeholder);
-        bitmask |= PARTIAL_FLAG;
-      }
-      return createWrapper(key, bitmask, object, partials, holders);
-    });
-
-    /**
-     * Creates a function that accepts one or more arguments of `func` that when
-     * called either invokes `func` returning its result, if all `func` arguments
-     * have been provided, or returns a function that accepts one or more of the
-     * remaining `func` arguments, and so on. The arity of `func` may be specified
-     * if `func.length` is not sufficient.
-     *
-     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
-     * may be used as a placeholder for provided arguments.
-     *
-     * **Note:** This method does not set the "length" property of curried functions.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to curry.
-     * @param {number} [arity=func.length] The arity of `func`.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {Function} Returns the new curried function.
-     * @example
-     *
-     * var abc = function(a, b, c) {
-     *   return [a, b, c];
-     * };
-     *
-     * var curried = _.curry(abc);
-     *
-     * curried(1)(2)(3);
-     * // => [1, 2, 3]
-     *
-     * curried(1, 2)(3);
-     * // => [1, 2, 3]
-     *
-     * curried(1, 2, 3);
-     * // => [1, 2, 3]
-     *
-     * // using placeholders
-     * curried(1)(_, 3)(2);
-     * // => [1, 2, 3]
-     */
-    var curry = createCurry(CURRY_FLAG);
-
-    /**
-     * This method is like `_.curry` except that arguments are applied to `func`
-     * in the manner of `_.partialRight` instead of `_.partial`.
-     *
-     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
-     * builds, may be used as a placeholder for provided arguments.
-     *
-     * **Note:** This method does not set the "length" property of curried functions.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to curry.
-     * @param {number} [arity=func.length] The arity of `func`.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {Function} Returns the new curried function.
-     * @example
-     *
-     * var abc = function(a, b, c) {
-     *   return [a, b, c];
-     * };
-     *
-     * var curried = _.curryRight(abc);
-     *
-     * curried(3)(2)(1);
-     * // => [1, 2, 3]
-     *
-     * curried(2, 3)(1);
-     * // => [1, 2, 3]
-     *
-     * curried(1, 2, 3);
-     * // => [1, 2, 3]
-     *
-     * // using placeholders
-     * curried(3)(1, _)(2);
-     * // => [1, 2, 3]
-     */
-    var curryRight = createCurry(CURRY_RIGHT_FLAG);
-
-    /**
-     * Creates a debounced function that delays invoking `func` until after `wait`
-     * milliseconds have elapsed since the last time the debounced function was
-     * invoked. The debounced function comes with a `cancel` method to cancel
-     * delayed invocations. Provide an options object to indicate that `func`
-     * should be invoked on the leading and/or trailing edge of the `wait` timeout.
-     * Subsequent calls to the debounced function return the result of the last
-     * `func` invocation.
-     *
-     * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
-     * on the trailing edge of the timeout only if the the debounced function is
-     * invoked more than once during the `wait` timeout.
-     *
-     * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
-     * for details over the differences between `_.debounce` and `_.throttle`.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to debounce.
-     * @param {number} [wait=0] The number of milliseconds to delay.
-     * @param {Object} [options] The options object.
-     * @param {boolean} [options.leading=false] Specify invoking on the leading
-     *  edge of the timeout.
-     * @param {number} [options.maxWait] The maximum time `func` is allowed to be
-     *  delayed before it is invoked.
-     * @param {boolean} [options.trailing=true] Specify invoking on the trailing
-     *  edge of the timeout.
-     * @returns {Function} Returns the new debounced function.
-     * @example
-     *
-     * // avoid costly calculations while the window size is in flux
-     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
-     *
-     * // invoke `sendMail` when the click event is fired, debouncing subsequent calls
-     * jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
-     *   'leading': true,
-     *   'trailing': false
-     * }));
-     *
-     * // ensure `batchLog` is invoked once after 1 second of debounced calls
-     * var source = new EventSource('/stream');
-     * jQuery(source).on('message', _.debounce(batchLog, 250, {
-     *   'maxWait': 1000
-     * }));
-     *
-     * // cancel a debounced call
-     * var todoChanges = _.debounce(batchLog, 1000);
-     * Object.observe(models.todo, todoChanges);
-     *
-     * Object.observe(models, function(changes) {
-     *   if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {
-     *     todoChanges.cancel();
-     *   }
-     * }, ['delete']);
-     *
-     * // ...at some point `models.todo` is changed
-     * models.todo.completed = true;
-     *
-     * // ...before 1 second has passed `models.todo` is deleted
-     * // which cancels the debounced `todoChanges` call
-     * delete models.todo;
-     */
-    function debounce(func, wait, options) {
-      var args,
-          maxTimeoutId,
-          result,
-          stamp,
-          thisArg,
-          timeoutId,
-          trailingCall,
-          lastCalled = 0,
-          maxWait = false,
-          trailing = true;
-
-      if (typeof func != 'function') {
-        throw new TypeError(FUNC_ERROR_TEXT);
-      }
-      wait = wait < 0 ? 0 : (+wait || 0);
-      if (options === true) {
-        var leading = true;
-        trailing = false;
-      } else if (isObject(options)) {
-        leading = !!options.leading;
-        maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);
-        trailing = 'trailing' in options ? !!options.trailing : trailing;
-      }
-
-      function cancel() {
-        if (timeoutId) {
-          clearTimeout(timeoutId);
-        }
-        if (maxTimeoutId) {
-          clearTimeout(maxTimeoutId);
-        }
-        lastCalled = 0;
-        maxTimeoutId = timeoutId = trailingCall = undefined;
-      }
-
-      function complete(isCalled, id) {
-        if (id) {
-          clearTimeout(id);
-        }
-        maxTimeoutId = timeoutId = trailingCall = undefined;
-        if (isCalled) {
-          lastCalled = now();
-          result = func.apply(thisArg, args);
-          if (!timeoutId && !maxTimeoutId) {
-            args = thisArg = undefined;
-          }
-        }
-      }
-
-      function delayed() {
-        var remaining = wait - (now() - stamp);
-        if (remaining <= 0 || remaining > wait) {
-          complete(trailingCall, maxTimeoutId);
-        } else {
-          timeoutId = setTimeout(delayed, remaining);
-        }
-      }
-
-      function maxDelayed() {
-        complete(trailing, timeoutId);
-      }
-
-      function debounced() {
-        args = arguments;
-        stamp = now();
-        thisArg = this;
-        trailingCall = trailing && (timeoutId || !leading);
-
-        if (maxWait === false) {
-          var leadingCall = leading && !timeoutId;
-        } else {
-          if (!maxTimeoutId && !leading) {
-            lastCalled = stamp;
-          }
-          var remaining = maxWait - (stamp - lastCalled),
-              isCalled = remaining <= 0 || remaining > maxWait;
-
-          if (isCalled) {
-            if (maxTimeoutId) {
-              maxTimeoutId = clearTimeout(maxTimeoutId);
-            }
-            lastCalled = stamp;
-            result = func.apply(thisArg, args);
-          }
-          else if (!maxTimeoutId) {
-            maxTimeoutId = setTimeout(maxDelayed, remaining);
-          }
-        }
-        if (isCalled && timeoutId) {
-          timeoutId = clearTimeout(timeoutId);
-        }
-        else if (!timeoutId && wait !== maxWait) {
-          timeoutId = setTimeout(delayed, wait);
-        }
-        if (leadingCall) {
-          isCalled = true;
-          result = func.apply(thisArg, args);
-        }
-        if (isCalled && !timeoutId && !maxTimeoutId) {
-          args = thisArg = undefined;
-        }
-        return result;
-      }
-      debounced.cancel = cancel;
-      return debounced;
-    }
-
-    /**
-     * Defers invoking the `func` until the current call stack has cleared. Any
-     * additional arguments are provided to `func` when it is invoked.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to defer.
-     * @param {...*} [args] The arguments to invoke the function with.
-     * @returns {number} Returns the timer id.
-     * @example
-     *
-     * _.defer(function(text) {
-     *   console.log(text);
-     * }, 'deferred');
-     * // logs 'deferred' after one or more milliseconds
-     */
-    var defer = restParam(function(func, args) {
-      return baseDelay(func, 1, args);
-    });
-
-    /**
-     * Invokes `func` after `wait` milliseconds. Any additional arguments are
-     * provided to `func` when it is invoked.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to delay.
-     * @param {number} wait The number of milliseconds to delay invocation.
-     * @param {...*} [args] The arguments to invoke the function with.
-     * @returns {number} Returns the timer id.
-     * @example
-     *
-     * _.delay(function(text) {
-     *   console.log(text);
-     * }, 1000, 'later');
-     * // => logs 'later' after one second
-     */
-    var delay = restParam(function(func, wait, args) {
-      return baseDelay(func, wait, args);
-    });
-
-    /**
-     * Creates a function that returns the result of invoking the provided
-     * functions with the `this` binding of the created function, where each
-     * successive invocation is supplied the return value of the previous.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {...Function} [funcs] Functions to invoke.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * function square(n) {
-     *   return n * n;
-     * }
-     *
-     * var addSquare = _.flow(_.add, square);
-     * addSquare(1, 2);
-     * // => 9
-     */
-    var flow = createFlow();
-
-    /**
-     * This method is like `_.flow` except that it creates a function that
-     * invokes the provided functions from right to left.
-     *
-     * @static
-     * @memberOf _
-     * @alias backflow, compose
-     * @category Function
-     * @param {...Function} [funcs] Functions to invoke.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * function square(n) {
-     *   return n * n;
-     * }
-     *
-     * var addSquare = _.flowRight(square, _.add);
-     * addSquare(1, 2);
-     * // => 9
-     */
-    var flowRight = createFlow(true);
-
-    /**
-     * Creates a function that memoizes the result of `func`. If `resolver` is
-     * provided it determines the cache key for storing the result based on the
-     * arguments provided to the memoized function. By default, the first argument
-     * provided to the memoized function is coerced to a string and used as the
-     * cache key. The `func` is invoked with the `this` binding of the memoized
-     * function.
-     *
-     * **Note:** The cache is exposed as the `cache` property on the memoized
-     * function. Its creation may be customized by replacing the `_.memoize.Cache`
-     * constructor with one whose instances implement the [`Map`](http://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-prototype-object)
-     * method interface of `get`, `has`, and `set`.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to have its output memoized.
-     * @param {Function} [resolver] The function to resolve the cache key.
-     * @returns {Function} Returns the new memoizing function.
-     * @example
-     *
-     * var upperCase = _.memoize(function(string) {
-     *   return string.toUpperCase();
-     * });
-     *
-     * upperCase('fred');
-     * // => 'FRED'
-     *
-     * // modifying the result cache
-     * upperCase.cache.set('fred', 'BARNEY');
-     * upperCase('fred');
-     * // => 'BARNEY'
-     *
-     * // replacing `_.memoize.Cache`
-     * var object = { 'user': 'fred' };
-     * var other = { 'user': 'barney' };
-     * var identity = _.memoize(_.identity);
-     *
-     * identity(object);
-     * // => { 'user': 'fred' }
-     * identity(other);
-     * // => { 'user': 'fred' }
-     *
-     * _.memoize.Cache = WeakMap;
-     * var identity = _.memoize(_.identity);
-     *
-     * identity(object);
-     * // => { 'user': 'fred' }
-     * identity(other);
-     * // => { 'user': 'barney' }
-     */
-    function memoize(func, resolver) {
-      if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
-        throw new TypeError(FUNC_ERROR_TEXT);
-      }
-      var memoized = function() {
-        var args = arguments,
-            key = resolver ? resolver.apply(this, args) : args[0],
-            cache = memoized.cache;
-
-        if (cache.has(key)) {
-          return cache.get(key);
-        }
-        var result = func.apply(this, args);
-        memoized.cache = cache.set(key, result);
-        return result;
-      };
-      memoized.cache = new memoize.Cache;
-      return memoized;
-    }
-
-    /**
-     * Creates a function that runs each argument through a corresponding
-     * transform function.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to wrap.
-     * @param {...(Function|Function[])} [transforms] The functions to transform
-     * arguments, specified as individual functions or arrays of functions.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * function doubled(n) {
-     *   return n * 2;
-     * }
-     *
-     * function square(n) {
-     *   return n * n;
-     * }
-     *
-     * var modded = _.modArgs(function(x, y) {
-     *   return [x, y];
-     * }, square, doubled);
-     *
-     * modded(1, 2);
-     * // => [1, 4]
-     *
-     * modded(5, 10);
-     * // => [25, 20]
-     */
-    var modArgs = restParam(function(func, transforms) {
-      transforms = baseFlatten(transforms);
-      if (typeof func != 'function' || !arrayEvery(transforms, baseIsFunction)) {
-        throw new TypeError(FUNC_ERROR_TEXT);
-      }
-      var length = transforms.length;
-      return restParam(function(args) {
-        var index = nativeMin(args.length, length);
-        while (index--) {
-          args[index] = transforms[index](args[index]);
-        }
-        return func.apply(this, args);
-      });
-    });
-
-    /**
-     * Creates a function that negates the result of the predicate `func`. The
-     * `func` predicate is invoked with the `this` binding and arguments of the
-     * created function.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} predicate The predicate to negate.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * function isEven(n) {
-     *   return n % 2 == 0;
-     * }
-     *
-     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
-     * // => [1, 3, 5]
-     */
-    function negate(predicate) {
-      if (typeof predicate != 'function') {
-        throw new TypeError(FUNC_ERROR_TEXT);
-      }
-      return function() {
-        return !predicate.apply(this, arguments);
-      };
-    }
-
-    /**
-     * Creates a function that is restricted to invoking `func` once. Repeat calls
-     * to the function return the value of the first call. The `func` is invoked
-     * with the `this` binding and arguments of the created function.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to restrict.
-     * @returns {Function} Returns the new restricted function.
-     * @example
-     *
-     * var initialize = _.once(createApplication);
-     * initialize();
-     * initialize();
-     * // `initialize` invokes `createApplication` once
-     */
-    function once(func) {
-      return before(2, func);
-    }
-
-    /**
-     * Creates a function that invokes `func` with `partial` arguments prepended
-     * to those provided to the new function. This method is like `_.bind` except
-     * it does **not** alter the `this` binding.
-     *
-     * The `_.partial.placeholder` value, which defaults to `_` in monolithic
-     * builds, may be used as a placeholder for partially applied arguments.
-     *
-     * **Note:** This method does not set the "length" property of partially
-     * applied functions.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to partially apply arguments to.
-     * @param {...*} [partials] The arguments to be partially applied.
-     * @returns {Function} Returns the new partially applied function.
-     * @example
-     *
-     * var greet = function(greeting, name) {
-     *   return greeting + ' ' + name;
-     * };
-     *
-     * var sayHelloTo = _.partial(greet, 'hello');
-     * sayHelloTo('fred');
-     * // => 'hello fred'
-     *
-     * // using placeholders
-     * var greetFred = _.partial(greet, _, 'fred');
-     * greetFred('hi');
-     * // => 'hi fred'
-     */
-    var partial = createPartial(PARTIAL_FLAG);
-
-    /**
-     * This method is like `_.partial` except that partially applied arguments
-     * are appended to those provided to the new function.
-     *
-     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
-     * builds, may be used as a placeholder for partially applied arguments.
-     *
-     * **Note:** This method does not set the "length" property of partially
-     * applied functions.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to partially apply arguments to.
-     * @param {...*} [partials] The arguments to be partially applied.
-     * @returns {Function} Returns the new partially applied function.
-     * @example
-     *
-     * var greet = function(greeting, name) {
-     *   return greeting + ' ' + name;
-     * };
-     *
-     * var greetFred = _.partialRight(greet, 'fred');
-     * greetFred('hi');
-     * // => 'hi fred'
-     *
-     * // using placeholders
-     * var sayHelloTo = _.partialRight(greet, 'hello', _);
-     * sayHelloTo('fred');
-     * // => 'hello fred'
-     */
-    var partialRight = createPartial(PARTIAL_RIGHT_FLAG);
-
-    /**
-     * Creates a function that invokes `func` with arguments arranged according
-     * to the specified indexes where the argument value at the first index is
-     * provided as the first argument, the argument value at the second index is
-     * provided as the second argument, and so on.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to rearrange arguments for.
-     * @param {...(number|number[])} indexes The arranged argument indexes,
-     *  specified as individual indexes or arrays of indexes.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * var rearged = _.rearg(function(a, b, c) {
-     *   return [a, b, c];
-     * }, 2, 0, 1);
-     *
-     * rearged('b', 'c', 'a')
-     * // => ['a', 'b', 'c']
-     *
-     * var map = _.rearg(_.map, [1, 0]);
-     * map(function(n) {
-     *   return n * 3;
-     * }, [1, 2, 3]);
-     * // => [3, 6, 9]
-     */
-    var rearg = restParam(function(func, indexes) {
-      return createWrapper(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes));
-    });
-
-    /**
-     * Creates a function that invokes `func` with the `this` binding of the
-     * created function and arguments from `start` and beyond provided as an array.
-     *
-     * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters).
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to apply a rest parameter to.
-     * @param {number} [start=func.length-1] The start position of the rest parameter.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * var say = _.restParam(function(what, names) {
-     *   return what + ' ' + _.initial(names).join(', ') +
-     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
-     * });
-     *
-     * say('hello', 'fred', 'barney', 'pebbles');
-     * // => 'hello fred, barney, & pebbles'
-     */
-    function restParam(func, start) {
-      if (typeof func != 'function') {
-        throw new TypeError(FUNC_ERROR_TEXT);
-      }
-      start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);
-      return function() {
-        var args = arguments,
-            index = -1,
-            length = nativeMax(args.length - start, 0),
-            rest = Array(length);
-
-        while (++index < length) {
-          rest[index] = args[start + index];
-        }
-        switch (start) {
-          case 0: return func.call(this, rest);
-          case 1: return func.call(this, args[0], rest);
-          case 2: return func.call(this, args[0], args[1], rest);
-        }
-        var otherArgs = Array(start + 1);
-        index = -1;
-        while (++index < start) {
-          otherArgs[index] = args[index];
-        }
-        otherArgs[start] = rest;
-        return func.apply(this, otherArgs);
-      };
-    }
-
-    /**
-     * Creates a function that invokes `func` with the `this` binding of the created
-     * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).
-     *
-     * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator).
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to spread arguments over.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * var say = _.spread(function(who, what) {
-     *   return who + ' says ' + what;
-     * });
-     *
-     * say(['fred', 'hello']);
-     * // => 'fred says hello'
-     *
-     * // with a Promise
-     * var numbers = Promise.all([
-     *   Promise.resolve(40),
-     *   Promise.resolve(36)
-     * ]);
-     *
-     * numbers.then(_.spread(function(x, y) {
-     *   return x + y;
-     * }));
-     * // => a Promise of 76
-     */
-    function spread(func) {
-      if (typeof func != 'function') {
-        throw new TypeError(FUNC_ERROR_TEXT);
-      }
-      return function(array) {
-        return func.apply(this, array);
-      };
-    }
-
-    /**
-     * Creates a throttled function that only invokes `func` at most once per
-     * every `wait` milliseconds. The throttled function comes with a `cancel`
-     * method to cancel delayed invocations. Provide an options object to indicate
-     * that `func` should be invoked on the leading and/or trailing edge of the
-     * `wait` timeout. Subsequent calls to the throttled function return the
-     * result of the last `func` call.
-     *
-     * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
-     * on the trailing edge of the timeout only if the the throttled function is
-     * invoked more than once during the `wait` timeout.
-     *
-     * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
-     * for details over the differences between `_.throttle` and `_.debounce`.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {Function} func The function to throttle.
-     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
-     * @param {Object} [options] The options object.
-     * @param {boolean} [options.leading=true] Specify invoking on the leading
-     *  edge of the timeout.
-     * @param {boolean} [options.trailing=true] Specify invoking on the trailing
-     *  edge of the timeout.
-     * @returns {Function} Returns the new throttled function.
-     * @example
-     *
-     * // avoid excessively updating the position while scrolling
-     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
-     *
-     * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes
-     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
-     *   'trailing': false
-     * }));
-     *
-     * // cancel a trailing throttled call
-     * jQuery(window).on('popstate', throttled.cancel);
-     */
-    function throttle(func, wait, options) {
-      var leading = true,
-          trailing = true;
-
-      if (typeof func != 'function') {
-        throw new TypeError(FUNC_ERROR_TEXT);
-      }
-      if (options === false) {
-        leading = false;
-      } else if (isObject(options)) {
-        leading = 'leading' in options ? !!options.leading : leading;
-        trailing = 'trailing' in options ? !!options.trailing : trailing;
-      }
-      return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });
-    }
-
-    /**
-     * Creates a function that provides `value` to the wrapper function as its
-     * first argument. Any additional arguments provided to the function are
-     * appended to those provided to the wrapper function. The wrapper is invoked
-     * with the `this` binding of the created function.
-     *
-     * @static
-     * @memberOf _
-     * @category Function
-     * @param {*} value The value to wrap.
-     * @param {Function} wrapper The wrapper function.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * var p = _.wrap(_.escape, function(func, text) {
-     *   return '<p>' + func(text) + '</p>';
-     * });
-     *
-     * p('fred, barney, & pebbles');
-     * // => '<p>fred, barney, &amp; pebbles</p>'
-     */
-    function wrap(value, wrapper) {
-      wrapper = wrapper == null ? identity : wrapper;
-      return createWrapper(wrapper, PARTIAL_FLAG, undefined, [value], []);
-    }
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,
-     * otherwise they are assigned by reference. If `customizer` is provided it is
-     * invoked to produce the cloned values. If `customizer` returns `undefined`
-     * cloning is handled by the method instead. The `customizer` is bound to
-     * `thisArg` and invoked with two argument; (value [, index|key, object]).
-     *
-     * **Note:** This method is loosely based on the
-     * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
-     * The enumerable properties of `arguments` objects and objects created by
-     * constructors other than `Object` are cloned to plain `Object` objects. An
-     * empty object is returned for uncloneable values such as functions, DOM nodes,
-     * Maps, Sets, and WeakMaps.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to clone.
-     * @param {boolean} [isDeep] Specify a deep clone.
-     * @param {Function} [customizer] The function to customize cloning values.
-     * @param {*} [thisArg] The `this` binding of `customizer`.
-     * @returns {*} Returns the cloned value.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'barney' },
-     *   { 'user': 'fred' }
-     * ];
-     *
-     * var shallow = _.clone(users);
-     * shallow[0] === users[0];
-     * // => true
-     *
-     * var deep = _.clone(users, true);
-     * deep[0] === users[0];
-     * // => false
-     *
-     * // using a customizer callback
-     * var el = _.clone(document.body, function(value) {
-     *   if (_.isElement(value)) {
-     *     return value.cloneNode(false);
-     *   }
-     * });
-     *
-     * el === document.body
-     * // => false
-     * el.nodeName
-     * // => BODY
-     * el.childNodes.length;
-     * // => 0
-     */
-    function clone(value, isDeep, customizer, thisArg) {
-      if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) {
-        isDeep = false;
-      }
-      else if (typeof isDeep == 'function') {
-        thisArg = customizer;
-        customizer = isDeep;
-        isDeep = false;
-      }
-      return typeof customizer == 'function'
-        ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 1))
-        : baseClone(value, isDeep);
-    }
-
-    /**
-     * Creates a deep clone of `value`. If `customizer` is provided it is invoked
-     * to produce the cloned values. If `customizer` returns `undefined` cloning
-     * is handled by the method instead. The `customizer` is bound to `thisArg`
-     * and invoked with two argument; (value [, index|key, object]).
-     *
-     * **Note:** This method is loosely based on the
-     * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
-     * The enumerable properties of `arguments` objects and objects created by
-     * constructors other than `Object` are cloned to plain `Object` objects. An
-     * empty object is returned for uncloneable values such as functions, DOM nodes,
-     * Maps, Sets, and WeakMaps.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to deep clone.
-     * @param {Function} [customizer] The function to customize cloning values.
-     * @param {*} [thisArg] The `this` binding of `customizer`.
-     * @returns {*} Returns the deep cloned value.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'barney' },
-     *   { 'user': 'fred' }
-     * ];
-     *
-     * var deep = _.cloneDeep(users);
-     * deep[0] === users[0];
-     * // => false
-     *
-     * // using a customizer callback
-     * var el = _.cloneDeep(document.body, function(value) {
-     *   if (_.isElement(value)) {
-     *     return value.cloneNode(true);
-     *   }
-     * });
-     *
-     * el === document.body
-     * // => false
-     * el.nodeName
-     * // => BODY
-     * el.childNodes.length;
-     * // => 20
-     */
-    function cloneDeep(value, customizer, thisArg) {
-      return typeof customizer == 'function'
-        ? baseClone(value, true, bindCallback(customizer, thisArg, 1))
-        : baseClone(value, true);
-    }
-
-    /**
-     * Checks if `value` is greater than `other`.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to compare.
-     * @param {*} other The other value to compare.
-     * @returns {boolean} Returns `true` if `value` is greater than `other`, else `false`.
-     * @example
-     *
-     * _.gt(3, 1);
-     * // => true
-     *
-     * _.gt(3, 3);
-     * // => false
-     *
-     * _.gt(1, 3);
-     * // => false
-     */
-    function gt(value, other) {
-      return value > other;
-    }
-
-    /**
-     * Checks if `value` is greater than or equal to `other`.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to compare.
-     * @param {*} other The other value to compare.
-     * @returns {boolean} Returns `true` if `value` is greater than or equal to `other`, else `false`.
-     * @example
-     *
-     * _.gte(3, 1);
-     * // => true
-     *
-     * _.gte(3, 3);
-     * // => true
-     *
-     * _.gte(1, 3);
-     * // => false
-     */
-    function gte(value, other) {
-      return value >= other;
-    }
-
-    /**
-     * Checks if `value` is classified as an `arguments` object.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
-     * @example
-     *
-     * _.isArguments(function() { return arguments; }());
-     * // => true
-     *
-     * _.isArguments([1, 2, 3]);
-     * // => false
-     */
-    function isArguments(value) {
-      return isObjectLike(value) && isArrayLike(value) &&
-        hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
-    }
-
-    /**
-     * Checks if `value` is classified as an `Array` object.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
-     * @example
-     *
-     * _.isArray([1, 2, 3]);
-     * // => true
-     *
-     * _.isArray(function() { return arguments; }());
-     * // => false
-     */
-    var isArray = nativeIsArray || function(value) {
-      return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
-    };
-
-    /**
-     * Checks if `value` is classified as a boolean primitive or object.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
-     * @example
-     *
-     * _.isBoolean(false);
-     * // => true
-     *
-     * _.isBoolean(null);
-     * // => false
-     */
-    function isBoolean(value) {
-      return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag);
-    }
-
-    /**
-     * Checks if `value` is classified as a `Date` object.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
-     * @example
-     *
-     * _.isDate(new Date);
-     * // => true
-     *
-     * _.isDate('Mon April 23 2012');
-     * // => false
-     */
-    function isDate(value) {
-      return isObjectLike(value) && objToString.call(value) == dateTag;
-    }
-
-    /**
-     * Checks if `value` is a DOM element.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
-     * @example
-     *
-     * _.isElement(document.body);
-     * // => true
-     *
-     * _.isElement('<body>');
-     * // => false
-     */
-    function isElement(value) {
-      return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);
-    }
-
-    /**
-     * Checks if `value` is empty. A value is considered empty unless it is an
-     * `arguments` object, array, string, or jQuery-like collection with a length
-     * greater than `0` or an object with own enumerable properties.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {Array|Object|string} value The value to inspect.
-     * @returns {boolean} Returns `true` if `value` is empty, else `false`.
-     * @example
-     *
-     * _.isEmpty(null);
-     * // => true
-     *
-     * _.isEmpty(true);
-     * // => true
-     *
-     * _.isEmpty(1);
-     * // => true
-     *
-     * _.isEmpty([1, 2, 3]);
-     * // => false
-     *
-     * _.isEmpty({ 'a': 1 });
-     * // => false
-     */
-    function isEmpty(value) {
-      if (value == null) {
-        return true;
-      }
-      if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) ||
-          (isObjectLike(value) && isFunction(value.splice)))) {
-        return !value.length;
-      }
-      return !keys(value).length;
-    }
-
-    /**
-     * Performs a deep comparison between two values to determine if they are
-     * equivalent. If `customizer` is provided it is invoked to compare values.
-     * If `customizer` returns `undefined` comparisons are handled by the method
-     * instead. The `customizer` is bound to `thisArg` and invoked with three
-     * arguments: (value, other [, index|key]).
-     *
-     * **Note:** This method supports comparing arrays, booleans, `Date` objects,
-     * numbers, `Object` objects, regexes, and strings. Objects are compared by
-     * their own, not inherited, enumerable properties. Functions and DOM nodes
-     * are **not** supported. Provide a customizer function to extend support
-     * for comparing other values.
-     *
-     * @static
-     * @memberOf _
-     * @alias eq
-     * @category Lang
-     * @param {*} value The value to compare.
-     * @param {*} other The other value to compare.
-     * @param {Function} [customizer] The function to customize value comparisons.
-     * @param {*} [thisArg] The `this` binding of `customizer`.
-     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
-     * @example
-     *
-     * var object = { 'user': 'fred' };
-     * var other = { 'user': 'fred' };
-     *
-     * object == other;
-     * // => false
-     *
-     * _.isEqual(object, other);
-     * // => true
-     *
-     * // using a customizer callback
-     * var array = ['hello', 'goodbye'];
-     * var other = ['hi', 'goodbye'];
-     *
-     * _.isEqual(array, other, function(value, other) {
-     *   if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) {
-     *     return true;
-     *   }
-     * });
-     * // => true
-     */
-    function isEqual(value, other, customizer, thisArg) {
-      customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;
-      var result = customizer ? customizer(value, other) : undefined;
-      return  result === undefined ? baseIsEqual(value, other, customizer) : !!result;
-    }
-
-    /**
-     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
-     * `SyntaxError`, `TypeError`, or `URIError` object.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
-     * @example
-     *
-     * _.isError(new Error);
-     * // => true
-     *
-     * _.isError(Error);
-     * // => false
-     */
-    function isError(value) {
-      return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;
-    }
-
-    /**
-     * Checks if `value` is a finite primitive number.
-     *
-     * **Note:** This method is based on [`Number.isFinite`](http://ecma-international.org/ecma-262/6.0/#sec-number.isfinite).
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
-     * @example
-     *
-     * _.isFinite(10);
-     * // => true
-     *
-     * _.isFinite('10');
-     * // => false
-     *
-     * _.isFinite(true);
-     * // => false
-     *
-     * _.isFinite(Object(10));
-     * // => false
-     *
-     * _.isFinite(Infinity);
-     * // => false
-     */
-    function isFinite(value) {
-      return typeof value == 'number' && nativeIsFinite(value);
-    }
-
-    /**
-     * Checks if `value` is classified as a `Function` object.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
-     * @example
-     *
-     * _.isFunction(_);
-     * // => true
-     *
-     * _.isFunction(/abc/);
-     * // => false
-     */
-    function isFunction(value) {
-      // The use of `Object#toString` avoids issues with the `typeof` operator
-      // in older versions of Chrome and Safari which return 'function' for regexes
-      // and Safari 8 equivalents which return 'object' for typed array constructors.
-      return isObject(value) && objToString.call(value) == funcTag;
-    }
-
-    /**
-     * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
-     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is an object, else `false`.
-     * @example
-     *
-     * _.isObject({});
-     * // => true
-     *
-     * _.isObject([1, 2, 3]);
-     * // => true
-     *
-     * _.isObject(1);
-     * // => false
-     */
-    function isObject(value) {
-      // Avoid a V8 JIT bug in Chrome 19-20.
-      // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
-      var type = typeof value;
-      return !!value && (type == 'object' || type == 'function');
-    }
-
-    /**
-     * Performs a deep comparison between `object` and `source` to determine if
-     * `object` contains equivalent property values. If `customizer` is provided
-     * it is invoked to compare values. If `customizer` returns `undefined`
-     * comparisons are handled by the method instead. The `customizer` is bound
-     * to `thisArg` and invoked with three arguments: (value, other, index|key).
-     *
-     * **Note:** This method supports comparing properties of arrays, booleans,
-     * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions
-     * and DOM nodes are **not** supported. Provide a customizer function to extend
-     * support for comparing other values.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {Object} object The object to inspect.
-     * @param {Object} source The object of property values to match.
-     * @param {Function} [customizer] The function to customize value comparisons.
-     * @param {*} [thisArg] The `this` binding of `customizer`.
-     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
-     * @example
-     *
-     * var object = { 'user': 'fred', 'age': 40 };
-     *
-     * _.isMatch(object, { 'age': 40 });
-     * // => true
-     *
-     * _.isMatch(object, { 'age': 36 });
-     * // => false
-     *
-     * // using a customizer callback
-     * var object = { 'greeting': 'hello' };
-     * var source = { 'greeting': 'hi' };
-     *
-     * _.isMatch(object, source, function(value, other) {
-     *   return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined;
-     * });
-     * // => true
-     */
-    function isMatch(object, source, customizer, thisArg) {
-      customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;
-      return baseIsMatch(object, getMatchData(source), customizer);
-    }
-
-    /**
-     * Checks if `value` is `NaN`.
-     *
-     * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4)
-     * which returns `true` for `undefined` and other non-numeric values.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
-     * @example
-     *
-     * _.isNaN(NaN);
-     * // => true
-     *
-     * _.isNaN(new Number(NaN));
-     * // => true
-     *
-     * isNaN(undefined);
-     * // => true
-     *
-     * _.isNaN(undefined);
-     * // => false
-     */
-    function isNaN(value) {
-      // An `NaN` primitive is the only value that is not equal to itself.
-      // Perform the `toStringTag` check first to avoid errors with some host objects in IE.
-      return isNumber(value) && value != +value;
-    }
-
-    /**
-     * Checks if `value` is a native function.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
-     * @example
-     *
-     * _.isNative(Array.prototype.push);
-     * // => true
-     *
-     * _.isNative(_);
-     * // => false
-     */
-    function isNative(value) {
-      if (value == null) {
-        return false;
-      }
-      if (isFunction(value)) {
-        return reIsNative.test(fnToString.call(value));
-      }
-      return isObjectLike(value) && reIsHostCtor.test(value);
-    }
-
-    /**
-     * Checks if `value` is `null`.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
-     * @example
-     *
-     * _.isNull(null);
-     * // => true
-     *
-     * _.isNull(void 0);
-     * // => false
-     */
-    function isNull(value) {
-      return value === null;
-    }
-
-    /**
-     * Checks if `value` is classified as a `Number` primitive or object.
-     *
-     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified
-     * as numbers, use the `_.isFinite` method.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
-     * @example
-     *
-     * _.isNumber(8.4);
-     * // => true
-     *
-     * _.isNumber(NaN);
-     * // => true
-     *
-     * _.isNumber('8.4');
-     * // => false
-     */
-    function isNumber(value) {
-      return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag);
-    }
-
-    /**
-     * Checks if `value` is a plain object, that is, an object created by the
-     * `Object` constructor or one with a `[[Prototype]]` of `null`.
-     *
-     * **Note:** This method assumes objects created by the `Object` constructor
-     * have no inherited enumerable properties.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
-     * @example
-     *
-     * function Foo() {
-     *   this.a = 1;
-     * }
-     *
-     * _.isPlainObject(new Foo);
-     * // => false
-     *
-     * _.isPlainObject([1, 2, 3]);
-     * // => false
-     *
-     * _.isPlainObject({ 'x': 0, 'y': 0 });
-     * // => true
-     *
-     * _.isPlainObject(Object.create(null));
-     * // => true
-     */
-    function isPlainObject(value) {
-      var Ctor;
-
-      // Exit early for non `Object` objects.
-      if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isArguments(value)) ||
-          (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {
-        return false;
-      }
-      // IE < 9 iterates inherited properties before own properties. If the first
-      // iterated property is an object's own property then there are no inherited
-      // enumerable properties.
-      var result;
-      // In most environments an object's own properties are iterated before
-      // its inherited properties. If the last iterated property is an object's
-      // own property then there are no inherited enumerable properties.
-      baseForIn(value, function(subValue, key) {
-        result = key;
-      });
-      return result === undefined || hasOwnProperty.call(value, result);
-    }
-
-    /**
-     * Checks if `value` is classified as a `RegExp` object.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
-     * @example
-     *
-     * _.isRegExp(/abc/);
-     * // => true
-     *
-     * _.isRegExp('/abc/');
-     * // => false
-     */
-    function isRegExp(value) {
-      return isObject(value) && objToString.call(value) == regexpTag;
-    }
-
-    /**
-     * Checks if `value` is classified as a `String` primitive or object.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
-     * @example
-     *
-     * _.isString('abc');
-     * // => true
-     *
-     * _.isString(1);
-     * // => false
-     */
-    function isString(value) {
-      return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);
-    }
-
-    /**
-     * Checks if `value` is classified as a typed array.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
-     * @example
-     *
-     * _.isTypedArray(new Uint8Array);
-     * // => true
-     *
-     * _.isTypedArray([]);
-     * // => false
-     */
-    function isTypedArray(value) {
-      return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];
-    }
-
-    /**
-     * Checks if `value` is `undefined`.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to check.
-     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
-     * @example
-     *
-     * _.isUndefined(void 0);
-     * // => true
-     *
-     * _.isUndefined(null);
-     * // => false
-     */
-    function isUndefined(value) {
-      return value === undefined;
-    }
-
-    /**
-     * Checks if `value` is less than `other`.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to compare.
-     * @param {*} other The other value to compare.
-     * @returns {boolean} Returns `true` if `value` is less than `other`, else `false`.
-     * @example
-     *
-     * _.lt(1, 3);
-     * // => true
-     *
-     * _.lt(3, 3);
-     * // => false
-     *
-     * _.lt(3, 1);
-     * // => false
-     */
-    function lt(value, other) {
-      return value < other;
-    }
-
-    /**
-     * Checks if `value` is less than or equal to `other`.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to compare.
-     * @param {*} other The other value to compare.
-     * @returns {boolean} Returns `true` if `value` is less than or equal to `other`, else `false`.
-     * @example
-     *
-     * _.lte(1, 3);
-     * // => true
-     *
-     * _.lte(3, 3);
-     * // => true
-     *
-     * _.lte(3, 1);
-     * // => false
-     */
-    function lte(value, other) {
-      return value <= other;
-    }
-
-    /**
-     * Converts `value` to an array.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to convert.
-     * @returns {Array} Returns the converted array.
-     * @example
-     *
-     * (function() {
-     *   return _.toArray(arguments).slice(1);
-     * }(1, 2, 3));
-     * // => [2, 3]
-     */
-    function toArray(value) {
-      var length = value ? getLength(value) : 0;
-      if (!isLength(length)) {
-        return values(value);
-      }
-      if (!length) {
-        return [];
-      }
-      return arrayCopy(value);
-    }
-
-    /**
-     * Converts `value` to a plain object flattening inherited enumerable
-     * properties of `value` to own properties of the plain object.
-     *
-     * @static
-     * @memberOf _
-     * @category Lang
-     * @param {*} value The value to convert.
-     * @returns {Object} Returns the converted plain object.
-     * @example
-     *
-     * function Foo() {
-     *   this.b = 2;
-     * }
-     *
-     * Foo.prototype.c = 3;
-     *
-     * _.assign({ 'a': 1 }, new Foo);
-     * // => { 'a': 1, 'b': 2 }
-     *
-     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
-     * // => { 'a': 1, 'b': 2, 'c': 3 }
-     */
-    function toPlainObject(value) {
-      return baseCopy(value, keysIn(value));
-    }
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Recursively merges own enumerable properties of the source object(s), that
-     * don't resolve to `undefined` into the destination object. Subsequent sources
-     * overwrite property assignments of previous sources. If `customizer` is
-     * provided it is invoked to produce the merged values of the destination and
-     * source properties. If `customizer` returns `undefined` merging is handled
-     * by the method instead. The `customizer` is bound to `thisArg` and invoked
-     * with five arguments: (objectValue, sourceValue, key, object, source).
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The destination object.
-     * @param {...Object} [sources] The source objects.
-     * @param {Function} [customizer] The function to customize assigned values.
-     * @param {*} [thisArg] The `this` binding of `customizer`.
-     * @returns {Object} Returns `object`.
-     * @example
-     *
-     * var users = {
-     *   'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
-     * };
-     *
-     * var ages = {
-     *   'data': [{ 'age': 36 }, { 'age': 40 }]
-     * };
-     *
-     * _.merge(users, ages);
-     * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
-     *
-     * // using a customizer callback
-     * var object = {
-     *   'fruits': ['apple'],
-     *   'vegetables': ['beet']
-     * };
-     *
-     * var other = {
-     *   'fruits': ['banana'],
-     *   'vegetables': ['carrot']
-     * };
-     *
-     * _.merge(object, other, function(a, b) {
-     *   if (_.isArray(a)) {
-     *     return a.concat(b);
-     *   }
-     * });
-     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
-     */
-    var merge = createAssigner(baseMerge);
-
-    /**
-     * Assigns own enumerable properties of source object(s) to the destination
-     * object. Subsequent sources overwrite property assignments of previous sources.
-     * If `customizer` is provided it is invoked to produce the assigned values.
-     * The `customizer` is bound to `thisArg` and invoked with five arguments:
-     * (objectValue, sourceValue, key, object, source).
-     *
-     * **Note:** This method mutates `object` and is based on
-     * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign).
-     *
-     * @static
-     * @memberOf _
-     * @alias extend
-     * @category Object
-     * @param {Object} object The destination object.
-     * @param {...Object} [sources] The source objects.
-     * @param {Function} [customizer] The function to customize assigned values.
-     * @param {*} [thisArg] The `this` binding of `customizer`.
-     * @returns {Object} Returns `object`.
-     * @example
-     *
-     * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });
-     * // => { 'user': 'fred', 'age': 40 }
-     *
-     * // using a customizer callback
-     * var defaults = _.partialRight(_.assign, function(value, other) {
-     *   return _.isUndefined(value) ? other : value;
-     * });
-     *
-     * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
-     * // => { 'user': 'barney', 'age': 36 }
-     */
-    var assign = createAssigner(function(object, source, customizer) {
-      return customizer
-        ? assignWith(object, source, customizer)
-        : baseAssign(object, source);
-    });
-
-    /**
-     * Creates an object that inherits from the given `prototype` object. If a
-     * `properties` object is provided its own enumerable properties are assigned
-     * to the created object.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} prototype The object to inherit from.
-     * @param {Object} [properties] The properties to assign to the object.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {Object} Returns the new object.
-     * @example
-     *
-     * function Shape() {
-     *   this.x = 0;
-     *   this.y = 0;
-     * }
-     *
-     * function Circle() {
-     *   Shape.call(this);
-     * }
-     *
-     * Circle.prototype = _.create(Shape.prototype, {
-     *   'constructor': Circle
-     * });
-     *
-     * var circle = new Circle;
-     * circle instanceof Circle;
-     * // => true
-     *
-     * circle instanceof Shape;
-     * // => true
-     */
-    function create(prototype, properties, guard) {
-      var result = baseCreate(prototype);
-      if (guard && isIterateeCall(prototype, properties, guard)) {
-        properties = undefined;
-      }
-      return properties ? baseAssign(result, properties) : result;
-    }
-
-    /**
-     * Assigns own enumerable properties of source object(s) to the destination
-     * object for all destination properties that resolve to `undefined`. Once a
-     * property is set, additional values of the same property are ignored.
-     *
-     * **Note:** This method mutates `object`.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The destination object.
-     * @param {...Object} [sources] The source objects.
-     * @returns {Object} Returns `object`.
-     * @example
-     *
-     * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
-     * // => { 'user': 'barney', 'age': 36 }
-     */
-    var defaults = createDefaults(assign, assignDefaults);
-
-    /**
-     * This method is like `_.defaults` except that it recursively assigns
-     * default properties.
-     *
-     * **Note:** This method mutates `object`.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The destination object.
-     * @param {...Object} [sources] The source objects.
-     * @returns {Object} Returns `object`.
-     * @example
-     *
-     * _.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } });
-     * // => { 'user': { 'name': 'barney', 'age': 36 } }
-     *
-     */
-    var defaultsDeep = createDefaults(merge, mergeDefaults);
-
-    /**
-     * This method is like `_.find` except that it returns the key of the first
-     * element `predicate` returns truthy for instead of the element itself.
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to search.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {string|undefined} Returns the key of the matched element, else `undefined`.
-     * @example
-     *
-     * var users = {
-     *   'barney':  { 'age': 36, 'active': true },
-     *   'fred':    { 'age': 40, 'active': false },
-     *   'pebbles': { 'age': 1,  'active': true }
-     * };
-     *
-     * _.findKey(users, function(chr) {
-     *   return chr.age < 40;
-     * });
-     * // => 'barney' (iteration order is not guaranteed)
-     *
-     * // using the `_.matches` callback shorthand
-     * _.findKey(users, { 'age': 1, 'active': true });
-     * // => 'pebbles'
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.findKey(users, 'active', false);
-     * // => 'fred'
-     *
-     * // using the `_.property` callback shorthand
-     * _.findKey(users, 'active');
-     * // => 'barney'
-     */
-    var findKey = createFindKey(baseForOwn);
-
-    /**
-     * This method is like `_.findKey` except that it iterates over elements of
-     * a collection in the opposite order.
-     *
-     * If a property name is provided for `predicate` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `predicate` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to search.
-     * @param {Function|Object|string} [predicate=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {string|undefined} Returns the key of the matched element, else `undefined`.
-     * @example
-     *
-     * var users = {
-     *   'barney':  { 'age': 36, 'active': true },
-     *   'fred':    { 'age': 40, 'active': false },
-     *   'pebbles': { 'age': 1,  'active': true }
-     * };
-     *
-     * _.findLastKey(users, function(chr) {
-     *   return chr.age < 40;
-     * });
-     * // => returns `pebbles` assuming `_.findKey` returns `barney`
-     *
-     * // using the `_.matches` callback shorthand
-     * _.findLastKey(users, { 'age': 36, 'active': true });
-     * // => 'barney'
-     *
-     * // using the `_.matchesProperty` callback shorthand
-     * _.findLastKey(users, 'active', false);
-     * // => 'fred'
-     *
-     * // using the `_.property` callback shorthand
-     * _.findLastKey(users, 'active');
-     * // => 'pebbles'
-     */
-    var findLastKey = createFindKey(baseForOwnRight);
-
-    /**
-     * Iterates over own and inherited enumerable properties of an object invoking
-     * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked
-     * with three arguments: (value, key, object). Iteratee functions may exit
-     * iteration early by explicitly returning `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to iterate over.
-     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Object} Returns `object`.
-     * @example
-     *
-     * function Foo() {
-     *   this.a = 1;
-     *   this.b = 2;
-     * }
-     *
-     * Foo.prototype.c = 3;
-     *
-     * _.forIn(new Foo, function(value, key) {
-     *   console.log(key);
-     * });
-     * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)
-     */
-    var forIn = createForIn(baseFor);
-
-    /**
-     * This method is like `_.forIn` except that it iterates over properties of
-     * `object` in the opposite order.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to iterate over.
-     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Object} Returns `object`.
-     * @example
-     *
-     * function Foo() {
-     *   this.a = 1;
-     *   this.b = 2;
-     * }
-     *
-     * Foo.prototype.c = 3;
-     *
-     * _.forInRight(new Foo, function(value, key) {
-     *   console.log(key);
-     * });
-     * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'
-     */
-    var forInRight = createForIn(baseForRight);
-
-    /**
-     * Iterates over own enumerable properties of an object invoking `iteratee`
-     * for each property. The `iteratee` is bound to `thisArg` and invoked with
-     * three arguments: (value, key, object). Iteratee functions may exit iteration
-     * early by explicitly returning `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to iterate over.
-     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Object} Returns `object`.
-     * @example
-     *
-     * function Foo() {
-     *   this.a = 1;
-     *   this.b = 2;
-     * }
-     *
-     * Foo.prototype.c = 3;
-     *
-     * _.forOwn(new Foo, function(value, key) {
-     *   console.log(key);
-     * });
-     * // => logs 'a' and 'b' (iteration order is not guaranteed)
-     */
-    var forOwn = createForOwn(baseForOwn);
-
-    /**
-     * This method is like `_.forOwn` except that it iterates over properties of
-     * `object` in the opposite order.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to iterate over.
-     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Object} Returns `object`.
-     * @example
-     *
-     * function Foo() {
-     *   this.a = 1;
-     *   this.b = 2;
-     * }
-     *
-     * Foo.prototype.c = 3;
-     *
-     * _.forOwnRight(new Foo, function(value, key) {
-     *   console.log(key);
-     * });
-     * // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b'
-     */
-    var forOwnRight = createForOwn(baseForOwnRight);
-
-    /**
-     * Creates an array of function property names from all enumerable properties,
-     * own and inherited, of `object`.
-     *
-     * @static
-     * @memberOf _
-     * @alias methods
-     * @category Object
-     * @param {Object} object The object to inspect.
-     * @returns {Array} Returns the new array of property names.
-     * @example
-     *
-     * _.functions(_);
-     * // => ['after', 'ary', 'assign', ...]
-     */
-    function functions(object) {
-      return baseFunctions(object, keysIn(object));
-    }
-
-    /**
-     * Gets the property value at `path` of `object`. If the resolved value is
-     * `undefined` the `defaultValue` is used in its place.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to query.
-     * @param {Array|string} path The path of the property to get.
-     * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
-     * @returns {*} Returns the resolved value.
-     * @example
-     *
-     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
-     *
-     * _.get(object, 'a[0].b.c');
-     * // => 3
-     *
-     * _.get(object, ['a', '0', 'b', 'c']);
-     * // => 3
-     *
-     * _.get(object, 'a.b.c', 'default');
-     * // => 'default'
-     */
-    function get(object, path, defaultValue) {
-      var result = object == null ? undefined : baseGet(object, toPath(path), path + '');
-      return result === undefined ? defaultValue : result;
-    }
-
-    /**
-     * Checks if `path` is a direct property.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to query.
-     * @param {Array|string} path The path to check.
-     * @returns {boolean} Returns `true` if `path` is a direct property, else `false`.
-     * @example
-     *
-     * var object = { 'a': { 'b': { 'c': 3 } } };
-     *
-     * _.has(object, 'a');
-     * // => true
-     *
-     * _.has(object, 'a.b.c');
-     * // => true
-     *
-     * _.has(object, ['a', 'b', 'c']);
-     * // => true
-     */
-    function has(object, path) {
-      if (object == null) {
-        return false;
-      }
-      var result = hasOwnProperty.call(object, path);
-      if (!result && !isKey(path)) {
-        path = toPath(path);
-        object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
-        if (object == null) {
-          return false;
-        }
-        path = last(path);
-        result = hasOwnProperty.call(object, path);
-      }
-      return result || (isLength(object.length) && isIndex(path, object.length) &&
-        (isArray(object) || isArguments(object)));
-    }
-
-    /**
-     * Creates an object composed of the inverted keys and values of `object`.
-     * If `object` contains duplicate values, subsequent values overwrite property
-     * assignments of previous values unless `multiValue` is `true`.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to invert.
-     * @param {boolean} [multiValue] Allow multiple values per key.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {Object} Returns the new inverted object.
-     * @example
-     *
-     * var object = { 'a': 1, 'b': 2, 'c': 1 };
-     *
-     * _.invert(object);
-     * // => { '1': 'c', '2': 'b' }
-     *
-     * // with `multiValue`
-     * _.invert(object, true);
-     * // => { '1': ['a', 'c'], '2': ['b'] }
-     */
-    function invert(object, multiValue, guard) {
-      if (guard && isIterateeCall(object, multiValue, guard)) {
-        multiValue = undefined;
-      }
-      var index = -1,
-          props = keys(object),
-          length = props.length,
-          result = {};
-
-      while (++index < length) {
-        var key = props[index],
-            value = object[key];
-
-        if (multiValue) {
-          if (hasOwnProperty.call(result, value)) {
-            result[value].push(key);
-          } else {
-            result[value] = [key];
-          }
-        }
-        else {
-          result[value] = key;
-        }
-      }
-      return result;
-    }
-
-    /**
-     * Creates an array of the own enumerable property names of `object`.
-     *
-     * **Note:** Non-object values are coerced to objects. See the
-     * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
-     * for more details.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to query.
-     * @returns {Array} Returns the array of property names.
-     * @example
-     *
-     * function Foo() {
-     *   this.a = 1;
-     *   this.b = 2;
-     * }
-     *
-     * Foo.prototype.c = 3;
-     *
-     * _.keys(new Foo);
-     * // => ['a', 'b'] (iteration order is not guaranteed)
-     *
-     * _.keys('hi');
-     * // => ['0', '1']
-     */
-    var keys = !nativeKeys ? shimKeys : function(object) {
-      var Ctor = object == null ? undefined : object.constructor;
-      if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
-          (typeof object != 'function' && isArrayLike(object))) {
-        return shimKeys(object);
-      }
-      return isObject(object) ? nativeKeys(object) : [];
-    };
-
-    /**
-     * Creates an array of the own and inherited enumerable property names of `object`.
-     *
-     * **Note:** Non-object values are coerced to objects.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to query.
-     * @returns {Array} Returns the array of property names.
-     * @example
-     *
-     * function Foo() {
-     *   this.a = 1;
-     *   this.b = 2;
-     * }
-     *
-     * Foo.prototype.c = 3;
-     *
-     * _.keysIn(new Foo);
-     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
-     */
-    function keysIn(object) {
-      if (object == null) {
-        return [];
-      }
-      if (!isObject(object)) {
-        object = Object(object);
-      }
-      var length = object.length;
-      length = (length && isLength(length) &&
-        (isArray(object) || isArguments(object)) && length) || 0;
-
-      var Ctor = object.constructor,
-          index = -1,
-          isProto = typeof Ctor == 'function' && Ctor.prototype === object,
-          result = Array(length),
-          skipIndexes = length > 0;
-
-      while (++index < length) {
-        result[index] = (index + '');
-      }
-      for (var key in object) {
-        if (!(skipIndexes && isIndex(key, length)) &&
-            !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
-          result.push(key);
-        }
-      }
-      return result;
-    }
-
-    /**
-     * The opposite of `_.mapValues`; this method creates an object with the
-     * same values as `object` and keys generated by running each own enumerable
-     * property of `object` through `iteratee`.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to iterate over.
-     * @param {Function|Object|string} [iteratee=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Object} Returns the new mapped object.
-     * @example
-     *
-     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
-     *   return key + value;
-     * });
-     * // => { 'a1': 1, 'b2': 2 }
-     */
-    var mapKeys = createObjectMapper(true);
-
-    /**
-     * Creates an object with the same keys as `object` and values generated by
-     * running each own enumerable property of `object` through `iteratee`. The
-     * iteratee function is bound to `thisArg` and invoked with three arguments:
-     * (value, key, object).
-     *
-     * If a property name is provided for `iteratee` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `iteratee` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to iterate over.
-     * @param {Function|Object|string} [iteratee=_.identity] The function invoked
-     *  per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Object} Returns the new mapped object.
-     * @example
-     *
-     * _.mapValues({ 'a': 1, 'b': 2 }, function(n) {
-     *   return n * 3;
-     * });
-     * // => { 'a': 3, 'b': 6 }
-     *
-     * var users = {
-     *   'fred':    { 'user': 'fred',    'age': 40 },
-     *   'pebbles': { 'user': 'pebbles', 'age': 1 }
-     * };
-     *
-     * // using the `_.property` callback shorthand
-     * _.mapValues(users, 'age');
-     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
-     */
-    var mapValues = createObjectMapper();
-
-    /**
-     * The opposite of `_.pick`; this method creates an object composed of the
-     * own and inherited enumerable properties of `object` that are not omitted.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The source object.
-     * @param {Function|...(string|string[])} [predicate] The function invoked per
-     *  iteration or property names to omit, specified as individual property
-     *  names or arrays of property names.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {Object} Returns the new object.
-     * @example
-     *
-     * var object = { 'user': 'fred', 'age': 40 };
-     *
-     * _.omit(object, 'age');
-     * // => { 'user': 'fred' }
-     *
-     * _.omit(object, _.isNumber);
-     * // => { 'user': 'fred' }
-     */
-    var omit = restParam(function(object, props) {
-      if (object == null) {
-        return {};
-      }
-      if (typeof props[0] != 'function') {
-        var props = arrayMap(baseFlatten(props), String);
-        return pickByArray(object, baseDifference(keysIn(object), props));
-      }
-      var predicate = bindCallback(props[0], props[1], 3);
-      return pickByCallback(object, function(value, key, object) {
-        return !predicate(value, key, object);
-      });
-    });
-
-    /**
-     * Creates a two dimensional array of the key-value pairs for `object`,
-     * e.g. `[[key1, value1], [key2, value2]]`.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to query.
-     * @returns {Array} Returns the new array of key-value pairs.
-     * @example
-     *
-     * _.pairs({ 'barney': 36, 'fred': 40 });
-     * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)
-     */
-    function pairs(object) {
-      object = toObject(object);
-
-      var index = -1,
-          props = keys(object),
-          length = props.length,
-          result = Array(length);
-
-      while (++index < length) {
-        var key = props[index];
-        result[index] = [key, object[key]];
-      }
-      return result;
-    }
-
-    /**
-     * Creates an object composed of the picked `object` properties. Property
-     * names may be specified as individual arguments or as arrays of property
-     * names. If `predicate` is provided it is invoked for each property of `object`
-     * picking the properties `predicate` returns truthy for. The predicate is
-     * bound to `thisArg` and invoked with three arguments: (value, key, object).
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The source object.
-     * @param {Function|...(string|string[])} [predicate] The function invoked per
-     *  iteration or property names to pick, specified as individual property
-     *  names or arrays of property names.
-     * @param {*} [thisArg] The `this` binding of `predicate`.
-     * @returns {Object} Returns the new object.
-     * @example
-     *
-     * var object = { 'user': 'fred', 'age': 40 };
-     *
-     * _.pick(object, 'user');
-     * // => { 'user': 'fred' }
-     *
-     * _.pick(object, _.isString);
-     * // => { 'user': 'fred' }
-     */
-    var pick = restParam(function(object, props) {
-      if (object == null) {
-        return {};
-      }
-      return typeof props[0] == 'function'
-        ? pickByCallback(object, bindCallback(props[0], props[1], 3))
-        : pickByArray(object, baseFlatten(props));
-    });
-
-    /**
-     * This method is like `_.get` except that if the resolved value is a function
-     * it is invoked with the `this` binding of its parent object and its result
-     * is returned.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to query.
-     * @param {Array|string} path The path of the property to resolve.
-     * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
-     * @returns {*} Returns the resolved value.
-     * @example
-     *
-     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
-     *
-     * _.result(object, 'a[0].b.c1');
-     * // => 3
-     *
-     * _.result(object, 'a[0].b.c2');
-     * // => 4
-     *
-     * _.result(object, 'a.b.c', 'default');
-     * // => 'default'
-     *
-     * _.result(object, 'a.b.c', _.constant('default'));
-     * // => 'default'
-     */
-    function result(object, path, defaultValue) {
-      var result = object == null ? undefined : object[path];
-      if (result === undefined) {
-        if (object != null && !isKey(path, object)) {
-          path = toPath(path);
-          object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
-          result = object == null ? undefined : object[last(path)];
-        }
-        result = result === undefined ? defaultValue : result;
-      }
-      return isFunction(result) ? result.call(object) : result;
-    }
-
-    /**
-     * Sets the property value of `path` on `object`. If a portion of `path`
-     * does not exist it is created.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to augment.
-     * @param {Array|string} path The path of the property to set.
-     * @param {*} value The value to set.
-     * @returns {Object} Returns `object`.
-     * @example
-     *
-     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
-     *
-     * _.set(object, 'a[0].b.c', 4);
-     * console.log(object.a[0].b.c);
-     * // => 4
-     *
-     * _.set(object, 'x[0].y.z', 5);
-     * console.log(object.x[0].y.z);
-     * // => 5
-     */
-    function set(object, path, value) {
-      if (object == null) {
-        return object;
-      }
-      var pathKey = (path + '');
-      path = (object[pathKey] != null || isKey(path, object)) ? [pathKey] : toPath(path);
-
-      var index = -1,
-          length = path.length,
-          lastIndex = length - 1,
-          nested = object;
-
-      while (nested != null && ++index < length) {
-        var key = path[index];
-        if (isObject(nested)) {
-          if (index == lastIndex) {
-            nested[key] = value;
-          } else if (nested[key] == null) {
-            nested[key] = isIndex(path[index + 1]) ? [] : {};
-          }
-        }
-        nested = nested[key];
-      }
-      return object;
-    }
-
-    /**
-     * An alternative to `_.reduce`; this method transforms `object` to a new
-     * `accumulator` object which is the result of running each of its own enumerable
-     * properties through `iteratee`, with each invocation potentially mutating
-     * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked
-     * with four arguments: (accumulator, value, key, object). Iteratee functions
-     * may exit iteration early by explicitly returning `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Array|Object} object The object to iterate over.
-     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
-     * @param {*} [accumulator] The custom accumulator value.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {*} Returns the accumulated value.
-     * @example
-     *
-     * _.transform([2, 3, 4], function(result, n) {
-     *   result.push(n *= n);
-     *   return n % 2 == 0;
-     * });
-     * // => [4, 9]
-     *
-     * _.transform({ 'a': 1, 'b': 2 }, function(result, n, key) {
-     *   result[key] = n * 3;
-     * });
-     * // => { 'a': 3, 'b': 6 }
-     */
-    function transform(object, iteratee, accumulator, thisArg) {
-      var isArr = isArray(object) || isTypedArray(object);
-      iteratee = getCallback(iteratee, thisArg, 4);
-
-      if (accumulator == null) {
-        if (isArr || isObject(object)) {
-          var Ctor = object.constructor;
-          if (isArr) {
-            accumulator = isArray(object) ? new Ctor : [];
-          } else {
-            accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined);
-          }
-        } else {
-          accumulator = {};
-        }
-      }
-      (isArr ? arrayEach : baseForOwn)(object, function(value, index, object) {
-        return iteratee(accumulator, value, index, object);
-      });
-      return accumulator;
-    }
-
-    /**
-     * Creates an array of the own enumerable property values of `object`.
-     *
-     * **Note:** Non-object values are coerced to objects.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to query.
-     * @returns {Array} Returns the array of property values.
-     * @example
-     *
-     * function Foo() {
-     *   this.a = 1;
-     *   this.b = 2;
-     * }
-     *
-     * Foo.prototype.c = 3;
-     *
-     * _.values(new Foo);
-     * // => [1, 2] (iteration order is not guaranteed)
-     *
-     * _.values('hi');
-     * // => ['h', 'i']
-     */
-    function values(object) {
-      return baseValues(object, keys(object));
-    }
-
-    /**
-     * Creates an array of the own and inherited enumerable property values
-     * of `object`.
-     *
-     * **Note:** Non-object values are coerced to objects.
-     *
-     * @static
-     * @memberOf _
-     * @category Object
-     * @param {Object} object The object to query.
-     * @returns {Array} Returns the array of property values.
-     * @example
-     *
-     * function Foo() {
-     *   this.a = 1;
-     *   this.b = 2;
-     * }
-     *
-     * Foo.prototype.c = 3;
-     *
-     * _.valuesIn(new Foo);
-     * // => [1, 2, 3] (iteration order is not guaranteed)
-     */
-    function valuesIn(object) {
-      return baseValues(object, keysIn(object));
-    }
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Checks if `n` is between `start` and up to but not including, `end`. If
-     * `end` is not specified it is set to `start` with `start` then set to `0`.
-     *
-     * @static
-     * @memberOf _
-     * @category Number
-     * @param {number} n The number to check.
-     * @param {number} [start=0] The start of the range.
-     * @param {number} end The end of the range.
-     * @returns {boolean} Returns `true` if `n` is in the range, else `false`.
-     * @example
-     *
-     * _.inRange(3, 2, 4);
-     * // => true
-     *
-     * _.inRange(4, 8);
-     * // => true
-     *
-     * _.inRange(4, 2);
-     * // => false
-     *
-     * _.inRange(2, 2);
-     * // => false
-     *
-     * _.inRange(1.2, 2);
-     * // => true
-     *
-     * _.inRange(5.2, 4);
-     * // => false
-     */
-    function inRange(value, start, end) {
-      start = +start || 0;
-      if (end === undefined) {
-        end = start;
-        start = 0;
-      } else {
-        end = +end || 0;
-      }
-      return value >= nativeMin(start, end) && value < nativeMax(start, end);
-    }
-
-    /**
-     * Produces a random number between `min` and `max` (inclusive). If only one
-     * argument is provided a number between `0` and the given number is returned.
-     * If `floating` is `true`, or either `min` or `max` are floats, a floating-point
-     * number is returned instead of an integer.
-     *
-     * @static
-     * @memberOf _
-     * @category Number
-     * @param {number} [min=0] The minimum possible value.
-     * @param {number} [max=1] The maximum possible value.
-     * @param {boolean} [floating] Specify returning a floating-point number.
-     * @returns {number} Returns the random number.
-     * @example
-     *
-     * _.random(0, 5);
-     * // => an integer between 0 and 5
-     *
-     * _.random(5);
-     * // => also an integer between 0 and 5
-     *
-     * _.random(5, true);
-     * // => a floating-point number between 0 and 5
-     *
-     * _.random(1.2, 5.2);
-     * // => a floating-point number between 1.2 and 5.2
-     */
-    function random(min, max, floating) {
-      if (floating && isIterateeCall(min, max, floating)) {
-        max = floating = undefined;
-      }
-      var noMin = min == null,
-          noMax = max == null;
-
-      if (floating == null) {
-        if (noMax && typeof min == 'boolean') {
-          floating = min;
-          min = 1;
-        }
-        else if (typeof max == 'boolean') {
-          floating = max;
-          noMax = true;
-        }
-      }
-      if (noMin && noMax) {
-        max = 1;
-        noMax = false;
-      }
-      min = +min || 0;
-      if (noMax) {
-        max = min;
-        min = 0;
-      } else {
-        max = +max || 0;
-      }
-      if (floating || min % 1 || max % 1) {
-        var rand = nativeRandom();
-        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1)))), max);
-      }
-      return baseRandom(min, max);
-    }
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to convert.
-     * @returns {string} Returns the camel cased string.
-     * @example
-     *
-     * _.camelCase('Foo Bar');
-     * // => 'fooBar'
-     *
-     * _.camelCase('--foo-bar');
-     * // => 'fooBar'
-     *
-     * _.camelCase('__foo_bar__');
-     * // => 'fooBar'
-     */
-    var camelCase = createCompounder(function(result, word, index) {
-      word = word.toLowerCase();
-      return result + (index ? (word.charAt(0).toUpperCase() + word.slice(1)) : word);
-    });
-
-    /**
-     * Capitalizes the first character of `string`.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to capitalize.
-     * @returns {string} Returns the capitalized string.
-     * @example
-     *
-     * _.capitalize('fred');
-     * // => 'Fred'
-     */
-    function capitalize(string) {
-      string = baseToString(string);
-      return string && (string.charAt(0).toUpperCase() + string.slice(1));
-    }
-
-    /**
-     * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
-     * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to deburr.
-     * @returns {string} Returns the deburred string.
-     * @example
-     *
-     * _.deburr('déjà vu');
-     * // => 'deja vu'
-     */
-    function deburr(string) {
-      string = baseToString(string);
-      return string && string.replace(reLatin1, deburrLetter).replace(reComboMark, '');
-    }
-
-    /**
-     * Checks if `string` ends with the given target string.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to search.
-     * @param {string} [target] The string to search for.
-     * @param {number} [position=string.length] The position to search from.
-     * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`.
-     * @example
-     *
-     * _.endsWith('abc', 'c');
-     * // => true
-     *
-     * _.endsWith('abc', 'b');
-     * // => false
-     *
-     * _.endsWith('abc', 'b', 2);
-     * // => true
-     */
-    function endsWith(string, target, position) {
-      string = baseToString(string);
-      target = (target + '');
-
-      var length = string.length;
-      position = position === undefined
-        ? length
-        : nativeMin(position < 0 ? 0 : (+position || 0), length);
-
-      position -= target.length;
-      return position >= 0 && string.indexOf(target, position) == position;
-    }
-
-    /**
-     * Converts the characters "&", "<", ">", '"', "'", and "\`", in `string` to
-     * their corresponding HTML entities.
-     *
-     * **Note:** No other characters are escaped. To escape additional characters
-     * use a third-party library like [_he_](https://mths.be/he).
-     *
-     * Though the ">" character is escaped for symmetry, characters like
-     * ">" and "/" don't need escaping in HTML and have no special meaning
-     * unless they're part of a tag or unquoted attribute value.
-     * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
-     * (under "semi-related fun fact") for more details.
-     *
-     * Backticks are escaped because in Internet Explorer < 9, they can break out
-     * of attribute values or HTML comments. See [#59](https://html5sec.org/#59),
-     * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and
-     * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/)
-     * for more details.
-     *
-     * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)
-     * to reduce XSS vectors.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to escape.
-     * @returns {string} Returns the escaped string.
-     * @example
-     *
-     * _.escape('fred, barney, & pebbles');
-     * // => 'fred, barney, &amp; pebbles'
-     */
-    function escape(string) {
-      // Reset `lastIndex` because in IE < 9 `String#replace` does not.
-      string = baseToString(string);
-      return (string && reHasUnescapedHtml.test(string))
-        ? string.replace(reUnescapedHtml, escapeHtmlChar)
-        : string;
-    }
-
-    /**
-     * Escapes the `RegExp` special characters "\", "/", "^", "$", ".", "|", "?",
-     * "*", "+", "(", ")", "[", "]", "{" and "}" in `string`.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to escape.
-     * @returns {string} Returns the escaped string.
-     * @example
-     *
-     * _.escapeRegExp('[lodash](https://lodash.com/)');
-     * // => '\[lodash\]\(https:\/\/lodash\.com\/\)'
-     */
-    function escapeRegExp(string) {
-      string = baseToString(string);
-      return (string && reHasRegExpChars.test(string))
-        ? string.replace(reRegExpChars, escapeRegExpChar)
-        : (string || '(?:)');
-    }
-
-    /**
-     * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to convert.
-     * @returns {string} Returns the kebab cased string.
-     * @example
-     *
-     * _.kebabCase('Foo Bar');
-     * // => 'foo-bar'
-     *
-     * _.kebabCase('fooBar');
-     * // => 'foo-bar'
-     *
-     * _.kebabCase('__foo_bar__');
-     * // => 'foo-bar'
-     */
-    var kebabCase = createCompounder(function(result, word, index) {
-      return result + (index ? '-' : '') + word.toLowerCase();
-    });
-
-    /**
-     * Pads `string` on the left and right sides if it's shorter than `length`.
-     * Padding characters are truncated if they can't be evenly divided by `length`.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to pad.
-     * @param {number} [length=0] The padding length.
-     * @param {string} [chars=' '] The string used as padding.
-     * @returns {string} Returns the padded string.
-     * @example
-     *
-     * _.pad('abc', 8);
-     * // => '  abc   '
-     *
-     * _.pad('abc', 8, '_-');
-     * // => '_-abc_-_'
-     *
-     * _.pad('abc', 3);
-     * // => 'abc'
-     */
-    function pad(string, length, chars) {
-      string = baseToString(string);
-      length = +length;
-
-      var strLength = string.length;
-      if (strLength >= length || !nativeIsFinite(length)) {
-        return string;
-      }
-      var mid = (length - strLength) / 2,
-          leftLength = nativeFloor(mid),
-          rightLength = nativeCeil(mid);
-
-      chars = createPadding('', rightLength, chars);
-      return chars.slice(0, leftLength) + string + chars;
-    }
-
-    /**
-     * Pads `string` on the left side if it's shorter than `length`. Padding
-     * characters are truncated if they exceed `length`.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to pad.
-     * @param {number} [length=0] The padding length.
-     * @param {string} [chars=' '] The string used as padding.
-     * @returns {string} Returns the padded string.
-     * @example
-     *
-     * _.padLeft('abc', 6);
-     * // => '   abc'
-     *
-     * _.padLeft('abc', 6, '_-');
-     * // => '_-_abc'
-     *
-     * _.padLeft('abc', 3);
-     * // => 'abc'
-     */
-    var padLeft = createPadDir();
-
-    /**
-     * Pads `string` on the right side if it's shorter than `length`. Padding
-     * characters are truncated if they exceed `length`.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to pad.
-     * @param {number} [length=0] The padding length.
-     * @param {string} [chars=' '] The string used as padding.
-     * @returns {string} Returns the padded string.
-     * @example
-     *
-     * _.padRight('abc', 6);
-     * // => 'abc   '
-     *
-     * _.padRight('abc', 6, '_-');
-     * // => 'abc_-_'
-     *
-     * _.padRight('abc', 3);
-     * // => 'abc'
-     */
-    var padRight = createPadDir(true);
-
-    /**
-     * Converts `string` to an integer of the specified radix. If `radix` is
-     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,
-     * in which case a `radix` of `16` is used.
-     *
-     * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)
-     * of `parseInt`.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} string The string to convert.
-     * @param {number} [radix] The radix to interpret `value` by.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {number} Returns the converted integer.
-     * @example
-     *
-     * _.parseInt('08');
-     * // => 8
-     *
-     * _.map(['6', '08', '10'], _.parseInt);
-     * // => [6, 8, 10]
-     */
-    function parseInt(string, radix, guard) {
-      // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`.
-      // Chrome fails to trim leading <BOM> whitespace characters.
-      // See https://code.google.com/p/v8/issues/detail?id=3109 for more details.
-      if (guard ? isIterateeCall(string, radix, guard) : radix == null) {
-        radix = 0;
-      } else if (radix) {
-        radix = +radix;
-      }
-      string = trim(string);
-      return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10));
-    }
-
-    /**
-     * Repeats the given string `n` times.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to repeat.
-     * @param {number} [n=0] The number of times to repeat the string.
-     * @returns {string} Returns the repeated string.
-     * @example
-     *
-     * _.repeat('*', 3);
-     * // => '***'
-     *
-     * _.repeat('abc', 2);
-     * // => 'abcabc'
-     *
-     * _.repeat('abc', 0);
-     * // => ''
-     */
-    function repeat(string, n) {
-      var result = '';
-      string = baseToString(string);
-      n = +n;
-      if (n < 1 || !string || !nativeIsFinite(n)) {
-        return result;
-      }
-      // Leverage the exponentiation by squaring algorithm for a faster repeat.
-      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
-      do {
-        if (n % 2) {
-          result += string;
-        }
-        n = nativeFloor(n / 2);
-        string += string;
-      } while (n);
-
-      return result;
-    }
-
-    /**
-     * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case).
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to convert.
-     * @returns {string} Returns the snake cased string.
-     * @example
-     *
-     * _.snakeCase('Foo Bar');
-     * // => 'foo_bar'
-     *
-     * _.snakeCase('fooBar');
-     * // => 'foo_bar'
-     *
-     * _.snakeCase('--foo-bar');
-     * // => 'foo_bar'
-     */
-    var snakeCase = createCompounder(function(result, word, index) {
-      return result + (index ? '_' : '') + word.toLowerCase();
-    });
-
-    /**
-     * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to convert.
-     * @returns {string} Returns the start cased string.
-     * @example
-     *
-     * _.startCase('--foo-bar');
-     * // => 'Foo Bar'
-     *
-     * _.startCase('fooBar');
-     * // => 'Foo Bar'
-     *
-     * _.startCase('__foo_bar__');
-     * // => 'Foo Bar'
-     */
-    var startCase = createCompounder(function(result, word, index) {
-      return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1));
-    });
-
-    /**
-     * Checks if `string` starts with the given target string.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to search.
-     * @param {string} [target] The string to search for.
-     * @param {number} [position=0] The position to search from.
-     * @returns {boolean} Returns `true` if `string` starts with `target`, else `false`.
-     * @example
-     *
-     * _.startsWith('abc', 'a');
-     * // => true
-     *
-     * _.startsWith('abc', 'b');
-     * // => false
-     *
-     * _.startsWith('abc', 'b', 1);
-     * // => true
-     */
-    function startsWith(string, target, position) {
-      string = baseToString(string);
-      position = position == null
-        ? 0
-        : nativeMin(position < 0 ? 0 : (+position || 0), string.length);
-
-      return string.lastIndexOf(target, position) == position;
-    }
-
-    /**
-     * Creates a compiled template function that can interpolate data properties
-     * in "interpolate" delimiters, HTML-escape interpolated data properties in
-     * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
-     * properties may be accessed as free variables in the template. If a setting
-     * object is provided it takes precedence over `_.templateSettings` values.
-     *
-     * **Note:** In the development build `_.template` utilizes
-     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
-     * for easier debugging.
-     *
-     * For more information on precompiling templates see
-     * [lodash's custom builds documentation](https://lodash.com/custom-builds).
-     *
-     * For more information on Chrome extension sandboxes see
-     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The template string.
-     * @param {Object} [options] The options object.
-     * @param {RegExp} [options.escape] The HTML "escape" delimiter.
-     * @param {RegExp} [options.evaluate] The "evaluate" delimiter.
-     * @param {Object} [options.imports] An object to import into the template as free variables.
-     * @param {RegExp} [options.interpolate] The "interpolate" delimiter.
-     * @param {string} [options.sourceURL] The sourceURL of the template's compiled source.
-     * @param {string} [options.variable] The data object variable name.
-     * @param- {Object} [otherOptions] Enables the legacy `options` param signature.
-     * @returns {Function} Returns the compiled template function.
-     * @example
-     *
-     * // using the "interpolate" delimiter to create a compiled template
-     * var compiled = _.template('hello <%= user %>!');
-     * compiled({ 'user': 'fred' });
-     * // => 'hello fred!'
-     *
-     * // using the HTML "escape" delimiter to escape data property values
-     * var compiled = _.template('<b><%- value %></b>');
-     * compiled({ 'value': '<script>' });
-     * // => '<b>&lt;script&gt;</b>'
-     *
-     * // using the "evaluate" delimiter to execute JavaScript and generate HTML
-     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
-     * compiled({ 'users': ['fred', 'barney'] });
-     * // => '<li>fred</li><li>barney</li>'
-     *
-     * // using the internal `print` function in "evaluate" delimiters
-     * var compiled = _.template('<% print("hello " + user); %>!');
-     * compiled({ 'user': 'barney' });
-     * // => 'hello barney!'
-     *
-     * // using the ES delimiter as an alternative to the default "interpolate" delimiter
-     * var compiled = _.template('hello ${ user }!');
-     * compiled({ 'user': 'pebbles' });
-     * // => 'hello pebbles!'
-     *
-     * // using custom template delimiters
-     * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
-     * var compiled = _.template('hello {{ user }}!');
-     * compiled({ 'user': 'mustache' });
-     * // => 'hello mustache!'
-     *
-     * // using backslashes to treat delimiters as plain text
-     * var compiled = _.template('<%= "\\<%- value %\\>" %>');
-     * compiled({ 'value': 'ignored' });
-     * // => '<%- value %>'
-     *
-     * // using the `imports` option to import `jQuery` as `jq`
-     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
-     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
-     * compiled({ 'users': ['fred', 'barney'] });
-     * // => '<li>fred</li><li>barney</li>'
-     *
-     * // using the `sourceURL` option to specify a custom sourceURL for the template
-     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
-     * compiled(data);
-     * // => find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector
-     *
-     * // using the `variable` option to ensure a with-statement isn't used in the compiled template
-     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
-     * compiled.source;
-     * // => function(data) {
-     * //   var __t, __p = '';
-     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
-     * //   return __p;
-     * // }
-     *
-     * // using the `source` property to inline compiled templates for meaningful
-     * // line numbers in error messages and a stack trace
-     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\
-     *   var JST = {\
-     *     "main": ' + _.template(mainText).source + '\
-     *   };\
-     * ');
-     */
-    function template(string, options, otherOptions) {
-      // Based on John Resig's `tmpl` implementation (http://ejohn.org/blog/javascript-micro-templating/)
-      // and Laura Doktorova's doT.js (https://github.com/olado/doT).
-      var settings = lodash.templateSettings;
-
-      if (otherOptions && isIterateeCall(string, options, otherOptions)) {
-        options = otherOptions = undefined;
-      }
-      string = baseToString(string);
-      options = assignWith(baseAssign({}, otherOptions || options), settings, assignOwnDefaults);
-
-      var imports = assignWith(baseAssign({}, options.imports), settings.imports, assignOwnDefaults),
-          importsKeys = keys(imports),
-          importsValues = baseValues(imports, importsKeys);
-
-      var isEscaping,
-          isEvaluating,
-          index = 0,
-          interpolate = options.interpolate || reNoMatch,
-          source = "__p += '";
-
-      // Compile the regexp to match each delimiter.
-      var reDelimiters = RegExp(
-        (options.escape || reNoMatch).source + '|' +
-        interpolate.source + '|' +
-        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
-        (options.evaluate || reNoMatch).source + '|$'
-      , 'g');
-
-      // Use a sourceURL for easier debugging.
-      var sourceURL = '//# sourceURL=' +
-        ('sourceURL' in options
-          ? options.sourceURL
-          : ('lodash.templateSources[' + (++templateCounter) + ']')
-        ) + '\n';
-
-      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
-        interpolateValue || (interpolateValue = esTemplateValue);
-
-        // Escape characters that can't be included in string literals.
-        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
-
-        // Replace delimiters with snippets.
-        if (escapeValue) {
-          isEscaping = true;
-          source += "' +\n__e(" + escapeValue + ") +\n'";
-        }
-        if (evaluateValue) {
-          isEvaluating = true;
-          source += "';\n" + evaluateValue + ";\n__p += '";
-        }
-        if (interpolateValue) {
-          source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
-        }
-        index = offset + match.length;
-
-        // The JS engine embedded in Adobe products requires returning the `match`
-        // string in order to produce the correct `offset` value.
-        return match;
-      });
-
-      source += "';\n";
-
-      // If `variable` is not specified wrap a with-statement around the generated
-      // code to add the data object to the top of the scope chain.
-      var variable = options.variable;
-      if (!variable) {
-        source = 'with (obj) {\n' + source + '\n}\n';
-      }
-      // Cleanup code by stripping empty strings.
-      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
-        .replace(reEmptyStringMiddle, '$1')
-        .replace(reEmptyStringTrailing, '$1;');
-
-      // Frame code as the function body.
-      source = 'function(' + (variable || 'obj') + ') {\n' +
-        (variable
-          ? ''
-          : 'obj || (obj = {});\n'
-        ) +
-        "var __t, __p = ''" +
-        (isEscaping
-           ? ', __e = _.escape'
-           : ''
-        ) +
-        (isEvaluating
-          ? ', __j = Array.prototype.join;\n' +
-            "function print() { __p += __j.call(arguments, '') }\n"
-          : ';\n'
-        ) +
-        source +
-        'return __p\n}';
-
-      var result = attempt(function() {
-        return Function(importsKeys, sourceURL + 'return ' + source).apply(undefined, importsValues);
-      });
-
-      // Provide the compiled function's source by its `toString` method or
-      // the `source` property as a convenience for inlining compiled templates.
-      result.source = source;
-      if (isError(result)) {
-        throw result;
-      }
-      return result;
-    }
-
-    /**
-     * Removes leading and trailing whitespace or specified characters from `string`.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to trim.
-     * @param {string} [chars=whitespace] The characters to trim.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {string} Returns the trimmed string.
-     * @example
-     *
-     * _.trim('  abc  ');
-     * // => 'abc'
-     *
-     * _.trim('-_-abc-_-', '_-');
-     * // => 'abc'
-     *
-     * _.map(['  foo  ', '  bar  '], _.trim);
-     * // => ['foo', 'bar']
-     */
-    function trim(string, chars, guard) {
-      var value = string;
-      string = baseToString(string);
-      if (!string) {
-        return string;
-      }
-      if (guard ? isIterateeCall(value, chars, guard) : chars == null) {
-        return string.slice(trimmedLeftIndex(string), trimmedRightIndex(string) + 1);
-      }
-      chars = (chars + '');
-      return string.slice(charsLeftIndex(string, chars), charsRightIndex(string, chars) + 1);
-    }
-
-    /**
-     * Removes leading whitespace or specified characters from `string`.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to trim.
-     * @param {string} [chars=whitespace] The characters to trim.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {string} Returns the trimmed string.
-     * @example
-     *
-     * _.trimLeft('  abc  ');
-     * // => 'abc  '
-     *
-     * _.trimLeft('-_-abc-_-', '_-');
-     * // => 'abc-_-'
-     */
-    function trimLeft(string, chars, guard) {
-      var value = string;
-      string = baseToString(string);
-      if (!string) {
-        return string;
-      }
-      if (guard ? isIterateeCall(value, chars, guard) : chars == null) {
-        return string.slice(trimmedLeftIndex(string));
-      }
-      return string.slice(charsLeftIndex(string, (chars + '')));
-    }
-
-    /**
-     * Removes trailing whitespace or specified characters from `string`.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to trim.
-     * @param {string} [chars=whitespace] The characters to trim.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {string} Returns the trimmed string.
-     * @example
-     *
-     * _.trimRight('  abc  ');
-     * // => '  abc'
-     *
-     * _.trimRight('-_-abc-_-', '_-');
-     * // => '-_-abc'
-     */
-    function trimRight(string, chars, guard) {
-      var value = string;
-      string = baseToString(string);
-      if (!string) {
-        return string;
-      }
-      if (guard ? isIterateeCall(value, chars, guard) : chars == null) {
-        return string.slice(0, trimmedRightIndex(string) + 1);
-      }
-      return string.slice(0, charsRightIndex(string, (chars + '')) + 1);
-    }
-
-    /**
-     * Truncates `string` if it's longer than the given maximum string length.
-     * The last characters of the truncated string are replaced with the omission
-     * string which defaults to "...".
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to truncate.
-     * @param {Object|number} [options] The options object or maximum string length.
-     * @param {number} [options.length=30] The maximum string length.
-     * @param {string} [options.omission='...'] The string to indicate text is omitted.
-     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {string} Returns the truncated string.
-     * @example
-     *
-     * _.trunc('hi-diddly-ho there, neighborino');
-     * // => 'hi-diddly-ho there, neighbo...'
-     *
-     * _.trunc('hi-diddly-ho there, neighborino', 24);
-     * // => 'hi-diddly-ho there, n...'
-     *
-     * _.trunc('hi-diddly-ho there, neighborino', {
-     *   'length': 24,
-     *   'separator': ' '
-     * });
-     * // => 'hi-diddly-ho there,...'
-     *
-     * _.trunc('hi-diddly-ho there, neighborino', {
-     *   'length': 24,
-     *   'separator': /,? +/
-     * });
-     * // => 'hi-diddly-ho there...'
-     *
-     * _.trunc('hi-diddly-ho there, neighborino', {
-     *   'omission': ' [...]'
-     * });
-     * // => 'hi-diddly-ho there, neig [...]'
-     */
-    function trunc(string, options, guard) {
-      if (guard && isIterateeCall(string, options, guard)) {
-        options = undefined;
-      }
-      var length = DEFAULT_TRUNC_LENGTH,
-          omission = DEFAULT_TRUNC_OMISSION;
-
-      if (options != null) {
-        if (isObject(options)) {
-          var separator = 'separator' in options ? options.separator : separator;
-          length = 'length' in options ? (+options.length || 0) : length;
-          omission = 'omission' in options ? baseToString(options.omission) : omission;
-        } else {
-          length = +options || 0;
-        }
-      }
-      string = baseToString(string);
-      if (length >= string.length) {
-        return string;
-      }
-      var end = length - omission.length;
-      if (end < 1) {
-        return omission;
-      }
-      var result = string.slice(0, end);
-      if (separator == null) {
-        return result + omission;
-      }
-      if (isRegExp(separator)) {
-        if (string.slice(end).search(separator)) {
-          var match,
-              newEnd,
-              substring = string.slice(0, end);
-
-          if (!separator.global) {
-            separator = RegExp(separator.source, (reFlags.exec(separator) || '') + 'g');
-          }
-          separator.lastIndex = 0;
-          while ((match = separator.exec(substring))) {
-            newEnd = match.index;
-          }
-          result = result.slice(0, newEnd == null ? end : newEnd);
-        }
-      } else if (string.indexOf(separator, end) != end) {
-        var index = result.lastIndexOf(separator);
-        if (index > -1) {
-          result = result.slice(0, index);
-        }
-      }
-      return result + omission;
-    }
-
-    /**
-     * The inverse of `_.escape`; this method converts the HTML entities
-     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, `&#39;`, and `&#96;` in `string` to their
-     * corresponding characters.
-     *
-     * **Note:** No other HTML entities are unescaped. To unescape additional HTML
-     * entities use a third-party library like [_he_](https://mths.be/he).
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to unescape.
-     * @returns {string} Returns the unescaped string.
-     * @example
-     *
-     * _.unescape('fred, barney, &amp; pebbles');
-     * // => 'fred, barney, & pebbles'
-     */
-    function unescape(string) {
-      string = baseToString(string);
-      return (string && reHasEscapedHtml.test(string))
-        ? string.replace(reEscapedHtml, unescapeHtmlChar)
-        : string;
-    }
-
-    /**
-     * Splits `string` into an array of its words.
-     *
-     * @static
-     * @memberOf _
-     * @category String
-     * @param {string} [string=''] The string to inspect.
-     * @param {RegExp|string} [pattern] The pattern to match words.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {Array} Returns the words of `string`.
-     * @example
-     *
-     * _.words('fred, barney, & pebbles');
-     * // => ['fred', 'barney', 'pebbles']
-     *
-     * _.words('fred, barney, & pebbles', /[^, ]+/g);
-     * // => ['fred', 'barney', '&', 'pebbles']
-     */
-    function words(string, pattern, guard) {
-      if (guard && isIterateeCall(string, pattern, guard)) {
-        pattern = undefined;
-      }
-      string = baseToString(string);
-      return string.match(pattern || reWords) || [];
-    }
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Attempts to invoke `func`, returning either the result or the caught error
-     * object. Any additional arguments are provided to `func` when it is invoked.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @param {Function} func The function to attempt.
-     * @returns {*} Returns the `func` result or error object.
-     * @example
-     *
-     * // avoid throwing errors for invalid selectors
-     * var elements = _.attempt(function(selector) {
-     *   return document.querySelectorAll(selector);
-     * }, '>_>');
-     *
-     * if (_.isError(elements)) {
-     *   elements = [];
-     * }
-     */
-    var attempt = restParam(function(func, args) {
-      try {
-        return func.apply(undefined, args);
-      } catch(e) {
-        return isError(e) ? e : new Error(e);
-      }
-    });
-
-    /**
-     * Creates a function that invokes `func` with the `this` binding of `thisArg`
-     * and arguments of the created function. If `func` is a property name the
-     * created callback returns the property value for a given element. If `func`
-     * is an object the created callback returns `true` for elements that contain
-     * the equivalent object properties, otherwise it returns `false`.
-     *
-     * @static
-     * @memberOf _
-     * @alias iteratee
-     * @category Utility
-     * @param {*} [func=_.identity] The value to convert to a callback.
-     * @param {*} [thisArg] The `this` binding of `func`.
-     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
-     * @returns {Function} Returns the callback.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'barney', 'age': 36 },
-     *   { 'user': 'fred',   'age': 40 }
-     * ];
-     *
-     * // wrap to create custom callback shorthands
-     * _.callback = _.wrap(_.callback, function(callback, func, thisArg) {
-     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(func);
-     *   if (!match) {
-     *     return callback(func, thisArg);
-     *   }
-     *   return function(object) {
-     *     return match[2] == 'gt'
-     *       ? object[match[1]] > match[3]
-     *       : object[match[1]] < match[3];
-     *   };
-     * });
-     *
-     * _.filter(users, 'age__gt36');
-     * // => [{ 'user': 'fred', 'age': 40 }]
-     */
-    function callback(func, thisArg, guard) {
-      if (guard && isIterateeCall(func, thisArg, guard)) {
-        thisArg = undefined;
-      }
-      return isObjectLike(func)
-        ? matches(func)
-        : baseCallback(func, thisArg);
-    }
-
-    /**
-     * Creates a function that returns `value`.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @param {*} value The value to return from the new function.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * var object = { 'user': 'fred' };
-     * var getter = _.constant(object);
-     *
-     * getter() === object;
-     * // => true
-     */
-    function constant(value) {
-      return function() {
-        return value;
-      };
-    }
-
-    /**
-     * This method returns the first argument provided to it.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @param {*} value Any value.
-     * @returns {*} Returns `value`.
-     * @example
-     *
-     * var object = { 'user': 'fred' };
-     *
-     * _.identity(object) === object;
-     * // => true
-     */
-    function identity(value) {
-      return value;
-    }
-
-    /**
-     * Creates a function that performs a deep comparison between a given object
-     * and `source`, returning `true` if the given object has equivalent property
-     * values, else `false`.
-     *
-     * **Note:** This method supports comparing arrays, booleans, `Date` objects,
-     * numbers, `Object` objects, regexes, and strings. Objects are compared by
-     * their own, not inherited, enumerable properties. For comparing a single
-     * own or inherited property value see `_.matchesProperty`.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @param {Object} source The object of property values to match.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'barney', 'age': 36, 'active': true },
-     *   { 'user': 'fred',   'age': 40, 'active': false }
-     * ];
-     *
-     * _.filter(users, _.matches({ 'age': 40, 'active': false }));
-     * // => [{ 'user': 'fred', 'age': 40, 'active': false }]
-     */
-    function matches(source) {
-      return baseMatches(baseClone(source, true));
-    }
-
-    /**
-     * Creates a function that compares the property value of `path` on a given
-     * object to `value`.
-     *
-     * **Note:** This method supports comparing arrays, booleans, `Date` objects,
-     * numbers, `Object` objects, regexes, and strings. Objects are compared by
-     * their own, not inherited, enumerable properties.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @param {Array|string} path The path of the property to get.
-     * @param {*} srcValue The value to match.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * var users = [
-     *   { 'user': 'barney' },
-     *   { 'user': 'fred' }
-     * ];
-     *
-     * _.find(users, _.matchesProperty('user', 'fred'));
-     * // => { 'user': 'fred' }
-     */
-    function matchesProperty(path, srcValue) {
-      return baseMatchesProperty(path, baseClone(srcValue, true));
-    }
-
-    /**
-     * Creates a function that invokes the method at `path` on a given object.
-     * Any additional arguments are provided to the invoked method.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @param {Array|string} path The path of the method to invoke.
-     * @param {...*} [args] The arguments to invoke the method with.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * var objects = [
-     *   { 'a': { 'b': { 'c': _.constant(2) } } },
-     *   { 'a': { 'b': { 'c': _.constant(1) } } }
-     * ];
-     *
-     * _.map(objects, _.method('a.b.c'));
-     * // => [2, 1]
-     *
-     * _.invoke(_.sortBy(objects, _.method(['a', 'b', 'c'])), 'a.b.c');
-     * // => [1, 2]
-     */
-    var method = restParam(function(path, args) {
-      return function(object) {
-        return invokePath(object, path, args);
-      };
-    });
-
-    /**
-     * The opposite of `_.method`; this method creates a function that invokes
-     * the method at a given path on `object`. Any additional arguments are
-     * provided to the invoked method.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @param {Object} object The object to query.
-     * @param {...*} [args] The arguments to invoke the method with.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * var array = _.times(3, _.constant),
-     *     object = { 'a': array, 'b': array, 'c': array };
-     *
-     * _.map(['a[2]', 'c[0]'], _.methodOf(object));
-     * // => [2, 0]
-     *
-     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
-     * // => [2, 0]
-     */
-    var methodOf = restParam(function(object, args) {
-      return function(path) {
-        return invokePath(object, path, args);
-      };
-    });
-
-    /**
-     * Adds all own enumerable function properties of a source object to the
-     * destination object. If `object` is a function then methods are added to
-     * its prototype as well.
-     *
-     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
-     * avoid conflicts caused by modifying the original.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @param {Function|Object} [object=lodash] The destination object.
-     * @param {Object} source The object of functions to add.
-     * @param {Object} [options] The options object.
-     * @param {boolean} [options.chain=true] Specify whether the functions added
-     *  are chainable.
-     * @returns {Function|Object} Returns `object`.
-     * @example
-     *
-     * function vowels(string) {
-     *   return _.filter(string, function(v) {
-     *     return /[aeiou]/i.test(v);
-     *   });
-     * }
-     *
-     * _.mixin({ 'vowels': vowels });
-     * _.vowels('fred');
-     * // => ['e']
-     *
-     * _('fred').vowels().value();
-     * // => ['e']
-     *
-     * _.mixin({ 'vowels': vowels }, { 'chain': false });
-     * _('fred').vowels();
-     * // => ['e']
-     */
-    function mixin(object, source, options) {
-      if (options == null) {
-        var isObj = isObject(source),
-            props = isObj ? keys(source) : undefined,
-            methodNames = (props && props.length) ? baseFunctions(source, props) : undefined;
-
-        if (!(methodNames ? methodNames.length : isObj)) {
-          methodNames = false;
-          options = source;
-          source = object;
-          object = this;
-        }
-      }
-      if (!methodNames) {
-        methodNames = baseFunctions(source, keys(source));
-      }
-      var chain = true,
-          index = -1,
-          isFunc = isFunction(object),
-          length = methodNames.length;
-
-      if (options === false) {
-        chain = false;
-      } else if (isObject(options) && 'chain' in options) {
-        chain = options.chain;
-      }
-      while (++index < length) {
-        var methodName = methodNames[index],
-            func = source[methodName];
-
-        object[methodName] = func;
-        if (isFunc) {
-          object.prototype[methodName] = (function(func) {
-            return function() {
-              var chainAll = this.__chain__;
-              if (chain || chainAll) {
-                var result = object(this.__wrapped__),
-                    actions = result.__actions__ = arrayCopy(this.__actions__);
-
-                actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
-                result.__chain__ = chainAll;
-                return result;
-              }
-              return func.apply(object, arrayPush([this.value()], arguments));
-            };
-          }(func));
-        }
-      }
-      return object;
-    }
-
-    /**
-     * Reverts the `_` variable to its previous value and returns a reference to
-     * the `lodash` function.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @returns {Function} Returns the `lodash` function.
-     * @example
-     *
-     * var lodash = _.noConflict();
-     */
-    function noConflict() {
-      root._ = oldDash;
-      return this;
-    }
-
-    /**
-     * A no-operation function that returns `undefined` regardless of the
-     * arguments it receives.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @example
-     *
-     * var object = { 'user': 'fred' };
-     *
-     * _.noop(object) === undefined;
-     * // => true
-     */
-    function noop() {
-      // No operation performed.
-    }
-
-    /**
-     * Creates a function that returns the property value at `path` on a
-     * given object.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @param {Array|string} path The path of the property to get.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * var objects = [
-     *   { 'a': { 'b': { 'c': 2 } } },
-     *   { 'a': { 'b': { 'c': 1 } } }
-     * ];
-     *
-     * _.map(objects, _.property('a.b.c'));
-     * // => [2, 1]
-     *
-     * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');
-     * // => [1, 2]
-     */
-    function property(path) {
-      return isKey(path) ? baseProperty(path) : basePropertyDeep(path);
-    }
-
-    /**
-     * The opposite of `_.property`; this method creates a function that returns
-     * the property value at a given path on `object`.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @param {Object} object The object to query.
-     * @returns {Function} Returns the new function.
-     * @example
-     *
-     * var array = [0, 1, 2],
-     *     object = { 'a': array, 'b': array, 'c': array };
-     *
-     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
-     * // => [2, 0]
-     *
-     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
-     * // => [2, 0]
-     */
-    function propertyOf(object) {
-      return function(path) {
-        return baseGet(object, toPath(path), path + '');
-      };
-    }
-
-    /**
-     * Creates an array of numbers (positive and/or negative) progressing from
-     * `start` up to, but not including, `end`. If `end` is not specified it is
-     * set to `start` with `start` then set to `0`. If `end` is less than `start`
-     * a zero-length range is created unless a negative `step` is specified.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @param {number} [start=0] The start of the range.
-     * @param {number} end The end of the range.
-     * @param {number} [step=1] The value to increment or decrement by.
-     * @returns {Array} Returns the new array of numbers.
-     * @example
-     *
-     * _.range(4);
-     * // => [0, 1, 2, 3]
-     *
-     * _.range(1, 5);
-     * // => [1, 2, 3, 4]
-     *
-     * _.range(0, 20, 5);
-     * // => [0, 5, 10, 15]
-     *
-     * _.range(0, -4, -1);
-     * // => [0, -1, -2, -3]
-     *
-     * _.range(1, 4, 0);
-     * // => [1, 1, 1]
-     *
-     * _.range(0);
-     * // => []
-     */
-    function range(start, end, step) {
-      if (step && isIterateeCall(start, end, step)) {
-        end = step = undefined;
-      }
-      start = +start || 0;
-      step = step == null ? 1 : (+step || 0);
-
-      if (end == null) {
-        end = start;
-        start = 0;
-      } else {
-        end = +end || 0;
-      }
-      // Use `Array(length)` so engines like Chakra and V8 avoid slower modes.
-      // See https://youtu.be/XAqIpGU8ZZk#t=17m25s for more details.
-      var index = -1,
-          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
-          result = Array(length);
-
-      while (++index < length) {
-        result[index] = start;
-        start += step;
-      }
-      return result;
-    }
-
-    /**
-     * Invokes the iteratee function `n` times, returning an array of the results
-     * of each invocation. The `iteratee` is bound to `thisArg` and invoked with
-     * one argument; (index).
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @param {number} n The number of times to invoke `iteratee`.
-     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {Array} Returns the array of results.
-     * @example
-     *
-     * var diceRolls = _.times(3, _.partial(_.random, 1, 6, false));
-     * // => [3, 6, 4]
-     *
-     * _.times(3, function(n) {
-     *   mage.castSpell(n);
-     * });
-     * // => invokes `mage.castSpell(n)` three times with `n` of `0`, `1`, and `2`
-     *
-     * _.times(3, function(n) {
-     *   this.cast(n);
-     * }, mage);
-     * // => also invokes `mage.castSpell(n)` three times
-     */
-    function times(n, iteratee, thisArg) {
-      n = nativeFloor(n);
-
-      // Exit early to avoid a JSC JIT bug in Safari 8
-      // where `Array(0)` is treated as `Array(1)`.
-      if (n < 1 || !nativeIsFinite(n)) {
-        return [];
-      }
-      var index = -1,
-          result = Array(nativeMin(n, MAX_ARRAY_LENGTH));
-
-      iteratee = bindCallback(iteratee, thisArg, 1);
-      while (++index < n) {
-        if (index < MAX_ARRAY_LENGTH) {
-          result[index] = iteratee(index);
-        } else {
-          iteratee(index);
-        }
-      }
-      return result;
-    }
-
-    /**
-     * Generates a unique ID. If `prefix` is provided the ID is appended to it.
-     *
-     * @static
-     * @memberOf _
-     * @category Utility
-     * @param {string} [prefix] The value to prefix the ID with.
-     * @returns {string} Returns the unique ID.
-     * @example
-     *
-     * _.uniqueId('contact_');
-     * // => 'contact_104'
-     *
-     * _.uniqueId();
-     * // => '105'
-     */
-    function uniqueId(prefix) {
-      var id = ++idCounter;
-      return baseToString(prefix) + id;
-    }
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * Adds two numbers.
-     *
-     * @static
-     * @memberOf _
-     * @category Math
-     * @param {number} augend The first number to add.
-     * @param {number} addend The second number to add.
-     * @returns {number} Returns the sum.
-     * @example
-     *
-     * _.add(6, 4);
-     * // => 10
-     */
-    function add(augend, addend) {
-      return (+augend || 0) + (+addend || 0);
-    }
-
-    /**
-     * Calculates `n` rounded up to `precision`.
-     *
-     * @static
-     * @memberOf _
-     * @category Math
-     * @param {number} n The number to round up.
-     * @param {number} [precision=0] The precision to round up to.
-     * @returns {number} Returns the rounded up number.
-     * @example
-     *
-     * _.ceil(4.006);
-     * // => 5
-     *
-     * _.ceil(6.004, 2);
-     * // => 6.01
-     *
-     * _.ceil(6040, -2);
-     * // => 6100
-     */
-    var ceil = createRound('ceil');
-
-    /**
-     * Calculates `n` rounded down to `precision`.
-     *
-     * @static
-     * @memberOf _
-     * @category Math
-     * @param {number} n The number to round down.
-     * @param {number} [precision=0] The precision to round down to.
-     * @returns {number} Returns the rounded down number.
-     * @example
-     *
-     * _.floor(4.006);
-     * // => 4
-     *
-     * _.floor(0.046, 2);
-     * // => 0.04
-     *
-     * _.floor(4060, -2);
-     * // => 4000
-     */
-    var floor = createRound('floor');
-
-    /**
-     * Gets the maximum value of `collection`. If `collection` is empty or falsey
-     * `-Infinity` is returned. If an iteratee function is provided it is invoked
-     * for each value in `collection` to generate the criterion by which the value
-     * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
-     * arguments: (value, index, collection).
-     *
-     * If a property name is provided for `iteratee` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `iteratee` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Math
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function|Object|string} [iteratee] The function invoked per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {*} Returns the maximum value.
-     * @example
-     *
-     * _.max([4, 2, 8, 6]);
-     * // => 8
-     *
-     * _.max([]);
-     * // => -Infinity
-     *
-     * var users = [
-     *   { 'user': 'barney', 'age': 36 },
-     *   { 'user': 'fred',   'age': 40 }
-     * ];
-     *
-     * _.max(users, function(chr) {
-     *   return chr.age;
-     * });
-     * // => { 'user': 'fred', 'age': 40 }
-     *
-     * // using the `_.property` callback shorthand
-     * _.max(users, 'age');
-     * // => { 'user': 'fred', 'age': 40 }
-     */
-    var max = createExtremum(gt, NEGATIVE_INFINITY);
-
-    /**
-     * Gets the minimum value of `collection`. If `collection` is empty or falsey
-     * `Infinity` is returned. If an iteratee function is provided it is invoked
-     * for each value in `collection` to generate the criterion by which the value
-     * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
-     * arguments: (value, index, collection).
-     *
-     * If a property name is provided for `iteratee` the created `_.property`
-     * style callback returns the property value of the given element.
-     *
-     * If a value is also provided for `thisArg` the created `_.matchesProperty`
-     * style callback returns `true` for elements that have a matching property
-     * value, else `false`.
-     *
-     * If an object is provided for `iteratee` the created `_.matches` style
-     * callback returns `true` for elements that have the properties of the given
-     * object, else `false`.
-     *
-     * @static
-     * @memberOf _
-     * @category Math
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function|Object|string} [iteratee] The function invoked per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {*} Returns the minimum value.
-     * @example
-     *
-     * _.min([4, 2, 8, 6]);
-     * // => 2
-     *
-     * _.min([]);
-     * // => Infinity
-     *
-     * var users = [
-     *   { 'user': 'barney', 'age': 36 },
-     *   { 'user': 'fred',   'age': 40 }
-     * ];
-     *
-     * _.min(users, function(chr) {
-     *   return chr.age;
-     * });
-     * // => { 'user': 'barney', 'age': 36 }
-     *
-     * // using the `_.property` callback shorthand
-     * _.min(users, 'age');
-     * // => { 'user': 'barney', 'age': 36 }
-     */
-    var min = createExtremum(lt, POSITIVE_INFINITY);
-
-    /**
-     * Calculates `n` rounded to `precision`.
-     *
-     * @static
-     * @memberOf _
-     * @category Math
-     * @param {number} n The number to round.
-     * @param {number} [precision=0] The precision to round to.
-     * @returns {number} Returns the rounded number.
-     * @example
-     *
-     * _.round(4.006);
-     * // => 4
-     *
-     * _.round(4.006, 2);
-     * // => 4.01
-     *
-     * _.round(4060, -2);
-     * // => 4100
-     */
-    var round = createRound('round');
-
-    /**
-     * Gets the sum of the values in `collection`.
-     *
-     * @static
-     * @memberOf _
-     * @category Math
-     * @param {Array|Object|string} collection The collection to iterate over.
-     * @param {Function|Object|string} [iteratee] The function invoked per iteration.
-     * @param {*} [thisArg] The `this` binding of `iteratee`.
-     * @returns {number} Returns the sum.
-     * @example
-     *
-     * _.sum([4, 6]);
-     * // => 10
-     *
-     * _.sum({ 'a': 4, 'b': 6 });
-     * // => 10
-     *
-     * var objects = [
-     *   { 'n': 4 },
-     *   { 'n': 6 }
-     * ];
-     *
-     * _.sum(objects, function(object) {
-     *   return object.n;
-     * });
-     * // => 10
-     *
-     * // using the `_.property` callback shorthand
-     * _.sum(objects, 'n');
-     * // => 10
-     */
-    function sum(collection, iteratee, thisArg) {
-      if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
-        iteratee = undefined;
-      }
-      iteratee = getCallback(iteratee, thisArg, 3);
-      return iteratee.length == 1
-        ? arraySum(isArray(collection) ? collection : toIterable(collection), iteratee)
-        : baseSum(collection, iteratee);
-    }
-
-    /*------------------------------------------------------------------------*/
-
-    // Ensure wrappers are instances of `baseLodash`.
-    lodash.prototype = baseLodash.prototype;
-
-    LodashWrapper.prototype = baseCreate(baseLodash.prototype);
-    LodashWrapper.prototype.constructor = LodashWrapper;
-
-    LazyWrapper.prototype = baseCreate(baseLodash.prototype);
-    LazyWrapper.prototype.constructor = LazyWrapper;
-
-    // Add functions to the `Map` cache.
-    MapCache.prototype['delete'] = mapDelete;
-    MapCache.prototype.get = mapGet;
-    MapCache.prototype.has = mapHas;
-    MapCache.prototype.set = mapSet;
-
-    // Add functions to the `Set` cache.
-    SetCache.prototype.push = cachePush;
-
-    // Assign cache to `_.memoize`.
-    memoize.Cache = MapCache;
-
-    // Add functions that return wrapped values when chaining.
-    lodash.after = after;
-    lodash.ary = ary;
-    lodash.assign = assign;
-    lodash.at = at;
-    lodash.before = before;
-    lodash.bind = bind;
-    lodash.bindAll = bindAll;
-    lodash.bindKey = bindKey;
-    lodash.callback = callback;
-    lodash.chain = chain;
-    lodash.chunk = chunk;
-    lodash.compact = compact;
-    lodash.constant = constant;
-    lodash.countBy = countBy;
-    lodash.create = create;
-    lodash.curry = curry;
-    lodash.curryRight = curryRight;
-    lodash.debounce = debounce;
-    lodash.defaults = defaults;
-    lodash.defaultsDeep = defaultsDeep;
-    lodash.defer = defer;
-    lodash.delay = delay;
-    lodash.difference = difference;
-    lodash.drop = drop;
-    lodash.dropRight = dropRight;
-    lodash.dropRightWhile = dropRightWhile;
-    lodash.dropWhile = dropWhile;
-    lodash.fill = fill;
-    lodash.filter = filter;
-    lodash.flatten = flatten;
-    lodash.flattenDeep = flattenDeep;
-    lodash.flow = flow;
-    lodash.flowRight = flowRight;
-    lodash.forEach = forEach;
-    lodash.forEachRight = forEachRight;
-    lodash.forIn = forIn;
-    lodash.forInRight = forInRight;
-    lodash.forOwn = forOwn;
-    lodash.forOwnRight = forOwnRight;
-    lodash.functions = functions;
-    lodash.groupBy = groupBy;
-    lodash.indexBy = indexBy;
-    lodash.initial = initial;
-    lodash.intersection = intersection;
-    lodash.invert = invert;
-    lodash.invoke = invoke;
-    lodash.keys = keys;
-    lodash.keysIn = keysIn;
-    lodash.map = map;
-    lodash.mapKeys = mapKeys;
-    lodash.mapValues = mapValues;
-    lodash.matches = matches;
-    lodash.matchesProperty = matchesProperty;
-    lodash.memoize = memoize;
-    lodash.merge = merge;
-    lodash.method = method;
-    lodash.methodOf = methodOf;
-    lodash.mixin = mixin;
-    lodash.modArgs = modArgs;
-    lodash.negate = negate;
-    lodash.omit = omit;
-    lodash.once = once;
-    lodash.pairs = pairs;
-    lodash.partial = partial;
-    lodash.partialRight = partialRight;
-    lodash.partition = partition;
-    lodash.pick = pick;
-    lodash.pluck = pluck;
-    lodash.property = property;
-    lodash.propertyOf = propertyOf;
-    lodash.pull = pull;
-    lodash.pullAt = pullAt;
-    lodash.range = range;
-    lodash.rearg = rearg;
-    lodash.reject = reject;
-    lodash.remove = remove;
-    lodash.rest = rest;
-    lodash.restParam = restParam;
-    lodash.set = set;
-    lodash.shuffle = shuffle;
-    lodash.slice = slice;
-    lodash.sortBy = sortBy;
-    lodash.sortByAll = sortByAll;
-    lodash.sortByOrder = sortByOrder;
-    lodash.spread = spread;
-    lodash.take = take;
-    lodash.takeRight = takeRight;
-    lodash.takeRightWhile = takeRightWhile;
-    lodash.takeWhile = takeWhile;
-    lodash.tap = tap;
-    lodash.throttle = throttle;
-    lodash.thru = thru;
-    lodash.times = times;
-    lodash.toArray = toArray;
-    lodash.toPlainObject = toPlainObject;
-    lodash.transform = transform;
-    lodash.union = union;
-    lodash.uniq = uniq;
-    lodash.unzip = unzip;
-    lodash.unzipWith = unzipWith;
-    lodash.values = values;
-    lodash.valuesIn = valuesIn;
-    lodash.where = where;
-    lodash.without = without;
-    lodash.wrap = wrap;
-    lodash.xor = xor;
-    lodash.zip = zip;
-    lodash.zipObject = zipObject;
-    lodash.zipWith = zipWith;
-
-    // Add aliases.
-    lodash.backflow = flowRight;
-    lodash.collect = map;
-    lodash.compose = flowRight;
-    lodash.each = forEach;
-    lodash.eachRight = forEachRight;
-    lodash.extend = assign;
-    lodash.iteratee = callback;
-    lodash.methods = functions;
-    lodash.object = zipObject;
-    lodash.select = filter;
-    lodash.tail = rest;
-    lodash.unique = uniq;
-
-    // Add functions to `lodash.prototype`.
-    mixin(lodash, lodash);
-
-    /*------------------------------------------------------------------------*/
-
-    // Add functions that return unwrapped values when chaining.
-    lodash.add = add;
-    lodash.attempt = attempt;
-    lodash.camelCase = camelCase;
-    lodash.capitalize = capitalize;
-    lodash.ceil = ceil;
-    lodash.clone = clone;
-    lodash.cloneDeep = cloneDeep;
-    lodash.deburr = deburr;
-    lodash.endsWith = endsWith;
-    lodash.escape = escape;
-    lodash.escapeRegExp = escapeRegExp;
-    lodash.every = every;
-    lodash.find = find;
-    lodash.findIndex = findIndex;
-    lodash.findKey = findKey;
-    lodash.findLast = findLast;
-    lodash.findLastIndex = findLastIndex;
-    lodash.findLastKey = findLastKey;
-    lodash.findWhere = findWhere;
-    lodash.first = first;
-    lodash.floor = floor;
-    lodash.get = get;
-    lodash.gt = gt;
-    lodash.gte = gte;
-    lodash.has = has;
-    lodash.identity = identity;
-    lodash.includes = includes;
-    lodash.indexOf = indexOf;
-    lodash.inRange = inRange;
-    lodash.isArguments = isArguments;
-    lodash.isArray = isArray;
-    lodash.isBoolean = isBoolean;
-    lodash.isDate = isDate;
-    lodash.isElement = isElement;
-    lodash.isEmpty = isEmpty;
-    lodash.isEqual = isEqual;
-    lodash.isError = isError;
-    lodash.isFinite = isFinite;
-    lodash.isFunction = isFunction;
-    lodash.isMatch = isMatch;
-    lodash.isNaN = isNaN;
-    lodash.isNative = isNative;
-    lodash.isNull = isNull;
-    lodash.isNumber = isNumber;
-    lodash.isObject = isObject;
-    lodash.isPlainObject = isPlainObject;
-    lodash.isRegExp = isRegExp;
-    lodash.isString = isString;
-    lodash.isTypedArray = isTypedArray;
-    lodash.isUndefined = isUndefined;
-    lodash.kebabCase = kebabCase;
-    lodash.last = last;
-    lodash.lastIndexOf = lastIndexOf;
-    lodash.lt = lt;
-    lodash.lte = lte;
-    lodash.max = max;
-    lodash.min = min;
-    lodash.noConflict = noConflict;
-    lodash.noop = noop;
-    lodash.now = now;
-    lodash.pad = pad;
-    lodash.padLeft = padLeft;
-    lodash.padRight = padRight;
-    lodash.parseInt = parseInt;
-    lodash.random = random;
-    lodash.reduce = reduce;
-    lodash.reduceRight = reduceRight;
-    lodash.repeat = repeat;
-    lodash.result = result;
-    lodash.round = round;
-    lodash.runInContext = runInContext;
-    lodash.size = size;
-    lodash.snakeCase = snakeCase;
-    lodash.some = some;
-    lodash.sortedIndex = sortedIndex;
-    lodash.sortedLastIndex = sortedLastIndex;
-    lodash.startCase = startCase;
-    lodash.startsWith = startsWith;
-    lodash.sum = sum;
-    lodash.template = template;
-    lodash.trim = trim;
-    lodash.trimLeft = trimLeft;
-    lodash.trimRight = trimRight;
-    lodash.trunc = trunc;
-    lodash.unescape = unescape;
-    lodash.uniqueId = uniqueId;
-    lodash.words = words;
-
-    // Add aliases.
-    lodash.all = every;
-    lodash.any = some;
-    lodash.contains = includes;
-    lodash.eq = isEqual;
-    lodash.detect = find;
-    lodash.foldl = reduce;
-    lodash.foldr = reduceRight;
-    lodash.head = first;
-    lodash.include = includes;
-    lodash.inject = reduce;
-
-    mixin(lodash, (function() {
-      var source = {};
-      baseForOwn(lodash, function(func, methodName) {
-        if (!lodash.prototype[methodName]) {
-          source[methodName] = func;
-        }
-      });
-      return source;
-    }()), false);
-
-    /*------------------------------------------------------------------------*/
-
-    // Add functions capable of returning wrapped and unwrapped values when chaining.
-    lodash.sample = sample;
-
-    lodash.prototype.sample = function(n) {
-      if (!this.__chain__ && n == null) {
-        return sample(this.value());
-      }
-      return this.thru(function(value) {
-        return sample(value, n);
-      });
-    };
-
-    /*------------------------------------------------------------------------*/
-
-    /**
-     * The semantic version number.
-     *
-     * @static
-     * @memberOf _
-     * @type string
-     */
-    lodash.VERSION = VERSION;
-
-    // Assign default placeholders.
-    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
-      lodash[methodName].placeholder = lodash;
-    });
-
-    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
-    arrayEach(['drop', 'take'], function(methodName, index) {
-      LazyWrapper.prototype[methodName] = function(n) {
-        var filtered = this.__filtered__;
-        if (filtered && !index) {
-          return new LazyWrapper(this);
-        }
-        n = n == null ? 1 : nativeMax(nativeFloor(n) || 0, 0);
-
-        var result = this.clone();
-        if (filtered) {
-          result.__takeCount__ = nativeMin(result.__takeCount__, n);
-        } else {
-          result.__views__.push({ 'size': n, 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') });
-        }
-        return result;
-      };
-
-      LazyWrapper.prototype[methodName + 'Right'] = function(n) {
-        return this.reverse()[methodName](n).reverse();
-      };
-    });
-
-    // Add `LazyWrapper` methods that accept an `iteratee` value.
-    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
-      var type = index + 1,
-          isFilter = type != LAZY_MAP_FLAG;
-
-      LazyWrapper.prototype[methodName] = function(iteratee, thisArg) {
-        var result = this.clone();
-        result.__iteratees__.push({ 'iteratee': getCallback(iteratee, thisArg, 1), 'type': type });
-        result.__filtered__ = result.__filtered__ || isFilter;
-        return result;
-      };
-    });
-
-    // Add `LazyWrapper` methods for `_.first` and `_.last`.
-    arrayEach(['first', 'last'], function(methodName, index) {
-      var takeName = 'take' + (index ? 'Right' : '');
-
-      LazyWrapper.prototype[methodName] = function() {
-        return this[takeName](1).value()[0];
-      };
-    });
-
-    // Add `LazyWrapper` methods for `_.initial` and `_.rest`.
-    arrayEach(['initial', 'rest'], function(methodName, index) {
-      var dropName = 'drop' + (index ? '' : 'Right');
-
-      LazyWrapper.prototype[methodName] = function() {
-        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
-      };
-    });
-
-    // Add `LazyWrapper` methods for `_.pluck` and `_.where`.
-    arrayEach(['pluck', 'where'], function(methodName, index) {
-      var operationName = index ? 'filter' : 'map',
-          createCallback = index ? baseMatches : property;
-
-      LazyWrapper.prototype[methodName] = function(value) {
-        return this[operationName](createCallback(value));
-      };
-    });
-
-    LazyWrapper.prototype.compact = function() {
-      return this.filter(identity);
-    };
-
-    LazyWrapper.prototype.reject = function(predicate, thisArg) {
-      predicate = getCallback(predicate, thisArg, 1);
-      return this.filter(function(value) {
-        return !predicate(value);
-      });
-    };
-
-    LazyWrapper.prototype.slice = function(start, end) {
-      start = start == null ? 0 : (+start || 0);
-
-      var result = this;
-      if (result.__filtered__ && (start > 0 || end < 0)) {
-        return new LazyWrapper(result);
-      }
-      if (start < 0) {
-        result = result.takeRight(-start);
-      } else if (start) {
-        result = result.drop(start);
-      }
-      if (end !== undefined) {
-        end = (+end || 0);
-        result = end < 0 ? result.dropRight(-end) : result.take(end - start);
-      }
-      return result;
-    };
-
-    LazyWrapper.prototype.takeRightWhile = function(predicate, thisArg) {
-      return this.reverse().takeWhile(predicate, thisArg).reverse();
-    };
-
-    LazyWrapper.prototype.toArray = function() {
-      return this.take(POSITIVE_INFINITY);
-    };
-
-    // Add `LazyWrapper` methods to `lodash.prototype`.
-    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
-      var checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName),
-          retUnwrapped = /^(?:first|last)$/.test(methodName),
-          lodashFunc = lodash[retUnwrapped ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName];
-
-      if (!lodashFunc) {
-        return;
-      }
-      lodash.prototype[methodName] = function() {
-        var args = retUnwrapped ? [1] : arguments,
-            chainAll = this.__chain__,
-            value = this.__wrapped__,
-            isHybrid = !!this.__actions__.length,
-            isLazy = value instanceof LazyWrapper,
-            iteratee = args[0],
-            useLazy = isLazy || isArray(value);
-
-        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
-          // Avoid lazy use if the iteratee has a "length" value other than `1`.
-          isLazy = useLazy = false;
-        }
-        var interceptor = function(value) {
-          return (retUnwrapped && chainAll)
-            ? lodashFunc(value, 1)[0]
-            : lodashFunc.apply(undefined, arrayPush([value], args));
-        };
-
-        var action = { 'func': thru, 'args': [interceptor], 'thisArg': undefined },
-            onlyLazy = isLazy && !isHybrid;
-
-        if (retUnwrapped && !chainAll) {
-          if (onlyLazy) {
-            value = value.clone();
-            value.__actions__.push(action);
-            return func.call(value);
-          }
-          return lodashFunc.call(undefined, this.value())[0];
-        }
-        if (!retUnwrapped && useLazy) {
-          value = onlyLazy ? value : new LazyWrapper(this);
-          var result = func.apply(value, args);
-          result.__actions__.push(action);
-          return new LodashWrapper(result, chainAll);
-        }
-        return this.thru(interceptor);
-      };
-    });
-
-    // Add `Array` and `String` methods to `lodash.prototype`.
-    arrayEach(['join', 'pop', 'push', 'replace', 'shift', 'sort', 'splice', 'split', 'unshift'], function(methodName) {
-      var func = (/^(?:replace|split)$/.test(methodName) ? stringProto : arrayProto)[methodName],
-          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
-          retUnwrapped = /^(?:join|pop|replace|shift)$/.test(methodName);
-
-      lodash.prototype[methodName] = function() {
-        var args = arguments;
-        if (retUnwrapped && !this.__chain__) {
-          return func.apply(this.value(), args);
-        }
-        return this[chainName](function(value) {
-          return func.apply(value, args);
-        });
-      };
-    });
-
-    // Map minified function names to their real names.
-    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
-      var lodashFunc = lodash[methodName];
-      if (lodashFunc) {
-        var key = lodashFunc.name,
-            names = realNames[key] || (realNames[key] = []);
-
-        names.push({ 'name': methodName, 'func': lodashFunc });
-      }
-    });
-
-    realNames[createHybridWrapper(undefined, BIND_KEY_FLAG).name] = [{ 'name': 'wrapper', 'func': undefined }];
-
-    // Add functions to the lazy wrapper.
-    LazyWrapper.prototype.clone = lazyClone;
-    LazyWrapper.prototype.reverse = lazyReverse;
-    LazyWrapper.prototype.value = lazyValue;
-
-    // Add chaining functions to the `lodash` wrapper.
-    lodash.prototype.chain = wrapperChain;
-    lodash.prototype.commit = wrapperCommit;
-    lodash.prototype.concat = wrapperConcat;
-    lodash.prototype.plant = wrapperPlant;
-    lodash.prototype.reverse = wrapperReverse;
-    lodash.prototype.toString = wrapperToString;
-    lodash.prototype.run = lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
-
-    // Add function aliases to the `lodash` wrapper.
-    lodash.prototype.collect = lodash.prototype.map;
-    lodash.prototype.head = lodash.prototype.first;
-    lodash.prototype.select = lodash.prototype.filter;
-    lodash.prototype.tail = lodash.prototype.rest;
-
-    return lodash;
-  }
-
-  /*--------------------------------------------------------------------------*/
-
-  // Export lodash.
-  var _ = runInContext();
-
-  // Some AMD build optimizers like r.js check for condition patterns like the following:
-  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
-    // Expose lodash to the global object when an AMD loader is present to avoid
-    // errors in cases where lodash is loaded by a script tag and not intended
-    // as an AMD module. See http://requirejs.org/docs/errors.html#mismatch for
-    // more details.
-    root._ = _;
-
-    // Define as an anonymous module so, through path mapping, it can be
-    // referenced as the "underscore" module.
-    define(function() {
-      return _;
-    });
-  }
-  // Check for `exports` after `define` in case a build optimizer adds an `exports` object.
-  else if (freeExports && freeModule) {
-    // Export for Node.js or RingoJS.
-    if (moduleExports) {
-      (freeModule.exports = _)._ = _;
-    }
-    // Export for Rhino with CommonJS support.
-    else {
-      freeExports._ = _;
-    }
-  }
-  else {
-    // Export for a browser or Rhino.
-    root._ = _;
-  }
-}.call(this));
diff --git a/node_modules/lodash/internal/LazyWrapper.js b/node_modules/lodash/internal/LazyWrapper.js
deleted file mode 100644
index d9c8080..0000000
--- a/node_modules/lodash/internal/LazyWrapper.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var baseCreate = require('./baseCreate'),
-    baseLodash = require('./baseLodash');
-
-/** Used as references for `-Infinity` and `Infinity`. */
-var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
-
-/**
- * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
- *
- * @private
- * @param {*} value The value to wrap.
- */
-function LazyWrapper(value) {
-  this.__wrapped__ = value;
-  this.__actions__ = [];
-  this.__dir__ = 1;
-  this.__filtered__ = false;
-  this.__iteratees__ = [];
-  this.__takeCount__ = POSITIVE_INFINITY;
-  this.__views__ = [];
-}
-
-LazyWrapper.prototype = baseCreate(baseLodash.prototype);
-LazyWrapper.prototype.constructor = LazyWrapper;
-
-module.exports = LazyWrapper;
diff --git a/node_modules/lodash/internal/LodashWrapper.js b/node_modules/lodash/internal/LodashWrapper.js
deleted file mode 100644
index ab06bc7..0000000
--- a/node_modules/lodash/internal/LodashWrapper.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var baseCreate = require('./baseCreate'),
-    baseLodash = require('./baseLodash');
-
-/**
- * The base constructor for creating `lodash` wrapper objects.
- *
- * @private
- * @param {*} value The value to wrap.
- * @param {boolean} [chainAll] Enable chaining for all wrapper methods.
- * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.
- */
-function LodashWrapper(value, chainAll, actions) {
-  this.__wrapped__ = value;
-  this.__actions__ = actions || [];
-  this.__chain__ = !!chainAll;
-}
-
-LodashWrapper.prototype = baseCreate(baseLodash.prototype);
-LodashWrapper.prototype.constructor = LodashWrapper;
-
-module.exports = LodashWrapper;
diff --git a/node_modules/lodash/internal/MapCache.js b/node_modules/lodash/internal/MapCache.js
deleted file mode 100644
index 1d7ab98..0000000
--- a/node_modules/lodash/internal/MapCache.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var mapDelete = require('./mapDelete'),
-    mapGet = require('./mapGet'),
-    mapHas = require('./mapHas'),
-    mapSet = require('./mapSet');
-
-/**
- * Creates a cache object to store key/value pairs.
- *
- * @private
- * @static
- * @name Cache
- * @memberOf _.memoize
- */
-function MapCache() {
-  this.__data__ = {};
-}
-
-// Add functions to the `Map` cache.
-MapCache.prototype['delete'] = mapDelete;
-MapCache.prototype.get = mapGet;
-MapCache.prototype.has = mapHas;
-MapCache.prototype.set = mapSet;
-
-module.exports = MapCache;
diff --git a/node_modules/lodash/internal/SetCache.js b/node_modules/lodash/internal/SetCache.js
deleted file mode 100644
index ae29c55..0000000
--- a/node_modules/lodash/internal/SetCache.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var cachePush = require('./cachePush'),
-    getNative = require('./getNative');
-
-/** Native method references. */
-var Set = getNative(global, 'Set');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeCreate = getNative(Object, 'create');
-
-/**
- *
- * Creates a cache object to store unique values.
- *
- * @private
- * @param {Array} [values] The values to cache.
- */
-function SetCache(values) {
-  var length = values ? values.length : 0;
-
-  this.data = { 'hash': nativeCreate(null), 'set': new Set };
-  while (length--) {
-    this.push(values[length]);
-  }
-}
-
-// Add functions to the `Set` cache.
-SetCache.prototype.push = cachePush;
-
-module.exports = SetCache;
diff --git a/node_modules/lodash/internal/arrayConcat.js b/node_modules/lodash/internal/arrayConcat.js
deleted file mode 100644
index 0d131e3..0000000
--- a/node_modules/lodash/internal/arrayConcat.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * Creates a new array joining `array` with `other`.
- *
- * @private
- * @param {Array} array The array to join.
- * @param {Array} other The other array to join.
- * @returns {Array} Returns the new concatenated array.
- */
-function arrayConcat(array, other) {
-  var index = -1,
-      length = array.length,
-      othIndex = -1,
-      othLength = other.length,
-      result = Array(length + othLength);
-
-  while (++index < length) {
-    result[index] = array[index];
-  }
-  while (++othIndex < othLength) {
-    result[index++] = other[othIndex];
-  }
-  return result;
-}
-
-module.exports = arrayConcat;
diff --git a/node_modules/lodash/internal/arrayCopy.js b/node_modules/lodash/internal/arrayCopy.js
deleted file mode 100644
index fa7067f..0000000
--- a/node_modules/lodash/internal/arrayCopy.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Copies the values of `source` to `array`.
- *
- * @private
- * @param {Array} source The array to copy values from.
- * @param {Array} [array=[]] The array to copy values to.
- * @returns {Array} Returns `array`.
- */
-function arrayCopy(source, array) {
-  var index = -1,
-      length = source.length;
-
-  array || (array = Array(length));
-  while (++index < length) {
-    array[index] = source[index];
-  }
-  return array;
-}
-
-module.exports = arrayCopy;
diff --git a/node_modules/lodash/internal/arrayEach.js b/node_modules/lodash/internal/arrayEach.js
deleted file mode 100644
index 0f51382..0000000
--- a/node_modules/lodash/internal/arrayEach.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * A specialized version of `_.forEach` for arrays without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns `array`.
- */
-function arrayEach(array, iteratee) {
-  var index = -1,
-      length = array.length;
-
-  while (++index < length) {
-    if (iteratee(array[index], index, array) === false) {
-      break;
-    }
-  }
-  return array;
-}
-
-module.exports = arrayEach;
diff --git a/node_modules/lodash/internal/arrayEachRight.js b/node_modules/lodash/internal/arrayEachRight.js
deleted file mode 100644
index 367e066..0000000
--- a/node_modules/lodash/internal/arrayEachRight.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * A specialized version of `_.forEachRight` for arrays without support for
- * callback shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns `array`.
- */
-function arrayEachRight(array, iteratee) {
-  var length = array.length;
-
-  while (length--) {
-    if (iteratee(array[length], length, array) === false) {
-      break;
-    }
-  }
-  return array;
-}
-
-module.exports = arrayEachRight;
diff --git a/node_modules/lodash/internal/arrayEvery.js b/node_modules/lodash/internal/arrayEvery.js
deleted file mode 100644
index 3fe6ed2..0000000
--- a/node_modules/lodash/internal/arrayEvery.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * A specialized version of `_.every` for arrays without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {boolean} Returns `true` if all elements pass the predicate check,
- *  else `false`.
- */
-function arrayEvery(array, predicate) {
-  var index = -1,
-      length = array.length;
-
-  while (++index < length) {
-    if (!predicate(array[index], index, array)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-module.exports = arrayEvery;
diff --git a/node_modules/lodash/internal/arrayExtremum.js b/node_modules/lodash/internal/arrayExtremum.js
deleted file mode 100644
index e45badb..0000000
--- a/node_modules/lodash/internal/arrayExtremum.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * A specialized version of `baseExtremum` for arrays which invokes `iteratee`
- * with one argument: (value).
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {Function} comparator The function used to compare values.
- * @param {*} exValue The initial extremum value.
- * @returns {*} Returns the extremum value.
- */
-function arrayExtremum(array, iteratee, comparator, exValue) {
-  var index = -1,
-      length = array.length,
-      computed = exValue,
-      result = computed;
-
-  while (++index < length) {
-    var value = array[index],
-        current = +iteratee(value);
-
-    if (comparator(current, computed)) {
-      computed = current;
-      result = value;
-    }
-  }
-  return result;
-}
-
-module.exports = arrayExtremum;
diff --git a/node_modules/lodash/internal/arrayFilter.js b/node_modules/lodash/internal/arrayFilter.js
deleted file mode 100644
index e14fe06..0000000
--- a/node_modules/lodash/internal/arrayFilter.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * A specialized version of `_.filter` for arrays without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {Array} Returns the new filtered array.
- */
-function arrayFilter(array, predicate) {
-  var index = -1,
-      length = array.length,
-      resIndex = -1,
-      result = [];
-
-  while (++index < length) {
-    var value = array[index];
-    if (predicate(value, index, array)) {
-      result[++resIndex] = value;
-    }
-  }
-  return result;
-}
-
-module.exports = arrayFilter;
diff --git a/node_modules/lodash/internal/arrayMap.js b/node_modules/lodash/internal/arrayMap.js
deleted file mode 100644
index 777c7c9..0000000
--- a/node_modules/lodash/internal/arrayMap.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * A specialized version of `_.map` for arrays without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns the new mapped array.
- */
-function arrayMap(array, iteratee) {
-  var index = -1,
-      length = array.length,
-      result = Array(length);
-
-  while (++index < length) {
-    result[index] = iteratee(array[index], index, array);
-  }
-  return result;
-}
-
-module.exports = arrayMap;
diff --git a/node_modules/lodash/internal/arrayPush.js b/node_modules/lodash/internal/arrayPush.js
deleted file mode 100644
index 7d742b3..0000000
--- a/node_modules/lodash/internal/arrayPush.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Appends the elements of `values` to `array`.
- *
- * @private
- * @param {Array} array The array to modify.
- * @param {Array} values The values to append.
- * @returns {Array} Returns `array`.
- */
-function arrayPush(array, values) {
-  var index = -1,
-      length = values.length,
-      offset = array.length;
-
-  while (++index < length) {
-    array[offset + index] = values[index];
-  }
-  return array;
-}
-
-module.exports = arrayPush;
diff --git a/node_modules/lodash/internal/arrayReduce.js b/node_modules/lodash/internal/arrayReduce.js
deleted file mode 100644
index f948c8e..0000000
--- a/node_modules/lodash/internal/arrayReduce.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * A specialized version of `_.reduce` for arrays without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {*} [accumulator] The initial value.
- * @param {boolean} [initFromArray] Specify using the first element of `array`
- *  as the initial value.
- * @returns {*} Returns the accumulated value.
- */
-function arrayReduce(array, iteratee, accumulator, initFromArray) {
-  var index = -1,
-      length = array.length;
-
-  if (initFromArray && length) {
-    accumulator = array[++index];
-  }
-  while (++index < length) {
-    accumulator = iteratee(accumulator, array[index], index, array);
-  }
-  return accumulator;
-}
-
-module.exports = arrayReduce;
diff --git a/node_modules/lodash/internal/arrayReduceRight.js b/node_modules/lodash/internal/arrayReduceRight.js
deleted file mode 100644
index d4d68df..0000000
--- a/node_modules/lodash/internal/arrayReduceRight.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * A specialized version of `_.reduceRight` for arrays without support for
- * callback shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {*} [accumulator] The initial value.
- * @param {boolean} [initFromArray] Specify using the last element of `array`
- *  as the initial value.
- * @returns {*} Returns the accumulated value.
- */
-function arrayReduceRight(array, iteratee, accumulator, initFromArray) {
-  var length = array.length;
-  if (initFromArray && length) {
-    accumulator = array[--length];
-  }
-  while (length--) {
-    accumulator = iteratee(accumulator, array[length], length, array);
-  }
-  return accumulator;
-}
-
-module.exports = arrayReduceRight;
diff --git a/node_modules/lodash/internal/arraySome.js b/node_modules/lodash/internal/arraySome.js
deleted file mode 100644
index f7a0bb5..0000000
--- a/node_modules/lodash/internal/arraySome.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * A specialized version of `_.some` for arrays without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {boolean} Returns `true` if any element passes the predicate check,
- *  else `false`.
- */
-function arraySome(array, predicate) {
-  var index = -1,
-      length = array.length;
-
-  while (++index < length) {
-    if (predicate(array[index], index, array)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-module.exports = arraySome;
diff --git a/node_modules/lodash/internal/arraySum.js b/node_modules/lodash/internal/arraySum.js
deleted file mode 100644
index 0e40c91..0000000
--- a/node_modules/lodash/internal/arraySum.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * A specialized version of `_.sum` for arrays without support for callback
- * shorthands and `this` binding..
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {number} Returns the sum.
- */
-function arraySum(array, iteratee) {
-  var length = array.length,
-      result = 0;
-
-  while (length--) {
-    result += +iteratee(array[length]) || 0;
-  }
-  return result;
-}
-
-module.exports = arraySum;
diff --git a/node_modules/lodash/internal/assignDefaults.js b/node_modules/lodash/internal/assignDefaults.js
deleted file mode 100644
index affd993..0000000
--- a/node_modules/lodash/internal/assignDefaults.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * Used by `_.defaults` to customize its `_.assign` use.
- *
- * @private
- * @param {*} objectValue The destination object property value.
- * @param {*} sourceValue The source object property value.
- * @returns {*} Returns the value to assign to the destination object.
- */
-function assignDefaults(objectValue, sourceValue) {
-  return objectValue === undefined ? sourceValue : objectValue;
-}
-
-module.exports = assignDefaults;
diff --git a/node_modules/lodash/internal/assignOwnDefaults.js b/node_modules/lodash/internal/assignOwnDefaults.js
deleted file mode 100644
index 682c460..0000000
--- a/node_modules/lodash/internal/assignOwnDefaults.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Used by `_.template` to customize its `_.assign` use.
- *
- * **Note:** This function is like `assignDefaults` except that it ignores
- * inherited property values when checking if a property is `undefined`.
- *
- * @private
- * @param {*} objectValue The destination object property value.
- * @param {*} sourceValue The source object property value.
- * @param {string} key The key associated with the object and source values.
- * @param {Object} object The destination object.
- * @returns {*} Returns the value to assign to the destination object.
- */
-function assignOwnDefaults(objectValue, sourceValue, key, object) {
-  return (objectValue === undefined || !hasOwnProperty.call(object, key))
-    ? sourceValue
-    : objectValue;
-}
-
-module.exports = assignOwnDefaults;
diff --git a/node_modules/lodash/internal/assignWith.js b/node_modules/lodash/internal/assignWith.js
deleted file mode 100644
index d2b261a..0000000
--- a/node_modules/lodash/internal/assignWith.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var keys = require('../object/keys');
-
-/**
- * A specialized version of `_.assign` for customizing assigned values without
- * support for argument juggling, multiple sources, and `this` binding `customizer`
- * functions.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @param {Function} customizer The function to customize assigned values.
- * @returns {Object} Returns `object`.
- */
-function assignWith(object, source, customizer) {
-  var index = -1,
-      props = keys(source),
-      length = props.length;
-
-  while (++index < length) {
-    var key = props[index],
-        value = object[key],
-        result = customizer(value, source[key], key, object, source);
-
-    if ((result === result ? (result !== value) : (value === value)) ||
-        (value === undefined && !(key in object))) {
-      object[key] = result;
-    }
-  }
-  return object;
-}
-
-module.exports = assignWith;
diff --git a/node_modules/lodash/internal/baseAssign.js b/node_modules/lodash/internal/baseAssign.js
deleted file mode 100644
index cfad6e0..0000000
--- a/node_modules/lodash/internal/baseAssign.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var baseCopy = require('./baseCopy'),
-    keys = require('../object/keys');
-
-/**
- * The base implementation of `_.assign` without support for argument juggling,
- * multiple sources, and `customizer` functions.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @returns {Object} Returns `object`.
- */
-function baseAssign(object, source) {
-  return source == null
-    ? object
-    : baseCopy(source, keys(source), object);
-}
-
-module.exports = baseAssign;
diff --git a/node_modules/lodash/internal/baseAt.js b/node_modules/lodash/internal/baseAt.js
deleted file mode 100644
index bbafd1d..0000000
--- a/node_modules/lodash/internal/baseAt.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var isArrayLike = require('./isArrayLike'),
-    isIndex = require('./isIndex');
-
-/**
- * The base implementation of `_.at` without support for string collections
- * and individual key arguments.
- *
- * @private
- * @param {Array|Object} collection The collection to iterate over.
- * @param {number[]|string[]} props The property names or indexes of elements to pick.
- * @returns {Array} Returns the new array of picked elements.
- */
-function baseAt(collection, props) {
-  var index = -1,
-      isNil = collection == null,
-      isArr = !isNil && isArrayLike(collection),
-      length = isArr ? collection.length : 0,
-      propsLength = props.length,
-      result = Array(propsLength);
-
-  while(++index < propsLength) {
-    var key = props[index];
-    if (isArr) {
-      result[index] = isIndex(key, length) ? collection[key] : undefined;
-    } else {
-      result[index] = isNil ? undefined : collection[key];
-    }
-  }
-  return result;
-}
-
-module.exports = baseAt;
diff --git a/node_modules/lodash/internal/baseCallback.js b/node_modules/lodash/internal/baseCallback.js
deleted file mode 100644
index 67fe087..0000000
--- a/node_modules/lodash/internal/baseCallback.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var baseMatches = require('./baseMatches'),
-    baseMatchesProperty = require('./baseMatchesProperty'),
-    bindCallback = require('./bindCallback'),
-    identity = require('../utility/identity'),
-    property = require('../utility/property');
-
-/**
- * The base implementation of `_.callback` which supports specifying the
- * number of arguments to provide to `func`.
- *
- * @private
- * @param {*} [func=_.identity] The value to convert to a callback.
- * @param {*} [thisArg] The `this` binding of `func`.
- * @param {number} [argCount] The number of arguments to provide to `func`.
- * @returns {Function} Returns the callback.
- */
-function baseCallback(func, thisArg, argCount) {
-  var type = typeof func;
-  if (type == 'function') {
-    return thisArg === undefined
-      ? func
-      : bindCallback(func, thisArg, argCount);
-  }
-  if (func == null) {
-    return identity;
-  }
-  if (type == 'object') {
-    return baseMatches(func);
-  }
-  return thisArg === undefined
-    ? property(func)
-    : baseMatchesProperty(func, thisArg);
-}
-
-module.exports = baseCallback;
diff --git a/node_modules/lodash/internal/baseClone.js b/node_modules/lodash/internal/baseClone.js
deleted file mode 100644
index ebd6649..0000000
--- a/node_modules/lodash/internal/baseClone.js
+++ /dev/null
@@ -1,128 +0,0 @@
-var arrayCopy = require('./arrayCopy'),
-    arrayEach = require('./arrayEach'),
-    baseAssign = require('./baseAssign'),
-    baseForOwn = require('./baseForOwn'),
-    initCloneArray = require('./initCloneArray'),
-    initCloneByTag = require('./initCloneByTag'),
-    initCloneObject = require('./initCloneObject'),
-    isArray = require('../lang/isArray'),
-    isObject = require('../lang/isObject');
-
-/** `Object#toString` result references. */
-var argsTag = '[object Arguments]',
-    arrayTag = '[object Array]',
-    boolTag = '[object Boolean]',
-    dateTag = '[object Date]',
-    errorTag = '[object Error]',
-    funcTag = '[object Function]',
-    mapTag = '[object Map]',
-    numberTag = '[object Number]',
-    objectTag = '[object Object]',
-    regexpTag = '[object RegExp]',
-    setTag = '[object Set]',
-    stringTag = '[object String]',
-    weakMapTag = '[object WeakMap]';
-
-var arrayBufferTag = '[object ArrayBuffer]',
-    float32Tag = '[object Float32Array]',
-    float64Tag = '[object Float64Array]',
-    int8Tag = '[object Int8Array]',
-    int16Tag = '[object Int16Array]',
-    int32Tag = '[object Int32Array]',
-    uint8Tag = '[object Uint8Array]',
-    uint8ClampedTag = '[object Uint8ClampedArray]',
-    uint16Tag = '[object Uint16Array]',
-    uint32Tag = '[object Uint32Array]';
-
-/** Used to identify `toStringTag` values supported by `_.clone`. */
-var cloneableTags = {};
-cloneableTags[argsTag] = cloneableTags[arrayTag] =
-cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =
-cloneableTags[dateTag] = cloneableTags[float32Tag] =
-cloneableTags[float64Tag] = cloneableTags[int8Tag] =
-cloneableTags[int16Tag] = cloneableTags[int32Tag] =
-cloneableTags[numberTag] = cloneableTags[objectTag] =
-cloneableTags[regexpTag] = cloneableTags[stringTag] =
-cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
-cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
-cloneableTags[errorTag] = cloneableTags[funcTag] =
-cloneableTags[mapTag] = cloneableTags[setTag] =
-cloneableTags[weakMapTag] = false;
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * The base implementation of `_.clone` without support for argument juggling
- * and `this` binding `customizer` functions.
- *
- * @private
- * @param {*} value The value to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @param {Function} [customizer] The function to customize cloning values.
- * @param {string} [key] The key of `value`.
- * @param {Object} [object] The object `value` belongs to.
- * @param {Array} [stackA=[]] Tracks traversed source objects.
- * @param {Array} [stackB=[]] Associates clones with source counterparts.
- * @returns {*} Returns the cloned value.
- */
-function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {
-  var result;
-  if (customizer) {
-    result = object ? customizer(value, key, object) : customizer(value);
-  }
-  if (result !== undefined) {
-    return result;
-  }
-  if (!isObject(value)) {
-    return value;
-  }
-  var isArr = isArray(value);
-  if (isArr) {
-    result = initCloneArray(value);
-    if (!isDeep) {
-      return arrayCopy(value, result);
-    }
-  } else {
-    var tag = objToString.call(value),
-        isFunc = tag == funcTag;
-
-    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
-      result = initCloneObject(isFunc ? {} : value);
-      if (!isDeep) {
-        return baseAssign(result, value);
-      }
-    } else {
-      return cloneableTags[tag]
-        ? initCloneByTag(value, tag, isDeep)
-        : (object ? value : {});
-    }
-  }
-  // Check for circular references and return its corresponding clone.
-  stackA || (stackA = []);
-  stackB || (stackB = []);
-
-  var length = stackA.length;
-  while (length--) {
-    if (stackA[length] == value) {
-      return stackB[length];
-    }
-  }
-  // Add the source value to the stack of traversed objects and associate it with its clone.
-  stackA.push(value);
-  stackB.push(result);
-
-  // Recursively populate clone (susceptible to call stack limits).
-  (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {
-    result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);
-  });
-  return result;
-}
-
-module.exports = baseClone;
diff --git a/node_modules/lodash/internal/baseCompareAscending.js b/node_modules/lodash/internal/baseCompareAscending.js
deleted file mode 100644
index c8259c7..0000000
--- a/node_modules/lodash/internal/baseCompareAscending.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * The base implementation of `compareAscending` which compares values and
- * sorts them in ascending order without guaranteeing a stable sort.
- *
- * @private
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @returns {number} Returns the sort order indicator for `value`.
- */
-function baseCompareAscending(value, other) {
-  if (value !== other) {
-    var valIsNull = value === null,
-        valIsUndef = value === undefined,
-        valIsReflexive = value === value;
-
-    var othIsNull = other === null,
-        othIsUndef = other === undefined,
-        othIsReflexive = other === other;
-
-    if ((value > other && !othIsNull) || !valIsReflexive ||
-        (valIsNull && !othIsUndef && othIsReflexive) ||
-        (valIsUndef && othIsReflexive)) {
-      return 1;
-    }
-    if ((value < other && !valIsNull) || !othIsReflexive ||
-        (othIsNull && !valIsUndef && valIsReflexive) ||
-        (othIsUndef && valIsReflexive)) {
-      return -1;
-    }
-  }
-  return 0;
-}
-
-module.exports = baseCompareAscending;
diff --git a/node_modules/lodash/internal/baseCopy.js b/node_modules/lodash/internal/baseCopy.js
deleted file mode 100644
index 15059f3..0000000
--- a/node_modules/lodash/internal/baseCopy.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Copies properties of `source` to `object`.
- *
- * @private
- * @param {Object} source The object to copy properties from.
- * @param {Array} props The property names to copy.
- * @param {Object} [object={}] The object to copy properties to.
- * @returns {Object} Returns `object`.
- */
-function baseCopy(source, props, object) {
-  object || (object = {});
-
-  var index = -1,
-      length = props.length;
-
-  while (++index < length) {
-    var key = props[index];
-    object[key] = source[key];
-  }
-  return object;
-}
-
-module.exports = baseCopy;
diff --git a/node_modules/lodash/internal/baseCreate.js b/node_modules/lodash/internal/baseCreate.js
deleted file mode 100644
index be5e1d9..0000000
--- a/node_modules/lodash/internal/baseCreate.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var isObject = require('../lang/isObject');
-
-/**
- * The base implementation of `_.create` without support for assigning
- * properties to the created object.
- *
- * @private
- * @param {Object} prototype The object to inherit from.
- * @returns {Object} Returns the new object.
- */
-var baseCreate = (function() {
-  function object() {}
-  return function(prototype) {
-    if (isObject(prototype)) {
-      object.prototype = prototype;
-      var result = new object;
-      object.prototype = undefined;
-    }
-    return result || {};
-  };
-}());
-
-module.exports = baseCreate;
diff --git a/node_modules/lodash/internal/baseDelay.js b/node_modules/lodash/internal/baseDelay.js
deleted file mode 100644
index c405c37..0000000
--- a/node_modules/lodash/internal/baseDelay.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/**
- * The base implementation of `_.delay` and `_.defer` which accepts an index
- * of where to slice the arguments to provide to `func`.
- *
- * @private
- * @param {Function} func The function to delay.
- * @param {number} wait The number of milliseconds to delay invocation.
- * @param {Object} args The arguments provide to `func`.
- * @returns {number} Returns the timer id.
- */
-function baseDelay(func, wait, args) {
-  if (typeof func != 'function') {
-    throw new TypeError(FUNC_ERROR_TEXT);
-  }
-  return setTimeout(function() { func.apply(undefined, args); }, wait);
-}
-
-module.exports = baseDelay;
diff --git a/node_modules/lodash/internal/baseDifference.js b/node_modules/lodash/internal/baseDifference.js
deleted file mode 100644
index 40da1b6..0000000
--- a/node_modules/lodash/internal/baseDifference.js
+++ /dev/null
@@ -1,55 +0,0 @@
-var baseIndexOf = require('./baseIndexOf'),
-    cacheIndexOf = require('./cacheIndexOf'),
-    createCache = require('./createCache');
-
-/** Used as the size to enable large array optimizations. */
-var LARGE_ARRAY_SIZE = 200;
-
-/**
- * The base implementation of `_.difference` which accepts a single array
- * of values to exclude.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {Array} values The values to exclude.
- * @returns {Array} Returns the new array of filtered values.
- */
-function baseDifference(array, values) {
-  var length = array ? array.length : 0,
-      result = [];
-
-  if (!length) {
-    return result;
-  }
-  var index = -1,
-      indexOf = baseIndexOf,
-      isCommon = true,
-      cache = (isCommon && values.length >= LARGE_ARRAY_SIZE) ? createCache(values) : null,
-      valuesLength = values.length;
-
-  if (cache) {
-    indexOf = cacheIndexOf;
-    isCommon = false;
-    values = cache;
-  }
-  outer:
-  while (++index < length) {
-    var value = array[index];
-
-    if (isCommon && value === value) {
-      var valuesIndex = valuesLength;
-      while (valuesIndex--) {
-        if (values[valuesIndex] === value) {
-          continue outer;
-        }
-      }
-      result.push(value);
-    }
-    else if (indexOf(values, value, 0) < 0) {
-      result.push(value);
-    }
-  }
-  return result;
-}
-
-module.exports = baseDifference;
diff --git a/node_modules/lodash/internal/baseEach.js b/node_modules/lodash/internal/baseEach.js
deleted file mode 100644
index 09ef5a3..0000000
--- a/node_modules/lodash/internal/baseEach.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var baseForOwn = require('./baseForOwn'),
-    createBaseEach = require('./createBaseEach');
-
-/**
- * The base implementation of `_.forEach` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array|Object|string} Returns `collection`.
- */
-var baseEach = createBaseEach(baseForOwn);
-
-module.exports = baseEach;
diff --git a/node_modules/lodash/internal/baseEachRight.js b/node_modules/lodash/internal/baseEachRight.js
deleted file mode 100644
index f0520a8..0000000
--- a/node_modules/lodash/internal/baseEachRight.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var baseForOwnRight = require('./baseForOwnRight'),
-    createBaseEach = require('./createBaseEach');
-
-/**
- * The base implementation of `_.forEachRight` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array|Object|string} Returns `collection`.
- */
-var baseEachRight = createBaseEach(baseForOwnRight, true);
-
-module.exports = baseEachRight;
diff --git a/node_modules/lodash/internal/baseEvery.js b/node_modules/lodash/internal/baseEvery.js
deleted file mode 100644
index a1fc1f3..0000000
--- a/node_modules/lodash/internal/baseEvery.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var baseEach = require('./baseEach');
-
-/**
- * The base implementation of `_.every` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {boolean} Returns `true` if all elements pass the predicate check,
- *  else `false`
- */
-function baseEvery(collection, predicate) {
-  var result = true;
-  baseEach(collection, function(value, index, collection) {
-    result = !!predicate(value, index, collection);
-    return result;
-  });
-  return result;
-}
-
-module.exports = baseEvery;
diff --git a/node_modules/lodash/internal/baseExtremum.js b/node_modules/lodash/internal/baseExtremum.js
deleted file mode 100644
index b0efff6..0000000
--- a/node_modules/lodash/internal/baseExtremum.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var baseEach = require('./baseEach');
-
-/**
- * Gets the extremum value of `collection` invoking `iteratee` for each value
- * in `collection` to generate the criterion by which the value is ranked.
- * The `iteratee` is invoked with three arguments: (value, index|key, collection).
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {Function} comparator The function used to compare values.
- * @param {*} exValue The initial extremum value.
- * @returns {*} Returns the extremum value.
- */
-function baseExtremum(collection, iteratee, comparator, exValue) {
-  var computed = exValue,
-      result = computed;
-
-  baseEach(collection, function(value, index, collection) {
-    var current = +iteratee(value, index, collection);
-    if (comparator(current, computed) || (current === exValue && current === result)) {
-      computed = current;
-      result = value;
-    }
-  });
-  return result;
-}
-
-module.exports = baseExtremum;
diff --git a/node_modules/lodash/internal/baseFill.js b/node_modules/lodash/internal/baseFill.js
deleted file mode 100644
index ef1a2fa..0000000
--- a/node_modules/lodash/internal/baseFill.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * The base implementation of `_.fill` without an iteratee call guard.
- *
- * @private
- * @param {Array} array The array to fill.
- * @param {*} value The value to fill `array` with.
- * @param {number} [start=0] The start position.
- * @param {number} [end=array.length] The end position.
- * @returns {Array} Returns `array`.
- */
-function baseFill(array, value, start, end) {
-  var length = array.length;
-
-  start = start == null ? 0 : (+start || 0);
-  if (start < 0) {
-    start = -start > length ? 0 : (length + start);
-  }
-  end = (end === undefined || end > length) ? length : (+end || 0);
-  if (end < 0) {
-    end += length;
-  }
-  length = start > end ? 0 : (end >>> 0);
-  start >>>= 0;
-
-  while (start < length) {
-    array[start++] = value;
-  }
-  return array;
-}
-
-module.exports = baseFill;
diff --git a/node_modules/lodash/internal/baseFilter.js b/node_modules/lodash/internal/baseFilter.js
deleted file mode 100644
index 27773a4..0000000
--- a/node_modules/lodash/internal/baseFilter.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var baseEach = require('./baseEach');
-
-/**
- * The base implementation of `_.filter` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {Array} Returns the new filtered array.
- */
-function baseFilter(collection, predicate) {
-  var result = [];
-  baseEach(collection, function(value, index, collection) {
-    if (predicate(value, index, collection)) {
-      result.push(value);
-    }
-  });
-  return result;
-}
-
-module.exports = baseFilter;
diff --git a/node_modules/lodash/internal/baseFind.js b/node_modules/lodash/internal/baseFind.js
deleted file mode 100644
index be5848f..0000000
--- a/node_modules/lodash/internal/baseFind.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,
- * without support for callback shorthands and `this` binding, which iterates
- * over `collection` using the provided `eachFunc`.
- *
- * @private
- * @param {Array|Object|string} collection The collection to search.
- * @param {Function} predicate The function invoked per iteration.
- * @param {Function} eachFunc The function to iterate over `collection`.
- * @param {boolean} [retKey] Specify returning the key of the found element
- *  instead of the element itself.
- * @returns {*} Returns the found element or its key, else `undefined`.
- */
-function baseFind(collection, predicate, eachFunc, retKey) {
-  var result;
-  eachFunc(collection, function(value, key, collection) {
-    if (predicate(value, key, collection)) {
-      result = retKey ? key : value;
-      return false;
-    }
-  });
-  return result;
-}
-
-module.exports = baseFind;
diff --git a/node_modules/lodash/internal/baseFindIndex.js b/node_modules/lodash/internal/baseFindIndex.js
deleted file mode 100644
index 7d4b502..0000000
--- a/node_modules/lodash/internal/baseFindIndex.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * The base implementation of `_.findIndex` and `_.findLastIndex` without
- * support for callback shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to search.
- * @param {Function} predicate The function invoked per iteration.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {number} Returns the index of the matched value, else `-1`.
- */
-function baseFindIndex(array, predicate, fromRight) {
-  var length = array.length,
-      index = fromRight ? length : -1;
-
-  while ((fromRight ? index-- : ++index < length)) {
-    if (predicate(array[index], index, array)) {
-      return index;
-    }
-  }
-  return -1;
-}
-
-module.exports = baseFindIndex;
diff --git a/node_modules/lodash/internal/baseFlatten.js b/node_modules/lodash/internal/baseFlatten.js
deleted file mode 100644
index 7443233..0000000
--- a/node_modules/lodash/internal/baseFlatten.js
+++ /dev/null
@@ -1,41 +0,0 @@
-var arrayPush = require('./arrayPush'),
-    isArguments = require('../lang/isArguments'),
-    isArray = require('../lang/isArray'),
-    isArrayLike = require('./isArrayLike'),
-    isObjectLike = require('./isObjectLike');
-
-/**
- * The base implementation of `_.flatten` with added support for restricting
- * flattening and specifying the start index.
- *
- * @private
- * @param {Array} array The array to flatten.
- * @param {boolean} [isDeep] Specify a deep flatten.
- * @param {boolean} [isStrict] Restrict flattening to arrays-like objects.
- * @param {Array} [result=[]] The initial result value.
- * @returns {Array} Returns the new flattened array.
- */
-function baseFlatten(array, isDeep, isStrict, result) {
-  result || (result = []);
-
-  var index = -1,
-      length = array.length;
-
-  while (++index < length) {
-    var value = array[index];
-    if (isObjectLike(value) && isArrayLike(value) &&
-        (isStrict || isArray(value) || isArguments(value))) {
-      if (isDeep) {
-        // Recursively flatten arrays (susceptible to call stack limits).
-        baseFlatten(value, isDeep, isStrict, result);
-      } else {
-        arrayPush(result, value);
-      }
-    } else if (!isStrict) {
-      result[result.length] = value;
-    }
-  }
-  return result;
-}
-
-module.exports = baseFlatten;
diff --git a/node_modules/lodash/internal/baseFor.js b/node_modules/lodash/internal/baseFor.js
deleted file mode 100644
index 94ee03f..0000000
--- a/node_modules/lodash/internal/baseFor.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var createBaseFor = require('./createBaseFor');
-
-/**
- * The base implementation of `baseForIn` and `baseForOwn` which iterates
- * over `object` properties returned by `keysFunc` invoking `iteratee` for
- * each property. Iteratee functions may exit iteration early by explicitly
- * returning `false`.
- *
- * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {Function} keysFunc The function to get the keys of `object`.
- * @returns {Object} Returns `object`.
- */
-var baseFor = createBaseFor();
-
-module.exports = baseFor;
diff --git a/node_modules/lodash/internal/baseForIn.js b/node_modules/lodash/internal/baseForIn.js
deleted file mode 100644
index 47d622c..0000000
--- a/node_modules/lodash/internal/baseForIn.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var baseFor = require('./baseFor'),
-    keysIn = require('../object/keysIn');
-
-/**
- * The base implementation of `_.forIn` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Object} Returns `object`.
- */
-function baseForIn(object, iteratee) {
-  return baseFor(object, iteratee, keysIn);
-}
-
-module.exports = baseForIn;
diff --git a/node_modules/lodash/internal/baseForOwn.js b/node_modules/lodash/internal/baseForOwn.js
deleted file mode 100644
index bef4d4c..0000000
--- a/node_modules/lodash/internal/baseForOwn.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var baseFor = require('./baseFor'),
-    keys = require('../object/keys');
-
-/**
- * The base implementation of `_.forOwn` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Object} Returns `object`.
- */
-function baseForOwn(object, iteratee) {
-  return baseFor(object, iteratee, keys);
-}
-
-module.exports = baseForOwn;
diff --git a/node_modules/lodash/internal/baseForOwnRight.js b/node_modules/lodash/internal/baseForOwnRight.js
deleted file mode 100644
index bb916bc..0000000
--- a/node_modules/lodash/internal/baseForOwnRight.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var baseForRight = require('./baseForRight'),
-    keys = require('../object/keys');
-
-/**
- * The base implementation of `_.forOwnRight` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Object} Returns `object`.
- */
-function baseForOwnRight(object, iteratee) {
-  return baseForRight(object, iteratee, keys);
-}
-
-module.exports = baseForOwnRight;
diff --git a/node_modules/lodash/internal/baseForRight.js b/node_modules/lodash/internal/baseForRight.js
deleted file mode 100644
index 5ddd191..0000000
--- a/node_modules/lodash/internal/baseForRight.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var createBaseFor = require('./createBaseFor');
-
-/**
- * This function is like `baseFor` except that it iterates over properties
- * in the opposite order.
- *
- * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {Function} keysFunc The function to get the keys of `object`.
- * @returns {Object} Returns `object`.
- */
-var baseForRight = createBaseFor(true);
-
-module.exports = baseForRight;
diff --git a/node_modules/lodash/internal/baseFunctions.js b/node_modules/lodash/internal/baseFunctions.js
deleted file mode 100644
index d56ea9c..0000000
--- a/node_modules/lodash/internal/baseFunctions.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var isFunction = require('../lang/isFunction');
-
-/**
- * The base implementation of `_.functions` which creates an array of
- * `object` function property names filtered from those provided.
- *
- * @private
- * @param {Object} object The object to inspect.
- * @param {Array} props The property names to filter.
- * @returns {Array} Returns the new array of filtered property names.
- */
-function baseFunctions(object, props) {
-  var index = -1,
-      length = props.length,
-      resIndex = -1,
-      result = [];
-
-  while (++index < length) {
-    var key = props[index];
-    if (isFunction(object[key])) {
-      result[++resIndex] = key;
-    }
-  }
-  return result;
-}
-
-module.exports = baseFunctions;
diff --git a/node_modules/lodash/internal/baseGet.js b/node_modules/lodash/internal/baseGet.js
deleted file mode 100644
index ad9b1ee..0000000
--- a/node_modules/lodash/internal/baseGet.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var toObject = require('./toObject');
-
-/**
- * The base implementation of `get` without support for string paths
- * and default values.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array} path The path of the property to get.
- * @param {string} [pathKey] The key representation of path.
- * @returns {*} Returns the resolved value.
- */
-function baseGet(object, path, pathKey) {
-  if (object == null) {
-    return;
-  }
-  if (pathKey !== undefined && pathKey in toObject(object)) {
-    path = [pathKey];
-  }
-  var index = 0,
-      length = path.length;
-
-  while (object != null && index < length) {
-    object = object[path[index++]];
-  }
-  return (index && index == length) ? object : undefined;
-}
-
-module.exports = baseGet;
diff --git a/node_modules/lodash/internal/baseIndexOf.js b/node_modules/lodash/internal/baseIndexOf.js
deleted file mode 100644
index 6b479bc..0000000
--- a/node_modules/lodash/internal/baseIndexOf.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var indexOfNaN = require('./indexOfNaN');
-
-/**
- * The base implementation of `_.indexOf` without support for binary searches.
- *
- * @private
- * @param {Array} array The array to search.
- * @param {*} value The value to search for.
- * @param {number} fromIndex The index to search from.
- * @returns {number} Returns the index of the matched value, else `-1`.
- */
-function baseIndexOf(array, value, fromIndex) {
-  if (value !== value) {
-    return indexOfNaN(array, fromIndex);
-  }
-  var index = fromIndex - 1,
-      length = array.length;
-
-  while (++index < length) {
-    if (array[index] === value) {
-      return index;
-    }
-  }
-  return -1;
-}
-
-module.exports = baseIndexOf;
diff --git a/node_modules/lodash/internal/baseIsEqual.js b/node_modules/lodash/internal/baseIsEqual.js
deleted file mode 100644
index 87e14ac..0000000
--- a/node_modules/lodash/internal/baseIsEqual.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var baseIsEqualDeep = require('./baseIsEqualDeep'),
-    isObject = require('../lang/isObject'),
-    isObjectLike = require('./isObjectLike');
-
-/**
- * The base implementation of `_.isEqual` without support for `this` binding
- * `customizer` functions.
- *
- * @private
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @param {Function} [customizer] The function to customize comparing values.
- * @param {boolean} [isLoose] Specify performing partial comparisons.
- * @param {Array} [stackA] Tracks traversed `value` objects.
- * @param {Array} [stackB] Tracks traversed `other` objects.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- */
-function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
-  if (value === other) {
-    return true;
-  }
-  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
-    return value !== value && other !== other;
-  }
-  return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);
-}
-
-module.exports = baseIsEqual;
diff --git a/node_modules/lodash/internal/baseIsEqualDeep.js b/node_modules/lodash/internal/baseIsEqualDeep.js
deleted file mode 100644
index f1dbffe..0000000
--- a/node_modules/lodash/internal/baseIsEqualDeep.js
+++ /dev/null
@@ -1,102 +0,0 @@
-var equalArrays = require('./equalArrays'),
-    equalByTag = require('./equalByTag'),
-    equalObjects = require('./equalObjects'),
-    isArray = require('../lang/isArray'),
-    isTypedArray = require('../lang/isTypedArray');
-
-/** `Object#toString` result references. */
-var argsTag = '[object Arguments]',
-    arrayTag = '[object Array]',
-    objectTag = '[object Object]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * A specialized version of `baseIsEqual` for arrays and objects which performs
- * deep comparisons and tracks traversed objects enabling objects with circular
- * references to be compared.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Function} [customizer] The function to customize comparing objects.
- * @param {boolean} [isLoose] Specify performing partial comparisons.
- * @param {Array} [stackA=[]] Tracks traversed `value` objects.
- * @param {Array} [stackB=[]] Tracks traversed `other` objects.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
-function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
-  var objIsArr = isArray(object),
-      othIsArr = isArray(other),
-      objTag = arrayTag,
-      othTag = arrayTag;
-
-  if (!objIsArr) {
-    objTag = objToString.call(object);
-    if (objTag == argsTag) {
-      objTag = objectTag;
-    } else if (objTag != objectTag) {
-      objIsArr = isTypedArray(object);
-    }
-  }
-  if (!othIsArr) {
-    othTag = objToString.call(other);
-    if (othTag == argsTag) {
-      othTag = objectTag;
-    } else if (othTag != objectTag) {
-      othIsArr = isTypedArray(other);
-    }
-  }
-  var objIsObj = objTag == objectTag,
-      othIsObj = othTag == objectTag,
-      isSameTag = objTag == othTag;
-
-  if (isSameTag && !(objIsArr || objIsObj)) {
-    return equalByTag(object, other, objTag);
-  }
-  if (!isLoose) {
-    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
-        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
-
-    if (objIsWrapped || othIsWrapped) {
-      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
-    }
-  }
-  if (!isSameTag) {
-    return false;
-  }
-  // Assume cyclic values are equal.
-  // For more information on detecting circular references see https://es5.github.io/#JO.
-  stackA || (stackA = []);
-  stackB || (stackB = []);
-
-  var length = stackA.length;
-  while (length--) {
-    if (stackA[length] == object) {
-      return stackB[length] == other;
-    }
-  }
-  // Add `object` and `other` to the stack of traversed objects.
-  stackA.push(object);
-  stackB.push(other);
-
-  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);
-
-  stackA.pop();
-  stackB.pop();
-
-  return result;
-}
-
-module.exports = baseIsEqualDeep;
diff --git a/node_modules/lodash/internal/baseIsFunction.js b/node_modules/lodash/internal/baseIsFunction.js
deleted file mode 100644
index cd92db3..0000000
--- a/node_modules/lodash/internal/baseIsFunction.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * The base implementation of `_.isFunction` without support for environments
- * with incorrect `typeof` results.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- */
-function baseIsFunction(value) {
-  // Avoid a Chakra JIT bug in compatibility modes of IE 11.
-  // See https://github.com/jashkenas/underscore/issues/1621 for more details.
-  return typeof value == 'function' || false;
-}
-
-module.exports = baseIsFunction;
diff --git a/node_modules/lodash/internal/baseIsMatch.js b/node_modules/lodash/internal/baseIsMatch.js
deleted file mode 100644
index ea48bb6..0000000
--- a/node_modules/lodash/internal/baseIsMatch.js
+++ /dev/null
@@ -1,52 +0,0 @@
-var baseIsEqual = require('./baseIsEqual'),
-    toObject = require('./toObject');
-
-/**
- * The base implementation of `_.isMatch` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Object} object The object to inspect.
- * @param {Array} matchData The propery names, values, and compare flags to match.
- * @param {Function} [customizer] The function to customize comparing objects.
- * @returns {boolean} Returns `true` if `object` is a match, else `false`.
- */
-function baseIsMatch(object, matchData, customizer) {
-  var index = matchData.length,
-      length = index,
-      noCustomizer = !customizer;
-
-  if (object == null) {
-    return !length;
-  }
-  object = toObject(object);
-  while (index--) {
-    var data = matchData[index];
-    if ((noCustomizer && data[2])
-          ? data[1] !== object[data[0]]
-          : !(data[0] in object)
-        ) {
-      return false;
-    }
-  }
-  while (++index < length) {
-    data = matchData[index];
-    var key = data[0],
-        objValue = object[key],
-        srcValue = data[1];
-
-    if (noCustomizer && data[2]) {
-      if (objValue === undefined && !(key in object)) {
-        return false;
-      }
-    } else {
-      var result = customizer ? customizer(objValue, srcValue, key) : undefined;
-      if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
-module.exports = baseIsMatch;
diff --git a/node_modules/lodash/internal/baseLodash.js b/node_modules/lodash/internal/baseLodash.js
deleted file mode 100644
index 15b79d3..0000000
--- a/node_modules/lodash/internal/baseLodash.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * The function whose prototype all chaining wrappers inherit from.
- *
- * @private
- */
-function baseLodash() {
-  // No operation performed.
-}
-
-module.exports = baseLodash;
diff --git a/node_modules/lodash/internal/baseMap.js b/node_modules/lodash/internal/baseMap.js
deleted file mode 100644
index 2906b51..0000000
--- a/node_modules/lodash/internal/baseMap.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var baseEach = require('./baseEach'),
-    isArrayLike = require('./isArrayLike');
-
-/**
- * The base implementation of `_.map` without support for callback shorthands
- * and `this` binding.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns the new mapped array.
- */
-function baseMap(collection, iteratee) {
-  var index = -1,
-      result = isArrayLike(collection) ? Array(collection.length) : [];
-
-  baseEach(collection, function(value, key, collection) {
-    result[++index] = iteratee(value, key, collection);
-  });
-  return result;
-}
-
-module.exports = baseMap;
diff --git a/node_modules/lodash/internal/baseMatches.js b/node_modules/lodash/internal/baseMatches.js
deleted file mode 100644
index 5f76c67..0000000
--- a/node_modules/lodash/internal/baseMatches.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var baseIsMatch = require('./baseIsMatch'),
-    getMatchData = require('./getMatchData'),
-    toObject = require('./toObject');
-
-/**
- * The base implementation of `_.matches` which does not clone `source`.
- *
- * @private
- * @param {Object} source The object of property values to match.
- * @returns {Function} Returns the new function.
- */
-function baseMatches(source) {
-  var matchData = getMatchData(source);
-  if (matchData.length == 1 && matchData[0][2]) {
-    var key = matchData[0][0],
-        value = matchData[0][1];
-
-    return function(object) {
-      if (object == null) {
-        return false;
-      }
-      return object[key] === value && (value !== undefined || (key in toObject(object)));
-    };
-  }
-  return function(object) {
-    return baseIsMatch(object, matchData);
-  };
-}
-
-module.exports = baseMatches;
diff --git a/node_modules/lodash/internal/baseMatchesProperty.js b/node_modules/lodash/internal/baseMatchesProperty.js
deleted file mode 100644
index 8f9005c..0000000
--- a/node_modules/lodash/internal/baseMatchesProperty.js
+++ /dev/null
@@ -1,45 +0,0 @@
-var baseGet = require('./baseGet'),
-    baseIsEqual = require('./baseIsEqual'),
-    baseSlice = require('./baseSlice'),
-    isArray = require('../lang/isArray'),
-    isKey = require('./isKey'),
-    isStrictComparable = require('./isStrictComparable'),
-    last = require('../array/last'),
-    toObject = require('./toObject'),
-    toPath = require('./toPath');
-
-/**
- * The base implementation of `_.matchesProperty` which does not clone `srcValue`.
- *
- * @private
- * @param {string} path The path of the property to get.
- * @param {*} srcValue The value to compare.
- * @returns {Function} Returns the new function.
- */
-function baseMatchesProperty(path, srcValue) {
-  var isArr = isArray(path),
-      isCommon = isKey(path) && isStrictComparable(srcValue),
-      pathKey = (path + '');
-
-  path = toPath(path);
-  return function(object) {
-    if (object == null) {
-      return false;
-    }
-    var key = pathKey;
-    object = toObject(object);
-    if ((isArr || !isCommon) && !(key in object)) {
-      object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
-      if (object == null) {
-        return false;
-      }
-      key = last(path);
-      object = toObject(object);
-    }
-    return object[key] === srcValue
-      ? (srcValue !== undefined || (key in object))
-      : baseIsEqual(srcValue, object[key], undefined, true);
-  };
-}
-
-module.exports = baseMatchesProperty;
diff --git a/node_modules/lodash/internal/baseMerge.js b/node_modules/lodash/internal/baseMerge.js
deleted file mode 100644
index ab81900..0000000
--- a/node_modules/lodash/internal/baseMerge.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var arrayEach = require('./arrayEach'),
-    baseMergeDeep = require('./baseMergeDeep'),
-    isArray = require('../lang/isArray'),
-    isArrayLike = require('./isArrayLike'),
-    isObject = require('../lang/isObject'),
-    isObjectLike = require('./isObjectLike'),
-    isTypedArray = require('../lang/isTypedArray'),
-    keys = require('../object/keys');
-
-/**
- * The base implementation of `_.merge` without support for argument juggling,
- * multiple sources, and `this` binding `customizer` functions.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @param {Function} [customizer] The function to customize merged values.
- * @param {Array} [stackA=[]] Tracks traversed source objects.
- * @param {Array} [stackB=[]] Associates values with source counterparts.
- * @returns {Object} Returns `object`.
- */
-function baseMerge(object, source, customizer, stackA, stackB) {
-  if (!isObject(object)) {
-    return object;
-  }
-  var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
-      props = isSrcArr ? undefined : keys(source);
-
-  arrayEach(props || source, function(srcValue, key) {
-    if (props) {
-      key = srcValue;
-      srcValue = source[key];
-    }
-    if (isObjectLike(srcValue)) {
-      stackA || (stackA = []);
-      stackB || (stackB = []);
-      baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
-    }
-    else {
-      var value = object[key],
-          result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
-          isCommon = result === undefined;
-
-      if (isCommon) {
-        result = srcValue;
-      }
-      if ((result !== undefined || (isSrcArr && !(key in object))) &&
-          (isCommon || (result === result ? (result !== value) : (value === value)))) {
-        object[key] = result;
-      }
-    }
-  });
-  return object;
-}
-
-module.exports = baseMerge;
diff --git a/node_modules/lodash/internal/baseMergeDeep.js b/node_modules/lodash/internal/baseMergeDeep.js
deleted file mode 100644
index f8aeac5..0000000
--- a/node_modules/lodash/internal/baseMergeDeep.js
+++ /dev/null
@@ -1,67 +0,0 @@
-var arrayCopy = require('./arrayCopy'),
-    isArguments = require('../lang/isArguments'),
-    isArray = require('../lang/isArray'),
-    isArrayLike = require('./isArrayLike'),
-    isPlainObject = require('../lang/isPlainObject'),
-    isTypedArray = require('../lang/isTypedArray'),
-    toPlainObject = require('../lang/toPlainObject');
-
-/**
- * A specialized version of `baseMerge` for arrays and objects which performs
- * deep merges and tracks traversed objects enabling objects with circular
- * references to be merged.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @param {string} key The key of the value to merge.
- * @param {Function} mergeFunc The function to merge values.
- * @param {Function} [customizer] The function to customize merged values.
- * @param {Array} [stackA=[]] Tracks traversed source objects.
- * @param {Array} [stackB=[]] Associates values with source counterparts.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
-function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {
-  var length = stackA.length,
-      srcValue = source[key];
-
-  while (length--) {
-    if (stackA[length] == srcValue) {
-      object[key] = stackB[length];
-      return;
-    }
-  }
-  var value = object[key],
-      result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
-      isCommon = result === undefined;
-
-  if (isCommon) {
-    result = srcValue;
-    if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {
-      result = isArray(value)
-        ? value
-        : (isArrayLike(value) ? arrayCopy(value) : []);
-    }
-    else if (isPlainObject(srcValue) || isArguments(srcValue)) {
-      result = isArguments(value)
-        ? toPlainObject(value)
-        : (isPlainObject(value) ? value : {});
-    }
-    else {
-      isCommon = false;
-    }
-  }
-  // Add the source value to the stack of traversed objects and associate
-  // it with its merged value.
-  stackA.push(srcValue);
-  stackB.push(result);
-
-  if (isCommon) {
-    // Recursively merge objects and arrays (susceptible to call stack limits).
-    object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);
-  } else if (result === result ? (result !== value) : (value === value)) {
-    object[key] = result;
-  }
-}
-
-module.exports = baseMergeDeep;
diff --git a/node_modules/lodash/internal/baseProperty.js b/node_modules/lodash/internal/baseProperty.js
deleted file mode 100644
index e515941..0000000
--- a/node_modules/lodash/internal/baseProperty.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * The base implementation of `_.property` without support for deep paths.
- *
- * @private
- * @param {string} key The key of the property to get.
- * @returns {Function} Returns the new function.
- */
-function baseProperty(key) {
-  return function(object) {
-    return object == null ? undefined : object[key];
-  };
-}
-
-module.exports = baseProperty;
diff --git a/node_modules/lodash/internal/basePropertyDeep.js b/node_modules/lodash/internal/basePropertyDeep.js
deleted file mode 100644
index 1b6ce40..0000000
--- a/node_modules/lodash/internal/basePropertyDeep.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var baseGet = require('./baseGet'),
-    toPath = require('./toPath');
-
-/**
- * A specialized version of `baseProperty` which supports deep paths.
- *
- * @private
- * @param {Array|string} path The path of the property to get.
- * @returns {Function} Returns the new function.
- */
-function basePropertyDeep(path) {
-  var pathKey = (path + '');
-  path = toPath(path);
-  return function(object) {
-    return baseGet(object, path, pathKey);
-  };
-}
-
-module.exports = basePropertyDeep;
diff --git a/node_modules/lodash/internal/basePullAt.js b/node_modules/lodash/internal/basePullAt.js
deleted file mode 100644
index 6c4ff84..0000000
--- a/node_modules/lodash/internal/basePullAt.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var isIndex = require('./isIndex');
-
-/** Used for native method references. */
-var arrayProto = Array.prototype;
-
-/** Native method references. */
-var splice = arrayProto.splice;
-
-/**
- * The base implementation of `_.pullAt` without support for individual
- * index arguments and capturing the removed elements.
- *
- * @private
- * @param {Array} array The array to modify.
- * @param {number[]} indexes The indexes of elements to remove.
- * @returns {Array} Returns `array`.
- */
-function basePullAt(array, indexes) {
-  var length = array ? indexes.length : 0;
-  while (length--) {
-    var index = indexes[length];
-    if (index != previous && isIndex(index)) {
-      var previous = index;
-      splice.call(array, index, 1);
-    }
-  }
-  return array;
-}
-
-module.exports = basePullAt;
diff --git a/node_modules/lodash/internal/baseRandom.js b/node_modules/lodash/internal/baseRandom.js
deleted file mode 100644
index fa3326c..0000000
--- a/node_modules/lodash/internal/baseRandom.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeFloor = Math.floor,
-    nativeRandom = Math.random;
-
-/**
- * The base implementation of `_.random` without support for argument juggling
- * and returning floating-point numbers.
- *
- * @private
- * @param {number} min The minimum possible value.
- * @param {number} max The maximum possible value.
- * @returns {number} Returns the random number.
- */
-function baseRandom(min, max) {
-  return min + nativeFloor(nativeRandom() * (max - min + 1));
-}
-
-module.exports = baseRandom;
diff --git a/node_modules/lodash/internal/baseReduce.js b/node_modules/lodash/internal/baseReduce.js
deleted file mode 100644
index 5e6ae55..0000000
--- a/node_modules/lodash/internal/baseReduce.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * The base implementation of `_.reduce` and `_.reduceRight` without support
- * for callback shorthands and `this` binding, which iterates over `collection`
- * using the provided `eachFunc`.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {*} accumulator The initial value.
- * @param {boolean} initFromCollection Specify using the first or last element
- *  of `collection` as the initial value.
- * @param {Function} eachFunc The function to iterate over `collection`.
- * @returns {*} Returns the accumulated value.
- */
-function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {
-  eachFunc(collection, function(value, index, collection) {
-    accumulator = initFromCollection
-      ? (initFromCollection = false, value)
-      : iteratee(accumulator, value, index, collection);
-  });
-  return accumulator;
-}
-
-module.exports = baseReduce;
diff --git a/node_modules/lodash/internal/baseSetData.js b/node_modules/lodash/internal/baseSetData.js
deleted file mode 100644
index 5c98622..0000000
--- a/node_modules/lodash/internal/baseSetData.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var identity = require('../utility/identity'),
-    metaMap = require('./metaMap');
-
-/**
- * The base implementation of `setData` without support for hot loop detection.
- *
- * @private
- * @param {Function} func The function to associate metadata with.
- * @param {*} data The metadata.
- * @returns {Function} Returns `func`.
- */
-var baseSetData = !metaMap ? identity : function(func, data) {
-  metaMap.set(func, data);
-  return func;
-};
-
-module.exports = baseSetData;
diff --git a/node_modules/lodash/internal/baseSlice.js b/node_modules/lodash/internal/baseSlice.js
deleted file mode 100644
index 9d1012e..0000000
--- a/node_modules/lodash/internal/baseSlice.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * The base implementation of `_.slice` without an iteratee call guard.
- *
- * @private
- * @param {Array} array The array to slice.
- * @param {number} [start=0] The start position.
- * @param {number} [end=array.length] The end position.
- * @returns {Array} Returns the slice of `array`.
- */
-function baseSlice(array, start, end) {
-  var index = -1,
-      length = array.length;
-
-  start = start == null ? 0 : (+start || 0);
-  if (start < 0) {
-    start = -start > length ? 0 : (length + start);
-  }
-  end = (end === undefined || end > length) ? length : (+end || 0);
-  if (end < 0) {
-    end += length;
-  }
-  length = start > end ? 0 : ((end - start) >>> 0);
-  start >>>= 0;
-
-  var result = Array(length);
-  while (++index < length) {
-    result[index] = array[index + start];
-  }
-  return result;
-}
-
-module.exports = baseSlice;
diff --git a/node_modules/lodash/internal/baseSome.js b/node_modules/lodash/internal/baseSome.js
deleted file mode 100644
index 39a0058..0000000
--- a/node_modules/lodash/internal/baseSome.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var baseEach = require('./baseEach');
-
-/**
- * The base implementation of `_.some` without support for callback shorthands
- * and `this` binding.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {boolean} Returns `true` if any element passes the predicate check,
- *  else `false`.
- */
-function baseSome(collection, predicate) {
-  var result;
-
-  baseEach(collection, function(value, index, collection) {
-    result = predicate(value, index, collection);
-    return !result;
-  });
-  return !!result;
-}
-
-module.exports = baseSome;
diff --git a/node_modules/lodash/internal/baseSortBy.js b/node_modules/lodash/internal/baseSortBy.js
deleted file mode 100644
index fec0afe..0000000
--- a/node_modules/lodash/internal/baseSortBy.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * The base implementation of `_.sortBy` which uses `comparer` to define
- * the sort order of `array` and replaces criteria objects with their
- * corresponding values.
- *
- * @private
- * @param {Array} array The array to sort.
- * @param {Function} comparer The function to define sort order.
- * @returns {Array} Returns `array`.
- */
-function baseSortBy(array, comparer) {
-  var length = array.length;
-
-  array.sort(comparer);
-  while (length--) {
-    array[length] = array[length].value;
-  }
-  return array;
-}
-
-module.exports = baseSortBy;
diff --git a/node_modules/lodash/internal/baseSortByOrder.js b/node_modules/lodash/internal/baseSortByOrder.js
deleted file mode 100644
index 0a9ef20..0000000
--- a/node_modules/lodash/internal/baseSortByOrder.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var arrayMap = require('./arrayMap'),
-    baseCallback = require('./baseCallback'),
-    baseMap = require('./baseMap'),
-    baseSortBy = require('./baseSortBy'),
-    compareMultiple = require('./compareMultiple');
-
-/**
- * The base implementation of `_.sortByOrder` without param guards.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
- * @param {boolean[]} orders The sort orders of `iteratees`.
- * @returns {Array} Returns the new sorted array.
- */
-function baseSortByOrder(collection, iteratees, orders) {
-  var index = -1;
-
-  iteratees = arrayMap(iteratees, function(iteratee) { return baseCallback(iteratee); });
-
-  var result = baseMap(collection, function(value) {
-    var criteria = arrayMap(iteratees, function(iteratee) { return iteratee(value); });
-    return { 'criteria': criteria, 'index': ++index, 'value': value };
-  });
-
-  return baseSortBy(result, function(object, other) {
-    return compareMultiple(object, other, orders);
-  });
-}
-
-module.exports = baseSortByOrder;
diff --git a/node_modules/lodash/internal/baseSum.js b/node_modules/lodash/internal/baseSum.js
deleted file mode 100644
index 019e5ae..0000000
--- a/node_modules/lodash/internal/baseSum.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var baseEach = require('./baseEach');
-
-/**
- * The base implementation of `_.sum` without support for callback shorthands
- * and `this` binding.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {number} Returns the sum.
- */
-function baseSum(collection, iteratee) {
-  var result = 0;
-  baseEach(collection, function(value, index, collection) {
-    result += +iteratee(value, index, collection) || 0;
-  });
-  return result;
-}
-
-module.exports = baseSum;
diff --git a/node_modules/lodash/internal/baseToString.js b/node_modules/lodash/internal/baseToString.js
deleted file mode 100644
index b802640..0000000
--- a/node_modules/lodash/internal/baseToString.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * Converts `value` to a string if it's not one. An empty string is returned
- * for `null` or `undefined` values.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- */
-function baseToString(value) {
-  return value == null ? '' : (value + '');
-}
-
-module.exports = baseToString;
diff --git a/node_modules/lodash/internal/baseUniq.js b/node_modules/lodash/internal/baseUniq.js
deleted file mode 100644
index a043443..0000000
--- a/node_modules/lodash/internal/baseUniq.js
+++ /dev/null
@@ -1,60 +0,0 @@
-var baseIndexOf = require('./baseIndexOf'),
-    cacheIndexOf = require('./cacheIndexOf'),
-    createCache = require('./createCache');
-
-/** Used as the size to enable large array optimizations. */
-var LARGE_ARRAY_SIZE = 200;
-
-/**
- * The base implementation of `_.uniq` without support for callback shorthands
- * and `this` binding.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {Function} [iteratee] The function invoked per iteration.
- * @returns {Array} Returns the new duplicate free array.
- */
-function baseUniq(array, iteratee) {
-  var index = -1,
-      indexOf = baseIndexOf,
-      length = array.length,
-      isCommon = true,
-      isLarge = isCommon && length >= LARGE_ARRAY_SIZE,
-      seen = isLarge ? createCache() : null,
-      result = [];
-
-  if (seen) {
-    indexOf = cacheIndexOf;
-    isCommon = false;
-  } else {
-    isLarge = false;
-    seen = iteratee ? [] : result;
-  }
-  outer:
-  while (++index < length) {
-    var value = array[index],
-        computed = iteratee ? iteratee(value, index, array) : value;
-
-    if (isCommon && value === value) {
-      var seenIndex = seen.length;
-      while (seenIndex--) {
-        if (seen[seenIndex] === computed) {
-          continue outer;
-        }
-      }
-      if (iteratee) {
-        seen.push(computed);
-      }
-      result.push(value);
-    }
-    else if (indexOf(seen, computed, 0) < 0) {
-      if (iteratee || isLarge) {
-        seen.push(computed);
-      }
-      result.push(value);
-    }
-  }
-  return result;
-}
-
-module.exports = baseUniq;
diff --git a/node_modules/lodash/internal/baseValues.js b/node_modules/lodash/internal/baseValues.js
deleted file mode 100644
index e8d3ac7..0000000
--- a/node_modules/lodash/internal/baseValues.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * The base implementation of `_.values` and `_.valuesIn` which creates an
- * array of `object` property values corresponding to the property names
- * of `props`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array} props The property names to get values for.
- * @returns {Object} Returns the array of property values.
- */
-function baseValues(object, props) {
-  var index = -1,
-      length = props.length,
-      result = Array(length);
-
-  while (++index < length) {
-    result[index] = object[props[index]];
-  }
-  return result;
-}
-
-module.exports = baseValues;
diff --git a/node_modules/lodash/internal/baseWhile.js b/node_modules/lodash/internal/baseWhile.js
deleted file mode 100644
index c24e9bd..0000000
--- a/node_modules/lodash/internal/baseWhile.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var baseSlice = require('./baseSlice');
-
-/**
- * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`,
- * and `_.takeWhile` without support for callback shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to query.
- * @param {Function} predicate The function invoked per iteration.
- * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Array} Returns the slice of `array`.
- */
-function baseWhile(array, predicate, isDrop, fromRight) {
-  var length = array.length,
-      index = fromRight ? length : -1;
-
-  while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}
-  return isDrop
-    ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
-    : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
-}
-
-module.exports = baseWhile;
diff --git a/node_modules/lodash/internal/baseWrapperValue.js b/node_modules/lodash/internal/baseWrapperValue.js
deleted file mode 100644
index 629c01f..0000000
--- a/node_modules/lodash/internal/baseWrapperValue.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var LazyWrapper = require('./LazyWrapper'),
-    arrayPush = require('./arrayPush');
-
-/**
- * The base implementation of `wrapperValue` which returns the result of
- * performing a sequence of actions on the unwrapped `value`, where each
- * successive action is supplied the return value of the previous.
- *
- * @private
- * @param {*} value The unwrapped value.
- * @param {Array} actions Actions to peform to resolve the unwrapped value.
- * @returns {*} Returns the resolved value.
- */
-function baseWrapperValue(value, actions) {
-  var result = value;
-  if (result instanceof LazyWrapper) {
-    result = result.value();
-  }
-  var index = -1,
-      length = actions.length;
-
-  while (++index < length) {
-    var action = actions[index];
-    result = action.func.apply(action.thisArg, arrayPush([result], action.args));
-  }
-  return result;
-}
-
-module.exports = baseWrapperValue;
diff --git a/node_modules/lodash/internal/binaryIndex.js b/node_modules/lodash/internal/binaryIndex.js
deleted file mode 100644
index af419a2..0000000
--- a/node_modules/lodash/internal/binaryIndex.js
+++ /dev/null
@@ -1,39 +0,0 @@
-var binaryIndexBy = require('./binaryIndexBy'),
-    identity = require('../utility/identity');
-
-/** Used as references for the maximum length and index of an array. */
-var MAX_ARRAY_LENGTH = 4294967295,
-    HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
-
-/**
- * Performs a binary search of `array` to determine the index at which `value`
- * should be inserted into `array` in order to maintain its sort order.
- *
- * @private
- * @param {Array} array The sorted array to inspect.
- * @param {*} value The value to evaluate.
- * @param {boolean} [retHighest] Specify returning the highest qualified index.
- * @returns {number} Returns the index at which `value` should be inserted
- *  into `array`.
- */
-function binaryIndex(array, value, retHighest) {
-  var low = 0,
-      high = array ? array.length : low;
-
-  if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
-    while (low < high) {
-      var mid = (low + high) >>> 1,
-          computed = array[mid];
-
-      if ((retHighest ? (computed <= value) : (computed < value)) && computed !== null) {
-        low = mid + 1;
-      } else {
-        high = mid;
-      }
-    }
-    return high;
-  }
-  return binaryIndexBy(array, value, identity, retHighest);
-}
-
-module.exports = binaryIndex;
diff --git a/node_modules/lodash/internal/binaryIndexBy.js b/node_modules/lodash/internal/binaryIndexBy.js
deleted file mode 100644
index 767cbd2..0000000
--- a/node_modules/lodash/internal/binaryIndexBy.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeFloor = Math.floor,
-    nativeMin = Math.min;
-
-/** Used as references for the maximum length and index of an array. */
-var MAX_ARRAY_LENGTH = 4294967295,
-    MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1;
-
-/**
- * This function is like `binaryIndex` except that it invokes `iteratee` for
- * `value` and each element of `array` to compute their sort ranking. The
- * iteratee is invoked with one argument; (value).
- *
- * @private
- * @param {Array} array The sorted array to inspect.
- * @param {*} value The value to evaluate.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {boolean} [retHighest] Specify returning the highest qualified index.
- * @returns {number} Returns the index at which `value` should be inserted
- *  into `array`.
- */
-function binaryIndexBy(array, value, iteratee, retHighest) {
-  value = iteratee(value);
-
-  var low = 0,
-      high = array ? array.length : 0,
-      valIsNaN = value !== value,
-      valIsNull = value === null,
-      valIsUndef = value === undefined;
-
-  while (low < high) {
-    var mid = nativeFloor((low + high) / 2),
-        computed = iteratee(array[mid]),
-        isDef = computed !== undefined,
-        isReflexive = computed === computed;
-
-    if (valIsNaN) {
-      var setLow = isReflexive || retHighest;
-    } else if (valIsNull) {
-      setLow = isReflexive && isDef && (retHighest || computed != null);
-    } else if (valIsUndef) {
-      setLow = isReflexive && (retHighest || isDef);
-    } else if (computed == null) {
-      setLow = false;
-    } else {
-      setLow = retHighest ? (computed <= value) : (computed < value);
-    }
-    if (setLow) {
-      low = mid + 1;
-    } else {
-      high = mid;
-    }
-  }
-  return nativeMin(high, MAX_ARRAY_INDEX);
-}
-
-module.exports = binaryIndexBy;
diff --git a/node_modules/lodash/internal/bindCallback.js b/node_modules/lodash/internal/bindCallback.js
deleted file mode 100644
index cdc7f49..0000000
--- a/node_modules/lodash/internal/bindCallback.js
+++ /dev/null
@@ -1,39 +0,0 @@
-var identity = require('../utility/identity');
-
-/**
- * A specialized version of `baseCallback` which only supports `this` binding
- * and specifying the number of arguments to provide to `func`.
- *
- * @private
- * @param {Function} func The function to bind.
- * @param {*} thisArg The `this` binding of `func`.
- * @param {number} [argCount] The number of arguments to provide to `func`.
- * @returns {Function} Returns the callback.
- */
-function bindCallback(func, thisArg, argCount) {
-  if (typeof func != 'function') {
-    return identity;
-  }
-  if (thisArg === undefined) {
-    return func;
-  }
-  switch (argCount) {
-    case 1: return function(value) {
-      return func.call(thisArg, value);
-    };
-    case 3: return function(value, index, collection) {
-      return func.call(thisArg, value, index, collection);
-    };
-    case 4: return function(accumulator, value, index, collection) {
-      return func.call(thisArg, accumulator, value, index, collection);
-    };
-    case 5: return function(value, other, key, object, source) {
-      return func.call(thisArg, value, other, key, object, source);
-    };
-  }
-  return function() {
-    return func.apply(thisArg, arguments);
-  };
-}
-
-module.exports = bindCallback;
diff --git a/node_modules/lodash/internal/bufferClone.js b/node_modules/lodash/internal/bufferClone.js
deleted file mode 100644
index f3c12b8..0000000
--- a/node_modules/lodash/internal/bufferClone.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/** Native method references. */
-var ArrayBuffer = global.ArrayBuffer,
-    Uint8Array = global.Uint8Array;
-
-/**
- * Creates a clone of the given array buffer.
- *
- * @private
- * @param {ArrayBuffer} buffer The array buffer to clone.
- * @returns {ArrayBuffer} Returns the cloned array buffer.
- */
-function bufferClone(buffer) {
-  var result = new ArrayBuffer(buffer.byteLength),
-      view = new Uint8Array(result);
-
-  view.set(new Uint8Array(buffer));
-  return result;
-}
-
-module.exports = bufferClone;
diff --git a/node_modules/lodash/internal/cacheIndexOf.js b/node_modules/lodash/internal/cacheIndexOf.js
deleted file mode 100644
index 09f698a..0000000
--- a/node_modules/lodash/internal/cacheIndexOf.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var isObject = require('../lang/isObject');
-
-/**
- * Checks if `value` is in `cache` mimicking the return signature of
- * `_.indexOf` by returning `0` if the value is found, else `-1`.
- *
- * @private
- * @param {Object} cache The cache to search.
- * @param {*} value The value to search for.
- * @returns {number} Returns `0` if `value` is found, else `-1`.
- */
-function cacheIndexOf(cache, value) {
-  var data = cache.data,
-      result = (typeof value == 'string' || isObject(value)) ? data.set.has(value) : data.hash[value];
-
-  return result ? 0 : -1;
-}
-
-module.exports = cacheIndexOf;
diff --git a/node_modules/lodash/internal/cachePush.js b/node_modules/lodash/internal/cachePush.js
deleted file mode 100644
index ba03a15..0000000
--- a/node_modules/lodash/internal/cachePush.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var isObject = require('../lang/isObject');
-
-/**
- * Adds `value` to the cache.
- *
- * @private
- * @name push
- * @memberOf SetCache
- * @param {*} value The value to cache.
- */
-function cachePush(value) {
-  var data = this.data;
-  if (typeof value == 'string' || isObject(value)) {
-    data.set.add(value);
-  } else {
-    data.hash[value] = true;
-  }
-}
-
-module.exports = cachePush;
diff --git a/node_modules/lodash/internal/charsLeftIndex.js b/node_modules/lodash/internal/charsLeftIndex.js
deleted file mode 100644
index a6d1d81..0000000
--- a/node_modules/lodash/internal/charsLeftIndex.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Used by `_.trim` and `_.trimLeft` to get the index of the first character
- * of `string` that is not found in `chars`.
- *
- * @private
- * @param {string} string The string to inspect.
- * @param {string} chars The characters to find.
- * @returns {number} Returns the index of the first character not found in `chars`.
- */
-function charsLeftIndex(string, chars) {
-  var index = -1,
-      length = string.length;
-
-  while (++index < length && chars.indexOf(string.charAt(index)) > -1) {}
-  return index;
-}
-
-module.exports = charsLeftIndex;
diff --git a/node_modules/lodash/internal/charsRightIndex.js b/node_modules/lodash/internal/charsRightIndex.js
deleted file mode 100644
index 1251dcb..0000000
--- a/node_modules/lodash/internal/charsRightIndex.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Used by `_.trim` and `_.trimRight` to get the index of the last character
- * of `string` that is not found in `chars`.
- *
- * @private
- * @param {string} string The string to inspect.
- * @param {string} chars The characters to find.
- * @returns {number} Returns the index of the last character not found in `chars`.
- */
-function charsRightIndex(string, chars) {
-  var index = string.length;
-
-  while (index-- && chars.indexOf(string.charAt(index)) > -1) {}
-  return index;
-}
-
-module.exports = charsRightIndex;
diff --git a/node_modules/lodash/internal/compareAscending.js b/node_modules/lodash/internal/compareAscending.js
deleted file mode 100644
index f17b117..0000000
--- a/node_modules/lodash/internal/compareAscending.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var baseCompareAscending = require('./baseCompareAscending');
-
-/**
- * Used by `_.sortBy` to compare transformed elements of a collection and stable
- * sort them in ascending order.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @returns {number} Returns the sort order indicator for `object`.
- */
-function compareAscending(object, other) {
-  return baseCompareAscending(object.criteria, other.criteria) || (object.index - other.index);
-}
-
-module.exports = compareAscending;
diff --git a/node_modules/lodash/internal/compareMultiple.js b/node_modules/lodash/internal/compareMultiple.js
deleted file mode 100644
index b2139f7..0000000
--- a/node_modules/lodash/internal/compareMultiple.js
+++ /dev/null
@@ -1,44 +0,0 @@
-var baseCompareAscending = require('./baseCompareAscending');
-
-/**
- * Used by `_.sortByOrder` to compare multiple properties of a value to another
- * and stable sort them.
- *
- * If `orders` is unspecified, all valuess are sorted in ascending order. Otherwise,
- * a value is sorted in ascending order if its corresponding order is "asc", and
- * descending if "desc".
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {boolean[]} orders The order to sort by for each property.
- * @returns {number} Returns the sort order indicator for `object`.
- */
-function compareMultiple(object, other, orders) {
-  var index = -1,
-      objCriteria = object.criteria,
-      othCriteria = other.criteria,
-      length = objCriteria.length,
-      ordersLength = orders.length;
-
-  while (++index < length) {
-    var result = baseCompareAscending(objCriteria[index], othCriteria[index]);
-    if (result) {
-      if (index >= ordersLength) {
-        return result;
-      }
-      var order = orders[index];
-      return result * ((order === 'asc' || order === true) ? 1 : -1);
-    }
-  }
-  // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
-  // that causes it, under certain circumstances, to provide the same value for
-  // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
-  // for more details.
-  //
-  // This also ensures a stable sort in V8 and other engines.
-  // See https://code.google.com/p/v8/issues/detail?id=90 for more details.
-  return object.index - other.index;
-}
-
-module.exports = compareMultiple;
diff --git a/node_modules/lodash/internal/composeArgs.js b/node_modules/lodash/internal/composeArgs.js
deleted file mode 100644
index cd5a2fe..0000000
--- a/node_modules/lodash/internal/composeArgs.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
-
-/**
- * Creates an array that is the composition of partially applied arguments,
- * placeholders, and provided arguments into a single array of arguments.
- *
- * @private
- * @param {Array|Object} args The provided arguments.
- * @param {Array} partials The arguments to prepend to those provided.
- * @param {Array} holders The `partials` placeholder indexes.
- * @returns {Array} Returns the new array of composed arguments.
- */
-function composeArgs(args, partials, holders) {
-  var holdersLength = holders.length,
-      argsIndex = -1,
-      argsLength = nativeMax(args.length - holdersLength, 0),
-      leftIndex = -1,
-      leftLength = partials.length,
-      result = Array(leftLength + argsLength);
-
-  while (++leftIndex < leftLength) {
-    result[leftIndex] = partials[leftIndex];
-  }
-  while (++argsIndex < holdersLength) {
-    result[holders[argsIndex]] = args[argsIndex];
-  }
-  while (argsLength--) {
-    result[leftIndex++] = args[argsIndex++];
-  }
-  return result;
-}
-
-module.exports = composeArgs;
diff --git a/node_modules/lodash/internal/composeArgsRight.js b/node_modules/lodash/internal/composeArgsRight.js
deleted file mode 100644
index 38ab139..0000000
--- a/node_modules/lodash/internal/composeArgsRight.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
-
-/**
- * This function is like `composeArgs` except that the arguments composition
- * is tailored for `_.partialRight`.
- *
- * @private
- * @param {Array|Object} args The provided arguments.
- * @param {Array} partials The arguments to append to those provided.
- * @param {Array} holders The `partials` placeholder indexes.
- * @returns {Array} Returns the new array of composed arguments.
- */
-function composeArgsRight(args, partials, holders) {
-  var holdersIndex = -1,
-      holdersLength = holders.length,
-      argsIndex = -1,
-      argsLength = nativeMax(args.length - holdersLength, 0),
-      rightIndex = -1,
-      rightLength = partials.length,
-      result = Array(argsLength + rightLength);
-
-  while (++argsIndex < argsLength) {
-    result[argsIndex] = args[argsIndex];
-  }
-  var offset = argsIndex;
-  while (++rightIndex < rightLength) {
-    result[offset + rightIndex] = partials[rightIndex];
-  }
-  while (++holdersIndex < holdersLength) {
-    result[offset + holders[holdersIndex]] = args[argsIndex++];
-  }
-  return result;
-}
-
-module.exports = composeArgsRight;
diff --git a/node_modules/lodash/internal/createAggregator.js b/node_modules/lodash/internal/createAggregator.js
deleted file mode 100644
index c3d3cec..0000000
--- a/node_modules/lodash/internal/createAggregator.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var baseCallback = require('./baseCallback'),
-    baseEach = require('./baseEach'),
-    isArray = require('../lang/isArray');
-
-/**
- * Creates a `_.countBy`, `_.groupBy`, `_.indexBy`, or `_.partition` function.
- *
- * @private
- * @param {Function} setter The function to set keys and values of the accumulator object.
- * @param {Function} [initializer] The function to initialize the accumulator object.
- * @returns {Function} Returns the new aggregator function.
- */
-function createAggregator(setter, initializer) {
-  return function(collection, iteratee, thisArg) {
-    var result = initializer ? initializer() : {};
-    iteratee = baseCallback(iteratee, thisArg, 3);
-
-    if (isArray(collection)) {
-      var index = -1,
-          length = collection.length;
-
-      while (++index < length) {
-        var value = collection[index];
-        setter(result, value, iteratee(value, index, collection), collection);
-      }
-    } else {
-      baseEach(collection, function(value, key, collection) {
-        setter(result, value, iteratee(value, key, collection), collection);
-      });
-    }
-    return result;
-  };
-}
-
-module.exports = createAggregator;
diff --git a/node_modules/lodash/internal/createAssigner.js b/node_modules/lodash/internal/createAssigner.js
deleted file mode 100644
index ea5a5a4..0000000
--- a/node_modules/lodash/internal/createAssigner.js
+++ /dev/null
@@ -1,41 +0,0 @@
-var bindCallback = require('./bindCallback'),
-    isIterateeCall = require('./isIterateeCall'),
-    restParam = require('../function/restParam');
-
-/**
- * Creates a `_.assign`, `_.defaults`, or `_.merge` function.
- *
- * @private
- * @param {Function} assigner The function to assign values.
- * @returns {Function} Returns the new assigner function.
- */
-function createAssigner(assigner) {
-  return restParam(function(object, sources) {
-    var index = -1,
-        length = object == null ? 0 : sources.length,
-        customizer = length > 2 ? sources[length - 2] : undefined,
-        guard = length > 2 ? sources[2] : undefined,
-        thisArg = length > 1 ? sources[length - 1] : undefined;
-
-    if (typeof customizer == 'function') {
-      customizer = bindCallback(customizer, thisArg, 5);
-      length -= 2;
-    } else {
-      customizer = typeof thisArg == 'function' ? thisArg : undefined;
-      length -= (customizer ? 1 : 0);
-    }
-    if (guard && isIterateeCall(sources[0], sources[1], guard)) {
-      customizer = length < 3 ? undefined : customizer;
-      length = 1;
-    }
-    while (++index < length) {
-      var source = sources[index];
-      if (source) {
-        assigner(object, source, customizer);
-      }
-    }
-    return object;
-  });
-}
-
-module.exports = createAssigner;
diff --git a/node_modules/lodash/internal/createBaseEach.js b/node_modules/lodash/internal/createBaseEach.js
deleted file mode 100644
index b55c39b..0000000
--- a/node_modules/lodash/internal/createBaseEach.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var getLength = require('./getLength'),
-    isLength = require('./isLength'),
-    toObject = require('./toObject');
-
-/**
- * Creates a `baseEach` or `baseEachRight` function.
- *
- * @private
- * @param {Function} eachFunc The function to iterate over a collection.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new base function.
- */
-function createBaseEach(eachFunc, fromRight) {
-  return function(collection, iteratee) {
-    var length = collection ? getLength(collection) : 0;
-    if (!isLength(length)) {
-      return eachFunc(collection, iteratee);
-    }
-    var index = fromRight ? length : -1,
-        iterable = toObject(collection);
-
-    while ((fromRight ? index-- : ++index < length)) {
-      if (iteratee(iterable[index], index, iterable) === false) {
-        break;
-      }
-    }
-    return collection;
-  };
-}
-
-module.exports = createBaseEach;
diff --git a/node_modules/lodash/internal/createBaseFor.js b/node_modules/lodash/internal/createBaseFor.js
deleted file mode 100644
index 3c2cac5..0000000
--- a/node_modules/lodash/internal/createBaseFor.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var toObject = require('./toObject');
-
-/**
- * Creates a base function for `_.forIn` or `_.forInRight`.
- *
- * @private
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new base function.
- */
-function createBaseFor(fromRight) {
-  return function(object, iteratee, keysFunc) {
-    var iterable = toObject(object),
-        props = keysFunc(object),
-        length = props.length,
-        index = fromRight ? length : -1;
-
-    while ((fromRight ? index-- : ++index < length)) {
-      var key = props[index];
-      if (iteratee(iterable[key], key, iterable) === false) {
-        break;
-      }
-    }
-    return object;
-  };
-}
-
-module.exports = createBaseFor;
diff --git a/node_modules/lodash/internal/createBindWrapper.js b/node_modules/lodash/internal/createBindWrapper.js
deleted file mode 100644
index 54086ee..0000000
--- a/node_modules/lodash/internal/createBindWrapper.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var createCtorWrapper = require('./createCtorWrapper');
-
-/**
- * Creates a function that wraps `func` and invokes it with the `this`
- * binding of `thisArg`.
- *
- * @private
- * @param {Function} func The function to bind.
- * @param {*} [thisArg] The `this` binding of `func`.
- * @returns {Function} Returns the new bound function.
- */
-function createBindWrapper(func, thisArg) {
-  var Ctor = createCtorWrapper(func);
-
-  function wrapper() {
-    var fn = (this && this !== global && this instanceof wrapper) ? Ctor : func;
-    return fn.apply(thisArg, arguments);
-  }
-  return wrapper;
-}
-
-module.exports = createBindWrapper;
diff --git a/node_modules/lodash/internal/createCache.js b/node_modules/lodash/internal/createCache.js
deleted file mode 100644
index 025e566..0000000
--- a/node_modules/lodash/internal/createCache.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var SetCache = require('./SetCache'),
-    getNative = require('./getNative');
-
-/** Native method references. */
-var Set = getNative(global, 'Set');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeCreate = getNative(Object, 'create');
-
-/**
- * Creates a `Set` cache object to optimize linear searches of large arrays.
- *
- * @private
- * @param {Array} [values] The values to cache.
- * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`.
- */
-function createCache(values) {
-  return (nativeCreate && Set) ? new SetCache(values) : null;
-}
-
-module.exports = createCache;
diff --git a/node_modules/lodash/internal/createCompounder.js b/node_modules/lodash/internal/createCompounder.js
deleted file mode 100644
index 4c75512..0000000
--- a/node_modules/lodash/internal/createCompounder.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var deburr = require('../string/deburr'),
-    words = require('../string/words');
-
-/**
- * Creates a function that produces compound words out of the words in a
- * given string.
- *
- * @private
- * @param {Function} callback The function to combine each word.
- * @returns {Function} Returns the new compounder function.
- */
-function createCompounder(callback) {
-  return function(string) {
-    var index = -1,
-        array = words(deburr(string)),
-        length = array.length,
-        result = '';
-
-    while (++index < length) {
-      result = callback(result, array[index], index);
-    }
-    return result;
-  };
-}
-
-module.exports = createCompounder;
diff --git a/node_modules/lodash/internal/createCtorWrapper.js b/node_modules/lodash/internal/createCtorWrapper.js
deleted file mode 100644
index ffbee80..0000000
--- a/node_modules/lodash/internal/createCtorWrapper.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var baseCreate = require('./baseCreate'),
-    isObject = require('../lang/isObject');
-
-/**
- * Creates a function that produces an instance of `Ctor` regardless of
- * whether it was invoked as part of a `new` expression or by `call` or `apply`.
- *
- * @private
- * @param {Function} Ctor The constructor to wrap.
- * @returns {Function} Returns the new wrapped function.
- */
-function createCtorWrapper(Ctor) {
-  return function() {
-    // Use a `switch` statement to work with class constructors.
-    // See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
-    // for more details.
-    var args = arguments;
-    switch (args.length) {
-      case 0: return new Ctor;
-      case 1: return new Ctor(args[0]);
-      case 2: return new Ctor(args[0], args[1]);
-      case 3: return new Ctor(args[0], args[1], args[2]);
-      case 4: return new Ctor(args[0], args[1], args[2], args[3]);
-      case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
-      case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
-      case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
-    }
-    var thisBinding = baseCreate(Ctor.prototype),
-        result = Ctor.apply(thisBinding, args);
-
-    // Mimic the constructor's `return` behavior.
-    // See https://es5.github.io/#x13.2.2 for more details.
-    return isObject(result) ? result : thisBinding;
-  };
-}
-
-module.exports = createCtorWrapper;
diff --git a/node_modules/lodash/internal/createCurry.js b/node_modules/lodash/internal/createCurry.js
deleted file mode 100644
index e5ced0e..0000000
--- a/node_modules/lodash/internal/createCurry.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var createWrapper = require('./createWrapper'),
-    isIterateeCall = require('./isIterateeCall');
-
-/**
- * Creates a `_.curry` or `_.curryRight` function.
- *
- * @private
- * @param {boolean} flag The curry bit flag.
- * @returns {Function} Returns the new curry function.
- */
-function createCurry(flag) {
-  function curryFunc(func, arity, guard) {
-    if (guard && isIterateeCall(func, arity, guard)) {
-      arity = undefined;
-    }
-    var result = createWrapper(func, flag, undefined, undefined, undefined, undefined, undefined, arity);
-    result.placeholder = curryFunc.placeholder;
-    return result;
-  }
-  return curryFunc;
-}
-
-module.exports = createCurry;
diff --git a/node_modules/lodash/internal/createDefaults.js b/node_modules/lodash/internal/createDefaults.js
deleted file mode 100644
index 5663bcb..0000000
--- a/node_modules/lodash/internal/createDefaults.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var restParam = require('../function/restParam');
-
-/**
- * Creates a `_.defaults` or `_.defaultsDeep` function.
- *
- * @private
- * @param {Function} assigner The function to assign values.
- * @param {Function} customizer The function to customize assigned values.
- * @returns {Function} Returns the new defaults function.
- */
-function createDefaults(assigner, customizer) {
-  return restParam(function(args) {
-    var object = args[0];
-    if (object == null) {
-      return object;
-    }
-    args.push(customizer);
-    return assigner.apply(undefined, args);
-  });
-}
-
-module.exports = createDefaults;
diff --git a/node_modules/lodash/internal/createExtremum.js b/node_modules/lodash/internal/createExtremum.js
deleted file mode 100644
index 5c4003e..0000000
--- a/node_modules/lodash/internal/createExtremum.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var arrayExtremum = require('./arrayExtremum'),
-    baseCallback = require('./baseCallback'),
-    baseExtremum = require('./baseExtremum'),
-    isArray = require('../lang/isArray'),
-    isIterateeCall = require('./isIterateeCall'),
-    toIterable = require('./toIterable');
-
-/**
- * Creates a `_.max` or `_.min` function.
- *
- * @private
- * @param {Function} comparator The function used to compare values.
- * @param {*} exValue The initial extremum value.
- * @returns {Function} Returns the new extremum function.
- */
-function createExtremum(comparator, exValue) {
-  return function(collection, iteratee, thisArg) {
-    if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
-      iteratee = undefined;
-    }
-    iteratee = baseCallback(iteratee, thisArg, 3);
-    if (iteratee.length == 1) {
-      collection = isArray(collection) ? collection : toIterable(collection);
-      var result = arrayExtremum(collection, iteratee, comparator, exValue);
-      if (!(collection.length && result === exValue)) {
-        return result;
-      }
-    }
-    return baseExtremum(collection, iteratee, comparator, exValue);
-  };
-}
-
-module.exports = createExtremum;
diff --git a/node_modules/lodash/internal/createFind.js b/node_modules/lodash/internal/createFind.js
deleted file mode 100644
index 29bf580..0000000
--- a/node_modules/lodash/internal/createFind.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var baseCallback = require('./baseCallback'),
-    baseFind = require('./baseFind'),
-    baseFindIndex = require('./baseFindIndex'),
-    isArray = require('../lang/isArray');
-
-/**
- * Creates a `_.find` or `_.findLast` function.
- *
- * @private
- * @param {Function} eachFunc The function to iterate over a collection.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new find function.
- */
-function createFind(eachFunc, fromRight) {
-  return function(collection, predicate, thisArg) {
-    predicate = baseCallback(predicate, thisArg, 3);
-    if (isArray(collection)) {
-      var index = baseFindIndex(collection, predicate, fromRight);
-      return index > -1 ? collection[index] : undefined;
-    }
-    return baseFind(collection, predicate, eachFunc);
-  };
-}
-
-module.exports = createFind;
diff --git a/node_modules/lodash/internal/createFindIndex.js b/node_modules/lodash/internal/createFindIndex.js
deleted file mode 100644
index 3947bea..0000000
--- a/node_modules/lodash/internal/createFindIndex.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var baseCallback = require('./baseCallback'),
-    baseFindIndex = require('./baseFindIndex');
-
-/**
- * Creates a `_.findIndex` or `_.findLastIndex` function.
- *
- * @private
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new find function.
- */
-function createFindIndex(fromRight) {
-  return function(array, predicate, thisArg) {
-    if (!(array && array.length)) {
-      return -1;
-    }
-    predicate = baseCallback(predicate, thisArg, 3);
-    return baseFindIndex(array, predicate, fromRight);
-  };
-}
-
-module.exports = createFindIndex;
diff --git a/node_modules/lodash/internal/createFindKey.js b/node_modules/lodash/internal/createFindKey.js
deleted file mode 100644
index 0ce85e4..0000000
--- a/node_modules/lodash/internal/createFindKey.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var baseCallback = require('./baseCallback'),
-    baseFind = require('./baseFind');
-
-/**
- * Creates a `_.findKey` or `_.findLastKey` function.
- *
- * @private
- * @param {Function} objectFunc The function to iterate over an object.
- * @returns {Function} Returns the new find function.
- */
-function createFindKey(objectFunc) {
-  return function(object, predicate, thisArg) {
-    predicate = baseCallback(predicate, thisArg, 3);
-    return baseFind(object, predicate, objectFunc, true);
-  };
-}
-
-module.exports = createFindKey;
diff --git a/node_modules/lodash/internal/createFlow.js b/node_modules/lodash/internal/createFlow.js
deleted file mode 100644
index 52ab388..0000000
--- a/node_modules/lodash/internal/createFlow.js
+++ /dev/null
@@ -1,74 +0,0 @@
-var LodashWrapper = require('./LodashWrapper'),
-    getData = require('./getData'),
-    getFuncName = require('./getFuncName'),
-    isArray = require('../lang/isArray'),
-    isLaziable = require('./isLaziable');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var CURRY_FLAG = 8,
-    PARTIAL_FLAG = 32,
-    ARY_FLAG = 128,
-    REARG_FLAG = 256;
-
-/** Used as the size to enable large array optimizations. */
-var LARGE_ARRAY_SIZE = 200;
-
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/**
- * Creates a `_.flow` or `_.flowRight` function.
- *
- * @private
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new flow function.
- */
-function createFlow(fromRight) {
-  return function() {
-    var wrapper,
-        length = arguments.length,
-        index = fromRight ? length : -1,
-        leftIndex = 0,
-        funcs = Array(length);
-
-    while ((fromRight ? index-- : ++index < length)) {
-      var func = funcs[leftIndex++] = arguments[index];
-      if (typeof func != 'function') {
-        throw new TypeError(FUNC_ERROR_TEXT);
-      }
-      if (!wrapper && LodashWrapper.prototype.thru && getFuncName(func) == 'wrapper') {
-        wrapper = new LodashWrapper([], true);
-      }
-    }
-    index = wrapper ? -1 : length;
-    while (++index < length) {
-      func = funcs[index];
-
-      var funcName = getFuncName(func),
-          data = funcName == 'wrapper' ? getData(func) : undefined;
-
-      if (data && isLaziable(data[0]) && data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && !data[4].length && data[9] == 1) {
-        wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
-      } else {
-        wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func);
-      }
-    }
-    return function() {
-      var args = arguments,
-          value = args[0];
-
-      if (wrapper && args.length == 1 && isArray(value) && value.length >= LARGE_ARRAY_SIZE) {
-        return wrapper.plant(value).value();
-      }
-      var index = 0,
-          result = length ? funcs[index].apply(this, args) : value;
-
-      while (++index < length) {
-        result = funcs[index].call(this, result);
-      }
-      return result;
-    };
-  };
-}
-
-module.exports = createFlow;
diff --git a/node_modules/lodash/internal/createForEach.js b/node_modules/lodash/internal/createForEach.js
deleted file mode 100644
index 2aad11c..0000000
--- a/node_modules/lodash/internal/createForEach.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var bindCallback = require('./bindCallback'),
-    isArray = require('../lang/isArray');
-
-/**
- * Creates a function for `_.forEach` or `_.forEachRight`.
- *
- * @private
- * @param {Function} arrayFunc The function to iterate over an array.
- * @param {Function} eachFunc The function to iterate over a collection.
- * @returns {Function} Returns the new each function.
- */
-function createForEach(arrayFunc, eachFunc) {
-  return function(collection, iteratee, thisArg) {
-    return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))
-      ? arrayFunc(collection, iteratee)
-      : eachFunc(collection, bindCallback(iteratee, thisArg, 3));
-  };
-}
-
-module.exports = createForEach;
diff --git a/node_modules/lodash/internal/createForIn.js b/node_modules/lodash/internal/createForIn.js
deleted file mode 100644
index f63ffa0..0000000
--- a/node_modules/lodash/internal/createForIn.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var bindCallback = require('./bindCallback'),
-    keysIn = require('../object/keysIn');
-
-/**
- * Creates a function for `_.forIn` or `_.forInRight`.
- *
- * @private
- * @param {Function} objectFunc The function to iterate over an object.
- * @returns {Function} Returns the new each function.
- */
-function createForIn(objectFunc) {
-  return function(object, iteratee, thisArg) {
-    if (typeof iteratee != 'function' || thisArg !== undefined) {
-      iteratee = bindCallback(iteratee, thisArg, 3);
-    }
-    return objectFunc(object, iteratee, keysIn);
-  };
-}
-
-module.exports = createForIn;
diff --git a/node_modules/lodash/internal/createForOwn.js b/node_modules/lodash/internal/createForOwn.js
deleted file mode 100644
index b9a83c3..0000000
--- a/node_modules/lodash/internal/createForOwn.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var bindCallback = require('./bindCallback');
-
-/**
- * Creates a function for `_.forOwn` or `_.forOwnRight`.
- *
- * @private
- * @param {Function} objectFunc The function to iterate over an object.
- * @returns {Function} Returns the new each function.
- */
-function createForOwn(objectFunc) {
-  return function(object, iteratee, thisArg) {
-    if (typeof iteratee != 'function' || thisArg !== undefined) {
-      iteratee = bindCallback(iteratee, thisArg, 3);
-    }
-    return objectFunc(object, iteratee);
-  };
-}
-
-module.exports = createForOwn;
diff --git a/node_modules/lodash/internal/createHybridWrapper.js b/node_modules/lodash/internal/createHybridWrapper.js
deleted file mode 100644
index 5382fa0..0000000
--- a/node_modules/lodash/internal/createHybridWrapper.js
+++ /dev/null
@@ -1,111 +0,0 @@
-var arrayCopy = require('./arrayCopy'),
-    composeArgs = require('./composeArgs'),
-    composeArgsRight = require('./composeArgsRight'),
-    createCtorWrapper = require('./createCtorWrapper'),
-    isLaziable = require('./isLaziable'),
-    reorder = require('./reorder'),
-    replaceHolders = require('./replaceHolders'),
-    setData = require('./setData');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var BIND_FLAG = 1,
-    BIND_KEY_FLAG = 2,
-    CURRY_BOUND_FLAG = 4,
-    CURRY_FLAG = 8,
-    CURRY_RIGHT_FLAG = 16,
-    PARTIAL_FLAG = 32,
-    PARTIAL_RIGHT_FLAG = 64,
-    ARY_FLAG = 128;
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
-
-/**
- * Creates a function that wraps `func` and invokes it with optional `this`
- * binding of, partial application, and currying.
- *
- * @private
- * @param {Function|string} func The function or method name to reference.
- * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.
- * @param {*} [thisArg] The `this` binding of `func`.
- * @param {Array} [partials] The arguments to prepend to those provided to the new function.
- * @param {Array} [holders] The `partials` placeholder indexes.
- * @param {Array} [partialsRight] The arguments to append to those provided to the new function.
- * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
- * @param {Array} [argPos] The argument positions of the new function.
- * @param {number} [ary] The arity cap of `func`.
- * @param {number} [arity] The arity of `func`.
- * @returns {Function} Returns the new wrapped function.
- */
-function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
-  var isAry = bitmask & ARY_FLAG,
-      isBind = bitmask & BIND_FLAG,
-      isBindKey = bitmask & BIND_KEY_FLAG,
-      isCurry = bitmask & CURRY_FLAG,
-      isCurryBound = bitmask & CURRY_BOUND_FLAG,
-      isCurryRight = bitmask & CURRY_RIGHT_FLAG,
-      Ctor = isBindKey ? undefined : createCtorWrapper(func);
-
-  function wrapper() {
-    // Avoid `arguments` object use disqualifying optimizations by
-    // converting it to an array before providing it to other functions.
-    var length = arguments.length,
-        index = length,
-        args = Array(length);
-
-    while (index--) {
-      args[index] = arguments[index];
-    }
-    if (partials) {
-      args = composeArgs(args, partials, holders);
-    }
-    if (partialsRight) {
-      args = composeArgsRight(args, partialsRight, holdersRight);
-    }
-    if (isCurry || isCurryRight) {
-      var placeholder = wrapper.placeholder,
-          argsHolders = replaceHolders(args, placeholder);
-
-      length -= argsHolders.length;
-      if (length < arity) {
-        var newArgPos = argPos ? arrayCopy(argPos) : undefined,
-            newArity = nativeMax(arity - length, 0),
-            newsHolders = isCurry ? argsHolders : undefined,
-            newHoldersRight = isCurry ? undefined : argsHolders,
-            newPartials = isCurry ? args : undefined,
-            newPartialsRight = isCurry ? undefined : args;
-
-        bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);
-        bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);
-
-        if (!isCurryBound) {
-          bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);
-        }
-        var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],
-            result = createHybridWrapper.apply(undefined, newData);
-
-        if (isLaziable(func)) {
-          setData(result, newData);
-        }
-        result.placeholder = placeholder;
-        return result;
-      }
-    }
-    var thisBinding = isBind ? thisArg : this,
-        fn = isBindKey ? thisBinding[func] : func;
-
-    if (argPos) {
-      args = reorder(args, argPos);
-    }
-    if (isAry && ary < args.length) {
-      args.length = ary;
-    }
-    if (this && this !== global && this instanceof wrapper) {
-      fn = Ctor || createCtorWrapper(func);
-    }
-    return fn.apply(thisBinding, args);
-  }
-  return wrapper;
-}
-
-module.exports = createHybridWrapper;
diff --git a/node_modules/lodash/internal/createObjectMapper.js b/node_modules/lodash/internal/createObjectMapper.js
deleted file mode 100644
index 06d6a87..0000000
--- a/node_modules/lodash/internal/createObjectMapper.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var baseCallback = require('./baseCallback'),
-    baseForOwn = require('./baseForOwn');
-
-/**
- * Creates a function for `_.mapKeys` or `_.mapValues`.
- *
- * @private
- * @param {boolean} [isMapKeys] Specify mapping keys instead of values.
- * @returns {Function} Returns the new map function.
- */
-function createObjectMapper(isMapKeys) {
-  return function(object, iteratee, thisArg) {
-    var result = {};
-    iteratee = baseCallback(iteratee, thisArg, 3);
-
-    baseForOwn(object, function(value, key, object) {
-      var mapped = iteratee(value, key, object);
-      key = isMapKeys ? mapped : key;
-      value = isMapKeys ? value : mapped;
-      result[key] = value;
-    });
-    return result;
-  };
-}
-
-module.exports = createObjectMapper;
diff --git a/node_modules/lodash/internal/createPadDir.js b/node_modules/lodash/internal/createPadDir.js
deleted file mode 100644
index da0ebf1..0000000
--- a/node_modules/lodash/internal/createPadDir.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var baseToString = require('./baseToString'),
-    createPadding = require('./createPadding');
-
-/**
- * Creates a function for `_.padLeft` or `_.padRight`.
- *
- * @private
- * @param {boolean} [fromRight] Specify padding from the right.
- * @returns {Function} Returns the new pad function.
- */
-function createPadDir(fromRight) {
-  return function(string, length, chars) {
-    string = baseToString(string);
-    return (fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string);
-  };
-}
-
-module.exports = createPadDir;
diff --git a/node_modules/lodash/internal/createPadding.js b/node_modules/lodash/internal/createPadding.js
deleted file mode 100644
index 810dc24..0000000
--- a/node_modules/lodash/internal/createPadding.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var repeat = require('../string/repeat');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeCeil = Math.ceil,
-    nativeIsFinite = global.isFinite;
-
-/**
- * Creates the padding required for `string` based on the given `length`.
- * The `chars` string is truncated if the number of characters exceeds `length`.
- *
- * @private
- * @param {string} string The string to create padding for.
- * @param {number} [length=0] The padding length.
- * @param {string} [chars=' '] The string used as padding.
- * @returns {string} Returns the pad for `string`.
- */
-function createPadding(string, length, chars) {
-  var strLength = string.length;
-  length = +length;
-
-  if (strLength >= length || !nativeIsFinite(length)) {
-    return '';
-  }
-  var padLength = length - strLength;
-  chars = chars == null ? ' ' : (chars + '');
-  return repeat(chars, nativeCeil(padLength / chars.length)).slice(0, padLength);
-}
-
-module.exports = createPadding;
diff --git a/node_modules/lodash/internal/createPartial.js b/node_modules/lodash/internal/createPartial.js
deleted file mode 100644
index 7533275..0000000
--- a/node_modules/lodash/internal/createPartial.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var createWrapper = require('./createWrapper'),
-    replaceHolders = require('./replaceHolders'),
-    restParam = require('../function/restParam');
-
-/**
- * Creates a `_.partial` or `_.partialRight` function.
- *
- * @private
- * @param {boolean} flag The partial bit flag.
- * @returns {Function} Returns the new partial function.
- */
-function createPartial(flag) {
-  var partialFunc = restParam(function(func, partials) {
-    var holders = replaceHolders(partials, partialFunc.placeholder);
-    return createWrapper(func, flag, undefined, partials, holders);
-  });
-  return partialFunc;
-}
-
-module.exports = createPartial;
diff --git a/node_modules/lodash/internal/createPartialWrapper.js b/node_modules/lodash/internal/createPartialWrapper.js
deleted file mode 100644
index b19f9f0..0000000
--- a/node_modules/lodash/internal/createPartialWrapper.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var createCtorWrapper = require('./createCtorWrapper');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var BIND_FLAG = 1;
-
-/**
- * Creates a function that wraps `func` and invokes it with the optional `this`
- * binding of `thisArg` and the `partials` prepended to those provided to
- * the wrapper.
- *
- * @private
- * @param {Function} func The function to partially apply arguments to.
- * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.
- * @param {*} thisArg The `this` binding of `func`.
- * @param {Array} partials The arguments to prepend to those provided to the new function.
- * @returns {Function} Returns the new bound function.
- */
-function createPartialWrapper(func, bitmask, thisArg, partials) {
-  var isBind = bitmask & BIND_FLAG,
-      Ctor = createCtorWrapper(func);
-
-  function wrapper() {
-    // Avoid `arguments` object use disqualifying optimizations by
-    // converting it to an array before providing it `func`.
-    var argsIndex = -1,
-        argsLength = arguments.length,
-        leftIndex = -1,
-        leftLength = partials.length,
-        args = Array(leftLength + argsLength);
-
-    while (++leftIndex < leftLength) {
-      args[leftIndex] = partials[leftIndex];
-    }
-    while (argsLength--) {
-      args[leftIndex++] = arguments[++argsIndex];
-    }
-    var fn = (this && this !== global && this instanceof wrapper) ? Ctor : func;
-    return fn.apply(isBind ? thisArg : this, args);
-  }
-  return wrapper;
-}
-
-module.exports = createPartialWrapper;
diff --git a/node_modules/lodash/internal/createReduce.js b/node_modules/lodash/internal/createReduce.js
deleted file mode 100644
index 816f4ce..0000000
--- a/node_modules/lodash/internal/createReduce.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var baseCallback = require('./baseCallback'),
-    baseReduce = require('./baseReduce'),
-    isArray = require('../lang/isArray');
-
-/**
- * Creates a function for `_.reduce` or `_.reduceRight`.
- *
- * @private
- * @param {Function} arrayFunc The function to iterate over an array.
- * @param {Function} eachFunc The function to iterate over a collection.
- * @returns {Function} Returns the new each function.
- */
-function createReduce(arrayFunc, eachFunc) {
-  return function(collection, iteratee, accumulator, thisArg) {
-    var initFromArray = arguments.length < 3;
-    return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))
-      ? arrayFunc(collection, iteratee, accumulator, initFromArray)
-      : baseReduce(collection, baseCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);
-  };
-}
-
-module.exports = createReduce;
diff --git a/node_modules/lodash/internal/createRound.js b/node_modules/lodash/internal/createRound.js
deleted file mode 100644
index 21240ef..0000000
--- a/node_modules/lodash/internal/createRound.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/** Native method references. */
-var pow = Math.pow;
-
-/**
- * Creates a `_.ceil`, `_.floor`, or `_.round` function.
- *
- * @private
- * @param {string} methodName The name of the `Math` method to use when rounding.
- * @returns {Function} Returns the new round function.
- */
-function createRound(methodName) {
-  var func = Math[methodName];
-  return function(number, precision) {
-    precision = precision === undefined ? 0 : (+precision || 0);
-    if (precision) {
-      precision = pow(10, precision);
-      return func(number * precision) / precision;
-    }
-    return func(number);
-  };
-}
-
-module.exports = createRound;
diff --git a/node_modules/lodash/internal/createSortedIndex.js b/node_modules/lodash/internal/createSortedIndex.js
deleted file mode 100644
index 86c7852..0000000
--- a/node_modules/lodash/internal/createSortedIndex.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var baseCallback = require('./baseCallback'),
-    binaryIndex = require('./binaryIndex'),
-    binaryIndexBy = require('./binaryIndexBy');
-
-/**
- * Creates a `_.sortedIndex` or `_.sortedLastIndex` function.
- *
- * @private
- * @param {boolean} [retHighest] Specify returning the highest qualified index.
- * @returns {Function} Returns the new index function.
- */
-function createSortedIndex(retHighest) {
-  return function(array, value, iteratee, thisArg) {
-    return iteratee == null
-      ? binaryIndex(array, value, retHighest)
-      : binaryIndexBy(array, value, baseCallback(iteratee, thisArg, 1), retHighest);
-  };
-}
-
-module.exports = createSortedIndex;
diff --git a/node_modules/lodash/internal/createWrapper.js b/node_modules/lodash/internal/createWrapper.js
deleted file mode 100644
index ea7a9b1..0000000
--- a/node_modules/lodash/internal/createWrapper.js
+++ /dev/null
@@ -1,86 +0,0 @@
-var baseSetData = require('./baseSetData'),
-    createBindWrapper = require('./createBindWrapper'),
-    createHybridWrapper = require('./createHybridWrapper'),
-    createPartialWrapper = require('./createPartialWrapper'),
-    getData = require('./getData'),
-    mergeData = require('./mergeData'),
-    setData = require('./setData');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var BIND_FLAG = 1,
-    BIND_KEY_FLAG = 2,
-    PARTIAL_FLAG = 32,
-    PARTIAL_RIGHT_FLAG = 64;
-
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
-
-/**
- * Creates a function that either curries or invokes `func` with optional
- * `this` binding and partially applied arguments.
- *
- * @private
- * @param {Function|string} func The function or method name to reference.
- * @param {number} bitmask The bitmask of flags.
- *  The bitmask may be composed of the following flags:
- *     1 - `_.bind`
- *     2 - `_.bindKey`
- *     4 - `_.curry` or `_.curryRight` of a bound function
- *     8 - `_.curry`
- *    16 - `_.curryRight`
- *    32 - `_.partial`
- *    64 - `_.partialRight`
- *   128 - `_.rearg`
- *   256 - `_.ary`
- * @param {*} [thisArg] The `this` binding of `func`.
- * @param {Array} [partials] The arguments to be partially applied.
- * @param {Array} [holders] The `partials` placeholder indexes.
- * @param {Array} [argPos] The argument positions of the new function.
- * @param {number} [ary] The arity cap of `func`.
- * @param {number} [arity] The arity of `func`.
- * @returns {Function} Returns the new wrapped function.
- */
-function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
-  var isBindKey = bitmask & BIND_KEY_FLAG;
-  if (!isBindKey && typeof func != 'function') {
-    throw new TypeError(FUNC_ERROR_TEXT);
-  }
-  var length = partials ? partials.length : 0;
-  if (!length) {
-    bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);
-    partials = holders = undefined;
-  }
-  length -= (holders ? holders.length : 0);
-  if (bitmask & PARTIAL_RIGHT_FLAG) {
-    var partialsRight = partials,
-        holdersRight = holders;
-
-    partials = holders = undefined;
-  }
-  var data = isBindKey ? undefined : getData(func),
-      newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];
-
-  if (data) {
-    mergeData(newData, data);
-    bitmask = newData[1];
-    arity = newData[9];
-  }
-  newData[9] = arity == null
-    ? (isBindKey ? 0 : func.length)
-    : (nativeMax(arity - length, 0) || 0);
-
-  if (bitmask == BIND_FLAG) {
-    var result = createBindWrapper(newData[0], newData[2]);
-  } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {
-    result = createPartialWrapper.apply(undefined, newData);
-  } else {
-    result = createHybridWrapper.apply(undefined, newData);
-  }
-  var setter = data ? baseSetData : setData;
-  return setter(result, newData);
-}
-
-module.exports = createWrapper;
diff --git a/node_modules/lodash/internal/deburrLetter.js b/node_modules/lodash/internal/deburrLetter.js
deleted file mode 100644
index e559dbe..0000000
--- a/node_modules/lodash/internal/deburrLetter.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/** Used to map latin-1 supplementary letters to basic latin letters. */
-var deburredLetters = {
-  '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
-  '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
-  '\xc7': 'C',  '\xe7': 'c',
-  '\xd0': 'D',  '\xf0': 'd',
-  '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
-  '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
-  '\xcC': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
-  '\xeC': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
-  '\xd1': 'N',  '\xf1': 'n',
-  '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
-  '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
-  '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
-  '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
-  '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
-  '\xc6': 'Ae', '\xe6': 'ae',
-  '\xde': 'Th', '\xfe': 'th',
-  '\xdf': 'ss'
-};
-
-/**
- * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.
- *
- * @private
- * @param {string} letter The matched letter to deburr.
- * @returns {string} Returns the deburred letter.
- */
-function deburrLetter(letter) {
-  return deburredLetters[letter];
-}
-
-module.exports = deburrLetter;
diff --git a/node_modules/lodash/internal/equalArrays.js b/node_modules/lodash/internal/equalArrays.js
deleted file mode 100644
index e0bb2d3..0000000
--- a/node_modules/lodash/internal/equalArrays.js
+++ /dev/null
@@ -1,51 +0,0 @@
-var arraySome = require('./arraySome');
-
-/**
- * A specialized version of `baseIsEqualDeep` for arrays with support for
- * partial deep comparisons.
- *
- * @private
- * @param {Array} array The array to compare.
- * @param {Array} other The other array to compare.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Function} [customizer] The function to customize comparing arrays.
- * @param {boolean} [isLoose] Specify performing partial comparisons.
- * @param {Array} [stackA] Tracks traversed `value` objects.
- * @param {Array} [stackB] Tracks traversed `other` objects.
- * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
- */
-function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {
-  var index = -1,
-      arrLength = array.length,
-      othLength = other.length;
-
-  if (arrLength != othLength && !(isLoose && othLength > arrLength)) {
-    return false;
-  }
-  // Ignore non-index properties.
-  while (++index < arrLength) {
-    var arrValue = array[index],
-        othValue = other[index],
-        result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;
-
-    if (result !== undefined) {
-      if (result) {
-        continue;
-      }
-      return false;
-    }
-    // Recursively compare arrays (susceptible to call stack limits).
-    if (isLoose) {
-      if (!arraySome(other, function(othValue) {
-            return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
-          })) {
-        return false;
-      }
-    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {
-      return false;
-    }
-  }
-  return true;
-}
-
-module.exports = equalArrays;
diff --git a/node_modules/lodash/internal/equalByTag.js b/node_modules/lodash/internal/equalByTag.js
deleted file mode 100644
index d25c8e1..0000000
--- a/node_modules/lodash/internal/equalByTag.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/** `Object#toString` result references. */
-var boolTag = '[object Boolean]',
-    dateTag = '[object Date]',
-    errorTag = '[object Error]',
-    numberTag = '[object Number]',
-    regexpTag = '[object RegExp]',
-    stringTag = '[object String]';
-
-/**
- * A specialized version of `baseIsEqualDeep` for comparing objects of
- * the same `toStringTag`.
- *
- * **Note:** This function only supports comparing values with tags of
- * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {string} tag The `toStringTag` of the objects to compare.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
-function equalByTag(object, other, tag) {
-  switch (tag) {
-    case boolTag:
-    case dateTag:
-      // Coerce dates and booleans to numbers, dates to milliseconds and booleans
-      // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.
-      return +object == +other;
-
-    case errorTag:
-      return object.name == other.name && object.message == other.message;
-
-    case numberTag:
-      // Treat `NaN` vs. `NaN` as equal.
-      return (object != +object)
-        ? other != +other
-        : object == +other;
-
-    case regexpTag:
-    case stringTag:
-      // Coerce regexes to strings and treat strings primitives and string
-      // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.
-      return object == (other + '');
-  }
-  return false;
-}
-
-module.exports = equalByTag;
diff --git a/node_modules/lodash/internal/equalObjects.js b/node_modules/lodash/internal/equalObjects.js
deleted file mode 100644
index 1297a3b..0000000
--- a/node_modules/lodash/internal/equalObjects.js
+++ /dev/null
@@ -1,67 +0,0 @@
-var keys = require('../object/keys');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * A specialized version of `baseIsEqualDeep` for objects with support for
- * partial deep comparisons.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Function} [customizer] The function to customize comparing values.
- * @param {boolean} [isLoose] Specify performing partial comparisons.
- * @param {Array} [stackA] Tracks traversed `value` objects.
- * @param {Array} [stackB] Tracks traversed `other` objects.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
-function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
-  var objProps = keys(object),
-      objLength = objProps.length,
-      othProps = keys(other),
-      othLength = othProps.length;
-
-  if (objLength != othLength && !isLoose) {
-    return false;
-  }
-  var index = objLength;
-  while (index--) {
-    var key = objProps[index];
-    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {
-      return false;
-    }
-  }
-  var skipCtor = isLoose;
-  while (++index < objLength) {
-    key = objProps[index];
-    var objValue = object[key],
-        othValue = other[key],
-        result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;
-
-    // Recursively compare objects (susceptible to call stack limits).
-    if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {
-      return false;
-    }
-    skipCtor || (skipCtor = key == 'constructor');
-  }
-  if (!skipCtor) {
-    var objCtor = object.constructor,
-        othCtor = other.constructor;
-
-    // Non `Object` object instances with different constructors are not equal.
-    if (objCtor != othCtor &&
-        ('constructor' in object && 'constructor' in other) &&
-        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
-          typeof othCtor == 'function' && othCtor instanceof othCtor)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-module.exports = equalObjects;
diff --git a/node_modules/lodash/internal/escapeHtmlChar.js b/node_modules/lodash/internal/escapeHtmlChar.js
deleted file mode 100644
index b21e452..0000000
--- a/node_modules/lodash/internal/escapeHtmlChar.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/** Used to map characters to HTML entities. */
-var htmlEscapes = {
-  '&': '&amp;',
-  '<': '&lt;',
-  '>': '&gt;',
-  '"': '&quot;',
-  "'": '&#39;',
-  '`': '&#96;'
-};
-
-/**
- * Used by `_.escape` to convert characters to HTML entities.
- *
- * @private
- * @param {string} chr The matched character to escape.
- * @returns {string} Returns the escaped character.
- */
-function escapeHtmlChar(chr) {
-  return htmlEscapes[chr];
-}
-
-module.exports = escapeHtmlChar;
diff --git a/node_modules/lodash/internal/escapeRegExpChar.js b/node_modules/lodash/internal/escapeRegExpChar.js
deleted file mode 100644
index 8427de0..0000000
--- a/node_modules/lodash/internal/escapeRegExpChar.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/** Used to escape characters for inclusion in compiled regexes. */
-var regexpEscapes = {
-  '0': 'x30', '1': 'x31', '2': 'x32', '3': 'x33', '4': 'x34',
-  '5': 'x35', '6': 'x36', '7': 'x37', '8': 'x38', '9': 'x39',
-  'A': 'x41', 'B': 'x42', 'C': 'x43', 'D': 'x44', 'E': 'x45', 'F': 'x46',
-  'a': 'x61', 'b': 'x62', 'c': 'x63', 'd': 'x64', 'e': 'x65', 'f': 'x66',
-  'n': 'x6e', 'r': 'x72', 't': 'x74', 'u': 'x75', 'v': 'x76', 'x': 'x78'
-};
-
-/** Used to escape characters for inclusion in compiled string literals. */
-var stringEscapes = {
-  '\\': '\\',
-  "'": "'",
-  '\n': 'n',
-  '\r': 'r',
-  '\u2028': 'u2028',
-  '\u2029': 'u2029'
-};
-
-/**
- * Used by `_.escapeRegExp` to escape characters for inclusion in compiled regexes.
- *
- * @private
- * @param {string} chr The matched character to escape.
- * @param {string} leadingChar The capture group for a leading character.
- * @param {string} whitespaceChar The capture group for a whitespace character.
- * @returns {string} Returns the escaped character.
- */
-function escapeRegExpChar(chr, leadingChar, whitespaceChar) {
-  if (leadingChar) {
-    chr = regexpEscapes[chr];
-  } else if (whitespaceChar) {
-    chr = stringEscapes[chr];
-  }
-  return '\\' + chr;
-}
-
-module.exports = escapeRegExpChar;
diff --git a/node_modules/lodash/internal/escapeStringChar.js b/node_modules/lodash/internal/escapeStringChar.js
deleted file mode 100644
index 44eca96..0000000
--- a/node_modules/lodash/internal/escapeStringChar.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/** Used to escape characters for inclusion in compiled string literals. */
-var stringEscapes = {
-  '\\': '\\',
-  "'": "'",
-  '\n': 'n',
-  '\r': 'r',
-  '\u2028': 'u2028',
-  '\u2029': 'u2029'
-};
-
-/**
- * Used by `_.template` to escape characters for inclusion in compiled string literals.
- *
- * @private
- * @param {string} chr The matched character to escape.
- * @returns {string} Returns the escaped character.
- */
-function escapeStringChar(chr) {
-  return '\\' + stringEscapes[chr];
-}
-
-module.exports = escapeStringChar;
diff --git a/node_modules/lodash/internal/getData.js b/node_modules/lodash/internal/getData.js
deleted file mode 100644
index 5bb4f46..0000000
--- a/node_modules/lodash/internal/getData.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var metaMap = require('./metaMap'),
-    noop = require('../utility/noop');
-
-/**
- * Gets metadata for `func`.
- *
- * @private
- * @param {Function} func The function to query.
- * @returns {*} Returns the metadata for `func`.
- */
-var getData = !metaMap ? noop : function(func) {
-  return metaMap.get(func);
-};
-
-module.exports = getData;
diff --git a/node_modules/lodash/internal/getFuncName.js b/node_modules/lodash/internal/getFuncName.js
deleted file mode 100644
index ed92867..0000000
--- a/node_modules/lodash/internal/getFuncName.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var realNames = require('./realNames');
-
-/**
- * Gets the name of `func`.
- *
- * @private
- * @param {Function} func The function to query.
- * @returns {string} Returns the function name.
- */
-function getFuncName(func) {
-  var result = (func.name + ''),
-      array = realNames[result],
-      length = array ? array.length : 0;
-
-  while (length--) {
-    var data = array[length],
-        otherFunc = data.func;
-    if (otherFunc == null || otherFunc == func) {
-      return data.name;
-    }
-  }
-  return result;
-}
-
-module.exports = getFuncName;
diff --git a/node_modules/lodash/internal/getLength.js b/node_modules/lodash/internal/getLength.js
deleted file mode 100644
index 48d75ae..0000000
--- a/node_modules/lodash/internal/getLength.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var baseProperty = require('./baseProperty');
-
-/**
- * Gets the "length" property value of `object`.
- *
- * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
- * that affects Safari on at least iOS 8.1-8.3 ARM64.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {*} Returns the "length" value.
- */
-var getLength = baseProperty('length');
-
-module.exports = getLength;
diff --git a/node_modules/lodash/internal/getMatchData.js b/node_modules/lodash/internal/getMatchData.js
deleted file mode 100644
index 6d235b9..0000000
--- a/node_modules/lodash/internal/getMatchData.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var isStrictComparable = require('./isStrictComparable'),
-    pairs = require('../object/pairs');
-
-/**
- * Gets the propery names, values, and compare flags of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the match data of `object`.
- */
-function getMatchData(object) {
-  var result = pairs(object),
-      length = result.length;
-
-  while (length--) {
-    result[length][2] = isStrictComparable(result[length][1]);
-  }
-  return result;
-}
-
-module.exports = getMatchData;
diff --git a/node_modules/lodash/internal/getNative.js b/node_modules/lodash/internal/getNative.js
deleted file mode 100644
index bceb317..0000000
--- a/node_modules/lodash/internal/getNative.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var isNative = require('../lang/isNative');
-
-/**
- * Gets the native function at `key` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {string} key The key of the method to get.
- * @returns {*} Returns the function if it's native, else `undefined`.
- */
-function getNative(object, key) {
-  var value = object == null ? undefined : object[key];
-  return isNative(value) ? value : undefined;
-}
-
-module.exports = getNative;
diff --git a/node_modules/lodash/internal/getView.js b/node_modules/lodash/internal/getView.js
deleted file mode 100644
index f49ec6d..0000000
--- a/node_modules/lodash/internal/getView.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max,
-    nativeMin = Math.min;
-
-/**
- * Gets the view, applying any `transforms` to the `start` and `end` positions.
- *
- * @private
- * @param {number} start The start of the view.
- * @param {number} end The end of the view.
- * @param {Array} transforms The transformations to apply to the view.
- * @returns {Object} Returns an object containing the `start` and `end`
- *  positions of the view.
- */
-function getView(start, end, transforms) {
-  var index = -1,
-      length = transforms.length;
-
-  while (++index < length) {
-    var data = transforms[index],
-        size = data.size;
-
-    switch (data.type) {
-      case 'drop':      start += size; break;
-      case 'dropRight': end -= size; break;
-      case 'take':      end = nativeMin(end, start + size); break;
-      case 'takeRight': start = nativeMax(start, end - size); break;
-    }
-  }
-  return { 'start': start, 'end': end };
-}
-
-module.exports = getView;
diff --git a/node_modules/lodash/internal/indexOfNaN.js b/node_modules/lodash/internal/indexOfNaN.js
deleted file mode 100644
index 05b8207..0000000
--- a/node_modules/lodash/internal/indexOfNaN.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Gets the index at which the first occurrence of `NaN` is found in `array`.
- *
- * @private
- * @param {Array} array The array to search.
- * @param {number} fromIndex The index to search from.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {number} Returns the index of the matched `NaN`, else `-1`.
- */
-function indexOfNaN(array, fromIndex, fromRight) {
-  var length = array.length,
-      index = fromIndex + (fromRight ? 0 : -1);
-
-  while ((fromRight ? index-- : ++index < length)) {
-    var other = array[index];
-    if (other !== other) {
-      return index;
-    }
-  }
-  return -1;
-}
-
-module.exports = indexOfNaN;
diff --git a/node_modules/lodash/internal/initCloneArray.js b/node_modules/lodash/internal/initCloneArray.js
deleted file mode 100644
index c92dfa2..0000000
--- a/node_modules/lodash/internal/initCloneArray.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Initializes an array clone.
- *
- * @private
- * @param {Array} array The array to clone.
- * @returns {Array} Returns the initialized clone.
- */
-function initCloneArray(array) {
-  var length = array.length,
-      result = new array.constructor(length);
-
-  // Add array properties assigned by `RegExp#exec`.
-  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
-    result.index = array.index;
-    result.input = array.input;
-  }
-  return result;
-}
-
-module.exports = initCloneArray;
diff --git a/node_modules/lodash/internal/initCloneByTag.js b/node_modules/lodash/internal/initCloneByTag.js
deleted file mode 100644
index 8e3afc6..0000000
--- a/node_modules/lodash/internal/initCloneByTag.js
+++ /dev/null
@@ -1,63 +0,0 @@
-var bufferClone = require('./bufferClone');
-
-/** `Object#toString` result references. */
-var boolTag = '[object Boolean]',
-    dateTag = '[object Date]',
-    numberTag = '[object Number]',
-    regexpTag = '[object RegExp]',
-    stringTag = '[object String]';
-
-var arrayBufferTag = '[object ArrayBuffer]',
-    float32Tag = '[object Float32Array]',
-    float64Tag = '[object Float64Array]',
-    int8Tag = '[object Int8Array]',
-    int16Tag = '[object Int16Array]',
-    int32Tag = '[object Int32Array]',
-    uint8Tag = '[object Uint8Array]',
-    uint8ClampedTag = '[object Uint8ClampedArray]',
-    uint16Tag = '[object Uint16Array]',
-    uint32Tag = '[object Uint32Array]';
-
-/** Used to match `RegExp` flags from their coerced string values. */
-var reFlags = /\w*$/;
-
-/**
- * Initializes an object clone based on its `toStringTag`.
- *
- * **Note:** This function only supports cloning values with tags of
- * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
- *
- * @private
- * @param {Object} object The object to clone.
- * @param {string} tag The `toStringTag` of the object to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @returns {Object} Returns the initialized clone.
- */
-function initCloneByTag(object, tag, isDeep) {
-  var Ctor = object.constructor;
-  switch (tag) {
-    case arrayBufferTag:
-      return bufferClone(object);
-
-    case boolTag:
-    case dateTag:
-      return new Ctor(+object);
-
-    case float32Tag: case float64Tag:
-    case int8Tag: case int16Tag: case int32Tag:
-    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
-      var buffer = object.buffer;
-      return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);
-
-    case numberTag:
-    case stringTag:
-      return new Ctor(object);
-
-    case regexpTag:
-      var result = new Ctor(object.source, reFlags.exec(object));
-      result.lastIndex = object.lastIndex;
-  }
-  return result;
-}
-
-module.exports = initCloneByTag;
diff --git a/node_modules/lodash/internal/initCloneObject.js b/node_modules/lodash/internal/initCloneObject.js
deleted file mode 100644
index 48c4a23..0000000
--- a/node_modules/lodash/internal/initCloneObject.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * Initializes an object clone.
- *
- * @private
- * @param {Object} object The object to clone.
- * @returns {Object} Returns the initialized clone.
- */
-function initCloneObject(object) {
-  var Ctor = object.constructor;
-  if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {
-    Ctor = Object;
-  }
-  return new Ctor;
-}
-
-module.exports = initCloneObject;
diff --git a/node_modules/lodash/internal/invokePath.js b/node_modules/lodash/internal/invokePath.js
deleted file mode 100644
index 935110f..0000000
--- a/node_modules/lodash/internal/invokePath.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var baseGet = require('./baseGet'),
-    baseSlice = require('./baseSlice'),
-    isKey = require('./isKey'),
-    last = require('../array/last'),
-    toPath = require('./toPath');
-
-/**
- * Invokes the method at `path` on `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array|string} path The path of the method to invoke.
- * @param {Array} args The arguments to invoke the method with.
- * @returns {*} Returns the result of the invoked method.
- */
-function invokePath(object, path, args) {
-  if (object != null && !isKey(path, object)) {
-    path = toPath(path);
-    object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
-    path = last(path);
-  }
-  var func = object == null ? object : object[path];
-  return func == null ? undefined : func.apply(object, args);
-}
-
-module.exports = invokePath;
diff --git a/node_modules/lodash/internal/isArrayLike.js b/node_modules/lodash/internal/isArrayLike.js
deleted file mode 100644
index 72443cd..0000000
--- a/node_modules/lodash/internal/isArrayLike.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var getLength = require('./getLength'),
-    isLength = require('./isLength');
-
-/**
- * Checks if `value` is array-like.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- */
-function isArrayLike(value) {
-  return value != null && isLength(getLength(value));
-}
-
-module.exports = isArrayLike;
diff --git a/node_modules/lodash/internal/isIndex.js b/node_modules/lodash/internal/isIndex.js
deleted file mode 100644
index 469164b..0000000
--- a/node_modules/lodash/internal/isIndex.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/** Used to detect unsigned integer values. */
-var reIsUint = /^\d+$/;
-
-/**
- * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
- * of an array-like value.
- */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/**
- * Checks if `value` is a valid array-like index.
- *
- * @private
- * @param {*} value The value to check.
- * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
- * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
- */
-function isIndex(value, length) {
-  value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
-  length = length == null ? MAX_SAFE_INTEGER : length;
-  return value > -1 && value % 1 == 0 && value < length;
-}
-
-module.exports = isIndex;
diff --git a/node_modules/lodash/internal/isIterateeCall.js b/node_modules/lodash/internal/isIterateeCall.js
deleted file mode 100644
index 07490f2..0000000
--- a/node_modules/lodash/internal/isIterateeCall.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var isArrayLike = require('./isArrayLike'),
-    isIndex = require('./isIndex'),
-    isObject = require('../lang/isObject');
-
-/**
- * Checks if the provided arguments are from an iteratee call.
- *
- * @private
- * @param {*} value The potential iteratee value argument.
- * @param {*} index The potential iteratee index or key argument.
- * @param {*} object The potential iteratee object argument.
- * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
- */
-function isIterateeCall(value, index, object) {
-  if (!isObject(object)) {
-    return false;
-  }
-  var type = typeof index;
-  if (type == 'number'
-      ? (isArrayLike(object) && isIndex(index, object.length))
-      : (type == 'string' && index in object)) {
-    var other = object[index];
-    return value === value ? (value === other) : (other !== other);
-  }
-  return false;
-}
-
-module.exports = isIterateeCall;
diff --git a/node_modules/lodash/internal/isKey.js b/node_modules/lodash/internal/isKey.js
deleted file mode 100644
index 44ccfd4..0000000
--- a/node_modules/lodash/internal/isKey.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var isArray = require('../lang/isArray'),
-    toObject = require('./toObject');
-
-/** Used to match property names within property paths. */
-var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,
-    reIsPlainProp = /^\w*$/;
-
-/**
- * Checks if `value` is a property name and not a property path.
- *
- * @private
- * @param {*} value The value to check.
- * @param {Object} [object] The object to query keys on.
- * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
- */
-function isKey(value, object) {
-  var type = typeof value;
-  if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {
-    return true;
-  }
-  if (isArray(value)) {
-    return false;
-  }
-  var result = !reIsDeepProp.test(value);
-  return result || (object != null && value in toObject(object));
-}
-
-module.exports = isKey;
diff --git a/node_modules/lodash/internal/isLaziable.js b/node_modules/lodash/internal/isLaziable.js
deleted file mode 100644
index 475fab1..0000000
--- a/node_modules/lodash/internal/isLaziable.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var LazyWrapper = require('./LazyWrapper'),
-    getData = require('./getData'),
-    getFuncName = require('./getFuncName'),
-    lodash = require('../chain/lodash');
-
-/**
- * Checks if `func` has a lazy counterpart.
- *
- * @private
- * @param {Function} func The function to check.
- * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.
- */
-function isLaziable(func) {
-  var funcName = getFuncName(func),
-      other = lodash[funcName];
-
-  if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
-    return false;
-  }
-  if (func === other) {
-    return true;
-  }
-  var data = getData(other);
-  return !!data && func === data[0];
-}
-
-module.exports = isLaziable;
diff --git a/node_modules/lodash/internal/isLength.js b/node_modules/lodash/internal/isLength.js
deleted file mode 100644
index 2092987..0000000
--- a/node_modules/lodash/internal/isLength.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
- * of an array-like value.
- */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- */
-function isLength(value) {
-  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
-}
-
-module.exports = isLength;
diff --git a/node_modules/lodash/internal/isObjectLike.js b/node_modules/lodash/internal/isObjectLike.js
deleted file mode 100644
index 8ca0585..0000000
--- a/node_modules/lodash/internal/isObjectLike.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * Checks if `value` is object-like.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- */
-function isObjectLike(value) {
-  return !!value && typeof value == 'object';
-}
-
-module.exports = isObjectLike;
diff --git a/node_modules/lodash/internal/isSpace.js b/node_modules/lodash/internal/isSpace.js
deleted file mode 100644
index 16ea6f3..0000000
--- a/node_modules/lodash/internal/isSpace.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a
- * character code is whitespace.
- *
- * @private
- * @param {number} charCode The character code to inspect.
- * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`.
- */
-function isSpace(charCode) {
-  return ((charCode <= 160 && (charCode >= 9 && charCode <= 13) || charCode == 32 || charCode == 160) || charCode == 5760 || charCode == 6158 ||
-    (charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279)));
-}
-
-module.exports = isSpace;
diff --git a/node_modules/lodash/internal/isStrictComparable.js b/node_modules/lodash/internal/isStrictComparable.js
deleted file mode 100644
index 0a53eba..0000000
--- a/node_modules/lodash/internal/isStrictComparable.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var isObject = require('../lang/isObject');
-
-/**
- * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` if suitable for strict
- *  equality comparisons, else `false`.
- */
-function isStrictComparable(value) {
-  return value === value && !isObject(value);
-}
-
-module.exports = isStrictComparable;
diff --git a/node_modules/lodash/internal/lazyClone.js b/node_modules/lodash/internal/lazyClone.js
deleted file mode 100644
index 04c222b..0000000
--- a/node_modules/lodash/internal/lazyClone.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var LazyWrapper = require('./LazyWrapper'),
-    arrayCopy = require('./arrayCopy');
-
-/**
- * Creates a clone of the lazy wrapper object.
- *
- * @private
- * @name clone
- * @memberOf LazyWrapper
- * @returns {Object} Returns the cloned `LazyWrapper` object.
- */
-function lazyClone() {
-  var result = new LazyWrapper(this.__wrapped__);
-  result.__actions__ = arrayCopy(this.__actions__);
-  result.__dir__ = this.__dir__;
-  result.__filtered__ = this.__filtered__;
-  result.__iteratees__ = arrayCopy(this.__iteratees__);
-  result.__takeCount__ = this.__takeCount__;
-  result.__views__ = arrayCopy(this.__views__);
-  return result;
-}
-
-module.exports = lazyClone;
diff --git a/node_modules/lodash/internal/lazyReverse.js b/node_modules/lodash/internal/lazyReverse.js
deleted file mode 100644
index c658402..0000000
--- a/node_modules/lodash/internal/lazyReverse.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var LazyWrapper = require('./LazyWrapper');
-
-/**
- * Reverses the direction of lazy iteration.
- *
- * @private
- * @name reverse
- * @memberOf LazyWrapper
- * @returns {Object} Returns the new reversed `LazyWrapper` object.
- */
-function lazyReverse() {
-  if (this.__filtered__) {
-    var result = new LazyWrapper(this);
-    result.__dir__ = -1;
-    result.__filtered__ = true;
-  } else {
-    result = this.clone();
-    result.__dir__ *= -1;
-  }
-  return result;
-}
-
-module.exports = lazyReverse;
diff --git a/node_modules/lodash/internal/lazyValue.js b/node_modules/lodash/internal/lazyValue.js
deleted file mode 100644
index 8de68e6..0000000
--- a/node_modules/lodash/internal/lazyValue.js
+++ /dev/null
@@ -1,72 +0,0 @@
-var baseWrapperValue = require('./baseWrapperValue'),
-    getView = require('./getView'),
-    isArray = require('../lang/isArray');
-
-/** Used as the size to enable large array optimizations. */
-var LARGE_ARRAY_SIZE = 200;
-
-/** Used to indicate the type of lazy iteratees. */
-var LAZY_FILTER_FLAG = 1,
-    LAZY_MAP_FLAG = 2;
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMin = Math.min;
-
-/**
- * Extracts the unwrapped value from its lazy wrapper.
- *
- * @private
- * @name value
- * @memberOf LazyWrapper
- * @returns {*} Returns the unwrapped value.
- */
-function lazyValue() {
-  var array = this.__wrapped__.value(),
-      dir = this.__dir__,
-      isArr = isArray(array),
-      isRight = dir < 0,
-      arrLength = isArr ? array.length : 0,
-      view = getView(0, arrLength, this.__views__),
-      start = view.start,
-      end = view.end,
-      length = end - start,
-      index = isRight ? end : (start - 1),
-      iteratees = this.__iteratees__,
-      iterLength = iteratees.length,
-      resIndex = 0,
-      takeCount = nativeMin(length, this.__takeCount__);
-
-  if (!isArr || arrLength < LARGE_ARRAY_SIZE || (arrLength == length && takeCount == length)) {
-    return baseWrapperValue(array, this.__actions__);
-  }
-  var result = [];
-
-  outer:
-  while (length-- && resIndex < takeCount) {
-    index += dir;
-
-    var iterIndex = -1,
-        value = array[index];
-
-    while (++iterIndex < iterLength) {
-      var data = iteratees[iterIndex],
-          iteratee = data.iteratee,
-          type = data.type,
-          computed = iteratee(value);
-
-      if (type == LAZY_MAP_FLAG) {
-        value = computed;
-      } else if (!computed) {
-        if (type == LAZY_FILTER_FLAG) {
-          continue outer;
-        } else {
-          break outer;
-        }
-      }
-    }
-    result[resIndex++] = value;
-  }
-  return result;
-}
-
-module.exports = lazyValue;
diff --git a/node_modules/lodash/internal/mapDelete.js b/node_modules/lodash/internal/mapDelete.js
deleted file mode 100644
index 8b7fd53..0000000
--- a/node_modules/lodash/internal/mapDelete.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Removes `key` and its value from the cache.
- *
- * @private
- * @name delete
- * @memberOf _.memoize.Cache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed successfully, else `false`.
- */
-function mapDelete(key) {
-  return this.has(key) && delete this.__data__[key];
-}
-
-module.exports = mapDelete;
diff --git a/node_modules/lodash/internal/mapGet.js b/node_modules/lodash/internal/mapGet.js
deleted file mode 100644
index 1f22295..0000000
--- a/node_modules/lodash/internal/mapGet.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * Gets the cached value for `key`.
- *
- * @private
- * @name get
- * @memberOf _.memoize.Cache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the cached value.
- */
-function mapGet(key) {
-  return key == '__proto__' ? undefined : this.__data__[key];
-}
-
-module.exports = mapGet;
diff --git a/node_modules/lodash/internal/mapHas.js b/node_modules/lodash/internal/mapHas.js
deleted file mode 100644
index 6d94ce4..0000000
--- a/node_modules/lodash/internal/mapHas.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Checks if a cached value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf _.memoize.Cache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
-function mapHas(key) {
-  return key != '__proto__' && hasOwnProperty.call(this.__data__, key);
-}
-
-module.exports = mapHas;
diff --git a/node_modules/lodash/internal/mapSet.js b/node_modules/lodash/internal/mapSet.js
deleted file mode 100644
index 0434c3f..0000000
--- a/node_modules/lodash/internal/mapSet.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * Sets `value` to `key` of the cache.
- *
- * @private
- * @name set
- * @memberOf _.memoize.Cache
- * @param {string} key The key of the value to cache.
- * @param {*} value The value to cache.
- * @returns {Object} Returns the cache object.
- */
-function mapSet(key, value) {
-  if (key != '__proto__') {
-    this.__data__[key] = value;
-  }
-  return this;
-}
-
-module.exports = mapSet;
diff --git a/node_modules/lodash/internal/mergeData.js b/node_modules/lodash/internal/mergeData.js
deleted file mode 100644
index 29297c7..0000000
--- a/node_modules/lodash/internal/mergeData.js
+++ /dev/null
@@ -1,89 +0,0 @@
-var arrayCopy = require('./arrayCopy'),
-    composeArgs = require('./composeArgs'),
-    composeArgsRight = require('./composeArgsRight'),
-    replaceHolders = require('./replaceHolders');
-
-/** Used to compose bitmasks for wrapper metadata. */
-var BIND_FLAG = 1,
-    CURRY_BOUND_FLAG = 4,
-    CURRY_FLAG = 8,
-    ARY_FLAG = 128,
-    REARG_FLAG = 256;
-
-/** Used as the internal argument placeholder. */
-var PLACEHOLDER = '__lodash_placeholder__';
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMin = Math.min;
-
-/**
- * Merges the function metadata of `source` into `data`.
- *
- * Merging metadata reduces the number of wrappers required to invoke a function.
- * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
- * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`
- * augment function arguments, making the order in which they are executed important,
- * preventing the merging of metadata. However, we make an exception for a safe
- * common case where curried functions have `_.ary` and or `_.rearg` applied.
- *
- * @private
- * @param {Array} data The destination metadata.
- * @param {Array} source The source metadata.
- * @returns {Array} Returns `data`.
- */
-function mergeData(data, source) {
-  var bitmask = data[1],
-      srcBitmask = source[1],
-      newBitmask = bitmask | srcBitmask,
-      isCommon = newBitmask < ARY_FLAG;
-
-  var isCombo =
-    (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) ||
-    (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) ||
-    (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG);
-
-  // Exit early if metadata can't be merged.
-  if (!(isCommon || isCombo)) {
-    return data;
-  }
-  // Use source `thisArg` if available.
-  if (srcBitmask & BIND_FLAG) {
-    data[2] = source[2];
-    // Set when currying a bound function.
-    newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG;
-  }
-  // Compose partial arguments.
-  var value = source[3];
-  if (value) {
-    var partials = data[3];
-    data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value);
-    data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]);
-  }
-  // Compose partial right arguments.
-  value = source[5];
-  if (value) {
-    partials = data[5];
-    data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value);
-    data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]);
-  }
-  // Use source `argPos` if available.
-  value = source[7];
-  if (value) {
-    data[7] = arrayCopy(value);
-  }
-  // Use source `ary` if it's smaller.
-  if (srcBitmask & ARY_FLAG) {
-    data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
-  }
-  // Use source `arity` if one is not provided.
-  if (data[9] == null) {
-    data[9] = source[9];
-  }
-  // Use source `func` and merge bitmasks.
-  data[0] = source[0];
-  data[1] = newBitmask;
-
-  return data;
-}
-
-module.exports = mergeData;
diff --git a/node_modules/lodash/internal/mergeDefaults.js b/node_modules/lodash/internal/mergeDefaults.js
deleted file mode 100644
index dcd967e..0000000
--- a/node_modules/lodash/internal/mergeDefaults.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var merge = require('../object/merge');
-
-/**
- * Used by `_.defaultsDeep` to customize its `_.merge` use.
- *
- * @private
- * @param {*} objectValue The destination object property value.
- * @param {*} sourceValue The source object property value.
- * @returns {*} Returns the value to assign to the destination object.
- */
-function mergeDefaults(objectValue, sourceValue) {
-  return objectValue === undefined ? sourceValue : merge(objectValue, sourceValue, mergeDefaults);
-}
-
-module.exports = mergeDefaults;
diff --git a/node_modules/lodash/internal/metaMap.js b/node_modules/lodash/internal/metaMap.js
deleted file mode 100644
index 59bfd5f..0000000
--- a/node_modules/lodash/internal/metaMap.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var getNative = require('./getNative');
-
-/** Native method references. */
-var WeakMap = getNative(global, 'WeakMap');
-
-/** Used to store function metadata. */
-var metaMap = WeakMap && new WeakMap;
-
-module.exports = metaMap;
diff --git a/node_modules/lodash/internal/pickByArray.js b/node_modules/lodash/internal/pickByArray.js
deleted file mode 100644
index 0999d90..0000000
--- a/node_modules/lodash/internal/pickByArray.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var toObject = require('./toObject');
-
-/**
- * A specialized version of `_.pick` which picks `object` properties specified
- * by `props`.
- *
- * @private
- * @param {Object} object The source object.
- * @param {string[]} props The property names to pick.
- * @returns {Object} Returns the new object.
- */
-function pickByArray(object, props) {
-  object = toObject(object);
-
-  var index = -1,
-      length = props.length,
-      result = {};
-
-  while (++index < length) {
-    var key = props[index];
-    if (key in object) {
-      result[key] = object[key];
-    }
-  }
-  return result;
-}
-
-module.exports = pickByArray;
diff --git a/node_modules/lodash/internal/pickByCallback.js b/node_modules/lodash/internal/pickByCallback.js
deleted file mode 100644
index 79d3cdc..0000000
--- a/node_modules/lodash/internal/pickByCallback.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var baseForIn = require('./baseForIn');
-
-/**
- * A specialized version of `_.pick` which picks `object` properties `predicate`
- * returns truthy for.
- *
- * @private
- * @param {Object} object The source object.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {Object} Returns the new object.
- */
-function pickByCallback(object, predicate) {
-  var result = {};
-  baseForIn(object, function(value, key, object) {
-    if (predicate(value, key, object)) {
-      result[key] = value;
-    }
-  });
-  return result;
-}
-
-module.exports = pickByCallback;
diff --git a/node_modules/lodash/internal/reEscape.js b/node_modules/lodash/internal/reEscape.js
deleted file mode 100644
index 7f47eda..0000000
--- a/node_modules/lodash/internal/reEscape.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/** Used to match template delimiters. */
-var reEscape = /<%-([\s\S]+?)%>/g;
-
-module.exports = reEscape;
diff --git a/node_modules/lodash/internal/reEvaluate.js b/node_modules/lodash/internal/reEvaluate.js
deleted file mode 100644
index 6adfc31..0000000
--- a/node_modules/lodash/internal/reEvaluate.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/** Used to match template delimiters. */
-var reEvaluate = /<%([\s\S]+?)%>/g;
-
-module.exports = reEvaluate;
diff --git a/node_modules/lodash/internal/reInterpolate.js b/node_modules/lodash/internal/reInterpolate.js
deleted file mode 100644
index d02ff0b..0000000
--- a/node_modules/lodash/internal/reInterpolate.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/** Used to match template delimiters. */
-var reInterpolate = /<%=([\s\S]+?)%>/g;
-
-module.exports = reInterpolate;
diff --git a/node_modules/lodash/internal/realNames.js b/node_modules/lodash/internal/realNames.js
deleted file mode 100644
index aa0d529..0000000
--- a/node_modules/lodash/internal/realNames.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/** Used to lookup unminified function names. */
-var realNames = {};
-
-module.exports = realNames;
diff --git a/node_modules/lodash/internal/reorder.js b/node_modules/lodash/internal/reorder.js
deleted file mode 100644
index 9424927..0000000
--- a/node_modules/lodash/internal/reorder.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var arrayCopy = require('./arrayCopy'),
-    isIndex = require('./isIndex');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMin = Math.min;
-
-/**
- * Reorder `array` according to the specified indexes where the element at
- * the first index is assigned as the first element, the element at
- * the second index is assigned as the second element, and so on.
- *
- * @private
- * @param {Array} array The array to reorder.
- * @param {Array} indexes The arranged array indexes.
- * @returns {Array} Returns `array`.
- */
-function reorder(array, indexes) {
-  var arrLength = array.length,
-      length = nativeMin(indexes.length, arrLength),
-      oldArray = arrayCopy(array);
-
-  while (length--) {
-    var index = indexes[length];
-    array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
-  }
-  return array;
-}
-
-module.exports = reorder;
diff --git a/node_modules/lodash/internal/replaceHolders.js b/node_modules/lodash/internal/replaceHolders.js
deleted file mode 100644
index 3089e75..0000000
--- a/node_modules/lodash/internal/replaceHolders.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/** Used as the internal argument placeholder. */
-var PLACEHOLDER = '__lodash_placeholder__';
-
-/**
- * Replaces all `placeholder` elements in `array` with an internal placeholder
- * and returns an array of their indexes.
- *
- * @private
- * @param {Array} array The array to modify.
- * @param {*} placeholder The placeholder to replace.
- * @returns {Array} Returns the new array of placeholder indexes.
- */
-function replaceHolders(array, placeholder) {
-  var index = -1,
-      length = array.length,
-      resIndex = -1,
-      result = [];
-
-  while (++index < length) {
-    if (array[index] === placeholder) {
-      array[index] = PLACEHOLDER;
-      result[++resIndex] = index;
-    }
-  }
-  return result;
-}
-
-module.exports = replaceHolders;
diff --git a/node_modules/lodash/internal/setData.js b/node_modules/lodash/internal/setData.js
deleted file mode 100644
index 7eb3f40..0000000
--- a/node_modules/lodash/internal/setData.js
+++ /dev/null
@@ -1,41 +0,0 @@
-var baseSetData = require('./baseSetData'),
-    now = require('../date/now');
-
-/** Used to detect when a function becomes hot. */
-var HOT_COUNT = 150,
-    HOT_SPAN = 16;
-
-/**
- * Sets metadata for `func`.
- *
- * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
- * period of time, it will trip its breaker and transition to an identity function
- * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070)
- * for more details.
- *
- * @private
- * @param {Function} func The function to associate metadata with.
- * @param {*} data The metadata.
- * @returns {Function} Returns `func`.
- */
-var setData = (function() {
-  var count = 0,
-      lastCalled = 0;
-
-  return function(key, value) {
-    var stamp = now(),
-        remaining = HOT_SPAN - (stamp - lastCalled);
-
-    lastCalled = stamp;
-    if (remaining > 0) {
-      if (++count >= HOT_COUNT) {
-        return key;
-      }
-    } else {
-      count = 0;
-    }
-    return baseSetData(key, value);
-  };
-}());
-
-module.exports = setData;
diff --git a/node_modules/lodash/internal/shimKeys.js b/node_modules/lodash/internal/shimKeys.js
deleted file mode 100644
index 189e492..0000000
--- a/node_modules/lodash/internal/shimKeys.js
+++ /dev/null
@@ -1,41 +0,0 @@
-var isArguments = require('../lang/isArguments'),
-    isArray = require('../lang/isArray'),
-    isIndex = require('./isIndex'),
-    isLength = require('./isLength'),
-    keysIn = require('../object/keysIn');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * A fallback implementation of `Object.keys` which creates an array of the
- * own enumerable property names of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- */
-function shimKeys(object) {
-  var props = keysIn(object),
-      propsLength = props.length,
-      length = propsLength && object.length;
-
-  var allowIndexes = !!length && isLength(length) &&
-    (isArray(object) || isArguments(object));
-
-  var index = -1,
-      result = [];
-
-  while (++index < propsLength) {
-    var key = props[index];
-    if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
-      result.push(key);
-    }
-  }
-  return result;
-}
-
-module.exports = shimKeys;
diff --git a/node_modules/lodash/internal/sortedUniq.js b/node_modules/lodash/internal/sortedUniq.js
deleted file mode 100644
index 3ede46a..0000000
--- a/node_modules/lodash/internal/sortedUniq.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * An implementation of `_.uniq` optimized for sorted arrays without support
- * for callback shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {Function} [iteratee] The function invoked per iteration.
- * @returns {Array} Returns the new duplicate free array.
- */
-function sortedUniq(array, iteratee) {
-  var seen,
-      index = -1,
-      length = array.length,
-      resIndex = -1,
-      result = [];
-
-  while (++index < length) {
-    var value = array[index],
-        computed = iteratee ? iteratee(value, index, array) : value;
-
-    if (!index || seen !== computed) {
-      seen = computed;
-      result[++resIndex] = value;
-    }
-  }
-  return result;
-}
-
-module.exports = sortedUniq;
diff --git a/node_modules/lodash/internal/toIterable.js b/node_modules/lodash/internal/toIterable.js
deleted file mode 100644
index c0a5b28..0000000
--- a/node_modules/lodash/internal/toIterable.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var isArrayLike = require('./isArrayLike'),
-    isObject = require('../lang/isObject'),
-    values = require('../object/values');
-
-/**
- * Converts `value` to an array-like object if it's not one.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {Array|Object} Returns the array-like object.
- */
-function toIterable(value) {
-  if (value == null) {
-    return [];
-  }
-  if (!isArrayLike(value)) {
-    return values(value);
-  }
-  return isObject(value) ? value : Object(value);
-}
-
-module.exports = toIterable;
diff --git a/node_modules/lodash/internal/toObject.js b/node_modules/lodash/internal/toObject.js
deleted file mode 100644
index da4a008..0000000
--- a/node_modules/lodash/internal/toObject.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var isObject = require('../lang/isObject');
-
-/**
- * Converts `value` to an object if it's not one.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {Object} Returns the object.
- */
-function toObject(value) {
-  return isObject(value) ? value : Object(value);
-}
-
-module.exports = toObject;
diff --git a/node_modules/lodash/internal/toPath.js b/node_modules/lodash/internal/toPath.js
deleted file mode 100644
index d29f1eb..0000000
--- a/node_modules/lodash/internal/toPath.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var baseToString = require('./baseToString'),
-    isArray = require('../lang/isArray');
-
-/** Used to match property names within property paths. */
-var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g;
-
-/** Used to match backslashes in property paths. */
-var reEscapeChar = /\\(\\)?/g;
-
-/**
- * Converts `value` to property path array if it's not one.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {Array} Returns the property path array.
- */
-function toPath(value) {
-  if (isArray(value)) {
-    return value;
-  }
-  var result = [];
-  baseToString(value).replace(rePropName, function(match, number, quote, string) {
-    result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
-  });
-  return result;
-}
-
-module.exports = toPath;
diff --git a/node_modules/lodash/internal/trimmedLeftIndex.js b/node_modules/lodash/internal/trimmedLeftIndex.js
deleted file mode 100644
index 08aeb13..0000000
--- a/node_modules/lodash/internal/trimmedLeftIndex.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var isSpace = require('./isSpace');
-
-/**
- * Used by `_.trim` and `_.trimLeft` to get the index of the first non-whitespace
- * character of `string`.
- *
- * @private
- * @param {string} string The string to inspect.
- * @returns {number} Returns the index of the first non-whitespace character.
- */
-function trimmedLeftIndex(string) {
-  var index = -1,
-      length = string.length;
-
-  while (++index < length && isSpace(string.charCodeAt(index))) {}
-  return index;
-}
-
-module.exports = trimmedLeftIndex;
diff --git a/node_modules/lodash/internal/trimmedRightIndex.js b/node_modules/lodash/internal/trimmedRightIndex.js
deleted file mode 100644
index 71b9e38..0000000
--- a/node_modules/lodash/internal/trimmedRightIndex.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var isSpace = require('./isSpace');
-
-/**
- * Used by `_.trim` and `_.trimRight` to get the index of the last non-whitespace
- * character of `string`.
- *
- * @private
- * @param {string} string The string to inspect.
- * @returns {number} Returns the index of the last non-whitespace character.
- */
-function trimmedRightIndex(string) {
-  var index = string.length;
-
-  while (index-- && isSpace(string.charCodeAt(index))) {}
-  return index;
-}
-
-module.exports = trimmedRightIndex;
diff --git a/node_modules/lodash/internal/unescapeHtmlChar.js b/node_modules/lodash/internal/unescapeHtmlChar.js
deleted file mode 100644
index 28b3454..0000000
--- a/node_modules/lodash/internal/unescapeHtmlChar.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/** Used to map HTML entities to characters. */
-var htmlUnescapes = {
-  '&amp;': '&',
-  '&lt;': '<',
-  '&gt;': '>',
-  '&quot;': '"',
-  '&#39;': "'",
-  '&#96;': '`'
-};
-
-/**
- * Used by `_.unescape` to convert HTML entities to characters.
- *
- * @private
- * @param {string} chr The matched character to unescape.
- * @returns {string} Returns the unescaped character.
- */
-function unescapeHtmlChar(chr) {
-  return htmlUnescapes[chr];
-}
-
-module.exports = unescapeHtmlChar;
diff --git a/node_modules/lodash/internal/wrapperClone.js b/node_modules/lodash/internal/wrapperClone.js
deleted file mode 100644
index e5e10da..0000000
--- a/node_modules/lodash/internal/wrapperClone.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var LazyWrapper = require('./LazyWrapper'),
-    LodashWrapper = require('./LodashWrapper'),
-    arrayCopy = require('./arrayCopy');
-
-/**
- * Creates a clone of `wrapper`.
- *
- * @private
- * @param {Object} wrapper The wrapper to clone.
- * @returns {Object} Returns the cloned wrapper.
- */
-function wrapperClone(wrapper) {
-  return wrapper instanceof LazyWrapper
-    ? wrapper.clone()
-    : new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__, arrayCopy(wrapper.__actions__));
-}
-
-module.exports = wrapperClone;
diff --git a/node_modules/lodash/lang.js b/node_modules/lodash/lang.js
deleted file mode 100644
index 8f0a364..0000000
--- a/node_modules/lodash/lang.js
+++ /dev/null
@@ -1,32 +0,0 @@
-module.exports = {
-  'clone': require('./lang/clone'),
-  'cloneDeep': require('./lang/cloneDeep'),
-  'eq': require('./lang/eq'),
-  'gt': require('./lang/gt'),
-  'gte': require('./lang/gte'),
-  'isArguments': require('./lang/isArguments'),
-  'isArray': require('./lang/isArray'),
-  'isBoolean': require('./lang/isBoolean'),
-  'isDate': require('./lang/isDate'),
-  'isElement': require('./lang/isElement'),
-  'isEmpty': require('./lang/isEmpty'),
-  'isEqual': require('./lang/isEqual'),
-  'isError': require('./lang/isError'),
-  'isFinite': require('./lang/isFinite'),
-  'isFunction': require('./lang/isFunction'),
-  'isMatch': require('./lang/isMatch'),
-  'isNaN': require('./lang/isNaN'),
-  'isNative': require('./lang/isNative'),
-  'isNull': require('./lang/isNull'),
-  'isNumber': require('./lang/isNumber'),
-  'isObject': require('./lang/isObject'),
-  'isPlainObject': require('./lang/isPlainObject'),
-  'isRegExp': require('./lang/isRegExp'),
-  'isString': require('./lang/isString'),
-  'isTypedArray': require('./lang/isTypedArray'),
-  'isUndefined': require('./lang/isUndefined'),
-  'lt': require('./lang/lt'),
-  'lte': require('./lang/lte'),
-  'toArray': require('./lang/toArray'),
-  'toPlainObject': require('./lang/toPlainObject')
-};
diff --git a/node_modules/lodash/lang/clone.js b/node_modules/lodash/lang/clone.js
deleted file mode 100644
index 85ee8fe..0000000
--- a/node_modules/lodash/lang/clone.js
+++ /dev/null
@@ -1,70 +0,0 @@
-var baseClone = require('../internal/baseClone'),
-    bindCallback = require('../internal/bindCallback'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,
- * otherwise they are assigned by reference. If `customizer` is provided it's
- * invoked to produce the cloned values. If `customizer` returns `undefined`
- * cloning is handled by the method instead. The `customizer` is bound to
- * `thisArg` and invoked with up to three argument; (value [, index|key, object]).
- *
- * **Note:** This method is loosely based on the
- * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
- * The enumerable properties of `arguments` objects and objects created by
- * constructors other than `Object` are cloned to plain `Object` objects. An
- * empty object is returned for uncloneable values such as functions, DOM nodes,
- * Maps, Sets, and WeakMaps.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to clone.
- * @param {boolean} [isDeep] Specify a deep clone.
- * @param {Function} [customizer] The function to customize cloning values.
- * @param {*} [thisArg] The `this` binding of `customizer`.
- * @returns {*} Returns the cloned value.
- * @example
- *
- * var users = [
- *   { 'user': 'barney' },
- *   { 'user': 'fred' }
- * ];
- *
- * var shallow = _.clone(users);
- * shallow[0] === users[0];
- * // => true
- *
- * var deep = _.clone(users, true);
- * deep[0] === users[0];
- * // => false
- *
- * // using a customizer callback
- * var el = _.clone(document.body, function(value) {
- *   if (_.isElement(value)) {
- *     return value.cloneNode(false);
- *   }
- * });
- *
- * el === document.body
- * // => false
- * el.nodeName
- * // => BODY
- * el.childNodes.length;
- * // => 0
- */
-function clone(value, isDeep, customizer, thisArg) {
-  if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) {
-    isDeep = false;
-  }
-  else if (typeof isDeep == 'function') {
-    thisArg = customizer;
-    customizer = isDeep;
-    isDeep = false;
-  }
-  return typeof customizer == 'function'
-    ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 3))
-    : baseClone(value, isDeep);
-}
-
-module.exports = clone;
diff --git a/node_modules/lodash/lang/cloneDeep.js b/node_modules/lodash/lang/cloneDeep.js
deleted file mode 100644
index c4d2517..0000000
--- a/node_modules/lodash/lang/cloneDeep.js
+++ /dev/null
@@ -1,55 +0,0 @@
-var baseClone = require('../internal/baseClone'),
-    bindCallback = require('../internal/bindCallback');
-
-/**
- * Creates a deep clone of `value`. If `customizer` is provided it's invoked
- * to produce the cloned values. If `customizer` returns `undefined` cloning
- * is handled by the method instead. The `customizer` is bound to `thisArg`
- * and invoked with up to three argument; (value [, index|key, object]).
- *
- * **Note:** This method is loosely based on the
- * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
- * The enumerable properties of `arguments` objects and objects created by
- * constructors other than `Object` are cloned to plain `Object` objects. An
- * empty object is returned for uncloneable values such as functions, DOM nodes,
- * Maps, Sets, and WeakMaps.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to deep clone.
- * @param {Function} [customizer] The function to customize cloning values.
- * @param {*} [thisArg] The `this` binding of `customizer`.
- * @returns {*} Returns the deep cloned value.
- * @example
- *
- * var users = [
- *   { 'user': 'barney' },
- *   { 'user': 'fred' }
- * ];
- *
- * var deep = _.cloneDeep(users);
- * deep[0] === users[0];
- * // => false
- *
- * // using a customizer callback
- * var el = _.cloneDeep(document.body, function(value) {
- *   if (_.isElement(value)) {
- *     return value.cloneNode(true);
- *   }
- * });
- *
- * el === document.body
- * // => false
- * el.nodeName
- * // => BODY
- * el.childNodes.length;
- * // => 20
- */
-function cloneDeep(value, customizer, thisArg) {
-  return typeof customizer == 'function'
-    ? baseClone(value, true, bindCallback(customizer, thisArg, 3))
-    : baseClone(value, true);
-}
-
-module.exports = cloneDeep;
diff --git a/node_modules/lodash/lang/eq.js b/node_modules/lodash/lang/eq.js
deleted file mode 100644
index e6a5ce0..0000000
--- a/node_modules/lodash/lang/eq.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./isEqual');
diff --git a/node_modules/lodash/lang/gt.js b/node_modules/lodash/lang/gt.js
deleted file mode 100644
index ddaf5ea..0000000
--- a/node_modules/lodash/lang/gt.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * Checks if `value` is greater than `other`.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @returns {boolean} Returns `true` if `value` is greater than `other`, else `false`.
- * @example
- *
- * _.gt(3, 1);
- * // => true
- *
- * _.gt(3, 3);
- * // => false
- *
- * _.gt(1, 3);
- * // => false
- */
-function gt(value, other) {
-  return value > other;
-}
-
-module.exports = gt;
diff --git a/node_modules/lodash/lang/gte.js b/node_modules/lodash/lang/gte.js
deleted file mode 100644
index 4a5ffb5..0000000
--- a/node_modules/lodash/lang/gte.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * Checks if `value` is greater than or equal to `other`.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @returns {boolean} Returns `true` if `value` is greater than or equal to `other`, else `false`.
- * @example
- *
- * _.gte(3, 1);
- * // => true
- *
- * _.gte(3, 3);
- * // => true
- *
- * _.gte(1, 3);
- * // => false
- */
-function gte(value, other) {
-  return value >= other;
-}
-
-module.exports = gte;
diff --git a/node_modules/lodash/lang/isArguments.js b/node_modules/lodash/lang/isArguments.js
deleted file mode 100644
index ce9763d..0000000
--- a/node_modules/lodash/lang/isArguments.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var isArrayLike = require('../internal/isArrayLike'),
-    isObjectLike = require('../internal/isObjectLike');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/** Native method references. */
-var propertyIsEnumerable = objectProto.propertyIsEnumerable;
-
-/**
- * Checks if `value` is classified as an `arguments` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isArguments(function() { return arguments; }());
- * // => true
- *
- * _.isArguments([1, 2, 3]);
- * // => false
- */
-function isArguments(value) {
-  return isObjectLike(value) && isArrayLike(value) &&
-    hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
-}
-
-module.exports = isArguments;
diff --git a/node_modules/lodash/lang/isArray.js b/node_modules/lodash/lang/isArray.js
deleted file mode 100644
index 9ab023a..0000000
--- a/node_modules/lodash/lang/isArray.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var getNative = require('../internal/getNative'),
-    isLength = require('../internal/isLength'),
-    isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var arrayTag = '[object Array]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeIsArray = getNative(Array, 'isArray');
-
-/**
- * Checks if `value` is classified as an `Array` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isArray([1, 2, 3]);
- * // => true
- *
- * _.isArray(function() { return arguments; }());
- * // => false
- */
-var isArray = nativeIsArray || function(value) {
-  return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
-};
-
-module.exports = isArray;
diff --git a/node_modules/lodash/lang/isBoolean.js b/node_modules/lodash/lang/isBoolean.js
deleted file mode 100644
index 460e6c5..0000000
--- a/node_modules/lodash/lang/isBoolean.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var boolTag = '[object Boolean]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is classified as a boolean primitive or object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isBoolean(false);
- * // => true
- *
- * _.isBoolean(null);
- * // => false
- */
-function isBoolean(value) {
-  return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag);
-}
-
-module.exports = isBoolean;
diff --git a/node_modules/lodash/lang/isDate.js b/node_modules/lodash/lang/isDate.js
deleted file mode 100644
index 29850d9..0000000
--- a/node_modules/lodash/lang/isDate.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var dateTag = '[object Date]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is classified as a `Date` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isDate(new Date);
- * // => true
- *
- * _.isDate('Mon April 23 2012');
- * // => false
- */
-function isDate(value) {
-  return isObjectLike(value) && objToString.call(value) == dateTag;
-}
-
-module.exports = isDate;
diff --git a/node_modules/lodash/lang/isElement.js b/node_modules/lodash/lang/isElement.js
deleted file mode 100644
index 2e9c970..0000000
--- a/node_modules/lodash/lang/isElement.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var isObjectLike = require('../internal/isObjectLike'),
-    isPlainObject = require('./isPlainObject');
-
-/**
- * Checks if `value` is a DOM element.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
- * @example
- *
- * _.isElement(document.body);
- * // => true
- *
- * _.isElement('<body>');
- * // => false
- */
-function isElement(value) {
-  return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);
-}
-
-module.exports = isElement;
diff --git a/node_modules/lodash/lang/isEmpty.js b/node_modules/lodash/lang/isEmpty.js
deleted file mode 100644
index 6b344a0..0000000
--- a/node_modules/lodash/lang/isEmpty.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var isArguments = require('./isArguments'),
-    isArray = require('./isArray'),
-    isArrayLike = require('../internal/isArrayLike'),
-    isFunction = require('./isFunction'),
-    isObjectLike = require('../internal/isObjectLike'),
-    isString = require('./isString'),
-    keys = require('../object/keys');
-
-/**
- * Checks if `value` is empty. A value is considered empty unless it's an
- * `arguments` object, array, string, or jQuery-like collection with a length
- * greater than `0` or an object with own enumerable properties.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {Array|Object|string} value The value to inspect.
- * @returns {boolean} Returns `true` if `value` is empty, else `false`.
- * @example
- *
- * _.isEmpty(null);
- * // => true
- *
- * _.isEmpty(true);
- * // => true
- *
- * _.isEmpty(1);
- * // => true
- *
- * _.isEmpty([1, 2, 3]);
- * // => false
- *
- * _.isEmpty({ 'a': 1 });
- * // => false
- */
-function isEmpty(value) {
-  if (value == null) {
-    return true;
-  }
-  if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) ||
-      (isObjectLike(value) && isFunction(value.splice)))) {
-    return !value.length;
-  }
-  return !keys(value).length;
-}
-
-module.exports = isEmpty;
diff --git a/node_modules/lodash/lang/isEqual.js b/node_modules/lodash/lang/isEqual.js
deleted file mode 100644
index 41bf568..0000000
--- a/node_modules/lodash/lang/isEqual.js
+++ /dev/null
@@ -1,54 +0,0 @@
-var baseIsEqual = require('../internal/baseIsEqual'),
-    bindCallback = require('../internal/bindCallback');
-
-/**
- * Performs a deep comparison between two values to determine if they are
- * equivalent. If `customizer` is provided it's invoked to compare values.
- * If `customizer` returns `undefined` comparisons are handled by the method
- * instead. The `customizer` is bound to `thisArg` and invoked with up to
- * three arguments: (value, other [, index|key]).
- *
- * **Note:** This method supports comparing arrays, booleans, `Date` objects,
- * numbers, `Object` objects, regexes, and strings. Objects are compared by
- * their own, not inherited, enumerable properties. Functions and DOM nodes
- * are **not** supported. Provide a customizer function to extend support
- * for comparing other values.
- *
- * @static
- * @memberOf _
- * @alias eq
- * @category Lang
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @param {Function} [customizer] The function to customize value comparisons.
- * @param {*} [thisArg] The `this` binding of `customizer`.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- * @example
- *
- * var object = { 'user': 'fred' };
- * var other = { 'user': 'fred' };
- *
- * object == other;
- * // => false
- *
- * _.isEqual(object, other);
- * // => true
- *
- * // using a customizer callback
- * var array = ['hello', 'goodbye'];
- * var other = ['hi', 'goodbye'];
- *
- * _.isEqual(array, other, function(value, other) {
- *   if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) {
- *     return true;
- *   }
- * });
- * // => true
- */
-function isEqual(value, other, customizer, thisArg) {
-  customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;
-  var result = customizer ? customizer(value, other) : undefined;
-  return  result === undefined ? baseIsEqual(value, other, customizer) : !!result;
-}
-
-module.exports = isEqual;
diff --git a/node_modules/lodash/lang/isError.js b/node_modules/lodash/lang/isError.js
deleted file mode 100644
index a7bb0d0..0000000
--- a/node_modules/lodash/lang/isError.js
+++ /dev/null
@@ -1,36 +0,0 @@
-var isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var errorTag = '[object Error]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
- * `SyntaxError`, `TypeError`, or `URIError` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
- * @example
- *
- * _.isError(new Error);
- * // => true
- *
- * _.isError(Error);
- * // => false
- */
-function isError(value) {
-  return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;
-}
-
-module.exports = isError;
diff --git a/node_modules/lodash/lang/isFinite.js b/node_modules/lodash/lang/isFinite.js
deleted file mode 100644
index e01a307..0000000
--- a/node_modules/lodash/lang/isFinite.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeIsFinite = global.isFinite;
-
-/**
- * Checks if `value` is a finite primitive number.
- *
- * **Note:** This method is based on [`Number.isFinite`](http://ecma-international.org/ecma-262/6.0/#sec-number.isfinite).
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
- * @example
- *
- * _.isFinite(10);
- * // => true
- *
- * _.isFinite('10');
- * // => false
- *
- * _.isFinite(true);
- * // => false
- *
- * _.isFinite(Object(10));
- * // => false
- *
- * _.isFinite(Infinity);
- * // => false
- */
-function isFinite(value) {
-  return typeof value == 'number' && nativeIsFinite(value);
-}
-
-module.exports = isFinite;
diff --git a/node_modules/lodash/lang/isFunction.js b/node_modules/lodash/lang/isFunction.js
deleted file mode 100644
index abe5668..0000000
--- a/node_modules/lodash/lang/isFunction.js
+++ /dev/null
@@ -1,38 +0,0 @@
-var isObject = require('./isObject');
-
-/** `Object#toString` result references. */
-var funcTag = '[object Function]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
-function isFunction(value) {
-  // The use of `Object#toString` avoids issues with the `typeof` operator
-  // in older versions of Chrome and Safari which return 'function' for regexes
-  // and Safari 8 which returns 'object' for typed array constructors.
-  return isObject(value) && objToString.call(value) == funcTag;
-}
-
-module.exports = isFunction;
diff --git a/node_modules/lodash/lang/isMatch.js b/node_modules/lodash/lang/isMatch.js
deleted file mode 100644
index 0a51d49..0000000
--- a/node_modules/lodash/lang/isMatch.js
+++ /dev/null
@@ -1,49 +0,0 @@
-var baseIsMatch = require('../internal/baseIsMatch'),
-    bindCallback = require('../internal/bindCallback'),
-    getMatchData = require('../internal/getMatchData');
-
-/**
- * Performs a deep comparison between `object` and `source` to determine if
- * `object` contains equivalent property values. If `customizer` is provided
- * it's invoked to compare values. If `customizer` returns `undefined`
- * comparisons are handled by the method instead. The `customizer` is bound
- * to `thisArg` and invoked with three arguments: (value, other, index|key).
- *
- * **Note:** This method supports comparing properties of arrays, booleans,
- * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions
- * and DOM nodes are **not** supported. Provide a customizer function to extend
- * support for comparing other values.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {Object} object The object to inspect.
- * @param {Object} source The object of property values to match.
- * @param {Function} [customizer] The function to customize value comparisons.
- * @param {*} [thisArg] The `this` binding of `customizer`.
- * @returns {boolean} Returns `true` if `object` is a match, else `false`.
- * @example
- *
- * var object = { 'user': 'fred', 'age': 40 };
- *
- * _.isMatch(object, { 'age': 40 });
- * // => true
- *
- * _.isMatch(object, { 'age': 36 });
- * // => false
- *
- * // using a customizer callback
- * var object = { 'greeting': 'hello' };
- * var source = { 'greeting': 'hi' };
- *
- * _.isMatch(object, source, function(value, other) {
- *   return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined;
- * });
- * // => true
- */
-function isMatch(object, source, customizer, thisArg) {
-  customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;
-  return baseIsMatch(object, getMatchData(source), customizer);
-}
-
-module.exports = isMatch;
diff --git a/node_modules/lodash/lang/isNaN.js b/node_modules/lodash/lang/isNaN.js
deleted file mode 100644
index cf83d56..0000000
--- a/node_modules/lodash/lang/isNaN.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var isNumber = require('./isNumber');
-
-/**
- * Checks if `value` is `NaN`.
- *
- * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4)
- * which returns `true` for `undefined` and other non-numeric values.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
- * @example
- *
- * _.isNaN(NaN);
- * // => true
- *
- * _.isNaN(new Number(NaN));
- * // => true
- *
- * isNaN(undefined);
- * // => true
- *
- * _.isNaN(undefined);
- * // => false
- */
-function isNaN(value) {
-  // An `NaN` primitive is the only value that is not equal to itself.
-  // Perform the `toStringTag` check first to avoid errors with some host objects in IE.
-  return isNumber(value) && value != +value;
-}
-
-module.exports = isNaN;
diff --git a/node_modules/lodash/lang/isNative.js b/node_modules/lodash/lang/isNative.js
deleted file mode 100644
index 3ad7144..0000000
--- a/node_modules/lodash/lang/isNative.js
+++ /dev/null
@@ -1,48 +0,0 @@
-var isFunction = require('./isFunction'),
-    isObjectLike = require('../internal/isObjectLike');
-
-/** Used to detect host constructors (Safari > 5). */
-var reIsHostCtor = /^\[object .+?Constructor\]$/;
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to resolve the decompiled source of functions. */
-var fnToString = Function.prototype.toString;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/** Used to detect if a method is native. */
-var reIsNative = RegExp('^' +
-  fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
-  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
-);
-
-/**
- * Checks if `value` is a native function.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
- * @example
- *
- * _.isNative(Array.prototype.push);
- * // => true
- *
- * _.isNative(_);
- * // => false
- */
-function isNative(value) {
-  if (value == null) {
-    return false;
-  }
-  if (isFunction(value)) {
-    return reIsNative.test(fnToString.call(value));
-  }
-  return isObjectLike(value) && reIsHostCtor.test(value);
-}
-
-module.exports = isNative;
diff --git a/node_modules/lodash/lang/isNull.js b/node_modules/lodash/lang/isNull.js
deleted file mode 100644
index ec66c4d..0000000
--- a/node_modules/lodash/lang/isNull.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * Checks if `value` is `null`.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
- * @example
- *
- * _.isNull(null);
- * // => true
- *
- * _.isNull(void 0);
- * // => false
- */
-function isNull(value) {
-  return value === null;
-}
-
-module.exports = isNull;
diff --git a/node_modules/lodash/lang/isNumber.js b/node_modules/lodash/lang/isNumber.js
deleted file mode 100644
index 6764d6f..0000000
--- a/node_modules/lodash/lang/isNumber.js
+++ /dev/null
@@ -1,41 +0,0 @@
-var isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var numberTag = '[object Number]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is classified as a `Number` primitive or object.
- *
- * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified
- * as numbers, use the `_.isFinite` method.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isNumber(8.4);
- * // => true
- *
- * _.isNumber(NaN);
- * // => true
- *
- * _.isNumber('8.4');
- * // => false
- */
-function isNumber(value) {
-  return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag);
-}
-
-module.exports = isNumber;
diff --git a/node_modules/lodash/lang/isObject.js b/node_modules/lodash/lang/isObject.js
deleted file mode 100644
index 6db5998..0000000
--- a/node_modules/lodash/lang/isObject.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
-function isObject(value) {
-  // Avoid a V8 JIT bug in Chrome 19-20.
-  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
-  var type = typeof value;
-  return !!value && (type == 'object' || type == 'function');
-}
-
-module.exports = isObject;
diff --git a/node_modules/lodash/lang/isPlainObject.js b/node_modules/lodash/lang/isPlainObject.js
deleted file mode 100644
index 5b34c83..0000000
--- a/node_modules/lodash/lang/isPlainObject.js
+++ /dev/null
@@ -1,71 +0,0 @@
-var baseForIn = require('../internal/baseForIn'),
-    isArguments = require('./isArguments'),
-    isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var objectTag = '[object Object]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is a plain object, that is, an object created by the
- * `Object` constructor or one with a `[[Prototype]]` of `null`.
- *
- * **Note:** This method assumes objects created by the `Object` constructor
- * have no inherited enumerable properties.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- * }
- *
- * _.isPlainObject(new Foo);
- * // => false
- *
- * _.isPlainObject([1, 2, 3]);
- * // => false
- *
- * _.isPlainObject({ 'x': 0, 'y': 0 });
- * // => true
- *
- * _.isPlainObject(Object.create(null));
- * // => true
- */
-function isPlainObject(value) {
-  var Ctor;
-
-  // Exit early for non `Object` objects.
-  if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isArguments(value)) ||
-      (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {
-    return false;
-  }
-  // IE < 9 iterates inherited properties before own properties. If the first
-  // iterated property is an object's own property then there are no inherited
-  // enumerable properties.
-  var result;
-  // In most environments an object's own properties are iterated before
-  // its inherited properties. If the last iterated property is an object's
-  // own property then there are no inherited enumerable properties.
-  baseForIn(value, function(subValue, key) {
-    result = key;
-  });
-  return result === undefined || hasOwnProperty.call(value, result);
-}
-
-module.exports = isPlainObject;
diff --git a/node_modules/lodash/lang/isRegExp.js b/node_modules/lodash/lang/isRegExp.js
deleted file mode 100644
index f029cbd..0000000
--- a/node_modules/lodash/lang/isRegExp.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var isObject = require('./isObject');
-
-/** `Object#toString` result references. */
-var regexpTag = '[object RegExp]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is classified as a `RegExp` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isRegExp(/abc/);
- * // => true
- *
- * _.isRegExp('/abc/');
- * // => false
- */
-function isRegExp(value) {
-  return isObject(value) && objToString.call(value) == regexpTag;
-}
-
-module.exports = isRegExp;
diff --git a/node_modules/lodash/lang/isString.js b/node_modules/lodash/lang/isString.js
deleted file mode 100644
index 8b28ee1..0000000
--- a/node_modules/lodash/lang/isString.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var stringTag = '[object String]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is classified as a `String` primitive or object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isString('abc');
- * // => true
- *
- * _.isString(1);
- * // => false
- */
-function isString(value) {
-  return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);
-}
-
-module.exports = isString;
diff --git a/node_modules/lodash/lang/isTypedArray.js b/node_modules/lodash/lang/isTypedArray.js
deleted file mode 100644
index 6e8a6e0..0000000
--- a/node_modules/lodash/lang/isTypedArray.js
+++ /dev/null
@@ -1,74 +0,0 @@
-var isLength = require('../internal/isLength'),
-    isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var argsTag = '[object Arguments]',
-    arrayTag = '[object Array]',
-    boolTag = '[object Boolean]',
-    dateTag = '[object Date]',
-    errorTag = '[object Error]',
-    funcTag = '[object Function]',
-    mapTag = '[object Map]',
-    numberTag = '[object Number]',
-    objectTag = '[object Object]',
-    regexpTag = '[object RegExp]',
-    setTag = '[object Set]',
-    stringTag = '[object String]',
-    weakMapTag = '[object WeakMap]';
-
-var arrayBufferTag = '[object ArrayBuffer]',
-    float32Tag = '[object Float32Array]',
-    float64Tag = '[object Float64Array]',
-    int8Tag = '[object Int8Array]',
-    int16Tag = '[object Int16Array]',
-    int32Tag = '[object Int32Array]',
-    uint8Tag = '[object Uint8Array]',
-    uint8ClampedTag = '[object Uint8ClampedArray]',
-    uint16Tag = '[object Uint16Array]',
-    uint32Tag = '[object Uint32Array]';
-
-/** Used to identify `toStringTag` values of typed arrays. */
-var typedArrayTags = {};
-typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
-typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
-typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
-typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
-typedArrayTags[uint32Tag] = true;
-typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
-typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
-typedArrayTags[dateTag] = typedArrayTags[errorTag] =
-typedArrayTags[funcTag] = typedArrayTags[mapTag] =
-typedArrayTags[numberTag] = typedArrayTags[objectTag] =
-typedArrayTags[regexpTag] = typedArrayTags[setTag] =
-typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is classified as a typed array.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isTypedArray(new Uint8Array);
- * // => true
- *
- * _.isTypedArray([]);
- * // => false
- */
-function isTypedArray(value) {
-  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];
-}
-
-module.exports = isTypedArray;
diff --git a/node_modules/lodash/lang/isUndefined.js b/node_modules/lodash/lang/isUndefined.js
deleted file mode 100644
index d64e560..0000000
--- a/node_modules/lodash/lang/isUndefined.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * Checks if `value` is `undefined`.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
- * @example
- *
- * _.isUndefined(void 0);
- * // => true
- *
- * _.isUndefined(null);
- * // => false
- */
-function isUndefined(value) {
-  return value === undefined;
-}
-
-module.exports = isUndefined;
diff --git a/node_modules/lodash/lang/lt.js b/node_modules/lodash/lang/lt.js
deleted file mode 100644
index 4439870..0000000
--- a/node_modules/lodash/lang/lt.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * Checks if `value` is less than `other`.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @returns {boolean} Returns `true` if `value` is less than `other`, else `false`.
- * @example
- *
- * _.lt(1, 3);
- * // => true
- *
- * _.lt(3, 3);
- * // => false
- *
- * _.lt(3, 1);
- * // => false
- */
-function lt(value, other) {
-  return value < other;
-}
-
-module.exports = lt;
diff --git a/node_modules/lodash/lang/lte.js b/node_modules/lodash/lang/lte.js
deleted file mode 100644
index e2b8ab1..0000000
--- a/node_modules/lodash/lang/lte.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * Checks if `value` is less than or equal to `other`.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @returns {boolean} Returns `true` if `value` is less than or equal to `other`, else `false`.
- * @example
- *
- * _.lte(1, 3);
- * // => true
- *
- * _.lte(3, 3);
- * // => true
- *
- * _.lte(3, 1);
- * // => false
- */
-function lte(value, other) {
-  return value <= other;
-}
-
-module.exports = lte;
diff --git a/node_modules/lodash/lang/toArray.js b/node_modules/lodash/lang/toArray.js
deleted file mode 100644
index 72b0b46..0000000
--- a/node_modules/lodash/lang/toArray.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var arrayCopy = require('../internal/arrayCopy'),
-    getLength = require('../internal/getLength'),
-    isLength = require('../internal/isLength'),
-    values = require('../object/values');
-
-/**
- * Converts `value` to an array.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to convert.
- * @returns {Array} Returns the converted array.
- * @example
- *
- * (function() {
- *   return _.toArray(arguments).slice(1);
- * }(1, 2, 3));
- * // => [2, 3]
- */
-function toArray(value) {
-  var length = value ? getLength(value) : 0;
-  if (!isLength(length)) {
-    return values(value);
-  }
-  if (!length) {
-    return [];
-  }
-  return arrayCopy(value);
-}
-
-module.exports = toArray;
diff --git a/node_modules/lodash/lang/toPlainObject.js b/node_modules/lodash/lang/toPlainObject.js
deleted file mode 100644
index 6315176..0000000
--- a/node_modules/lodash/lang/toPlainObject.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var baseCopy = require('../internal/baseCopy'),
-    keysIn = require('../object/keysIn');
-
-/**
- * Converts `value` to a plain object flattening inherited enumerable
- * properties of `value` to own properties of the plain object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to convert.
- * @returns {Object} Returns the converted plain object.
- * @example
- *
- * function Foo() {
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.assign({ 'a': 1 }, new Foo);
- * // => { 'a': 1, 'b': 2 }
- *
- * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
- * // => { 'a': 1, 'b': 2, 'c': 3 }
- */
-function toPlainObject(value) {
-  return baseCopy(value, keysIn(value));
-}
-
-module.exports = toPlainObject;
diff --git a/node_modules/lodash/math.js b/node_modules/lodash/math.js
deleted file mode 100644
index 21409ce..0000000
--- a/node_modules/lodash/math.js
+++ /dev/null
@@ -1,9 +0,0 @@
-module.exports = {
-  'add': require('./math/add'),
-  'ceil': require('./math/ceil'),
-  'floor': require('./math/floor'),
-  'max': require('./math/max'),
-  'min': require('./math/min'),
-  'round': require('./math/round'),
-  'sum': require('./math/sum')
-};
diff --git a/node_modules/lodash/math/add.js b/node_modules/lodash/math/add.js
deleted file mode 100644
index 59ced2f..0000000
--- a/node_modules/lodash/math/add.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Adds two numbers.
- *
- * @static
- * @memberOf _
- * @category Math
- * @param {number} augend The first number to add.
- * @param {number} addend The second number to add.
- * @returns {number} Returns the sum.
- * @example
- *
- * _.add(6, 4);
- * // => 10
- */
-function add(augend, addend) {
-  return (+augend || 0) + (+addend || 0);
-}
-
-module.exports = add;
diff --git a/node_modules/lodash/math/ceil.js b/node_modules/lodash/math/ceil.js
deleted file mode 100644
index 9dbf0c2..0000000
--- a/node_modules/lodash/math/ceil.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var createRound = require('../internal/createRound');
-
-/**
- * Calculates `n` rounded up to `precision`.
- *
- * @static
- * @memberOf _
- * @category Math
- * @param {number} n The number to round up.
- * @param {number} [precision=0] The precision to round up to.
- * @returns {number} Returns the rounded up number.
- * @example
- *
- * _.ceil(4.006);
- * // => 5
- *
- * _.ceil(6.004, 2);
- * // => 6.01
- *
- * _.ceil(6040, -2);
- * // => 6100
- */
-var ceil = createRound('ceil');
-
-module.exports = ceil;
diff --git a/node_modules/lodash/math/floor.js b/node_modules/lodash/math/floor.js
deleted file mode 100644
index e4dcae8..0000000
--- a/node_modules/lodash/math/floor.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var createRound = require('../internal/createRound');
-
-/**
- * Calculates `n` rounded down to `precision`.
- *
- * @static
- * @memberOf _
- * @category Math
- * @param {number} n The number to round down.
- * @param {number} [precision=0] The precision to round down to.
- * @returns {number} Returns the rounded down number.
- * @example
- *
- * _.floor(4.006);
- * // => 4
- *
- * _.floor(0.046, 2);
- * // => 0.04
- *
- * _.floor(4060, -2);
- * // => 4000
- */
-var floor = createRound('floor');
-
-module.exports = floor;
diff --git a/node_modules/lodash/math/max.js b/node_modules/lodash/math/max.js
deleted file mode 100644
index 220c105..0000000
--- a/node_modules/lodash/math/max.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var createExtremum = require('../internal/createExtremum'),
-    gt = require('../lang/gt');
-
-/** Used as references for `-Infinity` and `Infinity`. */
-var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY;
-
-/**
- * Gets the maximum value of `collection`. If `collection` is empty or falsey
- * `-Infinity` is returned. If an iteratee function is provided it's invoked
- * for each value in `collection` to generate the criterion by which the value
- * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
- * arguments: (value, index, collection).
- *
- * If a property name is provided for `iteratee` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `iteratee` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Math
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [iteratee] The function invoked per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {*} Returns the maximum value.
- * @example
- *
- * _.max([4, 2, 8, 6]);
- * // => 8
- *
- * _.max([]);
- * // => -Infinity
- *
- * var users = [
- *   { 'user': 'barney', 'age': 36 },
- *   { 'user': 'fred',   'age': 40 }
- * ];
- *
- * _.max(users, function(chr) {
- *   return chr.age;
- * });
- * // => { 'user': 'fred', 'age': 40 }
- *
- * // using the `_.property` callback shorthand
- * _.max(users, 'age');
- * // => { 'user': 'fred', 'age': 40 }
- */
-var max = createExtremum(gt, NEGATIVE_INFINITY);
-
-module.exports = max;
diff --git a/node_modules/lodash/math/min.js b/node_modules/lodash/math/min.js
deleted file mode 100644
index 6d92d4f..0000000
--- a/node_modules/lodash/math/min.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var createExtremum = require('../internal/createExtremum'),
-    lt = require('../lang/lt');
-
-/** Used as references for `-Infinity` and `Infinity`. */
-var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
-
-/**
- * Gets the minimum value of `collection`. If `collection` is empty or falsey
- * `Infinity` is returned. If an iteratee function is provided it's invoked
- * for each value in `collection` to generate the criterion by which the value
- * is ranked. The `iteratee` is bound to `thisArg` and invoked with three
- * arguments: (value, index, collection).
- *
- * If a property name is provided for `iteratee` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `iteratee` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Math
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [iteratee] The function invoked per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {*} Returns the minimum value.
- * @example
- *
- * _.min([4, 2, 8, 6]);
- * // => 2
- *
- * _.min([]);
- * // => Infinity
- *
- * var users = [
- *   { 'user': 'barney', 'age': 36 },
- *   { 'user': 'fred',   'age': 40 }
- * ];
- *
- * _.min(users, function(chr) {
- *   return chr.age;
- * });
- * // => { 'user': 'barney', 'age': 36 }
- *
- * // using the `_.property` callback shorthand
- * _.min(users, 'age');
- * // => { 'user': 'barney', 'age': 36 }
- */
-var min = createExtremum(lt, POSITIVE_INFINITY);
-
-module.exports = min;
diff --git a/node_modules/lodash/math/round.js b/node_modules/lodash/math/round.js
deleted file mode 100644
index 5c69d0c..0000000
--- a/node_modules/lodash/math/round.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var createRound = require('../internal/createRound');
-
-/**
- * Calculates `n` rounded to `precision`.
- *
- * @static
- * @memberOf _
- * @category Math
- * @param {number} n The number to round.
- * @param {number} [precision=0] The precision to round to.
- * @returns {number} Returns the rounded number.
- * @example
- *
- * _.round(4.006);
- * // => 4
- *
- * _.round(4.006, 2);
- * // => 4.01
- *
- * _.round(4060, -2);
- * // => 4100
- */
-var round = createRound('round');
-
-module.exports = round;
diff --git a/node_modules/lodash/math/sum.js b/node_modules/lodash/math/sum.js
deleted file mode 100644
index 114ff1b..0000000
--- a/node_modules/lodash/math/sum.js
+++ /dev/null
@@ -1,50 +0,0 @@
-var arraySum = require('../internal/arraySum'),
-    baseCallback = require('../internal/baseCallback'),
-    baseSum = require('../internal/baseSum'),
-    isArray = require('../lang/isArray'),
-    isIterateeCall = require('../internal/isIterateeCall'),
-    toIterable = require('../internal/toIterable');
-
-/**
- * Gets the sum of the values in `collection`.
- *
- * @static
- * @memberOf _
- * @category Math
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [iteratee] The function invoked per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {number} Returns the sum.
- * @example
- *
- * _.sum([4, 6]);
- * // => 10
- *
- * _.sum({ 'a': 4, 'b': 6 });
- * // => 10
- *
- * var objects = [
- *   { 'n': 4 },
- *   { 'n': 6 }
- * ];
- *
- * _.sum(objects, function(object) {
- *   return object.n;
- * });
- * // => 10
- *
- * // using the `_.property` callback shorthand
- * _.sum(objects, 'n');
- * // => 10
- */
-function sum(collection, iteratee, thisArg) {
-  if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
-    iteratee = undefined;
-  }
-  iteratee = baseCallback(iteratee, thisArg, 3);
-  return iteratee.length == 1
-    ? arraySum(isArray(collection) ? collection : toIterable(collection), iteratee)
-    : baseSum(collection, iteratee);
-}
-
-module.exports = sum;
diff --git a/node_modules/lodash/number.js b/node_modules/lodash/number.js
deleted file mode 100644
index afab9d9..0000000
--- a/node_modules/lodash/number.js
+++ /dev/null
@@ -1,4 +0,0 @@
-module.exports = {
-  'inRange': require('./number/inRange'),
-  'random': require('./number/random')
-};
diff --git a/node_modules/lodash/number/inRange.js b/node_modules/lodash/number/inRange.js
deleted file mode 100644
index 30bf798..0000000
--- a/node_modules/lodash/number/inRange.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max,
-    nativeMin = Math.min;
-
-/**
- * Checks if `n` is between `start` and up to but not including, `end`. If
- * `end` is not specified it's set to `start` with `start` then set to `0`.
- *
- * @static
- * @memberOf _
- * @category Number
- * @param {number} n The number to check.
- * @param {number} [start=0] The start of the range.
- * @param {number} end The end of the range.
- * @returns {boolean} Returns `true` if `n` is in the range, else `false`.
- * @example
- *
- * _.inRange(3, 2, 4);
- * // => true
- *
- * _.inRange(4, 8);
- * // => true
- *
- * _.inRange(4, 2);
- * // => false
- *
- * _.inRange(2, 2);
- * // => false
- *
- * _.inRange(1.2, 2);
- * // => true
- *
- * _.inRange(5.2, 4);
- * // => false
- */
-function inRange(value, start, end) {
-  start = +start || 0;
-  if (end === undefined) {
-    end = start;
-    start = 0;
-  } else {
-    end = +end || 0;
-  }
-  return value >= nativeMin(start, end) && value < nativeMax(start, end);
-}
-
-module.exports = inRange;
diff --git a/node_modules/lodash/number/random.js b/node_modules/lodash/number/random.js
deleted file mode 100644
index 589d74e..0000000
--- a/node_modules/lodash/number/random.js
+++ /dev/null
@@ -1,70 +0,0 @@
-var baseRandom = require('../internal/baseRandom'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMin = Math.min,
-    nativeRandom = Math.random;
-
-/**
- * Produces a random number between `min` and `max` (inclusive). If only one
- * argument is provided a number between `0` and the given number is returned.
- * If `floating` is `true`, or either `min` or `max` are floats, a floating-point
- * number is returned instead of an integer.
- *
- * @static
- * @memberOf _
- * @category Number
- * @param {number} [min=0] The minimum possible value.
- * @param {number} [max=1] The maximum possible value.
- * @param {boolean} [floating] Specify returning a floating-point number.
- * @returns {number} Returns the random number.
- * @example
- *
- * _.random(0, 5);
- * // => an integer between 0 and 5
- *
- * _.random(5);
- * // => also an integer between 0 and 5
- *
- * _.random(5, true);
- * // => a floating-point number between 0 and 5
- *
- * _.random(1.2, 5.2);
- * // => a floating-point number between 1.2 and 5.2
- */
-function random(min, max, floating) {
-  if (floating && isIterateeCall(min, max, floating)) {
-    max = floating = undefined;
-  }
-  var noMin = min == null,
-      noMax = max == null;
-
-  if (floating == null) {
-    if (noMax && typeof min == 'boolean') {
-      floating = min;
-      min = 1;
-    }
-    else if (typeof max == 'boolean') {
-      floating = max;
-      noMax = true;
-    }
-  }
-  if (noMin && noMax) {
-    max = 1;
-    noMax = false;
-  }
-  min = +min || 0;
-  if (noMax) {
-    max = min;
-    min = 0;
-  } else {
-    max = +max || 0;
-  }
-  if (floating || min % 1 || max % 1) {
-    var rand = nativeRandom();
-    return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1)))), max);
-  }
-  return baseRandom(min, max);
-}
-
-module.exports = random;
diff --git a/node_modules/lodash/object.js b/node_modules/lodash/object.js
deleted file mode 100644
index 4beb005..0000000
--- a/node_modules/lodash/object.js
+++ /dev/null
@@ -1,31 +0,0 @@
-module.exports = {
-  'assign': require('./object/assign'),
-  'create': require('./object/create'),
-  'defaults': require('./object/defaults'),
-  'defaultsDeep': require('./object/defaultsDeep'),
-  'extend': require('./object/extend'),
-  'findKey': require('./object/findKey'),
-  'findLastKey': require('./object/findLastKey'),
-  'forIn': require('./object/forIn'),
-  'forInRight': require('./object/forInRight'),
-  'forOwn': require('./object/forOwn'),
-  'forOwnRight': require('./object/forOwnRight'),
-  'functions': require('./object/functions'),
-  'get': require('./object/get'),
-  'has': require('./object/has'),
-  'invert': require('./object/invert'),
-  'keys': require('./object/keys'),
-  'keysIn': require('./object/keysIn'),
-  'mapKeys': require('./object/mapKeys'),
-  'mapValues': require('./object/mapValues'),
-  'merge': require('./object/merge'),
-  'methods': require('./object/methods'),
-  'omit': require('./object/omit'),
-  'pairs': require('./object/pairs'),
-  'pick': require('./object/pick'),
-  'result': require('./object/result'),
-  'set': require('./object/set'),
-  'transform': require('./object/transform'),
-  'values': require('./object/values'),
-  'valuesIn': require('./object/valuesIn')
-};
diff --git a/node_modules/lodash/object/assign.js b/node_modules/lodash/object/assign.js
deleted file mode 100644
index 4a765ed..0000000
--- a/node_modules/lodash/object/assign.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var assignWith = require('../internal/assignWith'),
-    baseAssign = require('../internal/baseAssign'),
-    createAssigner = require('../internal/createAssigner');
-
-/**
- * Assigns own enumerable properties of source object(s) to the destination
- * object. Subsequent sources overwrite property assignments of previous sources.
- * If `customizer` is provided it's invoked to produce the assigned values.
- * The `customizer` is bound to `thisArg` and invoked with five arguments:
- * (objectValue, sourceValue, key, object, source).
- *
- * **Note:** This method mutates `object` and is based on
- * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign).
- *
- * @static
- * @memberOf _
- * @alias extend
- * @category Object
- * @param {Object} object The destination object.
- * @param {...Object} [sources] The source objects.
- * @param {Function} [customizer] The function to customize assigned values.
- * @param {*} [thisArg] The `this` binding of `customizer`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });
- * // => { 'user': 'fred', 'age': 40 }
- *
- * // using a customizer callback
- * var defaults = _.partialRight(_.assign, function(value, other) {
- *   return _.isUndefined(value) ? other : value;
- * });
- *
- * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
- * // => { 'user': 'barney', 'age': 36 }
- */
-var assign = createAssigner(function(object, source, customizer) {
-  return customizer
-    ? assignWith(object, source, customizer)
-    : baseAssign(object, source);
-});
-
-module.exports = assign;
diff --git a/node_modules/lodash/object/create.js b/node_modules/lodash/object/create.js
deleted file mode 100644
index 176294f..0000000
--- a/node_modules/lodash/object/create.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var baseAssign = require('../internal/baseAssign'),
-    baseCreate = require('../internal/baseCreate'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Creates an object that inherits from the given `prototype` object. If a
- * `properties` object is provided its own enumerable properties are assigned
- * to the created object.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} prototype The object to inherit from.
- * @param {Object} [properties] The properties to assign to the object.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Object} Returns the new object.
- * @example
- *
- * function Shape() {
- *   this.x = 0;
- *   this.y = 0;
- * }
- *
- * function Circle() {
- *   Shape.call(this);
- * }
- *
- * Circle.prototype = _.create(Shape.prototype, {
- *   'constructor': Circle
- * });
- *
- * var circle = new Circle;
- * circle instanceof Circle;
- * // => true
- *
- * circle instanceof Shape;
- * // => true
- */
-function create(prototype, properties, guard) {
-  var result = baseCreate(prototype);
-  if (guard && isIterateeCall(prototype, properties, guard)) {
-    properties = undefined;
-  }
-  return properties ? baseAssign(result, properties) : result;
-}
-
-module.exports = create;
diff --git a/node_modules/lodash/object/defaults.js b/node_modules/lodash/object/defaults.js
deleted file mode 100644
index c05011e..0000000
--- a/node_modules/lodash/object/defaults.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var assign = require('./assign'),
-    assignDefaults = require('../internal/assignDefaults'),
-    createDefaults = require('../internal/createDefaults');
-
-/**
- * Assigns own enumerable properties of source object(s) to the destination
- * object for all destination properties that resolve to `undefined`. Once a
- * property is set, additional values of the same property are ignored.
- *
- * **Note:** This method mutates `object`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The destination object.
- * @param {...Object} [sources] The source objects.
- * @returns {Object} Returns `object`.
- * @example
- *
- * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
- * // => { 'user': 'barney', 'age': 36 }
- */
-var defaults = createDefaults(assign, assignDefaults);
-
-module.exports = defaults;
diff --git a/node_modules/lodash/object/defaultsDeep.js b/node_modules/lodash/object/defaultsDeep.js
deleted file mode 100644
index ec6e687..0000000
--- a/node_modules/lodash/object/defaultsDeep.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var createDefaults = require('../internal/createDefaults'),
-    merge = require('./merge'),
-    mergeDefaults = require('../internal/mergeDefaults');
-
-/**
- * This method is like `_.defaults` except that it recursively assigns
- * default properties.
- *
- * **Note:** This method mutates `object`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The destination object.
- * @param {...Object} [sources] The source objects.
- * @returns {Object} Returns `object`.
- * @example
- *
- * _.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } });
- * // => { 'user': { 'name': 'barney', 'age': 36 } }
- *
- */
-var defaultsDeep = createDefaults(merge, mergeDefaults);
-
-module.exports = defaultsDeep;
diff --git a/node_modules/lodash/object/extend.js b/node_modules/lodash/object/extend.js
deleted file mode 100644
index dd0ca94..0000000
--- a/node_modules/lodash/object/extend.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./assign');
diff --git a/node_modules/lodash/object/findKey.js b/node_modules/lodash/object/findKey.js
deleted file mode 100644
index 1359df3..0000000
--- a/node_modules/lodash/object/findKey.js
+++ /dev/null
@@ -1,54 +0,0 @@
-var baseForOwn = require('../internal/baseForOwn'),
-    createFindKey = require('../internal/createFindKey');
-
-/**
- * This method is like `_.find` except that it returns the key of the first
- * element `predicate` returns truthy for instead of the element itself.
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to search.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {string|undefined} Returns the key of the matched element, else `undefined`.
- * @example
- *
- * var users = {
- *   'barney':  { 'age': 36, 'active': true },
- *   'fred':    { 'age': 40, 'active': false },
- *   'pebbles': { 'age': 1,  'active': true }
- * };
- *
- * _.findKey(users, function(chr) {
- *   return chr.age < 40;
- * });
- * // => 'barney' (iteration order is not guaranteed)
- *
- * // using the `_.matches` callback shorthand
- * _.findKey(users, { 'age': 1, 'active': true });
- * // => 'pebbles'
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.findKey(users, 'active', false);
- * // => 'fred'
- *
- * // using the `_.property` callback shorthand
- * _.findKey(users, 'active');
- * // => 'barney'
- */
-var findKey = createFindKey(baseForOwn);
-
-module.exports = findKey;
diff --git a/node_modules/lodash/object/findLastKey.js b/node_modules/lodash/object/findLastKey.js
deleted file mode 100644
index 42893a4..0000000
--- a/node_modules/lodash/object/findLastKey.js
+++ /dev/null
@@ -1,54 +0,0 @@
-var baseForOwnRight = require('../internal/baseForOwnRight'),
-    createFindKey = require('../internal/createFindKey');
-
-/**
- * This method is like `_.findKey` except that it iterates over elements of
- * a collection in the opposite order.
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to search.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {string|undefined} Returns the key of the matched element, else `undefined`.
- * @example
- *
- * var users = {
- *   'barney':  { 'age': 36, 'active': true },
- *   'fred':    { 'age': 40, 'active': false },
- *   'pebbles': { 'age': 1,  'active': true }
- * };
- *
- * _.findLastKey(users, function(chr) {
- *   return chr.age < 40;
- * });
- * // => returns `pebbles` assuming `_.findKey` returns `barney`
- *
- * // using the `_.matches` callback shorthand
- * _.findLastKey(users, { 'age': 36, 'active': true });
- * // => 'barney'
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.findLastKey(users, 'active', false);
- * // => 'fred'
- *
- * // using the `_.property` callback shorthand
- * _.findLastKey(users, 'active');
- * // => 'pebbles'
- */
-var findLastKey = createFindKey(baseForOwnRight);
-
-module.exports = findLastKey;
diff --git a/node_modules/lodash/object/forIn.js b/node_modules/lodash/object/forIn.js
deleted file mode 100644
index 52d34af..0000000
--- a/node_modules/lodash/object/forIn.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var baseFor = require('../internal/baseFor'),
-    createForIn = require('../internal/createForIn');
-
-/**
- * Iterates over own and inherited enumerable properties of an object invoking
- * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked
- * with three arguments: (value, key, object). Iteratee functions may exit
- * iteration early by explicitly returning `false`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to iterate over.
- * @param {Function} [iteratee=_.identity] The function invoked per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.forIn(new Foo, function(value, key) {
- *   console.log(key);
- * });
- * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)
- */
-var forIn = createForIn(baseFor);
-
-module.exports = forIn;
diff --git a/node_modules/lodash/object/forInRight.js b/node_modules/lodash/object/forInRight.js
deleted file mode 100644
index 6780b92..0000000
--- a/node_modules/lodash/object/forInRight.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var baseForRight = require('../internal/baseForRight'),
-    createForIn = require('../internal/createForIn');
-
-/**
- * This method is like `_.forIn` except that it iterates over properties of
- * `object` in the opposite order.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to iterate over.
- * @param {Function} [iteratee=_.identity] The function invoked per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.forInRight(new Foo, function(value, key) {
- *   console.log(key);
- * });
- * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'
- */
-var forInRight = createForIn(baseForRight);
-
-module.exports = forInRight;
diff --git a/node_modules/lodash/object/forOwn.js b/node_modules/lodash/object/forOwn.js
deleted file mode 100644
index 747bb76..0000000
--- a/node_modules/lodash/object/forOwn.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var baseForOwn = require('../internal/baseForOwn'),
-    createForOwn = require('../internal/createForOwn');
-
-/**
- * Iterates over own enumerable properties of an object invoking `iteratee`
- * for each property. The `iteratee` is bound to `thisArg` and invoked with
- * three arguments: (value, key, object). Iteratee functions may exit iteration
- * early by explicitly returning `false`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to iterate over.
- * @param {Function} [iteratee=_.identity] The function invoked per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.forOwn(new Foo, function(value, key) {
- *   console.log(key);
- * });
- * // => logs 'a' and 'b' (iteration order is not guaranteed)
- */
-var forOwn = createForOwn(baseForOwn);
-
-module.exports = forOwn;
diff --git a/node_modules/lodash/object/forOwnRight.js b/node_modules/lodash/object/forOwnRight.js
deleted file mode 100644
index 8122338..0000000
--- a/node_modules/lodash/object/forOwnRight.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var baseForOwnRight = require('../internal/baseForOwnRight'),
-    createForOwn = require('../internal/createForOwn');
-
-/**
- * This method is like `_.forOwn` except that it iterates over properties of
- * `object` in the opposite order.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to iterate over.
- * @param {Function} [iteratee=_.identity] The function invoked per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.forOwnRight(new Foo, function(value, key) {
- *   console.log(key);
- * });
- * // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b'
- */
-var forOwnRight = createForOwn(baseForOwnRight);
-
-module.exports = forOwnRight;
diff --git a/node_modules/lodash/object/functions.js b/node_modules/lodash/object/functions.js
deleted file mode 100644
index 10799be..0000000
--- a/node_modules/lodash/object/functions.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var baseFunctions = require('../internal/baseFunctions'),
-    keysIn = require('./keysIn');
-
-/**
- * Creates an array of function property names from all enumerable properties,
- * own and inherited, of `object`.
- *
- * @static
- * @memberOf _
- * @alias methods
- * @category Object
- * @param {Object} object The object to inspect.
- * @returns {Array} Returns the new array of property names.
- * @example
- *
- * _.functions(_);
- * // => ['after', 'ary', 'assign', ...]
- */
-function functions(object) {
-  return baseFunctions(object, keysIn(object));
-}
-
-module.exports = functions;
diff --git a/node_modules/lodash/object/get.js b/node_modules/lodash/object/get.js
deleted file mode 100644
index 7e88f1e..0000000
--- a/node_modules/lodash/object/get.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var baseGet = require('../internal/baseGet'),
-    toPath = require('../internal/toPath');
-
-/**
- * Gets the property value at `path` of `object`. If the resolved value is
- * `undefined` the `defaultValue` is used in its place.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @param {Array|string} path The path of the property to get.
- * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
- * @returns {*} Returns the resolved value.
- * @example
- *
- * var object = { 'a': [{ 'b': { 'c': 3 } }] };
- *
- * _.get(object, 'a[0].b.c');
- * // => 3
- *
- * _.get(object, ['a', '0', 'b', 'c']);
- * // => 3
- *
- * _.get(object, 'a.b.c', 'default');
- * // => 'default'
- */
-function get(object, path, defaultValue) {
-  var result = object == null ? undefined : baseGet(object, toPath(path), (path + ''));
-  return result === undefined ? defaultValue : result;
-}
-
-module.exports = get;
diff --git a/node_modules/lodash/object/has.js b/node_modules/lodash/object/has.js
deleted file mode 100644
index f356243..0000000
--- a/node_modules/lodash/object/has.js
+++ /dev/null
@@ -1,57 +0,0 @@
-var baseGet = require('../internal/baseGet'),
-    baseSlice = require('../internal/baseSlice'),
-    isArguments = require('../lang/isArguments'),
-    isArray = require('../lang/isArray'),
-    isIndex = require('../internal/isIndex'),
-    isKey = require('../internal/isKey'),
-    isLength = require('../internal/isLength'),
-    last = require('../array/last'),
-    toPath = require('../internal/toPath');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Checks if `path` is a direct property.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @param {Array|string} path The path to check.
- * @returns {boolean} Returns `true` if `path` is a direct property, else `false`.
- * @example
- *
- * var object = { 'a': { 'b': { 'c': 3 } } };
- *
- * _.has(object, 'a');
- * // => true
- *
- * _.has(object, 'a.b.c');
- * // => true
- *
- * _.has(object, ['a', 'b', 'c']);
- * // => true
- */
-function has(object, path) {
-  if (object == null) {
-    return false;
-  }
-  var result = hasOwnProperty.call(object, path);
-  if (!result && !isKey(path)) {
-    path = toPath(path);
-    object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
-    if (object == null) {
-      return false;
-    }
-    path = last(path);
-    result = hasOwnProperty.call(object, path);
-  }
-  return result || (isLength(object.length) && isIndex(path, object.length) &&
-    (isArray(object) || isArguments(object)));
-}
-
-module.exports = has;
diff --git a/node_modules/lodash/object/invert.js b/node_modules/lodash/object/invert.js
deleted file mode 100644
index 54fb1f1..0000000
--- a/node_modules/lodash/object/invert.js
+++ /dev/null
@@ -1,60 +0,0 @@
-var isIterateeCall = require('../internal/isIterateeCall'),
-    keys = require('./keys');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Creates an object composed of the inverted keys and values of `object`.
- * If `object` contains duplicate values, subsequent values overwrite property
- * assignments of previous values unless `multiValue` is `true`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to invert.
- * @param {boolean} [multiValue] Allow multiple values per key.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Object} Returns the new inverted object.
- * @example
- *
- * var object = { 'a': 1, 'b': 2, 'c': 1 };
- *
- * _.invert(object);
- * // => { '1': 'c', '2': 'b' }
- *
- * // with `multiValue`
- * _.invert(object, true);
- * // => { '1': ['a', 'c'], '2': ['b'] }
- */
-function invert(object, multiValue, guard) {
-  if (guard && isIterateeCall(object, multiValue, guard)) {
-    multiValue = undefined;
-  }
-  var index = -1,
-      props = keys(object),
-      length = props.length,
-      result = {};
-
-  while (++index < length) {
-    var key = props[index],
-        value = object[key];
-
-    if (multiValue) {
-      if (hasOwnProperty.call(result, value)) {
-        result[value].push(key);
-      } else {
-        result[value] = [key];
-      }
-    }
-    else {
-      result[value] = key;
-    }
-  }
-  return result;
-}
-
-module.exports = invert;
diff --git a/node_modules/lodash/object/keys.js b/node_modules/lodash/object/keys.js
deleted file mode 100644
index 4706fd6..0000000
--- a/node_modules/lodash/object/keys.js
+++ /dev/null
@@ -1,45 +0,0 @@
-var getNative = require('../internal/getNative'),
-    isArrayLike = require('../internal/isArrayLike'),
-    isObject = require('../lang/isObject'),
-    shimKeys = require('../internal/shimKeys');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeKeys = getNative(Object, 'keys');
-
-/**
- * Creates an array of the own enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects. See the
- * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
- * for more details.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keys(new Foo);
- * // => ['a', 'b'] (iteration order is not guaranteed)
- *
- * _.keys('hi');
- * // => ['0', '1']
- */
-var keys = !nativeKeys ? shimKeys : function(object) {
-  var Ctor = object == null ? undefined : object.constructor;
-  if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
-      (typeof object != 'function' && isArrayLike(object))) {
-    return shimKeys(object);
-  }
-  return isObject(object) ? nativeKeys(object) : [];
-};
-
-module.exports = keys;
diff --git a/node_modules/lodash/object/keysIn.js b/node_modules/lodash/object/keysIn.js
deleted file mode 100644
index 45a85d7..0000000
--- a/node_modules/lodash/object/keysIn.js
+++ /dev/null
@@ -1,64 +0,0 @@
-var isArguments = require('../lang/isArguments'),
-    isArray = require('../lang/isArray'),
-    isIndex = require('../internal/isIndex'),
-    isLength = require('../internal/isLength'),
-    isObject = require('../lang/isObject');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Creates an array of the own and inherited enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keysIn(new Foo);
- * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
- */
-function keysIn(object) {
-  if (object == null) {
-    return [];
-  }
-  if (!isObject(object)) {
-    object = Object(object);
-  }
-  var length = object.length;
-  length = (length && isLength(length) &&
-    (isArray(object) || isArguments(object)) && length) || 0;
-
-  var Ctor = object.constructor,
-      index = -1,
-      isProto = typeof Ctor == 'function' && Ctor.prototype === object,
-      result = Array(length),
-      skipIndexes = length > 0;
-
-  while (++index < length) {
-    result[index] = (index + '');
-  }
-  for (var key in object) {
-    if (!(skipIndexes && isIndex(key, length)) &&
-        !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
-      result.push(key);
-    }
-  }
-  return result;
-}
-
-module.exports = keysIn;
diff --git a/node_modules/lodash/object/mapKeys.js b/node_modules/lodash/object/mapKeys.js
deleted file mode 100644
index 680b29b..0000000
--- a/node_modules/lodash/object/mapKeys.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var createObjectMapper = require('../internal/createObjectMapper');
-
-/**
- * The opposite of `_.mapValues`; this method creates an object with the
- * same values as `object` and keys generated by running each own enumerable
- * property of `object` through `iteratee`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to iterate over.
- * @param {Function|Object|string} [iteratee=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Object} Returns the new mapped object.
- * @example
- *
- * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
- *   return key + value;
- * });
- * // => { 'a1': 1, 'b2': 2 }
- */
-var mapKeys = createObjectMapper(true);
-
-module.exports = mapKeys;
diff --git a/node_modules/lodash/object/mapValues.js b/node_modules/lodash/object/mapValues.js
deleted file mode 100644
index 2afe6ba..0000000
--- a/node_modules/lodash/object/mapValues.js
+++ /dev/null
@@ -1,46 +0,0 @@
-var createObjectMapper = require('../internal/createObjectMapper');
-
-/**
- * Creates an object with the same keys as `object` and values generated by
- * running each own enumerable property of `object` through `iteratee`. The
- * iteratee function is bound to `thisArg` and invoked with three arguments:
- * (value, key, object).
- *
- * If a property name is provided for `iteratee` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `iteratee` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to iterate over.
- * @param {Function|Object|string} [iteratee=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Object} Returns the new mapped object.
- * @example
- *
- * _.mapValues({ 'a': 1, 'b': 2 }, function(n) {
- *   return n * 3;
- * });
- * // => { 'a': 3, 'b': 6 }
- *
- * var users = {
- *   'fred':    { 'user': 'fred',    'age': 40 },
- *   'pebbles': { 'user': 'pebbles', 'age': 1 }
- * };
- *
- * // using the `_.property` callback shorthand
- * _.mapValues(users, 'age');
- * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
- */
-var mapValues = createObjectMapper();
-
-module.exports = mapValues;
diff --git a/node_modules/lodash/object/merge.js b/node_modules/lodash/object/merge.js
deleted file mode 100644
index 86dd8af..0000000
--- a/node_modules/lodash/object/merge.js
+++ /dev/null
@@ -1,54 +0,0 @@
-var baseMerge = require('../internal/baseMerge'),
-    createAssigner = require('../internal/createAssigner');
-
-/**
- * Recursively merges own enumerable properties of the source object(s), that
- * don't resolve to `undefined` into the destination object. Subsequent sources
- * overwrite property assignments of previous sources. If `customizer` is
- * provided it's invoked to produce the merged values of the destination and
- * source properties. If `customizer` returns `undefined` merging is handled
- * by the method instead. The `customizer` is bound to `thisArg` and invoked
- * with five arguments: (objectValue, sourceValue, key, object, source).
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The destination object.
- * @param {...Object} [sources] The source objects.
- * @param {Function} [customizer] The function to customize assigned values.
- * @param {*} [thisArg] The `this` binding of `customizer`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * var users = {
- *   'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
- * };
- *
- * var ages = {
- *   'data': [{ 'age': 36 }, { 'age': 40 }]
- * };
- *
- * _.merge(users, ages);
- * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
- *
- * // using a customizer callback
- * var object = {
- *   'fruits': ['apple'],
- *   'vegetables': ['beet']
- * };
- *
- * var other = {
- *   'fruits': ['banana'],
- *   'vegetables': ['carrot']
- * };
- *
- * _.merge(object, other, function(a, b) {
- *   if (_.isArray(a)) {
- *     return a.concat(b);
- *   }
- * });
- * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
- */
-var merge = createAssigner(baseMerge);
-
-module.exports = merge;
diff --git a/node_modules/lodash/object/methods.js b/node_modules/lodash/object/methods.js
deleted file mode 100644
index 8a304fe..0000000
--- a/node_modules/lodash/object/methods.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./functions');
diff --git a/node_modules/lodash/object/omit.js b/node_modules/lodash/object/omit.js
deleted file mode 100644
index fe3f485..0000000
--- a/node_modules/lodash/object/omit.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var arrayMap = require('../internal/arrayMap'),
-    baseDifference = require('../internal/baseDifference'),
-    baseFlatten = require('../internal/baseFlatten'),
-    bindCallback = require('../internal/bindCallback'),
-    keysIn = require('./keysIn'),
-    pickByArray = require('../internal/pickByArray'),
-    pickByCallback = require('../internal/pickByCallback'),
-    restParam = require('../function/restParam');
-
-/**
- * The opposite of `_.pick`; this method creates an object composed of the
- * own and inherited enumerable properties of `object` that are not omitted.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The source object.
- * @param {Function|...(string|string[])} [predicate] The function invoked per
- *  iteration or property names to omit, specified as individual property
- *  names or arrays of property names.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {Object} Returns the new object.
- * @example
- *
- * var object = { 'user': 'fred', 'age': 40 };
- *
- * _.omit(object, 'age');
- * // => { 'user': 'fred' }
- *
- * _.omit(object, _.isNumber);
- * // => { 'user': 'fred' }
- */
-var omit = restParam(function(object, props) {
-  if (object == null) {
-    return {};
-  }
-  if (typeof props[0] != 'function') {
-    var props = arrayMap(baseFlatten(props), String);
-    return pickByArray(object, baseDifference(keysIn(object), props));
-  }
-  var predicate = bindCallback(props[0], props[1], 3);
-  return pickByCallback(object, function(value, key, object) {
-    return !predicate(value, key, object);
-  });
-});
-
-module.exports = omit;
diff --git a/node_modules/lodash/object/pairs.js b/node_modules/lodash/object/pairs.js
deleted file mode 100644
index fd4644c..0000000
--- a/node_modules/lodash/object/pairs.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var keys = require('./keys'),
-    toObject = require('../internal/toObject');
-
-/**
- * Creates a two dimensional array of the key-value pairs for `object`,
- * e.g. `[[key1, value1], [key2, value2]]`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the new array of key-value pairs.
- * @example
- *
- * _.pairs({ 'barney': 36, 'fred': 40 });
- * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)
- */
-function pairs(object) {
-  object = toObject(object);
-
-  var index = -1,
-      props = keys(object),
-      length = props.length,
-      result = Array(length);
-
-  while (++index < length) {
-    var key = props[index];
-    result[index] = [key, object[key]];
-  }
-  return result;
-}
-
-module.exports = pairs;
diff --git a/node_modules/lodash/object/pick.js b/node_modules/lodash/object/pick.js
deleted file mode 100644
index e318766..0000000
--- a/node_modules/lodash/object/pick.js
+++ /dev/null
@@ -1,42 +0,0 @@
-var baseFlatten = require('../internal/baseFlatten'),
-    bindCallback = require('../internal/bindCallback'),
-    pickByArray = require('../internal/pickByArray'),
-    pickByCallback = require('../internal/pickByCallback'),
-    restParam = require('../function/restParam');
-
-/**
- * Creates an object composed of the picked `object` properties. Property
- * names may be specified as individual arguments or as arrays of property
- * names. If `predicate` is provided it's invoked for each property of `object`
- * picking the properties `predicate` returns truthy for. The predicate is
- * bound to `thisArg` and invoked with three arguments: (value, key, object).
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The source object.
- * @param {Function|...(string|string[])} [predicate] The function invoked per
- *  iteration or property names to pick, specified as individual property
- *  names or arrays of property names.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {Object} Returns the new object.
- * @example
- *
- * var object = { 'user': 'fred', 'age': 40 };
- *
- * _.pick(object, 'user');
- * // => { 'user': 'fred' }
- *
- * _.pick(object, _.isString);
- * // => { 'user': 'fred' }
- */
-var pick = restParam(function(object, props) {
-  if (object == null) {
-    return {};
-  }
-  return typeof props[0] == 'function'
-    ? pickByCallback(object, bindCallback(props[0], props[1], 3))
-    : pickByArray(object, baseFlatten(props));
-});
-
-module.exports = pick;
diff --git a/node_modules/lodash/object/result.js b/node_modules/lodash/object/result.js
deleted file mode 100644
index 29b38e6..0000000
--- a/node_modules/lodash/object/result.js
+++ /dev/null
@@ -1,49 +0,0 @@
-var baseGet = require('../internal/baseGet'),
-    baseSlice = require('../internal/baseSlice'),
-    isFunction = require('../lang/isFunction'),
-    isKey = require('../internal/isKey'),
-    last = require('../array/last'),
-    toPath = require('../internal/toPath');
-
-/**
- * This method is like `_.get` except that if the resolved value is a function
- * it's invoked with the `this` binding of its parent object and its result
- * is returned.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @param {Array|string} path The path of the property to resolve.
- * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
- * @returns {*} Returns the resolved value.
- * @example
- *
- * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
- *
- * _.result(object, 'a[0].b.c1');
- * // => 3
- *
- * _.result(object, 'a[0].b.c2');
- * // => 4
- *
- * _.result(object, 'a.b.c', 'default');
- * // => 'default'
- *
- * _.result(object, 'a.b.c', _.constant('default'));
- * // => 'default'
- */
-function result(object, path, defaultValue) {
-  var result = object == null ? undefined : object[path];
-  if (result === undefined) {
-    if (object != null && !isKey(path, object)) {
-      path = toPath(path);
-      object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
-      result = object == null ? undefined : object[last(path)];
-    }
-    result = result === undefined ? defaultValue : result;
-  }
-  return isFunction(result) ? result.call(object) : result;
-}
-
-module.exports = result;
diff --git a/node_modules/lodash/object/set.js b/node_modules/lodash/object/set.js
deleted file mode 100644
index 7a1e4e9..0000000
--- a/node_modules/lodash/object/set.js
+++ /dev/null
@@ -1,55 +0,0 @@
-var isIndex = require('../internal/isIndex'),
-    isKey = require('../internal/isKey'),
-    isObject = require('../lang/isObject'),
-    toPath = require('../internal/toPath');
-
-/**
- * Sets the property value of `path` on `object`. If a portion of `path`
- * does not exist it's created.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to augment.
- * @param {Array|string} path The path of the property to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns `object`.
- * @example
- *
- * var object = { 'a': [{ 'b': { 'c': 3 } }] };
- *
- * _.set(object, 'a[0].b.c', 4);
- * console.log(object.a[0].b.c);
- * // => 4
- *
- * _.set(object, 'x[0].y.z', 5);
- * console.log(object.x[0].y.z);
- * // => 5
- */
-function set(object, path, value) {
-  if (object == null) {
-    return object;
-  }
-  var pathKey = (path + '');
-  path = (object[pathKey] != null || isKey(path, object)) ? [pathKey] : toPath(path);
-
-  var index = -1,
-      length = path.length,
-      lastIndex = length - 1,
-      nested = object;
-
-  while (nested != null && ++index < length) {
-    var key = path[index];
-    if (isObject(nested)) {
-      if (index == lastIndex) {
-        nested[key] = value;
-      } else if (nested[key] == null) {
-        nested[key] = isIndex(path[index + 1]) ? [] : {};
-      }
-    }
-    nested = nested[key];
-  }
-  return object;
-}
-
-module.exports = set;
diff --git a/node_modules/lodash/object/transform.js b/node_modules/lodash/object/transform.js
deleted file mode 100644
index 9a814b1..0000000
--- a/node_modules/lodash/object/transform.js
+++ /dev/null
@@ -1,61 +0,0 @@
-var arrayEach = require('../internal/arrayEach'),
-    baseCallback = require('../internal/baseCallback'),
-    baseCreate = require('../internal/baseCreate'),
-    baseForOwn = require('../internal/baseForOwn'),
-    isArray = require('../lang/isArray'),
-    isFunction = require('../lang/isFunction'),
-    isObject = require('../lang/isObject'),
-    isTypedArray = require('../lang/isTypedArray');
-
-/**
- * An alternative to `_.reduce`; this method transforms `object` to a new
- * `accumulator` object which is the result of running each of its own enumerable
- * properties through `iteratee`, with each invocation potentially mutating
- * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked
- * with four arguments: (accumulator, value, key, object). Iteratee functions
- * may exit iteration early by explicitly returning `false`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Array|Object} object The object to iterate over.
- * @param {Function} [iteratee=_.identity] The function invoked per iteration.
- * @param {*} [accumulator] The custom accumulator value.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {*} Returns the accumulated value.
- * @example
- *
- * _.transform([2, 3, 4], function(result, n) {
- *   result.push(n *= n);
- *   return n % 2 == 0;
- * });
- * // => [4, 9]
- *
- * _.transform({ 'a': 1, 'b': 2 }, function(result, n, key) {
- *   result[key] = n * 3;
- * });
- * // => { 'a': 3, 'b': 6 }
- */
-function transform(object, iteratee, accumulator, thisArg) {
-  var isArr = isArray(object) || isTypedArray(object);
-  iteratee = baseCallback(iteratee, thisArg, 4);
-
-  if (accumulator == null) {
-    if (isArr || isObject(object)) {
-      var Ctor = object.constructor;
-      if (isArr) {
-        accumulator = isArray(object) ? new Ctor : [];
-      } else {
-        accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined);
-      }
-    } else {
-      accumulator = {};
-    }
-  }
-  (isArr ? arrayEach : baseForOwn)(object, function(value, index, object) {
-    return iteratee(accumulator, value, index, object);
-  });
-  return accumulator;
-}
-
-module.exports = transform;
diff --git a/node_modules/lodash/object/values.js b/node_modules/lodash/object/values.js
deleted file mode 100644
index 0171515..0000000
--- a/node_modules/lodash/object/values.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var baseValues = require('../internal/baseValues'),
-    keys = require('./keys');
-
-/**
- * Creates an array of the own enumerable property values of `object`.
- *
- * **Note:** Non-object values are coerced to objects.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property values.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.values(new Foo);
- * // => [1, 2] (iteration order is not guaranteed)
- *
- * _.values('hi');
- * // => ['h', 'i']
- */
-function values(object) {
-  return baseValues(object, keys(object));
-}
-
-module.exports = values;
diff --git a/node_modules/lodash/object/valuesIn.js b/node_modules/lodash/object/valuesIn.js
deleted file mode 100644
index 5f067c0..0000000
--- a/node_modules/lodash/object/valuesIn.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var baseValues = require('../internal/baseValues'),
-    keysIn = require('./keysIn');
-
-/**
- * Creates an array of the own and inherited enumerable property values
- * of `object`.
- *
- * **Note:** Non-object values are coerced to objects.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property values.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.valuesIn(new Foo);
- * // => [1, 2, 3] (iteration order is not guaranteed)
- */
-function valuesIn(object) {
-  return baseValues(object, keysIn(object));
-}
-
-module.exports = valuesIn;
diff --git a/node_modules/lodash/package.json b/node_modules/lodash/package.json
deleted file mode 100644
index e356dc7..0000000
--- a/node_modules/lodash/package.json
+++ /dev/null
@@ -1,84 +0,0 @@
-{
-  "_args": [
-    [
-      "lodash@3.10.1",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "lodash@3.10.1",
-  "_id": "lodash@3.10.1",
-  "_inBundle": false,
-  "_integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
-  "_location": "/lodash",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "lodash@3.10.1",
-    "name": "lodash",
-    "escapedName": "lodash",
-    "rawSpec": "3.10.1",
-    "saveSpec": null,
-    "fetchSpec": "3.10.1"
-  },
-  "_requiredBy": [
-    "/xmlbuilder"
-  ],
-  "_resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
-  "_spec": "3.10.1",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "John-David Dalton",
-    "email": "john.david.dalton@gmail.com",
-    "url": "http://allyoucanleet.com/"
-  },
-  "bugs": {
-    "url": "https://github.com/lodash/lodash/issues"
-  },
-  "contributors": [
-    {
-      "name": "John-David Dalton",
-      "email": "john.david.dalton@gmail.com",
-      "url": "http://allyoucanleet.com/"
-    },
-    {
-      "name": "Benjamin Tan",
-      "email": "demoneaux@gmail.com",
-      "url": "https://d10.github.io/"
-    },
-    {
-      "name": "Blaine Bublitz",
-      "email": "blaine@iceddev.com",
-      "url": "http://www.iceddev.com/"
-    },
-    {
-      "name": "Kit Cambridge",
-      "email": "github@kitcambridge.be",
-      "url": "http://kitcambridge.be/"
-    },
-    {
-      "name": "Mathias Bynens",
-      "email": "mathias@qiwi.be",
-      "url": "https://mathiasbynens.be/"
-    }
-  ],
-  "description": "The modern build of lodash modular utilities.",
-  "homepage": "https://lodash.com/",
-  "icon": "https://lodash.com/icon.svg",
-  "keywords": [
-    "modules",
-    "stdlib",
-    "util"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "lodash",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/lodash/lodash.git"
-  },
-  "scripts": {
-    "test": "echo \"See https://travis-ci.org/lodash/lodash-cli for testing details.\""
-  },
-  "version": "3.10.1"
-}
diff --git a/node_modules/lodash/string.js b/node_modules/lodash/string.js
deleted file mode 100644
index f777945..0000000
--- a/node_modules/lodash/string.js
+++ /dev/null
@@ -1,25 +0,0 @@
-module.exports = {
-  'camelCase': require('./string/camelCase'),
-  'capitalize': require('./string/capitalize'),
-  'deburr': require('./string/deburr'),
-  'endsWith': require('./string/endsWith'),
-  'escape': require('./string/escape'),
-  'escapeRegExp': require('./string/escapeRegExp'),
-  'kebabCase': require('./string/kebabCase'),
-  'pad': require('./string/pad'),
-  'padLeft': require('./string/padLeft'),
-  'padRight': require('./string/padRight'),
-  'parseInt': require('./string/parseInt'),
-  'repeat': require('./string/repeat'),
-  'snakeCase': require('./string/snakeCase'),
-  'startCase': require('./string/startCase'),
-  'startsWith': require('./string/startsWith'),
-  'template': require('./string/template'),
-  'templateSettings': require('./string/templateSettings'),
-  'trim': require('./string/trim'),
-  'trimLeft': require('./string/trimLeft'),
-  'trimRight': require('./string/trimRight'),
-  'trunc': require('./string/trunc'),
-  'unescape': require('./string/unescape'),
-  'words': require('./string/words')
-};
diff --git a/node_modules/lodash/string/camelCase.js b/node_modules/lodash/string/camelCase.js
deleted file mode 100644
index 2d438f4..0000000
--- a/node_modules/lodash/string/camelCase.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var createCompounder = require('../internal/createCompounder');
-
-/**
- * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to convert.
- * @returns {string} Returns the camel cased string.
- * @example
- *
- * _.camelCase('Foo Bar');
- * // => 'fooBar'
- *
- * _.camelCase('--foo-bar');
- * // => 'fooBar'
- *
- * _.camelCase('__foo_bar__');
- * // => 'fooBar'
- */
-var camelCase = createCompounder(function(result, word, index) {
-  word = word.toLowerCase();
-  return result + (index ? (word.charAt(0).toUpperCase() + word.slice(1)) : word);
-});
-
-module.exports = camelCase;
diff --git a/node_modules/lodash/string/capitalize.js b/node_modules/lodash/string/capitalize.js
deleted file mode 100644
index f9222dc..0000000
--- a/node_modules/lodash/string/capitalize.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var baseToString = require('../internal/baseToString');
-
-/**
- * Capitalizes the first character of `string`.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to capitalize.
- * @returns {string} Returns the capitalized string.
- * @example
- *
- * _.capitalize('fred');
- * // => 'Fred'
- */
-function capitalize(string) {
-  string = baseToString(string);
-  return string && (string.charAt(0).toUpperCase() + string.slice(1));
-}
-
-module.exports = capitalize;
diff --git a/node_modules/lodash/string/deburr.js b/node_modules/lodash/string/deburr.js
deleted file mode 100644
index 0bd03e6..0000000
--- a/node_modules/lodash/string/deburr.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var baseToString = require('../internal/baseToString'),
-    deburrLetter = require('../internal/deburrLetter');
-
-/** Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). */
-var reComboMark = /[\u0300-\u036f\ufe20-\ufe23]/g;
-
-/** Used to match latin-1 supplementary letters (excluding mathematical operators). */
-var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g;
-
-/**
- * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
- * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to deburr.
- * @returns {string} Returns the deburred string.
- * @example
- *
- * _.deburr('déjà vu');
- * // => 'deja vu'
- */
-function deburr(string) {
-  string = baseToString(string);
-  return string && string.replace(reLatin1, deburrLetter).replace(reComboMark, '');
-}
-
-module.exports = deburr;
diff --git a/node_modules/lodash/string/endsWith.js b/node_modules/lodash/string/endsWith.js
deleted file mode 100644
index 26821e2..0000000
--- a/node_modules/lodash/string/endsWith.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var baseToString = require('../internal/baseToString');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMin = Math.min;
-
-/**
- * Checks if `string` ends with the given target string.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to search.
- * @param {string} [target] The string to search for.
- * @param {number} [position=string.length] The position to search from.
- * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`.
- * @example
- *
- * _.endsWith('abc', 'c');
- * // => true
- *
- * _.endsWith('abc', 'b');
- * // => false
- *
- * _.endsWith('abc', 'b', 2);
- * // => true
- */
-function endsWith(string, target, position) {
-  string = baseToString(string);
-  target = (target + '');
-
-  var length = string.length;
-  position = position === undefined
-    ? length
-    : nativeMin(position < 0 ? 0 : (+position || 0), length);
-
-  position -= target.length;
-  return position >= 0 && string.indexOf(target, position) == position;
-}
-
-module.exports = endsWith;
diff --git a/node_modules/lodash/string/escape.js b/node_modules/lodash/string/escape.js
deleted file mode 100644
index cd08a5d..0000000
--- a/node_modules/lodash/string/escape.js
+++ /dev/null
@@ -1,48 +0,0 @@
-var baseToString = require('../internal/baseToString'),
-    escapeHtmlChar = require('../internal/escapeHtmlChar');
-
-/** Used to match HTML entities and HTML characters. */
-var reUnescapedHtml = /[&<>"'`]/g,
-    reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
-
-/**
- * Converts the characters "&", "<", ">", '"', "'", and "\`", in `string` to
- * their corresponding HTML entities.
- *
- * **Note:** No other characters are escaped. To escape additional characters
- * use a third-party library like [_he_](https://mths.be/he).
- *
- * Though the ">" character is escaped for symmetry, characters like
- * ">" and "/" don't need escaping in HTML and have no special meaning
- * unless they're part of a tag or unquoted attribute value.
- * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
- * (under "semi-related fun fact") for more details.
- *
- * Backticks are escaped because in Internet Explorer < 9, they can break out
- * of attribute values or HTML comments. See [#59](https://html5sec.org/#59),
- * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and
- * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/)
- * for more details.
- *
- * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)
- * to reduce XSS vectors.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to escape.
- * @returns {string} Returns the escaped string.
- * @example
- *
- * _.escape('fred, barney, & pebbles');
- * // => 'fred, barney, &amp; pebbles'
- */
-function escape(string) {
-  // Reset `lastIndex` because in IE < 9 `String#replace` does not.
-  string = baseToString(string);
-  return (string && reHasUnescapedHtml.test(string))
-    ? string.replace(reUnescapedHtml, escapeHtmlChar)
-    : string;
-}
-
-module.exports = escape;
diff --git a/node_modules/lodash/string/escapeRegExp.js b/node_modules/lodash/string/escapeRegExp.js
deleted file mode 100644
index 176137a..0000000
--- a/node_modules/lodash/string/escapeRegExp.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var baseToString = require('../internal/baseToString'),
-    escapeRegExpChar = require('../internal/escapeRegExpChar');
-
-/**
- * Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns)
- * and those outlined by [`EscapeRegExpPattern`](http://ecma-international.org/ecma-262/6.0/#sec-escaperegexppattern).
- */
-var reRegExpChars = /^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g,
-    reHasRegExpChars = RegExp(reRegExpChars.source);
-
-/**
- * Escapes the `RegExp` special characters "\", "/", "^", "$", ".", "|", "?",
- * "*", "+", "(", ")", "[", "]", "{" and "}" in `string`.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to escape.
- * @returns {string} Returns the escaped string.
- * @example
- *
- * _.escapeRegExp('[lodash](https://lodash.com/)');
- * // => '\[lodash\]\(https:\/\/lodash\.com\/\)'
- */
-function escapeRegExp(string) {
-  string = baseToString(string);
-  return (string && reHasRegExpChars.test(string))
-    ? string.replace(reRegExpChars, escapeRegExpChar)
-    : (string || '(?:)');
-}
-
-module.exports = escapeRegExp;
diff --git a/node_modules/lodash/string/kebabCase.js b/node_modules/lodash/string/kebabCase.js
deleted file mode 100644
index d29c2f9..0000000
--- a/node_modules/lodash/string/kebabCase.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var createCompounder = require('../internal/createCompounder');
-
-/**
- * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to convert.
- * @returns {string} Returns the kebab cased string.
- * @example
- *
- * _.kebabCase('Foo Bar');
- * // => 'foo-bar'
- *
- * _.kebabCase('fooBar');
- * // => 'foo-bar'
- *
- * _.kebabCase('__foo_bar__');
- * // => 'foo-bar'
- */
-var kebabCase = createCompounder(function(result, word, index) {
-  return result + (index ? '-' : '') + word.toLowerCase();
-});
-
-module.exports = kebabCase;
diff --git a/node_modules/lodash/string/pad.js b/node_modules/lodash/string/pad.js
deleted file mode 100644
index 60e523b..0000000
--- a/node_modules/lodash/string/pad.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var baseToString = require('../internal/baseToString'),
-    createPadding = require('../internal/createPadding');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeCeil = Math.ceil,
-    nativeFloor = Math.floor,
-    nativeIsFinite = global.isFinite;
-
-/**
- * Pads `string` on the left and right sides if it's shorter than `length`.
- * Padding characters are truncated if they can't be evenly divided by `length`.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to pad.
- * @param {number} [length=0] The padding length.
- * @param {string} [chars=' '] The string used as padding.
- * @returns {string} Returns the padded string.
- * @example
- *
- * _.pad('abc', 8);
- * // => '  abc   '
- *
- * _.pad('abc', 8, '_-');
- * // => '_-abc_-_'
- *
- * _.pad('abc', 3);
- * // => 'abc'
- */
-function pad(string, length, chars) {
-  string = baseToString(string);
-  length = +length;
-
-  var strLength = string.length;
-  if (strLength >= length || !nativeIsFinite(length)) {
-    return string;
-  }
-  var mid = (length - strLength) / 2,
-      leftLength = nativeFloor(mid),
-      rightLength = nativeCeil(mid);
-
-  chars = createPadding('', rightLength, chars);
-  return chars.slice(0, leftLength) + string + chars;
-}
-
-module.exports = pad;
diff --git a/node_modules/lodash/string/padLeft.js b/node_modules/lodash/string/padLeft.js
deleted file mode 100644
index bb0c94d..0000000
--- a/node_modules/lodash/string/padLeft.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var createPadDir = require('../internal/createPadDir');
-
-/**
- * Pads `string` on the left side if it's shorter than `length`. Padding
- * characters are truncated if they exceed `length`.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to pad.
- * @param {number} [length=0] The padding length.
- * @param {string} [chars=' '] The string used as padding.
- * @returns {string} Returns the padded string.
- * @example
- *
- * _.padLeft('abc', 6);
- * // => '   abc'
- *
- * _.padLeft('abc', 6, '_-');
- * // => '_-_abc'
- *
- * _.padLeft('abc', 3);
- * // => 'abc'
- */
-var padLeft = createPadDir();
-
-module.exports = padLeft;
diff --git a/node_modules/lodash/string/padRight.js b/node_modules/lodash/string/padRight.js
deleted file mode 100644
index dc12f55..0000000
--- a/node_modules/lodash/string/padRight.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var createPadDir = require('../internal/createPadDir');
-
-/**
- * Pads `string` on the right side if it's shorter than `length`. Padding
- * characters are truncated if they exceed `length`.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to pad.
- * @param {number} [length=0] The padding length.
- * @param {string} [chars=' '] The string used as padding.
- * @returns {string} Returns the padded string.
- * @example
- *
- * _.padRight('abc', 6);
- * // => 'abc   '
- *
- * _.padRight('abc', 6, '_-');
- * // => 'abc_-_'
- *
- * _.padRight('abc', 3);
- * // => 'abc'
- */
-var padRight = createPadDir(true);
-
-module.exports = padRight;
diff --git a/node_modules/lodash/string/parseInt.js b/node_modules/lodash/string/parseInt.js
deleted file mode 100644
index f457711..0000000
--- a/node_modules/lodash/string/parseInt.js
+++ /dev/null
@@ -1,46 +0,0 @@
-var isIterateeCall = require('../internal/isIterateeCall'),
-    trim = require('./trim');
-
-/** Used to detect hexadecimal string values. */
-var reHasHexPrefix = /^0[xX]/;
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeParseInt = global.parseInt;
-
-/**
- * Converts `string` to an integer of the specified radix. If `radix` is
- * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,
- * in which case a `radix` of `16` is used.
- *
- * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)
- * of `parseInt`.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} string The string to convert.
- * @param {number} [radix] The radix to interpret `value` by.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {number} Returns the converted integer.
- * @example
- *
- * _.parseInt('08');
- * // => 8
- *
- * _.map(['6', '08', '10'], _.parseInt);
- * // => [6, 8, 10]
- */
-function parseInt(string, radix, guard) {
-  // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`.
-  // Chrome fails to trim leading <BOM> whitespace characters.
-  // See https://code.google.com/p/v8/issues/detail?id=3109 for more details.
-  if (guard ? isIterateeCall(string, radix, guard) : radix == null) {
-    radix = 0;
-  } else if (radix) {
-    radix = +radix;
-  }
-  string = trim(string);
-  return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10));
-}
-
-module.exports = parseInt;
diff --git a/node_modules/lodash/string/repeat.js b/node_modules/lodash/string/repeat.js
deleted file mode 100644
index 2902123..0000000
--- a/node_modules/lodash/string/repeat.js
+++ /dev/null
@@ -1,47 +0,0 @@
-var baseToString = require('../internal/baseToString');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeFloor = Math.floor,
-    nativeIsFinite = global.isFinite;
-
-/**
- * Repeats the given string `n` times.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to repeat.
- * @param {number} [n=0] The number of times to repeat the string.
- * @returns {string} Returns the repeated string.
- * @example
- *
- * _.repeat('*', 3);
- * // => '***'
- *
- * _.repeat('abc', 2);
- * // => 'abcabc'
- *
- * _.repeat('abc', 0);
- * // => ''
- */
-function repeat(string, n) {
-  var result = '';
-  string = baseToString(string);
-  n = +n;
-  if (n < 1 || !string || !nativeIsFinite(n)) {
-    return result;
-  }
-  // Leverage the exponentiation by squaring algorithm for a faster repeat.
-  // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
-  do {
-    if (n % 2) {
-      result += string;
-    }
-    n = nativeFloor(n / 2);
-    string += string;
-  } while (n);
-
-  return result;
-}
-
-module.exports = repeat;
diff --git a/node_modules/lodash/string/snakeCase.js b/node_modules/lodash/string/snakeCase.js
deleted file mode 100644
index c9ebffd..0000000
--- a/node_modules/lodash/string/snakeCase.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var createCompounder = require('../internal/createCompounder');
-
-/**
- * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case).
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to convert.
- * @returns {string} Returns the snake cased string.
- * @example
- *
- * _.snakeCase('Foo Bar');
- * // => 'foo_bar'
- *
- * _.snakeCase('fooBar');
- * // => 'foo_bar'
- *
- * _.snakeCase('--foo-bar');
- * // => 'foo_bar'
- */
-var snakeCase = createCompounder(function(result, word, index) {
-  return result + (index ? '_' : '') + word.toLowerCase();
-});
-
-module.exports = snakeCase;
diff --git a/node_modules/lodash/string/startCase.js b/node_modules/lodash/string/startCase.js
deleted file mode 100644
index 740d48a..0000000
--- a/node_modules/lodash/string/startCase.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var createCompounder = require('../internal/createCompounder');
-
-/**
- * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to convert.
- * @returns {string} Returns the start cased string.
- * @example
- *
- * _.startCase('--foo-bar');
- * // => 'Foo Bar'
- *
- * _.startCase('fooBar');
- * // => 'Foo Bar'
- *
- * _.startCase('__foo_bar__');
- * // => 'Foo Bar'
- */
-var startCase = createCompounder(function(result, word, index) {
-  return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1));
-});
-
-module.exports = startCase;
diff --git a/node_modules/lodash/string/startsWith.js b/node_modules/lodash/string/startsWith.js
deleted file mode 100644
index 65fae2a..0000000
--- a/node_modules/lodash/string/startsWith.js
+++ /dev/null
@@ -1,36 +0,0 @@
-var baseToString = require('../internal/baseToString');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMin = Math.min;
-
-/**
- * Checks if `string` starts with the given target string.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to search.
- * @param {string} [target] The string to search for.
- * @param {number} [position=0] The position to search from.
- * @returns {boolean} Returns `true` if `string` starts with `target`, else `false`.
- * @example
- *
- * _.startsWith('abc', 'a');
- * // => true
- *
- * _.startsWith('abc', 'b');
- * // => false
- *
- * _.startsWith('abc', 'b', 1);
- * // => true
- */
-function startsWith(string, target, position) {
-  string = baseToString(string);
-  position = position == null
-    ? 0
-    : nativeMin(position < 0 ? 0 : (+position || 0), string.length);
-
-  return string.lastIndexOf(target, position) == position;
-}
-
-module.exports = startsWith;
diff --git a/node_modules/lodash/string/template.js b/node_modules/lodash/string/template.js
deleted file mode 100644
index e75e992..0000000
--- a/node_modules/lodash/string/template.js
+++ /dev/null
@@ -1,226 +0,0 @@
-var assignOwnDefaults = require('../internal/assignOwnDefaults'),
-    assignWith = require('../internal/assignWith'),
-    attempt = require('../utility/attempt'),
-    baseAssign = require('../internal/baseAssign'),
-    baseToString = require('../internal/baseToString'),
-    baseValues = require('../internal/baseValues'),
-    escapeStringChar = require('../internal/escapeStringChar'),
-    isError = require('../lang/isError'),
-    isIterateeCall = require('../internal/isIterateeCall'),
-    keys = require('../object/keys'),
-    reInterpolate = require('../internal/reInterpolate'),
-    templateSettings = require('./templateSettings');
-
-/** Used to match empty string literals in compiled template source. */
-var reEmptyStringLeading = /\b__p \+= '';/g,
-    reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
-    reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
-
-/** Used to match [ES template delimiters](http://ecma-international.org/ecma-262/6.0/#sec-template-literal-lexical-components). */
-var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
-
-/** Used to ensure capturing order of template delimiters. */
-var reNoMatch = /($^)/;
-
-/** Used to match unescaped characters in compiled string literals. */
-var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
-
-/**
- * Creates a compiled template function that can interpolate data properties
- * in "interpolate" delimiters, HTML-escape interpolated data properties in
- * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
- * properties may be accessed as free variables in the template. If a setting
- * object is provided it takes precedence over `_.templateSettings` values.
- *
- * **Note:** In the development build `_.template` utilizes
- * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
- * for easier debugging.
- *
- * For more information on precompiling templates see
- * [lodash's custom builds documentation](https://lodash.com/custom-builds).
- *
- * For more information on Chrome extension sandboxes see
- * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The template string.
- * @param {Object} [options] The options object.
- * @param {RegExp} [options.escape] The HTML "escape" delimiter.
- * @param {RegExp} [options.evaluate] The "evaluate" delimiter.
- * @param {Object} [options.imports] An object to import into the template as free variables.
- * @param {RegExp} [options.interpolate] The "interpolate" delimiter.
- * @param {string} [options.sourceURL] The sourceURL of the template's compiled source.
- * @param {string} [options.variable] The data object variable name.
- * @param- {Object} [otherOptions] Enables the legacy `options` param signature.
- * @returns {Function} Returns the compiled template function.
- * @example
- *
- * // using the "interpolate" delimiter to create a compiled template
- * var compiled = _.template('hello <%= user %>!');
- * compiled({ 'user': 'fred' });
- * // => 'hello fred!'
- *
- * // using the HTML "escape" delimiter to escape data property values
- * var compiled = _.template('<b><%- value %></b>');
- * compiled({ 'value': '<script>' });
- * // => '<b>&lt;script&gt;</b>'
- *
- * // using the "evaluate" delimiter to execute JavaScript and generate HTML
- * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
- * compiled({ 'users': ['fred', 'barney'] });
- * // => '<li>fred</li><li>barney</li>'
- *
- * // using the internal `print` function in "evaluate" delimiters
- * var compiled = _.template('<% print("hello " + user); %>!');
- * compiled({ 'user': 'barney' });
- * // => 'hello barney!'
- *
- * // using the ES delimiter as an alternative to the default "interpolate" delimiter
- * var compiled = _.template('hello ${ user }!');
- * compiled({ 'user': 'pebbles' });
- * // => 'hello pebbles!'
- *
- * // using custom template delimiters
- * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
- * var compiled = _.template('hello {{ user }}!');
- * compiled({ 'user': 'mustache' });
- * // => 'hello mustache!'
- *
- * // using backslashes to treat delimiters as plain text
- * var compiled = _.template('<%= "\\<%- value %\\>" %>');
- * compiled({ 'value': 'ignored' });
- * // => '<%- value %>'
- *
- * // using the `imports` option to import `jQuery` as `jq`
- * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
- * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
- * compiled({ 'users': ['fred', 'barney'] });
- * // => '<li>fred</li><li>barney</li>'
- *
- * // using the `sourceURL` option to specify a custom sourceURL for the template
- * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
- * compiled(data);
- * // => find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector
- *
- * // using the `variable` option to ensure a with-statement isn't used in the compiled template
- * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
- * compiled.source;
- * // => function(data) {
- * //   var __t, __p = '';
- * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
- * //   return __p;
- * // }
- *
- * // using the `source` property to inline compiled templates for meaningful
- * // line numbers in error messages and a stack trace
- * fs.writeFileSync(path.join(cwd, 'jst.js'), '\
- *   var JST = {\
- *     "main": ' + _.template(mainText).source + '\
- *   };\
- * ');
- */
-function template(string, options, otherOptions) {
-  // Based on John Resig's `tmpl` implementation (http://ejohn.org/blog/javascript-micro-templating/)
-  // and Laura Doktorova's doT.js (https://github.com/olado/doT).
-  var settings = templateSettings.imports._.templateSettings || templateSettings;
-
-  if (otherOptions && isIterateeCall(string, options, otherOptions)) {
-    options = otherOptions = undefined;
-  }
-  string = baseToString(string);
-  options = assignWith(baseAssign({}, otherOptions || options), settings, assignOwnDefaults);
-
-  var imports = assignWith(baseAssign({}, options.imports), settings.imports, assignOwnDefaults),
-      importsKeys = keys(imports),
-      importsValues = baseValues(imports, importsKeys);
-
-  var isEscaping,
-      isEvaluating,
-      index = 0,
-      interpolate = options.interpolate || reNoMatch,
-      source = "__p += '";
-
-  // Compile the regexp to match each delimiter.
-  var reDelimiters = RegExp(
-    (options.escape || reNoMatch).source + '|' +
-    interpolate.source + '|' +
-    (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
-    (options.evaluate || reNoMatch).source + '|$'
-  , 'g');
-
-  // Use a sourceURL for easier debugging.
-  var sourceURL = 'sourceURL' in options ? '//# sourceURL=' + options.sourceURL + '\n' : '';
-
-  string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
-    interpolateValue || (interpolateValue = esTemplateValue);
-
-    // Escape characters that can't be included in string literals.
-    source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
-
-    // Replace delimiters with snippets.
-    if (escapeValue) {
-      isEscaping = true;
-      source += "' +\n__e(" + escapeValue + ") +\n'";
-    }
-    if (evaluateValue) {
-      isEvaluating = true;
-      source += "';\n" + evaluateValue + ";\n__p += '";
-    }
-    if (interpolateValue) {
-      source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
-    }
-    index = offset + match.length;
-
-    // The JS engine embedded in Adobe products requires returning the `match`
-    // string in order to produce the correct `offset` value.
-    return match;
-  });
-
-  source += "';\n";
-
-  // If `variable` is not specified wrap a with-statement around the generated
-  // code to add the data object to the top of the scope chain.
-  var variable = options.variable;
-  if (!variable) {
-    source = 'with (obj) {\n' + source + '\n}\n';
-  }
-  // Cleanup code by stripping empty strings.
-  source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
-    .replace(reEmptyStringMiddle, '$1')
-    .replace(reEmptyStringTrailing, '$1;');
-
-  // Frame code as the function body.
-  source = 'function(' + (variable || 'obj') + ') {\n' +
-    (variable
-      ? ''
-      : 'obj || (obj = {});\n'
-    ) +
-    "var __t, __p = ''" +
-    (isEscaping
-       ? ', __e = _.escape'
-       : ''
-    ) +
-    (isEvaluating
-      ? ', __j = Array.prototype.join;\n' +
-        "function print() { __p += __j.call(arguments, '') }\n"
-      : ';\n'
-    ) +
-    source +
-    'return __p\n}';
-
-  var result = attempt(function() {
-    return Function(importsKeys, sourceURL + 'return ' + source).apply(undefined, importsValues);
-  });
-
-  // Provide the compiled function's source by its `toString` method or
-  // the `source` property as a convenience for inlining compiled templates.
-  result.source = source;
-  if (isError(result)) {
-    throw result;
-  }
-  return result;
-}
-
-module.exports = template;
diff --git a/node_modules/lodash/string/templateSettings.js b/node_modules/lodash/string/templateSettings.js
deleted file mode 100644
index cdcef9b..0000000
--- a/node_modules/lodash/string/templateSettings.js
+++ /dev/null
@@ -1,67 +0,0 @@
-var escape = require('./escape'),
-    reEscape = require('../internal/reEscape'),
-    reEvaluate = require('../internal/reEvaluate'),
-    reInterpolate = require('../internal/reInterpolate');
-
-/**
- * By default, the template delimiters used by lodash are like those in
- * embedded Ruby (ERB). Change the following template settings to use
- * alternative delimiters.
- *
- * @static
- * @memberOf _
- * @type Object
- */
-var templateSettings = {
-
-  /**
-   * Used to detect `data` property values to be HTML-escaped.
-   *
-   * @memberOf _.templateSettings
-   * @type RegExp
-   */
-  'escape': reEscape,
-
-  /**
-   * Used to detect code to be evaluated.
-   *
-   * @memberOf _.templateSettings
-   * @type RegExp
-   */
-  'evaluate': reEvaluate,
-
-  /**
-   * Used to detect `data` property values to inject.
-   *
-   * @memberOf _.templateSettings
-   * @type RegExp
-   */
-  'interpolate': reInterpolate,
-
-  /**
-   * Used to reference the data object in the template text.
-   *
-   * @memberOf _.templateSettings
-   * @type string
-   */
-  'variable': '',
-
-  /**
-   * Used to import variables into the compiled template.
-   *
-   * @memberOf _.templateSettings
-   * @type Object
-   */
-  'imports': {
-
-    /**
-     * A reference to the `lodash` function.
-     *
-     * @memberOf _.templateSettings.imports
-     * @type Function
-     */
-    '_': { 'escape': escape }
-  }
-};
-
-module.exports = templateSettings;
diff --git a/node_modules/lodash/string/trim.js b/node_modules/lodash/string/trim.js
deleted file mode 100644
index 22cd38a..0000000
--- a/node_modules/lodash/string/trim.js
+++ /dev/null
@@ -1,42 +0,0 @@
-var baseToString = require('../internal/baseToString'),
-    charsLeftIndex = require('../internal/charsLeftIndex'),
-    charsRightIndex = require('../internal/charsRightIndex'),
-    isIterateeCall = require('../internal/isIterateeCall'),
-    trimmedLeftIndex = require('../internal/trimmedLeftIndex'),
-    trimmedRightIndex = require('../internal/trimmedRightIndex');
-
-/**
- * Removes leading and trailing whitespace or specified characters from `string`.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to trim.
- * @param {string} [chars=whitespace] The characters to trim.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {string} Returns the trimmed string.
- * @example
- *
- * _.trim('  abc  ');
- * // => 'abc'
- *
- * _.trim('-_-abc-_-', '_-');
- * // => 'abc'
- *
- * _.map(['  foo  ', '  bar  '], _.trim);
- * // => ['foo', 'bar']
- */
-function trim(string, chars, guard) {
-  var value = string;
-  string = baseToString(string);
-  if (!string) {
-    return string;
-  }
-  if (guard ? isIterateeCall(value, chars, guard) : chars == null) {
-    return string.slice(trimmedLeftIndex(string), trimmedRightIndex(string) + 1);
-  }
-  chars = (chars + '');
-  return string.slice(charsLeftIndex(string, chars), charsRightIndex(string, chars) + 1);
-}
-
-module.exports = trim;
diff --git a/node_modules/lodash/string/trimLeft.js b/node_modules/lodash/string/trimLeft.js
deleted file mode 100644
index 2929967..0000000
--- a/node_modules/lodash/string/trimLeft.js
+++ /dev/null
@@ -1,36 +0,0 @@
-var baseToString = require('../internal/baseToString'),
-    charsLeftIndex = require('../internal/charsLeftIndex'),
-    isIterateeCall = require('../internal/isIterateeCall'),
-    trimmedLeftIndex = require('../internal/trimmedLeftIndex');
-
-/**
- * Removes leading whitespace or specified characters from `string`.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to trim.
- * @param {string} [chars=whitespace] The characters to trim.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {string} Returns the trimmed string.
- * @example
- *
- * _.trimLeft('  abc  ');
- * // => 'abc  '
- *
- * _.trimLeft('-_-abc-_-', '_-');
- * // => 'abc-_-'
- */
-function trimLeft(string, chars, guard) {
-  var value = string;
-  string = baseToString(string);
-  if (!string) {
-    return string;
-  }
-  if (guard ? isIterateeCall(value, chars, guard) : chars == null) {
-    return string.slice(trimmedLeftIndex(string));
-  }
-  return string.slice(charsLeftIndex(string, (chars + '')));
-}
-
-module.exports = trimLeft;
diff --git a/node_modules/lodash/string/trimRight.js b/node_modules/lodash/string/trimRight.js
deleted file mode 100644
index 0f9be71..0000000
--- a/node_modules/lodash/string/trimRight.js
+++ /dev/null
@@ -1,36 +0,0 @@
-var baseToString = require('../internal/baseToString'),
-    charsRightIndex = require('../internal/charsRightIndex'),
-    isIterateeCall = require('../internal/isIterateeCall'),
-    trimmedRightIndex = require('../internal/trimmedRightIndex');
-
-/**
- * Removes trailing whitespace or specified characters from `string`.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to trim.
- * @param {string} [chars=whitespace] The characters to trim.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {string} Returns the trimmed string.
- * @example
- *
- * _.trimRight('  abc  ');
- * // => '  abc'
- *
- * _.trimRight('-_-abc-_-', '_-');
- * // => '-_-abc'
- */
-function trimRight(string, chars, guard) {
-  var value = string;
-  string = baseToString(string);
-  if (!string) {
-    return string;
-  }
-  if (guard ? isIterateeCall(value, chars, guard) : chars == null) {
-    return string.slice(0, trimmedRightIndex(string) + 1);
-  }
-  return string.slice(0, charsRightIndex(string, (chars + '')) + 1);
-}
-
-module.exports = trimRight;
diff --git a/node_modules/lodash/string/trunc.js b/node_modules/lodash/string/trunc.js
deleted file mode 100644
index 29e1939..0000000
--- a/node_modules/lodash/string/trunc.js
+++ /dev/null
@@ -1,105 +0,0 @@
-var baseToString = require('../internal/baseToString'),
-    isIterateeCall = require('../internal/isIterateeCall'),
-    isObject = require('../lang/isObject'),
-    isRegExp = require('../lang/isRegExp');
-
-/** Used as default options for `_.trunc`. */
-var DEFAULT_TRUNC_LENGTH = 30,
-    DEFAULT_TRUNC_OMISSION = '...';
-
-/** Used to match `RegExp` flags from their coerced string values. */
-var reFlags = /\w*$/;
-
-/**
- * Truncates `string` if it's longer than the given maximum string length.
- * The last characters of the truncated string are replaced with the omission
- * string which defaults to "...".
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to truncate.
- * @param {Object|number} [options] The options object or maximum string length.
- * @param {number} [options.length=30] The maximum string length.
- * @param {string} [options.omission='...'] The string to indicate text is omitted.
- * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {string} Returns the truncated string.
- * @example
- *
- * _.trunc('hi-diddly-ho there, neighborino');
- * // => 'hi-diddly-ho there, neighbo...'
- *
- * _.trunc('hi-diddly-ho there, neighborino', 24);
- * // => 'hi-diddly-ho there, n...'
- *
- * _.trunc('hi-diddly-ho there, neighborino', {
- *   'length': 24,
- *   'separator': ' '
- * });
- * // => 'hi-diddly-ho there,...'
- *
- * _.trunc('hi-diddly-ho there, neighborino', {
- *   'length': 24,
- *   'separator': /,? +/
- * });
- * // => 'hi-diddly-ho there...'
- *
- * _.trunc('hi-diddly-ho there, neighborino', {
- *   'omission': ' [...]'
- * });
- * // => 'hi-diddly-ho there, neig [...]'
- */
-function trunc(string, options, guard) {
-  if (guard && isIterateeCall(string, options, guard)) {
-    options = undefined;
-  }
-  var length = DEFAULT_TRUNC_LENGTH,
-      omission = DEFAULT_TRUNC_OMISSION;
-
-  if (options != null) {
-    if (isObject(options)) {
-      var separator = 'separator' in options ? options.separator : separator;
-      length = 'length' in options ? (+options.length || 0) : length;
-      omission = 'omission' in options ? baseToString(options.omission) : omission;
-    } else {
-      length = +options || 0;
-    }
-  }
-  string = baseToString(string);
-  if (length >= string.length) {
-    return string;
-  }
-  var end = length - omission.length;
-  if (end < 1) {
-    return omission;
-  }
-  var result = string.slice(0, end);
-  if (separator == null) {
-    return result + omission;
-  }
-  if (isRegExp(separator)) {
-    if (string.slice(end).search(separator)) {
-      var match,
-          newEnd,
-          substring = string.slice(0, end);
-
-      if (!separator.global) {
-        separator = RegExp(separator.source, (reFlags.exec(separator) || '') + 'g');
-      }
-      separator.lastIndex = 0;
-      while ((match = separator.exec(substring))) {
-        newEnd = match.index;
-      }
-      result = result.slice(0, newEnd == null ? end : newEnd);
-    }
-  } else if (string.indexOf(separator, end) != end) {
-    var index = result.lastIndexOf(separator);
-    if (index > -1) {
-      result = result.slice(0, index);
-    }
-  }
-  return result + omission;
-}
-
-module.exports = trunc;
diff --git a/node_modules/lodash/string/unescape.js b/node_modules/lodash/string/unescape.js
deleted file mode 100644
index b0266a7..0000000
--- a/node_modules/lodash/string/unescape.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var baseToString = require('../internal/baseToString'),
-    unescapeHtmlChar = require('../internal/unescapeHtmlChar');
-
-/** Used to match HTML entities and HTML characters. */
-var reEscapedHtml = /&(?:amp|lt|gt|quot|#39|#96);/g,
-    reHasEscapedHtml = RegExp(reEscapedHtml.source);
-
-/**
- * The inverse of `_.escape`; this method converts the HTML entities
- * `&amp;`, `&lt;`, `&gt;`, `&quot;`, `&#39;`, and `&#96;` in `string` to their
- * corresponding characters.
- *
- * **Note:** No other HTML entities are unescaped. To unescape additional HTML
- * entities use a third-party library like [_he_](https://mths.be/he).
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to unescape.
- * @returns {string} Returns the unescaped string.
- * @example
- *
- * _.unescape('fred, barney, &amp; pebbles');
- * // => 'fred, barney, & pebbles'
- */
-function unescape(string) {
-  string = baseToString(string);
-  return (string && reHasEscapedHtml.test(string))
-    ? string.replace(reEscapedHtml, unescapeHtmlChar)
-    : string;
-}
-
-module.exports = unescape;
diff --git a/node_modules/lodash/string/words.js b/node_modules/lodash/string/words.js
deleted file mode 100644
index 3013ad6..0000000
--- a/node_modules/lodash/string/words.js
+++ /dev/null
@@ -1,38 +0,0 @@
-var baseToString = require('../internal/baseToString'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/** Used to match words to create compound words. */
-var reWords = (function() {
-  var upper = '[A-Z\\xc0-\\xd6\\xd8-\\xde]',
-      lower = '[a-z\\xdf-\\xf6\\xf8-\\xff]+';
-
-  return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');
-}());
-
-/**
- * Splits `string` into an array of its words.
- *
- * @static
- * @memberOf _
- * @category String
- * @param {string} [string=''] The string to inspect.
- * @param {RegExp|string} [pattern] The pattern to match words.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Array} Returns the words of `string`.
- * @example
- *
- * _.words('fred, barney, & pebbles');
- * // => ['fred', 'barney', 'pebbles']
- *
- * _.words('fred, barney, & pebbles', /[^, ]+/g);
- * // => ['fred', 'barney', '&', 'pebbles']
- */
-function words(string, pattern, guard) {
-  if (guard && isIterateeCall(string, pattern, guard)) {
-    pattern = undefined;
-  }
-  string = baseToString(string);
-  return string.match(pattern || reWords) || [];
-}
-
-module.exports = words;
diff --git a/node_modules/lodash/support.js b/node_modules/lodash/support.js
deleted file mode 100644
index 5009c2c..0000000
--- a/node_modules/lodash/support.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * An object environment feature flags.
- *
- * @static
- * @memberOf _
- * @type Object
- */
-var support = {};
-
-module.exports = support;
diff --git a/node_modules/lodash/utility.js b/node_modules/lodash/utility.js
deleted file mode 100644
index 25311fa..0000000
--- a/node_modules/lodash/utility.js
+++ /dev/null
@@ -1,18 +0,0 @@
-module.exports = {
-  'attempt': require('./utility/attempt'),
-  'callback': require('./utility/callback'),
-  'constant': require('./utility/constant'),
-  'identity': require('./utility/identity'),
-  'iteratee': require('./utility/iteratee'),
-  'matches': require('./utility/matches'),
-  'matchesProperty': require('./utility/matchesProperty'),
-  'method': require('./utility/method'),
-  'methodOf': require('./utility/methodOf'),
-  'mixin': require('./utility/mixin'),
-  'noop': require('./utility/noop'),
-  'property': require('./utility/property'),
-  'propertyOf': require('./utility/propertyOf'),
-  'range': require('./utility/range'),
-  'times': require('./utility/times'),
-  'uniqueId': require('./utility/uniqueId')
-};
diff --git a/node_modules/lodash/utility/attempt.js b/node_modules/lodash/utility/attempt.js
deleted file mode 100644
index 8d8fb98..0000000
--- a/node_modules/lodash/utility/attempt.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var isError = require('../lang/isError'),
-    restParam = require('../function/restParam');
-
-/**
- * Attempts to invoke `func`, returning either the result or the caught error
- * object. Any additional arguments are provided to `func` when it's invoked.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {Function} func The function to attempt.
- * @returns {*} Returns the `func` result or error object.
- * @example
- *
- * // avoid throwing errors for invalid selectors
- * var elements = _.attempt(function(selector) {
- *   return document.querySelectorAll(selector);
- * }, '>_>');
- *
- * if (_.isError(elements)) {
- *   elements = [];
- * }
- */
-var attempt = restParam(function(func, args) {
-  try {
-    return func.apply(undefined, args);
-  } catch(e) {
-    return isError(e) ? e : new Error(e);
-  }
-});
-
-module.exports = attempt;
diff --git a/node_modules/lodash/utility/callback.js b/node_modules/lodash/utility/callback.js
deleted file mode 100644
index 21223d0..0000000
--- a/node_modules/lodash/utility/callback.js
+++ /dev/null
@@ -1,53 +0,0 @@
-var baseCallback = require('../internal/baseCallback'),
-    isIterateeCall = require('../internal/isIterateeCall'),
-    isObjectLike = require('../internal/isObjectLike'),
-    matches = require('./matches');
-
-/**
- * Creates a function that invokes `func` with the `this` binding of `thisArg`
- * and arguments of the created function. If `func` is a property name the
- * created callback returns the property value for a given element. If `func`
- * is an object the created callback returns `true` for elements that contain
- * the equivalent object properties, otherwise it returns `false`.
- *
- * @static
- * @memberOf _
- * @alias iteratee
- * @category Utility
- * @param {*} [func=_.identity] The value to convert to a callback.
- * @param {*} [thisArg] The `this` binding of `func`.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Function} Returns the callback.
- * @example
- *
- * var users = [
- *   { 'user': 'barney', 'age': 36 },
- *   { 'user': 'fred',   'age': 40 }
- * ];
- *
- * // wrap to create custom callback shorthands
- * _.callback = _.wrap(_.callback, function(callback, func, thisArg) {
- *   var match = /^(.+?)__([gl]t)(.+)$/.exec(func);
- *   if (!match) {
- *     return callback(func, thisArg);
- *   }
- *   return function(object) {
- *     return match[2] == 'gt'
- *       ? object[match[1]] > match[3]
- *       : object[match[1]] < match[3];
- *   };
- * });
- *
- * _.filter(users, 'age__gt36');
- * // => [{ 'user': 'fred', 'age': 40 }]
- */
-function callback(func, thisArg, guard) {
-  if (guard && isIterateeCall(func, thisArg, guard)) {
-    thisArg = undefined;
-  }
-  return isObjectLike(func)
-    ? matches(func)
-    : baseCallback(func, thisArg);
-}
-
-module.exports = callback;
diff --git a/node_modules/lodash/utility/constant.js b/node_modules/lodash/utility/constant.js
deleted file mode 100644
index 6919b76..0000000
--- a/node_modules/lodash/utility/constant.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Creates a function that returns `value`.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {*} value The value to return from the new function.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var object = { 'user': 'fred' };
- * var getter = _.constant(object);
- *
- * getter() === object;
- * // => true
- */
-function constant(value) {
-  return function() {
-    return value;
-  };
-}
-
-module.exports = constant;
diff --git a/node_modules/lodash/utility/identity.js b/node_modules/lodash/utility/identity.js
deleted file mode 100644
index 3a1d1d4..0000000
--- a/node_modules/lodash/utility/identity.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * This method returns the first argument provided to it.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {*} value Any value.
- * @returns {*} Returns `value`.
- * @example
- *
- * var object = { 'user': 'fred' };
- *
- * _.identity(object) === object;
- * // => true
- */
-function identity(value) {
-  return value;
-}
-
-module.exports = identity;
diff --git a/node_modules/lodash/utility/iteratee.js b/node_modules/lodash/utility/iteratee.js
deleted file mode 100644
index fcfa202..0000000
--- a/node_modules/lodash/utility/iteratee.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./callback');
diff --git a/node_modules/lodash/utility/matches.js b/node_modules/lodash/utility/matches.js
deleted file mode 100644
index a182637..0000000
--- a/node_modules/lodash/utility/matches.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var baseClone = require('../internal/baseClone'),
-    baseMatches = require('../internal/baseMatches');
-
-/**
- * Creates a function that performs a deep comparison between a given object
- * and `source`, returning `true` if the given object has equivalent property
- * values, else `false`.
- *
- * **Note:** This method supports comparing arrays, booleans, `Date` objects,
- * numbers, `Object` objects, regexes, and strings. Objects are compared by
- * their own, not inherited, enumerable properties. For comparing a single
- * own or inherited property value see `_.matchesProperty`.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {Object} source The object of property values to match.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var users = [
- *   { 'user': 'barney', 'age': 36, 'active': true },
- *   { 'user': 'fred',   'age': 40, 'active': false }
- * ];
- *
- * _.filter(users, _.matches({ 'age': 40, 'active': false }));
- * // => [{ 'user': 'fred', 'age': 40, 'active': false }]
- */
-function matches(source) {
-  return baseMatches(baseClone(source, true));
-}
-
-module.exports = matches;
diff --git a/node_modules/lodash/utility/matchesProperty.js b/node_modules/lodash/utility/matchesProperty.js
deleted file mode 100644
index 91e51a5..0000000
--- a/node_modules/lodash/utility/matchesProperty.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var baseClone = require('../internal/baseClone'),
-    baseMatchesProperty = require('../internal/baseMatchesProperty');
-
-/**
- * Creates a function that compares the property value of `path` on a given
- * object to `value`.
- *
- * **Note:** This method supports comparing arrays, booleans, `Date` objects,
- * numbers, `Object` objects, regexes, and strings. Objects are compared by
- * their own, not inherited, enumerable properties.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {Array|string} path The path of the property to get.
- * @param {*} srcValue The value to match.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var users = [
- *   { 'user': 'barney' },
- *   { 'user': 'fred' }
- * ];
- *
- * _.find(users, _.matchesProperty('user', 'fred'));
- * // => { 'user': 'fred' }
- */
-function matchesProperty(path, srcValue) {
-  return baseMatchesProperty(path, baseClone(srcValue, true));
-}
-
-module.exports = matchesProperty;
diff --git a/node_modules/lodash/utility/method.js b/node_modules/lodash/utility/method.js
deleted file mode 100644
index e315b7f..0000000
--- a/node_modules/lodash/utility/method.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var invokePath = require('../internal/invokePath'),
-    restParam = require('../function/restParam');
-
-/**
- * Creates a function that invokes the method at `path` on a given object.
- * Any additional arguments are provided to the invoked method.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {Array|string} path The path of the method to invoke.
- * @param {...*} [args] The arguments to invoke the method with.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var objects = [
- *   { 'a': { 'b': { 'c': _.constant(2) } } },
- *   { 'a': { 'b': { 'c': _.constant(1) } } }
- * ];
- *
- * _.map(objects, _.method('a.b.c'));
- * // => [2, 1]
- *
- * _.invoke(_.sortBy(objects, _.method(['a', 'b', 'c'])), 'a.b.c');
- * // => [1, 2]
- */
-var method = restParam(function(path, args) {
-  return function(object) {
-    return invokePath(object, path, args);
-  };
-});
-
-module.exports = method;
diff --git a/node_modules/lodash/utility/methodOf.js b/node_modules/lodash/utility/methodOf.js
deleted file mode 100644
index f61b782..0000000
--- a/node_modules/lodash/utility/methodOf.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var invokePath = require('../internal/invokePath'),
-    restParam = require('../function/restParam');
-
-/**
- * The opposite of `_.method`; this method creates a function that invokes
- * the method at a given path on `object`. Any additional arguments are
- * provided to the invoked method.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {Object} object The object to query.
- * @param {...*} [args] The arguments to invoke the method with.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var array = _.times(3, _.constant),
- *     object = { 'a': array, 'b': array, 'c': array };
- *
- * _.map(['a[2]', 'c[0]'], _.methodOf(object));
- * // => [2, 0]
- *
- * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
- * // => [2, 0]
- */
-var methodOf = restParam(function(object, args) {
-  return function(path) {
-    return invokePath(object, path, args);
-  };
-});
-
-module.exports = methodOf;
diff --git a/node_modules/lodash/utility/mixin.js b/node_modules/lodash/utility/mixin.js
deleted file mode 100644
index 5c4a372..0000000
--- a/node_modules/lodash/utility/mixin.js
+++ /dev/null
@@ -1,82 +0,0 @@
-var arrayCopy = require('../internal/arrayCopy'),
-    arrayPush = require('../internal/arrayPush'),
-    baseFunctions = require('../internal/baseFunctions'),
-    isFunction = require('../lang/isFunction'),
-    isObject = require('../lang/isObject'),
-    keys = require('../object/keys');
-
-/**
- * Adds all own enumerable function properties of a source object to the
- * destination object. If `object` is a function then methods are added to
- * its prototype as well.
- *
- * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
- * avoid conflicts caused by modifying the original.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {Function|Object} [object=lodash] The destination object.
- * @param {Object} source The object of functions to add.
- * @param {Object} [options] The options object.
- * @param {boolean} [options.chain=true] Specify whether the functions added
- *  are chainable.
- * @returns {Function|Object} Returns `object`.
- * @example
- *
- * function vowels(string) {
- *   return _.filter(string, function(v) {
- *     return /[aeiou]/i.test(v);
- *   });
- * }
- *
- * _.mixin({ 'vowels': vowels });
- * _.vowels('fred');
- * // => ['e']
- *
- * _('fred').vowels().value();
- * // => ['e']
- *
- * _.mixin({ 'vowels': vowels }, { 'chain': false });
- * _('fred').vowels();
- * // => ['e']
- */
-function mixin(object, source, options) {
-  var methodNames = baseFunctions(source, keys(source));
-
-  var chain = true,
-      index = -1,
-      isFunc = isFunction(object),
-      length = methodNames.length;
-
-  if (options === false) {
-    chain = false;
-  } else if (isObject(options) && 'chain' in options) {
-    chain = options.chain;
-  }
-  while (++index < length) {
-    var methodName = methodNames[index],
-        func = source[methodName];
-
-    object[methodName] = func;
-    if (isFunc) {
-      object.prototype[methodName] = (function(func) {
-        return function() {
-          var chainAll = this.__chain__;
-          if (chain || chainAll) {
-            var result = object(this.__wrapped__),
-                actions = result.__actions__ = arrayCopy(this.__actions__);
-
-            actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
-            result.__chain__ = chainAll;
-            return result;
-          }
-          return func.apply(object, arrayPush([this.value()], arguments));
-        };
-      }(func));
-    }
-  }
-  return object;
-}
-
-module.exports = mixin;
diff --git a/node_modules/lodash/utility/noop.js b/node_modules/lodash/utility/noop.js
deleted file mode 100644
index 56d6513..0000000
--- a/node_modules/lodash/utility/noop.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * A no-operation function that returns `undefined` regardless of the
- * arguments it receives.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @example
- *
- * var object = { 'user': 'fred' };
- *
- * _.noop(object) === undefined;
- * // => true
- */
-function noop() {
-  // No operation performed.
-}
-
-module.exports = noop;
diff --git a/node_modules/lodash/utility/property.js b/node_modules/lodash/utility/property.js
deleted file mode 100644
index ddfd597..0000000
--- a/node_modules/lodash/utility/property.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var baseProperty = require('../internal/baseProperty'),
-    basePropertyDeep = require('../internal/basePropertyDeep'),
-    isKey = require('../internal/isKey');
-
-/**
- * Creates a function that returns the property value at `path` on a
- * given object.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {Array|string} path The path of the property to get.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var objects = [
- *   { 'a': { 'b': { 'c': 2 } } },
- *   { 'a': { 'b': { 'c': 1 } } }
- * ];
- *
- * _.map(objects, _.property('a.b.c'));
- * // => [2, 1]
- *
- * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');
- * // => [1, 2]
- */
-function property(path) {
-  return isKey(path) ? baseProperty(path) : basePropertyDeep(path);
-}
-
-module.exports = property;
diff --git a/node_modules/lodash/utility/propertyOf.js b/node_modules/lodash/utility/propertyOf.js
deleted file mode 100644
index 593a266..0000000
--- a/node_modules/lodash/utility/propertyOf.js
+++ /dev/null
@@ -1,30 +0,0 @@
-var baseGet = require('../internal/baseGet'),
-    toPath = require('../internal/toPath');
-
-/**
- * The opposite of `_.property`; this method creates a function that returns
- * the property value at a given path on `object`.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {Object} object The object to query.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var array = [0, 1, 2],
- *     object = { 'a': array, 'b': array, 'c': array };
- *
- * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
- * // => [2, 0]
- *
- * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
- * // => [2, 0]
- */
-function propertyOf(object) {
-  return function(path) {
-    return baseGet(object, toPath(path), (path + ''));
-  };
-}
-
-module.exports = propertyOf;
diff --git a/node_modules/lodash/utility/range.js b/node_modules/lodash/utility/range.js
deleted file mode 100644
index 671939a..0000000
--- a/node_modules/lodash/utility/range.js
+++ /dev/null
@@ -1,66 +0,0 @@
-var isIterateeCall = require('../internal/isIterateeCall');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeCeil = Math.ceil,
-    nativeMax = Math.max;
-
-/**
- * Creates an array of numbers (positive and/or negative) progressing from
- * `start` up to, but not including, `end`. If `end` is not specified it's
- * set to `start` with `start` then set to `0`. If `end` is less than `start`
- * a zero-length range is created unless a negative `step` is specified.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {number} [start=0] The start of the range.
- * @param {number} end The end of the range.
- * @param {number} [step=1] The value to increment or decrement by.
- * @returns {Array} Returns the new array of numbers.
- * @example
- *
- * _.range(4);
- * // => [0, 1, 2, 3]
- *
- * _.range(1, 5);
- * // => [1, 2, 3, 4]
- *
- * _.range(0, 20, 5);
- * // => [0, 5, 10, 15]
- *
- * _.range(0, -4, -1);
- * // => [0, -1, -2, -3]
- *
- * _.range(1, 4, 0);
- * // => [1, 1, 1]
- *
- * _.range(0);
- * // => []
- */
-function range(start, end, step) {
-  if (step && isIterateeCall(start, end, step)) {
-    end = step = undefined;
-  }
-  start = +start || 0;
-  step = step == null ? 1 : (+step || 0);
-
-  if (end == null) {
-    end = start;
-    start = 0;
-  } else {
-    end = +end || 0;
-  }
-  // Use `Array(length)` so engines like Chakra and V8 avoid slower modes.
-  // See https://youtu.be/XAqIpGU8ZZk#t=17m25s for more details.
-  var index = -1,
-      length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
-      result = Array(length);
-
-  while (++index < length) {
-    result[index] = start;
-    start += step;
-  }
-  return result;
-}
-
-module.exports = range;
diff --git a/node_modules/lodash/utility/times.js b/node_modules/lodash/utility/times.js
deleted file mode 100644
index 9a41e2f..0000000
--- a/node_modules/lodash/utility/times.js
+++ /dev/null
@@ -1,60 +0,0 @@
-var bindCallback = require('../internal/bindCallback');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeFloor = Math.floor,
-    nativeIsFinite = global.isFinite,
-    nativeMin = Math.min;
-
-/** Used as references for the maximum length and index of an array. */
-var MAX_ARRAY_LENGTH = 4294967295;
-
-/**
- * Invokes the iteratee function `n` times, returning an array of the results
- * of each invocation. The `iteratee` is bound to `thisArg` and invoked with
- * one argument; (index).
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {number} n The number of times to invoke `iteratee`.
- * @param {Function} [iteratee=_.identity] The function invoked per iteration.
- * @param {*} [thisArg] The `this` binding of `iteratee`.
- * @returns {Array} Returns the array of results.
- * @example
- *
- * var diceRolls = _.times(3, _.partial(_.random, 1, 6, false));
- * // => [3, 6, 4]
- *
- * _.times(3, function(n) {
- *   mage.castSpell(n);
- * });
- * // => invokes `mage.castSpell(n)` three times with `n` of `0`, `1`, and `2`
- *
- * _.times(3, function(n) {
- *   this.cast(n);
- * }, mage);
- * // => also invokes `mage.castSpell(n)` three times
- */
-function times(n, iteratee, thisArg) {
-  n = nativeFloor(n);
-
-  // Exit early to avoid a JSC JIT bug in Safari 8
-  // where `Array(0)` is treated as `Array(1)`.
-  if (n < 1 || !nativeIsFinite(n)) {
-    return [];
-  }
-  var index = -1,
-      result = Array(nativeMin(n, MAX_ARRAY_LENGTH));
-
-  iteratee = bindCallback(iteratee, thisArg, 1);
-  while (++index < n) {
-    if (index < MAX_ARRAY_LENGTH) {
-      result[index] = iteratee(index);
-    } else {
-      iteratee(index);
-    }
-  }
-  return result;
-}
-
-module.exports = times;
diff --git a/node_modules/lodash/utility/uniqueId.js b/node_modules/lodash/utility/uniqueId.js
deleted file mode 100644
index 88e02bf..0000000
--- a/node_modules/lodash/utility/uniqueId.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var baseToString = require('../internal/baseToString');
-
-/** Used to generate unique IDs. */
-var idCounter = 0;
-
-/**
- * Generates a unique ID. If `prefix` is provided the ID is appended to it.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {string} [prefix] The value to prefix the ID with.
- * @returns {string} Returns the unique ID.
- * @example
- *
- * _.uniqueId('contact_');
- * // => 'contact_104'
- *
- * _.uniqueId();
- * // => '105'
- */
-function uniqueId(prefix) {
-  var id = ++idCounter;
-  return baseToString(prefix) + id;
-}
-
-module.exports = uniqueId;
diff --git a/node_modules/minimatch/LICENSE b/node_modules/minimatch/LICENSE
deleted file mode 100644
index 19129e3..0000000
--- a/node_modules/minimatch/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/minimatch/README.md b/node_modules/minimatch/README.md
deleted file mode 100644
index ad72b81..0000000
--- a/node_modules/minimatch/README.md
+++ /dev/null
@@ -1,209 +0,0 @@
-# minimatch
-
-A minimal matching utility.
-
-[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.svg)](http://travis-ci.org/isaacs/minimatch)
-
-
-This is the matching library used internally by npm.
-
-It works by converting glob expressions into JavaScript `RegExp`
-objects.
-
-## Usage
-
-```javascript
-var minimatch = require("minimatch")
-
-minimatch("bar.foo", "*.foo") // true!
-minimatch("bar.foo", "*.bar") // false!
-minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
-```
-
-## Features
-
-Supports these glob features:
-
-* Brace Expansion
-* Extended glob matching
-* "Globstar" `**` matching
-
-See:
-
-* `man sh`
-* `man bash`
-* `man 3 fnmatch`
-* `man 5 gitignore`
-
-## Minimatch Class
-
-Create a minimatch object by instantiating the `minimatch.Minimatch` class.
-
-```javascript
-var Minimatch = require("minimatch").Minimatch
-var mm = new Minimatch(pattern, options)
-```
-
-### Properties
-
-* `pattern` The original pattern the minimatch object represents.
-* `options` The options supplied to the constructor.
-* `set` A 2-dimensional array of regexp or string expressions.
-  Each row in the
-  array corresponds to a brace-expanded pattern.  Each item in the row
-  corresponds to a single path-part.  For example, the pattern
-  `{a,b/c}/d` would expand to a set of patterns like:
-
-        [ [ a, d ]
-        , [ b, c, d ] ]
-
-    If a portion of the pattern doesn't have any "magic" in it
-    (that is, it's something like `"foo"` rather than `fo*o?`), then it
-    will be left as a string rather than converted to a regular
-    expression.
-
-* `regexp` Created by the `makeRe` method.  A single regular expression
-  expressing the entire pattern.  This is useful in cases where you wish
-  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.
-* `negate` True if the pattern is negated.
-* `comment` True if the pattern is a comment.
-* `empty` True if the pattern is `""`.
-
-### Methods
-
-* `makeRe` Generate the `regexp` member if necessary, and return it.
-  Will return `false` if the pattern is invalid.
-* `match(fname)` Return true if the filename matches the pattern, or
-  false otherwise.
-* `matchOne(fileArray, patternArray, partial)` Take a `/`-split
-  filename, and match it against a single row in the `regExpSet`.  This
-  method is mainly for internal use, but is exposed so that it can be
-  used by a glob-walker that needs to avoid excessive filesystem calls.
-
-All other methods are internal, and will be called as necessary.
-
-### minimatch(path, pattern, options)
-
-Main export.  Tests a path against the pattern using the options.
-
-```javascript
-var isJS = minimatch(file, "*.js", { matchBase: true })
-```
-
-### minimatch.filter(pattern, options)
-
-Returns a function that tests its
-supplied argument, suitable for use with `Array.filter`.  Example:
-
-```javascript
-var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true}))
-```
-
-### minimatch.match(list, pattern, options)
-
-Match against the list of
-files, in the style of fnmatch or glob.  If nothing is matched, and
-options.nonull is set, then return a list containing the pattern itself.
-
-```javascript
-var javascripts = minimatch.match(fileList, "*.js", {matchBase: true}))
-```
-
-### minimatch.makeRe(pattern, options)
-
-Make a regular expression object from the pattern.
-
-## Options
-
-All options are `false` by default.
-
-### debug
-
-Dump a ton of stuff to stderr.
-
-### nobrace
-
-Do not expand `{a,b}` and `{1..3}` brace sets.
-
-### noglobstar
-
-Disable `**` matching against multiple folder names.
-
-### dot
-
-Allow patterns to match filenames starting with a period, even if
-the pattern does not explicitly have a period in that spot.
-
-Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`
-is set.
-
-### noext
-
-Disable "extglob" style patterns like `+(a|b)`.
-
-### nocase
-
-Perform a case-insensitive match.
-
-### nonull
-
-When a match is not found by `minimatch.match`, return a list containing
-the pattern itself if this option is set.  When not set, an empty list
-is returned if there are no matches.
-
-### matchBase
-
-If set, then patterns without slashes will be matched
-against the basename of the path if it contains slashes.  For example,
-`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.
-
-### nocomment
-
-Suppress the behavior of treating `#` at the start of a pattern as a
-comment.
-
-### nonegate
-
-Suppress the behavior of treating a leading `!` character as negation.
-
-### flipNegate
-
-Returns from negate expressions the same as if they were not negated.
-(Ie, true on a hit, false on a miss.)
-
-
-## Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a worthwhile
-goal, some discrepancies exist between minimatch and other
-implementations, and are intentional.
-
-If the pattern starts with a `!` character, then it is negated.  Set the
-`nonegate` flag to suppress this behavior, and treat leading `!`
-characters normally.  This is perhaps relevant if you wish to start the
-pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
-characters at the start of a pattern will negate the pattern multiple
-times.
-
-If a pattern starts with `#`, then it is treated as a comment, and
-will not match anything.  Use `\#` to match a literal `#` at the
-start of a line, or set the `nocomment` flag to suppress this behavior.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set.  This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
-thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then minimatch.match returns the pattern as-provided, rather than
-interpreting the character escapes.  For example,
-`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern.  Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity.  Since those two are valid, matching proceeds.
diff --git a/node_modules/minimatch/minimatch.js b/node_modules/minimatch/minimatch.js
deleted file mode 100644
index 5b5f8cf..0000000
--- a/node_modules/minimatch/minimatch.js
+++ /dev/null
@@ -1,923 +0,0 @@
-module.exports = minimatch
-minimatch.Minimatch = Minimatch
-
-var path = { sep: '/' }
-try {
-  path = require('path')
-} catch (er) {}
-
-var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
-var expand = require('brace-expansion')
-
-var plTypes = {
-  '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
-  '?': { open: '(?:', close: ')?' },
-  '+': { open: '(?:', close: ')+' },
-  '*': { open: '(?:', close: ')*' },
-  '@': { open: '(?:', close: ')' }
-}
-
-// any single thing other than /
-// don't need to escape / when using new RegExp()
-var qmark = '[^/]'
-
-// * => any number of characters
-var star = qmark + '*?'
-
-// ** when dots are allowed.  Anything goes, except .. and .
-// not (^ or / followed by one or two dots followed by $ or /),
-// followed by anything, any number of times.
-var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
-
-// not a ^ or / followed by a dot,
-// followed by anything, any number of times.
-var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
-
-// characters that need to be escaped in RegExp.
-var reSpecials = charSet('().*{}+?[]^$\\!')
-
-// "abc" -> { a:true, b:true, c:true }
-function charSet (s) {
-  return s.split('').reduce(function (set, c) {
-    set[c] = true
-    return set
-  }, {})
-}
-
-// normalizes slashes.
-var slashSplit = /\/+/
-
-minimatch.filter = filter
-function filter (pattern, options) {
-  options = options || {}
-  return function (p, i, list) {
-    return minimatch(p, pattern, options)
-  }
-}
-
-function ext (a, b) {
-  a = a || {}
-  b = b || {}
-  var t = {}
-  Object.keys(b).forEach(function (k) {
-    t[k] = b[k]
-  })
-  Object.keys(a).forEach(function (k) {
-    t[k] = a[k]
-  })
-  return t
-}
-
-minimatch.defaults = function (def) {
-  if (!def || !Object.keys(def).length) return minimatch
-
-  var orig = minimatch
-
-  var m = function minimatch (p, pattern, options) {
-    return orig.minimatch(p, pattern, ext(def, options))
-  }
-
-  m.Minimatch = function Minimatch (pattern, options) {
-    return new orig.Minimatch(pattern, ext(def, options))
-  }
-
-  return m
-}
-
-Minimatch.defaults = function (def) {
-  if (!def || !Object.keys(def).length) return Minimatch
-  return minimatch.defaults(def).Minimatch
-}
-
-function minimatch (p, pattern, options) {
-  if (typeof pattern !== 'string') {
-    throw new TypeError('glob pattern string required')
-  }
-
-  if (!options) options = {}
-
-  // shortcut: comments match nothing.
-  if (!options.nocomment && pattern.charAt(0) === '#') {
-    return false
-  }
-
-  // "" only matches ""
-  if (pattern.trim() === '') return p === ''
-
-  return new Minimatch(pattern, options).match(p)
-}
-
-function Minimatch (pattern, options) {
-  if (!(this instanceof Minimatch)) {
-    return new Minimatch(pattern, options)
-  }
-
-  if (typeof pattern !== 'string') {
-    throw new TypeError('glob pattern string required')
-  }
-
-  if (!options) options = {}
-  pattern = pattern.trim()
-
-  // windows support: need to use /, not \
-  if (path.sep !== '/') {
-    pattern = pattern.split(path.sep).join('/')
-  }
-
-  this.options = options
-  this.set = []
-  this.pattern = pattern
-  this.regexp = null
-  this.negate = false
-  this.comment = false
-  this.empty = false
-
-  // make the set of regexps etc.
-  this.make()
-}
-
-Minimatch.prototype.debug = function () {}
-
-Minimatch.prototype.make = make
-function make () {
-  // don't do it more than once.
-  if (this._made) return
-
-  var pattern = this.pattern
-  var options = this.options
-
-  // empty patterns and comments match nothing.
-  if (!options.nocomment && pattern.charAt(0) === '#') {
-    this.comment = true
-    return
-  }
-  if (!pattern) {
-    this.empty = true
-    return
-  }
-
-  // step 1: figure out negation, etc.
-  this.parseNegate()
-
-  // step 2: expand braces
-  var set = this.globSet = this.braceExpand()
-
-  if (options.debug) this.debug = console.error
-
-  this.debug(this.pattern, set)
-
-  // step 3: now we have a set, so turn each one into a series of path-portion
-  // matching patterns.
-  // These will be regexps, except in the case of "**", which is
-  // set to the GLOBSTAR object for globstar behavior,
-  // and will not contain any / characters
-  set = this.globParts = set.map(function (s) {
-    return s.split(slashSplit)
-  })
-
-  this.debug(this.pattern, set)
-
-  // glob --> regexps
-  set = set.map(function (s, si, set) {
-    return s.map(this.parse, this)
-  }, this)
-
-  this.debug(this.pattern, set)
-
-  // filter out everything that didn't compile properly.
-  set = set.filter(function (s) {
-    return s.indexOf(false) === -1
-  })
-
-  this.debug(this.pattern, set)
-
-  this.set = set
-}
-
-Minimatch.prototype.parseNegate = parseNegate
-function parseNegate () {
-  var pattern = this.pattern
-  var negate = false
-  var options = this.options
-  var negateOffset = 0
-
-  if (options.nonegate) return
-
-  for (var i = 0, l = pattern.length
-    ; i < l && pattern.charAt(i) === '!'
-    ; i++) {
-    negate = !negate
-    negateOffset++
-  }
-
-  if (negateOffset) this.pattern = pattern.substr(negateOffset)
-  this.negate = negate
-}
-
-// Brace expansion:
-// a{b,c}d -> abd acd
-// a{b,}c -> abc ac
-// a{0..3}d -> a0d a1d a2d a3d
-// a{b,c{d,e}f}g -> abg acdfg acefg
-// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
-//
-// Invalid sets are not expanded.
-// a{2..}b -> a{2..}b
-// a{b}c -> a{b}c
-minimatch.braceExpand = function (pattern, options) {
-  return braceExpand(pattern, options)
-}
-
-Minimatch.prototype.braceExpand = braceExpand
-
-function braceExpand (pattern, options) {
-  if (!options) {
-    if (this instanceof Minimatch) {
-      options = this.options
-    } else {
-      options = {}
-    }
-  }
-
-  pattern = typeof pattern === 'undefined'
-    ? this.pattern : pattern
-
-  if (typeof pattern === 'undefined') {
-    throw new TypeError('undefined pattern')
-  }
-
-  if (options.nobrace ||
-    !pattern.match(/\{.*\}/)) {
-    // shortcut. no need to expand.
-    return [pattern]
-  }
-
-  return expand(pattern)
-}
-
-// parse a component of the expanded set.
-// At this point, no pattern may contain "/" in it
-// so we're going to return a 2d array, where each entry is the full
-// pattern, split on '/', and then turned into a regular expression.
-// A regexp is made at the end which joins each array with an
-// escaped /, and another full one which joins each regexp with |.
-//
-// Following the lead of Bash 4.1, note that "**" only has special meaning
-// when it is the *only* thing in a path portion.  Otherwise, any series
-// of * is equivalent to a single *.  Globstar behavior is enabled by
-// default, and can be disabled by setting options.noglobstar.
-Minimatch.prototype.parse = parse
-var SUBPARSE = {}
-function parse (pattern, isSub) {
-  if (pattern.length > 1024 * 64) {
-    throw new TypeError('pattern is too long')
-  }
-
-  var options = this.options
-
-  // shortcuts
-  if (!options.noglobstar && pattern === '**') return GLOBSTAR
-  if (pattern === '') return ''
-
-  var re = ''
-  var hasMagic = !!options.nocase
-  var escaping = false
-  // ? => one single character
-  var patternListStack = []
-  var negativeLists = []
-  var stateChar
-  var inClass = false
-  var reClassStart = -1
-  var classStart = -1
-  // . and .. never match anything that doesn't start with .,
-  // even when options.dot is set.
-  var patternStart = pattern.charAt(0) === '.' ? '' // anything
-  // not (start or / followed by . or .. followed by / or end)
-  : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
-  : '(?!\\.)'
-  var self = this
-
-  function clearStateChar () {
-    if (stateChar) {
-      // we had some state-tracking character
-      // that wasn't consumed by this pass.
-      switch (stateChar) {
-        case '*':
-          re += star
-          hasMagic = true
-        break
-        case '?':
-          re += qmark
-          hasMagic = true
-        break
-        default:
-          re += '\\' + stateChar
-        break
-      }
-      self.debug('clearStateChar %j %j', stateChar, re)
-      stateChar = false
-    }
-  }
-
-  for (var i = 0, len = pattern.length, c
-    ; (i < len) && (c = pattern.charAt(i))
-    ; i++) {
-    this.debug('%s\t%s %s %j', pattern, i, re, c)
-
-    // skip over any that are escaped.
-    if (escaping && reSpecials[c]) {
-      re += '\\' + c
-      escaping = false
-      continue
-    }
-
-    switch (c) {
-      case '/':
-        // completely not allowed, even escaped.
-        // Should already be path-split by now.
-        return false
-
-      case '\\':
-        clearStateChar()
-        escaping = true
-      continue
-
-      // the various stateChar values
-      // for the "extglob" stuff.
-      case '?':
-      case '*':
-      case '+':
-      case '@':
-      case '!':
-        this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
-
-        // all of those are literals inside a class, except that
-        // the glob [!a] means [^a] in regexp
-        if (inClass) {
-          this.debug('  in class')
-          if (c === '!' && i === classStart + 1) c = '^'
-          re += c
-          continue
-        }
-
-        // if we already have a stateChar, then it means
-        // that there was something like ** or +? in there.
-        // Handle the stateChar, then proceed with this one.
-        self.debug('call clearStateChar %j', stateChar)
-        clearStateChar()
-        stateChar = c
-        // if extglob is disabled, then +(asdf|foo) isn't a thing.
-        // just clear the statechar *now*, rather than even diving into
-        // the patternList stuff.
-        if (options.noext) clearStateChar()
-      continue
-
-      case '(':
-        if (inClass) {
-          re += '('
-          continue
-        }
-
-        if (!stateChar) {
-          re += '\\('
-          continue
-        }
-
-        patternListStack.push({
-          type: stateChar,
-          start: i - 1,
-          reStart: re.length,
-          open: plTypes[stateChar].open,
-          close: plTypes[stateChar].close
-        })
-        // negation is (?:(?!js)[^/]*)
-        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
-        this.debug('plType %j %j', stateChar, re)
-        stateChar = false
-      continue
-
-      case ')':
-        if (inClass || !patternListStack.length) {
-          re += '\\)'
-          continue
-        }
-
-        clearStateChar()
-        hasMagic = true
-        var pl = patternListStack.pop()
-        // negation is (?:(?!js)[^/]*)
-        // The others are (?:<pattern>)<type>
-        re += pl.close
-        if (pl.type === '!') {
-          negativeLists.push(pl)
-        }
-        pl.reEnd = re.length
-      continue
-
-      case '|':
-        if (inClass || !patternListStack.length || escaping) {
-          re += '\\|'
-          escaping = false
-          continue
-        }
-
-        clearStateChar()
-        re += '|'
-      continue
-
-      // these are mostly the same in regexp and glob
-      case '[':
-        // swallow any state-tracking char before the [
-        clearStateChar()
-
-        if (inClass) {
-          re += '\\' + c
-          continue
-        }
-
-        inClass = true
-        classStart = i
-        reClassStart = re.length
-        re += c
-      continue
-
-      case ']':
-        //  a right bracket shall lose its special
-        //  meaning and represent itself in
-        //  a bracket expression if it occurs
-        //  first in the list.  -- POSIX.2 2.8.3.2
-        if (i === classStart + 1 || !inClass) {
-          re += '\\' + c
-          escaping = false
-          continue
-        }
-
-        // handle the case where we left a class open.
-        // "[z-a]" is valid, equivalent to "\[z-a\]"
-        if (inClass) {
-          // split where the last [ was, make sure we don't have
-          // an invalid re. if so, re-walk the contents of the
-          // would-be class to re-translate any characters that
-          // were passed through as-is
-          // TODO: It would probably be faster to determine this
-          // without a try/catch and a new RegExp, but it's tricky
-          // to do safely.  For now, this is safe and works.
-          var cs = pattern.substring(classStart + 1, i)
-          try {
-            RegExp('[' + cs + ']')
-          } catch (er) {
-            // not a valid class!
-            var sp = this.parse(cs, SUBPARSE)
-            re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
-            hasMagic = hasMagic || sp[1]
-            inClass = false
-            continue
-          }
-        }
-
-        // finish up the class.
-        hasMagic = true
-        inClass = false
-        re += c
-      continue
-
-      default:
-        // swallow any state char that wasn't consumed
-        clearStateChar()
-
-        if (escaping) {
-          // no need
-          escaping = false
-        } else if (reSpecials[c]
-          && !(c === '^' && inClass)) {
-          re += '\\'
-        }
-
-        re += c
-
-    } // switch
-  } // for
-
-  // handle the case where we left a class open.
-  // "[abc" is valid, equivalent to "\[abc"
-  if (inClass) {
-    // split where the last [ was, and escape it
-    // this is a huge pita.  We now have to re-walk
-    // the contents of the would-be class to re-translate
-    // any characters that were passed through as-is
-    cs = pattern.substr(classStart + 1)
-    sp = this.parse(cs, SUBPARSE)
-    re = re.substr(0, reClassStart) + '\\[' + sp[0]
-    hasMagic = hasMagic || sp[1]
-  }
-
-  // handle the case where we had a +( thing at the *end*
-  // of the pattern.
-  // each pattern list stack adds 3 chars, and we need to go through
-  // and escape any | chars that were passed through as-is for the regexp.
-  // Go through and escape them, taking care not to double-escape any
-  // | chars that were already escaped.
-  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
-    var tail = re.slice(pl.reStart + pl.open.length)
-    this.debug('setting tail', re, pl)
-    // maybe some even number of \, then maybe 1 \, followed by a |
-    tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
-      if (!$2) {
-        // the | isn't already escaped, so escape it.
-        $2 = '\\'
-      }
-
-      // need to escape all those slashes *again*, without escaping the
-      // one that we need for escaping the | character.  As it works out,
-      // escaping an even number of slashes can be done by simply repeating
-      // it exactly after itself.  That's why this trick works.
-      //
-      // I am sorry that you have to see this.
-      return $1 + $1 + $2 + '|'
-    })
-
-    this.debug('tail=%j\n   %s', tail, tail, pl, re)
-    var t = pl.type === '*' ? star
-      : pl.type === '?' ? qmark
-      : '\\' + pl.type
-
-    hasMagic = true
-    re = re.slice(0, pl.reStart) + t + '\\(' + tail
-  }
-
-  // handle trailing things that only matter at the very end.
-  clearStateChar()
-  if (escaping) {
-    // trailing \\
-    re += '\\\\'
-  }
-
-  // only need to apply the nodot start if the re starts with
-  // something that could conceivably capture a dot
-  var addPatternStart = false
-  switch (re.charAt(0)) {
-    case '.':
-    case '[':
-    case '(': addPatternStart = true
-  }
-
-  // Hack to work around lack of negative lookbehind in JS
-  // A pattern like: *.!(x).!(y|z) needs to ensure that a name
-  // like 'a.xyz.yz' doesn't match.  So, the first negative
-  // lookahead, has to look ALL the way ahead, to the end of
-  // the pattern.
-  for (var n = negativeLists.length - 1; n > -1; n--) {
-    var nl = negativeLists[n]
-
-    var nlBefore = re.slice(0, nl.reStart)
-    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
-    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
-    var nlAfter = re.slice(nl.reEnd)
-
-    nlLast += nlAfter
-
-    // Handle nested stuff like *(*.js|!(*.json)), where open parens
-    // mean that we should *not* include the ) in the bit that is considered
-    // "after" the negated section.
-    var openParensBefore = nlBefore.split('(').length - 1
-    var cleanAfter = nlAfter
-    for (i = 0; i < openParensBefore; i++) {
-      cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
-    }
-    nlAfter = cleanAfter
-
-    var dollar = ''
-    if (nlAfter === '' && isSub !== SUBPARSE) {
-      dollar = '$'
-    }
-    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
-    re = newRe
-  }
-
-  // if the re is not "" at this point, then we need to make sure
-  // it doesn't match against an empty path part.
-  // Otherwise a/* will match a/, which it should not.
-  if (re !== '' && hasMagic) {
-    re = '(?=.)' + re
-  }
-
-  if (addPatternStart) {
-    re = patternStart + re
-  }
-
-  // parsing just a piece of a larger pattern.
-  if (isSub === SUBPARSE) {
-    return [re, hasMagic]
-  }
-
-  // skip the regexp for non-magical patterns
-  // unescape anything in it, though, so that it'll be
-  // an exact match against a file etc.
-  if (!hasMagic) {
-    return globUnescape(pattern)
-  }
-
-  var flags = options.nocase ? 'i' : ''
-  try {
-    var regExp = new RegExp('^' + re + '$', flags)
-  } catch (er) {
-    // If it was an invalid regular expression, then it can't match
-    // anything.  This trick looks for a character after the end of
-    // the string, which is of course impossible, except in multi-line
-    // mode, but it's not a /m regex.
-    return new RegExp('$.')
-  }
-
-  regExp._glob = pattern
-  regExp._src = re
-
-  return regExp
-}
-
-minimatch.makeRe = function (pattern, options) {
-  return new Minimatch(pattern, options || {}).makeRe()
-}
-
-Minimatch.prototype.makeRe = makeRe
-function makeRe () {
-  if (this.regexp || this.regexp === false) return this.regexp
-
-  // at this point, this.set is a 2d array of partial
-  // pattern strings, or "**".
-  //
-  // It's better to use .match().  This function shouldn't
-  // be used, really, but it's pretty convenient sometimes,
-  // when you just want to work with a regex.
-  var set = this.set
-
-  if (!set.length) {
-    this.regexp = false
-    return this.regexp
-  }
-  var options = this.options
-
-  var twoStar = options.noglobstar ? star
-    : options.dot ? twoStarDot
-    : twoStarNoDot
-  var flags = options.nocase ? 'i' : ''
-
-  var re = set.map(function (pattern) {
-    return pattern.map(function (p) {
-      return (p === GLOBSTAR) ? twoStar
-      : (typeof p === 'string') ? regExpEscape(p)
-      : p._src
-    }).join('\\\/')
-  }).join('|')
-
-  // must match entire pattern
-  // ending in a * or ** will make it less strict.
-  re = '^(?:' + re + ')$'
-
-  // can match anything, as long as it's not this.
-  if (this.negate) re = '^(?!' + re + ').*$'
-
-  try {
-    this.regexp = new RegExp(re, flags)
-  } catch (ex) {
-    this.regexp = false
-  }
-  return this.regexp
-}
-
-minimatch.match = function (list, pattern, options) {
-  options = options || {}
-  var mm = new Minimatch(pattern, options)
-  list = list.filter(function (f) {
-    return mm.match(f)
-  })
-  if (mm.options.nonull && !list.length) {
-    list.push(pattern)
-  }
-  return list
-}
-
-Minimatch.prototype.match = match
-function match (f, partial) {
-  this.debug('match', f, this.pattern)
-  // short-circuit in the case of busted things.
-  // comments, etc.
-  if (this.comment) return false
-  if (this.empty) return f === ''
-
-  if (f === '/' && partial) return true
-
-  var options = this.options
-
-  // windows: need to use /, not \
-  if (path.sep !== '/') {
-    f = f.split(path.sep).join('/')
-  }
-
-  // treat the test path as a set of pathparts.
-  f = f.split(slashSplit)
-  this.debug(this.pattern, 'split', f)
-
-  // just ONE of the pattern sets in this.set needs to match
-  // in order for it to be valid.  If negating, then just one
-  // match means that we have failed.
-  // Either way, return on the first hit.
-
-  var set = this.set
-  this.debug(this.pattern, 'set', set)
-
-  // Find the basename of the path by looking for the last non-empty segment
-  var filename
-  var i
-  for (i = f.length - 1; i >= 0; i--) {
-    filename = f[i]
-    if (filename) break
-  }
-
-  for (i = 0; i < set.length; i++) {
-    var pattern = set[i]
-    var file = f
-    if (options.matchBase && pattern.length === 1) {
-      file = [filename]
-    }
-    var hit = this.matchOne(file, pattern, partial)
-    if (hit) {
-      if (options.flipNegate) return true
-      return !this.negate
-    }
-  }
-
-  // didn't get any hits.  this is success if it's a negative
-  // pattern, failure otherwise.
-  if (options.flipNegate) return false
-  return this.negate
-}
-
-// set partial to true to test if, for example,
-// "/a/b" matches the start of "/*/b/*/d"
-// Partial means, if you run out of file before you run
-// out of pattern, then that's fine, as long as all
-// the parts match.
-Minimatch.prototype.matchOne = function (file, pattern, partial) {
-  var options = this.options
-
-  this.debug('matchOne',
-    { 'this': this, file: file, pattern: pattern })
-
-  this.debug('matchOne', file.length, pattern.length)
-
-  for (var fi = 0,
-      pi = 0,
-      fl = file.length,
-      pl = pattern.length
-      ; (fi < fl) && (pi < pl)
-      ; fi++, pi++) {
-    this.debug('matchOne loop')
-    var p = pattern[pi]
-    var f = file[fi]
-
-    this.debug(pattern, p, f)
-
-    // should be impossible.
-    // some invalid regexp stuff in the set.
-    if (p === false) return false
-
-    if (p === GLOBSTAR) {
-      this.debug('GLOBSTAR', [pattern, p, f])
-
-      // "**"
-      // a/**/b/**/c would match the following:
-      // a/b/x/y/z/c
-      // a/x/y/z/b/c
-      // a/b/x/b/x/c
-      // a/b/c
-      // To do this, take the rest of the pattern after
-      // the **, and see if it would match the file remainder.
-      // If so, return success.
-      // If not, the ** "swallows" a segment, and try again.
-      // This is recursively awful.
-      //
-      // a/**/b/**/c matching a/b/x/y/z/c
-      // - a matches a
-      // - doublestar
-      //   - matchOne(b/x/y/z/c, b/**/c)
-      //     - b matches b
-      //     - doublestar
-      //       - matchOne(x/y/z/c, c) -> no
-      //       - matchOne(y/z/c, c) -> no
-      //       - matchOne(z/c, c) -> no
-      //       - matchOne(c, c) yes, hit
-      var fr = fi
-      var pr = pi + 1
-      if (pr === pl) {
-        this.debug('** at the end')
-        // a ** at the end will just swallow the rest.
-        // We have found a match.
-        // however, it will not swallow /.x, unless
-        // options.dot is set.
-        // . and .. are *never* matched by **, for explosively
-        // exponential reasons.
-        for (; fi < fl; fi++) {
-          if (file[fi] === '.' || file[fi] === '..' ||
-            (!options.dot && file[fi].charAt(0) === '.')) return false
-        }
-        return true
-      }
-
-      // ok, let's see if we can swallow whatever we can.
-      while (fr < fl) {
-        var swallowee = file[fr]
-
-        this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
-
-        // XXX remove this slice.  Just pass the start index.
-        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
-          this.debug('globstar found match!', fr, fl, swallowee)
-          // found a match.
-          return true
-        } else {
-          // can't swallow "." or ".." ever.
-          // can only swallow ".foo" when explicitly asked.
-          if (swallowee === '.' || swallowee === '..' ||
-            (!options.dot && swallowee.charAt(0) === '.')) {
-            this.debug('dot detected!', file, fr, pattern, pr)
-            break
-          }
-
-          // ** swallows a segment, and continue.
-          this.debug('globstar swallow a segment, and continue')
-          fr++
-        }
-      }
-
-      // no match was found.
-      // However, in partial mode, we can't say this is necessarily over.
-      // If there's more *pattern* left, then
-      if (partial) {
-        // ran out of file
-        this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
-        if (fr === fl) return true
-      }
-      return false
-    }
-
-    // something other than **
-    // non-magic patterns just have to match exactly
-    // patterns with magic have been turned into regexps.
-    var hit
-    if (typeof p === 'string') {
-      if (options.nocase) {
-        hit = f.toLowerCase() === p.toLowerCase()
-      } else {
-        hit = f === p
-      }
-      this.debug('string match', p, f, hit)
-    } else {
-      hit = f.match(p)
-      this.debug('pattern match', p, f, hit)
-    }
-
-    if (!hit) return false
-  }
-
-  // Note: ending in / means that we'll get a final ""
-  // at the end of the pattern.  This can only match a
-  // corresponding "" at the end of the file.
-  // If the file ends in /, then it can only match a
-  // a pattern that ends in /, unless the pattern just
-  // doesn't have any more for it. But, a/b/ should *not*
-  // match "a/b/*", even though "" matches against the
-  // [^/]*? pattern, except in partial mode, where it might
-  // simply not be reached yet.
-  // However, a/b/ should still satisfy a/*
-
-  // now either we fell off the end of the pattern, or we're done.
-  if (fi === fl && pi === pl) {
-    // ran out of pattern and filename at the same time.
-    // an exact hit!
-    return true
-  } else if (fi === fl) {
-    // ran out of file, but still had pattern left.
-    // this is ok if we're doing the match as part of
-    // a glob fs traversal.
-    return partial
-  } else if (pi === pl) {
-    // ran out of pattern, still have file left.
-    // this is only acceptable if we're on the very last
-    // empty segment of a file with a trailing slash.
-    // a/* should match a/b/
-    var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')
-    return emptyFileEnd
-  }
-
-  // should be unreachable.
-  throw new Error('wtf?')
-}
-
-// replace stuff like \* with *
-function globUnescape (s) {
-  return s.replace(/\\(.)/g, '$1')
-}
-
-function regExpEscape (s) {
-  return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
-}
diff --git a/node_modules/minimatch/package.json b/node_modules/minimatch/package.json
deleted file mode 100644
index bb3985c..0000000
--- a/node_modules/minimatch/package.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
-  "_args": [
-    [
-      "minimatch@3.0.3",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "minimatch@3.0.3",
-  "_id": "minimatch@3.0.3",
-  "_inBundle": false,
-  "_integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=",
-  "_location": "/minimatch",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "minimatch@3.0.3",
-    "name": "minimatch",
-    "escapedName": "minimatch",
-    "rawSpec": "3.0.3",
-    "saveSpec": null,
-    "fetchSpec": "3.0.3"
-  },
-  "_requiredBy": [
-    "/cordova-common",
-    "/eslint",
-    "/eslint-plugin-import",
-    "/glob"
-  ],
-  "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
-  "_spec": "3.0.3",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Isaac Z. Schlueter",
-    "email": "i@izs.me",
-    "url": "http://blog.izs.me"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/minimatch/issues"
-  },
-  "dependencies": {
-    "brace-expansion": "^1.0.0"
-  },
-  "description": "a glob matcher in javascript",
-  "devDependencies": {
-    "standard": "^3.7.2",
-    "tap": "^5.6.0"
-  },
-  "engines": {
-    "node": "*"
-  },
-  "files": [
-    "minimatch.js"
-  ],
-  "homepage": "https://github.com/isaacs/minimatch#readme",
-  "license": "ISC",
-  "main": "minimatch.js",
-  "name": "minimatch",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/minimatch.git"
-  },
-  "scripts": {
-    "posttest": "standard minimatch.js test/*.js",
-    "test": "tap test/*.js"
-  },
-  "version": "3.0.3"
-}
diff --git a/node_modules/node-uuid/.npmignore b/node_modules/node-uuid/.npmignore
deleted file mode 100644
index 8886139..0000000
--- a/node_modules/node-uuid/.npmignore
+++ /dev/null
@@ -1,4 +0,0 @@
-node_modules
-.DS_Store
-.nyc_output
-coverage
diff --git a/node_modules/node-uuid/LICENSE.md b/node_modules/node-uuid/LICENSE.md
deleted file mode 100644
index 652609b..0000000
--- a/node_modules/node-uuid/LICENSE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c)  2010-2012 Robert Kieffer 
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/node_modules/node-uuid/README.md b/node_modules/node-uuid/README.md
deleted file mode 100644
index 3dc67d3..0000000
--- a/node_modules/node-uuid/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# node-uuid
-
-DEPRECATED: Use the `uuid` package instead.  See
-
-* On NPM: https://www.npmjs.com/package/uuid
-* On Github: https://github.com/kelektiv/node-uuid
-
-(Yes, the github project is still called "node-uuid". We merged the two projects. Sorry for the confusion.)
diff --git a/node_modules/node-uuid/benchmark/README.md b/node_modules/node-uuid/benchmark/README.md
deleted file mode 100644
index aaeb2ea..0000000
--- a/node_modules/node-uuid/benchmark/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# node-uuid Benchmarks
-
-### Results
-
-To see the results of our benchmarks visit https://github.com/broofa/node-uuid/wiki/Benchmark
-
-### Run them yourself
-
-node-uuid comes with some benchmarks to measure performance of generating UUIDs. These can be run using node.js. node-uuid is being benchmarked against some other uuid modules, that are available through npm namely `uuid` and `uuid-js`.
-
-To prepare and run the benchmark issue;
-
-```
-npm install uuid uuid-js
-node benchmark/benchmark.js
-```
-
-You'll see an output like this one:
-
-```
-# v4
-nodeuuid.v4(): 854700 uuids/second
-nodeuuid.v4('binary'): 788643 uuids/second
-nodeuuid.v4('binary', buffer): 1336898 uuids/second
-uuid(): 479386 uuids/second
-uuid('binary'): 582072 uuids/second
-uuidjs.create(4): 312304 uuids/second
-
-# v1
-nodeuuid.v1(): 938086 uuids/second
-nodeuuid.v1('binary'): 683060 uuids/second
-nodeuuid.v1('binary', buffer): 1644736 uuids/second
-uuidjs.create(1): 190621 uuids/second
-```
-
-* The `uuid()` entries are for Nikhil Marathe's [uuid module](https://bitbucket.org/nikhilm/uuidjs) which is a wrapper around the native libuuid library.
-* The `uuidjs()` entries are for Patrick Negri's [uuid-js module](https://github.com/pnegri/uuid-js) which is a pure javascript implementation based on [UUID.js](https://github.com/LiosK/UUID.js) by LiosK.
-
-If you want to get more reliable results you can run the benchmark multiple times and write the output into a log file:
-
-```
-for i in {0..9}; do node benchmark/benchmark.js >> benchmark/bench_0.4.12.log; done;
-```
-
-If you're interested in how performance varies between different node versions, you can issue the above command multiple times.
-
-You can then use the shell script `bench.sh` provided in this directory to calculate the averages over all benchmark runs and draw a nice plot:
-
-```
-(cd benchmark/ && ./bench.sh)
-```
-
-This assumes you have [gnuplot](http://www.gnuplot.info/) and [ImageMagick](http://www.imagemagick.org/) installed. You'll find a nice `bench.png` graph in the `benchmark/` directory then.
diff --git a/node_modules/node-uuid/benchmark/bench.gnu b/node_modules/node-uuid/benchmark/bench.gnu
deleted file mode 100644
index a342fbb..0000000
--- a/node_modules/node-uuid/benchmark/bench.gnu
+++ /dev/null
@@ -1,174 +0,0 @@
-#!/opt/local/bin/gnuplot -persist
-#
-#    
-#    	G N U P L O T
-#    	Version 4.4 patchlevel 3
-#    	last modified March 2011
-#    	System: Darwin 10.8.0
-#    
-#    	Copyright (C) 1986-1993, 1998, 2004, 2007-2010
-#    	Thomas Williams, Colin Kelley and many others
-#    
-#    	gnuplot home:     http://www.gnuplot.info
-#    	faq, bugs, etc:   type "help seeking-assistance"
-#    	immediate help:   type "help"
-#    	plot window:      hit 'h'
-set terminal postscript eps noenhanced defaultplex \
- leveldefault color colortext \
- solid linewidth 1.2 butt noclip \
- palfuncparam 2000,0.003 \
- "Helvetica" 14 
-set output 'bench.eps'
-unset clip points
-set clip one
-unset clip two
-set bar 1.000000 front
-set border 31 front linetype -1 linewidth 1.000
-set xdata
-set ydata
-set zdata
-set x2data
-set y2data
-set timefmt x "%d/%m/%y,%H:%M"
-set timefmt y "%d/%m/%y,%H:%M"
-set timefmt z "%d/%m/%y,%H:%M"
-set timefmt x2 "%d/%m/%y,%H:%M"
-set timefmt y2 "%d/%m/%y,%H:%M"
-set timefmt cb "%d/%m/%y,%H:%M"
-set boxwidth
-set style fill  empty border
-set style rectangle back fc lt -3 fillstyle   solid 1.00 border lt -1
-set style circle radius graph 0.02, first 0, 0 
-set dummy x,y
-set format x "% g"
-set format y "% g"
-set format x2 "% g"
-set format y2 "% g"
-set format z "% g"
-set format cb "% g"
-set angles radians
-unset grid
-set key title ""
-set key outside left top horizontal Right noreverse enhanced autotitles columnhead nobox
-set key noinvert samplen 4 spacing 1 width 0 height 0 
-set key maxcolumns 2 maxrows 0
-unset label
-unset arrow
-set style increment default
-unset style line
-set style line 1  linetype 1 linewidth 2.000 pointtype 1 pointsize default pointinterval 0
-unset style arrow
-set style histogram clustered gap 2 title  offset character 0, 0, 0
-unset logscale
-set offsets graph 0.05, 0.15, 0, 0
-set pointsize 1.5
-set pointintervalbox 1
-set encoding default
-unset polar
-unset parametric
-unset decimalsign
-set view 60, 30, 1, 1
-set samples 100, 100
-set isosamples 10, 10
-set surface
-unset contour
-set clabel '%8.3g'
-set mapping cartesian
-set datafile separator whitespace
-unset hidden3d
-set cntrparam order 4
-set cntrparam linear
-set cntrparam levels auto 5
-set cntrparam points 5
-set size ratio 0 1,1
-set origin 0,0
-set style data points
-set style function lines
-set xzeroaxis linetype -2 linewidth 1.000
-set yzeroaxis linetype -2 linewidth 1.000
-set zzeroaxis linetype -2 linewidth 1.000
-set x2zeroaxis linetype -2 linewidth 1.000
-set y2zeroaxis linetype -2 linewidth 1.000
-set ticslevel 0.5
-set mxtics default
-set mytics default
-set mztics default
-set mx2tics default
-set my2tics default
-set mcbtics default
-set xtics border in scale 1,0.5 mirror norotate  offset character 0, 0, 0
-set xtics  norangelimit
-set xtics   ()
-set ytics border in scale 1,0.5 mirror norotate  offset character 0, 0, 0
-set ytics autofreq  norangelimit
-set ztics border in scale 1,0.5 nomirror norotate  offset character 0, 0, 0
-set ztics autofreq  norangelimit
-set nox2tics
-set noy2tics
-set cbtics border in scale 1,0.5 mirror norotate  offset character 0, 0, 0
-set cbtics autofreq  norangelimit
-set title "" 
-set title  offset character 0, 0, 0 font "" norotate
-set timestamp bottom 
-set timestamp "" 
-set timestamp  offset character 0, 0, 0 font "" norotate
-set rrange [ * : * ] noreverse nowriteback  # (currently [8.98847e+307:-8.98847e+307] )
-set autoscale rfixmin
-set autoscale rfixmax
-set trange [ * : * ] noreverse nowriteback  # (currently [-5.00000:5.00000] )
-set autoscale tfixmin
-set autoscale tfixmax
-set urange [ * : * ] noreverse nowriteback  # (currently [-10.0000:10.0000] )
-set autoscale ufixmin
-set autoscale ufixmax
-set vrange [ * : * ] noreverse nowriteback  # (currently [-10.0000:10.0000] )
-set autoscale vfixmin
-set autoscale vfixmax
-set xlabel "" 
-set xlabel  offset character 0, 0, 0 font "" textcolor lt -1 norotate
-set x2label "" 
-set x2label  offset character 0, 0, 0 font "" textcolor lt -1 norotate
-set xrange [ * : * ] noreverse nowriteback  # (currently [-0.150000:3.15000] )
-set autoscale xfixmin
-set autoscale xfixmax
-set x2range [ * : * ] noreverse nowriteback  # (currently [0.00000:3.00000] )
-set autoscale x2fixmin
-set autoscale x2fixmax
-set ylabel "" 
-set ylabel  offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270
-set y2label "" 
-set y2label  offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270
-set yrange [ 0.00000 : 1.90000e+06 ] noreverse nowriteback  # (currently [:] )
-set autoscale yfixmin
-set autoscale yfixmax
-set y2range [ * : * ] noreverse nowriteback  # (currently [0.00000:1.90000e+06] )
-set autoscale y2fixmin
-set autoscale y2fixmax
-set zlabel "" 
-set zlabel  offset character 0, 0, 0 font "" textcolor lt -1 norotate
-set zrange [ * : * ] noreverse nowriteback  # (currently [-10.0000:10.0000] )
-set autoscale zfixmin
-set autoscale zfixmax
-set cblabel "" 
-set cblabel  offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270
-set cbrange [ * : * ] noreverse nowriteback  # (currently [8.98847e+307:-8.98847e+307] )
-set autoscale cbfixmin
-set autoscale cbfixmax
-set zero 1e-08
-set lmargin  -1
-set bmargin  -1
-set rmargin  -1
-set tmargin  -1
-set pm3d explicit at s
-set pm3d scansautomatic
-set pm3d interpolate 1,1 flush begin noftriangles nohidden3d corners2color mean
-set palette positive nops_allcF maxcolors 0 gamma 1.5 color model RGB 
-set palette rgbformulae 7, 5, 15
-set colorbox default
-set colorbox vertical origin screen 0.9, 0.2, 0 size screen 0.05, 0.6, 0 front bdefault
-set loadpath 
-set fontpath 
-set fit noerrorvariables
-GNUTERM = "aqua"
-plot 'bench_results.txt' using 2:xticlabel(1) w lp lw 2, '' using 3:xticlabel(1) w lp lw 2, '' using 4:xticlabel(1) w lp lw 2, '' using 5:xticlabel(1) w lp lw 2, '' using 6:xticlabel(1) w lp lw 2, '' using 7:xticlabel(1) w lp lw 2, '' using 8:xticlabel(1) w lp lw 2, '' using 9:xticlabel(1) w lp lw 2
-#    EOF
diff --git a/node_modules/node-uuid/benchmark/bench.sh b/node_modules/node-uuid/benchmark/bench.sh
deleted file mode 100755
index d870a0c..0000000
--- a/node_modules/node-uuid/benchmark/bench.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/bash
-
-# for a given node version run:
-# for i in {0..9}; do node benchmark.js >> bench_0.6.2.log; done;
-
-PATTERNS=('nodeuuid.v1()' "nodeuuid.v1('binary'," 'nodeuuid.v4()' "nodeuuid.v4('binary'," "uuid()" "uuid('binary')" 'uuidjs.create(1)' 'uuidjs.create(4)' '140byte')
-FILES=(node_uuid_v1_string node_uuid_v1_buf node_uuid_v4_string node_uuid_v4_buf libuuid_v4_string libuuid_v4_binary uuidjs_v1_string uuidjs_v4_string 140byte_es)
-INDICES=(2 3 2 3 2 2 2 2 2)
-VERSIONS=$( ls bench_*.log | sed -e 's/^bench_\([0-9\.]*\)\.log/\1/' | tr "\\n" " " )
-TMPJOIN="tmp_join"
-OUTPUT="bench_results.txt"
-
-for I in ${!FILES[*]}; do
-  F=${FILES[$I]}
-  P=${PATTERNS[$I]}
-  INDEX=${INDICES[$I]}
-  echo "version $F" > $F
-  for V in $VERSIONS; do
-    (VAL=$( grep "$P" bench_$V.log | LC_ALL=en_US awk '{ sum += $'$INDEX' } END { print sum/NR }' ); echo $V $VAL) >> $F
-  done
-  if [ $I == 0 ]; then
-    cat $F > $TMPJOIN
-  else
-    join $TMPJOIN $F > $OUTPUT
-    cp $OUTPUT $TMPJOIN
-  fi
-  rm $F
-done
-
-rm $TMPJOIN
-
-gnuplot bench.gnu
-convert -density 200 -resize 800x560 -flatten bench.eps bench.png
-rm bench.eps
diff --git a/node_modules/node-uuid/benchmark/benchmark-native.c b/node_modules/node-uuid/benchmark/benchmark-native.c
deleted file mode 100644
index dbfc75f..0000000
--- a/node_modules/node-uuid/benchmark/benchmark-native.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-Test performance of native C UUID generation
-
-To Compile: cc -luuid benchmark-native.c -o benchmark-native
-*/
-
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/time.h>
-#include <uuid/uuid.h>
-
-int main() {
-  uuid_t myid;
-  char buf[36+1];
-  int i;
-  struct timeval t;
-  double start, finish;
-
-  gettimeofday(&t, NULL);
-  start = t.tv_sec + t.tv_usec/1e6;
-
-  int n = 2e5;
-  for (i = 0; i < n; i++) {
-    uuid_generate(myid);
-    uuid_unparse(myid, buf);
-  }
-
-  gettimeofday(&t, NULL);
-  finish = t.tv_sec + t.tv_usec/1e6;
-  double dur = finish - start;
-
-  printf("%d uuids/sec", (int)(n/dur));
-  return 0;
-}
diff --git a/node_modules/node-uuid/benchmark/benchmark.js b/node_modules/node-uuid/benchmark/benchmark.js
deleted file mode 100644
index 40e6efb..0000000
--- a/node_modules/node-uuid/benchmark/benchmark.js
+++ /dev/null
@@ -1,84 +0,0 @@
-try {
-  var nodeuuid = require('../uuid');
-} catch (e) {
-  console.error('node-uuid require failed - skipping tests');
-}
-
-try {
-  var uuid = require('uuid');
-} catch (e) {
-  console.error('uuid require failed - skipping tests');
-}
-
-try {
-  var uuidjs = require('uuid-js');
-} catch (e) {
-  console.error('uuid-js require failed - skipping tests');
-}
-
-var N = 5e5;
-
-function rate(msg, t) {
-  console.log(msg + ': ' +
-    (N / (Date.now() - t) * 1e3 | 0) +
-    ' uuids/second');
-}
-
-console.log('# v4');
-
-// node-uuid - string form
-if (nodeuuid) {
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4();
-  rate('nodeuuid.v4() - using node.js crypto RNG', t);
-
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4({rng: nodeuuid.mathRNG});
-  rate('nodeuuid.v4() - using Math.random() RNG', t);
-
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4('binary');
-  rate('nodeuuid.v4(\'binary\')', t);
-
-  var buffer = new nodeuuid.BufferClass(16);
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4('binary', buffer);
-  rate('nodeuuid.v4(\'binary\', buffer)', t);
-}
-
-// libuuid - string form
-if (uuid) {
-  for (var i = 0, t = Date.now(); i < N; i++) uuid();
-  rate('uuid()', t);
-
-  for (var i = 0, t = Date.now(); i < N; i++) uuid('binary');
-  rate('uuid(\'binary\')', t);
-}
-
-// uuid-js - string form
-if (uuidjs) {
-  for (var i = 0, t = Date.now(); i < N; i++) uuidjs.create(4);
-  rate('uuidjs.create(4)', t);
-}
-
-// 140byte.es
-for (var i = 0, t = Date.now(); i < N; i++) 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(s,r){r=Math.random()*16|0;return (s=='x'?r:r&0x3|0x8).toString(16)});
-rate('140byte.es_v4', t);
-
-console.log('');
-console.log('# v1');
-
-// node-uuid - v1 string form
-if (nodeuuid) {
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1();
-  rate('nodeuuid.v1()', t);
-
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1('binary');
-  rate('nodeuuid.v1(\'binary\')', t);
-
-  var buffer = new nodeuuid.BufferClass(16);
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1('binary', buffer);
-  rate('nodeuuid.v1(\'binary\', buffer)', t);
-}
-
-// uuid-js - v1 string form
-if (uuidjs) {
-  for (var i = 0, t = Date.now(); i < N; i++) uuidjs.create(1);
-  rate('uuidjs.create(1)', t);
-}
diff --git a/node_modules/node-uuid/bin/uuid b/node_modules/node-uuid/bin/uuid
deleted file mode 100755
index f732e99..0000000
--- a/node_modules/node-uuid/bin/uuid
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env node
-
-var path = require('path');
-var uuid = require(path.join(__dirname, '..'));
-
-var arg = process.argv[2];
-
-if ('--help' === arg) {
-  console.log('\n  USAGE: uuid [version] [options]\n\n');
-  console.log('  options:\n');
-  console.log('  --help                     Display this message and exit\n');
-  process.exit(0);
-}
-
-if (null == arg) {
-  console.log(uuid());
-  process.exit(0);
-}
-
-if ('v1' !== arg && 'v4' !== arg) {
-  console.error('Version must be RFC4122 version 1 or version 4, denoted as "v1" or "v4"');
-  process.exit(1);
-}
-
-console.log(uuid[arg]());
-process.exit(0);
diff --git a/node_modules/node-uuid/bower.json b/node_modules/node-uuid/bower.json
deleted file mode 100644
index c0925e1..0000000
--- a/node_modules/node-uuid/bower.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "name": "node-uuid",
-  "version": "1.4.7",
-  "homepage": "https://github.com/broofa/node-uuid",
-  "authors": [
-    "Robert Kieffer <robert@broofa.com>"
-  ],
-  "description": "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.",
-  "main": "uuid.js",
-  "keywords": [
-    "uuid",
-    "gid",
-    "rfc4122"
-  ],
-  "license": "MIT",
-  "ignore": [
-    "**/.*",
-    "node_modules",
-    "bower_components",
-    "test",
-    "tests"
-  ]
-}
diff --git a/node_modules/node-uuid/component.json b/node_modules/node-uuid/component.json
deleted file mode 100644
index 3ff4633..0000000
--- a/node_modules/node-uuid/component.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "name": "node-uuid",
-  "repo": "broofa/node-uuid",
-  "description": "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.",
-  "version": "1.4.7",
-  "author": "Robert Kieffer <robert@broofa.com>",
-  "contributors": [
-    {
-      "name": "Christoph Tavan <dev@tavan.de>",
-      "github": "https://github.com/ctavan"
-    }
-  ],
-  "keywords": [
-    "uuid",
-    "guid",
-    "rfc4122"
-  ],
-  "dependencies": {},
-  "development": {},
-  "main": "uuid.js",
-  "scripts": [
-    "uuid.js"
-  ],
-  "license": "MIT"
-}
\ No newline at end of file
diff --git a/node_modules/node-uuid/lib/sha1-browser.js b/node_modules/node-uuid/lib/sha1-browser.js
deleted file mode 100644
index fea185e..0000000
--- a/node_modules/node-uuid/lib/sha1-browser.js
+++ /dev/null
@@ -1,120 +0,0 @@
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
-/* SHA-1 (FIPS 180-4) implementation in JavaScript                    (c) Chris Veness 2002-2016  */
-/*                                                                                   MIT Licence  */
-/* www.movable-type.co.uk/scripts/sha1.html                                                       */
-/*                                                                                                */
-/*  - see http://csrc.nist.gov/groups/ST/toolkit/secure_hashing.html                              */
-/*        http://csrc.nist.gov/groups/ST/toolkit/examples.html                                    */
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
-
-'use strict';
-
-function f(s, x, y, z)  {
-    switch (s) {
-        case 0: return (x & y) ^ (~x & z);           // Ch()
-        case 1: return  x ^ y  ^  z;                 // Parity()
-        case 2: return (x & y) ^ (x & z) ^ (y & z);  // Maj()
-        case 3: return  x ^ y  ^  z;                 // Parity()
-    }
-}
-
-function ROTL(x, n) {
-    return (x<<n) | (x>>>(32-n));
-}
-
-var Sha1 = {};
-
-Sha1.hash = function(msg, options) {
-    var defaults = { msgFormat: 'string', outFormat: 'hex' };
-    var opt = Object.assign(defaults, options);
-
-    switch (opt.msgFormat) {
-        default: // default is to convert string to UTF-8, as SHA only deals with byte-streams
-        case 'string':   msg = Sha1.utf8Encode(msg);       break;
-        case 'hex-bytes':msg = Sha1.hexBytesToString(msg); break; // mostly for running tests
-    }
-
-    // constants [¤4.2.1]
-    var K = [ 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6 ];
-
-    // initial hash value [¤5.3.1]
-    var H = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ];
-
-    // PREPROCESSING [¤6.1.1]
-
-    msg += String.fromCharCode(0x80);  // add trailing '1' bit (+ 0's padding) to string [¤5.1.1]
-
-    // convert string msg into 512-bit/16-integer blocks arrays of ints [¤5.2.1]
-    var l = msg.length/4 + 2; // length (in 32-bit integers) of msg + Ô1Õ + appended length
-    var N = Math.ceil(l/16);  // number of 16-integer-blocks required to hold 'l' ints
-    var M = new Array(N);
-
-    for (var i=0; i<N; i++) {
-        M[i] = new Array(16);
-        for (var j=0; j<16; j++) {  // encode 4 chars per integer, big-endian encoding
-            M[i][j] = (msg.charCodeAt(i*64+j*4)<<24) | (msg.charCodeAt(i*64+j*4+1)<<16) |
-                (msg.charCodeAt(i*64+j*4+2)<<8) | (msg.charCodeAt(i*64+j*4+3));
-        } // note running off the end of msg is ok 'cos bitwise ops on NaN return 0
-    }
-    // add length (in bits) into final pair of 32-bit integers (big-endian) [¤5.1.1]
-    // note: most significant word would be (len-1)*8 >>> 32, but since JS converts
-    // bitwise-op args to 32 bits, we need to simulate this by arithmetic operators
-    M[N-1][14] = ((msg.length-1)*8) / Math.pow(2, 32); M[N-1][14] = Math.floor(M[N-1][14]);
-    M[N-1][15] = ((msg.length-1)*8) & 0xffffffff;
-
-    // HASH COMPUTATION [¤6.1.2]
-
-    for (var i=0; i<N; i++) {
-        var W = new Array(80);
-
-        // 1 - prepare message schedule 'W'
-        for (var t=0;  t<16; t++) W[t] = M[i][t];
-        for (var t=16; t<80; t++) W[t] = ROTL(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1);
-
-        // 2 - initialise five working variables a, b, c, d, e with previous hash value
-        var a = H[0], b = H[1], c = H[2], d = H[3], e = H[4];
-
-        // 3 - main loop (use JavaScript '>>> 0' to emulate UInt32 variables)
-        for (var t=0; t<80; t++) {
-            var s = Math.floor(t/20); // seq for blocks of 'f' functions and 'K' constants
-            var T = (ROTL(a,5) + f(s,b,c,d) + e + K[s] + W[t]) >>> 0;
-            e = d;
-            d = c;
-            c = ROTL(b, 30) >>> 0;
-            b = a;
-            a = T;
-        }
-
-        // 4 - compute the new intermediate hash value (note 'addition modulo 2^32' Ð JavaScript
-        // '>>> 0' coerces to unsigned UInt32 which achieves modulo 2^32 addition)
-        H[0] = (H[0]+a) >>> 0;
-        H[1] = (H[1]+b) >>> 0;
-        H[2] = (H[2]+c) >>> 0;
-        H[3] = (H[3]+d) >>> 0;
-        H[4] = (H[4]+e) >>> 0;
-    }
-
-    // convert H0..H4 to hex strings (with leading zeros)
-    for (var h=0; h<H.length; h++) H[h] = ('00000000'+H[h].toString(16)).slice(-8);
-
-    // concatenate H0..H4, with separator if required
-    var separator = opt.outFormat=='hex-w' ? ' ' : '';
-
-    return H.join(separator);
-};
-
-Sha1.utf8Encode = function(str) {
-    return unescape(encodeURIComponent(str));
-};
-
-Sha1.hexBytesToString = function(hexStr) {
-    hexStr = hexStr.replace(' ', ''); // allow space-separated groups
-    var str = '';
-    for (var i=0; i<hexStr.length; i+=2) {
-        str += String.fromCharCode(parseInt(hexStr.slice(i, i+2), 16));
-    }
-    return str;
-};
-
-
-module.exports = Sha1; // CommonJs export
diff --git a/node_modules/node-uuid/package.json b/node_modules/node-uuid/package.json
deleted file mode 100644
index be8bea4..0000000
--- a/node_modules/node-uuid/package.json
+++ /dev/null
@@ -1,89 +0,0 @@
-{
-  "_args": [
-    [
-      "node-uuid@1.4.8",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "node-uuid@1.4.8",
-  "_id": "node-uuid@1.4.8",
-  "_inBundle": false,
-  "_integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=",
-  "_location": "/node-uuid",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "node-uuid@1.4.8",
-    "name": "node-uuid",
-    "escapedName": "node-uuid",
-    "rawSpec": "1.4.8",
-    "saveSpec": null,
-    "fetchSpec": "1.4.8"
-  },
-  "_requiredBy": [
-    "/"
-  ],
-  "_resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
-  "_spec": "1.4.8",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Robert Kieffer",
-    "email": "robert@broofa.com"
-  },
-  "bin": {
-    "uuid": "./bin/uuid"
-  },
-  "bugs": {
-    "url": "https://github.com/broofa/node-uuid/issues"
-  },
-  "contributors": [
-    {
-      "name": "AJ ONeal",
-      "email": "coolaj86@gmail.com"
-    },
-    {
-      "name": "Christoph Tavan",
-      "email": "dev@tavan.de"
-    }
-  ],
-  "dependencies": {},
-  "description": "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.",
-  "devDependencies": {
-    "nyc": "^2.2.0"
-  },
-  "directories": {},
-  "homepage": "https://github.com/broofa/node-uuid",
-  "installable": true,
-  "keywords": [
-    "guid",
-    "rfc4122",
-    "uuid"
-  ],
-  "lib": ".",
-  "licenses": [
-    {
-      "type": "MIT",
-      "url": "https://raw.github.com/broofa/node-uuid/master/LICENSE.md"
-    }
-  ],
-  "main": "./uuid.js",
-  "maintainers": [
-    {
-      "name": "broofa",
-      "email": "robert@broofa.com"
-    }
-  ],
-  "name": "node-uuid",
-  "optionalDependencies": {},
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/broofa/node-uuid.git"
-  },
-  "scripts": {
-    "coverage": "nyc npm test && nyc report",
-    "test": "node test/test.js"
-  },
-  "url": "http://github.com/broofa/node-uuid",
-  "version": "1.4.8"
-}
diff --git a/node_modules/node-uuid/test/compare_v1.js b/node_modules/node-uuid/test/compare_v1.js
deleted file mode 100644
index 05af822..0000000
--- a/node_modules/node-uuid/test/compare_v1.js
+++ /dev/null
@@ -1,63 +0,0 @@
-var assert = require('assert'),
-    nodeuuid = require('../uuid'),
-    uuidjs = require('uuid-js'),
-    libuuid = require('uuid').generate,
-    util = require('util'),
-    exec = require('child_process').exec,
-    os = require('os');
-
-// On Mac Os X / macports there's only the ossp-uuid package that provides uuid
-// On Linux there's uuid-runtime which provides uuidgen
-var uuidCmd = os.type() === 'Darwin' ? 'uuid -1' : 'uuidgen -t';
-
-function compare(ids) {
-  console.log(ids);
-  for (var i = 0; i < ids.length; i++) {
-    var id = ids[i].split('-');
-    id = [id[2], id[1], id[0]].join('');
-    ids[i] = id;
-  }
-  var sorted = ([].concat(ids)).sort();
-
-  if (sorted.toString() !== ids.toString()) {
-    console.log('Warning: sorted !== ids');
-  } else {
-    console.log('everything in order!');
-  }
-}
-
-// Test time order of v1 uuids
-var ids = [];
-while (ids.length < 10e3) ids.push(nodeuuid.v1());
-
-var max = 10;
-console.log('node-uuid:');
-ids = [];
-for (var i = 0; i < max; i++) ids.push(nodeuuid.v1());
-compare(ids);
-
-console.log('');
-console.log('uuidjs:');
-ids = [];
-for (var i = 0; i < max; i++) ids.push(uuidjs.create(1).toString());
-compare(ids);
-
-console.log('');
-console.log('libuuid:');
-ids = [];
-var count = 0;
-var last = function() {
-  compare(ids);
-}
-var cb = function(err, stdout, stderr) {
-  ids.push(stdout.substring(0, stdout.length-1));
-  count++;
-  if (count < max) {
-    return next();
-  }
-  last();
-};
-var next = function() {
-  exec(uuidCmd, cb);
-};
-next();
diff --git a/node_modules/node-uuid/test/test.html b/node_modules/node-uuid/test/test.html
deleted file mode 100644
index d80326e..0000000
--- a/node_modules/node-uuid/test/test.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<html>
-  <head>
-    <style>
-      div {
-        font-family: monospace;
-        font-size: 8pt;
-      }
-      div.log {color: #444;}
-      div.warn {color: #550;}
-      div.error {color: #800; font-weight: bold;}
-    </style>
-    <script src="../uuid.js"></script>
-  </head>
-  <body>
-    <script src="./test.js"></script>
-  </body>
-</html>
diff --git a/node_modules/node-uuid/test/test.js b/node_modules/node-uuid/test/test.js
deleted file mode 100644
index 5f1113d..0000000
--- a/node_modules/node-uuid/test/test.js
+++ /dev/null
@@ -1,231 +0,0 @@
-if (!this.uuid) {
-  // node.js
-  uuid = require('../uuid');
-  if (!/_rb/.test(uuid._rng.toString())) {
-    throw new Error("should use crypto for node.js");
-  }
-}
-
-//
-// x-platform log/assert shims
-//
-
-function _log(msg, type) {
-  type = type || 'log';
-
-  if (typeof(document) != 'undefined') {
-    document.write('<div class="' + type + '">' + msg.replace(/\n/g, '<br />') + '</div>');
-  }
-  if (typeof(console) != 'undefined') {
-    var color = {
-      log: '\033[39m',
-      warn: '\033[33m',
-      error: '\033[31m'
-    };
-    console[type](color[type] + msg + color.log);
-  }
-}
-
-function log(msg) {_log(msg, 'log');}
-function warn(msg) {_log(msg, 'warn');}
-function error(msg) {_log(msg, 'error');}
-
-function assert(res, msg) {
-  if (!res) {
-    error('FAIL: ' + msg);
-  } else {
-    log('Pass: ' + msg);
-  }
-}
-
-//
-// Unit tests
-//
-
-// Verify ordering of v1 ids created with explicit times
-var TIME = 1321644961388; // 2011-11-18 11:36:01.388-08:00
-
-function compare(name, ids) {
-  ids = ids.map(function(id) {
-    return id.split('-').reverse().join('-');
-  }).sort();
-  var sorted = ([].concat(ids)).sort();
-
-  assert(sorted.toString() == ids.toString(), name + ' have expected order');
-}
-
-// Verify ordering of v1 ids created using default behavior
-compare('uuids with current time', [
-  uuid.v1(),
-  uuid.v1(),
-  uuid.v1(),
-  uuid.v1(),
-  uuid.v1()
-]);
-
-// Verify ordering of v1 ids created with explicit times
-compare('uuids with time option', [
-  uuid.v1({msecs: TIME - 10*3600*1000}),
-  uuid.v1({msecs: TIME - 1}),
-  uuid.v1({msecs: TIME}),
-  uuid.v1({msecs: TIME + 1}),
-  uuid.v1({msecs: TIME + 28*24*3600*1000})
-]);
-
-assert(
-  uuid.v1({msecs: TIME}) != uuid.v1({msecs: TIME}),
-  'IDs created at same msec are different'
-);
-
-// Verify throw if too many ids created
-var thrown = false;
-try {
-  uuid.v1({msecs: TIME, nsecs: 10000});
-} catch (e) {
-  thrown = true;
-}
-assert(thrown, 'Exception thrown when > 10K ids created in 1 ms');
-
-// Verify clock regression bumps clockseq
-var uidt = uuid.v1({msecs: TIME});
-var uidtb = uuid.v1({msecs: TIME - 1});
-assert(
-  parseInt(uidtb.split('-')[3], 16) - parseInt(uidt.split('-')[3], 16) === 1,
-  'Clock regression by msec increments the clockseq'
-);
-
-// Verify clock regression bumps clockseq
-var uidtn = uuid.v1({msecs: TIME, nsecs: 10});
-var uidtnb = uuid.v1({msecs: TIME, nsecs: 9});
-assert(
-  parseInt(uidtnb.split('-')[3], 16) - parseInt(uidtn.split('-')[3], 16) === 1,
-  'Clock regression by nsec increments the clockseq'
-);
-
-// Verify explicit options produce expected id
-var id = uuid.v1({
-  msecs: 1321651533573,
-  nsecs: 5432,
-  clockseq: 0x385c,
-  node: [ 0x61, 0xcd, 0x3c, 0xbb, 0x32, 0x10 ]
-});
-assert(id == 'd9428888-122b-11e1-b85c-61cd3cbb3210', 'Explicit options produce expected id');
-
-// Verify adjacent ids across a msec boundary are 1 time unit apart
-var u0 = uuid.v1({msecs: TIME, nsecs: 9999});
-var u1 = uuid.v1({msecs: TIME + 1, nsecs: 0});
-
-var before = u0.split('-')[0], after = u1.split('-')[0];
-var dt = parseInt(after, 16) - parseInt(before, 16);
-assert(dt === 1, 'Ids spanning 1ms boundary are 100ns apart');
-
-//
-// Test parse/unparse
-//
-
-id = '00112233445566778899aabbccddeeff';
-assert(uuid.unparse(uuid.parse(id.substr(0,10))) ==
-  '00112233-4400-0000-0000-000000000000', 'Short parse');
-assert(uuid.unparse(uuid.parse('(this is the uuid -> ' + id + id)) ==
-  '00112233-4455-6677-8899-aabbccddeeff', 'Dirty parse');
-
-//
-// Perf tests
-//
-
-var generators = {
-  v1: uuid.v1,
-  v4: uuid.v4
-};
-
-var UUID_FORMAT = {
-  v1: /[0-9a-f]{8}-[0-9a-f]{4}-1[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i,
-  v4: /[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i
-};
-
-var N = 1e4;
-
-// Get %'age an actual value differs from the ideal value
-function divergence(actual, ideal) {
-  return Math.round(100*100*(actual - ideal)/ideal)/100;
-}
-
-function rate(msg, t) {
-  log(msg + ': ' + (N / (Date.now() - t) * 1e3 | 0) + ' uuids\/second');
-}
-
-for (var version in generators) {
-  var counts = {}, max = 0;
-  var generator = generators[version];
-  var format = UUID_FORMAT[version];
-
-  log('\nSanity check ' + N + ' ' + version + ' uuids');
-  for (var i = 0, ok = 0; i < N; i++) {
-    id = generator();
-    if (!format.test(id)) {
-      throw Error(id + ' is not a valid UUID string');
-    }
-
-    if (id != uuid.unparse(uuid.parse(id))) {
-      assert(fail, id + ' is not a valid id');
-    }
-
-    // Count digits for our randomness check
-    if (version == 'v4') {
-      var digits = id.replace(/-/g, '').split('');
-      for (var j = digits.length-1; j >= 0; j--) {
-        var c = digits[j];
-        max = Math.max(max, counts[c] = (counts[c] || 0) + 1);
-      }
-    }
-  }
-
-  // Check randomness for v4 UUIDs
-  if (version == 'v4') {
-    // Limit that we get worried about randomness. (Purely empirical choice, this!)
-    var limit = 2*100*Math.sqrt(1/N);
-
-    log('\nChecking v4 randomness.  Distribution of Hex Digits (% deviation from ideal)');
-
-    for (var i = 0; i < 16; i++) {
-      var c = i.toString(16);
-      var bar = '', n = counts[c], p = Math.round(n/max*100|0);
-
-      // 1-3,5-8, and D-F: 1:16 odds over 30 digits
-      var ideal = N*30/16;
-      if (i == 4) {
-        // 4: 1:1 odds on 1 digit, plus 1:16 odds on 30 digits
-        ideal = N*(1 + 30/16);
-      } else if (i >= 8 && i <= 11) {
-        // 8-B: 1:4 odds on 1 digit, plus 1:16 odds on 30 digits
-        ideal = N*(1/4 + 30/16);
-      } else {
-        // Otherwise: 1:16 odds on 30 digits
-        ideal = N*30/16;
-      }
-      var d = divergence(n, ideal);
-
-      // Draw bar using UTF squares (just for grins)
-      var s = n/max*50 | 0;
-      while (s--) bar += '=';
-
-      assert(Math.abs(d) < limit, c + ' |' + bar + '| ' + counts[c] + ' (' + d + '% < ' + limit + '%)');
-    }
-  }
-}
-
-// Perf tests
-for (var version in generators) {
-  log('\nPerformance testing ' + version + ' UUIDs');
-  var generator = generators[version];
-  var buf = new uuid.BufferClass(16);
-
-  for (var i = 0, t = Date.now(); i < N; i++) generator();
-  rate('uuid.' + version + '()', t);
-
-  for (var i = 0, t = Date.now(); i < N; i++) generator('binary');
-  rate('uuid.' + version + '(\'binary\')', t);
-
-  for (var i = 0, t = Date.now(); i < N; i++) generator('binary', buf);
-  rate('uuid.' + version + '(\'binary\', buffer)', t);
-}
diff --git a/node_modules/node-uuid/uuid.js b/node_modules/node-uuid/uuid.js
deleted file mode 100644
index 89c5b8f..0000000
--- a/node_modules/node-uuid/uuid.js
+++ /dev/null
@@ -1,272 +0,0 @@
-//     uuid.js
-//
-//     Copyright (c) 2010-2012 Robert Kieffer
-//     MIT License - http://opensource.org/licenses/mit-license.php
-
-/*global window, require, define */
-(function(_window) {
-  'use strict';
-
-  // Unique ID creation requires a high quality random # generator.  We feature
-  // detect to determine the best RNG source, normalizing to a function that
-  // returns 128-bits of randomness, since that's what's usually required
-  var _rng, _mathRNG, _nodeRNG, _whatwgRNG, _previousRoot;
-
-  function setupBrowser() {
-    // Allow for MSIE11 msCrypto
-    var _crypto = _window.crypto || _window.msCrypto;
-
-    if (!_rng && _crypto && _crypto.getRandomValues) {
-      // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto
-      //
-      // Moderately fast, high quality
-      try {
-        var _rnds8 = new Uint8Array(16);
-        _whatwgRNG = _rng = function whatwgRNG() {
-          _crypto.getRandomValues(_rnds8);
-          return _rnds8;
-        };
-        _rng();
-      } catch(e) {}
-    }
-
-    if (!_rng) {
-      // Math.random()-based (RNG)
-      //
-      // If all else fails, use Math.random().  It's fast, but is of unspecified
-      // quality.
-      var  _rnds = new Array(16);
-      _mathRNG = _rng = function() {
-        for (var i = 0, r; i < 16; i++) {
-          if ((i & 0x03) === 0) { r = Math.random() * 0x100000000; }
-          _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;
-        }
-
-        return _rnds;
-      };
-      if ('undefined' !== typeof console && console.warn) {
-        console.warn("[SECURITY] node-uuid: crypto not usable, falling back to insecure Math.random()");
-      }
-    }
-  }
-
-  function setupNode() {
-    // Node.js crypto-based RNG - http://nodejs.org/docs/v0.6.2/api/crypto.html
-    //
-    // Moderately fast, high quality
-    if ('function' === typeof require) {
-      try {
-        var _rb = require('crypto').randomBytes;
-        _nodeRNG = _rng = _rb && function() {return _rb(16);};
-        _rng();
-      } catch(e) {}
-    }
-  }
-
-  if (_window) {
-    setupBrowser();
-  } else {
-    setupNode();
-  }
-
-  // Buffer class to use
-  var BufferClass = ('function' === typeof Buffer) ? Buffer : Array;
-
-  // Maps for number <-> hex string conversion
-  var _byteToHex = [];
-  var _hexToByte = {};
-  for (var i = 0; i < 256; i++) {
-    _byteToHex[i] = (i + 0x100).toString(16).substr(1);
-    _hexToByte[_byteToHex[i]] = i;
-  }
-
-  // **`parse()` - Parse a UUID into it's component bytes**
-  function parse(s, buf, offset) {
-    var i = (buf && offset) || 0, ii = 0;
-
-    buf = buf || [];
-    s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) {
-      if (ii < 16) { // Don't overflow!
-        buf[i + ii++] = _hexToByte[oct];
-      }
-    });
-
-    // Zero out remaining bytes if string was short
-    while (ii < 16) {
-      buf[i + ii++] = 0;
-    }
-
-    return buf;
-  }
-
-  // **`unparse()` - Convert UUID byte array (ala parse()) into a string**
-  function unparse(buf, offset) {
-    var i = offset || 0, bth = _byteToHex;
-    return  bth[buf[i++]] + bth[buf[i++]] +
-            bth[buf[i++]] + bth[buf[i++]] + '-' +
-            bth[buf[i++]] + bth[buf[i++]] + '-' +
-            bth[buf[i++]] + bth[buf[i++]] + '-' +
-            bth[buf[i++]] + bth[buf[i++]] + '-' +
-            bth[buf[i++]] + bth[buf[i++]] +
-            bth[buf[i++]] + bth[buf[i++]] +
-            bth[buf[i++]] + bth[buf[i++]];
-  }
-
-  // **`v1()` - Generate time-based UUID**
-  //
-  // Inspired by https://github.com/LiosK/UUID.js
-  // and http://docs.python.org/library/uuid.html
-
-  // random #'s we need to init node and clockseq
-  var _seedBytes = _rng();
-
-  // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
-  var _nodeId = [
-    _seedBytes[0] | 0x01,
-    _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5]
-  ];
-
-  // Per 4.2.2, randomize (14 bit) clockseq
-  var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;
-
-  // Previous uuid creation time
-  var _lastMSecs = 0, _lastNSecs = 0;
-
-  // See https://github.com/broofa/node-uuid for API details
-  function v1(options, buf, offset) {
-    var i = buf && offset || 0;
-    var b = buf || [];
-
-    options = options || {};
-
-    var clockseq = (options.clockseq != null) ? options.clockseq : _clockseq;
-
-    // UUID timestamps are 100 nano-second units since the Gregorian epoch,
-    // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
-    // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
-    // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
-    var msecs = (options.msecs != null) ? options.msecs : new Date().getTime();
-
-    // Per 4.2.1.2, use count of uuid's generated during the current clock
-    // cycle to simulate higher resolution clock
-    var nsecs = (options.nsecs != null) ? options.nsecs : _lastNSecs + 1;
-
-    // Time since last uuid creation (in msecs)
-    var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;
-
-    // Per 4.2.1.2, Bump clockseq on clock regression
-    if (dt < 0 && options.clockseq == null) {
-      clockseq = clockseq + 1 & 0x3fff;
-    }
-
-    // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
-    // time interval
-    if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) {
-      nsecs = 0;
-    }
-
-    // Per 4.2.1.2 Throw error if too many uuids are requested
-    if (nsecs >= 10000) {
-      throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec');
-    }
-
-    _lastMSecs = msecs;
-    _lastNSecs = nsecs;
-    _clockseq = clockseq;
-
-    // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
-    msecs += 12219292800000;
-
-    // `time_low`
-    var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
-    b[i++] = tl >>> 24 & 0xff;
-    b[i++] = tl >>> 16 & 0xff;
-    b[i++] = tl >>> 8 & 0xff;
-    b[i++] = tl & 0xff;
-
-    // `time_mid`
-    var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;
-    b[i++] = tmh >>> 8 & 0xff;
-    b[i++] = tmh & 0xff;
-
-    // `time_high_and_version`
-    b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
-    b[i++] = tmh >>> 16 & 0xff;
-
-    // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
-    b[i++] = clockseq >>> 8 | 0x80;
-
-    // `clock_seq_low`
-    b[i++] = clockseq & 0xff;
-
-    // `node`
-    var node = options.node || _nodeId;
-    for (var n = 0; n < 6; n++) {
-      b[i + n] = node[n];
-    }
-
-    return buf ? buf : unparse(b);
-  }
-
-  // **`v4()` - Generate random UUID**
-
-  // See https://github.com/broofa/node-uuid for API details
-  function v4(options, buf, offset) {
-    // Deprecated - 'format' argument, as supported in v1.2
-    var i = buf && offset || 0;
-
-    if (typeof(options) === 'string') {
-      buf = (options === 'binary') ? new BufferClass(16) : null;
-      options = null;
-    }
-    options = options || {};
-
-    var rnds = options.random || (options.rng || _rng)();
-
-    // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
-    rnds[6] = (rnds[6] & 0x0f) | 0x40;
-    rnds[8] = (rnds[8] & 0x3f) | 0x80;
-
-    // Copy bytes to buffer, if provided
-    if (buf) {
-      for (var ii = 0; ii < 16; ii++) {
-        buf[i + ii] = rnds[ii];
-      }
-    }
-
-    return buf || unparse(rnds);
-  }
-
-  // Export public API
-  var uuid = v4;
-  uuid.v1 = v1;
-  uuid.v4 = v4;
-  uuid.parse = parse;
-  uuid.unparse = unparse;
-  uuid.BufferClass = BufferClass;
-  uuid._rng = _rng;
-  uuid._mathRNG = _mathRNG;
-  uuid._nodeRNG = _nodeRNG;
-  uuid._whatwgRNG = _whatwgRNG;
-
-  if (('undefined' !== typeof module) && module.exports) {
-    // Publish as node.js module
-    module.exports = uuid;
-  } else if (typeof define === 'function' && define.amd) {
-    // Publish as AMD module
-    define(function() {return uuid;});
-
-
-  } else {
-    // Publish as global (in browsers)
-    _previousRoot = _window.uuid;
-
-    // **`noConflict()` - (browser only) to reset global 'uuid' var**
-    uuid.noConflict = function() {
-      _window.uuid = _previousRoot;
-      return uuid;
-    };
-
-    _window.uuid = uuid;
-  }
-})('undefined' !== typeof window ? window : null);
diff --git a/node_modules/node-uuid/v3.js b/node_modules/node-uuid/v3.js
deleted file mode 100644
index a27c5b3..0000000
--- a/node_modules/node-uuid/v3.js
+++ /dev/null
@@ -1,54 +0,0 @@
-var rng = require('./lib/rng');
-var bytesToUuid = require('./lib/bytesToUuid');
-
-function v3(name, namespaceUuid, buf, offset) {
-  var i = buf && offset || 0;
-
-  if (typeof(name) != 'string) {
-    throw TypeError('name must be defined')
-  }
-  if (typeof(namespaceUuid) != 'string) {
-    throw TypeError('name must be defined')
-  }
-
-  if (typeof(options) == 'string') {
-    buf = options == 'binary' ? new Array(16) : null;
-    options = null;
-  }
-  options = options || {};
-
-  var rnds = options.random || (options.rng || rng)();
-
-  // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
-  rnds[6] = (rnds[6] & 0x0f) | 0x40;
-  rnds[8] = (rnds[8] & 0x3f) | 0x80;
-
-  // Copy bytes to buffer, if provided
-  if (buf) {
-    for (var ii = 0; ii < 16; ++ii) {
-      buf[i + ii] = rnds[ii];
-    }
-  }
-
-  return buf || bytesToUuid(rnds);
-}
-
-exports.namespace = function(uuid) {
-  // Parse namespace uuid
-  var namespaceBytes = (uuid).match(/([0-9a-f][0-9a-f])/gi).map(function(s) {
-    return parseInt(s, 16);
-  });
-
-  return function(name) {
-    var bytes = [].concat(namespaceBytes);
-
-    var utf8String = unescape(encodeURIComponent(s))
-    for (var i = 0; i < utf8String.length; i++) {
-      bytes.push(utf8String.charCodeAt(i));
-    }
-
-    var hash = md5(bytes);
-  }
-}
-
-module.exports = v4;
diff --git a/node_modules/nopt/.npmignore b/node_modules/nopt/.npmignore
deleted file mode 100644
index 3c3629e..0000000
--- a/node_modules/nopt/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/node_modules/nopt/.travis.yml b/node_modules/nopt/.travis.yml
deleted file mode 100644
index 99f2bbf..0000000
--- a/node_modules/nopt/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: node_js
-language: node_js
-node_js:
-  - '0.8'
-  - '0.10'
-  - '0.12'
-  - 'iojs'
-before_install:
-  - npm install -g npm@latest
diff --git a/node_modules/nopt/LICENSE b/node_modules/nopt/LICENSE
deleted file mode 100644
index 19129e3..0000000
--- a/node_modules/nopt/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/nopt/README.md b/node_modules/nopt/README.md
deleted file mode 100644
index f21a4b3..0000000
--- a/node_modules/nopt/README.md
+++ /dev/null
@@ -1,211 +0,0 @@
-If you want to write an option parser, and have it be good, there are
-two ways to do it.  The Right Way, and the Wrong Way.
-
-The Wrong Way is to sit down and write an option parser.  We've all done
-that.
-
-The Right Way is to write some complex configurable program with so many
-options that you hit the limit of your frustration just trying to
-manage them all, and defer it with duct-tape solutions until you see
-exactly to the core of the problem, and finally snap and write an
-awesome option parser.
-
-If you want to write an option parser, don't write an option parser.
-Write a package manager, or a source control system, or a service
-restarter, or an operating system.  You probably won't end up with a
-good one of those, but if you don't give up, and you are relentless and
-diligent enough in your procrastination, you may just end up with a very
-nice option parser.
-
-## USAGE
-
-    // my-program.js
-    var nopt = require("nopt")
-      , Stream = require("stream").Stream
-      , path = require("path")
-      , knownOpts = { "foo" : [String, null]
-                    , "bar" : [Stream, Number]
-                    , "baz" : path
-                    , "bloo" : [ "big", "medium", "small" ]
-                    , "flag" : Boolean
-                    , "pick" : Boolean
-                    , "many1" : [String, Array]
-                    , "many2" : [path]
-                    }
-      , shortHands = { "foofoo" : ["--foo", "Mr. Foo"]
-                     , "b7" : ["--bar", "7"]
-                     , "m" : ["--bloo", "medium"]
-                     , "p" : ["--pick"]
-                     , "f" : ["--flag"]
-                     }
-                 // everything is optional.
-                 // knownOpts and shorthands default to {}
-                 // arg list defaults to process.argv
-                 // slice defaults to 2
-      , parsed = nopt(knownOpts, shortHands, process.argv, 2)
-    console.log(parsed)
-
-This would give you support for any of the following:
-
-```bash
-$ node my-program.js --foo "blerp" --no-flag
-{ "foo" : "blerp", "flag" : false }
-
-$ node my-program.js ---bar 7 --foo "Mr. Hand" --flag
-{ bar: 7, foo: "Mr. Hand", flag: true }
-
-$ node my-program.js --foo "blerp" -f -----p
-{ foo: "blerp", flag: true, pick: true }
-
-$ node my-program.js -fp --foofoo
-{ foo: "Mr. Foo", flag: true, pick: true }
-
-$ node my-program.js --foofoo -- -fp  # -- stops the flag parsing.
-{ foo: "Mr. Foo", argv: { remain: ["-fp"] } }
-
-$ node my-program.js --blatzk -fp # unknown opts are ok.
-{ blatzk: true, flag: true, pick: true }
-
-$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value
-{ blatzk: 1000, flag: true, pick: true }
-
-$ node my-program.js --no-blatzk -fp # unless they start with "no-"
-{ blatzk: false, flag: true, pick: true }
-
-$ node my-program.js --baz b/a/z # known paths are resolved.
-{ baz: "/Users/isaacs/b/a/z" }
-
-# if Array is one of the types, then it can take many
-# values, and will always be an array.  The other types provided
-# specify what types are allowed in the list.
-
-$ node my-program.js --many1 5 --many1 null --many1 foo
-{ many1: ["5", "null", "foo"] }
-
-$ node my-program.js --many2 foo --many2 bar
-{ many2: ["/path/to/foo", "path/to/bar"] }
-```
-
-Read the tests at the bottom of `lib/nopt.js` for more examples of
-what this puppy can do.
-
-## Types
-
-The following types are supported, and defined on `nopt.typeDefs`
-
-* String: A normal string.  No parsing is done.
-* path: A file system path.  Gets resolved against cwd if not absolute.
-* url: A url.  If it doesn't parse, it isn't accepted.
-* Number: Must be numeric.
-* Date: Must parse as a date. If it does, and `Date` is one of the options,
-  then it will return a Date object, not a string.
-* Boolean: Must be either `true` or `false`.  If an option is a boolean,
-  then it does not need a value, and its presence will imply `true` as
-  the value.  To negate boolean flags, do `--no-whatever` or `--whatever
-  false`
-* NaN: Means that the option is strictly not allowed.  Any value will
-  fail.
-* Stream: An object matching the "Stream" class in node.  Valuable
-  for use when validating programmatically.  (npm uses this to let you
-  supply any WriteStream on the `outfd` and `logfd` config options.)
-* Array: If `Array` is specified as one of the types, then the value
-  will be parsed as a list of options.  This means that multiple values
-  can be specified, and that the value will always be an array.
-
-If a type is an array of values not on this list, then those are
-considered valid values.  For instance, in the example above, the
-`--bloo` option can only be one of `"big"`, `"medium"`, or `"small"`,
-and any other value will be rejected.
-
-When parsing unknown fields, `"true"`, `"false"`, and `"null"` will be
-interpreted as their JavaScript equivalents.
-
-You can also mix types and values, or multiple types, in a list.  For
-instance `{ blah: [Number, null] }` would allow a value to be set to
-either a Number or null.  When types are ordered, this implies a
-preference, and the first type that can be used to properly interpret
-the value will be used.
-
-To define a new type, add it to `nopt.typeDefs`.  Each item in that
-hash is an object with a `type` member and a `validate` method.  The
-`type` member is an object that matches what goes in the type list.  The
-`validate` method is a function that gets called with `validate(data,
-key, val)`.  Validate methods should assign `data[key]` to the valid
-value of `val` if it can be handled properly, or return boolean
-`false` if it cannot.
-
-You can also call `nopt.clean(data, types, typeDefs)` to clean up a
-config object and remove its invalid properties.
-
-## Error Handling
-
-By default, nopt outputs a warning to standard error when invalid values for
-known options are found.  You can change this behavior by assigning a method
-to `nopt.invalidHandler`.  This method will be called with
-the offending `nopt.invalidHandler(key, val, types)`.
-
-If no `nopt.invalidHandler` is assigned, then it will console.error
-its whining.  If it is assigned to boolean `false` then the warning is
-suppressed.
-
-## Abbreviations
-
-Yes, they are supported.  If you define options like this:
-
-```javascript
-{ "foolhardyelephants" : Boolean
-, "pileofmonkeys" : Boolean }
-```
-
-Then this will work:
-
-```bash
-node program.js --foolhar --pil
-node program.js --no-f --pileofmon
-# etc.
-```
-
-## Shorthands
-
-Shorthands are a hash of shorter option names to a snippet of args that
-they expand to.
-
-If multiple one-character shorthands are all combined, and the
-combination does not unambiguously match any other option or shorthand,
-then they will be broken up into their constituent parts.  For example:
-
-```json
-{ "s" : ["--loglevel", "silent"]
-, "g" : "--global"
-, "f" : "--force"
-, "p" : "--parseable"
-, "l" : "--long"
-}
-```
-
-```bash
-npm ls -sgflp
-# just like doing this:
-npm ls --loglevel silent --global --force --long --parseable
-```
-
-## The Rest of the args
-
-The config object returned by nopt is given a special member called
-`argv`, which is an object with the following fields:
-
-* `remain`: The remaining args after all the parsing has occurred.
-* `original`: The args as they originally appeared.
-* `cooked`: The args after flags and shorthands are expanded.
-
-## Slicing
-
-Node programs are called with more or less the exact argv as it appears
-in C land, after the v8 and node-specific options have been plucked off.
-As such, `argv[0]` is always `node` and `argv[1]` is always the
-JavaScript program being run.
-
-That's usually not very useful to you.  So they're sliced off by
-default.  If you want them, then you can pass in `0` as the last
-argument, or any other number that you'd like to slice off the start of
-the list.
diff --git a/node_modules/nopt/bin/nopt.js b/node_modules/nopt/bin/nopt.js
deleted file mode 100755
index 3232d4c..0000000
--- a/node_modules/nopt/bin/nopt.js
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env node
-var nopt = require("../lib/nopt")
-  , path = require("path")
-  , types = { num: Number
-            , bool: Boolean
-            , help: Boolean
-            , list: Array
-            , "num-list": [Number, Array]
-            , "str-list": [String, Array]
-            , "bool-list": [Boolean, Array]
-            , str: String
-            , clear: Boolean
-            , config: Boolean
-            , length: Number
-            , file: path
-            }
-  , shorthands = { s: [ "--str", "astring" ]
-                 , b: [ "--bool" ]
-                 , nb: [ "--no-bool" ]
-                 , tft: [ "--bool-list", "--no-bool-list", "--bool-list", "true" ]
-                 , "?": ["--help"]
-                 , h: ["--help"]
-                 , H: ["--help"]
-                 , n: [ "--num", "125" ]
-                 , c: ["--config"]
-                 , l: ["--length"]
-                 , f: ["--file"]
-                 }
-  , parsed = nopt( types
-                 , shorthands
-                 , process.argv
-                 , 2 )
-
-console.log("parsed", parsed)
-
-if (parsed.help) {
-  console.log("")
-  console.log("nopt cli tester")
-  console.log("")
-  console.log("types")
-  console.log(Object.keys(types).map(function M (t) {
-    var type = types[t]
-    if (Array.isArray(type)) {
-      return [t, type.map(function (type) { return type.name })]
-    }
-    return [t, type && type.name]
-  }).reduce(function (s, i) {
-    s[i[0]] = i[1]
-    return s
-  }, {}))
-  console.log("")
-  console.log("shorthands")
-  console.log(shorthands)
-}
diff --git a/node_modules/nopt/examples/my-program.js b/node_modules/nopt/examples/my-program.js
deleted file mode 100755
index 142447e..0000000
--- a/node_modules/nopt/examples/my-program.js
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env node
-
-//process.env.DEBUG_NOPT = 1
-
-// my-program.js
-var nopt = require("../lib/nopt")
-  , Stream = require("stream").Stream
-  , path = require("path")
-  , knownOpts = { "foo" : [String, null]
-                , "bar" : [Stream, Number]
-                , "baz" : path
-                , "bloo" : [ "big", "medium", "small" ]
-                , "flag" : Boolean
-                , "pick" : Boolean
-                }
-  , shortHands = { "foofoo" : ["--foo", "Mr. Foo"]
-                 , "b7" : ["--bar", "7"]
-                 , "m" : ["--bloo", "medium"]
-                 , "p" : ["--pick"]
-                 , "f" : ["--flag", "true"]
-                 , "g" : ["--flag"]
-                 , "s" : "--flag"
-                 }
-             // everything is optional.
-             // knownOpts and shorthands default to {}
-             // arg list defaults to process.argv
-             // slice defaults to 2
-  , parsed = nopt(knownOpts, shortHands, process.argv, 2)
-
-console.log("parsed =\n"+ require("util").inspect(parsed))
diff --git a/node_modules/nopt/lib/nopt.js b/node_modules/nopt/lib/nopt.js
deleted file mode 100644
index 97707e7..0000000
--- a/node_modules/nopt/lib/nopt.js
+++ /dev/null
@@ -1,415 +0,0 @@
-// info about each config option.
-
-var debug = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG
-  ? function () { console.error.apply(console, arguments) }
-  : function () {}
-
-var url = require("url")
-  , path = require("path")
-  , Stream = require("stream").Stream
-  , abbrev = require("abbrev")
-
-module.exports = exports = nopt
-exports.clean = clean
-
-exports.typeDefs =
-  { String  : { type: String,  validate: validateString  }
-  , Boolean : { type: Boolean, validate: validateBoolean }
-  , url     : { type: url,     validate: validateUrl     }
-  , Number  : { type: Number,  validate: validateNumber  }
-  , path    : { type: path,    validate: validatePath    }
-  , Stream  : { type: Stream,  validate: validateStream  }
-  , Date    : { type: Date,    validate: validateDate    }
-  }
-
-function nopt (types, shorthands, args, slice) {
-  args = args || process.argv
-  types = types || {}
-  shorthands = shorthands || {}
-  if (typeof slice !== "number") slice = 2
-
-  debug(types, shorthands, args, slice)
-
-  args = args.slice(slice)
-  var data = {}
-    , key
-    , remain = []
-    , cooked = args
-    , original = args.slice(0)
-
-  parse(args, data, remain, types, shorthands)
-  // now data is full
-  clean(data, types, exports.typeDefs)
-  data.argv = {remain:remain,cooked:cooked,original:original}
-  Object.defineProperty(data.argv, 'toString', { value: function () {
-    return this.original.map(JSON.stringify).join(" ")
-  }, enumerable: false })
-  return data
-}
-
-function clean (data, types, typeDefs) {
-  typeDefs = typeDefs || exports.typeDefs
-  var remove = {}
-    , typeDefault = [false, true, null, String, Array]
-
-  Object.keys(data).forEach(function (k) {
-    if (k === "argv") return
-    var val = data[k]
-      , isArray = Array.isArray(val)
-      , type = types[k]
-    if (!isArray) val = [val]
-    if (!type) type = typeDefault
-    if (type === Array) type = typeDefault.concat(Array)
-    if (!Array.isArray(type)) type = [type]
-
-    debug("val=%j", val)
-    debug("types=", type)
-    val = val.map(function (val) {
-      // if it's an unknown value, then parse false/true/null/numbers/dates
-      if (typeof val === "string") {
-        debug("string %j", val)
-        val = val.trim()
-        if ((val === "null" && ~type.indexOf(null))
-            || (val === "true" &&
-               (~type.indexOf(true) || ~type.indexOf(Boolean)))
-            || (val === "false" &&
-               (~type.indexOf(false) || ~type.indexOf(Boolean)))) {
-          val = JSON.parse(val)
-          debug("jsonable %j", val)
-        } else if (~type.indexOf(Number) && !isNaN(val)) {
-          debug("convert to number", val)
-          val = +val
-        } else if (~type.indexOf(Date) && !isNaN(Date.parse(val))) {
-          debug("convert to date", val)
-          val = new Date(val)
-        }
-      }
-
-      if (!types.hasOwnProperty(k)) {
-        return val
-      }
-
-      // allow `--no-blah` to set 'blah' to null if null is allowed
-      if (val === false && ~type.indexOf(null) &&
-          !(~type.indexOf(false) || ~type.indexOf(Boolean))) {
-        val = null
-      }
-
-      var d = {}
-      d[k] = val
-      debug("prevalidated val", d, val, types[k])
-      if (!validate(d, k, val, types[k], typeDefs)) {
-        if (exports.invalidHandler) {
-          exports.invalidHandler(k, val, types[k], data)
-        } else if (exports.invalidHandler !== false) {
-          debug("invalid: "+k+"="+val, types[k])
-        }
-        return remove
-      }
-      debug("validated val", d, val, types[k])
-      return d[k]
-    }).filter(function (val) { return val !== remove })
-
-    if (!val.length) delete data[k]
-    else if (isArray) {
-      debug(isArray, data[k], val)
-      data[k] = val
-    } else data[k] = val[0]
-
-    debug("k=%s val=%j", k, val, data[k])
-  })
-}
-
-function validateString (data, k, val) {
-  data[k] = String(val)
-}
-
-function validatePath (data, k, val) {
-  if (val === true) return false
-  if (val === null) return true
-
-  val = String(val)
-  var homePattern = process.platform === 'win32' ? /^~(\/|\\)/ : /^~\//
-  if (val.match(homePattern) && process.env.HOME) {
-    val = path.resolve(process.env.HOME, val.substr(2))
-  }
-  data[k] = path.resolve(String(val))
-  return true
-}
-
-function validateNumber (data, k, val) {
-  debug("validate Number %j %j %j", k, val, isNaN(val))
-  if (isNaN(val)) return false
-  data[k] = +val
-}
-
-function validateDate (data, k, val) {
-  debug("validate Date %j %j %j", k, val, Date.parse(val))
-  var s = Date.parse(val)
-  if (isNaN(s)) return false
-  data[k] = new Date(val)
-}
-
-function validateBoolean (data, k, val) {
-  if (val instanceof Boolean) val = val.valueOf()
-  else if (typeof val === "string") {
-    if (!isNaN(val)) val = !!(+val)
-    else if (val === "null" || val === "false") val = false
-    else val = true
-  } else val = !!val
-  data[k] = val
-}
-
-function validateUrl (data, k, val) {
-  val = url.parse(String(val))
-  if (!val.host) return false
-  data[k] = val.href
-}
-
-function validateStream (data, k, val) {
-  if (!(val instanceof Stream)) return false
-  data[k] = val
-}
-
-function validate (data, k, val, type, typeDefs) {
-  // arrays are lists of types.
-  if (Array.isArray(type)) {
-    for (var i = 0, l = type.length; i < l; i ++) {
-      if (type[i] === Array) continue
-      if (validate(data, k, val, type[i], typeDefs)) return true
-    }
-    delete data[k]
-    return false
-  }
-
-  // an array of anything?
-  if (type === Array) return true
-
-  // NaN is poisonous.  Means that something is not allowed.
-  if (type !== type) {
-    debug("Poison NaN", k, val, type)
-    delete data[k]
-    return false
-  }
-
-  // explicit list of values
-  if (val === type) {
-    debug("Explicitly allowed %j", val)
-    // if (isArray) (data[k] = data[k] || []).push(val)
-    // else data[k] = val
-    data[k] = val
-    return true
-  }
-
-  // now go through the list of typeDefs, validate against each one.
-  var ok = false
-    , types = Object.keys(typeDefs)
-  for (var i = 0, l = types.length; i < l; i ++) {
-    debug("test type %j %j %j", k, val, types[i])
-    var t = typeDefs[types[i]]
-    if (t &&
-      ((type && type.name && t.type && t.type.name) ? (type.name === t.type.name) : (type === t.type))) {
-      var d = {}
-      ok = false !== t.validate(d, k, val)
-      val = d[k]
-      if (ok) {
-        // if (isArray) (data[k] = data[k] || []).push(val)
-        // else data[k] = val
-        data[k] = val
-        break
-      }
-    }
-  }
-  debug("OK? %j (%j %j %j)", ok, k, val, types[i])
-
-  if (!ok) delete data[k]
-  return ok
-}
-
-function parse (args, data, remain, types, shorthands) {
-  debug("parse", args, data, remain)
-
-  var key = null
-    , abbrevs = abbrev(Object.keys(types))
-    , shortAbbr = abbrev(Object.keys(shorthands))
-
-  for (var i = 0; i < args.length; i ++) {
-    var arg = args[i]
-    debug("arg", arg)
-
-    if (arg.match(/^-{2,}$/)) {
-      // done with keys.
-      // the rest are args.
-      remain.push.apply(remain, args.slice(i + 1))
-      args[i] = "--"
-      break
-    }
-    var hadEq = false
-    if (arg.charAt(0) === "-" && arg.length > 1) {
-      if (arg.indexOf("=") !== -1) {
-        hadEq = true
-        var v = arg.split("=")
-        arg = v.shift()
-        v = v.join("=")
-        args.splice.apply(args, [i, 1].concat([arg, v]))
-      }
-
-      // see if it's a shorthand
-      // if so, splice and back up to re-parse it.
-      var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs)
-      debug("arg=%j shRes=%j", arg, shRes)
-      if (shRes) {
-        debug(arg, shRes)
-        args.splice.apply(args, [i, 1].concat(shRes))
-        if (arg !== shRes[0]) {
-          i --
-          continue
-        }
-      }
-      arg = arg.replace(/^-+/, "")
-      var no = null
-      while (arg.toLowerCase().indexOf("no-") === 0) {
-        no = !no
-        arg = arg.substr(3)
-      }
-
-      if (abbrevs[arg]) arg = abbrevs[arg]
-
-      var isArray = types[arg] === Array ||
-        Array.isArray(types[arg]) && types[arg].indexOf(Array) !== -1
-
-      // allow unknown things to be arrays if specified multiple times.
-      if (!types.hasOwnProperty(arg) && data.hasOwnProperty(arg)) {
-        if (!Array.isArray(data[arg]))
-          data[arg] = [data[arg]]
-        isArray = true
-      }
-
-      var val
-        , la = args[i + 1]
-
-      var isBool = typeof no === 'boolean' ||
-        types[arg] === Boolean ||
-        Array.isArray(types[arg]) && types[arg].indexOf(Boolean) !== -1 ||
-        (typeof types[arg] === 'undefined' && !hadEq) ||
-        (la === "false" &&
-         (types[arg] === null ||
-          Array.isArray(types[arg]) && ~types[arg].indexOf(null)))
-
-      if (isBool) {
-        // just set and move along
-        val = !no
-        // however, also support --bool true or --bool false
-        if (la === "true" || la === "false") {
-          val = JSON.parse(la)
-          la = null
-          if (no) val = !val
-          i ++
-        }
-
-        // also support "foo":[Boolean, "bar"] and "--foo bar"
-        if (Array.isArray(types[arg]) && la) {
-          if (~types[arg].indexOf(la)) {
-            // an explicit type
-            val = la
-            i ++
-          } else if ( la === "null" && ~types[arg].indexOf(null) ) {
-            // null allowed
-            val = null
-            i ++
-          } else if ( !la.match(/^-{2,}[^-]/) &&
-                      !isNaN(la) &&
-                      ~types[arg].indexOf(Number) ) {
-            // number
-            val = +la
-            i ++
-          } else if ( !la.match(/^-[^-]/) && ~types[arg].indexOf(String) ) {
-            // string
-            val = la
-            i ++
-          }
-        }
-
-        if (isArray) (data[arg] = data[arg] || []).push(val)
-        else data[arg] = val
-
-        continue
-      }
-
-      if (types[arg] === String && la === undefined)
-        la = ""
-
-      if (la && la.match(/^-{2,}$/)) {
-        la = undefined
-        i --
-      }
-
-      val = la === undefined ? true : la
-      if (isArray) (data[arg] = data[arg] || []).push(val)
-      else data[arg] = val
-
-      i ++
-      continue
-    }
-    remain.push(arg)
-  }
-}
-
-function resolveShort (arg, shorthands, shortAbbr, abbrevs) {
-  // handle single-char shorthands glommed together, like
-  // npm ls -glp, but only if there is one dash, and only if
-  // all of the chars are single-char shorthands, and it's
-  // not a match to some other abbrev.
-  arg = arg.replace(/^-+/, '')
-
-  // if it's an exact known option, then don't go any further
-  if (abbrevs[arg] === arg)
-    return null
-
-  // if it's an exact known shortopt, same deal
-  if (shorthands[arg]) {
-    // make it an array, if it's a list of words
-    if (shorthands[arg] && !Array.isArray(shorthands[arg]))
-      shorthands[arg] = shorthands[arg].split(/\s+/)
-
-    return shorthands[arg]
-  }
-
-  // first check to see if this arg is a set of single-char shorthands
-  var singles = shorthands.___singles
-  if (!singles) {
-    singles = Object.keys(shorthands).filter(function (s) {
-      return s.length === 1
-    }).reduce(function (l,r) {
-      l[r] = true
-      return l
-    }, {})
-    shorthands.___singles = singles
-    debug('shorthand singles', singles)
-  }
-
-  var chrs = arg.split("").filter(function (c) {
-    return singles[c]
-  })
-
-  if (chrs.join("") === arg) return chrs.map(function (c) {
-    return shorthands[c]
-  }).reduce(function (l, r) {
-    return l.concat(r)
-  }, [])
-
-
-  // if it's an arg abbrev, and not a literal shorthand, then prefer the arg
-  if (abbrevs[arg] && !shorthands[arg])
-    return null
-
-  // if it's an abbr for a shorthand, then use that
-  if (shortAbbr[arg])
-    arg = shortAbbr[arg]
-
-  // make it an array, if it's a list of words
-  if (shorthands[arg] && !Array.isArray(shorthands[arg]))
-    shorthands[arg] = shorthands[arg].split(/\s+/)
-
-  return shorthands[arg]
-}
diff --git a/node_modules/nopt/package.json b/node_modules/nopt/package.json
deleted file mode 100644
index 9e53a82..0000000
--- a/node_modules/nopt/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "_args": [
-    [
-      "nopt@3.0.6",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "nopt@3.0.6",
-  "_id": "nopt@3.0.6",
-  "_inBundle": false,
-  "_integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
-  "_location": "/nopt",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "nopt@3.0.6",
-    "name": "nopt",
-    "escapedName": "nopt",
-    "rawSpec": "3.0.6",
-    "saveSpec": null,
-    "fetchSpec": "3.0.6"
-  },
-  "_requiredBy": [
-    "/",
-    "/istanbul"
-  ],
-  "_resolved": "http://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
-  "_spec": "3.0.6",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Isaac Z. Schlueter",
-    "email": "i@izs.me",
-    "url": "http://blog.izs.me/"
-  },
-  "bin": {
-    "nopt": "./bin/nopt.js"
-  },
-  "bugs": {
-    "url": "https://github.com/npm/nopt/issues"
-  },
-  "dependencies": {
-    "abbrev": "1"
-  },
-  "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.",
-  "devDependencies": {
-    "tap": "^1.2.0"
-  },
-  "homepage": "https://github.com/npm/nopt#readme",
-  "license": "ISC",
-  "main": "lib/nopt.js",
-  "name": "nopt",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/nopt.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "3.0.6"
-}
diff --git a/node_modules/nopt/test/basic.js b/node_modules/nopt/test/basic.js
deleted file mode 100644
index d399de9..0000000
--- a/node_modules/nopt/test/basic.js
+++ /dev/null
@@ -1,273 +0,0 @@
-var nopt = require("../")
-  , test = require('tap').test
-
-
-test("passing a string results in a string", function (t) {
-  var parsed = nopt({ key: String }, {}, ["--key", "myvalue"], 0)
-  t.same(parsed.key, "myvalue")
-  t.end()
-})
-
-// https://github.com/npm/nopt/issues/31
-test("Empty String results in empty string, not true", function (t) {
-  var parsed = nopt({ empty: String }, {}, ["--empty"], 0)
-  t.same(parsed.empty, "")
-  t.end()
-})
-
-test("~ path is resolved to $HOME", function (t) {
-  var path = require("path")
-  if (!process.env.HOME) process.env.HOME = "/tmp"
-  var parsed = nopt({key: path}, {}, ["--key=~/val"], 0)
-  t.same(parsed.key, path.resolve(process.env.HOME, "val"))
-  t.end()
-})
-
-// https://github.com/npm/nopt/issues/24
-test("Unknown options are not parsed as numbers", function (t) {
-    var parsed = nopt({"parse-me": Number}, null, ['--leave-as-is=1.20', '--parse-me=1.20'], 0)
-    t.equal(parsed['leave-as-is'], '1.20')
-    t.equal(parsed['parse-me'], 1.2)
-    t.end()
-});
-
-// https://github.com/npm/nopt/issues/48
-test("Check types based on name of type", function (t) {
-  var parsed = nopt({"parse-me": {name: "Number"}}, null, ['--parse-me=1.20'], 0)
-  t.equal(parsed['parse-me'], 1.2)
-  t.end()
-})
-
-
-test("Missing types are not parsed", function (t) {
-  var parsed = nopt({"parse-me": {}}, null, ['--parse-me=1.20'], 0)
-  //should only contain argv
-  t.equal(Object.keys(parsed).length, 1)
-  t.end()
-})
-
-test("Types passed without a name are not parsed", function (t) {
-  var parsed = nopt({"parse-me": {}}, {}, ['--parse-me=1.20'], 0)
-  //should only contain argv
-  t.equal(Object.keys(parsed).length, 1)
-  t.end()
-})
-
-test("other tests", function (t) {
-
-  var util = require("util")
-    , Stream = require("stream")
-    , path = require("path")
-    , url = require("url")
-
-    , shorthands =
-      { s : ["--loglevel", "silent"]
-      , d : ["--loglevel", "info"]
-      , dd : ["--loglevel", "verbose"]
-      , ddd : ["--loglevel", "silly"]
-      , noreg : ["--no-registry"]
-      , reg : ["--registry"]
-      , "no-reg" : ["--no-registry"]
-      , silent : ["--loglevel", "silent"]
-      , verbose : ["--loglevel", "verbose"]
-      , h : ["--usage"]
-      , H : ["--usage"]
-      , "?" : ["--usage"]
-      , help : ["--usage"]
-      , v : ["--version"]
-      , f : ["--force"]
-      , desc : ["--description"]
-      , "no-desc" : ["--no-description"]
-      , "local" : ["--no-global"]
-      , l : ["--long"]
-      , p : ["--parseable"]
-      , porcelain : ["--parseable"]
-      , g : ["--global"]
-      }
-
-    , types =
-      { aoa: Array
-      , nullstream: [null, Stream]
-      , date: Date
-      , str: String
-      , browser : String
-      , cache : path
-      , color : ["always", Boolean]
-      , depth : Number
-      , description : Boolean
-      , dev : Boolean
-      , editor : path
-      , force : Boolean
-      , global : Boolean
-      , globalconfig : path
-      , group : [String, Number]
-      , gzipbin : String
-      , logfd : [Number, Stream]
-      , loglevel : ["silent","win","error","warn","info","verbose","silly"]
-      , long : Boolean
-      , "node-version" : [false, String]
-      , npaturl : url
-      , npat : Boolean
-      , "onload-script" : [false, String]
-      , outfd : [Number, Stream]
-      , parseable : Boolean
-      , pre: Boolean
-      , prefix: path
-      , proxy : url
-      , "rebuild-bundle" : Boolean
-      , registry : url
-      , searchopts : String
-      , searchexclude: [null, String]
-      , shell : path
-      , t: [Array, String]
-      , tag : String
-      , tar : String
-      , tmp : path
-      , "unsafe-perm" : Boolean
-      , usage : Boolean
-      , user : String
-      , username : String
-      , userconfig : path
-      , version : Boolean
-      , viewer: path
-      , _exit : Boolean
-      , path: path
-      }
-
-  ; [["-v", {version:true}, []]
-    ,["---v", {version:true}, []]
-    ,["ls -s --no-reg connect -d",
-      {loglevel:"info",registry:null},["ls","connect"]]
-    ,["ls ---s foo",{loglevel:"silent"},["ls","foo"]]
-    ,["ls --registry blargle", {}, ["ls"]]
-    ,["--no-registry", {registry:null}, []]
-    ,["--no-color true", {color:false}, []]
-    ,["--no-color false", {color:true}, []]
-    ,["--no-color", {color:false}, []]
-    ,["--color false", {color:false}, []]
-    ,["--color --logfd 7", {logfd:7,color:true}, []]
-    ,["--color=true", {color:true}, []]
-    ,["--logfd=10", {logfd:10}, []]
-    ,["--tmp=/tmp -tar=gtar",{tmp:"/tmp",tar:"gtar"},[]]
-    ,["--tmp=tmp -tar=gtar",
-      {tmp:path.resolve(process.cwd(), "tmp"),tar:"gtar"},[]]
-    ,["--logfd x", {}, []]
-    ,["a -true -- -no-false", {true:true},["a","-no-false"]]
-    ,["a -no-false", {false:false},["a"]]
-    ,["a -no-no-true", {true:true}, ["a"]]
-    ,["a -no-no-no-false", {false:false}, ["a"]]
-    ,["---NO-no-No-no-no-no-nO-no-no"+
-      "-No-no-no-no-no-no-no-no-no"+
-      "-no-no-no-no-NO-NO-no-no-no-no-no-no"+
-      "-no-body-can-do-the-boogaloo-like-I-do"
-     ,{"body-can-do-the-boogaloo-like-I-do":false}, []]
-    ,["we are -no-strangers-to-love "+
-      "--you-know=the-rules --and=so-do-i "+
-      "---im-thinking-of=a-full-commitment "+
-      "--no-you-would-get-this-from-any-other-guy "+
-      "--no-gonna-give-you-up "+
-      "-no-gonna-let-you-down=true "+
-      "--no-no-gonna-run-around false "+
-      "--desert-you=false "+
-      "--make-you-cry false "+
-      "--no-tell-a-lie "+
-      "--no-no-and-hurt-you false"
-     ,{"strangers-to-love":false
-      ,"you-know":"the-rules"
-      ,"and":"so-do-i"
-      ,"you-would-get-this-from-any-other-guy":false
-      ,"gonna-give-you-up":false
-      ,"gonna-let-you-down":false
-      ,"gonna-run-around":false
-      ,"desert-you":false
-      ,"make-you-cry":false
-      ,"tell-a-lie":false
-      ,"and-hurt-you":false
-      },["we", "are"]]
-    ,["-t one -t two -t three"
-     ,{t: ["one", "two", "three"]}
-     ,[]]
-    ,["-t one -t null -t three four five null"
-     ,{t: ["one", "null", "three"]}
-     ,["four", "five", "null"]]
-    ,["-t foo"
-     ,{t:["foo"]}
-     ,[]]
-    ,["--no-t"
-     ,{t:["false"]}
-     ,[]]
-    ,["-no-no-t"
-     ,{t:["true"]}
-     ,[]]
-    ,["-aoa one -aoa null -aoa 100"
-     ,{aoa:["one", null, '100']}
-     ,[]]
-    ,["-str 100"
-     ,{str:"100"}
-     ,[]]
-    ,["--color always"
-     ,{color:"always"}
-     ,[]]
-    ,["--no-nullstream"
-     ,{nullstream:null}
-     ,[]]
-    ,["--nullstream false"
-     ,{nullstream:null}
-     ,[]]
-    ,["--notadate=2011-01-25"
-     ,{notadate: "2011-01-25"}
-     ,[]]
-    ,["--date 2011-01-25"
-     ,{date: new Date("2011-01-25")}
-     ,[]]
-    ,["-cl 1"
-     ,{config: true, length: 1}
-     ,[]
-     ,{config: Boolean, length: Number, clear: Boolean}
-     ,{c: "--config", l: "--length"}]
-    ,["--acount bla"
-     ,{"acount":true}
-     ,["bla"]
-     ,{account: Boolean, credentials: Boolean, options: String}
-     ,{a:"--account", c:"--credentials",o:"--options"}]
-    ,["--clear"
-     ,{clear:true}
-     ,[]
-     ,{clear:Boolean,con:Boolean,len:Boolean,exp:Boolean,add:Boolean,rep:Boolean}
-     ,{c:"--con",l:"--len",e:"--exp",a:"--add",r:"--rep"}]
-    ,["--file -"
-     ,{"file":"-"}
-     ,[]
-     ,{file:String}
-     ,{}]
-    ,["--file -"
-     ,{"file":true}
-     ,["-"]
-     ,{file:Boolean}
-     ,{}]
-    ,["--path"
-     ,{"path":null}
-     ,[]]
-    ,["--path ."
-     ,{"path":process.cwd()}
-     ,[]]
-    ].forEach(function (test) {
-      var argv = test[0].split(/\s+/)
-        , opts = test[1]
-        , rem = test[2]
-        , actual = nopt(test[3] || types, test[4] || shorthands, argv, 0)
-        , parsed = actual.argv
-      delete actual.argv
-      for (var i in opts) {
-        var e = JSON.stringify(opts[i])
-          , a = JSON.stringify(actual[i] === undefined ? null : actual[i])
-        if (e && typeof e === "object") {
-          t.deepEqual(e, a)
-        } else {
-          t.equal(e, a)
-        }
-      }
-      t.deepEqual(rem, parsed.remain)
-    })
-  t.end()
-})
diff --git a/node_modules/once/LICENSE b/node_modules/once/LICENSE
deleted file mode 100644
index 19129e3..0000000
--- a/node_modules/once/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/once/README.md b/node_modules/once/README.md
deleted file mode 100644
index 1f1ffca..0000000
--- a/node_modules/once/README.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# once
-
-Only call a function once.
-
-## usage
-
-```javascript
-var once = require('once')
-
-function load (file, cb) {
-  cb = once(cb)
-  loader.load('file')
-  loader.once('load', cb)
-  loader.once('error', cb)
-}
-```
-
-Or add to the Function.prototype in a responsible way:
-
-```javascript
-// only has to be done once
-require('once').proto()
-
-function load (file, cb) {
-  cb = cb.once()
-  loader.load('file')
-  loader.once('load', cb)
-  loader.once('error', cb)
-}
-```
-
-Ironically, the prototype feature makes this module twice as
-complicated as necessary.
-
-To check whether you function has been called, use `fn.called`. Once the
-function is called for the first time the return value of the original
-function is saved in `fn.value` and subsequent calls will continue to
-return this value.
-
-```javascript
-var once = require('once')
-
-function load (cb) {
-  cb = once(cb)
-  var stream = createStream()
-  stream.once('data', cb)
-  stream.once('end', function () {
-    if (!cb.called) cb(new Error('not found'))
-  })
-}
-```
-
-## `once.strict(func)`
-
-Throw an error if the function is called twice.
-
-Some functions are expected to be called only once. Using `once` for them would
-potentially hide logical errors.
-
-In the example below, the `greet` function has to call the callback only once:
-
-```javascript
-function greet (name, cb) {
-  // return is missing from the if statement
-  // when no name is passed, the callback is called twice
-  if (!name) cb('Hello anonymous')
-  cb('Hello ' + name)
-}
-
-function log (msg) {
-  console.log(msg)
-}
-
-// this will print 'Hello anonymous' but the logical error will be missed
-greet(null, once(msg))
-
-// once.strict will print 'Hello anonymous' and throw an error when the callback will be called the second time
-greet(null, once.strict(msg))
-```
diff --git a/node_modules/once/once.js b/node_modules/once/once.js
deleted file mode 100644
index 2354067..0000000
--- a/node_modules/once/once.js
+++ /dev/null
@@ -1,42 +0,0 @@
-var wrappy = require('wrappy')
-module.exports = wrappy(once)
-module.exports.strict = wrappy(onceStrict)
-
-once.proto = once(function () {
-  Object.defineProperty(Function.prototype, 'once', {
-    value: function () {
-      return once(this)
-    },
-    configurable: true
-  })
-
-  Object.defineProperty(Function.prototype, 'onceStrict', {
-    value: function () {
-      return onceStrict(this)
-    },
-    configurable: true
-  })
-})
-
-function once (fn) {
-  var f = function () {
-    if (f.called) return f.value
-    f.called = true
-    return f.value = fn.apply(this, arguments)
-  }
-  f.called = false
-  return f
-}
-
-function onceStrict (fn) {
-  var f = function () {
-    if (f.called)
-      throw new Error(f.onceError)
-    f.called = true
-    return f.value = fn.apply(this, arguments)
-  }
-  var name = fn.name || 'Function wrapped with `once`'
-  f.onceError = name + " shouldn't be called more than once"
-  f.called = false
-  return f
-}
diff --git a/node_modules/once/package.json b/node_modules/once/package.json
deleted file mode 100644
index 5bb2ae5..0000000
--- a/node_modules/once/package.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
-  "_args": [
-    [
-      "once@1.4.0",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "once@1.4.0",
-  "_id": "once@1.4.0",
-  "_inBundle": false,
-  "_integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-  "_location": "/once",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "once@1.4.0",
-    "name": "once",
-    "escapedName": "once",
-    "rawSpec": "1.4.0",
-    "saveSpec": null,
-    "fetchSpec": "1.4.0"
-  },
-  "_requiredBy": [
-    "/eslint/glob",
-    "/glob",
-    "/globby/glob",
-    "/inflight",
-    "/istanbul",
-    "/jasmine/glob",
-    "/rimraf/glob"
-  ],
-  "_resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-  "_spec": "1.4.0",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Isaac Z. Schlueter",
-    "email": "i@izs.me",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/once/issues"
-  },
-  "dependencies": {
-    "wrappy": "1"
-  },
-  "description": "Run a function exactly one time",
-  "devDependencies": {
-    "tap": "^7.0.1"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "files": [
-    "once.js"
-  ],
-  "homepage": "https://github.com/isaacs/once#readme",
-  "keywords": [
-    "once",
-    "function",
-    "one",
-    "single"
-  ],
-  "license": "ISC",
-  "main": "once.js",
-  "name": "once",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/once.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "1.4.0"
-}
diff --git a/node_modules/os-homedir/index.js b/node_modules/os-homedir/index.js
deleted file mode 100644
index 3306616..0000000
--- a/node_modules/os-homedir/index.js
+++ /dev/null
@@ -1,24 +0,0 @@
-'use strict';
-var os = require('os');
-
-function homedir() {
-	var env = process.env;
-	var home = env.HOME;
-	var user = env.LOGNAME || env.USER || env.LNAME || env.USERNAME;
-
-	if (process.platform === 'win32') {
-		return env.USERPROFILE || env.HOMEDRIVE + env.HOMEPATH || home || null;
-	}
-
-	if (process.platform === 'darwin') {
-		return home || (user ? '/Users/' + user : null);
-	}
-
-	if (process.platform === 'linux') {
-		return home || (process.getuid() === 0 ? '/root' : (user ? '/home/' + user : null));
-	}
-
-	return home || null;
-}
-
-module.exports = typeof os.homedir === 'function' ? os.homedir : homedir;
diff --git a/node_modules/os-homedir/license b/node_modules/os-homedir/license
deleted file mode 100644
index 654d0bf..0000000
--- a/node_modules/os-homedir/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/node_modules/os-homedir/package.json b/node_modules/os-homedir/package.json
deleted file mode 100644
index 0b84445..0000000
--- a/node_modules/os-homedir/package.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "_args": [
-    [
-      "os-homedir@1.0.2",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "os-homedir@1.0.2",
-  "_id": "os-homedir@1.0.2",
-  "_inBundle": false,
-  "_integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
-  "_location": "/os-homedir",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "os-homedir@1.0.2",
-    "name": "os-homedir",
-    "escapedName": "os-homedir",
-    "rawSpec": "1.0.2",
-    "saveSpec": null,
-    "fetchSpec": "1.0.2"
-  },
-  "_requiredBy": [
-    "/osenv"
-  ],
-  "_resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
-  "_spec": "1.0.2",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Sindre Sorhus",
-    "email": "sindresorhus@gmail.com",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/os-homedir/issues"
-  },
-  "description": "Node.js 4 `os.homedir()` ponyfill",
-  "devDependencies": {
-    "ava": "*",
-    "path-exists": "^2.0.0",
-    "xo": "^0.16.0"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/os-homedir#readme",
-  "keywords": [
-    "builtin",
-    "core",
-    "ponyfill",
-    "polyfill",
-    "shim",
-    "os",
-    "homedir",
-    "home",
-    "dir",
-    "directory",
-    "folder",
-    "user",
-    "path"
-  ],
-  "license": "MIT",
-  "name": "os-homedir",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/os-homedir.git"
-  },
-  "scripts": {
-    "test": "xo && ava"
-  },
-  "version": "1.0.2"
-}
diff --git a/node_modules/os-homedir/readme.md b/node_modules/os-homedir/readme.md
deleted file mode 100644
index 856ae61..0000000
--- a/node_modules/os-homedir/readme.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# os-homedir [![Build Status](https://travis-ci.org/sindresorhus/os-homedir.svg?branch=master)](https://travis-ci.org/sindresorhus/os-homedir)
-
-> Node.js 4 [`os.homedir()`](https://nodejs.org/api/os.html#os_os_homedir) [ponyfill](https://ponyfill.com)
-
-
-## Install
-
-```
-$ npm install --save os-homedir
-```
-
-
-## Usage
-
-```js
-const osHomedir = require('os-homedir');
-
-console.log(osHomedir());
-//=> '/Users/sindresorhus'
-```
-
-
-## Related
-
-- [user-home](https://github.com/sindresorhus/user-home) - Same as this module but caches the result
-- [home-or-tmp](https://github.com/sindresorhus/home-or-tmp) - Get the user home directory with fallback to the system temp directory
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/os-tmpdir/index.js b/node_modules/os-tmpdir/index.js
deleted file mode 100644
index 2077b1c..0000000
--- a/node_modules/os-tmpdir/index.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-var isWindows = process.platform === 'win32';
-var trailingSlashRe = isWindows ? /[^:]\\$/ : /.\/$/;
-
-// https://github.com/nodejs/node/blob/3e7a14381497a3b73dda68d05b5130563cdab420/lib/os.js#L25-L43
-module.exports = function () {
-	var path;
-
-	if (isWindows) {
-		path = process.env.TEMP ||
-			process.env.TMP ||
-			(process.env.SystemRoot || process.env.windir) + '\\temp';
-	} else {
-		path = process.env.TMPDIR ||
-			process.env.TMP ||
-			process.env.TEMP ||
-			'/tmp';
-	}
-
-	if (trailingSlashRe.test(path)) {
-		path = path.slice(0, -1);
-	}
-
-	return path;
-};
diff --git a/node_modules/os-tmpdir/license b/node_modules/os-tmpdir/license
deleted file mode 100644
index 654d0bf..0000000
--- a/node_modules/os-tmpdir/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/node_modules/os-tmpdir/package.json b/node_modules/os-tmpdir/package.json
deleted file mode 100644
index 9516858..0000000
--- a/node_modules/os-tmpdir/package.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
-  "_args": [
-    [
-      "os-tmpdir@1.0.2",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "os-tmpdir@1.0.2",
-  "_id": "os-tmpdir@1.0.2",
-  "_inBundle": false,
-  "_integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-  "_location": "/os-tmpdir",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "os-tmpdir@1.0.2",
-    "name": "os-tmpdir",
-    "escapedName": "os-tmpdir",
-    "rawSpec": "1.0.2",
-    "saveSpec": null,
-    "fetchSpec": "1.0.2"
-  },
-  "_requiredBy": [
-    "/osenv",
-    "/tmp"
-  ],
-  "_resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-  "_spec": "1.0.2",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Sindre Sorhus",
-    "email": "sindresorhus@gmail.com",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/os-tmpdir/issues"
-  },
-  "description": "Node.js os.tmpdir() ponyfill",
-  "devDependencies": {
-    "ava": "*",
-    "xo": "^0.16.0"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/os-tmpdir#readme",
-  "keywords": [
-    "built-in",
-    "core",
-    "ponyfill",
-    "polyfill",
-    "shim",
-    "os",
-    "tmpdir",
-    "tempdir",
-    "tmp",
-    "temp",
-    "dir",
-    "directory",
-    "env",
-    "environment"
-  ],
-  "license": "MIT",
-  "name": "os-tmpdir",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/os-tmpdir.git"
-  },
-  "scripts": {
-    "test": "xo && ava"
-  },
-  "version": "1.0.2"
-}
diff --git a/node_modules/os-tmpdir/readme.md b/node_modules/os-tmpdir/readme.md
deleted file mode 100644
index c09f7ed..0000000
--- a/node_modules/os-tmpdir/readme.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# os-tmpdir [![Build Status](https://travis-ci.org/sindresorhus/os-tmpdir.svg?branch=master)](https://travis-ci.org/sindresorhus/os-tmpdir)
-
-> Node.js [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) [ponyfill](https://ponyfill.com)
-
-Use this instead of `require('os').tmpdir()` to get a consistent behavior on different Node.js versions (even 0.8).
-
-
-## Install
-
-```
-$ npm install --save os-tmpdir
-```
-
-
-## Usage
-
-```js
-const osTmpdir = require('os-tmpdir');
-
-osTmpdir();
-//=> '/var/folders/m3/5574nnhn0yj488ccryqr7tc80000gn/T'
-```
-
-
-## API
-
-See the [`os.tmpdir()` docs](https://nodejs.org/api/os.html#os_os_tmpdir).
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/osenv/.npmignore b/node_modules/osenv/.npmignore
deleted file mode 100644
index 8c23dee..0000000
--- a/node_modules/osenv/.npmignore
+++ /dev/null
@@ -1,13 +0,0 @@
-*.swp
-.*.swp
-
-.DS_Store
-*~
-.project
-.settings
-npm-debug.log
-coverage.html
-.idea
-lib-cov
-
-node_modules
diff --git a/node_modules/osenv/.travis.yml b/node_modules/osenv/.travis.yml
deleted file mode 100644
index 99f2bbf..0000000
--- a/node_modules/osenv/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: node_js
-language: node_js
-node_js:
-  - '0.8'
-  - '0.10'
-  - '0.12'
-  - 'iojs'
-before_install:
-  - npm install -g npm@latest
diff --git a/node_modules/osenv/LICENSE b/node_modules/osenv/LICENSE
deleted file mode 100644
index 19129e3..0000000
--- a/node_modules/osenv/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/osenv/README.md b/node_modules/osenv/README.md
deleted file mode 100644
index 08fd900..0000000
--- a/node_modules/osenv/README.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# osenv
-
-Look up environment settings specific to different operating systems.
-
-## Usage
-
-```javascript
-var osenv = require('osenv')
-var path = osenv.path()
-var user = osenv.user()
-// etc.
-
-// Some things are not reliably in the env, and have a fallback command:
-var h = osenv.hostname(function (er, hostname) {
-  h = hostname
-})
-// This will still cause it to be memoized, so calling osenv.hostname()
-// is now an immediate operation.
-
-// You can always send a cb, which will get called in the nextTick
-// if it's been memoized, or wait for the fallback data if it wasn't
-// found in the environment.
-osenv.hostname(function (er, hostname) {
-  if (er) console.error('error looking up hostname')
-  else console.log('this machine calls itself %s', hostname)
-})
-```
-
-## osenv.hostname()
-
-The machine name.  Calls `hostname` if not found.
-
-## osenv.user()
-
-The currently logged-in user.  Calls `whoami` if not found.
-
-## osenv.prompt()
-
-Either PS1 on unix, or PROMPT on Windows.
-
-## osenv.tmpdir()
-
-The place where temporary files should be created.
-
-## osenv.home()
-
-No place like it.
-
-## osenv.path()
-
-An array of the places that the operating system will search for
-executables.
-
-## osenv.editor() 
-
-Return the executable name of the editor program.  This uses the EDITOR
-and VISUAL environment variables, and falls back to `vi` on Unix, or
-`notepad.exe` on Windows.
-
-## osenv.shell()
-
-The SHELL on Unix, which Windows calls the ComSpec.  Defaults to 'bash'
-or 'cmd'.
diff --git a/node_modules/osenv/osenv.js b/node_modules/osenv/osenv.js
deleted file mode 100644
index 702a95b..0000000
--- a/node_modules/osenv/osenv.js
+++ /dev/null
@@ -1,72 +0,0 @@
-var isWindows = process.platform === 'win32'
-var path = require('path')
-var exec = require('child_process').exec
-var osTmpdir = require('os-tmpdir')
-var osHomedir = require('os-homedir')
-
-// looking up envs is a bit costly.
-// Also, sometimes we want to have a fallback
-// Pass in a callback to wait for the fallback on failures
-// After the first lookup, always returns the same thing.
-function memo (key, lookup, fallback) {
-  var fell = false
-  var falling = false
-  exports[key] = function (cb) {
-    var val = lookup()
-    if (!val && !fell && !falling && fallback) {
-      fell = true
-      falling = true
-      exec(fallback, function (er, output, stderr) {
-        falling = false
-        if (er) return // oh well, we tried
-        val = output.trim()
-      })
-    }
-    exports[key] = function (cb) {
-      if (cb) process.nextTick(cb.bind(null, null, val))
-      return val
-    }
-    if (cb && !falling) process.nextTick(cb.bind(null, null, val))
-    return val
-  }
-}
-
-memo('user', function () {
-  return ( isWindows
-         ? process.env.USERDOMAIN + '\\' + process.env.USERNAME
-         : process.env.USER
-         )
-}, 'whoami')
-
-memo('prompt', function () {
-  return isWindows ? process.env.PROMPT : process.env.PS1
-})
-
-memo('hostname', function () {
-  return isWindows ? process.env.COMPUTERNAME : process.env.HOSTNAME
-}, 'hostname')
-
-memo('tmpdir', function () {
-  return osTmpdir()
-})
-
-memo('home', function () {
-  return osHomedir()
-})
-
-memo('path', function () {
-  return (process.env.PATH ||
-          process.env.Path ||
-          process.env.path).split(isWindows ? ';' : ':')
-})
-
-memo('editor', function () {
-  return process.env.EDITOR ||
-         process.env.VISUAL ||
-         (isWindows ? 'notepad.exe' : 'vi')
-})
-
-memo('shell', function () {
-  return isWindows ? process.env.ComSpec || 'cmd'
-         : process.env.SHELL || 'bash'
-})
diff --git a/node_modules/osenv/package.json b/node_modules/osenv/package.json
deleted file mode 100644
index b1dfbd2..0000000
--- a/node_modules/osenv/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "_args": [
-    [
-      "osenv@0.1.4",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "osenv@0.1.4",
-  "_id": "osenv@0.1.4",
-  "_inBundle": false,
-  "_integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=",
-  "_location": "/osenv",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "osenv@0.1.4",
-    "name": "osenv",
-    "escapedName": "osenv",
-    "rawSpec": "0.1.4",
-    "saveSpec": null,
-    "fetchSpec": "0.1.4"
-  },
-  "_requiredBy": [
-    "/cordova-common"
-  ],
-  "_resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz",
-  "_spec": "0.1.4",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Isaac Z. Schlueter",
-    "email": "i@izs.me",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/npm/osenv/issues"
-  },
-  "dependencies": {
-    "os-homedir": "^1.0.0",
-    "os-tmpdir": "^1.0.0"
-  },
-  "description": "Look up environment settings specific to different operating systems",
-  "devDependencies": {
-    "tap": "^8.0.1"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "homepage": "https://github.com/npm/osenv#readme",
-  "keywords": [
-    "environment",
-    "variable",
-    "home",
-    "tmpdir",
-    "path",
-    "prompt",
-    "ps1"
-  ],
-  "license": "ISC",
-  "main": "osenv.js",
-  "name": "osenv",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/osenv.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "0.1.4"
-}
diff --git a/node_modules/osenv/test/unix.js b/node_modules/osenv/test/unix.js
deleted file mode 100644
index 94d4aaa..0000000
--- a/node_modules/osenv/test/unix.js
+++ /dev/null
@@ -1,71 +0,0 @@
-// only run this test on windows
-// pretending to be another platform is too hacky, since it breaks
-// how the underlying system looks up module paths and runs
-// child processes, and all that stuff is cached.
-var tap = require('tap')
-
-
-if (process.platform === 'win32') {
-  tap.plan(0, 'Skip unix tests, this is not unix')
-  process.exit(0)
-}
-
-// like unix, but funny
-process.env.USER = 'sirUser'
-process.env.HOME = '/home/sirUser'
-process.env.HOSTNAME = 'my-machine'
-process.env.TMPDIR = '/tmpdir'
-process.env.TMP = '/tmp'
-process.env.TEMP = '/temp'
-process.env.PATH = '/opt/local/bin:/usr/local/bin:/usr/bin/:bin'
-process.env.PS1 = '(o_o) $ '
-process.env.EDITOR = 'edit'
-process.env.VISUAL = 'visualedit'
-process.env.SHELL = 'zsh'
-
-tap.test('basic unix sanity test', function (t) {
-  var osenv = require('../osenv.js')
-
-  t.equal(osenv.user(), process.env.USER)
-  t.equal(osenv.home(), process.env.HOME)
-  t.equal(osenv.hostname(), process.env.HOSTNAME)
-  t.same(osenv.path(), process.env.PATH.split(':'))
-  t.equal(osenv.prompt(), process.env.PS1)
-  t.equal(osenv.tmpdir(), process.env.TMPDIR)
-
-  // mildly evil, but it's for a test.
-  process.env.TMPDIR = ''
-  delete require.cache[require.resolve('../osenv.js')]
-  var osenv = require('../osenv.js')
-  t.equal(osenv.tmpdir(), process.env.TMP)
-
-  process.env.TMP = ''
-  delete require.cache[require.resolve('../osenv.js')]
-  var osenv = require('../osenv.js')
-  t.equal(osenv.tmpdir(), process.env.TEMP)
-
-  process.env.TEMP = ''
-  delete require.cache[require.resolve('../osenv.js')]
-  var osenv = require('../osenv.js')
-  osenv.home = function () { return null }
-  t.equal(osenv.tmpdir(), '/tmp')
-
-  t.equal(osenv.editor(), 'edit')
-  process.env.EDITOR = ''
-  delete require.cache[require.resolve('../osenv.js')]
-  var osenv = require('../osenv.js')
-  t.equal(osenv.editor(), 'visualedit')
-
-  process.env.VISUAL = ''
-  delete require.cache[require.resolve('../osenv.js')]
-  var osenv = require('../osenv.js')
-  t.equal(osenv.editor(), 'vi')
-
-  t.equal(osenv.shell(), 'zsh')
-  process.env.SHELL = ''
-  delete require.cache[require.resolve('../osenv.js')]
-  var osenv = require('../osenv.js')
-  t.equal(osenv.shell(), 'bash')
-
-  t.end()
-})
diff --git a/node_modules/osenv/test/windows.js b/node_modules/osenv/test/windows.js
deleted file mode 100644
index c9d837a..0000000
--- a/node_modules/osenv/test/windows.js
+++ /dev/null
@@ -1,74 +0,0 @@
-// only run this test on windows
-// pretending to be another platform is too hacky, since it breaks
-// how the underlying system looks up module paths and runs
-// child processes, and all that stuff is cached.
-if (process.platform !== 'win32') {
-  console.log('TAP version 13\n' +
-              '1..0 # Skip windows tests, this is not windows\n')
-  return
-}
-
-// load this before clubbing the platform name.
-var tap = require('tap')
-
-process.env.windir = 'c:\\windows'
-process.env.USERDOMAIN = 'some-domain'
-process.env.USERNAME = 'sirUser'
-process.env.USERPROFILE = 'C:\\Users\\sirUser'
-process.env.COMPUTERNAME = 'my-machine'
-process.env.TMPDIR = 'C:\\tmpdir'
-process.env.TMP = 'C:\\tmp'
-process.env.TEMP = 'C:\\temp'
-process.env.Path = 'C:\\Program Files\\;C:\\Binary Stuff\\bin'
-process.env.PROMPT = '(o_o) $ '
-process.env.EDITOR = 'edit'
-process.env.VISUAL = 'visualedit'
-process.env.ComSpec = 'some-com'
-
-tap.test('basic windows sanity test', function (t) {
-  var osenv = require('../osenv.js')
-
-  t.equal(osenv.user(),
-          process.env.USERDOMAIN + '\\' + process.env.USERNAME)
-  t.equal(osenv.home(), process.env.USERPROFILE)
-  t.equal(osenv.hostname(), process.env.COMPUTERNAME)
-  t.same(osenv.path(), process.env.Path.split(';'))
-  t.equal(osenv.prompt(), process.env.PROMPT)
-  t.equal(osenv.tmpdir(), process.env.TMPDIR)
-
-  // mildly evil, but it's for a test.
-  process.env.TMPDIR = ''
-  delete require.cache[require.resolve('../osenv.js')]
-  var osenv = require('../osenv.js')
-  t.equal(osenv.tmpdir(), process.env.TMP)
-
-  process.env.TMP = ''
-  delete require.cache[require.resolve('../osenv.js')]
-  var osenv = require('../osenv.js')
-  t.equal(osenv.tmpdir(), process.env.TEMP)
-
-  process.env.TEMP = ''
-  delete require.cache[require.resolve('../osenv.js')]
-  var osenv = require('../osenv.js')
-  osenv.home = function () { return null }
-  t.equal(osenv.tmpdir(), 'c:\\windows\\temp')
-
-  t.equal(osenv.editor(), 'edit')
-  process.env.EDITOR = ''
-  delete require.cache[require.resolve('../osenv.js')]
-  var osenv = require('../osenv.js')
-  t.equal(osenv.editor(), 'visualedit')
-
-  process.env.VISUAL = ''
-  delete require.cache[require.resolve('../osenv.js')]
-  var osenv = require('../osenv.js')
-  t.equal(osenv.editor(), 'notepad.exe')
-
-  t.equal(osenv.shell(), 'some-com')
-  process.env.ComSpec = ''
-  delete require.cache[require.resolve('../osenv.js')]
-  var osenv = require('../osenv.js')
-  t.equal(osenv.shell(), 'cmd')
-
-  t.end()
-})
diff --git a/node_modules/osenv/x.tap b/node_modules/osenv/x.tap
deleted file mode 100644
index 90d8472..0000000
--- a/node_modules/osenv/x.tap
+++ /dev/null
@@ -1,39 +0,0 @@
-TAP version 13
-    # Subtest: test/unix.js
-    TAP version 13
-        # Subtest: basic unix sanity test
-        ok 1 - should be equal
-        ok 2 - should be equal
-        ok 3 - should be equal
-        ok 4 - should be equivalent
-        ok 5 - should be equal
-        ok 6 - should be equal
-        ok 7 - should be equal
-        ok 8 - should be equal
-        ok 9 - should be equal
-        ok 10 - should be equal
-        ok 11 - should be equal
-        ok 12 - should be equal
-        ok 13 - should be equal
-        ok 14 - should be equal
-        1..14
-    ok 1 - basic unix sanity test # time=10.712ms
-
-    1..1
-    # time=18.422ms
-ok 1 - test/unix.js # time=169.827ms
-
-    # Subtest: test/windows.js
-    TAP version 13
-    1..0 # Skip windows tests, this is not windows
-
-ok 2 - test/windows.js # SKIP Skip windows tests, this is not windows
-
-    # Subtest: test/nada.js
-    TAP version 13
-    1..0
-
-ok 2 - test/nada.js
-
-1..3
-# time=274.247ms
diff --git a/node_modules/path-is-absolute/index.js b/node_modules/path-is-absolute/index.js
deleted file mode 100644
index 22aa6c3..0000000
--- a/node_modules/path-is-absolute/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-function posix(path) {
-	return path.charAt(0) === '/';
-}
-
-function win32(path) {
-	// https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56
-	var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;
-	var result = splitDeviceRe.exec(path);
-	var device = result[1] || '';
-	var isUnc = Boolean(device && device.charAt(1) !== ':');
-
-	// UNC paths are always absolute
-	return Boolean(result[2] || isUnc);
-}
-
-module.exports = process.platform === 'win32' ? win32 : posix;
-module.exports.posix = posix;
-module.exports.win32 = win32;
diff --git a/node_modules/path-is-absolute/license b/node_modules/path-is-absolute/license
deleted file mode 100644
index 654d0bf..0000000
--- a/node_modules/path-is-absolute/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/node_modules/path-is-absolute/package.json b/node_modules/path-is-absolute/package.json
deleted file mode 100644
index 6673400..0000000
--- a/node_modules/path-is-absolute/package.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
-  "_args": [
-    [
-      "path-is-absolute@1.0.1",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "path-is-absolute@1.0.1",
-  "_id": "path-is-absolute@1.0.1",
-  "_inBundle": false,
-  "_integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-  "_location": "/path-is-absolute",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "path-is-absolute@1.0.1",
-    "name": "path-is-absolute",
-    "escapedName": "path-is-absolute",
-    "rawSpec": "1.0.1",
-    "saveSpec": null,
-    "fetchSpec": "1.0.1"
-  },
-  "_requiredBy": [
-    "/eslint/glob",
-    "/glob",
-    "/globby/glob",
-    "/jasmine/glob",
-    "/rimraf/glob"
-  ],
-  "_resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-  "_spec": "1.0.1",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Sindre Sorhus",
-    "email": "sindresorhus@gmail.com",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/path-is-absolute/issues"
-  },
-  "description": "Node.js 0.12 path.isAbsolute() ponyfill",
-  "devDependencies": {
-    "xo": "^0.16.0"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/path-is-absolute#readme",
-  "keywords": [
-    "path",
-    "paths",
-    "file",
-    "dir",
-    "absolute",
-    "isabsolute",
-    "is-absolute",
-    "built-in",
-    "util",
-    "utils",
-    "core",
-    "ponyfill",
-    "polyfill",
-    "shim",
-    "is",
-    "detect",
-    "check"
-  ],
-  "license": "MIT",
-  "name": "path-is-absolute",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/path-is-absolute.git"
-  },
-  "scripts": {
-    "test": "xo && node test.js"
-  },
-  "version": "1.0.1"
-}
diff --git a/node_modules/path-is-absolute/readme.md b/node_modules/path-is-absolute/readme.md
deleted file mode 100644
index 8dbdf5f..0000000
--- a/node_modules/path-is-absolute/readme.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# path-is-absolute [![Build Status](https://travis-ci.org/sindresorhus/path-is-absolute.svg?branch=master)](https://travis-ci.org/sindresorhus/path-is-absolute)
-
-> Node.js 0.12 [`path.isAbsolute()`](http://nodejs.org/api/path.html#path_path_isabsolute_path) [ponyfill](https://ponyfill.com)
-
-
-## Install
-
-```
-$ npm install --save path-is-absolute
-```
-
-
-## Usage
-
-```js
-const pathIsAbsolute = require('path-is-absolute');
-
-// Running on Linux
-pathIsAbsolute('/home/foo');
-//=> true
-pathIsAbsolute('C:/Users/foo');
-//=> false
-
-// Running on Windows
-pathIsAbsolute('C:/Users/foo');
-//=> true
-pathIsAbsolute('/home/foo');
-//=> false
-
-// Running on any OS
-pathIsAbsolute.posix('/home/foo');
-//=> true
-pathIsAbsolute.posix('C:/Users/foo');
-//=> false
-pathIsAbsolute.win32('C:/Users/foo');
-//=> true
-pathIsAbsolute.win32('/home/foo');
-//=> false
-```
-
-
-## API
-
-See the [`path.isAbsolute()` docs](http://nodejs.org/api/path.html#path_path_isabsolute_path).
-
-### pathIsAbsolute(path)
-
-### pathIsAbsolute.posix(path)
-
-POSIX specific version.
-
-### pathIsAbsolute.win32(path)
-
-Windows specific version.
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/node_modules/plist/.jshintrc b/node_modules/plist/.jshintrc
deleted file mode 100644
index 3f42622..0000000
--- a/node_modules/plist/.jshintrc
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "laxbreak": true,
-  "laxcomma": true
-}
diff --git a/node_modules/plist/.travis.yml b/node_modules/plist/.travis.yml
deleted file mode 100644
index f82fbdc..0000000
--- a/node_modules/plist/.travis.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-language: node_js
-node_js:
-- '0.10'
-- '0.11'
-- '4.0'
-- '4.1'
-env:
-  global:
-  - secure: xlLmWO7akYQjmDgrv6/b/ZMGILF8FReD+k6A/u8pYRD2JW29hhwvRwIQGcKp9+zmJdn4i5M4D1/qJkCeI3pdhAYBDHvzHOHSEwLJz1ESB2Crv6fa69CtpIufQkWvIxmZoU49tCaLpMBaIroGihJ4DAXdIVOIz6Ur9vXLDhGsE4c=
-  - secure: aQ46RdxL10xR5ZJJTMUKdH5k4tdrzgZ87nlwHC+pTr6bfRw3UKYC+6Rm7yQpg9wq0Io9O9dYCP007gQGSWstbjr1+jXNu/ubtNG+q5cpWBQZZZ013VHh9QJTf1MnetsZxbv8Yhrjg590s6vruT0oqesOnB2CizO/BsKxnY37Nos=
-matrix:
-  include:
-  - node_js: '0.10'
-    env: BROWSER_NAME=chrome BROWSER_VERSION=latest
-  - node_js: '0.10'
-    env: BROWSER_NAME=chrome BROWSER_VERSION=29
-  - node_js: '0.10'
-    env: BROWSER_NAME=firefox BROWSER_VERSION=latest
-  - node_js: '0.10'
-    env: BROWSER_NAME=opera BROWSER_VERSION=latest
-  - node_js: '0.10'
-    env: BROWSER_NAME=safari BROWSER_VERSION=latest
-  - node_js: '0.10'
-    env: BROWSER_NAME=safari BROWSER_VERSION=7
-  - node_js: '0.10'
-    env: BROWSER_NAME=safari BROWSER_VERSION=6
-  - node_js: '0.10'
-    env: BROWSER_NAME=safari BROWSER_VERSION=5
-  - node_js: '0.10'
-    env: BROWSER_NAME=ie BROWSER_VERSION=11
-  - node_js: '0.10'
-    env: BROWSER_NAME=ie BROWSER_VERSION=10
-  - node_js: '0.10'
-    env: BROWSER_NAME=ie BROWSER_VERSION=9
diff --git a/node_modules/plist/History.md b/node_modules/plist/History.md
deleted file mode 100644
index 73f36ae..0000000
--- a/node_modules/plist/History.md
+++ /dev/null
@@ -1,122 +0,0 @@
-1.2.0 / 2015-11-10
-
-* package: update "browserify" to v12.0.1
-* package: update "zuul" to v3.7.2
-* package: update "xmlbuilder" to v4.0.0
-* package: update "util-deprecate" to v1.0.2
-* package: update "mocha" to v2.3.3
-* package: update "base64-js" to v0.0.8
-* build: omit undefined values
-* travis: add node 4.0 and 4.1 to test matrix
-
-1.1.0 / 2014-08-27
-==================
-
- * package: update "browserify" to v5.10.1
- * package: update "zuul" to v1.10.2
- * README: add "Sauce Test Status" build badge
- * travis: use new "plistjs" sauce credentials
- * travis: set up zuul saucelabs automated testing
-
-1.0.1 / 2014-06-25
-==================
-
-  * add .zuul.yml file for browser testing
-  * remove Testling stuff
-  * build: fix global variable `val` leak
-  * package: use --check-leaks when running mocha tests
-  * README: update examples to use preferred API
-  * package: add "browser" keyword
-
-1.0.0 / 2014-05-20
-==================
-
-  * package: remove "android-browser"
-  * test: add <dict> build() test
-  * test: re-add the empty string build() test
-  * test: remove "fixtures" and legacy "tests" dir
-  * test: add some more build() tests
-  * test: add a parse() CDATA test
-  * test: starting on build() tests
-  * test: more parse() tests
-  * package: attempt to fix "android-browser" testling
-  * parse: better <data> with newline handling
-  * README: add Testling badge
-  * test: add <data> node tests
-  * test: add a <date> parse() test
-  * travis: don't test node v0.6 or v0.8
-  * test: some more parse() tests
-  * test: add simple <string> parsing test
-  * build: add support for an optional "opts" object
-  * package: test mobile devices
-  * test: use multiline to inline the XML
-  * package: beautify
-  * package: fix "mocha" harness
-  * package: more testling browsers
-  * build: add the "version=1.0" attribute
-  * beginnings of "mocha" tests
-  * build: more JSDocs
-  * tests: add test that ensures that empty string conversion works
-  * build: update "xmlbuilder" to v2.2.1
-  * parse: ignore comment and cdata nodes
-  * tests: make the "Newlines" test actually contain a newline
-  * parse: lint
-  * test travis
-  * README: add Travis CI badge
-  * add .travis.yml file
-  * build: updated DTD to reflect name change
-  * parse: return falsey values in an Array plist
-  * build: fix encoding a typed array in the browser
-  * build: add support for Typed Arrays and ArrayBuffers
-  * build: more lint
-  * build: slight cleanup and optimizations
-  * build: use .txt() for the "date" value
-  * parse: always return a Buffer for <data> nodes
-  * build: don't interpret Strings as base64
-  * dist: commit prebuilt plist*.js files
-  * parse: fix typo in deprecate message
-  * parse: fix parse() return value
-  * parse: add jsdoc comments for the deprecated APIs
-  * parse: add `parse()` function
-  * node, parse: use `util-deprecate` module
-  * re-implemented parseFile to be asynchronous
-  * node: fix jsdoc comment
-  * Makefile: fix "node" require stubbing
-  * examples: add "browser" example
-  * package: tweak "main"
-  * package: remove "engines" field
-  * Makefile: fix --exclude command for browserify
-  * package: update "description"
-  * lib: more styling
-  * Makefile: add -build.js and -parse.js dist files
-  * lib: separate out the parse and build logic into their own files
-  * Makefile: add makefile with browserify build rules
-  * package: add "browserify" as a dev dependency
-  * plist: tabs to spaces (again)
-  * add a .jshintrc file
-  * LICENSE: update
-  * node-webkit support
-  * Ignore tests/ in .npmignore file
-  * Remove duplicate devDependencies key
-  * Remove trailing whitespace
-  * adding recent contributors. Bumping npm package number (patch release)
-  * Fixed node.js string handling
-  * bumping version number
-  * Fixed global variable plist leak
-  * patch release 0.4.1
-  * removed temporary debug output file
-  * flipping the cases for writing data and string elements in build(). removed the 125 length check. Added validation of base64 encoding for data fields when parsing. added unit tests.
-  * fixed syntax errors in README examples (issue #20)
-  * added Sync versions of calls. added deprecation warnings for old method calls. updated documentation. If the resulting object from parseStringSync is an array with 1 element, return just the element. If a plist string or file doesnt have a <plist> tag as the document root element, fail noisily (issue #15)
-  * incrementing package version
-  * added cross platform base64 encode/decode for data elements (issue #17.) Comments and hygiene.
-  * refactored the code to use a DOM parser instead of SAX. closes issues #5 and #16
-  * rolling up package version
-  * updated base64 detection regexp. updated README. hygiene.
-  * refactored the build function. Fixes issue #14
-  * refactored tests. Modified tests from issue #9. thanks @sylvinus
-  * upgrade xmlbuilder package version. this is why .end() was needed in last commit; breaking change to xmlbuilder lib. :/
-  * bug fix in build function, forgot to call .end() Refactored tests to use nodeunit
-  * Implemented support for real, identity tests
-  * Refactored base64 detection - still sloppy, fixed date building. Passing tests OK.
-  * Implemented basic plist builder that turns an existing JS object into plist XML. date, real and data types still need to be implemented.
diff --git a/node_modules/plist/LICENSE b/node_modules/plist/LICENSE
deleted file mode 100644
index 04a9e91..0000000
--- a/node_modules/plist/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2010-2014 Nathan Rajlich <nathan@tootallnate.net>
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/plist/Makefile b/node_modules/plist/Makefile
deleted file mode 100644
index 62695e0..0000000
--- a/node_modules/plist/Makefile
+++ /dev/null
@@ -1,76 +0,0 @@
-
-# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
-THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
-THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
-
-# BIN directory
-BIN := $(THIS_DIR)/node_modules/.bin
-
-# applications
-NODE ?= node
-NPM ?= $(NODE) $(shell which npm)
-BROWSERIFY ?= $(NODE) $(BIN)/browserify
-MOCHA ?= $(NODE) $(BIN)/mocha
-ZUUL ?= $(NODE) $(BIN)/zuul
-
-REPORTER ?= spec
-
-all: dist/plist.js dist/plist-build.js dist/plist-parse.js
-
-install: node_modules
-
-clean:
-	@rm -rf node_modules dist
-
-dist:
-	@mkdir -p $@
-
-dist/plist-build.js: node_modules lib/build.js dist
-	@$(BROWSERIFY) \
-		--standalone plist \
-		lib/build.js > $@
-
-dist/plist-parse.js: node_modules lib/parse.js dist
-	@$(BROWSERIFY) \
-		--standalone plist \
-		lib/parse.js > $@
-
-dist/plist.js: node_modules lib/*.js dist
-	@$(BROWSERIFY) \
-		--standalone plist \
-		--ignore lib/node.js \
-		lib/plist.js > $@
-
-node_modules: package.json
-	@NODE_ENV= $(NPM) install
-	@touch node_modules
-
-test:
-	@if [ "x$(BROWSER_NAME)" = "x" ]; then \
-		$(MAKE) test-node; \
-		else \
-		$(MAKE) test-zuul; \
-	fi
-
-test-node:
-	@$(MOCHA) \
-		--reporter $(REPORTER) \
-		test/*.js
-
-test-zuul:
-	@if [ "x$(BROWSER_PLATFORM)" = "x" ]; then \
-		$(ZUUL) \
-		--ui mocha-bdd \
-		--browser-name $(BROWSER_NAME) \
-		--browser-version $(BROWSER_VERSION) \
-		test/*.js; \
-		else \
-		$(ZUUL) \
-		--ui mocha-bdd \
-		--browser-name $(BROWSER_NAME) \
-		--browser-version $(BROWSER_VERSION) \
-		--browser-platform "$(BROWSER_PLATFORM)" \
-		test/*.js; \
-	fi
-
-.PHONY: all install clean test test-node test-zuul
diff --git a/node_modules/plist/README.md b/node_modules/plist/README.md
deleted file mode 100644
index 4d0310a..0000000
--- a/node_modules/plist/README.md
+++ /dev/null
@@ -1,113 +0,0 @@
-plist.js
-========
-### Mac OS X Plist parser/builder for Node.js and browsers
-
-[![Sauce Test Status](https://saucelabs.com/browser-matrix/plistjs.svg)](https://saucelabs.com/u/plistjs)
-
-[![Build Status](https://travis-ci.org/TooTallNate/plist.js.svg?branch=master)](https://travis-ci.org/TooTallNate/plist.js)
-
-Provides facilities for reading and writing Mac OS X Plist (property list)
-files. These are often used in programming OS X and iOS applications, as
-well as the iTunes configuration XML file.
-
-Plist files represent stored programming "object"s. They are very similar
-to JSON. A valid Plist file is representable as a native JavaScript Object
-and vice-versa.
-
-
-## Usage
-
-### Node.js
-
-Install using `npm`:
-
-``` bash
-$ npm install --save plist
-```
-
-Then `require()` the _plist_ module in your file:
-
-``` js
-var plist = require('plist');
-
-// now use the `parse()` and `build()` functions
-var val = plist.parse('<plist><string>Hello World!</string></plist>');
-console.log(val);  // "Hello World!"
-```
-
-
-### Browser
-
-Include the `dist/plist.js` in a `<script>` tag in your HTML file:
-
-``` html
-<script src="plist.js"></script>
-<script>
-  // now use the `parse()` and `build()` functions
-  var val = plist.parse('<plist><string>Hello World!</string></plist>');
-  console.log(val);  // "Hello World!"
-</script>
-```
-
-
-## API
-
-### Parsing
-
-Parsing a plist from filename:
-
-``` javascript
-var fs = require('fs');
-var plist = require('plist');
-
-var obj = plist.parse(fs.readFileSync('myPlist.plist', 'utf8'));
-console.log(JSON.stringify(obj));
-```
-
-Parsing a plist from string payload:
-
-``` javascript
-var plist = require('plist');
-
-var obj = plist.parse('<plist><string>Hello World!</string></plist>');
-console.log(obj);  // Hello World!
-```
-
-### Building
-
-Given an existing JavaScript Object, you can turn it into an XML document
-that complies with the plist DTD:
-
-``` javascript
-var plist = require('plist');
-
-console.log(plist.build({ foo: 'bar' }));
-```
-
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2010-2014 Nathan Rajlich <nathan@tootallnate.net>
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/plist/dist/plist-build.js b/node_modules/plist/dist/plist-build.js
deleted file mode 100644
index 4fcd378..0000000
--- a/node_modules/plist/dist/plist-build.js
+++ /dev/null
@@ -1,3982 +0,0 @@
-(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.plist = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-(function (Buffer){
-
-/**
- * Module dependencies.
- */
-
-var base64 = require('base64-js');
-var xmlbuilder = require('xmlbuilder');
-
-/**
- * Module exports.
- */
-
-exports.build = build;
-
-/**
- * Accepts a `Date` instance and returns an ISO date string.
- *
- * @param {Date} d - Date instance to serialize
- * @returns {String} ISO date string representation of `d`
- * @api private
- */
-
-function ISODateString(d){
-  function pad(n){
-    return n < 10 ? '0' + n : n;
-  }
-  return d.getUTCFullYear()+'-'
-    + pad(d.getUTCMonth()+1)+'-'
-    + pad(d.getUTCDate())+'T'
-    + pad(d.getUTCHours())+':'
-    + pad(d.getUTCMinutes())+':'
-    + pad(d.getUTCSeconds())+'Z';
-}
-
-/**
- * Returns the internal "type" of `obj` via the
- * `Object.prototype.toString()` trick.
- *
- * @param {Mixed} obj - any value
- * @returns {String} the internal "type" name
- * @api private
- */
-
-var toString = Object.prototype.toString;
-function type (obj) {
-  var m = toString.call(obj).match(/\[object (.*)\]/);
-  return m ? m[1] : m;
-}
-
-/**
- * Generate an XML plist string from the input object `obj`.
- *
- * @param {Object} obj - the object to convert
- * @param {Object} [opts] - optional options object
- * @returns {String} converted plist XML string
- * @api public
- */
-
-function build (obj, opts) {
-  var XMLHDR = {
-    version: '1.0',
-    encoding: 'UTF-8'
-  };
-
-  var XMLDTD = {
-    pubid: '-//Apple//DTD PLIST 1.0//EN',
-    sysid: 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'
-  };
-
-  var doc = xmlbuilder.create('plist');
-
-  doc.dec(XMLHDR.version, XMLHDR.encoding, XMLHDR.standalone);
-  doc.dtd(XMLDTD.pubid, XMLDTD.sysid);
-  doc.att('version', '1.0');
-
-  walk_obj(obj, doc);
-
-  if (!opts) opts = {};
-  // default `pretty` to `true`
-  opts.pretty = opts.pretty !== false;
-  return doc.end(opts);
-}
-
-/**
- * depth first, recursive traversal of a javascript object. when complete,
- * next_child contains a reference to the build XML object.
- *
- * @api private
- */
-
-function walk_obj(next, next_child) {
-  var tag_type, i, prop;
-  var name = type(next);
-
-  if ('Undefined' == name) {
-    return;
-  } else if (Array.isArray(next)) {
-    next_child = next_child.ele('array');
-    for (i = 0; i < next.length; i++) {
-      walk_obj(next[i], next_child);
-    }
-
-  } else if (Buffer.isBuffer(next)) {
-    next_child.ele('data').raw(next.toString('base64'));
-
-  } else if ('Object' == name) {
-    next_child = next_child.ele('dict');
-    for (prop in next) {
-      if (next.hasOwnProperty(prop)) {
-        next_child.ele('key').txt(prop);
-        walk_obj(next[prop], next_child);
-      }
-    }
-
-  } else if ('Number' == name) {
-    // detect if this is an integer or real
-    // TODO: add an ability to force one way or another via a "cast"
-    tag_type = (next % 1 === 0) ? 'integer' : 'real';
-    next_child.ele(tag_type).txt(next.toString());
-
-  } else if ('Date' == name) {
-    next_child.ele('date').txt(ISODateString(new Date(next)));
-
-  } else if ('Boolean' == name) {
-    next_child.ele(next ? 'true' : 'false');
-
-  } else if ('String' == name) {
-    next_child.ele('string').txt(next);
-
-  } else if ('ArrayBuffer' == name) {
-    next_child.ele('data').raw(base64.fromByteArray(next));
-
-  } else if (next && next.buffer && 'ArrayBuffer' == type(next.buffer)) {
-    // a typed array
-    next_child.ele('data').raw(base64.fromByteArray(new Uint8Array(next.buffer), next_child));
-
-  }
-}
-
-}).call(this,{"isBuffer":require("../node_modules/is-buffer/index.js")})
-},{"../node_modules/is-buffer/index.js":3,"base64-js":2,"xmlbuilder":79}],2:[function(require,module,exports){
-var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
-
-;(function (exports) {
-	'use strict';
-
-  var Arr = (typeof Uint8Array !== 'undefined')
-    ? Uint8Array
-    : Array
-
-	var PLUS   = '+'.charCodeAt(0)
-	var SLASH  = '/'.charCodeAt(0)
-	var NUMBER = '0'.charCodeAt(0)
-	var LOWER  = 'a'.charCodeAt(0)
-	var UPPER  = 'A'.charCodeAt(0)
-	var PLUS_URL_SAFE = '-'.charCodeAt(0)
-	var SLASH_URL_SAFE = '_'.charCodeAt(0)
-
-	function decode (elt) {
-		var code = elt.charCodeAt(0)
-		if (code === PLUS ||
-		    code === PLUS_URL_SAFE)
-			return 62 // '+'
-		if (code === SLASH ||
-		    code === SLASH_URL_SAFE)
-			return 63 // '/'
-		if (code < NUMBER)
-			return -1 //no match
-		if (code < NUMBER + 10)
-			return code - NUMBER + 26 + 26
-		if (code < UPPER + 26)
-			return code - UPPER
-		if (code < LOWER + 26)
-			return code - LOWER + 26
-	}
-
-	function b64ToByteArray (b64) {
-		var i, j, l, tmp, placeHolders, arr
-
-		if (b64.length % 4 > 0) {
-			throw new Error('Invalid string. Length must be a multiple of 4')
-		}
-
-		// the number of equal signs (place holders)
-		// if there are two placeholders, than the two characters before it
-		// represent one byte
-		// if there is only one, then the three characters before it represent 2 bytes
-		// this is just a cheap hack to not do indexOf twice
-		var len = b64.length
-		placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
-
-		// base64 is 4/3 + up to two characters of the original data
-		arr = new Arr(b64.length * 3 / 4 - placeHolders)
-
-		// if there are placeholders, only get up to the last complete 4 chars
-		l = placeHolders > 0 ? b64.length - 4 : b64.length
-
-		var L = 0
-
-		function push (v) {
-			arr[L++] = v
-		}
-
-		for (i = 0, j = 0; i < l; i += 4, j += 3) {
-			tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
-			push((tmp & 0xFF0000) >> 16)
-			push((tmp & 0xFF00) >> 8)
-			push(tmp & 0xFF)
-		}
-
-		if (placeHolders === 2) {
-			tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
-			push(tmp & 0xFF)
-		} else if (placeHolders === 1) {
-			tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
-			push((tmp >> 8) & 0xFF)
-			push(tmp & 0xFF)
-		}
-
-		return arr
-	}
-
-	function uint8ToBase64 (uint8) {
-		var i,
-			extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
-			output = "",
-			temp, length
-
-		function encode (num) {
-			return lookup.charAt(num)
-		}
-
-		function tripletToBase64 (num) {
-			return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
-		}
-
-		// go through the array every three bytes, we'll deal with trailing stuff later
-		for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
-			temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
-			output += tripletToBase64(temp)
-		}
-
-		// pad the end with zeros, but make sure to not forget the extra bytes
-		switch (extraBytes) {
-			case 1:
-				temp = uint8[uint8.length - 1]
-				output += encode(temp >> 2)
-				output += encode((temp << 4) & 0x3F)
-				output += '=='
-				break
-			case 2:
-				temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
-				output += encode(temp >> 10)
-				output += encode((temp >> 4) & 0x3F)
-				output += encode((temp << 2) & 0x3F)
-				output += '='
-				break
-		}
-
-		return output
-	}
-
-	exports.toByteArray = b64ToByteArray
-	exports.fromByteArray = uint8ToBase64
-}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
-
-},{}],3:[function(require,module,exports){
-/**
- * Determine if an object is Buffer
- *
- * Author:   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
- * License:  MIT
- *
- * `npm install is-buffer`
- */
-
-module.exports = function (obj) {
-  return !!(obj != null &&
-    (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor)
-      (obj.constructor &&
-      typeof obj.constructor.isBuffer === 'function' &&
-      obj.constructor.isBuffer(obj))
-    ))
-}
-
-},{}],4:[function(require,module,exports){
-/**
- * Gets the last element of `array`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to query.
- * @returns {*} Returns the last element of `array`.
- * @example
- *
- * _.last([1, 2, 3]);
- * // => 3
- */
-function last(array) {
-  var length = array ? array.length : 0;
-  return length ? array[length - 1] : undefined;
-}
-
-module.exports = last;
-
-},{}],5:[function(require,module,exports){
-var arrayEvery = require('../internal/arrayEvery'),
-    baseCallback = require('../internal/baseCallback'),
-    baseEvery = require('../internal/baseEvery'),
-    isArray = require('../lang/isArray'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Checks if `predicate` returns truthy for **all** elements of `collection`.
- * The predicate is bound to `thisArg` and invoked with three arguments:
- * (value, index|key, collection).
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @alias all
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {boolean} Returns `true` if all elements pass the predicate check,
- *  else `false`.
- * @example
- *
- * _.every([true, 1, null, 'yes'], Boolean);
- * // => false
- *
- * var users = [
- *   { 'user': 'barney', 'active': false },
- *   { 'user': 'fred',   'active': false }
- * ];
- *
- * // using the `_.matches` callback shorthand
- * _.every(users, { 'user': 'barney', 'active': false });
- * // => false
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.every(users, 'active', false);
- * // => true
- *
- * // using the `_.property` callback shorthand
- * _.every(users, 'active');
- * // => false
- */
-function every(collection, predicate, thisArg) {
-  var func = isArray(collection) ? arrayEvery : baseEvery;
-  if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
-    predicate = undefined;
-  }
-  if (typeof predicate != 'function' || thisArg !== undefined) {
-    predicate = baseCallback(predicate, thisArg, 3);
-  }
-  return func(collection, predicate);
-}
-
-module.exports = every;
-
-},{"../internal/arrayEvery":7,"../internal/baseCallback":11,"../internal/baseEvery":15,"../internal/isIterateeCall":40,"../lang/isArray":49}],6:[function(require,module,exports){
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
-
-/**
- * Creates a function that invokes `func` with the `this` binding of the
- * created function and arguments from `start` and beyond provided as an array.
- *
- * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to apply a rest parameter to.
- * @param {number} [start=func.length-1] The start position of the rest parameter.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var say = _.restParam(function(what, names) {
- *   return what + ' ' + _.initial(names).join(', ') +
- *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
- * });
- *
- * say('hello', 'fred', 'barney', 'pebbles');
- * // => 'hello fred, barney, & pebbles'
- */
-function restParam(func, start) {
-  if (typeof func != 'function') {
-    throw new TypeError(FUNC_ERROR_TEXT);
-  }
-  start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);
-  return function() {
-    var args = arguments,
-        index = -1,
-        length = nativeMax(args.length - start, 0),
-        rest = Array(length);
-
-    while (++index < length) {
-      rest[index] = args[start + index];
-    }
-    switch (start) {
-      case 0: return func.call(this, rest);
-      case 1: return func.call(this, args[0], rest);
-      case 2: return func.call(this, args[0], args[1], rest);
-    }
-    var otherArgs = Array(start + 1);
-    index = -1;
-    while (++index < start) {
-      otherArgs[index] = args[index];
-    }
-    otherArgs[start] = rest;
-    return func.apply(this, otherArgs);
-  };
-}
-
-module.exports = restParam;
-
-},{}],7:[function(require,module,exports){
-/**
- * A specialized version of `_.every` for arrays without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {boolean} Returns `true` if all elements pass the predicate check,
- *  else `false`.
- */
-function arrayEvery(array, predicate) {
-  var index = -1,
-      length = array.length;
-
-  while (++index < length) {
-    if (!predicate(array[index], index, array)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-module.exports = arrayEvery;
-
-},{}],8:[function(require,module,exports){
-/**
- * A specialized version of `_.some` for arrays without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {boolean} Returns `true` if any element passes the predicate check,
- *  else `false`.
- */
-function arraySome(array, predicate) {
-  var index = -1,
-      length = array.length;
-
-  while (++index < length) {
-    if (predicate(array[index], index, array)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-module.exports = arraySome;
-
-},{}],9:[function(require,module,exports){
-var keys = require('../object/keys');
-
-/**
- * A specialized version of `_.assign` for customizing assigned values without
- * support for argument juggling, multiple sources, and `this` binding `customizer`
- * functions.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @param {Function} customizer The function to customize assigned values.
- * @returns {Object} Returns `object`.
- */
-function assignWith(object, source, customizer) {
-  var index = -1,
-      props = keys(source),
-      length = props.length;
-
-  while (++index < length) {
-    var key = props[index],
-        value = object[key],
-        result = customizer(value, source[key], key, object, source);
-
-    if ((result === result ? (result !== value) : (value === value)) ||
-        (value === undefined && !(key in object))) {
-      object[key] = result;
-    }
-  }
-  return object;
-}
-
-module.exports = assignWith;
-
-},{"../object/keys":58}],10:[function(require,module,exports){
-var baseCopy = require('./baseCopy'),
-    keys = require('../object/keys');
-
-/**
- * The base implementation of `_.assign` without support for argument juggling,
- * multiple sources, and `customizer` functions.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @returns {Object} Returns `object`.
- */
-function baseAssign(object, source) {
-  return source == null
-    ? object
-    : baseCopy(source, keys(source), object);
-}
-
-module.exports = baseAssign;
-
-},{"../object/keys":58,"./baseCopy":12}],11:[function(require,module,exports){
-var baseMatches = require('./baseMatches'),
-    baseMatchesProperty = require('./baseMatchesProperty'),
-    bindCallback = require('./bindCallback'),
-    identity = require('../utility/identity'),
-    property = require('../utility/property');
-
-/**
- * The base implementation of `_.callback` which supports specifying the
- * number of arguments to provide to `func`.
- *
- * @private
- * @param {*} [func=_.identity] The value to convert to a callback.
- * @param {*} [thisArg] The `this` binding of `func`.
- * @param {number} [argCount] The number of arguments to provide to `func`.
- * @returns {Function} Returns the callback.
- */
-function baseCallback(func, thisArg, argCount) {
-  var type = typeof func;
-  if (type == 'function') {
-    return thisArg === undefined
-      ? func
-      : bindCallback(func, thisArg, argCount);
-  }
-  if (func == null) {
-    return identity;
-  }
-  if (type == 'object') {
-    return baseMatches(func);
-  }
-  return thisArg === undefined
-    ? property(func)
-    : baseMatchesProperty(func, thisArg);
-}
-
-module.exports = baseCallback;
-
-},{"../utility/identity":61,"../utility/property":62,"./baseMatches":22,"./baseMatchesProperty":23,"./bindCallback":28}],12:[function(require,module,exports){
-/**
- * Copies properties of `source` to `object`.
- *
- * @private
- * @param {Object} source The object to copy properties from.
- * @param {Array} props The property names to copy.
- * @param {Object} [object={}] The object to copy properties to.
- * @returns {Object} Returns `object`.
- */
-function baseCopy(source, props, object) {
-  object || (object = {});
-
-  var index = -1,
-      length = props.length;
-
-  while (++index < length) {
-    var key = props[index];
-    object[key] = source[key];
-  }
-  return object;
-}
-
-module.exports = baseCopy;
-
-},{}],13:[function(require,module,exports){
-var isObject = require('../lang/isObject');
-
-/**
- * The base implementation of `_.create` without support for assigning
- * properties to the created object.
- *
- * @private
- * @param {Object} prototype The object to inherit from.
- * @returns {Object} Returns the new object.
- */
-var baseCreate = (function() {
-  function object() {}
-  return function(prototype) {
-    if (isObject(prototype)) {
-      object.prototype = prototype;
-      var result = new object;
-      object.prototype = undefined;
-    }
-    return result || {};
-  };
-}());
-
-module.exports = baseCreate;
-
-},{"../lang/isObject":53}],14:[function(require,module,exports){
-var baseForOwn = require('./baseForOwn'),
-    createBaseEach = require('./createBaseEach');
-
-/**
- * The base implementation of `_.forEach` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array|Object|string} Returns `collection`.
- */
-var baseEach = createBaseEach(baseForOwn);
-
-module.exports = baseEach;
-
-},{"./baseForOwn":17,"./createBaseEach":30}],15:[function(require,module,exports){
-var baseEach = require('./baseEach');
-
-/**
- * The base implementation of `_.every` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {boolean} Returns `true` if all elements pass the predicate check,
- *  else `false`
- */
-function baseEvery(collection, predicate) {
-  var result = true;
-  baseEach(collection, function(value, index, collection) {
-    result = !!predicate(value, index, collection);
-    return result;
-  });
-  return result;
-}
-
-module.exports = baseEvery;
-
-},{"./baseEach":14}],16:[function(require,module,exports){
-var createBaseFor = require('./createBaseFor');
-
-/**
- * The base implementation of `baseForIn` and `baseForOwn` which iterates
- * over `object` properties returned by `keysFunc` invoking `iteratee` for
- * each property. Iteratee functions may exit iteration early by explicitly
- * returning `false`.
- *
- * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {Function} keysFunc The function to get the keys of `object`.
- * @returns {Object} Returns `object`.
- */
-var baseFor = createBaseFor();
-
-module.exports = baseFor;
-
-},{"./createBaseFor":31}],17:[function(require,module,exports){
-var baseFor = require('./baseFor'),
-    keys = require('../object/keys');
-
-/**
- * The base implementation of `_.forOwn` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Object} Returns `object`.
- */
-function baseForOwn(object, iteratee) {
-  return baseFor(object, iteratee, keys);
-}
-
-module.exports = baseForOwn;
-
-},{"../object/keys":58,"./baseFor":16}],18:[function(require,module,exports){
-var toObject = require('./toObject');
-
-/**
- * The base implementation of `get` without support for string paths
- * and default values.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array} path The path of the property to get.
- * @param {string} [pathKey] The key representation of path.
- * @returns {*} Returns the resolved value.
- */
-function baseGet(object, path, pathKey) {
-  if (object == null) {
-    return;
-  }
-  if (pathKey !== undefined && pathKey in toObject(object)) {
-    path = [pathKey];
-  }
-  var index = 0,
-      length = path.length;
-
-  while (object != null && index < length) {
-    object = object[path[index++]];
-  }
-  return (index && index == length) ? object : undefined;
-}
-
-module.exports = baseGet;
-
-},{"./toObject":46}],19:[function(require,module,exports){
-var baseIsEqualDeep = require('./baseIsEqualDeep'),
-    isObject = require('../lang/isObject'),
-    isObjectLike = require('./isObjectLike');
-
-/**
- * The base implementation of `_.isEqual` without support for `this` binding
- * `customizer` functions.
- *
- * @private
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @param {Function} [customizer] The function to customize comparing values.
- * @param {boolean} [isLoose] Specify performing partial comparisons.
- * @param {Array} [stackA] Tracks traversed `value` objects.
- * @param {Array} [stackB] Tracks traversed `other` objects.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- */
-function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
-  if (value === other) {
-    return true;
-  }
-  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
-    return value !== value && other !== other;
-  }
-  return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);
-}
-
-module.exports = baseIsEqual;
-
-},{"../lang/isObject":53,"./baseIsEqualDeep":20,"./isObjectLike":43}],20:[function(require,module,exports){
-var equalArrays = require('./equalArrays'),
-    equalByTag = require('./equalByTag'),
-    equalObjects = require('./equalObjects'),
-    isArray = require('../lang/isArray'),
-    isTypedArray = require('../lang/isTypedArray');
-
-/** `Object#toString` result references. */
-var argsTag = '[object Arguments]',
-    arrayTag = '[object Array]',
-    objectTag = '[object Object]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * A specialized version of `baseIsEqual` for arrays and objects which performs
- * deep comparisons and tracks traversed objects enabling objects with circular
- * references to be compared.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Function} [customizer] The function to customize comparing objects.
- * @param {boolean} [isLoose] Specify performing partial comparisons.
- * @param {Array} [stackA=[]] Tracks traversed `value` objects.
- * @param {Array} [stackB=[]] Tracks traversed `other` objects.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
-function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
-  var objIsArr = isArray(object),
-      othIsArr = isArray(other),
-      objTag = arrayTag,
-      othTag = arrayTag;
-
-  if (!objIsArr) {
-    objTag = objToString.call(object);
-    if (objTag == argsTag) {
-      objTag = objectTag;
-    } else if (objTag != objectTag) {
-      objIsArr = isTypedArray(object);
-    }
-  }
-  if (!othIsArr) {
-    othTag = objToString.call(other);
-    if (othTag == argsTag) {
-      othTag = objectTag;
-    } else if (othTag != objectTag) {
-      othIsArr = isTypedArray(other);
-    }
-  }
-  var objIsObj = objTag == objectTag,
-      othIsObj = othTag == objectTag,
-      isSameTag = objTag == othTag;
-
-  if (isSameTag && !(objIsArr || objIsObj)) {
-    return equalByTag(object, other, objTag);
-  }
-  if (!isLoose) {
-    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
-        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
-
-    if (objIsWrapped || othIsWrapped) {
-      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
-    }
-  }
-  if (!isSameTag) {
-    return false;
-  }
-  // Assume cyclic values are equal.
-  // For more information on detecting circular references see https://es5.github.io/#JO.
-  stackA || (stackA = []);
-  stackB || (stackB = []);
-
-  var length = stackA.length;
-  while (length--) {
-    if (stackA[length] == object) {
-      return stackB[length] == other;
-    }
-  }
-  // Add `object` and `other` to the stack of traversed objects.
-  stackA.push(object);
-  stackB.push(other);
-
-  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);
-
-  stackA.pop();
-  stackB.pop();
-
-  return result;
-}
-
-module.exports = baseIsEqualDeep;
-
-},{"../lang/isArray":49,"../lang/isTypedArray":55,"./equalArrays":32,"./equalByTag":33,"./equalObjects":34}],21:[function(require,module,exports){
-var baseIsEqual = require('./baseIsEqual'),
-    toObject = require('./toObject');
-
-/**
- * The base implementation of `_.isMatch` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Object} object The object to inspect.
- * @param {Array} matchData The propery names, values, and compare flags to match.
- * @param {Function} [customizer] The function to customize comparing objects.
- * @returns {boolean} Returns `true` if `object` is a match, else `false`.
- */
-function baseIsMatch(object, matchData, customizer) {
-  var index = matchData.length,
-      length = index,
-      noCustomizer = !customizer;
-
-  if (object == null) {
-    return !length;
-  }
-  object = toObject(object);
-  while (index--) {
-    var data = matchData[index];
-    if ((noCustomizer && data[2])
-          ? data[1] !== object[data[0]]
-          : !(data[0] in object)
-        ) {
-      return false;
-    }
-  }
-  while (++index < length) {
-    data = matchData[index];
-    var key = data[0],
-        objValue = object[key],
-        srcValue = data[1];
-
-    if (noCustomizer && data[2]) {
-      if (objValue === undefined && !(key in object)) {
-        return false;
-      }
-    } else {
-      var result = customizer ? customizer(objValue, srcValue, key) : undefined;
-      if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
-module.exports = baseIsMatch;
-
-},{"./baseIsEqual":19,"./toObject":46}],22:[function(require,module,exports){
-var baseIsMatch = require('./baseIsMatch'),
-    getMatchData = require('./getMatchData'),
-    toObject = require('./toObject');
-
-/**
- * The base implementation of `_.matches` which does not clone `source`.
- *
- * @private
- * @param {Object} source The object of property values to match.
- * @returns {Function} Returns the new function.
- */
-function baseMatches(source) {
-  var matchData = getMatchData(source);
-  if (matchData.length == 1 && matchData[0][2]) {
-    var key = matchData[0][0],
-        value = matchData[0][1];
-
-    return function(object) {
-      if (object == null) {
-        return false;
-      }
-      return object[key] === value && (value !== undefined || (key in toObject(object)));
-    };
-  }
-  return function(object) {
-    return baseIsMatch(object, matchData);
-  };
-}
-
-module.exports = baseMatches;
-
-},{"./baseIsMatch":21,"./getMatchData":36,"./toObject":46}],23:[function(require,module,exports){
-var baseGet = require('./baseGet'),
-    baseIsEqual = require('./baseIsEqual'),
-    baseSlice = require('./baseSlice'),
-    isArray = require('../lang/isArray'),
-    isKey = require('./isKey'),
-    isStrictComparable = require('./isStrictComparable'),
-    last = require('../array/last'),
-    toObject = require('./toObject'),
-    toPath = require('./toPath');
-
-/**
- * The base implementation of `_.matchesProperty` which does not clone `srcValue`.
- *
- * @private
- * @param {string} path The path of the property to get.
- * @param {*} srcValue The value to compare.
- * @returns {Function} Returns the new function.
- */
-function baseMatchesProperty(path, srcValue) {
-  var isArr = isArray(path),
-      isCommon = isKey(path) && isStrictComparable(srcValue),
-      pathKey = (path + '');
-
-  path = toPath(path);
-  return function(object) {
-    if (object == null) {
-      return false;
-    }
-    var key = pathKey;
-    object = toObject(object);
-    if ((isArr || !isCommon) && !(key in object)) {
-      object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
-      if (object == null) {
-        return false;
-      }
-      key = last(path);
-      object = toObject(object);
-    }
-    return object[key] === srcValue
-      ? (srcValue !== undefined || (key in object))
-      : baseIsEqual(srcValue, object[key], undefined, true);
-  };
-}
-
-module.exports = baseMatchesProperty;
-
-},{"../array/last":4,"../lang/isArray":49,"./baseGet":18,"./baseIsEqual":19,"./baseSlice":26,"./isKey":41,"./isStrictComparable":44,"./toObject":46,"./toPath":47}],24:[function(require,module,exports){
-/**
- * The base implementation of `_.property` without support for deep paths.
- *
- * @private
- * @param {string} key The key of the property to get.
- * @returns {Function} Returns the new function.
- */
-function baseProperty(key) {
-  return function(object) {
-    return object == null ? undefined : object[key];
-  };
-}
-
-module.exports = baseProperty;
-
-},{}],25:[function(require,module,exports){
-var baseGet = require('./baseGet'),
-    toPath = require('./toPath');
-
-/**
- * A specialized version of `baseProperty` which supports deep paths.
- *
- * @private
- * @param {Array|string} path The path of the property to get.
- * @returns {Function} Returns the new function.
- */
-function basePropertyDeep(path) {
-  var pathKey = (path + '');
-  path = toPath(path);
-  return function(object) {
-    return baseGet(object, path, pathKey);
-  };
-}
-
-module.exports = basePropertyDeep;
-
-},{"./baseGet":18,"./toPath":47}],26:[function(require,module,exports){
-/**
- * The base implementation of `_.slice` without an iteratee call guard.
- *
- * @private
- * @param {Array} array The array to slice.
- * @param {number} [start=0] The start position.
- * @param {number} [end=array.length] The end position.
- * @returns {Array} Returns the slice of `array`.
- */
-function baseSlice(array, start, end) {
-  var index = -1,
-      length = array.length;
-
-  start = start == null ? 0 : (+start || 0);
-  if (start < 0) {
-    start = -start > length ? 0 : (length + start);
-  }
-  end = (end === undefined || end > length) ? length : (+end || 0);
-  if (end < 0) {
-    end += length;
-  }
-  length = start > end ? 0 : ((end - start) >>> 0);
-  start >>>= 0;
-
-  var result = Array(length);
-  while (++index < length) {
-    result[index] = array[index + start];
-  }
-  return result;
-}
-
-module.exports = baseSlice;
-
-},{}],27:[function(require,module,exports){
-/**
- * Converts `value` to a string if it's not one. An empty string is returned
- * for `null` or `undefined` values.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- */
-function baseToString(value) {
-  return value == null ? '' : (value + '');
-}
-
-module.exports = baseToString;
-
-},{}],28:[function(require,module,exports){
-var identity = require('../utility/identity');
-
-/**
- * A specialized version of `baseCallback` which only supports `this` binding
- * and specifying the number of arguments to provide to `func`.
- *
- * @private
- * @param {Function} func The function to bind.
- * @param {*} thisArg The `this` binding of `func`.
- * @param {number} [argCount] The number of arguments to provide to `func`.
- * @returns {Function} Returns the callback.
- */
-function bindCallback(func, thisArg, argCount) {
-  if (typeof func != 'function') {
-    return identity;
-  }
-  if (thisArg === undefined) {
-    return func;
-  }
-  switch (argCount) {
-    case 1: return function(value) {
-      return func.call(thisArg, value);
-    };
-    case 3: return function(value, index, collection) {
-      return func.call(thisArg, value, index, collection);
-    };
-    case 4: return function(accumulator, value, index, collection) {
-      return func.call(thisArg, accumulator, value, index, collection);
-    };
-    case 5: return function(value, other, key, object, source) {
-      return func.call(thisArg, value, other, key, object, source);
-    };
-  }
-  return function() {
-    return func.apply(thisArg, arguments);
-  };
-}
-
-module.exports = bindCallback;
-
-},{"../utility/identity":61}],29:[function(require,module,exports){
-var bindCallback = require('./bindCallback'),
-    isIterateeCall = require('./isIterateeCall'),
-    restParam = require('../function/restParam');
-
-/**
- * Creates a `_.assign`, `_.defaults`, or `_.merge` function.
- *
- * @private
- * @param {Function} assigner The function to assign values.
- * @returns {Function} Returns the new assigner function.
- */
-function createAssigner(assigner) {
-  return restParam(function(object, sources) {
-    var index = -1,
-        length = object == null ? 0 : sources.length,
-        customizer = length > 2 ? sources[length - 2] : undefined,
-        guard = length > 2 ? sources[2] : undefined,
-        thisArg = length > 1 ? sources[length - 1] : undefined;
-
-    if (typeof customizer == 'function') {
-      customizer = bindCallback(customizer, thisArg, 5);
-      length -= 2;
-    } else {
-      customizer = typeof thisArg == 'function' ? thisArg : undefined;
-      length -= (customizer ? 1 : 0);
-    }
-    if (guard && isIterateeCall(sources[0], sources[1], guard)) {
-      customizer = length < 3 ? undefined : customizer;
-      length = 1;
-    }
-    while (++index < length) {
-      var source = sources[index];
-      if (source) {
-        assigner(object, source, customizer);
-      }
-    }
-    return object;
-  });
-}
-
-module.exports = createAssigner;
-
-},{"../function/restParam":6,"./bindCallback":28,"./isIterateeCall":40}],30:[function(require,module,exports){
-var getLength = require('./getLength'),
-    isLength = require('./isLength'),
-    toObject = require('./toObject');
-
-/**
- * Creates a `baseEach` or `baseEachRight` function.
- *
- * @private
- * @param {Function} eachFunc The function to iterate over a collection.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new base function.
- */
-function createBaseEach(eachFunc, fromRight) {
-  return function(collection, iteratee) {
-    var length = collection ? getLength(collection) : 0;
-    if (!isLength(length)) {
-      return eachFunc(collection, iteratee);
-    }
-    var index = fromRight ? length : -1,
-        iterable = toObject(collection);
-
-    while ((fromRight ? index-- : ++index < length)) {
-      if (iteratee(iterable[index], index, iterable) === false) {
-        break;
-      }
-    }
-    return collection;
-  };
-}
-
-module.exports = createBaseEach;
-
-},{"./getLength":35,"./isLength":42,"./toObject":46}],31:[function(require,module,exports){
-var toObject = require('./toObject');
-
-/**
- * Creates a base function for `_.forIn` or `_.forInRight`.
- *
- * @private
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new base function.
- */
-function createBaseFor(fromRight) {
-  return function(object, iteratee, keysFunc) {
-    var iterable = toObject(object),
-        props = keysFunc(object),
-        length = props.length,
-        index = fromRight ? length : -1;
-
-    while ((fromRight ? index-- : ++index < length)) {
-      var key = props[index];
-      if (iteratee(iterable[key], key, iterable) === false) {
-        break;
-      }
-    }
-    return object;
-  };
-}
-
-module.exports = createBaseFor;
-
-},{"./toObject":46}],32:[function(require,module,exports){
-var arraySome = require('./arraySome');
-
-/**
- * A specialized version of `baseIsEqualDeep` for arrays with support for
- * partial deep comparisons.
- *
- * @private
- * @param {Array} array The array to compare.
- * @param {Array} other The other array to compare.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Function} [customizer] The function to customize comparing arrays.
- * @param {boolean} [isLoose] Specify performing partial comparisons.
- * @param {Array} [stackA] Tracks traversed `value` objects.
- * @param {Array} [stackB] Tracks traversed `other` objects.
- * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
- */
-function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {
-  var index = -1,
-      arrLength = array.length,
-      othLength = other.length;
-
-  if (arrLength != othLength && !(isLoose && othLength > arrLength)) {
-    return false;
-  }
-  // Ignore non-index properties.
-  while (++index < arrLength) {
-    var arrValue = array[index],
-        othValue = other[index],
-        result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;
-
-    if (result !== undefined) {
-      if (result) {
-        continue;
-      }
-      return false;
-    }
-    // Recursively compare arrays (susceptible to call stack limits).
-    if (isLoose) {
-      if (!arraySome(other, function(othValue) {
-            return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
-          })) {
-        return false;
-      }
-    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {
-      return false;
-    }
-  }
-  return true;
-}
-
-module.exports = equalArrays;
-
-},{"./arraySome":8}],33:[function(require,module,exports){
-/** `Object#toString` result references. */
-var boolTag = '[object Boolean]',
-    dateTag = '[object Date]',
-    errorTag = '[object Error]',
-    numberTag = '[object Number]',
-    regexpTag = '[object RegExp]',
-    stringTag = '[object String]';
-
-/**
- * A specialized version of `baseIsEqualDeep` for comparing objects of
- * the same `toStringTag`.
- *
- * **Note:** This function only supports comparing values with tags of
- * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {string} tag The `toStringTag` of the objects to compare.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
-function equalByTag(object, other, tag) {
-  switch (tag) {
-    case boolTag:
-    case dateTag:
-      // Coerce dates and booleans to numbers, dates to milliseconds and booleans
-      // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.
-      return +object == +other;
-
-    case errorTag:
-      return object.name == other.name && object.message == other.message;
-
-    case numberTag:
-      // Treat `NaN` vs. `NaN` as equal.
-      return (object != +object)
-        ? other != +other
-        : object == +other;
-
-    case regexpTag:
-    case stringTag:
-      // Coerce regexes to strings and treat strings primitives and string
-      // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.
-      return object == (other + '');
-  }
-  return false;
-}
-
-module.exports = equalByTag;
-
-},{}],34:[function(require,module,exports){
-var keys = require('../object/keys');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * A specialized version of `baseIsEqualDeep` for objects with support for
- * partial deep comparisons.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Function} [customizer] The function to customize comparing values.
- * @param {boolean} [isLoose] Specify performing partial comparisons.
- * @param {Array} [stackA] Tracks traversed `value` objects.
- * @param {Array} [stackB] Tracks traversed `other` objects.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
-function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
-  var objProps = keys(object),
-      objLength = objProps.length,
-      othProps = keys(other),
-      othLength = othProps.length;
-
-  if (objLength != othLength && !isLoose) {
-    return false;
-  }
-  var index = objLength;
-  while (index--) {
-    var key = objProps[index];
-    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {
-      return false;
-    }
-  }
-  var skipCtor = isLoose;
-  while (++index < objLength) {
-    key = objProps[index];
-    var objValue = object[key],
-        othValue = other[key],
-        result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;
-
-    // Recursively compare objects (susceptible to call stack limits).
-    if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {
-      return false;
-    }
-    skipCtor || (skipCtor = key == 'constructor');
-  }
-  if (!skipCtor) {
-    var objCtor = object.constructor,
-        othCtor = other.constructor;
-
-    // Non `Object` object instances with different constructors are not equal.
-    if (objCtor != othCtor &&
-        ('constructor' in object && 'constructor' in other) &&
-        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
-          typeof othCtor == 'function' && othCtor instanceof othCtor)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-module.exports = equalObjects;
-
-},{"../object/keys":58}],35:[function(require,module,exports){
-var baseProperty = require('./baseProperty');
-
-/**
- * Gets the "length" property value of `object`.
- *
- * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
- * that affects Safari on at least iOS 8.1-8.3 ARM64.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {*} Returns the "length" value.
- */
-var getLength = baseProperty('length');
-
-module.exports = getLength;
-
-},{"./baseProperty":24}],36:[function(require,module,exports){
-var isStrictComparable = require('./isStrictComparable'),
-    pairs = require('../object/pairs');
-
-/**
- * Gets the propery names, values, and compare flags of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the match data of `object`.
- */
-function getMatchData(object) {
-  var result = pairs(object),
-      length = result.length;
-
-  while (length--) {
-    result[length][2] = isStrictComparable(result[length][1]);
-  }
-  return result;
-}
-
-module.exports = getMatchData;
-
-},{"../object/pairs":60,"./isStrictComparable":44}],37:[function(require,module,exports){
-var isNative = require('../lang/isNative');
-
-/**
- * Gets the native function at `key` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {string} key The key of the method to get.
- * @returns {*} Returns the function if it's native, else `undefined`.
- */
-function getNative(object, key) {
-  var value = object == null ? undefined : object[key];
-  return isNative(value) ? value : undefined;
-}
-
-module.exports = getNative;
-
-},{"../lang/isNative":52}],38:[function(require,module,exports){
-var getLength = require('./getLength'),
-    isLength = require('./isLength');
-
-/**
- * Checks if `value` is array-like.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- */
-function isArrayLike(value) {
-  return value != null && isLength(getLength(value));
-}
-
-module.exports = isArrayLike;
-
-},{"./getLength":35,"./isLength":42}],39:[function(require,module,exports){
-/** Used to detect unsigned integer values. */
-var reIsUint = /^\d+$/;
-
-/**
- * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
- * of an array-like value.
- */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/**
- * Checks if `value` is a valid array-like index.
- *
- * @private
- * @param {*} value The value to check.
- * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
- * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
- */
-function isIndex(value, length) {
-  value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
-  length = length == null ? MAX_SAFE_INTEGER : length;
-  return value > -1 && value % 1 == 0 && value < length;
-}
-
-module.exports = isIndex;
-
-},{}],40:[function(require,module,exports){
-var isArrayLike = require('./isArrayLike'),
-    isIndex = require('./isIndex'),
-    isObject = require('../lang/isObject');
-
-/**
- * Checks if the provided arguments are from an iteratee call.
- *
- * @private
- * @param {*} value The potential iteratee value argument.
- * @param {*} index The potential iteratee index or key argument.
- * @param {*} object The potential iteratee object argument.
- * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
- */
-function isIterateeCall(value, index, object) {
-  if (!isObject(object)) {
-    return false;
-  }
-  var type = typeof index;
-  if (type == 'number'
-      ? (isArrayLike(object) && isIndex(index, object.length))
-      : (type == 'string' && index in object)) {
-    var other = object[index];
-    return value === value ? (value === other) : (other !== other);
-  }
-  return false;
-}
-
-module.exports = isIterateeCall;
-
-},{"../lang/isObject":53,"./isArrayLike":38,"./isIndex":39}],41:[function(require,module,exports){
-var isArray = require('../lang/isArray'),
-    toObject = require('./toObject');
-
-/** Used to match property names within property paths. */
-var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,
-    reIsPlainProp = /^\w*$/;
-
-/**
- * Checks if `value` is a property name and not a property path.
- *
- * @private
- * @param {*} value The value to check.
- * @param {Object} [object] The object to query keys on.
- * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
- */
-function isKey(value, object) {
-  var type = typeof value;
-  if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {
-    return true;
-  }
-  if (isArray(value)) {
-    return false;
-  }
-  var result = !reIsDeepProp.test(value);
-  return result || (object != null && value in toObject(object));
-}
-
-module.exports = isKey;
-
-},{"../lang/isArray":49,"./toObject":46}],42:[function(require,module,exports){
-/**
- * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
- * of an array-like value.
- */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- */
-function isLength(value) {
-  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
-}
-
-module.exports = isLength;
-
-},{}],43:[function(require,module,exports){
-/**
- * Checks if `value` is object-like.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- */
-function isObjectLike(value) {
-  return !!value && typeof value == 'object';
-}
-
-module.exports = isObjectLike;
-
-},{}],44:[function(require,module,exports){
-var isObject = require('../lang/isObject');
-
-/**
- * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` if suitable for strict
- *  equality comparisons, else `false`.
- */
-function isStrictComparable(value) {
-  return value === value && !isObject(value);
-}
-
-module.exports = isStrictComparable;
-
-},{"../lang/isObject":53}],45:[function(require,module,exports){
-var isArguments = require('../lang/isArguments'),
-    isArray = require('../lang/isArray'),
-    isIndex = require('./isIndex'),
-    isLength = require('./isLength'),
-    keysIn = require('../object/keysIn');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * A fallback implementation of `Object.keys` which creates an array of the
- * own enumerable property names of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- */
-function shimKeys(object) {
-  var props = keysIn(object),
-      propsLength = props.length,
-      length = propsLength && object.length;
-
-  var allowIndexes = !!length && isLength(length) &&
-    (isArray(object) || isArguments(object));
-
-  var index = -1,
-      result = [];
-
-  while (++index < propsLength) {
-    var key = props[index];
-    if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
-      result.push(key);
-    }
-  }
-  return result;
-}
-
-module.exports = shimKeys;
-
-},{"../lang/isArguments":48,"../lang/isArray":49,"../object/keysIn":59,"./isIndex":39,"./isLength":42}],46:[function(require,module,exports){
-var isObject = require('../lang/isObject');
-
-/**
- * Converts `value` to an object if it's not one.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {Object} Returns the object.
- */
-function toObject(value) {
-  return isObject(value) ? value : Object(value);
-}
-
-module.exports = toObject;
-
-},{"../lang/isObject":53}],47:[function(require,module,exports){
-var baseToString = require('./baseToString'),
-    isArray = require('../lang/isArray');
-
-/** Used to match property names within property paths. */
-var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g;
-
-/** Used to match backslashes in property paths. */
-var reEscapeChar = /\\(\\)?/g;
-
-/**
- * Converts `value` to property path array if it's not one.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {Array} Returns the property path array.
- */
-function toPath(value) {
-  if (isArray(value)) {
-    return value;
-  }
-  var result = [];
-  baseToString(value).replace(rePropName, function(match, number, quote, string) {
-    result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
-  });
-  return result;
-}
-
-module.exports = toPath;
-
-},{"../lang/isArray":49,"./baseToString":27}],48:[function(require,module,exports){
-var isArrayLike = require('../internal/isArrayLike'),
-    isObjectLike = require('../internal/isObjectLike');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/** Native method references. */
-var propertyIsEnumerable = objectProto.propertyIsEnumerable;
-
-/**
- * Checks if `value` is classified as an `arguments` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isArguments(function() { return arguments; }());
- * // => true
- *
- * _.isArguments([1, 2, 3]);
- * // => false
- */
-function isArguments(value) {
-  return isObjectLike(value) && isArrayLike(value) &&
-    hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
-}
-
-module.exports = isArguments;
-
-},{"../internal/isArrayLike":38,"../internal/isObjectLike":43}],49:[function(require,module,exports){
-var getNative = require('../internal/getNative'),
-    isLength = require('../internal/isLength'),
-    isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var arrayTag = '[object Array]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeIsArray = getNative(Array, 'isArray');
-
-/**
- * Checks if `value` is classified as an `Array` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isArray([1, 2, 3]);
- * // => true
- *
- * _.isArray(function() { return arguments; }());
- * // => false
- */
-var isArray = nativeIsArray || function(value) {
-  return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
-};
-
-module.exports = isArray;
-
-},{"../internal/getNative":37,"../internal/isLength":42,"../internal/isObjectLike":43}],50:[function(require,module,exports){
-var isArguments = require('./isArguments'),
-    isArray = require('./isArray'),
-    isArrayLike = require('../internal/isArrayLike'),
-    isFunction = require('./isFunction'),
-    isObjectLike = require('../internal/isObjectLike'),
-    isString = require('./isString'),
-    keys = require('../object/keys');
-
-/**
- * Checks if `value` is empty. A value is considered empty unless it's an
- * `arguments` object, array, string, or jQuery-like collection with a length
- * greater than `0` or an object with own enumerable properties.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {Array|Object|string} value The value to inspect.
- * @returns {boolean} Returns `true` if `value` is empty, else `false`.
- * @example
- *
- * _.isEmpty(null);
- * // => true
- *
- * _.isEmpty(true);
- * // => true
- *
- * _.isEmpty(1);
- * // => true
- *
- * _.isEmpty([1, 2, 3]);
- * // => false
- *
- * _.isEmpty({ 'a': 1 });
- * // => false
- */
-function isEmpty(value) {
-  if (value == null) {
-    return true;
-  }
-  if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) ||
-      (isObjectLike(value) && isFunction(value.splice)))) {
-    return !value.length;
-  }
-  return !keys(value).length;
-}
-
-module.exports = isEmpty;
-
-},{"../internal/isArrayLike":38,"../internal/isObjectLike":43,"../object/keys":58,"./isArguments":48,"./isArray":49,"./isFunction":51,"./isString":54}],51:[function(require,module,exports){
-var isObject = require('./isObject');
-
-/** `Object#toString` result references. */
-var funcTag = '[object Function]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
-function isFunction(value) {
-  // The use of `Object#toString` avoids issues with the `typeof` operator
-  // in older versions of Chrome and Safari which return 'function' for regexes
-  // and Safari 8 which returns 'object' for typed array constructors.
-  return isObject(value) && objToString.call(value) == funcTag;
-}
-
-module.exports = isFunction;
-
-},{"./isObject":53}],52:[function(require,module,exports){
-var isFunction = require('./isFunction'),
-    isObjectLike = require('../internal/isObjectLike');
-
-/** Used to detect host constructors (Safari > 5). */
-var reIsHostCtor = /^\[object .+?Constructor\]$/;
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to resolve the decompiled source of functions. */
-var fnToString = Function.prototype.toString;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/** Used to detect if a method is native. */
-var reIsNative = RegExp('^' +
-  fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
-  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
-);
-
-/**
- * Checks if `value` is a native function.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
- * @example
- *
- * _.isNative(Array.prototype.push);
- * // => true
- *
- * _.isNative(_);
- * // => false
- */
-function isNative(value) {
-  if (value == null) {
-    return false;
-  }
-  if (isFunction(value)) {
-    return reIsNative.test(fnToString.call(value));
-  }
-  return isObjectLike(value) && reIsHostCtor.test(value);
-}
-
-module.exports = isNative;
-
-},{"../internal/isObjectLike":43,"./isFunction":51}],53:[function(require,module,exports){
-/**
- * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
-function isObject(value) {
-  // Avoid a V8 JIT bug in Chrome 19-20.
-  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
-  var type = typeof value;
-  return !!value && (type == 'object' || type == 'function');
-}
-
-module.exports = isObject;
-
-},{}],54:[function(require,module,exports){
-var isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var stringTag = '[object String]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is classified as a `String` primitive or object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isString('abc');
- * // => true
- *
- * _.isString(1);
- * // => false
- */
-function isString(value) {
-  return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);
-}
-
-module.exports = isString;
-
-},{"../internal/isObjectLike":43}],55:[function(require,module,exports){
-var isLength = require('../internal/isLength'),
-    isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var argsTag = '[object Arguments]',
-    arrayTag = '[object Array]',
-    boolTag = '[object Boolean]',
-    dateTag = '[object Date]',
-    errorTag = '[object Error]',
-    funcTag = '[object Function]',
-    mapTag = '[object Map]',
-    numberTag = '[object Number]',
-    objectTag = '[object Object]',
-    regexpTag = '[object RegExp]',
-    setTag = '[object Set]',
-    stringTag = '[object String]',
-    weakMapTag = '[object WeakMap]';
-
-var arrayBufferTag = '[object ArrayBuffer]',
-    float32Tag = '[object Float32Array]',
-    float64Tag = '[object Float64Array]',
-    int8Tag = '[object Int8Array]',
-    int16Tag = '[object Int16Array]',
-    int32Tag = '[object Int32Array]',
-    uint8Tag = '[object Uint8Array]',
-    uint8ClampedTag = '[object Uint8ClampedArray]',
-    uint16Tag = '[object Uint16Array]',
-    uint32Tag = '[object Uint32Array]';
-
-/** Used to identify `toStringTag` values of typed arrays. */
-var typedArrayTags = {};
-typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
-typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
-typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
-typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
-typedArrayTags[uint32Tag] = true;
-typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
-typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
-typedArrayTags[dateTag] = typedArrayTags[errorTag] =
-typedArrayTags[funcTag] = typedArrayTags[mapTag] =
-typedArrayTags[numberTag] = typedArrayTags[objectTag] =
-typedArrayTags[regexpTag] = typedArrayTags[setTag] =
-typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is classified as a typed array.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isTypedArray(new Uint8Array);
- * // => true
- *
- * _.isTypedArray([]);
- * // => false
- */
-function isTypedArray(value) {
-  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];
-}
-
-module.exports = isTypedArray;
-
-},{"../internal/isLength":42,"../internal/isObjectLike":43}],56:[function(require,module,exports){
-var assignWith = require('../internal/assignWith'),
-    baseAssign = require('../internal/baseAssign'),
-    createAssigner = require('../internal/createAssigner');
-
-/**
- * Assigns own enumerable properties of source object(s) to the destination
- * object. Subsequent sources overwrite property assignments of previous sources.
- * If `customizer` is provided it's invoked to produce the assigned values.
- * The `customizer` is bound to `thisArg` and invoked with five arguments:
- * (objectValue, sourceValue, key, object, source).
- *
- * **Note:** This method mutates `object` and is based on
- * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign).
- *
- * @static
- * @memberOf _
- * @alias extend
- * @category Object
- * @param {Object} object The destination object.
- * @param {...Object} [sources] The source objects.
- * @param {Function} [customizer] The function to customize assigned values.
- * @param {*} [thisArg] The `this` binding of `customizer`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });
- * // => { 'user': 'fred', 'age': 40 }
- *
- * // using a customizer callback
- * var defaults = _.partialRight(_.assign, function(value, other) {
- *   return _.isUndefined(value) ? other : value;
- * });
- *
- * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
- * // => { 'user': 'barney', 'age': 36 }
- */
-var assign = createAssigner(function(object, source, customizer) {
-  return customizer
-    ? assignWith(object, source, customizer)
-    : baseAssign(object, source);
-});
-
-module.exports = assign;
-
-},{"../internal/assignWith":9,"../internal/baseAssign":10,"../internal/createAssigner":29}],57:[function(require,module,exports){
-var baseAssign = require('../internal/baseAssign'),
-    baseCreate = require('../internal/baseCreate'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Creates an object that inherits from the given `prototype` object. If a
- * `properties` object is provided its own enumerable properties are assigned
- * to the created object.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} prototype The object to inherit from.
- * @param {Object} [properties] The properties to assign to the object.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Object} Returns the new object.
- * @example
- *
- * function Shape() {
- *   this.x = 0;
- *   this.y = 0;
- * }
- *
- * function Circle() {
- *   Shape.call(this);
- * }
- *
- * Circle.prototype = _.create(Shape.prototype, {
- *   'constructor': Circle
- * });
- *
- * var circle = new Circle;
- * circle instanceof Circle;
- * // => true
- *
- * circle instanceof Shape;
- * // => true
- */
-function create(prototype, properties, guard) {
-  var result = baseCreate(prototype);
-  if (guard && isIterateeCall(prototype, properties, guard)) {
-    properties = undefined;
-  }
-  return properties ? baseAssign(result, properties) : result;
-}
-
-module.exports = create;
-
-},{"../internal/baseAssign":10,"../internal/baseCreate":13,"../internal/isIterateeCall":40}],58:[function(require,module,exports){
-var getNative = require('../internal/getNative'),
-    isArrayLike = require('../internal/isArrayLike'),
-    isObject = require('../lang/isObject'),
-    shimKeys = require('../internal/shimKeys');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeKeys = getNative(Object, 'keys');
-
-/**
- * Creates an array of the own enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects. See the
- * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
- * for more details.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keys(new Foo);
- * // => ['a', 'b'] (iteration order is not guaranteed)
- *
- * _.keys('hi');
- * // => ['0', '1']
- */
-var keys = !nativeKeys ? shimKeys : function(object) {
-  var Ctor = object == null ? undefined : object.constructor;
-  if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
-      (typeof object != 'function' && isArrayLike(object))) {
-    return shimKeys(object);
-  }
-  return isObject(object) ? nativeKeys(object) : [];
-};
-
-module.exports = keys;
-
-},{"../internal/getNative":37,"../internal/isArrayLike":38,"../internal/shimKeys":45,"../lang/isObject":53}],59:[function(require,module,exports){
-var isArguments = require('../lang/isArguments'),
-    isArray = require('../lang/isArray'),
-    isIndex = require('../internal/isIndex'),
-    isLength = require('../internal/isLength'),
-    isObject = require('../lang/isObject');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Creates an array of the own and inherited enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keysIn(new Foo);
- * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
- */
-function keysIn(object) {
-  if (object == null) {
-    return [];
-  }
-  if (!isObject(object)) {
-    object = Object(object);
-  }
-  var length = object.length;
-  length = (length && isLength(length) &&
-    (isArray(object) || isArguments(object)) && length) || 0;
-
-  var Ctor = object.constructor,
-      index = -1,
-      isProto = typeof Ctor == 'function' && Ctor.prototype === object,
-      result = Array(length),
-      skipIndexes = length > 0;
-
-  while (++index < length) {
-    result[index] = (index + '');
-  }
-  for (var key in object) {
-    if (!(skipIndexes && isIndex(key, length)) &&
-        !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
-      result.push(key);
-    }
-  }
-  return result;
-}
-
-module.exports = keysIn;
-
-},{"../internal/isIndex":39,"../internal/isLength":42,"../lang/isArguments":48,"../lang/isArray":49,"../lang/isObject":53}],60:[function(require,module,exports){
-var keys = require('./keys'),
-    toObject = require('../internal/toObject');
-
-/**
- * Creates a two dimensional array of the key-value pairs for `object`,
- * e.g. `[[key1, value1], [key2, value2]]`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the new array of key-value pairs.
- * @example
- *
- * _.pairs({ 'barney': 36, 'fred': 40 });
- * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)
- */
-function pairs(object) {
-  object = toObject(object);
-
-  var index = -1,
-      props = keys(object),
-      length = props.length,
-      result = Array(length);
-
-  while (++index < length) {
-    var key = props[index];
-    result[index] = [key, object[key]];
-  }
-  return result;
-}
-
-module.exports = pairs;
-
-},{"../internal/toObject":46,"./keys":58}],61:[function(require,module,exports){
-/**
- * This method returns the first argument provided to it.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {*} value Any value.
- * @returns {*} Returns `value`.
- * @example
- *
- * var object = { 'user': 'fred' };
- *
- * _.identity(object) === object;
- * // => true
- */
-function identity(value) {
-  return value;
-}
-
-module.exports = identity;
-
-},{}],62:[function(require,module,exports){
-var baseProperty = require('../internal/baseProperty'),
-    basePropertyDeep = require('../internal/basePropertyDeep'),
-    isKey = require('../internal/isKey');
-
-/**
- * Creates a function that returns the property value at `path` on a
- * given object.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {Array|string} path The path of the property to get.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var objects = [
- *   { 'a': { 'b': { 'c': 2 } } },
- *   { 'a': { 'b': { 'c': 1 } } }
- * ];
- *
- * _.map(objects, _.property('a.b.c'));
- * // => [2, 1]
- *
- * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');
- * // => [1, 2]
- */
-function property(path) {
-  return isKey(path) ? baseProperty(path) : basePropertyDeep(path);
-}
-
-module.exports = property;
-
-},{"../internal/baseProperty":24,"../internal/basePropertyDeep":25,"../internal/isKey":41}],63:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLAttribute, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLAttribute = (function() {
-    function XMLAttribute(parent, name, value) {
-      this.stringify = parent.stringify;
-      if (name == null) {
-        throw new Error("Missing attribute name of element " + parent.name);
-      }
-      if (value == null) {
-        throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name);
-      }
-      this.name = this.stringify.attName(name);
-      this.value = this.stringify.attValue(value);
-    }
-
-    XMLAttribute.prototype.clone = function() {
-      return create(XMLAttribute.prototype, this);
-    };
-
-    XMLAttribute.prototype.toString = function(options, level) {
-      return ' ' + this.name + '="' + this.value + '"';
-    };
-
-    return XMLAttribute;
-
-  })();
-
-}).call(this);
-
-},{"lodash/object/create":57}],64:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLBuilder, XMLDeclaration, XMLDocType, XMLElement, XMLStringifier;
-
-  XMLStringifier = require('./XMLStringifier');
-
-  XMLDeclaration = require('./XMLDeclaration');
-
-  XMLDocType = require('./XMLDocType');
-
-  XMLElement = require('./XMLElement');
-
-  module.exports = XMLBuilder = (function() {
-    function XMLBuilder(name, options) {
-      var root, temp;
-      if (name == null) {
-        throw new Error("Root element needs a name");
-      }
-      if (options == null) {
-        options = {};
-      }
-      this.options = options;
-      this.stringify = new XMLStringifier(options);
-      temp = new XMLElement(this, 'doc');
-      root = temp.element(name);
-      root.isRoot = true;
-      root.documentObject = this;
-      this.rootObject = root;
-      if (!options.headless) {
-        root.declaration(options);
-        if ((options.pubID != null) || (options.sysID != null)) {
-          root.doctype(options);
-        }
-      }
-    }
-
-    XMLBuilder.prototype.root = function() {
-      return this.rootObject;
-    };
-
-    XMLBuilder.prototype.end = function(options) {
-      return this.toString(options);
-    };
-
-    XMLBuilder.prototype.toString = function(options) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      r = '';
-      if (this.xmldec != null) {
-        r += this.xmldec.toString(options);
-      }
-      if (this.doctype != null) {
-        r += this.doctype.toString(options);
-      }
-      r += this.rootObject.toString(options);
-      if (pretty && r.slice(-newline.length) === newline) {
-        r = r.slice(0, -newline.length);
-      }
-      return r;
-    };
-
-    return XMLBuilder;
-
-  })();
-
-}).call(this);
-
-},{"./XMLDeclaration":71,"./XMLDocType":72,"./XMLElement":73,"./XMLStringifier":77}],65:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLCData, XMLNode, create,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLCData = (function(superClass) {
-    extend(XMLCData, superClass);
-
-    function XMLCData(parent, text) {
-      XMLCData.__super__.constructor.call(this, parent);
-      if (text == null) {
-        throw new Error("Missing CDATA text");
-      }
-      this.text = this.stringify.cdata(text);
-    }
-
-    XMLCData.prototype.clone = function() {
-      return create(XMLCData.prototype, this);
-    };
-
-    XMLCData.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<![CDATA[' + this.text + ']]>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLCData;
-
-  })(XMLNode);
-
-}).call(this);
-
-},{"./XMLNode":74,"lodash/object/create":57}],66:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLComment, XMLNode, create,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLComment = (function(superClass) {
-    extend(XMLComment, superClass);
-
-    function XMLComment(parent, text) {
-      XMLComment.__super__.constructor.call(this, parent);
-      if (text == null) {
-        throw new Error("Missing comment text");
-      }
-      this.text = this.stringify.comment(text);
-    }
-
-    XMLComment.prototype.clone = function() {
-      return create(XMLComment.prototype, this);
-    };
-
-    XMLComment.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!-- ' + this.text + ' -->';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLComment;
-
-  })(XMLNode);
-
-}).call(this);
-
-},{"./XMLNode":74,"lodash/object/create":57}],67:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDTDAttList, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLDTDAttList = (function() {
-    function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {
-      this.stringify = parent.stringify;
-      if (elementName == null) {
-        throw new Error("Missing DTD element name");
-      }
-      if (attributeName == null) {
-        throw new Error("Missing DTD attribute name");
-      }
-      if (!attributeType) {
-        throw new Error("Missing DTD attribute type");
-      }
-      if (!defaultValueType) {
-        throw new Error("Missing DTD attribute default");
-      }
-      if (defaultValueType.indexOf('#') !== 0) {
-        defaultValueType = '#' + defaultValueType;
-      }
-      if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {
-        throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT");
-      }
-      if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {
-        throw new Error("Default value only applies to #FIXED or #DEFAULT");
-      }
-      this.elementName = this.stringify.eleName(elementName);
-      this.attributeName = this.stringify.attName(attributeName);
-      this.attributeType = this.stringify.dtdAttType(attributeType);
-      this.defaultValue = this.stringify.dtdAttDefault(defaultValue);
-      this.defaultValueType = defaultValueType;
-    }
-
-    XMLDTDAttList.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!ATTLIST ' + this.elementName + ' ' + this.attributeName + ' ' + this.attributeType;
-      if (this.defaultValueType !== '#DEFAULT') {
-        r += ' ' + this.defaultValueType;
-      }
-      if (this.defaultValue) {
-        r += ' "' + this.defaultValue + '"';
-      }
-      r += '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDTDAttList;
-
-  })();
-
-}).call(this);
-
-},{"lodash/object/create":57}],68:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDTDElement, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLDTDElement = (function() {
-    function XMLDTDElement(parent, name, value) {
-      this.stringify = parent.stringify;
-      if (name == null) {
-        throw new Error("Missing DTD element name");
-      }
-      if (!value) {
-        value = '(#PCDATA)';
-      }
-      if (Array.isArray(value)) {
-        value = '(' + value.join(',') + ')';
-      }
-      this.name = this.stringify.eleName(name);
-      this.value = this.stringify.dtdElementValue(value);
-    }
-
-    XMLDTDElement.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!ELEMENT ' + this.name + ' ' + this.value + '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDTDElement;
-
-  })();
-
-}).call(this);
-
-},{"lodash/object/create":57}],69:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDTDEntity, create, isObject;
-
-  create = require('lodash/object/create');
-
-  isObject = require('lodash/lang/isObject');
-
-  module.exports = XMLDTDEntity = (function() {
-    function XMLDTDEntity(parent, pe, name, value) {
-      this.stringify = parent.stringify;
-      if (name == null) {
-        throw new Error("Missing entity name");
-      }
-      if (value == null) {
-        throw new Error("Missing entity value");
-      }
-      this.pe = !!pe;
-      this.name = this.stringify.eleName(name);
-      if (!isObject(value)) {
-        this.value = this.stringify.dtdEntityValue(value);
-      } else {
-        if (!value.pubID && !value.sysID) {
-          throw new Error("Public and/or system identifiers are required for an external entity");
-        }
-        if (value.pubID && !value.sysID) {
-          throw new Error("System identifier is required for a public external entity");
-        }
-        if (value.pubID != null) {
-          this.pubID = this.stringify.dtdPubID(value.pubID);
-        }
-        if (value.sysID != null) {
-          this.sysID = this.stringify.dtdSysID(value.sysID);
-        }
-        if (value.nData != null) {
-          this.nData = this.stringify.dtdNData(value.nData);
-        }
-        if (this.pe && this.nData) {
-          throw new Error("Notation declaration is not allowed in a parameter entity");
-        }
-      }
-    }
-
-    XMLDTDEntity.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!ENTITY';
-      if (this.pe) {
-        r += ' %';
-      }
-      r += ' ' + this.name;
-      if (this.value) {
-        r += ' "' + this.value + '"';
-      } else {
-        if (this.pubID && this.sysID) {
-          r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
-        } else if (this.sysID) {
-          r += ' SYSTEM "' + this.sysID + '"';
-        }
-        if (this.nData) {
-          r += ' NDATA ' + this.nData;
-        }
-      }
-      r += '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDTDEntity;
-
-  })();
-
-}).call(this);
-
-},{"lodash/lang/isObject":53,"lodash/object/create":57}],70:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDTDNotation, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLDTDNotation = (function() {
-    function XMLDTDNotation(parent, name, value) {
-      this.stringify = parent.stringify;
-      if (name == null) {
-        throw new Error("Missing notation name");
-      }
-      if (!value.pubID && !value.sysID) {
-        throw new Error("Public or system identifiers are required for an external entity");
-      }
-      this.name = this.stringify.eleName(name);
-      if (value.pubID != null) {
-        this.pubID = this.stringify.dtdPubID(value.pubID);
-      }
-      if (value.sysID != null) {
-        this.sysID = this.stringify.dtdSysID(value.sysID);
-      }
-    }
-
-    XMLDTDNotation.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!NOTATION ' + this.name;
-      if (this.pubID && this.sysID) {
-        r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
-      } else if (this.pubID) {
-        r += ' PUBLIC "' + this.pubID + '"';
-      } else if (this.sysID) {
-        r += ' SYSTEM "' + this.sysID + '"';
-      }
-      r += '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDTDNotation;
-
-  })();
-
-}).call(this);
-
-},{"lodash/object/create":57}],71:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDeclaration, XMLNode, create, isObject,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  isObject = require('lodash/lang/isObject');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLDeclaration = (function(superClass) {
-    extend(XMLDeclaration, superClass);
-
-    function XMLDeclaration(parent, version, encoding, standalone) {
-      var ref;
-      XMLDeclaration.__super__.constructor.call(this, parent);
-      if (isObject(version)) {
-        ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;
-      }
-      if (!version) {
-        version = '1.0';
-      }
-      this.version = this.stringify.xmlVersion(version);
-      if (encoding != null) {
-        this.encoding = this.stringify.xmlEncoding(encoding);
-      }
-      if (standalone != null) {
-        this.standalone = this.stringify.xmlStandalone(standalone);
-      }
-    }
-
-    XMLDeclaration.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<?xml';
-      r += ' version="' + this.version + '"';
-      if (this.encoding != null) {
-        r += ' encoding="' + this.encoding + '"';
-      }
-      if (this.standalone != null) {
-        r += ' standalone="' + this.standalone + '"';
-      }
-      r += '?>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDeclaration;
-
-  })(XMLNode);
-
-}).call(this);
-
-},{"./XMLNode":74,"lodash/lang/isObject":53,"lodash/object/create":57}],72:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLProcessingInstruction, create, isObject;
-
-  create = require('lodash/object/create');
-
-  isObject = require('lodash/lang/isObject');
-
-  XMLCData = require('./XMLCData');
-
-  XMLComment = require('./XMLComment');
-
-  XMLDTDAttList = require('./XMLDTDAttList');
-
-  XMLDTDEntity = require('./XMLDTDEntity');
-
-  XMLDTDElement = require('./XMLDTDElement');
-
-  XMLDTDNotation = require('./XMLDTDNotation');
-
-  XMLProcessingInstruction = require('./XMLProcessingInstruction');
-
-  module.exports = XMLDocType = (function() {
-    function XMLDocType(parent, pubID, sysID) {
-      var ref, ref1;
-      this.documentObject = parent;
-      this.stringify = this.documentObject.stringify;
-      this.children = [];
-      if (isObject(pubID)) {
-        ref = pubID, pubID = ref.pubID, sysID = ref.sysID;
-      }
-      if (sysID == null) {
-        ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1];
-      }
-      if (pubID != null) {
-        this.pubID = this.stringify.dtdPubID(pubID);
-      }
-      if (sysID != null) {
-        this.sysID = this.stringify.dtdSysID(sysID);
-      }
-    }
-
-    XMLDocType.prototype.element = function(name, value) {
-      var child;
-      child = new XMLDTDElement(this, name, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
-      var child;
-      child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.entity = function(name, value) {
-      var child;
-      child = new XMLDTDEntity(this, false, name, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.pEntity = function(name, value) {
-      var child;
-      child = new XMLDTDEntity(this, true, name, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.notation = function(name, value) {
-      var child;
-      child = new XMLDTDNotation(this, name, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.cdata = function(value) {
-      var child;
-      child = new XMLCData(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.comment = function(value) {
-      var child;
-      child = new XMLComment(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.instruction = function(target, value) {
-      var child;
-      child = new XMLProcessingInstruction(this, target, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.root = function() {
-      return this.documentObject.root();
-    };
-
-    XMLDocType.prototype.document = function() {
-      return this.documentObject;
-    };
-
-    XMLDocType.prototype.toString = function(options, level) {
-      var child, i, indent, len, newline, offset, pretty, r, ref, ref1, ref2, ref3, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!DOCTYPE ' + this.root().name;
-      if (this.pubID && this.sysID) {
-        r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
-      } else if (this.sysID) {
-        r += ' SYSTEM "' + this.sysID + '"';
-      }
-      if (this.children.length > 0) {
-        r += ' [';
-        if (pretty) {
-          r += newline;
-        }
-        ref3 = this.children;
-        for (i = 0, len = ref3.length; i < len; i++) {
-          child = ref3[i];
-          r += child.toString(options, level + 1);
-        }
-        r += ']';
-      }
-      r += '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    XMLDocType.prototype.ele = function(name, value) {
-      return this.element(name, value);
-    };
-
-    XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
-      return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);
-    };
-
-    XMLDocType.prototype.ent = function(name, value) {
-      return this.entity(name, value);
-    };
-
-    XMLDocType.prototype.pent = function(name, value) {
-      return this.pEntity(name, value);
-    };
-
-    XMLDocType.prototype.not = function(name, value) {
-      return this.notation(name, value);
-    };
-
-    XMLDocType.prototype.dat = function(value) {
-      return this.cdata(value);
-    };
-
-    XMLDocType.prototype.com = function(value) {
-      return this.comment(value);
-    };
-
-    XMLDocType.prototype.ins = function(target, value) {
-      return this.instruction(target, value);
-    };
-
-    XMLDocType.prototype.up = function() {
-      return this.root();
-    };
-
-    XMLDocType.prototype.doc = function() {
-      return this.document();
-    };
-
-    return XMLDocType;
-
-  })();
-
-}).call(this);
-
-},{"./XMLCData":65,"./XMLComment":66,"./XMLDTDAttList":67,"./XMLDTDElement":68,"./XMLDTDEntity":69,"./XMLDTDNotation":70,"./XMLProcessingInstruction":75,"lodash/lang/isObject":53,"lodash/object/create":57}],73:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLAttribute, XMLElement, XMLNode, XMLProcessingInstruction, create, every, isFunction, isObject,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  isObject = require('lodash/lang/isObject');
-
-  isFunction = require('lodash/lang/isFunction');
-
-  every = require('lodash/collection/every');
-
-  XMLNode = require('./XMLNode');
-
-  XMLAttribute = require('./XMLAttribute');
-
-  XMLProcessingInstruction = require('./XMLProcessingInstruction');
-
-  module.exports = XMLElement = (function(superClass) {
-    extend(XMLElement, superClass);
-
-    function XMLElement(parent, name, attributes) {
-      XMLElement.__super__.constructor.call(this, parent);
-      if (name == null) {
-        throw new Error("Missing element name");
-      }
-      this.name = this.stringify.eleName(name);
-      this.children = [];
-      this.instructions = [];
-      this.attributes = {};
-      if (attributes != null) {
-        this.attribute(attributes);
-      }
-    }
-
-    XMLElement.prototype.clone = function() {
-      var att, attName, clonedSelf, i, len, pi, ref, ref1;
-      clonedSelf = create(XMLElement.prototype, this);
-      if (clonedSelf.isRoot) {
-        clonedSelf.documentObject = null;
-      }
-      clonedSelf.attributes = {};
-      ref = this.attributes;
-      for (attName in ref) {
-        if (!hasProp.call(ref, attName)) continue;
-        att = ref[attName];
-        clonedSelf.attributes[attName] = att.clone();
-      }
-      clonedSelf.instructions = [];
-      ref1 = this.instructions;
-      for (i = 0, len = ref1.length; i < len; i++) {
-        pi = ref1[i];
-        clonedSelf.instructions.push(pi.clone());
-      }
-      clonedSelf.children = [];
-      this.children.forEach(function(child) {
-        var clonedChild;
-        clonedChild = child.clone();
-        clonedChild.parent = clonedSelf;
-        return clonedSelf.children.push(clonedChild);
-      });
-      return clonedSelf;
-    };
-
-    XMLElement.prototype.attribute = function(name, value) {
-      var attName, attValue;
-      if (name != null) {
-        name = name.valueOf();
-      }
-      if (isObject(name)) {
-        for (attName in name) {
-          if (!hasProp.call(name, attName)) continue;
-          attValue = name[attName];
-          this.attribute(attName, attValue);
-        }
-      } else {
-        if (isFunction(value)) {
-          value = value.apply();
-        }
-        if (!this.options.skipNullAttributes || (value != null)) {
-          this.attributes[name] = new XMLAttribute(this, name, value);
-        }
-      }
-      return this;
-    };
-
-    XMLElement.prototype.removeAttribute = function(name) {
-      var attName, i, len;
-      if (name == null) {
-        throw new Error("Missing attribute name");
-      }
-      name = name.valueOf();
-      if (Array.isArray(name)) {
-        for (i = 0, len = name.length; i < len; i++) {
-          attName = name[i];
-          delete this.attributes[attName];
-        }
-      } else {
-        delete this.attributes[name];
-      }
-      return this;
-    };
-
-    XMLElement.prototype.instruction = function(target, value) {
-      var i, insTarget, insValue, instruction, len;
-      if (target != null) {
-        target = target.valueOf();
-      }
-      if (value != null) {
-        value = value.valueOf();
-      }
-      if (Array.isArray(target)) {
-        for (i = 0, len = target.length; i < len; i++) {
-          insTarget = target[i];
-          this.instruction(insTarget);
-        }
-      } else if (isObject(target)) {
-        for (insTarget in target) {
-          if (!hasProp.call(target, insTarget)) continue;
-          insValue = target[insTarget];
-          this.instruction(insTarget, insValue);
-        }
-      } else {
-        if (isFunction(value)) {
-          value = value.apply();
-        }
-        instruction = new XMLProcessingInstruction(this, target, value);
-        this.instructions.push(instruction);
-      }
-      return this;
-    };
-
-    XMLElement.prototype.toString = function(options, level) {
-      var att, child, i, indent, instruction, j, len, len1, name, newline, offset, pretty, r, ref, ref1, ref2, ref3, ref4, ref5, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      ref3 = this.instructions;
-      for (i = 0, len = ref3.length; i < len; i++) {
-        instruction = ref3[i];
-        r += instruction.toString(options, level);
-      }
-      if (pretty) {
-        r += space;
-      }
-      r += '<' + this.name;
-      ref4 = this.attributes;
-      for (name in ref4) {
-        if (!hasProp.call(ref4, name)) continue;
-        att = ref4[name];
-        r += att.toString(options);
-      }
-      if (this.children.length === 0 || every(this.children, function(e) {
-        return e.value === '';
-      })) {
-        r += '/>';
-        if (pretty) {
-          r += newline;
-        }
-      } else if (pretty && this.children.length === 1 && (this.children[0].value != null)) {
-        r += '>';
-        r += this.children[0].value;
-        r += '</' + this.name + '>';
-        r += newline;
-      } else {
-        r += '>';
-        if (pretty) {
-          r += newline;
-        }
-        ref5 = this.children;
-        for (j = 0, len1 = ref5.length; j < len1; j++) {
-          child = ref5[j];
-          r += child.toString(options, level + 1);
-        }
-        if (pretty) {
-          r += space;
-        }
-        r += '</' + this.name + '>';
-        if (pretty) {
-          r += newline;
-        }
-      }
-      return r;
-    };
-
-    XMLElement.prototype.att = function(name, value) {
-      return this.attribute(name, value);
-    };
-
-    XMLElement.prototype.ins = function(target, value) {
-      return this.instruction(target, value);
-    };
-
-    XMLElement.prototype.a = function(name, value) {
-      return this.attribute(name, value);
-    };
-
-    XMLElement.prototype.i = function(target, value) {
-      return this.instruction(target, value);
-    };
-
-    return XMLElement;
-
-  })(XMLNode);
-
-}).call(this);
-
-},{"./XMLAttribute":63,"./XMLNode":74,"./XMLProcessingInstruction":75,"lodash/collection/every":5,"lodash/lang/isFunction":51,"lodash/lang/isObject":53,"lodash/object/create":57}],74:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLRaw, XMLText, isEmpty, isFunction, isObject,
-    hasProp = {}.hasOwnProperty;
-
-  isObject = require('lodash/lang/isObject');
-
-  isFunction = require('lodash/lang/isFunction');
-
-  isEmpty = require('lodash/lang/isEmpty');
-
-  XMLElement = null;
-
-  XMLCData = null;
-
-  XMLComment = null;
-
-  XMLDeclaration = null;
-
-  XMLDocType = null;
-
-  XMLRaw = null;
-
-  XMLText = null;
-
-  module.exports = XMLNode = (function() {
-    function XMLNode(parent) {
-      this.parent = parent;
-      this.options = this.parent.options;
-      this.stringify = this.parent.stringify;
-      if (XMLElement === null) {
-        XMLElement = require('./XMLElement');
-        XMLCData = require('./XMLCData');
-        XMLComment = require('./XMLComment');
-        XMLDeclaration = require('./XMLDeclaration');
-        XMLDocType = require('./XMLDocType');
-        XMLRaw = require('./XMLRaw');
-        XMLText = require('./XMLText');
-      }
-    }
-
-    XMLNode.prototype.element = function(name, attributes, text) {
-      var childNode, item, j, k, key, lastChild, len, len1, ref, val;
-      lastChild = null;
-      if (attributes == null) {
-        attributes = {};
-      }
-      attributes = attributes.valueOf();
-      if (!isObject(attributes)) {
-        ref = [attributes, text], text = ref[0], attributes = ref[1];
-      }
-      if (name != null) {
-        name = name.valueOf();
-      }
-      if (Array.isArray(name)) {
-        for (j = 0, len = name.length; j < len; j++) {
-          item = name[j];
-          lastChild = this.element(item);
-        }
-      } else if (isFunction(name)) {
-        lastChild = this.element(name.apply());
-      } else if (isObject(name)) {
-        for (key in name) {
-          if (!hasProp.call(name, key)) continue;
-          val = name[key];
-          if (isFunction(val)) {
-            val = val.apply();
-          }
-          if ((isObject(val)) && (isEmpty(val))) {
-            val = null;
-          }
-          if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {
-            lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);
-          } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && key.indexOf(this.stringify.convertPIKey) === 0) {
-            lastChild = this.instruction(key.substr(this.stringify.convertPIKey.length), val);
-          } else if (Array.isArray(val)) {
-            for (k = 0, len1 = val.length; k < len1; k++) {
-              item = val[k];
-              childNode = {};
-              childNode[key] = item;
-              lastChild = this.element(childNode);
-            }
-          } else if (isObject(val)) {
-            lastChild = this.element(key);
-            lastChild.element(val);
-          } else {
-            lastChild = this.element(key, val);
-          }
-        }
-      } else {
-        if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {
-          lastChild = this.text(text);
-        } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {
-          lastChild = this.cdata(text);
-        } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {
-          lastChild = this.comment(text);
-        } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {
-          lastChild = this.raw(text);
-        } else {
-          lastChild = this.node(name, attributes, text);
-        }
-      }
-      if (lastChild == null) {
-        throw new Error("Could not create any elements with: " + name);
-      }
-      return lastChild;
-    };
-
-    XMLNode.prototype.insertBefore = function(name, attributes, text) {
-      var child, i, removed;
-      if (this.isRoot) {
-        throw new Error("Cannot insert elements at root level");
-      }
-      i = this.parent.children.indexOf(this);
-      removed = this.parent.children.splice(i);
-      child = this.parent.element(name, attributes, text);
-      Array.prototype.push.apply(this.parent.children, removed);
-      return child;
-    };
-
-    XMLNode.prototype.insertAfter = function(name, attributes, text) {
-      var child, i, removed;
-      if (this.isRoot) {
-        throw new Error("Cannot insert elements at root level");
-      }
-      i = this.parent.children.indexOf(this);
-      removed = this.parent.children.splice(i + 1);
-      child = this.parent.element(name, attributes, text);
-      Array.prototype.push.apply(this.parent.children, removed);
-      return child;
-    };
-
-    XMLNode.prototype.remove = function() {
-      var i, ref;
-      if (this.isRoot) {
-        throw new Error("Cannot remove the root element");
-      }
-      i = this.parent.children.indexOf(this);
-      [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref = [])), ref;
-      return this.parent;
-    };
-
-    XMLNode.prototype.node = function(name, attributes, text) {
-      var child, ref;
-      if (name != null) {
-        name = name.valueOf();
-      }
-      if (attributes == null) {
-        attributes = {};
-      }
-      attributes = attributes.valueOf();
-      if (!isObject(attributes)) {
-        ref = [attributes, text], text = ref[0], attributes = ref[1];
-      }
-      child = new XMLElement(this, name, attributes);
-      if (text != null) {
-        child.text(text);
-      }
-      this.children.push(child);
-      return child;
-    };
-
-    XMLNode.prototype.text = function(value) {
-      var child;
-      child = new XMLText(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLNode.prototype.cdata = function(value) {
-      var child;
-      child = new XMLCData(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLNode.prototype.comment = function(value) {
-      var child;
-      child = new XMLComment(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLNode.prototype.raw = function(value) {
-      var child;
-      child = new XMLRaw(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLNode.prototype.declaration = function(version, encoding, standalone) {
-      var doc, xmldec;
-      doc = this.document();
-      xmldec = new XMLDeclaration(doc, version, encoding, standalone);
-      doc.xmldec = xmldec;
-      return doc.root();
-    };
-
-    XMLNode.prototype.doctype = function(pubID, sysID) {
-      var doc, doctype;
-      doc = this.document();
-      doctype = new XMLDocType(doc, pubID, sysID);
-      doc.doctype = doctype;
-      return doctype;
-    };
-
-    XMLNode.prototype.up = function() {
-      if (this.isRoot) {
-        throw new Error("The root node has no parent. Use doc() if you need to get the document object.");
-      }
-      return this.parent;
-    };
-
-    XMLNode.prototype.root = function() {
-      var child;
-      if (this.isRoot) {
-        return this;
-      }
-      child = this.parent;
-      while (!child.isRoot) {
-        child = child.parent;
-      }
-      return child;
-    };
-
-    XMLNode.prototype.document = function() {
-      return this.root().documentObject;
-    };
-
-    XMLNode.prototype.end = function(options) {
-      return this.document().toString(options);
-    };
-
-    XMLNode.prototype.prev = function() {
-      var i;
-      if (this.isRoot) {
-        throw new Error("Root node has no siblings");
-      }
-      i = this.parent.children.indexOf(this);
-      if (i < 1) {
-        throw new Error("Already at the first node");
-      }
-      return this.parent.children[i - 1];
-    };
-
-    XMLNode.prototype.next = function() {
-      var i;
-      if (this.isRoot) {
-        throw new Error("Root node has no siblings");
-      }
-      i = this.parent.children.indexOf(this);
-      if (i === -1 || i === this.parent.children.length - 1) {
-        throw new Error("Already at the last node");
-      }
-      return this.parent.children[i + 1];
-    };
-
-    XMLNode.prototype.importXMLBuilder = function(xmlbuilder) {
-      var clonedRoot;
-      clonedRoot = xmlbuilder.root().clone();
-      clonedRoot.parent = this;
-      clonedRoot.isRoot = false;
-      this.children.push(clonedRoot);
-      return this;
-    };
-
-    XMLNode.prototype.ele = function(name, attributes, text) {
-      return this.element(name, attributes, text);
-    };
-
-    XMLNode.prototype.nod = function(name, attributes, text) {
-      return this.node(name, attributes, text);
-    };
-
-    XMLNode.prototype.txt = function(value) {
-      return this.text(value);
-    };
-
-    XMLNode.prototype.dat = function(value) {
-      return this.cdata(value);
-    };
-
-    XMLNode.prototype.com = function(value) {
-      return this.comment(value);
-    };
-
-    XMLNode.prototype.doc = function() {
-      return this.document();
-    };
-
-    XMLNode.prototype.dec = function(version, encoding, standalone) {
-      return this.declaration(version, encoding, standalone);
-    };
-
-    XMLNode.prototype.dtd = function(pubID, sysID) {
-      return this.doctype(pubID, sysID);
-    };
-
-    XMLNode.prototype.e = function(name, attributes, text) {
-      return this.element(name, attributes, text);
-    };
-
-    XMLNode.prototype.n = function(name, attributes, text) {
-      return this.node(name, attributes, text);
-    };
-
-    XMLNode.prototype.t = function(value) {
-      return this.text(value);
-    };
-
-    XMLNode.prototype.d = function(value) {
-      return this.cdata(value);
-    };
-
-    XMLNode.prototype.c = function(value) {
-      return this.comment(value);
-    };
-
-    XMLNode.prototype.r = function(value) {
-      return this.raw(value);
-    };
-
-    XMLNode.prototype.u = function() {
-      return this.up();
-    };
-
-    return XMLNode;
-
-  })();
-
-}).call(this);
-
-},{"./XMLCData":65,"./XMLComment":66,"./XMLDeclaration":71,"./XMLDocType":72,"./XMLElement":73,"./XMLRaw":76,"./XMLText":78,"lodash/lang/isEmpty":50,"lodash/lang/isFunction":51,"lodash/lang/isObject":53}],75:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLProcessingInstruction, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLProcessingInstruction = (function() {
-    function XMLProcessingInstruction(parent, target, value) {
-      this.stringify = parent.stringify;
-      if (target == null) {
-        throw new Error("Missing instruction target");
-      }
-      this.target = this.stringify.insTarget(target);
-      if (value) {
-        this.value = this.stringify.insValue(value);
-      }
-    }
-
-    XMLProcessingInstruction.prototype.clone = function() {
-      return create(XMLProcessingInstruction.prototype, this);
-    };
-
-    XMLProcessingInstruction.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<?';
-      r += this.target;
-      if (this.value) {
-        r += ' ' + this.value;
-      }
-      r += '?>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLProcessingInstruction;
-
-  })();
-
-}).call(this);
-
-},{"lodash/object/create":57}],76:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLNode, XMLRaw, create,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLRaw = (function(superClass) {
-    extend(XMLRaw, superClass);
-
-    function XMLRaw(parent, text) {
-      XMLRaw.__super__.constructor.call(this, parent);
-      if (text == null) {
-        throw new Error("Missing raw text");
-      }
-      this.value = this.stringify.raw(text);
-    }
-
-    XMLRaw.prototype.clone = function() {
-      return create(XMLRaw.prototype, this);
-    };
-
-    XMLRaw.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += this.value;
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLRaw;
-
-  })(XMLNode);
-
-}).call(this);
-
-},{"./XMLNode":74,"lodash/object/create":57}],77:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLStringifier,
-    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
-    hasProp = {}.hasOwnProperty;
-
-  module.exports = XMLStringifier = (function() {
-    function XMLStringifier(options) {
-      this.assertLegalChar = bind(this.assertLegalChar, this);
-      var key, ref, value;
-      this.allowSurrogateChars = options != null ? options.allowSurrogateChars : void 0;
-      ref = (options != null ? options.stringify : void 0) || {};
-      for (key in ref) {
-        if (!hasProp.call(ref, key)) continue;
-        value = ref[key];
-        this[key] = value;
-      }
-    }
-
-    XMLStringifier.prototype.eleName = function(val) {
-      val = '' + val || '';
-      return this.assertLegalChar(val);
-    };
-
-    XMLStringifier.prototype.eleText = function(val) {
-      val = '' + val || '';
-      return this.assertLegalChar(this.elEscape(val));
-    };
-
-    XMLStringifier.prototype.cdata = function(val) {
-      val = '' + val || '';
-      if (val.match(/]]>/)) {
-        throw new Error("Invalid CDATA text: " + val);
-      }
-      return this.assertLegalChar(val);
-    };
-
-    XMLStringifier.prototype.comment = function(val) {
-      val = '' + val || '';
-      if (val.match(/--/)) {
-        throw new Error("Comment text cannot contain double-hypen: " + val);
-      }
-      return this.assertLegalChar(val);
-    };
-
-    XMLStringifier.prototype.raw = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.attName = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.attValue = function(val) {
-      val = '' + val || '';
-      return this.attEscape(val);
-    };
-
-    XMLStringifier.prototype.insTarget = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.insValue = function(val) {
-      val = '' + val || '';
-      if (val.match(/\?>/)) {
-        throw new Error("Invalid processing instruction value: " + val);
-      }
-      return val;
-    };
-
-    XMLStringifier.prototype.xmlVersion = function(val) {
-      val = '' + val || '';
-      if (!val.match(/1\.[0-9]+/)) {
-        throw new Error("Invalid version number: " + val);
-      }
-      return val;
-    };
-
-    XMLStringifier.prototype.xmlEncoding = function(val) {
-      val = '' + val || '';
-      if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-]|-)*$/)) {
-        throw new Error("Invalid encoding: " + val);
-      }
-      return val;
-    };
-
-    XMLStringifier.prototype.xmlStandalone = function(val) {
-      if (val) {
-        return "yes";
-      } else {
-        return "no";
-      }
-    };
-
-    XMLStringifier.prototype.dtdPubID = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdSysID = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdElementValue = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdAttType = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdAttDefault = function(val) {
-      if (val != null) {
-        return '' + val || '';
-      } else {
-        return val;
-      }
-    };
-
-    XMLStringifier.prototype.dtdEntityValue = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdNData = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.convertAttKey = '@';
-
-    XMLStringifier.prototype.convertPIKey = '?';
-
-    XMLStringifier.prototype.convertTextKey = '#text';
-
-    XMLStringifier.prototype.convertCDataKey = '#cdata';
-
-    XMLStringifier.prototype.convertCommentKey = '#comment';
-
-    XMLStringifier.prototype.convertRawKey = '#raw';
-
-    XMLStringifier.prototype.assertLegalChar = function(str) {
-      var chars, chr;
-      if (this.allowSurrogateChars) {
-        chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uFFFE-\uFFFF]/;
-      } else {
-        chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE-\uFFFF]/;
-      }
-      chr = str.match(chars);
-      if (chr) {
-        throw new Error("Invalid character (" + chr + ") in string: " + str + " at index " + chr.index);
-      }
-      return str;
-    };
-
-    XMLStringifier.prototype.elEscape = function(str) {
-      return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\r/g, '&#xD;');
-    };
-
-    XMLStringifier.prototype.attEscape = function(str) {
-      return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
-    };
-
-    return XMLStringifier;
-
-  })();
-
-}).call(this);
-
-},{}],78:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLNode, XMLText, create,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLText = (function(superClass) {
-    extend(XMLText, superClass);
-
-    function XMLText(parent, text) {
-      XMLText.__super__.constructor.call(this, parent);
-      if (text == null) {
-        throw new Error("Missing element text");
-      }
-      this.value = this.stringify.eleText(text);
-    }
-
-    XMLText.prototype.clone = function() {
-      return create(XMLText.prototype, this);
-    };
-
-    XMLText.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += this.value;
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLText;
-
-  })(XMLNode);
-
-}).call(this);
-
-},{"./XMLNode":74,"lodash/object/create":57}],79:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLBuilder, assign;
-
-  assign = require('lodash/object/assign');
-
-  XMLBuilder = require('./XMLBuilder');
-
-  module.exports.create = function(name, xmldec, doctype, options) {
-    options = assign({}, xmldec, doctype, options);
-    return new XMLBuilder(name, options).root();
-  };
-
-}).call(this);
-
-},{"./XMLBuilder":64,"lodash/object/assign":56}]},{},[1])(1)
-});
\ No newline at end of file
diff --git a/node_modules/plist/dist/plist-parse.js b/node_modules/plist/dist/plist-parse.js
deleted file mode 100644
index 71c1b3d..0000000
--- a/node_modules/plist/dist/plist-parse.js
+++ /dev/null
@@ -1,4055 +0,0 @@
-(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.plist = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-(function (Buffer){
-
-/**
- * Module dependencies.
- */
-
-var deprecate = require('util-deprecate');
-var DOMParser = require('xmldom').DOMParser;
-
-/**
- * Module exports.
- */
-
-exports.parse = parse;
-exports.parseString = deprecate(parseString, '`parseString()` is deprecated. ' +
-  'It\'s not actually async. Use `parse()` instead.');
-exports.parseStringSync = deprecate(parseStringSync, '`parseStringSync()` is ' +
-  'deprecated. Use `parse()` instead.');
-
-/**
- * We ignore raw text (usually whitespace), <!-- xml comments -->,
- * and raw CDATA nodes.
- *
- * @param {Element} node
- * @returns {Boolean}
- * @api private
- */
-
-function shouldIgnoreNode (node) {
-  return node.nodeType === 3 // text
-    || node.nodeType === 8   // comment
-    || node.nodeType === 4;  // cdata
-}
-
-
-/**
- * Parses a Plist XML string. Returns an Object.
- *
- * @param {String} xml - the XML String to decode
- * @returns {Mixed} the decoded value from the Plist XML
- * @api public
- */
-
-function parse (xml) {
-  var doc = new DOMParser().parseFromString(xml);
-  if (doc.documentElement.nodeName !== 'plist') {
-    throw new Error('malformed document. First element should be <plist>');
-  }
-  var plist = parsePlistXML(doc.documentElement);
-
-  // the root <plist> node gets interpreted as an Array,
-  // so pull out the inner data first
-  if (plist.length == 1) plist = plist[0];
-
-  return plist;
-}
-
-/**
- * Parses a Plist XML string. Returns an Object. Takes a `callback` function.
- *
- * @param {String} xml - the XML String to decode
- * @param {Function} callback - callback function
- * @returns {Mixed} the decoded value from the Plist XML
- * @api public
- * @deprecated not actually async. use parse() instead
- */
-
-function parseString (xml, callback) {
-  var doc, error, plist;
-  try {
-    doc = new DOMParser().parseFromString(xml);
-    plist = parsePlistXML(doc.documentElement);
-  } catch(e) {
-    error = e;
-  }
-  callback(error, plist);
-}
-
-/**
- * Parses a Plist XML string. Returns an Object.
- *
- * @param {String} xml - the XML String to decode
- * @param {Function} callback - callback function
- * @returns {Mixed} the decoded value from the Plist XML
- * @api public
- * @deprecated use parse() instead
- */
-
-function parseStringSync (xml) {
-  var doc = new DOMParser().parseFromString(xml);
-  var plist;
-  if (doc.documentElement.nodeName !== 'plist') {
-    throw new Error('malformed document. First element should be <plist>');
-  }
-  plist = parsePlistXML(doc.documentElement);
-
-  // if the plist is an array with 1 element, pull it out of the array
-  if (plist.length == 1) {
-    plist = plist[0];
-  }
-  return plist;
-}
-
-/**
- * Convert an XML based plist document into a JSON representation.
- *
- * @param {Object} xml_node - current XML node in the plist
- * @returns {Mixed} built up JSON object
- * @api private
- */
-
-function parsePlistXML (node) {
-  var i, new_obj, key, val, new_arr, res, d;
-
-  if (!node)
-    return null;
-
-  if (node.nodeName === 'plist') {
-    new_arr = [];
-    for (i=0; i < node.childNodes.length; i++) {
-      // ignore comment nodes (text)
-      if (!shouldIgnoreNode(node.childNodes[i])) {
-        new_arr.push( parsePlistXML(node.childNodes[i]));
-      }
-    }
-    return new_arr;
-
-  } else if (node.nodeName === 'dict') {
-    new_obj = {};
-    key = null;
-    for (i=0; i < node.childNodes.length; i++) {
-      // ignore comment nodes (text)
-      if (!shouldIgnoreNode(node.childNodes[i])) {
-        if (key === null) {
-          key = parsePlistXML(node.childNodes[i]);
-        } else {
-          new_obj[key] = parsePlistXML(node.childNodes[i]);
-          key = null;
-        }
-      }
-    }
-    return new_obj;
-
-  } else if (node.nodeName === 'array') {
-    new_arr = [];
-    for (i=0; i < node.childNodes.length; i++) {
-      // ignore comment nodes (text)
-      if (!shouldIgnoreNode(node.childNodes[i])) {
-        res = parsePlistXML(node.childNodes[i]);
-        if (null != res) new_arr.push(res);
-      }
-    }
-    return new_arr;
-
-  } else if (node.nodeName === '#text') {
-    // TODO: what should we do with text types? (CDATA sections)
-
-  } else if (node.nodeName === 'key') {
-    return node.childNodes[0].nodeValue;
-
-  } else if (node.nodeName === 'string') {
-    res = '';
-    for (d=0; d < node.childNodes.length; d++) {
-      res += node.childNodes[d].nodeValue;
-    }
-    return res;
-
-  } else if (node.nodeName === 'integer') {
-    // parse as base 10 integer
-    return parseInt(node.childNodes[0].nodeValue, 10);
-
-  } else if (node.nodeName === 'real') {
-    res = '';
-    for (d=0; d < node.childNodes.length; d++) {
-      if (node.childNodes[d].nodeType === 3) {
-        res += node.childNodes[d].nodeValue;
-      }
-    }
-    return parseFloat(res);
-
-  } else if (node.nodeName === 'data') {
-    res = '';
-    for (d=0; d < node.childNodes.length; d++) {
-      if (node.childNodes[d].nodeType === 3) {
-        res += node.childNodes[d].nodeValue.replace(/\s+/g, '');
-      }
-    }
-
-    // decode base64 data to a Buffer instance
-    return new Buffer(res, 'base64');
-
-  } else if (node.nodeName === 'date') {
-    return new Date(node.childNodes[0].nodeValue);
-
-  } else if (node.nodeName === 'true') {
-    return true;
-
-  } else if (node.nodeName === 'false') {
-    return false;
-  }
-}
-
-}).call(this,require("buffer").Buffer)
-},{"buffer":3,"util-deprecate":6,"xmldom":7}],2:[function(require,module,exports){
-var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
-
-;(function (exports) {
-	'use strict';
-
-  var Arr = (typeof Uint8Array !== 'undefined')
-    ? Uint8Array
-    : Array
-
-	var PLUS   = '+'.charCodeAt(0)
-	var SLASH  = '/'.charCodeAt(0)
-	var NUMBER = '0'.charCodeAt(0)
-	var LOWER  = 'a'.charCodeAt(0)
-	var UPPER  = 'A'.charCodeAt(0)
-	var PLUS_URL_SAFE = '-'.charCodeAt(0)
-	var SLASH_URL_SAFE = '_'.charCodeAt(0)
-
-	function decode (elt) {
-		var code = elt.charCodeAt(0)
-		if (code === PLUS ||
-		    code === PLUS_URL_SAFE)
-			return 62 // '+'
-		if (code === SLASH ||
-		    code === SLASH_URL_SAFE)
-			return 63 // '/'
-		if (code < NUMBER)
-			return -1 //no match
-		if (code < NUMBER + 10)
-			return code - NUMBER + 26 + 26
-		if (code < UPPER + 26)
-			return code - UPPER
-		if (code < LOWER + 26)
-			return code - LOWER + 26
-	}
-
-	function b64ToByteArray (b64) {
-		var i, j, l, tmp, placeHolders, arr
-
-		if (b64.length % 4 > 0) {
-			throw new Error('Invalid string. Length must be a multiple of 4')
-		}
-
-		// the number of equal signs (place holders)
-		// if there are two placeholders, than the two characters before it
-		// represent one byte
-		// if there is only one, then the three characters before it represent 2 bytes
-		// this is just a cheap hack to not do indexOf twice
-		var len = b64.length
-		placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
-
-		// base64 is 4/3 + up to two characters of the original data
-		arr = new Arr(b64.length * 3 / 4 - placeHolders)
-
-		// if there are placeholders, only get up to the last complete 4 chars
-		l = placeHolders > 0 ? b64.length - 4 : b64.length
-
-		var L = 0
-
-		function push (v) {
-			arr[L++] = v
-		}
-
-		for (i = 0, j = 0; i < l; i += 4, j += 3) {
-			tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
-			push((tmp & 0xFF0000) >> 16)
-			push((tmp & 0xFF00) >> 8)
-			push(tmp & 0xFF)
-		}
-
-		if (placeHolders === 2) {
-			tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
-			push(tmp & 0xFF)
-		} else if (placeHolders === 1) {
-			tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
-			push((tmp >> 8) & 0xFF)
-			push(tmp & 0xFF)
-		}
-
-		return arr
-	}
-
-	function uint8ToBase64 (uint8) {
-		var i,
-			extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
-			output = "",
-			temp, length
-
-		function encode (num) {
-			return lookup.charAt(num)
-		}
-
-		function tripletToBase64 (num) {
-			return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
-		}
-
-		// go through the array every three bytes, we'll deal with trailing stuff later
-		for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
-			temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
-			output += tripletToBase64(temp)
-		}
-
-		// pad the end with zeros, but make sure to not forget the extra bytes
-		switch (extraBytes) {
-			case 1:
-				temp = uint8[uint8.length - 1]
-				output += encode(temp >> 2)
-				output += encode((temp << 4) & 0x3F)
-				output += '=='
-				break
-			case 2:
-				temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
-				output += encode(temp >> 10)
-				output += encode((temp >> 4) & 0x3F)
-				output += encode((temp << 2) & 0x3F)
-				output += '='
-				break
-		}
-
-		return output
-	}
-
-	exports.toByteArray = b64ToByteArray
-	exports.fromByteArray = uint8ToBase64
-}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
-
-},{}],3:[function(require,module,exports){
-(function (global){
-/*!
- * The buffer module from node.js, for the browser.
- *
- * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
- * @license  MIT
- */
-/* eslint-disable no-proto */
-
-var base64 = require('base64-js')
-var ieee754 = require('ieee754')
-var isArray = require('is-array')
-
-exports.Buffer = Buffer
-exports.SlowBuffer = SlowBuffer
-exports.INSPECT_MAX_BYTES = 50
-Buffer.poolSize = 8192 // not used by this implementation
-
-var rootParent = {}
-
-/**
- * If `Buffer.TYPED_ARRAY_SUPPORT`:
- *   === true    Use Uint8Array implementation (fastest)
- *   === false   Use Object implementation (most compatible, even IE6)
- *
- * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
- * Opera 11.6+, iOS 4.2+.
- *
- * Due to various browser bugs, sometimes the Object implementation will be used even
- * when the browser supports typed arrays.
- *
- * Note:
- *
- *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
- *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
- *
- *   - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property
- *     on objects.
- *
- *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
- *
- *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
- *     incorrect length in some situations.
-
- * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
- * get the Object implementation, which is slower but behaves correctly.
- */
-Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
-  ? global.TYPED_ARRAY_SUPPORT
-  : typedArraySupport()
-
-function typedArraySupport () {
-  function Bar () {}
-  try {
-    var arr = new Uint8Array(1)
-    arr.foo = function () { return 42 }
-    arr.constructor = Bar
-    return arr.foo() === 42 && // typed array instances can be augmented
-        arr.constructor === Bar && // constructor can be set
-        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
-        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
-  } catch (e) {
-    return false
-  }
-}
-
-function kMaxLength () {
-  return Buffer.TYPED_ARRAY_SUPPORT
-    ? 0x7fffffff
-    : 0x3fffffff
-}
-
-/**
- * Class: Buffer
- * =============
- *
- * The Buffer constructor returns instances of `Uint8Array` that are augmented
- * with function properties for all the node `Buffer` API functions. We use
- * `Uint8Array` so that square bracket notation works as expected -- it returns
- * a single octet.
- *
- * By augmenting the instances, we can avoid modifying the `Uint8Array`
- * prototype.
- */
-function Buffer (arg) {
-  if (!(this instanceof Buffer)) {
-    // Avoid going through an ArgumentsAdaptorTrampoline in the common case.
-    if (arguments.length > 1) return new Buffer(arg, arguments[1])
-    return new Buffer(arg)
-  }
-
-  this.length = 0
-  this.parent = undefined
-
-  // Common case.
-  if (typeof arg === 'number') {
-    return fromNumber(this, arg)
-  }
-
-  // Slightly less common case.
-  if (typeof arg === 'string') {
-    return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')
-  }
-
-  // Unusual.
-  return fromObject(this, arg)
-}
-
-function fromNumber (that, length) {
-  that = allocate(that, length < 0 ? 0 : checked(length) | 0)
-  if (!Buffer.TYPED_ARRAY_SUPPORT) {
-    for (var i = 0; i < length; i++) {
-      that[i] = 0
-    }
-  }
-  return that
-}
-
-function fromString (that, string, encoding) {
-  if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'
-
-  // Assumption: byteLength() return value is always < kMaxLength.
-  var length = byteLength(string, encoding) | 0
-  that = allocate(that, length)
-
-  that.write(string, encoding)
-  return that
-}
-
-function fromObject (that, object) {
-  if (Buffer.isBuffer(object)) return fromBuffer(that, object)
-
-  if (isArray(object)) return fromArray(that, object)
-
-  if (object == null) {
-    throw new TypeError('must start with number, buffer, array or string')
-  }
-
-  if (typeof ArrayBuffer !== 'undefined') {
-    if (object.buffer instanceof ArrayBuffer) {
-      return fromTypedArray(that, object)
-    }
-    if (object instanceof ArrayBuffer) {
-      return fromArrayBuffer(that, object)
-    }
-  }
-
-  if (object.length) return fromArrayLike(that, object)
-
-  return fromJsonObject(that, object)
-}
-
-function fromBuffer (that, buffer) {
-  var length = checked(buffer.length) | 0
-  that = allocate(that, length)
-  buffer.copy(that, 0, 0, length)
-  return that
-}
-
-function fromArray (that, array) {
-  var length = checked(array.length) | 0
-  that = allocate(that, length)
-  for (var i = 0; i < length; i += 1) {
-    that[i] = array[i] & 255
-  }
-  return that
-}
-
-// Duplicate of fromArray() to keep fromArray() monomorphic.
-function fromTypedArray (that, array) {
-  var length = checked(array.length) | 0
-  that = allocate(that, length)
-  // Truncating the elements is probably not what people expect from typed
-  // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior
-  // of the old Buffer constructor.
-  for (var i = 0; i < length; i += 1) {
-    that[i] = array[i] & 255
-  }
-  return that
-}
-
-function fromArrayBuffer (that, array) {
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    // Return an augmented `Uint8Array` instance, for best performance
-    array.byteLength
-    that = Buffer._augment(new Uint8Array(array))
-  } else {
-    // Fallback: Return an object instance of the Buffer class
-    that = fromTypedArray(that, new Uint8Array(array))
-  }
-  return that
-}
-
-function fromArrayLike (that, array) {
-  var length = checked(array.length) | 0
-  that = allocate(that, length)
-  for (var i = 0; i < length; i += 1) {
-    that[i] = array[i] & 255
-  }
-  return that
-}
-
-// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.
-// Returns a zero-length buffer for inputs that don't conform to the spec.
-function fromJsonObject (that, object) {
-  var array
-  var length = 0
-
-  if (object.type === 'Buffer' && isArray(object.data)) {
-    array = object.data
-    length = checked(array.length) | 0
-  }
-  that = allocate(that, length)
-
-  for (var i = 0; i < length; i += 1) {
-    that[i] = array[i] & 255
-  }
-  return that
-}
-
-if (Buffer.TYPED_ARRAY_SUPPORT) {
-  Buffer.prototype.__proto__ = Uint8Array.prototype
-  Buffer.__proto__ = Uint8Array
-}
-
-function allocate (that, length) {
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    // Return an augmented `Uint8Array` instance, for best performance
-    that = Buffer._augment(new Uint8Array(length))
-    that.__proto__ = Buffer.prototype
-  } else {
-    // Fallback: Return an object instance of the Buffer class
-    that.length = length
-    that._isBuffer = true
-  }
-
-  var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1
-  if (fromPool) that.parent = rootParent
-
-  return that
-}
-
-function checked (length) {
-  // Note: cannot use `length < kMaxLength` here because that fails when
-  // length is NaN (which is otherwise coerced to zero.)
-  if (length >= kMaxLength()) {
-    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
-                         'size: 0x' + kMaxLength().toString(16) + ' bytes')
-  }
-  return length | 0
-}
-
-function SlowBuffer (subject, encoding) {
-  if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)
-
-  var buf = new Buffer(subject, encoding)
-  delete buf.parent
-  return buf
-}
-
-Buffer.isBuffer = function isBuffer (b) {
-  return !!(b != null && b._isBuffer)
-}
-
-Buffer.compare = function compare (a, b) {
-  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
-    throw new TypeError('Arguments must be Buffers')
-  }
-
-  if (a === b) return 0
-
-  var x = a.length
-  var y = b.length
-
-  var i = 0
-  var len = Math.min(x, y)
-  while (i < len) {
-    if (a[i] !== b[i]) break
-
-    ++i
-  }
-
-  if (i !== len) {
-    x = a[i]
-    y = b[i]
-  }
-
-  if (x < y) return -1
-  if (y < x) return 1
-  return 0
-}
-
-Buffer.isEncoding = function isEncoding (encoding) {
-  switch (String(encoding).toLowerCase()) {
-    case 'hex':
-    case 'utf8':
-    case 'utf-8':
-    case 'ascii':
-    case 'binary':
-    case 'base64':
-    case 'raw':
-    case 'ucs2':
-    case 'ucs-2':
-    case 'utf16le':
-    case 'utf-16le':
-      return true
-    default:
-      return false
-  }
-}
-
-Buffer.concat = function concat (list, length) {
-  if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')
-
-  if (list.length === 0) {
-    return new Buffer(0)
-  }
-
-  var i
-  if (length === undefined) {
-    length = 0
-    for (i = 0; i < list.length; i++) {
-      length += list[i].length
-    }
-  }
-
-  var buf = new Buffer(length)
-  var pos = 0
-  for (i = 0; i < list.length; i++) {
-    var item = list[i]
-    item.copy(buf, pos)
-    pos += item.length
-  }
-  return buf
-}
-
-function byteLength (string, encoding) {
-  if (typeof string !== 'string') string = '' + string
-
-  var len = string.length
-  if (len === 0) return 0
-
-  // Use a for loop to avoid recursion
-  var loweredCase = false
-  for (;;) {
-    switch (encoding) {
-      case 'ascii':
-      case 'binary':
-      // Deprecated
-      case 'raw':
-      case 'raws':
-        return len
-      case 'utf8':
-      case 'utf-8':
-        return utf8ToBytes(string).length
-      case 'ucs2':
-      case 'ucs-2':
-      case 'utf16le':
-      case 'utf-16le':
-        return len * 2
-      case 'hex':
-        return len >>> 1
-      case 'base64':
-        return base64ToBytes(string).length
-      default:
-        if (loweredCase) return utf8ToBytes(string).length // assume utf8
-        encoding = ('' + encoding).toLowerCase()
-        loweredCase = true
-    }
-  }
-}
-Buffer.byteLength = byteLength
-
-// pre-set for values that may exist in the future
-Buffer.prototype.length = undefined
-Buffer.prototype.parent = undefined
-
-function slowToString (encoding, start, end) {
-  var loweredCase = false
-
-  start = start | 0
-  end = end === undefined || end === Infinity ? this.length : end | 0
-
-  if (!encoding) encoding = 'utf8'
-  if (start < 0) start = 0
-  if (end > this.length) end = this.length
-  if (end <= start) return ''
-
-  while (true) {
-    switch (encoding) {
-      case 'hex':
-        return hexSlice(this, start, end)
-
-      case 'utf8':
-      case 'utf-8':
-        return utf8Slice(this, start, end)
-
-      case 'ascii':
-        return asciiSlice(this, start, end)
-
-      case 'binary':
-        return binarySlice(this, start, end)
-
-      case 'base64':
-        return base64Slice(this, start, end)
-
-      case 'ucs2':
-      case 'ucs-2':
-      case 'utf16le':
-      case 'utf-16le':
-        return utf16leSlice(this, start, end)
-
-      default:
-        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
-        encoding = (encoding + '').toLowerCase()
-        loweredCase = true
-    }
-  }
-}
-
-Buffer.prototype.toString = function toString () {
-  var length = this.length | 0
-  if (length === 0) return ''
-  if (arguments.length === 0) return utf8Slice(this, 0, length)
-  return slowToString.apply(this, arguments)
-}
-
-Buffer.prototype.equals = function equals (b) {
-  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
-  if (this === b) return true
-  return Buffer.compare(this, b) === 0
-}
-
-Buffer.prototype.inspect = function inspect () {
-  var str = ''
-  var max = exports.INSPECT_MAX_BYTES
-  if (this.length > 0) {
-    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
-    if (this.length > max) str += ' ... '
-  }
-  return '<Buffer ' + str + '>'
-}
-
-Buffer.prototype.compare = function compare (b) {
-  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
-  if (this === b) return 0
-  return Buffer.compare(this, b)
-}
-
-Buffer.prototype.indexOf = function indexOf (val, byteOffset) {
-  if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff
-  else if (byteOffset < -0x80000000) byteOffset = -0x80000000
-  byteOffset >>= 0
-
-  if (this.length === 0) return -1
-  if (byteOffset >= this.length) return -1
-
-  // Negative offsets start from the end of the buffer
-  if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)
-
-  if (typeof val === 'string') {
-    if (val.length === 0) return -1 // special case: looking for empty string always fails
-    return String.prototype.indexOf.call(this, val, byteOffset)
-  }
-  if (Buffer.isBuffer(val)) {
-    return arrayIndexOf(this, val, byteOffset)
-  }
-  if (typeof val === 'number') {
-    if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {
-      return Uint8Array.prototype.indexOf.call(this, val, byteOffset)
-    }
-    return arrayIndexOf(this, [ val ], byteOffset)
-  }
-
-  function arrayIndexOf (arr, val, byteOffset) {
-    var foundIndex = -1
-    for (var i = 0; byteOffset + i < arr.length; i++) {
-      if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {
-        if (foundIndex === -1) foundIndex = i
-        if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex
-      } else {
-        foundIndex = -1
-      }
-    }
-    return -1
-  }
-
-  throw new TypeError('val must be string, number or Buffer')
-}
-
-// `get` is deprecated
-Buffer.prototype.get = function get (offset) {
-  console.log('.get() is deprecated. Access using array indexes instead.')
-  return this.readUInt8(offset)
-}
-
-// `set` is deprecated
-Buffer.prototype.set = function set (v, offset) {
-  console.log('.set() is deprecated. Access using array indexes instead.')
-  return this.writeUInt8(v, offset)
-}
-
-function hexWrite (buf, string, offset, length) {
-  offset = Number(offset) || 0
-  var remaining = buf.length - offset
-  if (!length) {
-    length = remaining
-  } else {
-    length = Number(length)
-    if (length > remaining) {
-      length = remaining
-    }
-  }
-
-  // must be an even number of digits
-  var strLen = string.length
-  if (strLen % 2 !== 0) throw new Error('Invalid hex string')
-
-  if (length > strLen / 2) {
-    length = strLen / 2
-  }
-  for (var i = 0; i < length; i++) {
-    var parsed = parseInt(string.substr(i * 2, 2), 16)
-    if (isNaN(parsed)) throw new Error('Invalid hex string')
-    buf[offset + i] = parsed
-  }
-  return i
-}
-
-function utf8Write (buf, string, offset, length) {
-  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
-}
-
-function asciiWrite (buf, string, offset, length) {
-  return blitBuffer(asciiToBytes(string), buf, offset, length)
-}
-
-function binaryWrite (buf, string, offset, length) {
-  return asciiWrite(buf, string, offset, length)
-}
-
-function base64Write (buf, string, offset, length) {
-  return blitBuffer(base64ToBytes(string), buf, offset, length)
-}
-
-function ucs2Write (buf, string, offset, length) {
-  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
-}
-
-Buffer.prototype.write = function write (string, offset, length, encoding) {
-  // Buffer#write(string)
-  if (offset === undefined) {
-    encoding = 'utf8'
-    length = this.length
-    offset = 0
-  // Buffer#write(string, encoding)
-  } else if (length === undefined && typeof offset === 'string') {
-    encoding = offset
-    length = this.length
-    offset = 0
-  // Buffer#write(string, offset[, length][, encoding])
-  } else if (isFinite(offset)) {
-    offset = offset | 0
-    if (isFinite(length)) {
-      length = length | 0
-      if (encoding === undefined) encoding = 'utf8'
-    } else {
-      encoding = length
-      length = undefined
-    }
-  // legacy write(string, encoding, offset, length) - remove in v0.13
-  } else {
-    var swap = encoding
-    encoding = offset
-    offset = length | 0
-    length = swap
-  }
-
-  var remaining = this.length - offset
-  if (length === undefined || length > remaining) length = remaining
-
-  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
-    throw new RangeError('attempt to write outside buffer bounds')
-  }
-
-  if (!encoding) encoding = 'utf8'
-
-  var loweredCase = false
-  for (;;) {
-    switch (encoding) {
-      case 'hex':
-        return hexWrite(this, string, offset, length)
-
-      case 'utf8':
-      case 'utf-8':
-        return utf8Write(this, string, offset, length)
-
-      case 'ascii':
-        return asciiWrite(this, string, offset, length)
-
-      case 'binary':
-        return binaryWrite(this, string, offset, length)
-
-      case 'base64':
-        // Warning: maxLength not taken into account in base64Write
-        return base64Write(this, string, offset, length)
-
-      case 'ucs2':
-      case 'ucs-2':
-      case 'utf16le':
-      case 'utf-16le':
-        return ucs2Write(this, string, offset, length)
-
-      default:
-        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
-        encoding = ('' + encoding).toLowerCase()
-        loweredCase = true
-    }
-  }
-}
-
-Buffer.prototype.toJSON = function toJSON () {
-  return {
-    type: 'Buffer',
-    data: Array.prototype.slice.call(this._arr || this, 0)
-  }
-}
-
-function base64Slice (buf, start, end) {
-  if (start === 0 && end === buf.length) {
-    return base64.fromByteArray(buf)
-  } else {
-    return base64.fromByteArray(buf.slice(start, end))
-  }
-}
-
-function utf8Slice (buf, start, end) {
-  end = Math.min(buf.length, end)
-  var res = []
-
-  var i = start
-  while (i < end) {
-    var firstByte = buf[i]
-    var codePoint = null
-    var bytesPerSequence = (firstByte > 0xEF) ? 4
-      : (firstByte > 0xDF) ? 3
-      : (firstByte > 0xBF) ? 2
-      : 1
-
-    if (i + bytesPerSequence <= end) {
-      var secondByte, thirdByte, fourthByte, tempCodePoint
-
-      switch (bytesPerSequence) {
-        case 1:
-          if (firstByte < 0x80) {
-            codePoint = firstByte
-          }
-          break
-        case 2:
-          secondByte = buf[i + 1]
-          if ((secondByte & 0xC0) === 0x80) {
-            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
-            if (tempCodePoint > 0x7F) {
-              codePoint = tempCodePoint
-            }
-          }
-          break
-        case 3:
-          secondByte = buf[i + 1]
-          thirdByte = buf[i + 2]
-          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
-            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
-            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
-              codePoint = tempCodePoint
-            }
-          }
-          break
-        case 4:
-          secondByte = buf[i + 1]
-          thirdByte = buf[i + 2]
-          fourthByte = buf[i + 3]
-          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
-            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
-            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
-              codePoint = tempCodePoint
-            }
-          }
-      }
-    }
-
-    if (codePoint === null) {
-      // we did not generate a valid codePoint so insert a
-      // replacement char (U+FFFD) and advance only 1 byte
-      codePoint = 0xFFFD
-      bytesPerSequence = 1
-    } else if (codePoint > 0xFFFF) {
-      // encode to utf16 (surrogate pair dance)
-      codePoint -= 0x10000
-      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
-      codePoint = 0xDC00 | codePoint & 0x3FF
-    }
-
-    res.push(codePoint)
-    i += bytesPerSequence
-  }
-
-  return decodeCodePointsArray(res)
-}
-
-// Based on http://stackoverflow.com/a/22747272/680742, the browser with
-// the lowest limit is Chrome, with 0x10000 args.
-// We go 1 magnitude less, for safety
-var MAX_ARGUMENTS_LENGTH = 0x1000
-
-function decodeCodePointsArray (codePoints) {
-  var len = codePoints.length
-  if (len <= MAX_ARGUMENTS_LENGTH) {
-    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
-  }
-
-  // Decode in chunks to avoid "call stack size exceeded".
-  var res = ''
-  var i = 0
-  while (i < len) {
-    res += String.fromCharCode.apply(
-      String,
-      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
-    )
-  }
-  return res
-}
-
-function asciiSlice (buf, start, end) {
-  var ret = ''
-  end = Math.min(buf.length, end)
-
-  for (var i = start; i < end; i++) {
-    ret += String.fromCharCode(buf[i] & 0x7F)
-  }
-  return ret
-}
-
-function binarySlice (buf, start, end) {
-  var ret = ''
-  end = Math.min(buf.length, end)
-
-  for (var i = start; i < end; i++) {
-    ret += String.fromCharCode(buf[i])
-  }
-  return ret
-}
-
-function hexSlice (buf, start, end) {
-  var len = buf.length
-
-  if (!start || start < 0) start = 0
-  if (!end || end < 0 || end > len) end = len
-
-  var out = ''
-  for (var i = start; i < end; i++) {
-    out += toHex(buf[i])
-  }
-  return out
-}
-
-function utf16leSlice (buf, start, end) {
-  var bytes = buf.slice(start, end)
-  var res = ''
-  for (var i = 0; i < bytes.length; i += 2) {
-    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
-  }
-  return res
-}
-
-Buffer.prototype.slice = function slice (start, end) {
-  var len = this.length
-  start = ~~start
-  end = end === undefined ? len : ~~end
-
-  if (start < 0) {
-    start += len
-    if (start < 0) start = 0
-  } else if (start > len) {
-    start = len
-  }
-
-  if (end < 0) {
-    end += len
-    if (end < 0) end = 0
-  } else if (end > len) {
-    end = len
-  }
-
-  if (end < start) end = start
-
-  var newBuf
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    newBuf = Buffer._augment(this.subarray(start, end))
-  } else {
-    var sliceLen = end - start
-    newBuf = new Buffer(sliceLen, undefined)
-    for (var i = 0; i < sliceLen; i++) {
-      newBuf[i] = this[i + start]
-    }
-  }
-
-  if (newBuf.length) newBuf.parent = this.parent || this
-
-  return newBuf
-}
-
-/*
- * Need to make sure that buffer isn't trying to write out of bounds.
- */
-function checkOffset (offset, ext, length) {
-  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
-  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
-}
-
-Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
-  offset = offset | 0
-  byteLength = byteLength | 0
-  if (!noAssert) checkOffset(offset, byteLength, this.length)
-
-  var val = this[offset]
-  var mul = 1
-  var i = 0
-  while (++i < byteLength && (mul *= 0x100)) {
-    val += this[offset + i] * mul
-  }
-
-  return val
-}
-
-Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
-  offset = offset | 0
-  byteLength = byteLength | 0
-  if (!noAssert) {
-    checkOffset(offset, byteLength, this.length)
-  }
-
-  var val = this[offset + --byteLength]
-  var mul = 1
-  while (byteLength > 0 && (mul *= 0x100)) {
-    val += this[offset + --byteLength] * mul
-  }
-
-  return val
-}
-
-Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 1, this.length)
-  return this[offset]
-}
-
-Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  return this[offset] | (this[offset + 1] << 8)
-}
-
-Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  return (this[offset] << 8) | this[offset + 1]
-}
-
-Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return ((this[offset]) |
-      (this[offset + 1] << 8) |
-      (this[offset + 2] << 16)) +
-      (this[offset + 3] * 0x1000000)
-}
-
-Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return (this[offset] * 0x1000000) +
-    ((this[offset + 1] << 16) |
-    (this[offset + 2] << 8) |
-    this[offset + 3])
-}
-
-Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
-  offset = offset | 0
-  byteLength = byteLength | 0
-  if (!noAssert) checkOffset(offset, byteLength, this.length)
-
-  var val = this[offset]
-  var mul = 1
-  var i = 0
-  while (++i < byteLength && (mul *= 0x100)) {
-    val += this[offset + i] * mul
-  }
-  mul *= 0x80
-
-  if (val >= mul) val -= Math.pow(2, 8 * byteLength)
-
-  return val
-}
-
-Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
-  offset = offset | 0
-  byteLength = byteLength | 0
-  if (!noAssert) checkOffset(offset, byteLength, this.length)
-
-  var i = byteLength
-  var mul = 1
-  var val = this[offset + --i]
-  while (i > 0 && (mul *= 0x100)) {
-    val += this[offset + --i] * mul
-  }
-  mul *= 0x80
-
-  if (val >= mul) val -= Math.pow(2, 8 * byteLength)
-
-  return val
-}
-
-Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 1, this.length)
-  if (!(this[offset] & 0x80)) return (this[offset])
-  return ((0xff - this[offset] + 1) * -1)
-}
-
-Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  var val = this[offset] | (this[offset + 1] << 8)
-  return (val & 0x8000) ? val | 0xFFFF0000 : val
-}
-
-Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  var val = this[offset + 1] | (this[offset] << 8)
-  return (val & 0x8000) ? val | 0xFFFF0000 : val
-}
-
-Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return (this[offset]) |
-    (this[offset + 1] << 8) |
-    (this[offset + 2] << 16) |
-    (this[offset + 3] << 24)
-}
-
-Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return (this[offset] << 24) |
-    (this[offset + 1] << 16) |
-    (this[offset + 2] << 8) |
-    (this[offset + 3])
-}
-
-Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-  return ieee754.read(this, offset, true, 23, 4)
-}
-
-Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-  return ieee754.read(this, offset, false, 23, 4)
-}
-
-Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 8, this.length)
-  return ieee754.read(this, offset, true, 52, 8)
-}
-
-Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 8, this.length)
-  return ieee754.read(this, offset, false, 52, 8)
-}
-
-function checkInt (buf, value, offset, ext, max, min) {
-  if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
-  if (value > max || value < min) throw new RangeError('value is out of bounds')
-  if (offset + ext > buf.length) throw new RangeError('index out of range')
-}
-
-Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset | 0
-  byteLength = byteLength | 0
-  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
-
-  var mul = 1
-  var i = 0
-  this[offset] = value & 0xFF
-  while (++i < byteLength && (mul *= 0x100)) {
-    this[offset + i] = (value / mul) & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset | 0
-  byteLength = byteLength | 0
-  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
-
-  var i = byteLength - 1
-  var mul = 1
-  this[offset + i] = value & 0xFF
-  while (--i >= 0 && (mul *= 0x100)) {
-    this[offset + i] = (value / mul) & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
-  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
-  this[offset] = (value & 0xff)
-  return offset + 1
-}
-
-function objectWriteUInt16 (buf, value, offset, littleEndian) {
-  if (value < 0) value = 0xffff + value + 1
-  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
-    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
-      (littleEndian ? i : 1 - i) * 8
-  }
-}
-
-Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value & 0xff)
-    this[offset + 1] = (value >>> 8)
-  } else {
-    objectWriteUInt16(this, value, offset, true)
-  }
-  return offset + 2
-}
-
-Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 8)
-    this[offset + 1] = (value & 0xff)
-  } else {
-    objectWriteUInt16(this, value, offset, false)
-  }
-  return offset + 2
-}
-
-function objectWriteUInt32 (buf, value, offset, littleEndian) {
-  if (value < 0) value = 0xffffffff + value + 1
-  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
-    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
-  }
-}
-
-Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset + 3] = (value >>> 24)
-    this[offset + 2] = (value >>> 16)
-    this[offset + 1] = (value >>> 8)
-    this[offset] = (value & 0xff)
-  } else {
-    objectWriteUInt32(this, value, offset, true)
-  }
-  return offset + 4
-}
-
-Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 24)
-    this[offset + 1] = (value >>> 16)
-    this[offset + 2] = (value >>> 8)
-    this[offset + 3] = (value & 0xff)
-  } else {
-    objectWriteUInt32(this, value, offset, false)
-  }
-  return offset + 4
-}
-
-Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) {
-    var limit = Math.pow(2, 8 * byteLength - 1)
-
-    checkInt(this, value, offset, byteLength, limit - 1, -limit)
-  }
-
-  var i = 0
-  var mul = 1
-  var sub = value < 0 ? 1 : 0
-  this[offset] = value & 0xFF
-  while (++i < byteLength && (mul *= 0x100)) {
-    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) {
-    var limit = Math.pow(2, 8 * byteLength - 1)
-
-    checkInt(this, value, offset, byteLength, limit - 1, -limit)
-  }
-
-  var i = byteLength - 1
-  var mul = 1
-  var sub = value < 0 ? 1 : 0
-  this[offset + i] = value & 0xFF
-  while (--i >= 0 && (mul *= 0x100)) {
-    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
-  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
-  if (value < 0) value = 0xff + value + 1
-  this[offset] = (value & 0xff)
-  return offset + 1
-}
-
-Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value & 0xff)
-    this[offset + 1] = (value >>> 8)
-  } else {
-    objectWriteUInt16(this, value, offset, true)
-  }
-  return offset + 2
-}
-
-Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 8)
-    this[offset + 1] = (value & 0xff)
-  } else {
-    objectWriteUInt16(this, value, offset, false)
-  }
-  return offset + 2
-}
-
-Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value & 0xff)
-    this[offset + 1] = (value >>> 8)
-    this[offset + 2] = (value >>> 16)
-    this[offset + 3] = (value >>> 24)
-  } else {
-    objectWriteUInt32(this, value, offset, true)
-  }
-  return offset + 4
-}
-
-Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
-  if (value < 0) value = 0xffffffff + value + 1
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 24)
-    this[offset + 1] = (value >>> 16)
-    this[offset + 2] = (value >>> 8)
-    this[offset + 3] = (value & 0xff)
-  } else {
-    objectWriteUInt32(this, value, offset, false)
-  }
-  return offset + 4
-}
-
-function checkIEEE754 (buf, value, offset, ext, max, min) {
-  if (value > max || value < min) throw new RangeError('value is out of bounds')
-  if (offset + ext > buf.length) throw new RangeError('index out of range')
-  if (offset < 0) throw new RangeError('index out of range')
-}
-
-function writeFloat (buf, value, offset, littleEndian, noAssert) {
-  if (!noAssert) {
-    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
-  }
-  ieee754.write(buf, value, offset, littleEndian, 23, 4)
-  return offset + 4
-}
-
-Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
-  return writeFloat(this, value, offset, true, noAssert)
-}
-
-Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
-  return writeFloat(this, value, offset, false, noAssert)
-}
-
-function writeDouble (buf, value, offset, littleEndian, noAssert) {
-  if (!noAssert) {
-    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
-  }
-  ieee754.write(buf, value, offset, littleEndian, 52, 8)
-  return offset + 8
-}
-
-Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
-  return writeDouble(this, value, offset, true, noAssert)
-}
-
-Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
-  return writeDouble(this, value, offset, false, noAssert)
-}
-
-// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
-Buffer.prototype.copy = function copy (target, targetStart, start, end) {
-  if (!start) start = 0
-  if (!end && end !== 0) end = this.length
-  if (targetStart >= target.length) targetStart = target.length
-  if (!targetStart) targetStart = 0
-  if (end > 0 && end < start) end = start
-
-  // Copy 0 bytes; we're done
-  if (end === start) return 0
-  if (target.length === 0 || this.length === 0) return 0
-
-  // Fatal error conditions
-  if (targetStart < 0) {
-    throw new RangeError('targetStart out of bounds')
-  }
-  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
-  if (end < 0) throw new RangeError('sourceEnd out of bounds')
-
-  // Are we oob?
-  if (end > this.length) end = this.length
-  if (target.length - targetStart < end - start) {
-    end = target.length - targetStart + start
-  }
-
-  var len = end - start
-  var i
-
-  if (this === target && start < targetStart && targetStart < end) {
-    // descending copy from end
-    for (i = len - 1; i >= 0; i--) {
-      target[i + targetStart] = this[i + start]
-    }
-  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
-    // ascending copy from start
-    for (i = 0; i < len; i++) {
-      target[i + targetStart] = this[i + start]
-    }
-  } else {
-    target._set(this.subarray(start, start + len), targetStart)
-  }
-
-  return len
-}
-
-// fill(value, start=0, end=buffer.length)
-Buffer.prototype.fill = function fill (value, start, end) {
-  if (!value) value = 0
-  if (!start) start = 0
-  if (!end) end = this.length
-
-  if (end < start) throw new RangeError('end < start')
-
-  // Fill 0 bytes; we're done
-  if (end === start) return
-  if (this.length === 0) return
-
-  if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')
-  if (end < 0 || end > this.length) throw new RangeError('end out of bounds')
-
-  var i
-  if (typeof value === 'number') {
-    for (i = start; i < end; i++) {
-      this[i] = value
-    }
-  } else {
-    var bytes = utf8ToBytes(value.toString())
-    var len = bytes.length
-    for (i = start; i < end; i++) {
-      this[i] = bytes[i % len]
-    }
-  }
-
-  return this
-}
-
-/**
- * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
- * Added in Node 0.12. Only available in browsers that support ArrayBuffer.
- */
-Buffer.prototype.toArrayBuffer = function toArrayBuffer () {
-  if (typeof Uint8Array !== 'undefined') {
-    if (Buffer.TYPED_ARRAY_SUPPORT) {
-      return (new Buffer(this)).buffer
-    } else {
-      var buf = new Uint8Array(this.length)
-      for (var i = 0, len = buf.length; i < len; i += 1) {
-        buf[i] = this[i]
-      }
-      return buf.buffer
-    }
-  } else {
-    throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
-  }
-}
-
-// HELPER FUNCTIONS
-// ================
-
-var BP = Buffer.prototype
-
-/**
- * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
- */
-Buffer._augment = function _augment (arr) {
-  arr.constructor = Buffer
-  arr._isBuffer = true
-
-  // save reference to original Uint8Array set method before overwriting
-  arr._set = arr.set
-
-  // deprecated
-  arr.get = BP.get
-  arr.set = BP.set
-
-  arr.write = BP.write
-  arr.toString = BP.toString
-  arr.toLocaleString = BP.toString
-  arr.toJSON = BP.toJSON
-  arr.equals = BP.equals
-  arr.compare = BP.compare
-  arr.indexOf = BP.indexOf
-  arr.copy = BP.copy
-  arr.slice = BP.slice
-  arr.readUIntLE = BP.readUIntLE
-  arr.readUIntBE = BP.readUIntBE
-  arr.readUInt8 = BP.readUInt8
-  arr.readUInt16LE = BP.readUInt16LE
-  arr.readUInt16BE = BP.readUInt16BE
-  arr.readUInt32LE = BP.readUInt32LE
-  arr.readUInt32BE = BP.readUInt32BE
-  arr.readIntLE = BP.readIntLE
-  arr.readIntBE = BP.readIntBE
-  arr.readInt8 = BP.readInt8
-  arr.readInt16LE = BP.readInt16LE
-  arr.readInt16BE = BP.readInt16BE
-  arr.readInt32LE = BP.readInt32LE
-  arr.readInt32BE = BP.readInt32BE
-  arr.readFloatLE = BP.readFloatLE
-  arr.readFloatBE = BP.readFloatBE
-  arr.readDoubleLE = BP.readDoubleLE
-  arr.readDoubleBE = BP.readDoubleBE
-  arr.writeUInt8 = BP.writeUInt8
-  arr.writeUIntLE = BP.writeUIntLE
-  arr.writeUIntBE = BP.writeUIntBE
-  arr.writeUInt16LE = BP.writeUInt16LE
-  arr.writeUInt16BE = BP.writeUInt16BE
-  arr.writeUInt32LE = BP.writeUInt32LE
-  arr.writeUInt32BE = BP.writeUInt32BE
-  arr.writeIntLE = BP.writeIntLE
-  arr.writeIntBE = BP.writeIntBE
-  arr.writeInt8 = BP.writeInt8
-  arr.writeInt16LE = BP.writeInt16LE
-  arr.writeInt16BE = BP.writeInt16BE
-  arr.writeInt32LE = BP.writeInt32LE
-  arr.writeInt32BE = BP.writeInt32BE
-  arr.writeFloatLE = BP.writeFloatLE
-  arr.writeFloatBE = BP.writeFloatBE
-  arr.writeDoubleLE = BP.writeDoubleLE
-  arr.writeDoubleBE = BP.writeDoubleBE
-  arr.fill = BP.fill
-  arr.inspect = BP.inspect
-  arr.toArrayBuffer = BP.toArrayBuffer
-
-  return arr
-}
-
-var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
-
-function base64clean (str) {
-  // Node strips out invalid characters like \n and \t from the string, base64-js does not
-  str = stringtrim(str).replace(INVALID_BASE64_RE, '')
-  // Node converts strings with length < 2 to ''
-  if (str.length < 2) return ''
-  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
-  while (str.length % 4 !== 0) {
-    str = str + '='
-  }
-  return str
-}
-
-function stringtrim (str) {
-  if (str.trim) return str.trim()
-  return str.replace(/^\s+|\s+$/g, '')
-}
-
-function toHex (n) {
-  if (n < 16) return '0' + n.toString(16)
-  return n.toString(16)
-}
-
-function utf8ToBytes (string, units) {
-  units = units || Infinity
-  var codePoint
-  var length = string.length
-  var leadSurrogate = null
-  var bytes = []
-
-  for (var i = 0; i < length; i++) {
-    codePoint = string.charCodeAt(i)
-
-    // is surrogate component
-    if (codePoint > 0xD7FF && codePoint < 0xE000) {
-      // last char was a lead
-      if (!leadSurrogate) {
-        // no lead yet
-        if (codePoint > 0xDBFF) {
-          // unexpected trail
-          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-          continue
-        } else if (i + 1 === length) {
-          // unpaired lead
-          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-          continue
-        }
-
-        // valid lead
-        leadSurrogate = codePoint
-
-        continue
-      }
-
-      // 2 leads in a row
-      if (codePoint < 0xDC00) {
-        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-        leadSurrogate = codePoint
-        continue
-      }
-
-      // valid surrogate pair
-      codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000
-    } else if (leadSurrogate) {
-      // valid bmp char, but last char was a lead
-      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-    }
-
-    leadSurrogate = null
-
-    // encode utf8
-    if (codePoint < 0x80) {
-      if ((units -= 1) < 0) break
-      bytes.push(codePoint)
-    } else if (codePoint < 0x800) {
-      if ((units -= 2) < 0) break
-      bytes.push(
-        codePoint >> 0x6 | 0xC0,
-        codePoint & 0x3F | 0x80
-      )
-    } else if (codePoint < 0x10000) {
-      if ((units -= 3) < 0) break
-      bytes.push(
-        codePoint >> 0xC | 0xE0,
-        codePoint >> 0x6 & 0x3F | 0x80,
-        codePoint & 0x3F | 0x80
-      )
-    } else if (codePoint < 0x110000) {
-      if ((units -= 4) < 0) break
-      bytes.push(
-        codePoint >> 0x12 | 0xF0,
-        codePoint >> 0xC & 0x3F | 0x80,
-        codePoint >> 0x6 & 0x3F | 0x80,
-        codePoint & 0x3F | 0x80
-      )
-    } else {
-      throw new Error('Invalid code point')
-    }
-  }
-
-  return bytes
-}
-
-function asciiToBytes (str) {
-  var byteArray = []
-  for (var i = 0; i < str.length; i++) {
-    // Node's code seems to be doing this and not & 0x7F..
-    byteArray.push(str.charCodeAt(i) & 0xFF)
-  }
-  return byteArray
-}
-
-function utf16leToBytes (str, units) {
-  var c, hi, lo
-  var byteArray = []
-  for (var i = 0; i < str.length; i++) {
-    if ((units -= 2) < 0) break
-
-    c = str.charCodeAt(i)
-    hi = c >> 8
-    lo = c % 256
-    byteArray.push(lo)
-    byteArray.push(hi)
-  }
-
-  return byteArray
-}
-
-function base64ToBytes (str) {
-  return base64.toByteArray(base64clean(str))
-}
-
-function blitBuffer (src, dst, offset, length) {
-  for (var i = 0; i < length; i++) {
-    if ((i + offset >= dst.length) || (i >= src.length)) break
-    dst[i + offset] = src[i]
-  }
-  return i
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"base64-js":2,"ieee754":4,"is-array":5}],4:[function(require,module,exports){
-exports.read = function (buffer, offset, isLE, mLen, nBytes) {
-  var e, m
-  var eLen = nBytes * 8 - mLen - 1
-  var eMax = (1 << eLen) - 1
-  var eBias = eMax >> 1
-  var nBits = -7
-  var i = isLE ? (nBytes - 1) : 0
-  var d = isLE ? -1 : 1
-  var s = buffer[offset + i]
-
-  i += d
-
-  e = s & ((1 << (-nBits)) - 1)
-  s >>= (-nBits)
-  nBits += eLen
-  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
-
-  m = e & ((1 << (-nBits)) - 1)
-  e >>= (-nBits)
-  nBits += mLen
-  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
-
-  if (e === 0) {
-    e = 1 - eBias
-  } else if (e === eMax) {
-    return m ? NaN : ((s ? -1 : 1) * Infinity)
-  } else {
-    m = m + Math.pow(2, mLen)
-    e = e - eBias
-  }
-  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
-}
-
-exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
-  var e, m, c
-  var eLen = nBytes * 8 - mLen - 1
-  var eMax = (1 << eLen) - 1
-  var eBias = eMax >> 1
-  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
-  var i = isLE ? 0 : (nBytes - 1)
-  var d = isLE ? 1 : -1
-  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
-
-  value = Math.abs(value)
-
-  if (isNaN(value) || value === Infinity) {
-    m = isNaN(value) ? 1 : 0
-    e = eMax
-  } else {
-    e = Math.floor(Math.log(value) / Math.LN2)
-    if (value * (c = Math.pow(2, -e)) < 1) {
-      e--
-      c *= 2
-    }
-    if (e + eBias >= 1) {
-      value += rt / c
-    } else {
-      value += rt * Math.pow(2, 1 - eBias)
-    }
-    if (value * c >= 2) {
-      e++
-      c /= 2
-    }
-
-    if (e + eBias >= eMax) {
-      m = 0
-      e = eMax
-    } else if (e + eBias >= 1) {
-      m = (value * c - 1) * Math.pow(2, mLen)
-      e = e + eBias
-    } else {
-      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
-      e = 0
-    }
-  }
-
-  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
-
-  e = (e << mLen) | m
-  eLen += mLen
-  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
-
-  buffer[offset + i - d] |= s * 128
-}
-
-},{}],5:[function(require,module,exports){
-
-/**
- * isArray
- */
-
-var isArray = Array.isArray;
-
-/**
- * toString
- */
-
-var str = Object.prototype.toString;
-
-/**
- * Whether or not the given `val`
- * is an array.
- *
- * example:
- *
- *        isArray([]);
- *        // > true
- *        isArray(arguments);
- *        // > false
- *        isArray('');
- *        // > false
- *
- * @param {mixed} val
- * @return {bool}
- */
-
-module.exports = isArray || function (val) {
-  return !! val && '[object Array]' == str.call(val);
-};
-
-},{}],6:[function(require,module,exports){
-(function (global){
-
-/**
- * Module exports.
- */
-
-module.exports = deprecate;
-
-/**
- * Mark that a method should not be used.
- * Returns a modified function which warns once by default.
- *
- * If `localStorage.noDeprecation = true` is set, then it is a no-op.
- *
- * If `localStorage.throwDeprecation = true` is set, then deprecated functions
- * will throw an Error when invoked.
- *
- * If `localStorage.traceDeprecation = true` is set, then deprecated functions
- * will invoke `console.trace()` instead of `console.error()`.
- *
- * @param {Function} fn - the function to deprecate
- * @param {String} msg - the string to print to the console when `fn` is invoked
- * @returns {Function} a new "deprecated" version of `fn`
- * @api public
- */
-
-function deprecate (fn, msg) {
-  if (config('noDeprecation')) {
-    return fn;
-  }
-
-  var warned = false;
-  function deprecated() {
-    if (!warned) {
-      if (config('throwDeprecation')) {
-        throw new Error(msg);
-      } else if (config('traceDeprecation')) {
-        console.trace(msg);
-      } else {
-        console.warn(msg);
-      }
-      warned = true;
-    }
-    return fn.apply(this, arguments);
-  }
-
-  return deprecated;
-}
-
-/**
- * Checks `localStorage` for boolean values for the given `name`.
- *
- * @param {String} name
- * @returns {Boolean}
- * @api private
- */
-
-function config (name) {
-  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
-  try {
-    if (!global.localStorage) return false;
-  } catch (_) {
-    return false;
-  }
-  var val = global.localStorage[name];
-  if (null == val) return false;
-  return String(val).toLowerCase() === 'true';
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}],7:[function(require,module,exports){
-function DOMParser(options){
-	this.options = options ||{locator:{}};
-	
-}
-DOMParser.prototype.parseFromString = function(source,mimeType){	
-	var options = this.options;
-	var sax =  new XMLReader();
-	var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
-	var errorHandler = options.errorHandler;
-	var locator = options.locator;
-	var defaultNSMap = options.xmlns||{};
-	var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
-	if(locator){
-		domBuilder.setDocumentLocator(locator)
-	}
-	
-	sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
-	sax.domBuilder = options.domBuilder || domBuilder;
-	if(/\/x?html?$/.test(mimeType)){
-		entityMap.nbsp = '\xa0';
-		entityMap.copy = '\xa9';
-		defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
-	}
-	if(source){
-		sax.parse(source,defaultNSMap,entityMap);
-	}else{
-		sax.errorHandler.error("invalid document source");
-	}
-	return domBuilder.document;
-}
-function buildErrorHandler(errorImpl,domBuilder,locator){
-	if(!errorImpl){
-		if(domBuilder instanceof DOMHandler){
-			return domBuilder;
-		}
-		errorImpl = domBuilder ;
-	}
-	var errorHandler = {}
-	var isCallback = errorImpl instanceof Function;
-	locator = locator||{}
-	function build(key){
-		var fn = errorImpl[key];
-		if(!fn){
-			if(isCallback){
-				fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
-			}else{
-				var i=arguments.length;
-				while(--i){
-					if(fn = errorImpl[arguments[i]]){
-						break;
-					}
-				}
-			}
-		}
-		errorHandler[key] = fn && function(msg){
-			fn(msg+_locator(locator));
-		}||function(){};
-	}
-	build('warning','warn');
-	build('error','warn','warning');
-	build('fatalError','warn','warning','error');
-	return errorHandler;
-}
-/**
- * +ContentHandler+ErrorHandler
- * +LexicalHandler+EntityResolver2
- * -DeclHandler-DTDHandler 
- * 
- * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
- * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
- * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
- */
-function DOMHandler() {
-    this.cdata = false;
-}
-function position(locator,node){
-	node.lineNumber = locator.lineNumber;
-	node.columnNumber = locator.columnNumber;
-}
-/**
- * @see org.xml.sax.ContentHandler#startDocument
- * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
- */ 
-DOMHandler.prototype = {
-	startDocument : function() {
-    	this.document = new DOMImplementation().createDocument(null, null, null);
-    	if (this.locator) {
-        	this.document.documentURI = this.locator.systemId;
-    	}
-	},
-	startElement:function(namespaceURI, localName, qName, attrs) {
-		var doc = this.document;
-	    var el = doc.createElementNS(namespaceURI, qName||localName);
-	    var len = attrs.length;
-	    appendElement(this, el);
-	    this.currentElement = el;
-	    
-		this.locator && position(this.locator,el)
-	    for (var i = 0 ; i < len; i++) {
-	        var namespaceURI = attrs.getURI(i);
-	        var value = attrs.getValue(i);
-	        var qName = attrs.getQName(i);
-			var attr = doc.createAttributeNS(namespaceURI, qName);
-			if( attr.getOffset){
-				position(attr.getOffset(1),attr)
-			}
-			attr.value = attr.nodeValue = value;
-			el.setAttributeNode(attr)
-	    }
-	},
-	endElement:function(namespaceURI, localName, qName) {
-		var current = this.currentElement
-	    var tagName = current.tagName;
-	    this.currentElement = current.parentNode;
-	},
-	startPrefixMapping:function(prefix, uri) {
-	},
-	endPrefixMapping:function(prefix) {
-	},
-	processingInstruction:function(target, data) {
-	    var ins = this.document.createProcessingInstruction(target, data);
-	    this.locator && position(this.locator,ins)
-	    appendElement(this, ins);
-	},
-	ignorableWhitespace:function(ch, start, length) {
-	},
-	characters:function(chars, start, length) {
-		chars = _toString.apply(this,arguments)
-		//console.log(chars)
-		if(this.currentElement && chars){
-			if (this.cdata) {
-				var charNode = this.document.createCDATASection(chars);
-				this.currentElement.appendChild(charNode);
-			} else {
-				var charNode = this.document.createTextNode(chars);
-				this.currentElement.appendChild(charNode);
-			}
-			this.locator && position(this.locator,charNode)
-		}
-	},
-	skippedEntity:function(name) {
-	},
-	endDocument:function() {
-		this.document.normalize();
-	},
-	setDocumentLocator:function (locator) {
-	    if(this.locator = locator){// && !('lineNumber' in locator)){
-	    	locator.lineNumber = 0;
-	    }
-	},
-	//LexicalHandler
-	comment:function(chars, start, length) {
-		chars = _toString.apply(this,arguments)
-	    var comm = this.document.createComment(chars);
-	    this.locator && position(this.locator,comm)
-	    appendElement(this, comm);
-	},
-	
-	startCDATA:function() {
-	    //used in characters() methods
-	    this.cdata = true;
-	},
-	endCDATA:function() {
-	    this.cdata = false;
-	},
-	
-	startDTD:function(name, publicId, systemId) {
-		var impl = this.document.implementation;
-	    if (impl && impl.createDocumentType) {
-	        var dt = impl.createDocumentType(name, publicId, systemId);
-	        this.locator && position(this.locator,dt)
-	        appendElement(this, dt);
-	    }
-	},
-	/**
-	 * @see org.xml.sax.ErrorHandler
-	 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
-	 */
-	warning:function(error) {
-		console.warn(error,_locator(this.locator));
-	},
-	error:function(error) {
-		console.error(error,_locator(this.locator));
-	},
-	fatalError:function(error) {
-		console.error(error,_locator(this.locator));
-	    throw error;
-	}
-}
-function _locator(l){
-	if(l){
-		return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
-	}
-}
-function _toString(chars,start,length){
-	if(typeof chars == 'string'){
-		return chars.substr(start,length)
-	}else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
-		if(chars.length >= start+length || start){
-			return new java.lang.String(chars,start,length)+'';
-		}
-		return chars;
-	}
-}
-
-/*
- * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
- * used method of org.xml.sax.ext.LexicalHandler:
- *  #comment(chars, start, length)
- *  #startCDATA()
- *  #endCDATA()
- *  #startDTD(name, publicId, systemId)
- *
- *
- * IGNORED method of org.xml.sax.ext.LexicalHandler:
- *  #endDTD()
- *  #startEntity(name)
- *  #endEntity(name)
- *
- *
- * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
- * IGNORED method of org.xml.sax.ext.DeclHandler
- * 	#attributeDecl(eName, aName, type, mode, value)
- *  #elementDecl(name, model)
- *  #externalEntityDecl(name, publicId, systemId)
- *  #internalEntityDecl(name, value)
- * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
- * IGNORED method of org.xml.sax.EntityResolver2
- *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
- *  #resolveEntity(publicId, systemId)
- *  #getExternalSubset(name, baseURI)
- * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
- * IGNORED method of org.xml.sax.DTDHandler
- *  #notationDecl(name, publicId, systemId) {};
- *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
- */
-"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
-	DOMHandler.prototype[key] = function(){return null}
-})
-
-/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
-function appendElement (hander,node) {
-    if (!hander.currentElement) {
-        hander.document.appendChild(node);
-    } else {
-        hander.currentElement.appendChild(node);
-    }
-}//appendChild and setAttributeNS are preformance key
-
-if(typeof require == 'function'){
-	var XMLReader = require('./sax').XMLReader;
-	var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;
-	exports.XMLSerializer = require('./dom').XMLSerializer ;
-	exports.DOMParser = DOMParser;
-}
-
-},{"./dom":8,"./sax":9}],8:[function(require,module,exports){
-/*
- * DOM Level 2
- * Object DOMException
- * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
- * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
- */
-
-function copy(src,dest){
-	for(var p in src){
-		dest[p] = src[p];
-	}
-}
-/**
-^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
-^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
- */
-function _extends(Class,Super){
-	var pt = Class.prototype;
-	if(Object.create){
-		var ppt = Object.create(Super.prototype)
-		pt.__proto__ = ppt;
-	}
-	if(!(pt instanceof Super)){
-		function t(){};
-		t.prototype = Super.prototype;
-		t = new t();
-		copy(pt,t);
-		Class.prototype = pt = t;
-	}
-	if(pt.constructor != Class){
-		if(typeof Class != 'function'){
-			console.error("unknow Class:"+Class)
-		}
-		pt.constructor = Class
-	}
-}
-var htmlns = 'http://www.w3.org/1999/xhtml' ;
-// Node Types
-var NodeType = {}
-var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
-var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
-var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
-var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
-var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
-var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
-var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
-var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
-var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
-var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
-var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
-var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
-
-// ExceptionCode
-var ExceptionCode = {}
-var ExceptionMessage = {};
-var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
-var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
-var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
-var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
-var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
-var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
-var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
-var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
-var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
-var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
-//level2
-var INVALID_STATE_ERR        	= ExceptionCode.INVALID_STATE_ERR        	= ((ExceptionMessage[11]="Invalid state"),11);
-var SYNTAX_ERR               	= ExceptionCode.SYNTAX_ERR               	= ((ExceptionMessage[12]="Syntax error"),12);
-var INVALID_MODIFICATION_ERR 	= ExceptionCode.INVALID_MODIFICATION_ERR 	= ((ExceptionMessage[13]="Invalid modification"),13);
-var NAMESPACE_ERR            	= ExceptionCode.NAMESPACE_ERR           	= ((ExceptionMessage[14]="Invalid namespace"),14);
-var INVALID_ACCESS_ERR       	= ExceptionCode.INVALID_ACCESS_ERR      	= ((ExceptionMessage[15]="Invalid access"),15);
-
-
-function DOMException(code, message) {
-	if(message instanceof Error){
-		var error = message;
-	}else{
-		error = this;
-		Error.call(this, ExceptionMessage[code]);
-		this.message = ExceptionMessage[code];
-		if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
-	}
-	error.code = code;
-	if(message) this.message = this.message + ": " + message;
-	return error;
-};
-DOMException.prototype = Error.prototype;
-copy(ExceptionCode,DOMException)
-/**
- * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
- * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
- * The items in the NodeList are accessible via an integral index, starting from 0.
- */
-function NodeList() {
-};
-NodeList.prototype = {
-	/**
-	 * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
-	 * @standard level1
-	 */
-	length:0, 
-	/**
-	 * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
-	 * @standard level1
-	 * @param index  unsigned long 
-	 *   Index into the collection.
-	 * @return Node
-	 * 	The node at the indexth position in the NodeList, or null if that is not a valid index. 
-	 */
-	item: function(index) {
-		return this[index] || null;
-	}
-};
-function LiveNodeList(node,refresh){
-	this._node = node;
-	this._refresh = refresh
-	_updateLiveList(this);
-}
-function _updateLiveList(list){
-	var inc = list._node._inc || list._node.ownerDocument._inc;
-	if(list._inc != inc){
-		var ls = list._refresh(list._node);
-		//console.log(ls.length)
-		__set__(list,'length',ls.length);
-		copy(ls,list);
-		list._inc = inc;
-	}
-}
-LiveNodeList.prototype.item = function(i){
-	_updateLiveList(this);
-	return this[i];
-}
-
-_extends(LiveNodeList,NodeList);
-/**
- * 
- * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
- * NamedNodeMap objects in the DOM are live.
- * used for attributes or DocumentType entities 
- */
-function NamedNodeMap() {
-};
-
-function _findNodeIndex(list,node){
-	var i = list.length;
-	while(i--){
-		if(list[i] === node){return i}
-	}
-}
-
-function _addNamedNode(el,list,newAttr,oldAttr){
-	if(oldAttr){
-		list[_findNodeIndex(list,oldAttr)] = newAttr;
-	}else{
-		list[list.length++] = newAttr;
-	}
-	if(el){
-		newAttr.ownerElement = el;
-		var doc = el.ownerDocument;
-		if(doc){
-			oldAttr && _onRemoveAttribute(doc,el,oldAttr);
-			_onAddAttribute(doc,el,newAttr);
-		}
-	}
-}
-function _removeNamedNode(el,list,attr){
-	var i = _findNodeIndex(list,attr);
-	if(i>=0){
-		var lastIndex = list.length-1
-		while(i<lastIndex){
-			list[i] = list[++i]
-		}
-		list.length = lastIndex;
-		if(el){
-			var doc = el.ownerDocument;
-			if(doc){
-				_onRemoveAttribute(doc,el,attr);
-				attr.ownerElement = null;
-			}
-		}
-	}else{
-		throw DOMException(NOT_FOUND_ERR,new Error())
-	}
-}
-NamedNodeMap.prototype = {
-	length:0,
-	item:NodeList.prototype.item,
-	getNamedItem: function(key) {
-//		if(key.indexOf(':')>0 || key == 'xmlns'){
-//			return null;
-//		}
-		var i = this.length;
-		while(i--){
-			var attr = this[i];
-			if(attr.nodeName == key){
-				return attr;
-			}
-		}
-	},
-	setNamedItem: function(attr) {
-		var el = attr.ownerElement;
-		if(el && el!=this._ownerElement){
-			throw new DOMException(INUSE_ATTRIBUTE_ERR);
-		}
-		var oldAttr = this.getNamedItem(attr.nodeName);
-		_addNamedNode(this._ownerElement,this,attr,oldAttr);
-		return oldAttr;
-	},
-	/* returns Node */
-	setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
-		var el = attr.ownerElement, oldAttr;
-		if(el && el!=this._ownerElement){
-			throw new DOMException(INUSE_ATTRIBUTE_ERR);
-		}
-		oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
-		_addNamedNode(this._ownerElement,this,attr,oldAttr);
-		return oldAttr;
-	},
-
-	/* returns Node */
-	removeNamedItem: function(key) {
-		var attr = this.getNamedItem(key);
-		_removeNamedNode(this._ownerElement,this,attr);
-		return attr;
-		
-		
-	},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
-	
-	//for level2
-	removeNamedItemNS:function(namespaceURI,localName){
-		var attr = this.getNamedItemNS(namespaceURI,localName);
-		_removeNamedNode(this._ownerElement,this,attr);
-		return attr;
-	},
-	getNamedItemNS: function(namespaceURI, localName) {
-		var i = this.length;
-		while(i--){
-			var node = this[i];
-			if(node.localName == localName && node.namespaceURI == namespaceURI){
-				return node;
-			}
-		}
-		return null;
-	}
-};
-/**
- * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
- */
-function DOMImplementation(/* Object */ features) {
-	this._features = {};
-	if (features) {
-		for (var feature in features) {
-			 this._features = features[feature];
-		}
-	}
-};
-
-DOMImplementation.prototype = {
-	hasFeature: function(/* string */ feature, /* string */ version) {
-		var versions = this._features[feature.toLowerCase()];
-		if (versions && (!version || version in versions)) {
-			return true;
-		} else {
-			return false;
-		}
-	},
-	// Introduced in DOM Level 2:
-	createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
-		var doc = new Document();
-		doc.doctype = doctype;
-		if(doctype){
-			doc.appendChild(doctype);
-		}
-		doc.implementation = this;
-		doc.childNodes = new NodeList();
-		if(qualifiedName){
-			var root = doc.createElementNS(namespaceURI,qualifiedName);
-			doc.appendChild(root);
-		}
-		return doc;
-	},
-	// Introduced in DOM Level 2:
-	createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
-		var node = new DocumentType();
-		node.name = qualifiedName;
-		node.nodeName = qualifiedName;
-		node.publicId = publicId;
-		node.systemId = systemId;
-		// Introduced in DOM Level 2:
-		//readonly attribute DOMString        internalSubset;
-		
-		//TODO:..
-		//  readonly attribute NamedNodeMap     entities;
-		//  readonly attribute NamedNodeMap     notations;
-		return node;
-	}
-};
-
-
-/**
- * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
- */
-
-function Node() {
-};
-
-Node.prototype = {
-	firstChild : null,
-	lastChild : null,
-	previousSibling : null,
-	nextSibling : null,
-	attributes : null,
-	parentNode : null,
-	childNodes : null,
-	ownerDocument : null,
-	nodeValue : null,
-	namespaceURI : null,
-	prefix : null,
-	localName : null,
-	// Modified in DOM Level 2:
-	insertBefore:function(newChild, refChild){//raises 
-		return _insertBefore(this,newChild,refChild);
-	},
-	replaceChild:function(newChild, oldChild){//raises 
-		this.insertBefore(newChild,oldChild);
-		if(oldChild){
-			this.removeChild(oldChild);
-		}
-	},
-	removeChild:function(oldChild){
-		return _removeChild(this,oldChild);
-	},
-	appendChild:function(newChild){
-		return this.insertBefore(newChild,null);
-	},
-	hasChildNodes:function(){
-		return this.firstChild != null;
-	},
-	cloneNode:function(deep){
-		return cloneNode(this.ownerDocument||this,this,deep);
-	},
-	// Modified in DOM Level 2:
-	normalize:function(){
-		var child = this.firstChild;
-		while(child){
-			var next = child.nextSibling;
-			if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
-				this.removeChild(next);
-				child.appendData(next.data);
-			}else{
-				child.normalize();
-				child = next;
-			}
-		}
-	},
-  	// Introduced in DOM Level 2:
-	isSupported:function(feature, version){
-		return this.ownerDocument.implementation.hasFeature(feature,version);
-	},
-    // Introduced in DOM Level 2:
-    hasAttributes:function(){
-    	return this.attributes.length>0;
-    },
-    lookupPrefix:function(namespaceURI){
-    	var el = this;
-    	while(el){
-    		var map = el._nsMap;
-    		//console.dir(map)
-    		if(map){
-    			for(var n in map){
-    				if(map[n] == namespaceURI){
-    					return n;
-    				}
-    			}
-    		}
-    		el = el.nodeType == 2?el.ownerDocument : el.parentNode;
-    	}
-    	return null;
-    },
-    // Introduced in DOM Level 3:
-    lookupNamespaceURI:function(prefix){
-    	var el = this;
-    	while(el){
-    		var map = el._nsMap;
-    		//console.dir(map)
-    		if(map){
-    			if(prefix in map){
-    				return map[prefix] ;
-    			}
-    		}
-    		el = el.nodeType == 2?el.ownerDocument : el.parentNode;
-    	}
-    	return null;
-    },
-    // Introduced in DOM Level 3:
-    isDefaultNamespace:function(namespaceURI){
-    	var prefix = this.lookupPrefix(namespaceURI);
-    	return prefix == null;
-    }
-};
-
-
-function _xmlEncoder(c){
-	return c == '<' && '&lt;' ||
-         c == '>' && '&gt;' ||
-         c == '&' && '&amp;' ||
-         c == '"' && '&quot;' ||
-         '&#'+c.charCodeAt()+';'
-}
-
-
-copy(NodeType,Node);
-copy(NodeType,Node.prototype);
-
-/**
- * @param callback return true for continue,false for break
- * @return boolean true: break visit;
- */
-function _visitNode(node,callback){
-	if(callback(node)){
-		return true;
-	}
-	if(node = node.firstChild){
-		do{
-			if(_visitNode(node,callback)){return true}
-        }while(node=node.nextSibling)
-    }
-}
-
-
-
-function Document(){
-}
-function _onAddAttribute(doc,el,newAttr){
-	doc && doc._inc++;
-	var ns = newAttr.namespaceURI ;
-	if(ns == 'http://www.w3.org/2000/xmlns/'){
-		//update namespace
-		el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value
-	}
-}
-function _onRemoveAttribute(doc,el,newAttr,remove){
-	doc && doc._inc++;
-	var ns = newAttr.namespaceURI ;
-	if(ns == 'http://www.w3.org/2000/xmlns/'){
-		//update namespace
-		delete el._nsMap[newAttr.prefix?newAttr.localName:'']
-	}
-}
-function _onUpdateChild(doc,el,newChild){
-	if(doc && doc._inc){
-		doc._inc++;
-		//update childNodes
-		var cs = el.childNodes;
-		if(newChild){
-			cs[cs.length++] = newChild;
-		}else{
-			//console.log(1)
-			var child = el.firstChild;
-			var i = 0;
-			while(child){
-				cs[i++] = child;
-				child =child.nextSibling;
-			}
-			cs.length = i;
-		}
-	}
-}
-
-/**
- * attributes;
- * children;
- * 
- * writeable properties:
- * nodeValue,Attr:value,CharacterData:data
- * prefix
- */
-function _removeChild(parentNode,child){
-	var previous = child.previousSibling;
-	var next = child.nextSibling;
-	if(previous){
-		previous.nextSibling = next;
-	}else{
-		parentNode.firstChild = next
-	}
-	if(next){
-		next.previousSibling = previous;
-	}else{
-		parentNode.lastChild = previous;
-	}
-	_onUpdateChild(parentNode.ownerDocument,parentNode);
-	return child;
-}
-/**
- * preformance key(refChild == null)
- */
-function _insertBefore(parentNode,newChild,nextChild){
-	var cp = newChild.parentNode;
-	if(cp){
-		cp.removeChild(newChild);//remove and update
-	}
-	if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
-		var newFirst = newChild.firstChild;
-		if (newFirst == null) {
-			return newChild;
-		}
-		var newLast = newChild.lastChild;
-	}else{
-		newFirst = newLast = newChild;
-	}
-	var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
-
-	newFirst.previousSibling = pre;
-	newLast.nextSibling = nextChild;
-	
-	
-	if(pre){
-		pre.nextSibling = newFirst;
-	}else{
-		parentNode.firstChild = newFirst;
-	}
-	if(nextChild == null){
-		parentNode.lastChild = newLast;
-	}else{
-		nextChild.previousSibling = newLast;
-	}
-	do{
-		newFirst.parentNode = parentNode;
-	}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
-	_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
-	//console.log(parentNode.lastChild.nextSibling == null)
-	if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
-		newChild.firstChild = newChild.lastChild = null;
-	}
-	return newChild;
-}
-function _appendSingleChild(parentNode,newChild){
-	var cp = newChild.parentNode;
-	if(cp){
-		var pre = parentNode.lastChild;
-		cp.removeChild(newChild);//remove and update
-		var pre = parentNode.lastChild;
-	}
-	var pre = parentNode.lastChild;
-	newChild.parentNode = parentNode;
-	newChild.previousSibling = pre;
-	newChild.nextSibling = null;
-	if(pre){
-		pre.nextSibling = newChild;
-	}else{
-		parentNode.firstChild = newChild;
-	}
-	parentNode.lastChild = newChild;
-	_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
-	return newChild;
-	//console.log("__aa",parentNode.lastChild.nextSibling == null)
-}
-Document.prototype = {
-	//implementation : null,
-	nodeName :  '#document',
-	nodeType :  DOCUMENT_NODE,
-	doctype :  null,
-	documentElement :  null,
-	_inc : 1,
-	
-	insertBefore :  function(newChild, refChild){//raises 
-		if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
-			var child = newChild.firstChild;
-			while(child){
-				var next = child.nextSibling;
-				this.insertBefore(child,refChild);
-				child = next;
-			}
-			return newChild;
-		}
-		if(this.documentElement == null && newChild.nodeType == 1){
-			this.documentElement = newChild;
-		}
-		
-		return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
-	},
-	removeChild :  function(oldChild){
-		if(this.documentElement == oldChild){
-			this.documentElement = null;
-		}
-		return _removeChild(this,oldChild);
-	},
-	// Introduced in DOM Level 2:
-	importNode : function(importedNode,deep){
-		return importNode(this,importedNode,deep);
-	},
-	// Introduced in DOM Level 2:
-	getElementById :	function(id){
-		var rtv = null;
-		_visitNode(this.documentElement,function(node){
-			if(node.nodeType == 1){
-				if(node.getAttribute('id') == id){
-					rtv = node;
-					return true;
-				}
-			}
-		})
-		return rtv;
-	},
-	
-	//document factory method:
-	createElement :	function(tagName){
-		var node = new Element();
-		node.ownerDocument = this;
-		node.nodeName = tagName;
-		node.tagName = tagName;
-		node.childNodes = new NodeList();
-		var attrs	= node.attributes = new NamedNodeMap();
-		attrs._ownerElement = node;
-		return node;
-	},
-	createDocumentFragment :	function(){
-		var node = new DocumentFragment();
-		node.ownerDocument = this;
-		node.childNodes = new NodeList();
-		return node;
-	},
-	createTextNode :	function(data){
-		var node = new Text();
-		node.ownerDocument = this;
-		node.appendData(data)
-		return node;
-	},
-	createComment :	function(data){
-		var node = new Comment();
-		node.ownerDocument = this;
-		node.appendData(data)
-		return node;
-	},
-	createCDATASection :	function(data){
-		var node = new CDATASection();
-		node.ownerDocument = this;
-		node.appendData(data)
-		return node;
-	},
-	createProcessingInstruction :	function(target,data){
-		var node = new ProcessingInstruction();
-		node.ownerDocument = this;
-		node.tagName = node.target = target;
-		node.nodeValue= node.data = data;
-		return node;
-	},
-	createAttribute :	function(name){
-		var node = new Attr();
-		node.ownerDocument	= this;
-		node.name = name;
-		node.nodeName	= name;
-		node.localName = name;
-		node.specified = true;
-		return node;
-	},
-	createEntityReference :	function(name){
-		var node = new EntityReference();
-		node.ownerDocument	= this;
-		node.nodeName	= name;
-		return node;
-	},
-	// Introduced in DOM Level 2:
-	createElementNS :	function(namespaceURI,qualifiedName){
-		var node = new Element();
-		var pl = qualifiedName.split(':');
-		var attrs	= node.attributes = new NamedNodeMap();
-		node.childNodes = new NodeList();
-		node.ownerDocument = this;
-		node.nodeName = qualifiedName;
-		node.tagName = qualifiedName;
-		node.namespaceURI = namespaceURI;
-		if(pl.length == 2){
-			node.prefix = pl[0];
-			node.localName = pl[1];
-		}else{
-			//el.prefix = null;
-			node.localName = qualifiedName;
-		}
-		attrs._ownerElement = node;
-		return node;
-	},
-	// Introduced in DOM Level 2:
-	createAttributeNS :	function(namespaceURI,qualifiedName){
-		var node = new Attr();
-		var pl = qualifiedName.split(':');
-		node.ownerDocument = this;
-		node.nodeName = qualifiedName;
-		node.name = qualifiedName;
-		node.namespaceURI = namespaceURI;
-		node.specified = true;
-		if(pl.length == 2){
-			node.prefix = pl[0];
-			node.localName = pl[1];
-		}else{
-			//el.prefix = null;
-			node.localName = qualifiedName;
-		}
-		return node;
-	}
-};
-_extends(Document,Node);
-
-
-function Element() {
-	this._nsMap = {};
-};
-Element.prototype = {
-	nodeType : ELEMENT_NODE,
-	hasAttribute : function(name){
-		return this.getAttributeNode(name)!=null;
-	},
-	getAttribute : function(name){
-		var attr = this.getAttributeNode(name);
-		return attr && attr.value || '';
-	},
-	getAttributeNode : function(name){
-		return this.attributes.getNamedItem(name);
-	},
-	setAttribute : function(name, value){
-		var attr = this.ownerDocument.createAttribute(name);
-		attr.value = attr.nodeValue = "" + value;
-		this.setAttributeNode(attr)
-	},
-	removeAttribute : function(name){
-		var attr = this.getAttributeNode(name)
-		attr && this.removeAttributeNode(attr);
-	},
-	
-	//four real opeartion method
-	appendChild:function(newChild){
-		if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
-			return this.insertBefore(newChild,null);
-		}else{
-			return _appendSingleChild(this,newChild);
-		}
-	},
-	setAttributeNode : function(newAttr){
-		return this.attributes.setNamedItem(newAttr);
-	},
-	setAttributeNodeNS : function(newAttr){
-		return this.attributes.setNamedItemNS(newAttr);
-	},
-	removeAttributeNode : function(oldAttr){
-		return this.attributes.removeNamedItem(oldAttr.nodeName);
-	},
-	//get real attribute name,and remove it by removeAttributeNode
-	removeAttributeNS : function(namespaceURI, localName){
-		var old = this.getAttributeNodeNS(namespaceURI, localName);
-		old && this.removeAttributeNode(old);
-	},
-	
-	hasAttributeNS : function(namespaceURI, localName){
-		return this.getAttributeNodeNS(namespaceURI, localName)!=null;
-	},
-	getAttributeNS : function(namespaceURI, localName){
-		var attr = this.getAttributeNodeNS(namespaceURI, localName);
-		return attr && attr.value || '';
-	},
-	setAttributeNS : function(namespaceURI, qualifiedName, value){
-		var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
-		attr.value = attr.nodeValue = value;
-		this.setAttributeNode(attr)
-	},
-	getAttributeNodeNS : function(namespaceURI, localName){
-		return this.attributes.getNamedItemNS(namespaceURI, localName);
-	},
-	
-	getElementsByTagName : function(tagName){
-		return new LiveNodeList(this,function(base){
-			var ls = [];
-			_visitNode(base,function(node){
-				if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
-					ls.push(node);
-				}
-			});
-			return ls;
-		});
-	},
-	getElementsByTagNameNS : function(namespaceURI, localName){
-		return new LiveNodeList(this,function(base){
-			var ls = [];
-			_visitNode(base,function(node){
-				if(node !== base && node.nodeType === ELEMENT_NODE && node.namespaceURI === namespaceURI && (localName === '*' || node.localName == localName)){
-					ls.push(node);
-				}
-			});
-			return ls;
-		});
-	}
-};
-Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
-Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
-
-
-_extends(Element,Node);
-function Attr() {
-};
-Attr.prototype.nodeType = ATTRIBUTE_NODE;
-_extends(Attr,Node);
-
-
-function CharacterData() {
-};
-CharacterData.prototype = {
-	data : '',
-	substringData : function(offset, count) {
-		return this.data.substring(offset, offset+count);
-	},
-	appendData: function(text) {
-		text = this.data+text;
-		this.nodeValue = this.data = text;
-		this.length = text.length;
-	},
-	insertData: function(offset,text) {
-		this.replaceData(offset,0,text);
-	
-	},
-	appendChild:function(newChild){
-		//if(!(newChild instanceof CharacterData)){
-			throw new Error(ExceptionMessage[3])
-		//}
-		return Node.prototype.appendChild.apply(this,arguments)
-	},
-	deleteData: function(offset, count) {
-		this.replaceData(offset,count,"");
-	},
-	replaceData: function(offset, count, text) {
-		var start = this.data.substring(0,offset);
-		var end = this.data.substring(offset+count);
-		text = start + text + end;
-		this.nodeValue = this.data = text;
-		this.length = text.length;
-	}
-}
-_extends(CharacterData,Node);
-function Text() {
-};
-Text.prototype = {
-	nodeName : "#text",
-	nodeType : TEXT_NODE,
-	splitText : function(offset) {
-		var text = this.data;
-		var newText = text.substring(offset);
-		text = text.substring(0, offset);
-		this.data = this.nodeValue = text;
-		this.length = text.length;
-		var newNode = this.ownerDocument.createTextNode(newText);
-		if(this.parentNode){
-			this.parentNode.insertBefore(newNode, this.nextSibling);
-		}
-		return newNode;
-	}
-}
-_extends(Text,CharacterData);
-function Comment() {
-};
-Comment.prototype = {
-	nodeName : "#comment",
-	nodeType : COMMENT_NODE
-}
-_extends(Comment,CharacterData);
-
-function CDATASection() {
-};
-CDATASection.prototype = {
-	nodeName : "#cdata-section",
-	nodeType : CDATA_SECTION_NODE
-}
-_extends(CDATASection,CharacterData);
-
-
-function DocumentType() {
-};
-DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
-_extends(DocumentType,Node);
-
-function Notation() {
-};
-Notation.prototype.nodeType = NOTATION_NODE;
-_extends(Notation,Node);
-
-function Entity() {
-};
-Entity.prototype.nodeType = ENTITY_NODE;
-_extends(Entity,Node);
-
-function EntityReference() {
-};
-EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
-_extends(EntityReference,Node);
-
-function DocumentFragment() {
-};
-DocumentFragment.prototype.nodeName =	"#document-fragment";
-DocumentFragment.prototype.nodeType =	DOCUMENT_FRAGMENT_NODE;
-_extends(DocumentFragment,Node);
-
-
-function ProcessingInstruction() {
-}
-ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
-_extends(ProcessingInstruction,Node);
-function XMLSerializer(){}
-XMLSerializer.prototype.serializeToString = function(node){
-	var buf = [];
-	serializeToString(node,buf);
-	return buf.join('');
-}
-Node.prototype.toString =function(){
-	return XMLSerializer.prototype.serializeToString(this);
-}
-function serializeToString(node,buf){
-	switch(node.nodeType){
-	case ELEMENT_NODE:
-		var attrs = node.attributes;
-		var len = attrs.length;
-		var child = node.firstChild;
-		var nodeName = node.tagName;
-		var isHTML = htmlns === node.namespaceURI
-		buf.push('<',nodeName);
-		for(var i=0;i<len;i++){
-			serializeToString(attrs.item(i),buf,isHTML);
-		}
-		if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
-			buf.push('>');
-			//if is cdata child node
-			if(isHTML && /^script$/i.test(nodeName)){
-				if(child){
-					buf.push(child.data);
-				}
-			}else{
-				while(child){
-					serializeToString(child,buf);
-					child = child.nextSibling;
-				}
-			}
-			buf.push('</',nodeName,'>');
-		}else{
-			buf.push('/>');
-		}
-		return;
-	case DOCUMENT_NODE:
-	case DOCUMENT_FRAGMENT_NODE:
-		var child = node.firstChild;
-		while(child){
-			serializeToString(child,buf);
-			child = child.nextSibling;
-		}
-		return;
-	case ATTRIBUTE_NODE:
-		return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
-	case TEXT_NODE:
-		return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
-	case CDATA_SECTION_NODE:
-		return buf.push( '<![CDATA[',node.data,']]>');
-	case COMMENT_NODE:
-		return buf.push( "<!--",node.data,"-->");
-	case DOCUMENT_TYPE_NODE:
-		var pubid = node.publicId;
-		var sysid = node.systemId;
-		buf.push('<!DOCTYPE ',node.name);
-		if(pubid){
-			buf.push(' PUBLIC "',pubid);
-			if (sysid && sysid!='.') {
-				buf.push( '" "',sysid);
-			}
-			buf.push('">');
-		}else if(sysid && sysid!='.'){
-			buf.push(' SYSTEM "',sysid,'">');
-		}else{
-			var sub = node.internalSubset;
-			if(sub){
-				buf.push(" [",sub,"]");
-			}
-			buf.push(">");
-		}
-		return;
-	case PROCESSING_INSTRUCTION_NODE:
-		return buf.push( "<?",node.target," ",node.data,"?>");
-	case ENTITY_REFERENCE_NODE:
-		return buf.push( '&',node.nodeName,';');
-	//case ENTITY_NODE:
-	//case NOTATION_NODE:
-	default:
-		buf.push('??',node.nodeName);
-	}
-}
-function importNode(doc,node,deep){
-	var node2;
-	switch (node.nodeType) {
-	case ELEMENT_NODE:
-		node2 = node.cloneNode(false);
-		node2.ownerDocument = doc;
-		//var attrs = node2.attributes;
-		//var len = attrs.length;
-		//for(var i=0;i<len;i++){
-			//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
-		//}
-	case DOCUMENT_FRAGMENT_NODE:
-		break;
-	case ATTRIBUTE_NODE:
-		deep = true;
-		break;
-	//case ENTITY_REFERENCE_NODE:
-	//case PROCESSING_INSTRUCTION_NODE:
-	////case TEXT_NODE:
-	//case CDATA_SECTION_NODE:
-	//case COMMENT_NODE:
-	//	deep = false;
-	//	break;
-	//case DOCUMENT_NODE:
-	//case DOCUMENT_TYPE_NODE:
-	//cannot be imported.
-	//case ENTITY_NODE:
-	//case NOTATION_NODE:
-	//can not hit in level3
-	//default:throw e;
-	}
-	if(!node2){
-		node2 = node.cloneNode(false);//false
-	}
-	node2.ownerDocument = doc;
-	node2.parentNode = null;
-	if(deep){
-		var child = node.firstChild;
-		while(child){
-			node2.appendChild(importNode(doc,child,deep));
-			child = child.nextSibling;
-		}
-	}
-	return node2;
-}
-//
-//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
-//					attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
-function cloneNode(doc,node,deep){
-	var node2 = new node.constructor();
-	for(var n in node){
-		var v = node[n];
-		if(typeof v != 'object' ){
-			if(v != node2[n]){
-				node2[n] = v;
-			}
-		}
-	}
-	if(node.childNodes){
-		node2.childNodes = new NodeList();
-	}
-	node2.ownerDocument = doc;
-	switch (node2.nodeType) {
-	case ELEMENT_NODE:
-		var attrs	= node.attributes;
-		var attrs2	= node2.attributes = new NamedNodeMap();
-		var len = attrs.length
-		attrs2._ownerElement = node2;
-		for(var i=0;i<len;i++){
-			node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
-		}
-		break;;
-	case ATTRIBUTE_NODE:
-		deep = true;
-	}
-	if(deep){
-		var child = node.firstChild;
-		while(child){
-			node2.appendChild(cloneNode(doc,child,deep));
-			child = child.nextSibling;
-		}
-	}
-	return node2;
-}
-
-function __set__(object,key,value){
-	object[key] = value
-}
-//do dynamic
-try{
-	if(Object.defineProperty){
-		Object.defineProperty(LiveNodeList.prototype,'length',{
-			get:function(){
-				_updateLiveList(this);
-				return this.$$length;
-			}
-		});
-		Object.defineProperty(Node.prototype,'textContent',{
-			get:function(){
-				return getTextContent(this);
-			},
-			set:function(data){
-				switch(this.nodeType){
-				case 1:
-				case 11:
-					while(this.firstChild){
-						this.removeChild(this.firstChild);
-					}
-					if(data || String(data)){
-						this.appendChild(this.ownerDocument.createTextNode(data));
-					}
-					break;
-				default:
-					//TODO:
-					this.data = data;
-					this.value = value;
-					this.nodeValue = data;
-				}
-			}
-		})
-		
-		function getTextContent(node){
-			switch(node.nodeType){
-			case 1:
-			case 11:
-				var buf = [];
-				node = node.firstChild;
-				while(node){
-					if(node.nodeType!==7 && node.nodeType !==8){
-						buf.push(getTextContent(node));
-					}
-					node = node.nextSibling;
-				}
-				return buf.join('');
-			default:
-				return node.nodeValue;
-			}
-		}
-		__set__ = function(object,key,value){
-			//console.log(value)
-			object['$$'+key] = value
-		}
-	}
-}catch(e){//ie8
-}
-
-if(typeof require == 'function'){
-	exports.DOMImplementation = DOMImplementation;
-	exports.XMLSerializer = XMLSerializer;
-}
-
-},{}],9:[function(require,module,exports){
-//[4]   	NameStartChar	   ::=   	":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
-//[4a]   	NameChar	   ::=   	NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
-//[5]   	Name	   ::=   	NameStartChar (NameChar)*
-var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF
-var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\u00B7\u0300-\u036F\\ux203F-\u2040]");
-var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
-//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
-//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
-
-//S_TAG,	S_ATTR,	S_EQ,	S_V
-//S_ATTR_S,	S_E,	S_S,	S_C
-var S_TAG = 0;//tag name offerring
-var S_ATTR = 1;//attr name offerring 
-var S_ATTR_S=2;//attr name end and space offer
-var S_EQ = 3;//=space?
-var S_V = 4;//attr value(no quot value only)
-var S_E = 5;//attr value end and no space(quot end)
-var S_S = 6;//(attr value end || tag end ) && (space offer)
-var S_C = 7;//closed el<el />
-
-function XMLReader(){
-	
-}
-
-XMLReader.prototype = {
-	parse:function(source,defaultNSMap,entityMap){
-		var domBuilder = this.domBuilder;
-		domBuilder.startDocument();
-		_copy(defaultNSMap ,defaultNSMap = {})
-		parse(source,defaultNSMap,entityMap,
-				domBuilder,this.errorHandler);
-		domBuilder.endDocument();
-	}
-}
-function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
-  function fixedFromCharCode(code) {
-		// String.prototype.fromCharCode does not supports
-		// > 2 bytes unicode chars directly
-		if (code > 0xffff) {
-			code -= 0x10000;
-			var surrogate1 = 0xd800 + (code >> 10)
-				, surrogate2 = 0xdc00 + (code & 0x3ff);
-
-			return String.fromCharCode(surrogate1, surrogate2);
-		} else {
-			return String.fromCharCode(code);
-		}
-	}
-	function entityReplacer(a){
-		var k = a.slice(1,-1);
-		if(k in entityMap){
-			return entityMap[k]; 
-		}else if(k.charAt(0) === '#'){
-			return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
-		}else{
-			errorHandler.error('entity not found:'+a);
-			return a;
-		}
-	}
-	function appendText(end){//has some bugs
-		var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
-		locator&&position(start);
-		domBuilder.characters(xt,0,end-start);
-		start = end
-	}
-	function position(start,m){
-		while(start>=endPos && (m = linePattern.exec(source))){
-			startPos = m.index;
-			endPos = startPos + m[0].length;
-			locator.lineNumber++;
-			//console.log('line++:',locator,startPos,endPos)
-		}
-		locator.columnNumber = start-startPos+1;
-	}
-	var startPos = 0;
-	var endPos = 0;
-	var linePattern = /.+(?:\r\n?|\n)|.*$/g
-	var locator = domBuilder.locator;
-	
-	var parseStack = [{currentNSMap:defaultNSMapCopy}]
-	var closeMap = {};
-	var start = 0;
-	while(true){
-		var i = source.indexOf('<',start);
-		if(i<0){
-			if(!source.substr(start).match(/^\s*$/)){
-				var doc = domBuilder.document;
-    			var text = doc.createTextNode(source.substr(start));
-    			doc.appendChild(text);
-    			domBuilder.currentElement = text;
-			}
-			return;
-		}
-		if(i>start){
-			appendText(i);
-		}
-		switch(source.charAt(i+1)){
-		case '/':
-			var end = source.indexOf('>',i+3);
-			var tagName = source.substring(i+2,end);
-			var config = parseStack.pop();
-			var localNSMap = config.localNSMap;
-			
-	        if(config.tagName != tagName){
-	            errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
-	        }
-			domBuilder.endElement(config.uri,config.localName,tagName);
-			if(localNSMap){
-				for(var prefix in localNSMap){
-					domBuilder.endPrefixMapping(prefix) ;
-				}
-			}
-			end++;
-			break;
-			// end elment
-		case '?':// <?...?>
-			locator&&position(i);
-			end = parseInstruction(source,i,domBuilder);
-			break;
-		case '!':// <!doctype,<![CDATA,<!--
-			locator&&position(i);
-			end = parseDCC(source,i,domBuilder,errorHandler);
-			break;
-		default:
-			try{
-				locator&&position(i);
-				
-				var el = new ElementAttributes();
-				
-				//elStartEnd
-				var end = parseElementStartPart(source,i,el,entityReplacer,errorHandler);
-				var len = el.length;
-				//position fixed
-				if(len && locator){
-					var backup = copyLocator(locator,{});
-					for(var i = 0;i<len;i++){
-						var a = el[i];
-						position(a.offset);
-						a.offset = copyLocator(locator,{});
-					}
-					copyLocator(backup,locator);
-				}
-				if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
-					el.closed = true;
-					if(!entityMap.nbsp){
-						errorHandler.warning('unclosed xml attribute');
-					}
-				}
-				appendElement(el,domBuilder,parseStack);
-				
-				
-				if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
-					end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)
-				}else{
-					end++;
-				}
-			}catch(e){
-				errorHandler.error('element parse error: '+e);
-				end = -1;
-			}
-
-		}
-		if(end<0){
-			//TODO: 这里有可能sax回退,有位置错误风险
-			appendText(i+1);
-		}else{
-			start = end;
-		}
-	}
-}
-function copyLocator(f,t){
-	t.lineNumber = f.lineNumber;
-	t.columnNumber = f.columnNumber;
-	return t;
-	
-}
-
-/**
- * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
- * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
- */
-function parseElementStartPart(source,start,el,entityReplacer,errorHandler){
-	var attrName;
-	var value;
-	var p = ++start;
-	var s = S_TAG;//status
-	while(true){
-		var c = source.charAt(p);
-		switch(c){
-		case '=':
-			if(s === S_ATTR){//attrName
-				attrName = source.slice(start,p);
-				s = S_EQ;
-			}else if(s === S_ATTR_S){
-				s = S_EQ;
-			}else{
-				//fatalError: equal must after attrName or space after attrName
-				throw new Error('attribute equal must after attrName');
-			}
-			break;
-		case '\'':
-		case '"':
-			if(s === S_EQ){//equal
-				start = p+1;
-				p = source.indexOf(c,start)
-				if(p>0){
-					value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
-					el.add(attrName,value,start-1);
-					s = S_E;
-				}else{
-					//fatalError: no end quot match
-					throw new Error('attribute value no end \''+c+'\' match');
-				}
-			}else if(s == S_V){
-				value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
-				//console.log(attrName,value,start,p)
-				el.add(attrName,value,start);
-				//console.dir(el)
-				errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
-				start = p+1;
-				s = S_E
-			}else{
-				//fatalError: no equal before
-				throw new Error('attribute value must after "="');
-			}
-			break;
-		case '/':
-			switch(s){
-			case S_TAG:
-				el.setTagName(source.slice(start,p));
-			case S_E:
-			case S_S:
-			case S_C:
-				s = S_C;
-				el.closed = true;
-			case S_V:
-			case S_ATTR:
-			case S_ATTR_S:
-				break;
-			//case S_EQ:
-			default:
-				throw new Error("attribute invalid close char('/')")
-			}
-			break;
-		case ''://end document
-			//throw new Error('unexpected end of input')
-			errorHandler.error('unexpected end of input');
-		case '>':
-			switch(s){
-			case S_TAG:
-				el.setTagName(source.slice(start,p));
-			case S_E:
-			case S_S:
-			case S_C:
-				break;//normal
-			case S_V://Compatible state
-			case S_ATTR:
-				value = source.slice(start,p);
-				if(value.slice(-1) === '/'){
-					el.closed  = true;
-					value = value.slice(0,-1)
-				}
-			case S_ATTR_S:
-				if(s === S_ATTR_S){
-					value = attrName;
-				}
-				if(s == S_V){
-					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
-					el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start)
-				}else{
-					errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
-					el.add(value,value,start)
-				}
-				break;
-			case S_EQ:
-				throw new Error('attribute value missed!!');
-			}
-//			console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
-			return p;
-		/*xml space '\x20' | #x9 | #xD | #xA; */
-		case '\u0080':
-			c = ' ';
-		default:
-			if(c<= ' '){//space
-				switch(s){
-				case S_TAG:
-					el.setTagName(source.slice(start,p));//tagName
-					s = S_S;
-					break;
-				case S_ATTR:
-					attrName = source.slice(start,p)
-					s = S_ATTR_S;
-					break;
-				case S_V:
-					var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
-					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
-					el.add(attrName,value,start)
-				case S_E:
-					s = S_S;
-					break;
-				//case S_S:
-				//case S_EQ:
-				//case S_ATTR_S:
-				//	void();break;
-				//case S_C:
-					//ignore warning
-				}
-			}else{//not space
-//S_TAG,	S_ATTR,	S_EQ,	S_V
-//S_ATTR_S,	S_E,	S_S,	S_C
-				switch(s){
-				//case S_TAG:void();break;
-				//case S_ATTR:void();break;
-				//case S_V:void();break;
-				case S_ATTR_S:
-					errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead!!')
-					el.add(attrName,attrName,start);
-					start = p;
-					s = S_ATTR;
-					break;
-				case S_E:
-					errorHandler.warning('attribute space is required"'+attrName+'"!!')
-				case S_S:
-					s = S_ATTR;
-					start = p;
-					break;
-				case S_EQ:
-					s = S_V;
-					start = p;
-					break;
-				case S_C:
-					throw new Error("elements closed character '/' and '>' must be connected to");
-				}
-			}
-		}
-		p++;
-	}
-}
-/**
- * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
- */
-function appendElement(el,domBuilder,parseStack){
-	var tagName = el.tagName;
-	var localNSMap = null;
-	var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
-	var i = el.length;
-	while(i--){
-		var a = el[i];
-		var qName = a.qName;
-		var value = a.value;
-		var nsp = qName.indexOf(':');
-		if(nsp>0){
-			var prefix = a.prefix = qName.slice(0,nsp);
-			var localName = qName.slice(nsp+1);
-			var nsPrefix = prefix === 'xmlns' && localName
-		}else{
-			localName = qName;
-			prefix = null
-			nsPrefix = qName === 'xmlns' && ''
-		}
-		//can not set prefix,because prefix !== ''
-		a.localName = localName ;
-		//prefix == null for no ns prefix attribute 
-		if(nsPrefix !== false){//hack!!
-			if(localNSMap == null){
-				localNSMap = {}
-				//console.log(currentNSMap,0)
-				_copy(currentNSMap,currentNSMap={})
-				//console.log(currentNSMap,1)
-			}
-			currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
-			a.uri = 'http://www.w3.org/2000/xmlns/'
-			domBuilder.startPrefixMapping(nsPrefix, value) 
-		}
-	}
-	var i = el.length;
-	while(i--){
-		a = el[i];
-		var prefix = a.prefix;
-		if(prefix){//no prefix attribute has no namespace
-			if(prefix === 'xml'){
-				a.uri = 'http://www.w3.org/XML/1998/namespace';
-			}if(prefix !== 'xmlns'){
-				a.uri = currentNSMap[prefix]
-				
-				//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
-			}
-		}
-	}
-	var nsp = tagName.indexOf(':');
-	if(nsp>0){
-		prefix = el.prefix = tagName.slice(0,nsp);
-		localName = el.localName = tagName.slice(nsp+1);
-	}else{
-		prefix = null;//important!!
-		localName = el.localName = tagName;
-	}
-	//no prefix element has default namespace
-	var ns = el.uri = currentNSMap[prefix || ''];
-	domBuilder.startElement(ns,localName,tagName,el);
-	//endPrefixMapping and startPrefixMapping have not any help for dom builder
-	//localNSMap = null
-	if(el.closed){
-		domBuilder.endElement(ns,localName,tagName);
-		if(localNSMap){
-			for(prefix in localNSMap){
-				domBuilder.endPrefixMapping(prefix) 
-			}
-		}
-	}else{
-		el.currentNSMap = currentNSMap;
-		el.localNSMap = localNSMap;
-		parseStack.push(el);
-	}
-}
-function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
-	if(/^(?:script|textarea)$/i.test(tagName)){
-		var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
-		var text = source.substring(elStartEnd+1,elEndStart);
-		if(/[&<]/.test(text)){
-			if(/^script$/i.test(tagName)){
-				//if(!/\]\]>/.test(text)){
-					//lexHandler.startCDATA();
-					domBuilder.characters(text,0,text.length);
-					//lexHandler.endCDATA();
-					return elEndStart;
-				//}
-			}//}else{//text area
-				text = text.replace(/&#?\w+;/g,entityReplacer);
-				domBuilder.characters(text,0,text.length);
-				return elEndStart;
-			//}
-			
-		}
-	}
-	return elStartEnd+1;
-}
-function fixSelfClosed(source,elStartEnd,tagName,closeMap){
-	//if(tagName in closeMap){
-	var pos = closeMap[tagName];
-	if(pos == null){
-		//console.log(tagName)
-		pos = closeMap[tagName] = source.lastIndexOf('</'+tagName+'>')
-	}
-	return pos<elStartEnd;
-	//} 
-}
-function _copy(source,target){
-	for(var n in source){target[n] = source[n]}
-}
-function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
-	var next= source.charAt(start+2)
-	switch(next){
-	case '-':
-		if(source.charAt(start + 3) === '-'){
-			var end = source.indexOf('-->',start+4);
-			//append comment source.substring(4,end)//<!--
-			if(end>start){
-				domBuilder.comment(source,start+4,end-start-4);
-				return end+3;
-			}else{
-				errorHandler.error("Unclosed comment");
-				return -1;
-			}
-		}else{
-			//error
-			return -1;
-		}
-	default:
-		if(source.substr(start+3,6) == 'CDATA['){
-			var end = source.indexOf(']]>',start+9);
-			domBuilder.startCDATA();
-			domBuilder.characters(source,start+9,end-start-9);
-			domBuilder.endCDATA() 
-			return end+3;
-		}
-		//<!DOCTYPE
-		//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
-		var matchs = split(source,start);
-		var len = matchs.length;
-		if(len>1 && /!doctype/i.test(matchs[0][0])){
-			var name = matchs[1][0];
-			var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0]
-			var sysid = len>4 && matchs[4][0];
-			var lastMatch = matchs[len-1]
-			domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
-					sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
-			domBuilder.endDTD();
-			
-			return lastMatch.index+lastMatch[0].length
-		}
-	}
-	return -1;
-}
-
-
-
-function parseInstruction(source,start,domBuilder){
-	var end = source.indexOf('?>',start);
-	if(end){
-		var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
-		if(match){
-			var len = match[0].length;
-			domBuilder.processingInstruction(match[1], match[2]) ;
-			return end+2;
-		}else{//error
-			return -1;
-		}
-	}
-	return -1;
-}
-
-/**
- * @param source
- */
-function ElementAttributes(source){
-	
-}
-ElementAttributes.prototype = {
-	setTagName:function(tagName){
-		if(!tagNamePattern.test(tagName)){
-			throw new Error('invalid tagName:'+tagName)
-		}
-		this.tagName = tagName
-	},
-	add:function(qName,value,offset){
-		if(!tagNamePattern.test(qName)){
-			throw new Error('invalid attribute:'+qName)
-		}
-		this[this.length++] = {qName:qName,value:value,offset:offset}
-	},
-	length:0,
-	getLocalName:function(i){return this[i].localName},
-	getOffset:function(i){return this[i].offset},
-	getQName:function(i){return this[i].qName},
-	getURI:function(i){return this[i].uri},
-	getValue:function(i){return this[i].value}
-//	,getIndex:function(uri, localName)){
-//		if(localName){
-//			
-//		}else{
-//			var qName = uri
-//		}
-//	},
-//	getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
-//	getType:function(uri,localName){}
-//	getType:function(i){},
-}
-
-
-
-
-function _set_proto_(thiz,parent){
-	thiz.__proto__ = parent;
-	return thiz;
-}
-if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
-	_set_proto_ = function(thiz,parent){
-		function p(){};
-		p.prototype = parent;
-		p = new p();
-		for(parent in thiz){
-			p[parent] = thiz[parent];
-		}
-		return p;
-	}
-}
-
-function split(source,start){
-	var match;
-	var buf = [];
-	var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
-	reg.lastIndex = start;
-	reg.exec(source);//skip <
-	while(match = reg.exec(source)){
-		buf.push(match);
-		if(match[1])return buf;
-	}
-}
-
-if(typeof require == 'function'){
-	exports.XMLReader = XMLReader;
-}
-
-
-},{}]},{},[1])(1)
-});
\ No newline at end of file
diff --git a/node_modules/plist/dist/plist.js b/node_modules/plist/dist/plist.js
deleted file mode 100644
index d8f4e43..0000000
--- a/node_modules/plist/dist/plist.js
+++ /dev/null
@@ -1,7987 +0,0 @@
-(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.plist = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-(function (Buffer){
-
-/**
- * Module dependencies.
- */
-
-var base64 = require('base64-js');
-var xmlbuilder = require('xmlbuilder');
-
-/**
- * Module exports.
- */
-
-exports.build = build;
-
-/**
- * Accepts a `Date` instance and returns an ISO date string.
- *
- * @param {Date} d - Date instance to serialize
- * @returns {String} ISO date string representation of `d`
- * @api private
- */
-
-function ISODateString(d){
-  function pad(n){
-    return n < 10 ? '0' + n : n;
-  }
-  return d.getUTCFullYear()+'-'
-    + pad(d.getUTCMonth()+1)+'-'
-    + pad(d.getUTCDate())+'T'
-    + pad(d.getUTCHours())+':'
-    + pad(d.getUTCMinutes())+':'
-    + pad(d.getUTCSeconds())+'Z';
-}
-
-/**
- * Returns the internal "type" of `obj` via the
- * `Object.prototype.toString()` trick.
- *
- * @param {Mixed} obj - any value
- * @returns {String} the internal "type" name
- * @api private
- */
-
-var toString = Object.prototype.toString;
-function type (obj) {
-  var m = toString.call(obj).match(/\[object (.*)\]/);
-  return m ? m[1] : m;
-}
-
-/**
- * Generate an XML plist string from the input object `obj`.
- *
- * @param {Object} obj - the object to convert
- * @param {Object} [opts] - optional options object
- * @returns {String} converted plist XML string
- * @api public
- */
-
-function build (obj, opts) {
-  var XMLHDR = {
-    version: '1.0',
-    encoding: 'UTF-8'
-  };
-
-  var XMLDTD = {
-    pubid: '-//Apple//DTD PLIST 1.0//EN',
-    sysid: 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'
-  };
-
-  var doc = xmlbuilder.create('plist');
-
-  doc.dec(XMLHDR.version, XMLHDR.encoding, XMLHDR.standalone);
-  doc.dtd(XMLDTD.pubid, XMLDTD.sysid);
-  doc.att('version', '1.0');
-
-  walk_obj(obj, doc);
-
-  if (!opts) opts = {};
-  // default `pretty` to `true`
-  opts.pretty = opts.pretty !== false;
-  return doc.end(opts);
-}
-
-/**
- * depth first, recursive traversal of a javascript object. when complete,
- * next_child contains a reference to the build XML object.
- *
- * @api private
- */
-
-function walk_obj(next, next_child) {
-  var tag_type, i, prop;
-  var name = type(next);
-
-  if ('Undefined' == name) {
-    return;
-  } else if (Array.isArray(next)) {
-    next_child = next_child.ele('array');
-    for (i = 0; i < next.length; i++) {
-      walk_obj(next[i], next_child);
-    }
-
-  } else if (Buffer.isBuffer(next)) {
-    next_child.ele('data').raw(next.toString('base64'));
-
-  } else if ('Object' == name) {
-    next_child = next_child.ele('dict');
-    for (prop in next) {
-      if (next.hasOwnProperty(prop)) {
-        next_child.ele('key').txt(prop);
-        walk_obj(next[prop], next_child);
-      }
-    }
-
-  } else if ('Number' == name) {
-    // detect if this is an integer or real
-    // TODO: add an ability to force one way or another via a "cast"
-    tag_type = (next % 1 === 0) ? 'integer' : 'real';
-    next_child.ele(tag_type).txt(next.toString());
-
-  } else if ('Date' == name) {
-    next_child.ele('date').txt(ISODateString(new Date(next)));
-
-  } else if ('Boolean' == name) {
-    next_child.ele(next ? 'true' : 'false');
-
-  } else if ('String' == name) {
-    next_child.ele('string').txt(next);
-
-  } else if ('ArrayBuffer' == name) {
-    next_child.ele('data').raw(base64.fromByteArray(next));
-
-  } else if (next && next.buffer && 'ArrayBuffer' == type(next.buffer)) {
-    // a typed array
-    next_child.ele('data').raw(base64.fromByteArray(new Uint8Array(next.buffer), next_child));
-
-  }
-}
-
-}).call(this,{"isBuffer":require("../node_modules/is-buffer/index.js")})
-},{"../node_modules/is-buffer/index.js":10,"base64-js":5,"xmlbuilder":87}],2:[function(require,module,exports){
-/**
- * Module dependencies.
- */
-
-var fs = require('fs');
-var parse = require('./parse');
-var deprecate = require('util-deprecate');
-
-/**
- * Module exports.
- */
-
-exports.parseFile = deprecate(parseFile, '`parseFile()` is deprecated. ' +
-  'Use `parseString()` instead.');
-exports.parseFileSync = deprecate(parseFileSync, '`parseFileSync()` is deprecated. ' +
-  'Use `parseStringSync()` instead.');
-
-/**
- * Parses file `filename` as a .plist file.
- * Invokes `fn` callback function when done.
- *
- * @param {String} filename - name of the file to read
- * @param {Function} fn - callback function
- * @api public
- * @deprecated use parseString() instead
- */
-
-function parseFile (filename, fn) {
-  fs.readFile(filename, { encoding: 'utf8' }, onread);
-  function onread (err, inxml) {
-    if (err) return fn(err);
-    parse.parseString(inxml, fn);
-  }
-}
-
-/**
- * Parses file `filename` as a .plist file.
- * Returns a  when done.
- *
- * @param {String} filename - name of the file to read
- * @param {Function} fn - callback function
- * @api public
- * @deprecated use parseStringSync() instead
- */
-
-function parseFileSync (filename) {
-  var inxml = fs.readFileSync(filename, 'utf8');
-  return parse.parseStringSync(inxml);
-}
-
-},{"./parse":3,"fs":6,"util-deprecate":70}],3:[function(require,module,exports){
-(function (Buffer){
-
-/**
- * Module dependencies.
- */
-
-var deprecate = require('util-deprecate');
-var DOMParser = require('xmldom').DOMParser;
-
-/**
- * Module exports.
- */
-
-exports.parse = parse;
-exports.parseString = deprecate(parseString, '`parseString()` is deprecated. ' +
-  'It\'s not actually async. Use `parse()` instead.');
-exports.parseStringSync = deprecate(parseStringSync, '`parseStringSync()` is ' +
-  'deprecated. Use `parse()` instead.');
-
-/**
- * We ignore raw text (usually whitespace), <!-- xml comments -->,
- * and raw CDATA nodes.
- *
- * @param {Element} node
- * @returns {Boolean}
- * @api private
- */
-
-function shouldIgnoreNode (node) {
-  return node.nodeType === 3 // text
-    || node.nodeType === 8   // comment
-    || node.nodeType === 4;  // cdata
-}
-
-
-/**
- * Parses a Plist XML string. Returns an Object.
- *
- * @param {String} xml - the XML String to decode
- * @returns {Mixed} the decoded value from the Plist XML
- * @api public
- */
-
-function parse (xml) {
-  var doc = new DOMParser().parseFromString(xml);
-  if (doc.documentElement.nodeName !== 'plist') {
-    throw new Error('malformed document. First element should be <plist>');
-  }
-  var plist = parsePlistXML(doc.documentElement);
-
-  // the root <plist> node gets interpreted as an Array,
-  // so pull out the inner data first
-  if (plist.length == 1) plist = plist[0];
-
-  return plist;
-}
-
-/**
- * Parses a Plist XML string. Returns an Object. Takes a `callback` function.
- *
- * @param {String} xml - the XML String to decode
- * @param {Function} callback - callback function
- * @returns {Mixed} the decoded value from the Plist XML
- * @api public
- * @deprecated not actually async. use parse() instead
- */
-
-function parseString (xml, callback) {
-  var doc, error, plist;
-  try {
-    doc = new DOMParser().parseFromString(xml);
-    plist = parsePlistXML(doc.documentElement);
-  } catch(e) {
-    error = e;
-  }
-  callback(error, plist);
-}
-
-/**
- * Parses a Plist XML string. Returns an Object.
- *
- * @param {String} xml - the XML String to decode
- * @param {Function} callback - callback function
- * @returns {Mixed} the decoded value from the Plist XML
- * @api public
- * @deprecated use parse() instead
- */
-
-function parseStringSync (xml) {
-  var doc = new DOMParser().parseFromString(xml);
-  var plist;
-  if (doc.documentElement.nodeName !== 'plist') {
-    throw new Error('malformed document. First element should be <plist>');
-  }
-  plist = parsePlistXML(doc.documentElement);
-
-  // if the plist is an array with 1 element, pull it out of the array
-  if (plist.length == 1) {
-    plist = plist[0];
-  }
-  return plist;
-}
-
-/**
- * Convert an XML based plist document into a JSON representation.
- *
- * @param {Object} xml_node - current XML node in the plist
- * @returns {Mixed} built up JSON object
- * @api private
- */
-
-function parsePlistXML (node) {
-  var i, new_obj, key, val, new_arr, res, d;
-
-  if (!node)
-    return null;
-
-  if (node.nodeName === 'plist') {
-    new_arr = [];
-    for (i=0; i < node.childNodes.length; i++) {
-      // ignore comment nodes (text)
-      if (!shouldIgnoreNode(node.childNodes[i])) {
-        new_arr.push( parsePlistXML(node.childNodes[i]));
-      }
-    }
-    return new_arr;
-
-  } else if (node.nodeName === 'dict') {
-    new_obj = {};
-    key = null;
-    for (i=0; i < node.childNodes.length; i++) {
-      // ignore comment nodes (text)
-      if (!shouldIgnoreNode(node.childNodes[i])) {
-        if (key === null) {
-          key = parsePlistXML(node.childNodes[i]);
-        } else {
-          new_obj[key] = parsePlistXML(node.childNodes[i]);
-          key = null;
-        }
-      }
-    }
-    return new_obj;
-
-  } else if (node.nodeName === 'array') {
-    new_arr = [];
-    for (i=0; i < node.childNodes.length; i++) {
-      // ignore comment nodes (text)
-      if (!shouldIgnoreNode(node.childNodes[i])) {
-        res = parsePlistXML(node.childNodes[i]);
-        if (null != res) new_arr.push(res);
-      }
-    }
-    return new_arr;
-
-  } else if (node.nodeName === '#text') {
-    // TODO: what should we do with text types? (CDATA sections)
-
-  } else if (node.nodeName === 'key') {
-    return node.childNodes[0].nodeValue;
-
-  } else if (node.nodeName === 'string') {
-    res = '';
-    for (d=0; d < node.childNodes.length; d++) {
-      res += node.childNodes[d].nodeValue;
-    }
-    return res;
-
-  } else if (node.nodeName === 'integer') {
-    // parse as base 10 integer
-    return parseInt(node.childNodes[0].nodeValue, 10);
-
-  } else if (node.nodeName === 'real') {
-    res = '';
-    for (d=0; d < node.childNodes.length; d++) {
-      if (node.childNodes[d].nodeType === 3) {
-        res += node.childNodes[d].nodeValue;
-      }
-    }
-    return parseFloat(res);
-
-  } else if (node.nodeName === 'data') {
-    res = '';
-    for (d=0; d < node.childNodes.length; d++) {
-      if (node.childNodes[d].nodeType === 3) {
-        res += node.childNodes[d].nodeValue.replace(/\s+/g, '');
-      }
-    }
-
-    // decode base64 data to a Buffer instance
-    return new Buffer(res, 'base64');
-
-  } else if (node.nodeName === 'date') {
-    return new Date(node.childNodes[0].nodeValue);
-
-  } else if (node.nodeName === 'true') {
-    return true;
-
-  } else if (node.nodeName === 'false') {
-    return false;
-  }
-}
-
-}).call(this,require("buffer").Buffer)
-},{"buffer":7,"util-deprecate":70,"xmldom":88}],4:[function(require,module,exports){
-
-var i;
-
-/**
- * Parser functions.
- */
-
-var parserFunctions = require('./parse');
-for (i in parserFunctions) exports[i] = parserFunctions[i];
-
-/**
- * Builder functions.
- */
-
-var builderFunctions = require('./build');
-for (i in builderFunctions) exports[i] = builderFunctions[i];
-
-/**
- * Add Node.js-specific functions (they're deprecated…).
- */
-
-var nodeFunctions = require('./node');
-for (i in nodeFunctions) exports[i] = nodeFunctions[i];
-
-},{"./build":1,"./node":2,"./parse":3}],5:[function(require,module,exports){
-var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
-
-;(function (exports) {
-	'use strict';
-
-  var Arr = (typeof Uint8Array !== 'undefined')
-    ? Uint8Array
-    : Array
-
-	var PLUS   = '+'.charCodeAt(0)
-	var SLASH  = '/'.charCodeAt(0)
-	var NUMBER = '0'.charCodeAt(0)
-	var LOWER  = 'a'.charCodeAt(0)
-	var UPPER  = 'A'.charCodeAt(0)
-	var PLUS_URL_SAFE = '-'.charCodeAt(0)
-	var SLASH_URL_SAFE = '_'.charCodeAt(0)
-
-	function decode (elt) {
-		var code = elt.charCodeAt(0)
-		if (code === PLUS ||
-		    code === PLUS_URL_SAFE)
-			return 62 // '+'
-		if (code === SLASH ||
-		    code === SLASH_URL_SAFE)
-			return 63 // '/'
-		if (code < NUMBER)
-			return -1 //no match
-		if (code < NUMBER + 10)
-			return code - NUMBER + 26 + 26
-		if (code < UPPER + 26)
-			return code - UPPER
-		if (code < LOWER + 26)
-			return code - LOWER + 26
-	}
-
-	function b64ToByteArray (b64) {
-		var i, j, l, tmp, placeHolders, arr
-
-		if (b64.length % 4 > 0) {
-			throw new Error('Invalid string. Length must be a multiple of 4')
-		}
-
-		// the number of equal signs (place holders)
-		// if there are two placeholders, than the two characters before it
-		// represent one byte
-		// if there is only one, then the three characters before it represent 2 bytes
-		// this is just a cheap hack to not do indexOf twice
-		var len = b64.length
-		placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
-
-		// base64 is 4/3 + up to two characters of the original data
-		arr = new Arr(b64.length * 3 / 4 - placeHolders)
-
-		// if there are placeholders, only get up to the last complete 4 chars
-		l = placeHolders > 0 ? b64.length - 4 : b64.length
-
-		var L = 0
-
-		function push (v) {
-			arr[L++] = v
-		}
-
-		for (i = 0, j = 0; i < l; i += 4, j += 3) {
-			tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
-			push((tmp & 0xFF0000) >> 16)
-			push((tmp & 0xFF00) >> 8)
-			push(tmp & 0xFF)
-		}
-
-		if (placeHolders === 2) {
-			tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
-			push(tmp & 0xFF)
-		} else if (placeHolders === 1) {
-			tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
-			push((tmp >> 8) & 0xFF)
-			push(tmp & 0xFF)
-		}
-
-		return arr
-	}
-
-	function uint8ToBase64 (uint8) {
-		var i,
-			extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
-			output = "",
-			temp, length
-
-		function encode (num) {
-			return lookup.charAt(num)
-		}
-
-		function tripletToBase64 (num) {
-			return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
-		}
-
-		// go through the array every three bytes, we'll deal with trailing stuff later
-		for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
-			temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
-			output += tripletToBase64(temp)
-		}
-
-		// pad the end with zeros, but make sure to not forget the extra bytes
-		switch (extraBytes) {
-			case 1:
-				temp = uint8[uint8.length - 1]
-				output += encode(temp >> 2)
-				output += encode((temp << 4) & 0x3F)
-				output += '=='
-				break
-			case 2:
-				temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
-				output += encode(temp >> 10)
-				output += encode((temp >> 4) & 0x3F)
-				output += encode((temp << 2) & 0x3F)
-				output += '='
-				break
-		}
-
-		return output
-	}
-
-	exports.toByteArray = b64ToByteArray
-	exports.fromByteArray = uint8ToBase64
-}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
-
-},{}],6:[function(require,module,exports){
-
-},{}],7:[function(require,module,exports){
-(function (global){
-/*!
- * The buffer module from node.js, for the browser.
- *
- * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
- * @license  MIT
- */
-/* eslint-disable no-proto */
-
-var base64 = require('base64-js')
-var ieee754 = require('ieee754')
-var isArray = require('is-array')
-
-exports.Buffer = Buffer
-exports.SlowBuffer = SlowBuffer
-exports.INSPECT_MAX_BYTES = 50
-Buffer.poolSize = 8192 // not used by this implementation
-
-var rootParent = {}
-
-/**
- * If `Buffer.TYPED_ARRAY_SUPPORT`:
- *   === true    Use Uint8Array implementation (fastest)
- *   === false   Use Object implementation (most compatible, even IE6)
- *
- * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
- * Opera 11.6+, iOS 4.2+.
- *
- * Due to various browser bugs, sometimes the Object implementation will be used even
- * when the browser supports typed arrays.
- *
- * Note:
- *
- *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
- *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
- *
- *   - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property
- *     on objects.
- *
- *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
- *
- *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
- *     incorrect length in some situations.
-
- * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
- * get the Object implementation, which is slower but behaves correctly.
- */
-Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
-  ? global.TYPED_ARRAY_SUPPORT
-  : typedArraySupport()
-
-function typedArraySupport () {
-  function Bar () {}
-  try {
-    var arr = new Uint8Array(1)
-    arr.foo = function () { return 42 }
-    arr.constructor = Bar
-    return arr.foo() === 42 && // typed array instances can be augmented
-        arr.constructor === Bar && // constructor can be set
-        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
-        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
-  } catch (e) {
-    return false
-  }
-}
-
-function kMaxLength () {
-  return Buffer.TYPED_ARRAY_SUPPORT
-    ? 0x7fffffff
-    : 0x3fffffff
-}
-
-/**
- * Class: Buffer
- * =============
- *
- * The Buffer constructor returns instances of `Uint8Array` that are augmented
- * with function properties for all the node `Buffer` API functions. We use
- * `Uint8Array` so that square bracket notation works as expected -- it returns
- * a single octet.
- *
- * By augmenting the instances, we can avoid modifying the `Uint8Array`
- * prototype.
- */
-function Buffer (arg) {
-  if (!(this instanceof Buffer)) {
-    // Avoid going through an ArgumentsAdaptorTrampoline in the common case.
-    if (arguments.length > 1) return new Buffer(arg, arguments[1])
-    return new Buffer(arg)
-  }
-
-  this.length = 0
-  this.parent = undefined
-
-  // Common case.
-  if (typeof arg === 'number') {
-    return fromNumber(this, arg)
-  }
-
-  // Slightly less common case.
-  if (typeof arg === 'string') {
-    return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')
-  }
-
-  // Unusual.
-  return fromObject(this, arg)
-}
-
-function fromNumber (that, length) {
-  that = allocate(that, length < 0 ? 0 : checked(length) | 0)
-  if (!Buffer.TYPED_ARRAY_SUPPORT) {
-    for (var i = 0; i < length; i++) {
-      that[i] = 0
-    }
-  }
-  return that
-}
-
-function fromString (that, string, encoding) {
-  if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'
-
-  // Assumption: byteLength() return value is always < kMaxLength.
-  var length = byteLength(string, encoding) | 0
-  that = allocate(that, length)
-
-  that.write(string, encoding)
-  return that
-}
-
-function fromObject (that, object) {
-  if (Buffer.isBuffer(object)) return fromBuffer(that, object)
-
-  if (isArray(object)) return fromArray(that, object)
-
-  if (object == null) {
-    throw new TypeError('must start with number, buffer, array or string')
-  }
-
-  if (typeof ArrayBuffer !== 'undefined') {
-    if (object.buffer instanceof ArrayBuffer) {
-      return fromTypedArray(that, object)
-    }
-    if (object instanceof ArrayBuffer) {
-      return fromArrayBuffer(that, object)
-    }
-  }
-
-  if (object.length) return fromArrayLike(that, object)
-
-  return fromJsonObject(that, object)
-}
-
-function fromBuffer (that, buffer) {
-  var length = checked(buffer.length) | 0
-  that = allocate(that, length)
-  buffer.copy(that, 0, 0, length)
-  return that
-}
-
-function fromArray (that, array) {
-  var length = checked(array.length) | 0
-  that = allocate(that, length)
-  for (var i = 0; i < length; i += 1) {
-    that[i] = array[i] & 255
-  }
-  return that
-}
-
-// Duplicate of fromArray() to keep fromArray() monomorphic.
-function fromTypedArray (that, array) {
-  var length = checked(array.length) | 0
-  that = allocate(that, length)
-  // Truncating the elements is probably not what people expect from typed
-  // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior
-  // of the old Buffer constructor.
-  for (var i = 0; i < length; i += 1) {
-    that[i] = array[i] & 255
-  }
-  return that
-}
-
-function fromArrayBuffer (that, array) {
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    // Return an augmented `Uint8Array` instance, for best performance
-    array.byteLength
-    that = Buffer._augment(new Uint8Array(array))
-  } else {
-    // Fallback: Return an object instance of the Buffer class
-    that = fromTypedArray(that, new Uint8Array(array))
-  }
-  return that
-}
-
-function fromArrayLike (that, array) {
-  var length = checked(array.length) | 0
-  that = allocate(that, length)
-  for (var i = 0; i < length; i += 1) {
-    that[i] = array[i] & 255
-  }
-  return that
-}
-
-// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.
-// Returns a zero-length buffer for inputs that don't conform to the spec.
-function fromJsonObject (that, object) {
-  var array
-  var length = 0
-
-  if (object.type === 'Buffer' && isArray(object.data)) {
-    array = object.data
-    length = checked(array.length) | 0
-  }
-  that = allocate(that, length)
-
-  for (var i = 0; i < length; i += 1) {
-    that[i] = array[i] & 255
-  }
-  return that
-}
-
-if (Buffer.TYPED_ARRAY_SUPPORT) {
-  Buffer.prototype.__proto__ = Uint8Array.prototype
-  Buffer.__proto__ = Uint8Array
-}
-
-function allocate (that, length) {
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    // Return an augmented `Uint8Array` instance, for best performance
-    that = Buffer._augment(new Uint8Array(length))
-    that.__proto__ = Buffer.prototype
-  } else {
-    // Fallback: Return an object instance of the Buffer class
-    that.length = length
-    that._isBuffer = true
-  }
-
-  var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1
-  if (fromPool) that.parent = rootParent
-
-  return that
-}
-
-function checked (length) {
-  // Note: cannot use `length < kMaxLength` here because that fails when
-  // length is NaN (which is otherwise coerced to zero.)
-  if (length >= kMaxLength()) {
-    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
-                         'size: 0x' + kMaxLength().toString(16) + ' bytes')
-  }
-  return length | 0
-}
-
-function SlowBuffer (subject, encoding) {
-  if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)
-
-  var buf = new Buffer(subject, encoding)
-  delete buf.parent
-  return buf
-}
-
-Buffer.isBuffer = function isBuffer (b) {
-  return !!(b != null && b._isBuffer)
-}
-
-Buffer.compare = function compare (a, b) {
-  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
-    throw new TypeError('Arguments must be Buffers')
-  }
-
-  if (a === b) return 0
-
-  var x = a.length
-  var y = b.length
-
-  var i = 0
-  var len = Math.min(x, y)
-  while (i < len) {
-    if (a[i] !== b[i]) break
-
-    ++i
-  }
-
-  if (i !== len) {
-    x = a[i]
-    y = b[i]
-  }
-
-  if (x < y) return -1
-  if (y < x) return 1
-  return 0
-}
-
-Buffer.isEncoding = function isEncoding (encoding) {
-  switch (String(encoding).toLowerCase()) {
-    case 'hex':
-    case 'utf8':
-    case 'utf-8':
-    case 'ascii':
-    case 'binary':
-    case 'base64':
-    case 'raw':
-    case 'ucs2':
-    case 'ucs-2':
-    case 'utf16le':
-    case 'utf-16le':
-      return true
-    default:
-      return false
-  }
-}
-
-Buffer.concat = function concat (list, length) {
-  if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')
-
-  if (list.length === 0) {
-    return new Buffer(0)
-  }
-
-  var i
-  if (length === undefined) {
-    length = 0
-    for (i = 0; i < list.length; i++) {
-      length += list[i].length
-    }
-  }
-
-  var buf = new Buffer(length)
-  var pos = 0
-  for (i = 0; i < list.length; i++) {
-    var item = list[i]
-    item.copy(buf, pos)
-    pos += item.length
-  }
-  return buf
-}
-
-function byteLength (string, encoding) {
-  if (typeof string !== 'string') string = '' + string
-
-  var len = string.length
-  if (len === 0) return 0
-
-  // Use a for loop to avoid recursion
-  var loweredCase = false
-  for (;;) {
-    switch (encoding) {
-      case 'ascii':
-      case 'binary':
-      // Deprecated
-      case 'raw':
-      case 'raws':
-        return len
-      case 'utf8':
-      case 'utf-8':
-        return utf8ToBytes(string).length
-      case 'ucs2':
-      case 'ucs-2':
-      case 'utf16le':
-      case 'utf-16le':
-        return len * 2
-      case 'hex':
-        return len >>> 1
-      case 'base64':
-        return base64ToBytes(string).length
-      default:
-        if (loweredCase) return utf8ToBytes(string).length // assume utf8
-        encoding = ('' + encoding).toLowerCase()
-        loweredCase = true
-    }
-  }
-}
-Buffer.byteLength = byteLength
-
-// pre-set for values that may exist in the future
-Buffer.prototype.length = undefined
-Buffer.prototype.parent = undefined
-
-function slowToString (encoding, start, end) {
-  var loweredCase = false
-
-  start = start | 0
-  end = end === undefined || end === Infinity ? this.length : end | 0
-
-  if (!encoding) encoding = 'utf8'
-  if (start < 0) start = 0
-  if (end > this.length) end = this.length
-  if (end <= start) return ''
-
-  while (true) {
-    switch (encoding) {
-      case 'hex':
-        return hexSlice(this, start, end)
-
-      case 'utf8':
-      case 'utf-8':
-        return utf8Slice(this, start, end)
-
-      case 'ascii':
-        return asciiSlice(this, start, end)
-
-      case 'binary':
-        return binarySlice(this, start, end)
-
-      case 'base64':
-        return base64Slice(this, start, end)
-
-      case 'ucs2':
-      case 'ucs-2':
-      case 'utf16le':
-      case 'utf-16le':
-        return utf16leSlice(this, start, end)
-
-      default:
-        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
-        encoding = (encoding + '').toLowerCase()
-        loweredCase = true
-    }
-  }
-}
-
-Buffer.prototype.toString = function toString () {
-  var length = this.length | 0
-  if (length === 0) return ''
-  if (arguments.length === 0) return utf8Slice(this, 0, length)
-  return slowToString.apply(this, arguments)
-}
-
-Buffer.prototype.equals = function equals (b) {
-  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
-  if (this === b) return true
-  return Buffer.compare(this, b) === 0
-}
-
-Buffer.prototype.inspect = function inspect () {
-  var str = ''
-  var max = exports.INSPECT_MAX_BYTES
-  if (this.length > 0) {
-    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
-    if (this.length > max) str += ' ... '
-  }
-  return '<Buffer ' + str + '>'
-}
-
-Buffer.prototype.compare = function compare (b) {
-  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
-  if (this === b) return 0
-  return Buffer.compare(this, b)
-}
-
-Buffer.prototype.indexOf = function indexOf (val, byteOffset) {
-  if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff
-  else if (byteOffset < -0x80000000) byteOffset = -0x80000000
-  byteOffset >>= 0
-
-  if (this.length === 0) return -1
-  if (byteOffset >= this.length) return -1
-
-  // Negative offsets start from the end of the buffer
-  if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)
-
-  if (typeof val === 'string') {
-    if (val.length === 0) return -1 // special case: looking for empty string always fails
-    return String.prototype.indexOf.call(this, val, byteOffset)
-  }
-  if (Buffer.isBuffer(val)) {
-    return arrayIndexOf(this, val, byteOffset)
-  }
-  if (typeof val === 'number') {
-    if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {
-      return Uint8Array.prototype.indexOf.call(this, val, byteOffset)
-    }
-    return arrayIndexOf(this, [ val ], byteOffset)
-  }
-
-  function arrayIndexOf (arr, val, byteOffset) {
-    var foundIndex = -1
-    for (var i = 0; byteOffset + i < arr.length; i++) {
-      if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {
-        if (foundIndex === -1) foundIndex = i
-        if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex
-      } else {
-        foundIndex = -1
-      }
-    }
-    return -1
-  }
-
-  throw new TypeError('val must be string, number or Buffer')
-}
-
-// `get` is deprecated
-Buffer.prototype.get = function get (offset) {
-  console.log('.get() is deprecated. Access using array indexes instead.')
-  return this.readUInt8(offset)
-}
-
-// `set` is deprecated
-Buffer.prototype.set = function set (v, offset) {
-  console.log('.set() is deprecated. Access using array indexes instead.')
-  return this.writeUInt8(v, offset)
-}
-
-function hexWrite (buf, string, offset, length) {
-  offset = Number(offset) || 0
-  var remaining = buf.length - offset
-  if (!length) {
-    length = remaining
-  } else {
-    length = Number(length)
-    if (length > remaining) {
-      length = remaining
-    }
-  }
-
-  // must be an even number of digits
-  var strLen = string.length
-  if (strLen % 2 !== 0) throw new Error('Invalid hex string')
-
-  if (length > strLen / 2) {
-    length = strLen / 2
-  }
-  for (var i = 0; i < length; i++) {
-    var parsed = parseInt(string.substr(i * 2, 2), 16)
-    if (isNaN(parsed)) throw new Error('Invalid hex string')
-    buf[offset + i] = parsed
-  }
-  return i
-}
-
-function utf8Write (buf, string, offset, length) {
-  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
-}
-
-function asciiWrite (buf, string, offset, length) {
-  return blitBuffer(asciiToBytes(string), buf, offset, length)
-}
-
-function binaryWrite (buf, string, offset, length) {
-  return asciiWrite(buf, string, offset, length)
-}
-
-function base64Write (buf, string, offset, length) {
-  return blitBuffer(base64ToBytes(string), buf, offset, length)
-}
-
-function ucs2Write (buf, string, offset, length) {
-  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
-}
-
-Buffer.prototype.write = function write (string, offset, length, encoding) {
-  // Buffer#write(string)
-  if (offset === undefined) {
-    encoding = 'utf8'
-    length = this.length
-    offset = 0
-  // Buffer#write(string, encoding)
-  } else if (length === undefined && typeof offset === 'string') {
-    encoding = offset
-    length = this.length
-    offset = 0
-  // Buffer#write(string, offset[, length][, encoding])
-  } else if (isFinite(offset)) {
-    offset = offset | 0
-    if (isFinite(length)) {
-      length = length | 0
-      if (encoding === undefined) encoding = 'utf8'
-    } else {
-      encoding = length
-      length = undefined
-    }
-  // legacy write(string, encoding, offset, length) - remove in v0.13
-  } else {
-    var swap = encoding
-    encoding = offset
-    offset = length | 0
-    length = swap
-  }
-
-  var remaining = this.length - offset
-  if (length === undefined || length > remaining) length = remaining
-
-  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
-    throw new RangeError('attempt to write outside buffer bounds')
-  }
-
-  if (!encoding) encoding = 'utf8'
-
-  var loweredCase = false
-  for (;;) {
-    switch (encoding) {
-      case 'hex':
-        return hexWrite(this, string, offset, length)
-
-      case 'utf8':
-      case 'utf-8':
-        return utf8Write(this, string, offset, length)
-
-      case 'ascii':
-        return asciiWrite(this, string, offset, length)
-
-      case 'binary':
-        return binaryWrite(this, string, offset, length)
-
-      case 'base64':
-        // Warning: maxLength not taken into account in base64Write
-        return base64Write(this, string, offset, length)
-
-      case 'ucs2':
-      case 'ucs-2':
-      case 'utf16le':
-      case 'utf-16le':
-        return ucs2Write(this, string, offset, length)
-
-      default:
-        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
-        encoding = ('' + encoding).toLowerCase()
-        loweredCase = true
-    }
-  }
-}
-
-Buffer.prototype.toJSON = function toJSON () {
-  return {
-    type: 'Buffer',
-    data: Array.prototype.slice.call(this._arr || this, 0)
-  }
-}
-
-function base64Slice (buf, start, end) {
-  if (start === 0 && end === buf.length) {
-    return base64.fromByteArray(buf)
-  } else {
-    return base64.fromByteArray(buf.slice(start, end))
-  }
-}
-
-function utf8Slice (buf, start, end) {
-  end = Math.min(buf.length, end)
-  var res = []
-
-  var i = start
-  while (i < end) {
-    var firstByte = buf[i]
-    var codePoint = null
-    var bytesPerSequence = (firstByte > 0xEF) ? 4
-      : (firstByte > 0xDF) ? 3
-      : (firstByte > 0xBF) ? 2
-      : 1
-
-    if (i + bytesPerSequence <= end) {
-      var secondByte, thirdByte, fourthByte, tempCodePoint
-
-      switch (bytesPerSequence) {
-        case 1:
-          if (firstByte < 0x80) {
-            codePoint = firstByte
-          }
-          break
-        case 2:
-          secondByte = buf[i + 1]
-          if ((secondByte & 0xC0) === 0x80) {
-            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
-            if (tempCodePoint > 0x7F) {
-              codePoint = tempCodePoint
-            }
-          }
-          break
-        case 3:
-          secondByte = buf[i + 1]
-          thirdByte = buf[i + 2]
-          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
-            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
-            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
-              codePoint = tempCodePoint
-            }
-          }
-          break
-        case 4:
-          secondByte = buf[i + 1]
-          thirdByte = buf[i + 2]
-          fourthByte = buf[i + 3]
-          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
-            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
-            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
-              codePoint = tempCodePoint
-            }
-          }
-      }
-    }
-
-    if (codePoint === null) {
-      // we did not generate a valid codePoint so insert a
-      // replacement char (U+FFFD) and advance only 1 byte
-      codePoint = 0xFFFD
-      bytesPerSequence = 1
-    } else if (codePoint > 0xFFFF) {
-      // encode to utf16 (surrogate pair dance)
-      codePoint -= 0x10000
-      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
-      codePoint = 0xDC00 | codePoint & 0x3FF
-    }
-
-    res.push(codePoint)
-    i += bytesPerSequence
-  }
-
-  return decodeCodePointsArray(res)
-}
-
-// Based on http://stackoverflow.com/a/22747272/680742, the browser with
-// the lowest limit is Chrome, with 0x10000 args.
-// We go 1 magnitude less, for safety
-var MAX_ARGUMENTS_LENGTH = 0x1000
-
-function decodeCodePointsArray (codePoints) {
-  var len = codePoints.length
-  if (len <= MAX_ARGUMENTS_LENGTH) {
-    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
-  }
-
-  // Decode in chunks to avoid "call stack size exceeded".
-  var res = ''
-  var i = 0
-  while (i < len) {
-    res += String.fromCharCode.apply(
-      String,
-      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
-    )
-  }
-  return res
-}
-
-function asciiSlice (buf, start, end) {
-  var ret = ''
-  end = Math.min(buf.length, end)
-
-  for (var i = start; i < end; i++) {
-    ret += String.fromCharCode(buf[i] & 0x7F)
-  }
-  return ret
-}
-
-function binarySlice (buf, start, end) {
-  var ret = ''
-  end = Math.min(buf.length, end)
-
-  for (var i = start; i < end; i++) {
-    ret += String.fromCharCode(buf[i])
-  }
-  return ret
-}
-
-function hexSlice (buf, start, end) {
-  var len = buf.length
-
-  if (!start || start < 0) start = 0
-  if (!end || end < 0 || end > len) end = len
-
-  var out = ''
-  for (var i = start; i < end; i++) {
-    out += toHex(buf[i])
-  }
-  return out
-}
-
-function utf16leSlice (buf, start, end) {
-  var bytes = buf.slice(start, end)
-  var res = ''
-  for (var i = 0; i < bytes.length; i += 2) {
-    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
-  }
-  return res
-}
-
-Buffer.prototype.slice = function slice (start, end) {
-  var len = this.length
-  start = ~~start
-  end = end === undefined ? len : ~~end
-
-  if (start < 0) {
-    start += len
-    if (start < 0) start = 0
-  } else if (start > len) {
-    start = len
-  }
-
-  if (end < 0) {
-    end += len
-    if (end < 0) end = 0
-  } else if (end > len) {
-    end = len
-  }
-
-  if (end < start) end = start
-
-  var newBuf
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    newBuf = Buffer._augment(this.subarray(start, end))
-  } else {
-    var sliceLen = end - start
-    newBuf = new Buffer(sliceLen, undefined)
-    for (var i = 0; i < sliceLen; i++) {
-      newBuf[i] = this[i + start]
-    }
-  }
-
-  if (newBuf.length) newBuf.parent = this.parent || this
-
-  return newBuf
-}
-
-/*
- * Need to make sure that buffer isn't trying to write out of bounds.
- */
-function checkOffset (offset, ext, length) {
-  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
-  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
-}
-
-Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
-  offset = offset | 0
-  byteLength = byteLength | 0
-  if (!noAssert) checkOffset(offset, byteLength, this.length)
-
-  var val = this[offset]
-  var mul = 1
-  var i = 0
-  while (++i < byteLength && (mul *= 0x100)) {
-    val += this[offset + i] * mul
-  }
-
-  return val
-}
-
-Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
-  offset = offset | 0
-  byteLength = byteLength | 0
-  if (!noAssert) {
-    checkOffset(offset, byteLength, this.length)
-  }
-
-  var val = this[offset + --byteLength]
-  var mul = 1
-  while (byteLength > 0 && (mul *= 0x100)) {
-    val += this[offset + --byteLength] * mul
-  }
-
-  return val
-}
-
-Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 1, this.length)
-  return this[offset]
-}
-
-Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  return this[offset] | (this[offset + 1] << 8)
-}
-
-Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  return (this[offset] << 8) | this[offset + 1]
-}
-
-Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return ((this[offset]) |
-      (this[offset + 1] << 8) |
-      (this[offset + 2] << 16)) +
-      (this[offset + 3] * 0x1000000)
-}
-
-Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return (this[offset] * 0x1000000) +
-    ((this[offset + 1] << 16) |
-    (this[offset + 2] << 8) |
-    this[offset + 3])
-}
-
-Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
-  offset = offset | 0
-  byteLength = byteLength | 0
-  if (!noAssert) checkOffset(offset, byteLength, this.length)
-
-  var val = this[offset]
-  var mul = 1
-  var i = 0
-  while (++i < byteLength && (mul *= 0x100)) {
-    val += this[offset + i] * mul
-  }
-  mul *= 0x80
-
-  if (val >= mul) val -= Math.pow(2, 8 * byteLength)
-
-  return val
-}
-
-Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
-  offset = offset | 0
-  byteLength = byteLength | 0
-  if (!noAssert) checkOffset(offset, byteLength, this.length)
-
-  var i = byteLength
-  var mul = 1
-  var val = this[offset + --i]
-  while (i > 0 && (mul *= 0x100)) {
-    val += this[offset + --i] * mul
-  }
-  mul *= 0x80
-
-  if (val >= mul) val -= Math.pow(2, 8 * byteLength)
-
-  return val
-}
-
-Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 1, this.length)
-  if (!(this[offset] & 0x80)) return (this[offset])
-  return ((0xff - this[offset] + 1) * -1)
-}
-
-Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  var val = this[offset] | (this[offset + 1] << 8)
-  return (val & 0x8000) ? val | 0xFFFF0000 : val
-}
-
-Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  var val = this[offset + 1] | (this[offset] << 8)
-  return (val & 0x8000) ? val | 0xFFFF0000 : val
-}
-
-Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return (this[offset]) |
-    (this[offset + 1] << 8) |
-    (this[offset + 2] << 16) |
-    (this[offset + 3] << 24)
-}
-
-Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return (this[offset] << 24) |
-    (this[offset + 1] << 16) |
-    (this[offset + 2] << 8) |
-    (this[offset + 3])
-}
-
-Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-  return ieee754.read(this, offset, true, 23, 4)
-}
-
-Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 4, this.length)
-  return ieee754.read(this, offset, false, 23, 4)
-}
-
-Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 8, this.length)
-  return ieee754.read(this, offset, true, 52, 8)
-}
-
-Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
-  if (!noAssert) checkOffset(offset, 8, this.length)
-  return ieee754.read(this, offset, false, 52, 8)
-}
-
-function checkInt (buf, value, offset, ext, max, min) {
-  if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
-  if (value > max || value < min) throw new RangeError('value is out of bounds')
-  if (offset + ext > buf.length) throw new RangeError('index out of range')
-}
-
-Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset | 0
-  byteLength = byteLength | 0
-  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
-
-  var mul = 1
-  var i = 0
-  this[offset] = value & 0xFF
-  while (++i < byteLength && (mul *= 0x100)) {
-    this[offset + i] = (value / mul) & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset | 0
-  byteLength = byteLength | 0
-  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
-
-  var i = byteLength - 1
-  var mul = 1
-  this[offset + i] = value & 0xFF
-  while (--i >= 0 && (mul *= 0x100)) {
-    this[offset + i] = (value / mul) & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
-  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
-  this[offset] = (value & 0xff)
-  return offset + 1
-}
-
-function objectWriteUInt16 (buf, value, offset, littleEndian) {
-  if (value < 0) value = 0xffff + value + 1
-  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
-    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
-      (littleEndian ? i : 1 - i) * 8
-  }
-}
-
-Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value & 0xff)
-    this[offset + 1] = (value >>> 8)
-  } else {
-    objectWriteUInt16(this, value, offset, true)
-  }
-  return offset + 2
-}
-
-Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 8)
-    this[offset + 1] = (value & 0xff)
-  } else {
-    objectWriteUInt16(this, value, offset, false)
-  }
-  return offset + 2
-}
-
-function objectWriteUInt32 (buf, value, offset, littleEndian) {
-  if (value < 0) value = 0xffffffff + value + 1
-  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
-    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
-  }
-}
-
-Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset + 3] = (value >>> 24)
-    this[offset + 2] = (value >>> 16)
-    this[offset + 1] = (value >>> 8)
-    this[offset] = (value & 0xff)
-  } else {
-    objectWriteUInt32(this, value, offset, true)
-  }
-  return offset + 4
-}
-
-Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 24)
-    this[offset + 1] = (value >>> 16)
-    this[offset + 2] = (value >>> 8)
-    this[offset + 3] = (value & 0xff)
-  } else {
-    objectWriteUInt32(this, value, offset, false)
-  }
-  return offset + 4
-}
-
-Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) {
-    var limit = Math.pow(2, 8 * byteLength - 1)
-
-    checkInt(this, value, offset, byteLength, limit - 1, -limit)
-  }
-
-  var i = 0
-  var mul = 1
-  var sub = value < 0 ? 1 : 0
-  this[offset] = value & 0xFF
-  while (++i < byteLength && (mul *= 0x100)) {
-    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) {
-    var limit = Math.pow(2, 8 * byteLength - 1)
-
-    checkInt(this, value, offset, byteLength, limit - 1, -limit)
-  }
-
-  var i = byteLength - 1
-  var mul = 1
-  var sub = value < 0 ? 1 : 0
-  this[offset + i] = value & 0xFF
-  while (--i >= 0 && (mul *= 0x100)) {
-    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
-  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
-  if (value < 0) value = 0xff + value + 1
-  this[offset] = (value & 0xff)
-  return offset + 1
-}
-
-Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value & 0xff)
-    this[offset + 1] = (value >>> 8)
-  } else {
-    objectWriteUInt16(this, value, offset, true)
-  }
-  return offset + 2
-}
-
-Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 8)
-    this[offset + 1] = (value & 0xff)
-  } else {
-    objectWriteUInt16(this, value, offset, false)
-  }
-  return offset + 2
-}
-
-Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value & 0xff)
-    this[offset + 1] = (value >>> 8)
-    this[offset + 2] = (value >>> 16)
-    this[offset + 3] = (value >>> 24)
-  } else {
-    objectWriteUInt32(this, value, offset, true)
-  }
-  return offset + 4
-}
-
-Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
-  value = +value
-  offset = offset | 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
-  if (value < 0) value = 0xffffffff + value + 1
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    this[offset] = (value >>> 24)
-    this[offset + 1] = (value >>> 16)
-    this[offset + 2] = (value >>> 8)
-    this[offset + 3] = (value & 0xff)
-  } else {
-    objectWriteUInt32(this, value, offset, false)
-  }
-  return offset + 4
-}
-
-function checkIEEE754 (buf, value, offset, ext, max, min) {
-  if (value > max || value < min) throw new RangeError('value is out of bounds')
-  if (offset + ext > buf.length) throw new RangeError('index out of range')
-  if (offset < 0) throw new RangeError('index out of range')
-}
-
-function writeFloat (buf, value, offset, littleEndian, noAssert) {
-  if (!noAssert) {
-    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
-  }
-  ieee754.write(buf, value, offset, littleEndian, 23, 4)
-  return offset + 4
-}
-
-Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
-  return writeFloat(this, value, offset, true, noAssert)
-}
-
-Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
-  return writeFloat(this, value, offset, false, noAssert)
-}
-
-function writeDouble (buf, value, offset, littleEndian, noAssert) {
-  if (!noAssert) {
-    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
-  }
-  ieee754.write(buf, value, offset, littleEndian, 52, 8)
-  return offset + 8
-}
-
-Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
-  return writeDouble(this, value, offset, true, noAssert)
-}
-
-Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
-  return writeDouble(this, value, offset, false, noAssert)
-}
-
-// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
-Buffer.prototype.copy = function copy (target, targetStart, start, end) {
-  if (!start) start = 0
-  if (!end && end !== 0) end = this.length
-  if (targetStart >= target.length) targetStart = target.length
-  if (!targetStart) targetStart = 0
-  if (end > 0 && end < start) end = start
-
-  // Copy 0 bytes; we're done
-  if (end === start) return 0
-  if (target.length === 0 || this.length === 0) return 0
-
-  // Fatal error conditions
-  if (targetStart < 0) {
-    throw new RangeError('targetStart out of bounds')
-  }
-  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
-  if (end < 0) throw new RangeError('sourceEnd out of bounds')
-
-  // Are we oob?
-  if (end > this.length) end = this.length
-  if (target.length - targetStart < end - start) {
-    end = target.length - targetStart + start
-  }
-
-  var len = end - start
-  var i
-
-  if (this === target && start < targetStart && targetStart < end) {
-    // descending copy from end
-    for (i = len - 1; i >= 0; i--) {
-      target[i + targetStart] = this[i + start]
-    }
-  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
-    // ascending copy from start
-    for (i = 0; i < len; i++) {
-      target[i + targetStart] = this[i + start]
-    }
-  } else {
-    target._set(this.subarray(start, start + len), targetStart)
-  }
-
-  return len
-}
-
-// fill(value, start=0, end=buffer.length)
-Buffer.prototype.fill = function fill (value, start, end) {
-  if (!value) value = 0
-  if (!start) start = 0
-  if (!end) end = this.length
-
-  if (end < start) throw new RangeError('end < start')
-
-  // Fill 0 bytes; we're done
-  if (end === start) return
-  if (this.length === 0) return
-
-  if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')
-  if (end < 0 || end > this.length) throw new RangeError('end out of bounds')
-
-  var i
-  if (typeof value === 'number') {
-    for (i = start; i < end; i++) {
-      this[i] = value
-    }
-  } else {
-    var bytes = utf8ToBytes(value.toString())
-    var len = bytes.length
-    for (i = start; i < end; i++) {
-      this[i] = bytes[i % len]
-    }
-  }
-
-  return this
-}
-
-/**
- * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
- * Added in Node 0.12. Only available in browsers that support ArrayBuffer.
- */
-Buffer.prototype.toArrayBuffer = function toArrayBuffer () {
-  if (typeof Uint8Array !== 'undefined') {
-    if (Buffer.TYPED_ARRAY_SUPPORT) {
-      return (new Buffer(this)).buffer
-    } else {
-      var buf = new Uint8Array(this.length)
-      for (var i = 0, len = buf.length; i < len; i += 1) {
-        buf[i] = this[i]
-      }
-      return buf.buffer
-    }
-  } else {
-    throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
-  }
-}
-
-// HELPER FUNCTIONS
-// ================
-
-var BP = Buffer.prototype
-
-/**
- * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
- */
-Buffer._augment = function _augment (arr) {
-  arr.constructor = Buffer
-  arr._isBuffer = true
-
-  // save reference to original Uint8Array set method before overwriting
-  arr._set = arr.set
-
-  // deprecated
-  arr.get = BP.get
-  arr.set = BP.set
-
-  arr.write = BP.write
-  arr.toString = BP.toString
-  arr.toLocaleString = BP.toString
-  arr.toJSON = BP.toJSON
-  arr.equals = BP.equals
-  arr.compare = BP.compare
-  arr.indexOf = BP.indexOf
-  arr.copy = BP.copy
-  arr.slice = BP.slice
-  arr.readUIntLE = BP.readUIntLE
-  arr.readUIntBE = BP.readUIntBE
-  arr.readUInt8 = BP.readUInt8
-  arr.readUInt16LE = BP.readUInt16LE
-  arr.readUInt16BE = BP.readUInt16BE
-  arr.readUInt32LE = BP.readUInt32LE
-  arr.readUInt32BE = BP.readUInt32BE
-  arr.readIntLE = BP.readIntLE
-  arr.readIntBE = BP.readIntBE
-  arr.readInt8 = BP.readInt8
-  arr.readInt16LE = BP.readInt16LE
-  arr.readInt16BE = BP.readInt16BE
-  arr.readInt32LE = BP.readInt32LE
-  arr.readInt32BE = BP.readInt32BE
-  arr.readFloatLE = BP.readFloatLE
-  arr.readFloatBE = BP.readFloatBE
-  arr.readDoubleLE = BP.readDoubleLE
-  arr.readDoubleBE = BP.readDoubleBE
-  arr.writeUInt8 = BP.writeUInt8
-  arr.writeUIntLE = BP.writeUIntLE
-  arr.writeUIntBE = BP.writeUIntBE
-  arr.writeUInt16LE = BP.writeUInt16LE
-  arr.writeUInt16BE = BP.writeUInt16BE
-  arr.writeUInt32LE = BP.writeUInt32LE
-  arr.writeUInt32BE = BP.writeUInt32BE
-  arr.writeIntLE = BP.writeIntLE
-  arr.writeIntBE = BP.writeIntBE
-  arr.writeInt8 = BP.writeInt8
-  arr.writeInt16LE = BP.writeInt16LE
-  arr.writeInt16BE = BP.writeInt16BE
-  arr.writeInt32LE = BP.writeInt32LE
-  arr.writeInt32BE = BP.writeInt32BE
-  arr.writeFloatLE = BP.writeFloatLE
-  arr.writeFloatBE = BP.writeFloatBE
-  arr.writeDoubleLE = BP.writeDoubleLE
-  arr.writeDoubleBE = BP.writeDoubleBE
-  arr.fill = BP.fill
-  arr.inspect = BP.inspect
-  arr.toArrayBuffer = BP.toArrayBuffer
-
-  return arr
-}
-
-var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
-
-function base64clean (str) {
-  // Node strips out invalid characters like \n and \t from the string, base64-js does not
-  str = stringtrim(str).replace(INVALID_BASE64_RE, '')
-  // Node converts strings with length < 2 to ''
-  if (str.length < 2) return ''
-  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
-  while (str.length % 4 !== 0) {
-    str = str + '='
-  }
-  return str
-}
-
-function stringtrim (str) {
-  if (str.trim) return str.trim()
-  return str.replace(/^\s+|\s+$/g, '')
-}
-
-function toHex (n) {
-  if (n < 16) return '0' + n.toString(16)
-  return n.toString(16)
-}
-
-function utf8ToBytes (string, units) {
-  units = units || Infinity
-  var codePoint
-  var length = string.length
-  var leadSurrogate = null
-  var bytes = []
-
-  for (var i = 0; i < length; i++) {
-    codePoint = string.charCodeAt(i)
-
-    // is surrogate component
-    if (codePoint > 0xD7FF && codePoint < 0xE000) {
-      // last char was a lead
-      if (!leadSurrogate) {
-        // no lead yet
-        if (codePoint > 0xDBFF) {
-          // unexpected trail
-          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-          continue
-        } else if (i + 1 === length) {
-          // unpaired lead
-          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-          continue
-        }
-
-        // valid lead
-        leadSurrogate = codePoint
-
-        continue
-      }
-
-      // 2 leads in a row
-      if (codePoint < 0xDC00) {
-        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-        leadSurrogate = codePoint
-        continue
-      }
-
-      // valid surrogate pair
-      codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000
-    } else if (leadSurrogate) {
-      // valid bmp char, but last char was a lead
-      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-    }
-
-    leadSurrogate = null
-
-    // encode utf8
-    if (codePoint < 0x80) {
-      if ((units -= 1) < 0) break
-      bytes.push(codePoint)
-    } else if (codePoint < 0x800) {
-      if ((units -= 2) < 0) break
-      bytes.push(
-        codePoint >> 0x6 | 0xC0,
-        codePoint & 0x3F | 0x80
-      )
-    } else if (codePoint < 0x10000) {
-      if ((units -= 3) < 0) break
-      bytes.push(
-        codePoint >> 0xC | 0xE0,
-        codePoint >> 0x6 & 0x3F | 0x80,
-        codePoint & 0x3F | 0x80
-      )
-    } else if (codePoint < 0x110000) {
-      if ((units -= 4) < 0) break
-      bytes.push(
-        codePoint >> 0x12 | 0xF0,
-        codePoint >> 0xC & 0x3F | 0x80,
-        codePoint >> 0x6 & 0x3F | 0x80,
-        codePoint & 0x3F | 0x80
-      )
-    } else {
-      throw new Error('Invalid code point')
-    }
-  }
-
-  return bytes
-}
-
-function asciiToBytes (str) {
-  var byteArray = []
-  for (var i = 0; i < str.length; i++) {
-    // Node's code seems to be doing this and not & 0x7F..
-    byteArray.push(str.charCodeAt(i) & 0xFF)
-  }
-  return byteArray
-}
-
-function utf16leToBytes (str, units) {
-  var c, hi, lo
-  var byteArray = []
-  for (var i = 0; i < str.length; i++) {
-    if ((units -= 2) < 0) break
-
-    c = str.charCodeAt(i)
-    hi = c >> 8
-    lo = c % 256
-    byteArray.push(lo)
-    byteArray.push(hi)
-  }
-
-  return byteArray
-}
-
-function base64ToBytes (str) {
-  return base64.toByteArray(base64clean(str))
-}
-
-function blitBuffer (src, dst, offset, length) {
-  for (var i = 0; i < length; i++) {
-    if ((i + offset >= dst.length) || (i >= src.length)) break
-    dst[i + offset] = src[i]
-  }
-  return i
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"base64-js":5,"ieee754":8,"is-array":9}],8:[function(require,module,exports){
-exports.read = function (buffer, offset, isLE, mLen, nBytes) {
-  var e, m
-  var eLen = nBytes * 8 - mLen - 1
-  var eMax = (1 << eLen) - 1
-  var eBias = eMax >> 1
-  var nBits = -7
-  var i = isLE ? (nBytes - 1) : 0
-  var d = isLE ? -1 : 1
-  var s = buffer[offset + i]
-
-  i += d
-
-  e = s & ((1 << (-nBits)) - 1)
-  s >>= (-nBits)
-  nBits += eLen
-  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
-
-  m = e & ((1 << (-nBits)) - 1)
-  e >>= (-nBits)
-  nBits += mLen
-  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
-
-  if (e === 0) {
-    e = 1 - eBias
-  } else if (e === eMax) {
-    return m ? NaN : ((s ? -1 : 1) * Infinity)
-  } else {
-    m = m + Math.pow(2, mLen)
-    e = e - eBias
-  }
-  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
-}
-
-exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
-  var e, m, c
-  var eLen = nBytes * 8 - mLen - 1
-  var eMax = (1 << eLen) - 1
-  var eBias = eMax >> 1
-  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
-  var i = isLE ? 0 : (nBytes - 1)
-  var d = isLE ? 1 : -1
-  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
-
-  value = Math.abs(value)
-
-  if (isNaN(value) || value === Infinity) {
-    m = isNaN(value) ? 1 : 0
-    e = eMax
-  } else {
-    e = Math.floor(Math.log(value) / Math.LN2)
-    if (value * (c = Math.pow(2, -e)) < 1) {
-      e--
-      c *= 2
-    }
-    if (e + eBias >= 1) {
-      value += rt / c
-    } else {
-      value += rt * Math.pow(2, 1 - eBias)
-    }
-    if (value * c >= 2) {
-      e++
-      c /= 2
-    }
-
-    if (e + eBias >= eMax) {
-      m = 0
-      e = eMax
-    } else if (e + eBias >= 1) {
-      m = (value * c - 1) * Math.pow(2, mLen)
-      e = e + eBias
-    } else {
-      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
-      e = 0
-    }
-  }
-
-  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
-
-  e = (e << mLen) | m
-  eLen += mLen
-  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
-
-  buffer[offset + i - d] |= s * 128
-}
-
-},{}],9:[function(require,module,exports){
-
-/**
- * isArray
- */
-
-var isArray = Array.isArray;
-
-/**
- * toString
- */
-
-var str = Object.prototype.toString;
-
-/**
- * Whether or not the given `val`
- * is an array.
- *
- * example:
- *
- *        isArray([]);
- *        // > true
- *        isArray(arguments);
- *        // > false
- *        isArray('');
- *        // > false
- *
- * @param {mixed} val
- * @return {bool}
- */
-
-module.exports = isArray || function (val) {
-  return !! val && '[object Array]' == str.call(val);
-};
-
-},{}],10:[function(require,module,exports){
-/**
- * Determine if an object is Buffer
- *
- * Author:   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
- * License:  MIT
- *
- * `npm install is-buffer`
- */
-
-module.exports = function (obj) {
-  return !!(obj != null &&
-    (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor)
-      (obj.constructor &&
-      typeof obj.constructor.isBuffer === 'function' &&
-      obj.constructor.isBuffer(obj))
-    ))
-}
-
-},{}],11:[function(require,module,exports){
-/**
- * Gets the last element of `array`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to query.
- * @returns {*} Returns the last element of `array`.
- * @example
- *
- * _.last([1, 2, 3]);
- * // => 3
- */
-function last(array) {
-  var length = array ? array.length : 0;
-  return length ? array[length - 1] : undefined;
-}
-
-module.exports = last;
-
-},{}],12:[function(require,module,exports){
-var arrayEvery = require('../internal/arrayEvery'),
-    baseCallback = require('../internal/baseCallback'),
-    baseEvery = require('../internal/baseEvery'),
-    isArray = require('../lang/isArray'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Checks if `predicate` returns truthy for **all** elements of `collection`.
- * The predicate is bound to `thisArg` and invoked with three arguments:
- * (value, index|key, collection).
- *
- * If a property name is provided for `predicate` the created `_.property`
- * style callback returns the property value of the given element.
- *
- * If a value is also provided for `thisArg` the created `_.matchesProperty`
- * style callback returns `true` for elements that have a matching property
- * value, else `false`.
- *
- * If an object is provided for `predicate` the created `_.matches` style
- * callback returns `true` for elements that have the properties of the given
- * object, else `false`.
- *
- * @static
- * @memberOf _
- * @alias all
- * @category Collection
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|Object|string} [predicate=_.identity] The function invoked
- *  per iteration.
- * @param {*} [thisArg] The `this` binding of `predicate`.
- * @returns {boolean} Returns `true` if all elements pass the predicate check,
- *  else `false`.
- * @example
- *
- * _.every([true, 1, null, 'yes'], Boolean);
- * // => false
- *
- * var users = [
- *   { 'user': 'barney', 'active': false },
- *   { 'user': 'fred',   'active': false }
- * ];
- *
- * // using the `_.matches` callback shorthand
- * _.every(users, { 'user': 'barney', 'active': false });
- * // => false
- *
- * // using the `_.matchesProperty` callback shorthand
- * _.every(users, 'active', false);
- * // => true
- *
- * // using the `_.property` callback shorthand
- * _.every(users, 'active');
- * // => false
- */
-function every(collection, predicate, thisArg) {
-  var func = isArray(collection) ? arrayEvery : baseEvery;
-  if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
-    predicate = undefined;
-  }
-  if (typeof predicate != 'function' || thisArg !== undefined) {
-    predicate = baseCallback(predicate, thisArg, 3);
-  }
-  return func(collection, predicate);
-}
-
-module.exports = every;
-
-},{"../internal/arrayEvery":14,"../internal/baseCallback":18,"../internal/baseEvery":22,"../internal/isIterateeCall":47,"../lang/isArray":56}],13:[function(require,module,exports){
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max;
-
-/**
- * Creates a function that invokes `func` with the `this` binding of the
- * created function and arguments from `start` and beyond provided as an array.
- *
- * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to apply a rest parameter to.
- * @param {number} [start=func.length-1] The start position of the rest parameter.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var say = _.restParam(function(what, names) {
- *   return what + ' ' + _.initial(names).join(', ') +
- *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
- * });
- *
- * say('hello', 'fred', 'barney', 'pebbles');
- * // => 'hello fred, barney, & pebbles'
- */
-function restParam(func, start) {
-  if (typeof func != 'function') {
-    throw new TypeError(FUNC_ERROR_TEXT);
-  }
-  start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);
-  return function() {
-    var args = arguments,
-        index = -1,
-        length = nativeMax(args.length - start, 0),
-        rest = Array(length);
-
-    while (++index < length) {
-      rest[index] = args[start + index];
-    }
-    switch (start) {
-      case 0: return func.call(this, rest);
-      case 1: return func.call(this, args[0], rest);
-      case 2: return func.call(this, args[0], args[1], rest);
-    }
-    var otherArgs = Array(start + 1);
-    index = -1;
-    while (++index < start) {
-      otherArgs[index] = args[index];
-    }
-    otherArgs[start] = rest;
-    return func.apply(this, otherArgs);
-  };
-}
-
-module.exports = restParam;
-
-},{}],14:[function(require,module,exports){
-/**
- * A specialized version of `_.every` for arrays without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {boolean} Returns `true` if all elements pass the predicate check,
- *  else `false`.
- */
-function arrayEvery(array, predicate) {
-  var index = -1,
-      length = array.length;
-
-  while (++index < length) {
-    if (!predicate(array[index], index, array)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-module.exports = arrayEvery;
-
-},{}],15:[function(require,module,exports){
-/**
- * A specialized version of `_.some` for arrays without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {boolean} Returns `true` if any element passes the predicate check,
- *  else `false`.
- */
-function arraySome(array, predicate) {
-  var index = -1,
-      length = array.length;
-
-  while (++index < length) {
-    if (predicate(array[index], index, array)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-module.exports = arraySome;
-
-},{}],16:[function(require,module,exports){
-var keys = require('../object/keys');
-
-/**
- * A specialized version of `_.assign` for customizing assigned values without
- * support for argument juggling, multiple sources, and `this` binding `customizer`
- * functions.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @param {Function} customizer The function to customize assigned values.
- * @returns {Object} Returns `object`.
- */
-function assignWith(object, source, customizer) {
-  var index = -1,
-      props = keys(source),
-      length = props.length;
-
-  while (++index < length) {
-    var key = props[index],
-        value = object[key],
-        result = customizer(value, source[key], key, object, source);
-
-    if ((result === result ? (result !== value) : (value === value)) ||
-        (value === undefined && !(key in object))) {
-      object[key] = result;
-    }
-  }
-  return object;
-}
-
-module.exports = assignWith;
-
-},{"../object/keys":65}],17:[function(require,module,exports){
-var baseCopy = require('./baseCopy'),
-    keys = require('../object/keys');
-
-/**
- * The base implementation of `_.assign` without support for argument juggling,
- * multiple sources, and `customizer` functions.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @returns {Object} Returns `object`.
- */
-function baseAssign(object, source) {
-  return source == null
-    ? object
-    : baseCopy(source, keys(source), object);
-}
-
-module.exports = baseAssign;
-
-},{"../object/keys":65,"./baseCopy":19}],18:[function(require,module,exports){
-var baseMatches = require('./baseMatches'),
-    baseMatchesProperty = require('./baseMatchesProperty'),
-    bindCallback = require('./bindCallback'),
-    identity = require('../utility/identity'),
-    property = require('../utility/property');
-
-/**
- * The base implementation of `_.callback` which supports specifying the
- * number of arguments to provide to `func`.
- *
- * @private
- * @param {*} [func=_.identity] The value to convert to a callback.
- * @param {*} [thisArg] The `this` binding of `func`.
- * @param {number} [argCount] The number of arguments to provide to `func`.
- * @returns {Function} Returns the callback.
- */
-function baseCallback(func, thisArg, argCount) {
-  var type = typeof func;
-  if (type == 'function') {
-    return thisArg === undefined
-      ? func
-      : bindCallback(func, thisArg, argCount);
-  }
-  if (func == null) {
-    return identity;
-  }
-  if (type == 'object') {
-    return baseMatches(func);
-  }
-  return thisArg === undefined
-    ? property(func)
-    : baseMatchesProperty(func, thisArg);
-}
-
-module.exports = baseCallback;
-
-},{"../utility/identity":68,"../utility/property":69,"./baseMatches":29,"./baseMatchesProperty":30,"./bindCallback":35}],19:[function(require,module,exports){
-/**
- * Copies properties of `source` to `object`.
- *
- * @private
- * @param {Object} source The object to copy properties from.
- * @param {Array} props The property names to copy.
- * @param {Object} [object={}] The object to copy properties to.
- * @returns {Object} Returns `object`.
- */
-function baseCopy(source, props, object) {
-  object || (object = {});
-
-  var index = -1,
-      length = props.length;
-
-  while (++index < length) {
-    var key = props[index];
-    object[key] = source[key];
-  }
-  return object;
-}
-
-module.exports = baseCopy;
-
-},{}],20:[function(require,module,exports){
-var isObject = require('../lang/isObject');
-
-/**
- * The base implementation of `_.create` without support for assigning
- * properties to the created object.
- *
- * @private
- * @param {Object} prototype The object to inherit from.
- * @returns {Object} Returns the new object.
- */
-var baseCreate = (function() {
-  function object() {}
-  return function(prototype) {
-    if (isObject(prototype)) {
-      object.prototype = prototype;
-      var result = new object;
-      object.prototype = undefined;
-    }
-    return result || {};
-  };
-}());
-
-module.exports = baseCreate;
-
-},{"../lang/isObject":60}],21:[function(require,module,exports){
-var baseForOwn = require('./baseForOwn'),
-    createBaseEach = require('./createBaseEach');
-
-/**
- * The base implementation of `_.forEach` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array|Object|string} Returns `collection`.
- */
-var baseEach = createBaseEach(baseForOwn);
-
-module.exports = baseEach;
-
-},{"./baseForOwn":24,"./createBaseEach":37}],22:[function(require,module,exports){
-var baseEach = require('./baseEach');
-
-/**
- * The base implementation of `_.every` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {boolean} Returns `true` if all elements pass the predicate check,
- *  else `false`
- */
-function baseEvery(collection, predicate) {
-  var result = true;
-  baseEach(collection, function(value, index, collection) {
-    result = !!predicate(value, index, collection);
-    return result;
-  });
-  return result;
-}
-
-module.exports = baseEvery;
-
-},{"./baseEach":21}],23:[function(require,module,exports){
-var createBaseFor = require('./createBaseFor');
-
-/**
- * The base implementation of `baseForIn` and `baseForOwn` which iterates
- * over `object` properties returned by `keysFunc` invoking `iteratee` for
- * each property. Iteratee functions may exit iteration early by explicitly
- * returning `false`.
- *
- * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {Function} keysFunc The function to get the keys of `object`.
- * @returns {Object} Returns `object`.
- */
-var baseFor = createBaseFor();
-
-module.exports = baseFor;
-
-},{"./createBaseFor":38}],24:[function(require,module,exports){
-var baseFor = require('./baseFor'),
-    keys = require('../object/keys');
-
-/**
- * The base implementation of `_.forOwn` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Object} Returns `object`.
- */
-function baseForOwn(object, iteratee) {
-  return baseFor(object, iteratee, keys);
-}
-
-module.exports = baseForOwn;
-
-},{"../object/keys":65,"./baseFor":23}],25:[function(require,module,exports){
-var toObject = require('./toObject');
-
-/**
- * The base implementation of `get` without support for string paths
- * and default values.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array} path The path of the property to get.
- * @param {string} [pathKey] The key representation of path.
- * @returns {*} Returns the resolved value.
- */
-function baseGet(object, path, pathKey) {
-  if (object == null) {
-    return;
-  }
-  if (pathKey !== undefined && pathKey in toObject(object)) {
-    path = [pathKey];
-  }
-  var index = 0,
-      length = path.length;
-
-  while (object != null && index < length) {
-    object = object[path[index++]];
-  }
-  return (index && index == length) ? object : undefined;
-}
-
-module.exports = baseGet;
-
-},{"./toObject":53}],26:[function(require,module,exports){
-var baseIsEqualDeep = require('./baseIsEqualDeep'),
-    isObject = require('../lang/isObject'),
-    isObjectLike = require('./isObjectLike');
-
-/**
- * The base implementation of `_.isEqual` without support for `this` binding
- * `customizer` functions.
- *
- * @private
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @param {Function} [customizer] The function to customize comparing values.
- * @param {boolean} [isLoose] Specify performing partial comparisons.
- * @param {Array} [stackA] Tracks traversed `value` objects.
- * @param {Array} [stackB] Tracks traversed `other` objects.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- */
-function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
-  if (value === other) {
-    return true;
-  }
-  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
-    return value !== value && other !== other;
-  }
-  return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);
-}
-
-module.exports = baseIsEqual;
-
-},{"../lang/isObject":60,"./baseIsEqualDeep":27,"./isObjectLike":50}],27:[function(require,module,exports){
-var equalArrays = require('./equalArrays'),
-    equalByTag = require('./equalByTag'),
-    equalObjects = require('./equalObjects'),
-    isArray = require('../lang/isArray'),
-    isTypedArray = require('../lang/isTypedArray');
-
-/** `Object#toString` result references. */
-var argsTag = '[object Arguments]',
-    arrayTag = '[object Array]',
-    objectTag = '[object Object]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * A specialized version of `baseIsEqual` for arrays and objects which performs
- * deep comparisons and tracks traversed objects enabling objects with circular
- * references to be compared.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Function} [customizer] The function to customize comparing objects.
- * @param {boolean} [isLoose] Specify performing partial comparisons.
- * @param {Array} [stackA=[]] Tracks traversed `value` objects.
- * @param {Array} [stackB=[]] Tracks traversed `other` objects.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
-function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
-  var objIsArr = isArray(object),
-      othIsArr = isArray(other),
-      objTag = arrayTag,
-      othTag = arrayTag;
-
-  if (!objIsArr) {
-    objTag = objToString.call(object);
-    if (objTag == argsTag) {
-      objTag = objectTag;
-    } else if (objTag != objectTag) {
-      objIsArr = isTypedArray(object);
-    }
-  }
-  if (!othIsArr) {
-    othTag = objToString.call(other);
-    if (othTag == argsTag) {
-      othTag = objectTag;
-    } else if (othTag != objectTag) {
-      othIsArr = isTypedArray(other);
-    }
-  }
-  var objIsObj = objTag == objectTag,
-      othIsObj = othTag == objectTag,
-      isSameTag = objTag == othTag;
-
-  if (isSameTag && !(objIsArr || objIsObj)) {
-    return equalByTag(object, other, objTag);
-  }
-  if (!isLoose) {
-    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
-        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
-
-    if (objIsWrapped || othIsWrapped) {
-      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
-    }
-  }
-  if (!isSameTag) {
-    return false;
-  }
-  // Assume cyclic values are equal.
-  // For more information on detecting circular references see https://es5.github.io/#JO.
-  stackA || (stackA = []);
-  stackB || (stackB = []);
-
-  var length = stackA.length;
-  while (length--) {
-    if (stackA[length] == object) {
-      return stackB[length] == other;
-    }
-  }
-  // Add `object` and `other` to the stack of traversed objects.
-  stackA.push(object);
-  stackB.push(other);
-
-  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);
-
-  stackA.pop();
-  stackB.pop();
-
-  return result;
-}
-
-module.exports = baseIsEqualDeep;
-
-},{"../lang/isArray":56,"../lang/isTypedArray":62,"./equalArrays":39,"./equalByTag":40,"./equalObjects":41}],28:[function(require,module,exports){
-var baseIsEqual = require('./baseIsEqual'),
-    toObject = require('./toObject');
-
-/**
- * The base implementation of `_.isMatch` without support for callback
- * shorthands and `this` binding.
- *
- * @private
- * @param {Object} object The object to inspect.
- * @param {Array} matchData The propery names, values, and compare flags to match.
- * @param {Function} [customizer] The function to customize comparing objects.
- * @returns {boolean} Returns `true` if `object` is a match, else `false`.
- */
-function baseIsMatch(object, matchData, customizer) {
-  var index = matchData.length,
-      length = index,
-      noCustomizer = !customizer;
-
-  if (object == null) {
-    return !length;
-  }
-  object = toObject(object);
-  while (index--) {
-    var data = matchData[index];
-    if ((noCustomizer && data[2])
-          ? data[1] !== object[data[0]]
-          : !(data[0] in object)
-        ) {
-      return false;
-    }
-  }
-  while (++index < length) {
-    data = matchData[index];
-    var key = data[0],
-        objValue = object[key],
-        srcValue = data[1];
-
-    if (noCustomizer && data[2]) {
-      if (objValue === undefined && !(key in object)) {
-        return false;
-      }
-    } else {
-      var result = customizer ? customizer(objValue, srcValue, key) : undefined;
-      if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
-module.exports = baseIsMatch;
-
-},{"./baseIsEqual":26,"./toObject":53}],29:[function(require,module,exports){
-var baseIsMatch = require('./baseIsMatch'),
-    getMatchData = require('./getMatchData'),
-    toObject = require('./toObject');
-
-/**
- * The base implementation of `_.matches` which does not clone `source`.
- *
- * @private
- * @param {Object} source The object of property values to match.
- * @returns {Function} Returns the new function.
- */
-function baseMatches(source) {
-  var matchData = getMatchData(source);
-  if (matchData.length == 1 && matchData[0][2]) {
-    var key = matchData[0][0],
-        value = matchData[0][1];
-
-    return function(object) {
-      if (object == null) {
-        return false;
-      }
-      return object[key] === value && (value !== undefined || (key in toObject(object)));
-    };
-  }
-  return function(object) {
-    return baseIsMatch(object, matchData);
-  };
-}
-
-module.exports = baseMatches;
-
-},{"./baseIsMatch":28,"./getMatchData":43,"./toObject":53}],30:[function(require,module,exports){
-var baseGet = require('./baseGet'),
-    baseIsEqual = require('./baseIsEqual'),
-    baseSlice = require('./baseSlice'),
-    isArray = require('../lang/isArray'),
-    isKey = require('./isKey'),
-    isStrictComparable = require('./isStrictComparable'),
-    last = require('../array/last'),
-    toObject = require('./toObject'),
-    toPath = require('./toPath');
-
-/**
- * The base implementation of `_.matchesProperty` which does not clone `srcValue`.
- *
- * @private
- * @param {string} path The path of the property to get.
- * @param {*} srcValue The value to compare.
- * @returns {Function} Returns the new function.
- */
-function baseMatchesProperty(path, srcValue) {
-  var isArr = isArray(path),
-      isCommon = isKey(path) && isStrictComparable(srcValue),
-      pathKey = (path + '');
-
-  path = toPath(path);
-  return function(object) {
-    if (object == null) {
-      return false;
-    }
-    var key = pathKey;
-    object = toObject(object);
-    if ((isArr || !isCommon) && !(key in object)) {
-      object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
-      if (object == null) {
-        return false;
-      }
-      key = last(path);
-      object = toObject(object);
-    }
-    return object[key] === srcValue
-      ? (srcValue !== undefined || (key in object))
-      : baseIsEqual(srcValue, object[key], undefined, true);
-  };
-}
-
-module.exports = baseMatchesProperty;
-
-},{"../array/last":11,"../lang/isArray":56,"./baseGet":25,"./baseIsEqual":26,"./baseSlice":33,"./isKey":48,"./isStrictComparable":51,"./toObject":53,"./toPath":54}],31:[function(require,module,exports){
-/**
- * The base implementation of `_.property` without support for deep paths.
- *
- * @private
- * @param {string} key The key of the property to get.
- * @returns {Function} Returns the new function.
- */
-function baseProperty(key) {
-  return function(object) {
-    return object == null ? undefined : object[key];
-  };
-}
-
-module.exports = baseProperty;
-
-},{}],32:[function(require,module,exports){
-var baseGet = require('./baseGet'),
-    toPath = require('./toPath');
-
-/**
- * A specialized version of `baseProperty` which supports deep paths.
- *
- * @private
- * @param {Array|string} path The path of the property to get.
- * @returns {Function} Returns the new function.
- */
-function basePropertyDeep(path) {
-  var pathKey = (path + '');
-  path = toPath(path);
-  return function(object) {
-    return baseGet(object, path, pathKey);
-  };
-}
-
-module.exports = basePropertyDeep;
-
-},{"./baseGet":25,"./toPath":54}],33:[function(require,module,exports){
-/**
- * The base implementation of `_.slice` without an iteratee call guard.
- *
- * @private
- * @param {Array} array The array to slice.
- * @param {number} [start=0] The start position.
- * @param {number} [end=array.length] The end position.
- * @returns {Array} Returns the slice of `array`.
- */
-function baseSlice(array, start, end) {
-  var index = -1,
-      length = array.length;
-
-  start = start == null ? 0 : (+start || 0);
-  if (start < 0) {
-    start = -start > length ? 0 : (length + start);
-  }
-  end = (end === undefined || end > length) ? length : (+end || 0);
-  if (end < 0) {
-    end += length;
-  }
-  length = start > end ? 0 : ((end - start) >>> 0);
-  start >>>= 0;
-
-  var result = Array(length);
-  while (++index < length) {
-    result[index] = array[index + start];
-  }
-  return result;
-}
-
-module.exports = baseSlice;
-
-},{}],34:[function(require,module,exports){
-/**
- * Converts `value` to a string if it's not one. An empty string is returned
- * for `null` or `undefined` values.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- */
-function baseToString(value) {
-  return value == null ? '' : (value + '');
-}
-
-module.exports = baseToString;
-
-},{}],35:[function(require,module,exports){
-var identity = require('../utility/identity');
-
-/**
- * A specialized version of `baseCallback` which only supports `this` binding
- * and specifying the number of arguments to provide to `func`.
- *
- * @private
- * @param {Function} func The function to bind.
- * @param {*} thisArg The `this` binding of `func`.
- * @param {number} [argCount] The number of arguments to provide to `func`.
- * @returns {Function} Returns the callback.
- */
-function bindCallback(func, thisArg, argCount) {
-  if (typeof func != 'function') {
-    return identity;
-  }
-  if (thisArg === undefined) {
-    return func;
-  }
-  switch (argCount) {
-    case 1: return function(value) {
-      return func.call(thisArg, value);
-    };
-    case 3: return function(value, index, collection) {
-      return func.call(thisArg, value, index, collection);
-    };
-    case 4: return function(accumulator, value, index, collection) {
-      return func.call(thisArg, accumulator, value, index, collection);
-    };
-    case 5: return function(value, other, key, object, source) {
-      return func.call(thisArg, value, other, key, object, source);
-    };
-  }
-  return function() {
-    return func.apply(thisArg, arguments);
-  };
-}
-
-module.exports = bindCallback;
-
-},{"../utility/identity":68}],36:[function(require,module,exports){
-var bindCallback = require('./bindCallback'),
-    isIterateeCall = require('./isIterateeCall'),
-    restParam = require('../function/restParam');
-
-/**
- * Creates a `_.assign`, `_.defaults`, or `_.merge` function.
- *
- * @private
- * @param {Function} assigner The function to assign values.
- * @returns {Function} Returns the new assigner function.
- */
-function createAssigner(assigner) {
-  return restParam(function(object, sources) {
-    var index = -1,
-        length = object == null ? 0 : sources.length,
-        customizer = length > 2 ? sources[length - 2] : undefined,
-        guard = length > 2 ? sources[2] : undefined,
-        thisArg = length > 1 ? sources[length - 1] : undefined;
-
-    if (typeof customizer == 'function') {
-      customizer = bindCallback(customizer, thisArg, 5);
-      length -= 2;
-    } else {
-      customizer = typeof thisArg == 'function' ? thisArg : undefined;
-      length -= (customizer ? 1 : 0);
-    }
-    if (guard && isIterateeCall(sources[0], sources[1], guard)) {
-      customizer = length < 3 ? undefined : customizer;
-      length = 1;
-    }
-    while (++index < length) {
-      var source = sources[index];
-      if (source) {
-        assigner(object, source, customizer);
-      }
-    }
-    return object;
-  });
-}
-
-module.exports = createAssigner;
-
-},{"../function/restParam":13,"./bindCallback":35,"./isIterateeCall":47}],37:[function(require,module,exports){
-var getLength = require('./getLength'),
-    isLength = require('./isLength'),
-    toObject = require('./toObject');
-
-/**
- * Creates a `baseEach` or `baseEachRight` function.
- *
- * @private
- * @param {Function} eachFunc The function to iterate over a collection.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new base function.
- */
-function createBaseEach(eachFunc, fromRight) {
-  return function(collection, iteratee) {
-    var length = collection ? getLength(collection) : 0;
-    if (!isLength(length)) {
-      return eachFunc(collection, iteratee);
-    }
-    var index = fromRight ? length : -1,
-        iterable = toObject(collection);
-
-    while ((fromRight ? index-- : ++index < length)) {
-      if (iteratee(iterable[index], index, iterable) === false) {
-        break;
-      }
-    }
-    return collection;
-  };
-}
-
-module.exports = createBaseEach;
-
-},{"./getLength":42,"./isLength":49,"./toObject":53}],38:[function(require,module,exports){
-var toObject = require('./toObject');
-
-/**
- * Creates a base function for `_.forIn` or `_.forInRight`.
- *
- * @private
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new base function.
- */
-function createBaseFor(fromRight) {
-  return function(object, iteratee, keysFunc) {
-    var iterable = toObject(object),
-        props = keysFunc(object),
-        length = props.length,
-        index = fromRight ? length : -1;
-
-    while ((fromRight ? index-- : ++index < length)) {
-      var key = props[index];
-      if (iteratee(iterable[key], key, iterable) === false) {
-        break;
-      }
-    }
-    return object;
-  };
-}
-
-module.exports = createBaseFor;
-
-},{"./toObject":53}],39:[function(require,module,exports){
-var arraySome = require('./arraySome');
-
-/**
- * A specialized version of `baseIsEqualDeep` for arrays with support for
- * partial deep comparisons.
- *
- * @private
- * @param {Array} array The array to compare.
- * @param {Array} other The other array to compare.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Function} [customizer] The function to customize comparing arrays.
- * @param {boolean} [isLoose] Specify performing partial comparisons.
- * @param {Array} [stackA] Tracks traversed `value` objects.
- * @param {Array} [stackB] Tracks traversed `other` objects.
- * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
- */
-function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {
-  var index = -1,
-      arrLength = array.length,
-      othLength = other.length;
-
-  if (arrLength != othLength && !(isLoose && othLength > arrLength)) {
-    return false;
-  }
-  // Ignore non-index properties.
-  while (++index < arrLength) {
-    var arrValue = array[index],
-        othValue = other[index],
-        result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;
-
-    if (result !== undefined) {
-      if (result) {
-        continue;
-      }
-      return false;
-    }
-    // Recursively compare arrays (susceptible to call stack limits).
-    if (isLoose) {
-      if (!arraySome(other, function(othValue) {
-            return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
-          })) {
-        return false;
-      }
-    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {
-      return false;
-    }
-  }
-  return true;
-}
-
-module.exports = equalArrays;
-
-},{"./arraySome":15}],40:[function(require,module,exports){
-/** `Object#toString` result references. */
-var boolTag = '[object Boolean]',
-    dateTag = '[object Date]',
-    errorTag = '[object Error]',
-    numberTag = '[object Number]',
-    regexpTag = '[object RegExp]',
-    stringTag = '[object String]';
-
-/**
- * A specialized version of `baseIsEqualDeep` for comparing objects of
- * the same `toStringTag`.
- *
- * **Note:** This function only supports comparing values with tags of
- * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {string} tag The `toStringTag` of the objects to compare.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
-function equalByTag(object, other, tag) {
-  switch (tag) {
-    case boolTag:
-    case dateTag:
-      // Coerce dates and booleans to numbers, dates to milliseconds and booleans
-      // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.
-      return +object == +other;
-
-    case errorTag:
-      return object.name == other.name && object.message == other.message;
-
-    case numberTag:
-      // Treat `NaN` vs. `NaN` as equal.
-      return (object != +object)
-        ? other != +other
-        : object == +other;
-
-    case regexpTag:
-    case stringTag:
-      // Coerce regexes to strings and treat strings primitives and string
-      // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.
-      return object == (other + '');
-  }
-  return false;
-}
-
-module.exports = equalByTag;
-
-},{}],41:[function(require,module,exports){
-var keys = require('../object/keys');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * A specialized version of `baseIsEqualDeep` for objects with support for
- * partial deep comparisons.
- *
- * @private
- * @param {Object} object The object to compare.
- * @param {Object} other The other object to compare.
- * @param {Function} equalFunc The function to determine equivalents of values.
- * @param {Function} [customizer] The function to customize comparing values.
- * @param {boolean} [isLoose] Specify performing partial comparisons.
- * @param {Array} [stackA] Tracks traversed `value` objects.
- * @param {Array} [stackB] Tracks traversed `other` objects.
- * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
- */
-function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
-  var objProps = keys(object),
-      objLength = objProps.length,
-      othProps = keys(other),
-      othLength = othProps.length;
-
-  if (objLength != othLength && !isLoose) {
-    return false;
-  }
-  var index = objLength;
-  while (index--) {
-    var key = objProps[index];
-    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {
-      return false;
-    }
-  }
-  var skipCtor = isLoose;
-  while (++index < objLength) {
-    key = objProps[index];
-    var objValue = object[key],
-        othValue = other[key],
-        result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;
-
-    // Recursively compare objects (susceptible to call stack limits).
-    if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {
-      return false;
-    }
-    skipCtor || (skipCtor = key == 'constructor');
-  }
-  if (!skipCtor) {
-    var objCtor = object.constructor,
-        othCtor = other.constructor;
-
-    // Non `Object` object instances with different constructors are not equal.
-    if (objCtor != othCtor &&
-        ('constructor' in object && 'constructor' in other) &&
-        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
-          typeof othCtor == 'function' && othCtor instanceof othCtor)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-module.exports = equalObjects;
-
-},{"../object/keys":65}],42:[function(require,module,exports){
-var baseProperty = require('./baseProperty');
-
-/**
- * Gets the "length" property value of `object`.
- *
- * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
- * that affects Safari on at least iOS 8.1-8.3 ARM64.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {*} Returns the "length" value.
- */
-var getLength = baseProperty('length');
-
-module.exports = getLength;
-
-},{"./baseProperty":31}],43:[function(require,module,exports){
-var isStrictComparable = require('./isStrictComparable'),
-    pairs = require('../object/pairs');
-
-/**
- * Gets the propery names, values, and compare flags of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the match data of `object`.
- */
-function getMatchData(object) {
-  var result = pairs(object),
-      length = result.length;
-
-  while (length--) {
-    result[length][2] = isStrictComparable(result[length][1]);
-  }
-  return result;
-}
-
-module.exports = getMatchData;
-
-},{"../object/pairs":67,"./isStrictComparable":51}],44:[function(require,module,exports){
-var isNative = require('../lang/isNative');
-
-/**
- * Gets the native function at `key` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {string} key The key of the method to get.
- * @returns {*} Returns the function if it's native, else `undefined`.
- */
-function getNative(object, key) {
-  var value = object == null ? undefined : object[key];
-  return isNative(value) ? value : undefined;
-}
-
-module.exports = getNative;
-
-},{"../lang/isNative":59}],45:[function(require,module,exports){
-var getLength = require('./getLength'),
-    isLength = require('./isLength');
-
-/**
- * Checks if `value` is array-like.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- */
-function isArrayLike(value) {
-  return value != null && isLength(getLength(value));
-}
-
-module.exports = isArrayLike;
-
-},{"./getLength":42,"./isLength":49}],46:[function(require,module,exports){
-/** Used to detect unsigned integer values. */
-var reIsUint = /^\d+$/;
-
-/**
- * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
- * of an array-like value.
- */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/**
- * Checks if `value` is a valid array-like index.
- *
- * @private
- * @param {*} value The value to check.
- * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
- * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
- */
-function isIndex(value, length) {
-  value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
-  length = length == null ? MAX_SAFE_INTEGER : length;
-  return value > -1 && value % 1 == 0 && value < length;
-}
-
-module.exports = isIndex;
-
-},{}],47:[function(require,module,exports){
-var isArrayLike = require('./isArrayLike'),
-    isIndex = require('./isIndex'),
-    isObject = require('../lang/isObject');
-
-/**
- * Checks if the provided arguments are from an iteratee call.
- *
- * @private
- * @param {*} value The potential iteratee value argument.
- * @param {*} index The potential iteratee index or key argument.
- * @param {*} object The potential iteratee object argument.
- * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
- */
-function isIterateeCall(value, index, object) {
-  if (!isObject(object)) {
-    return false;
-  }
-  var type = typeof index;
-  if (type == 'number'
-      ? (isArrayLike(object) && isIndex(index, object.length))
-      : (type == 'string' && index in object)) {
-    var other = object[index];
-    return value === value ? (value === other) : (other !== other);
-  }
-  return false;
-}
-
-module.exports = isIterateeCall;
-
-},{"../lang/isObject":60,"./isArrayLike":45,"./isIndex":46}],48:[function(require,module,exports){
-var isArray = require('../lang/isArray'),
-    toObject = require('./toObject');
-
-/** Used to match property names within property paths. */
-var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/,
-    reIsPlainProp = /^\w*$/;
-
-/**
- * Checks if `value` is a property name and not a property path.
- *
- * @private
- * @param {*} value The value to check.
- * @param {Object} [object] The object to query keys on.
- * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
- */
-function isKey(value, object) {
-  var type = typeof value;
-  if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {
-    return true;
-  }
-  if (isArray(value)) {
-    return false;
-  }
-  var result = !reIsDeepProp.test(value);
-  return result || (object != null && value in toObject(object));
-}
-
-module.exports = isKey;
-
-},{"../lang/isArray":56,"./toObject":53}],49:[function(require,module,exports){
-/**
- * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
- * of an array-like value.
- */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- */
-function isLength(value) {
-  return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
-}
-
-module.exports = isLength;
-
-},{}],50:[function(require,module,exports){
-/**
- * Checks if `value` is object-like.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- */
-function isObjectLike(value) {
-  return !!value && typeof value == 'object';
-}
-
-module.exports = isObjectLike;
-
-},{}],51:[function(require,module,exports){
-var isObject = require('../lang/isObject');
-
-/**
- * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` if suitable for strict
- *  equality comparisons, else `false`.
- */
-function isStrictComparable(value) {
-  return value === value && !isObject(value);
-}
-
-module.exports = isStrictComparable;
-
-},{"../lang/isObject":60}],52:[function(require,module,exports){
-var isArguments = require('../lang/isArguments'),
-    isArray = require('../lang/isArray'),
-    isIndex = require('./isIndex'),
-    isLength = require('./isLength'),
-    keysIn = require('../object/keysIn');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * A fallback implementation of `Object.keys` which creates an array of the
- * own enumerable property names of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- */
-function shimKeys(object) {
-  var props = keysIn(object),
-      propsLength = props.length,
-      length = propsLength && object.length;
-
-  var allowIndexes = !!length && isLength(length) &&
-    (isArray(object) || isArguments(object));
-
-  var index = -1,
-      result = [];
-
-  while (++index < propsLength) {
-    var key = props[index];
-    if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
-      result.push(key);
-    }
-  }
-  return result;
-}
-
-module.exports = shimKeys;
-
-},{"../lang/isArguments":55,"../lang/isArray":56,"../object/keysIn":66,"./isIndex":46,"./isLength":49}],53:[function(require,module,exports){
-var isObject = require('../lang/isObject');
-
-/**
- * Converts `value` to an object if it's not one.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {Object} Returns the object.
- */
-function toObject(value) {
-  return isObject(value) ? value : Object(value);
-}
-
-module.exports = toObject;
-
-},{"../lang/isObject":60}],54:[function(require,module,exports){
-var baseToString = require('./baseToString'),
-    isArray = require('../lang/isArray');
-
-/** Used to match property names within property paths. */
-var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g;
-
-/** Used to match backslashes in property paths. */
-var reEscapeChar = /\\(\\)?/g;
-
-/**
- * Converts `value` to property path array if it's not one.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {Array} Returns the property path array.
- */
-function toPath(value) {
-  if (isArray(value)) {
-    return value;
-  }
-  var result = [];
-  baseToString(value).replace(rePropName, function(match, number, quote, string) {
-    result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
-  });
-  return result;
-}
-
-module.exports = toPath;
-
-},{"../lang/isArray":56,"./baseToString":34}],55:[function(require,module,exports){
-var isArrayLike = require('../internal/isArrayLike'),
-    isObjectLike = require('../internal/isObjectLike');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/** Native method references. */
-var propertyIsEnumerable = objectProto.propertyIsEnumerable;
-
-/**
- * Checks if `value` is classified as an `arguments` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isArguments(function() { return arguments; }());
- * // => true
- *
- * _.isArguments([1, 2, 3]);
- * // => false
- */
-function isArguments(value) {
-  return isObjectLike(value) && isArrayLike(value) &&
-    hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
-}
-
-module.exports = isArguments;
-
-},{"../internal/isArrayLike":45,"../internal/isObjectLike":50}],56:[function(require,module,exports){
-var getNative = require('../internal/getNative'),
-    isLength = require('../internal/isLength'),
-    isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var arrayTag = '[object Array]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeIsArray = getNative(Array, 'isArray');
-
-/**
- * Checks if `value` is classified as an `Array` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isArray([1, 2, 3]);
- * // => true
- *
- * _.isArray(function() { return arguments; }());
- * // => false
- */
-var isArray = nativeIsArray || function(value) {
-  return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
-};
-
-module.exports = isArray;
-
-},{"../internal/getNative":44,"../internal/isLength":49,"../internal/isObjectLike":50}],57:[function(require,module,exports){
-var isArguments = require('./isArguments'),
-    isArray = require('./isArray'),
-    isArrayLike = require('../internal/isArrayLike'),
-    isFunction = require('./isFunction'),
-    isObjectLike = require('../internal/isObjectLike'),
-    isString = require('./isString'),
-    keys = require('../object/keys');
-
-/**
- * Checks if `value` is empty. A value is considered empty unless it's an
- * `arguments` object, array, string, or jQuery-like collection with a length
- * greater than `0` or an object with own enumerable properties.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {Array|Object|string} value The value to inspect.
- * @returns {boolean} Returns `true` if `value` is empty, else `false`.
- * @example
- *
- * _.isEmpty(null);
- * // => true
- *
- * _.isEmpty(true);
- * // => true
- *
- * _.isEmpty(1);
- * // => true
- *
- * _.isEmpty([1, 2, 3]);
- * // => false
- *
- * _.isEmpty({ 'a': 1 });
- * // => false
- */
-function isEmpty(value) {
-  if (value == null) {
-    return true;
-  }
-  if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) ||
-      (isObjectLike(value) && isFunction(value.splice)))) {
-    return !value.length;
-  }
-  return !keys(value).length;
-}
-
-module.exports = isEmpty;
-
-},{"../internal/isArrayLike":45,"../internal/isObjectLike":50,"../object/keys":65,"./isArguments":55,"./isArray":56,"./isFunction":58,"./isString":61}],58:[function(require,module,exports){
-var isObject = require('./isObject');
-
-/** `Object#toString` result references. */
-var funcTag = '[object Function]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
-function isFunction(value) {
-  // The use of `Object#toString` avoids issues with the `typeof` operator
-  // in older versions of Chrome and Safari which return 'function' for regexes
-  // and Safari 8 which returns 'object' for typed array constructors.
-  return isObject(value) && objToString.call(value) == funcTag;
-}
-
-module.exports = isFunction;
-
-},{"./isObject":60}],59:[function(require,module,exports){
-var isFunction = require('./isFunction'),
-    isObjectLike = require('../internal/isObjectLike');
-
-/** Used to detect host constructors (Safari > 5). */
-var reIsHostCtor = /^\[object .+?Constructor\]$/;
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to resolve the decompiled source of functions. */
-var fnToString = Function.prototype.toString;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/** Used to detect if a method is native. */
-var reIsNative = RegExp('^' +
-  fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
-  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
-);
-
-/**
- * Checks if `value` is a native function.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
- * @example
- *
- * _.isNative(Array.prototype.push);
- * // => true
- *
- * _.isNative(_);
- * // => false
- */
-function isNative(value) {
-  if (value == null) {
-    return false;
-  }
-  if (isFunction(value)) {
-    return reIsNative.test(fnToString.call(value));
-  }
-  return isObjectLike(value) && reIsHostCtor.test(value);
-}
-
-module.exports = isNative;
-
-},{"../internal/isObjectLike":50,"./isFunction":58}],60:[function(require,module,exports){
-/**
- * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
-function isObject(value) {
-  // Avoid a V8 JIT bug in Chrome 19-20.
-  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
-  var type = typeof value;
-  return !!value && (type == 'object' || type == 'function');
-}
-
-module.exports = isObject;
-
-},{}],61:[function(require,module,exports){
-var isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var stringTag = '[object String]';
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is classified as a `String` primitive or object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isString('abc');
- * // => true
- *
- * _.isString(1);
- * // => false
- */
-function isString(value) {
-  return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);
-}
-
-module.exports = isString;
-
-},{"../internal/isObjectLike":50}],62:[function(require,module,exports){
-var isLength = require('../internal/isLength'),
-    isObjectLike = require('../internal/isObjectLike');
-
-/** `Object#toString` result references. */
-var argsTag = '[object Arguments]',
-    arrayTag = '[object Array]',
-    boolTag = '[object Boolean]',
-    dateTag = '[object Date]',
-    errorTag = '[object Error]',
-    funcTag = '[object Function]',
-    mapTag = '[object Map]',
-    numberTag = '[object Number]',
-    objectTag = '[object Object]',
-    regexpTag = '[object RegExp]',
-    setTag = '[object Set]',
-    stringTag = '[object String]',
-    weakMapTag = '[object WeakMap]';
-
-var arrayBufferTag = '[object ArrayBuffer]',
-    float32Tag = '[object Float32Array]',
-    float64Tag = '[object Float64Array]',
-    int8Tag = '[object Int8Array]',
-    int16Tag = '[object Int16Array]',
-    int32Tag = '[object Int32Array]',
-    uint8Tag = '[object Uint8Array]',
-    uint8ClampedTag = '[object Uint8ClampedArray]',
-    uint16Tag = '[object Uint16Array]',
-    uint32Tag = '[object Uint32Array]';
-
-/** Used to identify `toStringTag` values of typed arrays. */
-var typedArrayTags = {};
-typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
-typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
-typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
-typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
-typedArrayTags[uint32Tag] = true;
-typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
-typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
-typedArrayTags[dateTag] = typedArrayTags[errorTag] =
-typedArrayTags[funcTag] = typedArrayTags[mapTag] =
-typedArrayTags[numberTag] = typedArrayTags[objectTag] =
-typedArrayTags[regexpTag] = typedArrayTags[setTag] =
-typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/**
- * Checks if `value` is classified as a typed array.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isTypedArray(new Uint8Array);
- * // => true
- *
- * _.isTypedArray([]);
- * // => false
- */
-function isTypedArray(value) {
-  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];
-}
-
-module.exports = isTypedArray;
-
-},{"../internal/isLength":49,"../internal/isObjectLike":50}],63:[function(require,module,exports){
-var assignWith = require('../internal/assignWith'),
-    baseAssign = require('../internal/baseAssign'),
-    createAssigner = require('../internal/createAssigner');
-
-/**
- * Assigns own enumerable properties of source object(s) to the destination
- * object. Subsequent sources overwrite property assignments of previous sources.
- * If `customizer` is provided it's invoked to produce the assigned values.
- * The `customizer` is bound to `thisArg` and invoked with five arguments:
- * (objectValue, sourceValue, key, object, source).
- *
- * **Note:** This method mutates `object` and is based on
- * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign).
- *
- * @static
- * @memberOf _
- * @alias extend
- * @category Object
- * @param {Object} object The destination object.
- * @param {...Object} [sources] The source objects.
- * @param {Function} [customizer] The function to customize assigned values.
- * @param {*} [thisArg] The `this` binding of `customizer`.
- * @returns {Object} Returns `object`.
- * @example
- *
- * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });
- * // => { 'user': 'fred', 'age': 40 }
- *
- * // using a customizer callback
- * var defaults = _.partialRight(_.assign, function(value, other) {
- *   return _.isUndefined(value) ? other : value;
- * });
- *
- * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
- * // => { 'user': 'barney', 'age': 36 }
- */
-var assign = createAssigner(function(object, source, customizer) {
-  return customizer
-    ? assignWith(object, source, customizer)
-    : baseAssign(object, source);
-});
-
-module.exports = assign;
-
-},{"../internal/assignWith":16,"../internal/baseAssign":17,"../internal/createAssigner":36}],64:[function(require,module,exports){
-var baseAssign = require('../internal/baseAssign'),
-    baseCreate = require('../internal/baseCreate'),
-    isIterateeCall = require('../internal/isIterateeCall');
-
-/**
- * Creates an object that inherits from the given `prototype` object. If a
- * `properties` object is provided its own enumerable properties are assigned
- * to the created object.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} prototype The object to inherit from.
- * @param {Object} [properties] The properties to assign to the object.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Object} Returns the new object.
- * @example
- *
- * function Shape() {
- *   this.x = 0;
- *   this.y = 0;
- * }
- *
- * function Circle() {
- *   Shape.call(this);
- * }
- *
- * Circle.prototype = _.create(Shape.prototype, {
- *   'constructor': Circle
- * });
- *
- * var circle = new Circle;
- * circle instanceof Circle;
- * // => true
- *
- * circle instanceof Shape;
- * // => true
- */
-function create(prototype, properties, guard) {
-  var result = baseCreate(prototype);
-  if (guard && isIterateeCall(prototype, properties, guard)) {
-    properties = undefined;
-  }
-  return properties ? baseAssign(result, properties) : result;
-}
-
-module.exports = create;
-
-},{"../internal/baseAssign":17,"../internal/baseCreate":20,"../internal/isIterateeCall":47}],65:[function(require,module,exports){
-var getNative = require('../internal/getNative'),
-    isArrayLike = require('../internal/isArrayLike'),
-    isObject = require('../lang/isObject'),
-    shimKeys = require('../internal/shimKeys');
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeKeys = getNative(Object, 'keys');
-
-/**
- * Creates an array of the own enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects. See the
- * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
- * for more details.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keys(new Foo);
- * // => ['a', 'b'] (iteration order is not guaranteed)
- *
- * _.keys('hi');
- * // => ['0', '1']
- */
-var keys = !nativeKeys ? shimKeys : function(object) {
-  var Ctor = object == null ? undefined : object.constructor;
-  if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
-      (typeof object != 'function' && isArrayLike(object))) {
-    return shimKeys(object);
-  }
-  return isObject(object) ? nativeKeys(object) : [];
-};
-
-module.exports = keys;
-
-},{"../internal/getNative":44,"../internal/isArrayLike":45,"../internal/shimKeys":52,"../lang/isObject":60}],66:[function(require,module,exports){
-var isArguments = require('../lang/isArguments'),
-    isArray = require('../lang/isArray'),
-    isIndex = require('../internal/isIndex'),
-    isLength = require('../internal/isLength'),
-    isObject = require('../lang/isObject');
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Creates an array of the own and inherited enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- *   this.a = 1;
- *   this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keysIn(new Foo);
- * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
- */
-function keysIn(object) {
-  if (object == null) {
-    return [];
-  }
-  if (!isObject(object)) {
-    object = Object(object);
-  }
-  var length = object.length;
-  length = (length && isLength(length) &&
-    (isArray(object) || isArguments(object)) && length) || 0;
-
-  var Ctor = object.constructor,
-      index = -1,
-      isProto = typeof Ctor == 'function' && Ctor.prototype === object,
-      result = Array(length),
-      skipIndexes = length > 0;
-
-  while (++index < length) {
-    result[index] = (index + '');
-  }
-  for (var key in object) {
-    if (!(skipIndexes && isIndex(key, length)) &&
-        !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
-      result.push(key);
-    }
-  }
-  return result;
-}
-
-module.exports = keysIn;
-
-},{"../internal/isIndex":46,"../internal/isLength":49,"../lang/isArguments":55,"../lang/isArray":56,"../lang/isObject":60}],67:[function(require,module,exports){
-var keys = require('./keys'),
-    toObject = require('../internal/toObject');
-
-/**
- * Creates a two dimensional array of the key-value pairs for `object`,
- * e.g. `[[key1, value1], [key2, value2]]`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the new array of key-value pairs.
- * @example
- *
- * _.pairs({ 'barney': 36, 'fred': 40 });
- * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)
- */
-function pairs(object) {
-  object = toObject(object);
-
-  var index = -1,
-      props = keys(object),
-      length = props.length,
-      result = Array(length);
-
-  while (++index < length) {
-    var key = props[index];
-    result[index] = [key, object[key]];
-  }
-  return result;
-}
-
-module.exports = pairs;
-
-},{"../internal/toObject":53,"./keys":65}],68:[function(require,module,exports){
-/**
- * This method returns the first argument provided to it.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {*} value Any value.
- * @returns {*} Returns `value`.
- * @example
- *
- * var object = { 'user': 'fred' };
- *
- * _.identity(object) === object;
- * // => true
- */
-function identity(value) {
-  return value;
-}
-
-module.exports = identity;
-
-},{}],69:[function(require,module,exports){
-var baseProperty = require('../internal/baseProperty'),
-    basePropertyDeep = require('../internal/basePropertyDeep'),
-    isKey = require('../internal/isKey');
-
-/**
- * Creates a function that returns the property value at `path` on a
- * given object.
- *
- * @static
- * @memberOf _
- * @category Utility
- * @param {Array|string} path The path of the property to get.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var objects = [
- *   { 'a': { 'b': { 'c': 2 } } },
- *   { 'a': { 'b': { 'c': 1 } } }
- * ];
- *
- * _.map(objects, _.property('a.b.c'));
- * // => [2, 1]
- *
- * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');
- * // => [1, 2]
- */
-function property(path) {
-  return isKey(path) ? baseProperty(path) : basePropertyDeep(path);
-}
-
-module.exports = property;
-
-},{"../internal/baseProperty":31,"../internal/basePropertyDeep":32,"../internal/isKey":48}],70:[function(require,module,exports){
-(function (global){
-
-/**
- * Module exports.
- */
-
-module.exports = deprecate;
-
-/**
- * Mark that a method should not be used.
- * Returns a modified function which warns once by default.
- *
- * If `localStorage.noDeprecation = true` is set, then it is a no-op.
- *
- * If `localStorage.throwDeprecation = true` is set, then deprecated functions
- * will throw an Error when invoked.
- *
- * If `localStorage.traceDeprecation = true` is set, then deprecated functions
- * will invoke `console.trace()` instead of `console.error()`.
- *
- * @param {Function} fn - the function to deprecate
- * @param {String} msg - the string to print to the console when `fn` is invoked
- * @returns {Function} a new "deprecated" version of `fn`
- * @api public
- */
-
-function deprecate (fn, msg) {
-  if (config('noDeprecation')) {
-    return fn;
-  }
-
-  var warned = false;
-  function deprecated() {
-    if (!warned) {
-      if (config('throwDeprecation')) {
-        throw new Error(msg);
-      } else if (config('traceDeprecation')) {
-        console.trace(msg);
-      } else {
-        console.warn(msg);
-      }
-      warned = true;
-    }
-    return fn.apply(this, arguments);
-  }
-
-  return deprecated;
-}
-
-/**
- * Checks `localStorage` for boolean values for the given `name`.
- *
- * @param {String} name
- * @returns {Boolean}
- * @api private
- */
-
-function config (name) {
-  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
-  try {
-    if (!global.localStorage) return false;
-  } catch (_) {
-    return false;
-  }
-  var val = global.localStorage[name];
-  if (null == val) return false;
-  return String(val).toLowerCase() === 'true';
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}],71:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLAttribute, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLAttribute = (function() {
-    function XMLAttribute(parent, name, value) {
-      this.stringify = parent.stringify;
-      if (name == null) {
-        throw new Error("Missing attribute name of element " + parent.name);
-      }
-      if (value == null) {
-        throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name);
-      }
-      this.name = this.stringify.attName(name);
-      this.value = this.stringify.attValue(value);
-    }
-
-    XMLAttribute.prototype.clone = function() {
-      return create(XMLAttribute.prototype, this);
-    };
-
-    XMLAttribute.prototype.toString = function(options, level) {
-      return ' ' + this.name + '="' + this.value + '"';
-    };
-
-    return XMLAttribute;
-
-  })();
-
-}).call(this);
-
-},{"lodash/object/create":64}],72:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLBuilder, XMLDeclaration, XMLDocType, XMLElement, XMLStringifier;
-
-  XMLStringifier = require('./XMLStringifier');
-
-  XMLDeclaration = require('./XMLDeclaration');
-
-  XMLDocType = require('./XMLDocType');
-
-  XMLElement = require('./XMLElement');
-
-  module.exports = XMLBuilder = (function() {
-    function XMLBuilder(name, options) {
-      var root, temp;
-      if (name == null) {
-        throw new Error("Root element needs a name");
-      }
-      if (options == null) {
-        options = {};
-      }
-      this.options = options;
-      this.stringify = new XMLStringifier(options);
-      temp = new XMLElement(this, 'doc');
-      root = temp.element(name);
-      root.isRoot = true;
-      root.documentObject = this;
-      this.rootObject = root;
-      if (!options.headless) {
-        root.declaration(options);
-        if ((options.pubID != null) || (options.sysID != null)) {
-          root.doctype(options);
-        }
-      }
-    }
-
-    XMLBuilder.prototype.root = function() {
-      return this.rootObject;
-    };
-
-    XMLBuilder.prototype.end = function(options) {
-      return this.toString(options);
-    };
-
-    XMLBuilder.prototype.toString = function(options) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      r = '';
-      if (this.xmldec != null) {
-        r += this.xmldec.toString(options);
-      }
-      if (this.doctype != null) {
-        r += this.doctype.toString(options);
-      }
-      r += this.rootObject.toString(options);
-      if (pretty && r.slice(-newline.length) === newline) {
-        r = r.slice(0, -newline.length);
-      }
-      return r;
-    };
-
-    return XMLBuilder;
-
-  })();
-
-}).call(this);
-
-},{"./XMLDeclaration":79,"./XMLDocType":80,"./XMLElement":81,"./XMLStringifier":85}],73:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLCData, XMLNode, create,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLCData = (function(superClass) {
-    extend(XMLCData, superClass);
-
-    function XMLCData(parent, text) {
-      XMLCData.__super__.constructor.call(this, parent);
-      if (text == null) {
-        throw new Error("Missing CDATA text");
-      }
-      this.text = this.stringify.cdata(text);
-    }
-
-    XMLCData.prototype.clone = function() {
-      return create(XMLCData.prototype, this);
-    };
-
-    XMLCData.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<![CDATA[' + this.text + ']]>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLCData;
-
-  })(XMLNode);
-
-}).call(this);
-
-},{"./XMLNode":82,"lodash/object/create":64}],74:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLComment, XMLNode, create,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLComment = (function(superClass) {
-    extend(XMLComment, superClass);
-
-    function XMLComment(parent, text) {
-      XMLComment.__super__.constructor.call(this, parent);
-      if (text == null) {
-        throw new Error("Missing comment text");
-      }
-      this.text = this.stringify.comment(text);
-    }
-
-    XMLComment.prototype.clone = function() {
-      return create(XMLComment.prototype, this);
-    };
-
-    XMLComment.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!-- ' + this.text + ' -->';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLComment;
-
-  })(XMLNode);
-
-}).call(this);
-
-},{"./XMLNode":82,"lodash/object/create":64}],75:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDTDAttList, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLDTDAttList = (function() {
-    function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {
-      this.stringify = parent.stringify;
-      if (elementName == null) {
-        throw new Error("Missing DTD element name");
-      }
-      if (attributeName == null) {
-        throw new Error("Missing DTD attribute name");
-      }
-      if (!attributeType) {
-        throw new Error("Missing DTD attribute type");
-      }
-      if (!defaultValueType) {
-        throw new Error("Missing DTD attribute default");
-      }
-      if (defaultValueType.indexOf('#') !== 0) {
-        defaultValueType = '#' + defaultValueType;
-      }
-      if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {
-        throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT");
-      }
-      if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {
-        throw new Error("Default value only applies to #FIXED or #DEFAULT");
-      }
-      this.elementName = this.stringify.eleName(elementName);
-      this.attributeName = this.stringify.attName(attributeName);
-      this.attributeType = this.stringify.dtdAttType(attributeType);
-      this.defaultValue = this.stringify.dtdAttDefault(defaultValue);
-      this.defaultValueType = defaultValueType;
-    }
-
-    XMLDTDAttList.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!ATTLIST ' + this.elementName + ' ' + this.attributeName + ' ' + this.attributeType;
-      if (this.defaultValueType !== '#DEFAULT') {
-        r += ' ' + this.defaultValueType;
-      }
-      if (this.defaultValue) {
-        r += ' "' + this.defaultValue + '"';
-      }
-      r += '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDTDAttList;
-
-  })();
-
-}).call(this);
-
-},{"lodash/object/create":64}],76:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDTDElement, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLDTDElement = (function() {
-    function XMLDTDElement(parent, name, value) {
-      this.stringify = parent.stringify;
-      if (name == null) {
-        throw new Error("Missing DTD element name");
-      }
-      if (!value) {
-        value = '(#PCDATA)';
-      }
-      if (Array.isArray(value)) {
-        value = '(' + value.join(',') + ')';
-      }
-      this.name = this.stringify.eleName(name);
-      this.value = this.stringify.dtdElementValue(value);
-    }
-
-    XMLDTDElement.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!ELEMENT ' + this.name + ' ' + this.value + '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDTDElement;
-
-  })();
-
-}).call(this);
-
-},{"lodash/object/create":64}],77:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDTDEntity, create, isObject;
-
-  create = require('lodash/object/create');
-
-  isObject = require('lodash/lang/isObject');
-
-  module.exports = XMLDTDEntity = (function() {
-    function XMLDTDEntity(parent, pe, name, value) {
-      this.stringify = parent.stringify;
-      if (name == null) {
-        throw new Error("Missing entity name");
-      }
-      if (value == null) {
-        throw new Error("Missing entity value");
-      }
-      this.pe = !!pe;
-      this.name = this.stringify.eleName(name);
-      if (!isObject(value)) {
-        this.value = this.stringify.dtdEntityValue(value);
-      } else {
-        if (!value.pubID && !value.sysID) {
-          throw new Error("Public and/or system identifiers are required for an external entity");
-        }
-        if (value.pubID && !value.sysID) {
-          throw new Error("System identifier is required for a public external entity");
-        }
-        if (value.pubID != null) {
-          this.pubID = this.stringify.dtdPubID(value.pubID);
-        }
-        if (value.sysID != null) {
-          this.sysID = this.stringify.dtdSysID(value.sysID);
-        }
-        if (value.nData != null) {
-          this.nData = this.stringify.dtdNData(value.nData);
-        }
-        if (this.pe && this.nData) {
-          throw new Error("Notation declaration is not allowed in a parameter entity");
-        }
-      }
-    }
-
-    XMLDTDEntity.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!ENTITY';
-      if (this.pe) {
-        r += ' %';
-      }
-      r += ' ' + this.name;
-      if (this.value) {
-        r += ' "' + this.value + '"';
-      } else {
-        if (this.pubID && this.sysID) {
-          r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
-        } else if (this.sysID) {
-          r += ' SYSTEM "' + this.sysID + '"';
-        }
-        if (this.nData) {
-          r += ' NDATA ' + this.nData;
-        }
-      }
-      r += '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDTDEntity;
-
-  })();
-
-}).call(this);
-
-},{"lodash/lang/isObject":60,"lodash/object/create":64}],78:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDTDNotation, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLDTDNotation = (function() {
-    function XMLDTDNotation(parent, name, value) {
-      this.stringify = parent.stringify;
-      if (name == null) {
-        throw new Error("Missing notation name");
-      }
-      if (!value.pubID && !value.sysID) {
-        throw new Error("Public or system identifiers are required for an external entity");
-      }
-      this.name = this.stringify.eleName(name);
-      if (value.pubID != null) {
-        this.pubID = this.stringify.dtdPubID(value.pubID);
-      }
-      if (value.sysID != null) {
-        this.sysID = this.stringify.dtdSysID(value.sysID);
-      }
-    }
-
-    XMLDTDNotation.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!NOTATION ' + this.name;
-      if (this.pubID && this.sysID) {
-        r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
-      } else if (this.pubID) {
-        r += ' PUBLIC "' + this.pubID + '"';
-      } else if (this.sysID) {
-        r += ' SYSTEM "' + this.sysID + '"';
-      }
-      r += '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDTDNotation;
-
-  })();
-
-}).call(this);
-
-},{"lodash/object/create":64}],79:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDeclaration, XMLNode, create, isObject,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  isObject = require('lodash/lang/isObject');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLDeclaration = (function(superClass) {
-    extend(XMLDeclaration, superClass);
-
-    function XMLDeclaration(parent, version, encoding, standalone) {
-      var ref;
-      XMLDeclaration.__super__.constructor.call(this, parent);
-      if (isObject(version)) {
-        ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;
-      }
-      if (!version) {
-        version = '1.0';
-      }
-      this.version = this.stringify.xmlVersion(version);
-      if (encoding != null) {
-        this.encoding = this.stringify.xmlEncoding(encoding);
-      }
-      if (standalone != null) {
-        this.standalone = this.stringify.xmlStandalone(standalone);
-      }
-    }
-
-    XMLDeclaration.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<?xml';
-      r += ' version="' + this.version + '"';
-      if (this.encoding != null) {
-        r += ' encoding="' + this.encoding + '"';
-      }
-      if (this.standalone != null) {
-        r += ' standalone="' + this.standalone + '"';
-      }
-      r += '?>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDeclaration;
-
-  })(XMLNode);
-
-}).call(this);
-
-},{"./XMLNode":82,"lodash/lang/isObject":60,"lodash/object/create":64}],80:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLProcessingInstruction, create, isObject;
-
-  create = require('lodash/object/create');
-
-  isObject = require('lodash/lang/isObject');
-
-  XMLCData = require('./XMLCData');
-
-  XMLComment = require('./XMLComment');
-
-  XMLDTDAttList = require('./XMLDTDAttList');
-
-  XMLDTDEntity = require('./XMLDTDEntity');
-
-  XMLDTDElement = require('./XMLDTDElement');
-
-  XMLDTDNotation = require('./XMLDTDNotation');
-
-  XMLProcessingInstruction = require('./XMLProcessingInstruction');
-
-  module.exports = XMLDocType = (function() {
-    function XMLDocType(parent, pubID, sysID) {
-      var ref, ref1;
-      this.documentObject = parent;
-      this.stringify = this.documentObject.stringify;
-      this.children = [];
-      if (isObject(pubID)) {
-        ref = pubID, pubID = ref.pubID, sysID = ref.sysID;
-      }
-      if (sysID == null) {
-        ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1];
-      }
-      if (pubID != null) {
-        this.pubID = this.stringify.dtdPubID(pubID);
-      }
-      if (sysID != null) {
-        this.sysID = this.stringify.dtdSysID(sysID);
-      }
-    }
-
-    XMLDocType.prototype.element = function(name, value) {
-      var child;
-      child = new XMLDTDElement(this, name, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
-      var child;
-      child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.entity = function(name, value) {
-      var child;
-      child = new XMLDTDEntity(this, false, name, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.pEntity = function(name, value) {
-      var child;
-      child = new XMLDTDEntity(this, true, name, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.notation = function(name, value) {
-      var child;
-      child = new XMLDTDNotation(this, name, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.cdata = function(value) {
-      var child;
-      child = new XMLCData(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.comment = function(value) {
-      var child;
-      child = new XMLComment(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.instruction = function(target, value) {
-      var child;
-      child = new XMLProcessingInstruction(this, target, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.root = function() {
-      return this.documentObject.root();
-    };
-
-    XMLDocType.prototype.document = function() {
-      return this.documentObject;
-    };
-
-    XMLDocType.prototype.toString = function(options, level) {
-      var child, i, indent, len, newline, offset, pretty, r, ref, ref1, ref2, ref3, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!DOCTYPE ' + this.root().name;
-      if (this.pubID && this.sysID) {
-        r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
-      } else if (this.sysID) {
-        r += ' SYSTEM "' + this.sysID + '"';
-      }
-      if (this.children.length > 0) {
-        r += ' [';
-        if (pretty) {
-          r += newline;
-        }
-        ref3 = this.children;
-        for (i = 0, len = ref3.length; i < len; i++) {
-          child = ref3[i];
-          r += child.toString(options, level + 1);
-        }
-        r += ']';
-      }
-      r += '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    XMLDocType.prototype.ele = function(name, value) {
-      return this.element(name, value);
-    };
-
-    XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
-      return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);
-    };
-
-    XMLDocType.prototype.ent = function(name, value) {
-      return this.entity(name, value);
-    };
-
-    XMLDocType.prototype.pent = function(name, value) {
-      return this.pEntity(name, value);
-    };
-
-    XMLDocType.prototype.not = function(name, value) {
-      return this.notation(name, value);
-    };
-
-    XMLDocType.prototype.dat = function(value) {
-      return this.cdata(value);
-    };
-
-    XMLDocType.prototype.com = function(value) {
-      return this.comment(value);
-    };
-
-    XMLDocType.prototype.ins = function(target, value) {
-      return this.instruction(target, value);
-    };
-
-    XMLDocType.prototype.up = function() {
-      return this.root();
-    };
-
-    XMLDocType.prototype.doc = function() {
-      return this.document();
-    };
-
-    return XMLDocType;
-
-  })();
-
-}).call(this);
-
-},{"./XMLCData":73,"./XMLComment":74,"./XMLDTDAttList":75,"./XMLDTDElement":76,"./XMLDTDEntity":77,"./XMLDTDNotation":78,"./XMLProcessingInstruction":83,"lodash/lang/isObject":60,"lodash/object/create":64}],81:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLAttribute, XMLElement, XMLNode, XMLProcessingInstruction, create, every, isFunction, isObject,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  isObject = require('lodash/lang/isObject');
-
-  isFunction = require('lodash/lang/isFunction');
-
-  every = require('lodash/collection/every');
-
-  XMLNode = require('./XMLNode');
-
-  XMLAttribute = require('./XMLAttribute');
-
-  XMLProcessingInstruction = require('./XMLProcessingInstruction');
-
-  module.exports = XMLElement = (function(superClass) {
-    extend(XMLElement, superClass);
-
-    function XMLElement(parent, name, attributes) {
-      XMLElement.__super__.constructor.call(this, parent);
-      if (name == null) {
-        throw new Error("Missing element name");
-      }
-      this.name = this.stringify.eleName(name);
-      this.children = [];
-      this.instructions = [];
-      this.attributes = {};
-      if (attributes != null) {
-        this.attribute(attributes);
-      }
-    }
-
-    XMLElement.prototype.clone = function() {
-      var att, attName, clonedSelf, i, len, pi, ref, ref1;
-      clonedSelf = create(XMLElement.prototype, this);
-      if (clonedSelf.isRoot) {
-        clonedSelf.documentObject = null;
-      }
-      clonedSelf.attributes = {};
-      ref = this.attributes;
-      for (attName in ref) {
-        if (!hasProp.call(ref, attName)) continue;
-        att = ref[attName];
-        clonedSelf.attributes[attName] = att.clone();
-      }
-      clonedSelf.instructions = [];
-      ref1 = this.instructions;
-      for (i = 0, len = ref1.length; i < len; i++) {
-        pi = ref1[i];
-        clonedSelf.instructions.push(pi.clone());
-      }
-      clonedSelf.children = [];
-      this.children.forEach(function(child) {
-        var clonedChild;
-        clonedChild = child.clone();
-        clonedChild.parent = clonedSelf;
-        return clonedSelf.children.push(clonedChild);
-      });
-      return clonedSelf;
-    };
-
-    XMLElement.prototype.attribute = function(name, value) {
-      var attName, attValue;
-      if (name != null) {
-        name = name.valueOf();
-      }
-      if (isObject(name)) {
-        for (attName in name) {
-          if (!hasProp.call(name, attName)) continue;
-          attValue = name[attName];
-          this.attribute(attName, attValue);
-        }
-      } else {
-        if (isFunction(value)) {
-          value = value.apply();
-        }
-        if (!this.options.skipNullAttributes || (value != null)) {
-          this.attributes[name] = new XMLAttribute(this, name, value);
-        }
-      }
-      return this;
-    };
-
-    XMLElement.prototype.removeAttribute = function(name) {
-      var attName, i, len;
-      if (name == null) {
-        throw new Error("Missing attribute name");
-      }
-      name = name.valueOf();
-      if (Array.isArray(name)) {
-        for (i = 0, len = name.length; i < len; i++) {
-          attName = name[i];
-          delete this.attributes[attName];
-        }
-      } else {
-        delete this.attributes[name];
-      }
-      return this;
-    };
-
-    XMLElement.prototype.instruction = function(target, value) {
-      var i, insTarget, insValue, instruction, len;
-      if (target != null) {
-        target = target.valueOf();
-      }
-      if (value != null) {
-        value = value.valueOf();
-      }
-      if (Array.isArray(target)) {
-        for (i = 0, len = target.length; i < len; i++) {
-          insTarget = target[i];
-          this.instruction(insTarget);
-        }
-      } else if (isObject(target)) {
-        for (insTarget in target) {
-          if (!hasProp.call(target, insTarget)) continue;
-          insValue = target[insTarget];
-          this.instruction(insTarget, insValue);
-        }
-      } else {
-        if (isFunction(value)) {
-          value = value.apply();
-        }
-        instruction = new XMLProcessingInstruction(this, target, value);
-        this.instructions.push(instruction);
-      }
-      return this;
-    };
-
-    XMLElement.prototype.toString = function(options, level) {
-      var att, child, i, indent, instruction, j, len, len1, name, newline, offset, pretty, r, ref, ref1, ref2, ref3, ref4, ref5, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      ref3 = this.instructions;
-      for (i = 0, len = ref3.length; i < len; i++) {
-        instruction = ref3[i];
-        r += instruction.toString(options, level);
-      }
-      if (pretty) {
-        r += space;
-      }
-      r += '<' + this.name;
-      ref4 = this.attributes;
-      for (name in ref4) {
-        if (!hasProp.call(ref4, name)) continue;
-        att = ref4[name];
-        r += att.toString(options);
-      }
-      if (this.children.length === 0 || every(this.children, function(e) {
-        return e.value === '';
-      })) {
-        r += '/>';
-        if (pretty) {
-          r += newline;
-        }
-      } else if (pretty && this.children.length === 1 && (this.children[0].value != null)) {
-        r += '>';
-        r += this.children[0].value;
-        r += '</' + this.name + '>';
-        r += newline;
-      } else {
-        r += '>';
-        if (pretty) {
-          r += newline;
-        }
-        ref5 = this.children;
-        for (j = 0, len1 = ref5.length; j < len1; j++) {
-          child = ref5[j];
-          r += child.toString(options, level + 1);
-        }
-        if (pretty) {
-          r += space;
-        }
-        r += '</' + this.name + '>';
-        if (pretty) {
-          r += newline;
-        }
-      }
-      return r;
-    };
-
-    XMLElement.prototype.att = function(name, value) {
-      return this.attribute(name, value);
-    };
-
-    XMLElement.prototype.ins = function(target, value) {
-      return this.instruction(target, value);
-    };
-
-    XMLElement.prototype.a = function(name, value) {
-      return this.attribute(name, value);
-    };
-
-    XMLElement.prototype.i = function(target, value) {
-      return this.instruction(target, value);
-    };
-
-    return XMLElement;
-
-  })(XMLNode);
-
-}).call(this);
-
-},{"./XMLAttribute":71,"./XMLNode":82,"./XMLProcessingInstruction":83,"lodash/collection/every":12,"lodash/lang/isFunction":58,"lodash/lang/isObject":60,"lodash/object/create":64}],82:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLRaw, XMLText, isEmpty, isFunction, isObject,
-    hasProp = {}.hasOwnProperty;
-
-  isObject = require('lodash/lang/isObject');
-
-  isFunction = require('lodash/lang/isFunction');
-
-  isEmpty = require('lodash/lang/isEmpty');
-
-  XMLElement = null;
-
-  XMLCData = null;
-
-  XMLComment = null;
-
-  XMLDeclaration = null;
-
-  XMLDocType = null;
-
-  XMLRaw = null;
-
-  XMLText = null;
-
-  module.exports = XMLNode = (function() {
-    function XMLNode(parent) {
-      this.parent = parent;
-      this.options = this.parent.options;
-      this.stringify = this.parent.stringify;
-      if (XMLElement === null) {
-        XMLElement = require('./XMLElement');
-        XMLCData = require('./XMLCData');
-        XMLComment = require('./XMLComment');
-        XMLDeclaration = require('./XMLDeclaration');
-        XMLDocType = require('./XMLDocType');
-        XMLRaw = require('./XMLRaw');
-        XMLText = require('./XMLText');
-      }
-    }
-
-    XMLNode.prototype.element = function(name, attributes, text) {
-      var childNode, item, j, k, key, lastChild, len, len1, ref, val;
-      lastChild = null;
-      if (attributes == null) {
-        attributes = {};
-      }
-      attributes = attributes.valueOf();
-      if (!isObject(attributes)) {
-        ref = [attributes, text], text = ref[0], attributes = ref[1];
-      }
-      if (name != null) {
-        name = name.valueOf();
-      }
-      if (Array.isArray(name)) {
-        for (j = 0, len = name.length; j < len; j++) {
-          item = name[j];
-          lastChild = this.element(item);
-        }
-      } else if (isFunction(name)) {
-        lastChild = this.element(name.apply());
-      } else if (isObject(name)) {
-        for (key in name) {
-          if (!hasProp.call(name, key)) continue;
-          val = name[key];
-          if (isFunction(val)) {
-            val = val.apply();
-          }
-          if ((isObject(val)) && (isEmpty(val))) {
-            val = null;
-          }
-          if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {
-            lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);
-          } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && key.indexOf(this.stringify.convertPIKey) === 0) {
-            lastChild = this.instruction(key.substr(this.stringify.convertPIKey.length), val);
-          } else if (Array.isArray(val)) {
-            for (k = 0, len1 = val.length; k < len1; k++) {
-              item = val[k];
-              childNode = {};
-              childNode[key] = item;
-              lastChild = this.element(childNode);
-            }
-          } else if (isObject(val)) {
-            lastChild = this.element(key);
-            lastChild.element(val);
-          } else {
-            lastChild = this.element(key, val);
-          }
-        }
-      } else {
-        if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {
-          lastChild = this.text(text);
-        } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {
-          lastChild = this.cdata(text);
-        } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {
-          lastChild = this.comment(text);
-        } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {
-          lastChild = this.raw(text);
-        } else {
-          lastChild = this.node(name, attributes, text);
-        }
-      }
-      if (lastChild == null) {
-        throw new Error("Could not create any elements with: " + name);
-      }
-      return lastChild;
-    };
-
-    XMLNode.prototype.insertBefore = function(name, attributes, text) {
-      var child, i, removed;
-      if (this.isRoot) {
-        throw new Error("Cannot insert elements at root level");
-      }
-      i = this.parent.children.indexOf(this);
-      removed = this.parent.children.splice(i);
-      child = this.parent.element(name, attributes, text);
-      Array.prototype.push.apply(this.parent.children, removed);
-      return child;
-    };
-
-    XMLNode.prototype.insertAfter = function(name, attributes, text) {
-      var child, i, removed;
-      if (this.isRoot) {
-        throw new Error("Cannot insert elements at root level");
-      }
-      i = this.parent.children.indexOf(this);
-      removed = this.parent.children.splice(i + 1);
-      child = this.parent.element(name, attributes, text);
-      Array.prototype.push.apply(this.parent.children, removed);
-      return child;
-    };
-
-    XMLNode.prototype.remove = function() {
-      var i, ref;
-      if (this.isRoot) {
-        throw new Error("Cannot remove the root element");
-      }
-      i = this.parent.children.indexOf(this);
-      [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref = [])), ref;
-      return this.parent;
-    };
-
-    XMLNode.prototype.node = function(name, attributes, text) {
-      var child, ref;
-      if (name != null) {
-        name = name.valueOf();
-      }
-      if (attributes == null) {
-        attributes = {};
-      }
-      attributes = attributes.valueOf();
-      if (!isObject(attributes)) {
-        ref = [attributes, text], text = ref[0], attributes = ref[1];
-      }
-      child = new XMLElement(this, name, attributes);
-      if (text != null) {
-        child.text(text);
-      }
-      this.children.push(child);
-      return child;
-    };
-
-    XMLNode.prototype.text = function(value) {
-      var child;
-      child = new XMLText(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLNode.prototype.cdata = function(value) {
-      var child;
-      child = new XMLCData(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLNode.prototype.comment = function(value) {
-      var child;
-      child = new XMLComment(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLNode.prototype.raw = function(value) {
-      var child;
-      child = new XMLRaw(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLNode.prototype.declaration = function(version, encoding, standalone) {
-      var doc, xmldec;
-      doc = this.document();
-      xmldec = new XMLDeclaration(doc, version, encoding, standalone);
-      doc.xmldec = xmldec;
-      return doc.root();
-    };
-
-    XMLNode.prototype.doctype = function(pubID, sysID) {
-      var doc, doctype;
-      doc = this.document();
-      doctype = new XMLDocType(doc, pubID, sysID);
-      doc.doctype = doctype;
-      return doctype;
-    };
-
-    XMLNode.prototype.up = function() {
-      if (this.isRoot) {
-        throw new Error("The root node has no parent. Use doc() if you need to get the document object.");
-      }
-      return this.parent;
-    };
-
-    XMLNode.prototype.root = function() {
-      var child;
-      if (this.isRoot) {
-        return this;
-      }
-      child = this.parent;
-      while (!child.isRoot) {
-        child = child.parent;
-      }
-      return child;
-    };
-
-    XMLNode.prototype.document = function() {
-      return this.root().documentObject;
-    };
-
-    XMLNode.prototype.end = function(options) {
-      return this.document().toString(options);
-    };
-
-    XMLNode.prototype.prev = function() {
-      var i;
-      if (this.isRoot) {
-        throw new Error("Root node has no siblings");
-      }
-      i = this.parent.children.indexOf(this);
-      if (i < 1) {
-        throw new Error("Already at the first node");
-      }
-      return this.parent.children[i - 1];
-    };
-
-    XMLNode.prototype.next = function() {
-      var i;
-      if (this.isRoot) {
-        throw new Error("Root node has no siblings");
-      }
-      i = this.parent.children.indexOf(this);
-      if (i === -1 || i === this.parent.children.length - 1) {
-        throw new Error("Already at the last node");
-      }
-      return this.parent.children[i + 1];
-    };
-
-    XMLNode.prototype.importXMLBuilder = function(xmlbuilder) {
-      var clonedRoot;
-      clonedRoot = xmlbuilder.root().clone();
-      clonedRoot.parent = this;
-      clonedRoot.isRoot = false;
-      this.children.push(clonedRoot);
-      return this;
-    };
-
-    XMLNode.prototype.ele = function(name, attributes, text) {
-      return this.element(name, attributes, text);
-    };
-
-    XMLNode.prototype.nod = function(name, attributes, text) {
-      return this.node(name, attributes, text);
-    };
-
-    XMLNode.prototype.txt = function(value) {
-      return this.text(value);
-    };
-
-    XMLNode.prototype.dat = function(value) {
-      return this.cdata(value);
-    };
-
-    XMLNode.prototype.com = function(value) {
-      return this.comment(value);
-    };
-
-    XMLNode.prototype.doc = function() {
-      return this.document();
-    };
-
-    XMLNode.prototype.dec = function(version, encoding, standalone) {
-      return this.declaration(version, encoding, standalone);
-    };
-
-    XMLNode.prototype.dtd = function(pubID, sysID) {
-      return this.doctype(pubID, sysID);
-    };
-
-    XMLNode.prototype.e = function(name, attributes, text) {
-      return this.element(name, attributes, text);
-    };
-
-    XMLNode.prototype.n = function(name, attributes, text) {
-      return this.node(name, attributes, text);
-    };
-
-    XMLNode.prototype.t = function(value) {
-      return this.text(value);
-    };
-
-    XMLNode.prototype.d = function(value) {
-      return this.cdata(value);
-    };
-
-    XMLNode.prototype.c = function(value) {
-      return this.comment(value);
-    };
-
-    XMLNode.prototype.r = function(value) {
-      return this.raw(value);
-    };
-
-    XMLNode.prototype.u = function() {
-      return this.up();
-    };
-
-    return XMLNode;
-
-  })();
-
-}).call(this);
-
-},{"./XMLCData":73,"./XMLComment":74,"./XMLDeclaration":79,"./XMLDocType":80,"./XMLElement":81,"./XMLRaw":84,"./XMLText":86,"lodash/lang/isEmpty":57,"lodash/lang/isFunction":58,"lodash/lang/isObject":60}],83:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLProcessingInstruction, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLProcessingInstruction = (function() {
-    function XMLProcessingInstruction(parent, target, value) {
-      this.stringify = parent.stringify;
-      if (target == null) {
-        throw new Error("Missing instruction target");
-      }
-      this.target = this.stringify.insTarget(target);
-      if (value) {
-        this.value = this.stringify.insValue(value);
-      }
-    }
-
-    XMLProcessingInstruction.prototype.clone = function() {
-      return create(XMLProcessingInstruction.prototype, this);
-    };
-
-    XMLProcessingInstruction.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<?';
-      r += this.target;
-      if (this.value) {
-        r += ' ' + this.value;
-      }
-      r += '?>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLProcessingInstruction;
-
-  })();
-
-}).call(this);
-
-},{"lodash/object/create":64}],84:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLNode, XMLRaw, create,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLRaw = (function(superClass) {
-    extend(XMLRaw, superClass);
-
-    function XMLRaw(parent, text) {
-      XMLRaw.__super__.constructor.call(this, parent);
-      if (text == null) {
-        throw new Error("Missing raw text");
-      }
-      this.value = this.stringify.raw(text);
-    }
-
-    XMLRaw.prototype.clone = function() {
-      return create(XMLRaw.prototype, this);
-    };
-
-    XMLRaw.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += this.value;
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLRaw;
-
-  })(XMLNode);
-
-}).call(this);
-
-},{"./XMLNode":82,"lodash/object/create":64}],85:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLStringifier,
-    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
-    hasProp = {}.hasOwnProperty;
-
-  module.exports = XMLStringifier = (function() {
-    function XMLStringifier(options) {
-      this.assertLegalChar = bind(this.assertLegalChar, this);
-      var key, ref, value;
-      this.allowSurrogateChars = options != null ? options.allowSurrogateChars : void 0;
-      ref = (options != null ? options.stringify : void 0) || {};
-      for (key in ref) {
-        if (!hasProp.call(ref, key)) continue;
-        value = ref[key];
-        this[key] = value;
-      }
-    }
-
-    XMLStringifier.prototype.eleName = function(val) {
-      val = '' + val || '';
-      return this.assertLegalChar(val);
-    };
-
-    XMLStringifier.prototype.eleText = function(val) {
-      val = '' + val || '';
-      return this.assertLegalChar(this.elEscape(val));
-    };
-
-    XMLStringifier.prototype.cdata = function(val) {
-      val = '' + val || '';
-      if (val.match(/]]>/)) {
-        throw new Error("Invalid CDATA text: " + val);
-      }
-      return this.assertLegalChar(val);
-    };
-
-    XMLStringifier.prototype.comment = function(val) {
-      val = '' + val || '';
-      if (val.match(/--/)) {
-        throw new Error("Comment text cannot contain double-hypen: " + val);
-      }
-      return this.assertLegalChar(val);
-    };
-
-    XMLStringifier.prototype.raw = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.attName = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.attValue = function(val) {
-      val = '' + val || '';
-      return this.attEscape(val);
-    };
-
-    XMLStringifier.prototype.insTarget = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.insValue = function(val) {
-      val = '' + val || '';
-      if (val.match(/\?>/)) {
-        throw new Error("Invalid processing instruction value: " + val);
-      }
-      return val;
-    };
-
-    XMLStringifier.prototype.xmlVersion = function(val) {
-      val = '' + val || '';
-      if (!val.match(/1\.[0-9]+/)) {
-        throw new Error("Invalid version number: " + val);
-      }
-      return val;
-    };
-
-    XMLStringifier.prototype.xmlEncoding = function(val) {
-      val = '' + val || '';
-      if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-]|-)*$/)) {
-        throw new Error("Invalid encoding: " + val);
-      }
-      return val;
-    };
-
-    XMLStringifier.prototype.xmlStandalone = function(val) {
-      if (val) {
-        return "yes";
-      } else {
-        return "no";
-      }
-    };
-
-    XMLStringifier.prototype.dtdPubID = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdSysID = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdElementValue = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdAttType = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdAttDefault = function(val) {
-      if (val != null) {
-        return '' + val || '';
-      } else {
-        return val;
-      }
-    };
-
-    XMLStringifier.prototype.dtdEntityValue = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdNData = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.convertAttKey = '@';
-
-    XMLStringifier.prototype.convertPIKey = '?';
-
-    XMLStringifier.prototype.convertTextKey = '#text';
-
-    XMLStringifier.prototype.convertCDataKey = '#cdata';
-
-    XMLStringifier.prototype.convertCommentKey = '#comment';
-
-    XMLStringifier.prototype.convertRawKey = '#raw';
-
-    XMLStringifier.prototype.assertLegalChar = function(str) {
-      var chars, chr;
-      if (this.allowSurrogateChars) {
-        chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uFFFE-\uFFFF]/;
-      } else {
-        chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE-\uFFFF]/;
-      }
-      chr = str.match(chars);
-      if (chr) {
-        throw new Error("Invalid character (" + chr + ") in string: " + str + " at index " + chr.index);
-      }
-      return str;
-    };
-
-    XMLStringifier.prototype.elEscape = function(str) {
-      return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\r/g, '&#xD;');
-    };
-
-    XMLStringifier.prototype.attEscape = function(str) {
-      return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
-    };
-
-    return XMLStringifier;
-
-  })();
-
-}).call(this);
-
-},{}],86:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLNode, XMLText, create,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLText = (function(superClass) {
-    extend(XMLText, superClass);
-
-    function XMLText(parent, text) {
-      XMLText.__super__.constructor.call(this, parent);
-      if (text == null) {
-        throw new Error("Missing element text");
-      }
-      this.value = this.stringify.eleText(text);
-    }
-
-    XMLText.prototype.clone = function() {
-      return create(XMLText.prototype, this);
-    };
-
-    XMLText.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += this.value;
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLText;
-
-  })(XMLNode);
-
-}).call(this);
-
-},{"./XMLNode":82,"lodash/object/create":64}],87:[function(require,module,exports){
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLBuilder, assign;
-
-  assign = require('lodash/object/assign');
-
-  XMLBuilder = require('./XMLBuilder');
-
-  module.exports.create = function(name, xmldec, doctype, options) {
-    options = assign({}, xmldec, doctype, options);
-    return new XMLBuilder(name, options).root();
-  };
-
-}).call(this);
-
-},{"./XMLBuilder":72,"lodash/object/assign":63}],88:[function(require,module,exports){
-function DOMParser(options){
-	this.options = options ||{locator:{}};
-	
-}
-DOMParser.prototype.parseFromString = function(source,mimeType){	
-	var options = this.options;
-	var sax =  new XMLReader();
-	var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
-	var errorHandler = options.errorHandler;
-	var locator = options.locator;
-	var defaultNSMap = options.xmlns||{};
-	var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
-	if(locator){
-		domBuilder.setDocumentLocator(locator)
-	}
-	
-	sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
-	sax.domBuilder = options.domBuilder || domBuilder;
-	if(/\/x?html?$/.test(mimeType)){
-		entityMap.nbsp = '\xa0';
-		entityMap.copy = '\xa9';
-		defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
-	}
-	if(source){
-		sax.parse(source,defaultNSMap,entityMap);
-	}else{
-		sax.errorHandler.error("invalid document source");
-	}
-	return domBuilder.document;
-}
-function buildErrorHandler(errorImpl,domBuilder,locator){
-	if(!errorImpl){
-		if(domBuilder instanceof DOMHandler){
-			return domBuilder;
-		}
-		errorImpl = domBuilder ;
-	}
-	var errorHandler = {}
-	var isCallback = errorImpl instanceof Function;
-	locator = locator||{}
-	function build(key){
-		var fn = errorImpl[key];
-		if(!fn){
-			if(isCallback){
-				fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
-			}else{
-				var i=arguments.length;
-				while(--i){
-					if(fn = errorImpl[arguments[i]]){
-						break;
-					}
-				}
-			}
-		}
-		errorHandler[key] = fn && function(msg){
-			fn(msg+_locator(locator));
-		}||function(){};
-	}
-	build('warning','warn');
-	build('error','warn','warning');
-	build('fatalError','warn','warning','error');
-	return errorHandler;
-}
-/**
- * +ContentHandler+ErrorHandler
- * +LexicalHandler+EntityResolver2
- * -DeclHandler-DTDHandler 
- * 
- * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
- * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
- * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
- */
-function DOMHandler() {
-    this.cdata = false;
-}
-function position(locator,node){
-	node.lineNumber = locator.lineNumber;
-	node.columnNumber = locator.columnNumber;
-}
-/**
- * @see org.xml.sax.ContentHandler#startDocument
- * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
- */ 
-DOMHandler.prototype = {
-	startDocument : function() {
-    	this.document = new DOMImplementation().createDocument(null, null, null);
-    	if (this.locator) {
-        	this.document.documentURI = this.locator.systemId;
-    	}
-	},
-	startElement:function(namespaceURI, localName, qName, attrs) {
-		var doc = this.document;
-	    var el = doc.createElementNS(namespaceURI, qName||localName);
-	    var len = attrs.length;
-	    appendElement(this, el);
-	    this.currentElement = el;
-	    
-		this.locator && position(this.locator,el)
-	    for (var i = 0 ; i < len; i++) {
-	        var namespaceURI = attrs.getURI(i);
-	        var value = attrs.getValue(i);
-	        var qName = attrs.getQName(i);
-			var attr = doc.createAttributeNS(namespaceURI, qName);
-			if( attr.getOffset){
-				position(attr.getOffset(1),attr)
-			}
-			attr.value = attr.nodeValue = value;
-			el.setAttributeNode(attr)
-	    }
-	},
-	endElement:function(namespaceURI, localName, qName) {
-		var current = this.currentElement
-	    var tagName = current.tagName;
-	    this.currentElement = current.parentNode;
-	},
-	startPrefixMapping:function(prefix, uri) {
-	},
-	endPrefixMapping:function(prefix) {
-	},
-	processingInstruction:function(target, data) {
-	    var ins = this.document.createProcessingInstruction(target, data);
-	    this.locator && position(this.locator,ins)
-	    appendElement(this, ins);
-	},
-	ignorableWhitespace:function(ch, start, length) {
-	},
-	characters:function(chars, start, length) {
-		chars = _toString.apply(this,arguments)
-		//console.log(chars)
-		if(this.currentElement && chars){
-			if (this.cdata) {
-				var charNode = this.document.createCDATASection(chars);
-				this.currentElement.appendChild(charNode);
-			} else {
-				var charNode = this.document.createTextNode(chars);
-				this.currentElement.appendChild(charNode);
-			}
-			this.locator && position(this.locator,charNode)
-		}
-	},
-	skippedEntity:function(name) {
-	},
-	endDocument:function() {
-		this.document.normalize();
-	},
-	setDocumentLocator:function (locator) {
-	    if(this.locator = locator){// && !('lineNumber' in locator)){
-	    	locator.lineNumber = 0;
-	    }
-	},
-	//LexicalHandler
-	comment:function(chars, start, length) {
-		chars = _toString.apply(this,arguments)
-	    var comm = this.document.createComment(chars);
-	    this.locator && position(this.locator,comm)
-	    appendElement(this, comm);
-	},
-	
-	startCDATA:function() {
-	    //used in characters() methods
-	    this.cdata = true;
-	},
-	endCDATA:function() {
-	    this.cdata = false;
-	},
-	
-	startDTD:function(name, publicId, systemId) {
-		var impl = this.document.implementation;
-	    if (impl && impl.createDocumentType) {
-	        var dt = impl.createDocumentType(name, publicId, systemId);
-	        this.locator && position(this.locator,dt)
-	        appendElement(this, dt);
-	    }
-	},
-	/**
-	 * @see org.xml.sax.ErrorHandler
-	 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
-	 */
-	warning:function(error) {
-		console.warn(error,_locator(this.locator));
-	},
-	error:function(error) {
-		console.error(error,_locator(this.locator));
-	},
-	fatalError:function(error) {
-		console.error(error,_locator(this.locator));
-	    throw error;
-	}
-}
-function _locator(l){
-	if(l){
-		return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
-	}
-}
-function _toString(chars,start,length){
-	if(typeof chars == 'string'){
-		return chars.substr(start,length)
-	}else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
-		if(chars.length >= start+length || start){
-			return new java.lang.String(chars,start,length)+'';
-		}
-		return chars;
-	}
-}
-
-/*
- * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
- * used method of org.xml.sax.ext.LexicalHandler:
- *  #comment(chars, start, length)
- *  #startCDATA()
- *  #endCDATA()
- *  #startDTD(name, publicId, systemId)
- *
- *
- * IGNORED method of org.xml.sax.ext.LexicalHandler:
- *  #endDTD()
- *  #startEntity(name)
- *  #endEntity(name)
- *
- *
- * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
- * IGNORED method of org.xml.sax.ext.DeclHandler
- * 	#attributeDecl(eName, aName, type, mode, value)
- *  #elementDecl(name, model)
- *  #externalEntityDecl(name, publicId, systemId)
- *  #internalEntityDecl(name, value)
- * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
- * IGNORED method of org.xml.sax.EntityResolver2
- *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
- *  #resolveEntity(publicId, systemId)
- *  #getExternalSubset(name, baseURI)
- * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
- * IGNORED method of org.xml.sax.DTDHandler
- *  #notationDecl(name, publicId, systemId) {};
- *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
- */
-"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
-	DOMHandler.prototype[key] = function(){return null}
-})
-
-/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
-function appendElement (hander,node) {
-    if (!hander.currentElement) {
-        hander.document.appendChild(node);
-    } else {
-        hander.currentElement.appendChild(node);
-    }
-}//appendChild and setAttributeNS are preformance key
-
-if(typeof require == 'function'){
-	var XMLReader = require('./sax').XMLReader;
-	var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;
-	exports.XMLSerializer = require('./dom').XMLSerializer ;
-	exports.DOMParser = DOMParser;
-}
-
-},{"./dom":89,"./sax":90}],89:[function(require,module,exports){
-/*
- * DOM Level 2
- * Object DOMException
- * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
- * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
- */
-
-function copy(src,dest){
-	for(var p in src){
-		dest[p] = src[p];
-	}
-}
-/**
-^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
-^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
- */
-function _extends(Class,Super){
-	var pt = Class.prototype;
-	if(Object.create){
-		var ppt = Object.create(Super.prototype)
-		pt.__proto__ = ppt;
-	}
-	if(!(pt instanceof Super)){
-		function t(){};
-		t.prototype = Super.prototype;
-		t = new t();
-		copy(pt,t);
-		Class.prototype = pt = t;
-	}
-	if(pt.constructor != Class){
-		if(typeof Class != 'function'){
-			console.error("unknow Class:"+Class)
-		}
-		pt.constructor = Class
-	}
-}
-var htmlns = 'http://www.w3.org/1999/xhtml' ;
-// Node Types
-var NodeType = {}
-var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
-var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
-var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
-var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
-var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
-var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
-var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
-var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
-var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
-var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
-var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
-var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
-
-// ExceptionCode
-var ExceptionCode = {}
-var ExceptionMessage = {};
-var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
-var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
-var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
-var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
-var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
-var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
-var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
-var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
-var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
-var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
-//level2
-var INVALID_STATE_ERR        	= ExceptionCode.INVALID_STATE_ERR        	= ((ExceptionMessage[11]="Invalid state"),11);
-var SYNTAX_ERR               	= ExceptionCode.SYNTAX_ERR               	= ((ExceptionMessage[12]="Syntax error"),12);
-var INVALID_MODIFICATION_ERR 	= ExceptionCode.INVALID_MODIFICATION_ERR 	= ((ExceptionMessage[13]="Invalid modification"),13);
-var NAMESPACE_ERR            	= ExceptionCode.NAMESPACE_ERR           	= ((ExceptionMessage[14]="Invalid namespace"),14);
-var INVALID_ACCESS_ERR       	= ExceptionCode.INVALID_ACCESS_ERR      	= ((ExceptionMessage[15]="Invalid access"),15);
-
-
-function DOMException(code, message) {
-	if(message instanceof Error){
-		var error = message;
-	}else{
-		error = this;
-		Error.call(this, ExceptionMessage[code]);
-		this.message = ExceptionMessage[code];
-		if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
-	}
-	error.code = code;
-	if(message) this.message = this.message + ": " + message;
-	return error;
-};
-DOMException.prototype = Error.prototype;
-copy(ExceptionCode,DOMException)
-/**
- * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
- * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
- * The items in the NodeList are accessible via an integral index, starting from 0.
- */
-function NodeList() {
-};
-NodeList.prototype = {
-	/**
-	 * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
-	 * @standard level1
-	 */
-	length:0, 
-	/**
-	 * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
-	 * @standard level1
-	 * @param index  unsigned long 
-	 *   Index into the collection.
-	 * @return Node
-	 * 	The node at the indexth position in the NodeList, or null if that is not a valid index. 
-	 */
-	item: function(index) {
-		return this[index] || null;
-	}
-};
-function LiveNodeList(node,refresh){
-	this._node = node;
-	this._refresh = refresh
-	_updateLiveList(this);
-}
-function _updateLiveList(list){
-	var inc = list._node._inc || list._node.ownerDocument._inc;
-	if(list._inc != inc){
-		var ls = list._refresh(list._node);
-		//console.log(ls.length)
-		__set__(list,'length',ls.length);
-		copy(ls,list);
-		list._inc = inc;
-	}
-}
-LiveNodeList.prototype.item = function(i){
-	_updateLiveList(this);
-	return this[i];
-}
-
-_extends(LiveNodeList,NodeList);
-/**
- * 
- * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
- * NamedNodeMap objects in the DOM are live.
- * used for attributes or DocumentType entities 
- */
-function NamedNodeMap() {
-};
-
-function _findNodeIndex(list,node){
-	var i = list.length;
-	while(i--){
-		if(list[i] === node){return i}
-	}
-}
-
-function _addNamedNode(el,list,newAttr,oldAttr){
-	if(oldAttr){
-		list[_findNodeIndex(list,oldAttr)] = newAttr;
-	}else{
-		list[list.length++] = newAttr;
-	}
-	if(el){
-		newAttr.ownerElement = el;
-		var doc = el.ownerDocument;
-		if(doc){
-			oldAttr && _onRemoveAttribute(doc,el,oldAttr);
-			_onAddAttribute(doc,el,newAttr);
-		}
-	}
-}
-function _removeNamedNode(el,list,attr){
-	var i = _findNodeIndex(list,attr);
-	if(i>=0){
-		var lastIndex = list.length-1
-		while(i<lastIndex){
-			list[i] = list[++i]
-		}
-		list.length = lastIndex;
-		if(el){
-			var doc = el.ownerDocument;
-			if(doc){
-				_onRemoveAttribute(doc,el,attr);
-				attr.ownerElement = null;
-			}
-		}
-	}else{
-		throw DOMException(NOT_FOUND_ERR,new Error())
-	}
-}
-NamedNodeMap.prototype = {
-	length:0,
-	item:NodeList.prototype.item,
-	getNamedItem: function(key) {
-//		if(key.indexOf(':')>0 || key == 'xmlns'){
-//			return null;
-//		}
-		var i = this.length;
-		while(i--){
-			var attr = this[i];
-			if(attr.nodeName == key){
-				return attr;
-			}
-		}
-	},
-	setNamedItem: function(attr) {
-		var el = attr.ownerElement;
-		if(el && el!=this._ownerElement){
-			throw new DOMException(INUSE_ATTRIBUTE_ERR);
-		}
-		var oldAttr = this.getNamedItem(attr.nodeName);
-		_addNamedNode(this._ownerElement,this,attr,oldAttr);
-		return oldAttr;
-	},
-	/* returns Node */
-	setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
-		var el = attr.ownerElement, oldAttr;
-		if(el && el!=this._ownerElement){
-			throw new DOMException(INUSE_ATTRIBUTE_ERR);
-		}
-		oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
-		_addNamedNode(this._ownerElement,this,attr,oldAttr);
-		return oldAttr;
-	},
-
-	/* returns Node */
-	removeNamedItem: function(key) {
-		var attr = this.getNamedItem(key);
-		_removeNamedNode(this._ownerElement,this,attr);
-		return attr;
-		
-		
-	},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
-	
-	//for level2
-	removeNamedItemNS:function(namespaceURI,localName){
-		var attr = this.getNamedItemNS(namespaceURI,localName);
-		_removeNamedNode(this._ownerElement,this,attr);
-		return attr;
-	},
-	getNamedItemNS: function(namespaceURI, localName) {
-		var i = this.length;
-		while(i--){
-			var node = this[i];
-			if(node.localName == localName && node.namespaceURI == namespaceURI){
-				return node;
-			}
-		}
-		return null;
-	}
-};
-/**
- * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
- */
-function DOMImplementation(/* Object */ features) {
-	this._features = {};
-	if (features) {
-		for (var feature in features) {
-			 this._features = features[feature];
-		}
-	}
-};
-
-DOMImplementation.prototype = {
-	hasFeature: function(/* string */ feature, /* string */ version) {
-		var versions = this._features[feature.toLowerCase()];
-		if (versions && (!version || version in versions)) {
-			return true;
-		} else {
-			return false;
-		}
-	},
-	// Introduced in DOM Level 2:
-	createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
-		var doc = new Document();
-		doc.doctype = doctype;
-		if(doctype){
-			doc.appendChild(doctype);
-		}
-		doc.implementation = this;
-		doc.childNodes = new NodeList();
-		if(qualifiedName){
-			var root = doc.createElementNS(namespaceURI,qualifiedName);
-			doc.appendChild(root);
-		}
-		return doc;
-	},
-	// Introduced in DOM Level 2:
-	createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
-		var node = new DocumentType();
-		node.name = qualifiedName;
-		node.nodeName = qualifiedName;
-		node.publicId = publicId;
-		node.systemId = systemId;
-		// Introduced in DOM Level 2:
-		//readonly attribute DOMString        internalSubset;
-		
-		//TODO:..
-		//  readonly attribute NamedNodeMap     entities;
-		//  readonly attribute NamedNodeMap     notations;
-		return node;
-	}
-};
-
-
-/**
- * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
- */
-
-function Node() {
-};
-
-Node.prototype = {
-	firstChild : null,
-	lastChild : null,
-	previousSibling : null,
-	nextSibling : null,
-	attributes : null,
-	parentNode : null,
-	childNodes : null,
-	ownerDocument : null,
-	nodeValue : null,
-	namespaceURI : null,
-	prefix : null,
-	localName : null,
-	// Modified in DOM Level 2:
-	insertBefore:function(newChild, refChild){//raises 
-		return _insertBefore(this,newChild,refChild);
-	},
-	replaceChild:function(newChild, oldChild){//raises 
-		this.insertBefore(newChild,oldChild);
-		if(oldChild){
-			this.removeChild(oldChild);
-		}
-	},
-	removeChild:function(oldChild){
-		return _removeChild(this,oldChild);
-	},
-	appendChild:function(newChild){
-		return this.insertBefore(newChild,null);
-	},
-	hasChildNodes:function(){
-		return this.firstChild != null;
-	},
-	cloneNode:function(deep){
-		return cloneNode(this.ownerDocument||this,this,deep);
-	},
-	// Modified in DOM Level 2:
-	normalize:function(){
-		var child = this.firstChild;
-		while(child){
-			var next = child.nextSibling;
-			if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
-				this.removeChild(next);
-				child.appendData(next.data);
-			}else{
-				child.normalize();
-				child = next;
-			}
-		}
-	},
-  	// Introduced in DOM Level 2:
-	isSupported:function(feature, version){
-		return this.ownerDocument.implementation.hasFeature(feature,version);
-	},
-    // Introduced in DOM Level 2:
-    hasAttributes:function(){
-    	return this.attributes.length>0;
-    },
-    lookupPrefix:function(namespaceURI){
-    	var el = this;
-    	while(el){
-    		var map = el._nsMap;
-    		//console.dir(map)
-    		if(map){
-    			for(var n in map){
-    				if(map[n] == namespaceURI){
-    					return n;
-    				}
-    			}
-    		}
-    		el = el.nodeType == 2?el.ownerDocument : el.parentNode;
-    	}
-    	return null;
-    },
-    // Introduced in DOM Level 3:
-    lookupNamespaceURI:function(prefix){
-    	var el = this;
-    	while(el){
-    		var map = el._nsMap;
-    		//console.dir(map)
-    		if(map){
-    			if(prefix in map){
-    				return map[prefix] ;
-    			}
-    		}
-    		el = el.nodeType == 2?el.ownerDocument : el.parentNode;
-    	}
-    	return null;
-    },
-    // Introduced in DOM Level 3:
-    isDefaultNamespace:function(namespaceURI){
-    	var prefix = this.lookupPrefix(namespaceURI);
-    	return prefix == null;
-    }
-};
-
-
-function _xmlEncoder(c){
-	return c == '<' && '&lt;' ||
-         c == '>' && '&gt;' ||
-         c == '&' && '&amp;' ||
-         c == '"' && '&quot;' ||
-         '&#'+c.charCodeAt()+';'
-}
-
-
-copy(NodeType,Node);
-copy(NodeType,Node.prototype);
-
-/**
- * @param callback return true for continue,false for break
- * @return boolean true: break visit;
- */
-function _visitNode(node,callback){
-	if(callback(node)){
-		return true;
-	}
-	if(node = node.firstChild){
-		do{
-			if(_visitNode(node,callback)){return true}
-        }while(node=node.nextSibling)
-    }
-}
-
-
-
-function Document(){
-}
-function _onAddAttribute(doc,el,newAttr){
-	doc && doc._inc++;
-	var ns = newAttr.namespaceURI ;
-	if(ns == 'http://www.w3.org/2000/xmlns/'){
-		//update namespace
-		el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value
-	}
-}
-function _onRemoveAttribute(doc,el,newAttr,remove){
-	doc && doc._inc++;
-	var ns = newAttr.namespaceURI ;
-	if(ns == 'http://www.w3.org/2000/xmlns/'){
-		//update namespace
-		delete el._nsMap[newAttr.prefix?newAttr.localName:'']
-	}
-}
-function _onUpdateChild(doc,el,newChild){
-	if(doc && doc._inc){
-		doc._inc++;
-		//update childNodes
-		var cs = el.childNodes;
-		if(newChild){
-			cs[cs.length++] = newChild;
-		}else{
-			//console.log(1)
-			var child = el.firstChild;
-			var i = 0;
-			while(child){
-				cs[i++] = child;
-				child =child.nextSibling;
-			}
-			cs.length = i;
-		}
-	}
-}
-
-/**
- * attributes;
- * children;
- * 
- * writeable properties:
- * nodeValue,Attr:value,CharacterData:data
- * prefix
- */
-function _removeChild(parentNode,child){
-	var previous = child.previousSibling;
-	var next = child.nextSibling;
-	if(previous){
-		previous.nextSibling = next;
-	}else{
-		parentNode.firstChild = next
-	}
-	if(next){
-		next.previousSibling = previous;
-	}else{
-		parentNode.lastChild = previous;
-	}
-	_onUpdateChild(parentNode.ownerDocument,parentNode);
-	return child;
-}
-/**
- * preformance key(refChild == null)
- */
-function _insertBefore(parentNode,newChild,nextChild){
-	var cp = newChild.parentNode;
-	if(cp){
-		cp.removeChild(newChild);//remove and update
-	}
-	if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
-		var newFirst = newChild.firstChild;
-		if (newFirst == null) {
-			return newChild;
-		}
-		var newLast = newChild.lastChild;
-	}else{
-		newFirst = newLast = newChild;
-	}
-	var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
-
-	newFirst.previousSibling = pre;
-	newLast.nextSibling = nextChild;
-	
-	
-	if(pre){
-		pre.nextSibling = newFirst;
-	}else{
-		parentNode.firstChild = newFirst;
-	}
-	if(nextChild == null){
-		parentNode.lastChild = newLast;
-	}else{
-		nextChild.previousSibling = newLast;
-	}
-	do{
-		newFirst.parentNode = parentNode;
-	}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
-	_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
-	//console.log(parentNode.lastChild.nextSibling == null)
-	if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
-		newChild.firstChild = newChild.lastChild = null;
-	}
-	return newChild;
-}
-function _appendSingleChild(parentNode,newChild){
-	var cp = newChild.parentNode;
-	if(cp){
-		var pre = parentNode.lastChild;
-		cp.removeChild(newChild);//remove and update
-		var pre = parentNode.lastChild;
-	}
-	var pre = parentNode.lastChild;
-	newChild.parentNode = parentNode;
-	newChild.previousSibling = pre;
-	newChild.nextSibling = null;
-	if(pre){
-		pre.nextSibling = newChild;
-	}else{
-		parentNode.firstChild = newChild;
-	}
-	parentNode.lastChild = newChild;
-	_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
-	return newChild;
-	//console.log("__aa",parentNode.lastChild.nextSibling == null)
-}
-Document.prototype = {
-	//implementation : null,
-	nodeName :  '#document',
-	nodeType :  DOCUMENT_NODE,
-	doctype :  null,
-	documentElement :  null,
-	_inc : 1,
-	
-	insertBefore :  function(newChild, refChild){//raises 
-		if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
-			var child = newChild.firstChild;
-			while(child){
-				var next = child.nextSibling;
-				this.insertBefore(child,refChild);
-				child = next;
-			}
-			return newChild;
-		}
-		if(this.documentElement == null && newChild.nodeType == 1){
-			this.documentElement = newChild;
-		}
-		
-		return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
-	},
-	removeChild :  function(oldChild){
-		if(this.documentElement == oldChild){
-			this.documentElement = null;
-		}
-		return _removeChild(this,oldChild);
-	},
-	// Introduced in DOM Level 2:
-	importNode : function(importedNode,deep){
-		return importNode(this,importedNode,deep);
-	},
-	// Introduced in DOM Level 2:
-	getElementById :	function(id){
-		var rtv = null;
-		_visitNode(this.documentElement,function(node){
-			if(node.nodeType == 1){
-				if(node.getAttribute('id') == id){
-					rtv = node;
-					return true;
-				}
-			}
-		})
-		return rtv;
-	},
-	
-	//document factory method:
-	createElement :	function(tagName){
-		var node = new Element();
-		node.ownerDocument = this;
-		node.nodeName = tagName;
-		node.tagName = tagName;
-		node.childNodes = new NodeList();
-		var attrs	= node.attributes = new NamedNodeMap();
-		attrs._ownerElement = node;
-		return node;
-	},
-	createDocumentFragment :	function(){
-		var node = new DocumentFragment();
-		node.ownerDocument = this;
-		node.childNodes = new NodeList();
-		return node;
-	},
-	createTextNode :	function(data){
-		var node = new Text();
-		node.ownerDocument = this;
-		node.appendData(data)
-		return node;
-	},
-	createComment :	function(data){
-		var node = new Comment();
-		node.ownerDocument = this;
-		node.appendData(data)
-		return node;
-	},
-	createCDATASection :	function(data){
-		var node = new CDATASection();
-		node.ownerDocument = this;
-		node.appendData(data)
-		return node;
-	},
-	createProcessingInstruction :	function(target,data){
-		var node = new ProcessingInstruction();
-		node.ownerDocument = this;
-		node.tagName = node.target = target;
-		node.nodeValue= node.data = data;
-		return node;
-	},
-	createAttribute :	function(name){
-		var node = new Attr();
-		node.ownerDocument	= this;
-		node.name = name;
-		node.nodeName	= name;
-		node.localName = name;
-		node.specified = true;
-		return node;
-	},
-	createEntityReference :	function(name){
-		var node = new EntityReference();
-		node.ownerDocument	= this;
-		node.nodeName	= name;
-		return node;
-	},
-	// Introduced in DOM Level 2:
-	createElementNS :	function(namespaceURI,qualifiedName){
-		var node = new Element();
-		var pl = qualifiedName.split(':');
-		var attrs	= node.attributes = new NamedNodeMap();
-		node.childNodes = new NodeList();
-		node.ownerDocument = this;
-		node.nodeName = qualifiedName;
-		node.tagName = qualifiedName;
-		node.namespaceURI = namespaceURI;
-		if(pl.length == 2){
-			node.prefix = pl[0];
-			node.localName = pl[1];
-		}else{
-			//el.prefix = null;
-			node.localName = qualifiedName;
-		}
-		attrs._ownerElement = node;
-		return node;
-	},
-	// Introduced in DOM Level 2:
-	createAttributeNS :	function(namespaceURI,qualifiedName){
-		var node = new Attr();
-		var pl = qualifiedName.split(':');
-		node.ownerDocument = this;
-		node.nodeName = qualifiedName;
-		node.name = qualifiedName;
-		node.namespaceURI = namespaceURI;
-		node.specified = true;
-		if(pl.length == 2){
-			node.prefix = pl[0];
-			node.localName = pl[1];
-		}else{
-			//el.prefix = null;
-			node.localName = qualifiedName;
-		}
-		return node;
-	}
-};
-_extends(Document,Node);
-
-
-function Element() {
-	this._nsMap = {};
-};
-Element.prototype = {
-	nodeType : ELEMENT_NODE,
-	hasAttribute : function(name){
-		return this.getAttributeNode(name)!=null;
-	},
-	getAttribute : function(name){
-		var attr = this.getAttributeNode(name);
-		return attr && attr.value || '';
-	},
-	getAttributeNode : function(name){
-		return this.attributes.getNamedItem(name);
-	},
-	setAttribute : function(name, value){
-		var attr = this.ownerDocument.createAttribute(name);
-		attr.value = attr.nodeValue = "" + value;
-		this.setAttributeNode(attr)
-	},
-	removeAttribute : function(name){
-		var attr = this.getAttributeNode(name)
-		attr && this.removeAttributeNode(attr);
-	},
-	
-	//four real opeartion method
-	appendChild:function(newChild){
-		if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
-			return this.insertBefore(newChild,null);
-		}else{
-			return _appendSingleChild(this,newChild);
-		}
-	},
-	setAttributeNode : function(newAttr){
-		return this.attributes.setNamedItem(newAttr);
-	},
-	setAttributeNodeNS : function(newAttr){
-		return this.attributes.setNamedItemNS(newAttr);
-	},
-	removeAttributeNode : function(oldAttr){
-		return this.attributes.removeNamedItem(oldAttr.nodeName);
-	},
-	//get real attribute name,and remove it by removeAttributeNode
-	removeAttributeNS : function(namespaceURI, localName){
-		var old = this.getAttributeNodeNS(namespaceURI, localName);
-		old && this.removeAttributeNode(old);
-	},
-	
-	hasAttributeNS : function(namespaceURI, localName){
-		return this.getAttributeNodeNS(namespaceURI, localName)!=null;
-	},
-	getAttributeNS : function(namespaceURI, localName){
-		var attr = this.getAttributeNodeNS(namespaceURI, localName);
-		return attr && attr.value || '';
-	},
-	setAttributeNS : function(namespaceURI, qualifiedName, value){
-		var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
-		attr.value = attr.nodeValue = value;
-		this.setAttributeNode(attr)
-	},
-	getAttributeNodeNS : function(namespaceURI, localName){
-		return this.attributes.getNamedItemNS(namespaceURI, localName);
-	},
-	
-	getElementsByTagName : function(tagName){
-		return new LiveNodeList(this,function(base){
-			var ls = [];
-			_visitNode(base,function(node){
-				if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
-					ls.push(node);
-				}
-			});
-			return ls;
-		});
-	},
-	getElementsByTagNameNS : function(namespaceURI, localName){
-		return new LiveNodeList(this,function(base){
-			var ls = [];
-			_visitNode(base,function(node){
-				if(node !== base && node.nodeType === ELEMENT_NODE && node.namespaceURI === namespaceURI && (localName === '*' || node.localName == localName)){
-					ls.push(node);
-				}
-			});
-			return ls;
-		});
-	}
-};
-Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
-Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
-
-
-_extends(Element,Node);
-function Attr() {
-};
-Attr.prototype.nodeType = ATTRIBUTE_NODE;
-_extends(Attr,Node);
-
-
-function CharacterData() {
-};
-CharacterData.prototype = {
-	data : '',
-	substringData : function(offset, count) {
-		return this.data.substring(offset, offset+count);
-	},
-	appendData: function(text) {
-		text = this.data+text;
-		this.nodeValue = this.data = text;
-		this.length = text.length;
-	},
-	insertData: function(offset,text) {
-		this.replaceData(offset,0,text);
-	
-	},
-	appendChild:function(newChild){
-		//if(!(newChild instanceof CharacterData)){
-			throw new Error(ExceptionMessage[3])
-		//}
-		return Node.prototype.appendChild.apply(this,arguments)
-	},
-	deleteData: function(offset, count) {
-		this.replaceData(offset,count,"");
-	},
-	replaceData: function(offset, count, text) {
-		var start = this.data.substring(0,offset);
-		var end = this.data.substring(offset+count);
-		text = start + text + end;
-		this.nodeValue = this.data = text;
-		this.length = text.length;
-	}
-}
-_extends(CharacterData,Node);
-function Text() {
-};
-Text.prototype = {
-	nodeName : "#text",
-	nodeType : TEXT_NODE,
-	splitText : function(offset) {
-		var text = this.data;
-		var newText = text.substring(offset);
-		text = text.substring(0, offset);
-		this.data = this.nodeValue = text;
-		this.length = text.length;
-		var newNode = this.ownerDocument.createTextNode(newText);
-		if(this.parentNode){
-			this.parentNode.insertBefore(newNode, this.nextSibling);
-		}
-		return newNode;
-	}
-}
-_extends(Text,CharacterData);
-function Comment() {
-};
-Comment.prototype = {
-	nodeName : "#comment",
-	nodeType : COMMENT_NODE
-}
-_extends(Comment,CharacterData);
-
-function CDATASection() {
-};
-CDATASection.prototype = {
-	nodeName : "#cdata-section",
-	nodeType : CDATA_SECTION_NODE
-}
-_extends(CDATASection,CharacterData);
-
-
-function DocumentType() {
-};
-DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
-_extends(DocumentType,Node);
-
-function Notation() {
-};
-Notation.prototype.nodeType = NOTATION_NODE;
-_extends(Notation,Node);
-
-function Entity() {
-};
-Entity.prototype.nodeType = ENTITY_NODE;
-_extends(Entity,Node);
-
-function EntityReference() {
-};
-EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
-_extends(EntityReference,Node);
-
-function DocumentFragment() {
-};
-DocumentFragment.prototype.nodeName =	"#document-fragment";
-DocumentFragment.prototype.nodeType =	DOCUMENT_FRAGMENT_NODE;
-_extends(DocumentFragment,Node);
-
-
-function ProcessingInstruction() {
-}
-ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
-_extends(ProcessingInstruction,Node);
-function XMLSerializer(){}
-XMLSerializer.prototype.serializeToString = function(node){
-	var buf = [];
-	serializeToString(node,buf);
-	return buf.join('');
-}
-Node.prototype.toString =function(){
-	return XMLSerializer.prototype.serializeToString(this);
-}
-function serializeToString(node,buf){
-	switch(node.nodeType){
-	case ELEMENT_NODE:
-		var attrs = node.attributes;
-		var len = attrs.length;
-		var child = node.firstChild;
-		var nodeName = node.tagName;
-		var isHTML = htmlns === node.namespaceURI
-		buf.push('<',nodeName);
-		for(var i=0;i<len;i++){
-			serializeToString(attrs.item(i),buf,isHTML);
-		}
-		if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
-			buf.push('>');
-			//if is cdata child node
-			if(isHTML && /^script$/i.test(nodeName)){
-				if(child){
-					buf.push(child.data);
-				}
-			}else{
-				while(child){
-					serializeToString(child,buf);
-					child = child.nextSibling;
-				}
-			}
-			buf.push('</',nodeName,'>');
-		}else{
-			buf.push('/>');
-		}
-		return;
-	case DOCUMENT_NODE:
-	case DOCUMENT_FRAGMENT_NODE:
-		var child = node.firstChild;
-		while(child){
-			serializeToString(child,buf);
-			child = child.nextSibling;
-		}
-		return;
-	case ATTRIBUTE_NODE:
-		return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
-	case TEXT_NODE:
-		return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
-	case CDATA_SECTION_NODE:
-		return buf.push( '<![CDATA[',node.data,']]>');
-	case COMMENT_NODE:
-		return buf.push( "<!--",node.data,"-->");
-	case DOCUMENT_TYPE_NODE:
-		var pubid = node.publicId;
-		var sysid = node.systemId;
-		buf.push('<!DOCTYPE ',node.name);
-		if(pubid){
-			buf.push(' PUBLIC "',pubid);
-			if (sysid && sysid!='.') {
-				buf.push( '" "',sysid);
-			}
-			buf.push('">');
-		}else if(sysid && sysid!='.'){
-			buf.push(' SYSTEM "',sysid,'">');
-		}else{
-			var sub = node.internalSubset;
-			if(sub){
-				buf.push(" [",sub,"]");
-			}
-			buf.push(">");
-		}
-		return;
-	case PROCESSING_INSTRUCTION_NODE:
-		return buf.push( "<?",node.target," ",node.data,"?>");
-	case ENTITY_REFERENCE_NODE:
-		return buf.push( '&',node.nodeName,';');
-	//case ENTITY_NODE:
-	//case NOTATION_NODE:
-	default:
-		buf.push('??',node.nodeName);
-	}
-}
-function importNode(doc,node,deep){
-	var node2;
-	switch (node.nodeType) {
-	case ELEMENT_NODE:
-		node2 = node.cloneNode(false);
-		node2.ownerDocument = doc;
-		//var attrs = node2.attributes;
-		//var len = attrs.length;
-		//for(var i=0;i<len;i++){
-			//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
-		//}
-	case DOCUMENT_FRAGMENT_NODE:
-		break;
-	case ATTRIBUTE_NODE:
-		deep = true;
-		break;
-	//case ENTITY_REFERENCE_NODE:
-	//case PROCESSING_INSTRUCTION_NODE:
-	////case TEXT_NODE:
-	//case CDATA_SECTION_NODE:
-	//case COMMENT_NODE:
-	//	deep = false;
-	//	break;
-	//case DOCUMENT_NODE:
-	//case DOCUMENT_TYPE_NODE:
-	//cannot be imported.
-	//case ENTITY_NODE:
-	//case NOTATION_NODE:
-	//can not hit in level3
-	//default:throw e;
-	}
-	if(!node2){
-		node2 = node.cloneNode(false);//false
-	}
-	node2.ownerDocument = doc;
-	node2.parentNode = null;
-	if(deep){
-		var child = node.firstChild;
-		while(child){
-			node2.appendChild(importNode(doc,child,deep));
-			child = child.nextSibling;
-		}
-	}
-	return node2;
-}
-//
-//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
-//					attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
-function cloneNode(doc,node,deep){
-	var node2 = new node.constructor();
-	for(var n in node){
-		var v = node[n];
-		if(typeof v != 'object' ){
-			if(v != node2[n]){
-				node2[n] = v;
-			}
-		}
-	}
-	if(node.childNodes){
-		node2.childNodes = new NodeList();
-	}
-	node2.ownerDocument = doc;
-	switch (node2.nodeType) {
-	case ELEMENT_NODE:
-		var attrs	= node.attributes;
-		var attrs2	= node2.attributes = new NamedNodeMap();
-		var len = attrs.length
-		attrs2._ownerElement = node2;
-		for(var i=0;i<len;i++){
-			node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
-		}
-		break;;
-	case ATTRIBUTE_NODE:
-		deep = true;
-	}
-	if(deep){
-		var child = node.firstChild;
-		while(child){
-			node2.appendChild(cloneNode(doc,child,deep));
-			child = child.nextSibling;
-		}
-	}
-	return node2;
-}
-
-function __set__(object,key,value){
-	object[key] = value
-}
-//do dynamic
-try{
-	if(Object.defineProperty){
-		Object.defineProperty(LiveNodeList.prototype,'length',{
-			get:function(){
-				_updateLiveList(this);
-				return this.$$length;
-			}
-		});
-		Object.defineProperty(Node.prototype,'textContent',{
-			get:function(){
-				return getTextContent(this);
-			},
-			set:function(data){
-				switch(this.nodeType){
-				case 1:
-				case 11:
-					while(this.firstChild){
-						this.removeChild(this.firstChild);
-					}
-					if(data || String(data)){
-						this.appendChild(this.ownerDocument.createTextNode(data));
-					}
-					break;
-				default:
-					//TODO:
-					this.data = data;
-					this.value = value;
-					this.nodeValue = data;
-				}
-			}
-		})
-		
-		function getTextContent(node){
-			switch(node.nodeType){
-			case 1:
-			case 11:
-				var buf = [];
-				node = node.firstChild;
-				while(node){
-					if(node.nodeType!==7 && node.nodeType !==8){
-						buf.push(getTextContent(node));
-					}
-					node = node.nextSibling;
-				}
-				return buf.join('');
-			default:
-				return node.nodeValue;
-			}
-		}
-		__set__ = function(object,key,value){
-			//console.log(value)
-			object['$$'+key] = value
-		}
-	}
-}catch(e){//ie8
-}
-
-if(typeof require == 'function'){
-	exports.DOMImplementation = DOMImplementation;
-	exports.XMLSerializer = XMLSerializer;
-}
-
-},{}],90:[function(require,module,exports){
-//[4]   	NameStartChar	   ::=   	":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
-//[4a]   	NameChar	   ::=   	NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
-//[5]   	Name	   ::=   	NameStartChar (NameChar)*
-var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF
-var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\u00B7\u0300-\u036F\\ux203F-\u2040]");
-var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
-//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
-//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
-
-//S_TAG,	S_ATTR,	S_EQ,	S_V
-//S_ATTR_S,	S_E,	S_S,	S_C
-var S_TAG = 0;//tag name offerring
-var S_ATTR = 1;//attr name offerring 
-var S_ATTR_S=2;//attr name end and space offer
-var S_EQ = 3;//=space?
-var S_V = 4;//attr value(no quot value only)
-var S_E = 5;//attr value end and no space(quot end)
-var S_S = 6;//(attr value end || tag end ) && (space offer)
-var S_C = 7;//closed el<el />
-
-function XMLReader(){
-	
-}
-
-XMLReader.prototype = {
-	parse:function(source,defaultNSMap,entityMap){
-		var domBuilder = this.domBuilder;
-		domBuilder.startDocument();
-		_copy(defaultNSMap ,defaultNSMap = {})
-		parse(source,defaultNSMap,entityMap,
-				domBuilder,this.errorHandler);
-		domBuilder.endDocument();
-	}
-}
-function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
-  function fixedFromCharCode(code) {
-		// String.prototype.fromCharCode does not supports
-		// > 2 bytes unicode chars directly
-		if (code > 0xffff) {
-			code -= 0x10000;
-			var surrogate1 = 0xd800 + (code >> 10)
-				, surrogate2 = 0xdc00 + (code & 0x3ff);
-
-			return String.fromCharCode(surrogate1, surrogate2);
-		} else {
-			return String.fromCharCode(code);
-		}
-	}
-	function entityReplacer(a){
-		var k = a.slice(1,-1);
-		if(k in entityMap){
-			return entityMap[k]; 
-		}else if(k.charAt(0) === '#'){
-			return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
-		}else{
-			errorHandler.error('entity not found:'+a);
-			return a;
-		}
-	}
-	function appendText(end){//has some bugs
-		var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
-		locator&&position(start);
-		domBuilder.characters(xt,0,end-start);
-		start = end
-	}
-	function position(start,m){
-		while(start>=endPos && (m = linePattern.exec(source))){
-			startPos = m.index;
-			endPos = startPos + m[0].length;
-			locator.lineNumber++;
-			//console.log('line++:',locator,startPos,endPos)
-		}
-		locator.columnNumber = start-startPos+1;
-	}
-	var startPos = 0;
-	var endPos = 0;
-	var linePattern = /.+(?:\r\n?|\n)|.*$/g
-	var locator = domBuilder.locator;
-	
-	var parseStack = [{currentNSMap:defaultNSMapCopy}]
-	var closeMap = {};
-	var start = 0;
-	while(true){
-		var i = source.indexOf('<',start);
-		if(i<0){
-			if(!source.substr(start).match(/^\s*$/)){
-				var doc = domBuilder.document;
-    			var text = doc.createTextNode(source.substr(start));
-    			doc.appendChild(text);
-    			domBuilder.currentElement = text;
-			}
-			return;
-		}
-		if(i>start){
-			appendText(i);
-		}
-		switch(source.charAt(i+1)){
-		case '/':
-			var end = source.indexOf('>',i+3);
-			var tagName = source.substring(i+2,end);
-			var config = parseStack.pop();
-			var localNSMap = config.localNSMap;
-			
-	        if(config.tagName != tagName){
-	            errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
-	        }
-			domBuilder.endElement(config.uri,config.localName,tagName);
-			if(localNSMap){
-				for(var prefix in localNSMap){
-					domBuilder.endPrefixMapping(prefix) ;
-				}
-			}
-			end++;
-			break;
-			// end elment
-		case '?':// <?...?>
-			locator&&position(i);
-			end = parseInstruction(source,i,domBuilder);
-			break;
-		case '!':// <!doctype,<![CDATA,<!--
-			locator&&position(i);
-			end = parseDCC(source,i,domBuilder,errorHandler);
-			break;
-		default:
-			try{
-				locator&&position(i);
-				
-				var el = new ElementAttributes();
-				
-				//elStartEnd
-				var end = parseElementStartPart(source,i,el,entityReplacer,errorHandler);
-				var len = el.length;
-				//position fixed
-				if(len && locator){
-					var backup = copyLocator(locator,{});
-					for(var i = 0;i<len;i++){
-						var a = el[i];
-						position(a.offset);
-						a.offset = copyLocator(locator,{});
-					}
-					copyLocator(backup,locator);
-				}
-				if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
-					el.closed = true;
-					if(!entityMap.nbsp){
-						errorHandler.warning('unclosed xml attribute');
-					}
-				}
-				appendElement(el,domBuilder,parseStack);
-				
-				
-				if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
-					end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)
-				}else{
-					end++;
-				}
-			}catch(e){
-				errorHandler.error('element parse error: '+e);
-				end = -1;
-			}
-
-		}
-		if(end<0){
-			//TODO: 这里有可能sax回退,有位置错误风险
-			appendText(i+1);
-		}else{
-			start = end;
-		}
-	}
-}
-function copyLocator(f,t){
-	t.lineNumber = f.lineNumber;
-	t.columnNumber = f.columnNumber;
-	return t;
-	
-}
-
-/**
- * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
- * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
- */
-function parseElementStartPart(source,start,el,entityReplacer,errorHandler){
-	var attrName;
-	var value;
-	var p = ++start;
-	var s = S_TAG;//status
-	while(true){
-		var c = source.charAt(p);
-		switch(c){
-		case '=':
-			if(s === S_ATTR){//attrName
-				attrName = source.slice(start,p);
-				s = S_EQ;
-			}else if(s === S_ATTR_S){
-				s = S_EQ;
-			}else{
-				//fatalError: equal must after attrName or space after attrName
-				throw new Error('attribute equal must after attrName');
-			}
-			break;
-		case '\'':
-		case '"':
-			if(s === S_EQ){//equal
-				start = p+1;
-				p = source.indexOf(c,start)
-				if(p>0){
-					value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
-					el.add(attrName,value,start-1);
-					s = S_E;
-				}else{
-					//fatalError: no end quot match
-					throw new Error('attribute value no end \''+c+'\' match');
-				}
-			}else if(s == S_V){
-				value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
-				//console.log(attrName,value,start,p)
-				el.add(attrName,value,start);
-				//console.dir(el)
-				errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
-				start = p+1;
-				s = S_E
-			}else{
-				//fatalError: no equal before
-				throw new Error('attribute value must after "="');
-			}
-			break;
-		case '/':
-			switch(s){
-			case S_TAG:
-				el.setTagName(source.slice(start,p));
-			case S_E:
-			case S_S:
-			case S_C:
-				s = S_C;
-				el.closed = true;
-			case S_V:
-			case S_ATTR:
-			case S_ATTR_S:
-				break;
-			//case S_EQ:
-			default:
-				throw new Error("attribute invalid close char('/')")
-			}
-			break;
-		case ''://end document
-			//throw new Error('unexpected end of input')
-			errorHandler.error('unexpected end of input');
-		case '>':
-			switch(s){
-			case S_TAG:
-				el.setTagName(source.slice(start,p));
-			case S_E:
-			case S_S:
-			case S_C:
-				break;//normal
-			case S_V://Compatible state
-			case S_ATTR:
-				value = source.slice(start,p);
-				if(value.slice(-1) === '/'){
-					el.closed  = true;
-					value = value.slice(0,-1)
-				}
-			case S_ATTR_S:
-				if(s === S_ATTR_S){
-					value = attrName;
-				}
-				if(s == S_V){
-					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
-					el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start)
-				}else{
-					errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
-					el.add(value,value,start)
-				}
-				break;
-			case S_EQ:
-				throw new Error('attribute value missed!!');
-			}
-//			console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
-			return p;
-		/*xml space '\x20' | #x9 | #xD | #xA; */
-		case '\u0080':
-			c = ' ';
-		default:
-			if(c<= ' '){//space
-				switch(s){
-				case S_TAG:
-					el.setTagName(source.slice(start,p));//tagName
-					s = S_S;
-					break;
-				case S_ATTR:
-					attrName = source.slice(start,p)
-					s = S_ATTR_S;
-					break;
-				case S_V:
-					var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
-					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
-					el.add(attrName,value,start)
-				case S_E:
-					s = S_S;
-					break;
-				//case S_S:
-				//case S_EQ:
-				//case S_ATTR_S:
-				//	void();break;
-				//case S_C:
-					//ignore warning
-				}
-			}else{//not space
-//S_TAG,	S_ATTR,	S_EQ,	S_V
-//S_ATTR_S,	S_E,	S_S,	S_C
-				switch(s){
-				//case S_TAG:void();break;
-				//case S_ATTR:void();break;
-				//case S_V:void();break;
-				case S_ATTR_S:
-					errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead!!')
-					el.add(attrName,attrName,start);
-					start = p;
-					s = S_ATTR;
-					break;
-				case S_E:
-					errorHandler.warning('attribute space is required"'+attrName+'"!!')
-				case S_S:
-					s = S_ATTR;
-					start = p;
-					break;
-				case S_EQ:
-					s = S_V;
-					start = p;
-					break;
-				case S_C:
-					throw new Error("elements closed character '/' and '>' must be connected to");
-				}
-			}
-		}
-		p++;
-	}
-}
-/**
- * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
- */
-function appendElement(el,domBuilder,parseStack){
-	var tagName = el.tagName;
-	var localNSMap = null;
-	var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
-	var i = el.length;
-	while(i--){
-		var a = el[i];
-		var qName = a.qName;
-		var value = a.value;
-		var nsp = qName.indexOf(':');
-		if(nsp>0){
-			var prefix = a.prefix = qName.slice(0,nsp);
-			var localName = qName.slice(nsp+1);
-			var nsPrefix = prefix === 'xmlns' && localName
-		}else{
-			localName = qName;
-			prefix = null
-			nsPrefix = qName === 'xmlns' && ''
-		}
-		//can not set prefix,because prefix !== ''
-		a.localName = localName ;
-		//prefix == null for no ns prefix attribute 
-		if(nsPrefix !== false){//hack!!
-			if(localNSMap == null){
-				localNSMap = {}
-				//console.log(currentNSMap,0)
-				_copy(currentNSMap,currentNSMap={})
-				//console.log(currentNSMap,1)
-			}
-			currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
-			a.uri = 'http://www.w3.org/2000/xmlns/'
-			domBuilder.startPrefixMapping(nsPrefix, value) 
-		}
-	}
-	var i = el.length;
-	while(i--){
-		a = el[i];
-		var prefix = a.prefix;
-		if(prefix){//no prefix attribute has no namespace
-			if(prefix === 'xml'){
-				a.uri = 'http://www.w3.org/XML/1998/namespace';
-			}if(prefix !== 'xmlns'){
-				a.uri = currentNSMap[prefix]
-				
-				//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
-			}
-		}
-	}
-	var nsp = tagName.indexOf(':');
-	if(nsp>0){
-		prefix = el.prefix = tagName.slice(0,nsp);
-		localName = el.localName = tagName.slice(nsp+1);
-	}else{
-		prefix = null;//important!!
-		localName = el.localName = tagName;
-	}
-	//no prefix element has default namespace
-	var ns = el.uri = currentNSMap[prefix || ''];
-	domBuilder.startElement(ns,localName,tagName,el);
-	//endPrefixMapping and startPrefixMapping have not any help for dom builder
-	//localNSMap = null
-	if(el.closed){
-		domBuilder.endElement(ns,localName,tagName);
-		if(localNSMap){
-			for(prefix in localNSMap){
-				domBuilder.endPrefixMapping(prefix) 
-			}
-		}
-	}else{
-		el.currentNSMap = currentNSMap;
-		el.localNSMap = localNSMap;
-		parseStack.push(el);
-	}
-}
-function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
-	if(/^(?:script|textarea)$/i.test(tagName)){
-		var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
-		var text = source.substring(elStartEnd+1,elEndStart);
-		if(/[&<]/.test(text)){
-			if(/^script$/i.test(tagName)){
-				//if(!/\]\]>/.test(text)){
-					//lexHandler.startCDATA();
-					domBuilder.characters(text,0,text.length);
-					//lexHandler.endCDATA();
-					return elEndStart;
-				//}
-			}//}else{//text area
-				text = text.replace(/&#?\w+;/g,entityReplacer);
-				domBuilder.characters(text,0,text.length);
-				return elEndStart;
-			//}
-			
-		}
-	}
-	return elStartEnd+1;
-}
-function fixSelfClosed(source,elStartEnd,tagName,closeMap){
-	//if(tagName in closeMap){
-	var pos = closeMap[tagName];
-	if(pos == null){
-		//console.log(tagName)
-		pos = closeMap[tagName] = source.lastIndexOf('</'+tagName+'>')
-	}
-	return pos<elStartEnd;
-	//} 
-}
-function _copy(source,target){
-	for(var n in source){target[n] = source[n]}
-}
-function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
-	var next= source.charAt(start+2)
-	switch(next){
-	case '-':
-		if(source.charAt(start + 3) === '-'){
-			var end = source.indexOf('-->',start+4);
-			//append comment source.substring(4,end)//<!--
-			if(end>start){
-				domBuilder.comment(source,start+4,end-start-4);
-				return end+3;
-			}else{
-				errorHandler.error("Unclosed comment");
-				return -1;
-			}
-		}else{
-			//error
-			return -1;
-		}
-	default:
-		if(source.substr(start+3,6) == 'CDATA['){
-			var end = source.indexOf(']]>',start+9);
-			domBuilder.startCDATA();
-			domBuilder.characters(source,start+9,end-start-9);
-			domBuilder.endCDATA() 
-			return end+3;
-		}
-		//<!DOCTYPE
-		//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
-		var matchs = split(source,start);
-		var len = matchs.length;
-		if(len>1 && /!doctype/i.test(matchs[0][0])){
-			var name = matchs[1][0];
-			var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0]
-			var sysid = len>4 && matchs[4][0];
-			var lastMatch = matchs[len-1]
-			domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
-					sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
-			domBuilder.endDTD();
-			
-			return lastMatch.index+lastMatch[0].length
-		}
-	}
-	return -1;
-}
-
-
-
-function parseInstruction(source,start,domBuilder){
-	var end = source.indexOf('?>',start);
-	if(end){
-		var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
-		if(match){
-			var len = match[0].length;
-			domBuilder.processingInstruction(match[1], match[2]) ;
-			return end+2;
-		}else{//error
-			return -1;
-		}
-	}
-	return -1;
-}
-
-/**
- * @param source
- */
-function ElementAttributes(source){
-	
-}
-ElementAttributes.prototype = {
-	setTagName:function(tagName){
-		if(!tagNamePattern.test(tagName)){
-			throw new Error('invalid tagName:'+tagName)
-		}
-		this.tagName = tagName
-	},
-	add:function(qName,value,offset){
-		if(!tagNamePattern.test(qName)){
-			throw new Error('invalid attribute:'+qName)
-		}
-		this[this.length++] = {qName:qName,value:value,offset:offset}
-	},
-	length:0,
-	getLocalName:function(i){return this[i].localName},
-	getOffset:function(i){return this[i].offset},
-	getQName:function(i){return this[i].qName},
-	getURI:function(i){return this[i].uri},
-	getValue:function(i){return this[i].value}
-//	,getIndex:function(uri, localName)){
-//		if(localName){
-//			
-//		}else{
-//			var qName = uri
-//		}
-//	},
-//	getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
-//	getType:function(uri,localName){}
-//	getType:function(i){},
-}
-
-
-
-
-function _set_proto_(thiz,parent){
-	thiz.__proto__ = parent;
-	return thiz;
-}
-if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
-	_set_proto_ = function(thiz,parent){
-		function p(){};
-		p.prototype = parent;
-		p = new p();
-		for(parent in thiz){
-			p[parent] = thiz[parent];
-		}
-		return p;
-	}
-}
-
-function split(source,start){
-	var match;
-	var buf = [];
-	var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
-	reg.lastIndex = start;
-	reg.exec(source);//skip <
-	while(match = reg.exec(source)){
-		buf.push(match);
-		if(match[1])return buf;
-	}
-}
-
-if(typeof require == 'function'){
-	exports.XMLReader = XMLReader;
-}
-
-
-},{}]},{},[4])(4)
-});
\ No newline at end of file
diff --git a/node_modules/plist/examples/browser/index.html b/node_modules/plist/examples/browser/index.html
deleted file mode 100644
index 8ce7d92..0000000
--- a/node_modules/plist/examples/browser/index.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>plist.js browser example</title>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-  </head>
-  <body>
-    <script src="../../dist/plist.js"></script>
-    <script>
-      // TODO: add <input type=file> drag and drop example
-      console.log(plist);
-    </script>
-  </body>
-</html>
diff --git a/node_modules/plist/lib/build.js b/node_modules/plist/lib/build.js
deleted file mode 100644
index e2b9454..0000000
--- a/node_modules/plist/lib/build.js
+++ /dev/null
@@ -1,138 +0,0 @@
-
-/**
- * Module dependencies.
- */
-
-var base64 = require('base64-js');
-var xmlbuilder = require('xmlbuilder');
-
-/**
- * Module exports.
- */
-
-exports.build = build;
-
-/**
- * Accepts a `Date` instance and returns an ISO date string.
- *
- * @param {Date} d - Date instance to serialize
- * @returns {String} ISO date string representation of `d`
- * @api private
- */
-
-function ISODateString(d){
-  function pad(n){
-    return n < 10 ? '0' + n : n;
-  }
-  return d.getUTCFullYear()+'-'
-    + pad(d.getUTCMonth()+1)+'-'
-    + pad(d.getUTCDate())+'T'
-    + pad(d.getUTCHours())+':'
-    + pad(d.getUTCMinutes())+':'
-    + pad(d.getUTCSeconds())+'Z';
-}
-
-/**
- * Returns the internal "type" of `obj` via the
- * `Object.prototype.toString()` trick.
- *
- * @param {Mixed} obj - any value
- * @returns {String} the internal "type" name
- * @api private
- */
-
-var toString = Object.prototype.toString;
-function type (obj) {
-  var m = toString.call(obj).match(/\[object (.*)\]/);
-  return m ? m[1] : m;
-}
-
-/**
- * Generate an XML plist string from the input object `obj`.
- *
- * @param {Object} obj - the object to convert
- * @param {Object} [opts] - optional options object
- * @returns {String} converted plist XML string
- * @api public
- */
-
-function build (obj, opts) {
-  var XMLHDR = {
-    version: '1.0',
-    encoding: 'UTF-8'
-  };
-
-  var XMLDTD = {
-    pubid: '-//Apple//DTD PLIST 1.0//EN',
-    sysid: 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'
-  };
-
-  var doc = xmlbuilder.create('plist');
-
-  doc.dec(XMLHDR.version, XMLHDR.encoding, XMLHDR.standalone);
-  doc.dtd(XMLDTD.pubid, XMLDTD.sysid);
-  doc.att('version', '1.0');
-
-  walk_obj(obj, doc);
-
-  if (!opts) opts = {};
-  // default `pretty` to `true`
-  opts.pretty = opts.pretty !== false;
-  return doc.end(opts);
-}
-
-/**
- * depth first, recursive traversal of a javascript object. when complete,
- * next_child contains a reference to the build XML object.
- *
- * @api private
- */
-
-function walk_obj(next, next_child) {
-  var tag_type, i, prop;
-  var name = type(next);
-
-  if ('Undefined' == name) {
-    return;
-  } else if (Array.isArray(next)) {
-    next_child = next_child.ele('array');
-    for (i = 0; i < next.length; i++) {
-      walk_obj(next[i], next_child);
-    }
-
-  } else if (Buffer.isBuffer(next)) {
-    next_child.ele('data').raw(next.toString('base64'));
-
-  } else if ('Object' == name) {
-    next_child = next_child.ele('dict');
-    for (prop in next) {
-      if (next.hasOwnProperty(prop)) {
-        next_child.ele('key').txt(prop);
-        walk_obj(next[prop], next_child);
-      }
-    }
-
-  } else if ('Number' == name) {
-    // detect if this is an integer or real
-    // TODO: add an ability to force one way or another via a "cast"
-    tag_type = (next % 1 === 0) ? 'integer' : 'real';
-    next_child.ele(tag_type).txt(next.toString());
-
-  } else if ('Date' == name) {
-    next_child.ele('date').txt(ISODateString(new Date(next)));
-
-  } else if ('Boolean' == name) {
-    next_child.ele(next ? 'true' : 'false');
-
-  } else if ('String' == name) {
-    next_child.ele('string').txt(next);
-
-  } else if ('ArrayBuffer' == name) {
-    next_child.ele('data').raw(base64.fromByteArray(next));
-
-  } else if (next && next.buffer && 'ArrayBuffer' == type(next.buffer)) {
-    // a typed array
-    next_child.ele('data').raw(base64.fromByteArray(new Uint8Array(next.buffer), next_child));
-
-  }
-}
diff --git a/node_modules/plist/lib/node.js b/node_modules/plist/lib/node.js
deleted file mode 100644
index ac18e32..0000000
--- a/node_modules/plist/lib/node.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var fs = require('fs');
-var parse = require('./parse');
-var deprecate = require('util-deprecate');
-
-/**
- * Module exports.
- */
-
-exports.parseFile = deprecate(parseFile, '`parseFile()` is deprecated. ' +
-  'Use `parseString()` instead.');
-exports.parseFileSync = deprecate(parseFileSync, '`parseFileSync()` is deprecated. ' +
-  'Use `parseStringSync()` instead.');
-
-/**
- * Parses file `filename` as a .plist file.
- * Invokes `fn` callback function when done.
- *
- * @param {String} filename - name of the file to read
- * @param {Function} fn - callback function
- * @api public
- * @deprecated use parseString() instead
- */
-
-function parseFile (filename, fn) {
-  fs.readFile(filename, { encoding: 'utf8' }, onread);
-  function onread (err, inxml) {
-    if (err) return fn(err);
-    parse.parseString(inxml, fn);
-  }
-}
-
-/**
- * Parses file `filename` as a .plist file.
- * Returns a  when done.
- *
- * @param {String} filename - name of the file to read
- * @param {Function} fn - callback function
- * @api public
- * @deprecated use parseStringSync() instead
- */
-
-function parseFileSync (filename) {
-  var inxml = fs.readFileSync(filename, 'utf8');
-  return parse.parseStringSync(inxml);
-}
diff --git a/node_modules/plist/lib/parse.js b/node_modules/plist/lib/parse.js
deleted file mode 100644
index c154384..0000000
--- a/node_modules/plist/lib/parse.js
+++ /dev/null
@@ -1,200 +0,0 @@
-
-/**
- * Module dependencies.
- */
-
-var deprecate = require('util-deprecate');
-var DOMParser = require('xmldom').DOMParser;
-
-/**
- * Module exports.
- */
-
-exports.parse = parse;
-exports.parseString = deprecate(parseString, '`parseString()` is deprecated. ' +
-  'It\'s not actually async. Use `parse()` instead.');
-exports.parseStringSync = deprecate(parseStringSync, '`parseStringSync()` is ' +
-  'deprecated. Use `parse()` instead.');
-
-/**
- * We ignore raw text (usually whitespace), <!-- xml comments -->,
- * and raw CDATA nodes.
- *
- * @param {Element} node
- * @returns {Boolean}
- * @api private
- */
-
-function shouldIgnoreNode (node) {
-  return node.nodeType === 3 // text
-    || node.nodeType === 8   // comment
-    || node.nodeType === 4;  // cdata
-}
-
-
-/**
- * Parses a Plist XML string. Returns an Object.
- *
- * @param {String} xml - the XML String to decode
- * @returns {Mixed} the decoded value from the Plist XML
- * @api public
- */
-
-function parse (xml) {
-  var doc = new DOMParser().parseFromString(xml);
-  if (doc.documentElement.nodeName !== 'plist') {
-    throw new Error('malformed document. First element should be <plist>');
-  }
-  var plist = parsePlistXML(doc.documentElement);
-
-  // the root <plist> node gets interpreted as an Array,
-  // so pull out the inner data first
-  if (plist.length == 1) plist = plist[0];
-
-  return plist;
-}
-
-/**
- * Parses a Plist XML string. Returns an Object. Takes a `callback` function.
- *
- * @param {String} xml - the XML String to decode
- * @param {Function} callback - callback function
- * @returns {Mixed} the decoded value from the Plist XML
- * @api public
- * @deprecated not actually async. use parse() instead
- */
-
-function parseString (xml, callback) {
-  var doc, error, plist;
-  try {
-    doc = new DOMParser().parseFromString(xml);
-    plist = parsePlistXML(doc.documentElement);
-  } catch(e) {
-    error = e;
-  }
-  callback(error, plist);
-}
-
-/**
- * Parses a Plist XML string. Returns an Object.
- *
- * @param {String} xml - the XML String to decode
- * @param {Function} callback - callback function
- * @returns {Mixed} the decoded value from the Plist XML
- * @api public
- * @deprecated use parse() instead
- */
-
-function parseStringSync (xml) {
-  var doc = new DOMParser().parseFromString(xml);
-  var plist;
-  if (doc.documentElement.nodeName !== 'plist') {
-    throw new Error('malformed document. First element should be <plist>');
-  }
-  plist = parsePlistXML(doc.documentElement);
-
-  // if the plist is an array with 1 element, pull it out of the array
-  if (plist.length == 1) {
-    plist = plist[0];
-  }
-  return plist;
-}
-
-/**
- * Convert an XML based plist document into a JSON representation.
- *
- * @param {Object} xml_node - current XML node in the plist
- * @returns {Mixed} built up JSON object
- * @api private
- */
-
-function parsePlistXML (node) {
-  var i, new_obj, key, val, new_arr, res, d;
-
-  if (!node)
-    return null;
-
-  if (node.nodeName === 'plist') {
-    new_arr = [];
-    for (i=0; i < node.childNodes.length; i++) {
-      // ignore comment nodes (text)
-      if (!shouldIgnoreNode(node.childNodes[i])) {
-        new_arr.push( parsePlistXML(node.childNodes[i]));
-      }
-    }
-    return new_arr;
-
-  } else if (node.nodeName === 'dict') {
-    new_obj = {};
-    key = null;
-    for (i=0; i < node.childNodes.length; i++) {
-      // ignore comment nodes (text)
-      if (!shouldIgnoreNode(node.childNodes[i])) {
-        if (key === null) {
-          key = parsePlistXML(node.childNodes[i]);
-        } else {
-          new_obj[key] = parsePlistXML(node.childNodes[i]);
-          key = null;
-        }
-      }
-    }
-    return new_obj;
-
-  } else if (node.nodeName === 'array') {
-    new_arr = [];
-    for (i=0; i < node.childNodes.length; i++) {
-      // ignore comment nodes (text)
-      if (!shouldIgnoreNode(node.childNodes[i])) {
-        res = parsePlistXML(node.childNodes[i]);
-        if (null != res) new_arr.push(res);
-      }
-    }
-    return new_arr;
-
-  } else if (node.nodeName === '#text') {
-    // TODO: what should we do with text types? (CDATA sections)
-
-  } else if (node.nodeName === 'key') {
-    return node.childNodes[0].nodeValue;
-
-  } else if (node.nodeName === 'string') {
-    res = '';
-    for (d=0; d < node.childNodes.length; d++) {
-      res += node.childNodes[d].nodeValue;
-    }
-    return res;
-
-  } else if (node.nodeName === 'integer') {
-    // parse as base 10 integer
-    return parseInt(node.childNodes[0].nodeValue, 10);
-
-  } else if (node.nodeName === 'real') {
-    res = '';
-    for (d=0; d < node.childNodes.length; d++) {
-      if (node.childNodes[d].nodeType === 3) {
-        res += node.childNodes[d].nodeValue;
-      }
-    }
-    return parseFloat(res);
-
-  } else if (node.nodeName === 'data') {
-    res = '';
-    for (d=0; d < node.childNodes.length; d++) {
-      if (node.childNodes[d].nodeType === 3) {
-        res += node.childNodes[d].nodeValue.replace(/\s+/g, '');
-      }
-    }
-
-    // decode base64 data to a Buffer instance
-    return new Buffer(res, 'base64');
-
-  } else if (node.nodeName === 'date') {
-    return new Date(node.childNodes[0].nodeValue);
-
-  } else if (node.nodeName === 'true') {
-    return true;
-
-  } else if (node.nodeName === 'false') {
-    return false;
-  }
-}
diff --git a/node_modules/plist/lib/plist.js b/node_modules/plist/lib/plist.js
deleted file mode 100644
index 00a4167..0000000
--- a/node_modules/plist/lib/plist.js
+++ /dev/null
@@ -1,23 +0,0 @@
-
-var i;
-
-/**
- * Parser functions.
- */
-
-var parserFunctions = require('./parse');
-for (i in parserFunctions) exports[i] = parserFunctions[i];
-
-/**
- * Builder functions.
- */
-
-var builderFunctions = require('./build');
-for (i in builderFunctions) exports[i] = builderFunctions[i];
-
-/**
- * Add Node.js-specific functions (they're deprecated…).
- */
-
-var nodeFunctions = require('./node');
-for (i in nodeFunctions) exports[i] = nodeFunctions[i];
diff --git a/node_modules/plist/package.json b/node_modules/plist/package.json
deleted file mode 100644
index 58d5ad7..0000000
--- a/node_modules/plist/package.json
+++ /dev/null
@@ -1,89 +0,0 @@
-{
-  "_args": [
-    [
-      "plist@1.2.0",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "plist@1.2.0",
-  "_id": "plist@1.2.0",
-  "_inBundle": false,
-  "_integrity": "sha1-CEtQk93JJQbiWfh0uNmxr7jHlZM=",
-  "_location": "/plist",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "plist@1.2.0",
-    "name": "plist",
-    "escapedName": "plist",
-    "rawSpec": "1.2.0",
-    "saveSpec": null,
-    "fetchSpec": "1.2.0"
-  },
-  "_requiredBy": [
-    "/cordova-common"
-  ],
-  "_resolved": "https://registry.npmjs.org/plist/-/plist-1.2.0.tgz",
-  "_spec": "1.2.0",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Nathan Rajlich",
-    "email": "nathan@tootallnate.net"
-  },
-  "bugs": {
-    "url": "https://github.com/TooTallNate/node-plist/issues"
-  },
-  "contributors": [
-    {
-      "name": "Hans Huebner",
-      "email": "hans.huebner@gmail.com"
-    },
-    {
-      "name": "Pierre Metrailler"
-    },
-    {
-      "name": "Mike Reinstein",
-      "email": "reinstein.mike@gmail.com"
-    },
-    {
-      "name": "Vladimir Tsvang"
-    },
-    {
-      "name": "Mathieu D'Amours"
-    }
-  ],
-  "dependencies": {
-    "base64-js": "0.0.8",
-    "util-deprecate": "1.0.2",
-    "xmlbuilder": "4.0.0",
-    "xmldom": "0.1.x"
-  },
-  "description": "Mac OS X Plist parser/builder for Node.js and browsers",
-  "devDependencies": {
-    "browserify": "12.0.1",
-    "mocha": "2.3.3",
-    "multiline": "1.0.2",
-    "zuul": "3.7.2"
-  },
-  "homepage": "https://github.com/TooTallNate/node-plist#readme",
-  "keywords": [
-    "apple",
-    "browser",
-    "mac",
-    "plist",
-    "parser",
-    "xml"
-  ],
-  "license": "MIT",
-  "main": "lib/plist.js",
-  "name": "plist",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/TooTallNate/node-plist.git"
-  },
-  "scripts": {
-    "test": "make test"
-  },
-  "version": "1.2.0"
-}
diff --git a/node_modules/q/CHANGES.md b/node_modules/q/CHANGES.md
deleted file mode 100644
index 766fcdc..0000000
--- a/node_modules/q/CHANGES.md
+++ /dev/null
@@ -1,800 +0,0 @@
-
-## 1.5.1
-
- - Q.any now annotates its error message to clarify that Q.any was involved and
-   includes only the last error emitted. (Ivan Etchart)
- - Avoid domain.dispose during tests in preparation for Node.js 9. (Anna
-   Henningsen)
-
-## 1.5.0
-
- - Q.any gives an error message from the last rejected promise
- - Throw if callback supplied to "finally" is invalid (@grahamrhay)
- - Long stack trace improvements, can now construct long stack traces
-   across rethrows.
-
-## 1.4.1
-
- - Address an issue that prevented Q from being used as a `<script>` for
-   Firefox add-ons. Q can now be used in any environment that provides `window`
-   or `self` globals, favoring `window` since add-ons have an an immutable
-   `self` that is distinct from `window`.
-
-## 1.4.0
-
- - Add `noConflict` support for use in `<script>` (@jahnjw).
-
-## 1.3.0
-
- - Add tracking for unhandled and handled rejections in Node.js (@benjamingr).
-
-## 1.2.1
-
- - Fix Node.js environment detection for modern Browserify (@kahnjw).
-
-## 1.2.0
-
- - Added Q.any(promisesArray) method (@vergara).
-   Returns a promise fulfilled with the value of the first resolved promise in
-   promisesArray. If all promises in promisesArray are rejected, it returns
-   a rejected promise.
-
-## 1.1.2
-
- - Removed extraneous files from the npm package by using the "files"
-   whitelist in package.json instead of the .npmignore blacklist.
-   (@anton-rudeshko)
-
-## 1.1.1
-
- - Fix a pair of regressions in bootstrapping, one which precluded
-   WebWorker support, and another that precluded support in
-   ``<script>`` usage outright. #607
-
-## 1.1.0
-
- - Adds support for enabling long stack traces in node.js by setting
-   environment variable `Q_DEBUG=1`.
- - Introduces the `tap` method to promises, which will see a value
-   pass through without alteration.
- - Use instanceof to recognize own promise instances as opposed to
-   thenables.
- - Construct timeout errors with `code === ETIMEDOUT` (Kornel Lesiński)
- - More descriminant CommonJS module environment detection.
- - Dropped continuous integration for Node.js 0.6 and 0.8 because of
-   changes to npm that preclude the use of new `^` version predicate
-   operator in any transitive dependency.
- - Users can now override `Q.nextTick`.
-
-## 1.0.1
-
- - Adds support for `Q.Promise`, which implements common usage of the
-   ES6 `Promise` constructor and its methods. `Promise` does not have
-   a valid promise constructor and a proper implementation awaits
-   version 2 of Q.
- - Removes the console stopgap for a promise inspector. This no longer
-   works with any degree of reliability.
- - Fixes support for content security policies that forbid eval. Now
-   using the `StopIteration` global to distinguish SpiderMonkey
-   generators from ES6 generators, assuming that they will never
-   coexist.
-
-## 1.0.0
-
-:cake: This is all but a re-release of version 0.9, which has settled
-into a gentle maintenance mode and rightly deserves an official 1.0.
-An ambitious 2.0 release is already around the corner, but 0.9/1.0
-have been distributed far and wide and demand long term support.
-
- - Q will now attempt to post a debug message in browsers regardless
-   of whether window.Touch is defined. Chrome at least now has this
-   property regardless of whether touch is supported by the underlying
-   hardware.
- - Remove deprecation warning from `promise.valueOf`. The function is
-   called by the browser in various ways so there is no way to
-   distinguish usage that should be migrated from usage that cannot be
-   altered.
-
-## 0.9.7
-
- - :warning: `q.min.js` is no longer checked-in.  It is however still
-   created by Grunt and NPM.
- - Fixes a bug that inhibited `Q.async` with implementations of the new
-   ES6 generators.
- - Fixes a bug with `nextTick` affecting Safari 6.0.5 the first time a
-   page loads when an `iframe` is involved.
- - Introduces `passByCopy`, `join`, and `race`.
- - Shows stack traces or error messages on the console, instead of
-   `Error` objects.
- - Elimintates wrapper methods for improved performance.
- - `Q.all` now propagates progress notifications of the form you might
-   expect of ES6 iterations, `{value, index}` where the `value` is the
-   progress notification from the promise at `index`.
-
-## 0.9.6
-
- - Fixes a bug in recognizing the difference between compatible Q
-   promises, and Q promises from before the implementation of "inspect".
-   The latter are now coerced.
- - Fixes an infinite asynchronous coercion cycle introduced by former
-   solution, in two independently sufficient ways.  1.) All promises
-   returned by makePromise now implement "inspect", albeit a default
-   that reports that the promise has an "unknown" state.  2.) The
-   implementation of "then/when" is now in "then" instead of "when", so
-   that the responsibility to "coerce" the given promise rests solely in
-   the "when" method and the "then" method may assume that "this" is a
-   promise of the right type.
- - Refactors `nextTick` to use an unrolled microtask within Q regardless
-   of how new ticks a requested. #316 @rkatic
-
-## 0.9.5
-
- - Introduces `inspect` for getting the state of a promise as
-   `{state: "fulfilled" | "rejected" | "pending", value | reason}`.
- - Introduces `allSettled` which produces an array of promises states
-   for the input promises once they have all "settled".  This is in
-   accordance with a discussion on Promises/A+ that "settled" refers to
-   a promise that is "fulfilled" or "rejected".  "resolved" refers to a
-   deferred promise that has been "resolved" to another promise,
-   "sealing its fate" to the fate of the successor promise.
- - Long stack traces are now off by default.  Set `Q.longStackSupport`
-   to true to enable long stack traces.
- - Long stack traces can now follow the entire asynchronous history of a
-   promise, not just a single jump.
- - Introduces `spawn` for an immediately invoked asychronous generator.
-   @jlongster
- - Support for *experimental* synonyms `mapply`, `mcall`, `nmapply`,
-   `nmcall` for method invocation.
-
-## 0.9.4
-
- - `isPromise` and `isPromiseAlike` now always returns a boolean
-   (even for falsy values). #284 @lfac-pt
- - Support for ES6 Generators in `async` #288 @andywingo
- - Clear duplicate promise rejections from dispatch methods #238 @SLaks
- - Unhandled rejection API #296 @domenic
-   `stopUnhandledRejectionTracking`, `getUnhandledReasons`,
-   `resetUnhandledRejections`.
-
-## 0.9.3
-
- - Add the ability to give `Q.timeout`'s errors a custom error message. #270
-   @jgrenon
- - Fix Q's call-stack busting behavior in Node.js 0.10, by switching from
-   `process.nextTick` to `setImmediate`. #254 #259
- - Fix Q's behavior when used with the Mocha test runner in the browser, since
-   Mocha introduces a fake `process` global without a `nextTick` property. #267
- - Fix some, but not all, cases wherein Q would give false positives in its
-   unhandled rejection detection (#252). A fix for other cases (#238) is
-   hopefully coming soon.
- - Made `Q.promise` throw early if given a non-function.
-
-## 0.9.2
-
- - Pass through progress notifications when using `timeout`. #229 @omares
- - Pass through progress notifications when using `delay`.
- - Fix `nbind` to actually bind the `thisArg`. #232 @davidpadbury
-
-## 0.9.1
-
- - Made the AMD detection compatible with the RequireJS optimizer's `namespace`
-   option. #225 @terinjokes
- - Fix side effects from `valueOf`, and thus from `isFulfilled`, `isRejected`,
-   and `isPending`. #226 @benjamn
-
-## 0.9.0
-
-This release removes many layers of deprecated methods and brings Q closer to
-alignment with Mark Miller’s TC39 [strawman][] for concurrency. At the same
-time, it fixes many bugs and adds a few features around error handling. Finally,
-it comes with an updated and comprehensive [API Reference][].
-
-[strawman]: http://wiki.ecmascript.org/doku.php?id=strawman:concurrency
-[API Reference]: https://github.com/kriskowal/q/wiki/API-Reference
-
-### API Cleanup
-
-The following deprecated or undocumented methods have been removed.
-Their replacements are listed here:
-
-<table>
-   <thead>
-      <tr>
-         <th>0.8.x method</th>
-         <th>0.9 replacement</th>
-      </tr>
-   </thead>
-   <tbody>
-      <tr>
-         <td><code>Q.ref</code></td>
-         <td><code>Q</code></td>
-      </tr>
-      <tr>
-         <td><code>call</code>, <code>apply</code>, <code>bind</code> (*)</td>
-         <td><code>fcall</code>/<code>invoke</code>, <code>fapply</code>/<code>post</code>, <code>fbind</code></td>
-      </tr>
-      <tr>
-         <td><code>ncall</code>, <code>napply</code> (*)</td>
-         <td><code>nfcall</code>/<code>ninvoke</code>, <code>nfapply</code>/<code>npost</code></td>
-      </tr>
-      <tr>
-         <td><code>end</code></td>
-         <td><code>done</code></td>
-      </tr>
-      <tr>
-         <td><code>put</code></td>
-         <td><code>set</code></td>
-      </tr>
-      <tr>
-         <td><code>node</code></td>
-         <td><code>nbind</code></td>
-      </tr>
-      <tr>
-         <td><code>nend</code></td>
-         <td><code>nodeify</code></td>
-      </tr>
-      <tr>
-         <td><code>isResolved</code></td>
-         <td><code>isPending</code></td>
-      </tr>
-      <tr>
-         <td><code>deferred.node</code></td>
-         <td><code>deferred.makeNodeResolver</code></td>
-      </tr>
-      <tr>
-         <td><code>Method</code>, <code>sender</code></td>
-         <td><code>dispatcher</code></td>
-      </tr>
-      <tr>
-         <td><code>send</code></td>
-         <td><code>dispatch</code></td>
-      </tr>
-      <tr>
-         <td><code>view</code>, <code>viewInfo</code></td>
-         <td>(none)</td>
-      </tr>
-   </tbody>
-</table>
-
-
-(*) Use of ``thisp`` is discouraged. For calling methods, use ``post`` or
-``invoke``.
-
-### Alignment with the Concurrency Strawman
-
--   Q now exports a `Q(value)` function, an alias for `resolve`.
-    `Q.call`, `Q.apply`, and `Q.bind` were removed to make room for the
-    same methods on the function prototype.
--   `invoke` has been aliased to `send` in all its forms.
--   `post` with no method name acts like `fapply`.
-
-### Error Handling
-
--   Long stack traces can be turned off by setting `Q.stackJumpLimit` to zero.
-    In the future, this property will be used to fine tune how many stack jumps
-    are retained in long stack traces; for now, anything nonzero is treated as
-    one (since Q only tracks one stack jump at the moment, see #144). #168
--   In Node.js, if there are unhandled rejections when the process exits, they
-    are output to the console. #115
-
-### Other
-
--   `delete` and `set` (née `put`) no longer have a fulfillment value.
--   Q promises are no longer frozen, which
-    [helps with performance](http://code.google.com/p/v8/issues/detail?id=1858).
--   `thenReject` is now included, as a counterpart to `thenResolve`.
--   The included browser `nextTick` shim is now faster. #195 @rkatic.
-
-### Bug Fixes
-
--   Q now works in Internet Explorer 10. #186 @ForbesLindesay
--   `fbind` no longer hard-binds the returned function's `this` to `undefined`.
-    #202
--   `Q.reject` no longer leaks memory. #148
--   `npost` with no arguments now works. #207
--   `allResolved` now works with non-Q promises ("thenables"). #179
--   `keys` behavior is now correct even in browsers without native
-    `Object.keys`. #192 @rkatic
--   `isRejected` and the `exception` property now work correctly if the
-    rejection reason is falsy. #198
-
-### Internals and Advanced
-
--   The internal interface for a promise now uses
-    `dispatchPromise(resolve, op, operands)` instead of `sendPromise(op,
-    resolve, ...operands)`, which reduces the cases where Q needs to do
-    argument slicing.
--   The internal protocol uses different operands. "put" is now "set".
-    "del" is now "delete". "view" and "viewInfo" have been removed.
--   `Q.fulfill` has been added. It is distinct from `Q.resolve` in that
-    it does not pass promises through, nor coerces promises from other
-    systems. The promise becomes the fulfillment value. This is only
-    recommended for use when trying to fulfill a promise with an object that has
-    a `then` function that is at the same time not a promise.
-
-## 0.8.12
-- Treat foreign promises as unresolved in `Q.isFulfilled`; this lets `Q.all`
-  work on arrays containing foreign promises. #154
-- Fix minor incompliances with the [Promises/A+ spec][] and [test suite][]. #157
-  #158
-
-[Promises/A+ spec]: http://promises-aplus.github.com/promises-spec/
-[test suite]: https://github.com/promises-aplus/promises-tests
-
-## 0.8.11
-
- - Added ``nfcall``, ``nfapply``, and ``nfbind`` as ``thisp``-less versions of
-   ``ncall``, ``napply``, and ``nbind``. The latter are now deprecated. #142
- - Long stack traces no longer cause linearly-growing memory usage when chaining
-   promises together. #111
- - Inspecting ``error.stack`` in a rejection handler will now give a long stack
-   trace. #103
- - Fixed ``Q.timeout`` to clear its timeout handle when the promise is rejected;
-   previously, it kept the event loop alive until the timeout period expired.
-   #145 @dfilatov
- - Added `q/queue` module, which exports an infinite promise queue
-   constructor.
-
-## 0.8.10
-
- - Added ``done`` as a replacement for ``end``, taking the usual fulfillment,
-   rejection, and progress handlers. It's essentially equivalent to
-   ``then(f, r, p).end()``.
- - Added ``Q.onerror``, a settable error trap that you can use to get full stack
-   traces for uncaught errors. #94
- - Added ``thenResolve`` as a shortcut for returning a constant value once a
-   promise is fulfilled. #108 @ForbesLindesay
- - Various tweaks to progress notification, including propagation and
-   transformation of progress values and only forwarding a single progress
-   object.
- - Renamed ``nend`` to ``nodeify``. It no longer returns an always-fulfilled
-   promise when a Node callback is passed.
- - ``deferred.resolve`` and ``deferred.reject`` no longer (sometimes) return
-   ``deferred.promise``.
- - Fixed stack traces getting mangled if they hit ``end`` twice. #116 #121 @ef4
- - Fixed ``ninvoke`` and ``npost`` to work on promises for objects with Node
-   methods. #134
- - Fixed accidental coercion of objects with nontrivial ``valueOf`` methods,
-   like ``Date``s, by the promise's ``valueOf`` method. #135
- - Fixed ``spread`` not calling the passed rejection handler if given a rejected
-   promise.
-
-## 0.8.9
-
- - Added ``nend``
- - Added preliminary progress notification support, via
-   ``promise.then(onFulfilled, onRejected, onProgress)``,
-   ``promise.progress(onProgress)``, and ``deferred.notify(...progressData)``.
- - Made ``put`` and ``del`` return the object acted upon for easier chaining.
-   #84
- - Fixed coercion cycles with cooperating promises. #106
-
-## 0.8.7
-
- - Support [Montage Require](http://github.com/kriskowal/mr)
-
-## 0.8.6
-
- - Fixed ``npost`` and ``ninvoke`` to pass the correct ``thisp``. #74
- - Fixed various cases involving unorthodox rejection reasons. #73 #90
-   @ef4
- - Fixed double-resolving of misbehaved custom promises. #75
- - Sped up ``Q.all`` for arrays contain already-resolved promises or scalar
-   values. @ForbesLindesay
- - Made stack trace filtering work when concatenating assets. #93 @ef4
- - Added warnings for deprecated methods. @ForbesLindesay
- - Added ``.npmignore`` file so that dependent packages get a slimmer
-   ``node_modules`` directory.
-
-## 0.8.5
-
- - Added preliminary support for long traces (@domenic)
- - Added ``fapply``, ``fcall``, ``fbind`` for non-thisp
-   promised function calls.
- - Added ``return`` for async generators, where generators
-   are implemented.
- - Rejected promises now have an "exception" property.  If an object
-   isRejected(object), then object.valueOf().exception will
-   be the wrapped error.
- - Added Jasmine specifications
- - Support Internet Explorers 7–9 (with multiple bug fixes @domenic)
- - Support Firefox 12
- - Support Safari 5.1.5
- - Support Chrome 18
-
-## 0.8.4
-
- - WARNING: ``promise.timeout`` is now rejected with an ``Error`` object
-   and the message now includes the duration of the timeout in
-   miliseconds.  This doesn't constitute (in my opinion) a
-   backward-incompatibility since it is a change of an undocumented and
-   unspecified public behavior, but if you happened to depend on the
-   exception being a string, you will need to revise your code.
- - Added ``deferred.makeNodeResolver()`` to replace the more cryptic
-   ``deferred.node()`` method.
- - Added experimental ``Q.promise(maker(resolve, reject))`` to make a
-   promise inside a callback, such that thrown exceptions in the
-   callback are converted and the resolver and rejecter are arguments.
-   This is a shorthand for making a deferred directly and inspired by
-   @gozala’s stream constructor pattern and the Microsoft Windows Metro
-   Promise constructor interface.
- - Added experimental ``Q.begin()`` that is intended to kick off chains
-   of ``.then`` so that each of these can be reordered without having to
-   edit the new and former first step.
-
-## 0.8.3
-
- - Added ``isFulfilled``, ``isRejected``, and ``isResolved``
-   to the promise prototype.
- - Added ``allResolved`` for waiting for every promise to either be
-   fulfilled or rejected, without propagating an error. @utvara #53
- - Added ``Q.bind`` as a method to transform functions that
-   return and throw into promise-returning functions. See
-   [an example](https://gist.github.com/1782808). @domenic
- - Renamed ``node`` export to ``nbind``, and added ``napply`` to
-   complete the set. ``node`` remains as deprecated. @domenic #58
- - Renamed ``Method`` export to ``sender``.  ``Method``
-   remains as deprecated and will be removed in the next
-   major version since I expect it has very little usage.
- - Added browser console message indicating a live list of
-   unhandled errors.
- - Added support for ``msSetImmediate`` (IE10) or ``setImmediate``
-   (available via [polyfill](https://github.com/NobleJS/setImmediate))
-   as a browser-side ``nextTick`` implementation. #44 #50 #59
- - Stopped using the event-queue dependency, which was in place for
-   Narwhal support: now directly using ``process.nextTick``.
- - WARNING: EXPERIMENTAL: added ``finally`` alias for ``fin``, ``catch``
-   alias for ``fail``, ``try`` alias for ``call``, and ``delete`` alias
-   for ``del``.  These properties are enquoted in the library for
-   cross-browser compatibility, but may be used as property names in
-   modern engines.
-
-## 0.8.2
-
- - Deprecated ``ref`` in favor of ``resolve`` as recommended by
-   @domenic.
- - Update event-queue dependency.
-
-## 0.8.1
-
- - Fixed Opera bug. #35 @cadorn
- - Fixed ``Q.all([])`` #32 @domenic
-
-## 0.8.0
-
- - WARNING: ``enqueue`` removed.  Use ``nextTick`` instead.
-   This is more consistent with NodeJS and (subjectively)
-   more explicit and intuitive.
- - WARNING: ``def`` removed.  Use ``master`` instead.  The
-   term ``def`` was too confusing to new users.
- - WARNING: ``spy`` removed in favor of ``fin``.
- - WARNING: ``wait`` removed. Do ``all(args).get(0)`` instead.
- - WARNING: ``join`` removed. Do ``all(args).spread(callback)`` instead.
- - WARNING: Removed the ``Q`` function module.exports alias
-   for ``Q.ref``. It conflicts with ``Q.apply`` in weird
-   ways, making it uncallable.
- - Revised ``delay`` so that it accepts both ``(value,
-   timeout)`` and ``(timeout)`` variations based on
-   arguments length.
- - Added ``ref().spread(cb(...args))``, a variant of
-   ``then`` that spreads an array across multiple arguments.
-   Useful with ``all()``.
- - Added ``defer().node()`` Node callback generator.  The
-   callback accepts ``(error, value)`` or ``(error,
-   ...values)``.  For multiple value arguments, the
-   fulfillment value is an array, useful in conjunction with
-   ``spread``.
- - Added ``node`` and ``ncall``, both with the signature
-   ``(fun, thisp_opt, ...args)``.  The former is a decorator
-   and the latter calls immediately.  ``node`` optional
-   binds and partially applies.  ``ncall`` can bind and pass
-   arguments.
-
-## 0.7.2
-
- - Fixed thenable promise assimilation.
-
-## 0.7.1
-
- - Stopped shimming ``Array.prototype.reduce``. The
-   enumerable property has bad side-effects.  Libraries that
-   depend on this (for example, QQ) will need to be revised.
-
-## 0.7.0 - BACKWARD INCOMPATIBILITY
-
- - WARNING: Removed ``report`` and ``asap``
- - WARNING: The ``callback`` argument of the ``fin``
-   function no longer receives any arguments. Thus, it can
-   be used to call functions that should not receive
-   arguments on resolution.  Use ``when``, ``then``, or
-   ``fail`` if you need a value.
- - IMPORTANT: Fixed a bug in the use of ``MessageChannel``
-   for ``nextTick``.
- - Renamed ``enqueue`` to ``nextTick``.
- - Added experimental ``view`` and ``viewInfo`` for creating
-   views of promises either when or before they're
-   fulfilled.
- - Shims are now externally applied so subsequent scripts or
-   dependees can use them.
- - Improved minification results.
- - Improved readability.
-
-## 0.6.0 - BACKWARD INCOMPATIBILITY
-
- - WARNING: In practice, the implementation of ``spy`` and
-   the name ``fin`` were useful.  I've removed the old
-   ``fin`` implementation and renamed/aliased ``spy``.
- - The "q" module now exports its ``ref`` function as a "Q"
-   constructor, with module systems that support exports
-   assignment including NodeJS, RequireJS, and when used as
-   a ``<script>`` tag. Notably, strictly compliant CommonJS
-   does not support this, but UncommonJS does.
- - Added ``async`` decorator for generators that use yield
-   to "trampoline" promises. In engines that support
-   generators (SpiderMonkey), this will greatly reduce the
-   need for nested callbacks.
- - Made ``when`` chainable.
- - Made ``all`` chainable.
-
-## 0.5.3
-
- - Added ``all`` and refactored ``join`` and ``wait`` to use
-   it.  All of these will now reject at the earliest
-   rejection.
-
-## 0.5.2
-
- - Minor improvement to ``spy``; now waits for resolution of
-   callback promise.
-
-## 0.5.1
-
- - Made most Q API methods chainable on promise objects, and
-   turned the previous promise-methods of ``join``,
-   ``wait``, and ``report`` into Q API methods.
- - Added ``apply`` and ``call`` to the Q API, and ``apply``
-   as a promise handler.
- - Added ``fail``, ``fin``, and ``spy`` to Q and the promise
-   prototype for convenience when observing rejection,
-   fulfillment and rejection, or just observing without
-   affecting the resolution.
- - Renamed ``def`` (although ``def`` remains shimmed until
-   the next major release) to ``master``.
- - Switched to using ``MessageChannel`` for next tick task
-   enqueue in browsers that support it.
-
-## 0.5.0 - MINOR BACKWARD INCOMPATIBILITY
-
- - Exceptions are no longer reported when consumed.
- - Removed ``error`` from the API.  Since exceptions are
-   getting consumed, throwing them in an errback causes the
-   exception to silently disappear.  Use ``end``.
- - Added ``end`` as both an API method and a promise-chain
-   ending method.  It causes propagated rejections to be
-   thrown, which allows Node to write stack traces and
-   emit ``uncaughtException`` events, and browsers to
-   likewise emit ``onerror`` and log to the console.
- - Added ``join`` and ``wait`` as promise chain functions,
-   so you can wait for variadic promises, returning your own
-   promise back, or join variadic promises, resolving with a
-   callback that receives variadic fulfillment values.
-
-## 0.4.4
-
- - ``end`` no longer returns a promise. It is the end of the
-   promise chain.
- - Stopped reporting thrown exceptions in ``when`` callbacks
-   and errbacks.  These must be explicitly reported through
-   ``.end()``, ``.then(null, Q.error)``, or some other
-   mechanism.
- - Added ``report`` as an API method, which can be used as
-   an errback to report and propagate an error.
- - Added ``report`` as a promise-chain method, so an error
-   can be reported if it passes such a gate.
-
-## 0.4.3
-
- - Fixed ``<script>`` support that regressed with 0.4.2
-   because of "use strict" in the module system
-   multi-plexer.
-
-## 0.4.2
-
- - Added support for RequireJS (jburke)
-
-## 0.4.1
-
- - Added an "end" method to the promise prototype,
-   as a shorthand for waiting for the promise to
-   be resolved gracefully, and failing to do so,
-   to dump an error message.
-
-## 0.4.0 - BACKWARD INCOMPATIBLE*
-
- - *Removed the utility modules. NPM and Node no longer
-   expose any module except the main module.  These have
-   been moved and merged into the "qq" package.
- - *In a non-CommonJS browser, q.js can be used as a script.
-   It now creates a Q global variable.
- - Fixed thenable assimilation.
- - Fixed some issues with asap, when it resolves to
-   undefined, or throws an exception.
-
-## 0.3.0 - BACKWARD-INCOMPATIBLE
-
- - The `post` method has been reverted to its original
-   signature, as provided in Tyler Close's `ref_send` API.
-   That is, `post` accepts two arguments, the second of
-   which is an arbitrary object, but usually invocation
-   arguments as an `Array`.  To provide variadic arguments
-   to `post`, there is a new `invoke` function that posts
-   the variadic arguments to the value given in the first
-   argument.
- - The `defined` method has been moved from `q` to `q/util`
-   since it gets no use in practice but is still
-   theoretically useful.
- - The `Promise` constructor has been renamed to
-   `makePromise` to be consistent with the convention that
-   functions that do not require the `new` keyword to be
-   used as constructors have camelCase names.
- - The `isResolved` function has been renamed to
-   `isFulfilled`.  There is a new `isResolved` function that
-   indicates whether a value is not a promise or, if it is a
-   promise, whether it has been either fulfilled or
-   rejected.  The code has been revised to reflect this
-   nuance in terminology.
-
-## 0.2.10
-
- - Added `join` to `"q/util"` for variadically joining
-   multiple promises.
-
-## 0.2.9
-
- - The future-compatible `invoke` method has been added,
-   to replace `post`, since `post` will become backward-
-   incompatible in the next major release.
- - Exceptions thrown in the callbacks of a `when` call are
-   now emitted to Node's `"uncaughtException"` `process`
-   event in addition to being returned as a rejection reason.
-
-## 0.2.8
-
- - Exceptions thrown in the callbacks of a `when` call
-   are now consumed, warned, and transformed into
-   rejections of the promise returned by `when`.
-
-## 0.2.7
-
- - Fixed a minor bug in thenable assimilation, regressed
-   because of the change in the forwarding protocol.
- - Fixed behavior of "q/util" `deep` method on dates and
-   other primitives. Github issue #11.
-
-## 0.2.6
-
- - Thenables (objects with a "then" method) are accepted
-   and provided, bringing this implementation of Q
-   into conformance with Promises/A, B, and D.
- - Added `makePromise`, to replace the `Promise` function
-   eventually.
- - Rejections are now also duck-typed. A rejection is a
-   promise with a valueOf method that returns a rejection
-   descriptor. A rejection descriptor has a
-   "promiseRejected" property equal to "true" and a
-   "reason" property corresponding to the rejection reason.
- - Altered the `makePromise` API such that the `fallback`
-   method no longer receives a superfluous `resolved` method
-   after the `operator`.  The fallback method is responsible
-   only for returning a resolution.  This breaks an
-   undocumented API, so third-party API's depending on the
-   previous undocumented behavior may break.
-
-## 0.2.5
-
- - Changed promises into a duck-type such that multiple
-   instances of the Q module can exchange promise objects.
-   A promise is now defined as "an object that implements the
-   `promiseSend(op, resolved, ...)` method and `valueOf`".
- - Exceptions in promises are now captured and returned
-   as rejections.
-
-## 0.2.4
-
- - Fixed bug in `ref` that prevented `del` messages from
-   being received (gozala)
- - Fixed a conflict with FireFox 4; constructor property
-   is now read-only.
-
-## 0.2.3
-
- - Added `keys` message to promises and to the promise API.
-
-## 0.2.2
-
- - Added boilerplate to `q/queue` and `q/util`.
- - Fixed missing dependency to `q/queue`.
-
-## 0.2.1
-
- - The `resolve` and `reject` methods of `defer` objects now
-   return the resolution promise for convenience.
- - Added `q/util`, which provides `step`, `delay`, `shallow`,
-   `deep`, and three reduction orders.
- - Added `q/queue` module for a promise `Queue`.
- - Added `q-comm` to the list of compatible libraries.
- - Deprecated `defined` from `q`, with intent to move it to
-   `q/util`.
-
-## 0.2.0 - BACKWARD INCOMPATIBLE
-
- - Changed post(ref, name, args) to variadic
-   post(ref, name, ...args). BACKWARD INCOMPATIBLE
- - Added a def(value) method to annotate an object as being
-   necessarily a local value that cannot be serialized, such
-   that inter-process/worker/vat promise communication
-   libraries will send messages to it, but never send it
-   back.
- - Added a send(value, op, ...args) method to the public API, for
-   forwarding messages to a value or promise in a future turn.
-
-## 0.1.9
-
- - Added isRejected() for testing whether a value is a rejected
-   promise.  isResolved() retains the behavior of stating
-   that rejected promises are not resolved.
-
-## 0.1.8
-
- - Fixed isResolved(null) and isResolved(undefined) [issue #9]
- - Fixed a problem with the Object.create shim
-
-## 0.1.7
-
- - shimmed ES5 Object.create in addition to Object.freeze
-   for compatibility on non-ES5 engines (gozala)
-
-## 0.1.6
-
- - Q.isResolved added
- - promise.valueOf() now returns the value of resolved
-   and near values
- - asap retried
- - promises are frozen when possible
-
-## 0.1.5
-
- - fixed dependency list for Teleport (gozala)
- - all unit tests now pass (gozala)
-
-## 0.1.4
-
- - added support for Teleport as an engine (gozala)
- - simplified and updated methods for getting internal
-   print and enqueue functions universally (gozala)
-
-## 0.1.3
-
- - fixed erroneous link to the q module in package.json
-
-## 0.1.2
-
- - restructured for overlay style package compatibility
-
-## 0.1.0
-
- - removed asap because it was broken, probably down to the
-   philosophy.
-
-## 0.0.3
-
- - removed q-util
- - fixed asap so it returns a value if completed
-
-## 0.0.2
-
- - added q-util
-
-## 0.0.1
-
- - initial version
diff --git a/node_modules/q/LICENSE b/node_modules/q/LICENSE
deleted file mode 100644
index 9ce1ea5..0000000
--- a/node_modules/q/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved.
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/node_modules/q/README.md b/node_modules/q/README.md
deleted file mode 100644
index d2f57a6..0000000
--- a/node_modules/q/README.md
+++ /dev/null
@@ -1,874 +0,0 @@
-[![Build Status](https://secure.travis-ci.org/kriskowal/q.svg?branch=master)](http://travis-ci.org/kriskowal/q)
-[![CDNJS](https://img.shields.io/cdnjs/v/q.js.svg)](https://cdnjs.com/libraries/q.js)
-
-<a href="http://promises-aplus.github.com/promises-spec">
-    <img src="http://kriskowal.github.io/q/q.png" align="right" alt="Q logo" />
-</a>
-
-If a function cannot return a value or throw an exception without
-blocking, it can return a promise instead.  A promise is an object
-that represents the return value or the thrown exception that the
-function may eventually provide.  A promise can also be used as a
-proxy for a [remote object][Q-Connection] to overcome latency.
-
-[Q-Connection]: https://github.com/kriskowal/q-connection
-
-On the first pass, promises can mitigate the “[Pyramid of
-Doom][POD]”: the situation where code marches to the right faster
-than it marches forward.
-
-[POD]: http://calculist.org/blog/2011/12/14/why-coroutines-wont-work-on-the-web/
-
-```javascript
-step1(function (value1) {
-    step2(value1, function(value2) {
-        step3(value2, function(value3) {
-            step4(value3, function(value4) {
-                // Do something with value4
-            });
-        });
-    });
-});
-```
-
-With a promise library, you can flatten the pyramid.
-
-```javascript
-Q.fcall(promisedStep1)
-.then(promisedStep2)
-.then(promisedStep3)
-.then(promisedStep4)
-.then(function (value4) {
-    // Do something with value4
-})
-.catch(function (error) {
-    // Handle any error from all above steps
-})
-.done();
-```
-
-With this approach, you also get implicit error propagation, just like `try`,
-`catch`, and `finally`.  An error in `promisedStep1` will flow all the way to
-the `catch` function, where it’s caught and handled.  (Here `promisedStepN` is
-a version of `stepN` that returns a promise.)
-
-The callback approach is called an “inversion of control”.
-A function that accepts a callback instead of a return value
-is saying, “Don’t call me, I’ll call you.”.  Promises
-[un-invert][IOC] the inversion, cleanly separating the input
-arguments from control flow arguments.  This simplifies the
-use and creation of API’s, particularly variadic,
-rest and spread arguments.
-
-[IOC]: http://www.slideshare.net/domenicdenicola/callbacks-promises-and-coroutines-oh-my-the-evolution-of-asynchronicity-in-javascript
-
-
-## Getting Started
-
-The Q module can be loaded as:
-
--   A ``<script>`` tag (creating a ``Q`` global variable): ~2.5 KB minified and
-    gzipped.
--   A Node.js and CommonJS module, available in [npm](https://npmjs.org/) as
-    the [q](https://npmjs.org/package/q) package
--   An AMD module
--   A [component](https://github.com/component/component) as ``microjs/q``
--   Using [bower](http://bower.io/) as `q#^1.4.1`
--   Using [NuGet](http://nuget.org/) as [Q](https://nuget.org/packages/q)
-
-Q can exchange promises with jQuery, Dojo, When.js, WinJS, and more.
-
-## Resources
-
-Our [wiki][] contains a number of useful resources, including:
-
-- A method-by-method [Q API reference][reference].
-- A growing [examples gallery][examples], showing how Q can be used to make
-  everything better. From XHR to database access to accessing the Flickr API,
-  Q is there for you.
-- There are many libraries that produce and consume Q promises for everything
-  from file system/database access or RPC to templating. For a list of some of
-  the more popular ones, see [Libraries][].
-- If you want materials that introduce the promise concept generally, and the
-  below tutorial isn't doing it for you, check out our collection of
-  [presentations, blog posts, and podcasts][resources].
-- A guide for those [coming from jQuery's `$.Deferred`][jquery].
-
-We'd also love to have you join the Q-Continuum [mailing list][].
-
-[wiki]: https://github.com/kriskowal/q/wiki
-[reference]: https://github.com/kriskowal/q/wiki/API-Reference
-[examples]: https://github.com/kriskowal/q/wiki/Examples-Gallery
-[Libraries]: https://github.com/kriskowal/q/wiki/Libraries
-[resources]: https://github.com/kriskowal/q/wiki/General-Promise-Resources
-[jquery]: https://github.com/kriskowal/q/wiki/Coming-from-jQuery
-[mailing list]: https://groups.google.com/forum/#!forum/q-continuum
-
-
-## Tutorial
-
-Promises have a ``then`` method, which you can use to get the eventual
-return value (fulfillment) or thrown exception (rejection).
-
-```javascript
-promiseMeSomething()
-.then(function (value) {
-}, function (reason) {
-});
-```
-
-If ``promiseMeSomething`` returns a promise that gets fulfilled later
-with a return value, the first function (the fulfillment handler) will be
-called with the value.  However, if the ``promiseMeSomething`` function
-gets rejected later by a thrown exception, the second function (the
-rejection handler) will be called with the exception.
-
-Note that resolution of a promise is always asynchronous: that is, the
-fulfillment or rejection handler will always be called in the next turn of the
-event loop (i.e. `process.nextTick` in Node). This gives you a nice
-guarantee when mentally tracing the flow of your code, namely that
-``then`` will always return before either handler is executed.
-
-In this tutorial, we begin with how to consume and work with promises. We'll
-talk about how to create them, and thus create functions like
-`promiseMeSomething` that return promises, [below](#the-beginning).
-
-
-### Propagation
-
-The ``then`` method returns a promise, which in this example, I’m
-assigning to ``outputPromise``.
-
-```javascript
-var outputPromise = getInputPromise()
-.then(function (input) {
-}, function (reason) {
-});
-```
-
-The ``outputPromise`` variable becomes a new promise for the return
-value of either handler.  Since a function can only either return a
-value or throw an exception, only one handler will ever be called and it
-will be responsible for resolving ``outputPromise``.
-
--   If you return a value in a handler, ``outputPromise`` will get
-    fulfilled.
-
--   If you throw an exception in a handler, ``outputPromise`` will get
-    rejected.
-
--   If you return a **promise** in a handler, ``outputPromise`` will
-    “become” that promise.  Being able to become a new promise is useful
-    for managing delays, combining results, or recovering from errors.
-
-If the ``getInputPromise()`` promise gets rejected and you omit the
-rejection handler, the **error** will go to ``outputPromise``:
-
-```javascript
-var outputPromise = getInputPromise()
-.then(function (value) {
-});
-```
-
-If the input promise gets fulfilled and you omit the fulfillment handler, the
-**value** will go to ``outputPromise``:
-
-```javascript
-var outputPromise = getInputPromise()
-.then(null, function (error) {
-});
-```
-
-Q promises provide a ``fail`` shorthand for ``then`` when you are only
-interested in handling the error:
-
-```javascript
-var outputPromise = getInputPromise()
-.fail(function (error) {
-});
-```
-
-If you are writing JavaScript for modern engines only or using
-CoffeeScript, you may use `catch` instead of `fail`.
-
-Promises also have a ``fin`` function that is like a ``finally`` clause.
-The final handler gets called, with no arguments, when the promise
-returned by ``getInputPromise()`` either returns a value or throws an
-error.  The value returned or error thrown by ``getInputPromise()``
-passes directly to ``outputPromise`` unless the final handler fails, and
-may be delayed if the final handler returns a promise.
-
-```javascript
-var outputPromise = getInputPromise()
-.fin(function () {
-    // close files, database connections, stop servers, conclude tests
-});
-```
-
--   If the handler returns a value, the value is ignored
--   If the handler throws an error, the error passes to ``outputPromise``
--   If the handler returns a promise, ``outputPromise`` gets postponed.  The
-    eventual value or error has the same effect as an immediate return
-    value or thrown error: a value would be ignored, an error would be
-    forwarded.
-
-If you are writing JavaScript for modern engines only or using
-CoffeeScript, you may use `finally` instead of `fin`.
-
-### Chaining
-
-There are two ways to chain promises.  You can chain promises either
-inside or outside handlers.  The next two examples are equivalent.
-
-```javascript
-return getUsername()
-.then(function (username) {
-    return getUser(username)
-    .then(function (user) {
-        // if we get here without an error,
-        // the value returned here
-        // or the exception thrown here
-        // resolves the promise returned
-        // by the first line
-    })
-});
-```
-
-```javascript
-return getUsername()
-.then(function (username) {
-    return getUser(username);
-})
-.then(function (user) {
-    // if we get here without an error,
-    // the value returned here
-    // or the exception thrown here
-    // resolves the promise returned
-    // by the first line
-});
-```
-
-The only difference is nesting.  It’s useful to nest handlers if you
-need to capture multiple input values in your closure.
-
-```javascript
-function authenticate() {
-    return getUsername()
-    .then(function (username) {
-        return getUser(username);
-    })
-    // chained because we will not need the user name in the next event
-    .then(function (user) {
-        return getPassword()
-        // nested because we need both user and password next
-        .then(function (password) {
-            if (user.passwordHash !== hash(password)) {
-                throw new Error("Can't authenticate");
-            }
-        });
-    });
-}
-```
-
-
-### Combination
-
-You can turn an array of promises into a promise for the whole,
-fulfilled array using ``all``.
-
-```javascript
-return Q.all([
-    eventualAdd(2, 2),
-    eventualAdd(10, 20)
-]);
-```
-
-If you have a promise for an array, you can use ``spread`` as a
-replacement for ``then``.  The ``spread`` function “spreads” the
-values over the arguments of the fulfillment handler.  The rejection handler
-will get called at the first sign of failure.  That is, whichever of
-the received promises fails first gets handled by the rejection handler.
-
-```javascript
-function eventualAdd(a, b) {
-    return Q.spread([a, b], function (a, b) {
-        return a + b;
-    })
-}
-```
-
-But ``spread`` calls ``all`` initially, so you can skip it in chains.
-
-```javascript
-return getUsername()
-.then(function (username) {
-    return [username, getUser(username)];
-})
-.spread(function (username, user) {
-});
-```
-
-The ``all`` function returns a promise for an array of values.  When this
-promise is fulfilled, the array contains the fulfillment values of the original
-promises, in the same order as those promises.  If one of the given promises
-is rejected, the returned promise is immediately rejected, not waiting for the
-rest of the batch.  If you want to wait for all of the promises to either be
-fulfilled or rejected, you can use ``allSettled``.
-
-```javascript
-Q.allSettled(promises)
-.then(function (results) {
-    results.forEach(function (result) {
-        if (result.state === "fulfilled") {
-            var value = result.value;
-        } else {
-            var reason = result.reason;
-        }
-    });
-});
-```
-
-The ``any`` function accepts an array of promises and returns a promise that is
-fulfilled by the first given promise to be fulfilled, or rejected if all of the
-given promises are rejected.
-
-```javascript
-Q.any(promises)
-.then(function (first) {
-    // Any of the promises was fulfilled.
-}, function (error) {
-    // All of the promises were rejected.
-});
-```
-
-### Sequences
-
-If you have a number of promise-producing functions that need
-to be run sequentially, you can of course do so manually:
-
-```javascript
-return foo(initialVal).then(bar).then(baz).then(qux);
-```
-
-However, if you want to run a dynamically constructed sequence of
-functions, you'll want something like this:
-
-```javascript
-var funcs = [foo, bar, baz, qux];
-
-var result = Q(initialVal);
-funcs.forEach(function (f) {
-    result = result.then(f);
-});
-return result;
-```
-
-You can make this slightly more compact using `reduce`:
-
-```javascript
-return funcs.reduce(function (soFar, f) {
-    return soFar.then(f);
-}, Q(initialVal));
-```
-
-Or, you could use the ultra-compact version:
-
-```javascript
-return funcs.reduce(Q.when, Q(initialVal));
-```
-
-### Handling Errors
-
-One sometimes-unintuitive aspect of promises is that if you throw an
-exception in the fulfillment handler, it will not be caught by the error
-handler.
-
-```javascript
-return foo()
-.then(function (value) {
-    throw new Error("Can't bar.");
-}, function (error) {
-    // We only get here if "foo" fails
-});
-```
-
-To see why this is, consider the parallel between promises and
-``try``/``catch``. We are ``try``-ing to execute ``foo()``: the error
-handler represents a ``catch`` for ``foo()``, while the fulfillment handler
-represents code that happens *after* the ``try``/``catch`` block.
-That code then needs its own ``try``/``catch`` block.
-
-In terms of promises, this means chaining your rejection handler:
-
-```javascript
-return foo()
-.then(function (value) {
-    throw new Error("Can't bar.");
-})
-.fail(function (error) {
-    // We get here with either foo's error or bar's error
-});
-```
-
-### Progress Notification
-
-It's possible for promises to report their progress, e.g. for tasks that take a
-long time like a file upload. Not all promises will implement progress
-notifications, but for those that do, you can consume the progress values using
-a third parameter to ``then``:
-
-```javascript
-return uploadFile()
-.then(function () {
-    // Success uploading the file
-}, function (err) {
-    // There was an error, and we get the reason for error
-}, function (progress) {
-    // We get notified of the upload's progress as it is executed
-});
-```
-
-Like `fail`, Q also provides a shorthand for progress callbacks
-called `progress`:
-
-```javascript
-return uploadFile().progress(function (progress) {
-    // We get notified of the upload's progress
-});
-```
-
-### The End
-
-When you get to the end of a chain of promises, you should either
-return the last promise or end the chain.  Since handlers catch
-errors, it’s an unfortunate pattern that the exceptions can go
-unobserved.
-
-So, either return it,
-
-```javascript
-return foo()
-.then(function () {
-    return "bar";
-});
-```
-
-Or, end it.
-
-```javascript
-foo()
-.then(function () {
-    return "bar";
-})
-.done();
-```
-
-Ending a promise chain makes sure that, if an error doesn’t get
-handled before the end, it will get rethrown and reported.
-
-This is a stopgap. We are exploring ways to make unhandled errors
-visible without any explicit handling.
-
-
-### The Beginning
-
-Everything above assumes you get a promise from somewhere else.  This
-is the common case.  Every once in a while, you will need to create a
-promise from scratch.
-
-#### Using ``Q.fcall``
-
-You can create a promise from a value using ``Q.fcall``.  This returns a
-promise for 10.
-
-```javascript
-return Q.fcall(function () {
-    return 10;
-});
-```
-
-You can also use ``fcall`` to get a promise for an exception.
-
-```javascript
-return Q.fcall(function () {
-    throw new Error("Can't do it");
-});
-```
-
-As the name implies, ``fcall`` can call functions, or even promised
-functions.  This uses the ``eventualAdd`` function above to add two
-numbers.
-
-```javascript
-return Q.fcall(eventualAdd, 2, 2);
-```
-
-
-#### Using Deferreds
-
-If you have to interface with asynchronous functions that are callback-based
-instead of promise-based, Q provides a few shortcuts (like ``Q.nfcall`` and
-friends). But much of the time, the solution will be to use *deferreds*.
-
-```javascript
-var deferred = Q.defer();
-FS.readFile("foo.txt", "utf-8", function (error, text) {
-    if (error) {
-        deferred.reject(new Error(error));
-    } else {
-        deferred.resolve(text);
-    }
-});
-return deferred.promise;
-```
-
-Note that a deferred can be resolved with a value or a promise.  The
-``reject`` function is a shorthand for resolving with a rejected
-promise.
-
-```javascript
-// this:
-deferred.reject(new Error("Can't do it"));
-
-// is shorthand for:
-var rejection = Q.fcall(function () {
-    throw new Error("Can't do it");
-});
-deferred.resolve(rejection);
-```
-
-This is a simplified implementation of ``Q.delay``.
-
-```javascript
-function delay(ms) {
-    var deferred = Q.defer();
-    setTimeout(deferred.resolve, ms);
-    return deferred.promise;
-}
-```
-
-This is a simplified implementation of ``Q.timeout``
-
-```javascript
-function timeout(promise, ms) {
-    var deferred = Q.defer();
-    Q.when(promise, deferred.resolve);
-    delay(ms).then(function () {
-        deferred.reject(new Error("Timed out"));
-    });
-    return deferred.promise;
-}
-```
-
-Finally, you can send a progress notification to the promise with
-``deferred.notify``.
-
-For illustration, this is a wrapper for XML HTTP requests in the browser. Note
-that a more [thorough][XHR] implementation would be in order in practice.
-
-[XHR]: https://github.com/montagejs/mr/blob/71e8df99bb4f0584985accd6f2801ef3015b9763/browser.js#L29-L73
-
-```javascript
-function requestOkText(url) {
-    var request = new XMLHttpRequest();
-    var deferred = Q.defer();
-
-    request.open("GET", url, true);
-    request.onload = onload;
-    request.onerror = onerror;
-    request.onprogress = onprogress;
-    request.send();
-
-    function onload() {
-        if (request.status === 200) {
-            deferred.resolve(request.responseText);
-        } else {
-            deferred.reject(new Error("Status code was " + request.status));
-        }
-    }
-
-    function onerror() {
-        deferred.reject(new Error("Can't XHR " + JSON.stringify(url)));
-    }
-
-    function onprogress(event) {
-        deferred.notify(event.loaded / event.total);
-    }
-
-    return deferred.promise;
-}
-```
-
-Below is an example of how to use this ``requestOkText`` function:
-
-```javascript
-requestOkText("http://localhost:3000")
-.then(function (responseText) {
-    // If the HTTP response returns 200 OK, log the response text.
-    console.log(responseText);
-}, function (error) {
-    // If there's an error or a non-200 status code, log the error.
-    console.error(error);
-}, function (progress) {
-    // Log the progress as it comes in.
-    console.log("Request progress: " + Math.round(progress * 100) + "%");
-});
-```
-
-#### Using `Q.Promise`
-
-This is an alternative promise-creation API that has the same power as
-the deferred concept, but without introducing another conceptual entity.
-
-Rewriting the `requestOkText` example above using `Q.Promise`:
-
-```javascript
-function requestOkText(url) {
-    return Q.Promise(function(resolve, reject, notify) {
-        var request = new XMLHttpRequest();
-
-        request.open("GET", url, true);
-        request.onload = onload;
-        request.onerror = onerror;
-        request.onprogress = onprogress;
-        request.send();
-
-        function onload() {
-            if (request.status === 200) {
-                resolve(request.responseText);
-            } else {
-                reject(new Error("Status code was " + request.status));
-            }
-        }
-
-        function onerror() {
-            reject(new Error("Can't XHR " + JSON.stringify(url)));
-        }
-
-        function onprogress(event) {
-            notify(event.loaded / event.total);
-        }
-    });
-}
-```
-
-If `requestOkText` were to throw an exception, the returned promise would be
-rejected with that thrown exception as the rejection reason.
-
-### The Middle
-
-If you are using a function that may return a promise, but just might
-return a value if it doesn’t need to defer, you can use the “static”
-methods of the Q library.
-
-The ``when`` function is the static equivalent for ``then``.
-
-```javascript
-return Q.when(valueOrPromise, function (value) {
-}, function (error) {
-});
-```
-
-All of the other methods on a promise have static analogs with the
-same name.
-
-The following are equivalent:
-
-```javascript
-return Q.all([a, b]);
-```
-
-```javascript
-return Q.fcall(function () {
-    return [a, b];
-})
-.all();
-```
-
-When working with promises provided by other libraries, you should
-convert it to a Q promise.  Not all promise libraries make the same
-guarantees as Q and certainly don’t provide all of the same methods.
-Most libraries only provide a partially functional ``then`` method.
-This thankfully is all we need to turn them into vibrant Q promises.
-
-```javascript
-return Q($.ajax(...))
-.then(function () {
-});
-```
-
-If there is any chance that the promise you receive is not a Q promise
-as provided by your library, you should wrap it using a Q function.
-You can even use ``Q.invoke`` as a shorthand.
-
-```javascript
-return Q.invoke($, 'ajax', ...)
-.then(function () {
-});
-```
-
-
-### Over the Wire
-
-A promise can serve as a proxy for another object, even a remote
-object.  There are methods that allow you to optimistically manipulate
-properties or call functions.  All of these interactions return
-promises, so they can be chained.
-
-```
-direct manipulation         using a promise as a proxy
---------------------------  -------------------------------
-value.foo                   promise.get("foo")
-value.foo = value           promise.put("foo", value)
-delete value.foo            promise.del("foo")
-value.foo(...args)          promise.post("foo", [args])
-value.foo(...args)          promise.invoke("foo", ...args)
-value(...args)              promise.fapply([args])
-value(...args)              promise.fcall(...args)
-```
-
-If the promise is a proxy for a remote object, you can shave
-round-trips by using these functions instead of ``then``.  To take
-advantage of promises for remote objects, check out [Q-Connection][].
-
-[Q-Connection]: https://github.com/kriskowal/q-connection
-
-Even in the case of non-remote objects, these methods can be used as
-shorthand for particularly-simple fulfillment handlers. For example, you
-can replace
-
-```javascript
-return Q.fcall(function () {
-    return [{ foo: "bar" }, { foo: "baz" }];
-})
-.then(function (value) {
-    return value[0].foo;
-});
-```
-
-with
-
-```javascript
-return Q.fcall(function () {
-    return [{ foo: "bar" }, { foo: "baz" }];
-})
-.get(0)
-.get("foo");
-```
-
-
-### Adapting Node
-
-If you're working with functions that make use of the Node.js callback pattern,
-where callbacks are in the form of `function(err, result)`, Q provides a few
-useful utility functions for converting between them. The most straightforward
-are probably `Q.nfcall` and `Q.nfapply` ("Node function call/apply") for calling
-Node.js-style functions and getting back a promise:
-
-```javascript
-return Q.nfcall(FS.readFile, "foo.txt", "utf-8");
-return Q.nfapply(FS.readFile, ["foo.txt", "utf-8"]);
-```
-
-If you are working with methods, instead of simple functions, you can easily
-run in to the usual problems where passing a method to another function—like
-`Q.nfcall`—"un-binds" the method from its owner. To avoid this, you can either
-use `Function.prototype.bind` or some nice shortcut methods we provide:
-
-```javascript
-return Q.ninvoke(redisClient, "get", "user:1:id");
-return Q.npost(redisClient, "get", ["user:1:id"]);
-```
-
-You can also create reusable wrappers with `Q.denodeify` or `Q.nbind`:
-
-```javascript
-var readFile = Q.denodeify(FS.readFile);
-return readFile("foo.txt", "utf-8");
-
-var redisClientGet = Q.nbind(redisClient.get, redisClient);
-return redisClientGet("user:1:id");
-```
-
-Finally, if you're working with raw deferred objects, there is a
-`makeNodeResolver` method on deferreds that can be handy:
-
-```javascript
-var deferred = Q.defer();
-FS.readFile("foo.txt", "utf-8", deferred.makeNodeResolver());
-return deferred.promise;
-```
-
-### Long Stack Traces
-
-Q comes with optional support for “long stack traces,” wherein the `stack`
-property of `Error` rejection reasons is rewritten to be traced along
-asynchronous jumps instead of stopping at the most recent one. As an example:
-
-```js
-function theDepthsOfMyProgram() {
-  Q.delay(100).done(function explode() {
-    throw new Error("boo!");
-  });
-}
-
-theDepthsOfMyProgram();
-```
-
-usually would give a rather unhelpful stack trace looking something like
-
-```
-Error: boo!
-    at explode (/path/to/test.js:3:11)
-    at _fulfilled (/path/to/test.js:q:54)
-    at resolvedValue.promiseDispatch.done (/path/to/q.js:823:30)
-    at makePromise.promise.promiseDispatch (/path/to/q.js:496:13)
-    at pending (/path/to/q.js:397:39)
-    at process.startup.processNextTick.process._tickCallback (node.js:244:9)
-```
-
-But, if you turn this feature on by setting
-
-```js
-Q.longStackSupport = true;
-```
-
-then the above code gives a nice stack trace to the tune of
-
-```
-Error: boo!
-    at explode (/path/to/test.js:3:11)
-From previous event:
-    at theDepthsOfMyProgram (/path/to/test.js:2:16)
-    at Object.<anonymous> (/path/to/test.js:7:1)
-```
-
-Note how you can see the function that triggered the async operation in the
-stack trace! This is very helpful for debugging, as otherwise you end up getting
-only the first line, plus a bunch of Q internals, with no sign of where the
-operation started.
-
-In node.js, this feature can also be enabled through the Q_DEBUG environment
-variable:
-
-```
-Q_DEBUG=1 node server.js
-```
-
-This will enable long stack support in every instance of Q.
-
-This feature does come with somewhat-serious performance and memory overhead,
-however. If you're working with lots of promises, or trying to scale a server
-to many users, you should probably keep it off. But in development, go for it!
-
-## Tests
-
-You can view the results of the Q test suite [in your browser][tests]!
-
-[tests]: https://rawgithub.com/kriskowal/q/v1/spec/q-spec.html
-
-## License
-
-Copyright 2009–2017 Kristopher Michael Kowal and contributors
-MIT License (enclosed)
-
diff --git a/node_modules/q/package.json b/node_modules/q/package.json
deleted file mode 100644
index fdf7792..0000000
--- a/node_modules/q/package.json
+++ /dev/null
@@ -1,120 +0,0 @@
-{
-  "_args": [
-    [
-      "q@1.5.1",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "q@1.5.1",
-  "_id": "q@1.5.1",
-  "_inBundle": false,
-  "_integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
-  "_location": "/q",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "q@1.5.1",
-    "name": "q",
-    "escapedName": "q",
-    "rawSpec": "1.5.1",
-    "saveSpec": null,
-    "fetchSpec": "1.5.1"
-  },
-  "_requiredBy": [
-    "/",
-    "/cordova-common"
-  ],
-  "_resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
-  "_spec": "1.5.1",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Kris Kowal",
-    "email": "kris@cixar.com",
-    "url": "https://github.com/kriskowal"
-  },
-  "bugs": {
-    "url": "http://github.com/kriskowal/q/issues"
-  },
-  "contributors": [
-    {
-      "name": "Kris Kowal",
-      "email": "kris@cixar.com",
-      "url": "https://github.com/kriskowal"
-    },
-    {
-      "name": "Irakli Gozalishvili",
-      "email": "rfobic@gmail.com",
-      "url": "http://jeditoolkit.com"
-    },
-    {
-      "name": "Domenic Denicola",
-      "email": "domenic@domenicdenicola.com",
-      "url": "http://domenicdenicola.com"
-    }
-  ],
-  "dependencies": {},
-  "description": "A library for promises (CommonJS/Promises/A,B,D)",
-  "devDependencies": {
-    "cover": "*",
-    "grunt": "~0.4.1",
-    "grunt-cli": "~0.1.9",
-    "grunt-contrib-uglify": "~0.9.1",
-    "jasmine-node": "1.11.0",
-    "jshint": "~2.1.9",
-    "matcha": "~0.2.0",
-    "opener": "*",
-    "promises-aplus-tests": "1.x"
-  },
-  "directories": {
-    "test": "./spec"
-  },
-  "engines": {
-    "node": ">=0.6.0",
-    "teleport": ">=0.2.0"
-  },
-  "files": [
-    "LICENSE",
-    "q.js",
-    "queue.js"
-  ],
-  "homepage": "https://github.com/kriskowal/q",
-  "keywords": [
-    "q",
-    "promise",
-    "promises",
-    "promises-a",
-    "promises-aplus",
-    "deferred",
-    "future",
-    "async",
-    "flow control",
-    "fluent",
-    "browser",
-    "node"
-  ],
-  "license": "MIT",
-  "main": "q.js",
-  "name": "q",
-  "overlay": {
-    "teleport": {
-      "dependencies": {
-        "system": ">=0.0.4"
-      }
-    }
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/kriskowal/q.git"
-  },
-  "scripts": {
-    "benchmark": "matcha",
-    "cover": "cover run jasmine-node spec && cover report html && opener cover_html/index.html",
-    "lint": "jshint q.js",
-    "minify": "grunt",
-    "prepublish": "grunt",
-    "test": "npm ls -s && jasmine-node spec && promises-aplus-tests spec/aplus-adapter && npm run -s lint",
-    "test-browser": "opener spec/q-spec.html"
-  },
-  "version": "1.5.1"
-}
diff --git a/node_modules/q/q.js b/node_modules/q/q.js
deleted file mode 100644
index 6e46795..0000000
--- a/node_modules/q/q.js
+++ /dev/null
@@ -1,2076 +0,0 @@
-// vim:ts=4:sts=4:sw=4:
-/*!
- *
- * Copyright 2009-2017 Kris Kowal under the terms of the MIT
- * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
- *
- * With parts by Tyler Close
- * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
- * at http://www.opensource.org/licenses/mit-license.html
- * Forked at ref_send.js version: 2009-05-11
- *
- * With parts by Mark Miller
- * Copyright (C) 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-(function (definition) {
-    "use strict";
-
-    // This file will function properly as a <script> tag, or a module
-    // using CommonJS and NodeJS or RequireJS module formats.  In
-    // Common/Node/RequireJS, the module exports the Q API and when
-    // executed as a simple <script>, it creates a Q global instead.
-
-    // Montage Require
-    if (typeof bootstrap === "function") {
-        bootstrap("promise", definition);
-
-    // CommonJS
-    } else if (typeof exports === "object" && typeof module === "object") {
-        module.exports = definition();
-
-    // RequireJS
-    } else if (typeof define === "function" && define.amd) {
-        define(definition);
-
-    // SES (Secure EcmaScript)
-    } else if (typeof ses !== "undefined") {
-        if (!ses.ok()) {
-            return;
-        } else {
-            ses.makeQ = definition;
-        }
-
-    // <script>
-    } else if (typeof window !== "undefined" || typeof self !== "undefined") {
-        // Prefer window over self for add-on scripts. Use self for
-        // non-windowed contexts.
-        var global = typeof window !== "undefined" ? window : self;
-
-        // Get the `window` object, save the previous Q global
-        // and initialize Q as a global.
-        var previousQ = global.Q;
-        global.Q = definition();
-
-        // Add a noConflict function so Q can be removed from the
-        // global namespace.
-        global.Q.noConflict = function () {
-            global.Q = previousQ;
-            return this;
-        };
-
-    } else {
-        throw new Error("This environment was not anticipated by Q. Please file a bug.");
-    }
-
-})(function () {
-"use strict";
-
-var hasStacks = false;
-try {
-    throw new Error();
-} catch (e) {
-    hasStacks = !!e.stack;
-}
-
-// All code after this point will be filtered from stack traces reported
-// by Q.
-var qStartingLine = captureLine();
-var qFileName;
-
-// shims
-
-// used for fallback in "allResolved"
-var noop = function () {};
-
-// Use the fastest possible means to execute a task in a future turn
-// of the event loop.
-var nextTick =(function () {
-    // linked list of tasks (single, with head node)
-    var head = {task: void 0, next: null};
-    var tail = head;
-    var flushing = false;
-    var requestTick = void 0;
-    var isNodeJS = false;
-    // queue for late tasks, used by unhandled rejection tracking
-    var laterQueue = [];
-
-    function flush() {
-        /* jshint loopfunc: true */
-        var task, domain;
-
-        while (head.next) {
-            head = head.next;
-            task = head.task;
-            head.task = void 0;
-            domain = head.domain;
-
-            if (domain) {
-                head.domain = void 0;
-                domain.enter();
-            }
-            runSingle(task, domain);
-
-        }
-        while (laterQueue.length) {
-            task = laterQueue.pop();
-            runSingle(task);
-        }
-        flushing = false;
-    }
-    // runs a single function in the async queue
-    function runSingle(task, domain) {
-        try {
-            task();
-
-        } catch (e) {
-            if (isNodeJS) {
-                // In node, uncaught exceptions are considered fatal errors.
-                // Re-throw them synchronously to interrupt flushing!
-
-                // Ensure continuation if the uncaught exception is suppressed
-                // listening "uncaughtException" events (as domains does).
-                // Continue in next event to avoid tick recursion.
-                if (domain) {
-                    domain.exit();
-                }
-                setTimeout(flush, 0);
-                if (domain) {
-                    domain.enter();
-                }
-
-                throw e;
-
-            } else {
-                // In browsers, uncaught exceptions are not fatal.
-                // Re-throw them asynchronously to avoid slow-downs.
-                setTimeout(function () {
-                    throw e;
-                }, 0);
-            }
-        }
-
-        if (domain) {
-            domain.exit();
-        }
-    }
-
-    nextTick = function (task) {
-        tail = tail.next = {
-            task: task,
-            domain: isNodeJS && process.domain,
-            next: null
-        };
-
-        if (!flushing) {
-            flushing = true;
-            requestTick();
-        }
-    };
-
-    if (typeof process === "object" &&
-        process.toString() === "[object process]" && process.nextTick) {
-        // Ensure Q is in a real Node environment, with a `process.nextTick`.
-        // To see through fake Node environments:
-        // * Mocha test runner - exposes a `process` global without a `nextTick`
-        // * Browserify - exposes a `process.nexTick` function that uses
-        //   `setTimeout`. In this case `setImmediate` is preferred because
-        //    it is faster. Browserify's `process.toString()` yields
-        //   "[object Object]", while in a real Node environment
-        //   `process.toString()` yields "[object process]".
-        isNodeJS = true;
-
-        requestTick = function () {
-            process.nextTick(flush);
-        };
-
-    } else if (typeof setImmediate === "function") {
-        // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
-        if (typeof window !== "undefined") {
-            requestTick = setImmediate.bind(window, flush);
-        } else {
-            requestTick = function () {
-                setImmediate(flush);
-            };
-        }
-
-    } else if (typeof MessageChannel !== "undefined") {
-        // modern browsers
-        // http://www.nonblocking.io/2011/06/windownexttick.html
-        var channel = new MessageChannel();
-        // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
-        // working message ports the first time a page loads.
-        channel.port1.onmessage = function () {
-            requestTick = requestPortTick;
-            channel.port1.onmessage = flush;
-            flush();
-        };
-        var requestPortTick = function () {
-            // Opera requires us to provide a message payload, regardless of
-            // whether we use it.
-            channel.port2.postMessage(0);
-        };
-        requestTick = function () {
-            setTimeout(flush, 0);
-            requestPortTick();
-        };
-
-    } else {
-        // old browsers
-        requestTick = function () {
-            setTimeout(flush, 0);
-        };
-    }
-    // runs a task after all other tasks have been run
-    // this is useful for unhandled rejection tracking that needs to happen
-    // after all `then`d tasks have been run.
-    nextTick.runAfter = function (task) {
-        laterQueue.push(task);
-        if (!flushing) {
-            flushing = true;
-            requestTick();
-        }
-    };
-    return nextTick;
-})();
-
-// Attempt to make generics safe in the face of downstream
-// modifications.
-// There is no situation where this is necessary.
-// If you need a security guarantee, these primordials need to be
-// deeply frozen anyway, and if you don’t need a security guarantee,
-// this is just plain paranoid.
-// However, this **might** have the nice side-effect of reducing the size of
-// the minified code by reducing x.call() to merely x()
-// See Mark Miller’s explanation of what this does.
-// http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
-var call = Function.call;
-function uncurryThis(f) {
-    return function () {
-        return call.apply(f, arguments);
-    };
-}
-// This is equivalent, but slower:
-// uncurryThis = Function_bind.bind(Function_bind.call);
-// http://jsperf.com/uncurrythis
-
-var array_slice = uncurryThis(Array.prototype.slice);
-
-var array_reduce = uncurryThis(
-    Array.prototype.reduce || function (callback, basis) {
-        var index = 0,
-            length = this.length;
-        // concerning the initial value, if one is not provided
-        if (arguments.length === 1) {
-            // seek to the first value in the array, accounting
-            // for the possibility that is is a sparse array
-            do {
-                if (index in this) {
-                    basis = this[index++];
-                    break;
-                }
-                if (++index >= length) {
-                    throw new TypeError();
-                }
-            } while (1);
-        }
-        // reduce
-        for (; index < length; index++) {
-            // account for the possibility that the array is sparse
-            if (index in this) {
-                basis = callback(basis, this[index], index);
-            }
-        }
-        return basis;
-    }
-);
-
-var array_indexOf = uncurryThis(
-    Array.prototype.indexOf || function (value) {
-        // not a very good shim, but good enough for our one use of it
-        for (var i = 0; i < this.length; i++) {
-            if (this[i] === value) {
-                return i;
-            }
-        }
-        return -1;
-    }
-);
-
-var array_map = uncurryThis(
-    Array.prototype.map || function (callback, thisp) {
-        var self = this;
-        var collect = [];
-        array_reduce(self, function (undefined, value, index) {
-            collect.push(callback.call(thisp, value, index, self));
-        }, void 0);
-        return collect;
-    }
-);
-
-var object_create = Object.create || function (prototype) {
-    function Type() { }
-    Type.prototype = prototype;
-    return new Type();
-};
-
-var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
-    obj[prop] = descriptor.value;
-    return obj;
-};
-
-var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
-
-var object_keys = Object.keys || function (object) {
-    var keys = [];
-    for (var key in object) {
-        if (object_hasOwnProperty(object, key)) {
-            keys.push(key);
-        }
-    }
-    return keys;
-};
-
-var object_toString = uncurryThis(Object.prototype.toString);
-
-function isObject(value) {
-    return value === Object(value);
-}
-
-// generator related shims
-
-// FIXME: Remove this function once ES6 generators are in SpiderMonkey.
-function isStopIteration(exception) {
-    return (
-        object_toString(exception) === "[object StopIteration]" ||
-        exception instanceof QReturnValue
-    );
-}
-
-// FIXME: Remove this helper and Q.return once ES6 generators are in
-// SpiderMonkey.
-var QReturnValue;
-if (typeof ReturnValue !== "undefined") {
-    QReturnValue = ReturnValue;
-} else {
-    QReturnValue = function (value) {
-        this.value = value;
-    };
-}
-
-// long stack traces
-
-var STACK_JUMP_SEPARATOR = "From previous event:";
-
-function makeStackTraceLong(error, promise) {
-    // If possible, transform the error stack trace by removing Node and Q
-    // cruft, then concatenating with the stack trace of `promise`. See #57.
-    if (hasStacks &&
-        promise.stack &&
-        typeof error === "object" &&
-        error !== null &&
-        error.stack
-    ) {
-        var stacks = [];
-        for (var p = promise; !!p; p = p.source) {
-            if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
-                object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
-                stacks.unshift(p.stack);
-            }
-        }
-        stacks.unshift(error.stack);
-
-        var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
-        var stack = filterStackString(concatedStacks);
-        object_defineProperty(error, "stack", {value: stack, configurable: true});
-    }
-}
-
-function filterStackString(stackString) {
-    var lines = stackString.split("\n");
-    var desiredLines = [];
-    for (var i = 0; i < lines.length; ++i) {
-        var line = lines[i];
-
-        if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
-            desiredLines.push(line);
-        }
-    }
-    return desiredLines.join("\n");
-}
-
-function isNodeFrame(stackLine) {
-    return stackLine.indexOf("(module.js:") !== -1 ||
-           stackLine.indexOf("(node.js:") !== -1;
-}
-
-function getFileNameAndLineNumber(stackLine) {
-    // Named functions: "at functionName (filename:lineNumber:columnNumber)"
-    // In IE10 function name can have spaces ("Anonymous function") O_o
-    var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
-    if (attempt1) {
-        return [attempt1[1], Number(attempt1[2])];
-    }
-
-    // Anonymous functions: "at filename:lineNumber:columnNumber"
-    var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
-    if (attempt2) {
-        return [attempt2[1], Number(attempt2[2])];
-    }
-
-    // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
-    var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
-    if (attempt3) {
-        return [attempt3[1], Number(attempt3[2])];
-    }
-}
-
-function isInternalFrame(stackLine) {
-    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
-
-    if (!fileNameAndLineNumber) {
-        return false;
-    }
-
-    var fileName = fileNameAndLineNumber[0];
-    var lineNumber = fileNameAndLineNumber[1];
-
-    return fileName === qFileName &&
-        lineNumber >= qStartingLine &&
-        lineNumber <= qEndingLine;
-}
-
-// discover own file name and line number range for filtering stack
-// traces
-function captureLine() {
-    if (!hasStacks) {
-        return;
-    }
-
-    try {
-        throw new Error();
-    } catch (e) {
-        var lines = e.stack.split("\n");
-        var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
-        var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
-        if (!fileNameAndLineNumber) {
-            return;
-        }
-
-        qFileName = fileNameAndLineNumber[0];
-        return fileNameAndLineNumber[1];
-    }
-}
-
-function deprecate(callback, name, alternative) {
-    return function () {
-        if (typeof console !== "undefined" &&
-            typeof console.warn === "function") {
-            console.warn(name + " is deprecated, use " + alternative +
-                         " instead.", new Error("").stack);
-        }
-        return callback.apply(callback, arguments);
-    };
-}
-
-// end of shims
-// beginning of real work
-
-/**
- * Constructs a promise for an immediate reference, passes promises through, or
- * coerces promises from different systems.
- * @param value immediate reference or promise
- */
-function Q(value) {
-    // If the object is already a Promise, return it directly.  This enables
-    // the resolve function to both be used to created references from objects,
-    // but to tolerably coerce non-promises to promises.
-    if (value instanceof Promise) {
-        return value;
-    }
-
-    // assimilate thenables
-    if (isPromiseAlike(value)) {
-        return coerce(value);
-    } else {
-        return fulfill(value);
-    }
-}
-Q.resolve = Q;
-
-/**
- * Performs a task in a future turn of the event loop.
- * @param {Function} task
- */
-Q.nextTick = nextTick;
-
-/**
- * Controls whether or not long stack traces will be on
- */
-Q.longStackSupport = false;
-
-/**
- * The counter is used to determine the stopping point for building
- * long stack traces. In makeStackTraceLong we walk backwards through
- * the linked list of promises, only stacks which were created before
- * the rejection are concatenated.
- */
-var longStackCounter = 1;
-
-// enable long stacks if Q_DEBUG is set
-if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
-    Q.longStackSupport = true;
-}
-
-/**
- * Constructs a {promise, resolve, reject} object.
- *
- * `resolve` is a callback to invoke with a more resolved value for the
- * promise. To fulfill the promise, invoke `resolve` with any value that is
- * not a thenable. To reject the promise, invoke `resolve` with a rejected
- * thenable, or invoke `reject` with the reason directly. To resolve the
- * promise to another thenable, thus putting it in the same state, invoke
- * `resolve` with that other thenable.
- */
-Q.defer = defer;
-function defer() {
-    // if "messages" is an "Array", that indicates that the promise has not yet
-    // been resolved.  If it is "undefined", it has been resolved.  Each
-    // element of the messages array is itself an array of complete arguments to
-    // forward to the resolved promise.  We coerce the resolution value to a
-    // promise using the `resolve` function because it handles both fully
-    // non-thenable values and other thenables gracefully.
-    var messages = [], progressListeners = [], resolvedPromise;
-
-    var deferred = object_create(defer.prototype);
-    var promise = object_create(Promise.prototype);
-
-    promise.promiseDispatch = function (resolve, op, operands) {
-        var args = array_slice(arguments);
-        if (messages) {
-            messages.push(args);
-            if (op === "when" && operands[1]) { // progress operand
-                progressListeners.push(operands[1]);
-            }
-        } else {
-            Q.nextTick(function () {
-                resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
-            });
-        }
-    };
-
-    // XXX deprecated
-    promise.valueOf = function () {
-        if (messages) {
-            return promise;
-        }
-        var nearerValue = nearer(resolvedPromise);
-        if (isPromise(nearerValue)) {
-            resolvedPromise = nearerValue; // shorten chain
-        }
-        return nearerValue;
-    };
-
-    promise.inspect = function () {
-        if (!resolvedPromise) {
-            return { state: "pending" };
-        }
-        return resolvedPromise.inspect();
-    };
-
-    if (Q.longStackSupport && hasStacks) {
-        try {
-            throw new Error();
-        } catch (e) {
-            // NOTE: don't try to use `Error.captureStackTrace` or transfer the
-            // accessor around; that causes memory leaks as per GH-111. Just
-            // reify the stack trace as a string ASAP.
-            //
-            // At the same time, cut off the first line; it's always just
-            // "[object Promise]\n", as per the `toString`.
-            promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
-            promise.stackCounter = longStackCounter++;
-        }
-    }
-
-    // NOTE: we do the checks for `resolvedPromise` in each method, instead of
-    // consolidating them into `become`, since otherwise we'd create new
-    // promises with the lines `become(whatever(value))`. See e.g. GH-252.
-
-    function become(newPromise) {
-        resolvedPromise = newPromise;
-
-        if (Q.longStackSupport && hasStacks) {
-            // Only hold a reference to the new promise if long stacks
-            // are enabled to reduce memory usage
-            promise.source = newPromise;
-        }
-
-        array_reduce(messages, function (undefined, message) {
-            Q.nextTick(function () {
-                newPromise.promiseDispatch.apply(newPromise, message);
-            });
-        }, void 0);
-
-        messages = void 0;
-        progressListeners = void 0;
-    }
-
-    deferred.promise = promise;
-    deferred.resolve = function (value) {
-        if (resolvedPromise) {
-            return;
-        }
-
-        become(Q(value));
-    };
-
-    deferred.fulfill = function (value) {
-        if (resolvedPromise) {
-            return;
-        }
-
-        become(fulfill(value));
-    };
-    deferred.reject = function (reason) {
-        if (resolvedPromise) {
-            return;
-        }
-
-        become(reject(reason));
-    };
-    deferred.notify = function (progress) {
-        if (resolvedPromise) {
-            return;
-        }
-
-        array_reduce(progressListeners, function (undefined, progressListener) {
-            Q.nextTick(function () {
-                progressListener(progress);
-            });
-        }, void 0);
-    };
-
-    return deferred;
-}
-
-/**
- * Creates a Node-style callback that will resolve or reject the deferred
- * promise.
- * @returns a nodeback
- */
-defer.prototype.makeNodeResolver = function () {
-    var self = this;
-    return function (error, value) {
-        if (error) {
-            self.reject(error);
-        } else if (arguments.length > 2) {
-            self.resolve(array_slice(arguments, 1));
-        } else {
-            self.resolve(value);
-        }
-    };
-};
-
-/**
- * @param resolver {Function} a function that returns nothing and accepts
- * the resolve, reject, and notify functions for a deferred.
- * @returns a promise that may be resolved with the given resolve and reject
- * functions, or rejected by a thrown exception in resolver
- */
-Q.Promise = promise; // ES6
-Q.promise = promise;
-function promise(resolver) {
-    if (typeof resolver !== "function") {
-        throw new TypeError("resolver must be a function.");
-    }
-    var deferred = defer();
-    try {
-        resolver(deferred.resolve, deferred.reject, deferred.notify);
-    } catch (reason) {
-        deferred.reject(reason);
-    }
-    return deferred.promise;
-}
-
-promise.race = race; // ES6
-promise.all = all; // ES6
-promise.reject = reject; // ES6
-promise.resolve = Q; // ES6
-
-// XXX experimental.  This method is a way to denote that a local value is
-// serializable and should be immediately dispatched to a remote upon request,
-// instead of passing a reference.
-Q.passByCopy = function (object) {
-    //freeze(object);
-    //passByCopies.set(object, true);
-    return object;
-};
-
-Promise.prototype.passByCopy = function () {
-    //freeze(object);
-    //passByCopies.set(object, true);
-    return this;
-};
-
-/**
- * If two promises eventually fulfill to the same value, promises that value,
- * but otherwise rejects.
- * @param x {Any*}
- * @param y {Any*}
- * @returns {Any*} a promise for x and y if they are the same, but a rejection
- * otherwise.
- *
- */
-Q.join = function (x, y) {
-    return Q(x).join(y);
-};
-
-Promise.prototype.join = function (that) {
-    return Q([this, that]).spread(function (x, y) {
-        if (x === y) {
-            // TODO: "===" should be Object.is or equiv
-            return x;
-        } else {
-            throw new Error("Q can't join: not the same: " + x + " " + y);
-        }
-    });
-};
-
-/**
- * Returns a promise for the first of an array of promises to become settled.
- * @param answers {Array[Any*]} promises to race
- * @returns {Any*} the first promise to be settled
- */
-Q.race = race;
-function race(answerPs) {
-    return promise(function (resolve, reject) {
-        // Switch to this once we can assume at least ES5
-        // answerPs.forEach(function (answerP) {
-        //     Q(answerP).then(resolve, reject);
-        // });
-        // Use this in the meantime
-        for (var i = 0, len = answerPs.length; i < len; i++) {
-            Q(answerPs[i]).then(resolve, reject);
-        }
-    });
-}
-
-Promise.prototype.race = function () {
-    return this.then(Q.race);
-};
-
-/**
- * Constructs a Promise with a promise descriptor object and optional fallback
- * function.  The descriptor contains methods like when(rejected), get(name),
- * set(name, value), post(name, args), and delete(name), which all
- * return either a value, a promise for a value, or a rejection.  The fallback
- * accepts the operation name, a resolver, and any further arguments that would
- * have been forwarded to the appropriate method above had a method been
- * provided with the proper name.  The API makes no guarantees about the nature
- * of the returned object, apart from that it is usable whereever promises are
- * bought and sold.
- */
-Q.makePromise = Promise;
-function Promise(descriptor, fallback, inspect) {
-    if (fallback === void 0) {
-        fallback = function (op) {
-            return reject(new Error(
-                "Promise does not support operation: " + op
-            ));
-        };
-    }
-    if (inspect === void 0) {
-        inspect = function () {
-            return {state: "unknown"};
-        };
-    }
-
-    var promise = object_create(Promise.prototype);
-
-    promise.promiseDispatch = function (resolve, op, args) {
-        var result;
-        try {
-            if (descriptor[op]) {
-                result = descriptor[op].apply(promise, args);
-            } else {
-                result = fallback.call(promise, op, args);
-            }
-        } catch (exception) {
-            result = reject(exception);
-        }
-        if (resolve) {
-            resolve(result);
-        }
-    };
-
-    promise.inspect = inspect;
-
-    // XXX deprecated `valueOf` and `exception` support
-    if (inspect) {
-        var inspected = inspect();
-        if (inspected.state === "rejected") {
-            promise.exception = inspected.reason;
-        }
-
-        promise.valueOf = function () {
-            var inspected = inspect();
-            if (inspected.state === "pending" ||
-                inspected.state === "rejected") {
-                return promise;
-            }
-            return inspected.value;
-        };
-    }
-
-    return promise;
-}
-
-Promise.prototype.toString = function () {
-    return "[object Promise]";
-};
-
-Promise.prototype.then = function (fulfilled, rejected, progressed) {
-    var self = this;
-    var deferred = defer();
-    var done = false;   // ensure the untrusted promise makes at most a
-                        // single call to one of the callbacks
-
-    function _fulfilled(value) {
-        try {
-            return typeof fulfilled === "function" ? fulfilled(value) : value;
-        } catch (exception) {
-            return reject(exception);
-        }
-    }
-
-    function _rejected(exception) {
-        if (typeof rejected === "function") {
-            makeStackTraceLong(exception, self);
-            try {
-                return rejected(exception);
-            } catch (newException) {
-                return reject(newException);
-            }
-        }
-        return reject(exception);
-    }
-
-    function _progressed(value) {
-        return typeof progressed === "function" ? progressed(value) : value;
-    }
-
-    Q.nextTick(function () {
-        self.promiseDispatch(function (value) {
-            if (done) {
-                return;
-            }
-            done = true;
-
-            deferred.resolve(_fulfilled(value));
-        }, "when", [function (exception) {
-            if (done) {
-                return;
-            }
-            done = true;
-
-            deferred.resolve(_rejected(exception));
-        }]);
-    });
-
-    // Progress propagator need to be attached in the current tick.
-    self.promiseDispatch(void 0, "when", [void 0, function (value) {
-        var newValue;
-        var threw = false;
-        try {
-            newValue = _progressed(value);
-        } catch (e) {
-            threw = true;
-            if (Q.onerror) {
-                Q.onerror(e);
-            } else {
-                throw e;
-            }
-        }
-
-        if (!threw) {
-            deferred.notify(newValue);
-        }
-    }]);
-
-    return deferred.promise;
-};
-
-Q.tap = function (promise, callback) {
-    return Q(promise).tap(callback);
-};
-
-/**
- * Works almost like "finally", but not called for rejections.
- * Original resolution value is passed through callback unaffected.
- * Callback may return a promise that will be awaited for.
- * @param {Function} callback
- * @returns {Q.Promise}
- * @example
- * doSomething()
- *   .then(...)
- *   .tap(console.log)
- *   .then(...);
- */
-Promise.prototype.tap = function (callback) {
-    callback = Q(callback);
-
-    return this.then(function (value) {
-        return callback.fcall(value).thenResolve(value);
-    });
-};
-
-/**
- * Registers an observer on a promise.
- *
- * Guarantees:
- *
- * 1. that fulfilled and rejected will be called only once.
- * 2. that either the fulfilled callback or the rejected callback will be
- *    called, but not both.
- * 3. that fulfilled and rejected will not be called in this turn.
- *
- * @param value      promise or immediate reference to observe
- * @param fulfilled  function to be called with the fulfilled value
- * @param rejected   function to be called with the rejection exception
- * @param progressed function to be called on any progress notifications
- * @return promise for the return value from the invoked callback
- */
-Q.when = when;
-function when(value, fulfilled, rejected, progressed) {
-    return Q(value).then(fulfilled, rejected, progressed);
-}
-
-Promise.prototype.thenResolve = function (value) {
-    return this.then(function () { return value; });
-};
-
-Q.thenResolve = function (promise, value) {
-    return Q(promise).thenResolve(value);
-};
-
-Promise.prototype.thenReject = function (reason) {
-    return this.then(function () { throw reason; });
-};
-
-Q.thenReject = function (promise, reason) {
-    return Q(promise).thenReject(reason);
-};
-
-/**
- * If an object is not a promise, it is as "near" as possible.
- * If a promise is rejected, it is as "near" as possible too.
- * If it’s a fulfilled promise, the fulfillment value is nearer.
- * If it’s a deferred promise and the deferred has been resolved, the
- * resolution is "nearer".
- * @param object
- * @returns most resolved (nearest) form of the object
- */
-
-// XXX should we re-do this?
-Q.nearer = nearer;
-function nearer(value) {
-    if (isPromise(value)) {
-        var inspected = value.inspect();
-        if (inspected.state === "fulfilled") {
-            return inspected.value;
-        }
-    }
-    return value;
-}
-
-/**
- * @returns whether the given object is a promise.
- * Otherwise it is a fulfilled value.
- */
-Q.isPromise = isPromise;
-function isPromise(object) {
-    return object instanceof Promise;
-}
-
-Q.isPromiseAlike = isPromiseAlike;
-function isPromiseAlike(object) {
-    return isObject(object) && typeof object.then === "function";
-}
-
-/**
- * @returns whether the given object is a pending promise, meaning not
- * fulfilled or rejected.
- */
-Q.isPending = isPending;
-function isPending(object) {
-    return isPromise(object) && object.inspect().state === "pending";
-}
-
-Promise.prototype.isPending = function () {
-    return this.inspect().state === "pending";
-};
-
-/**
- * @returns whether the given object is a value or fulfilled
- * promise.
- */
-Q.isFulfilled = isFulfilled;
-function isFulfilled(object) {
-    return !isPromise(object) || object.inspect().state === "fulfilled";
-}
-
-Promise.prototype.isFulfilled = function () {
-    return this.inspect().state === "fulfilled";
-};
-
-/**
- * @returns whether the given object is a rejected promise.
- */
-Q.isRejected = isRejected;
-function isRejected(object) {
-    return isPromise(object) && object.inspect().state === "rejected";
-}
-
-Promise.prototype.isRejected = function () {
-    return this.inspect().state === "rejected";
-};
-
-//// BEGIN UNHANDLED REJECTION TRACKING
-
-// This promise library consumes exceptions thrown in handlers so they can be
-// handled by a subsequent promise.  The exceptions get added to this array when
-// they are created, and removed when they are handled.  Note that in ES6 or
-// shimmed environments, this would naturally be a `Set`.
-var unhandledReasons = [];
-var unhandledRejections = [];
-var reportedUnhandledRejections = [];
-var trackUnhandledRejections = true;
-
-function resetUnhandledRejections() {
-    unhandledReasons.length = 0;
-    unhandledRejections.length = 0;
-
-    if (!trackUnhandledRejections) {
-        trackUnhandledRejections = true;
-    }
-}
-
-function trackRejection(promise, reason) {
-    if (!trackUnhandledRejections) {
-        return;
-    }
-    if (typeof process === "object" && typeof process.emit === "function") {
-        Q.nextTick.runAfter(function () {
-            if (array_indexOf(unhandledRejections, promise) !== -1) {
-                process.emit("unhandledRejection", reason, promise);
-                reportedUnhandledRejections.push(promise);
-            }
-        });
-    }
-
-    unhandledRejections.push(promise);
-    if (reason && typeof reason.stack !== "undefined") {
-        unhandledReasons.push(reason.stack);
-    } else {
-        unhandledReasons.push("(no stack) " + reason);
-    }
-}
-
-function untrackRejection(promise) {
-    if (!trackUnhandledRejections) {
-        return;
-    }
-
-    var at = array_indexOf(unhandledRejections, promise);
-    if (at !== -1) {
-        if (typeof process === "object" && typeof process.emit === "function") {
-            Q.nextTick.runAfter(function () {
-                var atReport = array_indexOf(reportedUnhandledRejections, promise);
-                if (atReport !== -1) {
-                    process.emit("rejectionHandled", unhandledReasons[at], promise);
-                    reportedUnhandledRejections.splice(atReport, 1);
-                }
-            });
-        }
-        unhandledRejections.splice(at, 1);
-        unhandledReasons.splice(at, 1);
-    }
-}
-
-Q.resetUnhandledRejections = resetUnhandledRejections;
-
-Q.getUnhandledReasons = function () {
-    // Make a copy so that consumers can't interfere with our internal state.
-    return unhandledReasons.slice();
-};
-
-Q.stopUnhandledRejectionTracking = function () {
-    resetUnhandledRejections();
-    trackUnhandledRejections = false;
-};
-
-resetUnhandledRejections();
-
-//// END UNHANDLED REJECTION TRACKING
-
-/**
- * Constructs a rejected promise.
- * @param reason value describing the failure
- */
-Q.reject = reject;
-function reject(reason) {
-    var rejection = Promise({
-        "when": function (rejected) {
-            // note that the error has been handled
-            if (rejected) {
-                untrackRejection(this);
-            }
-            return rejected ? rejected(reason) : this;
-        }
-    }, function fallback() {
-        return this;
-    }, function inspect() {
-        return { state: "rejected", reason: reason };
-    });
-
-    // Note that the reason has not been handled.
-    trackRejection(rejection, reason);
-
-    return rejection;
-}
-
-/**
- * Constructs a fulfilled promise for an immediate reference.
- * @param value immediate reference
- */
-Q.fulfill = fulfill;
-function fulfill(value) {
-    return Promise({
-        "when": function () {
-            return value;
-        },
-        "get": function (name) {
-            return value[name];
-        },
-        "set": function (name, rhs) {
-            value[name] = rhs;
-        },
-        "delete": function (name) {
-            delete value[name];
-        },
-        "post": function (name, args) {
-            // Mark Miller proposes that post with no name should apply a
-            // promised function.
-            if (name === null || name === void 0) {
-                return value.apply(void 0, args);
-            } else {
-                return value[name].apply(value, args);
-            }
-        },
-        "apply": function (thisp, args) {
-            return value.apply(thisp, args);
-        },
-        "keys": function () {
-            return object_keys(value);
-        }
-    }, void 0, function inspect() {
-        return { state: "fulfilled", value: value };
-    });
-}
-
-/**
- * Converts thenables to Q promises.
- * @param promise thenable promise
- * @returns a Q promise
- */
-function coerce(promise) {
-    var deferred = defer();
-    Q.nextTick(function () {
-        try {
-            promise.then(deferred.resolve, deferred.reject, deferred.notify);
-        } catch (exception) {
-            deferred.reject(exception);
-        }
-    });
-    return deferred.promise;
-}
-
-/**
- * Annotates an object such that it will never be
- * transferred away from this process over any promise
- * communication channel.
- * @param object
- * @returns promise a wrapping of that object that
- * additionally responds to the "isDef" message
- * without a rejection.
- */
-Q.master = master;
-function master(object) {
-    return Promise({
-        "isDef": function () {}
-    }, function fallback(op, args) {
-        return dispatch(object, op, args);
-    }, function () {
-        return Q(object).inspect();
-    });
-}
-
-/**
- * Spreads the values of a promised array of arguments into the
- * fulfillment callback.
- * @param fulfilled callback that receives variadic arguments from the
- * promised array
- * @param rejected callback that receives the exception if the promise
- * is rejected.
- * @returns a promise for the return value or thrown exception of
- * either callback.
- */
-Q.spread = spread;
-function spread(value, fulfilled, rejected) {
-    return Q(value).spread(fulfilled, rejected);
-}
-
-Promise.prototype.spread = function (fulfilled, rejected) {
-    return this.all().then(function (array) {
-        return fulfilled.apply(void 0, array);
-    }, rejected);
-};
-
-/**
- * The async function is a decorator for generator functions, turning
- * them into asynchronous generators.  Although generators are only part
- * of the newest ECMAScript 6 drafts, this code does not cause syntax
- * errors in older engines.  This code should continue to work and will
- * in fact improve over time as the language improves.
- *
- * ES6 generators are currently part of V8 version 3.19 with the
- * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
- * for longer, but under an older Python-inspired form.  This function
- * works on both kinds of generators.
- *
- * Decorates a generator function such that:
- *  - it may yield promises
- *  - execution will continue when that promise is fulfilled
- *  - the value of the yield expression will be the fulfilled value
- *  - it returns a promise for the return value (when the generator
- *    stops iterating)
- *  - the decorated function returns a promise for the return value
- *    of the generator or the first rejected promise among those
- *    yielded.
- *  - if an error is thrown in the generator, it propagates through
- *    every following yield until it is caught, or until it escapes
- *    the generator function altogether, and is translated into a
- *    rejection for the promise returned by the decorated generator.
- */
-Q.async = async;
-function async(makeGenerator) {
-    return function () {
-        // when verb is "send", arg is a value
-        // when verb is "throw", arg is an exception
-        function continuer(verb, arg) {
-            var result;
-
-            // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
-            // engine that has a deployed base of browsers that support generators.
-            // However, SM's generators use the Python-inspired semantics of
-            // outdated ES6 drafts.  We would like to support ES6, but we'd also
-            // like to make it possible to use generators in deployed browsers, so
-            // we also support Python-style generators.  At some point we can remove
-            // this block.
-
-            if (typeof StopIteration === "undefined") {
-                // ES6 Generators
-                try {
-                    result = generator[verb](arg);
-                } catch (exception) {
-                    return reject(exception);
-                }
-                if (result.done) {
-                    return Q(result.value);
-                } else {
-                    return when(result.value, callback, errback);
-                }
-            } else {
-                // SpiderMonkey Generators
-                // FIXME: Remove this case when SM does ES6 generators.
-                try {
-                    result = generator[verb](arg);
-                } catch (exception) {
-                    if (isStopIteration(exception)) {
-                        return Q(exception.value);
-                    } else {
-                        return reject(exception);
-                    }
-                }
-                return when(result, callback, errback);
-            }
-        }
-        var generator = makeGenerator.apply(this, arguments);
-        var callback = continuer.bind(continuer, "next");
-        var errback = continuer.bind(continuer, "throw");
-        return callback();
-    };
-}
-
-/**
- * The spawn function is a small wrapper around async that immediately
- * calls the generator and also ends the promise chain, so that any
- * unhandled errors are thrown instead of forwarded to the error
- * handler. This is useful because it's extremely common to run
- * generators at the top-level to work with libraries.
- */
-Q.spawn = spawn;
-function spawn(makeGenerator) {
-    Q.done(Q.async(makeGenerator)());
-}
-
-// FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
-/**
- * Throws a ReturnValue exception to stop an asynchronous generator.
- *
- * This interface is a stop-gap measure to support generator return
- * values in older Firefox/SpiderMonkey.  In browsers that support ES6
- * generators like Chromium 29, just use "return" in your generator
- * functions.
- *
- * @param value the return value for the surrounding generator
- * @throws ReturnValue exception with the value.
- * @example
- * // ES6 style
- * Q.async(function* () {
- *      var foo = yield getFooPromise();
- *      var bar = yield getBarPromise();
- *      return foo + bar;
- * })
- * // Older SpiderMonkey style
- * Q.async(function () {
- *      var foo = yield getFooPromise();
- *      var bar = yield getBarPromise();
- *      Q.return(foo + bar);
- * })
- */
-Q["return"] = _return;
-function _return(value) {
-    throw new QReturnValue(value);
-}
-
-/**
- * The promised function decorator ensures that any promise arguments
- * are settled and passed as values (`this` is also settled and passed
- * as a value).  It will also ensure that the result of a function is
- * always a promise.
- *
- * @example
- * var add = Q.promised(function (a, b) {
- *     return a + b;
- * });
- * add(Q(a), Q(B));
- *
- * @param {function} callback The function to decorate
- * @returns {function} a function that has been decorated.
- */
-Q.promised = promised;
-function promised(callback) {
-    return function () {
-        return spread([this, all(arguments)], function (self, args) {
-            return callback.apply(self, args);
-        });
-    };
-}
-
-/**
- * sends a message to a value in a future turn
- * @param object* the recipient
- * @param op the name of the message operation, e.g., "when",
- * @param args further arguments to be forwarded to the operation
- * @returns result {Promise} a promise for the result of the operation
- */
-Q.dispatch = dispatch;
-function dispatch(object, op, args) {
-    return Q(object).dispatch(op, args);
-}
-
-Promise.prototype.dispatch = function (op, args) {
-    var self = this;
-    var deferred = defer();
-    Q.nextTick(function () {
-        self.promiseDispatch(deferred.resolve, op, args);
-    });
-    return deferred.promise;
-};
-
-/**
- * Gets the value of a property in a future turn.
- * @param object    promise or immediate reference for target object
- * @param name      name of property to get
- * @return promise for the property value
- */
-Q.get = function (object, key) {
-    return Q(object).dispatch("get", [key]);
-};
-
-Promise.prototype.get = function (key) {
-    return this.dispatch("get", [key]);
-};
-
-/**
- * Sets the value of a property in a future turn.
- * @param object    promise or immediate reference for object object
- * @param name      name of property to set
- * @param value     new value of property
- * @return promise for the return value
- */
-Q.set = function (object, key, value) {
-    return Q(object).dispatch("set", [key, value]);
-};
-
-Promise.prototype.set = function (key, value) {
-    return this.dispatch("set", [key, value]);
-};
-
-/**
- * Deletes a property in a future turn.
- * @param object    promise or immediate reference for target object
- * @param name      name of property to delete
- * @return promise for the return value
- */
-Q.del = // XXX legacy
-Q["delete"] = function (object, key) {
-    return Q(object).dispatch("delete", [key]);
-};
-
-Promise.prototype.del = // XXX legacy
-Promise.prototype["delete"] = function (key) {
-    return this.dispatch("delete", [key]);
-};
-
-/**
- * Invokes a method in a future turn.
- * @param object    promise or immediate reference for target object
- * @param name      name of method to invoke
- * @param value     a value to post, typically an array of
- *                  invocation arguments for promises that
- *                  are ultimately backed with `resolve` values,
- *                  as opposed to those backed with URLs
- *                  wherein the posted value can be any
- *                  JSON serializable object.
- * @return promise for the return value
- */
-// bound locally because it is used by other methods
-Q.mapply = // XXX As proposed by "Redsandro"
-Q.post = function (object, name, args) {
-    return Q(object).dispatch("post", [name, args]);
-};
-
-Promise.prototype.mapply = // XXX As proposed by "Redsandro"
-Promise.prototype.post = function (name, args) {
-    return this.dispatch("post", [name, args]);
-};
-
-/**
- * Invokes a method in a future turn.
- * @param object    promise or immediate reference for target object
- * @param name      name of method to invoke
- * @param ...args   array of invocation arguments
- * @return promise for the return value
- */
-Q.send = // XXX Mark Miller's proposed parlance
-Q.mcall = // XXX As proposed by "Redsandro"
-Q.invoke = function (object, name /*...args*/) {
-    return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
-};
-
-Promise.prototype.send = // XXX Mark Miller's proposed parlance
-Promise.prototype.mcall = // XXX As proposed by "Redsandro"
-Promise.prototype.invoke = function (name /*...args*/) {
-    return this.dispatch("post", [name, array_slice(arguments, 1)]);
-};
-
-/**
- * Applies the promised function in a future turn.
- * @param object    promise or immediate reference for target function
- * @param args      array of application arguments
- */
-Q.fapply = function (object, args) {
-    return Q(object).dispatch("apply", [void 0, args]);
-};
-
-Promise.prototype.fapply = function (args) {
-    return this.dispatch("apply", [void 0, args]);
-};
-
-/**
- * Calls the promised function in a future turn.
- * @param object    promise or immediate reference for target function
- * @param ...args   array of application arguments
- */
-Q["try"] =
-Q.fcall = function (object /* ...args*/) {
-    return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
-};
-
-Promise.prototype.fcall = function (/*...args*/) {
-    return this.dispatch("apply", [void 0, array_slice(arguments)]);
-};
-
-/**
- * Binds the promised function, transforming return values into a fulfilled
- * promise and thrown errors into a rejected one.
- * @param object    promise or immediate reference for target function
- * @param ...args   array of application arguments
- */
-Q.fbind = function (object /*...args*/) {
-    var promise = Q(object);
-    var args = array_slice(arguments, 1);
-    return function fbound() {
-        return promise.dispatch("apply", [
-            this,
-            args.concat(array_slice(arguments))
-        ]);
-    };
-};
-Promise.prototype.fbind = function (/*...args*/) {
-    var promise = this;
-    var args = array_slice(arguments);
-    return function fbound() {
-        return promise.dispatch("apply", [
-            this,
-            args.concat(array_slice(arguments))
-        ]);
-    };
-};
-
-/**
- * Requests the names of the owned properties of a promised
- * object in a future turn.
- * @param object    promise or immediate reference for target object
- * @return promise for the keys of the eventually settled object
- */
-Q.keys = function (object) {
-    return Q(object).dispatch("keys", []);
-};
-
-Promise.prototype.keys = function () {
-    return this.dispatch("keys", []);
-};
-
-/**
- * Turns an array of promises into a promise for an array.  If any of
- * the promises gets rejected, the whole array is rejected immediately.
- * @param {Array*} an array (or promise for an array) of values (or
- * promises for values)
- * @returns a promise for an array of the corresponding values
- */
-// By Mark Miller
-// http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
-Q.all = all;
-function all(promises) {
-    return when(promises, function (promises) {
-        var pendingCount = 0;
-        var deferred = defer();
-        array_reduce(promises, function (undefined, promise, index) {
-            var snapshot;
-            if (
-                isPromise(promise) &&
-                (snapshot = promise.inspect()).state === "fulfilled"
-            ) {
-                promises[index] = snapshot.value;
-            } else {
-                ++pendingCount;
-                when(
-                    promise,
-                    function (value) {
-                        promises[index] = value;
-                        if (--pendingCount === 0) {
-                            deferred.resolve(promises);
-                        }
-                    },
-                    deferred.reject,
-                    function (progress) {
-                        deferred.notify({ index: index, value: progress });
-                    }
-                );
-            }
-        }, void 0);
-        if (pendingCount === 0) {
-            deferred.resolve(promises);
-        }
-        return deferred.promise;
-    });
-}
-
-Promise.prototype.all = function () {
-    return all(this);
-};
-
-/**
- * Returns the first resolved promise of an array. Prior rejected promises are
- * ignored.  Rejects only if all promises are rejected.
- * @param {Array*} an array containing values or promises for values
- * @returns a promise fulfilled with the value of the first resolved promise,
- * or a rejected promise if all promises are rejected.
- */
-Q.any = any;
-
-function any(promises) {
-    if (promises.length === 0) {
-        return Q.resolve();
-    }
-
-    var deferred = Q.defer();
-    var pendingCount = 0;
-    array_reduce(promises, function (prev, current, index) {
-        var promise = promises[index];
-
-        pendingCount++;
-
-        when(promise, onFulfilled, onRejected, onProgress);
-        function onFulfilled(result) {
-            deferred.resolve(result);
-        }
-        function onRejected(err) {
-            pendingCount--;
-            if (pendingCount === 0) {
-                var rejection = err || new Error("" + err);
-
-                rejection.message = ("Q can't get fulfillment value from any promise, all " +
-                    "promises were rejected. Last error message: " + rejection.message);
-
-                deferred.reject(rejection);
-            }
-        }
-        function onProgress(progress) {
-            deferred.notify({
-                index: index,
-                value: progress
-            });
-        }
-    }, undefined);
-
-    return deferred.promise;
-}
-
-Promise.prototype.any = function () {
-    return any(this);
-};
-
-/**
- * Waits for all promises to be settled, either fulfilled or
- * rejected.  This is distinct from `all` since that would stop
- * waiting at the first rejection.  The promise returned by
- * `allResolved` will never be rejected.
- * @param promises a promise for an array (or an array) of promises
- * (or values)
- * @return a promise for an array of promises
- */
-Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
-function allResolved(promises) {
-    return when(promises, function (promises) {
-        promises = array_map(promises, Q);
-        return when(all(array_map(promises, function (promise) {
-            return when(promise, noop, noop);
-        })), function () {
-            return promises;
-        });
-    });
-}
-
-Promise.prototype.allResolved = function () {
-    return allResolved(this);
-};
-
-/**
- * @see Promise#allSettled
- */
-Q.allSettled = allSettled;
-function allSettled(promises) {
-    return Q(promises).allSettled();
-}
-
-/**
- * Turns an array of promises into a promise for an array of their states (as
- * returned by `inspect`) when they have all settled.
- * @param {Array[Any*]} values an array (or promise for an array) of values (or
- * promises for values)
- * @returns {Array[State]} an array of states for the respective values.
- */
-Promise.prototype.allSettled = function () {
-    return this.then(function (promises) {
-        return all(array_map(promises, function (promise) {
-            promise = Q(promise);
-            function regardless() {
-                return promise.inspect();
-            }
-            return promise.then(regardless, regardless);
-        }));
-    });
-};
-
-/**
- * Captures the failure of a promise, giving an oportunity to recover
- * with a callback.  If the given promise is fulfilled, the returned
- * promise is fulfilled.
- * @param {Any*} promise for something
- * @param {Function} callback to fulfill the returned promise if the
- * given promise is rejected
- * @returns a promise for the return value of the callback
- */
-Q.fail = // XXX legacy
-Q["catch"] = function (object, rejected) {
-    return Q(object).then(void 0, rejected);
-};
-
-Promise.prototype.fail = // XXX legacy
-Promise.prototype["catch"] = function (rejected) {
-    return this.then(void 0, rejected);
-};
-
-/**
- * Attaches a listener that can respond to progress notifications from a
- * promise's originating deferred. This listener receives the exact arguments
- * passed to ``deferred.notify``.
- * @param {Any*} promise for something
- * @param {Function} callback to receive any progress notifications
- * @returns the given promise, unchanged
- */
-Q.progress = progress;
-function progress(object, progressed) {
-    return Q(object).then(void 0, void 0, progressed);
-}
-
-Promise.prototype.progress = function (progressed) {
-    return this.then(void 0, void 0, progressed);
-};
-
-/**
- * Provides an opportunity to observe the settling of a promise,
- * regardless of whether the promise is fulfilled or rejected.  Forwards
- * the resolution to the returned promise when the callback is done.
- * The callback can return a promise to defer completion.
- * @param {Any*} promise
- * @param {Function} callback to observe the resolution of the given
- * promise, takes no arguments.
- * @returns a promise for the resolution of the given promise when
- * ``fin`` is done.
- */
-Q.fin = // XXX legacy
-Q["finally"] = function (object, callback) {
-    return Q(object)["finally"](callback);
-};
-
-Promise.prototype.fin = // XXX legacy
-Promise.prototype["finally"] = function (callback) {
-    if (!callback || typeof callback.apply !== "function") {
-        throw new Error("Q can't apply finally callback");
-    }
-    callback = Q(callback);
-    return this.then(function (value) {
-        return callback.fcall().then(function () {
-            return value;
-        });
-    }, function (reason) {
-        // TODO attempt to recycle the rejection with "this".
-        return callback.fcall().then(function () {
-            throw reason;
-        });
-    });
-};
-
-/**
- * Terminates a chain of promises, forcing rejections to be
- * thrown as exceptions.
- * @param {Any*} promise at the end of a chain of promises
- * @returns nothing
- */
-Q.done = function (object, fulfilled, rejected, progress) {
-    return Q(object).done(fulfilled, rejected, progress);
-};
-
-Promise.prototype.done = function (fulfilled, rejected, progress) {
-    var onUnhandledError = function (error) {
-        // forward to a future turn so that ``when``
-        // does not catch it and turn it into a rejection.
-        Q.nextTick(function () {
-            makeStackTraceLong(error, promise);
-            if (Q.onerror) {
-                Q.onerror(error);
-            } else {
-                throw error;
-            }
-        });
-    };
-
-    // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
-    var promise = fulfilled || rejected || progress ?
-        this.then(fulfilled, rejected, progress) :
-        this;
-
-    if (typeof process === "object" && process && process.domain) {
-        onUnhandledError = process.domain.bind(onUnhandledError);
-    }
-
-    promise.then(void 0, onUnhandledError);
-};
-
-/**
- * Causes a promise to be rejected if it does not get fulfilled before
- * some milliseconds time out.
- * @param {Any*} promise
- * @param {Number} milliseconds timeout
- * @param {Any*} custom error message or Error object (optional)
- * @returns a promise for the resolution of the given promise if it is
- * fulfilled before the timeout, otherwise rejected.
- */
-Q.timeout = function (object, ms, error) {
-    return Q(object).timeout(ms, error);
-};
-
-Promise.prototype.timeout = function (ms, error) {
-    var deferred = defer();
-    var timeoutId = setTimeout(function () {
-        if (!error || "string" === typeof error) {
-            error = new Error(error || "Timed out after " + ms + " ms");
-            error.code = "ETIMEDOUT";
-        }
-        deferred.reject(error);
-    }, ms);
-
-    this.then(function (value) {
-        clearTimeout(timeoutId);
-        deferred.resolve(value);
-    }, function (exception) {
-        clearTimeout(timeoutId);
-        deferred.reject(exception);
-    }, deferred.notify);
-
-    return deferred.promise;
-};
-
-/**
- * Returns a promise for the given value (or promised value), some
- * milliseconds after it resolved. Passes rejections immediately.
- * @param {Any*} promise
- * @param {Number} milliseconds
- * @returns a promise for the resolution of the given promise after milliseconds
- * time has elapsed since the resolution of the given promise.
- * If the given promise rejects, that is passed immediately.
- */
-Q.delay = function (object, timeout) {
-    if (timeout === void 0) {
-        timeout = object;
-        object = void 0;
-    }
-    return Q(object).delay(timeout);
-};
-
-Promise.prototype.delay = function (timeout) {
-    return this.then(function (value) {
-        var deferred = defer();
-        setTimeout(function () {
-            deferred.resolve(value);
-        }, timeout);
-        return deferred.promise;
-    });
-};
-
-/**
- * Passes a continuation to a Node function, which is called with the given
- * arguments provided as an array, and returns a promise.
- *
- *      Q.nfapply(FS.readFile, [__filename])
- *      .then(function (content) {
- *      })
- *
- */
-Q.nfapply = function (callback, args) {
-    return Q(callback).nfapply(args);
-};
-
-Promise.prototype.nfapply = function (args) {
-    var deferred = defer();
-    var nodeArgs = array_slice(args);
-    nodeArgs.push(deferred.makeNodeResolver());
-    this.fapply(nodeArgs).fail(deferred.reject);
-    return deferred.promise;
-};
-
-/**
- * Passes a continuation to a Node function, which is called with the given
- * arguments provided individually, and returns a promise.
- * @example
- * Q.nfcall(FS.readFile, __filename)
- * .then(function (content) {
- * })
- *
- */
-Q.nfcall = function (callback /*...args*/) {
-    var args = array_slice(arguments, 1);
-    return Q(callback).nfapply(args);
-};
-
-Promise.prototype.nfcall = function (/*...args*/) {
-    var nodeArgs = array_slice(arguments);
-    var deferred = defer();
-    nodeArgs.push(deferred.makeNodeResolver());
-    this.fapply(nodeArgs).fail(deferred.reject);
-    return deferred.promise;
-};
-
-/**
- * Wraps a NodeJS continuation passing function and returns an equivalent
- * version that returns a promise.
- * @example
- * Q.nfbind(FS.readFile, __filename)("utf-8")
- * .then(console.log)
- * .done()
- */
-Q.nfbind =
-Q.denodeify = function (callback /*...args*/) {
-    if (callback === undefined) {
-        throw new Error("Q can't wrap an undefined function");
-    }
-    var baseArgs = array_slice(arguments, 1);
-    return function () {
-        var nodeArgs = baseArgs.concat(array_slice(arguments));
-        var deferred = defer();
-        nodeArgs.push(deferred.makeNodeResolver());
-        Q(callback).fapply(nodeArgs).fail(deferred.reject);
-        return deferred.promise;
-    };
-};
-
-Promise.prototype.nfbind =
-Promise.prototype.denodeify = function (/*...args*/) {
-    var args = array_slice(arguments);
-    args.unshift(this);
-    return Q.denodeify.apply(void 0, args);
-};
-
-Q.nbind = function (callback, thisp /*...args*/) {
-    var baseArgs = array_slice(arguments, 2);
-    return function () {
-        var nodeArgs = baseArgs.concat(array_slice(arguments));
-        var deferred = defer();
-        nodeArgs.push(deferred.makeNodeResolver());
-        function bound() {
-            return callback.apply(thisp, arguments);
-        }
-        Q(bound).fapply(nodeArgs).fail(deferred.reject);
-        return deferred.promise;
-    };
-};
-
-Promise.prototype.nbind = function (/*thisp, ...args*/) {
-    var args = array_slice(arguments, 0);
-    args.unshift(this);
-    return Q.nbind.apply(void 0, args);
-};
-
-/**
- * Calls a method of a Node-style object that accepts a Node-style
- * callback with a given array of arguments, plus a provided callback.
- * @param object an object that has the named method
- * @param {String} name name of the method of object
- * @param {Array} args arguments to pass to the method; the callback
- * will be provided by Q and appended to these arguments.
- * @returns a promise for the value or error
- */
-Q.nmapply = // XXX As proposed by "Redsandro"
-Q.npost = function (object, name, args) {
-    return Q(object).npost(name, args);
-};
-
-Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
-Promise.prototype.npost = function (name, args) {
-    var nodeArgs = array_slice(args || []);
-    var deferred = defer();
-    nodeArgs.push(deferred.makeNodeResolver());
-    this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
-    return deferred.promise;
-};
-
-/**
- * Calls a method of a Node-style object that accepts a Node-style
- * callback, forwarding the given variadic arguments, plus a provided
- * callback argument.
- * @param object an object that has the named method
- * @param {String} name name of the method of object
- * @param ...args arguments to pass to the method; the callback will
- * be provided by Q and appended to these arguments.
- * @returns a promise for the value or error
- */
-Q.nsend = // XXX Based on Mark Miller's proposed "send"
-Q.nmcall = // XXX Based on "Redsandro's" proposal
-Q.ninvoke = function (object, name /*...args*/) {
-    var nodeArgs = array_slice(arguments, 2);
-    var deferred = defer();
-    nodeArgs.push(deferred.makeNodeResolver());
-    Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
-    return deferred.promise;
-};
-
-Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
-Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
-Promise.prototype.ninvoke = function (name /*...args*/) {
-    var nodeArgs = array_slice(arguments, 1);
-    var deferred = defer();
-    nodeArgs.push(deferred.makeNodeResolver());
-    this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
-    return deferred.promise;
-};
-
-/**
- * If a function would like to support both Node continuation-passing-style and
- * promise-returning-style, it can end its internal promise chain with
- * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
- * elects to use a nodeback, the result will be sent there.  If they do not
- * pass a nodeback, they will receive the result promise.
- * @param object a result (or a promise for a result)
- * @param {Function} nodeback a Node.js-style callback
- * @returns either the promise or nothing
- */
-Q.nodeify = nodeify;
-function nodeify(object, nodeback) {
-    return Q(object).nodeify(nodeback);
-}
-
-Promise.prototype.nodeify = function (nodeback) {
-    if (nodeback) {
-        this.then(function (value) {
-            Q.nextTick(function () {
-                nodeback(null, value);
-            });
-        }, function (error) {
-            Q.nextTick(function () {
-                nodeback(error);
-            });
-        });
-    } else {
-        return this;
-    }
-};
-
-Q.noConflict = function() {
-    throw new Error("Q.noConflict only works when Q is used as a global");
-};
-
-// All code before this point will be filtered from stack traces.
-var qEndingLine = captureLine();
-
-return Q;
-
-});
diff --git a/node_modules/q/queue.js b/node_modules/q/queue.js
deleted file mode 100644
index 1505fd0..0000000
--- a/node_modules/q/queue.js
+++ /dev/null
@@ -1,35 +0,0 @@
-
-var Q = require("./q");
-
-module.exports = Queue;
-function Queue() {
-    var ends = Q.defer();
-    var closed = Q.defer();
-    return {
-        put: function (value) {
-            var next = Q.defer();
-            ends.resolve({
-                head: value,
-                tail: next.promise
-            });
-            ends.resolve = next.resolve;
-        },
-        get: function () {
-            var result = ends.promise.get("head");
-            ends.promise = ends.promise.get("tail");
-            return result.fail(function (error) {
-                closed.resolve(error);
-                throw error;
-            });
-        },
-        closed: closed.promise,
-        close: function (error) {
-            error = error || new Error("Can't get value from closed queue");
-            var end = {head: Q.reject(error)};
-            end.tail = end;
-            ends.resolve(end);
-            return closed.promise;
-        }
-    };
-}
-
diff --git a/node_modules/sax/AUTHORS b/node_modules/sax/AUTHORS
deleted file mode 100644
index 26d8659..0000000
--- a/node_modules/sax/AUTHORS
+++ /dev/null
@@ -1,9 +0,0 @@
-# contributors sorted by whether or not they're me.
-Isaac Z. Schlueter <i@izs.me>
-Stein Martin Hustad <stein@hustad.com>
-Mikeal Rogers <mikeal.rogers@gmail.com>
-Laurie Harper <laurie@holoweb.net>
-Jann Horn <jann@Jann-PC.fritz.box>
-Elijah Insua <tmpvar@gmail.com>
-Henry Rawas <henryr@schakra.com>
-Justin Makeig <jmpublic@makeig.com>
diff --git a/node_modules/sax/LICENSE b/node_modules/sax/LICENSE
deleted file mode 100644
index 05a4010..0000000
--- a/node_modules/sax/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-Copyright 2009, 2010, 2011 Isaac Z. Schlueter.
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/sax/README.md b/node_modules/sax/README.md
deleted file mode 100644
index 9c63dc4..0000000
--- a/node_modules/sax/README.md
+++ /dev/null
@@ -1,213 +0,0 @@
-# sax js
-
-A sax-style parser for XML and HTML.
-
-Designed with [node](http://nodejs.org/) in mind, but should work fine in
-the browser or other CommonJS implementations.
-
-## What This Is
-
-* A very simple tool to parse through an XML string.
-* A stepping stone to a streaming HTML parser.
-* A handy way to deal with RSS and other mostly-ok-but-kinda-broken XML 
-  docs.
-
-## What This Is (probably) Not
-
-* An HTML Parser - That's a fine goal, but this isn't it.  It's just
-  XML.
-* A DOM Builder - You can use it to build an object model out of XML,
-  but it doesn't do that out of the box.
-* XSLT - No DOM = no querying.
-* 100% Compliant with (some other SAX implementation) - Most SAX
-  implementations are in Java and do a lot more than this does.
-* An XML Validator - It does a little validation when in strict mode, but
-  not much.
-* A Schema-Aware XSD Thing - Schemas are an exercise in fetishistic 
-  masochism.
-* A DTD-aware Thing - Fetching DTDs is a much bigger job.
-
-## Regarding `<!DOCTYPE`s and `<!ENTITY`s
-
-The parser will handle the basic XML entities in text nodes and attribute
-values: `&amp; &lt; &gt; &apos; &quot;`. It's possible to define additional
-entities in XML by putting them in the DTD. This parser doesn't do anything
-with that. If you want to listen to the `ondoctype` event, and then fetch
-the doctypes, and read the entities and add them to `parser.ENTITIES`, then
-be my guest.
-
-Unknown entities will fail in strict mode, and in loose mode, will pass
-through unmolested.
-
-## Usage
-
-    var sax = require("./lib/sax"),
-      strict = true, // set to false for html-mode
-      parser = sax.parser(strict);
-
-    parser.onerror = function (e) {
-      // an error happened.
-    };
-    parser.ontext = function (t) {
-      // got some text.  t is the string of text.
-    };
-    parser.onopentag = function (node) {
-      // opened a tag.  node has "name" and "attributes"
-    };
-    parser.onattribute = function (attr) {
-      // an attribute.  attr has "name" and "value"
-    };
-    parser.onend = function () {
-      // parser stream is done, and ready to have more stuff written to it.
-    };
-
-    parser.write('<xml>Hello, <who name="world">world</who>!</xml>').close();
-
-    // stream usage
-    // takes the same options as the parser
-    var saxStream = require("sax").createStream(strict, options)
-    saxStream.on("error", function (e) {
-      // unhandled errors will throw, since this is a proper node
-      // event emitter.
-      console.error("error!", e)
-      // clear the error
-      this._parser.error = null
-      this._parser.resume()
-    })
-    saxStream.on("opentag", function (node) {
-      // same object as above
-    })
-    // pipe is supported, and it's readable/writable
-    // same chunks coming in also go out.
-    fs.createReadStream("file.xml")
-      .pipe(saxStream)
-      .pipe(fs.createReadStream("file-copy.xml"))
-
-
-
-## Arguments
-
-Pass the following arguments to the parser function.  All are optional.
-
-`strict` - Boolean. Whether or not to be a jerk. Default: `false`.
-
-`opt` - Object bag of settings regarding string formatting.  All default to `false`.
-
-Settings supported:
-
-* `trim` - Boolean. Whether or not to trim text and comment nodes.
-* `normalize` - Boolean. If true, then turn any whitespace into a single
-  space.
-* `lowercasetags` - Boolean. If true, then lowercase tags in loose mode, 
-  rather than uppercasing them.
-* `xmlns` - Boolean. If true, then namespaces are supported.
-
-## Methods
-
-`write` - Write bytes onto the stream. You don't have to do this all at
-once. You can keep writing as much as you want.
-
-`close` - Close the stream. Once closed, no more data may be written until
-it is done processing the buffer, which is signaled by the `end` event.
-
-`resume` - To gracefully handle errors, assign a listener to the `error`
-event. Then, when the error is taken care of, you can call `resume` to
-continue parsing. Otherwise, the parser will not continue while in an error
-state.
-
-## Members
-
-At all times, the parser object will have the following members:
-
-`line`, `column`, `position` - Indications of the position in the XML
-document where the parser currently is looking.
-
-`startTagPosition` - Indicates the position where the current tag starts.
-
-`closed` - Boolean indicating whether or not the parser can be written to.
-If it's `true`, then wait for the `ready` event to write again.
-
-`strict` - Boolean indicating whether or not the parser is a jerk.
-
-`opt` - Any options passed into the constructor.
-
-`tag` - The current tag being dealt with.
-
-And a bunch of other stuff that you probably shouldn't touch.
-
-## Events
-
-All events emit with a single argument. To listen to an event, assign a
-function to `on<eventname>`. Functions get executed in the this-context of
-the parser object. The list of supported events are also in the exported
-`EVENTS` array.
-
-When using the stream interface, assign handlers using the EventEmitter
-`on` function in the normal fashion.
-
-`error` - Indication that something bad happened. The error will be hanging
-out on `parser.error`, and must be deleted before parsing can continue. By
-listening to this event, you can keep an eye on that kind of stuff. Note:
-this happens *much* more in strict mode. Argument: instance of `Error`.
-
-`text` - Text node. Argument: string of text.
-
-`doctype` - The `<!DOCTYPE` declaration. Argument: doctype string.
-
-`processinginstruction` - Stuff like `<?xml foo="blerg" ?>`. Argument:
-object with `name` and `body` members. Attributes are not parsed, as
-processing instructions have implementation dependent semantics.
-
-`sgmldeclaration` - Random SGML declarations. Stuff like `<!ENTITY p>`
-would trigger this kind of event. This is a weird thing to support, so it
-might go away at some point. SAX isn't intended to be used to parse SGML,
-after all.
-
-`opentag` - An opening tag. Argument: object with `name` and `attributes`.
-In non-strict mode, tag names are uppercased, unless the `lowercasetags`
-option is set.  If the `xmlns` option is set, then it will contain
-namespace binding information on the `ns` member, and will have a
-`local`, `prefix`, and `uri` member.
-
-`closetag` - A closing tag. In loose mode, tags are auto-closed if their
-parent closes. In strict mode, well-formedness is enforced. Note that
-self-closing tags will have `closeTag` emitted immediately after `openTag`.
-Argument: tag name.
-
-`attribute` - An attribute node.  Argument: object with `name` and `value`,
-and also namespace information if the `xmlns` option flag is set.
-
-`comment` - A comment node.  Argument: the string of the comment.
-
-`opencdata` - The opening tag of a `<![CDATA[` block.
-
-`cdata` - The text of a `<![CDATA[` block. Since `<![CDATA[` blocks can get
-quite large, this event may fire multiple times for a single block, if it
-is broken up into multiple `write()`s. Argument: the string of random
-character data.
-
-`closecdata` - The closing tag (`]]>`) of a `<![CDATA[` block.
-
-`opennamespace` - If the `xmlns` option is set, then this event will
-signal the start of a new namespace binding.
-
-`closenamespace` - If the `xmlns` option is set, then this event will
-signal the end of a namespace binding.
-
-`end` - Indication that the closed stream has ended.
-
-`ready` - Indication that the stream has reset, and is ready to be written
-to.
-
-`noscript` - In non-strict mode, `<script>` tags trigger a `"script"`
-event, and their contents are not checked for special xml characters.
-If you pass `noscript: true`, then this behavior is suppressed.
-
-## Reporting Problems
-
-It's best to write a failing test if you find an issue.  I will always
-accept pull requests with failing tests if they demonstrate intended
-behavior, but it is very hard to figure out what issue you're describing
-without a test.  Writing a test is also the best way for you yourself
-to figure out if you really understand the issue you think you have with
-sax-js.
diff --git a/node_modules/sax/examples/big-not-pretty.xml b/node_modules/sax/examples/big-not-pretty.xml
deleted file mode 100644
index fb5265d..0000000
--- a/node_modules/sax/examples/big-not-pretty.xml
+++ /dev/null
@@ -1,8002 +0,0 @@
-<big>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
-</big>
diff --git a/node_modules/sax/examples/example.js b/node_modules/sax/examples/example.js
deleted file mode 100644
index e7f81e6..0000000
--- a/node_modules/sax/examples/example.js
+++ /dev/null
@@ -1,41 +0,0 @@
-
-var fs = require("fs"),
-  sys = require("sys"),
-  path = require("path"),
-  xml = fs.cat(path.join(__dirname, "test.xml")),
-  sax = require("../lib/sax"),
-  strict = sax.parser(true),
-  loose = sax.parser(false, {trim:true}),
-  inspector = function (ev) { return function (data) {
-    // sys.error("");
-    // sys.error(ev+": "+sys.inspect(data));
-    // for (var i in data) sys.error(i+ " "+sys.inspect(data[i]));
-    // sys.error(this.line+":"+this.column);
-  }};
-
-xml.addCallback(function (xml) {
-  // strict.write(xml);
-  
-  sax.EVENTS.forEach(function (ev) {
-    loose["on"+ev] = inspector(ev);
-  });
-  loose.onend = function () {
-    // sys.error("end");
-    // sys.error(sys.inspect(loose));
-  };
-  
-  // do this one char at a time to verify that it works.
-  // (function () {
-  //   if (xml) {
-  //     loose.write(xml.substr(0,1000));
-  //     xml = xml.substr(1000);
-  //     process.nextTick(arguments.callee);
-  //   } else loose.close();
-  // })();
-  
-  for (var i = 0; i < 1000; i ++) {
-    loose.write(xml);
-    loose.close();
-  }
-
-});
diff --git a/node_modules/sax/examples/get-products.js b/node_modules/sax/examples/get-products.js
deleted file mode 100644
index 9e8d74a..0000000
--- a/node_modules/sax/examples/get-products.js
+++ /dev/null
@@ -1,58 +0,0 @@
-// pull out /GeneralSearchResponse/categories/category/items/product tags
-// the rest we don't care about.
-
-var sax = require("../lib/sax.js")
-var fs = require("fs")
-var path = require("path")
-var xmlFile = path.resolve(__dirname, "shopping.xml")
-var util = require("util")
-var http = require("http")
-
-fs.readFile(xmlFile, function (er, d) {
-  http.createServer(function (req, res) {
-    if (er) throw er
-    var xmlstr = d.toString("utf8")
-
-    var parser = sax.parser(true)
-    var products = []
-    var product = null
-    var currentTag = null
-
-    parser.onclosetag = function (tagName) {
-      if (tagName === "product") {
-        products.push(product)
-        currentTag = product = null
-        return
-      }
-      if (currentTag && currentTag.parent) {
-        var p = currentTag.parent
-        delete currentTag.parent
-        currentTag = p
-      }
-    }
-
-    parser.onopentag = function (tag) {
-      if (tag.name !== "product" && !product) return
-      if (tag.name === "product") {
-        product = tag
-      }
-      tag.parent = currentTag
-      tag.children = []
-      tag.parent && tag.parent.children.push(tag)
-      currentTag = tag
-    }
-
-    parser.ontext = function (text) {
-      if (currentTag) currentTag.children.push(text)
-    }
-
-    parser.onend = function () {
-      var out = util.inspect(products, false, 3, true)
-      res.writeHead(200, {"content-type":"application/json"})
-      res.end("{\"ok\":true}")
-      // res.end(JSON.stringify(products))
-    }
-
-    parser.write(xmlstr).end()
-  }).listen(1337)
-})
diff --git a/node_modules/sax/examples/hello-world.js b/node_modules/sax/examples/hello-world.js
deleted file mode 100644
index cbfa518..0000000
--- a/node_modules/sax/examples/hello-world.js
+++ /dev/null
@@ -1,4 +0,0 @@
-require("http").createServer(function (req, res) {
-  res.writeHead(200, {"content-type":"application/json"})
-  res.end(JSON.stringify({ok: true}))
-}).listen(1337)
diff --git a/node_modules/sax/examples/not-pretty.xml b/node_modules/sax/examples/not-pretty.xml
deleted file mode 100644
index 9592852..0000000
--- a/node_modules/sax/examples/not-pretty.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<root>
-		something<else>  blerm <slurm 
-		
-		
-	attrib = 
-	"blorg"       ></else><!-- COMMENT!
-	
---><![CDATA[processing...]]>  <selfclosing tag="blr>&quot;"/> a bit down here</root>
diff --git a/node_modules/sax/examples/pretty-print.js b/node_modules/sax/examples/pretty-print.js
deleted file mode 100644
index cd6aca9..0000000
--- a/node_modules/sax/examples/pretty-print.js
+++ /dev/null
@@ -1,74 +0,0 @@
-var sax = require("../lib/sax")
-  , printer = sax.createStream(false, {lowercasetags:true, trim:true})
-  , fs = require("fs")
-
-function entity (str) {
-  return str.replace('"', '&quot;')
-}
-
-printer.tabstop = 2
-printer.level = 0
-printer.indent = function () {
-  print("\n")
-  for (var i = this.level; i > 0; i --) {
-    for (var j = this.tabstop; j > 0; j --) {
-      print(" ")
-    }
-  }
-}
-printer.on("opentag", function (tag) {
-  this.indent()
-  this.level ++
-  print("<"+tag.name)
-  for (var i in tag.attributes) {
-    print(" "+i+"=\""+entity(tag.attributes[i])+"\"")
-  }
-  print(">")
-})
-
-printer.on("text", ontext)
-printer.on("doctype", ontext)
-function ontext (text) {
-  this.indent()
-  print(text)
-}
-
-printer.on("closetag", function (tag) {
-  this.level --
-  this.indent()
-  print("</"+tag+">")
-})
-
-printer.on("cdata", function (data) {
-  this.indent()
-  print("<![CDATA["+data+"]]>")
-})
-
-printer.on("comment", function (comment) {
-  this.indent()
-  print("<!--"+comment+"-->")
-})
-
-printer.on("error", function (error) {
-  console.error(error)
-  throw error
-})
-
-if (!process.argv[2]) {
-  throw new Error("Please provide an xml file to prettify\n"+
-    "TODO: read from stdin or take a file")
-}
-var xmlfile = require("path").join(process.cwd(), process.argv[2])
-var fstr = fs.createReadStream(xmlfile, { encoding: "utf8" })
-
-function print (c) {
-  if (!process.stdout.write(c)) {
-    fstr.pause()
-  }
-}
-
-process.stdout.on("drain", function () {
-  fstr.resume()
-})
-
-fstr.pipe(printer)
diff --git a/node_modules/sax/examples/shopping.xml b/node_modules/sax/examples/shopping.xml
deleted file mode 100644
index 223c6c6..0000000
--- a/node_modules/sax/examples/shopping.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-<GeneralSearchResponse xmlns="urn:types.partner.api.shopping.com"><serverDetail><apiEnv>sandbox</apiEnv><apiVersion>3.1 r31.Kadu4DC.phase3</apiVersion><buildNumber>5778</buildNumber><buildTimestamp>2011.10.06 15:37:23 PST</buildTimestamp><requestId>p2.a121bc2aaf029435dce6</requestId><timestamp>2011-10-21T18:38:45.982-04:00</timestamp><responseTime>P0Y0M0DT0H0M0.169S</responseTime></serverDetail><exceptions exceptionCount="1"><exception type="warning"><code>1112</code><message>You are currently using the SDC API sandbox environment!  No clicks to merchant URLs from this response will be paid.  Please change the host of your API requests to 'publisher.api.shopping.com' when you have finished development and testing</message></exception></exceptions><clientTracking height="19" type="logo" width="106"><sourceURL>http://statTest.dealtime.com/pixel/noscript?PV_EvnTyp=APPV&amp;APPV_APITSP=10%2F21%2F11_06%3A38%3A45_PM&amp;APPV_DSPRQSID=p2.a121bc2aaf029435dce6&amp;APPV_IMGURL=http://img.shopping.com/sc/glb/sdc_logo_106x19.gif&amp;APPV_LI_LNKINID=7000610&amp;APPV_LI_SBMKYW=nikon&amp;APPV_MTCTYP=1000&amp;APPV_PRTID=2002&amp;APPV_BrnID=14804</sourceURL><hrefURL>http://www.shopping.com/digital-cameras/products</hrefURL><titleText>Digital Cameras</titleText><altText>Digital Cameras</altText></clientTracking><searchHistory><categorySelection id="3"><name>Electronics</name><categoryURL>http://www.shopping.com/xCH-electronics-nikon~linkin_id-7000610?oq=nikon</categoryURL></categorySelection><categorySelection id="449"><name>Cameras and Photography</name><categoryURL>http://www.shopping.com/xCH-cameras_and_photography-nikon~linkin_id-7000610?oq=nikon</categoryURL></categorySelection><categorySelection id="7185"><name>Digital Cameras</name><categoryURL>http://www.shopping.com/digital-cameras/nikon/products?oq=nikon&amp;linkin_id=7000610</categoryURL></categorySelection><dynamicNavigationHistory><keywordSearch dropped="false" modified="false"><originalKeyword>nikon</originalKeyword><resultKeyword>nikon</resultKeyword></keywordSearch></dynamicNavigationHistory></searchHistory><categories matchedCategoryCount="1" returnedCategoryCount="1"><category id="7185"><name>Digital Cameras</name><categoryURL>http://www.shopping.com/digital-cameras/nikon/products?oq=nikon&amp;linkin_id=7000610</categoryURL><items matchedItemCount="322" pageNumber="1" returnedItemCount="5"><product id="101677489"><name>Nikon D3100 Digital Camera</name><shortDescription>14.2 Megapixel, SLR Camera, 3 in. LCD Screen, With High Definition Video, Weight: 1 lb.</shortDescription><fullDescription>The Nikon D3100 digital SLR camera speaks to the growing ranks of enthusiastic D-SLR users and aspiring photographers by providing an easy-to-use and affordable entrance to the world of Nikon D-SLR’s. The 14.2-megapixel D3100 has powerful features, such as the enhanced Guide Mode that makes it easy to unleash creative potential and capture memories with still images and full HD video. Like having a personal photo tutor at your fingertips, this unique feature provides a simple graphical interface on the camera’s LCD that guides users by suggesting and/or adjusting camera settings to achieve the desired end result images. The D3100 is also the world’s first D-SLR to introduce full time auto focus (AF) in Live View and D-Movie mode to effortlessly achieve the critical focus needed when shooting Full HD 1080p video.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="500" width="606"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-606x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></images><rating><reviewCount>9</reviewCount><rating>4.56</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_4.5.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/Nikon-D3100/reviews~linkin_id-7000610</reviewURL></rating><minPrice>429.00</minPrice><maxPrice>1360.00</maxPrice><productOffersURL>http://www.shopping.com/Nikon-D3100/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-D3100/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="64" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="-ZW6BMZqz6fbS-aULwga_g==" smartBuy="false" used="false"><name>Nikon D3100 Digital SLR Camera with 18-55mm NIKKOR VR Lens</name><description>The Nikon D3100 Digital SLR Camera is an affordable  compact  and lightweight photographic power-house. It features the all-purpose 18-55mm VR lens  a high-resolution 14.2 MP CMOS sensor along with a feature set that's comprehensive yet easy to navigate - the intuitive onboard learn-as-you grow guide mode allows the photographer to understand what the 3100 can do quickly and easily. Capture beautiful pictures and amazing Full HD 1080p movies with sound and full-time autofocus.  Availabilty: In Stock!</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="350" width="350"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-350x350-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Free Shipping with Any Purchase!</storeNotes><basePrice currency="USD">529.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">799.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=647&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=475674&amp;crawler_id=475674&amp;dealId=-ZW6BMZqz6fbS-aULwga_g%3D%3D&amp;url=http%3A%2F%2Fwww.fumfie.com%2Fproduct%2F343.5%2Fshopping-com%3F&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D3100+Digital+SLR+Camera+with+18-55mm+NIKKOR+VR+Lens&amp;dlprc=529.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=1&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=1&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=1&amp;SL=1&amp;FS=1&amp;code=&amp;acode=658&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="475674" trusted="true"><name>FumFie</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/475674.gif</sourceURL></logo><phoneNumber>866 666 9198</phoneNumber><ratingInfo><reviewCount>560</reviewCount><rating>4.27</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_fumfie~MRD-475674~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>F343C5</sku></offer><offer featured="false" id="md1e9lD8vdOu4FHQfJqKng==" smartBuy="false" used="false"><name>Nikon Nikon D3100 14.2MP Digital SLR Camera with 18-55mm f/3.5-5.6 AF-S DX VR, Cameras</name><description>Nikon D3100 14.2MP Digital SLR Camera with 18-55mm f/3.5-5.6 AF-S DX VR</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="352" width="385"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-385x352-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">549.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">549.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=779&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=305814&amp;crawler_id=305814&amp;dealId=md1e9lD8vdOu4FHQfJqKng%3D%3D&amp;url=http%3A%2F%2Fwww.electronics-expo.com%2Findex.php%3Fpage%3Ditem%26id%3DNIKD3100%26source%3DSideCar%26scpid%3D8%26scid%3Dscsho318727%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+Nikon+D3100+14.2MP+Digital+SLR+Camera+with+18-55mm+f%2F3.5-5.6+AF-S+DX+VR%2C+Cameras&amp;dlprc=549.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=9&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=9&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=771&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="305814" trusted="true"><name>Electronics Expo</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/305814.gif</sourceURL></logo><phoneNumber>1-888-707-EXPO</phoneNumber><ratingInfo><reviewCount>371</reviewCount><rating>3.90</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_4.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_electronics_expo~MRD-305814~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>NIKD3100</sku></offer><offer featured="false" id="yYuaXnDFtCY7rDUjkY2aaw==" smartBuy="false" used="false"><name>Nikon D3100 14.2-Megapixel Digital SLR Camera With 18-55mm Zoom-Nikkor Lens, Black</name><description>Split-second shutter response captures shots other cameras may have missed Helps eliminate the frustration of shutter delay! 14.2-megapixels for enlargements worth framing and hanging. Takes breathtaking 1080p HD movies. ISO sensitivity from 100-1600 for bright or dimly lit settings. 3.0in. color LCD for beautiful, wide-angle framing and viewing. In-camera image editing lets you retouch with no PC. Automatic scene modes include Child, Sports, Night Portrait and more. Accepts SDHC memory cards. Nikon D3100 14.2-Megapixel Digital SLR Camera With 18-55mm Zoom-Nikkor Lens, Black is one of many Digital SLR Cameras available through Office Depot. Made by Nikon.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/79/59/75/61586e4446744359377244556a6b5932616177-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/79/59/75/61586e4446744359377244556a6b5932616177-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="250" width="250"><sourceURL>http://di109.shopping.com/images/di/79/59/75/61586e4446744359377244556a6b5932616177-250x250-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">549.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">699.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=698&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=467671&amp;crawler_id=467671&amp;dealId=yYuaXnDFtCY7rDUjkY2aaw%3D%3D&amp;url=http%3A%2F%2Flink.mercent.com%2Fredirect.ashx%3Fmr%3AmerchantID%3DOfficeDepot%26mr%3AtrackingCode%3DCEC9669E-6ABC-E011-9F24-0019B9C043EB%26mr%3AtargetUrl%3Dhttp%3A%2F%2Fwww.officedepot.com%2Fa%2Fproducts%2F486292%2FNikon-D3100-142-Megapixel-Digital-SLR%2F%253fcm_mmc%253dMercent-_-Shopping-_-Cameras_and_Camcorders-_-486292&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D3100+14.2-Megapixel+Digital+SLR+Camera+With+18-55mm+Zoom-Nikkor+Lens%2C+Black&amp;dlprc=549.99&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=10&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=10&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=1&amp;SL=1&amp;FS=1&amp;code=&amp;acode=690&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="467671" trusted="true"><name>Office Depot</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/467671.gif</sourceURL></logo><phoneNumber>1-800-GO-DEPOT</phoneNumber><ratingInfo><reviewCount>135</reviewCount><rating>2.37</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_office_depot_4158555~MRD-467671~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>486292</sku></offer><offer featured="false" id="Rl56U7CuiTYsH4MGZ02lxQ==" smartBuy="false" used="false"><name>Nikon® D3100™ 14.2MP Digital SLR with 18-55mm Lens</name><description>The Nikon D3100 DSLR will surprise you with its simplicity and impress you with superb results.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di103.shopping.com/images/di/52/6c/35/36553743756954597348344d475a30326c7851-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di103.shopping.com/images/di/52/6c/35/36553743756954597348344d475a30326c7851-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di103.shopping.com/images/di/52/6c/35/36553743756954597348344d475a30326c7851-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">549.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">549.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=Rl56U7CuiTYsH4MGZ02lxQ%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D903483107%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C2%AE+D3100%E2%84%A2+14.2MP+Digital+SLR+with+18-55mm+Lens&amp;dlprc=549.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=11&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=11&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=496&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>9614867</sku></offer><offer featured="false" id="huS6xZKDKaKMTMP71eI6DA==" smartBuy="false" used="false"><name>Nikon D3100 SLR w/Nikon 18-55mm VR &amp; 55-200mm VR Lenses</name><description>14.2 Megapixels3" LCDLive ViewHD 1080p Video w/ Sound &amp; Autofocus11-point Autofocus3 Frames per Second ShootingISO 100 to 3200 (Expand to 12800-Hi2)Self Cleaning SensorEXPEED 2, Image Processing EngineScene Recognition System</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="345" width="345"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-345x345-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">695.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">695.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=371&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=487342&amp;crawler_id=487342&amp;dealId=huS6xZKDKaKMTMP71eI6DA%3D%3D&amp;url=http%3A%2F%2Fwww.rythercamera.com%2Fcatalog%2Fproduct_info.php%3Fcsv%3Dsh%26products_id%3D32983%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D3100+SLR+w%2FNikon+18-55mm+VR+%26+55-200mm+VR+Lenses&amp;dlprc=695.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=15&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=15&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=379&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="487342" trusted="false"><name>RytherCamera.com</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/487342.gif</sourceURL></logo><phoneNumber>1-877-644-7593</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>32983</sku></offer></offers></product><product id="95397883"><name>Nikon COOLPIX S203 Digital Camera</name><shortDescription>10 Megapixel, Ultra-Compact Camera, 2.5 in. LCD Screen, 3x Optical Zoom, With Video Capability, Weight: 0.23 lb.</shortDescription><fullDescription>With 10.34 mega pixel, electronic VR vibration reduction, 5-level brightness adjustment, 3x optical zoom, and TFT LCD, Nikon Coolpix s203 fulfills all the demands of any photographer. The digital camera has an inbuilt memory of 44MB and an external memory slot made for all kinds of SD (Secure Digital) cards.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="499" width="500"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-500x499-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></images><rating><reviewCount>0</reviewCount></rating><minPrice>139.00</minPrice><maxPrice>139.00</maxPrice><productOffersURL>http://www.shopping.com/Nikon-Coolpix-S203/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-Coolpix-S203/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="1" pageNumber="1" returnedOfferCount="1"><offer featured="false" id="sBd2JnIEPM-A_lBAM1RZgQ==" smartBuy="false" used="false"><name>Nikon Coolpix S203 Digital Camera (Red)</name><description>With 10.34 mega pixel, electronic VR vibration reduction, 5-level brightness adjustment, 3x optical zoom, and TFT LCD, Nikon Coolpix s203 fulfills all the demands of any photographer. The digital camera has an inbuilt memory of 44MB and an external memory slot made for all kinds of SD (Secure Digital) cards.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Fantastic prices with ease &amp; comfort of Amazon.com!</storeNotes><basePrice currency="USD">139.00</basePrice><shippingCost currency="USD">9.50</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=566&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=301531&amp;crawler_id=1903313&amp;dealId=sBd2JnIEPM-A_lBAM1RZgQ%3D%3D&amp;url=http%3A%2F%2Fwww.amazon.com%2Fdp%2FB002T964IM%2Fref%3Dasc_df_B002T964IM1751618%3Fsmid%3DA22UHVNXG98FAT%26tag%3Ddealtime-ce-mp01feed-20%26linkCode%3Dasn%26creative%3D395105%26creativeASIN%3DB002T964IM&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+Coolpix+S203+Digital+Camera+%28Red%29&amp;dlprc=139.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=63&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=95397883&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=63&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=518&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="301531" trusted="false"><name>Amazon Marketplace</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/301531.gif</sourceURL></logo><ratingInfo><reviewCount>213</reviewCount><rating>2.73</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_amazon_marketplace_9689~MRD-301531~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>B002T964IM</sku></offer></offers></product><product id="106834268"><name>Nikon S3100 Digital Camera</name><shortDescription>14.5 Megapixel, Compact Camera, 2.7 in. LCD Screen, 5x Optical Zoom, With High Definition Video, Weight: 0.23 lb.</shortDescription><fullDescription>This digital camera features a wide-angle optical Zoom-NIKKOR glass lens that allows you to capture anything from landscapes to portraits to action shots. The high-definition movie mode with one-touch recording makes it easy to capture video clips.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="387" width="507"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-507x387-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></images><rating><reviewCount>1</reviewCount><rating>2.00</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_2.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/nikon-s3100/reviews~linkin_id-7000610</reviewURL></rating><minPrice>99.95</minPrice><maxPrice>134.95</maxPrice><productOffersURL>http://www.shopping.com/nikon-s3100/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/nikon-s3100/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="67" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="UUyGoqV8r0-xrkn-rnGNbg==" smartBuy="false" used="false"><name>CoolPix S3100 14 Megapixel Compact Digital Camera- Red</name><description>Nikon Coolpix S3100 - Digital camera - compact - 14.0 Mpix - optical zoom: 5 x - supported memory: SD, SDXC, SDHC - red</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">119.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.95</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=UUyGoqV8r0-xrkn-rnGNbg%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBJpFHJ3Yx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmDAJeU1oyGG0GcBdhGwUGCAVqYF9SO0xSN1sZdmA7dmMdBQAJB24qX1NbQxI6AjA2ME5dVFULPDsGPFcQTTdaLTA6SR0OFlQvPAwMDxYcYlxIVkcoLTcCDA%3D%3D%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=CoolPix+S3100+14+Megapixel+Compact+Digital+Camera-+Red&amp;dlprc=119.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=28&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=28&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=0&amp;code=&amp;acode=583&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00337013000</sku></offer><offer featured="false" id="X87AwXlW1dXoMXk4QQDToQ==" smartBuy="false" used="false"><name>COOLPIX S3100 Pink</name><description>Nikon Coolpix S3100 - Digital camera - compact - 14.0 Mpix - optical zoom: 5 x - supported memory: SD, SDXC, SDHC - pink</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">119.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.95</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=X87AwXlW1dXoMXk4QQDToQ%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBJpFHJxYx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmb2JcUFxDEGsPc3QDEkFZVQ0WFhdRW0MWbgYWDlxzdGMdAVQWRi0xDAwPFhw9TSobb05eWVVYKzsLTFVVQi5RICs3SA8MU1s2MQQKD1wf%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=COOLPIX+S3100+Pink&amp;dlprc=119.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=31&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=31&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=0&amp;code=&amp;acode=583&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00337015000</sku></offer><offer featured="false" id="nvFwnpfA4rlA1Dbksdsa0w==" smartBuy="false" used="false"><name>Nikon Coolpix S3100 14.0 MP Digital Camera - Silver</name><description>Nikon Coolpix S3100 14.0 MP Digital Camera - Silver</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/6e/76/46/776e70664134726c413144626b736473613077-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/6e/76/46/776e70664134726c413144626b736473613077-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="270" width="270"><sourceURL>http://di109.shopping.com/images/di/6e/76/46/776e70664134726c413144626b736473613077-270x270-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">109.97</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">109.97</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=803&amp;BEFID=7185&amp;aon=%5E&amp;MerchantID=475774&amp;crawler_id=475774&amp;dealId=nvFwnpfA4rlA1Dbksdsa0w%3D%3D&amp;url=http%3A%2F%2Fwww.thewiz.com%2Fcatalog%2Fproduct.jsp%3FmodelNo%3DS3100SILVER%26gdftrk%3DgdfV2677_a_7c996_a_7c4049_a_7c26262&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+Coolpix+S3100+14.0+MP+Digital+Camera+-+Silver&amp;dlprc=109.97&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=33&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=33&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=797&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="475774" trusted="false"><name>TheWiz.com</name><logo available="false" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/475774.gif</sourceURL></logo><phoneNumber>877-542-6988</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>26262</sku></offer><offer featured="false" id="5GtaN2NeryKwps-Se2l-4g==" smartBuy="false" used="false"><name>Nikon� COOLPIX� S3100 14MP Digital Camera (Silver)</name><description>The Nikon COOLPIX S3100 is the easy way to share your life and stay connected.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di102.shopping.com/images/di/35/47/74/614e324e6572794b7770732d5365326c2d3467-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di102.shopping.com/images/di/35/47/74/614e324e6572794b7770732d5365326c2d3467-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di102.shopping.com/images/di/35/47/74/614e324e6572794b7770732d5365326c2d3467-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">119.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">119.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=5GtaN2NeryKwps-Se2l-4g%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D848064082%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C3%AF%C2%BF%C2%BD+COOLPIX%C3%AF%C2%BF%C2%BD+S3100+14MP+Digital+Camera+%28Silver%29&amp;dlprc=119.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=37&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=37&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=509&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>10101095</sku></offer><offer featured="false" id="a43m0RXulX38zCnQjU59jw==" smartBuy="false" used="false"><name>COOLPIX S3100 Yellow</name><description>Nikon Coolpix S3100 - Digital camera - compact - 14.0 Mpix - optical zoom: 5 x - supported memory: SD, SDXC, SDHC - yellow</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">119.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.95</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=a43m0RXulX38zCnQjU59jw%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBJpFHJwYx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmb2JcUFxDEGoPc3QDEkFZVQ0WFhdRW0MWbgYWDlxzdGMdAVQWRi0xDAwPFhw9TSobb05eWVVYKzsLTFVVQi5RICs3SA8MU1s2MQQKD1wf%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=COOLPIX+S3100+Yellow&amp;dlprc=119.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=38&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=38&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=0&amp;code=&amp;acode=583&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00337014000</sku></offer></offers></product><product id="99671132"><name>Nikon D90 Digital Camera</name><shortDescription>12.3 Megapixel, Point and Shoot Camera, 3 in. LCD Screen, With Video Capability, Weight: 1.36 lb.</shortDescription><fullDescription>Untitled Document Nikon D90 SLR Digital Camera With 28-80mm 75-300mm Lens Kit The Nikon D90 SLR Digital Camera, with its 12.3-megapixel DX-format CMOS, 3" High resolution LCD display, Scene Recognition System, Picture Control, Active D-Lighting, and one-button Live View, provides photo enthusiasts with the image quality and performance they need to pursue their own vision while still being intuitive enough for use as an everyday camera.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="255" width="499"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-499x255-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></images><rating><reviewCount>7</reviewCount><rating>5.00</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_5.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/Nikon-D90-with-18-270mm-Lens/reviews~linkin_id-7000610</reviewURL></rating><minPrice>689.00</minPrice><maxPrice>2299.00</maxPrice><productOffersURL>http://www.shopping.com/Nikon-D90-with-18-270mm-Lens/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-D90-with-18-270mm-Lens/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="43" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="GU5JJkpUAxe5HujB7fkwAA==" smartBuy="false" used="false"><name>Nikon® D90 12.3MP Digital SLR Camera (Body Only)</name><description>The Nikon D90 will make you rethink what a digital SLR camera can achieve.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di106.shopping.com/images/di/47/55/35/4a4a6b70554178653548756a4237666b774141-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di106.shopping.com/images/di/47/55/35/4a4a6b70554178653548756a4237666b774141-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di106.shopping.com/images/di/47/55/35/4a4a6b70554178653548756a4237666b774141-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">1015.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1015.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=GU5JJkpUAxe5HujB7fkwAA%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D851830266%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C2%AE+D90+12.3MP+Digital+SLR+Camera+%28Body+Only%29&amp;dlprc=1015.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=14&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=14&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=496&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>10148659</sku></offer><offer featured="false" id="XhURuSC-spBbTIDfo4qfzQ==" smartBuy="false" used="false"><name>Nikon D90 SLR Digital Camera (Camera Body)</name><description>The Nikon D90 SLR Digital Camera  with its 12.3-megapixel DX-format CCD  3" High resolution LCD display  Scene Recognition System  Picture Control  Active D-Lighting  and one-button Live View  provides photo enthusiasts with the image quality and performance they need to pursue their own vision while still being intuitive enough for use as an everyday camera. In addition  the D90 introduces the D-Movie mode  allowing for the first time  an interchangeable lens SLR camera that is capable of recording 720p HD movie clips.  Availabilty: In Stock</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="350" width="350"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-350x350-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Free Shipping with Any Purchase!</storeNotes><basePrice currency="USD">689.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">900.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=647&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=475674&amp;crawler_id=475674&amp;dealId=XhURuSC-spBbTIDfo4qfzQ%3D%3D&amp;url=http%3A%2F%2Fwww.fumfie.com%2Fproduct%2F169.5%2Fshopping-com%3F&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+SLR+Digital+Camera+%28Camera+Body%29&amp;dlprc=689.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=16&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=16&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=1&amp;SL=1&amp;FS=1&amp;code=&amp;acode=658&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="475674" trusted="true"><name>FumFie</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/475674.gif</sourceURL></logo><phoneNumber>866 666 9198</phoneNumber><ratingInfo><reviewCount>560</reviewCount><rating>4.27</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_fumfie~MRD-475674~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>F169C5</sku></offer><offer featured="false" id="o0Px_XLWDbrxAYRy3rCmyQ==" smartBuy="false" used="false"><name>Nikon D90 SLR w/Nikon 18-105mm VR &amp; 55-200mm VR Lenses</name><description>12.3 MegapixelDX Format CMOS Sensor3" VGA LCD DisplayLive ViewSelf Cleaning SensorD-Movie ModeHigh Sensitivity (ISO 3200)4.5 fps BurstIn-Camera Image Editing</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">1189.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1189.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=371&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=487342&amp;crawler_id=487342&amp;dealId=o0Px_XLWDbrxAYRy3rCmyQ%3D%3D&amp;url=http%3A%2F%2Fwww.rythercamera.com%2Fcatalog%2Fproduct_info.php%3Fcsv%3Dsh%26products_id%3D30619%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+SLR+w%2FNikon+18-105mm+VR+%26+55-200mm+VR+Lenses&amp;dlprc=1189.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=20&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=20&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=379&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="487342" trusted="false"><name>RytherCamera.com</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/487342.gif</sourceURL></logo><phoneNumber>1-877-644-7593</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>30619</sku></offer><offer featured="false" id="4HgbWJSJ8ssgIf8B0MXIwA==" smartBuy="false" used="false"><name>Nikon D90 12.3 Megapixel Digital SLR Camera (Body Only)</name><description>Fusing 12.3 megapixel image quality and a cinematic 24fps D-Movie Mode, the Nikon D90 exceeds the demands of passionate photographers. Coupled with Nikon's EXPEED image processing technologies and NIKKOR optics, breathtaking image fidelity is assured. Combined with fast 0.15ms power-up and split-second 65ms shooting lag, dramatic action and decisive moments are captured easily. Effective 4-frequency, ultrasonic sensor cleaning frees image degrading dust particles from the sensor's optical low pass filter.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di110.shopping.com/images/di/34/48/67/62574a534a3873736749663842304d58497741-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di110.shopping.com/images/di/34/48/67/62574a534a3873736749663842304d58497741-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di110.shopping.com/images/di/34/48/67/62574a534a3873736749663842304d58497741-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>FREE FEDEX 2-3 DAY DELIVERY</storeNotes><basePrice currency="USD">899.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">899.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=269&amp;BEFID=7185&amp;aon=%5E&amp;MerchantID=9296&amp;crawler_id=811558&amp;dealId=4HgbWJSJ8ssgIf8B0MXIwA%3D%3D&amp;url=http%3A%2F%2Fwww.pcnation.com%2Foptics-gallery%2Fdetails.asp%3Faffid%3D305%26item%3D2N145P&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+12.3+Megapixel+Digital+SLR+Camera+%28Body+Only%29&amp;dlprc=899.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=21&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=21&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=257&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="9296" trusted="true"><name>PCNation</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/9296.gif</sourceURL></logo><phoneNumber>800-470-7079</phoneNumber><ratingInfo><reviewCount>1622</reviewCount><rating>4.43</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_pcnation_9689~MRD-9296~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>2N145P</sku></offer><offer featured="false" id="UNDa3uMDZXOnvD_7sTILYg==" smartBuy="false" used="false"><name>Nikon D90 12.3MP Digital SLR Camera (Body Only)</name><description>Fusing 12.3-megapixel image quality inherited from the award-winning D300 with groundbreaking features, the D90's breathtaking, low-noise image quality is further advanced with EXPEED image processing. Split-second shutter response and continuous shooting at up to 4.5 frames-per-second provide the power to capture fast action and precise moments perfectly, while Nikon's exclusive Scene Recognition System contributes to faster 11-area autofocus performance, finer white balance detection and more. The D90 delivers the control passionate photographers demand, utilizing comprehensive exposure functions and the intelligence of 3D Color Matrix Metering II. Stunning results come to life on a 3-inch 920,000-dot color LCD monitor, providing accurate image review, Live View composition and brilliant playback of the D90's cinematic-quality 24-fps HD D-Movie mode.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Fantastic prices with ease &amp; comfort of Amazon.com!</storeNotes><basePrice currency="USD">780.00</basePrice><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">780.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=566&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=301531&amp;crawler_id=1903313&amp;dealId=UNDa3uMDZXOnvD_7sTILYg%3D%3D&amp;url=http%3A%2F%2Fwww.amazon.com%2Fdp%2FB001ET5U92%2Fref%3Dasc_df_B001ET5U921751618%3Fsmid%3DAHF4SYKP09WBH%26tag%3Ddealtime-ce-mp01feed-20%26linkCode%3Dasn%26creative%3D395105%26creativeASIN%3DB001ET5U92&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+12.3MP+Digital+SLR+Camera+%28Body+Only%29&amp;dlprc=780.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=29&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=29&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=520&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="301531" trusted="false"><name>Amazon Marketplace</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/301531.gif</sourceURL></logo><ratingInfo><reviewCount>213</reviewCount><rating>2.73</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_amazon_marketplace_9689~MRD-301531~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>B001ET5U92</sku></offer></offers></product><product id="70621646"><name>Nikon D90 Digital Camera with 18-105mm lens</name><shortDescription>12.9 Megapixel, SLR Camera, 3 in. LCD Screen, 5.8x Optical Zoom, With Video Capability, Weight: 2.3 lb.</shortDescription><fullDescription>Its 12.3 megapixel DX-format CMOS image sensor and EXPEED image processing system offer outstanding image quality across a wide ISO light sensitivity range. Live View mode lets you compose and shoot via the high-resolution 3-inch LCD monitor, and an advanced Scene Recognition System and autofocus performance help capture images with astounding accuracy. Movies can be shot in Motion JPEG format using the D-Movie function. The camera’s large image sensor ensures exceptional movie image quality and you can create dramatic effects by shooting with a wide range of interchangeable NIKKOR lenses, from wide-angle to macro to fisheye, or by adjusting the lens aperture and experimenting with depth-of-field. The D90 – designed to fuel your passion for photography.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="489" width="490"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-490x489-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></images><rating><reviewCount>32</reviewCount><rating>4.81</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_5.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/Nikon-D90-with-18-105mm-lens/reviews~linkin_id-7000610</reviewURL></rating><minPrice>849.95</minPrice><maxPrice>1599.95</maxPrice><productOffersURL>http://www.shopping.com/Nikon-D90-with-18-105mm-lens/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-D90-with-18-105mm-lens/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="25" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="3o5e1VghgJPfhLvT1JFKTA==" smartBuy="false" used="false"><name>Nikon D90 18-105mm VR Lens</name><description>The Nikon D90 SLR Digital Camera  with its 12.3-megapixel DX-format CMOS  3" High resolution LCD display  Scene Recognition System  Picture Control  Active D-Lighting  and one-button Live View  prov</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di111.shopping.com/images/di/33/6f/35/6531566768674a5066684c7654314a464b5441-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di111.shopping.com/images/di/33/6f/35/6531566768674a5066684c7654314a464b5441-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="260" width="260"><sourceURL>http://di111.shopping.com/images/di/33/6f/35/6531566768674a5066684c7654314a464b5441-260x260-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">849.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">849.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=419&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=9390&amp;crawler_id=1905054&amp;dealId=3o5e1VghgJPfhLvT1JFKTA%3D%3D&amp;url=http%3A%2F%2Fwww.ajrichard.com%2FNikon-D90-18-105mm-VR-Lens%2Fp-292%3Frefid%3DShopping%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+18-105mm+VR+Lens&amp;dlprc=849.95&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=2&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=2&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=425&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="9390" trusted="false"><name>AJRichard</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/9390.gif</sourceURL></logo><phoneNumber>1-888-871-1256</phoneNumber><ratingInfo><reviewCount>3124</reviewCount><rating>4.48</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_ajrichard~MRD-9390~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>292</sku></offer><offer featured="false" id="_lYWj_jbwfsSkfcwUcDuww==" smartBuy="false" used="false"><name>Nikon D90 SLR w/Nikon 18-105mm VR Lens</name><description>12.3 MegapixelDX Format CMOS Sensor3" VGA LCD DisplayLive ViewSelf Cleaning SensorD-Movie ModeHigh Sensitivity (ISO 3200)4.5 fps BurstIn-Camera Image Editing</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">909.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">909.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=371&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=487342&amp;crawler_id=487342&amp;dealId=_lYWj_jbwfsSkfcwUcDuww%3D%3D&amp;url=http%3A%2F%2Fwww.rythercamera.com%2Fcatalog%2Fproduct_info.php%3Fcsv%3Dsh%26products_id%3D30971%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+SLR+w%2FNikon+18-105mm+VR+Lens&amp;dlprc=909.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=3&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=3&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=379&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="487342" trusted="false"><name>RytherCamera.com</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/487342.gif</sourceURL></logo><phoneNumber>1-877-644-7593</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>30971</sku></offer><offer featured="false" id="1KCclCGuWvty2XKU9skadg==" smartBuy="false" used="false"><name>25448/D90 12.3 Megapixel Digital Camera 18-105mm Zoom Lens w/ 3" Screen - Black</name><description>Nikon D90 - Digital camera - SLR - 12.3 Mpix - Nikon AF-S DX 18-105mm lens - optical zoom: 5.8 x - supported memory: SD, SDHC</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">1199.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">8.20</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1199.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=1KCclCGuWvty2XKU9skadg%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBRtFXpzYx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmb2JcVlhCGGkPc3QDEkFZVQ0WFhdRW0MWbgYWDlxzdGMdAVQWRi0xDAwPFhw9TSobb05eWVVYKzsLTFVVQi5RICs3SA8MU1s2MQQKD1wf%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=25448%2FD90+12.3+Megapixel+Digital+Camera+18-105mm+Zoom+Lens+w%2F+3%22+Screen+-+Black&amp;dlprc=1199.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=4&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=4&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=586&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00353197000</sku></offer><offer featured="false" id="3-VOSfVV5Jo7HlA4kJtanA==" smartBuy="false" used="false"><name>Nikon® D90 12.3MP Digital SLR with 18-105mm Lens</name><description>The Nikon D90 will make you rethink what a digital SLR camera can achieve.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di101.shopping.com/images/di/33/2d/56/4f53665656354a6f37486c41346b4a74616e41-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di101.shopping.com/images/di/33/2d/56/4f53665656354a6f37486c41346b4a74616e41-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di101.shopping.com/images/di/33/2d/56/4f53665656354a6f37486c41346b4a74616e41-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">1350.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1350.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=3-VOSfVV5Jo7HlA4kJtanA%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D982673361%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C2%AE+D90+12.3MP+Digital+SLR+with+18-105mm+Lens&amp;dlprc=1350.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=5&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=5&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=496&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>11148905</sku></offer><offer featured="false" id="kQnB6rS4AjN5dx5h2_631g==" smartBuy="false" used="false"><name>Nikon D90 Kit 12.3-megapixel Digital SLR with 18-105mm VR Lens</name><description>Photographers, take your passion further!Now is the time for new creativity, and to rethink what a digital SLR camera can achieve. It's time for the D90, a camera with everything you would expect from Nikon's next-generation D-SLRs, and some unexpected surprises, as well. The stunning image quality is inherited from the D300, Nikon's DX-format flagship. The D90 also has Nikon's unmatched ergonomics and high performance, and now takes high-quality movies with beautifully cinematic results. The world of photography has changed, and with the D90 in your hands, it's time to make your own rules.AF-S DX NIKKOR 18-105mm f/3.5-5.6G ED VR LensWide-ratio 5.8x zoom Compact, versatile and ideal for a broad range of shooting situations, ranging from interiors and landscapes to beautiful portraits� a perfect everyday zoom. Nikon VR (Vibration Reduction) image stabilization Vibration Reduction is engineered specifically for each VR NIKKOR lens and enables handheld shooting at up to 3 shutter speeds slower than would</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="232" width="300"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-300x232-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Shipping Included!</storeNotes><basePrice currency="USD">1050.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1199.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=135&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=313162&amp;crawler_id=313162&amp;dealId=kQnB6rS4AjN5dx5h2_631g%3D%3D&amp;url=http%3A%2F%2Fonecall.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1pZSxNoWHFwLx8GTAICa2ZeH1sPXTZLNzRpAh1HR0BxPQEGCBJNMhFHUElsFCFCVkVTTHAcBggEHQ4aHXNpGERGH3RQODsbAgdechJtbBt8fx8JAwhtZFAzJj1oGgIWCxRlNyFOUV9UUGIxBgo0T0IyTSYqJ0RWHw4QPCIBAAQXRGMDICg6TllZVBhh%26nAID%3D13736960&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+Kit+12.3-megapixel+Digital+SLR+with+18-105mm+VR+Lens&amp;dlprc=1050.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=6&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=6&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=1&amp;code=&amp;acode=143&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="313162" trusted="true"><name>OneCall</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/313162.gif</sourceURL></logo><phoneNumber>1.800.398.0766</phoneNumber><ratingInfo><reviewCount>180</reviewCount><rating>4.44</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_onecall_9689~MRD-313162~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>92826</sku></offer></offers></product></items><attributes matchedAttributeCount="5" returnedAttributeCount="5"><attribute id="Dynamic_Price_Range"><name>Price range</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="2" returnedValueCount="2"><attributeValue id="price_range_24_4012" matchingItemsCount="1"><name>$24 - $4012</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon/products?minPrice=24&amp;maxPrice=4012&amp;linkin_id=7000610</attributeValueURL></attributeValue><attributeValue id="price_range_4012_7999" matchingItemsCount="1"><name>$4012 - $7999</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon/products?minPrice=4012&amp;maxPrice=7999&amp;linkin_id=7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="9688_brand"><name>Brand</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-9688-brand~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="7" returnedValueCount="5"><attributeValue id="brand_nikon" matchingItemsCount="2261"><name>Nikon</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+brand-nikon/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="9688_brand_crane" matchingItemsCount="17"><name>Crane</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+9688-brand-crane/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="ikelite" matchingItemsCount="2"><name>Ikelite</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+ikelite/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="bower" matchingItemsCount="1"><name>Bower</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+bower/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="brand_fuji" matchingItemsCount="2"><name>FUJIFILM</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+brand-fuji/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="store"><name>Store</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-store~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="35" returnedValueCount="5"><attributeValue id="store_amazon_marketplace_9689" matchingItemsCount="808"><name>Amazon Marketplace</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-amazon-marketplace-9689/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_amazon" matchingItemsCount="83"><name>Amazon</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-amazon/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_adorama" matchingItemsCount="81"><name>Adorama</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-adorama/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_j_r_music_and_computer_world" matchingItemsCount="78"><name>J&amp;R Music and Computer World</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-j-r-music-and-computer-world/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_rythercamera_com" matchingItemsCount="78"><name>RytherCamera.com</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-rythercamera-com/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="21885_resolution"><name>Resolution</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-21885-resolution~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="13" returnedValueCount="5"><attributeValue id="under_4_megapixel" matchingItemsCount="3"><name>Under 4 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+under-4-megapixel/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="5_megapixel_digital_cameras" matchingItemsCount="1085"><name>At least 5 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+5-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="6_megapixel_digital_cameras" matchingItemsCount="1080"><name>At least 6 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+6-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="7_megapixel_digital_cameras" matchingItemsCount="1066"><name>At least 7 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+7-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="8_megapixel_digital_cameras" matchingItemsCount="1056"><name>At least 8 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+8-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="32804-features"><name>Features</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-32804-features~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="12" returnedValueCount="5"><attributeValue id="32804_features_shockproof" matchingItemsCount="7"><name>Shockproof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-shockproof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_waterproof" matchingItemsCount="32"><name>Waterproof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-waterproof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_freezeproof" matchingItemsCount="7"><name>Freezeproof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-freezeproof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_dust_proof" matchingItemsCount="23"><name>Dust proof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-dust-proof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_image_stabilization" matchingItemsCount="797"><name>Image Stabilization</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-image-stabilization/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute></attributes><contentType>hybrid</contentType></category></categories><relatedTerms><term>digital camera</term><term>g1</term><term>sony</term><term>camera</term><term>canon</term><term>nikon</term><term>kodak digital camera</term><term>kodak</term><term>sony cybershot</term><term>kodak easyshare digital camera</term><term>nikon coolpix</term><term>olympus</term><term>pink digital camera</term><term>canon powershot</term></relatedTerms></GeneralSearchResponse>
\ No newline at end of file
diff --git a/node_modules/sax/examples/strict.dtd b/node_modules/sax/examples/strict.dtd
deleted file mode 100644
index b274559..0000000
--- a/node_modules/sax/examples/strict.dtd
+++ /dev/null
@@ -1,870 +0,0 @@
-<!--
-    This is HTML 4.01 Strict DTD, which excludes the presentation 
-    attributes and elements that W3C expects to phase out as 
-    support for style sheets matures. Authors should use the Strict
-    DTD when possible, but may use the Transitional DTD when support
-    for presentation attribute and elements is required.
-    
-    HTML 4 includes mechanisms for style sheets, scripting,
-    embedding objects, improved support for right to left and mixed
-    direction text, and enhancements to forms for improved
-    accessibility for people with disabilities.
-
-          Draft: $Date: 1999/12/24 23:37:48 $
-
-          Authors:
-              Dave Raggett <dsr@w3.org>
-              Arnaud Le Hors <lehors@w3.org>
-              Ian Jacobs <ij@w3.org>
-
-    Further information about HTML 4.01 is available at:
-
-        http://www.w3.org/TR/1999/REC-html401-19991224
-
-
-    The HTML 4.01 specification includes additional
-    syntactic constraints that cannot be expressed within
-    the DTDs.
-
--->
-<!--
-    Typical usage:
-
-    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
-            "http://www.w3.org/TR/html4/strict.dtd">
-    <html>
-    <head>
-    ...
-    </head>
-    <body>
-    ...
-    </body>
-    </html>
-
-    The URI used as a system identifier with the public identifier allows
-    the user agent to download the DTD and entity sets as needed.
-
-    The FPI for the Transitional HTML 4.01 DTD is:
-
-        "-//W3C//DTD HTML 4.01 Transitional//EN"
-
-    This version of the transitional DTD is:
-
-        http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd
-
-    If you are writing a document that includes frames, use 
-    the following FPI:
-
-        "-//W3C//DTD HTML 4.01 Frameset//EN"
-
-    This version of the frameset DTD is:
-
-        http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd
-
-    Use the following (relative) URIs to refer to 
-    the DTDs and entity definitions of this specification:
-
-    "strict.dtd"
-    "loose.dtd"
-    "frameset.dtd"
-    "HTMLlat1.ent"
-    "HTMLsymbol.ent"
-    "HTMLspecial.ent"
-
--->
-
-<!--================== Imported Names ====================================-->
-<!-- Feature Switch for frameset documents -->
-<!ENTITY % HTML.Frameset "IGNORE">
-
-<!ENTITY % ContentType "CDATA"
-    -- media type, as per [RFC2045]
-    -->
-
-<!ENTITY % ContentTypes "CDATA"
-    -- comma-separated list of media types, as per [RFC2045]
-    -->
-
-<!ENTITY % Charset "CDATA"
-    -- a character encoding, as per [RFC2045]
-    -->
-
-<!ENTITY % Charsets "CDATA"
-    -- a space-separated list of character encodings, as per [RFC2045]
-    -->
-
-<!ENTITY % LanguageCode "NAME"
-    -- a language code, as per [RFC1766]
-    -->
-
-<!ENTITY % Character "CDATA"
-    -- a single character from [ISO10646] 
-    -->
-
-<!ENTITY % LinkTypes "CDATA"
-    -- space-separated list of link types
-    -->
-
-<!ENTITY % MediaDesc "CDATA"
-    -- single or comma-separated list of media descriptors
-    -->
-
-<!ENTITY % URI "CDATA"
-    -- a Uniform Resource Identifier,
-       see [URI]
-    -->
-
-<!ENTITY % Datetime "CDATA" -- date and time information. ISO date format -->
-
-
-<!ENTITY % Script "CDATA" -- script expression -->
-
-<!ENTITY % StyleSheet "CDATA" -- style sheet data -->
-
-
-
-<!ENTITY % Text "CDATA">
-
-
-<!-- Parameter Entities -->
-
-<!ENTITY % head.misc "SCRIPT|STYLE|META|LINK|OBJECT" -- repeatable head elements -->
-
-<!ENTITY % heading "H1|H2|H3|H4|H5|H6">
-
-<!ENTITY % list "UL | OL">
-
-<!ENTITY % preformatted "PRE">
-
-
-<!--================ Character mnemonic entities =========================-->
-
-<!ENTITY % HTMLlat1 PUBLIC
-   "-//W3C//ENTITIES Latin1//EN//HTML"
-   "HTMLlat1.ent">
-%HTMLlat1;
-
-<!ENTITY % HTMLsymbol PUBLIC
-   "-//W3C//ENTITIES Symbols//EN//HTML"
-   "HTMLsymbol.ent">
-%HTMLsymbol;
-
-<!ENTITY % HTMLspecial PUBLIC
-   "-//W3C//ENTITIES Special//EN//HTML"
-   "HTMLspecial.ent">
-%HTMLspecial;
-<!--=================== Generic Attributes ===============================-->
-
-<!ENTITY % coreattrs
- "id          ID             #IMPLIED  -- document-wide unique id --
-  class       CDATA          #IMPLIED  -- space-separated list of classes --
-  style       %StyleSheet;   #IMPLIED  -- associated style info --
-  title       %Text;         #IMPLIED  -- advisory title --"
-  >
-
-<!ENTITY % i18n
- "lang        %LanguageCode; #IMPLIED  -- language code --
-  dir         (ltr|rtl)      #IMPLIED  -- direction for weak/neutral text --"
-  >
-
-<!ENTITY % events
- "onclick     %Script;       #IMPLIED  -- a pointer button was clicked --
-  ondblclick  %Script;       #IMPLIED  -- a pointer button was double clicked--
-  onmousedown %Script;       #IMPLIED  -- a pointer button was pressed down --
-  onmouseup   %Script;       #IMPLIED  -- a pointer button was released --
-  onmouseover %Script;       #IMPLIED  -- a pointer was moved onto --
-  onmousemove %Script;       #IMPLIED  -- a pointer was moved within --
-  onmouseout  %Script;       #IMPLIED  -- a pointer was moved away --
-  onkeypress  %Script;       #IMPLIED  -- a key was pressed and released --
-  onkeydown   %Script;       #IMPLIED  -- a key was pressed down --
-  onkeyup     %Script;       #IMPLIED  -- a key was released --"
-  >
-
-<!-- Reserved Feature Switch -->
-<!ENTITY % HTML.Reserved "IGNORE">
-
-<!-- The following attributes are reserved for possible future use -->
-<![ %HTML.Reserved; [
-<!ENTITY % reserved
- "datasrc     %URI;          #IMPLIED  -- a single or tabular Data Source --
-  datafld     CDATA          #IMPLIED  -- the property or column name --
-  dataformatas (plaintext|html) plaintext -- text or html --"
-  >
-]]>
-
-<!ENTITY % reserved "">
-
-<!ENTITY % attrs "%coreattrs; %i18n; %events;">
-
-
-<!--=================== Text Markup ======================================-->
-
-<!ENTITY % fontstyle
- "TT | I | B | BIG | SMALL">
-
-<!ENTITY % phrase "EM | STRONG | DFN | CODE |
-                   SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >
-
-<!ENTITY % special
-   "A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
-
-<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">
-
-<!-- %inline; covers inline or "text-level" elements -->
-<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
-
-<!ELEMENT (%fontstyle;|%phrase;) - - (%inline;)*>
-<!ATTLIST (%fontstyle;|%phrase;)
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-<!ELEMENT (SUB|SUP) - - (%inline;)*    -- subscript, superscript -->
-<!ATTLIST (SUB|SUP)
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-<!ELEMENT SPAN - - (%inline;)*         -- generic language/style container -->
-<!ATTLIST SPAN
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  %reserved;			       -- reserved for possible future use --
-  >
-
-<!ELEMENT BDO - - (%inline;)*          -- I18N BiDi over-ride -->
-<!ATTLIST BDO
-  %coreattrs;                          -- id, class, style, title --
-  lang        %LanguageCode; #IMPLIED  -- language code --
-  dir         (ltr|rtl)      #REQUIRED -- directionality --
-  >
-
-
-<!ELEMENT BR - O EMPTY                 -- forced line break -->
-<!ATTLIST BR
-  %coreattrs;                          -- id, class, style, title --
-  >
-
-<!--================== HTML content models ===============================-->
-
-<!--
-    HTML has two basic content models:
-
-        %inline;     character level elements and text strings
-        %block;      block-like elements e.g. paragraphs and lists
--->
-
-<!ENTITY % block
-     "P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
-      BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">
-
-<!ENTITY % flow "%block; | %inline;">
-
-<!--=================== Document Body ====================================-->
-
-<!ELEMENT BODY O O (%block;|SCRIPT)+ +(INS|DEL) -- document body -->
-<!ATTLIST BODY
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  onload          %Script;   #IMPLIED  -- the document has been loaded --
-  onunload        %Script;   #IMPLIED  -- the document has been removed --
-  >
-
-<!ELEMENT ADDRESS - - (%inline;)* -- information on author -->
-<!ATTLIST ADDRESS
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-<!ELEMENT DIV - - (%flow;)*            -- generic language/style container -->
-<!ATTLIST DIV
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  %reserved;                           -- reserved for possible future use --
-  >
-
-
-<!--================== The Anchor Element ================================-->
-
-<!ENTITY % Shape "(rect|circle|poly|default)">
-<!ENTITY % Coords "CDATA" -- comma-separated list of lengths -->
-
-<!ELEMENT A - - (%inline;)* -(A)       -- anchor -->
-<!ATTLIST A
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
-  type        %ContentType;  #IMPLIED  -- advisory content type --
-  name        CDATA          #IMPLIED  -- named link end --
-  href        %URI;          #IMPLIED  -- URI for linked resource --
-  hreflang    %LanguageCode; #IMPLIED  -- language code --
-  rel         %LinkTypes;    #IMPLIED  -- forward link types --
-  rev         %LinkTypes;    #IMPLIED  -- reverse link types --
-  accesskey   %Character;    #IMPLIED  -- accessibility key character --
-  shape       %Shape;        rect      -- for use with client-side image maps --
-  coords      %Coords;       #IMPLIED  -- for use with client-side image maps --
-  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
-  onfocus     %Script;       #IMPLIED  -- the element got the focus --
-  onblur      %Script;       #IMPLIED  -- the element lost the focus --
-  >
-
-<!--================== Client-side image maps ============================-->
-
-<!-- These can be placed in the same document or grouped in a
-     separate document although this isn't yet widely supported -->
-
-<!ELEMENT MAP - - ((%block;) | AREA)+ -- client-side image map -->
-<!ATTLIST MAP
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  name        CDATA          #REQUIRED -- for reference by usemap --
-  >
-
-<!ELEMENT AREA - O EMPTY               -- client-side image map area -->
-<!ATTLIST AREA
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  shape       %Shape;        rect      -- controls interpretation of coords --
-  coords      %Coords;       #IMPLIED  -- comma-separated list of lengths --
-  href        %URI;          #IMPLIED  -- URI for linked resource --
-  nohref      (nohref)       #IMPLIED  -- this region has no action --
-  alt         %Text;         #REQUIRED -- short description --
-  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
-  accesskey   %Character;    #IMPLIED  -- accessibility key character --
-  onfocus     %Script;       #IMPLIED  -- the element got the focus --
-  onblur      %Script;       #IMPLIED  -- the element lost the focus --
-  >
-
-<!--================== The LINK Element ==================================-->
-
-<!--
-  Relationship values can be used in principle:
-
-   a) for document specific toolbars/menus when used
-      with the LINK element in document head e.g.
-        start, contents, previous, next, index, end, help
-   b) to link to a separate style sheet (rel=stylesheet)
-   c) to make a link to a script (rel=script)
-   d) by stylesheets to control how collections of
-      html nodes are rendered into printed documents
-   e) to make a link to a printable version of this document
-      e.g. a postscript or pdf version (rel=alternate media=print)
--->
-
-<!ELEMENT LINK - O EMPTY               -- a media-independent link -->
-<!ATTLIST LINK
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
-  href        %URI;          #IMPLIED  -- URI for linked resource --
-  hreflang    %LanguageCode; #IMPLIED  -- language code --
-  type        %ContentType;  #IMPLIED  -- advisory content type --
-  rel         %LinkTypes;    #IMPLIED  -- forward link types --
-  rev         %LinkTypes;    #IMPLIED  -- reverse link types --
-  media       %MediaDesc;    #IMPLIED  -- for rendering on these media --
-  >
-
-<!--=================== Images ===========================================-->
-
-<!-- Length defined in strict DTD for cellpadding/cellspacing -->
-<!ENTITY % Length "CDATA" -- nn for pixels or nn% for percentage length -->
-<!ENTITY % MultiLength "CDATA" -- pixel, percentage, or relative -->
-
-<![ %HTML.Frameset; [
-<!ENTITY % MultiLengths "CDATA" -- comma-separated list of MultiLength -->
-]]>
-
-<!ENTITY % Pixels "CDATA" -- integer representing length in pixels -->
-
-
-<!-- To avoid problems with text-only UAs as well as 
-   to make image content understandable and navigable 
-   to users of non-visual UAs, you need to provide
-   a description with ALT, and avoid server-side image maps -->
-<!ELEMENT IMG - O EMPTY                -- Embedded image -->
-<!ATTLIST IMG
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  src         %URI;          #REQUIRED -- URI of image to embed --
-  alt         %Text;         #REQUIRED -- short description --
-  longdesc    %URI;          #IMPLIED  -- link to long description
-                                          (complements alt) --
-  name        CDATA          #IMPLIED  -- name of image for scripting --
-  height      %Length;       #IMPLIED  -- override height --
-  width       %Length;       #IMPLIED  -- override width --
-  usemap      %URI;          #IMPLIED  -- use client-side image map --
-  ismap       (ismap)        #IMPLIED  -- use server-side image map --
-  >
-
-<!-- USEMAP points to a MAP element which may be in this document
-  or an external document, although the latter is not widely supported -->
-
-<!--==================== OBJECT ======================================-->
-<!--
-  OBJECT is used to embed objects as part of HTML pages 
-  PARAM elements should precede other content. SGML mixed content
-  model technicality precludes specifying this formally ...
--->
-
-<!ELEMENT OBJECT - - (PARAM | %flow;)*
- -- generic embedded object -->
-<!ATTLIST OBJECT
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  declare     (declare)      #IMPLIED  -- declare but don't instantiate flag --
-  classid     %URI;          #IMPLIED  -- identifies an implementation --
-  codebase    %URI;          #IMPLIED  -- base URI for classid, data, archive--
-  data        %URI;          #IMPLIED  -- reference to object's data --
-  type        %ContentType;  #IMPLIED  -- content type for data --
-  codetype    %ContentType;  #IMPLIED  -- content type for code --
-  archive     CDATA          #IMPLIED  -- space-separated list of URIs --
-  standby     %Text;         #IMPLIED  -- message to show while loading --
-  height      %Length;       #IMPLIED  -- override height --
-  width       %Length;       #IMPLIED  -- override width --
-  usemap      %URI;          #IMPLIED  -- use client-side image map --
-  name        CDATA          #IMPLIED  -- submit as part of form --
-  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
-  %reserved;                           -- reserved for possible future use --
-  >
-
-<!ELEMENT PARAM - O EMPTY              -- named property value -->
-<!ATTLIST PARAM
-  id          ID             #IMPLIED  -- document-wide unique id --
-  name        CDATA          #REQUIRED -- property name --
-  value       CDATA          #IMPLIED  -- property value --
-  valuetype   (DATA|REF|OBJECT) DATA   -- How to interpret value --
-  type        %ContentType;  #IMPLIED  -- content type for value
-                                          when valuetype=ref --
-  >
-
-
-<!--=================== Horizontal Rule ==================================-->
-
-<!ELEMENT HR - O EMPTY -- horizontal rule -->
-<!ATTLIST HR
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-<!--=================== Paragraphs =======================================-->
-
-<!ELEMENT P - O (%inline;)*            -- paragraph -->
-<!ATTLIST P
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-<!--=================== Headings =========================================-->
-
-<!--
-  There are six levels of headings from H1 (the most important)
-  to H6 (the least important).
--->
-
-<!ELEMENT (%heading;)  - - (%inline;)* -- heading -->
-<!ATTLIST (%heading;)
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-<!--=================== Preformatted Text ================================-->
-
-<!-- excludes markup for images and changes in font size -->
-<!ENTITY % pre.exclusion "IMG|OBJECT|BIG|SMALL|SUB|SUP">
-
-<!ELEMENT PRE - - (%inline;)* -(%pre.exclusion;) -- preformatted text -->
-<!ATTLIST PRE
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-<!--===================== Inline Quotes ==================================-->
-
-<!ELEMENT Q - - (%inline;)*            -- short inline quotation -->
-<!ATTLIST Q
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  cite        %URI;          #IMPLIED  -- URI for source document or msg --
-  >
-
-<!--=================== Block-like Quotes ================================-->
-
-<!ELEMENT BLOCKQUOTE - - (%block;|SCRIPT)+ -- long quotation -->
-<!ATTLIST BLOCKQUOTE
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  cite        %URI;          #IMPLIED  -- URI for source document or msg --
-  >
-
-<!--=================== Inserted/Deleted Text ============================-->
-
-
-<!-- INS/DEL are handled by inclusion on BODY -->
-<!ELEMENT (INS|DEL) - - (%flow;)*      -- inserted text, deleted text -->
-<!ATTLIST (INS|DEL)
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  cite        %URI;          #IMPLIED  -- info on reason for change --
-  datetime    %Datetime;     #IMPLIED  -- date and time of change --
-  >
-
-<!--=================== Lists ============================================-->
-
-<!-- definition lists - DT for term, DD for its definition -->
-
-<!ELEMENT DL - - (DT|DD)+              -- definition list -->
-<!ATTLIST DL
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-<!ELEMENT DT - O (%inline;)*           -- definition term -->
-<!ELEMENT DD - O (%flow;)*             -- definition description -->
-<!ATTLIST (DT|DD)
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-
-<!ELEMENT OL - - (LI)+                 -- ordered list -->
-<!ATTLIST OL
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-<!-- Unordered Lists (UL) bullet styles -->
-<!ELEMENT UL - - (LI)+                 -- unordered list -->
-<!ATTLIST UL
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-
-
-<!ELEMENT LI - O (%flow;)*             -- list item -->
-<!ATTLIST LI
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-<!--================ Forms ===============================================-->
-<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM) -- interactive form -->
-<!ATTLIST FORM
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  action      %URI;          #REQUIRED -- server-side form handler --
-  method      (GET|POST)     GET       -- HTTP method used to submit the form--
-  enctype     %ContentType;  "application/x-www-form-urlencoded"
-  accept      %ContentTypes; #IMPLIED  -- list of MIME types for file upload --
-  name        CDATA          #IMPLIED  -- name of form for scripting --
-  onsubmit    %Script;       #IMPLIED  -- the form was submitted --
-  onreset     %Script;       #IMPLIED  -- the form was reset --
-  accept-charset %Charsets;  #IMPLIED  -- list of supported charsets --
-  >
-
-<!-- Each label must not contain more than ONE field -->
-<!ELEMENT LABEL - - (%inline;)* -(LABEL) -- form field label text -->
-<!ATTLIST LABEL
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  for         IDREF          #IMPLIED  -- matches field ID value --
-  accesskey   %Character;    #IMPLIED  -- accessibility key character --
-  onfocus     %Script;       #IMPLIED  -- the element got the focus --
-  onblur      %Script;       #IMPLIED  -- the element lost the focus --
-  >
-
-<!ENTITY % InputType
-  "(TEXT | PASSWORD | CHECKBOX |
-    RADIO | SUBMIT | RESET |
-    FILE | HIDDEN | IMAGE | BUTTON)"
-   >
-
-<!-- attribute name required for all but submit and reset -->
-<!ELEMENT INPUT - O EMPTY              -- form control -->
-<!ATTLIST INPUT
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  type        %InputType;    TEXT      -- what kind of widget is needed --
-  name        CDATA          #IMPLIED  -- submit as part of form --
-  value       CDATA          #IMPLIED  -- Specify for radio buttons and checkboxes --
-  checked     (checked)      #IMPLIED  -- for radio buttons and check boxes --
-  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
-  readonly    (readonly)     #IMPLIED  -- for text and passwd --
-  size        CDATA          #IMPLIED  -- specific to each type of field --
-  maxlength   NUMBER         #IMPLIED  -- max chars for text fields --
-  src         %URI;          #IMPLIED  -- for fields with images --
-  alt         CDATA          #IMPLIED  -- short description --
-  usemap      %URI;          #IMPLIED  -- use client-side image map --
-  ismap       (ismap)        #IMPLIED  -- use server-side image map --
-  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
-  accesskey   %Character;    #IMPLIED  -- accessibility key character --
-  onfocus     %Script;       #IMPLIED  -- the element got the focus --
-  onblur      %Script;       #IMPLIED  -- the element lost the focus --
-  onselect    %Script;       #IMPLIED  -- some text was selected --
-  onchange    %Script;       #IMPLIED  -- the element value was changed --
-  accept      %ContentTypes; #IMPLIED  -- list of MIME types for file upload --
-  %reserved;                           -- reserved for possible future use --
-  >
-
-<!ELEMENT SELECT - - (OPTGROUP|OPTION)+ -- option selector -->
-<!ATTLIST SELECT
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  name        CDATA          #IMPLIED  -- field name --
-  size        NUMBER         #IMPLIED  -- rows visible --
-  multiple    (multiple)     #IMPLIED  -- default is single selection --
-  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
-  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
-  onfocus     %Script;       #IMPLIED  -- the element got the focus --
-  onblur      %Script;       #IMPLIED  -- the element lost the focus --
-  onchange    %Script;       #IMPLIED  -- the element value was changed --
-  %reserved;                           -- reserved for possible future use --
-  >
-
-<!ELEMENT OPTGROUP - - (OPTION)+ -- option group -->
-<!ATTLIST OPTGROUP
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
-  label       %Text;         #REQUIRED -- for use in hierarchical menus --
-  >
-
-<!ELEMENT OPTION - O (#PCDATA)         -- selectable choice -->
-<!ATTLIST OPTION
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  selected    (selected)     #IMPLIED
-  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
-  label       %Text;         #IMPLIED  -- for use in hierarchical menus --
-  value       CDATA          #IMPLIED  -- defaults to element content --
-  >
-
-<!ELEMENT TEXTAREA - - (#PCDATA)       -- multi-line text field -->
-<!ATTLIST TEXTAREA
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  name        CDATA          #IMPLIED
-  rows        NUMBER         #REQUIRED
-  cols        NUMBER         #REQUIRED
-  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
-  readonly    (readonly)     #IMPLIED
-  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
-  accesskey   %Character;    #IMPLIED  -- accessibility key character --
-  onfocus     %Script;       #IMPLIED  -- the element got the focus --
-  onblur      %Script;       #IMPLIED  -- the element lost the focus --
-  onselect    %Script;       #IMPLIED  -- some text was selected --
-  onchange    %Script;       #IMPLIED  -- the element value was changed --
-  %reserved;                           -- reserved for possible future use --
-  >
-
-<!--
-  #PCDATA is to solve the mixed content problem,
-  per specification only whitespace is allowed there!
- -->
-<!ELEMENT FIELDSET - - (#PCDATA,LEGEND,(%flow;)*) -- form control group -->
-<!ATTLIST FIELDSET
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-<!ELEMENT LEGEND - - (%inline;)*       -- fieldset legend -->
-
-<!ATTLIST LEGEND
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  accesskey   %Character;    #IMPLIED  -- accessibility key character --
-  >
-
-<!ELEMENT BUTTON - -
-     (%flow;)* -(A|%formctrl;|FORM|FIELDSET)
-     -- push button -->
-<!ATTLIST BUTTON
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  name        CDATA          #IMPLIED
-  value       CDATA          #IMPLIED  -- sent to server when submitted --
-  type        (button|submit|reset) submit -- for use as form button --
-  disabled    (disabled)     #IMPLIED  -- unavailable in this context --
-  tabindex    NUMBER         #IMPLIED  -- position in tabbing order --
-  accesskey   %Character;    #IMPLIED  -- accessibility key character --
-  onfocus     %Script;       #IMPLIED  -- the element got the focus --
-  onblur      %Script;       #IMPLIED  -- the element lost the focus --
-  %reserved;                           -- reserved for possible future use --
-  >
-
-<!--======================= Tables =======================================-->
-
-<!-- IETF HTML table standard, see [RFC1942] -->
-
-<!--
- The BORDER attribute sets the thickness of the frame around the
- table. The default units are screen pixels.
-
- The FRAME attribute specifies which parts of the frame around
- the table should be rendered. The values are not the same as
- CALS to avoid a name clash with the VALIGN attribute.
-
- The value "border" is included for backwards compatibility with
- <TABLE BORDER> which yields frame=border and border=implied
- For <TABLE BORDER=1> you get border=1 and frame=implied. In this
- case, it is appropriate to treat this as frame=border for backwards
- compatibility with deployed browsers.
--->
-<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
-
-<!--
- The RULES attribute defines which rules to draw between cells:
-
- If RULES is absent then assume:
-     "none" if BORDER is absent or BORDER=0 otherwise "all"
--->
-
-<!ENTITY % TRules "(none | groups | rows | cols | all)">
-  
-<!-- horizontal placement of table relative to document -->
-<!ENTITY % TAlign "(left|center|right)">
-
-<!-- horizontal alignment attributes for cell contents -->
-<!ENTITY % cellhalign
-  "align      (left|center|right|justify|char) #IMPLIED
-   char       %Character;    #IMPLIED  -- alignment char, e.g. char=':' --
-   charoff    %Length;       #IMPLIED  -- offset for alignment char --"
-  >
-
-<!-- vertical alignment attributes for cell contents -->
-<!ENTITY % cellvalign
-  "valign     (top|middle|bottom|baseline) #IMPLIED"
-  >
-
-<!ELEMENT TABLE - -
-     (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)>
-<!ELEMENT CAPTION  - - (%inline;)*     -- table caption -->
-<!ELEMENT THEAD    - O (TR)+           -- table header -->
-<!ELEMENT TFOOT    - O (TR)+           -- table footer -->
-<!ELEMENT TBODY    O O (TR)+           -- table body -->
-<!ELEMENT COLGROUP - O (COL)*          -- table column group -->
-<!ELEMENT COL      - O EMPTY           -- table column -->
-<!ELEMENT TR       - O (TH|TD)+        -- table row -->
-<!ELEMENT (TH|TD)  - O (%flow;)*       -- table header cell, table data cell-->
-
-<!ATTLIST TABLE                        -- table element --
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  summary     %Text;         #IMPLIED  -- purpose/structure for speech output--
-  width       %Length;       #IMPLIED  -- table width --
-  border      %Pixels;       #IMPLIED  -- controls frame width around table --
-  frame       %TFrame;       #IMPLIED  -- which parts of frame to render --
-  rules       %TRules;       #IMPLIED  -- rulings between rows and cols --
-  cellspacing %Length;       #IMPLIED  -- spacing between cells --
-  cellpadding %Length;       #IMPLIED  -- spacing within cells --
-  %reserved;                           -- reserved for possible future use --
-  datapagesize CDATA         #IMPLIED  -- reserved for possible future use --
-  >
-
-
-<!ATTLIST CAPTION
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-<!--
-COLGROUP groups a set of COL elements. It allows you to group
-several semantically related columns together.
--->
-<!ATTLIST COLGROUP
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  span        NUMBER         1         -- default number of columns in group --
-  width       %MultiLength;  #IMPLIED  -- default width for enclosed COLs --
-  %cellhalign;                         -- horizontal alignment in cells --
-  %cellvalign;                         -- vertical alignment in cells --
-  >
-
-<!--
- COL elements define the alignment properties for cells in
- one or more columns.
-
- The WIDTH attribute specifies the width of the columns, e.g.
-
-     width=64        width in screen pixels
-     width=0.5*      relative width of 0.5
-
- The SPAN attribute causes the attributes of one
- COL element to apply to more than one column.
--->
-<!ATTLIST COL                          -- column groups and properties --
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  span        NUMBER         1         -- COL attributes affect N columns --
-  width       %MultiLength;  #IMPLIED  -- column width specification --
-  %cellhalign;                         -- horizontal alignment in cells --
-  %cellvalign;                         -- vertical alignment in cells --
-  >
-
-<!--
-    Use THEAD to duplicate headers when breaking table
-    across page boundaries, or for static headers when
-    TBODY sections are rendered in scrolling panel.
-
-    Use TFOOT to duplicate footers when breaking table
-    across page boundaries, or for static footers when
-    TBODY sections are rendered in scrolling panel.
-
-    Use multiple TBODY sections when rules are needed
-    between groups of table rows.
--->
-<!ATTLIST (THEAD|TBODY|TFOOT)          -- table section --
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  %cellhalign;                         -- horizontal alignment in cells --
-  %cellvalign;                         -- vertical alignment in cells --
-  >
-
-<!ATTLIST TR                           -- table row --
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  %cellhalign;                         -- horizontal alignment in cells --
-  %cellvalign;                         -- vertical alignment in cells --
-  >
-
-
-<!-- Scope is simpler than headers attribute for common tables -->
-<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
-
-<!-- TH is for headers, TD for data, but for cells acting as both use TD -->
-<!ATTLIST (TH|TD)                      -- header or data cell --
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  abbr        %Text;         #IMPLIED  -- abbreviation for header cell --
-  axis        CDATA          #IMPLIED  -- comma-separated list of related headers--
-  headers     IDREFS         #IMPLIED  -- list of id's for header cells --
-  scope       %Scope;        #IMPLIED  -- scope covered by header cells --
-  rowspan     NUMBER         1         -- number of rows spanned by cell --
-  colspan     NUMBER         1         -- number of cols spanned by cell --
-  %cellhalign;                         -- horizontal alignment in cells --
-  %cellvalign;                         -- vertical alignment in cells --
-  >
-
-
-<!--================ Document Head =======================================-->
-<!-- %head.misc; defined earlier on as "SCRIPT|STYLE|META|LINK|OBJECT" -->
-<!ENTITY % head.content "TITLE & BASE?">
-
-<!ELEMENT HEAD O O (%head.content;) +(%head.misc;) -- document head -->
-<!ATTLIST HEAD
-  %i18n;                               -- lang, dir --
-  profile     %URI;          #IMPLIED  -- named dictionary of meta info --
-  >
-
-<!-- The TITLE element is not considered part of the flow of text.
-       It should be displayed, for example as the page header or
-       window title. Exactly one title is required per document.
-    -->
-<!ELEMENT TITLE - - (#PCDATA) -(%head.misc;) -- document title -->
-<!ATTLIST TITLE %i18n>
-
-
-<!ELEMENT BASE - O EMPTY               -- document base URI -->
-<!ATTLIST BASE
-  href        %URI;          #REQUIRED -- URI that acts as base URI --
-  >
-
-<!ELEMENT META - O EMPTY               -- generic metainformation -->
-<!ATTLIST META
-  %i18n;                               -- lang, dir, for use with content --
-  http-equiv  NAME           #IMPLIED  -- HTTP response header name  --
-  name        NAME           #IMPLIED  -- metainformation name --
-  content     CDATA          #REQUIRED -- associated information --
-  scheme      CDATA          #IMPLIED  -- select form of content --
-  >
-
-<!ELEMENT STYLE - - %StyleSheet        -- style info -->
-<!ATTLIST STYLE
-  %i18n;                               -- lang, dir, for use with title --
-  type        %ContentType;  #REQUIRED -- content type of style language --
-  media       %MediaDesc;    #IMPLIED  -- designed for use with these media --
-  title       %Text;         #IMPLIED  -- advisory title --
-  >
-
-<!ELEMENT SCRIPT - - %Script;          -- script statements -->
-<!ATTLIST SCRIPT
-  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
-  type        %ContentType;  #REQUIRED -- content type of script language --
-  src         %URI;          #IMPLIED  -- URI for an external script --
-  defer       (defer)        #IMPLIED  -- UA may defer execution of script --
-  event       CDATA          #IMPLIED  -- reserved for possible future use --
-  for         %URI;          #IMPLIED  -- reserved for possible future use --
-  >
-
-<!ELEMENT NOSCRIPT - - (%block;)+
-  -- alternate content container for non script-based rendering -->
-<!ATTLIST NOSCRIPT
-  %attrs;                              -- %coreattrs, %i18n, %events --
-  >
-
-<!--================ Document Structure ==================================-->
-<!ENTITY % html.content "HEAD, BODY">
-
-<!ELEMENT HTML O O (%html.content;)    -- document root element -->
-<!ATTLIST HTML
-  %i18n;                               -- lang, dir --
-  >
diff --git a/node_modules/sax/examples/switch-bench.js b/node_modules/sax/examples/switch-bench.js
deleted file mode 100755
index 4d3cf14..0000000
--- a/node_modules/sax/examples/switch-bench.js
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/local/bin/node-bench
-
-var Promise = require("events").Promise;
-
-var xml = require("posix").cat("test.xml").wait(),
-  path = require("path"),
-  sax = require("../lib/sax"),
-  saxT = require("../lib/sax-trampoline"),
-  
-  parser = sax.parser(false, {trim:true}),
-  parserT = saxT.parser(false, {trim:true}),
-  
-  sys = require("sys");
-
-
-var count = exports.stepsPerLap = 500,
-  l = xml.length,
-  runs = 0;
-exports.countPerLap = 1000;
-exports.compare = {
-  "switch" : function () {
-    // sys.debug("switch runs: "+runs++);
-    // for (var x = 0; x < l; x += 1000) {
-    //   parser.write(xml.substr(x, 1000))
-    // }
-    // for (var i = 0; i < count; i ++) {
-      parser.write(xml);
-      parser.close();
-    // }
-    // done();
-  },
-  trampoline : function () {
-    // sys.debug("trampoline runs: "+runs++);
-    // for (var x = 0; x < l; x += 1000) {
-    //   parserT.write(xml.substr(x, 1000))
-    // }
-    // for (var i = 0; i < count; i ++) {
-      parserT.write(xml);
-      parserT.close();
-    // }
-    // done();
-  },
-};
-
-sys.debug("rock and roll...");
\ No newline at end of file
diff --git a/node_modules/sax/examples/test.html b/node_modules/sax/examples/test.html
deleted file mode 100644
index 61f8f1a..0000000
--- a/node_modules/sax/examples/test.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!doctype html>
-
-<html lang="en">
-<head>
-	<title>testing the parser</title>
-</head>
-<body>
-
-<p>hello
-
-<script>
-
-</script>
-</body>
-</html>
diff --git a/node_modules/sax/examples/test.xml b/node_modules/sax/examples/test.xml
deleted file mode 100644
index 801292d..0000000
--- a/node_modules/sax/examples/test.xml
+++ /dev/null
@@ -1,1254 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE RootElement [
-	<!ENTITY e SYSTEM "001.ent">
-]>
-<RootElement param="value">
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-    <FirstElement>
-        Some Text
-    </FirstElement>
-    <?some_pi some_attr="some_value"?>
-    <!-- this is a comment -- but this isnt part of the comment -->
-    <!-- this is a comment == and this is a part of the comment -->
-    <!-- this is a comment > and this is also part of the thing -->
-    <!invalid comment>
-    <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
-    <SecondElement param2="something">
-        Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
-        &#xF8FF;
-    </SecondElement>
-</RootElement>
\ No newline at end of file
diff --git a/node_modules/sax/lib/sax.js b/node_modules/sax/lib/sax.js
deleted file mode 100644
index 17fb08e..0000000
--- a/node_modules/sax/lib/sax.js
+++ /dev/null
@@ -1,1006 +0,0 @@
-// wrapper for non-node envs
-;(function (sax) {
-
-sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
-sax.SAXParser = SAXParser
-sax.SAXStream = SAXStream
-sax.createStream = createStream
-
-// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
-// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
-// since that's the earliest that a buffer overrun could occur.  This way, checks are
-// as rare as required, but as often as necessary to ensure never crossing this bound.
-// Furthermore, buffers are only tested at most once per write(), so passing a very
-// large string into write() might have undesirable effects, but this is manageable by
-// the caller, so it is assumed to be safe.  Thus, a call to write() may, in the extreme
-// edge case, result in creating at most one complete copy of the string passed in.
-// Set to Infinity to have unlimited buffers.
-sax.MAX_BUFFER_LENGTH = 64 * 1024
-
-var buffers = [
-  "comment", "sgmlDecl", "textNode", "tagName", "doctype",
-  "procInstName", "procInstBody", "entity", "attribName",
-  "attribValue", "cdata", "script"
-]
-
-sax.EVENTS = // for discoverability.
-  [ "text"
-  , "processinginstruction"
-  , "sgmldeclaration"
-  , "doctype"
-  , "comment"
-  , "attribute"
-  , "opentag"
-  , "closetag"
-  , "opencdata"
-  , "cdata"
-  , "closecdata"
-  , "error"
-  , "end"
-  , "ready"
-  , "script"
-  , "opennamespace"
-  , "closenamespace"
-  ]
-
-function SAXParser (strict, opt) {
-  if (!(this instanceof SAXParser)) return new SAXParser(strict, opt)
-
-  var parser = this
-  clearBuffers(parser)
-  parser.q = parser.c = ""
-  parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
-  parser.opt = opt || {}
-  parser.tagCase = parser.opt.lowercasetags ? "toLowerCase" : "toUpperCase"
-  parser.tags = []
-  parser.closed = parser.closedRoot = parser.sawRoot = false
-  parser.tag = parser.error = null
-  parser.strict = !!strict
-  parser.noscript = !!(strict || parser.opt.noscript)
-  parser.state = S.BEGIN
-  parser.ENTITIES = Object.create(sax.ENTITIES)
-  parser.attribList = []
-
-  // namespaces form a prototype chain.
-  // it always points at the current tag,
-  // which protos to its parent tag.
-  if (parser.opt.xmlns) parser.ns = Object.create(rootNS)
-
-  // mostly just for error reporting
-  parser.position = parser.line = parser.column = 0
-  emit(parser, "onready")
-}
-
-if (!Object.create) Object.create = function (o) {
-  function f () { this.__proto__ = o }
-  f.prototype = o
-  return new f
-}
-
-if (!Object.getPrototypeOf) Object.getPrototypeOf = function (o) {
-  return o.__proto__
-}
-
-if (!Object.keys) Object.keys = function (o) {
-  var a = []
-  for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
-  return a
-}
-
-function checkBufferLength (parser) {
-  var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
-    , maxActual = 0
-  for (var i = 0, l = buffers.length; i < l; i ++) {
-    var len = parser[buffers[i]].length
-    if (len > maxAllowed) {
-      // Text/cdata nodes can get big, and since they're buffered,
-      // we can get here under normal conditions.
-      // Avoid issues by emitting the text node now,
-      // so at least it won't get any bigger.
-      switch (buffers[i]) {
-        case "textNode":
-          closeText(parser)
-        break
-
-        case "cdata":
-          emitNode(parser, "oncdata", parser.cdata)
-          parser.cdata = ""
-        break
-
-        case "script":
-          emitNode(parser, "onscript", parser.script)
-          parser.script = ""
-        break
-
-        default:
-          error(parser, "Max buffer length exceeded: "+buffers[i])
-      }
-    }
-    maxActual = Math.max(maxActual, len)
-  }
-  // schedule the next check for the earliest possible buffer overrun.
-  parser.bufferCheckPosition = (sax.MAX_BUFFER_LENGTH - maxActual)
-                             + parser.position
-}
-
-function clearBuffers (parser) {
-  for (var i = 0, l = buffers.length; i < l; i ++) {
-    parser[buffers[i]] = ""
-  }
-}
-
-SAXParser.prototype =
-  { end: function () { end(this) }
-  , write: write
-  , resume: function () { this.error = null; return this }
-  , close: function () { return this.write(null) }
-  , end: function () { return this.write(null) }
-  }
-
-try {
-  var Stream = require("stream").Stream
-} catch (ex) {
-  var Stream = function () {}
-}
-
-
-var streamWraps = sax.EVENTS.filter(function (ev) {
-  return ev !== "error" && ev !== "end"
-})
-
-function createStream (strict, opt) {
-  return new SAXStream(strict, opt)
-}
-
-function SAXStream (strict, opt) {
-  if (!(this instanceof SAXStream)) return new SAXStream(strict, opt)
-
-  Stream.apply(me)
-
-  this._parser = new SAXParser(strict, opt)
-  this.writable = true
-  this.readable = true
-
-
-  var me = this
-
-  this._parser.onend = function () {
-    me.emit("end")
-  }
-
-  this._parser.onerror = function (er) {
-    me.emit("error", er)
-
-    // if didn't throw, then means error was handled.
-    // go ahead and clear error, so we can write again.
-    me._parser.error = null
-  }
-
-  streamWraps.forEach(function (ev) {
-    Object.defineProperty(me, "on" + ev, {
-      get: function () { return me._parser["on" + ev] },
-      set: function (h) {
-        if (!h) {
-          me.removeAllListeners(ev)
-          return me._parser["on"+ev] = h
-        }
-        me.on(ev, h)
-      },
-      enumerable: true,
-      configurable: false
-    })
-  })
-}
-
-SAXStream.prototype = Object.create(Stream.prototype,
-  { constructor: { value: SAXStream } })
-
-SAXStream.prototype.write = function (data) {
-  this._parser.write(data.toString())
-  this.emit("data", data)
-  return true
-}
-
-SAXStream.prototype.end = function (chunk) {
-  if (chunk && chunk.length) this._parser.write(chunk.toString())
-  this._parser.end()
-  return true
-}
-
-SAXStream.prototype.on = function (ev, handler) {
-  var me = this
-  if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) {
-    me._parser["on"+ev] = function () {
-      var args = arguments.length === 1 ? [arguments[0]]
-               : Array.apply(null, arguments)
-      args.splice(0, 0, ev)
-      me.emit.apply(me, args)
-    }
-  }
-
-  return Stream.prototype.on.call(me, ev, handler)
-}
-
-
-
-// character classes and tokens
-var whitespace = "\r\n\t "
-  // this really needs to be replaced with character classes.
-  // XML allows all manner of ridiculous numbers and digits.
-  , number = "0124356789"
-  , letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
-  // (Letter | "_" | ":")
-  , nameStart = letter+"_:"
-  , nameBody = nameStart+number+"-."
-  , quote = "'\""
-  , entity = number+letter+"#"
-  , attribEnd = whitespace + ">"
-  , CDATA = "[CDATA["
-  , DOCTYPE = "DOCTYPE"
-  , XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"
-  , XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/"
-  , rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }
-
-// turn all the string character sets into character class objects.
-whitespace = charClass(whitespace)
-number = charClass(number)
-letter = charClass(letter)
-nameStart = charClass(nameStart)
-nameBody = charClass(nameBody)
-quote = charClass(quote)
-entity = charClass(entity)
-attribEnd = charClass(attribEnd)
-
-function charClass (str) {
-  return str.split("").reduce(function (s, c) {
-    s[c] = true
-    return s
-  }, {})
-}
-
-function is (charclass, c) {
-  return charclass[c]
-}
-
-function not (charclass, c) {
-  return !charclass[c]
-}
-
-var S = 0
-sax.STATE =
-{ BEGIN                     : S++
-, TEXT                      : S++ // general stuff
-, TEXT_ENTITY               : S++ // &amp and such.
-, OPEN_WAKA                 : S++ // <
-, SGML_DECL                 : S++ // <!BLARG
-, SGML_DECL_QUOTED          : S++ // <!BLARG foo "bar
-, DOCTYPE                   : S++ // <!DOCTYPE
-, DOCTYPE_QUOTED            : S++ // <!DOCTYPE "//blah
-, DOCTYPE_DTD               : S++ // <!DOCTYPE "//blah" [ ...
-, DOCTYPE_DTD_QUOTED        : S++ // <!DOCTYPE "//blah" [ "foo
-, COMMENT_STARTING          : S++ // <!-
-, COMMENT                   : S++ // <!--
-, COMMENT_ENDING            : S++ // <!-- blah -
-, COMMENT_ENDED             : S++ // <!-- blah --
-, CDATA                     : S++ // <![CDATA[ something
-, CDATA_ENDING              : S++ // ]
-, CDATA_ENDING_2            : S++ // ]]
-, PROC_INST                 : S++ // <?hi
-, PROC_INST_BODY            : S++ // <?hi there
-, PROC_INST_QUOTED          : S++ // <?hi "there
-, PROC_INST_ENDING          : S++ // <?hi "there" ?
-, OPEN_TAG                  : S++ // <strong
-, OPEN_TAG_SLASH            : S++ // <strong /
-, ATTRIB                    : S++ // <a
-, ATTRIB_NAME               : S++ // <a foo
-, ATTRIB_NAME_SAW_WHITE     : S++ // <a foo _
-, ATTRIB_VALUE              : S++ // <a foo=
-, ATTRIB_VALUE_QUOTED       : S++ // <a foo="bar
-, ATTRIB_VALUE_UNQUOTED     : S++ // <a foo=bar
-, ATTRIB_VALUE_ENTITY_Q     : S++ // <foo bar="&quot;"
-, ATTRIB_VALUE_ENTITY_U     : S++ // <foo bar=&quot;
-, CLOSE_TAG                 : S++ // </a
-, CLOSE_TAG_SAW_WHITE       : S++ // </a   >
-, SCRIPT                    : S++ // <script> ...
-, SCRIPT_ENDING             : S++ // <script> ... <
-}
-
-sax.ENTITIES =
-{ "apos" : "'"
-, "quot" : "\""
-, "amp"  : "&"
-, "gt"   : ">"
-, "lt"   : "<"
-}
-
-for (var S in sax.STATE) sax.STATE[sax.STATE[S]] = S
-
-// shorthand
-S = sax.STATE
-
-function emit (parser, event, data) {
-  parser[event] && parser[event](data)
-}
-
-function emitNode (parser, nodeType, data) {
-  if (parser.textNode) closeText(parser)
-  emit(parser, nodeType, data)
-}
-
-function closeText (parser) {
-  parser.textNode = textopts(parser.opt, parser.textNode)
-  if (parser.textNode) emit(parser, "ontext", parser.textNode)
-  parser.textNode = ""
-}
-
-function textopts (opt, text) {
-  if (opt.trim) text = text.trim()
-  if (opt.normalize) text = text.replace(/\s+/g, " ")
-  return text
-}
-
-function error (parser, er) {
-  closeText(parser)
-  er += "\nLine: "+parser.line+
-        "\nColumn: "+parser.column+
-        "\nChar: "+parser.c
-  er = new Error(er)
-  parser.error = er
-  emit(parser, "onerror", er)
-  return parser
-}
-
-function end (parser) {
-  if (parser.state !== S.TEXT) error(parser, "Unexpected end")
-  closeText(parser)
-  parser.c = ""
-  parser.closed = true
-  emit(parser, "onend")
-  SAXParser.call(parser, parser.strict, parser.opt)
-  return parser
-}
-
-function strictFail (parser, message) {
-  if (parser.strict) error(parser, message)
-}
-
-function newTag (parser) {
-  if (!parser.strict) parser.tagName = parser.tagName[parser.tagCase]()
-  var parent = parser.tags[parser.tags.length - 1] || parser
-    , tag = parser.tag = { name : parser.tagName, attributes : {} }
-
-  // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
-  if (parser.opt.xmlns) tag.ns = parent.ns
-  parser.attribList.length = 0
-}
-
-function qname (name) {
-  var i = name.indexOf(":")
-    , qualName = i < 0 ? [ "", name ] : name.split(":")
-    , prefix = qualName[0]
-    , local = qualName[1]
-
-  // <x "xmlns"="http://foo">
-  if (name === "xmlns") {
-    prefix = "xmlns"
-    local = ""
-  }
-
-  return { prefix: prefix, local: local }
-}
-
-function attrib (parser) {
-  if (parser.opt.xmlns) {
-    var qn = qname(parser.attribName)
-      , prefix = qn.prefix
-      , local = qn.local
-
-    if (prefix === "xmlns") {
-      // namespace binding attribute; push the binding into scope
-      if (local === "xml" && parser.attribValue !== XML_NAMESPACE) {
-        strictFail( parser
-                  , "xml: prefix must be bound to " + XML_NAMESPACE + "\n"
-                  + "Actual: " + parser.attribValue )
-      } else if (local === "xmlns" && parser.attribValue !== XMLNS_NAMESPACE) {
-        strictFail( parser
-                  , "xmlns: prefix must be bound to " + XMLNS_NAMESPACE + "\n"
-                  + "Actual: " + parser.attribValue )
-      } else {
-        var tag = parser.tag
-          , parent = parser.tags[parser.tags.length - 1] || parser
-        if (tag.ns === parent.ns) {
-          tag.ns = Object.create(parent.ns)
-        }
-        tag.ns[local] = parser.attribValue
-      }
-    }
-
-    // defer onattribute events until all attributes have been seen
-    // so any new bindings can take effect; preserve attribute order
-    // so deferred events can be emitted in document order
-    parser.attribList.push([parser.attribName, parser.attribValue])
-  } else {
-    // in non-xmlns mode, we can emit the event right away
-    parser.tag.attributes[parser.attribName] = parser.attribValue
-    emitNode( parser
-            , "onattribute"
-            , { name: parser.attribName
-              , value: parser.attribValue } )
-  }
-
-  parser.attribName = parser.attribValue = ""
-}
-
-function openTag (parser, selfClosing) {
-  if (parser.opt.xmlns) {
-    // emit namespace binding events
-    var tag = parser.tag
-
-    // add namespace info to tag
-    var qn = qname(parser.tagName)
-    tag.prefix = qn.prefix
-    tag.local = qn.local
-    tag.uri = tag.ns[qn.prefix] || qn.prefix
-
-    if (tag.prefix && !tag.uri) {
-      strictFail(parser, "Unbound namespace prefix: "
-                       + JSON.stringify(parser.tagName))
-    }
-
-    var parent = parser.tags[parser.tags.length - 1] || parser
-    if (tag.ns && parent.ns !== tag.ns) {
-      Object.keys(tag.ns).forEach(function (p) {
-        emitNode( parser
-                , "onopennamespace"
-                , { prefix: p , uri: tag.ns[p] } )
-      })
-    }
-
-    // handle deferred onattribute events
-    for (var i = 0, l = parser.attribList.length; i < l; i ++) {
-      var nv = parser.attribList[i]
-      var name = nv[0]
-        , value = nv[1]
-        , qualName = qname(name)
-        , prefix = qualName.prefix
-        , local = qualName.local
-        , uri = tag.ns[prefix] || ""
-        , a = { name: name
-              , value: value
-              , prefix: prefix
-              , local: local
-              , uri: uri
-              }
-
-      // if there's any attributes with an undefined namespace,
-      // then fail on them now.
-      if (prefix && prefix != "xmlns" && !uri) {
-        strictFail(parser, "Unbound namespace prefix: "
-                         + JSON.stringify(prefix))
-        a.uri = prefix
-      }
-      parser.tag.attributes[name] = a
-      emitNode(parser, "onattribute", a)
-    }
-    parser.attribList.length = 0
-  }
-
-  // process the tag
-  parser.sawRoot = true
-  parser.tags.push(parser.tag)
-  emitNode(parser, "onopentag", parser.tag)
-  if (!selfClosing) {
-    // special case for <script> in non-strict mode.
-    if (!parser.noscript && parser.tagName.toLowerCase() === "script") {
-      parser.state = S.SCRIPT
-    } else {
-      parser.state = S.TEXT
-    }
-    parser.tag = null
-    parser.tagName = ""
-  }
-  parser.attribName = parser.attribValue = ""
-  parser.attribList.length = 0
-}
-
-function closeTag (parser) {
-  if (!parser.tagName) {
-    strictFail(parser, "Weird empty close tag.")
-    parser.textNode += "</>"
-    parser.state = S.TEXT
-    return
-  }
-  // first make sure that the closing tag actually exists.
-  // <a><b></c></b></a> will close everything, otherwise.
-  var t = parser.tags.length
-  var tagName = parser.tagName
-  if (!parser.strict) tagName = tagName[parser.tagCase]()
-  var closeTo = tagName
-  while (t --) {
-    var close = parser.tags[t]
-    if (close.name !== closeTo) {
-      // fail the first time in strict mode
-      strictFail(parser, "Unexpected close tag")
-    } else break
-  }
-
-  // didn't find it.  we already failed for strict, so just abort.
-  if (t < 0) {
-    strictFail(parser, "Unmatched closing tag: "+parser.tagName)
-    parser.textNode += "</" + parser.tagName + ">"
-    parser.state = S.TEXT
-    return
-  }
-  parser.tagName = tagName
-  var s = parser.tags.length
-  while (s --> t) {
-    var tag = parser.tag = parser.tags.pop()
-    parser.tagName = parser.tag.name
-    emitNode(parser, "onclosetag", parser.tagName)
-
-    var x = {}
-    for (var i in tag.ns) x[i] = tag.ns[i]
-
-    var parent = parser.tags[parser.tags.length - 1] || parser
-    if (parser.opt.xmlns && tag.ns !== parent.ns) {
-      // remove namespace bindings introduced by tag
-      Object.keys(tag.ns).forEach(function (p) {
-        var n = tag.ns[p]
-        emitNode(parser, "onclosenamespace", { prefix: p, uri: n })
-      })
-    }
-  }
-  if (t === 0) parser.closedRoot = true
-  parser.tagName = parser.attribValue = parser.attribName = ""
-  parser.attribList.length = 0
-  parser.state = S.TEXT
-}
-
-function parseEntity (parser) {
-  var entity = parser.entity.toLowerCase()
-    , num
-    , numStr = ""
-  if (parser.ENTITIES[entity]) return parser.ENTITIES[entity]
-  if (entity.charAt(0) === "#") {
-    if (entity.charAt(1) === "x") {
-      entity = entity.slice(2)
-      num = parseInt(entity, 16)
-      numStr = num.toString(16)
-    } else {
-      entity = entity.slice(1)
-      num = parseInt(entity, 10)
-      numStr = num.toString(10)
-    }
-  }
-  entity = entity.replace(/^0+/, "")
-  if (numStr.toLowerCase() !== entity) {
-    strictFail(parser, "Invalid character entity")
-    return "&"+parser.entity + ";"
-  }
-  return String.fromCharCode(num)
-}
-
-function write (chunk) {
-  var parser = this
-  if (this.error) throw this.error
-  if (parser.closed) return error(parser,
-    "Cannot write after close. Assign an onready handler.")
-  if (chunk === null) return end(parser)
-  var i = 0, c = ""
-  while (parser.c = c = chunk.charAt(i++)) {
-    parser.position ++
-    if (c === "\n") {
-      parser.line ++
-      parser.column = 0
-    } else parser.column ++
-    switch (parser.state) {
-
-      case S.BEGIN:
-        if (c === "<") parser.state = S.OPEN_WAKA
-        else if (not(whitespace,c)) {
-          // have to process this as a text node.
-          // weird, but happens.
-          strictFail(parser, "Non-whitespace before first tag.")
-          parser.textNode = c
-          parser.state = S.TEXT
-        }
-      continue
-
-      case S.TEXT:
-        if (parser.sawRoot && !parser.closedRoot) {
-          var starti = i-1
-          while (c && c!=="<" && c!=="&") {
-            c = chunk.charAt(i++)
-            if (c) {
-              parser.position ++
-              if (c === "\n") {
-                parser.line ++
-                parser.column = 0
-              } else parser.column ++
-            }
-          }
-          parser.textNode += chunk.substring(starti, i-1)
-        }
-        if (c === "<") parser.state = S.OPEN_WAKA
-        else {
-          if (not(whitespace, c) && (!parser.sawRoot || parser.closedRoot))
-            strictFail("Text data outside of root node.")
-          if (c === "&") parser.state = S.TEXT_ENTITY
-          else parser.textNode += c
-        }
-      continue
-
-      case S.SCRIPT:
-        // only non-strict
-        if (c === "<") {
-          parser.state = S.SCRIPT_ENDING
-        } else parser.script += c
-      continue
-
-      case S.SCRIPT_ENDING:
-        if (c === "/") {
-          emitNode(parser, "onscript", parser.script)
-          parser.state = S.CLOSE_TAG
-          parser.script = ""
-          parser.tagName = ""
-        } else {
-          parser.script += "<" + c
-          parser.state = S.SCRIPT
-        }
-      continue
-
-      case S.OPEN_WAKA:
-        // either a /, ?, !, or text is coming next.
-        if (c === "!") {
-          parser.state = S.SGML_DECL
-          parser.sgmlDecl = ""
-        } else if (is(whitespace, c)) {
-          // wait for it...
-        } else if (is(nameStart,c)) {
-          parser.startTagPosition = parser.position - 1
-          parser.state = S.OPEN_TAG
-          parser.tagName = c
-        } else if (c === "/") {
-          parser.startTagPosition = parser.position - 1
-          parser.state = S.CLOSE_TAG
-          parser.tagName = ""
-        } else if (c === "?") {
-          parser.state = S.PROC_INST
-          parser.procInstName = parser.procInstBody = ""
-        } else {
-          strictFail(parser, "Unencoded <")
-          parser.textNode += "<" + c
-          parser.state = S.TEXT
-        }
-      continue
-
-      case S.SGML_DECL:
-        if ((parser.sgmlDecl+c).toUpperCase() === CDATA) {
-          emitNode(parser, "onopencdata")
-          parser.state = S.CDATA
-          parser.sgmlDecl = ""
-          parser.cdata = ""
-        } else if (parser.sgmlDecl+c === "--") {
-          parser.state = S.COMMENT
-          parser.comment = ""
-          parser.sgmlDecl = ""
-        } else if ((parser.sgmlDecl+c).toUpperCase() === DOCTYPE) {
-          parser.state = S.DOCTYPE
-          if (parser.doctype || parser.sawRoot) strictFail(parser,
-            "Inappropriately located doctype declaration")
-          parser.doctype = ""
-          parser.sgmlDecl = ""
-        } else if (c === ">") {
-          emitNode(parser, "onsgmldeclaration", parser.sgmlDecl)
-          parser.sgmlDecl = ""
-          parser.state = S.TEXT
-        } else if (is(quote, c)) {
-          parser.state = S.SGML_DECL_QUOTED
-          parser.sgmlDecl += c
-        } else parser.sgmlDecl += c
-      continue
-
-      case S.SGML_DECL_QUOTED:
-        if (c === parser.q) {
-          parser.state = S.SGML_DECL
-          parser.q = ""
-        }
-        parser.sgmlDecl += c
-      continue
-
-      case S.DOCTYPE:
-        if (c === ">") {
-          parser.state = S.TEXT
-          emitNode(parser, "ondoctype", parser.doctype)
-          parser.doctype = true // just remember that we saw it.
-        } else {
-          parser.doctype += c
-          if (c === "[") parser.state = S.DOCTYPE_DTD
-          else if (is(quote, c)) {
-            parser.state = S.DOCTYPE_QUOTED
-            parser.q = c
-          }
-        }
-      continue
-
-      case S.DOCTYPE_QUOTED:
-        parser.doctype += c
-        if (c === parser.q) {
-          parser.q = ""
-          parser.state = S.DOCTYPE
-        }
-      continue
-
-      case S.DOCTYPE_DTD:
-        parser.doctype += c
-        if (c === "]") parser.state = S.DOCTYPE
-        else if (is(quote,c)) {
-          parser.state = S.DOCTYPE_DTD_QUOTED
-          parser.q = c
-        }
-      continue
-
-      case S.DOCTYPE_DTD_QUOTED:
-        parser.doctype += c
-        if (c === parser.q) {
-          parser.state = S.DOCTYPE_DTD
-          parser.q = ""
-        }
-      continue
-
-      case S.COMMENT:
-        if (c === "-") parser.state = S.COMMENT_ENDING
-        else parser.comment += c
-      continue
-
-      case S.COMMENT_ENDING:
-        if (c === "-") {
-          parser.state = S.COMMENT_ENDED
-          parser.comment = textopts(parser.opt, parser.comment)
-          if (parser.comment) emitNode(parser, "oncomment", parser.comment)
-          parser.comment = ""
-        } else {
-          parser.comment += "-" + c
-          parser.state = S.COMMENT
-        }
-      continue
-
-      case S.COMMENT_ENDED:
-        if (c !== ">") {
-          strictFail(parser, "Malformed comment")
-          // allow <!-- blah -- bloo --> in non-strict mode,
-          // which is a comment of " blah -- bloo "
-          parser.comment += "--" + c
-          parser.state = S.COMMENT
-        } else parser.state = S.TEXT
-      continue
-
-      case S.CDATA:
-        if (c === "]") parser.state = S.CDATA_ENDING
-        else parser.cdata += c
-      continue
-
-      case S.CDATA_ENDING:
-        if (c === "]") parser.state = S.CDATA_ENDING_2
-        else {
-          parser.cdata += "]" + c
-          parser.state = S.CDATA
-        }
-      continue
-
-      case S.CDATA_ENDING_2:
-        if (c === ">") {
-          if (parser.cdata) emitNode(parser, "oncdata", parser.cdata)
-          emitNode(parser, "onclosecdata")
-          parser.cdata = ""
-          parser.state = S.TEXT
-        } else if (c === "]") {
-          parser.cdata += "]"
-        } else {
-          parser.cdata += "]]" + c
-          parser.state = S.CDATA
-        }
-      continue
-
-      case S.PROC_INST:
-        if (c === "?") parser.state = S.PROC_INST_ENDING
-        else if (is(whitespace, c)) parser.state = S.PROC_INST_BODY
-        else parser.procInstName += c
-      continue
-
-      case S.PROC_INST_BODY:
-        if (!parser.procInstBody && is(whitespace, c)) continue
-        else if (c === "?") parser.state = S.PROC_INST_ENDING
-        else if (is(quote, c)) {
-          parser.state = S.PROC_INST_QUOTED
-          parser.q = c
-          parser.procInstBody += c
-        } else parser.procInstBody += c
-      continue
-
-      case S.PROC_INST_ENDING:
-        if (c === ">") {
-          emitNode(parser, "onprocessinginstruction", {
-            name : parser.procInstName,
-            body : parser.procInstBody
-          })
-          parser.procInstName = parser.procInstBody = ""
-          parser.state = S.TEXT
-        } else {
-          parser.procInstBody += "?" + c
-          parser.state = S.PROC_INST_BODY
-        }
-      continue
-
-      case S.PROC_INST_QUOTED:
-        parser.procInstBody += c
-        if (c === parser.q) {
-          parser.state = S.PROC_INST_BODY
-          parser.q = ""
-        }
-      continue
-
-      case S.OPEN_TAG:
-        if (is(nameBody, c)) parser.tagName += c
-        else {
-          newTag(parser)
-          if (c === ">") openTag(parser)
-          else if (c === "/") parser.state = S.OPEN_TAG_SLASH
-          else {
-            if (not(whitespace, c)) strictFail(
-              parser, "Invalid character in tag name")
-            parser.state = S.ATTRIB
-          }
-        }
-      continue
-
-      case S.OPEN_TAG_SLASH:
-        if (c === ">") {
-          openTag(parser, true)
-          closeTag(parser)
-        } else {
-          strictFail(parser, "Forward-slash in opening tag not followed by >")
-          parser.state = S.ATTRIB
-        }
-      continue
-
-      case S.ATTRIB:
-        // haven't read the attribute name yet.
-        if (is(whitespace, c)) continue
-        else if (c === ">") openTag(parser)
-        else if (c === "/") parser.state = S.OPEN_TAG_SLASH
-        else if (is(nameStart, c)) {
-          parser.attribName = c
-          parser.attribValue = ""
-          parser.state = S.ATTRIB_NAME
-        } else strictFail(parser, "Invalid attribute name")
-      continue
-
-      case S.ATTRIB_NAME:
-        if (c === "=") parser.state = S.ATTRIB_VALUE
-        else if (is(whitespace, c)) parser.state = S.ATTRIB_NAME_SAW_WHITE
-        else if (is(nameBody, c)) parser.attribName += c
-        else strictFail(parser, "Invalid attribute name")
-      continue
-
-      case S.ATTRIB_NAME_SAW_WHITE:
-        if (c === "=") parser.state = S.ATTRIB_VALUE
-        else if (is(whitespace, c)) continue
-        else {
-          strictFail(parser, "Attribute without value")
-          parser.tag.attributes[parser.attribName] = ""
-          parser.attribValue = ""
-          emitNode(parser, "onattribute",
-                   { name : parser.attribName, value : "" })
-          parser.attribName = ""
-          if (c === ">") openTag(parser)
-          else if (is(nameStart, c)) {
-            parser.attribName = c
-            parser.state = S.ATTRIB_NAME
-          } else {
-            strictFail(parser, "Invalid attribute name")
-            parser.state = S.ATTRIB
-          }
-        }
-      continue
-
-      case S.ATTRIB_VALUE:
-        if (is(whitespace, c)) continue
-        else if (is(quote, c)) {
-          parser.q = c
-          parser.state = S.ATTRIB_VALUE_QUOTED
-        } else {
-          strictFail(parser, "Unquoted attribute value")
-          parser.state = S.ATTRIB_VALUE_UNQUOTED
-          parser.attribValue = c
-        }
-      continue
-
-      case S.ATTRIB_VALUE_QUOTED:
-        if (c !== parser.q) {
-          if (c === "&") parser.state = S.ATTRIB_VALUE_ENTITY_Q
-          else parser.attribValue += c
-          continue
-        }
-        attrib(parser)
-        parser.q = ""
-        parser.state = S.ATTRIB
-      continue
-
-      case S.ATTRIB_VALUE_UNQUOTED:
-        if (not(attribEnd,c)) {
-          if (c === "&") parser.state = S.ATTRIB_VALUE_ENTITY_U
-          else parser.attribValue += c
-          continue
-        }
-        attrib(parser)
-        if (c === ">") openTag(parser)
-        else parser.state = S.ATTRIB
-      continue
-
-      case S.CLOSE_TAG:
-        if (!parser.tagName) {
-          if (is(whitespace, c)) continue
-          else if (not(nameStart, c)) strictFail(parser,
-            "Invalid tagname in closing tag.")
-          else parser.tagName = c
-        }
-        else if (c === ">") closeTag(parser)
-        else if (is(nameBody, c)) parser.tagName += c
-        else {
-          if (not(whitespace, c)) strictFail(parser,
-            "Invalid tagname in closing tag")
-          parser.state = S.CLOSE_TAG_SAW_WHITE
-        }
-      continue
-
-      case S.CLOSE_TAG_SAW_WHITE:
-        if (is(whitespace, c)) continue
-        if (c === ">") closeTag(parser)
-        else strictFail("Invalid characters in closing tag")
-      continue
-
-      case S.TEXT_ENTITY:
-      case S.ATTRIB_VALUE_ENTITY_Q:
-      case S.ATTRIB_VALUE_ENTITY_U:
-        switch(parser.state) {
-          case S.TEXT_ENTITY:
-            var returnState = S.TEXT, buffer = "textNode"
-          break
-
-          case S.ATTRIB_VALUE_ENTITY_Q:
-            var returnState = S.ATTRIB_VALUE_QUOTED, buffer = "attribValue"
-          break
-
-          case S.ATTRIB_VALUE_ENTITY_U:
-            var returnState = S.ATTRIB_VALUE_UNQUOTED, buffer = "attribValue"
-          break
-        }
-        if (c === ";") {
-          parser[buffer] += parseEntity(parser)
-          parser.entity = ""
-          parser.state = returnState
-        }
-        else if (is(entity, c)) parser.entity += c
-        else {
-          strictFail("Invalid character entity")
-          parser[buffer] += "&" + parser.entity + c
-          parser.entity = ""
-          parser.state = returnState
-        }
-      continue
-
-      default:
-        throw new Error(parser, "Unknown state: " + parser.state)
-    }
-  } // while
-  // cdata blocks can get very big under normal conditions. emit and move on.
-  // if (parser.state === S.CDATA && parser.cdata) {
-  //   emitNode(parser, "oncdata", parser.cdata)
-  //   parser.cdata = ""
-  // }
-  if (parser.position >= parser.bufferCheckPosition) checkBufferLength(parser)
-  return parser
-}
-
-})(typeof exports === "undefined" ? sax = {} : exports)
diff --git a/node_modules/sax/package.json b/node_modules/sax/package.json
deleted file mode 100644
index 9764093..0000000
--- a/node_modules/sax/package.json
+++ /dev/null
@@ -1,88 +0,0 @@
-{
-  "_args": [
-    [
-      "sax@0.3.5",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "sax@0.3.5",
-  "_id": "sax@0.3.5",
-  "_inBundle": false,
-  "_integrity": "sha1-iPz8H3PAyLvVt8d2ttPzUB7tBz0=",
-  "_location": "/sax",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "sax@0.3.5",
-    "name": "sax",
-    "escapedName": "sax",
-    "rawSpec": "0.3.5",
-    "saveSpec": null,
-    "fetchSpec": "0.3.5"
-  },
-  "_requiredBy": [
-    "/cordova-common/elementtree"
-  ],
-  "_resolved": "http://registry.npmjs.org/sax/-/sax-0.3.5.tgz",
-  "_spec": "0.3.5",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Isaac Z. Schlueter",
-    "email": "i@izs.me",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/sax-js/issues"
-  },
-  "contributors": [
-    {
-      "name": "Isaac Z. Schlueter",
-      "email": "i@izs.me"
-    },
-    {
-      "name": "Stein Martin Hustad",
-      "email": "stein@hustad.com"
-    },
-    {
-      "name": "Mikeal Rogers",
-      "email": "mikeal.rogers@gmail.com"
-    },
-    {
-      "name": "Laurie Harper",
-      "email": "laurie@holoweb.net"
-    },
-    {
-      "name": "Jann Horn",
-      "email": "jann@Jann-PC.fritz.box"
-    },
-    {
-      "name": "Elijah Insua",
-      "email": "tmpvar@gmail.com"
-    },
-    {
-      "name": "Henry Rawas",
-      "email": "henryr@schakra.com"
-    },
-    {
-      "name": "Justin Makeig",
-      "email": "jmpublic@makeig.com"
-    }
-  ],
-  "description": "An evented streaming XML parser in JavaScript",
-  "homepage": "https://github.com/isaacs/sax-js#readme",
-  "license": {
-    "type": "MIT",
-    "url": "https://raw.github.com/isaacs/sax-js/master/LICENSE"
-  },
-  "main": "lib/sax.js",
-  "name": "sax",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/sax-js.git"
-  },
-  "scripts": {
-    "test": "node test/index.js"
-  },
-  "version": "0.3.5"
-}
diff --git a/node_modules/sax/test/buffer-overrun.js b/node_modules/sax/test/buffer-overrun.js
deleted file mode 100644
index 8d12fac..0000000
--- a/node_modules/sax/test/buffer-overrun.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// set this really low so that I don't have to put 64 MB of xml in here.
-var sax = require("../lib/sax")
-var bl = sax.MAX_BUFFER_LENGTH
-sax.MAX_BUFFER_LENGTH = 5;
-
-require(__dirname).test({
-  expect : [
-    ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 15\nChar: "],
-    ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 30\nChar: "],
-    ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 45\nChar: "],
-    ["opentag", {
-     "name": "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ",
-     "attributes": {}
-    }],
-    ["text", "yo"],
-    ["closetag", "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"]
-  ]
-}).write("<abcdefghijklmn")
-  .write("opqrstuvwxyzABC")
-  .write("DEFGHIJKLMNOPQR")
-  .write("STUVWXYZ>")
-  .write("yo")
-  .write("</abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ>")
-  .close();
-sax.MAX_BUFFER_LENGTH = bl
diff --git a/node_modules/sax/test/cdata-chunked.js b/node_modules/sax/test/cdata-chunked.js
deleted file mode 100644
index ccd5ee6..0000000
--- a/node_modules/sax/test/cdata-chunked.js
+++ /dev/null
@@ -1,11 +0,0 @@
-
-require(__dirname).test({
-  expect : [
-    ["opentag", {"name": "R","attributes": {}}],
-    ["opencdata", undefined],
-    ["cdata", " this is character data  "],
-    ["closecdata", undefined],
-    ["closetag", "R"]
-  ]
-}).write("<r><![CDATA[ this is ").write("character data  ").write("]]></r>").close();
-
diff --git a/node_modules/sax/test/cdata-end-split.js b/node_modules/sax/test/cdata-end-split.js
deleted file mode 100644
index b41bd00..0000000
--- a/node_modules/sax/test/cdata-end-split.js
+++ /dev/null
@@ -1,15 +0,0 @@
-
-require(__dirname).test({
-  expect : [
-    ["opentag", {"name": "R","attributes": {}}],
-    ["opencdata", undefined],
-    ["cdata", " this is "],
-    ["closecdata", undefined],
-    ["closetag", "R"]
-  ]
-})
-  .write("<r><![CDATA[ this is ]")
-  .write("]>")
-  .write("</r>")
-  .close();
-
diff --git a/node_modules/sax/test/cdata-fake-end.js b/node_modules/sax/test/cdata-fake-end.js
deleted file mode 100644
index 07aeac4..0000000
--- a/node_modules/sax/test/cdata-fake-end.js
+++ /dev/null
@@ -1,28 +0,0 @@
-
-var p = require(__dirname).test({
-  expect : [
-    ["opentag", {"name": "R","attributes": {}}],
-    ["opencdata", undefined],
-    ["cdata", "[[[[[[[[]]]]]]]]"],
-    ["closecdata", undefined],
-    ["closetag", "R"]
-  ]
-})
-var x = "<r><![CDATA[[[[[[[[[]]]]]]]]]]></r>"
-for (var i = 0; i < x.length ; i ++) {
-  p.write(x.charAt(i))
-}
-p.close();
-
-
-var p2 = require(__dirname).test({
-  expect : [
-    ["opentag", {"name": "R","attributes": {}}],
-    ["opencdata", undefined],
-    ["cdata", "[[[[[[[[]]]]]]]]"],
-    ["closecdata", undefined],
-    ["closetag", "R"]
-  ]
-})
-var x = "<r><![CDATA[[[[[[[[[]]]]]]]]]]></r>"
-p2.write(x).close();
diff --git a/node_modules/sax/test/cdata-multiple.js b/node_modules/sax/test/cdata-multiple.js
deleted file mode 100644
index dab2015..0000000
--- a/node_modules/sax/test/cdata-multiple.js
+++ /dev/null
@@ -1,15 +0,0 @@
-
-require(__dirname).test({
-  expect : [
-    ["opentag", {"name": "R","attributes": {}}],
-    ["opencdata", undefined],
-    ["cdata", " this is "],
-    ["closecdata", undefined],
-    ["opencdata", undefined],
-    ["cdata", "character data  "],
-    ["closecdata", undefined],
-    ["closetag", "R"]
-  ]
-}).write("<r><![CDATA[ this is ]]>").write("<![CDA").write("T").write("A[")
-  .write("character data  ").write("]]></r>").close();
-
diff --git a/node_modules/sax/test/cdata.js b/node_modules/sax/test/cdata.js
deleted file mode 100644
index 0f09cce..0000000
--- a/node_modules/sax/test/cdata.js
+++ /dev/null
@@ -1,10 +0,0 @@
-require(__dirname).test({
-  xml : "<r><![CDATA[ this is character data  ]]></r>",
-  expect : [
-    ["opentag", {"name": "R","attributes": {}}],
-    ["opencdata", undefined],
-    ["cdata", " this is character data  "],
-    ["closecdata", undefined],
-    ["closetag", "R"]
-  ]
-});
diff --git a/node_modules/sax/test/index.js b/node_modules/sax/test/index.js
deleted file mode 100644
index d4e1ef4..0000000
--- a/node_modules/sax/test/index.js
+++ /dev/null
@@ -1,86 +0,0 @@
-var globalsBefore = JSON.stringify(Object.keys(global))
-  , util = require("util")
-  , assert = require("assert")
-  , fs = require("fs")
-  , path = require("path")
-  , sax = require("../lib/sax")
-
-exports.sax = sax
-
-// handy way to do simple unit tests
-// if the options contains an xml string, it'll be written and the parser closed.
-// otherwise, it's assumed that the test will write and close.
-exports.test = function test (options) {
-  var xml = options.xml
-    , parser = sax.parser(options.strict, options.opt)
-    , expect = options.expect
-    , e = 0
-  sax.EVENTS.forEach(function (ev) {
-    parser["on" + ev] = function (n) {
-      if (process.env.DEBUG) {
-        console.error({ expect: expect[e]
-                      , actual: [ev, n] })
-      }
-      if (e >= expect.length && (ev === "end" || ev === "ready")) return
-      assert.ok( e < expect.length,
-        "expectation #"+e+" "+util.inspect(expect[e])+"\n"+
-        "Unexpected event: "+ev+" "+(n ? util.inspect(n) : ""))
-      var inspected = n instanceof Error ? "\n"+ n.message : util.inspect(n)
-      assert.equal(ev, expect[e][0],
-        "expectation #"+e+"\n"+
-        "Didn't get expected event\n"+
-        "expect: "+expect[e][0] + " " +util.inspect(expect[e][1])+"\n"+
-        "actual: "+ev+" "+inspected+"\n")
-      if (ev === "error") assert.equal(n.message, expect[e][1])
-      else assert.deepEqual(n, expect[e][1],
-        "expectation #"+e+"\n"+
-        "Didn't get expected argument\n"+
-        "expect: "+expect[e][0] + " " +util.inspect(expect[e][1])+"\n"+
-        "actual: "+ev+" "+inspected+"\n")
-      e++
-      if (ev === "error") parser.resume()
-    }
-  })
-  if (xml) parser.write(xml).close()
-  return parser
-}
-
-if (module === require.main) {
-  var running = true
-    , failures = 0
-
-  function fail (file, er) {
-    util.error("Failed: "+file)
-    util.error(er.stack || er.message)
-    failures ++
-  }
-
-  fs.readdir(__dirname, function (error, files) {
-    files = files.filter(function (file) {
-      return (/\.js$/.exec(file) && file !== 'index.js')
-    })
-    var n = files.length
-      , i = 0
-    console.log("0.." + n)
-    files.forEach(function (file) {
-      // run this test.
-      try {
-        require(path.resolve(__dirname, file))
-        var globalsAfter = JSON.stringify(Object.keys(global))
-        if (globalsAfter !== globalsBefore) {
-          var er = new Error("new globals introduced\n"+
-                             "expected: "+globalsBefore+"\n"+
-                             "actual:   "+globalsAfter)
-          globalsBefore = globalsAfter
-          throw er
-        }
-        console.log("ok " + (++i) + " - " + file)
-      } catch (er) {
-        console.log("not ok "+ (++i) + " - " + file)
-        fail(file, er)
-      }
-    })
-    if (!failures) return console.log("#all pass")
-    else return console.error(failures + " failure" + (failures > 1 ? "s" : ""))
-  })
-}
diff --git a/node_modules/sax/test/issue-23.js b/node_modules/sax/test/issue-23.js
deleted file mode 100644
index e7991b2..0000000
--- a/node_modules/sax/test/issue-23.js
+++ /dev/null
@@ -1,43 +0,0 @@
-
-require(__dirname).test
-  ( { xml :
-      "<compileClassesResponse>"+
-        "<result>"+
-          "<bodyCrc>653724009</bodyCrc>"+
-          "<column>-1</column>"+
-          "<id>01pG0000002KoSUIA0</id>"+
-          "<line>-1</line>"+
-          "<name>CalendarController</name>"+
-          "<success>true</success>"+
-        "</result>"+
-      "</compileClassesResponse>"
-
-    , expect :
-      [ [ "opentag", { name: "COMPILECLASSESRESPONSE", attributes: {} } ]
-      , [ "opentag", { name : "RESULT", attributes: {} } ]
-      , [ "opentag", { name: "BODYCRC", attributes: {} } ]
-      , [ "text", "653724009" ]
-      , [ "closetag", "BODYCRC" ]
-      , [ "opentag", { name: "COLUMN", attributes: {} } ]
-      , [ "text", "-1" ]
-      , [ "closetag", "COLUMN" ]
-      , [ "opentag", { name: "ID", attributes: {} } ]
-      , [ "text", "01pG0000002KoSUIA0" ]
-      , [ "closetag", "ID" ]
-      , [ "opentag", {name: "LINE", attributes: {} } ]
-      , [ "text", "-1" ]
-      , [ "closetag", "LINE" ]
-      , [ "opentag", {name: "NAME", attributes: {} } ]
-      , [ "text", "CalendarController" ]
-      , [ "closetag", "NAME" ]
-      , [ "opentag", {name: "SUCCESS", attributes: {} } ]
-      , [ "text", "true" ]
-      , [ "closetag", "SUCCESS" ]
-      , [ "closetag", "RESULT" ]
-      , [ "closetag", "COMPILECLASSESRESPONSE" ]
-      ]
-    , strict : false
-    , opt : {}
-    }
-  )
-
diff --git a/node_modules/sax/test/issue-30.js b/node_modules/sax/test/issue-30.js
deleted file mode 100644
index c2cc809..0000000
--- a/node_modules/sax/test/issue-30.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// https://github.com/isaacs/sax-js/issues/33
-require(__dirname).test
-  ( { xml : "<xml>\n"+
-            "<!-- \n"+
-            "  comment with a single dash- in it\n"+
-            "-->\n"+
-            "<data/>\n"+
-            "</xml>"
-
-    , expect :
-      [ [ "opentag", { name: "xml", attributes: {} } ]
-      , [ "text", "\n" ]
-      , [ "comment", " \n  comment with a single dash- in it\n" ]
-      , [ "text", "\n" ]
-      , [ "opentag", { name: "data", attributes: {} } ]
-      , [ "closetag", "data" ]
-      , [ "text", "\n" ]
-      , [ "closetag", "xml" ]
-      ]
-    , strict : true
-    , opt : {}
-    }
-  )
-
diff --git a/node_modules/sax/test/issue-35.js b/node_modules/sax/test/issue-35.js
deleted file mode 100644
index 7c521c5..0000000
--- a/node_modules/sax/test/issue-35.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// https://github.com/isaacs/sax-js/issues/35
-require(__dirname).test
-  ( { xml : "<xml>&#Xd;&#X0d;\n"+
-            "</xml>"
-
-    , expect :
-      [ [ "opentag", { name: "xml", attributes: {} } ]
-      , [ "text", "\r\r\n" ]
-      , [ "closetag", "xml" ]
-      ]
-    , strict : true
-    , opt : {}
-    }
-  )
-
diff --git a/node_modules/sax/test/issue-47.js b/node_modules/sax/test/issue-47.js
deleted file mode 100644
index 911c7d0..0000000
--- a/node_modules/sax/test/issue-47.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// https://github.com/isaacs/sax-js/issues/47
-require(__dirname).test
-  ( { xml : '<a href="query.svc?x=1&y=2&z=3"/>'
-    , expect : [ 
-        [ "attribute", { name:'href', value:"query.svc?x=1&y=2&z=3"} ],
-        [ "opentag", { name: "a", attributes: { href:"query.svc?x=1&y=2&z=3"} } ],
-        [ "closetag", "a" ]
-      ]
-    , strict : true
-    , opt : {}
-    }
-  )
-
diff --git a/node_modules/sax/test/issue-49.js b/node_modules/sax/test/issue-49.js
deleted file mode 100644
index 2964325..0000000
--- a/node_modules/sax/test/issue-49.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// https://github.com/isaacs/sax-js/issues/49
-require(__dirname).test
-  ( { xml : "<xml><script>hello world</script></xml>"
-    , expect :
-      [ [ "opentag", { name: "xml", attributes: {} } ]
-      , [ "opentag", { name: "script", attributes: {} } ]
-      , [ "text", "hello world" ]
-      , [ "closetag", "script" ]
-      , [ "closetag", "xml" ]
-      ]
-    , strict : false
-    , opt : { lowercasetags: true, noscript: true }
-    }
-  )
-
-require(__dirname).test
-  ( { xml : "<xml><script><![CDATA[hello world]]></script></xml>"
-    , expect :
-      [ [ "opentag", { name: "xml", attributes: {} } ]
-      , [ "opentag", { name: "script", attributes: {} } ]
-      , [ "opencdata", undefined ]
-      , [ "cdata", "hello world" ]
-      , [ "closecdata", undefined ]
-      , [ "closetag", "script" ]
-      , [ "closetag", "xml" ]
-      ]
-    , strict : false
-    , opt : { lowercasetags: true, noscript: true }
-    }
-  )
-
diff --git a/node_modules/sax/test/parser-position.js b/node_modules/sax/test/parser-position.js
deleted file mode 100644
index e4a68b1..0000000
--- a/node_modules/sax/test/parser-position.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var sax = require("../lib/sax"),
-    assert = require("assert")
-
-function testPosition(chunks, expectedEvents) {
-  var parser = sax.parser();
-  expectedEvents.forEach(function(expectation) {
-    parser['on' + expectation[0]] = function() {
-      for (var prop in expectation[1]) {
-        assert.equal(parser[prop], expectation[1][prop]);
-      }
-    }
-  });
-  chunks.forEach(function(chunk) {
-    parser.write(chunk);
-  });
-};
-
-testPosition(['<div>abcdefgh</div>'],
-             [ ['opentag',  { position:  5, startTagPosition:  1 }]
-             , ['text',     { position: 19, startTagPosition: 14 }]
-             , ['closetag', { position: 19, startTagPosition: 14 }]
-             ]);
-
-testPosition(['<div>abcde','fgh</div>'],
-             [ ['opentag',  { position:  5, startTagPosition:  1 }]
-             , ['text',     { position: 19, startTagPosition: 14 }]
-             , ['closetag', { position: 19, startTagPosition: 14 }]
-             ]);
diff --git a/node_modules/sax/test/script.js b/node_modules/sax/test/script.js
deleted file mode 100644
index 464c051..0000000
--- a/node_modules/sax/test/script.js
+++ /dev/null
@@ -1,12 +0,0 @@
-require(__dirname).test({
-  xml : "<html><head><script>if (1 < 0) { console.log('elo there'); }</script></head></html>",
-  expect : [
-    ["opentag", {"name": "HTML","attributes": {}}],
-    ["opentag", {"name": "HEAD","attributes": {}}],
-    ["opentag", {"name": "SCRIPT","attributes": {}}],
-    ["script", "if (1 < 0) { console.log('elo there'); }"],
-    ["closetag", "SCRIPT"],
-    ["closetag", "HEAD"],
-    ["closetag", "HTML"]
-  ]
-});
diff --git a/node_modules/sax/test/self-closing-child-strict.js b/node_modules/sax/test/self-closing-child-strict.js
deleted file mode 100644
index ce9c045..0000000
--- a/node_modules/sax/test/self-closing-child-strict.js
+++ /dev/null
@@ -1,40 +0,0 @@
-
-require(__dirname).test({
-  xml :
-  "<root>"+
-    "<child>" +
-      "<haha />" +
-    "</child>" +
-    "<monkey>" +
-      "=(|)" +
-    "</monkey>" +
-  "</root>",
-  expect : [
-    ["opentag", {
-     "name": "root",
-     "attributes": {}
-    }],
-    ["opentag", {
-     "name": "child",
-     "attributes": {}
-    }],
-    ["opentag", {
-     "name": "haha",
-     "attributes": {}
-    }],
-    ["closetag", "haha"],
-    ["closetag", "child"],
-    ["opentag", {
-     "name": "monkey",
-     "attributes": {}
-    }],
-    ["text", "=(|)"],
-    ["closetag", "monkey"],
-    ["closetag", "root"],
-    ["end"],
-    ["ready"]
-  ],
-  strict : true,
-  opt : {}
-});
-
diff --git a/node_modules/sax/test/self-closing-child.js b/node_modules/sax/test/self-closing-child.js
deleted file mode 100644
index bc6b52b..0000000
--- a/node_modules/sax/test/self-closing-child.js
+++ /dev/null
@@ -1,40 +0,0 @@
-
-require(__dirname).test({
-  xml :
-  "<root>"+
-    "<child>" +
-      "<haha />" +
-    "</child>" +
-    "<monkey>" +
-      "=(|)" +
-    "</monkey>" +
-  "</root>",
-  expect : [
-    ["opentag", {
-     "name": "ROOT",
-     "attributes": {}
-    }],
-    ["opentag", {
-     "name": "CHILD",
-     "attributes": {}
-    }],
-    ["opentag", {
-     "name": "HAHA",
-     "attributes": {}
-    }],
-    ["closetag", "HAHA"],
-    ["closetag", "CHILD"],
-    ["opentag", {
-     "name": "MONKEY",
-     "attributes": {}
-    }],
-    ["text", "=(|)"],
-    ["closetag", "MONKEY"],
-    ["closetag", "ROOT"],
-    ["end"],
-    ["ready"]
-  ],
-  strict : false,
-  opt : {}
-});
-
diff --git a/node_modules/sax/test/self-closing-tag.js b/node_modules/sax/test/self-closing-tag.js
deleted file mode 100644
index b2c5736..0000000
--- a/node_modules/sax/test/self-closing-tag.js
+++ /dev/null
@@ -1,25 +0,0 @@
-
-require(__dirname).test({
-  xml :
-  "<root>   "+
-    "<haha /> "+
-    "<haha/>  "+
-    "<monkey> "+
-      "=(|)     "+
-    "</monkey>"+
-  "</root>  ",
-  expect : [
-    ["opentag", {name:"ROOT", attributes:{}}],
-    ["opentag", {name:"HAHA", attributes:{}}],
-    ["closetag", "HAHA"],
-    ["opentag", {name:"HAHA", attributes:{}}],
-    ["closetag", "HAHA"],
-    // ["opentag", {name:"HAHA", attributes:{}}],
-    // ["closetag", "HAHA"],
-    ["opentag", {name:"MONKEY", attributes:{}}],
-    ["text", "=(|)"],
-    ["closetag", "MONKEY"],
-    ["closetag", "ROOT"]
-  ],
-  opt : { trim : true }
-});
\ No newline at end of file
diff --git a/node_modules/sax/test/stray-ending.js b/node_modules/sax/test/stray-ending.js
deleted file mode 100644
index 6b0aa7f..0000000
--- a/node_modules/sax/test/stray-ending.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// stray ending tags should just be ignored in non-strict mode.
-// https://github.com/isaacs/sax-js/issues/32
-require(__dirname).test
-  ( { xml :
-      "<a><b></c></b></a>"
-    , expect :
-      [ [ "opentag", { name: "A", attributes: {} } ]
-      , [ "opentag", { name: "B", attributes: {} } ]
-      , [ "text", "</c>" ]
-      , [ "closetag", "B" ]
-      , [ "closetag", "A" ]
-      ]
-    , strict : false
-    , opt : {}
-    }
-  )
-
diff --git a/node_modules/sax/test/trailing-non-whitespace.js b/node_modules/sax/test/trailing-non-whitespace.js
deleted file mode 100644
index 3e1fb2e..0000000
--- a/node_modules/sax/test/trailing-non-whitespace.js
+++ /dev/null
@@ -1,17 +0,0 @@
-
-require(__dirname).test({
-  xml : "<span>Welcome,</span> to monkey land",
-  expect : [
-    ["opentag", {
-     "name": "SPAN",
-     "attributes": {}
-    }],
-    ["text", "Welcome,"],
-    ["closetag", "SPAN"],
-    ["text", " to monkey land"],
-    ["end"],
-    ["ready"]
-  ],
-  strict : false,
-  opt : {}
-});
diff --git a/node_modules/sax/test/unquoted.js b/node_modules/sax/test/unquoted.js
deleted file mode 100644
index 79f1d0b..0000000
--- a/node_modules/sax/test/unquoted.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// unquoted attributes should be ok in non-strict mode
-// https://github.com/isaacs/sax-js/issues/31
-require(__dirname).test
-  ( { xml :
-      "<span class=test hello=world></span>"
-    , expect :
-      [ [ "attribute", { name: "class", value: "test" } ]
-      , [ "attribute", { name: "hello", value: "world" } ]
-      , [ "opentag", { name: "SPAN",
-                       attributes: { class: "test", hello: "world" } } ]
-      , [ "closetag", "SPAN" ]
-      ]
-    , strict : false
-    , opt : {}
-    }
-  )
-
diff --git a/node_modules/sax/test/xmlns-issue-41.js b/node_modules/sax/test/xmlns-issue-41.js
deleted file mode 100644
index 596d82b..0000000
--- a/node_modules/sax/test/xmlns-issue-41.js
+++ /dev/null
@@ -1,67 +0,0 @@
-var t = require(__dirname)
-
-  , xmls = // should be the same both ways.
-    [ "<parent xmlns:a='http://ATTRIBUTE' a:attr='value' />"
-    , "<parent a:attr='value' xmlns:a='http://ATTRIBUTE' />" ]
-
-  , ex1 =
-    [ [ "opennamespace"
-      , { prefix: "a"
-        , uri: "http://ATTRIBUTE"
-        }
-      ]
-    , [ "attribute"
-      , { name: "xmlns:a"
-        , value: "http://ATTRIBUTE"
-        , prefix: "xmlns"
-        , local: "a"
-        , uri: "http://www.w3.org/2000/xmlns/"
-        }
-      ]
-    , [ "attribute"
-      , { name: "a:attr"
-        , local: "attr"
-        , prefix: "a"
-        , uri: "http://ATTRIBUTE"
-        , value: "value"
-        }
-      ]
-    , [ "opentag"
-      , { name: "parent"
-        , uri: ""
-        , prefix: ""
-        , local: "parent"
-        , attributes:
-          { "a:attr":
-            { name: "a:attr"
-            , local: "attr"
-            , prefix: "a"
-            , uri: "http://ATTRIBUTE"
-            , value: "value"
-            }
-          , "xmlns:a":
-            { name: "xmlns:a"
-            , local: "a"
-            , prefix: "xmlns"
-            , uri: "http://www.w3.org/2000/xmlns/"
-            , value: "http://ATTRIBUTE"
-            }
-          }
-        , ns: {"a": "http://ATTRIBUTE"}
-        }
-      ]
-    , ["closetag", "parent"]
-    , ["closenamespace", { prefix: "a", uri: "http://ATTRIBUTE" }]
-    ]
-
-  // swap the order of elements 2 and 1
-  , ex2 = [ex1[0], ex1[2], ex1[1]].concat(ex1.slice(3))
-  , expected = [ex1, ex2]
-
-xmls.forEach(function (x, i) {
-  t.test({ xml: x
-         , expect: expected[i]
-         , strict: true
-         , opt: { xmlns: true }
-         })
-})
diff --git a/node_modules/sax/test/xmlns-rebinding.js b/node_modules/sax/test/xmlns-rebinding.js
deleted file mode 100644
index f464876..0000000
--- a/node_modules/sax/test/xmlns-rebinding.js
+++ /dev/null
@@ -1,59 +0,0 @@
-
-require(__dirname).test
-  ( { xml :
-      "<root xmlns:x='x1' xmlns:y='y1' x:a='x1' y:a='y1'>"+
-        "<rebind xmlns:x='x2'>"+
-          "<check x:a='x2' y:a='y1'/>"+
-        "</rebind>"+
-        "<check x:a='x1' y:a='y1'/>"+
-      "</root>"
-
-    , expect :
-      [ [ "opennamespace", { prefix: "x", uri: "x1" } ]
-      , [ "opennamespace", { prefix: "y", uri: "y1" } ]
-      , [ "attribute", { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ]
-      , [ "attribute", { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" } ]
-      , [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ]
-      , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
-      , [ "opentag", { name: "root", uri: "", prefix: "", local: "root",
-            attributes: { "xmlns:x": { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" }
-                        , "xmlns:y": { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" }
-                        , "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" }
-                        , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
-            ns: { x: 'x1', y: 'y1' } } ]
-
-      , [ "opennamespace", { prefix: "x", uri: "x2" } ]
-      , [ "attribute", { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ]
-      , [ "opentag", { name: "rebind", uri: "", prefix: "", local: "rebind",
-            attributes: { "xmlns:x": { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } },
-            ns: { x: 'x2' } } ]
-
-      , [ "attribute", { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" } ]
-      , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
-      , [ "opentag", { name: "check", uri: "", prefix: "", local: "check",
-            attributes: { "x:a": { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" }
-                        , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
-            ns: { x: 'x2' } } ]
-
-      , [ "closetag", "check" ]
-
-      , [ "closetag", "rebind" ]
-      , [ "closenamespace", { prefix: "x", uri: "x2" } ]
-
-      , [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ]
-      , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
-      , [ "opentag", { name: "check", uri: "", prefix: "", local: "check",
-            attributes: { "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" }
-                        , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
-            ns: { x: 'x1', y: 'y1' } } ]
-      , [ "closetag", "check" ]
-
-      , [ "closetag", "root" ]
-      , [ "closenamespace", { prefix: "x", uri: "x1" } ]
-      , [ "closenamespace", { prefix: "y", uri: "y1" } ]
-      ]
-    , strict : true
-    , opt : { xmlns: true }
-    }
-  )
-
diff --git a/node_modules/sax/test/xmlns-strict.js b/node_modules/sax/test/xmlns-strict.js
deleted file mode 100644
index 4ad615b..0000000
--- a/node_modules/sax/test/xmlns-strict.js
+++ /dev/null
@@ -1,71 +0,0 @@
-
-require(__dirname).test
-  ( { xml :
-      "<root>"+
-        "<plain attr='normal'/>"+
-        "<ns1 xmlns='uri:default'>"+
-          "<plain attr='normal'/>"+
-        "</ns1>"+
-        "<ns2 xmlns:a='uri:nsa'>"+
-          "<plain attr='normal'/>"+
-          "<a:ns a:attr='namespaced'/>"+
-        "</ns2>"+
-      "</root>"
-
-    , expect :
-      [ [ "opentag", { name: "root", prefix: "", local: "root", uri: "",
-            attributes: {}, ns: {} } ]
-
-      , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ]
-      , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "",
-            attributes: { "attr": { name: "attr", value: "normal", uri: "", prefix: "", local: "attr", uri: "" } },
-            ns: {} } ]
-      , [ "closetag", "plain" ]
-
-      , [ "opennamespace", { prefix: "", uri: "uri:default" } ]
-
-      , [ "attribute", { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } ]
-      , [ "opentag", { name: "ns1", prefix: "", local: "ns1", uri: "uri:default",
-            attributes: { "xmlns": { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } },
-            ns: { "": "uri:default" } } ]
-
-      , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "uri:default" } ]
-      , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "uri:default", ns: { '': 'uri:default' },
-            attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "uri:default" } } } ]
-      , [ "closetag", "plain" ]
-
-      , [ "closetag", "ns1" ]
-
-      , [ "closenamespace", { prefix: "", uri: "uri:default" } ]
-
-      , [ "opennamespace", { prefix: "a", uri: "uri:nsa" } ]
-
-      , [ "attribute", { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } ]
-
-      , [ "opentag", { name: "ns2", prefix: "", local: "ns2", uri: "",
-            attributes: { "xmlns:a": { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } },
-            ns: { a: "uri:nsa" } } ]
-
-      , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ]
-      , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "",
-            attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } },
-            ns: { a: 'uri:nsa' } } ]
-      , [ "closetag", "plain" ]
-
-      , [ "attribute", { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } ]
-      , [ "opentag", { name: "a:ns", prefix: "a", local: "ns", uri: "uri:nsa",
-            attributes: { "a:attr": { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } },
-            ns: { a: 'uri:nsa' } } ]
-      , [ "closetag", "a:ns" ]
-
-      , [ "closetag", "ns2" ]
-
-      , [ "closenamespace", { prefix: "a", uri: "uri:nsa" } ]
-
-      , [ "closetag", "root" ]
-      ]
-    , strict : true
-    , opt : { xmlns: true }
-    }
-  )
-
diff --git a/node_modules/sax/test/xmlns-unbound.js b/node_modules/sax/test/xmlns-unbound.js
deleted file mode 100644
index 2944b87..0000000
--- a/node_modules/sax/test/xmlns-unbound.js
+++ /dev/null
@@ -1,15 +0,0 @@
-
-require(__dirname).test(
-  { strict : true
-  , opt : { xmlns: true }
-  , expect :
-    [ ["error", "Unbound namespace prefix: \"unbound\"\nLine: 0\nColumn: 28\nChar: >"]
-
-    , [ "attribute", { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } ]
-    , [ "opentag", { name: "root", uri: "", prefix: "", local: "root",
-          attributes: { "unbound:attr": { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } },
-          ns: {} } ]
-    , [ "closetag", "root" ]
-    ]
-  }
-).write("<root unbound:attr='value'/>")
diff --git a/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js b/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js
deleted file mode 100644
index 16da771..0000000
--- a/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js
+++ /dev/null
@@ -1,35 +0,0 @@
-require(__dirname).test(
-  { xml : "<root xml:lang='en'/>"
-  , expect :
-    [ [ "attribute"
-      , { name: "xml:lang"
-        , local: "lang"
-        , prefix: "xml"
-        , uri: "http://www.w3.org/XML/1998/namespace"
-        , value: "en"
-        }
-      ]
-    , [ "opentag"
-      , { name: "root"
-        , uri: ""
-        , prefix: ""
-        , local: "root"
-        , attributes:
-          { "xml:lang":
-            { name: "xml:lang"
-            , local: "lang"
-            , prefix: "xml"
-            , uri: "http://www.w3.org/XML/1998/namespace"
-            , value: "en"
-            }
-          }
-        , ns: {}
-        }
-      ]
-    , ["closetag", "root"]
-    ]
-  , strict : true
-  , opt : { xmlns: true }
-  }
-)
-
diff --git a/node_modules/sax/test/xmlns-xml-default-prefix.js b/node_modules/sax/test/xmlns-xml-default-prefix.js
deleted file mode 100644
index 9a1ce1b..0000000
--- a/node_modules/sax/test/xmlns-xml-default-prefix.js
+++ /dev/null
@@ -1,20 +0,0 @@
-require(__dirname).test(
-  { xml : "<xml:root/>"
-  , expect :
-    [
-      [ "opentag"
-      , { name: "xml:root"
-        , uri: "http://www.w3.org/XML/1998/namespace"
-        , prefix: "xml"
-        , local: "root"
-        , attributes: {}
-        , ns: {}
-        }
-      ]
-    , ["closetag", "xml:root"]
-    ]
-  , strict : true
-  , opt : { xmlns: true }
-  }
-)
-
diff --git a/node_modules/sax/test/xmlns-xml-default-redefine.js b/node_modules/sax/test/xmlns-xml-default-redefine.js
deleted file mode 100644
index 1eba9c7..0000000
--- a/node_modules/sax/test/xmlns-xml-default-redefine.js
+++ /dev/null
@@ -1,40 +0,0 @@
-require(__dirname).test(
-  { xml : "<xml:root xmlns:xml='ERROR'/>"
-  , expect :
-    [ ["error"
-      , "xml: prefix must be bound to http://www.w3.org/XML/1998/namespace\n"
-                        + "Actual: ERROR\n"
-      + "Line: 0\nColumn: 27\nChar: '"
-      ]
-    , [ "attribute"
-      , { name: "xmlns:xml"
-        , local: "xml"
-        , prefix: "xmlns"
-        , uri: "http://www.w3.org/2000/xmlns/"
-        , value: "ERROR"
-        }
-      ]
-    , [ "opentag"
-      , { name: "xml:root"
-        , uri: "http://www.w3.org/XML/1998/namespace"
-        , prefix: "xml"
-        , local: "root"
-        , attributes:
-          { "xmlns:xml":
-            { name: "xmlns:xml"
-            , local: "xml"
-            , prefix: "xmlns"
-            , uri: "http://www.w3.org/2000/xmlns/"
-            , value: "ERROR"
-            }
-          }
-        , ns: {}
-        }
-      ]
-    , ["closetag", "xml:root"]
-    ]
-  , strict : true
-  , opt : { xmlns: true }
-  }
-)
-
diff --git a/node_modules/semver/LICENSE b/node_modules/semver/LICENSE
deleted file mode 100644
index 19129e3..0000000
--- a/node_modules/semver/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/semver/README.md b/node_modules/semver/README.md
deleted file mode 100644
index 951c539..0000000
--- a/node_modules/semver/README.md
+++ /dev/null
@@ -1,388 +0,0 @@
-semver(1) -- The semantic versioner for npm
-===========================================
-
-## Install
-
-```bash
-npm install --save semver
-````
-
-## Usage
-
-As a node module:
-
-```js
-const semver = require('semver')
-
-semver.valid('1.2.3') // '1.2.3'
-semver.valid('a.b.c') // null
-semver.clean('  =v1.2.3   ') // '1.2.3'
-semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
-semver.gt('1.2.3', '9.8.7') // false
-semver.lt('1.2.3', '9.8.7') // true
-semver.valid(semver.coerce('v2')) // '2.0.0'
-semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
-```
-
-As a command-line utility:
-
-```
-$ semver -h
-
-SemVer 5.3.0
-
-A JavaScript implementation of the http://semver.org/ specification
-Copyright Isaac Z. Schlueter
-
-Usage: semver [options] <version> [<version> [...]]
-Prints valid versions sorted by SemVer precedence
-
-Options:
--r --range <range>
-        Print versions that match the specified range.
-
--i --increment [<level>]
-        Increment a version by the specified level.  Level can
-        be one of: major, minor, patch, premajor, preminor,
-        prepatch, or prerelease.  Default level is 'patch'.
-        Only one version may be specified.
-
---preid <identifier>
-        Identifier to be used to prefix premajor, preminor,
-        prepatch or prerelease version increments.
-
--l --loose
-        Interpret versions and ranges loosely
-
--c --coerce
-        Coerce a string into SemVer if possible
-        (does not imply --loose)
-
-Program exits successfully if any valid version satisfies
-all supplied ranges, and prints all satisfying versions.
-
-If no satisfying versions are found, then exits failure.
-
-Versions are printed in ascending order, so supplying
-multiple versions to the utility will just sort them.
-```
-
-## Versions
-
-A "version" is described by the `v2.0.0` specification found at
-<http://semver.org/>.
-
-A leading `"="` or `"v"` character is stripped off and ignored.
-
-## Ranges
-
-A `version range` is a set of `comparators` which specify versions
-that satisfy the range.
-
-A `comparator` is composed of an `operator` and a `version`.  The set
-of primitive `operators` is:
-
-* `<` Less than
-* `<=` Less than or equal to
-* `>` Greater than
-* `>=` Greater than or equal to
-* `=` Equal.  If no operator is specified, then equality is assumed,
-  so this operator is optional, but MAY be included.
-
-For example, the comparator `>=1.2.7` would match the versions
-`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6`
-or `1.1.0`.
-
-Comparators can be joined by whitespace to form a `comparator set`,
-which is satisfied by the **intersection** of all of the comparators
-it includes.
-
-A range is composed of one or more comparator sets, joined by `||`.  A
-version matches a range if and only if every comparator in at least
-one of the `||`-separated comparator sets is satisfied by the version.
-
-For example, the range `>=1.2.7 <1.3.0` would match the versions
-`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`,
-or `1.1.0`.
-
-The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`,
-`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`.
-
-### Prerelease Tags
-
-If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then
-it will only be allowed to satisfy comparator sets if at least one
-comparator with the same `[major, minor, patch]` tuple also has a
-prerelease tag.
-
-For example, the range `>1.2.3-alpha.3` would be allowed to match the
-version `1.2.3-alpha.7`, but it would *not* be satisfied by
-`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater
-than" `1.2.3-alpha.3` according to the SemVer sort rules.  The version
-range only accepts prerelease tags on the `1.2.3` version.  The
-version `3.4.5` *would* satisfy the range, because it does not have a
-prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`.
-
-The purpose for this behavior is twofold.  First, prerelease versions
-frequently are updated very quickly, and contain many breaking changes
-that are (by the author's design) not yet fit for public consumption.
-Therefore, by default, they are excluded from range matching
-semantics.
-
-Second, a user who has opted into using a prerelease version has
-clearly indicated the intent to use *that specific* set of
-alpha/beta/rc versions.  By including a prerelease tag in the range,
-the user is indicating that they are aware of the risk.  However, it
-is still not appropriate to assume that they have opted into taking a
-similar risk on the *next* set of prerelease versions.
-
-#### Prerelease Identifiers
-
-The method `.inc` takes an additional `identifier` string argument that
-will append the value of the string as a prerelease identifier:
-
-```javascript
-semver.inc('1.2.3', 'prerelease', 'beta')
-// '1.2.4-beta.0'
-```
-
-command-line example:
-
-```bash
-$ semver 1.2.3 -i prerelease --preid beta
-1.2.4-beta.0
-```
-
-Which then can be used to increment further:
-
-```bash
-$ semver 1.2.4-beta.0 -i prerelease
-1.2.4-beta.1
-```
-
-### Advanced Range Syntax
-
-Advanced range syntax desugars to primitive comparators in
-deterministic ways.
-
-Advanced ranges may be combined in the same way as primitive
-comparators using white space or `||`.
-
-#### Hyphen Ranges `X.Y.Z - A.B.C`
-
-Specifies an inclusive set.
-
-* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`
-
-If a partial version is provided as the first version in the inclusive
-range, then the missing pieces are replaced with zeroes.
-
-* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4`
-
-If a partial version is provided as the second version in the
-inclusive range, then all versions that start with the supplied parts
-of the tuple are accepted, but nothing that would be greater than the
-provided tuple parts.
-
-* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0`
-* `1.2.3 - 2` := `>=1.2.3 <3.0.0`
-
-#### X-Ranges `1.2.x` `1.X` `1.2.*` `*`
-
-Any of `X`, `x`, or `*` may be used to "stand in" for one of the
-numeric values in the `[major, minor, patch]` tuple.
-
-* `*` := `>=0.0.0` (Any version satisfies)
-* `1.x` := `>=1.0.0 <2.0.0` (Matching major version)
-* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions)
-
-A partial version range is treated as an X-Range, so the special
-character is in fact optional.
-
-* `""` (empty string) := `*` := `>=0.0.0`
-* `1` := `1.x.x` := `>=1.0.0 <2.0.0`
-* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0`
-
-#### Tilde Ranges `~1.2.3` `~1.2` `~1`
-
-Allows patch-level changes if a minor version is specified on the
-comparator.  Allows minor-level changes if not.
-
-* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0`
-* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`)
-* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`)
-* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0`
-* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`)
-* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`)
-* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in
-  the `1.2.3` version will be allowed, if they are greater than or
-  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but
-  `1.2.4-beta.2` would not, because it is a prerelease of a
-  different `[major, minor, patch]` tuple.
-
-#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4`
-
-Allows changes that do not modify the left-most non-zero digit in the
-`[major, minor, patch]` tuple.  In other words, this allows patch and
-minor updates for versions `1.0.0` and above, patch updates for
-versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`.
-
-Many authors treat a `0.x` version as if the `x` were the major
-"breaking-change" indicator.
-
-Caret ranges are ideal when an author may make breaking changes
-between `0.2.4` and `0.3.0` releases, which is a common practice.
-However, it presumes that there will *not* be breaking changes between
-`0.2.4` and `0.2.5`.  It allows for changes that are presumed to be
-additive (but non-breaking), according to commonly observed practices.
-
-* `^1.2.3` := `>=1.2.3 <2.0.0`
-* `^0.2.3` := `>=0.2.3 <0.3.0`
-* `^0.0.3` := `>=0.0.3 <0.0.4`
-* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in
-  the `1.2.3` version will be allowed, if they are greater than or
-  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but
-  `1.2.4-beta.2` would not, because it is a prerelease of a
-  different `[major, minor, patch]` tuple.
-* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4`  Note that prereleases in the
-  `0.0.3` version *only* will be allowed, if they are greater than or
-  equal to `beta`.  So, `0.0.3-pr.2` would be allowed.
-
-When parsing caret ranges, a missing `patch` value desugars to the
-number `0`, but will allow flexibility within that value, even if the
-major and minor versions are both `0`.
-
-* `^1.2.x` := `>=1.2.0 <2.0.0`
-* `^0.0.x` := `>=0.0.0 <0.1.0`
-* `^0.0` := `>=0.0.0 <0.1.0`
-
-A missing `minor` and `patch` values will desugar to zero, but also
-allow flexibility within those values, even if the major version is
-zero.
-
-* `^1.x` := `>=1.0.0 <2.0.0`
-* `^0.x` := `>=0.0.0 <1.0.0`
-
-### Range Grammar
-
-Putting all this together, here is a Backus-Naur grammar for ranges,
-for the benefit of parser authors:
-
-```bnf
-range-set  ::= range ( logical-or range ) *
-logical-or ::= ( ' ' ) * '||' ( ' ' ) *
-range      ::= hyphen | simple ( ' ' simple ) * | ''
-hyphen     ::= partial ' - ' partial
-simple     ::= primitive | partial | tilde | caret
-primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' | ) partial
-partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
-xr         ::= 'x' | 'X' | '*' | nr
-nr         ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
-tilde      ::= '~' partial
-caret      ::= '^' partial
-qualifier  ::= ( '-' pre )? ( '+' build )?
-pre        ::= parts
-build      ::= parts
-parts      ::= part ( '.' part ) *
-part       ::= nr | [-0-9A-Za-z]+
-```
-
-## Functions
-
-All methods and classes take a final `loose` boolean argument that, if
-true, will be more forgiving about not-quite-valid semver strings.
-The resulting output will always be 100% strict, of course.
-
-Strict-mode Comparators and Ranges will be strict about the SemVer
-strings that they parse.
-
-* `valid(v)`: Return the parsed version, or null if it's not valid.
-* `inc(v, release)`: Return the version incremented by the release
-  type (`major`,   `premajor`, `minor`, `preminor`, `patch`,
-  `prepatch`, or `prerelease`), or null if it's not valid
-  * `premajor` in one call will bump the version up to the next major
-    version and down to a prerelease of that major version.
-    `preminor`, and `prepatch` work the same way.
-  * If called from a non-prerelease version, the `prerelease` will work the
-    same as `prepatch`. It increments the patch version, then makes a
-    prerelease. If the input version is already a prerelease it simply
-    increments it.
-* `prerelease(v)`: Returns an array of prerelease components, or null
-  if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]`
-* `major(v)`: Return the major version number.
-* `minor(v)`: Return the minor version number.
-* `patch(v)`: Return the patch version number.
-* `intersects(r1, r2, loose)`: Return true if the two supplied ranges
-  or comparators intersect.
-
-### Comparison
-
-* `gt(v1, v2)`: `v1 > v2`
-* `gte(v1, v2)`: `v1 >= v2`
-* `lt(v1, v2)`: `v1 < v2`
-* `lte(v1, v2)`: `v1 <= v2`
-* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,
-  even if they're not the exact same string.  You already know how to
-  compare strings.
-* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.
-* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call
-  the corresponding function above.  `"==="` and `"!=="` do simple
-  string comparison, but are included for completeness.  Throws if an
-  invalid comparison string is provided.
-* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if
-  `v2` is greater.  Sorts in ascending order if passed to `Array.sort()`.
-* `rcompare(v1, v2)`: The reverse of compare.  Sorts an array of versions
-  in descending order when passed to `Array.sort()`.
-* `diff(v1, v2)`: Returns difference between two versions by the release type
-  (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`),
-  or null if the versions are the same.
-
-### Comparators
-
-* `intersects(comparator)`: Return true if the comparators intersect
-
-### Ranges
-
-* `validRange(range)`: Return the valid range or null if it's not valid
-* `satisfies(version, range)`: Return true if the version satisfies the
-  range.
-* `maxSatisfying(versions, range)`: Return the highest version in the list
-  that satisfies the range, or `null` if none of them do.
-* `minSatisfying(versions, range)`: Return the lowest version in the list
-  that satisfies the range, or `null` if none of them do.
-* `gtr(version, range)`: Return `true` if version is greater than all the
-  versions possible in the range.
-* `ltr(version, range)`: Return `true` if version is less than all the
-  versions possible in the range.
-* `outside(version, range, hilo)`: Return true if the version is outside
-  the bounds of the range in either the high or low direction.  The
-  `hilo` argument must be either the string `'>'` or `'<'`.  (This is
-  the function called by `gtr` and `ltr`.)
-* `intersects(range)`: Return true if any of the ranges comparators intersect
-
-Note that, since ranges may be non-contiguous, a version might not be
-greater than a range, less than a range, *or* satisfy a range!  For
-example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`
-until `2.0.0`, so the version `1.2.10` would not be greater than the
-range (because `2.0.1` satisfies, which is higher), nor less than the
-range (since `1.2.8` satisfies, which is lower), and it also does not
-satisfy the range.
-
-If you want to know if a version satisfies or does not satisfy a
-range, use the `satisfies(version, range)` function.
-
-### Coercion
-
-* `coerce(version)`: Coerces a string to semver if possible
-
-This aims to provide a very forgiving translation of a non-semver
-string to semver. It looks for the first digit in a string, and
-consumes all remaining characters which satisfy at least a partial semver
-(e.g., `1`, `1.2`, `1.2.3`) up to the max permitted length (256 characters).
-Longer versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`).
-All surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes `3.4.0`).
-Only text which lacks digits will fail coercion (`version one` is not valid).
-The maximum  length for any semver component considered for coercion is 16 characters;
-longer components will be ignored (`10000000000000000.4.7.4` becomes `4.7.4`).
-The maximum value for any semver component is `Integer.MAX_SAFE_INTEGER || (2**53 - 1)`;
-higher value components are invalid (`9999999999999999.4.7.4` is likely invalid).
diff --git a/node_modules/semver/bin/semver b/node_modules/semver/bin/semver
deleted file mode 100755
index dddbcdf..0000000
--- a/node_modules/semver/bin/semver
+++ /dev/null
@@ -1,143 +0,0 @@
-#!/usr/bin/env node
-// Standalone semver comparison program.
-// Exits successfully and prints matching version(s) if
-// any supplied version is valid and passes all tests.
-
-var argv = process.argv.slice(2)
-  , versions = []
-  , range = []
-  , gt = []
-  , lt = []
-  , eq = []
-  , inc = null
-  , version = require("../package.json").version
-  , loose = false
-  , coerce = false
-  , identifier = undefined
-  , semver = require("../semver")
-  , reverse = false
-
-main()
-
-function main () {
-  if (!argv.length) return help()
-  while (argv.length) {
-    var a = argv.shift()
-    var i = a.indexOf('=')
-    if (i !== -1) {
-      a = a.slice(0, i)
-      argv.unshift(a.slice(i + 1))
-    }
-    switch (a) {
-      case "-rv": case "-rev": case "--rev": case "--reverse":
-        reverse = true
-        break
-      case "-l": case "--loose":
-        loose = true
-        break
-      case "-v": case "--version":
-        versions.push(argv.shift())
-        break
-      case "-i": case "--inc": case "--increment":
-        switch (argv[0]) {
-          case "major": case "minor": case "patch": case "prerelease":
-          case "premajor": case "preminor": case "prepatch":
-            inc = argv.shift()
-            break
-          default:
-            inc = "patch"
-            break
-        }
-        break
-      case "--preid":
-        identifier = argv.shift()
-        break
-      case "-r": case "--range":
-        range.push(argv.shift())
-        break
-      case "-c": case "--coerce":
-        coerce = true
-        break
-      case "-h": case "--help": case "-?":
-        return help()
-      default:
-        versions.push(a)
-        break
-    }
-  }
-
-  versions = versions.map(function (v) {
-    return coerce ? (semver.coerce(v) || {version: v}).version : v
-  }).filter(function (v) {
-    return semver.valid(v)
-  })
-  if (!versions.length) return fail()
-  if (inc && (versions.length !== 1 || range.length))
-    return failInc()
-
-  for (var i = 0, l = range.length; i < l ; i ++) {
-    versions = versions.filter(function (v) {
-      return semver.satisfies(v, range[i], loose)
-    })
-    if (!versions.length) return fail()
-  }
-  return success(versions)
-}
-
-function failInc () {
-  console.error("--inc can only be used on a single version with no range")
-  fail()
-}
-
-function fail () { process.exit(1) }
-
-function success () {
-  var compare = reverse ? "rcompare" : "compare"
-  versions.sort(function (a, b) {
-    return semver[compare](a, b, loose)
-  }).map(function (v) {
-    return semver.clean(v, loose)
-  }).map(function (v) {
-    return inc ? semver.inc(v, inc, loose, identifier) : v
-  }).forEach(function (v,i,_) { console.log(v) })
-}
-
-function help () {
-  console.log(["SemVer " + version
-              ,""
-              ,"A JavaScript implementation of the http://semver.org/ specification"
-              ,"Copyright Isaac Z. Schlueter"
-              ,""
-              ,"Usage: semver [options] <version> [<version> [...]]"
-              ,"Prints valid versions sorted by SemVer precedence"
-              ,""
-              ,"Options:"
-              ,"-r --range <range>"
-              ,"        Print versions that match the specified range."
-              ,""
-              ,"-i --increment [<level>]"
-              ,"        Increment a version by the specified level.  Level can"
-              ,"        be one of: major, minor, patch, premajor, preminor,"
-              ,"        prepatch, or prerelease.  Default level is 'patch'."
-              ,"        Only one version may be specified."
-              ,""
-              ,"--preid <identifier>"
-              ,"        Identifier to be used to prefix premajor, preminor,"
-              ,"        prepatch or prerelease version increments."
-              ,""
-              ,"-l --loose"
-              ,"        Interpret versions and ranges loosely"
-              ,""
-              ,"-c --coerce"
-              ,"        Coerce a string into SemVer if possible"
-              ,"        (does not imply --loose)"
-              ,""
-              ,"Program exits successfully if any valid version satisfies"
-              ,"all supplied ranges, and prints all satisfying versions."
-              ,""
-              ,"If no satisfying versions are found, then exits failure."
-              ,""
-              ,"Versions are printed in ascending order, so supplying"
-              ,"multiple versions to the utility will just sort them."
-              ].join("\n"))
-}
diff --git a/node_modules/semver/package.json b/node_modules/semver/package.json
deleted file mode 100644
index d3df841..0000000
--- a/node_modules/semver/package.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-  "_args": [
-    [
-      "semver@5.5.0",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "semver@5.5.0",
-  "_id": "semver@5.5.0",
-  "_inBundle": false,
-  "_integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
-  "_location": "/semver",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "semver@5.5.0",
-    "name": "semver",
-    "escapedName": "semver",
-    "rawSpec": "5.5.0",
-    "saveSpec": null,
-    "fetchSpec": "5.5.0"
-  },
-  "_requiredBy": [
-    "/",
-    "/cordova-common",
-    "/eslint",
-    "/normalize-package-data"
-  ],
-  "_resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
-  "_spec": "5.5.0",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "bin": {
-    "semver": "./bin/semver"
-  },
-  "bugs": {
-    "url": "https://github.com/npm/node-semver/issues"
-  },
-  "description": "The semantic version parser used by npm.",
-  "devDependencies": {
-    "tap": "^10.7.0"
-  },
-  "files": [
-    "bin",
-    "range.bnf",
-    "semver.js"
-  ],
-  "homepage": "https://github.com/npm/node-semver#readme",
-  "license": "ISC",
-  "main": "semver.js",
-  "name": "semver",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/node-semver.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js --cov -J"
-  },
-  "version": "5.5.0"
-}
diff --git a/node_modules/semver/range.bnf b/node_modules/semver/range.bnf
deleted file mode 100644
index d4c6ae0..0000000
--- a/node_modules/semver/range.bnf
+++ /dev/null
@@ -1,16 +0,0 @@
-range-set  ::= range ( logical-or range ) *
-logical-or ::= ( ' ' ) * '||' ( ' ' ) *
-range      ::= hyphen | simple ( ' ' simple ) * | ''
-hyphen     ::= partial ' - ' partial
-simple     ::= primitive | partial | tilde | caret
-primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial
-partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
-xr         ::= 'x' | 'X' | '*' | nr
-nr         ::= '0' | [1-9] ( [0-9] ) *
-tilde      ::= '~' partial
-caret      ::= '^' partial
-qualifier  ::= ( '-' pre )? ( '+' build )?
-pre        ::= parts
-build      ::= parts
-parts      ::= part ( '.' part ) *
-part       ::= nr | [-0-9A-Za-z]+
diff --git a/node_modules/semver/semver.js b/node_modules/semver/semver.js
deleted file mode 100644
index 9cf9f6e..0000000
--- a/node_modules/semver/semver.js
+++ /dev/null
@@ -1,1324 +0,0 @@
-exports = module.exports = SemVer;
-
-// The debug function is excluded entirely from the minified version.
-/* nomin */ var debug;
-/* nomin */ if (typeof process === 'object' &&
-    /* nomin */ process.env &&
-    /* nomin */ process.env.NODE_DEBUG &&
-    /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG))
-  /* nomin */ debug = function() {
-    /* nomin */ var args = Array.prototype.slice.call(arguments, 0);
-    /* nomin */ args.unshift('SEMVER');
-    /* nomin */ console.log.apply(console, args);
-    /* nomin */ };
-/* nomin */ else
-  /* nomin */ debug = function() {};
-
-// Note: this is the semver.org version of the spec that it implements
-// Not necessarily the package version of this code.
-exports.SEMVER_SPEC_VERSION = '2.0.0';
-
-var MAX_LENGTH = 256;
-var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
-
-// Max safe segment length for coercion.
-var MAX_SAFE_COMPONENT_LENGTH = 16;
-
-// The actual regexps go on exports.re
-var re = exports.re = [];
-var src = exports.src = [];
-var R = 0;
-
-// The following Regular Expressions can be used for tokenizing,
-// validating, and parsing SemVer version strings.
-
-// ## Numeric Identifier
-// A single `0`, or a non-zero digit followed by zero or more digits.
-
-var NUMERICIDENTIFIER = R++;
-src[NUMERICIDENTIFIER] = '0|[1-9]\\d*';
-var NUMERICIDENTIFIERLOOSE = R++;
-src[NUMERICIDENTIFIERLOOSE] = '[0-9]+';
-
-
-// ## Non-numeric Identifier
-// Zero or more digits, followed by a letter or hyphen, and then zero or
-// more letters, digits, or hyphens.
-
-var NONNUMERICIDENTIFIER = R++;
-src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*';
-
-
-// ## Main Version
-// Three dot-separated numeric identifiers.
-
-var MAINVERSION = R++;
-src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
-                   '(' + src[NUMERICIDENTIFIER] + ')\\.' +
-                   '(' + src[NUMERICIDENTIFIER] + ')';
-
-var MAINVERSIONLOOSE = R++;
-src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
-                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
-                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')';
-
-// ## Pre-release Version Identifier
-// A numeric identifier, or a non-numeric identifier.
-
-var PRERELEASEIDENTIFIER = R++;
-src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
-                            '|' + src[NONNUMERICIDENTIFIER] + ')';
-
-var PRERELEASEIDENTIFIERLOOSE = R++;
-src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
-                                 '|' + src[NONNUMERICIDENTIFIER] + ')';
-
-
-// ## Pre-release Version
-// Hyphen, followed by one or more dot-separated pre-release version
-// identifiers.
-
-var PRERELEASE = R++;
-src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
-                  '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))';
-
-var PRERELEASELOOSE = R++;
-src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
-                       '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))';
-
-// ## Build Metadata Identifier
-// Any combination of digits, letters, or hyphens.
-
-var BUILDIDENTIFIER = R++;
-src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+';
-
-// ## Build Metadata
-// Plus sign, followed by one or more period-separated build metadata
-// identifiers.
-
-var BUILD = R++;
-src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
-             '(?:\\.' + src[BUILDIDENTIFIER] + ')*))';
-
-
-// ## Full Version String
-// A main version, followed optionally by a pre-release version and
-// build metadata.
-
-// Note that the only major, minor, patch, and pre-release sections of
-// the version string are capturing groups.  The build metadata is not a
-// capturing group, because it should not ever be used in version
-// comparison.
-
-var FULL = R++;
-var FULLPLAIN = 'v?' + src[MAINVERSION] +
-                src[PRERELEASE] + '?' +
-                src[BUILD] + '?';
-
-src[FULL] = '^' + FULLPLAIN + '$';
-
-// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
-// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
-// common in the npm registry.
-var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
-                 src[PRERELEASELOOSE] + '?' +
-                 src[BUILD] + '?';
-
-var LOOSE = R++;
-src[LOOSE] = '^' + LOOSEPLAIN + '$';
-
-var GTLT = R++;
-src[GTLT] = '((?:<|>)?=?)';
-
-// Something like "2.*" or "1.2.x".
-// Note that "x.x" is a valid xRange identifer, meaning "any version"
-// Only the first item is strictly required.
-var XRANGEIDENTIFIERLOOSE = R++;
-src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*';
-var XRANGEIDENTIFIER = R++;
-src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*';
-
-var XRANGEPLAIN = R++;
-src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
-                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
-                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
-                   '(?:' + src[PRERELEASE] + ')?' +
-                   src[BUILD] + '?' +
-                   ')?)?';
-
-var XRANGEPLAINLOOSE = R++;
-src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
-                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
-                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
-                        '(?:' + src[PRERELEASELOOSE] + ')?' +
-                        src[BUILD] + '?' +
-                        ')?)?';
-
-var XRANGE = R++;
-src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$';
-var XRANGELOOSE = R++;
-src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$';
-
-// Coercion.
-// Extract anything that could conceivably be a part of a valid semver
-var COERCE = R++;
-src[COERCE] = '(?:^|[^\\d])' +
-              '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
-              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
-              '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
-              '(?:$|[^\\d])';
-
-// Tilde ranges.
-// Meaning is "reasonably at or greater than"
-var LONETILDE = R++;
-src[LONETILDE] = '(?:~>?)';
-
-var TILDETRIM = R++;
-src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+';
-re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g');
-var tildeTrimReplace = '$1~';
-
-var TILDE = R++;
-src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$';
-var TILDELOOSE = R++;
-src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$';
-
-// Caret ranges.
-// Meaning is "at least and backwards compatible with"
-var LONECARET = R++;
-src[LONECARET] = '(?:\\^)';
-
-var CARETTRIM = R++;
-src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+';
-re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g');
-var caretTrimReplace = '$1^';
-
-var CARET = R++;
-src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$';
-var CARETLOOSE = R++;
-src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$';
-
-// A simple gt/lt/eq thing, or just "" to indicate "any version"
-var COMPARATORLOOSE = R++;
-src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$';
-var COMPARATOR = R++;
-src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$';
-
-
-// An expression to strip any whitespace between the gtlt and the thing
-// it modifies, so that `> 1.2.3` ==> `>1.2.3`
-var COMPARATORTRIM = R++;
-src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
-                      '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')';
-
-// this one has to use the /g flag
-re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g');
-var comparatorTrimReplace = '$1$2$3';
-
-
-// Something like `1.2.3 - 1.2.4`
-// Note that these all use the loose form, because they'll be
-// checked against either the strict or loose comparator form
-// later.
-var HYPHENRANGE = R++;
-src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
-                   '\\s+-\\s+' +
-                   '(' + src[XRANGEPLAIN] + ')' +
-                   '\\s*$';
-
-var HYPHENRANGELOOSE = R++;
-src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
-                        '\\s+-\\s+' +
-                        '(' + src[XRANGEPLAINLOOSE] + ')' +
-                        '\\s*$';
-
-// Star ranges basically just allow anything at all.
-var STAR = R++;
-src[STAR] = '(<|>)?=?\\s*\\*';
-
-// Compile to actual regexp objects.
-// All are flag-free, unless they were created above with a flag.
-for (var i = 0; i < R; i++) {
-  debug(i, src[i]);
-  if (!re[i])
-    re[i] = new RegExp(src[i]);
-}
-
-exports.parse = parse;
-function parse(version, loose) {
-  if (version instanceof SemVer)
-    return version;
-
-  if (typeof version !== 'string')
-    return null;
-
-  if (version.length > MAX_LENGTH)
-    return null;
-
-  var r = loose ? re[LOOSE] : re[FULL];
-  if (!r.test(version))
-    return null;
-
-  try {
-    return new SemVer(version, loose);
-  } catch (er) {
-    return null;
-  }
-}
-
-exports.valid = valid;
-function valid(version, loose) {
-  var v = parse(version, loose);
-  return v ? v.version : null;
-}
-
-
-exports.clean = clean;
-function clean(version, loose) {
-  var s = parse(version.trim().replace(/^[=v]+/, ''), loose);
-  return s ? s.version : null;
-}
-
-exports.SemVer = SemVer;
-
-function SemVer(version, loose) {
-  if (version instanceof SemVer) {
-    if (version.loose === loose)
-      return version;
-    else
-      version = version.version;
-  } else if (typeof version !== 'string') {
-    throw new TypeError('Invalid Version: ' + version);
-  }
-
-  if (version.length > MAX_LENGTH)
-    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
-
-  if (!(this instanceof SemVer))
-    return new SemVer(version, loose);
-
-  debug('SemVer', version, loose);
-  this.loose = loose;
-  var m = version.trim().match(loose ? re[LOOSE] : re[FULL]);
-
-  if (!m)
-    throw new TypeError('Invalid Version: ' + version);
-
-  this.raw = version;
-
-  // these are actually numbers
-  this.major = +m[1];
-  this.minor = +m[2];
-  this.patch = +m[3];
-
-  if (this.major > MAX_SAFE_INTEGER || this.major < 0)
-    throw new TypeError('Invalid major version')
-
-  if (this.minor > MAX_SAFE_INTEGER || this.minor < 0)
-    throw new TypeError('Invalid minor version')
-
-  if (this.patch > MAX_SAFE_INTEGER || this.patch < 0)
-    throw new TypeError('Invalid patch version')
-
-  // numberify any prerelease numeric ids
-  if (!m[4])
-    this.prerelease = [];
-  else
-    this.prerelease = m[4].split('.').map(function(id) {
-      if (/^[0-9]+$/.test(id)) {
-        var num = +id;
-        if (num >= 0 && num < MAX_SAFE_INTEGER)
-          return num;
-      }
-      return id;
-    });
-
-  this.build = m[5] ? m[5].split('.') : [];
-  this.format();
-}
-
-SemVer.prototype.format = function() {
-  this.version = this.major + '.' + this.minor + '.' + this.patch;
-  if (this.prerelease.length)
-    this.version += '-' + this.prerelease.join('.');
-  return this.version;
-};
-
-SemVer.prototype.toString = function() {
-  return this.version;
-};
-
-SemVer.prototype.compare = function(other) {
-  debug('SemVer.compare', this.version, this.loose, other);
-  if (!(other instanceof SemVer))
-    other = new SemVer(other, this.loose);
-
-  return this.compareMain(other) || this.comparePre(other);
-};
-
-SemVer.prototype.compareMain = function(other) {
-  if (!(other instanceof SemVer))
-    other = new SemVer(other, this.loose);
-
-  return compareIdentifiers(this.major, other.major) ||
-         compareIdentifiers(this.minor, other.minor) ||
-         compareIdentifiers(this.patch, other.patch);
-};
-
-SemVer.prototype.comparePre = function(other) {
-  if (!(other instanceof SemVer))
-    other = new SemVer(other, this.loose);
-
-  // NOT having a prerelease is > having one
-  if (this.prerelease.length && !other.prerelease.length)
-    return -1;
-  else if (!this.prerelease.length && other.prerelease.length)
-    return 1;
-  else if (!this.prerelease.length && !other.prerelease.length)
-    return 0;
-
-  var i = 0;
-  do {
-    var a = this.prerelease[i];
-    var b = other.prerelease[i];
-    debug('prerelease compare', i, a, b);
-    if (a === undefined && b === undefined)
-      return 0;
-    else if (b === undefined)
-      return 1;
-    else if (a === undefined)
-      return -1;
-    else if (a === b)
-      continue;
-    else
-      return compareIdentifiers(a, b);
-  } while (++i);
-};
-
-// preminor will bump the version up to the next minor release, and immediately
-// down to pre-release. premajor and prepatch work the same way.
-SemVer.prototype.inc = function(release, identifier) {
-  switch (release) {
-    case 'premajor':
-      this.prerelease.length = 0;
-      this.patch = 0;
-      this.minor = 0;
-      this.major++;
-      this.inc('pre', identifier);
-      break;
-    case 'preminor':
-      this.prerelease.length = 0;
-      this.patch = 0;
-      this.minor++;
-      this.inc('pre', identifier);
-      break;
-    case 'prepatch':
-      // If this is already a prerelease, it will bump to the next version
-      // drop any prereleases that might already exist, since they are not
-      // relevant at this point.
-      this.prerelease.length = 0;
-      this.inc('patch', identifier);
-      this.inc('pre', identifier);
-      break;
-    // If the input is a non-prerelease version, this acts the same as
-    // prepatch.
-    case 'prerelease':
-      if (this.prerelease.length === 0)
-        this.inc('patch', identifier);
-      this.inc('pre', identifier);
-      break;
-
-    case 'major':
-      // If this is a pre-major version, bump up to the same major version.
-      // Otherwise increment major.
-      // 1.0.0-5 bumps to 1.0.0
-      // 1.1.0 bumps to 2.0.0
-      if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0)
-        this.major++;
-      this.minor = 0;
-      this.patch = 0;
-      this.prerelease = [];
-      break;
-    case 'minor':
-      // If this is a pre-minor version, bump up to the same minor version.
-      // Otherwise increment minor.
-      // 1.2.0-5 bumps to 1.2.0
-      // 1.2.1 bumps to 1.3.0
-      if (this.patch !== 0 || this.prerelease.length === 0)
-        this.minor++;
-      this.patch = 0;
-      this.prerelease = [];
-      break;
-    case 'patch':
-      // If this is not a pre-release version, it will increment the patch.
-      // If it is a pre-release it will bump up to the same patch version.
-      // 1.2.0-5 patches to 1.2.0
-      // 1.2.0 patches to 1.2.1
-      if (this.prerelease.length === 0)
-        this.patch++;
-      this.prerelease = [];
-      break;
-    // This probably shouldn't be used publicly.
-    // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
-    case 'pre':
-      if (this.prerelease.length === 0)
-        this.prerelease = [0];
-      else {
-        var i = this.prerelease.length;
-        while (--i >= 0) {
-          if (typeof this.prerelease[i] === 'number') {
-            this.prerelease[i]++;
-            i = -2;
-          }
-        }
-        if (i === -1) // didn't increment anything
-          this.prerelease.push(0);
-      }
-      if (identifier) {
-        // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
-        // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
-        if (this.prerelease[0] === identifier) {
-          if (isNaN(this.prerelease[1]))
-            this.prerelease = [identifier, 0];
-        } else
-          this.prerelease = [identifier, 0];
-      }
-      break;
-
-    default:
-      throw new Error('invalid increment argument: ' + release);
-  }
-  this.format();
-  this.raw = this.version;
-  return this;
-};
-
-exports.inc = inc;
-function inc(version, release, loose, identifier) {
-  if (typeof(loose) === 'string') {
-    identifier = loose;
-    loose = undefined;
-  }
-
-  try {
-    return new SemVer(version, loose).inc(release, identifier).version;
-  } catch (er) {
-    return null;
-  }
-}
-
-exports.diff = diff;
-function diff(version1, version2) {
-  if (eq(version1, version2)) {
-    return null;
-  } else {
-    var v1 = parse(version1);
-    var v2 = parse(version2);
-    if (v1.prerelease.length || v2.prerelease.length) {
-      for (var key in v1) {
-        if (key === 'major' || key === 'minor' || key === 'patch') {
-          if (v1[key] !== v2[key]) {
-            return 'pre'+key;
-          }
-        }
-      }
-      return 'prerelease';
-    }
-    for (var key in v1) {
-      if (key === 'major' || key === 'minor' || key === 'patch') {
-        if (v1[key] !== v2[key]) {
-          return key;
-        }
-      }
-    }
-  }
-}
-
-exports.compareIdentifiers = compareIdentifiers;
-
-var numeric = /^[0-9]+$/;
-function compareIdentifiers(a, b) {
-  var anum = numeric.test(a);
-  var bnum = numeric.test(b);
-
-  if (anum && bnum) {
-    a = +a;
-    b = +b;
-  }
-
-  return (anum && !bnum) ? -1 :
-         (bnum && !anum) ? 1 :
-         a < b ? -1 :
-         a > b ? 1 :
-         0;
-}
-
-exports.rcompareIdentifiers = rcompareIdentifiers;
-function rcompareIdentifiers(a, b) {
-  return compareIdentifiers(b, a);
-}
-
-exports.major = major;
-function major(a, loose) {
-  return new SemVer(a, loose).major;
-}
-
-exports.minor = minor;
-function minor(a, loose) {
-  return new SemVer(a, loose).minor;
-}
-
-exports.patch = patch;
-function patch(a, loose) {
-  return new SemVer(a, loose).patch;
-}
-
-exports.compare = compare;
-function compare(a, b, loose) {
-  return new SemVer(a, loose).compare(new SemVer(b, loose));
-}
-
-exports.compareLoose = compareLoose;
-function compareLoose(a, b) {
-  return compare(a, b, true);
-}
-
-exports.rcompare = rcompare;
-function rcompare(a, b, loose) {
-  return compare(b, a, loose);
-}
-
-exports.sort = sort;
-function sort(list, loose) {
-  return list.sort(function(a, b) {
-    return exports.compare(a, b, loose);
-  });
-}
-
-exports.rsort = rsort;
-function rsort(list, loose) {
-  return list.sort(function(a, b) {
-    return exports.rcompare(a, b, loose);
-  });
-}
-
-exports.gt = gt;
-function gt(a, b, loose) {
-  return compare(a, b, loose) > 0;
-}
-
-exports.lt = lt;
-function lt(a, b, loose) {
-  return compare(a, b, loose) < 0;
-}
-
-exports.eq = eq;
-function eq(a, b, loose) {
-  return compare(a, b, loose) === 0;
-}
-
-exports.neq = neq;
-function neq(a, b, loose) {
-  return compare(a, b, loose) !== 0;
-}
-
-exports.gte = gte;
-function gte(a, b, loose) {
-  return compare(a, b, loose) >= 0;
-}
-
-exports.lte = lte;
-function lte(a, b, loose) {
-  return compare(a, b, loose) <= 0;
-}
-
-exports.cmp = cmp;
-function cmp(a, op, b, loose) {
-  var ret;
-  switch (op) {
-    case '===':
-      if (typeof a === 'object') a = a.version;
-      if (typeof b === 'object') b = b.version;
-      ret = a === b;
-      break;
-    case '!==':
-      if (typeof a === 'object') a = a.version;
-      if (typeof b === 'object') b = b.version;
-      ret = a !== b;
-      break;
-    case '': case '=': case '==': ret = eq(a, b, loose); break;
-    case '!=': ret = neq(a, b, loose); break;
-    case '>': ret = gt(a, b, loose); break;
-    case '>=': ret = gte(a, b, loose); break;
-    case '<': ret = lt(a, b, loose); break;
-    case '<=': ret = lte(a, b, loose); break;
-    default: throw new TypeError('Invalid operator: ' + op);
-  }
-  return ret;
-}
-
-exports.Comparator = Comparator;
-function Comparator(comp, loose) {
-  if (comp instanceof Comparator) {
-    if (comp.loose === loose)
-      return comp;
-    else
-      comp = comp.value;
-  }
-
-  if (!(this instanceof Comparator))
-    return new Comparator(comp, loose);
-
-  debug('comparator', comp, loose);
-  this.loose = loose;
-  this.parse(comp);
-
-  if (this.semver === ANY)
-    this.value = '';
-  else
-    this.value = this.operator + this.semver.version;
-
-  debug('comp', this);
-}
-
-var ANY = {};
-Comparator.prototype.parse = function(comp) {
-  var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
-  var m = comp.match(r);
-
-  if (!m)
-    throw new TypeError('Invalid comparator: ' + comp);
-
-  this.operator = m[1];
-  if (this.operator === '=')
-    this.operator = '';
-
-  // if it literally is just '>' or '' then allow anything.
-  if (!m[2])
-    this.semver = ANY;
-  else
-    this.semver = new SemVer(m[2], this.loose);
-};
-
-Comparator.prototype.toString = function() {
-  return this.value;
-};
-
-Comparator.prototype.test = function(version) {
-  debug('Comparator.test', version, this.loose);
-
-  if (this.semver === ANY)
-    return true;
-
-  if (typeof version === 'string')
-    version = new SemVer(version, this.loose);
-
-  return cmp(version, this.operator, this.semver, this.loose);
-};
-
-Comparator.prototype.intersects = function(comp, loose) {
-  if (!(comp instanceof Comparator)) {
-    throw new TypeError('a Comparator is required');
-  }
-
-  var rangeTmp;
-
-  if (this.operator === '') {
-    rangeTmp = new Range(comp.value, loose);
-    return satisfies(this.value, rangeTmp, loose);
-  } else if (comp.operator === '') {
-    rangeTmp = new Range(this.value, loose);
-    return satisfies(comp.semver, rangeTmp, loose);
-  }
-
-  var sameDirectionIncreasing =
-    (this.operator === '>=' || this.operator === '>') &&
-    (comp.operator === '>=' || comp.operator === '>');
-  var sameDirectionDecreasing =
-    (this.operator === '<=' || this.operator === '<') &&
-    (comp.operator === '<=' || comp.operator === '<');
-  var sameSemVer = this.semver.version === comp.semver.version;
-  var differentDirectionsInclusive =
-    (this.operator === '>=' || this.operator === '<=') &&
-    (comp.operator === '>=' || comp.operator === '<=');
-  var oppositeDirectionsLessThan =
-    cmp(this.semver, '<', comp.semver, loose) &&
-    ((this.operator === '>=' || this.operator === '>') &&
-    (comp.operator === '<=' || comp.operator === '<'));
-  var oppositeDirectionsGreaterThan =
-    cmp(this.semver, '>', comp.semver, loose) &&
-    ((this.operator === '<=' || this.operator === '<') &&
-    (comp.operator === '>=' || comp.operator === '>'));
-
-  return sameDirectionIncreasing || sameDirectionDecreasing ||
-    (sameSemVer && differentDirectionsInclusive) ||
-    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan;
-};
-
-
-exports.Range = Range;
-function Range(range, loose) {
-  if (range instanceof Range) {
-    if (range.loose === loose) {
-      return range;
-    } else {
-      return new Range(range.raw, loose);
-    }
-  }
-
-  if (range instanceof Comparator) {
-    return new Range(range.value, loose);
-  }
-
-  if (!(this instanceof Range))
-    return new Range(range, loose);
-
-  this.loose = loose;
-
-  // First, split based on boolean or ||
-  this.raw = range;
-  this.set = range.split(/\s*\|\|\s*/).map(function(range) {
-    return this.parseRange(range.trim());
-  }, this).filter(function(c) {
-    // throw out any that are not relevant for whatever reason
-    return c.length;
-  });
-
-  if (!this.set.length) {
-    throw new TypeError('Invalid SemVer Range: ' + range);
-  }
-
-  this.format();
-}
-
-Range.prototype.format = function() {
-  this.range = this.set.map(function(comps) {
-    return comps.join(' ').trim();
-  }).join('||').trim();
-  return this.range;
-};
-
-Range.prototype.toString = function() {
-  return this.range;
-};
-
-Range.prototype.parseRange = function(range) {
-  var loose = this.loose;
-  range = range.trim();
-  debug('range', range, loose);
-  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
-  var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE];
-  range = range.replace(hr, hyphenReplace);
-  debug('hyphen replace', range);
-  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
-  range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace);
-  debug('comparator trim', range, re[COMPARATORTRIM]);
-
-  // `~ 1.2.3` => `~1.2.3`
-  range = range.replace(re[TILDETRIM], tildeTrimReplace);
-
-  // `^ 1.2.3` => `^1.2.3`
-  range = range.replace(re[CARETTRIM], caretTrimReplace);
-
-  // normalize spaces
-  range = range.split(/\s+/).join(' ');
-
-  // At this point, the range is completely trimmed and
-  // ready to be split into comparators.
-
-  var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
-  var set = range.split(' ').map(function(comp) {
-    return parseComparator(comp, loose);
-  }).join(' ').split(/\s+/);
-  if (this.loose) {
-    // in loose mode, throw out any that are not valid comparators
-    set = set.filter(function(comp) {
-      return !!comp.match(compRe);
-    });
-  }
-  set = set.map(function(comp) {
-    return new Comparator(comp, loose);
-  });
-
-  return set;
-};
-
-Range.prototype.intersects = function(range, loose) {
-  if (!(range instanceof Range)) {
-    throw new TypeError('a Range is required');
-  }
-
-  return this.set.some(function(thisComparators) {
-    return thisComparators.every(function(thisComparator) {
-      return range.set.some(function(rangeComparators) {
-        return rangeComparators.every(function(rangeComparator) {
-          return thisComparator.intersects(rangeComparator, loose);
-        });
-      });
-    });
-  });
-};
-
-// Mostly just for testing and legacy API reasons
-exports.toComparators = toComparators;
-function toComparators(range, loose) {
-  return new Range(range, loose).set.map(function(comp) {
-    return comp.map(function(c) {
-      return c.value;
-    }).join(' ').trim().split(' ');
-  });
-}
-
-// comprised of xranges, tildes, stars, and gtlt's at this point.
-// already replaced the hyphen ranges
-// turn into a set of JUST comparators.
-function parseComparator(comp, loose) {
-  debug('comp', comp);
-  comp = replaceCarets(comp, loose);
-  debug('caret', comp);
-  comp = replaceTildes(comp, loose);
-  debug('tildes', comp);
-  comp = replaceXRanges(comp, loose);
-  debug('xrange', comp);
-  comp = replaceStars(comp, loose);
-  debug('stars', comp);
-  return comp;
-}
-
-function isX(id) {
-  return !id || id.toLowerCase() === 'x' || id === '*';
-}
-
-// ~, ~> --> * (any, kinda silly)
-// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
-// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
-// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
-// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
-// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
-function replaceTildes(comp, loose) {
-  return comp.trim().split(/\s+/).map(function(comp) {
-    return replaceTilde(comp, loose);
-  }).join(' ');
-}
-
-function replaceTilde(comp, loose) {
-  var r = loose ? re[TILDELOOSE] : re[TILDE];
-  return comp.replace(r, function(_, M, m, p, pr) {
-    debug('tilde', comp, _, M, m, p, pr);
-    var ret;
-
-    if (isX(M))
-      ret = '';
-    else if (isX(m))
-      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
-    else if (isX(p))
-      // ~1.2 == >=1.2.0 <1.3.0
-      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
-    else if (pr) {
-      debug('replaceTilde pr', pr);
-      if (pr.charAt(0) !== '-')
-        pr = '-' + pr;
-      ret = '>=' + M + '.' + m + '.' + p + pr +
-            ' <' + M + '.' + (+m + 1) + '.0';
-    } else
-      // ~1.2.3 == >=1.2.3 <1.3.0
-      ret = '>=' + M + '.' + m + '.' + p +
-            ' <' + M + '.' + (+m + 1) + '.0';
-
-    debug('tilde return', ret);
-    return ret;
-  });
-}
-
-// ^ --> * (any, kinda silly)
-// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
-// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
-// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
-// ^1.2.3 --> >=1.2.3 <2.0.0
-// ^1.2.0 --> >=1.2.0 <2.0.0
-function replaceCarets(comp, loose) {
-  return comp.trim().split(/\s+/).map(function(comp) {
-    return replaceCaret(comp, loose);
-  }).join(' ');
-}
-
-function replaceCaret(comp, loose) {
-  debug('caret', comp, loose);
-  var r = loose ? re[CARETLOOSE] : re[CARET];
-  return comp.replace(r, function(_, M, m, p, pr) {
-    debug('caret', comp, _, M, m, p, pr);
-    var ret;
-
-    if (isX(M))
-      ret = '';
-    else if (isX(m))
-      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
-    else if (isX(p)) {
-      if (M === '0')
-        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
-      else
-        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0';
-    } else if (pr) {
-      debug('replaceCaret pr', pr);
-      if (pr.charAt(0) !== '-')
-        pr = '-' + pr;
-      if (M === '0') {
-        if (m === '0')
-          ret = '>=' + M + '.' + m + '.' + p + pr +
-                ' <' + M + '.' + m + '.' + (+p + 1);
-        else
-          ret = '>=' + M + '.' + m + '.' + p + pr +
-                ' <' + M + '.' + (+m + 1) + '.0';
-      } else
-        ret = '>=' + M + '.' + m + '.' + p + pr +
-              ' <' + (+M + 1) + '.0.0';
-    } else {
-      debug('no pr');
-      if (M === '0') {
-        if (m === '0')
-          ret = '>=' + M + '.' + m + '.' + p +
-                ' <' + M + '.' + m + '.' + (+p + 1);
-        else
-          ret = '>=' + M + '.' + m + '.' + p +
-                ' <' + M + '.' + (+m + 1) + '.0';
-      } else
-        ret = '>=' + M + '.' + m + '.' + p +
-              ' <' + (+M + 1) + '.0.0';
-    }
-
-    debug('caret return', ret);
-    return ret;
-  });
-}
-
-function replaceXRanges(comp, loose) {
-  debug('replaceXRanges', comp, loose);
-  return comp.split(/\s+/).map(function(comp) {
-    return replaceXRange(comp, loose);
-  }).join(' ');
-}
-
-function replaceXRange(comp, loose) {
-  comp = comp.trim();
-  var r = loose ? re[XRANGELOOSE] : re[XRANGE];
-  return comp.replace(r, function(ret, gtlt, M, m, p, pr) {
-    debug('xRange', comp, ret, gtlt, M, m, p, pr);
-    var xM = isX(M);
-    var xm = xM || isX(m);
-    var xp = xm || isX(p);
-    var anyX = xp;
-
-    if (gtlt === '=' && anyX)
-      gtlt = '';
-
-    if (xM) {
-      if (gtlt === '>' || gtlt === '<') {
-        // nothing is allowed
-        ret = '<0.0.0';
-      } else {
-        // nothing is forbidden
-        ret = '*';
-      }
-    } else if (gtlt && anyX) {
-      // replace X with 0
-      if (xm)
-        m = 0;
-      if (xp)
-        p = 0;
-
-      if (gtlt === '>') {
-        // >1 => >=2.0.0
-        // >1.2 => >=1.3.0
-        // >1.2.3 => >= 1.2.4
-        gtlt = '>=';
-        if (xm) {
-          M = +M + 1;
-          m = 0;
-          p = 0;
-        } else if (xp) {
-          m = +m + 1;
-          p = 0;
-        }
-      } else if (gtlt === '<=') {
-        // <=0.7.x is actually <0.8.0, since any 0.7.x should
-        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
-        gtlt = '<';
-        if (xm)
-          M = +M + 1;
-        else
-          m = +m + 1;
-      }
-
-      ret = gtlt + M + '.' + m + '.' + p;
-    } else if (xm) {
-      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
-    } else if (xp) {
-      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
-    }
-
-    debug('xRange return', ret);
-
-    return ret;
-  });
-}
-
-// Because * is AND-ed with everything else in the comparator,
-// and '' means "any version", just remove the *s entirely.
-function replaceStars(comp, loose) {
-  debug('replaceStars', comp, loose);
-  // Looseness is ignored here.  star is always as loose as it gets!
-  return comp.trim().replace(re[STAR], '');
-}
-
-// This function is passed to string.replace(re[HYPHENRANGE])
-// M, m, patch, prerelease, build
-// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
-// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
-// 1.2 - 3.4 => >=1.2.0 <3.5.0
-function hyphenReplace($0,
-                       from, fM, fm, fp, fpr, fb,
-                       to, tM, tm, tp, tpr, tb) {
-
-  if (isX(fM))
-    from = '';
-  else if (isX(fm))
-    from = '>=' + fM + '.0.0';
-  else if (isX(fp))
-    from = '>=' + fM + '.' + fm + '.0';
-  else
-    from = '>=' + from;
-
-  if (isX(tM))
-    to = '';
-  else if (isX(tm))
-    to = '<' + (+tM + 1) + '.0.0';
-  else if (isX(tp))
-    to = '<' + tM + '.' + (+tm + 1) + '.0';
-  else if (tpr)
-    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;
-  else
-    to = '<=' + to;
-
-  return (from + ' ' + to).trim();
-}
-
-
-// if ANY of the sets match ALL of its comparators, then pass
-Range.prototype.test = function(version) {
-  if (!version)
-    return false;
-
-  if (typeof version === 'string')
-    version = new SemVer(version, this.loose);
-
-  for (var i = 0; i < this.set.length; i++) {
-    if (testSet(this.set[i], version))
-      return true;
-  }
-  return false;
-};
-
-function testSet(set, version) {
-  for (var i = 0; i < set.length; i++) {
-    if (!set[i].test(version))
-      return false;
-  }
-
-  if (version.prerelease.length) {
-    // Find the set of versions that are allowed to have prereleases
-    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
-    // That should allow `1.2.3-pr.2` to pass.
-    // However, `1.2.4-alpha.notready` should NOT be allowed,
-    // even though it's within the range set by the comparators.
-    for (var i = 0; i < set.length; i++) {
-      debug(set[i].semver);
-      if (set[i].semver === ANY)
-        continue;
-
-      if (set[i].semver.prerelease.length > 0) {
-        var allowed = set[i].semver;
-        if (allowed.major === version.major &&
-            allowed.minor === version.minor &&
-            allowed.patch === version.patch)
-          return true;
-      }
-    }
-
-    // Version has a -pre, but it's not one of the ones we like.
-    return false;
-  }
-
-  return true;
-}
-
-exports.satisfies = satisfies;
-function satisfies(version, range, loose) {
-  try {
-    range = new Range(range, loose);
-  } catch (er) {
-    return false;
-  }
-  return range.test(version);
-}
-
-exports.maxSatisfying = maxSatisfying;
-function maxSatisfying(versions, range, loose) {
-  var max = null;
-  var maxSV = null;
-  try {
-    var rangeObj = new Range(range, loose);
-  } catch (er) {
-    return null;
-  }
-  versions.forEach(function (v) {
-    if (rangeObj.test(v)) { // satisfies(v, range, loose)
-      if (!max || maxSV.compare(v) === -1) { // compare(max, v, true)
-        max = v;
-        maxSV = new SemVer(max, loose);
-      }
-    }
-  })
-  return max;
-}
-
-exports.minSatisfying = minSatisfying;
-function minSatisfying(versions, range, loose) {
-  var min = null;
-  var minSV = null;
-  try {
-    var rangeObj = new Range(range, loose);
-  } catch (er) {
-    return null;
-  }
-  versions.forEach(function (v) {
-    if (rangeObj.test(v)) { // satisfies(v, range, loose)
-      if (!min || minSV.compare(v) === 1) { // compare(min, v, true)
-        min = v;
-        minSV = new SemVer(min, loose);
-      }
-    }
-  })
-  return min;
-}
-
-exports.validRange = validRange;
-function validRange(range, loose) {
-  try {
-    // Return '*' instead of '' so that truthiness works.
-    // This will throw if it's invalid anyway
-    return new Range(range, loose).range || '*';
-  } catch (er) {
-    return null;
-  }
-}
-
-// Determine if version is less than all the versions possible in the range
-exports.ltr = ltr;
-function ltr(version, range, loose) {
-  return outside(version, range, '<', loose);
-}
-
-// Determine if version is greater than all the versions possible in the range.
-exports.gtr = gtr;
-function gtr(version, range, loose) {
-  return outside(version, range, '>', loose);
-}
-
-exports.outside = outside;
-function outside(version, range, hilo, loose) {
-  version = new SemVer(version, loose);
-  range = new Range(range, loose);
-
-  var gtfn, ltefn, ltfn, comp, ecomp;
-  switch (hilo) {
-    case '>':
-      gtfn = gt;
-      ltefn = lte;
-      ltfn = lt;
-      comp = '>';
-      ecomp = '>=';
-      break;
-    case '<':
-      gtfn = lt;
-      ltefn = gte;
-      ltfn = gt;
-      comp = '<';
-      ecomp = '<=';
-      break;
-    default:
-      throw new TypeError('Must provide a hilo val of "<" or ">"');
-  }
-
-  // If it satisifes the range it is not outside
-  if (satisfies(version, range, loose)) {
-    return false;
-  }
-
-  // From now on, variable terms are as if we're in "gtr" mode.
-  // but note that everything is flipped for the "ltr" function.
-
-  for (var i = 0; i < range.set.length; ++i) {
-    var comparators = range.set[i];
-
-    var high = null;
-    var low = null;
-
-    comparators.forEach(function(comparator) {
-      if (comparator.semver === ANY) {
-        comparator = new Comparator('>=0.0.0')
-      }
-      high = high || comparator;
-      low = low || comparator;
-      if (gtfn(comparator.semver, high.semver, loose)) {
-        high = comparator;
-      } else if (ltfn(comparator.semver, low.semver, loose)) {
-        low = comparator;
-      }
-    });
-
-    // If the edge version comparator has a operator then our version
-    // isn't outside it
-    if (high.operator === comp || high.operator === ecomp) {
-      return false;
-    }
-
-    // If the lowest version comparator has an operator and our version
-    // is less than it then it isn't higher than the range
-    if ((!low.operator || low.operator === comp) &&
-        ltefn(version, low.semver)) {
-      return false;
-    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-exports.prerelease = prerelease;
-function prerelease(version, loose) {
-  var parsed = parse(version, loose);
-  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null;
-}
-
-exports.intersects = intersects;
-function intersects(r1, r2, loose) {
-  r1 = new Range(r1, loose)
-  r2 = new Range(r2, loose)
-  return r1.intersects(r2)
-}
-
-exports.coerce = coerce;
-function coerce(version) {
-  if (version instanceof SemVer)
-    return version;
-
-  if (typeof version !== 'string')
-    return null;
-
-  var match = version.match(re[COERCE]);
-
-  if (match == null)
-    return null;
-
-  return parse((match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0')); 
-}
diff --git a/node_modules/shelljs/.documentup.json b/node_modules/shelljs/.documentup.json
deleted file mode 100644
index 57fe301..0000000
--- a/node_modules/shelljs/.documentup.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "name": "ShellJS",
-  "twitter": [
-    "r2r"
-  ]
-}
diff --git a/node_modules/shelljs/.jshintrc b/node_modules/shelljs/.jshintrc
deleted file mode 100644
index a80c559..0000000
--- a/node_modules/shelljs/.jshintrc
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "loopfunc": true,
-  "sub": true,
-  "undef": true,
-  "unused": true,
-  "node": true
-}
\ No newline at end of file
diff --git a/node_modules/shelljs/.npmignore b/node_modules/shelljs/.npmignore
deleted file mode 100644
index 6b20c38..0000000
--- a/node_modules/shelljs/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-test/
-tmp/
\ No newline at end of file
diff --git a/node_modules/shelljs/.travis.yml b/node_modules/shelljs/.travis.yml
deleted file mode 100644
index 1b3280a..0000000
--- a/node_modules/shelljs/.travis.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-language: node_js
-node_js:
-  - "0.10"
-  - "0.11"
-  - "0.12"
-  
diff --git a/node_modules/shelljs/LICENSE b/node_modules/shelljs/LICENSE
deleted file mode 100644
index 1b35ee9..0000000
--- a/node_modules/shelljs/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-Copyright (c) 2012, Artur Adib <aadib@mozilla.com>
-All rights reserved.
-
-You may use this project under the terms of the New BSD license as follows:
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of Artur Adib nor the
-      names of the contributors may be used to endorse or promote products
-      derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
-ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/shelljs/README.md b/node_modules/shelljs/README.md
deleted file mode 100644
index d08d13e..0000000
--- a/node_modules/shelljs/README.md
+++ /dev/null
@@ -1,579 +0,0 @@
-# ShellJS - Unix shell commands for Node.js [![Build Status](https://secure.travis-ci.org/arturadib/shelljs.png)](http://travis-ci.org/arturadib/shelljs)
-
-ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell commands on top of the Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts!
-
-The project is [unit-tested](http://travis-ci.org/arturadib/shelljs) and battled-tested in projects like:
-
-+ [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader
-+ [Firebug](http://getfirebug.com/) - Firefox's infamous debugger
-+ [JSHint](http://jshint.com) - Most popular JavaScript linter
-+ [Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for modern browsers
-+ [Yeoman](http://yeoman.io/) - Web application stack and development tool
-+ [Deployd.com](http://deployd.com) - Open source PaaS for quick API backend generation
-
-and [many more](https://npmjs.org/browse/depended/shelljs).
-
-Connect with [@r2r](http://twitter.com/r2r) on Twitter for questions, suggestions, etc.
-
-## Installing
-
-Via npm:
-
-```bash
-$ npm install [-g] shelljs
-```
-
-If the global option `-g` is specified, the binary `shjs` will be installed. This makes it possible to
-run ShellJS scripts much like any shell script from the command line, i.e. without requiring a `node_modules` folder:
-
-```bash
-$ shjs my_script
-```
-
-You can also just copy `shell.js` into your project's directory, and `require()` accordingly.
-
-
-## Examples
-
-### JavaScript
-
-```javascript
-require('shelljs/global');
-
-if (!which('git')) {
-  echo('Sorry, this script requires git');
-  exit(1);
-}
-
-// Copy files to release dir
-mkdir('-p', 'out/Release');
-cp('-R', 'stuff/*', 'out/Release');
-
-// Replace macros in each .js file
-cd('lib');
-ls('*.js').forEach(function(file) {
-  sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
-  sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file);
-  sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file);
-});
-cd('..');
-
-// Run external tool synchronously
-if (exec('git commit -am "Auto-commit"').code !== 0) {
-  echo('Error: Git commit failed');
-  exit(1);
-}
-```
-
-### CoffeeScript
-
-```coffeescript
-require 'shelljs/global'
-
-if not which 'git'
-  echo 'Sorry, this script requires git'
-  exit 1
-
-# Copy files to release dir
-mkdir '-p', 'out/Release'
-cp '-R', 'stuff/*', 'out/Release'
-
-# Replace macros in each .js file
-cd 'lib'
-for file in ls '*.js'
-  sed '-i', 'BUILD_VERSION', 'v0.1.2', file
-  sed '-i', /.*REMOVE_THIS_LINE.*\n/, '', file
-  sed '-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat 'macro.js', file
-cd '..'
-
-# Run external tool synchronously
-if (exec 'git commit -am "Auto-commit"').code != 0
-  echo 'Error: Git commit failed'
-  exit 1
-```
-
-## Global vs. Local
-
-The example above uses the convenience script `shelljs/global` to reduce verbosity. If polluting your global namespace is not desirable, simply require `shelljs`.
-
-Example:
-
-```javascript
-var shell = require('shelljs');
-shell.echo('hello world');
-```
-
-## Make tool
-
-A convenience script `shelljs/make` is also provided to mimic the behavior of a Unix Makefile. In this case all shell objects are global, and command line arguments will cause the script to execute only the corresponding function in the global `target` object. To avoid redundant calls, target functions are executed only once per script.
-
-Example (CoffeeScript):
-
-```coffeescript
-require 'shelljs/make'
-
-target.all = ->
-  target.bundle()
-  target.docs()
-
-target.bundle = ->
-  cd __dirname
-  mkdir 'build'
-  cd 'lib'
-  (cat '*.js').to '../build/output.js'
-
-target.docs = ->
-  cd __dirname
-  mkdir 'docs'
-  cd 'lib'
-  for file in ls '*.js'
-    text = grep '//@', file     # extract special comments
-    text.replace '//@', ''      # remove comment tags
-    text.to 'docs/my_docs.md'
-```
-
-To run the target `all`, call the above script without arguments: `$ node make`. To run the target `docs`: `$ node make docs`.
-
-You can also pass arguments to your targets by using the `--` separator. For example, to pass `arg1` and `arg2` to a target `bundle`, do `$ node make bundle -- arg1 arg2`:
-
-```javascript
-require('shelljs/make');
-
-target.bundle = function(argsArray) {
-  // argsArray = ['arg1', 'arg2']
-  /* ... */
-}
-```
-
-
-<!-- DO NOT MODIFY BEYOND THIS POINT - IT'S AUTOMATICALLY GENERATED -->
-
-
-## Command reference
-
-
-All commands run synchronously, unless otherwise stated.
-
-
-### cd('dir')
-Changes to directory `dir` for the duration of the script
-
-
-### pwd()
-Returns the current directory.
-
-
-### ls([options ,] path [,path ...])
-### ls([options ,] path_array)
-Available options:
-
-+ `-R`: recursive
-+ `-A`: all files (include files beginning with `.`, except for `.` and `..`)
-
-Examples:
-
-```javascript
-ls('projs/*.js');
-ls('-R', '/users/me', '/tmp');
-ls('-R', ['/users/me', '/tmp']); // same as above
-```
-
-Returns array of files in the given path, or in current directory if no path provided.
-
-
-### find(path [,path ...])
-### find(path_array)
-Examples:
-
-```javascript
-find('src', 'lib');
-find(['src', 'lib']); // same as above
-find('.').filter(function(file) { return file.match(/\.js$/); });
-```
-
-Returns array of all files (however deep) in the given paths.
-
-The main difference from `ls('-R', path)` is that the resulting file names
-include the base directories, e.g. `lib/resources/file1` instead of just `file1`.
-
-
-### cp([options ,] source [,source ...], dest)
-### cp([options ,] source_array, dest)
-Available options:
-
-+ `-f`: force
-+ `-r, -R`: recursive
-
-Examples:
-
-```javascript
-cp('file1', 'dir1');
-cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp');
-cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above
-```
-
-Copies files. The wildcard `*` is accepted.
-
-
-### rm([options ,] file [, file ...])
-### rm([options ,] file_array)
-Available options:
-
-+ `-f`: force
-+ `-r, -R`: recursive
-
-Examples:
-
-```javascript
-rm('-rf', '/tmp/*');
-rm('some_file.txt', 'another_file.txt');
-rm(['some_file.txt', 'another_file.txt']); // same as above
-```
-
-Removes files. The wildcard `*` is accepted.
-
-
-### mv(source [, source ...], dest')
-### mv(source_array, dest')
-Available options:
-
-+ `f`: force
-
-Examples:
-
-```javascript
-mv('-f', 'file', 'dir/');
-mv('file1', 'file2', 'dir/');
-mv(['file1', 'file2'], 'dir/'); // same as above
-```
-
-Moves files. The wildcard `*` is accepted.
-
-
-### mkdir([options ,] dir [, dir ...])
-### mkdir([options ,] dir_array)
-Available options:
-
-+ `p`: full path (will create intermediate dirs if necessary)
-
-Examples:
-
-```javascript
-mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g');
-mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above
-```
-
-Creates directories.
-
-
-### test(expression)
-Available expression primaries:
-
-+ `'-b', 'path'`: true if path is a block device
-+ `'-c', 'path'`: true if path is a character device
-+ `'-d', 'path'`: true if path is a directory
-+ `'-e', 'path'`: true if path exists
-+ `'-f', 'path'`: true if path is a regular file
-+ `'-L', 'path'`: true if path is a symbolic link
-+ `'-p', 'path'`: true if path is a pipe (FIFO)
-+ `'-S', 'path'`: true if path is a socket
-
-Examples:
-
-```javascript
-if (test('-d', path)) { /* do something with dir */ };
-if (!test('-f', path)) continue; // skip if it's a regular file
-```
-
-Evaluates expression using the available primaries and returns corresponding value.
-
-
-### cat(file [, file ...])
-### cat(file_array)
-
-Examples:
-
-```javascript
-var str = cat('file*.txt');
-var str = cat('file1', 'file2');
-var str = cat(['file1', 'file2']); // same as above
-```
-
-Returns a string containing the given file, or a concatenated string
-containing the files if more than one file is given (a new line character is
-introduced between each file). Wildcard `*` accepted.
-
-
-### 'string'.to(file)
-
-Examples:
-
-```javascript
-cat('input.txt').to('output.txt');
-```
-
-Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as
-those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_
-
-
-### 'string'.toEnd(file)
-
-Examples:
-
-```javascript
-cat('input.txt').toEnd('output.txt');
-```
-
-Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as
-those returned by `cat`, `grep`, etc).
-
-
-### sed([options ,] search_regex, replacement, file)
-Available options:
-
-+ `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_
-
-Examples:
-
-```javascript
-sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js');
-sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js');
-```
-
-Reads an input string from `file` and performs a JavaScript `replace()` on the input
-using the given search regex and replacement string or function. Returns the new string after replacement.
-
-
-### grep([options ,] regex_filter, file [, file ...])
-### grep([options ,] regex_filter, file_array)
-Available options:
-
-+ `-v`: Inverse the sense of the regex and print the lines not matching the criteria.
-
-Examples:
-
-```javascript
-grep('-v', 'GLOBAL_VARIABLE', '*.js');
-grep('GLOBAL_VARIABLE', '*.js');
-```
-
-Reads input string from given files and returns a string containing all lines of the
-file that match the given `regex_filter`. Wildcard `*` accepted.
-
-
-### which(command)
-
-Examples:
-
-```javascript
-var nodeExec = which('node');
-```
-
-Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions.
-Returns string containing the absolute path to the command.
-
-
-### echo(string [,string ...])
-
-Examples:
-
-```javascript
-echo('hello world');
-var str = echo('hello world');
-```
-
-Prints string to stdout, and returns string with additional utility methods
-like `.to()`.
-
-
-### pushd([options,] [dir | '-N' | '+N'])
-
-Available options:
-
-+ `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated.
-
-Arguments:
-
-+ `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`.
-+ `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.
-+ `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.
-
-Examples:
-
-```javascript
-// process.cwd() === '/usr'
-pushd('/etc'); // Returns /etc /usr
-pushd('+1');   // Returns /usr /etc
-```
-
-Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack.
-
-### popd([options,] ['-N' | '+N'])
-
-Available options:
-
-+ `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated.
-
-Arguments:
-
-+ `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero.
-+ `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero.
-
-Examples:
-
-```javascript
-echo(process.cwd()); // '/usr'
-pushd('/etc');       // '/etc /usr'
-echo(process.cwd()); // '/etc'
-popd();              // '/usr'
-echo(process.cwd()); // '/usr'
-```
-
-When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack.
-
-### dirs([options | '+N' | '-N'])
-
-Available options:
-
-+ `-c`: Clears the directory stack by deleting all of the elements.
-
-Arguments:
-
-+ `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero.
-+ `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero.
-
-Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified.
-
-See also: pushd, popd
-
-
-### ln(options, source, dest)
-### ln(source, dest)
-Available options:
-
-+ `s`: symlink
-+ `f`: force
-
-Examples:
-
-```javascript
-ln('file', 'newlink');
-ln('-sf', 'file', 'existing');
-```
-
-Links source to dest. Use -f to force the link, should dest already exist.
-
-
-### exit(code)
-Exits the current process with the given exit code.
-
-### env['VAR_NAME']
-Object containing environment variables (both getter and setter). Shortcut to process.env.
-
-### exec(command [, options] [, callback])
-Available options (all `false` by default):
-
-+ `async`: Asynchronous execution. Defaults to true if a callback is provided.
-+ `silent`: Do not echo program output to console.
-
-Examples:
-
-```javascript
-var version = exec('node --version', {silent:true}).output;
-
-var child = exec('some_long_running_process', {async:true});
-child.stdout.on('data', function(data) {
-  /* ... do something with data ... */
-});
-
-exec('some_long_running_process', function(code, output) {
-  console.log('Exit code:', code);
-  console.log('Program output:', output);
-});
-```
-
-Executes the given `command` _synchronously_, unless otherwise specified.
-When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's
-`output` (stdout + stderr)  and its exit `code`. Otherwise returns the child process object, and
-the `callback` gets the arguments `(code, output)`.
-
-**Note:** For long-lived processes, it's best to run `exec()` asynchronously as
-the current synchronous implementation uses a lot of CPU. This should be getting
-fixed soon.
-
-
-### chmod(octal_mode || octal_string, file)
-### chmod(symbolic_mode, file)
-
-Available options:
-
-+ `-v`: output a diagnostic for every file processed
-+ `-c`: like verbose but report only when a change is made
-+ `-R`: change files and directories recursively
-
-Examples:
-
-```javascript
-chmod(755, '/Users/brandon');
-chmod('755', '/Users/brandon'); // same as above
-chmod('u+x', '/Users/brandon');
-```
-
-Alters the permissions of a file or directory by either specifying the
-absolute permissions in octal form or expressing the changes in symbols.
-This command tries to mimic the POSIX behavior as much as possible.
-Notable exceptions:
-
-+ In symbolic modes, 'a-r' and '-r' are identical.  No consideration is
-  given to the umask.
-+ There is no "quiet" option since default behavior is to run silent.
-
-
-## Non-Unix commands
-
-
-### tempdir()
-
-Examples:
-
-```javascript
-var tmp = tempdir(); // "/tmp" for most *nix platforms
-```
-
-Searches and returns string containing a writeable, platform-dependent temporary directory.
-Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir).
-
-
-### error()
-Tests if error occurred in the last command. Returns `null` if no error occurred,
-otherwise returns string explaining the error
-
-
-## Configuration
-
-
-### config.silent
-Example:
-
-```javascript
-var sh = require('shelljs');
-var silentState = sh.config.silent; // save old silent state
-sh.config.silent = true;
-/* ... */
-sh.config.silent = silentState; // restore old silent state
-```
-
-Suppresses all command output if `true`, except for `echo()` calls.
-Default is `false`.
-
-### config.fatal
-Example:
-
-```javascript
-require('shelljs/global');
-config.fatal = true;
-cp('this_file_does_not_exist', '/dev/null'); // dies here
-/* more commands... */
-```
-
-If `true` the script will die on errors. Default is `false`.
diff --git a/node_modules/shelljs/RELEASE.md b/node_modules/shelljs/RELEASE.md
deleted file mode 100644
index 69ef3fb..0000000
--- a/node_modules/shelljs/RELEASE.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Release steps
-
-* Ensure master passes CI tests
-* Bump version in package.json. Any breaking change or new feature should bump minor (or even major). Non-breaking changes or fixes can just bump patch.
-* Update README manually if the changes are not documented in-code. If so, run `scripts/generate-docs.js`
-* Commit
-* `$ git tag <version>` (see `git tag -l` for latest)
-* `$ git push origin master --tags`
-* `$ npm publish .`
diff --git a/node_modules/shelljs/bin/shjs b/node_modules/shelljs/bin/shjs
deleted file mode 100755
index d239a7a..0000000
--- a/node_modules/shelljs/bin/shjs
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/env node
-require('../global');
-
-if (process.argv.length < 3) {
-  console.log('ShellJS: missing argument (script name)');
-  console.log();
-  process.exit(1);
-}
-
-var args,
-  scriptName = process.argv[2];
-env['NODE_PATH'] = __dirname + '/../..';
-
-if (!scriptName.match(/\.js/) && !scriptName.match(/\.coffee/)) {
-  if (test('-f', scriptName + '.js'))
-    scriptName += '.js';
-  if (test('-f', scriptName + '.coffee'))
-    scriptName += '.coffee';
-}
-
-if (!test('-f', scriptName)) {
-  console.log('ShellJS: script not found ('+scriptName+')');
-  console.log();
-  process.exit(1);
-}
-
-args = process.argv.slice(3);
-
-for (var i = 0, l = args.length; i < l; i++) {
-  if (args[i][0] !== "-"){
-    args[i] = '"' + args[i] + '"'; // fixes arguments with multiple words
-  }
-}
-
-if (scriptName.match(/\.coffee$/)) {
-  //
-  // CoffeeScript
-  //
-  if (which('coffee')) {
-    exec('coffee ' + scriptName + ' ' + args.join(' '), { async: true });
-  } else {
-    console.log('ShellJS: CoffeeScript interpreter not found');
-    console.log();
-    process.exit(1);
-  }
-} else {
-  //
-  // JavaScript
-  //
-  exec('node ' + scriptName + ' ' + args.join(' '), { async: true });
-}
diff --git a/node_modules/shelljs/global.js b/node_modules/shelljs/global.js
deleted file mode 100644
index 97f0033..0000000
--- a/node_modules/shelljs/global.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var shell = require('./shell.js');
-for (var cmd in shell)
-  global[cmd] = shell[cmd];
diff --git a/node_modules/shelljs/make.js b/node_modules/shelljs/make.js
deleted file mode 100644
index f78b4cf..0000000
--- a/node_modules/shelljs/make.js
+++ /dev/null
@@ -1,56 +0,0 @@
-require('./global');
-
-global.config.fatal = true;
-global.target = {};
-
-var args = process.argv.slice(2),
-  targetArgs,
-  dashesLoc = args.indexOf('--');
-
-// split args, everything after -- if only for targets
-if (dashesLoc > -1) {
-  targetArgs = args.slice(dashesLoc + 1, args.length);
-  args = args.slice(0, dashesLoc);
-}
-
-// This ensures we only execute the script targets after the entire script has
-// been evaluated
-setTimeout(function() {
-  var t;
-
-  if (args.length === 1 && args[0] === '--help') {
-    console.log('Available targets:');
-    for (t in global.target)
-      console.log('  ' + t);
-    return;
-  }
-
-  // Wrap targets to prevent duplicate execution
-  for (t in global.target) {
-    (function(t, oldTarget){
-
-      // Wrap it
-      global.target[t] = function() {
-        if (oldTarget.done)
-          return;
-        oldTarget.done = true;
-        return oldTarget.apply(oldTarget, arguments);
-      };
-
-    })(t, global.target[t]);
-  }
-
-  // Execute desired targets
-  if (args.length > 0) {
-    args.forEach(function(arg) {
-      if (arg in global.target)
-        global.target[arg](targetArgs);
-      else {
-        console.log('no such target: ' + arg);
-      }
-    });
-  } else if ('all' in global.target) {
-    global.target.all(targetArgs);
-  }
-
-}, 0);
diff --git a/node_modules/shelljs/package.json b/node_modules/shelljs/package.json
deleted file mode 100644
index 497bfbb..0000000
--- a/node_modules/shelljs/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "_args": [
-    [
-      "shelljs@0.5.3",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "shelljs@0.5.3",
-  "_id": "shelljs@0.5.3",
-  "_inBundle": false,
-  "_integrity": "sha1-xUmCuZbHbvDB5rWfvcWCX1txMRM=",
-  "_location": "/shelljs",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "shelljs@0.5.3",
-    "name": "shelljs",
-    "escapedName": "shelljs",
-    "rawSpec": "0.5.3",
-    "saveSpec": null,
-    "fetchSpec": "0.5.3"
-  },
-  "_requiredBy": [
-    "/",
-    "/cordova-common"
-  ],
-  "_resolved": "http://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz",
-  "_spec": "0.5.3",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Artur Adib",
-    "email": "arturadib@gmail.com"
-  },
-  "bin": {
-    "shjs": "./bin/shjs"
-  },
-  "bugs": {
-    "url": "https://github.com/arturadib/shelljs/issues"
-  },
-  "dependencies": {},
-  "description": "Portable Unix shell commands for Node.js",
-  "devDependencies": {
-    "jshint": "~2.1.11"
-  },
-  "engines": {
-    "node": ">=0.8.0"
-  },
-  "homepage": "http://github.com/arturadib/shelljs",
-  "keywords": [
-    "unix",
-    "shell",
-    "makefile",
-    "make",
-    "jake",
-    "synchronous"
-  ],
-  "license": "BSD*",
-  "main": "./shell.js",
-  "name": "shelljs",
-  "optionalDependencies": {},
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/arturadib/shelljs.git"
-  },
-  "scripts": {
-    "test": "node scripts/run-tests"
-  },
-  "version": "0.5.3"
-}
diff --git a/node_modules/shelljs/scripts/generate-docs.js b/node_modules/shelljs/scripts/generate-docs.js
deleted file mode 100755
index 532fed9..0000000
--- a/node_modules/shelljs/scripts/generate-docs.js
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env node
-require('../global');
-
-echo('Appending docs to README.md');
-
-cd(__dirname + '/..');
-
-// Extract docs from shell.js
-var docs = grep('//@', 'shell.js');
-
-docs = docs.replace(/\/\/\@include (.+)/g, function(match, path) {
-  var file = path.match('.js$') ? path : path+'.js';
-  return grep('//@', file);
-});
-
-// Remove '//@'
-docs = docs.replace(/\/\/\@ ?/g, '');
-// Append docs to README
-sed('-i', /## Command reference(.|\n)*/, '## Command reference\n\n' + docs, 'README.md');
-
-echo('All done.');
diff --git a/node_modules/shelljs/scripts/run-tests.js b/node_modules/shelljs/scripts/run-tests.js
deleted file mode 100755
index f9d31e0..0000000
--- a/node_modules/shelljs/scripts/run-tests.js
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env node
-require('../global');
-
-var path = require('path');
-
-var failed = false;
-
-//
-// Lint
-//
-JSHINT_BIN = './node_modules/jshint/bin/jshint';
-cd(__dirname + '/..');
-
-if (!test('-f', JSHINT_BIN)) {
-  echo('JSHint not found. Run `npm install` in the root dir first.');
-  exit(1);
-}
-
-if (exec(JSHINT_BIN + ' *.js test/*.js').code !== 0) {
-  failed = true;
-  echo('*** JSHINT FAILED! (return code != 0)');
-  echo();
-} else {
-  echo('All JSHint tests passed');
-  echo();
-}
-
-//
-// Unit tests
-//
-cd(__dirname + '/../test');
-ls('*.js').forEach(function(file) {
-  echo('Running test:', file);
-  if (exec('node ' + file).code !== 123) { // 123 avoids false positives (e.g. premature exit)
-    failed = true;
-    echo('*** TEST FAILED! (missing exit code "123")');
-    echo();
-  }
-});
-
-if (failed) {
-  echo();
-  echo('*******************************************************');
-  echo('WARNING: Some tests did not pass!');
-  echo('*******************************************************');
-  exit(1);
-} else {
-  echo();
-  echo('All tests passed.');
-}
diff --git a/node_modules/shelljs/shell.js b/node_modules/shelljs/shell.js
deleted file mode 100644
index bdeb559..0000000
--- a/node_modules/shelljs/shell.js
+++ /dev/null
@@ -1,159 +0,0 @@
-//
-// ShellJS
-// Unix shell commands on top of Node's API
-//
-// Copyright (c) 2012 Artur Adib
-// http://github.com/arturadib/shelljs
-//
-
-var common = require('./src/common');
-
-
-//@
-//@ All commands run synchronously, unless otherwise stated.
-//@
-
-//@include ./src/cd
-var _cd = require('./src/cd');
-exports.cd = common.wrap('cd', _cd);
-
-//@include ./src/pwd
-var _pwd = require('./src/pwd');
-exports.pwd = common.wrap('pwd', _pwd);
-
-//@include ./src/ls
-var _ls = require('./src/ls');
-exports.ls = common.wrap('ls', _ls);
-
-//@include ./src/find
-var _find = require('./src/find');
-exports.find = common.wrap('find', _find);
-
-//@include ./src/cp
-var _cp = require('./src/cp');
-exports.cp = common.wrap('cp', _cp);
-
-//@include ./src/rm
-var _rm = require('./src/rm');
-exports.rm = common.wrap('rm', _rm);
-
-//@include ./src/mv
-var _mv = require('./src/mv');
-exports.mv = common.wrap('mv', _mv);
-
-//@include ./src/mkdir
-var _mkdir = require('./src/mkdir');
-exports.mkdir = common.wrap('mkdir', _mkdir);
-
-//@include ./src/test
-var _test = require('./src/test');
-exports.test = common.wrap('test', _test);
-
-//@include ./src/cat
-var _cat = require('./src/cat');
-exports.cat = common.wrap('cat', _cat);
-
-//@include ./src/to
-var _to = require('./src/to');
-String.prototype.to = common.wrap('to', _to);
-
-//@include ./src/toEnd
-var _toEnd = require('./src/toEnd');
-String.prototype.toEnd = common.wrap('toEnd', _toEnd);
-
-//@include ./src/sed
-var _sed = require('./src/sed');
-exports.sed = common.wrap('sed', _sed);
-
-//@include ./src/grep
-var _grep = require('./src/grep');
-exports.grep = common.wrap('grep', _grep);
-
-//@include ./src/which
-var _which = require('./src/which');
-exports.which = common.wrap('which', _which);
-
-//@include ./src/echo
-var _echo = require('./src/echo');
-exports.echo = _echo; // don't common.wrap() as it could parse '-options'
-
-//@include ./src/dirs
-var _dirs = require('./src/dirs').dirs;
-exports.dirs = common.wrap("dirs", _dirs);
-var _pushd = require('./src/dirs').pushd;
-exports.pushd = common.wrap('pushd', _pushd);
-var _popd = require('./src/dirs').popd;
-exports.popd = common.wrap("popd", _popd);
-
-//@include ./src/ln
-var _ln = require('./src/ln');
-exports.ln = common.wrap('ln', _ln);
-
-//@
-//@ ### exit(code)
-//@ Exits the current process with the given exit code.
-exports.exit = process.exit;
-
-//@
-//@ ### env['VAR_NAME']
-//@ Object containing environment variables (both getter and setter). Shortcut to process.env.
-exports.env = process.env;
-
-//@include ./src/exec
-var _exec = require('./src/exec');
-exports.exec = common.wrap('exec', _exec, {notUnix:true});
-
-//@include ./src/chmod
-var _chmod = require('./src/chmod');
-exports.chmod = common.wrap('chmod', _chmod);
-
-
-
-//@
-//@ ## Non-Unix commands
-//@
-
-//@include ./src/tempdir
-var _tempDir = require('./src/tempdir');
-exports.tempdir = common.wrap('tempdir', _tempDir);
-
-
-//@include ./src/error
-var _error = require('./src/error');
-exports.error = _error;
-
-
-
-//@
-//@ ## Configuration
-//@
-
-exports.config = common.config;
-
-//@
-//@ ### config.silent
-//@ Example:
-//@
-//@ ```javascript
-//@ var sh = require('shelljs');
-//@ var silentState = sh.config.silent; // save old silent state
-//@ sh.config.silent = true;
-//@ /* ... */
-//@ sh.config.silent = silentState; // restore old silent state
-//@ ```
-//@
-//@ Suppresses all command output if `true`, except for `echo()` calls.
-//@ Default is `false`.
-
-//@
-//@ ### config.fatal
-//@ Example:
-//@
-//@ ```javascript
-//@ require('shelljs/global');
-//@ config.fatal = true;
-//@ cp('this_file_does_not_exist', '/dev/null'); // dies here
-//@ /* more commands... */
-//@ ```
-//@
-//@ If `true` the script will die on errors. Default is `false`.
diff --git a/node_modules/shelljs/src/cat.js b/node_modules/shelljs/src/cat.js
deleted file mode 100644
index f6f4d25..0000000
--- a/node_modules/shelljs/src/cat.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var common = require('./common');
-var fs = require('fs');
-
-//@
-//@ ### cat(file [, file ...])
-//@ ### cat(file_array)
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ var str = cat('file*.txt');
-//@ var str = cat('file1', 'file2');
-//@ var str = cat(['file1', 'file2']); // same as above
-//@ ```
-//@
-//@ Returns a string containing the given file, or a concatenated string
-//@ containing the files if more than one file is given (a new line character is
-//@ introduced between each file). Wildcard `*` accepted.
-function _cat(options, files) {
-  var cat = '';
-
-  if (!files)
-    common.error('no paths given');
-
-  if (typeof files === 'string')
-    files = [].slice.call(arguments, 1);
-  // if it's array leave it as it is
-
-  files = common.expand(files);
-
-  files.forEach(function(file) {
-    if (!fs.existsSync(file))
-      common.error('no such file or directory: ' + file);
-
-    cat += fs.readFileSync(file, 'utf8') + '\n';
-  });
-
-  if (cat[cat.length-1] === '\n')
-    cat = cat.substring(0, cat.length-1);
-
-  return common.ShellString(cat);
-}
-module.exports = _cat;
diff --git a/node_modules/shelljs/src/cd.js b/node_modules/shelljs/src/cd.js
deleted file mode 100644
index 230f432..0000000
--- a/node_modules/shelljs/src/cd.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var fs = require('fs');
-var common = require('./common');
-
-//@
-//@ ### cd('dir')
-//@ Changes to directory `dir` for the duration of the script
-function _cd(options, dir) {
-  if (!dir)
-    common.error('directory not specified');
-
-  if (!fs.existsSync(dir))
-    common.error('no such file or directory: ' + dir);
-
-  if (!fs.statSync(dir).isDirectory())
-    common.error('not a directory: ' + dir);
-
-  process.chdir(dir);
-}
-module.exports = _cd;
diff --git a/node_modules/shelljs/src/chmod.js b/node_modules/shelljs/src/chmod.js
deleted file mode 100644
index f288893..0000000
--- a/node_modules/shelljs/src/chmod.js
+++ /dev/null
@@ -1,208 +0,0 @@
-var common = require('./common');
-var fs = require('fs');
-var path = require('path');
-
-var PERMS = (function (base) {
-  return {
-    OTHER_EXEC  : base.EXEC,
-    OTHER_WRITE : base.WRITE,
-    OTHER_READ  : base.READ,
-
-    GROUP_EXEC  : base.EXEC  << 3,
-    GROUP_WRITE : base.WRITE << 3,
-    GROUP_READ  : base.READ << 3,
-
-    OWNER_EXEC  : base.EXEC << 6,
-    OWNER_WRITE : base.WRITE << 6,
-    OWNER_READ  : base.READ << 6,
-
-    // Literal octal numbers are apparently not allowed in "strict" javascript.  Using parseInt is
-    // the preferred way, else a jshint warning is thrown.
-    STICKY      : parseInt('01000', 8),
-    SETGID      : parseInt('02000', 8),
-    SETUID      : parseInt('04000', 8),
-
-    TYPE_MASK   : parseInt('0770000', 8)
-  };
-})({
-  EXEC  : 1,
-  WRITE : 2,
-  READ  : 4
-});
-
-//@
-//@ ### chmod(octal_mode || octal_string, file)
-//@ ### chmod(symbolic_mode, file)
-//@
-//@ Available options:
-//@
-//@ + `-v`: output a diagnostic for every file processed//@
-//@ + `-c`: like verbose but report only when a change is made//@
-//@ + `-R`: change files and directories recursively//@
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ chmod(755, '/Users/brandon');
-//@ chmod('755', '/Users/brandon'); // same as above
-//@ chmod('u+x', '/Users/brandon');
-//@ ```
-//@
-//@ Alters the permissions of a file or directory by either specifying the
-//@ absolute permissions in octal form or expressing the changes in symbols.
-//@ This command tries to mimic the POSIX behavior as much as possible.
-//@ Notable exceptions:
-//@
-//@ + In symbolic modes, 'a-r' and '-r' are identical.  No consideration is
-//@   given to the umask.
-//@ + There is no "quiet" option since default behavior is to run silent.
-function _chmod(options, mode, filePattern) {
-  if (!filePattern) {
-    if (options.length > 0 && options.charAt(0) === '-') {
-      // Special case where the specified file permissions started with - to subtract perms, which
-      // get picked up by the option parser as command flags.
-      // If we are down by one argument and options starts with -, shift everything over.
-      filePattern = mode;
-      mode = options;
-      options = '';
-    }
-    else {
-      common.error('You must specify a file.');
-    }
-  }
-
-  options = common.parseOptions(options, {
-    'R': 'recursive',
-    'c': 'changes',
-    'v': 'verbose'
-  });
-
-  if (typeof filePattern === 'string') {
-    filePattern = [ filePattern ];
-  }
-
-  var files;
-
-  if (options.recursive) {
-    files = [];
-    common.expand(filePattern).forEach(function addFile(expandedFile) {
-      var stat = fs.lstatSync(expandedFile);
-
-      if (!stat.isSymbolicLink()) {
-        files.push(expandedFile);
-
-        if (stat.isDirectory()) {  // intentionally does not follow symlinks.
-          fs.readdirSync(expandedFile).forEach(function (child) {
-            addFile(expandedFile + '/' + child);
-          });
-        }
-      }
-    });
-  }
-  else {
-    files = common.expand(filePattern);
-  }
-
-  files.forEach(function innerChmod(file) {
-    file = path.resolve(file);
-    if (!fs.existsSync(file)) {
-      common.error('File not found: ' + file);
-    }
-
-    // When recursing, don't follow symlinks.
-    if (options.recursive && fs.lstatSync(file).isSymbolicLink()) {
-      return;
-    }
-
-    var perms = fs.statSync(file).mode;
-    var type = perms & PERMS.TYPE_MASK;
-
-    var newPerms = perms;
-
-    if (isNaN(parseInt(mode, 8))) {
-      // parse options
-      mode.split(',').forEach(function (symbolicMode) {
-        /*jshint regexdash:true */
-        var pattern = /([ugoa]*)([=\+-])([rwxXst]*)/i;
-        var matches = pattern.exec(symbolicMode);
-
-        if (matches) {
-          var applyTo = matches[1];
-          var operator = matches[2];
-          var change = matches[3];
-
-          var changeOwner = applyTo.indexOf('u') != -1 || applyTo === 'a' || applyTo === '';
-          var changeGroup = applyTo.indexOf('g') != -1 || applyTo === 'a' || applyTo === '';
-          var changeOther = applyTo.indexOf('o') != -1 || applyTo === 'a' || applyTo === '';
-
-          var changeRead   = change.indexOf('r') != -1;
-          var changeWrite  = change.indexOf('w') != -1;
-          var changeExec   = change.indexOf('x') != -1;
-          var changeSticky = change.indexOf('t') != -1;
-          var changeSetuid = change.indexOf('s') != -1;
-
-          var mask = 0;
-          if (changeOwner) {
-            mask |= (changeRead ? PERMS.OWNER_READ : 0) + (changeWrite ? PERMS.OWNER_WRITE : 0) + (changeExec ? PERMS.OWNER_EXEC : 0) + (changeSetuid ? PERMS.SETUID : 0);
-          }
-          if (changeGroup) {
-            mask |= (changeRead ? PERMS.GROUP_READ : 0) + (changeWrite ? PERMS.GROUP_WRITE : 0) + (changeExec ? PERMS.GROUP_EXEC : 0) + (changeSetuid ? PERMS.SETGID : 0);
-          }
-          if (changeOther) {
-            mask |= (changeRead ? PERMS.OTHER_READ : 0) + (changeWrite ? PERMS.OTHER_WRITE : 0) + (changeExec ? PERMS.OTHER_EXEC : 0);
-          }
-
-          // Sticky bit is special - it's not tied to user, group or other.
-          if (changeSticky) {
-            mask |= PERMS.STICKY;
-          }
-
-          switch (operator) {
-            case '+':
-              newPerms |= mask;
-              break;
-
-            case '-':
-              newPerms &= ~mask;
-              break;
-
-            case '=':
-              newPerms = type + mask;
-
-              // According to POSIX, when using = to explicitly set the permissions, setuid and setgid can never be cleared.
-              if (fs.statSync(file).isDirectory()) {
-                newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms;
-              }
-              break;
-          }
-
-          if (options.verbose) {
-            log(file + ' -> ' + newPerms.toString(8));
-          }
-
-          if (perms != newPerms) {
-            if (!options.verbose && options.changes) {
-              log(file + ' -> ' + newPerms.toString(8));
-            }
-            fs.chmodSync(file, newPerms);
-          }
-        }
-        else {
-          common.error('Invalid symbolic mode change: ' + symbolicMode);
-        }
-      });
-    }
-    else {
-      // they gave us a full number
-      newPerms = type + parseInt(mode, 8);
-
-      // POSIX rules are that setuid and setgid can only be added using numeric form, but not cleared.
-      if (fs.statSync(file).isDirectory()) {
-        newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms;
-      }
-
-      fs.chmodSync(file, newPerms);
-    }
-  });
-}
-module.exports = _chmod;
diff --git a/node_modules/shelljs/src/common.js b/node_modules/shelljs/src/common.js
deleted file mode 100644
index d8c2312..0000000
--- a/node_modules/shelljs/src/common.js
+++ /dev/null
@@ -1,203 +0,0 @@
-var os = require('os');
-var fs = require('fs');
-var _ls = require('./ls');
-
-// Module globals
-var config = {
-  silent: false,
-  fatal: false
-};
-exports.config = config;
-
-var state = {
-  error: null,
-  currentCmd: 'shell.js',
-  tempDir: null
-};
-exports.state = state;
-
-var platform = os.type().match(/^Win/) ? 'win' : 'unix';
-exports.platform = platform;
-
-function log() {
-  if (!config.silent)
-    console.log.apply(this, arguments);
-}
-exports.log = log;
-
-// Shows error message. Throws unless _continue or config.fatal are true
-function error(msg, _continue) {
-  if (state.error === null)
-    state.error = '';
-  state.error += state.currentCmd + ': ' + msg + '\n';
-
-  if (msg.length > 0)
-    log(state.error);
-
-  if (config.fatal)
-    process.exit(1);
-
-  if (!_continue)
-    throw '';
-}
-exports.error = error;
-
-// In the future, when Proxies are default, we can add methods like `.to()` to primitive strings.
-// For now, this is a dummy function to bookmark places we need such strings
-function ShellString(str) {
-  return str;
-}
-exports.ShellString = ShellString;
-
-// Returns {'alice': true, 'bob': false} when passed a dictionary, e.g.:
-//   parseOptions('-a', {'a':'alice', 'b':'bob'});
-function parseOptions(str, map) {
-  if (!map)
-    error('parseOptions() internal error: no map given');
-
-  // All options are false by default
-  var options = {};
-  for (var letter in map)
-    options[map[letter]] = false;
-
-  if (!str)
-    return options; // defaults
-
-  if (typeof str !== 'string')
-    error('parseOptions() internal error: wrong str');
-
-  // e.g. match[1] = 'Rf' for str = '-Rf'
-  var match = str.match(/^\-(.+)/);
-  if (!match)
-    return options;
-
-  // e.g. chars = ['R', 'f']
-  var chars = match[1].split('');
-
-  chars.forEach(function(c) {
-    if (c in map)
-      options[map[c]] = true;
-    else
-      error('option not recognized: '+c);
-  });
-
-  return options;
-}
-exports.parseOptions = parseOptions;
-
-// Expands wildcards with matching (ie. existing) file names.
-// For example:
-//   expand(['file*.js']) = ['file1.js', 'file2.js', ...]
-//   (if the files 'file1.js', 'file2.js', etc, exist in the current dir)
-function expand(list) {
-  var expanded = [];
-  list.forEach(function(listEl) {
-    // Wildcard present on directory names ?
-    if(listEl.search(/\*[^\/]*\//) > -1 || listEl.search(/\*\*[^\/]*\//) > -1) {
-      var match = listEl.match(/^([^*]+\/|)(.*)/);
-      var root = match[1];
-      var rest = match[2];
-      var restRegex = rest.replace(/\*\*/g, ".*").replace(/\*/g, "[^\\/]*");
-      restRegex = new RegExp(restRegex);
-      
-      _ls('-R', root).filter(function (e) {
-        return restRegex.test(e);
-      }).forEach(function(file) {
-        expanded.push(file);
-      });
-    }
-    // Wildcard present on file names ?
-    else if (listEl.search(/\*/) > -1) {
-      _ls('', listEl).forEach(function(file) {
-        expanded.push(file);
-      });
-    } else {
-      expanded.push(listEl);
-    }
-  });
-  return expanded;
-}
-exports.expand = expand;
-
-// Normalizes _unlinkSync() across platforms to match Unix behavior, i.e.
-// file can be unlinked even if it's read-only, see https://github.com/joyent/node/issues/3006
-function unlinkSync(file) {
-  try {
-    fs.unlinkSync(file);
-  } catch(e) {
-    // Try to override file permission
-    if (e.code === 'EPERM') {
-      fs.chmodSync(file, '0666');
-      fs.unlinkSync(file);
-    } else {
-      throw e;
-    }
-  }
-}
-exports.unlinkSync = unlinkSync;
-
-// e.g. 'shelljs_a5f185d0443ca...'
-function randomFileName() {
-  function randomHash(count) {
-    if (count === 1)
-      return parseInt(16*Math.random(), 10).toString(16);
-    else {
-      var hash = '';
-      for (var i=0; i<count; i++)
-        hash += randomHash(1);
-      return hash;
-    }
-  }
-
-  return 'shelljs_'+randomHash(20);
-}
-exports.randomFileName = randomFileName;
-
-// extend(target_obj, source_obj1 [, source_obj2 ...])
-// Shallow extend, e.g.:
-//    extend({A:1}, {b:2}, {c:3}) returns {A:1, b:2, c:3}
-function extend(target) {
-  var sources = [].slice.call(arguments, 1);
-  sources.forEach(function(source) {
-    for (var key in source)
-      target[key] = source[key];
-  });
-
-  return target;
-}
-exports.extend = extend;
-
-// Common wrapper for all Unix-like commands
-function wrap(cmd, fn, options) {
-  return function() {
-    var retValue = null;
-
-    state.currentCmd = cmd;
-    state.error = null;
-
-    try {
-      var args = [].slice.call(arguments, 0);
-
-      if (options && options.notUnix) {
-        retValue = fn.apply(this, args);
-      } else {
-        if (args.length === 0 || typeof args[0] !== 'string' || args[0][0] !== '-')
-          args.unshift(''); // only add dummy option if '-option' not already present
-        retValue = fn.apply(this, args);
-      }
-    } catch (e) {
-      if (!state.error) {
-        // If state.error hasn't been set it's an error thrown by Node, not us - probably a bug...
-        console.log('shell.js: internal error');
-        console.log(e.stack || e);
-        process.exit(1);
-      }
-      if (config.fatal)
-        throw e;
-    }
-
-    state.currentCmd = 'shell.js';
-    return retValue;
-  };
-} // wrap
-exports.wrap = wrap;
diff --git a/node_modules/shelljs/src/cp.js b/node_modules/shelljs/src/cp.js
deleted file mode 100644
index ef19f96..0000000
--- a/node_modules/shelljs/src/cp.js
+++ /dev/null
@@ -1,204 +0,0 @@
-var fs = require('fs');
-var path = require('path');
-var common = require('./common');
-var os = require('os');
-
-// Buffered file copy, synchronous
-// (Using readFileSync() + writeFileSync() could easily cause a memory overflow
-//  with large files)
-function copyFileSync(srcFile, destFile) {
-  if (!fs.existsSync(srcFile))
-    common.error('copyFileSync: no such file or directory: ' + srcFile);
-
-  var BUF_LENGTH = 64*1024,
-      buf = new Buffer(BUF_LENGTH),
-      bytesRead = BUF_LENGTH,
-      pos = 0,
-      fdr = null,
-      fdw = null;
-
-  try {
-    fdr = fs.openSync(srcFile, 'r');
-  } catch(e) {
-    common.error('copyFileSync: could not read src file ('+srcFile+')');
-  }
-
-  try {
-    fdw = fs.openSync(destFile, 'w');
-  } catch(e) {
-    common.error('copyFileSync: could not write to dest file (code='+e.code+'):'+destFile);
-  }
-
-  while (bytesRead === BUF_LENGTH) {
-    bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos);
-    fs.writeSync(fdw, buf, 0, bytesRead);
-    pos += bytesRead;
-  }
-
-  fs.closeSync(fdr);
-  fs.closeSync(fdw);
-
-  fs.chmodSync(destFile, fs.statSync(srcFile).mode);
-}
-
-// Recursively copies 'sourceDir' into 'destDir'
-// Adapted from https://github.com/ryanmcgrath/wrench-js
-//
-// Copyright (c) 2010 Ryan McGrath
-// Copyright (c) 2012 Artur Adib
-//
-// Licensed under the MIT License
-// http://www.opensource.org/licenses/mit-license.php
-function cpdirSyncRecursive(sourceDir, destDir, opts) {
-  if (!opts) opts = {};
-
-  /* Create the directory where all our junk is moving to; read the mode of the source directory and mirror it */
-  var checkDir = fs.statSync(sourceDir);
-  try {
-    fs.mkdirSync(destDir, checkDir.mode);
-  } catch (e) {
-    //if the directory already exists, that's okay
-    if (e.code !== 'EEXIST') throw e;
-  }
-
-  var files = fs.readdirSync(sourceDir);
-
-  for (var i = 0; i < files.length; i++) {
-    var srcFile = sourceDir + "/" + files[i];
-    var destFile = destDir + "/" + files[i];
-    var srcFileStat = fs.lstatSync(srcFile);
-
-    if (srcFileStat.isDirectory()) {
-      /* recursion this thing right on back. */
-      cpdirSyncRecursive(srcFile, destFile, opts);
-    } else if (srcFileStat.isSymbolicLink()) {
-      var symlinkFull = fs.readlinkSync(srcFile);
-      fs.symlinkSync(symlinkFull, destFile, os.platform() === "win32" ? "junction" : null);
-    } else {
-      /* At this point, we've hit a file actually worth copying... so copy it on over. */
-      if (fs.existsSync(destFile) && !opts.force) {
-        common.log('skipping existing file: ' + files[i]);
-      } else {
-        copyFileSync(srcFile, destFile);
-      }
-    }
-
-  } // for files
-} // cpdirSyncRecursive
-
-
-//@
-//@ ### cp([options ,] source [,source ...], dest)
-//@ ### cp([options ,] source_array, dest)
-//@ Available options:
-//@
-//@ + `-f`: force
-//@ + `-r, -R`: recursive
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ cp('file1', 'dir1');
-//@ cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp');
-//@ cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above
-//@ ```
-//@
-//@ Copies files. The wildcard `*` is accepted.
-function _cp(options, sources, dest) {
-  options = common.parseOptions(options, {
-    'f': 'force',
-    'R': 'recursive',
-    'r': 'recursive'
-  });
-
-  // Get sources, dest
-  if (arguments.length < 3) {
-    common.error('missing <source> and/or <dest>');
-  } else if (arguments.length > 3) {
-    sources = [].slice.call(arguments, 1, arguments.length - 1);
-    dest = arguments[arguments.length - 1];
-  } else if (typeof sources === 'string') {
-    sources = [sources];
-  } else if ('length' in sources) {
-    sources = sources; // no-op for array
-  } else {
-    common.error('invalid arguments');
-  }
-
-  var exists = fs.existsSync(dest),
-      stats = exists && fs.statSync(dest);
-
-  // Dest is not existing dir, but multiple sources given
-  if ((!exists || !stats.isDirectory()) && sources.length > 1)
-    common.error('dest is not a directory (too many sources)');
-
-  // Dest is an existing file, but no -f given
-  if (exists && stats.isFile() && !options.force)
-    common.error('dest file already exists: ' + dest);
-
-  if (options.recursive) {
-    // Recursive allows the shortcut syntax "sourcedir/" for "sourcedir/*"
-    // (see Github issue #15)
-    sources.forEach(function(src, i) {
-      if (src[src.length - 1] === '/')
-        sources[i] += '*';
-    });
-
-    // Create dest
-    try {
-      fs.mkdirSync(dest, parseInt('0777', 8));
-    } catch (e) {
-      // like Unix's cp, keep going even if we can't create dest dir
-    }
-  }
-
-  sources = common.expand(sources);
-
-  sources.forEach(function(src) {
-    if (!fs.existsSync(src)) {
-      common.error('no such file or directory: '+src, true);
-      return; // skip file
-    }
-
-    // If here, src exists
-    if (fs.statSync(src).isDirectory()) {
-      if (!options.recursive) {
-        // Non-Recursive
-        common.log(src + ' is a directory (not copied)');
-      } else {
-        // Recursive
-        // 'cp /a/source dest' should create 'source' in 'dest'
-        var newDest = path.join(dest, path.basename(src)),
-            checkDir = fs.statSync(src);
-        try {
-          fs.mkdirSync(newDest, checkDir.mode);
-        } catch (e) {
-          //if the directory already exists, that's okay
-          if (e.code !== 'EEXIST') {
-            common.error('dest file no such file or directory: ' + newDest, true);
-            throw e;
-          }
-        }
-
-        cpdirSyncRecursive(src, newDest, {force: options.force});
-      }
-      return; // done with dir
-    }
-
-    // If here, src is a file
-
-    // When copying to '/path/dir':
-    //    thisDest = '/path/dir/file1'
-    var thisDest = dest;
-    if (fs.existsSync(dest) && fs.statSync(dest).isDirectory())
-      thisDest = path.normalize(dest + '/' + path.basename(src));
-
-    if (fs.existsSync(thisDest) && !options.force) {
-      common.error('dest file already exists: ' + thisDest, true);
-      return; // skip file
-    }
-
-    copyFileSync(src, thisDest);
-  }); // forEach(src)
-}
-module.exports = _cp;
diff --git a/node_modules/shelljs/src/dirs.js b/node_modules/shelljs/src/dirs.js
deleted file mode 100644
index 58fae8b..0000000
--- a/node_modules/shelljs/src/dirs.js
+++ /dev/null
@@ -1,191 +0,0 @@
-var common = require('./common');
-var _cd = require('./cd');
-var path = require('path');
-
-// Pushd/popd/dirs internals
-var _dirStack = [];
-
-function _isStackIndex(index) {
-  return (/^[\-+]\d+$/).test(index);
-}
-
-function _parseStackIndex(index) {
-  if (_isStackIndex(index)) {
-    if (Math.abs(index) < _dirStack.length + 1) { // +1 for pwd
-      return (/^-/).test(index) ? Number(index) - 1 : Number(index);
-    } else {
-      common.error(index + ': directory stack index out of range');
-    }
-  } else {
-    common.error(index + ': invalid number');
-  }
-}
-
-function _actualDirStack() {
-  return [process.cwd()].concat(_dirStack);
-}
-
-//@
-//@ ### pushd([options,] [dir | '-N' | '+N'])
-//@
-//@ Available options:
-//@
-//@ + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated.
-//@
-//@ Arguments:
-//@
-//@ + `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`.
-//@ + `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.
-//@ + `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ // process.cwd() === '/usr'
-//@ pushd('/etc'); // Returns /etc /usr
-//@ pushd('+1');   // Returns /usr /etc
-//@ ```
-//@
-//@ Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack.
-function _pushd(options, dir) {
-  if (_isStackIndex(options)) {
-    dir = options;
-    options = '';
-  }
-
-  options = common.parseOptions(options, {
-    'n' : 'no-cd'
-  });
-
-  var dirs = _actualDirStack();
-
-  if (dir === '+0') {
-    return dirs; // +0 is a noop
-  } else if (!dir) {
-    if (dirs.length > 1) {
-      dirs = dirs.splice(1, 1).concat(dirs);
-    } else {
-      return common.error('no other directory');
-    }
-  } else if (_isStackIndex(dir)) {
-    var n = _parseStackIndex(dir);
-    dirs = dirs.slice(n).concat(dirs.slice(0, n));
-  } else {
-    if (options['no-cd']) {
-      dirs.splice(1, 0, dir);
-    } else {
-      dirs.unshift(dir);
-    }
-  }
-
-  if (options['no-cd']) {
-    dirs = dirs.slice(1);
-  } else {
-    dir = path.resolve(dirs.shift());
-    _cd('', dir);
-  }
-
-  _dirStack = dirs;
-  return _dirs('');
-}
-exports.pushd = _pushd;
-
-//@
-//@ ### popd([options,] ['-N' | '+N'])
-//@
-//@ Available options:
-//@
-//@ + `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated.
-//@
-//@ Arguments:
-//@
-//@ + `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero.
-//@ + `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero.
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ echo(process.cwd()); // '/usr'
-//@ pushd('/etc');       // '/etc /usr'
-//@ echo(process.cwd()); // '/etc'
-//@ popd();              // '/usr'
-//@ echo(process.cwd()); // '/usr'
-//@ ```
-//@
-//@ When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack.
-function _popd(options, index) {
-  if (_isStackIndex(options)) {
-    index = options;
-    options = '';
-  }
-
-  options = common.parseOptions(options, {
-    'n' : 'no-cd'
-  });
-
-  if (!_dirStack.length) {
-    return common.error('directory stack empty');
-  }
-
-  index = _parseStackIndex(index || '+0');
-
-  if (options['no-cd'] || index > 0 || _dirStack.length + index === 0) {
-    index = index > 0 ? index - 1 : index;
-    _dirStack.splice(index, 1);
-  } else {
-    var dir = path.resolve(_dirStack.shift());
-    _cd('', dir);
-  }
-
-  return _dirs('');
-}
-exports.popd = _popd;
-
-//@
-//@ ### dirs([options | '+N' | '-N'])
-//@
-//@ Available options:
-//@
-//@ + `-c`: Clears the directory stack by deleting all of the elements.
-//@
-//@ Arguments:
-//@
-//@ + `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero.
-//@ + `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero.
-//@
-//@ Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified.
-//@
-//@ See also: pushd, popd
-function _dirs(options, index) {
-  if (_isStackIndex(options)) {
-    index = options;
-    options = '';
-  }
-
-  options = common.parseOptions(options, {
-    'c' : 'clear'
-  });
-
-  if (options['clear']) {
-    _dirStack = [];
-    return _dirStack;
-  }
-
-  var stack = _actualDirStack();
-
-  if (index) {
-    index = _parseStackIndex(index);
-
-    if (index < 0) {
-      index = stack.length + index;
-    }
-
-    common.log(stack[index]);
-    return stack[index];
-  }
-
-  common.log(stack.join(' '));
-
-  return stack;
-}
-exports.dirs = _dirs;
diff --git a/node_modules/shelljs/src/echo.js b/node_modules/shelljs/src/echo.js
deleted file mode 100644
index 760ea84..0000000
--- a/node_modules/shelljs/src/echo.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var common = require('./common');
-
-//@
-//@ ### echo(string [,string ...])
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ echo('hello world');
-//@ var str = echo('hello world');
-//@ ```
-//@
-//@ Prints string to stdout, and returns string with additional utility methods
-//@ like `.to()`.
-function _echo() {
-  var messages = [].slice.call(arguments, 0);
-  console.log.apply(this, messages);
-  return common.ShellString(messages.join(' '));
-}
-module.exports = _echo;
diff --git a/node_modules/shelljs/src/error.js b/node_modules/shelljs/src/error.js
deleted file mode 100644
index cca3efb..0000000
--- a/node_modules/shelljs/src/error.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var common = require('./common');
-
-//@
-//@ ### error()
-//@ Tests if error occurred in the last command. Returns `null` if no error occurred,
-//@ otherwise returns string explaining the error
-function error() {
-  return common.state.error;
-};
-module.exports = error;
diff --git a/node_modules/shelljs/src/exec.js b/node_modules/shelljs/src/exec.js
deleted file mode 100644
index d259a9f..0000000
--- a/node_modules/shelljs/src/exec.js
+++ /dev/null
@@ -1,216 +0,0 @@
-var common = require('./common');
-var _tempDir = require('./tempdir');
-var _pwd = require('./pwd');
-var path = require('path');
-var fs = require('fs');
-var child = require('child_process');
-
-// Hack to run child_process.exec() synchronously (sync avoids callback hell)
-// Uses a custom wait loop that checks for a flag file, created when the child process is done.
-// (Can't do a wait loop that checks for internal Node variables/messages as
-// Node is single-threaded; callbacks and other internal state changes are done in the
-// event loop).
-function execSync(cmd, opts) {
-  var tempDir = _tempDir();
-  var stdoutFile = path.resolve(tempDir+'/'+common.randomFileName()),
-      codeFile = path.resolve(tempDir+'/'+common.randomFileName()),
-      scriptFile = path.resolve(tempDir+'/'+common.randomFileName()),
-      sleepFile = path.resolve(tempDir+'/'+common.randomFileName());
-
-  var options = common.extend({
-    silent: common.config.silent
-  }, opts);
-
-  var previousStdoutContent = '';
-  // Echoes stdout changes from running process, if not silent
-  function updateStdout() {
-    if (options.silent || !fs.existsSync(stdoutFile))
-      return;
-
-    var stdoutContent = fs.readFileSync(stdoutFile, 'utf8');
-    // No changes since last time?
-    if (stdoutContent.length <= previousStdoutContent.length)
-      return;
-
-    process.stdout.write(stdoutContent.substr(previousStdoutContent.length));
-    previousStdoutContent = stdoutContent;
-  }
-
-  function escape(str) {
-    return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0");
-  }
-
-  if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile);
-  if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile);
-  if (fs.existsSync(codeFile)) common.unlinkSync(codeFile);
-
-  var execCommand = '"'+process.execPath+'" '+scriptFile;
-  var execOptions = {
-    env: process.env,
-    cwd: _pwd(),
-    maxBuffer: 20*1024*1024
-  };
-
-  if (typeof child.execSync === 'function') {
-    var script = [
-      "var child = require('child_process')",
-      "  , fs = require('fs');",
-      "var childProcess = child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {",
-      "  fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');",
-      "});",
-      "var stdoutStream = fs.createWriteStream('"+escape(stdoutFile)+"');",
-      "childProcess.stdout.pipe(stdoutStream, {end: false});",
-      "childProcess.stderr.pipe(stdoutStream, {end: false});",
-      "childProcess.stdout.pipe(process.stdout);",
-      "childProcess.stderr.pipe(process.stderr);",
-      "var stdoutEnded = false, stderrEnded = false;",
-      "function tryClosing(){ if(stdoutEnded && stderrEnded){ stdoutStream.end(); } }",
-      "childProcess.stdout.on('end', function(){ stdoutEnded = true; tryClosing(); });",
-      "childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosing(); });"
-    ].join('\n');
-
-    fs.writeFileSync(scriptFile, script);
-
-    if (options.silent) {
-      execOptions.stdio = 'ignore';
-    } else {
-      execOptions.stdio = [0, 1, 2];
-    }
-
-    // Welcome to the future
-    child.execSync(execCommand, execOptions);
-  } else {
-    cmd += ' > '+stdoutFile+' 2>&1'; // works on both win/unix
-
-    var script = [
-      "var child = require('child_process')",
-      "  , fs = require('fs');",
-      "var childProcess = child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {",
-      "  fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');",
-      "});"
-    ].join('\n');
-
-    fs.writeFileSync(scriptFile, script);
-
-    child.exec(execCommand, execOptions);
-
-    // The wait loop
-    // sleepFile is used as a dummy I/O op to mitigate unnecessary CPU usage
-    // (tried many I/O sync ops, writeFileSync() seems to be only one that is effective in reducing
-    // CPU usage, though apparently not so much on Windows)
-    while (!fs.existsSync(codeFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); }
-    while (!fs.existsSync(stdoutFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); }
-  }
-
-  // At this point codeFile exists, but it's not necessarily flushed yet.
-  // Keep reading it until it is.
-  var code = parseInt('', 10);
-  while (isNaN(code)) {
-    code = parseInt(fs.readFileSync(codeFile, 'utf8'), 10);
-  }
-
-  var stdout = fs.readFileSync(stdoutFile, 'utf8');
-
-  // No biggie if we can't erase the files now -- they're in a temp dir anyway
-  try { common.unlinkSync(scriptFile); } catch(e) {}
-  try { common.unlinkSync(stdoutFile); } catch(e) {}
-  try { common.unlinkSync(codeFile); } catch(e) {}
-  try { common.unlinkSync(sleepFile); } catch(e) {}
-
-  // some shell return codes are defined as errors, per http://tldp.org/LDP/abs/html/exitcodes.html
-  if (code === 1 || code === 2 || code >= 126)  {
-      common.error('', true); // unix/shell doesn't really give an error message after non-zero exit codes
-  }
-  // True if successful, false if not
-  var obj = {
-    code: code,
-    output: stdout
-  };
-  return obj;
-} // execSync()
-
-// Wrapper around exec() to enable echoing output to console in real time
-function execAsync(cmd, opts, callback) {
-  var output = '';
-
-  var options = common.extend({
-    silent: common.config.silent
-  }, opts);
-
-  var c = child.exec(cmd, {env: process.env, maxBuffer: 20*1024*1024}, function(err) {
-    if (callback)
-      callback(err ? err.code : 0, output);
-  });
-
-  c.stdout.on('data', function(data) {
-    output += data;
-    if (!options.silent)
-      process.stdout.write(data);
-  });
-
-  c.stderr.on('data', function(data) {
-    output += data;
-    if (!options.silent)
-      process.stdout.write(data);
-  });
-
-  return c;
-}
-
-//@
-//@ ### exec(command [, options] [, callback])
-//@ Available options (all `false` by default):
-//@
-//@ + `async`: Asynchronous execution. Defaults to true if a callback is provided.
-//@ + `silent`: Do not echo program output to console.
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ var version = exec('node --version', {silent:true}).output;
-//@
-//@ var child = exec('some_long_running_process', {async:true});
-//@ child.stdout.on('data', function(data) {
-//@   /* ... do something with data ... */
-//@ });
-//@
-//@ exec('some_long_running_process', function(code, output) {
-//@   console.log('Exit code:', code);
-//@   console.log('Program output:', output);
-//@ });
-//@ ```
-//@
-//@ Executes the given `command` _synchronously_, unless otherwise specified.
-//@ When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's
-//@ `output` (stdout + stderr)  and its exit `code`. Otherwise returns the child process object, and
-//@ the `callback` gets the arguments `(code, output)`.
-//@
-//@ **Note:** For long-lived processes, it's best to run `exec()` asynchronously as
-//@ the current synchronous implementation uses a lot of CPU. This should be getting
-//@ fixed soon.
-function _exec(command, options, callback) {
-  if (!command)
-    common.error('must specify command');
-
-  // Callback is defined instead of options.
-  if (typeof options === 'function') {
-    callback = options;
-    options = { async: true };
-  }
-
-  // Callback is defined with options.
-  if (typeof options === 'object' && typeof callback === 'function') {
-    options.async = true;
-  }
-
-  options = common.extend({
-    silent: common.config.silent,
-    async: false
-  }, options);
-
-  if (options.async)
-    return execAsync(command, options, callback);
-  else
-    return execSync(command, options);
-}
-module.exports = _exec;
diff --git a/node_modules/shelljs/src/find.js b/node_modules/shelljs/src/find.js
deleted file mode 100644
index d9eeec2..0000000
--- a/node_modules/shelljs/src/find.js
+++ /dev/null
@@ -1,51 +0,0 @@
-var fs = require('fs');
-var common = require('./common');
-var _ls = require('./ls');
-
-//@
-//@ ### find(path [,path ...])
-//@ ### find(path_array)
-//@ Examples:
-//@
-//@ ```javascript
-//@ find('src', 'lib');
-//@ find(['src', 'lib']); // same as above
-//@ find('.').filter(function(file) { return file.match(/\.js$/); });
-//@ ```
-//@
-//@ Returns array of all files (however deep) in the given paths.
-//@
-//@ The main difference from `ls('-R', path)` is that the resulting file names
-//@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`.
-function _find(options, paths) {
-  if (!paths)
-    common.error('no path specified');
-  else if (typeof paths === 'object')
-    paths = paths; // assume array
-  else if (typeof paths === 'string')
-    paths = [].slice.call(arguments, 1);
-
-  var list = [];
-
-  function pushFile(file) {
-    if (common.platform === 'win')
-      file = file.replace(/\\/g, '/');
-    list.push(file);
-  }
-
-  // why not simply do ls('-R', paths)? because the output wouldn't give the base dirs
-  // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory
-
-  paths.forEach(function(file) {
-    pushFile(file);
-
-    if (fs.statSync(file).isDirectory()) {
-      _ls('-RA', file+'/*').forEach(function(subfile) {
-        pushFile(subfile);
-      });
-    }
-  });
-
-  return list;
-}
-module.exports = _find;
diff --git a/node_modules/shelljs/src/grep.js b/node_modules/shelljs/src/grep.js
deleted file mode 100644
index 00c7d6a..0000000
--- a/node_modules/shelljs/src/grep.js
+++ /dev/null
@@ -1,52 +0,0 @@
-var common = require('./common');
-var fs = require('fs');
-
-//@
-//@ ### grep([options ,] regex_filter, file [, file ...])
-//@ ### grep([options ,] regex_filter, file_array)
-//@ Available options:
-//@
-//@ + `-v`: Inverse the sense of the regex and print the lines not matching the criteria.
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ grep('-v', 'GLOBAL_VARIABLE', '*.js');
-//@ grep('GLOBAL_VARIABLE', '*.js');
-//@ ```
-//@
-//@ Reads input string from given files and returns a string containing all lines of the
-//@ file that match the given `regex_filter`. Wildcard `*` accepted.
-function _grep(options, regex, files) {
-  options = common.parseOptions(options, {
-    'v': 'inverse'
-  });
-
-  if (!files)
-    common.error('no paths given');
-
-  if (typeof files === 'string')
-    files = [].slice.call(arguments, 2);
-  // if it's array leave it as it is
-
-  files = common.expand(files);
-
-  var grep = '';
-  files.forEach(function(file) {
-    if (!fs.existsSync(file)) {
-      common.error('no such file or directory: ' + file, true);
-      return;
-    }
-
-    var contents = fs.readFileSync(file, 'utf8'),
-        lines = contents.split(/\r*\n/);
-    lines.forEach(function(line) {
-      var matched = line.match(regex);
-      if ((options.inverse && !matched) || (!options.inverse && matched))
-        grep += line + '\n';
-    });
-  });
-
-  return common.ShellString(grep);
-}
-module.exports = _grep;
diff --git a/node_modules/shelljs/src/ln.js b/node_modules/shelljs/src/ln.js
deleted file mode 100644
index a7b9701..0000000
--- a/node_modules/shelljs/src/ln.js
+++ /dev/null
@@ -1,53 +0,0 @@
-var fs = require('fs');
-var path = require('path');
-var common = require('./common');
-var os = require('os');
-
-//@
-//@ ### ln(options, source, dest)
-//@ ### ln(source, dest)
-//@ Available options:
-//@
-//@ + `s`: symlink
-//@ + `f`: force
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ ln('file', 'newlink');
-//@ ln('-sf', 'file', 'existing');
-//@ ```
-//@
-//@ Links source to dest. Use -f to force the link, should dest already exist.
-function _ln(options, source, dest) {
-  options = common.parseOptions(options, {
-    's': 'symlink',
-    'f': 'force'
-  });
-
-  if (!source || !dest) {
-    common.error('Missing <source> and/or <dest>');
-  }
-
-  source = path.resolve(process.cwd(), String(source));
-  dest = path.resolve(process.cwd(), String(dest));
-
-  if (!fs.existsSync(source)) {
-    common.error('Source file does not exist', true);
-  }
-
-  if (fs.existsSync(dest)) {
-    if (!options.force) {
-      common.error('Destination file exists', true);
-    }
-
-    fs.unlinkSync(dest);
-  }
-
-  if (options.symlink) {
-    fs.symlinkSync(source, dest, os.platform() === "win32" ? "junction" : null);
-  } else {
-    fs.linkSync(source, dest, os.platform() === "win32" ? "junction" : null);
-  }
-}
-module.exports = _ln;
diff --git a/node_modules/shelljs/src/ls.js b/node_modules/shelljs/src/ls.js
deleted file mode 100644
index 3345db4..0000000
--- a/node_modules/shelljs/src/ls.js
+++ /dev/null
@@ -1,126 +0,0 @@
-var path = require('path');
-var fs = require('fs');
-var common = require('./common');
-var _cd = require('./cd');
-var _pwd = require('./pwd');
-
-//@
-//@ ### ls([options ,] path [,path ...])
-//@ ### ls([options ,] path_array)
-//@ Available options:
-//@
-//@ + `-R`: recursive
-//@ + `-A`: all files (include files beginning with `.`, except for `.` and `..`)
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ ls('projs/*.js');
-//@ ls('-R', '/users/me', '/tmp');
-//@ ls('-R', ['/users/me', '/tmp']); // same as above
-//@ ```
-//@
-//@ Returns array of files in the given path, or in current directory if no path provided.
-function _ls(options, paths) {
-  options = common.parseOptions(options, {
-    'R': 'recursive',
-    'A': 'all',
-    'a': 'all_deprecated'
-  });
-
-  if (options.all_deprecated) {
-    // We won't support the -a option as it's hard to image why it's useful
-    // (it includes '.' and '..' in addition to '.*' files)
-    // For backwards compatibility we'll dump a deprecated message and proceed as before
-    common.log('ls: Option -a is deprecated. Use -A instead');
-    options.all = true;
-  }
-
-  if (!paths)
-    paths = ['.'];
-  else if (typeof paths === 'object')
-    paths = paths; // assume array
-  else if (typeof paths === 'string')
-    paths = [].slice.call(arguments, 1);
-
-  var list = [];
-
-  // Conditionally pushes file to list - returns true if pushed, false otherwise
-  // (e.g. prevents hidden files to be included unless explicitly told so)
-  function pushFile(file, query) {
-    // hidden file?
-    if (path.basename(file)[0] === '.') {
-      // not explicitly asking for hidden files?
-      if (!options.all && !(path.basename(query)[0] === '.' && path.basename(query).length > 1))
-        return false;
-    }
-
-    if (common.platform === 'win')
-      file = file.replace(/\\/g, '/');
-
-    list.push(file);
-    return true;
-  }
-
-  paths.forEach(function(p) {
-    if (fs.existsSync(p)) {
-      var stats = fs.statSync(p);
-      // Simple file?
-      if (stats.isFile()) {
-        pushFile(p, p);
-        return; // continue
-      }
-
-      // Simple dir?
-      if (stats.isDirectory()) {
-        // Iterate over p contents
-        fs.readdirSync(p).forEach(function(file) {
-          if (!pushFile(file, p))
-            return;
-
-          // Recursive?
-          if (options.recursive) {
-            var oldDir = _pwd();
-            _cd('', p);
-            if (fs.statSync(file).isDirectory())
-              list = list.concat(_ls('-R'+(options.all?'A':''), file+'/*'));
-            _cd('', oldDir);
-          }
-        });
-        return; // continue
-      }
-    }
-
-    // p does not exist - possible wildcard present
-
-    var basename = path.basename(p);
-    var dirname = path.dirname(p);
-    // Wildcard present on an existing dir? (e.g. '/tmp/*.js')
-    if (basename.search(/\*/) > -1 && fs.existsSync(dirname) && fs.statSync(dirname).isDirectory) {
-      // Escape special regular expression chars
-      var regexp = basename.replace(/(\^|\$|\(|\)|<|>|\[|\]|\{|\}|\.|\+|\?)/g, '\\$1');
-      // Translates wildcard into regex
-      regexp = '^' + regexp.replace(/\*/g, '.*') + '$';
-      // Iterate over directory contents
-      fs.readdirSync(dirname).forEach(function(file) {
-        if (file.match(new RegExp(regexp))) {
-          if (!pushFile(path.normalize(dirname+'/'+file), basename))
-            return;
-
-          // Recursive?
-          if (options.recursive) {
-            var pp = dirname + '/' + file;
-            if (fs.lstatSync(pp).isDirectory())
-              list = list.concat(_ls('-R'+(options.all?'A':''), pp+'/*'));
-          } // recursive
-        } // if file matches
-      }); // forEach
-      return;
-    }
-
-    common.error('no such file or directory: ' + p, true);
-  });
-
-  return list;
-}
-module.exports = _ls;
diff --git a/node_modules/shelljs/src/mkdir.js b/node_modules/shelljs/src/mkdir.js
deleted file mode 100644
index 5a7088f..0000000
--- a/node_modules/shelljs/src/mkdir.js
+++ /dev/null
@@ -1,68 +0,0 @@
-var common = require('./common');
-var fs = require('fs');
-var path = require('path');
-
-// Recursively creates 'dir'
-function mkdirSyncRecursive(dir) {
-  var baseDir = path.dirname(dir);
-
-  // Base dir exists, no recursion necessary
-  if (fs.existsSync(baseDir)) {
-    fs.mkdirSync(dir, parseInt('0777', 8));
-    return;
-  }
-
-  // Base dir does not exist, go recursive
-  mkdirSyncRecursive(baseDir);
-
-  // Base dir created, can create dir
-  fs.mkdirSync(dir, parseInt('0777', 8));
-}
-
-//@
-//@ ### mkdir([options ,] dir [, dir ...])
-//@ ### mkdir([options ,] dir_array)
-//@ Available options:
-//@
-//@ + `p`: full path (will create intermediate dirs if necessary)
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g');
-//@ mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above
-//@ ```
-//@
-//@ Creates directories.
-function _mkdir(options, dirs) {
-  options = common.parseOptions(options, {
-    'p': 'fullpath'
-  });
-  if (!dirs)
-    common.error('no paths given');
-
-  if (typeof dirs === 'string')
-    dirs = [].slice.call(arguments, 1);
-  // if it's array leave it as it is
-
-  dirs.forEach(function(dir) {
-    if (fs.existsSync(dir)) {
-      if (!options.fullpath)
-          common.error('path already exists: ' + dir, true);
-      return; // skip dir
-    }
-
-    // Base dir does not exist, and no -p option given
-    var baseDir = path.dirname(dir);
-    if (!fs.existsSync(baseDir) && !options.fullpath) {
-      common.error('no such file or directory: ' + baseDir, true);
-      return; // skip dir
-    }
-
-    if (options.fullpath)
-      mkdirSyncRecursive(dir);
-    else
-      fs.mkdirSync(dir, parseInt('0777', 8));
-  });
-} // mkdir
-module.exports = _mkdir;
diff --git a/node_modules/shelljs/src/mv.js b/node_modules/shelljs/src/mv.js
deleted file mode 100644
index 11f9607..0000000
--- a/node_modules/shelljs/src/mv.js
+++ /dev/null
@@ -1,80 +0,0 @@
-var fs = require('fs');
-var path = require('path');
-var common = require('./common');
-
-//@
-//@ ### mv(source [, source ...], dest')
-//@ ### mv(source_array, dest')
-//@ Available options:
-//@
-//@ + `f`: force
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ mv('-f', 'file', 'dir/');
-//@ mv('file1', 'file2', 'dir/');
-//@ mv(['file1', 'file2'], 'dir/'); // same as above
-//@ ```
-//@
-//@ Moves files. The wildcard `*` is accepted.
-function _mv(options, sources, dest) {
-  options = common.parseOptions(options, {
-    'f': 'force'
-  });
-
-  // Get sources, dest
-  if (arguments.length < 3) {
-    common.error('missing <source> and/or <dest>');
-  } else if (arguments.length > 3) {
-    sources = [].slice.call(arguments, 1, arguments.length - 1);
-    dest = arguments[arguments.length - 1];
-  } else if (typeof sources === 'string') {
-    sources = [sources];
-  } else if ('length' in sources) {
-    sources = sources; // no-op for array
-  } else {
-    common.error('invalid arguments');
-  }
-
-  sources = common.expand(sources);
-
-  var exists = fs.existsSync(dest),
-      stats = exists && fs.statSync(dest);
-
-  // Dest is not existing dir, but multiple sources given
-  if ((!exists || !stats.isDirectory()) && sources.length > 1)
-    common.error('dest is not a directory (too many sources)');
-
-  // Dest is an existing file, but no -f given
-  if (exists && stats.isFile() && !options.force)
-    common.error('dest file already exists: ' + dest);
-
-  sources.forEach(function(src) {
-    if (!fs.existsSync(src)) {
-      common.error('no such file or directory: '+src, true);
-      return; // skip file
-    }
-
-    // If here, src exists
-
-    // When copying to '/path/dir':
-    //    thisDest = '/path/dir/file1'
-    var thisDest = dest;
-    if (fs.existsSync(dest) && fs.statSync(dest).isDirectory())
-      thisDest = path.normalize(dest + '/' + path.basename(src));
-
-    if (fs.existsSync(thisDest) && !options.force) {
-      common.error('dest file already exists: ' + thisDest, true);
-      return; // skip file
-    }
-
-    if (path.resolve(src) === path.dirname(path.resolve(thisDest))) {
-      common.error('cannot move to self: '+src, true);
-      return; // skip file
-    }
-
-    fs.renameSync(src, thisDest);
-  }); // forEach(src)
-} // mv
-module.exports = _mv;
diff --git a/node_modules/shelljs/src/popd.js b/node_modules/shelljs/src/popd.js
deleted file mode 100644
index 11ea24f..0000000
--- a/node_modules/shelljs/src/popd.js
+++ /dev/null
@@ -1 +0,0 @@
-// see dirs.js
\ No newline at end of file
diff --git a/node_modules/shelljs/src/pushd.js b/node_modules/shelljs/src/pushd.js
deleted file mode 100644
index 11ea24f..0000000
--- a/node_modules/shelljs/src/pushd.js
+++ /dev/null
@@ -1 +0,0 @@
-// see dirs.js
\ No newline at end of file
diff --git a/node_modules/shelljs/src/pwd.js b/node_modules/shelljs/src/pwd.js
deleted file mode 100644
index 41727bb..0000000
--- a/node_modules/shelljs/src/pwd.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var path = require('path');
-var common = require('./common');
-
-//@
-//@ ### pwd()
-//@ Returns the current directory.
-function _pwd(options) {
-  var pwd = path.resolve(process.cwd());
-  return common.ShellString(pwd);
-}
-module.exports = _pwd;
diff --git a/node_modules/shelljs/src/rm.js b/node_modules/shelljs/src/rm.js
deleted file mode 100644
index bd608cb..0000000
--- a/node_modules/shelljs/src/rm.js
+++ /dev/null
@@ -1,163 +0,0 @@
-var common = require('./common');
-var fs = require('fs');
-
-// Recursively removes 'dir'
-// Adapted from https://github.com/ryanmcgrath/wrench-js
-//
-// Copyright (c) 2010 Ryan McGrath
-// Copyright (c) 2012 Artur Adib
-//
-// Licensed under the MIT License
-// http://www.opensource.org/licenses/mit-license.php
-function rmdirSyncRecursive(dir, force) {
-  var files;
-
-  files = fs.readdirSync(dir);
-
-  // Loop through and delete everything in the sub-tree after checking it
-  for(var i = 0; i < files.length; i++) {
-    var file = dir + "/" + files[i],
-        currFile = fs.lstatSync(file);
-
-    if(currFile.isDirectory()) { // Recursive function back to the beginning
-      rmdirSyncRecursive(file, force);
-    }
-
-    else if(currFile.isSymbolicLink()) { // Unlink symlinks
-      if (force || isWriteable(file)) {
-        try {
-          common.unlinkSync(file);
-        } catch (e) {
-          common.error('could not remove file (code '+e.code+'): ' + file, true);
-        }
-      }
-    }
-
-    else // Assume it's a file - perhaps a try/catch belongs here?
-      if (force || isWriteable(file)) {
-        try {
-          common.unlinkSync(file);
-        } catch (e) {
-          common.error('could not remove file (code '+e.code+'): ' + file, true);
-        }
-      }
-  }
-
-  // Now that we know everything in the sub-tree has been deleted, we can delete the main directory.
-  // Huzzah for the shopkeep.
-
-  var result;
-  try {
-    // Retry on windows, sometimes it takes a little time before all the files in the directory are gone
-    var start = Date.now();
-    while (true) {
-      try {
-        result = fs.rmdirSync(dir);
-        if (fs.existsSync(dir)) throw { code: "EAGAIN" }
-        break;
-      } catch(er) {
-        // In addition to error codes, also check if the directory still exists and loop again if true
-        if (process.platform === "win32" && (er.code === "ENOTEMPTY" || er.code === "EBUSY" || er.code === "EPERM" || er.code === "EAGAIN")) {
-          if (Date.now() - start > 1000) throw er;
-        } else if (er.code === "ENOENT") {
-          // Directory did not exist, deletion was successful
-          break;
-        } else {
-          throw er;
-        }
-      }
-    }
-  } catch(e) {
-    common.error('could not remove directory (code '+e.code+'): ' + dir, true);
-  }
-
-  return result;
-} // rmdirSyncRecursive
-
-// Hack to determine if file has write permissions for current user
-// Avoids having to check user, group, etc, but it's probably slow
-function isWriteable(file) {
-  var writePermission = true;
-  try {
-    var __fd = fs.openSync(file, 'a');
-    fs.closeSync(__fd);
-  } catch(e) {
-    writePermission = false;
-  }
-
-  return writePermission;
-}
-
-//@
-//@ ### rm([options ,] file [, file ...])
-//@ ### rm([options ,] file_array)
-//@ Available options:
-//@
-//@ + `-f`: force
-//@ + `-r, -R`: recursive
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ rm('-rf', '/tmp/*');
-//@ rm('some_file.txt', 'another_file.txt');
-//@ rm(['some_file.txt', 'another_file.txt']); // same as above
-//@ ```
-//@
-//@ Removes files. The wildcard `*` is accepted.
-function _rm(options, files) {
-  options = common.parseOptions(options, {
-    'f': 'force',
-    'r': 'recursive',
-    'R': 'recursive'
-  });
-  if (!files)
-    common.error('no paths given');
-
-  if (typeof files === 'string')
-    files = [].slice.call(arguments, 1);
-  // if it's array leave it as it is
-
-  files = common.expand(files);
-
-  files.forEach(function(file) {
-    if (!fs.existsSync(file)) {
-      // Path does not exist, no force flag given
-      if (!options.force)
-        common.error('no such file or directory: '+file, true);
-
-      return; // skip file
-    }
-
-    // If here, path exists
-
-    var stats = fs.lstatSync(file);
-    if (stats.isFile() || stats.isSymbolicLink()) {
-
-      // Do not check for file writing permissions
-      if (options.force) {
-        common.unlinkSync(file);
-        return;
-      }
-
-      if (isWriteable(file))
-        common.unlinkSync(file);
-      else
-        common.error('permission denied: '+file, true);
-
-      return;
-    } // simple file
-
-    // Path is an existing directory, but no -r flag given
-    if (stats.isDirectory() && !options.recursive) {
-      common.error('path is a directory', true);
-      return; // skip path
-    }
-
-    // Recursively remove existing directory
-    if (stats.isDirectory() && options.recursive) {
-      rmdirSyncRecursive(file, options.force);
-    }
-  }); // forEach(file)
-} // rm
-module.exports = _rm;
diff --git a/node_modules/shelljs/src/sed.js b/node_modules/shelljs/src/sed.js
deleted file mode 100644
index 65f7cb4..0000000
--- a/node_modules/shelljs/src/sed.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var common = require('./common');
-var fs = require('fs');
-
-//@
-//@ ### sed([options ,] search_regex, replacement, file)
-//@ Available options:
-//@
-//@ + `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js');
-//@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js');
-//@ ```
-//@
-//@ Reads an input string from `file` and performs a JavaScript `replace()` on the input
-//@ using the given search regex and replacement string or function. Returns the new string after replacement.
-function _sed(options, regex, replacement, file) {
-  options = common.parseOptions(options, {
-    'i': 'inplace'
-  });
-
-  if (typeof replacement === 'string' || typeof replacement === 'function')
-    replacement = replacement; // no-op
-  else if (typeof replacement === 'number')
-    replacement = replacement.toString(); // fallback
-  else
-    common.error('invalid replacement string');
-
-  if (!file)
-    common.error('no file given');
-
-  if (!fs.existsSync(file))
-    common.error('no such file or directory: ' + file);
-
-  var result = fs.readFileSync(file, 'utf8').replace(regex, replacement);
-  if (options.inplace)
-    fs.writeFileSync(file, result, 'utf8');
-
-  return common.ShellString(result);
-}
-module.exports = _sed;
diff --git a/node_modules/shelljs/src/tempdir.js b/node_modules/shelljs/src/tempdir.js
deleted file mode 100644
index 45953c2..0000000
--- a/node_modules/shelljs/src/tempdir.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var common = require('./common');
-var os = require('os');
-var fs = require('fs');
-
-// Returns false if 'dir' is not a writeable directory, 'dir' otherwise
-function writeableDir(dir) {
-  if (!dir || !fs.existsSync(dir))
-    return false;
-
-  if (!fs.statSync(dir).isDirectory())
-    return false;
-
-  var testFile = dir+'/'+common.randomFileName();
-  try {
-    fs.writeFileSync(testFile, ' ');
-    common.unlinkSync(testFile);
-    return dir;
-  } catch (e) {
-    return false;
-  }
-}
-
-
-//@
-//@ ### tempdir()
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ var tmp = tempdir(); // "/tmp" for most *nix platforms
-//@ ```
-//@
-//@ Searches and returns string containing a writeable, platform-dependent temporary directory.
-//@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir).
-function _tempDir() {
-  var state = common.state;
-  if (state.tempDir)
-    return state.tempDir; // from cache
-
-  state.tempDir = writeableDir(os.tempDir && os.tempDir()) || // node 0.8+
-                  writeableDir(process.env['TMPDIR']) ||
-                  writeableDir(process.env['TEMP']) ||
-                  writeableDir(process.env['TMP']) ||
-                  writeableDir(process.env['Wimp$ScrapDir']) || // RiscOS
-                  writeableDir('C:\\TEMP') || // Windows
-                  writeableDir('C:\\TMP') || // Windows
-                  writeableDir('\\TEMP') || // Windows
-                  writeableDir('\\TMP') || // Windows
-                  writeableDir('/tmp') ||
-                  writeableDir('/var/tmp') ||
-                  writeableDir('/usr/tmp') ||
-                  writeableDir('.'); // last resort
-
-  return state.tempDir;
-}
-module.exports = _tempDir;
diff --git a/node_modules/shelljs/src/test.js b/node_modules/shelljs/src/test.js
deleted file mode 100644
index 8a4ac7d..0000000
--- a/node_modules/shelljs/src/test.js
+++ /dev/null
@@ -1,85 +0,0 @@
-var common = require('./common');
-var fs = require('fs');
-
-//@
-//@ ### test(expression)
-//@ Available expression primaries:
-//@
-//@ + `'-b', 'path'`: true if path is a block device
-//@ + `'-c', 'path'`: true if path is a character device
-//@ + `'-d', 'path'`: true if path is a directory
-//@ + `'-e', 'path'`: true if path exists
-//@ + `'-f', 'path'`: true if path is a regular file
-//@ + `'-L', 'path'`: true if path is a symboilc link
-//@ + `'-p', 'path'`: true if path is a pipe (FIFO)
-//@ + `'-S', 'path'`: true if path is a socket
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ if (test('-d', path)) { /* do something with dir */ };
-//@ if (!test('-f', path)) continue; // skip if it's a regular file
-//@ ```
-//@
-//@ Evaluates expression using the available primaries and returns corresponding value.
-function _test(options, path) {
-  if (!path)
-    common.error('no path given');
-
-  // hack - only works with unary primaries
-  options = common.parseOptions(options, {
-    'b': 'block',
-    'c': 'character',
-    'd': 'directory',
-    'e': 'exists',
-    'f': 'file',
-    'L': 'link',
-    'p': 'pipe',
-    'S': 'socket'
-  });
-
-  var canInterpret = false;
-  for (var key in options)
-    if (options[key] === true) {
-      canInterpret = true;
-      break;
-    }
-
-  if (!canInterpret)
-    common.error('could not interpret expression');
-
-  if (options.link) {
-    try {
-      return fs.lstatSync(path).isSymbolicLink();
-    } catch(e) {
-      return false;
-    }
-  }
-
-  if (!fs.existsSync(path))
-    return false;
-
-  if (options.exists)
-    return true;
-
-  var stats = fs.statSync(path);
-
-  if (options.block)
-    return stats.isBlockDevice();
-
-  if (options.character)
-    return stats.isCharacterDevice();
-
-  if (options.directory)
-    return stats.isDirectory();
-
-  if (options.file)
-    return stats.isFile();
-
-  if (options.pipe)
-    return stats.isFIFO();
-
-  if (options.socket)
-    return stats.isSocket();
-} // test
-module.exports = _test;
diff --git a/node_modules/shelljs/src/to.js b/node_modules/shelljs/src/to.js
deleted file mode 100644
index f029999..0000000
--- a/node_modules/shelljs/src/to.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var common = require('./common');
-var fs = require('fs');
-var path = require('path');
-
-//@
-//@ ### 'string'.to(file)
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ cat('input.txt').to('output.txt');
-//@ ```
-//@
-//@ Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as
-//@ those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_
-function _to(options, file) {
-  if (!file)
-    common.error('wrong arguments');
-
-  if (!fs.existsSync( path.dirname(file) ))
-      common.error('no such file or directory: ' + path.dirname(file));
-
-  try {
-    fs.writeFileSync(file, this.toString(), 'utf8');
-  } catch(e) {
-    common.error('could not write to file (code '+e.code+'): '+file, true);
-  }
-}
-module.exports = _to;
diff --git a/node_modules/shelljs/src/toEnd.js b/node_modules/shelljs/src/toEnd.js
deleted file mode 100644
index f6d099d..0000000
--- a/node_modules/shelljs/src/toEnd.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var common = require('./common');
-var fs = require('fs');
-var path = require('path');
-
-//@
-//@ ### 'string'.toEnd(file)
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ cat('input.txt').toEnd('output.txt');
-//@ ```
-//@
-//@ Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as
-//@ those returned by `cat`, `grep`, etc).
-function _toEnd(options, file) {
-  if (!file)
-    common.error('wrong arguments');
-
-  if (!fs.existsSync( path.dirname(file) ))
-      common.error('no such file or directory: ' + path.dirname(file));
-
-  try {
-    fs.appendFileSync(file, this.toString(), 'utf8');
-  } catch(e) {
-    common.error('could not append to file (code '+e.code+'): '+file, true);
-  }
-}
-module.exports = _toEnd;
diff --git a/node_modules/shelljs/src/which.js b/node_modules/shelljs/src/which.js
deleted file mode 100644
index 2822ecf..0000000
--- a/node_modules/shelljs/src/which.js
+++ /dev/null
@@ -1,83 +0,0 @@
-var common = require('./common');
-var fs = require('fs');
-var path = require('path');
-
-// Cross-platform method for splitting environment PATH variables
-function splitPath(p) {
-  for (i=1;i<2;i++) {}
-
-  if (!p)
-    return [];
-
-  if (common.platform === 'win')
-    return p.split(';');
-  else
-    return p.split(':');
-}
-
-function checkPath(path) {
-  return fs.existsSync(path) && fs.statSync(path).isDirectory() == false;
-}
-
-//@
-//@ ### which(command)
-//@
-//@ Examples:
-//@
-//@ ```javascript
-//@ var nodeExec = which('node');
-//@ ```
-//@
-//@ Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions.
-//@ Returns string containing the absolute path to the command.
-function _which(options, cmd) {
-  if (!cmd)
-    common.error('must specify command');
-
-  var pathEnv = process.env.path || process.env.Path || process.env.PATH,
-      pathArray = splitPath(pathEnv),
-      where = null;
-
-  // No relative/absolute paths provided?
-  if (cmd.search(/\//) === -1) {
-    // Search for command in PATH
-    pathArray.forEach(function(dir) {
-      if (where)
-        return; // already found it
-
-      var attempt = path.resolve(dir + '/' + cmd);
-      if (checkPath(attempt)) {
-        where = attempt;
-        return;
-      }
-
-      if (common.platform === 'win') {
-        var baseAttempt = attempt;
-        attempt = baseAttempt + '.exe';
-        if (checkPath(attempt)) {
-          where = attempt;
-          return;
-        }
-        attempt = baseAttempt + '.cmd';
-        if (checkPath(attempt)) {
-          where = attempt;
-          return;
-        }
-        attempt = baseAttempt + '.bat';
-        if (checkPath(attempt)) {
-          where = attempt;
-          return;
-        }
-      } // if 'win'
-    });
-  }
-
-  // Command not found anywhere?
-  if (!checkPath(cmd) && !where)
-    return null;
-
-  where = where || path.resolve(cmd);
-
-  return common.ShellString(where);
-}
-module.exports = _which;
diff --git a/node_modules/underscore/LICENSE b/node_modules/underscore/LICENSE
deleted file mode 100644
index ad0e71b..0000000
--- a/node_modules/underscore/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative
-Reporters & Editors
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/underscore/README.md b/node_modules/underscore/README.md
deleted file mode 100644
index c2ba259..0000000
--- a/node_modules/underscore/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-                       __
-                      /\ \                                                         __
-     __  __    ___    \_\ \     __   _ __   ____    ___    ___   _ __    __       /\_\    ____
-    /\ \/\ \ /' _ `\  /'_  \  /'__`\/\  __\/ ,__\  / ___\ / __`\/\  __\/'__`\     \/\ \  /',__\
-    \ \ \_\ \/\ \/\ \/\ \ \ \/\  __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\  __/  __  \ \ \/\__, `\
-     \ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/
-      \/___/  \/_/\/_/\/__,_ /\/____/ \/_/ \/___/  \/____/\/___/  \/_/ \/____/\/_//\ \_\ \/___/
-                                                                                  \ \____/
-                                                                                   \/___/
-
-Underscore.js is a utility-belt library for JavaScript that provides
-support for the usual functional suspects (each, map, reduce, filter...)
-without extending any core JavaScript objects.
-
-For Docs, License, Tests, and pre-packed downloads, see:
-http://underscorejs.org
-
-Underscore is an open-sourced component of DocumentCloud:
-https://github.com/documentcloud
-
-Many thanks to our contributors:
-https://github.com/jashkenas/underscore/contributors
diff --git a/node_modules/underscore/package.json b/node_modules/underscore/package.json
deleted file mode 100644
index 0ab7336..0000000
--- a/node_modules/underscore/package.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "_args": [
-    [
-      "underscore@1.8.3",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "underscore@1.8.3",
-  "_id": "underscore@1.8.3",
-  "_inBundle": false,
-  "_integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
-  "_location": "/underscore",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "underscore@1.8.3",
-    "name": "underscore",
-    "escapedName": "underscore",
-    "rawSpec": "1.8.3",
-    "saveSpec": null,
-    "fetchSpec": "1.8.3"
-  },
-  "_requiredBy": [
-    "/cordova-common"
-  ],
-  "_resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
-  "_spec": "1.8.3",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Jeremy Ashkenas",
-    "email": "jeremy@documentcloud.org"
-  },
-  "bugs": {
-    "url": "https://github.com/jashkenas/underscore/issues"
-  },
-  "description": "JavaScript's functional programming helper library.",
-  "devDependencies": {
-    "docco": "*",
-    "eslint": "0.6.x",
-    "karma": "~0.12.31",
-    "karma-qunit": "~0.1.4",
-    "qunit-cli": "~0.2.0",
-    "uglify-js": "2.4.x"
-  },
-  "files": [
-    "underscore.js",
-    "underscore-min.js",
-    "underscore-min.map",
-    "LICENSE"
-  ],
-  "homepage": "http://underscorejs.org",
-  "keywords": [
-    "util",
-    "functional",
-    "server",
-    "client",
-    "browser"
-  ],
-  "license": "MIT",
-  "main": "underscore.js",
-  "name": "underscore",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/jashkenas/underscore.git"
-  },
-  "scripts": {
-    "build": "uglifyjs underscore.js -c \"evaluate=false\" --comments \"/    .*/\" -m --source-map underscore-min.map -o underscore-min.js",
-    "doc": "docco underscore.js",
-    "lint": "eslint underscore.js test/*.js",
-    "test": "npm run test-node && npm run lint",
-    "test-browser": "npm i karma-phantomjs-launcher && ./node_modules/karma/bin/karma start",
-    "test-node": "qunit-cli test/*.js"
-  },
-  "version": "1.8.3"
-}
diff --git a/node_modules/underscore/underscore-min.js b/node_modules/underscore/underscore-min.js
deleted file mode 100644
index f01025b..0000000
--- a/node_modules/underscore/underscore-min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-//     Underscore.js 1.8.3
-//     http://underscorejs.org
-//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
-//     Underscore may be freely distributed under the MIT license.
-(function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.hasOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}},j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])<u?i=a+1:o=a}return i},m.indexOf=r(1,m.findIndex,m.sortedIndex),m.lastIndexOf=r(-1,m.findLastIndex),m.range=function(n,t,r){null==t&&(t=n||0,n=0),r=r||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=Array(e),i=0;e>i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e<arguments.length;)i.push(arguments[e++]);return E(n,r,this,this,i)};return r},m.bindAll=function(n){var t,r,e=arguments.length;if(1>=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this);
-//# sourceMappingURL=underscore-min.map
\ No newline at end of file
diff --git a/node_modules/underscore/underscore-min.map b/node_modules/underscore/underscore-min.map
deleted file mode 100644
index cf356bf..0000000
--- a/node_modules/underscore/underscore-min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"underscore-min.js","sources":["underscore.js"],"names":["createReduce","dir","iterator","obj","iteratee","memo","keys","index","length","currentKey","context","optimizeCb","isArrayLike","_","arguments","createPredicateIndexFinder","array","predicate","cb","getLength","createIndexFinder","predicateFind","sortedIndex","item","idx","i","Math","max","min","slice","call","isNaN","collectNonEnumProps","nonEnumIdx","nonEnumerableProps","constructor","proto","isFunction","prototype","ObjProto","prop","has","contains","push","root","this","previousUnderscore","ArrayProto","Array","Object","FuncProto","Function","toString","hasOwnProperty","nativeIsArray","isArray","nativeKeys","nativeBind","bind","nativeCreate","create","Ctor","_wrapped","exports","module","VERSION","func","argCount","value","other","collection","accumulator","apply","identity","isObject","matcher","property","Infinity","createAssigner","keysFunc","undefinedOnly","source","l","key","baseCreate","result","MAX_ARRAY_INDEX","pow","each","forEach","map","collect","results","reduce","foldl","inject","reduceRight","foldr","find","detect","findIndex","findKey","filter","select","list","reject","negate","every","all","some","any","includes","include","fromIndex","guard","values","indexOf","invoke","method","args","isFunc","pluck","where","attrs","findWhere","computed","lastComputed","shuffle","rand","set","shuffled","random","sample","n","sortBy","criteria","sort","left","right","a","b","group","behavior","groupBy","indexBy","countBy","toArray","size","partition","pass","fail","first","head","take","initial","last","rest","tail","drop","compact","flatten","input","shallow","strict","startIndex","output","isArguments","j","len","without","difference","uniq","unique","isSorted","isBoolean","seen","union","intersection","argsLength","zip","unzip","object","findLastIndex","low","high","mid","floor","lastIndexOf","range","start","stop","step","ceil","executeBound","sourceFunc","boundFunc","callingContext","self","TypeError","bound","concat","partial","boundArgs","position","bindAll","Error","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","now","remaining","clearTimeout","trailing","debounce","immediate","timestamp","callNow","wrap","wrapper","compose","after","times","before","once","hasEnumBug","propertyIsEnumerable","allKeys","mapObject","pairs","invert","functions","methods","names","extend","extendOwn","assign","pick","oiteratee","omit","String","defaults","props","clone","tap","interceptor","isMatch","eq","aStack","bStack","className","areArrays","aCtor","bCtor","pop","isEqual","isEmpty","isString","isElement","nodeType","type","name","Int8Array","isFinite","parseFloat","isNumber","isNull","isUndefined","noConflict","constant","noop","propertyOf","matches","accum","Date","getTime","escapeMap","&","<",">","\"","'","`","unescapeMap","createEscaper","escaper","match","join","testRegexp","RegExp","replaceRegexp","string","test","replace","escape","unescape","fallback","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","\\","\r","\n","
","
","escapeChar","template","text","settings","oldSettings","offset","variable","render","e","data","argument","chain","instance","_chain","mixin","valueOf","toJSON","define","amd"],"mappings":"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"}
\ No newline at end of file
diff --git a/node_modules/underscore/underscore.js b/node_modules/underscore/underscore.js
deleted file mode 100644
index b29332f..0000000
--- a/node_modules/underscore/underscore.js
+++ /dev/null
@@ -1,1548 +0,0 @@
-//     Underscore.js 1.8.3
-//     http://underscorejs.org
-//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
-//     Underscore may be freely distributed under the MIT license.
-
-(function() {
-
-  // Baseline setup
-  // --------------
-
-  // Establish the root object, `window` in the browser, or `exports` on the server.
-  var root = this;
-
-  // Save the previous value of the `_` variable.
-  var previousUnderscore = root._;
-
-  // Save bytes in the minified (but not gzipped) version:
-  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
-
-  // Create quick reference variables for speed access to core prototypes.
-  var
-    push             = ArrayProto.push,
-    slice            = ArrayProto.slice,
-    toString         = ObjProto.toString,
-    hasOwnProperty   = ObjProto.hasOwnProperty;
-
-  // All **ECMAScript 5** native function implementations that we hope to use
-  // are declared here.
-  var
-    nativeIsArray      = Array.isArray,
-    nativeKeys         = Object.keys,
-    nativeBind         = FuncProto.bind,
-    nativeCreate       = Object.create;
-
-  // Naked function reference for surrogate-prototype-swapping.
-  var Ctor = function(){};
-
-  // Create a safe reference to the Underscore object for use below.
-  var _ = function(obj) {
-    if (obj instanceof _) return obj;
-    if (!(this instanceof _)) return new _(obj);
-    this._wrapped = obj;
-  };
-
-  // Export the Underscore object for **Node.js**, with
-  // backwards-compatibility for the old `require()` API. If we're in
-  // the browser, add `_` as a global object.
-  if (typeof exports !== 'undefined') {
-    if (typeof module !== 'undefined' && module.exports) {
-      exports = module.exports = _;
-    }
-    exports._ = _;
-  } else {
-    root._ = _;
-  }
-
-  // Current version.
-  _.VERSION = '1.8.3';
-
-  // Internal function that returns an efficient (for current engines) version
-  // of the passed-in callback, to be repeatedly applied in other Underscore
-  // functions.
-  var optimizeCb = function(func, context, argCount) {
-    if (context === void 0) return func;
-    switch (argCount == null ? 3 : argCount) {
-      case 1: return function(value) {
-        return func.call(context, value);
-      };
-      case 2: return function(value, other) {
-        return func.call(context, value, other);
-      };
-      case 3: return function(value, index, collection) {
-        return func.call(context, value, index, collection);
-      };
-      case 4: return function(accumulator, value, index, collection) {
-        return func.call(context, accumulator, value, index, collection);
-      };
-    }
-    return function() {
-      return func.apply(context, arguments);
-    };
-  };
-
-  // A mostly-internal function to generate callbacks that can be applied
-  // to each element in a collection, returning the desired result — either
-  // identity, an arbitrary callback, a property matcher, or a property accessor.
-  var cb = function(value, context, argCount) {
-    if (value == null) return _.identity;
-    if (_.isFunction(value)) return optimizeCb(value, context, argCount);
-    if (_.isObject(value)) return _.matcher(value);
-    return _.property(value);
-  };
-  _.iteratee = function(value, context) {
-    return cb(value, context, Infinity);
-  };
-
-  // An internal function for creating assigner functions.
-  var createAssigner = function(keysFunc, undefinedOnly) {
-    return function(obj) {
-      var length = arguments.length;
-      if (length < 2 || obj == null) return obj;
-      for (var index = 1; index < length; index++) {
-        var source = arguments[index],
-            keys = keysFunc(source),
-            l = keys.length;
-        for (var i = 0; i < l; i++) {
-          var key = keys[i];
-          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
-        }
-      }
-      return obj;
-    };
-  };
-
-  // An internal function for creating a new object that inherits from another.
-  var baseCreate = function(prototype) {
-    if (!_.isObject(prototype)) return {};
-    if (nativeCreate) return nativeCreate(prototype);
-    Ctor.prototype = prototype;
-    var result = new Ctor;
-    Ctor.prototype = null;
-    return result;
-  };
-
-  var property = function(key) {
-    return function(obj) {
-      return obj == null ? void 0 : obj[key];
-    };
-  };
-
-  // Helper for collection methods to determine whether a collection
-  // should be iterated as an array or as an object
-  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
-  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
-  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
-  var getLength = property('length');
-  var isArrayLike = function(collection) {
-    var length = getLength(collection);
-    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
-  };
-
-  // Collection Functions
-  // --------------------
-
-  // The cornerstone, an `each` implementation, aka `forEach`.
-  // Handles raw objects in addition to array-likes. Treats all
-  // sparse array-likes as if they were dense.
-  _.each = _.forEach = function(obj, iteratee, context) {
-    iteratee = optimizeCb(iteratee, context);
-    var i, length;
-    if (isArrayLike(obj)) {
-      for (i = 0, length = obj.length; i < length; i++) {
-        iteratee(obj[i], i, obj);
-      }
-    } else {
-      var keys = _.keys(obj);
-      for (i = 0, length = keys.length; i < length; i++) {
-        iteratee(obj[keys[i]], keys[i], obj);
-      }
-    }
-    return obj;
-  };
-
-  // Return the results of applying the iteratee to each element.
-  _.map = _.collect = function(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    var keys = !isArrayLike(obj) && _.keys(obj),
-        length = (keys || obj).length,
-        results = Array(length);
-    for (var index = 0; index < length; index++) {
-      var currentKey = keys ? keys[index] : index;
-      results[index] = iteratee(obj[currentKey], currentKey, obj);
-    }
-    return results;
-  };
-
-  // Create a reducing function iterating left or right.
-  function createReduce(dir) {
-    // Optimized iterator function as using arguments.length
-    // in the main function will deoptimize the, see #1991.
-    function iterator(obj, iteratee, memo, keys, index, length) {
-      for (; index >= 0 && index < length; index += dir) {
-        var currentKey = keys ? keys[index] : index;
-        memo = iteratee(memo, obj[currentKey], currentKey, obj);
-      }
-      return memo;
-    }
-
-    return function(obj, iteratee, memo, context) {
-      iteratee = optimizeCb(iteratee, context, 4);
-      var keys = !isArrayLike(obj) && _.keys(obj),
-          length = (keys || obj).length,
-          index = dir > 0 ? 0 : length - 1;
-      // Determine the initial value if none is provided.
-      if (arguments.length < 3) {
-        memo = obj[keys ? keys[index] : index];
-        index += dir;
-      }
-      return iterator(obj, iteratee, memo, keys, index, length);
-    };
-  }
-
-  // **Reduce** builds up a single result from a list of values, aka `inject`,
-  // or `foldl`.
-  _.reduce = _.foldl = _.inject = createReduce(1);
-
-  // The right-associative version of reduce, also known as `foldr`.
-  _.reduceRight = _.foldr = createReduce(-1);
-
-  // Return the first value which passes a truth test. Aliased as `detect`.
-  _.find = _.detect = function(obj, predicate, context) {
-    var key;
-    if (isArrayLike(obj)) {
-      key = _.findIndex(obj, predicate, context);
-    } else {
-      key = _.findKey(obj, predicate, context);
-    }
-    if (key !== void 0 && key !== -1) return obj[key];
-  };
-
-  // Return all the elements that pass a truth test.
-  // Aliased as `select`.
-  _.filter = _.select = function(obj, predicate, context) {
-    var results = [];
-    predicate = cb(predicate, context);
-    _.each(obj, function(value, index, list) {
-      if (predicate(value, index, list)) results.push(value);
-    });
-    return results;
-  };
-
-  // Return all the elements for which a truth test fails.
-  _.reject = function(obj, predicate, context) {
-    return _.filter(obj, _.negate(cb(predicate)), context);
-  };
-
-  // Determine whether all of the elements match a truth test.
-  // Aliased as `all`.
-  _.every = _.all = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var keys = !isArrayLike(obj) && _.keys(obj),
-        length = (keys || obj).length;
-    for (var index = 0; index < length; index++) {
-      var currentKey = keys ? keys[index] : index;
-      if (!predicate(obj[currentKey], currentKey, obj)) return false;
-    }
-    return true;
-  };
-
-  // Determine if at least one element in the object matches a truth test.
-  // Aliased as `any`.
-  _.some = _.any = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var keys = !isArrayLike(obj) && _.keys(obj),
-        length = (keys || obj).length;
-    for (var index = 0; index < length; index++) {
-      var currentKey = keys ? keys[index] : index;
-      if (predicate(obj[currentKey], currentKey, obj)) return true;
-    }
-    return false;
-  };
-
-  // Determine if the array or object contains a given item (using `===`).
-  // Aliased as `includes` and `include`.
-  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
-    if (!isArrayLike(obj)) obj = _.values(obj);
-    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
-    return _.indexOf(obj, item, fromIndex) >= 0;
-  };
-
-  // Invoke a method (with arguments) on every item in a collection.
-  _.invoke = function(obj, method) {
-    var args = slice.call(arguments, 2);
-    var isFunc = _.isFunction(method);
-    return _.map(obj, function(value) {
-      var func = isFunc ? method : value[method];
-      return func == null ? func : func.apply(value, args);
-    });
-  };
-
-  // Convenience version of a common use case of `map`: fetching a property.
-  _.pluck = function(obj, key) {
-    return _.map(obj, _.property(key));
-  };
-
-  // Convenience version of a common use case of `filter`: selecting only objects
-  // containing specific `key:value` pairs.
-  _.where = function(obj, attrs) {
-    return _.filter(obj, _.matcher(attrs));
-  };
-
-  // Convenience version of a common use case of `find`: getting the first object
-  // containing specific `key:value` pairs.
-  _.findWhere = function(obj, attrs) {
-    return _.find(obj, _.matcher(attrs));
-  };
-
-  // Return the maximum element (or element-based computation).
-  _.max = function(obj, iteratee, context) {
-    var result = -Infinity, lastComputed = -Infinity,
-        value, computed;
-    if (iteratee == null && obj != null) {
-      obj = isArrayLike(obj) ? obj : _.values(obj);
-      for (var i = 0, length = obj.length; i < length; i++) {
-        value = obj[i];
-        if (value > result) {
-          result = value;
-        }
-      }
-    } else {
-      iteratee = cb(iteratee, context);
-      _.each(obj, function(value, index, list) {
-        computed = iteratee(value, index, list);
-        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
-          result = value;
-          lastComputed = computed;
-        }
-      });
-    }
-    return result;
-  };
-
-  // Return the minimum element (or element-based computation).
-  _.min = function(obj, iteratee, context) {
-    var result = Infinity, lastComputed = Infinity,
-        value, computed;
-    if (iteratee == null && obj != null) {
-      obj = isArrayLike(obj) ? obj : _.values(obj);
-      for (var i = 0, length = obj.length; i < length; i++) {
-        value = obj[i];
-        if (value < result) {
-          result = value;
-        }
-      }
-    } else {
-      iteratee = cb(iteratee, context);
-      _.each(obj, function(value, index, list) {
-        computed = iteratee(value, index, list);
-        if (computed < lastComputed || computed === Infinity && result === Infinity) {
-          result = value;
-          lastComputed = computed;
-        }
-      });
-    }
-    return result;
-  };
-
-  // Shuffle a collection, using the modern version of the
-  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
-  _.shuffle = function(obj) {
-    var set = isArrayLike(obj) ? obj : _.values(obj);
-    var length = set.length;
-    var shuffled = Array(length);
-    for (var index = 0, rand; index < length; index++) {
-      rand = _.random(0, index);
-      if (rand !== index) shuffled[index] = shuffled[rand];
-      shuffled[rand] = set[index];
-    }
-    return shuffled;
-  };
-
-  // Sample **n** random values from a collection.
-  // If **n** is not specified, returns a single random element.
-  // The internal `guard` argument allows it to work with `map`.
-  _.sample = function(obj, n, guard) {
-    if (n == null || guard) {
-      if (!isArrayLike(obj)) obj = _.values(obj);
-      return obj[_.random(obj.length - 1)];
-    }
-    return _.shuffle(obj).slice(0, Math.max(0, n));
-  };
-
-  // Sort the object's values by a criterion produced by an iteratee.
-  _.sortBy = function(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    return _.pluck(_.map(obj, function(value, index, list) {
-      return {
-        value: value,
-        index: index,
-        criteria: iteratee(value, index, list)
-      };
-    }).sort(function(left, right) {
-      var a = left.criteria;
-      var b = right.criteria;
-      if (a !== b) {
-        if (a > b || a === void 0) return 1;
-        if (a < b || b === void 0) return -1;
-      }
-      return left.index - right.index;
-    }), 'value');
-  };
-
-  // An internal function used for aggregate "group by" operations.
-  var group = function(behavior) {
-    return function(obj, iteratee, context) {
-      var result = {};
-      iteratee = cb(iteratee, context);
-      _.each(obj, function(value, index) {
-        var key = iteratee(value, index, obj);
-        behavior(result, value, key);
-      });
-      return result;
-    };
-  };
-
-  // Groups the object's values by a criterion. Pass either a string attribute
-  // to group by, or a function that returns the criterion.
-  _.groupBy = group(function(result, value, key) {
-    if (_.has(result, key)) result[key].push(value); else result[key] = [value];
-  });
-
-  // Indexes the object's values by a criterion, similar to `groupBy`, but for
-  // when you know that your index values will be unique.
-  _.indexBy = group(function(result, value, key) {
-    result[key] = value;
-  });
-
-  // Counts instances of an object that group by a certain criterion. Pass
-  // either a string attribute to count by, or a function that returns the
-  // criterion.
-  _.countBy = group(function(result, value, key) {
-    if (_.has(result, key)) result[key]++; else result[key] = 1;
-  });
-
-  // Safely create a real, live array from anything iterable.
-  _.toArray = function(obj) {
-    if (!obj) return [];
-    if (_.isArray(obj)) return slice.call(obj);
-    if (isArrayLike(obj)) return _.map(obj, _.identity);
-    return _.values(obj);
-  };
-
-  // Return the number of elements in an object.
-  _.size = function(obj) {
-    if (obj == null) return 0;
-    return isArrayLike(obj) ? obj.length : _.keys(obj).length;
-  };
-
-  // Split a collection into two arrays: one whose elements all satisfy the given
-  // predicate, and one whose elements all do not satisfy the predicate.
-  _.partition = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var pass = [], fail = [];
-    _.each(obj, function(value, key, obj) {
-      (predicate(value, key, obj) ? pass : fail).push(value);
-    });
-    return [pass, fail];
-  };
-
-  // Array Functions
-  // ---------------
-
-  // Get the first element of an array. Passing **n** will return the first N
-  // values in the array. Aliased as `head` and `take`. The **guard** check
-  // allows it to work with `_.map`.
-  _.first = _.head = _.take = function(array, n, guard) {
-    if (array == null) return void 0;
-    if (n == null || guard) return array[0];
-    return _.initial(array, array.length - n);
-  };
-
-  // Returns everything but the last entry of the array. Especially useful on
-  // the arguments object. Passing **n** will return all the values in
-  // the array, excluding the last N.
-  _.initial = function(array, n, guard) {
-    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
-  };
-
-  // Get the last element of an array. Passing **n** will return the last N
-  // values in the array.
-  _.last = function(array, n, guard) {
-    if (array == null) return void 0;
-    if (n == null || guard) return array[array.length - 1];
-    return _.rest(array, Math.max(0, array.length - n));
-  };
-
-  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
-  // Especially useful on the arguments object. Passing an **n** will return
-  // the rest N values in the array.
-  _.rest = _.tail = _.drop = function(array, n, guard) {
-    return slice.call(array, n == null || guard ? 1 : n);
-  };
-
-  // Trim out all falsy values from an array.
-  _.compact = function(array) {
-    return _.filter(array, _.identity);
-  };
-
-  // Internal implementation of a recursive `flatten` function.
-  var flatten = function(input, shallow, strict, startIndex) {
-    var output = [], idx = 0;
-    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
-      var value = input[i];
-      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
-        //flatten current level of array or arguments object
-        if (!shallow) value = flatten(value, shallow, strict);
-        var j = 0, len = value.length;
-        output.length += len;
-        while (j < len) {
-          output[idx++] = value[j++];
-        }
-      } else if (!strict) {
-        output[idx++] = value;
-      }
-    }
-    return output;
-  };
-
-  // Flatten out an array, either recursively (by default), or just one level.
-  _.flatten = function(array, shallow) {
-    return flatten(array, shallow, false);
-  };
-
-  // Return a version of the array that does not contain the specified value(s).
-  _.without = function(array) {
-    return _.difference(array, slice.call(arguments, 1));
-  };
-
-  // Produce a duplicate-free version of the array. If the array has already
-  // been sorted, you have the option of using a faster algorithm.
-  // Aliased as `unique`.
-  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
-    if (!_.isBoolean(isSorted)) {
-      context = iteratee;
-      iteratee = isSorted;
-      isSorted = false;
-    }
-    if (iteratee != null) iteratee = cb(iteratee, context);
-    var result = [];
-    var seen = [];
-    for (var i = 0, length = getLength(array); i < length; i++) {
-      var value = array[i],
-          computed = iteratee ? iteratee(value, i, array) : value;
-      if (isSorted) {
-        if (!i || seen !== computed) result.push(value);
-        seen = computed;
-      } else if (iteratee) {
-        if (!_.contains(seen, computed)) {
-          seen.push(computed);
-          result.push(value);
-        }
-      } else if (!_.contains(result, value)) {
-        result.push(value);
-      }
-    }
-    return result;
-  };
-
-  // Produce an array that contains the union: each distinct element from all of
-  // the passed-in arrays.
-  _.union = function() {
-    return _.uniq(flatten(arguments, true, true));
-  };
-
-  // Produce an array that contains every item shared between all the
-  // passed-in arrays.
-  _.intersection = function(array) {
-    var result = [];
-    var argsLength = arguments.length;
-    for (var i = 0, length = getLength(array); i < length; i++) {
-      var item = array[i];
-      if (_.contains(result, item)) continue;
-      for (var j = 1; j < argsLength; j++) {
-        if (!_.contains(arguments[j], item)) break;
-      }
-      if (j === argsLength) result.push(item);
-    }
-    return result;
-  };
-
-  // Take the difference between one array and a number of other arrays.
-  // Only the elements present in just the first array will remain.
-  _.difference = function(array) {
-    var rest = flatten(arguments, true, true, 1);
-    return _.filter(array, function(value){
-      return !_.contains(rest, value);
-    });
-  };
-
-  // Zip together multiple lists into a single array -- elements that share
-  // an index go together.
-  _.zip = function() {
-    return _.unzip(arguments);
-  };
-
-  // Complement of _.zip. Unzip accepts an array of arrays and groups
-  // each array's elements on shared indices
-  _.unzip = function(array) {
-    var length = array && _.max(array, getLength).length || 0;
-    var result = Array(length);
-
-    for (var index = 0; index < length; index++) {
-      result[index] = _.pluck(array, index);
-    }
-    return result;
-  };
-
-  // Converts lists into objects. Pass either a single array of `[key, value]`
-  // pairs, or two parallel arrays of the same length -- one of keys, and one of
-  // the corresponding values.
-  _.object = function(list, values) {
-    var result = {};
-    for (var i = 0, length = getLength(list); i < length; i++) {
-      if (values) {
-        result[list[i]] = values[i];
-      } else {
-        result[list[i][0]] = list[i][1];
-      }
-    }
-    return result;
-  };
-
-  // Generator function to create the findIndex and findLastIndex functions
-  function createPredicateIndexFinder(dir) {
-    return function(array, predicate, context) {
-      predicate = cb(predicate, context);
-      var length = getLength(array);
-      var index = dir > 0 ? 0 : length - 1;
-      for (; index >= 0 && index < length; index += dir) {
-        if (predicate(array[index], index, array)) return index;
-      }
-      return -1;
-    };
-  }
-
-  // Returns the first index on an array-like that passes a predicate test
-  _.findIndex = createPredicateIndexFinder(1);
-  _.findLastIndex = createPredicateIndexFinder(-1);
-
-  // Use a comparator function to figure out the smallest index at which
-  // an object should be inserted so as to maintain order. Uses binary search.
-  _.sortedIndex = function(array, obj, iteratee, context) {
-    iteratee = cb(iteratee, context, 1);
-    var value = iteratee(obj);
-    var low = 0, high = getLength(array);
-    while (low < high) {
-      var mid = Math.floor((low + high) / 2);
-      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
-    }
-    return low;
-  };
-
-  // Generator function to create the indexOf and lastIndexOf functions
-  function createIndexFinder(dir, predicateFind, sortedIndex) {
-    return function(array, item, idx) {
-      var i = 0, length = getLength(array);
-      if (typeof idx == 'number') {
-        if (dir > 0) {
-            i = idx >= 0 ? idx : Math.max(idx + length, i);
-        } else {
-            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
-        }
-      } else if (sortedIndex && idx && length) {
-        idx = sortedIndex(array, item);
-        return array[idx] === item ? idx : -1;
-      }
-      if (item !== item) {
-        idx = predicateFind(slice.call(array, i, length), _.isNaN);
-        return idx >= 0 ? idx + i : -1;
-      }
-      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
-        if (array[idx] === item) return idx;
-      }
-      return -1;
-    };
-  }
-
-  // Return the position of the first occurrence of an item in an array,
-  // or -1 if the item is not included in the array.
-  // If the array is large and already in sort order, pass `true`
-  // for **isSorted** to use binary search.
-  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
-  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
-
-  // Generate an integer Array containing an arithmetic progression. A port of
-  // the native Python `range()` function. See
-  // [the Python documentation](http://docs.python.org/library/functions.html#range).
-  _.range = function(start, stop, step) {
-    if (stop == null) {
-      stop = start || 0;
-      start = 0;
-    }
-    step = step || 1;
-
-    var length = Math.max(Math.ceil((stop - start) / step), 0);
-    var range = Array(length);
-
-    for (var idx = 0; idx < length; idx++, start += step) {
-      range[idx] = start;
-    }
-
-    return range;
-  };
-
-  // Function (ahem) Functions
-  // ------------------
-
-  // Determines whether to execute a function as a constructor
-  // or a normal function with the provided arguments
-  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
-    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
-    var self = baseCreate(sourceFunc.prototype);
-    var result = sourceFunc.apply(self, args);
-    if (_.isObject(result)) return result;
-    return self;
-  };
-
-  // Create a function bound to a given object (assigning `this`, and arguments,
-  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
-  // available.
-  _.bind = function(func, context) {
-    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
-    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
-    var args = slice.call(arguments, 2);
-    var bound = function() {
-      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
-    };
-    return bound;
-  };
-
-  // Partially apply a function by creating a version that has had some of its
-  // arguments pre-filled, without changing its dynamic `this` context. _ acts
-  // as a placeholder, allowing any combination of arguments to be pre-filled.
-  _.partial = function(func) {
-    var boundArgs = slice.call(arguments, 1);
-    var bound = function() {
-      var position = 0, length = boundArgs.length;
-      var args = Array(length);
-      for (var i = 0; i < length; i++) {
-        args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
-      }
-      while (position < arguments.length) args.push(arguments[position++]);
-      return executeBound(func, bound, this, this, args);
-    };
-    return bound;
-  };
-
-  // Bind a number of an object's methods to that object. Remaining arguments
-  // are the method names to be bound. Useful for ensuring that all callbacks
-  // defined on an object belong to it.
-  _.bindAll = function(obj) {
-    var i, length = arguments.length, key;
-    if (length <= 1) throw new Error('bindAll must be passed function names');
-    for (i = 1; i < length; i++) {
-      key = arguments[i];
-      obj[key] = _.bind(obj[key], obj);
-    }
-    return obj;
-  };
-
-  // Memoize an expensive function by storing its results.
-  _.memoize = function(func, hasher) {
-    var memoize = function(key) {
-      var cache = memoize.cache;
-      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
-      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
-      return cache[address];
-    };
-    memoize.cache = {};
-    return memoize;
-  };
-
-  // Delays a function for the given number of milliseconds, and then calls
-  // it with the arguments supplied.
-  _.delay = function(func, wait) {
-    var args = slice.call(arguments, 2);
-    return setTimeout(function(){
-      return func.apply(null, args);
-    }, wait);
-  };
-
-  // Defers a function, scheduling it to run after the current call stack has
-  // cleared.
-  _.defer = _.partial(_.delay, _, 1);
-
-  // Returns a function, that, when invoked, will only be triggered at most once
-  // during a given window of time. Normally, the throttled function will run
-  // as much as it can, without ever going more than once per `wait` duration;
-  // but if you'd like to disable the execution on the leading edge, pass
-  // `{leading: false}`. To disable execution on the trailing edge, ditto.
-  _.throttle = function(func, wait, options) {
-    var context, args, result;
-    var timeout = null;
-    var previous = 0;
-    if (!options) options = {};
-    var later = function() {
-      previous = options.leading === false ? 0 : _.now();
-      timeout = null;
-      result = func.apply(context, args);
-      if (!timeout) context = args = null;
-    };
-    return function() {
-      var now = _.now();
-      if (!previous && options.leading === false) previous = now;
-      var remaining = wait - (now - previous);
-      context = this;
-      args = arguments;
-      if (remaining <= 0 || remaining > wait) {
-        if (timeout) {
-          clearTimeout(timeout);
-          timeout = null;
-        }
-        previous = now;
-        result = func.apply(context, args);
-        if (!timeout) context = args = null;
-      } else if (!timeout && options.trailing !== false) {
-        timeout = setTimeout(later, remaining);
-      }
-      return result;
-    };
-  };
-
-  // Returns a function, that, as long as it continues to be invoked, will not
-  // be triggered. The function will be called after it stops being called for
-  // N milliseconds. If `immediate` is passed, trigger the function on the
-  // leading edge, instead of the trailing.
-  _.debounce = function(func, wait, immediate) {
-    var timeout, args, context, timestamp, result;
-
-    var later = function() {
-      var last = _.now() - timestamp;
-
-      if (last < wait && last >= 0) {
-        timeout = setTimeout(later, wait - last);
-      } else {
-        timeout = null;
-        if (!immediate) {
-          result = func.apply(context, args);
-          if (!timeout) context = args = null;
-        }
-      }
-    };
-
-    return function() {
-      context = this;
-      args = arguments;
-      timestamp = _.now();
-      var callNow = immediate && !timeout;
-      if (!timeout) timeout = setTimeout(later, wait);
-      if (callNow) {
-        result = func.apply(context, args);
-        context = args = null;
-      }
-
-      return result;
-    };
-  };
-
-  // Returns the first function passed as an argument to the second,
-  // allowing you to adjust arguments, run code before and after, and
-  // conditionally execute the original function.
-  _.wrap = function(func, wrapper) {
-    return _.partial(wrapper, func);
-  };
-
-  // Returns a negated version of the passed-in predicate.
-  _.negate = function(predicate) {
-    return function() {
-      return !predicate.apply(this, arguments);
-    };
-  };
-
-  // Returns a function that is the composition of a list of functions, each
-  // consuming the return value of the function that follows.
-  _.compose = function() {
-    var args = arguments;
-    var start = args.length - 1;
-    return function() {
-      var i = start;
-      var result = args[start].apply(this, arguments);
-      while (i--) result = args[i].call(this, result);
-      return result;
-    };
-  };
-
-  // Returns a function that will only be executed on and after the Nth call.
-  _.after = function(times, func) {
-    return function() {
-      if (--times < 1) {
-        return func.apply(this, arguments);
-      }
-    };
-  };
-
-  // Returns a function that will only be executed up to (but not including) the Nth call.
-  _.before = function(times, func) {
-    var memo;
-    return function() {
-      if (--times > 0) {
-        memo = func.apply(this, arguments);
-      }
-      if (times <= 1) func = null;
-      return memo;
-    };
-  };
-
-  // Returns a function that will be executed at most one time, no matter how
-  // often you call it. Useful for lazy initialization.
-  _.once = _.partial(_.before, 2);
-
-  // Object Functions
-  // ----------------
-
-  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
-  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
-  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
-                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
-
-  function collectNonEnumProps(obj, keys) {
-    var nonEnumIdx = nonEnumerableProps.length;
-    var constructor = obj.constructor;
-    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
-
-    // Constructor is a special case.
-    var prop = 'constructor';
-    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
-
-    while (nonEnumIdx--) {
-      prop = nonEnumerableProps[nonEnumIdx];
-      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
-        keys.push(prop);
-      }
-    }
-  }
-
-  // Retrieve the names of an object's own properties.
-  // Delegates to **ECMAScript 5**'s native `Object.keys`
-  _.keys = function(obj) {
-    if (!_.isObject(obj)) return [];
-    if (nativeKeys) return nativeKeys(obj);
-    var keys = [];
-    for (var key in obj) if (_.has(obj, key)) keys.push(key);
-    // Ahem, IE < 9.
-    if (hasEnumBug) collectNonEnumProps(obj, keys);
-    return keys;
-  };
-
-  // Retrieve all the property names of an object.
-  _.allKeys = function(obj) {
-    if (!_.isObject(obj)) return [];
-    var keys = [];
-    for (var key in obj) keys.push(key);
-    // Ahem, IE < 9.
-    if (hasEnumBug) collectNonEnumProps(obj, keys);
-    return keys;
-  };
-
-  // Retrieve the values of an object's properties.
-  _.values = function(obj) {
-    var keys = _.keys(obj);
-    var length = keys.length;
-    var values = Array(length);
-    for (var i = 0; i < length; i++) {
-      values[i] = obj[keys[i]];
-    }
-    return values;
-  };
-
-  // Returns the results of applying the iteratee to each element of the object
-  // In contrast to _.map it returns an object
-  _.mapObject = function(obj, iteratee, context) {
-    iteratee = cb(iteratee, context);
-    var keys =  _.keys(obj),
-          length = keys.length,
-          results = {},
-          currentKey;
-      for (var index = 0; index < length; index++) {
-        currentKey = keys[index];
-        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
-      }
-      return results;
-  };
-
-  // Convert an object into a list of `[key, value]` pairs.
-  _.pairs = function(obj) {
-    var keys = _.keys(obj);
-    var length = keys.length;
-    var pairs = Array(length);
-    for (var i = 0; i < length; i++) {
-      pairs[i] = [keys[i], obj[keys[i]]];
-    }
-    return pairs;
-  };
-
-  // Invert the keys and values of an object. The values must be serializable.
-  _.invert = function(obj) {
-    var result = {};
-    var keys = _.keys(obj);
-    for (var i = 0, length = keys.length; i < length; i++) {
-      result[obj[keys[i]]] = keys[i];
-    }
-    return result;
-  };
-
-  // Return a sorted list of the function names available on the object.
-  // Aliased as `methods`
-  _.functions = _.methods = function(obj) {
-    var names = [];
-    for (var key in obj) {
-      if (_.isFunction(obj[key])) names.push(key);
-    }
-    return names.sort();
-  };
-
-  // Extend a given object with all the properties in passed-in object(s).
-  _.extend = createAssigner(_.allKeys);
-
-  // Assigns a given object with all the own properties in the passed-in object(s)
-  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
-  _.extendOwn = _.assign = createAssigner(_.keys);
-
-  // Returns the first key on an object that passes a predicate test
-  _.findKey = function(obj, predicate, context) {
-    predicate = cb(predicate, context);
-    var keys = _.keys(obj), key;
-    for (var i = 0, length = keys.length; i < length; i++) {
-      key = keys[i];
-      if (predicate(obj[key], key, obj)) return key;
-    }
-  };
-
-  // Return a copy of the object only containing the whitelisted properties.
-  _.pick = function(object, oiteratee, context) {
-    var result = {}, obj = object, iteratee, keys;
-    if (obj == null) return result;
-    if (_.isFunction(oiteratee)) {
-      keys = _.allKeys(obj);
-      iteratee = optimizeCb(oiteratee, context);
-    } else {
-      keys = flatten(arguments, false, false, 1);
-      iteratee = function(value, key, obj) { return key in obj; };
-      obj = Object(obj);
-    }
-    for (var i = 0, length = keys.length; i < length; i++) {
-      var key = keys[i];
-      var value = obj[key];
-      if (iteratee(value, key, obj)) result[key] = value;
-    }
-    return result;
-  };
-
-   // Return a copy of the object without the blacklisted properties.
-  _.omit = function(obj, iteratee, context) {
-    if (_.isFunction(iteratee)) {
-      iteratee = _.negate(iteratee);
-    } else {
-      var keys = _.map(flatten(arguments, false, false, 1), String);
-      iteratee = function(value, key) {
-        return !_.contains(keys, key);
-      };
-    }
-    return _.pick(obj, iteratee, context);
-  };
-
-  // Fill in a given object with default properties.
-  _.defaults = createAssigner(_.allKeys, true);
-
-  // Creates an object that inherits from the given prototype object.
-  // If additional properties are provided then they will be added to the
-  // created object.
-  _.create = function(prototype, props) {
-    var result = baseCreate(prototype);
-    if (props) _.extendOwn(result, props);
-    return result;
-  };
-
-  // Create a (shallow-cloned) duplicate of an object.
-  _.clone = function(obj) {
-    if (!_.isObject(obj)) return obj;
-    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
-  };
-
-  // Invokes interceptor with the obj, and then returns obj.
-  // The primary purpose of this method is to "tap into" a method chain, in
-  // order to perform operations on intermediate results within the chain.
-  _.tap = function(obj, interceptor) {
-    interceptor(obj);
-    return obj;
-  };
-
-  // Returns whether an object has a given set of `key:value` pairs.
-  _.isMatch = function(object, attrs) {
-    var keys = _.keys(attrs), length = keys.length;
-    if (object == null) return !length;
-    var obj = Object(object);
-    for (var i = 0; i < length; i++) {
-      var key = keys[i];
-      if (attrs[key] !== obj[key] || !(key in obj)) return false;
-    }
-    return true;
-  };
-
-
-  // Internal recursive comparison function for `isEqual`.
-  var eq = function(a, b, aStack, bStack) {
-    // Identical objects are equal. `0 === -0`, but they aren't identical.
-    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
-    if (a === b) return a !== 0 || 1 / a === 1 / b;
-    // A strict comparison is necessary because `null == undefined`.
-    if (a == null || b == null) return a === b;
-    // Unwrap any wrapped objects.
-    if (a instanceof _) a = a._wrapped;
-    if (b instanceof _) b = b._wrapped;
-    // Compare `[[Class]]` names.
-    var className = toString.call(a);
-    if (className !== toString.call(b)) return false;
-    switch (className) {
-      // Strings, numbers, regular expressions, dates, and booleans are compared by value.
-      case '[object RegExp]':
-      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
-      case '[object String]':
-        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
-        // equivalent to `new String("5")`.
-        return '' + a === '' + b;
-      case '[object Number]':
-        // `NaN`s are equivalent, but non-reflexive.
-        // Object(NaN) is equivalent to NaN
-        if (+a !== +a) return +b !== +b;
-        // An `egal` comparison is performed for other numeric values.
-        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
-      case '[object Date]':
-      case '[object Boolean]':
-        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
-        // millisecond representations. Note that invalid dates with millisecond representations
-        // of `NaN` are not equivalent.
-        return +a === +b;
-    }
-
-    var areArrays = className === '[object Array]';
-    if (!areArrays) {
-      if (typeof a != 'object' || typeof b != 'object') return false;
-
-      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
-      // from different frames are.
-      var aCtor = a.constructor, bCtor = b.constructor;
-      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
-                               _.isFunction(bCtor) && bCtor instanceof bCtor)
-                          && ('constructor' in a && 'constructor' in b)) {
-        return false;
-      }
-    }
-    // Assume equality for cyclic structures. The algorithm for detecting cyclic
-    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
-
-    // Initializing stack of traversed objects.
-    // It's done here since we only need them for objects and arrays comparison.
-    aStack = aStack || [];
-    bStack = bStack || [];
-    var length = aStack.length;
-    while (length--) {
-      // Linear search. Performance is inversely proportional to the number of
-      // unique nested structures.
-      if (aStack[length] === a) return bStack[length] === b;
-    }
-
-    // Add the first object to the stack of traversed objects.
-    aStack.push(a);
-    bStack.push(b);
-
-    // Recursively compare objects and arrays.
-    if (areArrays) {
-      // Compare array lengths to determine if a deep comparison is necessary.
-      length = a.length;
-      if (length !== b.length) return false;
-      // Deep compare the contents, ignoring non-numeric properties.
-      while (length--) {
-        if (!eq(a[length], b[length], aStack, bStack)) return false;
-      }
-    } else {
-      // Deep compare objects.
-      var keys = _.keys(a), key;
-      length = keys.length;
-      // Ensure that both objects contain the same number of properties before comparing deep equality.
-      if (_.keys(b).length !== length) return false;
-      while (length--) {
-        // Deep compare each member
-        key = keys[length];
-        if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
-      }
-    }
-    // Remove the first object from the stack of traversed objects.
-    aStack.pop();
-    bStack.pop();
-    return true;
-  };
-
-  // Perform a deep comparison to check if two objects are equal.
-  _.isEqual = function(a, b) {
-    return eq(a, b);
-  };
-
-  // Is a given array, string, or object empty?
-  // An "empty" object has no enumerable own-properties.
-  _.isEmpty = function(obj) {
-    if (obj == null) return true;
-    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
-    return _.keys(obj).length === 0;
-  };
-
-  // Is a given value a DOM element?
-  _.isElement = function(obj) {
-    return !!(obj && obj.nodeType === 1);
-  };
-
-  // Is a given value an array?
-  // Delegates to ECMA5's native Array.isArray
-  _.isArray = nativeIsArray || function(obj) {
-    return toString.call(obj) === '[object Array]';
-  };
-
-  // Is a given variable an object?
-  _.isObject = function(obj) {
-    var type = typeof obj;
-    return type === 'function' || type === 'object' && !!obj;
-  };
-
-  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
-  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
-    _['is' + name] = function(obj) {
-      return toString.call(obj) === '[object ' + name + ']';
-    };
-  });
-
-  // Define a fallback version of the method in browsers (ahem, IE < 9), where
-  // there isn't any inspectable "Arguments" type.
-  if (!_.isArguments(arguments)) {
-    _.isArguments = function(obj) {
-      return _.has(obj, 'callee');
-    };
-  }
-
-  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
-  // IE 11 (#1621), and in Safari 8 (#1929).
-  if (typeof /./ != 'function' && typeof Int8Array != 'object') {
-    _.isFunction = function(obj) {
-      return typeof obj == 'function' || false;
-    };
-  }
-
-  // Is a given object a finite number?
-  _.isFinite = function(obj) {
-    return isFinite(obj) && !isNaN(parseFloat(obj));
-  };
-
-  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
-  _.isNaN = function(obj) {
-    return _.isNumber(obj) && obj !== +obj;
-  };
-
-  // Is a given value a boolean?
-  _.isBoolean = function(obj) {
-    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
-  };
-
-  // Is a given value equal to null?
-  _.isNull = function(obj) {
-    return obj === null;
-  };
-
-  // Is a given variable undefined?
-  _.isUndefined = function(obj) {
-    return obj === void 0;
-  };
-
-  // Shortcut function for checking if an object has a given property directly
-  // on itself (in other words, not on a prototype).
-  _.has = function(obj, key) {
-    return obj != null && hasOwnProperty.call(obj, key);
-  };
-
-  // Utility Functions
-  // -----------------
-
-  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
-  // previous owner. Returns a reference to the Underscore object.
-  _.noConflict = function() {
-    root._ = previousUnderscore;
-    return this;
-  };
-
-  // Keep the identity function around for default iteratees.
-  _.identity = function(value) {
-    return value;
-  };
-
-  // Predicate-generating functions. Often useful outside of Underscore.
-  _.constant = function(value) {
-    return function() {
-      return value;
-    };
-  };
-
-  _.noop = function(){};
-
-  _.property = property;
-
-  // Generates a function for a given object that returns a given property.
-  _.propertyOf = function(obj) {
-    return obj == null ? function(){} : function(key) {
-      return obj[key];
-    };
-  };
-
-  // Returns a predicate for checking whether an object has a given set of
-  // `key:value` pairs.
-  _.matcher = _.matches = function(attrs) {
-    attrs = _.extendOwn({}, attrs);
-    return function(obj) {
-      return _.isMatch(obj, attrs);
-    };
-  };
-
-  // Run a function **n** times.
-  _.times = function(n, iteratee, context) {
-    var accum = Array(Math.max(0, n));
-    iteratee = optimizeCb(iteratee, context, 1);
-    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
-    return accum;
-  };
-
-  // Return a random integer between min and max (inclusive).
-  _.random = function(min, max) {
-    if (max == null) {
-      max = min;
-      min = 0;
-    }
-    return min + Math.floor(Math.random() * (max - min + 1));
-  };
-
-  // A (possibly faster) way to get the current timestamp as an integer.
-  _.now = Date.now || function() {
-    return new Date().getTime();
-  };
-
-   // List of HTML entities for escaping.
-  var escapeMap = {
-    '&': '&amp;',
-    '<': '&lt;',
-    '>': '&gt;',
-    '"': '&quot;',
-    "'": '&#x27;',
-    '`': '&#x60;'
-  };
-  var unescapeMap = _.invert(escapeMap);
-
-  // Functions for escaping and unescaping strings to/from HTML interpolation.
-  var createEscaper = function(map) {
-    var escaper = function(match) {
-      return map[match];
-    };
-    // Regexes for identifying a key that needs to be escaped
-    var source = '(?:' + _.keys(map).join('|') + ')';
-    var testRegexp = RegExp(source);
-    var replaceRegexp = RegExp(source, 'g');
-    return function(string) {
-      string = string == null ? '' : '' + string;
-      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
-    };
-  };
-  _.escape = createEscaper(escapeMap);
-  _.unescape = createEscaper(unescapeMap);
-
-  // If the value of the named `property` is a function then invoke it with the
-  // `object` as context; otherwise, return it.
-  _.result = function(object, property, fallback) {
-    var value = object == null ? void 0 : object[property];
-    if (value === void 0) {
-      value = fallback;
-    }
-    return _.isFunction(value) ? value.call(object) : value;
-  };
-
-  // Generate a unique integer id (unique within the entire client session).
-  // Useful for temporary DOM ids.
-  var idCounter = 0;
-  _.uniqueId = function(prefix) {
-    var id = ++idCounter + '';
-    return prefix ? prefix + id : id;
-  };
-
-  // By default, Underscore uses ERB-style template delimiters, change the
-  // following template settings to use alternative delimiters.
-  _.templateSettings = {
-    evaluate    : /<%([\s\S]+?)%>/g,
-    interpolate : /<%=([\s\S]+?)%>/g,
-    escape      : /<%-([\s\S]+?)%>/g
-  };
-
-  // When customizing `templateSettings`, if you don't want to define an
-  // interpolation, evaluation or escaping regex, we need one that is
-  // guaranteed not to match.
-  var noMatch = /(.)^/;
-
-  // Certain characters need to be escaped so that they can be put into a
-  // string literal.
-  var escapes = {
-    "'":      "'",
-    '\\':     '\\',
-    '\r':     'r',
-    '\n':     'n',
-    '\u2028': 'u2028',
-    '\u2029': 'u2029'
-  };
-
-  var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
-
-  var escapeChar = function(match) {
-    return '\\' + escapes[match];
-  };
-
-  // JavaScript micro-templating, similar to John Resig's implementation.
-  // Underscore templating handles arbitrary delimiters, preserves whitespace,
-  // and correctly escapes quotes within interpolated code.
-  // NB: `oldSettings` only exists for backwards compatibility.
-  _.template = function(text, settings, oldSettings) {
-    if (!settings && oldSettings) settings = oldSettings;
-    settings = _.defaults({}, settings, _.templateSettings);
-
-    // Combine delimiters into one regular expression via alternation.
-    var matcher = RegExp([
-      (settings.escape || noMatch).source,
-      (settings.interpolate || noMatch).source,
-      (settings.evaluate || noMatch).source
-    ].join('|') + '|$', 'g');
-
-    // Compile the template source, escaping string literals appropriately.
-    var index = 0;
-    var source = "__p+='";
-    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
-      source += text.slice(index, offset).replace(escaper, escapeChar);
-      index = offset + match.length;
-
-      if (escape) {
-        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
-      } else if (interpolate) {
-        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
-      } else if (evaluate) {
-        source += "';\n" + evaluate + "\n__p+='";
-      }
-
-      // Adobe VMs need the match returned to produce the correct offest.
-      return match;
-    });
-    source += "';\n";
-
-    // If a variable is not specified, place data values in local scope.
-    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
-
-    source = "var __t,__p='',__j=Array.prototype.join," +
-      "print=function(){__p+=__j.call(arguments,'');};\n" +
-      source + 'return __p;\n';
-
-    try {
-      var render = new Function(settings.variable || 'obj', '_', source);
-    } catch (e) {
-      e.source = source;
-      throw e;
-    }
-
-    var template = function(data) {
-      return render.call(this, data, _);
-    };
-
-    // Provide the compiled source as a convenience for precompilation.
-    var argument = settings.variable || 'obj';
-    template.source = 'function(' + argument + '){\n' + source + '}';
-
-    return template;
-  };
-
-  // Add a "chain" function. Start chaining a wrapped Underscore object.
-  _.chain = function(obj) {
-    var instance = _(obj);
-    instance._chain = true;
-    return instance;
-  };
-
-  // OOP
-  // ---------------
-  // If Underscore is called as a function, it returns a wrapped object that
-  // can be used OO-style. This wrapper holds altered versions of all the
-  // underscore functions. Wrapped objects may be chained.
-
-  // Helper function to continue chaining intermediate results.
-  var result = function(instance, obj) {
-    return instance._chain ? _(obj).chain() : obj;
-  };
-
-  // Add your own custom functions to the Underscore object.
-  _.mixin = function(obj) {
-    _.each(_.functions(obj), function(name) {
-      var func = _[name] = obj[name];
-      _.prototype[name] = function() {
-        var args = [this._wrapped];
-        push.apply(args, arguments);
-        return result(this, func.apply(_, args));
-      };
-    });
-  };
-
-  // Add all of the Underscore functions to the wrapper object.
-  _.mixin(_);
-
-  // Add all mutator Array functions to the wrapper.
-  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
-    var method = ArrayProto[name];
-    _.prototype[name] = function() {
-      var obj = this._wrapped;
-      method.apply(obj, arguments);
-      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
-      return result(this, obj);
-    };
-  });
-
-  // Add all accessor Array functions to the wrapper.
-  _.each(['concat', 'join', 'slice'], function(name) {
-    var method = ArrayProto[name];
-    _.prototype[name] = function() {
-      return result(this, method.apply(this._wrapped, arguments));
-    };
-  });
-
-  // Extracts the result from a wrapped and chained object.
-  _.prototype.value = function() {
-    return this._wrapped;
-  };
-
-  // Provide unwrapping proxy for some methods used in engine operations
-  // such as arithmetic and JSON stringification.
-  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
-
-  _.prototype.toString = function() {
-    return '' + this._wrapped;
-  };
-
-  // AMD registration happens at the end for compatibility with AMD loaders
-  // that may not enforce next-turn semantics on modules. Even though general
-  // practice for AMD registration is to be anonymous, underscore registers
-  // as a named module because, like jQuery, it is a base library that is
-  // popular enough to be bundled in a third party lib, but not be part of
-  // an AMD load request. Those cases could generate an error when an
-  // anonymous define() is called outside of a loader request.
-  if (typeof define === 'function' && define.amd) {
-    define('underscore', [], function() {
-      return _;
-    });
-  }
-}.call(this));
diff --git a/node_modules/unorm/LICENSE.md b/node_modules/unorm/LICENSE.md
deleted file mode 100644
index ed1d4f3..0000000
--- a/node_modules/unorm/LICENSE.md
+++ /dev/null
@@ -1,42 +0,0 @@
-The software dual licensed under the MIT and GPL licenses. MIT license:
-
-    Copyright (c) 2008-2013 Matsuza <matsuza@gmail.com>, Bjarke Walling <bwp@bwp.dk>
-    
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to
-    deal in the Software without restriction, including without limitation the
-    rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-    sell copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
-    
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
-    
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN THE SOFTWARE.
-
-GPL notice (please read the [full GPL license] online):
-
-    Copyright (C) 2008-2013 Matsuza <matsuza@gmail.com>, Bjarke Walling <bwp@bwp.dk>
-
-    This program is free software; you can redistribute it and/or
-    modify it under the terms of the GNU General Public License
-    as published by the Free Software Foundation; either version 2
-    of the License, or (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-
-[full GPL license]: http://www.gnu.org/licenses/gpl-2.0-standalone.html
diff --git a/node_modules/unorm/README.md b/node_modules/unorm/README.md
deleted file mode 100644
index 6ff6420..0000000
--- a/node_modules/unorm/README.md
+++ /dev/null
@@ -1,118 +0,0 @@
-This is [Unicode Normalizer] in a Common JS module. I'm not affiliated with Matsuza, the original author of Unicode Normalizer.
-
-[![Build Status](https://travis-ci.org/walling/unorm.png?branch=master)](https://travis-ci.org/walling/unorm)
-
-
-Installation
-------------
-
-```bash
-npm install unorm
-```
-
-Polyfill
---------
-
-You can use this module as a polyfill for [String.prototype.normalize], for example:
-
-```javascript
-console.log('æøåäüö'.normalize('NFKD'));
-```
-
-The module uses some [EcmaScript 5](http://kangax.github.io/es5-compat-table/) features. Other browsers should use a compability shim, e.g. [es5-shim](https://github.com/kriskowal/es5-shim).
-
-Functions
----------
-
-This module exports four functions: `nfc`, `nfd`, `nfkc`, and `nfkd`; one for each Unicode normalization. In the browser the functions are exported in the `unorm` global. In CommonJS environments you just require the module. Functions:
-
- *  `unorm.nfd(str)` – Canonical Decomposition
- *  `unorm.nfc(str)` – Canonical Decomposition, followed by Canonical Composition
- *  `unorm.nfkd(str)` – Compatibility Decomposition
- *  `unorm.nfkc(str)` – Compatibility Decomposition, followed by Canonical Composition
-
-
-Node.JS example
----------------
-
-For a longer example, see `examples` directory.
-
-```javascript
-var unorm = require('unorm');
-
-var text =
-  'The \u212B symbol invented by A. J. \u00C5ngstr\u00F6m ' +
-  '(1814, L\u00F6gd\u00F6, \u2013 1874) denotes the length ' +
-  '10\u207B\u00B9\u2070 m.';
-
-var combining = /[\u0300-\u036F]/g; // Use XRegExp('\\p{M}', 'g'); see example.js.
-
-console.log('Regular:  ' + text);
-console.log('NFC:      ' + unorm.nfc(text));
-console.log('NFD:      ' + unorm.nfd(text));
-console.log('NFKC:     ' + unorm.nfkc(text));
-console.log('NFKD: *   ' + unorm.nfkd(text).replace(combining, ''));
-console.log(' * = Combining characters removed from decomposed form.');
-```
-
-
-Road map
---------
-
-As of November 2013. Longer term:
-
-- Look at possible optimizations (speed primarely, module size secondarily)
-- Adding functions to quick check normalizations: `is_nfc`, `is_nfd`, etc.
-
-
-Contributers
-------------
-
- - **Oleg Grenrus** is helping to maintain this library. He cleaned up the code base, fixed JSHint errors, created a test suite and updated the normalization data to Unicode 6.3.
-
-
-Development notes
------------------
-
-- [Unicode normalization forms report](http://www.unicode.org/reports/tr15/)
-- Unicode data can be found from http://www.unicode.org/Public/UCD/latest/ucd
-
-To generate new unicode data, run:
-```sh
-cd src/data/src
-javac UnormNormalizerBuilder.java
-java UnormNormalizerBuilder
-```
-produced `unormdata.js` contains needed table
-
-Execute `node benchmark/benchmark.js` to run simple benchmarks, if you do any changes which may affect performance.
-
-License
--------
-
-This project includes the software package **Unicode Normalizer 1.0.0**. The
-software dual licensed under the MIT and GPL licenses. Here is the MIT license:
-
-    Copyright (c) 2008-2013 Matsuza <matsuza@gmail.com>, Bjarke Walling <bwp@bwp.dk>
-
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to
-    deal in the Software without restriction, including without limitation the
-    rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-    sell copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
-
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN THE SOFTWARE.
-
-
-[Unicode Normalizer]: http://coderepos.org/share/browser/lang/javascript/UnicodeNormalizer
-[String.prototype.normalize]: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-15.5.3.26
diff --git a/node_modules/unorm/lib/unorm.js b/node_modules/unorm/lib/unorm.js
deleted file mode 100644
index 92d3699..0000000
--- a/node_modules/unorm/lib/unorm.js
+++ /dev/null
@@ -1,442 +0,0 @@
-(function (root) {
-   "use strict";
-
-/***** unorm.js *****/
-
-/*
- * UnicodeNormalizer 1.0.0
- * Copyright (c) 2008 Matsuza
- * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
- * $Date: 2008-06-05 16:44:17 +0200 (Thu, 05 Jun 2008) $
- * $Rev: 13309 $
- */
-
-   var DEFAULT_FEATURE = [null, 0, {}];
-   var CACHE_THRESHOLD = 10;
-   var SBase = 0xAC00, LBase = 0x1100, VBase = 0x1161, TBase = 0x11A7, LCount = 19, VCount = 21, TCount = 28;
-   var NCount = VCount * TCount; // 588
-   var SCount = LCount * NCount; // 11172
-
-   var UChar = function(cp, feature){
-      this.codepoint = cp;
-      this.feature = feature;
-   };
-
-   // Strategies
-   var cache = {};
-   var cacheCounter = [];
-   for (var i = 0; i <= 0xFF; ++i){
-      cacheCounter[i] = 0;
-   }
-
-   function fromCache(next, cp, needFeature){
-      var ret = cache[cp];
-      if(!ret){
-         ret = next(cp, needFeature);
-         if(!!ret.feature && ++cacheCounter[(cp >> 8) & 0xFF] > CACHE_THRESHOLD){
-            cache[cp] = ret;
-         }
-      }
-      return ret;
-   }
-
-   function fromData(next, cp, needFeature){
-      var hash = cp & 0xFF00;
-      var dunit = UChar.udata[hash] || {};
-      var f = dunit[cp];
-      return f ? new UChar(cp, f) : new UChar(cp, DEFAULT_FEATURE);
-   }
-   function fromCpOnly(next, cp, needFeature){
-      return !!needFeature ? next(cp, needFeature) : new UChar(cp, null);
-   }
-   function fromRuleBasedJamo(next, cp, needFeature){
-      var j;
-      if(cp < LBase || (LBase + LCount <= cp && cp < SBase) || (SBase + SCount < cp)){
-         return next(cp, needFeature);
-      }
-      if(LBase <= cp && cp < LBase + LCount){
-         var c = {};
-         var base = (cp - LBase) * VCount;
-         for (j = 0; j < VCount; ++j){
-            c[VBase + j] = SBase + TCount * (j + base);
-         }
-         return new UChar(cp, [,,c]);
-      }
-
-      var SIndex = cp - SBase;
-      var TIndex = SIndex % TCount;
-      var feature = [];
-      if(TIndex !== 0){
-         feature[0] = [SBase + SIndex - TIndex, TBase + TIndex];
-      } else {
-         feature[0] = [LBase + Math.floor(SIndex / NCount), VBase + Math.floor((SIndex % NCount) / TCount)];
-         feature[2] = {};
-         for (j = 1; j < TCount; ++j){
-            feature[2][TBase + j] = cp + j;
-         }
-      }
-      return new UChar(cp, feature);
-   }
-   function fromCpFilter(next, cp, needFeature){
-      return cp < 60 || 13311 < cp && cp < 42607 ? new UChar(cp, DEFAULT_FEATURE) : next(cp, needFeature);
-   }
-
-   var strategies = [fromCpFilter, fromCache, fromCpOnly, fromRuleBasedJamo, fromData];
-
-   UChar.fromCharCode = strategies.reduceRight(function (next, strategy) {
-      return function (cp, needFeature) {
-         return strategy(next, cp, needFeature);
-      };
-   }, null);
-
-   UChar.isHighSurrogate = function(cp){
-      return cp >= 0xD800 && cp <= 0xDBFF;
-   };
-   UChar.isLowSurrogate = function(cp){
-      return cp >= 0xDC00 && cp <= 0xDFFF;
-   };
-
-   UChar.prototype.prepFeature = function(){
-      if(!this.feature){
-         this.feature = UChar.fromCharCode(this.codepoint, true).feature;
-      }
-   };
-
-   UChar.prototype.toString = function(){
-      if(this.codepoint < 0x10000){
-         return String.fromCharCode(this.codepoint);
-      } else {
-         var x = this.codepoint - 0x10000;
-         return String.fromCharCode(Math.floor(x / 0x400) + 0xD800, x % 0x400 + 0xDC00);
-      }
-   };
-
-   UChar.prototype.getDecomp = function(){
-      this.prepFeature();
-      return this.feature[0] || null;
-   };
-
-   UChar.prototype.isCompatibility = function(){
-      this.prepFeature();
-      return !!this.feature[1] && (this.feature[1] & (1 << 8));
-   };
-   UChar.prototype.isExclude = function(){
-      this.prepFeature();
-      return !!this.feature[1] && (this.feature[1] & (1 << 9));
-   };
-   UChar.prototype.getCanonicalClass = function(){
-      this.prepFeature();
-      return !!this.feature[1] ? (this.feature[1] & 0xff) : 0;
-   };
-   UChar.prototype.getComposite = function(following){
-      this.prepFeature();
-      if(!this.feature[2]){
-         return null;
-      }
-      var cp = this.feature[2][following.codepoint];
-      return cp ? UChar.fromCharCode(cp) : null;
-   };
-
-   var UCharIterator = function(str){
-      this.str = str;
-      this.cursor = 0;
-   };
-   UCharIterator.prototype.next = function(){
-      if(!!this.str && this.cursor < this.str.length){
-         var cp = this.str.charCodeAt(this.cursor++);
-         var d;
-         if(UChar.isHighSurrogate(cp) && this.cursor < this.str.length && UChar.isLowSurrogate((d = this.str.charCodeAt(this.cursor)))){
-            cp = (cp - 0xD800) * 0x400 + (d -0xDC00) + 0x10000;
-            ++this.cursor;
-         }
-         return UChar.fromCharCode(cp);
-      } else {
-         this.str = null;
-         return null;
-      }
-   };
-
-   var RecursDecompIterator = function(it, cano){
-      this.it = it;
-      this.canonical = cano;
-      this.resBuf = [];
-   };
-
-   RecursDecompIterator.prototype.next = function(){
-      function recursiveDecomp(cano, uchar){
-         var decomp = uchar.getDecomp();
-         if(!!decomp && !(cano && uchar.isCompatibility())){
-            var ret = [];
-            for(var i = 0; i < decomp.length; ++i){
-               var a = recursiveDecomp(cano, UChar.fromCharCode(decomp[i]));
-                ret = ret.concat(a);
-            }
-            return ret;
-         } else {
-            return [uchar];
-         }
-      }
-      if(this.resBuf.length === 0){
-         var uchar = this.it.next();
-         if(!uchar){
-            return null;
-         }
-         this.resBuf = recursiveDecomp(this.canonical, uchar);
-      }
-      return this.resBuf.shift();
-   };
-
-   var DecompIterator = function(it){
-      this.it = it;
-      this.resBuf = [];
-   };
-
-   DecompIterator.prototype.next = function(){
-      var cc;
-      if(this.resBuf.length === 0){
-         do{
-            var uchar = this.it.next();
-            if(!uchar){
-               break;
-            }
-            cc = uchar.getCanonicalClass();
-            var inspt = this.resBuf.length;
-            if(cc !== 0){
-               for(; inspt > 0; --inspt){
-                  var uchar2 = this.resBuf[inspt - 1];
-                  var cc2 = uchar2.getCanonicalClass();
-                  if(cc2 <= cc){
-                     break;
-                  }
-               }
-            }
-            this.resBuf.splice(inspt, 0, uchar);
-         } while(cc !== 0);
-      }
-      return this.resBuf.shift();
-   };
-
-   var CompIterator = function(it){
-      this.it = it;
-      this.procBuf = [];
-      this.resBuf = [];
-      this.lastClass = null;
-   };
-
-   CompIterator.prototype.next = function(){
-      while(this.resBuf.length === 0){
-         var uchar = this.it.next();
-         if(!uchar){
-            this.resBuf = this.procBuf;
-            this.procBuf = [];
-            break;
-         }
-         if(this.procBuf.length === 0){
-            this.lastClass = uchar.getCanonicalClass();
-            this.procBuf.push(uchar);
-         } else {
-            var starter = this.procBuf[0];
-            var composite = starter.getComposite(uchar);
-            var cc = uchar.getCanonicalClass();
-            if(!!composite && (this.lastClass < cc || this.lastClass === 0)){
-               this.procBuf[0] = composite;
-            } else {
-               if(cc === 0){
-                  this.resBuf = this.procBuf;
-                  this.procBuf = [];
-               }
-               this.lastClass = cc;
-               this.procBuf.push(uchar);
-            }
-         }
-      }
-      return this.resBuf.shift();
-   };
-
-   var createIterator = function(mode, str){
-      switch(mode){
-         case "NFD":
-            return new DecompIterator(new RecursDecompIterator(new UCharIterator(str), true));
-         case "NFKD":
-            return new DecompIterator(new RecursDecompIterator(new UCharIterator(str), false));
-         case "NFC":
-            return new CompIterator(new DecompIterator(new RecursDecompIterator(new UCharIterator(str), true)));
-         case "NFKC":
-            return new CompIterator(new DecompIterator(new RecursDecompIterator(new UCharIterator(str), false)));
-      }
-      throw mode + " is invalid";
-   };
-   var normalize = function(mode, str){
-      var it = createIterator(mode, str);
-      var ret = "";
-      var uchar;
-      while(!!(uchar = it.next())){
-         ret += uchar.toString();
-      }
-      return ret;
-   };
-
-   /* API functions */
-   function nfd(str){
-      return normalize("NFD", str);
-   }
-
-   function nfkd(str){
-      return normalize("NFKD", str);
-   }
-
-   function nfc(str){
-      return normalize("NFC", str);
-   }
-
-   function nfkc(str){
-      return normalize("NFKC", str);
-   }
-
-/* Unicode data */
-UChar.udata={
-0:{60:[,,{824:8814}],61:[,,{824:8800}],62:[,,{824:8815}],65:[,,{768:192,769:193,770:194,771:195,772:256,774:258,775:550,776:196,777:7842,778:197,780:461,783:512,785:514,803:7840,805:7680,808:260}],66:[,,{775:7682,803:7684,817:7686}],67:[,,{769:262,770:264,775:266,780:268,807:199}],68:[,,{775:7690,780:270,803:7692,807:7696,813:7698,817:7694}],69:[,,{768:200,769:201,770:202,771:7868,772:274,774:276,775:278,776:203,777:7866,780:282,783:516,785:518,803:7864,807:552,808:280,813:7704,816:7706}],70:[,,{775:7710}],71:[,,{769:500,770:284,772:7712,774:286,775:288,780:486,807:290}],72:[,,{770:292,775:7714,776:7718,780:542,803:7716,807:7720,814:7722}],73:[,,{768:204,769:205,770:206,771:296,772:298,774:300,775:304,776:207,777:7880,780:463,783:520,785:522,803:7882,808:302,816:7724}],74:[,,{770:308}],75:[,,{769:7728,780:488,803:7730,807:310,817:7732}],76:[,,{769:313,780:317,803:7734,807:315,813:7740,817:7738}],77:[,,{769:7742,775:7744,803:7746}],78:[,,{768:504,769:323,771:209,775:7748,780:327,803:7750,807:325,813:7754,817:7752}],79:[,,{768:210,769:211,770:212,771:213,772:332,774:334,775:558,776:214,777:7886,779:336,780:465,783:524,785:526,795:416,803:7884,808:490}],80:[,,{769:7764,775:7766}],82:[,,{769:340,775:7768,780:344,783:528,785:530,803:7770,807:342,817:7774}],83:[,,{769:346,770:348,775:7776,780:352,803:7778,806:536,807:350}],84:[,,{775:7786,780:356,803:7788,806:538,807:354,813:7792,817:7790}],85:[,,{768:217,769:218,770:219,771:360,772:362,774:364,776:220,777:7910,778:366,779:368,780:467,783:532,785:534,795:431,803:7908,804:7794,808:370,813:7798,816:7796}],86:[,,{771:7804,803:7806}],87:[,,{768:7808,769:7810,770:372,775:7814,776:7812,803:7816}],88:[,,{775:7818,776:7820}],89:[,,{768:7922,769:221,770:374,771:7928,772:562,775:7822,776:376,777:7926,803:7924}],90:[,,{769:377,770:7824,775:379,780:381,803:7826,817:7828}],97:[,,{768:224,769:225,770:226,771:227,772:257,774:259,775:551,776:228,777:7843,778:229,780:462,783:513,785:515,803:7841,805:7681,808:261}],98:[,,{775:7683,803:7685,817:7687}],99:[,,{769:263,770:265,775:267,780:269,807:231}],100:[,,{775:7691,780:271,803:7693,807:7697,813:7699,817:7695}],101:[,,{768:232,769:233,770:234,771:7869,772:275,774:277,775:279,776:235,777:7867,780:283,783:517,785:519,803:7865,807:553,808:281,813:7705,816:7707}],102:[,,{775:7711}],103:[,,{769:501,770:285,772:7713,774:287,775:289,780:487,807:291}],104:[,,{770:293,775:7715,776:7719,780:543,803:7717,807:7721,814:7723,817:7830}],105:[,,{768:236,769:237,770:238,771:297,772:299,774:301,776:239,777:7881,780:464,783:521,785:523,803:7883,808:303,816:7725}],106:[,,{770:309,780:496}],107:[,,{769:7729,780:489,803:7731,807:311,817:7733}],108:[,,{769:314,780:318,803:7735,807:316,813:7741,817:7739}],109:[,,{769:7743,775:7745,803:7747}],110:[,,{768:505,769:324,771:241,775:7749,780:328,803:7751,807:326,813:7755,817:7753}],111:[,,{768:242,769:243,770:244,771:245,772:333,774:335,775:559,776:246,777:7887,779:337,780:466,783:525,785:527,795:417,803:7885,808:491}],112:[,,{769:7765,775:7767}],114:[,,{769:341,775:7769,780:345,783:529,785:531,803:7771,807:343,817:7775}],115:[,,{769:347,770:349,775:7777,780:353,803:7779,806:537,807:351}],116:[,,{775:7787,776:7831,780:357,803:7789,806:539,807:355,813:7793,817:7791}],117:[,,{768:249,769:250,770:251,771:361,772:363,774:365,776:252,777:7911,778:367,779:369,780:468,783:533,785:535,795:432,803:7909,804:7795,808:371,813:7799,816:7797}],118:[,,{771:7805,803:7807}],119:[,,{768:7809,769:7811,770:373,775:7815,776:7813,778:7832,803:7817}],120:[,,{775:7819,776:7821}],121:[,,{768:7923,769:253,770:375,771:7929,772:563,775:7823,776:255,777:7927,778:7833,803:7925}],122:[,,{769:378,770:7825,775:380,780:382,803:7827,817:7829}],160:[[32],256],168:[[32,776],256,{768:8173,769:901,834:8129}],170:[[97],256],175:[[32,772],256],178:[[50],256],179:[[51],256],180:[[32,769],256],181:[[956],256],184:[[32,807],256],185:[[49],256],186:[[111],256],188:[[49,8260,52],256],189:[[49,8260,50],256],190:[[51,8260,52],256],192:[[65,768]],193:[[65,769]],194:[[65,770],,{768:7846,769:7844,771:7850,777:7848}],195:[[65,771]],196:[[65,776],,{772:478}],197:[[65,778],,{769:506}],198:[,,{769:508,772:482}],199:[[67,807],,{769:7688}],200:[[69,768]],201:[[69,769]],202:[[69,770],,{768:7872,769:7870,771:7876,777:7874}],203:[[69,776]],204:[[73,768]],205:[[73,769]],206:[[73,770]],207:[[73,776],,{769:7726}],209:[[78,771]],210:[[79,768]],211:[[79,769]],212:[[79,770],,{768:7890,769:7888,771:7894,777:7892}],213:[[79,771],,{769:7756,772:556,776:7758}],214:[[79,776],,{772:554}],216:[,,{769:510}],217:[[85,768]],218:[[85,769]],219:[[85,770]],220:[[85,776],,{768:475,769:471,772:469,780:473}],221:[[89,769]],224:[[97,768]],225:[[97,769]],226:[[97,770],,{768:7847,769:7845,771:7851,777:7849}],227:[[97,771]],228:[[97,776],,{772:479}],229:[[97,778],,{769:507}],230:[,,{769:509,772:483}],231:[[99,807],,{769:7689}],232:[[101,768]],233:[[101,769]],234:[[101,770],,{768:7873,769:7871,771:7877,777:7875}],235:[[101,776]],236:[[105,768]],237:[[105,769]],238:[[105,770]],239:[[105,776],,{769:7727}],241:[[110,771]],242:[[111,768]],243:[[111,769]],244:[[111,770],,{768:7891,769:7889,771:7895,777:7893}],245:[[111,771],,{769:7757,772:557,776:7759}],246:[[111,776],,{772:555}],248:[,,{769:511}],249:[[117,768]],250:[[117,769]],251:[[117,770]],252:[[117,776],,{768:476,769:472,772:470,780:474}],253:[[121,769]],255:[[121,776]]},
-256:{256:[[65,772]],257:[[97,772]],258:[[65,774],,{768:7856,769:7854,771:7860,777:7858}],259:[[97,774],,{768:7857,769:7855,771:7861,777:7859}],260:[[65,808]],261:[[97,808]],262:[[67,769]],263:[[99,769]],264:[[67,770]],265:[[99,770]],266:[[67,775]],267:[[99,775]],268:[[67,780]],269:[[99,780]],270:[[68,780]],271:[[100,780]],274:[[69,772],,{768:7700,769:7702}],275:[[101,772],,{768:7701,769:7703}],276:[[69,774]],277:[[101,774]],278:[[69,775]],279:[[101,775]],280:[[69,808]],281:[[101,808]],282:[[69,780]],283:[[101,780]],284:[[71,770]],285:[[103,770]],286:[[71,774]],287:[[103,774]],288:[[71,775]],289:[[103,775]],290:[[71,807]],291:[[103,807]],292:[[72,770]],293:[[104,770]],296:[[73,771]],297:[[105,771]],298:[[73,772]],299:[[105,772]],300:[[73,774]],301:[[105,774]],302:[[73,808]],303:[[105,808]],304:[[73,775]],306:[[73,74],256],307:[[105,106],256],308:[[74,770]],309:[[106,770]],310:[[75,807]],311:[[107,807]],313:[[76,769]],314:[[108,769]],315:[[76,807]],316:[[108,807]],317:[[76,780]],318:[[108,780]],319:[[76,183],256],320:[[108,183],256],323:[[78,769]],324:[[110,769]],325:[[78,807]],326:[[110,807]],327:[[78,780]],328:[[110,780]],329:[[700,110],256],332:[[79,772],,{768:7760,769:7762}],333:[[111,772],,{768:7761,769:7763}],334:[[79,774]],335:[[111,774]],336:[[79,779]],337:[[111,779]],340:[[82,769]],341:[[114,769]],342:[[82,807]],343:[[114,807]],344:[[82,780]],345:[[114,780]],346:[[83,769],,{775:7780}],347:[[115,769],,{775:7781}],348:[[83,770]],349:[[115,770]],350:[[83,807]],351:[[115,807]],352:[[83,780],,{775:7782}],353:[[115,780],,{775:7783}],354:[[84,807]],355:[[116,807]],356:[[84,780]],357:[[116,780]],360:[[85,771],,{769:7800}],361:[[117,771],,{769:7801}],362:[[85,772],,{776:7802}],363:[[117,772],,{776:7803}],364:[[85,774]],365:[[117,774]],366:[[85,778]],367:[[117,778]],368:[[85,779]],369:[[117,779]],370:[[85,808]],371:[[117,808]],372:[[87,770]],373:[[119,770]],374:[[89,770]],375:[[121,770]],376:[[89,776]],377:[[90,769]],378:[[122,769]],379:[[90,775]],380:[[122,775]],381:[[90,780]],382:[[122,780]],383:[[115],256,{775:7835}],416:[[79,795],,{768:7900,769:7898,771:7904,777:7902,803:7906}],417:[[111,795],,{768:7901,769:7899,771:7905,777:7903,803:7907}],431:[[85,795],,{768:7914,769:7912,771:7918,777:7916,803:7920}],432:[[117,795],,{768:7915,769:7913,771:7919,777:7917,803:7921}],439:[,,{780:494}],452:[[68,381],256],453:[[68,382],256],454:[[100,382],256],455:[[76,74],256],456:[[76,106],256],457:[[108,106],256],458:[[78,74],256],459:[[78,106],256],460:[[110,106],256],461:[[65,780]],462:[[97,780]],463:[[73,780]],464:[[105,780]],465:[[79,780]],466:[[111,780]],467:[[85,780]],468:[[117,780]],469:[[220,772]],470:[[252,772]],471:[[220,769]],472:[[252,769]],473:[[220,780]],474:[[252,780]],475:[[220,768]],476:[[252,768]],478:[[196,772]],479:[[228,772]],480:[[550,772]],481:[[551,772]],482:[[198,772]],483:[[230,772]],486:[[71,780]],487:[[103,780]],488:[[75,780]],489:[[107,780]],490:[[79,808],,{772:492}],491:[[111,808],,{772:493}],492:[[490,772]],493:[[491,772]],494:[[439,780]],495:[[658,780]],496:[[106,780]],497:[[68,90],256],498:[[68,122],256],499:[[100,122],256],500:[[71,769]],501:[[103,769]],504:[[78,768]],505:[[110,768]],506:[[197,769]],507:[[229,769]],508:[[198,769]],509:[[230,769]],510:[[216,769]],511:[[248,769]],66045:[,220]},
-512:{512:[[65,783]],513:[[97,783]],514:[[65,785]],515:[[97,785]],516:[[69,783]],517:[[101,783]],518:[[69,785]],519:[[101,785]],520:[[73,783]],521:[[105,783]],522:[[73,785]],523:[[105,785]],524:[[79,783]],525:[[111,783]],526:[[79,785]],527:[[111,785]],528:[[82,783]],529:[[114,783]],530:[[82,785]],531:[[114,785]],532:[[85,783]],533:[[117,783]],534:[[85,785]],535:[[117,785]],536:[[83,806]],537:[[115,806]],538:[[84,806]],539:[[116,806]],542:[[72,780]],543:[[104,780]],550:[[65,775],,{772:480}],551:[[97,775],,{772:481}],552:[[69,807],,{774:7708}],553:[[101,807],,{774:7709}],554:[[214,772]],555:[[246,772]],556:[[213,772]],557:[[245,772]],558:[[79,775],,{772:560}],559:[[111,775],,{772:561}],560:[[558,772]],561:[[559,772]],562:[[89,772]],563:[[121,772]],658:[,,{780:495}],688:[[104],256],689:[[614],256],690:[[106],256],691:[[114],256],692:[[633],256],693:[[635],256],694:[[641],256],695:[[119],256],696:[[121],256],728:[[32,774],256],729:[[32,775],256],730:[[32,778],256],731:[[32,808],256],732:[[32,771],256],733:[[32,779],256],736:[[611],256],737:[[108],256],738:[[115],256],739:[[120],256],740:[[661],256],66272:[,220]},
-768:{768:[,230],769:[,230],770:[,230],771:[,230],772:[,230],773:[,230],774:[,230],775:[,230],776:[,230,{769:836}],777:[,230],778:[,230],779:[,230],780:[,230],781:[,230],782:[,230],783:[,230],784:[,230],785:[,230],786:[,230],787:[,230],788:[,230],789:[,232],790:[,220],791:[,220],792:[,220],793:[,220],794:[,232],795:[,216],796:[,220],797:[,220],798:[,220],799:[,220],800:[,220],801:[,202],802:[,202],803:[,220],804:[,220],805:[,220],806:[,220],807:[,202],808:[,202],809:[,220],810:[,220],811:[,220],812:[,220],813:[,220],814:[,220],815:[,220],816:[,220],817:[,220],818:[,220],819:[,220],820:[,1],821:[,1],822:[,1],823:[,1],824:[,1],825:[,220],826:[,220],827:[,220],828:[,220],829:[,230],830:[,230],831:[,230],832:[[768],230],833:[[769],230],834:[,230],835:[[787],230],836:[[776,769],230],837:[,240],838:[,230],839:[,220],840:[,220],841:[,220],842:[,230],843:[,230],844:[,230],845:[,220],846:[,220],848:[,230],849:[,230],850:[,230],851:[,220],852:[,220],853:[,220],854:[,220],855:[,230],856:[,232],857:[,220],858:[,220],859:[,230],860:[,233],861:[,234],862:[,234],863:[,233],864:[,234],865:[,234],866:[,233],867:[,230],868:[,230],869:[,230],870:[,230],871:[,230],872:[,230],873:[,230],874:[,230],875:[,230],876:[,230],877:[,230],878:[,230],879:[,230],884:[[697]],890:[[32,837],256],894:[[59]],900:[[32,769],256],901:[[168,769]],902:[[913,769]],903:[[183]],904:[[917,769]],905:[[919,769]],906:[[921,769]],908:[[927,769]],910:[[933,769]],911:[[937,769]],912:[[970,769]],913:[,,{768:8122,769:902,772:8121,774:8120,787:7944,788:7945,837:8124}],917:[,,{768:8136,769:904,787:7960,788:7961}],919:[,,{768:8138,769:905,787:7976,788:7977,837:8140}],921:[,,{768:8154,769:906,772:8153,774:8152,776:938,787:7992,788:7993}],927:[,,{768:8184,769:908,787:8008,788:8009}],929:[,,{788:8172}],933:[,,{768:8170,769:910,772:8169,774:8168,776:939,788:8025}],937:[,,{768:8186,769:911,787:8040,788:8041,837:8188}],938:[[921,776]],939:[[933,776]],940:[[945,769],,{837:8116}],941:[[949,769]],942:[[951,769],,{837:8132}],943:[[953,769]],944:[[971,769]],945:[,,{768:8048,769:940,772:8113,774:8112,787:7936,788:7937,834:8118,837:8115}],949:[,,{768:8050,769:941,787:7952,788:7953}],951:[,,{768:8052,769:942,787:7968,788:7969,834:8134,837:8131}],953:[,,{768:8054,769:943,772:8145,774:8144,776:970,787:7984,788:7985,834:8150}],959:[,,{768:8056,769:972,787:8000,788:8001}],961:[,,{787:8164,788:8165}],965:[,,{768:8058,769:973,772:8161,774:8160,776:971,787:8016,788:8017,834:8166}],969:[,,{768:8060,769:974,787:8032,788:8033,834:8182,837:8179}],970:[[953,776],,{768:8146,769:912,834:8151}],971:[[965,776],,{768:8162,769:944,834:8167}],972:[[959,769]],973:[[965,769]],974:[[969,769],,{837:8180}],976:[[946],256],977:[[952],256],978:[[933],256,{769:979,776:980}],979:[[978,769]],980:[[978,776]],981:[[966],256],982:[[960],256],1008:[[954],256],1009:[[961],256],1010:[[962],256],1012:[[920],256],1013:[[949],256],1017:[[931],256],66422:[,230],66423:[,230],66424:[,230],66425:[,230],66426:[,230]},
-1024:{1024:[[1045,768]],1025:[[1045,776]],1027:[[1043,769]],1030:[,,{776:1031}],1031:[[1030,776]],1036:[[1050,769]],1037:[[1048,768]],1038:[[1059,774]],1040:[,,{774:1232,776:1234}],1043:[,,{769:1027}],1045:[,,{768:1024,774:1238,776:1025}],1046:[,,{774:1217,776:1244}],1047:[,,{776:1246}],1048:[,,{768:1037,772:1250,774:1049,776:1252}],1049:[[1048,774]],1050:[,,{769:1036}],1054:[,,{776:1254}],1059:[,,{772:1262,774:1038,776:1264,779:1266}],1063:[,,{776:1268}],1067:[,,{776:1272}],1069:[,,{776:1260}],1072:[,,{774:1233,776:1235}],1075:[,,{769:1107}],1077:[,,{768:1104,774:1239,776:1105}],1078:[,,{774:1218,776:1245}],1079:[,,{776:1247}],1080:[,,{768:1117,772:1251,774:1081,776:1253}],1081:[[1080,774]],1082:[,,{769:1116}],1086:[,,{776:1255}],1091:[,,{772:1263,774:1118,776:1265,779:1267}],1095:[,,{776:1269}],1099:[,,{776:1273}],1101:[,,{776:1261}],1104:[[1077,768]],1105:[[1077,776]],1107:[[1075,769]],1110:[,,{776:1111}],1111:[[1110,776]],1116:[[1082,769]],1117:[[1080,768]],1118:[[1091,774]],1140:[,,{783:1142}],1141:[,,{783:1143}],1142:[[1140,783]],1143:[[1141,783]],1155:[,230],1156:[,230],1157:[,230],1158:[,230],1159:[,230],1217:[[1046,774]],1218:[[1078,774]],1232:[[1040,774]],1233:[[1072,774]],1234:[[1040,776]],1235:[[1072,776]],1238:[[1045,774]],1239:[[1077,774]],1240:[,,{776:1242}],1241:[,,{776:1243}],1242:[[1240,776]],1243:[[1241,776]],1244:[[1046,776]],1245:[[1078,776]],1246:[[1047,776]],1247:[[1079,776]],1250:[[1048,772]],1251:[[1080,772]],1252:[[1048,776]],1253:[[1080,776]],1254:[[1054,776]],1255:[[1086,776]],1256:[,,{776:1258}],1257:[,,{776:1259}],1258:[[1256,776]],1259:[[1257,776]],1260:[[1069,776]],1261:[[1101,776]],1262:[[1059,772]],1263:[[1091,772]],1264:[[1059,776]],1265:[[1091,776]],1266:[[1059,779]],1267:[[1091,779]],1268:[[1063,776]],1269:[[1095,776]],1272:[[1067,776]],1273:[[1099,776]]},
-1280:{1415:[[1381,1410],256],1425:[,220],1426:[,230],1427:[,230],1428:[,230],1429:[,230],1430:[,220],1431:[,230],1432:[,230],1433:[,230],1434:[,222],1435:[,220],1436:[,230],1437:[,230],1438:[,230],1439:[,230],1440:[,230],1441:[,230],1442:[,220],1443:[,220],1444:[,220],1445:[,220],1446:[,220],1447:[,220],1448:[,230],1449:[,230],1450:[,220],1451:[,230],1452:[,230],1453:[,222],1454:[,228],1455:[,230],1456:[,10],1457:[,11],1458:[,12],1459:[,13],1460:[,14],1461:[,15],1462:[,16],1463:[,17],1464:[,18],1465:[,19],1466:[,19],1467:[,20],1468:[,21],1469:[,22],1471:[,23],1473:[,24],1474:[,25],1476:[,230],1477:[,220],1479:[,18]},
-1536:{1552:[,230],1553:[,230],1554:[,230],1555:[,230],1556:[,230],1557:[,230],1558:[,230],1559:[,230],1560:[,30],1561:[,31],1562:[,32],1570:[[1575,1619]],1571:[[1575,1620]],1572:[[1608,1620]],1573:[[1575,1621]],1574:[[1610,1620]],1575:[,,{1619:1570,1620:1571,1621:1573}],1608:[,,{1620:1572}],1610:[,,{1620:1574}],1611:[,27],1612:[,28],1613:[,29],1614:[,30],1615:[,31],1616:[,32],1617:[,33],1618:[,34],1619:[,230],1620:[,230],1621:[,220],1622:[,220],1623:[,230],1624:[,230],1625:[,230],1626:[,230],1627:[,230],1628:[,220],1629:[,230],1630:[,230],1631:[,220],1648:[,35],1653:[[1575,1652],256],1654:[[1608,1652],256],1655:[[1735,1652],256],1656:[[1610,1652],256],1728:[[1749,1620]],1729:[,,{1620:1730}],1730:[[1729,1620]],1746:[,,{1620:1747}],1747:[[1746,1620]],1749:[,,{1620:1728}],1750:[,230],1751:[,230],1752:[,230],1753:[,230],1754:[,230],1755:[,230],1756:[,230],1759:[,230],1760:[,230],1761:[,230],1762:[,230],1763:[,220],1764:[,230],1767:[,230],1768:[,230],1770:[,220],1771:[,230],1772:[,230],1773:[,220]},
-1792:{1809:[,36],1840:[,230],1841:[,220],1842:[,230],1843:[,230],1844:[,220],1845:[,230],1846:[,230],1847:[,220],1848:[,220],1849:[,220],1850:[,230],1851:[,220],1852:[,220],1853:[,230],1854:[,220],1855:[,230],1856:[,230],1857:[,230],1858:[,220],1859:[,230],1860:[,220],1861:[,230],1862:[,220],1863:[,230],1864:[,220],1865:[,230],1866:[,230],2027:[,230],2028:[,230],2029:[,230],2030:[,230],2031:[,230],2032:[,230],2033:[,230],2034:[,220],2035:[,230]},
-2048:{2070:[,230],2071:[,230],2072:[,230],2073:[,230],2075:[,230],2076:[,230],2077:[,230],2078:[,230],2079:[,230],2080:[,230],2081:[,230],2082:[,230],2083:[,230],2085:[,230],2086:[,230],2087:[,230],2089:[,230],2090:[,230],2091:[,230],2092:[,230],2093:[,230],2137:[,220],2138:[,220],2139:[,220],2276:[,230],2277:[,230],2278:[,220],2279:[,230],2280:[,230],2281:[,220],2282:[,230],2283:[,230],2284:[,230],2285:[,220],2286:[,220],2287:[,220],2288:[,27],2289:[,28],2290:[,29],2291:[,230],2292:[,230],2293:[,230],2294:[,220],2295:[,230],2296:[,230],2297:[,220],2298:[,220],2299:[,230],2300:[,230],2301:[,230],2302:[,230],2303:[,230]},
-2304:{2344:[,,{2364:2345}],2345:[[2344,2364]],2352:[,,{2364:2353}],2353:[[2352,2364]],2355:[,,{2364:2356}],2356:[[2355,2364]],2364:[,7],2381:[,9],2385:[,230],2386:[,220],2387:[,230],2388:[,230],2392:[[2325,2364],512],2393:[[2326,2364],512],2394:[[2327,2364],512],2395:[[2332,2364],512],2396:[[2337,2364],512],2397:[[2338,2364],512],2398:[[2347,2364],512],2399:[[2351,2364],512],2492:[,7],2503:[,,{2494:2507,2519:2508}],2507:[[2503,2494]],2508:[[2503,2519]],2509:[,9],2524:[[2465,2492],512],2525:[[2466,2492],512],2527:[[2479,2492],512]},
-2560:{2611:[[2610,2620],512],2614:[[2616,2620],512],2620:[,7],2637:[,9],2649:[[2582,2620],512],2650:[[2583,2620],512],2651:[[2588,2620],512],2654:[[2603,2620],512],2748:[,7],2765:[,9],68109:[,220],68111:[,230],68152:[,230],68153:[,1],68154:[,220],68159:[,9],68325:[,230],68326:[,220]},
-2816:{2876:[,7],2887:[,,{2878:2891,2902:2888,2903:2892}],2888:[[2887,2902]],2891:[[2887,2878]],2892:[[2887,2903]],2893:[,9],2908:[[2849,2876],512],2909:[[2850,2876],512],2962:[,,{3031:2964}],2964:[[2962,3031]],3014:[,,{3006:3018,3031:3020}],3015:[,,{3006:3019}],3018:[[3014,3006]],3019:[[3015,3006]],3020:[[3014,3031]],3021:[,9]},
-3072:{3142:[,,{3158:3144}],3144:[[3142,3158]],3149:[,9],3157:[,84],3158:[,91],3260:[,7],3263:[,,{3285:3264}],3264:[[3263,3285]],3270:[,,{3266:3274,3285:3271,3286:3272}],3271:[[3270,3285]],3272:[[3270,3286]],3274:[[3270,3266],,{3285:3275}],3275:[[3274,3285]],3277:[,9]},
-3328:{3398:[,,{3390:3402,3415:3404}],3399:[,,{3390:3403}],3402:[[3398,3390]],3403:[[3399,3390]],3404:[[3398,3415]],3405:[,9],3530:[,9],3545:[,,{3530:3546,3535:3548,3551:3550}],3546:[[3545,3530]],3548:[[3545,3535],,{3530:3549}],3549:[[3548,3530]],3550:[[3545,3551]]},
-3584:{3635:[[3661,3634],256],3640:[,103],3641:[,103],3642:[,9],3656:[,107],3657:[,107],3658:[,107],3659:[,107],3763:[[3789,3762],256],3768:[,118],3769:[,118],3784:[,122],3785:[,122],3786:[,122],3787:[,122],3804:[[3755,3737],256],3805:[[3755,3745],256]},
-3840:{3852:[[3851],256],3864:[,220],3865:[,220],3893:[,220],3895:[,220],3897:[,216],3907:[[3906,4023],512],3917:[[3916,4023],512],3922:[[3921,4023],512],3927:[[3926,4023],512],3932:[[3931,4023],512],3945:[[3904,4021],512],3953:[,129],3954:[,130],3955:[[3953,3954],512],3956:[,132],3957:[[3953,3956],512],3958:[[4018,3968],512],3959:[[4018,3969],256],3960:[[4019,3968],512],3961:[[4019,3969],256],3962:[,130],3963:[,130],3964:[,130],3965:[,130],3968:[,130],3969:[[3953,3968],512],3970:[,230],3971:[,230],3972:[,9],3974:[,230],3975:[,230],3987:[[3986,4023],512],3997:[[3996,4023],512],4002:[[4001,4023],512],4007:[[4006,4023],512],4012:[[4011,4023],512],4025:[[3984,4021],512],4038:[,220]},
-4096:{4133:[,,{4142:4134}],4134:[[4133,4142]],4151:[,7],4153:[,9],4154:[,9],4237:[,220],4348:[[4316],256],69702:[,9],69759:[,9],69785:[,,{69818:69786}],69786:[[69785,69818]],69787:[,,{69818:69788}],69788:[[69787,69818]],69797:[,,{69818:69803}],69803:[[69797,69818]],69817:[,9],69818:[,7]},
-4352:{69888:[,230],69889:[,230],69890:[,230],69934:[[69937,69927]],69935:[[69938,69927]],69937:[,,{69927:69934}],69938:[,,{69927:69935}],69939:[,9],69940:[,9],70003:[,7],70080:[,9]},
-4608:{70197:[,9],70198:[,7],70377:[,7],70378:[,9]},
-4864:{4957:[,230],4958:[,230],4959:[,230],70460:[,7],70471:[,,{70462:70475,70487:70476}],70475:[[70471,70462]],70476:[[70471,70487]],70477:[,9],70502:[,230],70503:[,230],70504:[,230],70505:[,230],70506:[,230],70507:[,230],70508:[,230],70512:[,230],70513:[,230],70514:[,230],70515:[,230],70516:[,230]},
-5120:{70841:[,,{70832:70844,70842:70843,70845:70846}],70843:[[70841,70842]],70844:[[70841,70832]],70846:[[70841,70845]],70850:[,9],70851:[,7]},
-5376:{71096:[,,{71087:71098}],71097:[,,{71087:71099}],71098:[[71096,71087]],71099:[[71097,71087]],71103:[,9],71104:[,7]},
-5632:{71231:[,9],71350:[,9],71351:[,7]},
-5888:{5908:[,9],5940:[,9],6098:[,9],6109:[,230]},
-6144:{6313:[,228]},
-6400:{6457:[,222],6458:[,230],6459:[,220]},
-6656:{6679:[,230],6680:[,220],6752:[,9],6773:[,230],6774:[,230],6775:[,230],6776:[,230],6777:[,230],6778:[,230],6779:[,230],6780:[,230],6783:[,220],6832:[,230],6833:[,230],6834:[,230],6835:[,230],6836:[,230],6837:[,220],6838:[,220],6839:[,220],6840:[,220],6841:[,220],6842:[,220],6843:[,230],6844:[,230],6845:[,220]},
-6912:{6917:[,,{6965:6918}],6918:[[6917,6965]],6919:[,,{6965:6920}],6920:[[6919,6965]],6921:[,,{6965:6922}],6922:[[6921,6965]],6923:[,,{6965:6924}],6924:[[6923,6965]],6925:[,,{6965:6926}],6926:[[6925,6965]],6929:[,,{6965:6930}],6930:[[6929,6965]],6964:[,7],6970:[,,{6965:6971}],6971:[[6970,6965]],6972:[,,{6965:6973}],6973:[[6972,6965]],6974:[,,{6965:6976}],6975:[,,{6965:6977}],6976:[[6974,6965]],6977:[[6975,6965]],6978:[,,{6965:6979}],6979:[[6978,6965]],6980:[,9],7019:[,230],7020:[,220],7021:[,230],7022:[,230],7023:[,230],7024:[,230],7025:[,230],7026:[,230],7027:[,230],7082:[,9],7083:[,9],7142:[,7],7154:[,9],7155:[,9]},
-7168:{7223:[,7],7376:[,230],7377:[,230],7378:[,230],7380:[,1],7381:[,220],7382:[,220],7383:[,220],7384:[,220],7385:[,220],7386:[,230],7387:[,230],7388:[,220],7389:[,220],7390:[,220],7391:[,220],7392:[,230],7394:[,1],7395:[,1],7396:[,1],7397:[,1],7398:[,1],7399:[,1],7400:[,1],7405:[,220],7412:[,230],7416:[,230],7417:[,230]},
-7424:{7468:[[65],256],7469:[[198],256],7470:[[66],256],7472:[[68],256],7473:[[69],256],7474:[[398],256],7475:[[71],256],7476:[[72],256],7477:[[73],256],7478:[[74],256],7479:[[75],256],7480:[[76],256],7481:[[77],256],7482:[[78],256],7484:[[79],256],7485:[[546],256],7486:[[80],256],7487:[[82],256],7488:[[84],256],7489:[[85],256],7490:[[87],256],7491:[[97],256],7492:[[592],256],7493:[[593],256],7494:[[7426],256],7495:[[98],256],7496:[[100],256],7497:[[101],256],7498:[[601],256],7499:[[603],256],7500:[[604],256],7501:[[103],256],7503:[[107],256],7504:[[109],256],7505:[[331],256],7506:[[111],256],7507:[[596],256],7508:[[7446],256],7509:[[7447],256],7510:[[112],256],7511:[[116],256],7512:[[117],256],7513:[[7453],256],7514:[[623],256],7515:[[118],256],7516:[[7461],256],7517:[[946],256],7518:[[947],256],7519:[[948],256],7520:[[966],256],7521:[[967],256],7522:[[105],256],7523:[[114],256],7524:[[117],256],7525:[[118],256],7526:[[946],256],7527:[[947],256],7528:[[961],256],7529:[[966],256],7530:[[967],256],7544:[[1085],256],7579:[[594],256],7580:[[99],256],7581:[[597],256],7582:[[240],256],7583:[[604],256],7584:[[102],256],7585:[[607],256],7586:[[609],256],7587:[[613],256],7588:[[616],256],7589:[[617],256],7590:[[618],256],7591:[[7547],256],7592:[[669],256],7593:[[621],256],7594:[[7557],256],7595:[[671],256],7596:[[625],256],7597:[[624],256],7598:[[626],256],7599:[[627],256],7600:[[628],256],7601:[[629],256],7602:[[632],256],7603:[[642],256],7604:[[643],256],7605:[[427],256],7606:[[649],256],7607:[[650],256],7608:[[7452],256],7609:[[651],256],7610:[[652],256],7611:[[122],256],7612:[[656],256],7613:[[657],256],7614:[[658],256],7615:[[952],256],7616:[,230],7617:[,230],7618:[,220],7619:[,230],7620:[,230],7621:[,230],7622:[,230],7623:[,230],7624:[,230],7625:[,230],7626:[,220],7627:[,230],7628:[,230],7629:[,234],7630:[,214],7631:[,220],7632:[,202],7633:[,230],7634:[,230],7635:[,230],7636:[,230],7637:[,230],7638:[,230],7639:[,230],7640:[,230],7641:[,230],7642:[,230],7643:[,230],7644:[,230],7645:[,230],7646:[,230],7647:[,230],7648:[,230],7649:[,230],7650:[,230],7651:[,230],7652:[,230],7653:[,230],7654:[,230],7655:[,230],7656:[,230],7657:[,230],7658:[,230],7659:[,230],7660:[,230],7661:[,230],7662:[,230],7663:[,230],7664:[,230],7665:[,230],7666:[,230],7667:[,230],7668:[,230],7669:[,230],7676:[,233],7677:[,220],7678:[,230],7679:[,220]},
-7680:{7680:[[65,805]],7681:[[97,805]],7682:[[66,775]],7683:[[98,775]],7684:[[66,803]],7685:[[98,803]],7686:[[66,817]],7687:[[98,817]],7688:[[199,769]],7689:[[231,769]],7690:[[68,775]],7691:[[100,775]],7692:[[68,803]],7693:[[100,803]],7694:[[68,817]],7695:[[100,817]],7696:[[68,807]],7697:[[100,807]],7698:[[68,813]],7699:[[100,813]],7700:[[274,768]],7701:[[275,768]],7702:[[274,769]],7703:[[275,769]],7704:[[69,813]],7705:[[101,813]],7706:[[69,816]],7707:[[101,816]],7708:[[552,774]],7709:[[553,774]],7710:[[70,775]],7711:[[102,775]],7712:[[71,772]],7713:[[103,772]],7714:[[72,775]],7715:[[104,775]],7716:[[72,803]],7717:[[104,803]],7718:[[72,776]],7719:[[104,776]],7720:[[72,807]],7721:[[104,807]],7722:[[72,814]],7723:[[104,814]],7724:[[73,816]],7725:[[105,816]],7726:[[207,769]],7727:[[239,769]],7728:[[75,769]],7729:[[107,769]],7730:[[75,803]],7731:[[107,803]],7732:[[75,817]],7733:[[107,817]],7734:[[76,803],,{772:7736}],7735:[[108,803],,{772:7737}],7736:[[7734,772]],7737:[[7735,772]],7738:[[76,817]],7739:[[108,817]],7740:[[76,813]],7741:[[108,813]],7742:[[77,769]],7743:[[109,769]],7744:[[77,775]],7745:[[109,775]],7746:[[77,803]],7747:[[109,803]],7748:[[78,775]],7749:[[110,775]],7750:[[78,803]],7751:[[110,803]],7752:[[78,817]],7753:[[110,817]],7754:[[78,813]],7755:[[110,813]],7756:[[213,769]],7757:[[245,769]],7758:[[213,776]],7759:[[245,776]],7760:[[332,768]],7761:[[333,768]],7762:[[332,769]],7763:[[333,769]],7764:[[80,769]],7765:[[112,769]],7766:[[80,775]],7767:[[112,775]],7768:[[82,775]],7769:[[114,775]],7770:[[82,803],,{772:7772}],7771:[[114,803],,{772:7773}],7772:[[7770,772]],7773:[[7771,772]],7774:[[82,817]],7775:[[114,817]],7776:[[83,775]],7777:[[115,775]],7778:[[83,803],,{775:7784}],7779:[[115,803],,{775:7785}],7780:[[346,775]],7781:[[347,775]],7782:[[352,775]],7783:[[353,775]],7784:[[7778,775]],7785:[[7779,775]],7786:[[84,775]],7787:[[116,775]],7788:[[84,803]],7789:[[116,803]],7790:[[84,817]],7791:[[116,817]],7792:[[84,813]],7793:[[116,813]],7794:[[85,804]],7795:[[117,804]],7796:[[85,816]],7797:[[117,816]],7798:[[85,813]],7799:[[117,813]],7800:[[360,769]],7801:[[361,769]],7802:[[362,776]],7803:[[363,776]],7804:[[86,771]],7805:[[118,771]],7806:[[86,803]],7807:[[118,803]],7808:[[87,768]],7809:[[119,768]],7810:[[87,769]],7811:[[119,769]],7812:[[87,776]],7813:[[119,776]],7814:[[87,775]],7815:[[119,775]],7816:[[87,803]],7817:[[119,803]],7818:[[88,775]],7819:[[120,775]],7820:[[88,776]],7821:[[120,776]],7822:[[89,775]],7823:[[121,775]],7824:[[90,770]],7825:[[122,770]],7826:[[90,803]],7827:[[122,803]],7828:[[90,817]],7829:[[122,817]],7830:[[104,817]],7831:[[116,776]],7832:[[119,778]],7833:[[121,778]],7834:[[97,702],256],7835:[[383,775]],7840:[[65,803],,{770:7852,774:7862}],7841:[[97,803],,{770:7853,774:7863}],7842:[[65,777]],7843:[[97,777]],7844:[[194,769]],7845:[[226,769]],7846:[[194,768]],7847:[[226,768]],7848:[[194,777]],7849:[[226,777]],7850:[[194,771]],7851:[[226,771]],7852:[[7840,770]],7853:[[7841,770]],7854:[[258,769]],7855:[[259,769]],7856:[[258,768]],7857:[[259,768]],7858:[[258,777]],7859:[[259,777]],7860:[[258,771]],7861:[[259,771]],7862:[[7840,774]],7863:[[7841,774]],7864:[[69,803],,{770:7878}],7865:[[101,803],,{770:7879}],7866:[[69,777]],7867:[[101,777]],7868:[[69,771]],7869:[[101,771]],7870:[[202,769]],7871:[[234,769]],7872:[[202,768]],7873:[[234,768]],7874:[[202,777]],7875:[[234,777]],7876:[[202,771]],7877:[[234,771]],7878:[[7864,770]],7879:[[7865,770]],7880:[[73,777]],7881:[[105,777]],7882:[[73,803]],7883:[[105,803]],7884:[[79,803],,{770:7896}],7885:[[111,803],,{770:7897}],7886:[[79,777]],7887:[[111,777]],7888:[[212,769]],7889:[[244,769]],7890:[[212,768]],7891:[[244,768]],7892:[[212,777]],7893:[[244,777]],7894:[[212,771]],7895:[[244,771]],7896:[[7884,770]],7897:[[7885,770]],7898:[[416,769]],7899:[[417,769]],7900:[[416,768]],7901:[[417,768]],7902:[[416,777]],7903:[[417,777]],7904:[[416,771]],7905:[[417,771]],7906:[[416,803]],7907:[[417,803]],7908:[[85,803]],7909:[[117,803]],7910:[[85,777]],7911:[[117,777]],7912:[[431,769]],7913:[[432,769]],7914:[[431,768]],7915:[[432,768]],7916:[[431,777]],7917:[[432,777]],7918:[[431,771]],7919:[[432,771]],7920:[[431,803]],7921:[[432,803]],7922:[[89,768]],7923:[[121,768]],7924:[[89,803]],7925:[[121,803]],7926:[[89,777]],7927:[[121,777]],7928:[[89,771]],7929:[[121,771]]},
-7936:{7936:[[945,787],,{768:7938,769:7940,834:7942,837:8064}],7937:[[945,788],,{768:7939,769:7941,834:7943,837:8065}],7938:[[7936,768],,{837:8066}],7939:[[7937,768],,{837:8067}],7940:[[7936,769],,{837:8068}],7941:[[7937,769],,{837:8069}],7942:[[7936,834],,{837:8070}],7943:[[7937,834],,{837:8071}],7944:[[913,787],,{768:7946,769:7948,834:7950,837:8072}],7945:[[913,788],,{768:7947,769:7949,834:7951,837:8073}],7946:[[7944,768],,{837:8074}],7947:[[7945,768],,{837:8075}],7948:[[7944,769],,{837:8076}],7949:[[7945,769],,{837:8077}],7950:[[7944,834],,{837:8078}],7951:[[7945,834],,{837:8079}],7952:[[949,787],,{768:7954,769:7956}],7953:[[949,788],,{768:7955,769:7957}],7954:[[7952,768]],7955:[[7953,768]],7956:[[7952,769]],7957:[[7953,769]],7960:[[917,787],,{768:7962,769:7964}],7961:[[917,788],,{768:7963,769:7965}],7962:[[7960,768]],7963:[[7961,768]],7964:[[7960,769]],7965:[[7961,769]],7968:[[951,787],,{768:7970,769:7972,834:7974,837:8080}],7969:[[951,788],,{768:7971,769:7973,834:7975,837:8081}],7970:[[7968,768],,{837:8082}],7971:[[7969,768],,{837:8083}],7972:[[7968,769],,{837:8084}],7973:[[7969,769],,{837:8085}],7974:[[7968,834],,{837:8086}],7975:[[7969,834],,{837:8087}],7976:[[919,787],,{768:7978,769:7980,834:7982,837:8088}],7977:[[919,788],,{768:7979,769:7981,834:7983,837:8089}],7978:[[7976,768],,{837:8090}],7979:[[7977,768],,{837:8091}],7980:[[7976,769],,{837:8092}],7981:[[7977,769],,{837:8093}],7982:[[7976,834],,{837:8094}],7983:[[7977,834],,{837:8095}],7984:[[953,787],,{768:7986,769:7988,834:7990}],7985:[[953,788],,{768:7987,769:7989,834:7991}],7986:[[7984,768]],7987:[[7985,768]],7988:[[7984,769]],7989:[[7985,769]],7990:[[7984,834]],7991:[[7985,834]],7992:[[921,787],,{768:7994,769:7996,834:7998}],7993:[[921,788],,{768:7995,769:7997,834:7999}],7994:[[7992,768]],7995:[[7993,768]],7996:[[7992,769]],7997:[[7993,769]],7998:[[7992,834]],7999:[[7993,834]],8000:[[959,787],,{768:8002,769:8004}],8001:[[959,788],,{768:8003,769:8005}],8002:[[8000,768]],8003:[[8001,768]],8004:[[8000,769]],8005:[[8001,769]],8008:[[927,787],,{768:8010,769:8012}],8009:[[927,788],,{768:8011,769:8013}],8010:[[8008,768]],8011:[[8009,768]],8012:[[8008,769]],8013:[[8009,769]],8016:[[965,787],,{768:8018,769:8020,834:8022}],8017:[[965,788],,{768:8019,769:8021,834:8023}],8018:[[8016,768]],8019:[[8017,768]],8020:[[8016,769]],8021:[[8017,769]],8022:[[8016,834]],8023:[[8017,834]],8025:[[933,788],,{768:8027,769:8029,834:8031}],8027:[[8025,768]],8029:[[8025,769]],8031:[[8025,834]],8032:[[969,787],,{768:8034,769:8036,834:8038,837:8096}],8033:[[969,788],,{768:8035,769:8037,834:8039,837:8097}],8034:[[8032,768],,{837:8098}],8035:[[8033,768],,{837:8099}],8036:[[8032,769],,{837:8100}],8037:[[8033,769],,{837:8101}],8038:[[8032,834],,{837:8102}],8039:[[8033,834],,{837:8103}],8040:[[937,787],,{768:8042,769:8044,834:8046,837:8104}],8041:[[937,788],,{768:8043,769:8045,834:8047,837:8105}],8042:[[8040,768],,{837:8106}],8043:[[8041,768],,{837:8107}],8044:[[8040,769],,{837:8108}],8045:[[8041,769],,{837:8109}],8046:[[8040,834],,{837:8110}],8047:[[8041,834],,{837:8111}],8048:[[945,768],,{837:8114}],8049:[[940]],8050:[[949,768]],8051:[[941]],8052:[[951,768],,{837:8130}],8053:[[942]],8054:[[953,768]],8055:[[943]],8056:[[959,768]],8057:[[972]],8058:[[965,768]],8059:[[973]],8060:[[969,768],,{837:8178}],8061:[[974]],8064:[[7936,837]],8065:[[7937,837]],8066:[[7938,837]],8067:[[7939,837]],8068:[[7940,837]],8069:[[7941,837]],8070:[[7942,837]],8071:[[7943,837]],8072:[[7944,837]],8073:[[7945,837]],8074:[[7946,837]],8075:[[7947,837]],8076:[[7948,837]],8077:[[7949,837]],8078:[[7950,837]],8079:[[7951,837]],8080:[[7968,837]],8081:[[7969,837]],8082:[[7970,837]],8083:[[7971,837]],8084:[[7972,837]],8085:[[7973,837]],8086:[[7974,837]],8087:[[7975,837]],8088:[[7976,837]],8089:[[7977,837]],8090:[[7978,837]],8091:[[7979,837]],8092:[[7980,837]],8093:[[7981,837]],8094:[[7982,837]],8095:[[7983,837]],8096:[[8032,837]],8097:[[8033,837]],8098:[[8034,837]],8099:[[8035,837]],8100:[[8036,837]],8101:[[8037,837]],8102:[[8038,837]],8103:[[8039,837]],8104:[[8040,837]],8105:[[8041,837]],8106:[[8042,837]],8107:[[8043,837]],8108:[[8044,837]],8109:[[8045,837]],8110:[[8046,837]],8111:[[8047,837]],8112:[[945,774]],8113:[[945,772]],8114:[[8048,837]],8115:[[945,837]],8116:[[940,837]],8118:[[945,834],,{837:8119}],8119:[[8118,837]],8120:[[913,774]],8121:[[913,772]],8122:[[913,768]],8123:[[902]],8124:[[913,837]],8125:[[32,787],256],8126:[[953]],8127:[[32,787],256,{768:8141,769:8142,834:8143}],8128:[[32,834],256],8129:[[168,834]],8130:[[8052,837]],8131:[[951,837]],8132:[[942,837]],8134:[[951,834],,{837:8135}],8135:[[8134,837]],8136:[[917,768]],8137:[[904]],8138:[[919,768]],8139:[[905]],8140:[[919,837]],8141:[[8127,768]],8142:[[8127,769]],8143:[[8127,834]],8144:[[953,774]],8145:[[953,772]],8146:[[970,768]],8147:[[912]],8150:[[953,834]],8151:[[970,834]],8152:[[921,774]],8153:[[921,772]],8154:[[921,768]],8155:[[906]],8157:[[8190,768]],8158:[[8190,769]],8159:[[8190,834]],8160:[[965,774]],8161:[[965,772]],8162:[[971,768]],8163:[[944]],8164:[[961,787]],8165:[[961,788]],8166:[[965,834]],8167:[[971,834]],8168:[[933,774]],8169:[[933,772]],8170:[[933,768]],8171:[[910]],8172:[[929,788]],8173:[[168,768]],8174:[[901]],8175:[[96]],8178:[[8060,837]],8179:[[969,837]],8180:[[974,837]],8182:[[969,834],,{837:8183}],8183:[[8182,837]],8184:[[927,768]],8185:[[908]],8186:[[937,768]],8187:[[911]],8188:[[937,837]],8189:[[180]],8190:[[32,788],256,{768:8157,769:8158,834:8159}]},
-8192:{8192:[[8194]],8193:[[8195]],8194:[[32],256],8195:[[32],256],8196:[[32],256],8197:[[32],256],8198:[[32],256],8199:[[32],256],8200:[[32],256],8201:[[32],256],8202:[[32],256],8209:[[8208],256],8215:[[32,819],256],8228:[[46],256],8229:[[46,46],256],8230:[[46,46,46],256],8239:[[32],256],8243:[[8242,8242],256],8244:[[8242,8242,8242],256],8246:[[8245,8245],256],8247:[[8245,8245,8245],256],8252:[[33,33],256],8254:[[32,773],256],8263:[[63,63],256],8264:[[63,33],256],8265:[[33,63],256],8279:[[8242,8242,8242,8242],256],8287:[[32],256],8304:[[48],256],8305:[[105],256],8308:[[52],256],8309:[[53],256],8310:[[54],256],8311:[[55],256],8312:[[56],256],8313:[[57],256],8314:[[43],256],8315:[[8722],256],8316:[[61],256],8317:[[40],256],8318:[[41],256],8319:[[110],256],8320:[[48],256],8321:[[49],256],8322:[[50],256],8323:[[51],256],8324:[[52],256],8325:[[53],256],8326:[[54],256],8327:[[55],256],8328:[[56],256],8329:[[57],256],8330:[[43],256],8331:[[8722],256],8332:[[61],256],8333:[[40],256],8334:[[41],256],8336:[[97],256],8337:[[101],256],8338:[[111],256],8339:[[120],256],8340:[[601],256],8341:[[104],256],8342:[[107],256],8343:[[108],256],8344:[[109],256],8345:[[110],256],8346:[[112],256],8347:[[115],256],8348:[[116],256],8360:[[82,115],256],8400:[,230],8401:[,230],8402:[,1],8403:[,1],8404:[,230],8405:[,230],8406:[,230],8407:[,230],8408:[,1],8409:[,1],8410:[,1],8411:[,230],8412:[,230],8417:[,230],8421:[,1],8422:[,1],8423:[,230],8424:[,220],8425:[,230],8426:[,1],8427:[,1],8428:[,220],8429:[,220],8430:[,220],8431:[,220],8432:[,230]},
-8448:{8448:[[97,47,99],256],8449:[[97,47,115],256],8450:[[67],256],8451:[[176,67],256],8453:[[99,47,111],256],8454:[[99,47,117],256],8455:[[400],256],8457:[[176,70],256],8458:[[103],256],8459:[[72],256],8460:[[72],256],8461:[[72],256],8462:[[104],256],8463:[[295],256],8464:[[73],256],8465:[[73],256],8466:[[76],256],8467:[[108],256],8469:[[78],256],8470:[[78,111],256],8473:[[80],256],8474:[[81],256],8475:[[82],256],8476:[[82],256],8477:[[82],256],8480:[[83,77],256],8481:[[84,69,76],256],8482:[[84,77],256],8484:[[90],256],8486:[[937]],8488:[[90],256],8490:[[75]],8491:[[197]],8492:[[66],256],8493:[[67],256],8495:[[101],256],8496:[[69],256],8497:[[70],256],8499:[[77],256],8500:[[111],256],8501:[[1488],256],8502:[[1489],256],8503:[[1490],256],8504:[[1491],256],8505:[[105],256],8507:[[70,65,88],256],8508:[[960],256],8509:[[947],256],8510:[[915],256],8511:[[928],256],8512:[[8721],256],8517:[[68],256],8518:[[100],256],8519:[[101],256],8520:[[105],256],8521:[[106],256],8528:[[49,8260,55],256],8529:[[49,8260,57],256],8530:[[49,8260,49,48],256],8531:[[49,8260,51],256],8532:[[50,8260,51],256],8533:[[49,8260,53],256],8534:[[50,8260,53],256],8535:[[51,8260,53],256],8536:[[52,8260,53],256],8537:[[49,8260,54],256],8538:[[53,8260,54],256],8539:[[49,8260,56],256],8540:[[51,8260,56],256],8541:[[53,8260,56],256],8542:[[55,8260,56],256],8543:[[49,8260],256],8544:[[73],256],8545:[[73,73],256],8546:[[73,73,73],256],8547:[[73,86],256],8548:[[86],256],8549:[[86,73],256],8550:[[86,73,73],256],8551:[[86,73,73,73],256],8552:[[73,88],256],8553:[[88],256],8554:[[88,73],256],8555:[[88,73,73],256],8556:[[76],256],8557:[[67],256],8558:[[68],256],8559:[[77],256],8560:[[105],256],8561:[[105,105],256],8562:[[105,105,105],256],8563:[[105,118],256],8564:[[118],256],8565:[[118,105],256],8566:[[118,105,105],256],8567:[[118,105,105,105],256],8568:[[105,120],256],8569:[[120],256],8570:[[120,105],256],8571:[[120,105,105],256],8572:[[108],256],8573:[[99],256],8574:[[100],256],8575:[[109],256],8585:[[48,8260,51],256],8592:[,,{824:8602}],8594:[,,{824:8603}],8596:[,,{824:8622}],8602:[[8592,824]],8603:[[8594,824]],8622:[[8596,824]],8653:[[8656,824]],8654:[[8660,824]],8655:[[8658,824]],8656:[,,{824:8653}],8658:[,,{824:8655}],8660:[,,{824:8654}]},
-8704:{8707:[,,{824:8708}],8708:[[8707,824]],8712:[,,{824:8713}],8713:[[8712,824]],8715:[,,{824:8716}],8716:[[8715,824]],8739:[,,{824:8740}],8740:[[8739,824]],8741:[,,{824:8742}],8742:[[8741,824]],8748:[[8747,8747],256],8749:[[8747,8747,8747],256],8751:[[8750,8750],256],8752:[[8750,8750,8750],256],8764:[,,{824:8769}],8769:[[8764,824]],8771:[,,{824:8772}],8772:[[8771,824]],8773:[,,{824:8775}],8775:[[8773,824]],8776:[,,{824:8777}],8777:[[8776,824]],8781:[,,{824:8813}],8800:[[61,824]],8801:[,,{824:8802}],8802:[[8801,824]],8804:[,,{824:8816}],8805:[,,{824:8817}],8813:[[8781,824]],8814:[[60,824]],8815:[[62,824]],8816:[[8804,824]],8817:[[8805,824]],8818:[,,{824:8820}],8819:[,,{824:8821}],8820:[[8818,824]],8821:[[8819,824]],8822:[,,{824:8824}],8823:[,,{824:8825}],8824:[[8822,824]],8825:[[8823,824]],8826:[,,{824:8832}],8827:[,,{824:8833}],8828:[,,{824:8928}],8829:[,,{824:8929}],8832:[[8826,824]],8833:[[8827,824]],8834:[,,{824:8836}],8835:[,,{824:8837}],8836:[[8834,824]],8837:[[8835,824]],8838:[,,{824:8840}],8839:[,,{824:8841}],8840:[[8838,824]],8841:[[8839,824]],8849:[,,{824:8930}],8850:[,,{824:8931}],8866:[,,{824:8876}],8872:[,,{824:8877}],8873:[,,{824:8878}],8875:[,,{824:8879}],8876:[[8866,824]],8877:[[8872,824]],8878:[[8873,824]],8879:[[8875,824]],8882:[,,{824:8938}],8883:[,,{824:8939}],8884:[,,{824:8940}],8885:[,,{824:8941}],8928:[[8828,824]],8929:[[8829,824]],8930:[[8849,824]],8931:[[8850,824]],8938:[[8882,824]],8939:[[8883,824]],8940:[[8884,824]],8941:[[8885,824]]},
-8960:{9001:[[12296]],9002:[[12297]]},
-9216:{9312:[[49],256],9313:[[50],256],9314:[[51],256],9315:[[52],256],9316:[[53],256],9317:[[54],256],9318:[[55],256],9319:[[56],256],9320:[[57],256],9321:[[49,48],256],9322:[[49,49],256],9323:[[49,50],256],9324:[[49,51],256],9325:[[49,52],256],9326:[[49,53],256],9327:[[49,54],256],9328:[[49,55],256],9329:[[49,56],256],9330:[[49,57],256],9331:[[50,48],256],9332:[[40,49,41],256],9333:[[40,50,41],256],9334:[[40,51,41],256],9335:[[40,52,41],256],9336:[[40,53,41],256],9337:[[40,54,41],256],9338:[[40,55,41],256],9339:[[40,56,41],256],9340:[[40,57,41],256],9341:[[40,49,48,41],256],9342:[[40,49,49,41],256],9343:[[40,49,50,41],256],9344:[[40,49,51,41],256],9345:[[40,49,52,41],256],9346:[[40,49,53,41],256],9347:[[40,49,54,41],256],9348:[[40,49,55,41],256],9349:[[40,49,56,41],256],9350:[[40,49,57,41],256],9351:[[40,50,48,41],256],9352:[[49,46],256],9353:[[50,46],256],9354:[[51,46],256],9355:[[52,46],256],9356:[[53,46],256],9357:[[54,46],256],9358:[[55,46],256],9359:[[56,46],256],9360:[[57,46],256],9361:[[49,48,46],256],9362:[[49,49,46],256],9363:[[49,50,46],256],9364:[[49,51,46],256],9365:[[49,52,46],256],9366:[[49,53,46],256],9367:[[49,54,46],256],9368:[[49,55,46],256],9369:[[49,56,46],256],9370:[[49,57,46],256],9371:[[50,48,46],256],9372:[[40,97,41],256],9373:[[40,98,41],256],9374:[[40,99,41],256],9375:[[40,100,41],256],9376:[[40,101,41],256],9377:[[40,102,41],256],9378:[[40,103,41],256],9379:[[40,104,41],256],9380:[[40,105,41],256],9381:[[40,106,41],256],9382:[[40,107,41],256],9383:[[40,108,41],256],9384:[[40,109,41],256],9385:[[40,110,41],256],9386:[[40,111,41],256],9387:[[40,112,41],256],9388:[[40,113,41],256],9389:[[40,114,41],256],9390:[[40,115,41],256],9391:[[40,116,41],256],9392:[[40,117,41],256],9393:[[40,118,41],256],9394:[[40,119,41],256],9395:[[40,120,41],256],9396:[[40,121,41],256],9397:[[40,122,41],256],9398:[[65],256],9399:[[66],256],9400:[[67],256],9401:[[68],256],9402:[[69],256],9403:[[70],256],9404:[[71],256],9405:[[72],256],9406:[[73],256],9407:[[74],256],9408:[[75],256],9409:[[76],256],9410:[[77],256],9411:[[78],256],9412:[[79],256],9413:[[80],256],9414:[[81],256],9415:[[82],256],9416:[[83],256],9417:[[84],256],9418:[[85],256],9419:[[86],256],9420:[[87],256],9421:[[88],256],9422:[[89],256],9423:[[90],256],9424:[[97],256],9425:[[98],256],9426:[[99],256],9427:[[100],256],9428:[[101],256],9429:[[102],256],9430:[[103],256],9431:[[104],256],9432:[[105],256],9433:[[106],256],9434:[[107],256],9435:[[108],256],9436:[[109],256],9437:[[110],256],9438:[[111],256],9439:[[112],256],9440:[[113],256],9441:[[114],256],9442:[[115],256],9443:[[116],256],9444:[[117],256],9445:[[118],256],9446:[[119],256],9447:[[120],256],9448:[[121],256],9449:[[122],256],9450:[[48],256]},
-10752:{10764:[[8747,8747,8747,8747],256],10868:[[58,58,61],256],10869:[[61,61],256],10870:[[61,61,61],256],10972:[[10973,824],512]},
-11264:{11388:[[106],256],11389:[[86],256],11503:[,230],11504:[,230],11505:[,230]},
-11520:{11631:[[11617],256],11647:[,9],11744:[,230],11745:[,230],11746:[,230],11747:[,230],11748:[,230],11749:[,230],11750:[,230],11751:[,230],11752:[,230],11753:[,230],11754:[,230],11755:[,230],11756:[,230],11757:[,230],11758:[,230],11759:[,230],11760:[,230],11761:[,230],11762:[,230],11763:[,230],11764:[,230],11765:[,230],11766:[,230],11767:[,230],11768:[,230],11769:[,230],11770:[,230],11771:[,230],11772:[,230],11773:[,230],11774:[,230],11775:[,230]},
-11776:{11935:[[27597],256],12019:[[40863],256]},
-12032:{12032:[[19968],256],12033:[[20008],256],12034:[[20022],256],12035:[[20031],256],12036:[[20057],256],12037:[[20101],256],12038:[[20108],256],12039:[[20128],256],12040:[[20154],256],12041:[[20799],256],12042:[[20837],256],12043:[[20843],256],12044:[[20866],256],12045:[[20886],256],12046:[[20907],256],12047:[[20960],256],12048:[[20981],256],12049:[[20992],256],12050:[[21147],256],12051:[[21241],256],12052:[[21269],256],12053:[[21274],256],12054:[[21304],256],12055:[[21313],256],12056:[[21340],256],12057:[[21353],256],12058:[[21378],256],12059:[[21430],256],12060:[[21448],256],12061:[[21475],256],12062:[[22231],256],12063:[[22303],256],12064:[[22763],256],12065:[[22786],256],12066:[[22794],256],12067:[[22805],256],12068:[[22823],256],12069:[[22899],256],12070:[[23376],256],12071:[[23424],256],12072:[[23544],256],12073:[[23567],256],12074:[[23586],256],12075:[[23608],256],12076:[[23662],256],12077:[[23665],256],12078:[[24027],256],12079:[[24037],256],12080:[[24049],256],12081:[[24062],256],12082:[[24178],256],12083:[[24186],256],12084:[[24191],256],12085:[[24308],256],12086:[[24318],256],12087:[[24331],256],12088:[[24339],256],12089:[[24400],256],12090:[[24417],256],12091:[[24435],256],12092:[[24515],256],12093:[[25096],256],12094:[[25142],256],12095:[[25163],256],12096:[[25903],256],12097:[[25908],256],12098:[[25991],256],12099:[[26007],256],12100:[[26020],256],12101:[[26041],256],12102:[[26080],256],12103:[[26085],256],12104:[[26352],256],12105:[[26376],256],12106:[[26408],256],12107:[[27424],256],12108:[[27490],256],12109:[[27513],256],12110:[[27571],256],12111:[[27595],256],12112:[[27604],256],12113:[[27611],256],12114:[[27663],256],12115:[[27668],256],12116:[[27700],256],12117:[[28779],256],12118:[[29226],256],12119:[[29238],256],12120:[[29243],256],12121:[[29247],256],12122:[[29255],256],12123:[[29273],256],12124:[[29275],256],12125:[[29356],256],12126:[[29572],256],12127:[[29577],256],12128:[[29916],256],12129:[[29926],256],12130:[[29976],256],12131:[[29983],256],12132:[[29992],256],12133:[[30000],256],12134:[[30091],256],12135:[[30098],256],12136:[[30326],256],12137:[[30333],256],12138:[[30382],256],12139:[[30399],256],12140:[[30446],256],12141:[[30683],256],12142:[[30690],256],12143:[[30707],256],12144:[[31034],256],12145:[[31160],256],12146:[[31166],256],12147:[[31348],256],12148:[[31435],256],12149:[[31481],256],12150:[[31859],256],12151:[[31992],256],12152:[[32566],256],12153:[[32593],256],12154:[[32650],256],12155:[[32701],256],12156:[[32769],256],12157:[[32780],256],12158:[[32786],256],12159:[[32819],256],12160:[[32895],256],12161:[[32905],256],12162:[[33251],256],12163:[[33258],256],12164:[[33267],256],12165:[[33276],256],12166:[[33292],256],12167:[[33307],256],12168:[[33311],256],12169:[[33390],256],12170:[[33394],256],12171:[[33400],256],12172:[[34381],256],12173:[[34411],256],12174:[[34880],256],12175:[[34892],256],12176:[[34915],256],12177:[[35198],256],12178:[[35211],256],12179:[[35282],256],12180:[[35328],256],12181:[[35895],256],12182:[[35910],256],12183:[[35925],256],12184:[[35960],256],12185:[[35997],256],12186:[[36196],256],12187:[[36208],256],12188:[[36275],256],12189:[[36523],256],12190:[[36554],256],12191:[[36763],256],12192:[[36784],256],12193:[[36789],256],12194:[[37009],256],12195:[[37193],256],12196:[[37318],256],12197:[[37324],256],12198:[[37329],256],12199:[[38263],256],12200:[[38272],256],12201:[[38428],256],12202:[[38582],256],12203:[[38585],256],12204:[[38632],256],12205:[[38737],256],12206:[[38750],256],12207:[[38754],256],12208:[[38761],256],12209:[[38859],256],12210:[[38893],256],12211:[[38899],256],12212:[[38913],256],12213:[[39080],256],12214:[[39131],256],12215:[[39135],256],12216:[[39318],256],12217:[[39321],256],12218:[[39340],256],12219:[[39592],256],12220:[[39640],256],12221:[[39647],256],12222:[[39717],256],12223:[[39727],256],12224:[[39730],256],12225:[[39740],256],12226:[[39770],256],12227:[[40165],256],12228:[[40565],256],12229:[[40575],256],12230:[[40613],256],12231:[[40635],256],12232:[[40643],256],12233:[[40653],256],12234:[[40657],256],12235:[[40697],256],12236:[[40701],256],12237:[[40718],256],12238:[[40723],256],12239:[[40736],256],12240:[[40763],256],12241:[[40778],256],12242:[[40786],256],12243:[[40845],256],12244:[[40860],256],12245:[[40864],256]},
-12288:{12288:[[32],256],12330:[,218],12331:[,228],12332:[,232],12333:[,222],12334:[,224],12335:[,224],12342:[[12306],256],12344:[[21313],256],12345:[[21316],256],12346:[[21317],256],12358:[,,{12441:12436}],12363:[,,{12441:12364}],12364:[[12363,12441]],12365:[,,{12441:12366}],12366:[[12365,12441]],12367:[,,{12441:12368}],12368:[[12367,12441]],12369:[,,{12441:12370}],12370:[[12369,12441]],12371:[,,{12441:12372}],12372:[[12371,12441]],12373:[,,{12441:12374}],12374:[[12373,12441]],12375:[,,{12441:12376}],12376:[[12375,12441]],12377:[,,{12441:12378}],12378:[[12377,12441]],12379:[,,{12441:12380}],12380:[[12379,12441]],12381:[,,{12441:12382}],12382:[[12381,12441]],12383:[,,{12441:12384}],12384:[[12383,12441]],12385:[,,{12441:12386}],12386:[[12385,12441]],12388:[,,{12441:12389}],12389:[[12388,12441]],12390:[,,{12441:12391}],12391:[[12390,12441]],12392:[,,{12441:12393}],12393:[[12392,12441]],12399:[,,{12441:12400,12442:12401}],12400:[[12399,12441]],12401:[[12399,12442]],12402:[,,{12441:12403,12442:12404}],12403:[[12402,12441]],12404:[[12402,12442]],12405:[,,{12441:12406,12442:12407}],12406:[[12405,12441]],12407:[[12405,12442]],12408:[,,{12441:12409,12442:12410}],12409:[[12408,12441]],12410:[[12408,12442]],12411:[,,{12441:12412,12442:12413}],12412:[[12411,12441]],12413:[[12411,12442]],12436:[[12358,12441]],12441:[,8],12442:[,8],12443:[[32,12441],256],12444:[[32,12442],256],12445:[,,{12441:12446}],12446:[[12445,12441]],12447:[[12424,12426],256],12454:[,,{12441:12532}],12459:[,,{12441:12460}],12460:[[12459,12441]],12461:[,,{12441:12462}],12462:[[12461,12441]],12463:[,,{12441:12464}],12464:[[12463,12441]],12465:[,,{12441:12466}],12466:[[12465,12441]],12467:[,,{12441:12468}],12468:[[12467,12441]],12469:[,,{12441:12470}],12470:[[12469,12441]],12471:[,,{12441:12472}],12472:[[12471,12441]],12473:[,,{12441:12474}],12474:[[12473,12441]],12475:[,,{12441:12476}],12476:[[12475,12441]],12477:[,,{12441:12478}],12478:[[12477,12441]],12479:[,,{12441:12480}],12480:[[12479,12441]],12481:[,,{12441:12482}],12482:[[12481,12441]],12484:[,,{12441:12485}],12485:[[12484,12441]],12486:[,,{12441:12487}],12487:[[12486,12441]],12488:[,,{12441:12489}],12489:[[12488,12441]],12495:[,,{12441:12496,12442:12497}],12496:[[12495,12441]],12497:[[12495,12442]],12498:[,,{12441:12499,12442:12500}],12499:[[12498,12441]],12500:[[12498,12442]],12501:[,,{12441:12502,12442:12503}],12502:[[12501,12441]],12503:[[12501,12442]],12504:[,,{12441:12505,12442:12506}],12505:[[12504,12441]],12506:[[12504,12442]],12507:[,,{12441:12508,12442:12509}],12508:[[12507,12441]],12509:[[12507,12442]],12527:[,,{12441:12535}],12528:[,,{12441:12536}],12529:[,,{12441:12537}],12530:[,,{12441:12538}],12532:[[12454,12441]],12535:[[12527,12441]],12536:[[12528,12441]],12537:[[12529,12441]],12538:[[12530,12441]],12541:[,,{12441:12542}],12542:[[12541,12441]],12543:[[12467,12488],256]},
-12544:{12593:[[4352],256],12594:[[4353],256],12595:[[4522],256],12596:[[4354],256],12597:[[4524],256],12598:[[4525],256],12599:[[4355],256],12600:[[4356],256],12601:[[4357],256],12602:[[4528],256],12603:[[4529],256],12604:[[4530],256],12605:[[4531],256],12606:[[4532],256],12607:[[4533],256],12608:[[4378],256],12609:[[4358],256],12610:[[4359],256],12611:[[4360],256],12612:[[4385],256],12613:[[4361],256],12614:[[4362],256],12615:[[4363],256],12616:[[4364],256],12617:[[4365],256],12618:[[4366],256],12619:[[4367],256],12620:[[4368],256],12621:[[4369],256],12622:[[4370],256],12623:[[4449],256],12624:[[4450],256],12625:[[4451],256],12626:[[4452],256],12627:[[4453],256],12628:[[4454],256],12629:[[4455],256],12630:[[4456],256],12631:[[4457],256],12632:[[4458],256],12633:[[4459],256],12634:[[4460],256],12635:[[4461],256],12636:[[4462],256],12637:[[4463],256],12638:[[4464],256],12639:[[4465],256],12640:[[4466],256],12641:[[4467],256],12642:[[4468],256],12643:[[4469],256],12644:[[4448],256],12645:[[4372],256],12646:[[4373],256],12647:[[4551],256],12648:[[4552],256],12649:[[4556],256],12650:[[4558],256],12651:[[4563],256],12652:[[4567],256],12653:[[4569],256],12654:[[4380],256],12655:[[4573],256],12656:[[4575],256],12657:[[4381],256],12658:[[4382],256],12659:[[4384],256],12660:[[4386],256],12661:[[4387],256],12662:[[4391],256],12663:[[4393],256],12664:[[4395],256],12665:[[4396],256],12666:[[4397],256],12667:[[4398],256],12668:[[4399],256],12669:[[4402],256],12670:[[4406],256],12671:[[4416],256],12672:[[4423],256],12673:[[4428],256],12674:[[4593],256],12675:[[4594],256],12676:[[4439],256],12677:[[4440],256],12678:[[4441],256],12679:[[4484],256],12680:[[4485],256],12681:[[4488],256],12682:[[4497],256],12683:[[4498],256],12684:[[4500],256],12685:[[4510],256],12686:[[4513],256],12690:[[19968],256],12691:[[20108],256],12692:[[19977],256],12693:[[22235],256],12694:[[19978],256],12695:[[20013],256],12696:[[19979],256],12697:[[30002],256],12698:[[20057],256],12699:[[19993],256],12700:[[19969],256],12701:[[22825],256],12702:[[22320],256],12703:[[20154],256]},
-12800:{12800:[[40,4352,41],256],12801:[[40,4354,41],256],12802:[[40,4355,41],256],12803:[[40,4357,41],256],12804:[[40,4358,41],256],12805:[[40,4359,41],256],12806:[[40,4361,41],256],12807:[[40,4363,41],256],12808:[[40,4364,41],256],12809:[[40,4366,41],256],12810:[[40,4367,41],256],12811:[[40,4368,41],256],12812:[[40,4369,41],256],12813:[[40,4370,41],256],12814:[[40,4352,4449,41],256],12815:[[40,4354,4449,41],256],12816:[[40,4355,4449,41],256],12817:[[40,4357,4449,41],256],12818:[[40,4358,4449,41],256],12819:[[40,4359,4449,41],256],12820:[[40,4361,4449,41],256],12821:[[40,4363,4449,41],256],12822:[[40,4364,4449,41],256],12823:[[40,4366,4449,41],256],12824:[[40,4367,4449,41],256],12825:[[40,4368,4449,41],256],12826:[[40,4369,4449,41],256],12827:[[40,4370,4449,41],256],12828:[[40,4364,4462,41],256],12829:[[40,4363,4457,4364,4453,4523,41],256],12830:[[40,4363,4457,4370,4462,41],256],12832:[[40,19968,41],256],12833:[[40,20108,41],256],12834:[[40,19977,41],256],12835:[[40,22235,41],256],12836:[[40,20116,41],256],12837:[[40,20845,41],256],12838:[[40,19971,41],256],12839:[[40,20843,41],256],12840:[[40,20061,41],256],12841:[[40,21313,41],256],12842:[[40,26376,41],256],12843:[[40,28779,41],256],12844:[[40,27700,41],256],12845:[[40,26408,41],256],12846:[[40,37329,41],256],12847:[[40,22303,41],256],12848:[[40,26085,41],256],12849:[[40,26666,41],256],12850:[[40,26377,41],256],12851:[[40,31038,41],256],12852:[[40,21517,41],256],12853:[[40,29305,41],256],12854:[[40,36001,41],256],12855:[[40,31069,41],256],12856:[[40,21172,41],256],12857:[[40,20195,41],256],12858:[[40,21628,41],256],12859:[[40,23398,41],256],12860:[[40,30435,41],256],12861:[[40,20225,41],256],12862:[[40,36039,41],256],12863:[[40,21332,41],256],12864:[[40,31085,41],256],12865:[[40,20241,41],256],12866:[[40,33258,41],256],12867:[[40,33267,41],256],12868:[[21839],256],12869:[[24188],256],12870:[[25991],256],12871:[[31631],256],12880:[[80,84,69],256],12881:[[50,49],256],12882:[[50,50],256],12883:[[50,51],256],12884:[[50,52],256],12885:[[50,53],256],12886:[[50,54],256],12887:[[50,55],256],12888:[[50,56],256],12889:[[50,57],256],12890:[[51,48],256],12891:[[51,49],256],12892:[[51,50],256],12893:[[51,51],256],12894:[[51,52],256],12895:[[51,53],256],12896:[[4352],256],12897:[[4354],256],12898:[[4355],256],12899:[[4357],256],12900:[[4358],256],12901:[[4359],256],12902:[[4361],256],12903:[[4363],256],12904:[[4364],256],12905:[[4366],256],12906:[[4367],256],12907:[[4368],256],12908:[[4369],256],12909:[[4370],256],12910:[[4352,4449],256],12911:[[4354,4449],256],12912:[[4355,4449],256],12913:[[4357,4449],256],12914:[[4358,4449],256],12915:[[4359,4449],256],12916:[[4361,4449],256],12917:[[4363,4449],256],12918:[[4364,4449],256],12919:[[4366,4449],256],12920:[[4367,4449],256],12921:[[4368,4449],256],12922:[[4369,4449],256],12923:[[4370,4449],256],12924:[[4366,4449,4535,4352,4457],256],12925:[[4364,4462,4363,4468],256],12926:[[4363,4462],256],12928:[[19968],256],12929:[[20108],256],12930:[[19977],256],12931:[[22235],256],12932:[[20116],256],12933:[[20845],256],12934:[[19971],256],12935:[[20843],256],12936:[[20061],256],12937:[[21313],256],12938:[[26376],256],12939:[[28779],256],12940:[[27700],256],12941:[[26408],256],12942:[[37329],256],12943:[[22303],256],12944:[[26085],256],12945:[[26666],256],12946:[[26377],256],12947:[[31038],256],12948:[[21517],256],12949:[[29305],256],12950:[[36001],256],12951:[[31069],256],12952:[[21172],256],12953:[[31192],256],12954:[[30007],256],12955:[[22899],256],12956:[[36969],256],12957:[[20778],256],12958:[[21360],256],12959:[[27880],256],12960:[[38917],256],12961:[[20241],256],12962:[[20889],256],12963:[[27491],256],12964:[[19978],256],12965:[[20013],256],12966:[[19979],256],12967:[[24038],256],12968:[[21491],256],12969:[[21307],256],12970:[[23447],256],12971:[[23398],256],12972:[[30435],256],12973:[[20225],256],12974:[[36039],256],12975:[[21332],256],12976:[[22812],256],12977:[[51,54],256],12978:[[51,55],256],12979:[[51,56],256],12980:[[51,57],256],12981:[[52,48],256],12982:[[52,49],256],12983:[[52,50],256],12984:[[52,51],256],12985:[[52,52],256],12986:[[52,53],256],12987:[[52,54],256],12988:[[52,55],256],12989:[[52,56],256],12990:[[52,57],256],12991:[[53,48],256],12992:[[49,26376],256],12993:[[50,26376],256],12994:[[51,26376],256],12995:[[52,26376],256],12996:[[53,26376],256],12997:[[54,26376],256],12998:[[55,26376],256],12999:[[56,26376],256],13000:[[57,26376],256],13001:[[49,48,26376],256],13002:[[49,49,26376],256],13003:[[49,50,26376],256],13004:[[72,103],256],13005:[[101,114,103],256],13006:[[101,86],256],13007:[[76,84,68],256],13008:[[12450],256],13009:[[12452],256],13010:[[12454],256],13011:[[12456],256],13012:[[12458],256],13013:[[12459],256],13014:[[12461],256],13015:[[12463],256],13016:[[12465],256],13017:[[12467],256],13018:[[12469],256],13019:[[12471],256],13020:[[12473],256],13021:[[12475],256],13022:[[12477],256],13023:[[12479],256],13024:[[12481],256],13025:[[12484],256],13026:[[12486],256],13027:[[12488],256],13028:[[12490],256],13029:[[12491],256],13030:[[12492],256],13031:[[12493],256],13032:[[12494],256],13033:[[12495],256],13034:[[12498],256],13035:[[12501],256],13036:[[12504],256],13037:[[12507],256],13038:[[12510],256],13039:[[12511],256],13040:[[12512],256],13041:[[12513],256],13042:[[12514],256],13043:[[12516],256],13044:[[12518],256],13045:[[12520],256],13046:[[12521],256],13047:[[12522],256],13048:[[12523],256],13049:[[12524],256],13050:[[12525],256],13051:[[12527],256],13052:[[12528],256],13053:[[12529],256],13054:[[12530],256]},
-13056:{13056:[[12450,12497,12540,12488],256],13057:[[12450,12523,12501,12449],256],13058:[[12450,12531,12506,12450],256],13059:[[12450,12540,12523],256],13060:[[12452,12491,12531,12464],256],13061:[[12452,12531,12481],256],13062:[[12454,12457,12531],256],13063:[[12456,12473,12463,12540,12489],256],13064:[[12456,12540,12459,12540],256],13065:[[12458,12531,12473],256],13066:[[12458,12540,12512],256],13067:[[12459,12452,12522],256],13068:[[12459,12521,12483,12488],256],13069:[[12459,12525,12522,12540],256],13070:[[12460,12525,12531],256],13071:[[12460,12531,12510],256],13072:[[12462,12460],256],13073:[[12462,12491,12540],256],13074:[[12461,12517,12522,12540],256],13075:[[12462,12523,12480,12540],256],13076:[[12461,12525],256],13077:[[12461,12525,12464,12521,12512],256],13078:[[12461,12525,12513,12540,12488,12523],256],13079:[[12461,12525,12527,12483,12488],256],13080:[[12464,12521,12512],256],13081:[[12464,12521,12512,12488,12531],256],13082:[[12463,12523,12476,12452,12525],256],13083:[[12463,12525,12540,12493],256],13084:[[12465,12540,12473],256],13085:[[12467,12523,12490],256],13086:[[12467,12540,12509],256],13087:[[12469,12452,12463,12523],256],13088:[[12469,12531,12481,12540,12512],256],13089:[[12471,12522,12531,12464],256],13090:[[12475,12531,12481],256],13091:[[12475,12531,12488],256],13092:[[12480,12540,12473],256],13093:[[12487,12471],256],13094:[[12489,12523],256],13095:[[12488,12531],256],13096:[[12490,12494],256],13097:[[12494,12483,12488],256],13098:[[12495,12452,12484],256],13099:[[12497,12540,12475,12531,12488],256],13100:[[12497,12540,12484],256],13101:[[12496,12540,12524,12523],256],13102:[[12500,12450,12473,12488,12523],256],13103:[[12500,12463,12523],256],13104:[[12500,12467],256],13105:[[12499,12523],256],13106:[[12501,12449,12521,12483,12489],256],13107:[[12501,12451,12540,12488],256],13108:[[12502,12483,12471,12455,12523],256],13109:[[12501,12521,12531],256],13110:[[12504,12463,12479,12540,12523],256],13111:[[12506,12477],256],13112:[[12506,12491,12498],256],13113:[[12504,12523,12484],256],13114:[[12506,12531,12473],256],13115:[[12506,12540,12472],256],13116:[[12505,12540,12479],256],13117:[[12509,12452,12531,12488],256],13118:[[12508,12523,12488],256],13119:[[12507,12531],256],13120:[[12509,12531,12489],256],13121:[[12507,12540,12523],256],13122:[[12507,12540,12531],256],13123:[[12510,12452,12463,12525],256],13124:[[12510,12452,12523],256],13125:[[12510,12483,12495],256],13126:[[12510,12523,12463],256],13127:[[12510,12531,12471,12519,12531],256],13128:[[12511,12463,12525,12531],256],13129:[[12511,12522],256],13130:[[12511,12522,12496,12540,12523],256],13131:[[12513,12460],256],13132:[[12513,12460,12488,12531],256],13133:[[12513,12540,12488,12523],256],13134:[[12516,12540,12489],256],13135:[[12516,12540,12523],256],13136:[[12518,12450,12531],256],13137:[[12522,12483,12488,12523],256],13138:[[12522,12521],256],13139:[[12523,12500,12540],256],13140:[[12523,12540,12502,12523],256],13141:[[12524,12512],256],13142:[[12524,12531,12488,12466,12531],256],13143:[[12527,12483,12488],256],13144:[[48,28857],256],13145:[[49,28857],256],13146:[[50,28857],256],13147:[[51,28857],256],13148:[[52,28857],256],13149:[[53,28857],256],13150:[[54,28857],256],13151:[[55,28857],256],13152:[[56,28857],256],13153:[[57,28857],256],13154:[[49,48,28857],256],13155:[[49,49,28857],256],13156:[[49,50,28857],256],13157:[[49,51,28857],256],13158:[[49,52,28857],256],13159:[[49,53,28857],256],13160:[[49,54,28857],256],13161:[[49,55,28857],256],13162:[[49,56,28857],256],13163:[[49,57,28857],256],13164:[[50,48,28857],256],13165:[[50,49,28857],256],13166:[[50,50,28857],256],13167:[[50,51,28857],256],13168:[[50,52,28857],256],13169:[[104,80,97],256],13170:[[100,97],256],13171:[[65,85],256],13172:[[98,97,114],256],13173:[[111,86],256],13174:[[112,99],256],13175:[[100,109],256],13176:[[100,109,178],256],13177:[[100,109,179],256],13178:[[73,85],256],13179:[[24179,25104],256],13180:[[26157,21644],256],13181:[[22823,27491],256],13182:[[26126,27835],256],13183:[[26666,24335,20250,31038],256],13184:[[112,65],256],13185:[[110,65],256],13186:[[956,65],256],13187:[[109,65],256],13188:[[107,65],256],13189:[[75,66],256],13190:[[77,66],256],13191:[[71,66],256],13192:[[99,97,108],256],13193:[[107,99,97,108],256],13194:[[112,70],256],13195:[[110,70],256],13196:[[956,70],256],13197:[[956,103],256],13198:[[109,103],256],13199:[[107,103],256],13200:[[72,122],256],13201:[[107,72,122],256],13202:[[77,72,122],256],13203:[[71,72,122],256],13204:[[84,72,122],256],13205:[[956,8467],256],13206:[[109,8467],256],13207:[[100,8467],256],13208:[[107,8467],256],13209:[[102,109],256],13210:[[110,109],256],13211:[[956,109],256],13212:[[109,109],256],13213:[[99,109],256],13214:[[107,109],256],13215:[[109,109,178],256],13216:[[99,109,178],256],13217:[[109,178],256],13218:[[107,109,178],256],13219:[[109,109,179],256],13220:[[99,109,179],256],13221:[[109,179],256],13222:[[107,109,179],256],13223:[[109,8725,115],256],13224:[[109,8725,115,178],256],13225:[[80,97],256],13226:[[107,80,97],256],13227:[[77,80,97],256],13228:[[71,80,97],256],13229:[[114,97,100],256],13230:[[114,97,100,8725,115],256],13231:[[114,97,100,8725,115,178],256],13232:[[112,115],256],13233:[[110,115],256],13234:[[956,115],256],13235:[[109,115],256],13236:[[112,86],256],13237:[[110,86],256],13238:[[956,86],256],13239:[[109,86],256],13240:[[107,86],256],13241:[[77,86],256],13242:[[112,87],256],13243:[[110,87],256],13244:[[956,87],256],13245:[[109,87],256],13246:[[107,87],256],13247:[[77,87],256],13248:[[107,937],256],13249:[[77,937],256],13250:[[97,46,109,46],256],13251:[[66,113],256],13252:[[99,99],256],13253:[[99,100],256],13254:[[67,8725,107,103],256],13255:[[67,111,46],256],13256:[[100,66],256],13257:[[71,121],256],13258:[[104,97],256],13259:[[72,80],256],13260:[[105,110],256],13261:[[75,75],256],13262:[[75,77],256],13263:[[107,116],256],13264:[[108,109],256],13265:[[108,110],256],13266:[[108,111,103],256],13267:[[108,120],256],13268:[[109,98],256],13269:[[109,105,108],256],13270:[[109,111,108],256],13271:[[80,72],256],13272:[[112,46,109,46],256],13273:[[80,80,77],256],13274:[[80,82],256],13275:[[115,114],256],13276:[[83,118],256],13277:[[87,98],256],13278:[[86,8725,109],256],13279:[[65,8725,109],256],13280:[[49,26085],256],13281:[[50,26085],256],13282:[[51,26085],256],13283:[[52,26085],256],13284:[[53,26085],256],13285:[[54,26085],256],13286:[[55,26085],256],13287:[[56,26085],256],13288:[[57,26085],256],13289:[[49,48,26085],256],13290:[[49,49,26085],256],13291:[[49,50,26085],256],13292:[[49,51,26085],256],13293:[[49,52,26085],256],13294:[[49,53,26085],256],13295:[[49,54,26085],256],13296:[[49,55,26085],256],13297:[[49,56,26085],256],13298:[[49,57,26085],256],13299:[[50,48,26085],256],13300:[[50,49,26085],256],13301:[[50,50,26085],256],13302:[[50,51,26085],256],13303:[[50,52,26085],256],13304:[[50,53,26085],256],13305:[[50,54,26085],256],13306:[[50,55,26085],256],13307:[[50,56,26085],256],13308:[[50,57,26085],256],13309:[[51,48,26085],256],13310:[[51,49,26085],256],13311:[[103,97,108],256]},
-27136:{92912:[,1],92913:[,1],92914:[,1],92915:[,1],92916:[,1]},
-27392:{92976:[,230],92977:[,230],92978:[,230],92979:[,230],92980:[,230],92981:[,230],92982:[,230]},
-42496:{42607:[,230],42612:[,230],42613:[,230],42614:[,230],42615:[,230],42616:[,230],42617:[,230],42618:[,230],42619:[,230],42620:[,230],42621:[,230],42652:[[1098],256],42653:[[1100],256],42655:[,230],42736:[,230],42737:[,230]},
-42752:{42864:[[42863],256],43000:[[294],256],43001:[[339],256]},
-43008:{43014:[,9],43204:[,9],43232:[,230],43233:[,230],43234:[,230],43235:[,230],43236:[,230],43237:[,230],43238:[,230],43239:[,230],43240:[,230],43241:[,230],43242:[,230],43243:[,230],43244:[,230],43245:[,230],43246:[,230],43247:[,230],43248:[,230],43249:[,230]},
-43264:{43307:[,220],43308:[,220],43309:[,220],43347:[,9],43443:[,7],43456:[,9]},
-43520:{43696:[,230],43698:[,230],43699:[,230],43700:[,220],43703:[,230],43704:[,230],43710:[,230],43711:[,230],43713:[,230],43766:[,9]},
-43776:{43868:[[42791],256],43869:[[43831],256],43870:[[619],256],43871:[[43858],256],44013:[,9]},
-48128:{113822:[,1]},
-53504:{119134:[[119127,119141],512],119135:[[119128,119141],512],119136:[[119135,119150],512],119137:[[119135,119151],512],119138:[[119135,119152],512],119139:[[119135,119153],512],119140:[[119135,119154],512],119141:[,216],119142:[,216],119143:[,1],119144:[,1],119145:[,1],119149:[,226],119150:[,216],119151:[,216],119152:[,216],119153:[,216],119154:[,216],119163:[,220],119164:[,220],119165:[,220],119166:[,220],119167:[,220],119168:[,220],119169:[,220],119170:[,220],119173:[,230],119174:[,230],119175:[,230],119176:[,230],119177:[,230],119178:[,220],119179:[,220],119210:[,230],119211:[,230],119212:[,230],119213:[,230],119227:[[119225,119141],512],119228:[[119226,119141],512],119229:[[119227,119150],512],119230:[[119228,119150],512],119231:[[119227,119151],512],119232:[[119228,119151],512]},
-53760:{119362:[,230],119363:[,230],119364:[,230]},
-54272:{119808:[[65],256],119809:[[66],256],119810:[[67],256],119811:[[68],256],119812:[[69],256],119813:[[70],256],119814:[[71],256],119815:[[72],256],119816:[[73],256],119817:[[74],256],119818:[[75],256],119819:[[76],256],119820:[[77],256],119821:[[78],256],119822:[[79],256],119823:[[80],256],119824:[[81],256],119825:[[82],256],119826:[[83],256],119827:[[84],256],119828:[[85],256],119829:[[86],256],119830:[[87],256],119831:[[88],256],119832:[[89],256],119833:[[90],256],119834:[[97],256],119835:[[98],256],119836:[[99],256],119837:[[100],256],119838:[[101],256],119839:[[102],256],119840:[[103],256],119841:[[104],256],119842:[[105],256],119843:[[106],256],119844:[[107],256],119845:[[108],256],119846:[[109],256],119847:[[110],256],119848:[[111],256],119849:[[112],256],119850:[[113],256],119851:[[114],256],119852:[[115],256],119853:[[116],256],119854:[[117],256],119855:[[118],256],119856:[[119],256],119857:[[120],256],119858:[[121],256],119859:[[122],256],119860:[[65],256],119861:[[66],256],119862:[[67],256],119863:[[68],256],119864:[[69],256],119865:[[70],256],119866:[[71],256],119867:[[72],256],119868:[[73],256],119869:[[74],256],119870:[[75],256],119871:[[76],256],119872:[[77],256],119873:[[78],256],119874:[[79],256],119875:[[80],256],119876:[[81],256],119877:[[82],256],119878:[[83],256],119879:[[84],256],119880:[[85],256],119881:[[86],256],119882:[[87],256],119883:[[88],256],119884:[[89],256],119885:[[90],256],119886:[[97],256],119887:[[98],256],119888:[[99],256],119889:[[100],256],119890:[[101],256],119891:[[102],256],119892:[[103],256],119894:[[105],256],119895:[[106],256],119896:[[107],256],119897:[[108],256],119898:[[109],256],119899:[[110],256],119900:[[111],256],119901:[[112],256],119902:[[113],256],119903:[[114],256],119904:[[115],256],119905:[[116],256],119906:[[117],256],119907:[[118],256],119908:[[119],256],119909:[[120],256],119910:[[121],256],119911:[[122],256],119912:[[65],256],119913:[[66],256],119914:[[67],256],119915:[[68],256],119916:[[69],256],119917:[[70],256],119918:[[71],256],119919:[[72],256],119920:[[73],256],119921:[[74],256],119922:[[75],256],119923:[[76],256],119924:[[77],256],119925:[[78],256],119926:[[79],256],119927:[[80],256],119928:[[81],256],119929:[[82],256],119930:[[83],256],119931:[[84],256],119932:[[85],256],119933:[[86],256],119934:[[87],256],119935:[[88],256],119936:[[89],256],119937:[[90],256],119938:[[97],256],119939:[[98],256],119940:[[99],256],119941:[[100],256],119942:[[101],256],119943:[[102],256],119944:[[103],256],119945:[[104],256],119946:[[105],256],119947:[[106],256],119948:[[107],256],119949:[[108],256],119950:[[109],256],119951:[[110],256],119952:[[111],256],119953:[[112],256],119954:[[113],256],119955:[[114],256],119956:[[115],256],119957:[[116],256],119958:[[117],256],119959:[[118],256],119960:[[119],256],119961:[[120],256],119962:[[121],256],119963:[[122],256],119964:[[65],256],119966:[[67],256],119967:[[68],256],119970:[[71],256],119973:[[74],256],119974:[[75],256],119977:[[78],256],119978:[[79],256],119979:[[80],256],119980:[[81],256],119982:[[83],256],119983:[[84],256],119984:[[85],256],119985:[[86],256],119986:[[87],256],119987:[[88],256],119988:[[89],256],119989:[[90],256],119990:[[97],256],119991:[[98],256],119992:[[99],256],119993:[[100],256],119995:[[102],256],119997:[[104],256],119998:[[105],256],119999:[[106],256],120000:[[107],256],120001:[[108],256],120002:[[109],256],120003:[[110],256],120005:[[112],256],120006:[[113],256],120007:[[114],256],120008:[[115],256],120009:[[116],256],120010:[[117],256],120011:[[118],256],120012:[[119],256],120013:[[120],256],120014:[[121],256],120015:[[122],256],120016:[[65],256],120017:[[66],256],120018:[[67],256],120019:[[68],256],120020:[[69],256],120021:[[70],256],120022:[[71],256],120023:[[72],256],120024:[[73],256],120025:[[74],256],120026:[[75],256],120027:[[76],256],120028:[[77],256],120029:[[78],256],120030:[[79],256],120031:[[80],256],120032:[[81],256],120033:[[82],256],120034:[[83],256],120035:[[84],256],120036:[[85],256],120037:[[86],256],120038:[[87],256],120039:[[88],256],120040:[[89],256],120041:[[90],256],120042:[[97],256],120043:[[98],256],120044:[[99],256],120045:[[100],256],120046:[[101],256],120047:[[102],256],120048:[[103],256],120049:[[104],256],120050:[[105],256],120051:[[106],256],120052:[[107],256],120053:[[108],256],120054:[[109],256],120055:[[110],256],120056:[[111],256],120057:[[112],256],120058:[[113],256],120059:[[114],256],120060:[[115],256],120061:[[116],256],120062:[[117],256],120063:[[118],256]},
-54528:{120064:[[119],256],120065:[[120],256],120066:[[121],256],120067:[[122],256],120068:[[65],256],120069:[[66],256],120071:[[68],256],120072:[[69],256],120073:[[70],256],120074:[[71],256],120077:[[74],256],120078:[[75],256],120079:[[76],256],120080:[[77],256],120081:[[78],256],120082:[[79],256],120083:[[80],256],120084:[[81],256],120086:[[83],256],120087:[[84],256],120088:[[85],256],120089:[[86],256],120090:[[87],256],120091:[[88],256],120092:[[89],256],120094:[[97],256],120095:[[98],256],120096:[[99],256],120097:[[100],256],120098:[[101],256],120099:[[102],256],120100:[[103],256],120101:[[104],256],120102:[[105],256],120103:[[106],256],120104:[[107],256],120105:[[108],256],120106:[[109],256],120107:[[110],256],120108:[[111],256],120109:[[112],256],120110:[[113],256],120111:[[114],256],120112:[[115],256],120113:[[116],256],120114:[[117],256],120115:[[118],256],120116:[[119],256],120117:[[120],256],120118:[[121],256],120119:[[122],256],120120:[[65],256],120121:[[66],256],120123:[[68],256],120124:[[69],256],120125:[[70],256],120126:[[71],256],120128:[[73],256],120129:[[74],256],120130:[[75],256],120131:[[76],256],120132:[[77],256],120134:[[79],256],120138:[[83],256],120139:[[84],256],120140:[[85],256],120141:[[86],256],120142:[[87],256],120143:[[88],256],120144:[[89],256],120146:[[97],256],120147:[[98],256],120148:[[99],256],120149:[[100],256],120150:[[101],256],120151:[[102],256],120152:[[103],256],120153:[[104],256],120154:[[105],256],120155:[[106],256],120156:[[107],256],120157:[[108],256],120158:[[109],256],120159:[[110],256],120160:[[111],256],120161:[[112],256],120162:[[113],256],120163:[[114],256],120164:[[115],256],120165:[[116],256],120166:[[117],256],120167:[[118],256],120168:[[119],256],120169:[[120],256],120170:[[121],256],120171:[[122],256],120172:[[65],256],120173:[[66],256],120174:[[67],256],120175:[[68],256],120176:[[69],256],120177:[[70],256],120178:[[71],256],120179:[[72],256],120180:[[73],256],120181:[[74],256],120182:[[75],256],120183:[[76],256],120184:[[77],256],120185:[[78],256],120186:[[79],256],120187:[[80],256],120188:[[81],256],120189:[[82],256],120190:[[83],256],120191:[[84],256],120192:[[85],256],120193:[[86],256],120194:[[87],256],120195:[[88],256],120196:[[89],256],120197:[[90],256],120198:[[97],256],120199:[[98],256],120200:[[99],256],120201:[[100],256],120202:[[101],256],120203:[[102],256],120204:[[103],256],120205:[[104],256],120206:[[105],256],120207:[[106],256],120208:[[107],256],120209:[[108],256],120210:[[109],256],120211:[[110],256],120212:[[111],256],120213:[[112],256],120214:[[113],256],120215:[[114],256],120216:[[115],256],120217:[[116],256],120218:[[117],256],120219:[[118],256],120220:[[119],256],120221:[[120],256],120222:[[121],256],120223:[[122],256],120224:[[65],256],120225:[[66],256],120226:[[67],256],120227:[[68],256],120228:[[69],256],120229:[[70],256],120230:[[71],256],120231:[[72],256],120232:[[73],256],120233:[[74],256],120234:[[75],256],120235:[[76],256],120236:[[77],256],120237:[[78],256],120238:[[79],256],120239:[[80],256],120240:[[81],256],120241:[[82],256],120242:[[83],256],120243:[[84],256],120244:[[85],256],120245:[[86],256],120246:[[87],256],120247:[[88],256],120248:[[89],256],120249:[[90],256],120250:[[97],256],120251:[[98],256],120252:[[99],256],120253:[[100],256],120254:[[101],256],120255:[[102],256],120256:[[103],256],120257:[[104],256],120258:[[105],256],120259:[[106],256],120260:[[107],256],120261:[[108],256],120262:[[109],256],120263:[[110],256],120264:[[111],256],120265:[[112],256],120266:[[113],256],120267:[[114],256],120268:[[115],256],120269:[[116],256],120270:[[117],256],120271:[[118],256],120272:[[119],256],120273:[[120],256],120274:[[121],256],120275:[[122],256],120276:[[65],256],120277:[[66],256],120278:[[67],256],120279:[[68],256],120280:[[69],256],120281:[[70],256],120282:[[71],256],120283:[[72],256],120284:[[73],256],120285:[[74],256],120286:[[75],256],120287:[[76],256],120288:[[77],256],120289:[[78],256],120290:[[79],256],120291:[[80],256],120292:[[81],256],120293:[[82],256],120294:[[83],256],120295:[[84],256],120296:[[85],256],120297:[[86],256],120298:[[87],256],120299:[[88],256],120300:[[89],256],120301:[[90],256],120302:[[97],256],120303:[[98],256],120304:[[99],256],120305:[[100],256],120306:[[101],256],120307:[[102],256],120308:[[103],256],120309:[[104],256],120310:[[105],256],120311:[[106],256],120312:[[107],256],120313:[[108],256],120314:[[109],256],120315:[[110],256],120316:[[111],256],120317:[[112],256],120318:[[113],256],120319:[[114],256]},
-54784:{120320:[[115],256],120321:[[116],256],120322:[[117],256],120323:[[118],256],120324:[[119],256],120325:[[120],256],120326:[[121],256],120327:[[122],256],120328:[[65],256],120329:[[66],256],120330:[[67],256],120331:[[68],256],120332:[[69],256],120333:[[70],256],120334:[[71],256],120335:[[72],256],120336:[[73],256],120337:[[74],256],120338:[[75],256],120339:[[76],256],120340:[[77],256],120341:[[78],256],120342:[[79],256],120343:[[80],256],120344:[[81],256],120345:[[82],256],120346:[[83],256],120347:[[84],256],120348:[[85],256],120349:[[86],256],120350:[[87],256],120351:[[88],256],120352:[[89],256],120353:[[90],256],120354:[[97],256],120355:[[98],256],120356:[[99],256],120357:[[100],256],120358:[[101],256],120359:[[102],256],120360:[[103],256],120361:[[104],256],120362:[[105],256],120363:[[106],256],120364:[[107],256],120365:[[108],256],120366:[[109],256],120367:[[110],256],120368:[[111],256],120369:[[112],256],120370:[[113],256],120371:[[114],256],120372:[[115],256],120373:[[116],256],120374:[[117],256],120375:[[118],256],120376:[[119],256],120377:[[120],256],120378:[[121],256],120379:[[122],256],120380:[[65],256],120381:[[66],256],120382:[[67],256],120383:[[68],256],120384:[[69],256],120385:[[70],256],120386:[[71],256],120387:[[72],256],120388:[[73],256],120389:[[74],256],120390:[[75],256],120391:[[76],256],120392:[[77],256],120393:[[78],256],120394:[[79],256],120395:[[80],256],120396:[[81],256],120397:[[82],256],120398:[[83],256],120399:[[84],256],120400:[[85],256],120401:[[86],256],120402:[[87],256],120403:[[88],256],120404:[[89],256],120405:[[90],256],120406:[[97],256],120407:[[98],256],120408:[[99],256],120409:[[100],256],120410:[[101],256],120411:[[102],256],120412:[[103],256],120413:[[104],256],120414:[[105],256],120415:[[106],256],120416:[[107],256],120417:[[108],256],120418:[[109],256],120419:[[110],256],120420:[[111],256],120421:[[112],256],120422:[[113],256],120423:[[114],256],120424:[[115],256],120425:[[116],256],120426:[[117],256],120427:[[118],256],120428:[[119],256],120429:[[120],256],120430:[[121],256],120431:[[122],256],120432:[[65],256],120433:[[66],256],120434:[[67],256],120435:[[68],256],120436:[[69],256],120437:[[70],256],120438:[[71],256],120439:[[72],256],120440:[[73],256],120441:[[74],256],120442:[[75],256],120443:[[76],256],120444:[[77],256],120445:[[78],256],120446:[[79],256],120447:[[80],256],120448:[[81],256],120449:[[82],256],120450:[[83],256],120451:[[84],256],120452:[[85],256],120453:[[86],256],120454:[[87],256],120455:[[88],256],120456:[[89],256],120457:[[90],256],120458:[[97],256],120459:[[98],256],120460:[[99],256],120461:[[100],256],120462:[[101],256],120463:[[102],256],120464:[[103],256],120465:[[104],256],120466:[[105],256],120467:[[106],256],120468:[[107],256],120469:[[108],256],120470:[[109],256],120471:[[110],256],120472:[[111],256],120473:[[112],256],120474:[[113],256],120475:[[114],256],120476:[[115],256],120477:[[116],256],120478:[[117],256],120479:[[118],256],120480:[[119],256],120481:[[120],256],120482:[[121],256],120483:[[122],256],120484:[[305],256],120485:[[567],256],120488:[[913],256],120489:[[914],256],120490:[[915],256],120491:[[916],256],120492:[[917],256],120493:[[918],256],120494:[[919],256],120495:[[920],256],120496:[[921],256],120497:[[922],256],120498:[[923],256],120499:[[924],256],120500:[[925],256],120501:[[926],256],120502:[[927],256],120503:[[928],256],120504:[[929],256],120505:[[1012],256],120506:[[931],256],120507:[[932],256],120508:[[933],256],120509:[[934],256],120510:[[935],256],120511:[[936],256],120512:[[937],256],120513:[[8711],256],120514:[[945],256],120515:[[946],256],120516:[[947],256],120517:[[948],256],120518:[[949],256],120519:[[950],256],120520:[[951],256],120521:[[952],256],120522:[[953],256],120523:[[954],256],120524:[[955],256],120525:[[956],256],120526:[[957],256],120527:[[958],256],120528:[[959],256],120529:[[960],256],120530:[[961],256],120531:[[962],256],120532:[[963],256],120533:[[964],256],120534:[[965],256],120535:[[966],256],120536:[[967],256],120537:[[968],256],120538:[[969],256],120539:[[8706],256],120540:[[1013],256],120541:[[977],256],120542:[[1008],256],120543:[[981],256],120544:[[1009],256],120545:[[982],256],120546:[[913],256],120547:[[914],256],120548:[[915],256],120549:[[916],256],120550:[[917],256],120551:[[918],256],120552:[[919],256],120553:[[920],256],120554:[[921],256],120555:[[922],256],120556:[[923],256],120557:[[924],256],120558:[[925],256],120559:[[926],256],120560:[[927],256],120561:[[928],256],120562:[[929],256],120563:[[1012],256],120564:[[931],256],120565:[[932],256],120566:[[933],256],120567:[[934],256],120568:[[935],256],120569:[[936],256],120570:[[937],256],120571:[[8711],256],120572:[[945],256],120573:[[946],256],120574:[[947],256],120575:[[948],256]},
-55040:{120576:[[949],256],120577:[[950],256],120578:[[951],256],120579:[[952],256],120580:[[953],256],120581:[[954],256],120582:[[955],256],120583:[[956],256],120584:[[957],256],120585:[[958],256],120586:[[959],256],120587:[[960],256],120588:[[961],256],120589:[[962],256],120590:[[963],256],120591:[[964],256],120592:[[965],256],120593:[[966],256],120594:[[967],256],120595:[[968],256],120596:[[969],256],120597:[[8706],256],120598:[[1013],256],120599:[[977],256],120600:[[1008],256],120601:[[981],256],120602:[[1009],256],120603:[[982],256],120604:[[913],256],120605:[[914],256],120606:[[915],256],120607:[[916],256],120608:[[917],256],120609:[[918],256],120610:[[919],256],120611:[[920],256],120612:[[921],256],120613:[[922],256],120614:[[923],256],120615:[[924],256],120616:[[925],256],120617:[[926],256],120618:[[927],256],120619:[[928],256],120620:[[929],256],120621:[[1012],256],120622:[[931],256],120623:[[932],256],120624:[[933],256],120625:[[934],256],120626:[[935],256],120627:[[936],256],120628:[[937],256],120629:[[8711],256],120630:[[945],256],120631:[[946],256],120632:[[947],256],120633:[[948],256],120634:[[949],256],120635:[[950],256],120636:[[951],256],120637:[[952],256],120638:[[953],256],120639:[[954],256],120640:[[955],256],120641:[[956],256],120642:[[957],256],120643:[[958],256],120644:[[959],256],120645:[[960],256],120646:[[961],256],120647:[[962],256],120648:[[963],256],120649:[[964],256],120650:[[965],256],120651:[[966],256],120652:[[967],256],120653:[[968],256],120654:[[969],256],120655:[[8706],256],120656:[[1013],256],120657:[[977],256],120658:[[1008],256],120659:[[981],256],120660:[[1009],256],120661:[[982],256],120662:[[913],256],120663:[[914],256],120664:[[915],256],120665:[[916],256],120666:[[917],256],120667:[[918],256],120668:[[919],256],120669:[[920],256],120670:[[921],256],120671:[[922],256],120672:[[923],256],120673:[[924],256],120674:[[925],256],120675:[[926],256],120676:[[927],256],120677:[[928],256],120678:[[929],256],120679:[[1012],256],120680:[[931],256],120681:[[932],256],120682:[[933],256],120683:[[934],256],120684:[[935],256],120685:[[936],256],120686:[[937],256],120687:[[8711],256],120688:[[945],256],120689:[[946],256],120690:[[947],256],120691:[[948],256],120692:[[949],256],120693:[[950],256],120694:[[951],256],120695:[[952],256],120696:[[953],256],120697:[[954],256],120698:[[955],256],120699:[[956],256],120700:[[957],256],120701:[[958],256],120702:[[959],256],120703:[[960],256],120704:[[961],256],120705:[[962],256],120706:[[963],256],120707:[[964],256],120708:[[965],256],120709:[[966],256],120710:[[967],256],120711:[[968],256],120712:[[969],256],120713:[[8706],256],120714:[[1013],256],120715:[[977],256],120716:[[1008],256],120717:[[981],256],120718:[[1009],256],120719:[[982],256],120720:[[913],256],120721:[[914],256],120722:[[915],256],120723:[[916],256],120724:[[917],256],120725:[[918],256],120726:[[919],256],120727:[[920],256],120728:[[921],256],120729:[[922],256],120730:[[923],256],120731:[[924],256],120732:[[925],256],120733:[[926],256],120734:[[927],256],120735:[[928],256],120736:[[929],256],120737:[[1012],256],120738:[[931],256],120739:[[932],256],120740:[[933],256],120741:[[934],256],120742:[[935],256],120743:[[936],256],120744:[[937],256],120745:[[8711],256],120746:[[945],256],120747:[[946],256],120748:[[947],256],120749:[[948],256],120750:[[949],256],120751:[[950],256],120752:[[951],256],120753:[[952],256],120754:[[953],256],120755:[[954],256],120756:[[955],256],120757:[[956],256],120758:[[957],256],120759:[[958],256],120760:[[959],256],120761:[[960],256],120762:[[961],256],120763:[[962],256],120764:[[963],256],120765:[[964],256],120766:[[965],256],120767:[[966],256],120768:[[967],256],120769:[[968],256],120770:[[969],256],120771:[[8706],256],120772:[[1013],256],120773:[[977],256],120774:[[1008],256],120775:[[981],256],120776:[[1009],256],120777:[[982],256],120778:[[988],256],120779:[[989],256],120782:[[48],256],120783:[[49],256],120784:[[50],256],120785:[[51],256],120786:[[52],256],120787:[[53],256],120788:[[54],256],120789:[[55],256],120790:[[56],256],120791:[[57],256],120792:[[48],256],120793:[[49],256],120794:[[50],256],120795:[[51],256],120796:[[52],256],120797:[[53],256],120798:[[54],256],120799:[[55],256],120800:[[56],256],120801:[[57],256],120802:[[48],256],120803:[[49],256],120804:[[50],256],120805:[[51],256],120806:[[52],256],120807:[[53],256],120808:[[54],256],120809:[[55],256],120810:[[56],256],120811:[[57],256],120812:[[48],256],120813:[[49],256],120814:[[50],256],120815:[[51],256],120816:[[52],256],120817:[[53],256],120818:[[54],256],120819:[[55],256],120820:[[56],256],120821:[[57],256],120822:[[48],256],120823:[[49],256],120824:[[50],256],120825:[[51],256],120826:[[52],256],120827:[[53],256],120828:[[54],256],120829:[[55],256],120830:[[56],256],120831:[[57],256]},
-59392:{125136:[,220],125137:[,220],125138:[,220],125139:[,220],125140:[,220],125141:[,220],125142:[,220]},
-60928:{126464:[[1575],256],126465:[[1576],256],126466:[[1580],256],126467:[[1583],256],126469:[[1608],256],126470:[[1586],256],126471:[[1581],256],126472:[[1591],256],126473:[[1610],256],126474:[[1603],256],126475:[[1604],256],126476:[[1605],256],126477:[[1606],256],126478:[[1587],256],126479:[[1593],256],126480:[[1601],256],126481:[[1589],256],126482:[[1602],256],126483:[[1585],256],126484:[[1588],256],126485:[[1578],256],126486:[[1579],256],126487:[[1582],256],126488:[[1584],256],126489:[[1590],256],126490:[[1592],256],126491:[[1594],256],126492:[[1646],256],126493:[[1722],256],126494:[[1697],256],126495:[[1647],256],126497:[[1576],256],126498:[[1580],256],126500:[[1607],256],126503:[[1581],256],126505:[[1610],256],126506:[[1603],256],126507:[[1604],256],126508:[[1605],256],126509:[[1606],256],126510:[[1587],256],126511:[[1593],256],126512:[[1601],256],126513:[[1589],256],126514:[[1602],256],126516:[[1588],256],126517:[[1578],256],126518:[[1579],256],126519:[[1582],256],126521:[[1590],256],126523:[[1594],256],126530:[[1580],256],126535:[[1581],256],126537:[[1610],256],126539:[[1604],256],126541:[[1606],256],126542:[[1587],256],126543:[[1593],256],126545:[[1589],256],126546:[[1602],256],126548:[[1588],256],126551:[[1582],256],126553:[[1590],256],126555:[[1594],256],126557:[[1722],256],126559:[[1647],256],126561:[[1576],256],126562:[[1580],256],126564:[[1607],256],126567:[[1581],256],126568:[[1591],256],126569:[[1610],256],126570:[[1603],256],126572:[[1605],256],126573:[[1606],256],126574:[[1587],256],126575:[[1593],256],126576:[[1601],256],126577:[[1589],256],126578:[[1602],256],126580:[[1588],256],126581:[[1578],256],126582:[[1579],256],126583:[[1582],256],126585:[[1590],256],126586:[[1592],256],126587:[[1594],256],126588:[[1646],256],126590:[[1697],256],126592:[[1575],256],126593:[[1576],256],126594:[[1580],256],126595:[[1583],256],126596:[[1607],256],126597:[[1608],256],126598:[[1586],256],126599:[[1581],256],126600:[[1591],256],126601:[[1610],256],126603:[[1604],256],126604:[[1605],256],126605:[[1606],256],126606:[[1587],256],126607:[[1593],256],126608:[[1601],256],126609:[[1589],256],126610:[[1602],256],126611:[[1585],256],126612:[[1588],256],126613:[[1578],256],126614:[[1579],256],126615:[[1582],256],126616:[[1584],256],126617:[[1590],256],126618:[[1592],256],126619:[[1594],256],126625:[[1576],256],126626:[[1580],256],126627:[[1583],256],126629:[[1608],256],126630:[[1586],256],126631:[[1581],256],126632:[[1591],256],126633:[[1610],256],126635:[[1604],256],126636:[[1605],256],126637:[[1606],256],126638:[[1587],256],126639:[[1593],256],126640:[[1601],256],126641:[[1589],256],126642:[[1602],256],126643:[[1585],256],126644:[[1588],256],126645:[[1578],256],126646:[[1579],256],126647:[[1582],256],126648:[[1584],256],126649:[[1590],256],126650:[[1592],256],126651:[[1594],256]},
-61696:{127232:[[48,46],256],127233:[[48,44],256],127234:[[49,44],256],127235:[[50,44],256],127236:[[51,44],256],127237:[[52,44],256],127238:[[53,44],256],127239:[[54,44],256],127240:[[55,44],256],127241:[[56,44],256],127242:[[57,44],256],127248:[[40,65,41],256],127249:[[40,66,41],256],127250:[[40,67,41],256],127251:[[40,68,41],256],127252:[[40,69,41],256],127253:[[40,70,41],256],127254:[[40,71,41],256],127255:[[40,72,41],256],127256:[[40,73,41],256],127257:[[40,74,41],256],127258:[[40,75,41],256],127259:[[40,76,41],256],127260:[[40,77,41],256],127261:[[40,78,41],256],127262:[[40,79,41],256],127263:[[40,80,41],256],127264:[[40,81,41],256],127265:[[40,82,41],256],127266:[[40,83,41],256],127267:[[40,84,41],256],127268:[[40,85,41],256],127269:[[40,86,41],256],127270:[[40,87,41],256],127271:[[40,88,41],256],127272:[[40,89,41],256],127273:[[40,90,41],256],127274:[[12308,83,12309],256],127275:[[67],256],127276:[[82],256],127277:[[67,68],256],127278:[[87,90],256],127280:[[65],256],127281:[[66],256],127282:[[67],256],127283:[[68],256],127284:[[69],256],127285:[[70],256],127286:[[71],256],127287:[[72],256],127288:[[73],256],127289:[[74],256],127290:[[75],256],127291:[[76],256],127292:[[77],256],127293:[[78],256],127294:[[79],256],127295:[[80],256],127296:[[81],256],127297:[[82],256],127298:[[83],256],127299:[[84],256],127300:[[85],256],127301:[[86],256],127302:[[87],256],127303:[[88],256],127304:[[89],256],127305:[[90],256],127306:[[72,86],256],127307:[[77,86],256],127308:[[83,68],256],127309:[[83,83],256],127310:[[80,80,86],256],127311:[[87,67],256],127338:[[77,67],256],127339:[[77,68],256],127376:[[68,74],256]},
-61952:{127488:[[12411,12363],256],127489:[[12467,12467],256],127490:[[12469],256],127504:[[25163],256],127505:[[23383],256],127506:[[21452],256],127507:[[12487],256],127508:[[20108],256],127509:[[22810],256],127510:[[35299],256],127511:[[22825],256],127512:[[20132],256],127513:[[26144],256],127514:[[28961],256],127515:[[26009],256],127516:[[21069],256],127517:[[24460],256],127518:[[20877],256],127519:[[26032],256],127520:[[21021],256],127521:[[32066],256],127522:[[29983],256],127523:[[36009],256],127524:[[22768],256],127525:[[21561],256],127526:[[28436],256],127527:[[25237],256],127528:[[25429],256],127529:[[19968],256],127530:[[19977],256],127531:[[36938],256],127532:[[24038],256],127533:[[20013],256],127534:[[21491],256],127535:[[25351],256],127536:[[36208],256],127537:[[25171],256],127538:[[31105],256],127539:[[31354],256],127540:[[21512],256],127541:[[28288],256],127542:[[26377],256],127543:[[26376],256],127544:[[30003],256],127545:[[21106],256],127546:[[21942],256],127552:[[12308,26412,12309],256],127553:[[12308,19977,12309],256],127554:[[12308,20108,12309],256],127555:[[12308,23433,12309],256],127556:[[12308,28857,12309],256],127557:[[12308,25171,12309],256],127558:[[12308,30423,12309],256],127559:[[12308,21213,12309],256],127560:[[12308,25943,12309],256],127568:[[24471],256],127569:[[21487],256]},
-63488:{194560:[[20029]],194561:[[20024]],194562:[[20033]],194563:[[131362]],194564:[[20320]],194565:[[20398]],194566:[[20411]],194567:[[20482]],194568:[[20602]],194569:[[20633]],194570:[[20711]],194571:[[20687]],194572:[[13470]],194573:[[132666]],194574:[[20813]],194575:[[20820]],194576:[[20836]],194577:[[20855]],194578:[[132380]],194579:[[13497]],194580:[[20839]],194581:[[20877]],194582:[[132427]],194583:[[20887]],194584:[[20900]],194585:[[20172]],194586:[[20908]],194587:[[20917]],194588:[[168415]],194589:[[20981]],194590:[[20995]],194591:[[13535]],194592:[[21051]],194593:[[21062]],194594:[[21106]],194595:[[21111]],194596:[[13589]],194597:[[21191]],194598:[[21193]],194599:[[21220]],194600:[[21242]],194601:[[21253]],194602:[[21254]],194603:[[21271]],194604:[[21321]],194605:[[21329]],194606:[[21338]],194607:[[21363]],194608:[[21373]],194609:[[21375]],194610:[[21375]],194611:[[21375]],194612:[[133676]],194613:[[28784]],194614:[[21450]],194615:[[21471]],194616:[[133987]],194617:[[21483]],194618:[[21489]],194619:[[21510]],194620:[[21662]],194621:[[21560]],194622:[[21576]],194623:[[21608]],194624:[[21666]],194625:[[21750]],194626:[[21776]],194627:[[21843]],194628:[[21859]],194629:[[21892]],194630:[[21892]],194631:[[21913]],194632:[[21931]],194633:[[21939]],194634:[[21954]],194635:[[22294]],194636:[[22022]],194637:[[22295]],194638:[[22097]],194639:[[22132]],194640:[[20999]],194641:[[22766]],194642:[[22478]],194643:[[22516]],194644:[[22541]],194645:[[22411]],194646:[[22578]],194647:[[22577]],194648:[[22700]],194649:[[136420]],194650:[[22770]],194651:[[22775]],194652:[[22790]],194653:[[22810]],194654:[[22818]],194655:[[22882]],194656:[[136872]],194657:[[136938]],194658:[[23020]],194659:[[23067]],194660:[[23079]],194661:[[23000]],194662:[[23142]],194663:[[14062]],194664:[[14076]],194665:[[23304]],194666:[[23358]],194667:[[23358]],194668:[[137672]],194669:[[23491]],194670:[[23512]],194671:[[23527]],194672:[[23539]],194673:[[138008]],194674:[[23551]],194675:[[23558]],194676:[[24403]],194677:[[23586]],194678:[[14209]],194679:[[23648]],194680:[[23662]],194681:[[23744]],194682:[[23693]],194683:[[138724]],194684:[[23875]],194685:[[138726]],194686:[[23918]],194687:[[23915]],194688:[[23932]],194689:[[24033]],194690:[[24034]],194691:[[14383]],194692:[[24061]],194693:[[24104]],194694:[[24125]],194695:[[24169]],194696:[[14434]],194697:[[139651]],194698:[[14460]],194699:[[24240]],194700:[[24243]],194701:[[24246]],194702:[[24266]],194703:[[172946]],194704:[[24318]],194705:[[140081]],194706:[[140081]],194707:[[33281]],194708:[[24354]],194709:[[24354]],194710:[[14535]],194711:[[144056]],194712:[[156122]],194713:[[24418]],194714:[[24427]],194715:[[14563]],194716:[[24474]],194717:[[24525]],194718:[[24535]],194719:[[24569]],194720:[[24705]],194721:[[14650]],194722:[[14620]],194723:[[24724]],194724:[[141012]],194725:[[24775]],194726:[[24904]],194727:[[24908]],194728:[[24910]],194729:[[24908]],194730:[[24954]],194731:[[24974]],194732:[[25010]],194733:[[24996]],194734:[[25007]],194735:[[25054]],194736:[[25074]],194737:[[25078]],194738:[[25104]],194739:[[25115]],194740:[[25181]],194741:[[25265]],194742:[[25300]],194743:[[25424]],194744:[[142092]],194745:[[25405]],194746:[[25340]],194747:[[25448]],194748:[[25475]],194749:[[25572]],194750:[[142321]],194751:[[25634]],194752:[[25541]],194753:[[25513]],194754:[[14894]],194755:[[25705]],194756:[[25726]],194757:[[25757]],194758:[[25719]],194759:[[14956]],194760:[[25935]],194761:[[25964]],194762:[[143370]],194763:[[26083]],194764:[[26360]],194765:[[26185]],194766:[[15129]],194767:[[26257]],194768:[[15112]],194769:[[15076]],194770:[[20882]],194771:[[20885]],194772:[[26368]],194773:[[26268]],194774:[[32941]],194775:[[17369]],194776:[[26391]],194777:[[26395]],194778:[[26401]],194779:[[26462]],194780:[[26451]],194781:[[144323]],194782:[[15177]],194783:[[26618]],194784:[[26501]],194785:[[26706]],194786:[[26757]],194787:[[144493]],194788:[[26766]],194789:[[26655]],194790:[[26900]],194791:[[15261]],194792:[[26946]],194793:[[27043]],194794:[[27114]],194795:[[27304]],194796:[[145059]],194797:[[27355]],194798:[[15384]],194799:[[27425]],194800:[[145575]],194801:[[27476]],194802:[[15438]],194803:[[27506]],194804:[[27551]],194805:[[27578]],194806:[[27579]],194807:[[146061]],194808:[[138507]],194809:[[146170]],194810:[[27726]],194811:[[146620]],194812:[[27839]],194813:[[27853]],194814:[[27751]],194815:[[27926]]},
-63744:{63744:[[35912]],63745:[[26356]],63746:[[36554]],63747:[[36040]],63748:[[28369]],63749:[[20018]],63750:[[21477]],63751:[[40860]],63752:[[40860]],63753:[[22865]],63754:[[37329]],63755:[[21895]],63756:[[22856]],63757:[[25078]],63758:[[30313]],63759:[[32645]],63760:[[34367]],63761:[[34746]],63762:[[35064]],63763:[[37007]],63764:[[27138]],63765:[[27931]],63766:[[28889]],63767:[[29662]],63768:[[33853]],63769:[[37226]],63770:[[39409]],63771:[[20098]],63772:[[21365]],63773:[[27396]],63774:[[29211]],63775:[[34349]],63776:[[40478]],63777:[[23888]],63778:[[28651]],63779:[[34253]],63780:[[35172]],63781:[[25289]],63782:[[33240]],63783:[[34847]],63784:[[24266]],63785:[[26391]],63786:[[28010]],63787:[[29436]],63788:[[37070]],63789:[[20358]],63790:[[20919]],63791:[[21214]],63792:[[25796]],63793:[[27347]],63794:[[29200]],63795:[[30439]],63796:[[32769]],63797:[[34310]],63798:[[34396]],63799:[[36335]],63800:[[38706]],63801:[[39791]],63802:[[40442]],63803:[[30860]],63804:[[31103]],63805:[[32160]],63806:[[33737]],63807:[[37636]],63808:[[40575]],63809:[[35542]],63810:[[22751]],63811:[[24324]],63812:[[31840]],63813:[[32894]],63814:[[29282]],63815:[[30922]],63816:[[36034]],63817:[[38647]],63818:[[22744]],63819:[[23650]],63820:[[27155]],63821:[[28122]],63822:[[28431]],63823:[[32047]],63824:[[32311]],63825:[[38475]],63826:[[21202]],63827:[[32907]],63828:[[20956]],63829:[[20940]],63830:[[31260]],63831:[[32190]],63832:[[33777]],63833:[[38517]],63834:[[35712]],63835:[[25295]],63836:[[27138]],63837:[[35582]],63838:[[20025]],63839:[[23527]],63840:[[24594]],63841:[[29575]],63842:[[30064]],63843:[[21271]],63844:[[30971]],63845:[[20415]],63846:[[24489]],63847:[[19981]],63848:[[27852]],63849:[[25976]],63850:[[32034]],63851:[[21443]],63852:[[22622]],63853:[[30465]],63854:[[33865]],63855:[[35498]],63856:[[27578]],63857:[[36784]],63858:[[27784]],63859:[[25342]],63860:[[33509]],63861:[[25504]],63862:[[30053]],63863:[[20142]],63864:[[20841]],63865:[[20937]],63866:[[26753]],63867:[[31975]],63868:[[33391]],63869:[[35538]],63870:[[37327]],63871:[[21237]],63872:[[21570]],63873:[[22899]],63874:[[24300]],63875:[[26053]],63876:[[28670]],63877:[[31018]],63878:[[38317]],63879:[[39530]],63880:[[40599]],63881:[[40654]],63882:[[21147]],63883:[[26310]],63884:[[27511]],63885:[[36706]],63886:[[24180]],63887:[[24976]],63888:[[25088]],63889:[[25754]],63890:[[28451]],63891:[[29001]],63892:[[29833]],63893:[[31178]],63894:[[32244]],63895:[[32879]],63896:[[36646]],63897:[[34030]],63898:[[36899]],63899:[[37706]],63900:[[21015]],63901:[[21155]],63902:[[21693]],63903:[[28872]],63904:[[35010]],63905:[[35498]],63906:[[24265]],63907:[[24565]],63908:[[25467]],63909:[[27566]],63910:[[31806]],63911:[[29557]],63912:[[20196]],63913:[[22265]],63914:[[23527]],63915:[[23994]],63916:[[24604]],63917:[[29618]],63918:[[29801]],63919:[[32666]],63920:[[32838]],63921:[[37428]],63922:[[38646]],63923:[[38728]],63924:[[38936]],63925:[[20363]],63926:[[31150]],63927:[[37300]],63928:[[38584]],63929:[[24801]],63930:[[20102]],63931:[[20698]],63932:[[23534]],63933:[[23615]],63934:[[26009]],63935:[[27138]],63936:[[29134]],63937:[[30274]],63938:[[34044]],63939:[[36988]],63940:[[40845]],63941:[[26248]],63942:[[38446]],63943:[[21129]],63944:[[26491]],63945:[[26611]],63946:[[27969]],63947:[[28316]],63948:[[29705]],63949:[[30041]],63950:[[30827]],63951:[[32016]],63952:[[39006]],63953:[[20845]],63954:[[25134]],63955:[[38520]],63956:[[20523]],63957:[[23833]],63958:[[28138]],63959:[[36650]],63960:[[24459]],63961:[[24900]],63962:[[26647]],63963:[[29575]],63964:[[38534]],63965:[[21033]],63966:[[21519]],63967:[[23653]],63968:[[26131]],63969:[[26446]],63970:[[26792]],63971:[[27877]],63972:[[29702]],63973:[[30178]],63974:[[32633]],63975:[[35023]],63976:[[35041]],63977:[[37324]],63978:[[38626]],63979:[[21311]],63980:[[28346]],63981:[[21533]],63982:[[29136]],63983:[[29848]],63984:[[34298]],63985:[[38563]],63986:[[40023]],63987:[[40607]],63988:[[26519]],63989:[[28107]],63990:[[33256]],63991:[[31435]],63992:[[31520]],63993:[[31890]],63994:[[29376]],63995:[[28825]],63996:[[35672]],63997:[[20160]],63998:[[33590]],63999:[[21050]],194816:[[27966]],194817:[[28023]],194818:[[27969]],194819:[[28009]],194820:[[28024]],194821:[[28037]],194822:[[146718]],194823:[[27956]],194824:[[28207]],194825:[[28270]],194826:[[15667]],194827:[[28363]],194828:[[28359]],194829:[[147153]],194830:[[28153]],194831:[[28526]],194832:[[147294]],194833:[[147342]],194834:[[28614]],194835:[[28729]],194836:[[28702]],194837:[[28699]],194838:[[15766]],194839:[[28746]],194840:[[28797]],194841:[[28791]],194842:[[28845]],194843:[[132389]],194844:[[28997]],194845:[[148067]],194846:[[29084]],194847:[[148395]],194848:[[29224]],194849:[[29237]],194850:[[29264]],194851:[[149000]],194852:[[29312]],194853:[[29333]],194854:[[149301]],194855:[[149524]],194856:[[29562]],194857:[[29579]],194858:[[16044]],194859:[[29605]],194860:[[16056]],194861:[[16056]],194862:[[29767]],194863:[[29788]],194864:[[29809]],194865:[[29829]],194866:[[29898]],194867:[[16155]],194868:[[29988]],194869:[[150582]],194870:[[30014]],194871:[[150674]],194872:[[30064]],194873:[[139679]],194874:[[30224]],194875:[[151457]],194876:[[151480]],194877:[[151620]],194878:[[16380]],194879:[[16392]],194880:[[30452]],194881:[[151795]],194882:[[151794]],194883:[[151833]],194884:[[151859]],194885:[[30494]],194886:[[30495]],194887:[[30495]],194888:[[30538]],194889:[[16441]],194890:[[30603]],194891:[[16454]],194892:[[16534]],194893:[[152605]],194894:[[30798]],194895:[[30860]],194896:[[30924]],194897:[[16611]],194898:[[153126]],194899:[[31062]],194900:[[153242]],194901:[[153285]],194902:[[31119]],194903:[[31211]],194904:[[16687]],194905:[[31296]],194906:[[31306]],194907:[[31311]],194908:[[153980]],194909:[[154279]],194910:[[154279]],194911:[[31470]],194912:[[16898]],194913:[[154539]],194914:[[31686]],194915:[[31689]],194916:[[16935]],194917:[[154752]],194918:[[31954]],194919:[[17056]],194920:[[31976]],194921:[[31971]],194922:[[32000]],194923:[[155526]],194924:[[32099]],194925:[[17153]],194926:[[32199]],194927:[[32258]],194928:[[32325]],194929:[[17204]],194930:[[156200]],194931:[[156231]],194932:[[17241]],194933:[[156377]],194934:[[32634]],194935:[[156478]],194936:[[32661]],194937:[[32762]],194938:[[32773]],194939:[[156890]],194940:[[156963]],194941:[[32864]],194942:[[157096]],194943:[[32880]],194944:[[144223]],194945:[[17365]],194946:[[32946]],194947:[[33027]],194948:[[17419]],194949:[[33086]],194950:[[23221]],194951:[[157607]],194952:[[157621]],194953:[[144275]],194954:[[144284]],194955:[[33281]],194956:[[33284]],194957:[[36766]],194958:[[17515]],194959:[[33425]],194960:[[33419]],194961:[[33437]],194962:[[21171]],194963:[[33457]],194964:[[33459]],194965:[[33469]],194966:[[33510]],194967:[[158524]],194968:[[33509]],194969:[[33565]],194970:[[33635]],194971:[[33709]],194972:[[33571]],194973:[[33725]],194974:[[33767]],194975:[[33879]],194976:[[33619]],194977:[[33738]],194978:[[33740]],194979:[[33756]],194980:[[158774]],194981:[[159083]],194982:[[158933]],194983:[[17707]],194984:[[34033]],194985:[[34035]],194986:[[34070]],194987:[[160714]],194988:[[34148]],194989:[[159532]],194990:[[17757]],194991:[[17761]],194992:[[159665]],194993:[[159954]],194994:[[17771]],194995:[[34384]],194996:[[34396]],194997:[[34407]],194998:[[34409]],194999:[[34473]],195000:[[34440]],195001:[[34574]],195002:[[34530]],195003:[[34681]],195004:[[34600]],195005:[[34667]],195006:[[34694]],195007:[[17879]],195008:[[34785]],195009:[[34817]],195010:[[17913]],195011:[[34912]],195012:[[34915]],195013:[[161383]],195014:[[35031]],195015:[[35038]],195016:[[17973]],195017:[[35066]],195018:[[13499]],195019:[[161966]],195020:[[162150]],195021:[[18110]],195022:[[18119]],195023:[[35488]],195024:[[35565]],195025:[[35722]],195026:[[35925]],195027:[[162984]],195028:[[36011]],195029:[[36033]],195030:[[36123]],195031:[[36215]],195032:[[163631]],195033:[[133124]],195034:[[36299]],195035:[[36284]],195036:[[36336]],195037:[[133342]],195038:[[36564]],195039:[[36664]],195040:[[165330]],195041:[[165357]],195042:[[37012]],195043:[[37105]],195044:[[37137]],195045:[[165678]],195046:[[37147]],195047:[[37432]],195048:[[37591]],195049:[[37592]],195050:[[37500]],195051:[[37881]],195052:[[37909]],195053:[[166906]],195054:[[38283]],195055:[[18837]],195056:[[38327]],195057:[[167287]],195058:[[18918]],195059:[[38595]],195060:[[23986]],195061:[[38691]],195062:[[168261]],195063:[[168474]],195064:[[19054]],195065:[[19062]],195066:[[38880]],195067:[[168970]],195068:[[19122]],195069:[[169110]],195070:[[38923]],195071:[[38923]]},
-64000:{64000:[[20999]],64001:[[24230]],64002:[[25299]],64003:[[31958]],64004:[[23429]],64005:[[27934]],64006:[[26292]],64007:[[36667]],64008:[[34892]],64009:[[38477]],64010:[[35211]],64011:[[24275]],64012:[[20800]],64013:[[21952]],64016:[[22618]],64018:[[26228]],64021:[[20958]],64022:[[29482]],64023:[[30410]],64024:[[31036]],64025:[[31070]],64026:[[31077]],64027:[[31119]],64028:[[38742]],64029:[[31934]],64030:[[32701]],64032:[[34322]],64034:[[35576]],64037:[[36920]],64038:[[37117]],64042:[[39151]],64043:[[39164]],64044:[[39208]],64045:[[40372]],64046:[[37086]],64047:[[38583]],64048:[[20398]],64049:[[20711]],64050:[[20813]],64051:[[21193]],64052:[[21220]],64053:[[21329]],64054:[[21917]],64055:[[22022]],64056:[[22120]],64057:[[22592]],64058:[[22696]],64059:[[23652]],64060:[[23662]],64061:[[24724]],64062:[[24936]],64063:[[24974]],64064:[[25074]],64065:[[25935]],64066:[[26082]],64067:[[26257]],64068:[[26757]],64069:[[28023]],64070:[[28186]],64071:[[28450]],64072:[[29038]],64073:[[29227]],64074:[[29730]],64075:[[30865]],64076:[[31038]],64077:[[31049]],64078:[[31048]],64079:[[31056]],64080:[[31062]],64081:[[31069]],64082:[[31117]],64083:[[31118]],64084:[[31296]],64085:[[31361]],64086:[[31680]],64087:[[32244]],64088:[[32265]],64089:[[32321]],64090:[[32626]],64091:[[32773]],64092:[[33261]],64093:[[33401]],64094:[[33401]],64095:[[33879]],64096:[[35088]],64097:[[35222]],64098:[[35585]],64099:[[35641]],64100:[[36051]],64101:[[36104]],64102:[[36790]],64103:[[36920]],64104:[[38627]],64105:[[38911]],64106:[[38971]],64107:[[24693]],64108:[[148206]],64109:[[33304]],64112:[[20006]],64113:[[20917]],64114:[[20840]],64115:[[20352]],64116:[[20805]],64117:[[20864]],64118:[[21191]],64119:[[21242]],64120:[[21917]],64121:[[21845]],64122:[[21913]],64123:[[21986]],64124:[[22618]],64125:[[22707]],64126:[[22852]],64127:[[22868]],64128:[[23138]],64129:[[23336]],64130:[[24274]],64131:[[24281]],64132:[[24425]],64133:[[24493]],64134:[[24792]],64135:[[24910]],64136:[[24840]],64137:[[24974]],64138:[[24928]],64139:[[25074]],64140:[[25140]],64141:[[25540]],64142:[[25628]],64143:[[25682]],64144:[[25942]],64145:[[26228]],64146:[[26391]],64147:[[26395]],64148:[[26454]],64149:[[27513]],64150:[[27578]],64151:[[27969]],64152:[[28379]],64153:[[28363]],64154:[[28450]],64155:[[28702]],64156:[[29038]],64157:[[30631]],64158:[[29237]],64159:[[29359]],64160:[[29482]],64161:[[29809]],64162:[[29958]],64163:[[30011]],64164:[[30237]],64165:[[30239]],64166:[[30410]],64167:[[30427]],64168:[[30452]],64169:[[30538]],64170:[[30528]],64171:[[30924]],64172:[[31409]],64173:[[31680]],64174:[[31867]],64175:[[32091]],64176:[[32244]],64177:[[32574]],64178:[[32773]],64179:[[33618]],64180:[[33775]],64181:[[34681]],64182:[[35137]],64183:[[35206]],64184:[[35222]],64185:[[35519]],64186:[[35576]],64187:[[35531]],64188:[[35585]],64189:[[35582]],64190:[[35565]],64191:[[35641]],64192:[[35722]],64193:[[36104]],64194:[[36664]],64195:[[36978]],64196:[[37273]],64197:[[37494]],64198:[[38524]],64199:[[38627]],64200:[[38742]],64201:[[38875]],64202:[[38911]],64203:[[38923]],64204:[[38971]],64205:[[39698]],64206:[[40860]],64207:[[141386]],64208:[[141380]],64209:[[144341]],64210:[[15261]],64211:[[16408]],64212:[[16441]],64213:[[152137]],64214:[[154832]],64215:[[163539]],64216:[[40771]],64217:[[40846]],195072:[[38953]],195073:[[169398]],195074:[[39138]],195075:[[19251]],195076:[[39209]],195077:[[39335]],195078:[[39362]],195079:[[39422]],195080:[[19406]],195081:[[170800]],195082:[[39698]],195083:[[40000]],195084:[[40189]],195085:[[19662]],195086:[[19693]],195087:[[40295]],195088:[[172238]],195089:[[19704]],195090:[[172293]],195091:[[172558]],195092:[[172689]],195093:[[40635]],195094:[[19798]],195095:[[40697]],195096:[[40702]],195097:[[40709]],195098:[[40719]],195099:[[40726]],195100:[[40763]],195101:[[173568]]},
-64256:{64256:[[102,102],256],64257:[[102,105],256],64258:[[102,108],256],64259:[[102,102,105],256],64260:[[102,102,108],256],64261:[[383,116],256],64262:[[115,116],256],64275:[[1396,1398],256],64276:[[1396,1381],256],64277:[[1396,1387],256],64278:[[1406,1398],256],64279:[[1396,1389],256],64285:[[1497,1460],512],64286:[,26],64287:[[1522,1463],512],64288:[[1506],256],64289:[[1488],256],64290:[[1491],256],64291:[[1492],256],64292:[[1499],256],64293:[[1500],256],64294:[[1501],256],64295:[[1512],256],64296:[[1514],256],64297:[[43],256],64298:[[1513,1473],512],64299:[[1513,1474],512],64300:[[64329,1473],512],64301:[[64329,1474],512],64302:[[1488,1463],512],64303:[[1488,1464],512],64304:[[1488,1468],512],64305:[[1489,1468],512],64306:[[1490,1468],512],64307:[[1491,1468],512],64308:[[1492,1468],512],64309:[[1493,1468],512],64310:[[1494,1468],512],64312:[[1496,1468],512],64313:[[1497,1468],512],64314:[[1498,1468],512],64315:[[1499,1468],512],64316:[[1500,1468],512],64318:[[1502,1468],512],64320:[[1504,1468],512],64321:[[1505,1468],512],64323:[[1507,1468],512],64324:[[1508,1468],512],64326:[[1510,1468],512],64327:[[1511,1468],512],64328:[[1512,1468],512],64329:[[1513,1468],512],64330:[[1514,1468],512],64331:[[1493,1465],512],64332:[[1489,1471],512],64333:[[1499,1471],512],64334:[[1508,1471],512],64335:[[1488,1500],256],64336:[[1649],256],64337:[[1649],256],64338:[[1659],256],64339:[[1659],256],64340:[[1659],256],64341:[[1659],256],64342:[[1662],256],64343:[[1662],256],64344:[[1662],256],64345:[[1662],256],64346:[[1664],256],64347:[[1664],256],64348:[[1664],256],64349:[[1664],256],64350:[[1658],256],64351:[[1658],256],64352:[[1658],256],64353:[[1658],256],64354:[[1663],256],64355:[[1663],256],64356:[[1663],256],64357:[[1663],256],64358:[[1657],256],64359:[[1657],256],64360:[[1657],256],64361:[[1657],256],64362:[[1700],256],64363:[[1700],256],64364:[[1700],256],64365:[[1700],256],64366:[[1702],256],64367:[[1702],256],64368:[[1702],256],64369:[[1702],256],64370:[[1668],256],64371:[[1668],256],64372:[[1668],256],64373:[[1668],256],64374:[[1667],256],64375:[[1667],256],64376:[[1667],256],64377:[[1667],256],64378:[[1670],256],64379:[[1670],256],64380:[[1670],256],64381:[[1670],256],64382:[[1671],256],64383:[[1671],256],64384:[[1671],256],64385:[[1671],256],64386:[[1677],256],64387:[[1677],256],64388:[[1676],256],64389:[[1676],256],64390:[[1678],256],64391:[[1678],256],64392:[[1672],256],64393:[[1672],256],64394:[[1688],256],64395:[[1688],256],64396:[[1681],256],64397:[[1681],256],64398:[[1705],256],64399:[[1705],256],64400:[[1705],256],64401:[[1705],256],64402:[[1711],256],64403:[[1711],256],64404:[[1711],256],64405:[[1711],256],64406:[[1715],256],64407:[[1715],256],64408:[[1715],256],64409:[[1715],256],64410:[[1713],256],64411:[[1713],256],64412:[[1713],256],64413:[[1713],256],64414:[[1722],256],64415:[[1722],256],64416:[[1723],256],64417:[[1723],256],64418:[[1723],256],64419:[[1723],256],64420:[[1728],256],64421:[[1728],256],64422:[[1729],256],64423:[[1729],256],64424:[[1729],256],64425:[[1729],256],64426:[[1726],256],64427:[[1726],256],64428:[[1726],256],64429:[[1726],256],64430:[[1746],256],64431:[[1746],256],64432:[[1747],256],64433:[[1747],256],64467:[[1709],256],64468:[[1709],256],64469:[[1709],256],64470:[[1709],256],64471:[[1735],256],64472:[[1735],256],64473:[[1734],256],64474:[[1734],256],64475:[[1736],256],64476:[[1736],256],64477:[[1655],256],64478:[[1739],256],64479:[[1739],256],64480:[[1733],256],64481:[[1733],256],64482:[[1737],256],64483:[[1737],256],64484:[[1744],256],64485:[[1744],256],64486:[[1744],256],64487:[[1744],256],64488:[[1609],256],64489:[[1609],256],64490:[[1574,1575],256],64491:[[1574,1575],256],64492:[[1574,1749],256],64493:[[1574,1749],256],64494:[[1574,1608],256],64495:[[1574,1608],256],64496:[[1574,1735],256],64497:[[1574,1735],256],64498:[[1574,1734],256],64499:[[1574,1734],256],64500:[[1574,1736],256],64501:[[1574,1736],256],64502:[[1574,1744],256],64503:[[1574,1744],256],64504:[[1574,1744],256],64505:[[1574,1609],256],64506:[[1574,1609],256],64507:[[1574,1609],256],64508:[[1740],256],64509:[[1740],256],64510:[[1740],256],64511:[[1740],256]},
-64512:{64512:[[1574,1580],256],64513:[[1574,1581],256],64514:[[1574,1605],256],64515:[[1574,1609],256],64516:[[1574,1610],256],64517:[[1576,1580],256],64518:[[1576,1581],256],64519:[[1576,1582],256],64520:[[1576,1605],256],64521:[[1576,1609],256],64522:[[1576,1610],256],64523:[[1578,1580],256],64524:[[1578,1581],256],64525:[[1578,1582],256],64526:[[1578,1605],256],64527:[[1578,1609],256],64528:[[1578,1610],256],64529:[[1579,1580],256],64530:[[1579,1605],256],64531:[[1579,1609],256],64532:[[1579,1610],256],64533:[[1580,1581],256],64534:[[1580,1605],256],64535:[[1581,1580],256],64536:[[1581,1605],256],64537:[[1582,1580],256],64538:[[1582,1581],256],64539:[[1582,1605],256],64540:[[1587,1580],256],64541:[[1587,1581],256],64542:[[1587,1582],256],64543:[[1587,1605],256],64544:[[1589,1581],256],64545:[[1589,1605],256],64546:[[1590,1580],256],64547:[[1590,1581],256],64548:[[1590,1582],256],64549:[[1590,1605],256],64550:[[1591,1581],256],64551:[[1591,1605],256],64552:[[1592,1605],256],64553:[[1593,1580],256],64554:[[1593,1605],256],64555:[[1594,1580],256],64556:[[1594,1605],256],64557:[[1601,1580],256],64558:[[1601,1581],256],64559:[[1601,1582],256],64560:[[1601,1605],256],64561:[[1601,1609],256],64562:[[1601,1610],256],64563:[[1602,1581],256],64564:[[1602,1605],256],64565:[[1602,1609],256],64566:[[1602,1610],256],64567:[[1603,1575],256],64568:[[1603,1580],256],64569:[[1603,1581],256],64570:[[1603,1582],256],64571:[[1603,1604],256],64572:[[1603,1605],256],64573:[[1603,1609],256],64574:[[1603,1610],256],64575:[[1604,1580],256],64576:[[1604,1581],256],64577:[[1604,1582],256],64578:[[1604,1605],256],64579:[[1604,1609],256],64580:[[1604,1610],256],64581:[[1605,1580],256],64582:[[1605,1581],256],64583:[[1605,1582],256],64584:[[1605,1605],256],64585:[[1605,1609],256],64586:[[1605,1610],256],64587:[[1606,1580],256],64588:[[1606,1581],256],64589:[[1606,1582],256],64590:[[1606,1605],256],64591:[[1606,1609],256],64592:[[1606,1610],256],64593:[[1607,1580],256],64594:[[1607,1605],256],64595:[[1607,1609],256],64596:[[1607,1610],256],64597:[[1610,1580],256],64598:[[1610,1581],256],64599:[[1610,1582],256],64600:[[1610,1605],256],64601:[[1610,1609],256],64602:[[1610,1610],256],64603:[[1584,1648],256],64604:[[1585,1648],256],64605:[[1609,1648],256],64606:[[32,1612,1617],256],64607:[[32,1613,1617],256],64608:[[32,1614,1617],256],64609:[[32,1615,1617],256],64610:[[32,1616,1617],256],64611:[[32,1617,1648],256],64612:[[1574,1585],256],64613:[[1574,1586],256],64614:[[1574,1605],256],64615:[[1574,1606],256],64616:[[1574,1609],256],64617:[[1574,1610],256],64618:[[1576,1585],256],64619:[[1576,1586],256],64620:[[1576,1605],256],64621:[[1576,1606],256],64622:[[1576,1609],256],64623:[[1576,1610],256],64624:[[1578,1585],256],64625:[[1578,1586],256],64626:[[1578,1605],256],64627:[[1578,1606],256],64628:[[1578,1609],256],64629:[[1578,1610],256],64630:[[1579,1585],256],64631:[[1579,1586],256],64632:[[1579,1605],256],64633:[[1579,1606],256],64634:[[1579,1609],256],64635:[[1579,1610],256],64636:[[1601,1609],256],64637:[[1601,1610],256],64638:[[1602,1609],256],64639:[[1602,1610],256],64640:[[1603,1575],256],64641:[[1603,1604],256],64642:[[1603,1605],256],64643:[[1603,1609],256],64644:[[1603,1610],256],64645:[[1604,1605],256],64646:[[1604,1609],256],64647:[[1604,1610],256],64648:[[1605,1575],256],64649:[[1605,1605],256],64650:[[1606,1585],256],64651:[[1606,1586],256],64652:[[1606,1605],256],64653:[[1606,1606],256],64654:[[1606,1609],256],64655:[[1606,1610],256],64656:[[1609,1648],256],64657:[[1610,1585],256],64658:[[1610,1586],256],64659:[[1610,1605],256],64660:[[1610,1606],256],64661:[[1610,1609],256],64662:[[1610,1610],256],64663:[[1574,1580],256],64664:[[1574,1581],256],64665:[[1574,1582],256],64666:[[1574,1605],256],64667:[[1574,1607],256],64668:[[1576,1580],256],64669:[[1576,1581],256],64670:[[1576,1582],256],64671:[[1576,1605],256],64672:[[1576,1607],256],64673:[[1578,1580],256],64674:[[1578,1581],256],64675:[[1578,1582],256],64676:[[1578,1605],256],64677:[[1578,1607],256],64678:[[1579,1605],256],64679:[[1580,1581],256],64680:[[1580,1605],256],64681:[[1581,1580],256],64682:[[1581,1605],256],64683:[[1582,1580],256],64684:[[1582,1605],256],64685:[[1587,1580],256],64686:[[1587,1581],256],64687:[[1587,1582],256],64688:[[1587,1605],256],64689:[[1589,1581],256],64690:[[1589,1582],256],64691:[[1589,1605],256],64692:[[1590,1580],256],64693:[[1590,1581],256],64694:[[1590,1582],256],64695:[[1590,1605],256],64696:[[1591,1581],256],64697:[[1592,1605],256],64698:[[1593,1580],256],64699:[[1593,1605],256],64700:[[1594,1580],256],64701:[[1594,1605],256],64702:[[1601,1580],256],64703:[[1601,1581],256],64704:[[1601,1582],256],64705:[[1601,1605],256],64706:[[1602,1581],256],64707:[[1602,1605],256],64708:[[1603,1580],256],64709:[[1603,1581],256],64710:[[1603,1582],256],64711:[[1603,1604],256],64712:[[1603,1605],256],64713:[[1604,1580],256],64714:[[1604,1581],256],64715:[[1604,1582],256],64716:[[1604,1605],256],64717:[[1604,1607],256],64718:[[1605,1580],256],64719:[[1605,1581],256],64720:[[1605,1582],256],64721:[[1605,1605],256],64722:[[1606,1580],256],64723:[[1606,1581],256],64724:[[1606,1582],256],64725:[[1606,1605],256],64726:[[1606,1607],256],64727:[[1607,1580],256],64728:[[1607,1605],256],64729:[[1607,1648],256],64730:[[1610,1580],256],64731:[[1610,1581],256],64732:[[1610,1582],256],64733:[[1610,1605],256],64734:[[1610,1607],256],64735:[[1574,1605],256],64736:[[1574,1607],256],64737:[[1576,1605],256],64738:[[1576,1607],256],64739:[[1578,1605],256],64740:[[1578,1607],256],64741:[[1579,1605],256],64742:[[1579,1607],256],64743:[[1587,1605],256],64744:[[1587,1607],256],64745:[[1588,1605],256],64746:[[1588,1607],256],64747:[[1603,1604],256],64748:[[1603,1605],256],64749:[[1604,1605],256],64750:[[1606,1605],256],64751:[[1606,1607],256],64752:[[1610,1605],256],64753:[[1610,1607],256],64754:[[1600,1614,1617],256],64755:[[1600,1615,1617],256],64756:[[1600,1616,1617],256],64757:[[1591,1609],256],64758:[[1591,1610],256],64759:[[1593,1609],256],64760:[[1593,1610],256],64761:[[1594,1609],256],64762:[[1594,1610],256],64763:[[1587,1609],256],64764:[[1587,1610],256],64765:[[1588,1609],256],64766:[[1588,1610],256],64767:[[1581,1609],256]},
-64768:{64768:[[1581,1610],256],64769:[[1580,1609],256],64770:[[1580,1610],256],64771:[[1582,1609],256],64772:[[1582,1610],256],64773:[[1589,1609],256],64774:[[1589,1610],256],64775:[[1590,1609],256],64776:[[1590,1610],256],64777:[[1588,1580],256],64778:[[1588,1581],256],64779:[[1588,1582],256],64780:[[1588,1605],256],64781:[[1588,1585],256],64782:[[1587,1585],256],64783:[[1589,1585],256],64784:[[1590,1585],256],64785:[[1591,1609],256],64786:[[1591,1610],256],64787:[[1593,1609],256],64788:[[1593,1610],256],64789:[[1594,1609],256],64790:[[1594,1610],256],64791:[[1587,1609],256],64792:[[1587,1610],256],64793:[[1588,1609],256],64794:[[1588,1610],256],64795:[[1581,1609],256],64796:[[1581,1610],256],64797:[[1580,1609],256],64798:[[1580,1610],256],64799:[[1582,1609],256],64800:[[1582,1610],256],64801:[[1589,1609],256],64802:[[1589,1610],256],64803:[[1590,1609],256],64804:[[1590,1610],256],64805:[[1588,1580],256],64806:[[1588,1581],256],64807:[[1588,1582],256],64808:[[1588,1605],256],64809:[[1588,1585],256],64810:[[1587,1585],256],64811:[[1589,1585],256],64812:[[1590,1585],256],64813:[[1588,1580],256],64814:[[1588,1581],256],64815:[[1588,1582],256],64816:[[1588,1605],256],64817:[[1587,1607],256],64818:[[1588,1607],256],64819:[[1591,1605],256],64820:[[1587,1580],256],64821:[[1587,1581],256],64822:[[1587,1582],256],64823:[[1588,1580],256],64824:[[1588,1581],256],64825:[[1588,1582],256],64826:[[1591,1605],256],64827:[[1592,1605],256],64828:[[1575,1611],256],64829:[[1575,1611],256],64848:[[1578,1580,1605],256],64849:[[1578,1581,1580],256],64850:[[1578,1581,1580],256],64851:[[1578,1581,1605],256],64852:[[1578,1582,1605],256],64853:[[1578,1605,1580],256],64854:[[1578,1605,1581],256],64855:[[1578,1605,1582],256],64856:[[1580,1605,1581],256],64857:[[1580,1605,1581],256],64858:[[1581,1605,1610],256],64859:[[1581,1605,1609],256],64860:[[1587,1581,1580],256],64861:[[1587,1580,1581],256],64862:[[1587,1580,1609],256],64863:[[1587,1605,1581],256],64864:[[1587,1605,1581],256],64865:[[1587,1605,1580],256],64866:[[1587,1605,1605],256],64867:[[1587,1605,1605],256],64868:[[1589,1581,1581],256],64869:[[1589,1581,1581],256],64870:[[1589,1605,1605],256],64871:[[1588,1581,1605],256],64872:[[1588,1581,1605],256],64873:[[1588,1580,1610],256],64874:[[1588,1605,1582],256],64875:[[1588,1605,1582],256],64876:[[1588,1605,1605],256],64877:[[1588,1605,1605],256],64878:[[1590,1581,1609],256],64879:[[1590,1582,1605],256],64880:[[1590,1582,1605],256],64881:[[1591,1605,1581],256],64882:[[1591,1605,1581],256],64883:[[1591,1605,1605],256],64884:[[1591,1605,1610],256],64885:[[1593,1580,1605],256],64886:[[1593,1605,1605],256],64887:[[1593,1605,1605],256],64888:[[1593,1605,1609],256],64889:[[1594,1605,1605],256],64890:[[1594,1605,1610],256],64891:[[1594,1605,1609],256],64892:[[1601,1582,1605],256],64893:[[1601,1582,1605],256],64894:[[1602,1605,1581],256],64895:[[1602,1605,1605],256],64896:[[1604,1581,1605],256],64897:[[1604,1581,1610],256],64898:[[1604,1581,1609],256],64899:[[1604,1580,1580],256],64900:[[1604,1580,1580],256],64901:[[1604,1582,1605],256],64902:[[1604,1582,1605],256],64903:[[1604,1605,1581],256],64904:[[1604,1605,1581],256],64905:[[1605,1581,1580],256],64906:[[1605,1581,1605],256],64907:[[1605,1581,1610],256],64908:[[1605,1580,1581],256],64909:[[1605,1580,1605],256],64910:[[1605,1582,1580],256],64911:[[1605,1582,1605],256],64914:[[1605,1580,1582],256],64915:[[1607,1605,1580],256],64916:[[1607,1605,1605],256],64917:[[1606,1581,1605],256],64918:[[1606,1581,1609],256],64919:[[1606,1580,1605],256],64920:[[1606,1580,1605],256],64921:[[1606,1580,1609],256],64922:[[1606,1605,1610],256],64923:[[1606,1605,1609],256],64924:[[1610,1605,1605],256],64925:[[1610,1605,1605],256],64926:[[1576,1582,1610],256],64927:[[1578,1580,1610],256],64928:[[1578,1580,1609],256],64929:[[1578,1582,1610],256],64930:[[1578,1582,1609],256],64931:[[1578,1605,1610],256],64932:[[1578,1605,1609],256],64933:[[1580,1605,1610],256],64934:[[1580,1581,1609],256],64935:[[1580,1605,1609],256],64936:[[1587,1582,1609],256],64937:[[1589,1581,1610],256],64938:[[1588,1581,1610],256],64939:[[1590,1581,1610],256],64940:[[1604,1580,1610],256],64941:[[1604,1605,1610],256],64942:[[1610,1581,1610],256],64943:[[1610,1580,1610],256],64944:[[1610,1605,1610],256],64945:[[1605,1605,1610],256],64946:[[1602,1605,1610],256],64947:[[1606,1581,1610],256],64948:[[1602,1605,1581],256],64949:[[1604,1581,1605],256],64950:[[1593,1605,1610],256],64951:[[1603,1605,1610],256],64952:[[1606,1580,1581],256],64953:[[1605,1582,1610],256],64954:[[1604,1580,1605],256],64955:[[1603,1605,1605],256],64956:[[1604,1580,1605],256],64957:[[1606,1580,1581],256],64958:[[1580,1581,1610],256],64959:[[1581,1580,1610],256],64960:[[1605,1580,1610],256],64961:[[1601,1605,1610],256],64962:[[1576,1581,1610],256],64963:[[1603,1605,1605],256],64964:[[1593,1580,1605],256],64965:[[1589,1605,1605],256],64966:[[1587,1582,1610],256],64967:[[1606,1580,1610],256],65008:[[1589,1604,1746],256],65009:[[1602,1604,1746],256],65010:[[1575,1604,1604,1607],256],65011:[[1575,1603,1576,1585],256],65012:[[1605,1581,1605,1583],256],65013:[[1589,1604,1593,1605],256],65014:[[1585,1587,1608,1604],256],65015:[[1593,1604,1610,1607],256],65016:[[1608,1587,1604,1605],256],65017:[[1589,1604,1609],256],65018:[[1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605],256],65019:[[1580,1604,32,1580,1604,1575,1604,1607],256],65020:[[1585,1740,1575,1604],256]},
-65024:{65040:[[44],256],65041:[[12289],256],65042:[[12290],256],65043:[[58],256],65044:[[59],256],65045:[[33],256],65046:[[63],256],65047:[[12310],256],65048:[[12311],256],65049:[[8230],256],65056:[,230],65057:[,230],65058:[,230],65059:[,230],65060:[,230],65061:[,230],65062:[,230],65063:[,220],65064:[,220],65065:[,220],65066:[,220],65067:[,220],65068:[,220],65069:[,220],65072:[[8229],256],65073:[[8212],256],65074:[[8211],256],65075:[[95],256],65076:[[95],256],65077:[[40],256],65078:[[41],256],65079:[[123],256],65080:[[125],256],65081:[[12308],256],65082:[[12309],256],65083:[[12304],256],65084:[[12305],256],65085:[[12298],256],65086:[[12299],256],65087:[[12296],256],65088:[[12297],256],65089:[[12300],256],65090:[[12301],256],65091:[[12302],256],65092:[[12303],256],65095:[[91],256],65096:[[93],256],65097:[[8254],256],65098:[[8254],256],65099:[[8254],256],65100:[[8254],256],65101:[[95],256],65102:[[95],256],65103:[[95],256],65104:[[44],256],65105:[[12289],256],65106:[[46],256],65108:[[59],256],65109:[[58],256],65110:[[63],256],65111:[[33],256],65112:[[8212],256],65113:[[40],256],65114:[[41],256],65115:[[123],256],65116:[[125],256],65117:[[12308],256],65118:[[12309],256],65119:[[35],256],65120:[[38],256],65121:[[42],256],65122:[[43],256],65123:[[45],256],65124:[[60],256],65125:[[62],256],65126:[[61],256],65128:[[92],256],65129:[[36],256],65130:[[37],256],65131:[[64],256],65136:[[32,1611],256],65137:[[1600,1611],256],65138:[[32,1612],256],65140:[[32,1613],256],65142:[[32,1614],256],65143:[[1600,1614],256],65144:[[32,1615],256],65145:[[1600,1615],256],65146:[[32,1616],256],65147:[[1600,1616],256],65148:[[32,1617],256],65149:[[1600,1617],256],65150:[[32,1618],256],65151:[[1600,1618],256],65152:[[1569],256],65153:[[1570],256],65154:[[1570],256],65155:[[1571],256],65156:[[1571],256],65157:[[1572],256],65158:[[1572],256],65159:[[1573],256],65160:[[1573],256],65161:[[1574],256],65162:[[1574],256],65163:[[1574],256],65164:[[1574],256],65165:[[1575],256],65166:[[1575],256],65167:[[1576],256],65168:[[1576],256],65169:[[1576],256],65170:[[1576],256],65171:[[1577],256],65172:[[1577],256],65173:[[1578],256],65174:[[1578],256],65175:[[1578],256],65176:[[1578],256],65177:[[1579],256],65178:[[1579],256],65179:[[1579],256],65180:[[1579],256],65181:[[1580],256],65182:[[1580],256],65183:[[1580],256],65184:[[1580],256],65185:[[1581],256],65186:[[1581],256],65187:[[1581],256],65188:[[1581],256],65189:[[1582],256],65190:[[1582],256],65191:[[1582],256],65192:[[1582],256],65193:[[1583],256],65194:[[1583],256],65195:[[1584],256],65196:[[1584],256],65197:[[1585],256],65198:[[1585],256],65199:[[1586],256],65200:[[1586],256],65201:[[1587],256],65202:[[1587],256],65203:[[1587],256],65204:[[1587],256],65205:[[1588],256],65206:[[1588],256],65207:[[1588],256],65208:[[1588],256],65209:[[1589],256],65210:[[1589],256],65211:[[1589],256],65212:[[1589],256],65213:[[1590],256],65214:[[1590],256],65215:[[1590],256],65216:[[1590],256],65217:[[1591],256],65218:[[1591],256],65219:[[1591],256],65220:[[1591],256],65221:[[1592],256],65222:[[1592],256],65223:[[1592],256],65224:[[1592],256],65225:[[1593],256],65226:[[1593],256],65227:[[1593],256],65228:[[1593],256],65229:[[1594],256],65230:[[1594],256],65231:[[1594],256],65232:[[1594],256],65233:[[1601],256],65234:[[1601],256],65235:[[1601],256],65236:[[1601],256],65237:[[1602],256],65238:[[1602],256],65239:[[1602],256],65240:[[1602],256],65241:[[1603],256],65242:[[1603],256],65243:[[1603],256],65244:[[1603],256],65245:[[1604],256],65246:[[1604],256],65247:[[1604],256],65248:[[1604],256],65249:[[1605],256],65250:[[1605],256],65251:[[1605],256],65252:[[1605],256],65253:[[1606],256],65254:[[1606],256],65255:[[1606],256],65256:[[1606],256],65257:[[1607],256],65258:[[1607],256],65259:[[1607],256],65260:[[1607],256],65261:[[1608],256],65262:[[1608],256],65263:[[1609],256],65264:[[1609],256],65265:[[1610],256],65266:[[1610],256],65267:[[1610],256],65268:[[1610],256],65269:[[1604,1570],256],65270:[[1604,1570],256],65271:[[1604,1571],256],65272:[[1604,1571],256],65273:[[1604,1573],256],65274:[[1604,1573],256],65275:[[1604,1575],256],65276:[[1604,1575],256]},
-65280:{65281:[[33],256],65282:[[34],256],65283:[[35],256],65284:[[36],256],65285:[[37],256],65286:[[38],256],65287:[[39],256],65288:[[40],256],65289:[[41],256],65290:[[42],256],65291:[[43],256],65292:[[44],256],65293:[[45],256],65294:[[46],256],65295:[[47],256],65296:[[48],256],65297:[[49],256],65298:[[50],256],65299:[[51],256],65300:[[52],256],65301:[[53],256],65302:[[54],256],65303:[[55],256],65304:[[56],256],65305:[[57],256],65306:[[58],256],65307:[[59],256],65308:[[60],256],65309:[[61],256],65310:[[62],256],65311:[[63],256],65312:[[64],256],65313:[[65],256],65314:[[66],256],65315:[[67],256],65316:[[68],256],65317:[[69],256],65318:[[70],256],65319:[[71],256],65320:[[72],256],65321:[[73],256],65322:[[74],256],65323:[[75],256],65324:[[76],256],65325:[[77],256],65326:[[78],256],65327:[[79],256],65328:[[80],256],65329:[[81],256],65330:[[82],256],65331:[[83],256],65332:[[84],256],65333:[[85],256],65334:[[86],256],65335:[[87],256],65336:[[88],256],65337:[[89],256],65338:[[90],256],65339:[[91],256],65340:[[92],256],65341:[[93],256],65342:[[94],256],65343:[[95],256],65344:[[96],256],65345:[[97],256],65346:[[98],256],65347:[[99],256],65348:[[100],256],65349:[[101],256],65350:[[102],256],65351:[[103],256],65352:[[104],256],65353:[[105],256],65354:[[106],256],65355:[[107],256],65356:[[108],256],65357:[[109],256],65358:[[110],256],65359:[[111],256],65360:[[112],256],65361:[[113],256],65362:[[114],256],65363:[[115],256],65364:[[116],256],65365:[[117],256],65366:[[118],256],65367:[[119],256],65368:[[120],256],65369:[[121],256],65370:[[122],256],65371:[[123],256],65372:[[124],256],65373:[[125],256],65374:[[126],256],65375:[[10629],256],65376:[[10630],256],65377:[[12290],256],65378:[[12300],256],65379:[[12301],256],65380:[[12289],256],65381:[[12539],256],65382:[[12530],256],65383:[[12449],256],65384:[[12451],256],65385:[[12453],256],65386:[[12455],256],65387:[[12457],256],65388:[[12515],256],65389:[[12517],256],65390:[[12519],256],65391:[[12483],256],65392:[[12540],256],65393:[[12450],256],65394:[[12452],256],65395:[[12454],256],65396:[[12456],256],65397:[[12458],256],65398:[[12459],256],65399:[[12461],256],65400:[[12463],256],65401:[[12465],256],65402:[[12467],256],65403:[[12469],256],65404:[[12471],256],65405:[[12473],256],65406:[[12475],256],65407:[[12477],256],65408:[[12479],256],65409:[[12481],256],65410:[[12484],256],65411:[[12486],256],65412:[[12488],256],65413:[[12490],256],65414:[[12491],256],65415:[[12492],256],65416:[[12493],256],65417:[[12494],256],65418:[[12495],256],65419:[[12498],256],65420:[[12501],256],65421:[[12504],256],65422:[[12507],256],65423:[[12510],256],65424:[[12511],256],65425:[[12512],256],65426:[[12513],256],65427:[[12514],256],65428:[[12516],256],65429:[[12518],256],65430:[[12520],256],65431:[[12521],256],65432:[[12522],256],65433:[[12523],256],65434:[[12524],256],65435:[[12525],256],65436:[[12527],256],65437:[[12531],256],65438:[[12441],256],65439:[[12442],256],65440:[[12644],256],65441:[[12593],256],65442:[[12594],256],65443:[[12595],256],65444:[[12596],256],65445:[[12597],256],65446:[[12598],256],65447:[[12599],256],65448:[[12600],256],65449:[[12601],256],65450:[[12602],256],65451:[[12603],256],65452:[[12604],256],65453:[[12605],256],65454:[[12606],256],65455:[[12607],256],65456:[[12608],256],65457:[[12609],256],65458:[[12610],256],65459:[[12611],256],65460:[[12612],256],65461:[[12613],256],65462:[[12614],256],65463:[[12615],256],65464:[[12616],256],65465:[[12617],256],65466:[[12618],256],65467:[[12619],256],65468:[[12620],256],65469:[[12621],256],65470:[[12622],256],65474:[[12623],256],65475:[[12624],256],65476:[[12625],256],65477:[[12626],256],65478:[[12627],256],65479:[[12628],256],65482:[[12629],256],65483:[[12630],256],65484:[[12631],256],65485:[[12632],256],65486:[[12633],256],65487:[[12634],256],65490:[[12635],256],65491:[[12636],256],65492:[[12637],256],65493:[[12638],256],65494:[[12639],256],65495:[[12640],256],65498:[[12641],256],65499:[[12642],256],65500:[[12643],256],65504:[[162],256],65505:[[163],256],65506:[[172],256],65507:[[175],256],65508:[[166],256],65509:[[165],256],65510:[[8361],256],65512:[[9474],256],65513:[[8592],256],65514:[[8593],256],65515:[[8594],256],65516:[[8595],256],65517:[[9632],256],65518:[[9675],256]}
-
-};
-
-   /***** Module to export */
-   var unorm = {
-      nfc: nfc,
-      nfd: nfd,
-      nfkc: nfkc,
-      nfkd: nfkd
-   };
-
-   /*globals module:true,define:true*/
-
-   // CommonJS
-   if (typeof module === "object") {
-      module.exports = unorm;
-
-   // AMD
-   } else if (typeof define === "function" && define.amd) {
-      define("unorm", function () {
-         return unorm;
-      });
-
-   // Global
-   } else {
-      root.unorm = unorm;
-   }
-
-   /***** Export as shim for String::normalize method *****/
-   /*
-      http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts#november_8_2013_draft_rev_21
-
-      21.1.3.12 String.prototype.normalize(form="NFC")
-      When the normalize method is called with one argument form, the following steps are taken:
-
-      1. Let O be CheckObjectCoercible(this value).
-      2. Let S be ToString(O).
-      3. ReturnIfAbrupt(S).
-      4. If form is not provided or undefined let form be "NFC".
-      5. Let f be ToString(form).
-      6. ReturnIfAbrupt(f).
-      7. If f is not one of "NFC", "NFD", "NFKC", or "NFKD", then throw a RangeError Exception.
-      8. Let ns be the String value is the result of normalizing S into the normalization form named by f as specified in Unicode Standard Annex #15, UnicodeNormalizatoin Forms.
-      9. Return ns.
-
-      The length property of the normalize method is 0.
-
-      *NOTE* The normalize function is intentionally generic; it does not require that its this value be a String object. Therefore it can be transferred to other kinds of objects for use as a method.
-   */
-    unorm.shimApplied = false;
-
-   if (!String.prototype.normalize) {
-      String.prototype.normalize = function(form) {
-         var str = "" + this;
-         form =  form === undefined ? "NFC" : form;
-
-         if (form === "NFC") {
-            return unorm.nfc(str);
-         } else if (form === "NFD") {
-            return unorm.nfd(str);
-         } else if (form === "NFKC") {
-            return unorm.nfkc(str);
-         } else if (form === "NFKD") {
-            return unorm.nfkd(str);
-         } else {
-            throw new RangeError("Invalid normalization form: " + form);
-         }
-      };
-
-      unorm.shimApplied = true;
-   }
-}(this));
diff --git a/node_modules/unorm/package.json b/node_modules/unorm/package.json
deleted file mode 100644
index 8ebb9c3..0000000
--- a/node_modules/unorm/package.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
-  "_args": [
-    [
-      "unorm@1.4.1",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "unorm@1.4.1",
-  "_id": "unorm@1.4.1",
-  "_inBundle": false,
-  "_integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA=",
-  "_location": "/unorm",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "unorm@1.4.1",
-    "name": "unorm",
-    "escapedName": "unorm",
-    "rawSpec": "1.4.1",
-    "saveSpec": null,
-    "fetchSpec": "1.4.1"
-  },
-  "_requiredBy": [
-    "/cordova-common"
-  ],
-  "_resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz",
-  "_spec": "1.4.1",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Bjarke Walling",
-    "email": "bwp@bwp.dk"
-  },
-  "bugs": {
-    "url": "https://github.com/walling/unorm/issues"
-  },
-  "contributors": [
-    {
-      "name": "Bjarke Walling",
-      "email": "bwp@bwp.dk"
-    },
-    {
-      "name": "Oleg Grenrus",
-      "email": "oleg.grenrus@iki.fi"
-    },
-    {
-      "name": "Matsuza",
-      "email": "matsuza@gmail.com"
-    }
-  ],
-  "description": "JavaScript Unicode 8.0 Normalization - NFC, NFD, NFKC, NFKD. Read <http://unicode.org/reports/tr15/> UAX #15 Unicode Normalization Forms.",
-  "devDependencies": {
-    "benchmark": "~1.0.0",
-    "grunt": "~0.4.1",
-    "grunt-contrib-jshint": "~0.8.0",
-    "grunt-contrib-watch": "~0.5.0",
-    "grunt-simple-mocha": "~0.4.0",
-    "unorm": "1.4.1"
-  },
-  "engines": {
-    "node": ">= 0.4.0"
-  },
-  "homepage": "https://github.com/walling/unorm#readme",
-  "license": "MIT or GPL-2.0",
-  "main": "./lib/unorm.js",
-  "name": "unorm",
-  "repository": {
-    "type": "git",
-    "url": "git+ssh://git@github.com/walling/unorm.git"
-  },
-  "scripts": {
-    "test": "grunt test"
-  },
-  "version": "1.4.1"
-}
diff --git a/node_modules/util-deprecate/History.md b/node_modules/util-deprecate/History.md
deleted file mode 100644
index acc8675..0000000
--- a/node_modules/util-deprecate/History.md
+++ /dev/null
@@ -1,16 +0,0 @@
-
-1.0.2 / 2015-10-07
-==================
-
-  * use try/catch when checking `localStorage` (#3, @kumavis)
-
-1.0.1 / 2014-11-25
-==================
-
-  * browser: use `console.warn()` for deprecation calls
-  * browser: more jsdocs
-
-1.0.0 / 2014-04-30
-==================
-
-  * initial commit
diff --git a/node_modules/util-deprecate/LICENSE b/node_modules/util-deprecate/LICENSE
deleted file mode 100644
index 6a60e8c..0000000
--- a/node_modules/util-deprecate/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/util-deprecate/README.md b/node_modules/util-deprecate/README.md
deleted file mode 100644
index 75622fa..0000000
--- a/node_modules/util-deprecate/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-util-deprecate
-==============
-### The Node.js `util.deprecate()` function with browser support
-
-In Node.js, this module simply re-exports the `util.deprecate()` function.
-
-In the web browser (i.e. via browserify), a browser-specific implementation
-of the `util.deprecate()` function is used.
-
-
-## API
-
-A `deprecate()` function is the only thing exposed by this module.
-
-``` javascript
-// setup:
-exports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead');
-
-
-// users see:
-foo();
-// foo() is deprecated, use bar() instead
-foo();
-foo();
-```
-
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/util-deprecate/browser.js b/node_modules/util-deprecate/browser.js
deleted file mode 100644
index 549ae2f..0000000
--- a/node_modules/util-deprecate/browser.js
+++ /dev/null
@@ -1,67 +0,0 @@
-
-/**
- * Module exports.
- */
-
-module.exports = deprecate;
-
-/**
- * Mark that a method should not be used.
- * Returns a modified function which warns once by default.
- *
- * If `localStorage.noDeprecation = true` is set, then it is a no-op.
- *
- * If `localStorage.throwDeprecation = true` is set, then deprecated functions
- * will throw an Error when invoked.
- *
- * If `localStorage.traceDeprecation = true` is set, then deprecated functions
- * will invoke `console.trace()` instead of `console.error()`.
- *
- * @param {Function} fn - the function to deprecate
- * @param {String} msg - the string to print to the console when `fn` is invoked
- * @returns {Function} a new "deprecated" version of `fn`
- * @api public
- */
-
-function deprecate (fn, msg) {
-  if (config('noDeprecation')) {
-    return fn;
-  }
-
-  var warned = false;
-  function deprecated() {
-    if (!warned) {
-      if (config('throwDeprecation')) {
-        throw new Error(msg);
-      } else if (config('traceDeprecation')) {
-        console.trace(msg);
-      } else {
-        console.warn(msg);
-      }
-      warned = true;
-    }
-    return fn.apply(this, arguments);
-  }
-
-  return deprecated;
-}
-
-/**
- * Checks `localStorage` for boolean values for the given `name`.
- *
- * @param {String} name
- * @returns {Boolean}
- * @api private
- */
-
-function config (name) {
-  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
-  try {
-    if (!global.localStorage) return false;
-  } catch (_) {
-    return false;
-  }
-  var val = global.localStorage[name];
-  if (null == val) return false;
-  return String(val).toLowerCase() === 'true';
-}
diff --git a/node_modules/util-deprecate/node.js b/node_modules/util-deprecate/node.js
deleted file mode 100644
index 5e6fcff..0000000
--- a/node_modules/util-deprecate/node.js
+++ /dev/null
@@ -1,6 +0,0 @@
-
-/**
- * For Node.js, simply re-export the core `util.deprecate` function.
- */
-
-module.exports = require('util').deprecate;
diff --git a/node_modules/util-deprecate/package.json b/node_modules/util-deprecate/package.json
deleted file mode 100644
index a8bc7f7..0000000
--- a/node_modules/util-deprecate/package.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-  "_args": [
-    [
-      "util-deprecate@1.0.2",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "util-deprecate@1.0.2",
-  "_id": "util-deprecate@1.0.2",
-  "_inBundle": false,
-  "_integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
-  "_location": "/util-deprecate",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "util-deprecate@1.0.2",
-    "name": "util-deprecate",
-    "escapedName": "util-deprecate",
-    "rawSpec": "1.0.2",
-    "saveSpec": null,
-    "fetchSpec": "1.0.2"
-  },
-  "_requiredBy": [
-    "/plist",
-    "/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-  "_spec": "1.0.2",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Nathan Rajlich",
-    "email": "nathan@tootallnate.net",
-    "url": "http://n8.io/"
-  },
-  "browser": "browser.js",
-  "bugs": {
-    "url": "https://github.com/TooTallNate/util-deprecate/issues"
-  },
-  "description": "The Node.js `util.deprecate()` function with browser support",
-  "homepage": "https://github.com/TooTallNate/util-deprecate",
-  "keywords": [
-    "util",
-    "deprecate",
-    "browserify",
-    "browser",
-    "node"
-  ],
-  "license": "MIT",
-  "main": "node.js",
-  "name": "util-deprecate",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/TooTallNate/util-deprecate.git"
-  },
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "version": "1.0.2"
-}
diff --git a/node_modules/winjs/License.txt b/node_modules/winjs/License.txt
deleted file mode 100644
index baf9dc1..0000000
--- a/node_modules/winjs/License.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-WinJS
-
-Copyright (c) Microsoft Corporation
-
-All rights reserved. 
-
-MIT License
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/winjs/README.md b/node_modules/winjs/README.md
deleted file mode 100644
index d046c24..0000000
--- a/node_modules/winjs/README.md
+++ /dev/null
@@ -1,67 +0,0 @@
-Windows Library for JavaScript (WinJS)
-=====
-
-[![Join the chat at https://gitter.im/winjs/winjs](https://badges.gitter.im/winjs/winjs.svg)](https://gitter.im/winjs/winjs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
- [![Build Status](https://travis-ci.org/winjs/winjs.svg?branch=master)](https://travis-ci.org/winjs/winjs)
-
-# Status
-Right now, Microsoft plans to maintain WinJS's existing features--this means responding to Issues and Pull Requests on a regular basis. We're committed to making sure that WinJS continues to run well. At this time, we don't have plans to invest in new features or feature requests; this also means that we're not planning a new feature release.
-
-# Intro
-WinJS is a set of JavaScript toolkits that allow developers to build applications using HTML/JS/CSS technology forged with the following principles in mind:
-
-* Provide developers with a distinctive set of UI controls with high polish and performance with fundamental support for touch, mouse, keyboard and accessibility
-* Provide developers with a cohesive set of components and utilities to build the scaffolding and infrastructure of their applications
-
-This is a first step for the WinJS project and there is still a lot of work that needs to be done. Feel free to participate by [contributing][contribute] along the way.
-
-# Contribute
-There are many ways to [contribute] to the project.
-
-You can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submitting bugs and helping us verify fixes as they are checked in, as well as submitting code fixes or code contributions of your own.
-
-Note that all code submissions will be rigorously reviewed and tested by the team, and only those that meet an extremely high bar for both quality and design appropriateness will be merged into the source.
-
-# Build WinJS
-In order to build WinJS, ensure that you have [git](http://git-scm.com/downloads) and [Node.js](http://nodejs.org/download/) installed.
-
-Clone a copy of the master WinJS git repo:
-```
-git clone https://github.com/winjs/winjs.git
-```
-
-Change to the `winjs` directory:
-```
-cd winjs
-```
-
-Install the [grunt command-line interface](https://github.com/gruntjs/grunt-cli) globally:
-```
-npm install -g grunt-cli
-```
-
-Grunt dependencies are installed separately in each cloned git repo. Install the dependencies with:
-```
-npm install
-```
-
-Run the following and the WinJS JavaScript and CSS files will be put in the `bin` directory:
-```
-grunt
-```
-
-> **Note:** You may need to use sudo (for OSX, *nix, BSD etc) or run your command shell as Administrator (for Windows) to install Grunt globally.
-
-# Tests status
-Refer to http://winjs.azurewebsites.net/#status for the current status of the unit tests and the list of known issues.
-
-# Try WinJS
-Check out our online playground at http://www.buildwinjs.com/playground/
-
-The old playground is still available at http://winjs.azurewebsites.net/
-
-# Follow Us
-Twitter https://twitter.com/BuildWinJS  
-Facebook https://www.facebook.com/buildwinjs
-
-[contribute]: https://github.com/winjs/winjs/blob/master/CONTRIBUTING.md
diff --git a/node_modules/winjs/css/ui-dark.css b/node_modules/winjs/css/ui-dark.css
deleted file mode 100644
index a8f89fc..0000000
--- a/node_modules/winjs/css/ui-dark.css
+++ /dev/null
@@ -1,7957 +0,0 @@
-/* Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. */
-@keyframes WinJS-node-inserted {
-  from {
-    outline-color: #000;
-  }
-  to {
-    outline-color: #001;
-  }
-}
-@keyframes WinJS-opacity-in {
-  from {
-    opacity: 0;
-  }
-  to {
-    opacity: 1;
-  }
-}
-@keyframes WinJS-opacity-out {
-  from {
-    opacity: 1;
-  }
-  to {
-    opacity: 0;
-  }
-}
-@keyframes WinJS-scale-up {
-  from {
-    transform: scale(0.85);
-  }
-  to {
-    transform: scale(1);
-  }
-}
-@keyframes WinJS-scale-down {
-  from {
-    transform: scale(1);
-  }
-  to {
-    transform: scale(0.85);
-  }
-}
-@keyframes WinJS-default-remove {
-  from {
-    transform: translateX(11px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-default-remove-rtl {
-  from {
-    transform: translateX(-11px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-default-apply {
-  from {
-    transform: none;
-  }
-  to {
-    transform: translateX(11px);
-  }
-}
-@keyframes WinJS-default-apply-rtl {
-  from {
-    transform: none;
-  }
-  to {
-    transform: translateX(-11px);
-  }
-}
-@keyframes WinJS-showEdgeUI {
-  from {
-    transform: translateY(-70px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-showPanel {
-  from {
-    transform: translateX(364px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-showPanel-rtl {
-  from {
-    transform: translateX(-364px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-hideEdgeUI {
-  from {
-    transform: none;
-  }
-  to {
-    transform: translateY(-70px);
-  }
-}
-@keyframes WinJS-hidePanel {
-  from {
-    transform: none;
-  }
-  to {
-    transform: translateX(364px);
-  }
-}
-@keyframes WinJS-hidePanel-rtl {
-  from {
-    transform: none;
-  }
-  to {
-    transform: translateX(-364px);
-  }
-}
-@keyframes WinJS-showPopup {
-  from {
-    transform: translateY(50px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-dragSourceEnd {
-  from {
-    transform: translateX(11px) scale(1.05);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-dragSourceEnd-rtl {
-  from {
-    transform: translateX(-11px) scale(1.05);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-enterContent {
-  from {
-    transform: translateY(28px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-exit {
-  from {
-    transform: none;
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-enterPage {
-  from {
-    transform: translateY(28px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-updateBadge {
-  from {
-    transform: translateY(24px);
-  }
-  to {
-    transform: none;
-  }
-}
-@-webkit-keyframes WinJS-node-inserted {
-  from {
-    outline-color: #000;
-  }
-  to {
-    outline-color: #001;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-opacity-in {
-  from {
-    opacity: 0;
-  }
-  to {
-    opacity: 1;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-opacity-out {
-  from {
-    opacity: 1;
-  }
-  to {
-    opacity: 0;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-scale-up {
-  from {
-    -webkit-transform: scale(0.85);
-  }
-  to {
-    -webkit-transform: scale(1);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-scale-down {
-  from {
-    -webkit-transform: scale(1);
-  }
-  to {
-    -webkit-transform: scale(0.85);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-default-remove {
-  from {
-    -webkit-transform: translateX(11px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-default-remove-rtl {
-  from {
-    -webkit-transform: translateX(-11px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-default-apply {
-  from {
-    -webkit-transform: none;
-  }
-  to {
-    -webkit-transform: translateX(11px);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-default-apply-rtl {
-  from {
-    -webkit-transform: none;
-  }
-  to {
-    -webkit-transform: translateX(-11px);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showEdgeUI {
-  from {
-    -webkit-transform: translateY(-70px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showPanel {
-  from {
-    -webkit-transform: translateX(364px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showPanel-rtl {
-  from {
-    -webkit-transform: translateX(-364px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-hideEdgeUI {
-  from {
-    -webkit-transform: none;
-  }
-  to {
-    -webkit-transform: translateY(-70px);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-hidePanel {
-  from {
-    -webkit-transform: none;
-  }
-  to {
-    -webkit-transform: translateX(364px);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-hidePanel-rtl {
-  from {
-    -webkit-transform: none;
-  }
-  to {
-    -webkit-transform: translateX(-364px);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showPopup {
-  from {
-    -webkit-transform: translateY(50px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-dragSourceEnd {
-  from {
-    -webkit-transform: translateX(11px) scale(1.05);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-dragSourceEnd-rtl {
-  from {
-    -webkit-transform: translateX(-11px) scale(1.05);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-enterContent {
-  from {
-    -webkit-transform: translateY(28px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-exit {
-  from {
-    -webkit-transform: none;
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-enterPage {
-  from {
-    -webkit-transform: translateY(28px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-updateBadge {
-  from {
-    -webkit-transform: translateY(24px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@font-face {
-  font-family: "Segoe UI Command";
-  src: local("Segoe MDL2 Assets");
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: "Symbols";
-  src: url(../fonts/Symbols.ttf);
-}
-.win-type-header,
-.win-h1 {
-  font-size: 46px;
-  font-weight: 200;
-  line-height: 1.216;
-  letter-spacing: 0px;
-}
-.win-type-subheader,
-.win-h2 {
-  font-size: 34px;
-  font-weight: 200;
-  line-height: 1.176;
-}
-.win-type-title,
-.win-h3 {
-  font-size: 24px;
-  font-weight: 300;
-  line-height: 1.167;
-}
-.win-type-subtitle,
-.win-h4 {
-  font-size: 20px;
-  font-weight: 400;
-  line-height: 1.2;
-}
-.win-type-body,
-.win-h6 {
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-type-base,
-.win-h5 {
-  font-size: 15px;
-  font-weight: 500;
-  line-height: 1.333;
-}
-.win-type-caption {
-  font-size: 12px;
-  font-weight: 400;
-  line-height: 1.167;
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-weight: 200;
-  src: local("Segoe UI Light");
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-weight: 300;
-  src: local("Segoe UI Semilight");
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-weight: 400;
-  src: local("Segoe UI");
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-weight: 500;
-  src: local("Segoe UI Semibold");
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-weight: 600;
-  src: local("Segoe UI Bold");
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-style: italic;
-  font-weight: 400;
-  src: local("Segoe UI Italic");
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-style: italic;
-  font-weight: 700;
-  src: local("Segoe UI Bold Italic");
-}
-@font-face {
-  font-family: "Microsoft Yahei UI";
-  font-weight: 200;
-  src: local("Microsoft Yahei UI Light");
-}
-@font-face {
-  font-family: "Microsoft Yahei UI";
-  font-weight: 300;
-  src: local("Microsoft Yahei UI");
-}
-@font-face {
-  font-family: "Microsoft Yahei UI";
-  font-weight: 500;
-  src: local("Microsoft Yahei UI");
-}
-@font-face {
-  font-family: "Microsoft Yahei UI";
-  font-weight: 600;
-  src: local("Microsoft Yahei UI Bold");
-}
-@font-face {
-  font-family: "Microsoft JhengHei UI";
-  font-weight: 200;
-  src: local("Microsoft JhengHei UI Light");
-}
-@font-face {
-  font-family: "Microsoft JhengHei UI";
-  font-weight: 300;
-  src: local("Microsoft JhengHei UI");
-}
-@font-face {
-  font-family: "Microsoft JhengHei UI";
-  font-weight: 500;
-  src: local("Microsoft JhengHei UI");
-}
-@font-face {
-  font-family: "Microsoft JhengHei UI";
-  font-weight: 600;
-  src: local("Microsoft JhengHei UI Bold");
-}
-.win-type-header:-ms-lang(am, ti),
-.win-type-subheader:-ms-lang(am, ti),
-.win-type-title:-ms-lang(am, ti),
-.win-type-subtitle:-ms-lang(am, ti),
-.win-type-base:-ms-lang(am, ti),
-.win-type-body:-ms-lang(am, ti),
-.win-type-caption:-ms-lang(am, ti),
-.win-h1:-ms-lang(am, ti),
-.win-h2:-ms-lang(am, ti),
-.win-h3:-ms-lang(am, ti),
-.win-h4:-ms-lang(am, ti),
-.win-h5:-ms-lang(am, ti),
-.win-h6:-ms-lang(am, ti),
-.win-button:-ms-lang(am, ti),
-.win-dropdown:-ms-lang(am, ti),
-.win-textbox:-ms-lang(am, ti),
-.win-link:-ms-lang(am, ti),
-.win-textarea:-ms-lang(am, ti) {
-  font-family: "Ebrima", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-type-subheader:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-type-title:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-type-subtitle:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-type-base:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-type-body:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-type-caption:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-h1:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-h2:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-h3:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-h4:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-h5:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-h6:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-button:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-dropdown:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-textbox:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-link:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-textarea:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te) {
-  font-family: "Nirmala UI", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(chr-CHER-US),
-.win-type-subheader:-ms-lang(chr-CHER-US),
-.win-type-title:-ms-lang(chr-CHER-US),
-.win-type-subtitle:-ms-lang(chr-CHER-US),
-.win-type-base:-ms-lang(chr-CHER-US),
-.win-type-body:-ms-lang(chr-CHER-US),
-.win-type-caption:-ms-lang(chr-CHER-US),
-.win-h1:-ms-lang(chr-CHER-US),
-.win-h2:-ms-lang(chr-CHER-US),
-.win-h3:-ms-lang(chr-CHER-US),
-.win-h4:-ms-lang(chr-CHER-US),
-.win-h5:-ms-lang(chr-CHER-US),
-.win-h6:-ms-lang(chr-CHER-US),
-.win-button:-ms-lang(chr-CHER-US),
-.win-dropdown:-ms-lang(chr-CHER-US),
-.win-textbox:-ms-lang(chr-CHER-US),
-.win-link:-ms-lang(chr-CHER-US),
-.win-textarea:-ms-lang(chr-CHER-US) {
-  font-family: "Gadugi", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(ja),
-.win-type-subheader:-ms-lang(ja),
-.win-type-title:-ms-lang(ja),
-.win-type-subtitle:-ms-lang(ja),
-.win-type-base:-ms-lang(ja),
-.win-type-body:-ms-lang(ja),
-.win-type-caption:-ms-lang(ja),
-.win-h1:-ms-lang(ja),
-.win-h2:-ms-lang(ja),
-.win-h3:-ms-lang(ja),
-.win-h4:-ms-lang(ja),
-.win-h5:-ms-lang(ja),
-.win-h6:-ms-lang(ja),
-.win-button:-ms-lang(ja),
-.win-dropdown:-ms-lang(ja),
-.win-textbox:-ms-lang(ja),
-.win-link:-ms-lang(ja),
-.win-textarea:-ms-lang(ja) {
-  font-family: "Yu Gothic UI", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(km, lo, th, bug-Bugi),
-.win-type-subheader:-ms-lang(km, lo, th, bug-Bugi),
-.win-type-title:-ms-lang(km, lo, th, bug-Bugi),
-.win-type-subtitle:-ms-lang(km, lo, th, bug-Bugi),
-.win-type-base:-ms-lang(km, lo, th, bug-Bugi),
-.win-type-body:-ms-lang(km, lo, th, bug-Bugi),
-.win-type-caption:-ms-lang(km, lo, th, bug-Bugi),
-.win-h1:-ms-lang(km, lo, th, bug-Bugi),
-.win-h2:-ms-lang(km, lo, th, bug-Bugi),
-.win-h3:-ms-lang(km, lo, th, bug-Bugi),
-.win-h4:-ms-lang(km, lo, th, bug-Bugi),
-.win-h5:-ms-lang(km, lo, th, bug-Bugi),
-.win-h6:-ms-lang(km, lo, th, bug-Bugi),
-.win-button:-ms-lang(km, lo, th, bug-Bugi),
-.win-dropdown:-ms-lang(km, lo, th, bug-Bugi),
-.win-textbox:-ms-lang(km, lo, th, bug-Bugi),
-.win-link:-ms-lang(km, lo, th, bug-Bugi),
-.win-textarea:-ms-lang(km, lo, th, bug-Bugi) {
-  font-family: "Leelawadee UI", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(ko),
-.win-type-subheader:-ms-lang(ko),
-.win-type-title:-ms-lang(ko),
-.win-type-subtitle:-ms-lang(ko),
-.win-type-base:-ms-lang(ko),
-.win-type-body:-ms-lang(ko),
-.win-type-caption:-ms-lang(ko),
-.win-h1:-ms-lang(ko),
-.win-h2:-ms-lang(ko),
-.win-h3:-ms-lang(ko),
-.win-h4:-ms-lang(ko),
-.win-h5:-ms-lang(ko),
-.win-h6:-ms-lang(ko),
-.win-button:-ms-lang(ko),
-.win-dropdown:-ms-lang(ko),
-.win-textbox:-ms-lang(ko),
-.win-link:-ms-lang(ko),
-.win-textarea:-ms-lang(ko) {
-  font-family: "Malgun Gothic", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(jv-Java),
-.win-type-subheader:-ms-lang(jv-Java),
-.win-type-title:-ms-lang(jv-Java),
-.win-type-subtitle:-ms-lang(jv-Java),
-.win-type-base:-ms-lang(jv-Java),
-.win-type-body:-ms-lang(jv-Java),
-.win-type-caption:-ms-lang(jv-Java),
-.win-h1:-ms-lang(jv-Java),
-.win-h2:-ms-lang(jv-Java),
-.win-h3:-ms-lang(jv-Java),
-.win-h4:-ms-lang(jv-Java),
-.win-h5:-ms-lang(jv-Java),
-.win-h6:-ms-lang(jv-Java),
-.win-button:-ms-lang(jv-Java),
-.win-dropdown:-ms-lang(jv-Java),
-.win-textbox:-ms-lang(jv-Java),
-.win-link:-ms-lang(jv-Java),
-.win-textarea:-ms-lang(jv-Java) {
-  font-family: "Javanese Text", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(cop-Copt),
-.win-type-subheader:-ms-lang(cop-Copt),
-.win-type-title:-ms-lang(cop-Copt),
-.win-type-subtitle:-ms-lang(cop-Copt),
-.win-type-base:-ms-lang(cop-Copt),
-.win-type-body:-ms-lang(cop-Copt),
-.win-type-caption:-ms-lang(cop-Copt),
-.win-h1:-ms-lang(cop-Copt),
-.win-h2:-ms-lang(cop-Copt),
-.win-h3:-ms-lang(cop-Copt),
-.win-h4:-ms-lang(cop-Copt),
-.win-h5:-ms-lang(cop-Copt),
-.win-h6:-ms-lang(cop-Copt),
-.win-button:-ms-lang(cop-Copt),
-.win-dropdown:-ms-lang(cop-Copt),
-.win-textbox:-ms-lang(cop-Copt),
-.win-link:-ms-lang(cop-Copt),
-.win-textarea:-ms-lang(cop-Copt) {
-  font-family: "Segoe MDL2 Assets", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-type-subheader:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-type-title:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-type-subtitle:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-type-base:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-type-body:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-type-caption:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-h1:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-h2:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-h3:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-h4:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-h5:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-h6:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-button:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-dropdown:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-textbox:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-link:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-textarea:-ms-lang(zh-CN, zh-Hans, zh-SG) {
-  font-family: "Microsoft YaHei UI", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-type-subheader:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-type-title:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-type-subtitle:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-type-base:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-type-body:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-type-caption:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-h1:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-h2:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-h3:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-h4:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-h5:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-h6:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-button:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-dropdown:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-textbox:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-link:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-textarea:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO) {
-  font-family: "Microsoft JhengHei UI", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-html,
-body {
-  width: 100%;
-  height: 100%;
-  margin: 0px;
-  cursor: default;
-  -webkit-touch-callout: none;
-  -ms-scroll-translation: vertical-to-horizontal;
-  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-html {
-  overflow: hidden;
-  direction: ltr;
-}
-html:lang(ar),
-html:lang(dv),
-html:lang(fa),
-html:lang(he),
-html:lang(ku-Arab),
-html:lang(pa-Arab),
-html:lang(prs),
-html:lang(ps),
-html:lang(sd-Arab),
-html:lang(syr),
-html:lang(ug),
-html:lang(ur),
-html:lang(qps-plocm) {
-  direction: rtl;
-}
-body {
-  -ms-content-zooming: none;
-}
-iframe {
-  border: 0;
-}
-.win-type-header,
-.win-type-subheader,
-.win-type-title,
-.win-type-subtitle,
-.win-type-base,
-.win-type-body,
-.win-type-caption,
-.win-h1,
-.win-h2,
-.win-h3,
-.win-h4,
-.win-h5,
-.win-h6,
-.win-button,
-.win-dropdown,
-.win-textbox,
-.win-link,
-.win-textarea {
-  font-family: "Segoe UI", sans-serif, "Segoe MDL2 Assets", "Symbols", "Segoe UI Emoji";
-}
-.win-textbox,
-.win-textarea {
-  -ms-user-select: element;
-  border-style: solid;
-  border-width: 2px;
-  border-radius: 0;
-  margin: 8px 0px;
-  width: 296px;
-  min-width: 64px;
-  min-height: 28px;
-  background-clip: border-box;
-  box-sizing: border-box;
-  padding: 3px 6px 5px 10px;
-  outline: 0;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-textbox::-ms-value {
-  margin: 0;
-  padding: 0;
-}
-.win-textbox::-ms-clear,
-.win-textbox::-ms-reveal {
-  padding-right: 2px;
-  margin-right: -8px;
-  margin-left: 2px;
-  margin-top: -8px;
-  margin-bottom: -8px;
-  width: 30px;
-  height: 32px;
-}
-.win-textbox:lang(ar)::-ms-clear,
-.win-textbox:lang(dv)::-ms-clear,
-.win-textbox:lang(fa)::-ms-clear,
-.win-textbox:lang(he)::-ms-clear,
-.win-textbox:lang(ku-Arab)::-ms-clear,
-.win-textbox:lang(pa-Arab)::-ms-clear,
-.win-textbox:lang(prs)::-ms-clear,
-.win-textbox:lang(ps)::-ms-clear,
-.win-textbox:lang(sd-Arab)::-ms-clear,
-.win-textbox:lang(syr)::-ms-clear,
-.win-textbox:lang(ug)::-ms-clear,
-.win-textbox:lang(ur)::-ms-clear,
-.win-textbox:lang(qps-plocm)::-ms-clear,
-.win-textbox:lang(ar)::-ms-reveal,
-.win-textbox:lang(dv)::-ms-reveal,
-.win-textbox:lang(fa)::-ms-reveal,
-.win-textbox:lang(he)::-ms-reveal,
-.win-textbox:lang(ku-Arab)::-ms-reveal,
-.win-textbox:lang(pa-Arab)::-ms-reveal,
-.win-textbox:lang(prs)::-ms-reveal,
-.win-textbox:lang(ps)::-ms-reveal,
-.win-textbox:lang(sd-Arab)::-ms-reveal,
-.win-textbox:lang(syr)::-ms-reveal,
-.win-textbox:lang(ug)::-ms-reveal,
-.win-textbox:lang(ur)::-ms-reveal,
-.win-textbox:lang(qps-plocm)::-ms-reveal {
-  margin-left: -8px;
-  margin-right: 2px;
-}
-.win-textarea {
-  resize: none;
-  overflow-y: auto;
-}
-.win-radio,
-.win-checkbox {
-  width: 20px;
-  height: 20px;
-  margin-right: 8px;
-  margin-top: 12px;
-  margin-bottom: 12px;
-}
-.win-radio:lang(ar),
-.win-checkbox:lang(ar),
-.win-radio:lang(dv),
-.win-checkbox:lang(dv),
-.win-radio:lang(fa),
-.win-checkbox:lang(fa),
-.win-radio:lang(he),
-.win-checkbox:lang(he),
-.win-radio:lang(ku-Arab),
-.win-checkbox:lang(ku-Arab),
-.win-radio:lang(pa-Arab),
-.win-checkbox:lang(pa-Arab),
-.win-radio:lang(prs),
-.win-checkbox:lang(prs),
-.win-radio:lang(ps),
-.win-checkbox:lang(ps),
-.win-radio:lang(sd-Arab),
-.win-checkbox:lang(sd-Arab),
-.win-radio:lang(syr),
-.win-checkbox:lang(syr),
-.win-radio:lang(ug),
-.win-checkbox:lang(ug),
-.win-radio:lang(ur),
-.win-checkbox:lang(ur),
-.win-radio:lang(qps-plocm),
-.win-checkbox:lang(qps-plocm) {
-  margin-left: 8px;
-  margin-right: 0px;
-}
-.win-radio::-ms-check,
-.win-checkbox::-ms-check {
-  border-style: solid;
-  display: inline-block;
-  border-width: 2px;
-  background-clip: border-box;
-}
-.win-button {
-  border-style: solid;
-  margin: 0px;
-  min-height: 32px;
-  min-width: 120px;
-  padding: 4px 8px;
-  border-width: 2px;
-  background-clip: border-box;
-  border-radius: 0;
-  touch-action: manipulation;
-  -webkit-appearance: none;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-button.win-button-file {
-  border: none;
-  min-width: 100px;
-  min-height: 20px;
-  width: 340px;
-  height: 32px;
-  padding: 0px;
-  margin: 7px 8px 21px 8px;
-  background-clip: padding-box;
-}
-.win-button.win-button-file::-ms-value {
-  margin: 0;
-  border-width: 2px;
-  border-style: solid;
-  border-right-style: none;
-  border-radius: 0;
-  background-clip: border-box;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-button.win-button-file:lang(ar)::-ms-value,
-.win-button.win-button-file:lang(dv)::-ms-value,
-.win-button.win-button-file:lang(fa)::-ms-value,
-.win-button.win-button-file:lang(he)::-ms-value,
-.win-button.win-button-file:lang(ku-Arab)::-ms-value,
-.win-button.win-button-file:lang(pa-Arab)::-ms-value,
-.win-button.win-button-file:lang(prs)::-ms-value,
-.win-button.win-button-file:lang(ps)::-ms-value,
-.win-button.win-button-file:lang(sd-Arab)::-ms-value,
-.win-button.win-button-file:lang(syr)::-ms-value,
-.win-button.win-button-file:lang(ug)::-ms-value,
-.win-button.win-button-file:lang(ur)::-ms-value,
-.win-button.win-button-file:lang(qps-plocm)::-ms-value {
-  border-left-style: none;
-  border-right-style: solid;
-}
-.win-button.win-button-file::-ms-browse {
-  margin: 0;
-  padding: 0 18px;
-  border-width: 2px;
-  border-style: solid;
-  background-clip: padding-box;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-dropdown {
-  min-width: 56px;
-  max-width: 368px;
-  min-height: 32px;
-  margin: 8px 0;
-  border-style: solid;
-  border-width: 2px;
-  background-clip: border-box;
-  background-image: none;
-  box-sizing: border-box;
-  border-radius: 0;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-dropdown::-ms-value {
-  padding: 5px 12px 7px 12px;
-  margin: 0;
-}
-.win-dropdown::-ms-expand {
-  border: none;
-  margin-right: 5px;
-  margin-left: 3px;
-  margin-bottom: -2px;
-  font-size: 20px;
-}
-select[multiple].win-dropdown {
-  padding: 0 0 0 12px;
-  vertical-align: bottom;
-}
-.win-dropdown option {
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-progress-bar,
-.win-progress-ring,
-.win-ring {
-  width: 180px;
-  height: 4px;
-  -webkit-appearance: none;
-}
-.win-progress-bar:not(:indeterminate),
-.win-progress-ring:not(:indeterminate),
-.win-ring:not(:indeterminate) {
-  border-style: none;
-}
-.win-progress-bar::-ms-fill,
-.win-progress-ring::-ms-fill,
-.win-ring::-ms-fill {
-  border-style: none;
-}
-.win-progress-bar.win-medium,
-.win-progress-ring.win-medium,
-.win-ring.win-medium {
-  width: 296px;
-}
-.win-progress-bar.win-large,
-.win-progress-ring.win-large,
-.win-ring.win-large {
-  width: 100%;
-}
-.win-progress-bar:indeterminate::-webkit-progress-value,
-.win-progress-ring:indeterminate::-webkit-progress-value,
-.win-ring:indeterminate::-webkit-progress-value {
-  position: relative;
-  -webkit-animation: win-progress-indeterminate 3s linear infinite;
-}
-.win-progress-bar.win-paused:not(:indeterminate),
-.win-progress-ring.win-paused:not(:indeterminate),
-.win-ring.win-paused:not(:indeterminate) {
-  animation-name: win-progress-fade-out;
-  animation-duration: 3s;
-  animation-timing-function: cubic-bezier(0.03, 0.76, 0.31, 1);
-  opacity: 0.5;
-}
-.win-progress-bar.win-error::-ms-fill,
-.win-progress-ring.win-error::-ms-fill,
-.win-ring.win-error::-ms-fill {
-  opacity: 0;
-}
-.win-progress-ring,
-.win-ring {
-  width: 20px;
-  height: 20px;
-}
-.win-progress-ring:indeterminate::-ms-fill,
-.win-ring:indeterminate::-ms-fill {
-  animation-name: -ms-ring;
-}
-.win-progress-ring.win-medium,
-.win-ring.win-medium {
-  width: 40px;
-  height: 40px;
-}
-.win-progress-ring.win-large,
-.win-ring.win-large {
-  width: 60px;
-  height: 60px;
-}
-@-webkit-keyframes win-progress-indeterminate {
-  0% {
-    left: 0;
-    width: 25%;
-  }
-  50% {
-    left: calc(75%);
-    width: 25%;
-  }
-  75% {
-    left: calc(100%);
-    width: 0%;
-  }
-  75.1% {
-    left: 0;
-    width: 0%;
-  }
-  100% {
-    left: 0;
-    width: 25%;
-  }
-}
-@keyframes win-progress-fade-out {
-  from {
-    opacity: 1.0;
-  }
-  to {
-    opacity: 0.5;
-  }
-}
-.win-slider {
-  -webkit-appearance: none;
-  width: 280px;
-  height: 44px;
-}
-.win-slider::-ms-track {
-  height: 2px;
-  border-style: none;
-}
-.win-slider::-webkit-slider-runnable-track {
-  height: 2px;
-  border-style: none;
-}
-.win-slider::-moz-range-track {
-  height: 2px;
-  border-style: none;
-}
-.win-slider::-moz-range-thumb {
-  width: 8px;
-  height: 24px;
-  border-radius: 4px;
-  border-style: none;
-}
-.win-slider::-webkit-slider-thumb {
-  -webkit-appearance: none;
-  margin-top: -11px;
-  width: 8px;
-  height: 24px;
-  border-radius: 4px;
-  border-style: none;
-}
-.win-slider::-ms-thumb {
-  margin-top: inherit;
-  width: 8px;
-  height: 24px;
-  border-radius: 4px;
-  border-style: none;
-}
-.win-slider.win-vertical {
-  writing-mode: bt-lr;
-  width: 44px;
-  height: 280px;
-}
-.win-slider.win-vertical::-ms-track {
-  width: 2px;
-  height: auto;
-}
-.win-slider.win-vertical::-ms-thumb {
-  width: 24px;
-  height: 8px;
-}
-.win-slider.win-vertical:lang(ar),
-.win-slider.win-vertical:lang(dv),
-.win-slider.win-vertical:lang(fa),
-.win-slider.win-vertical:lang(he),
-.win-slider.win-vertical:lang(ku-Arab),
-.win-slider.win-vertical:lang(pa-Arab),
-.win-slider.win-vertical:lang(prs),
-.win-slider.win-vertical:lang(ps),
-.win-slider.win-vertical:lang(sd-Arab),
-.win-slider.win-vertical:lang(syr),
-.win-slider.win-vertical:lang(ug),
-.win-slider.win-vertical:lang(ur),
-.win-slider.win-vertical:lang(qps-plocm) {
-  writing-mode: bt-rl;
-}
-.win-link {
-  text-decoration: underline;
-  cursor: pointer;
-  touch-action: manipulation;
-}
-.win-code {
-  font-family: "Consolas", "Menlo", "Monaco", "Courier New", monospace;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-type-ellipsis {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-h1.win-type-ellipsis,
-.win-type-header.win-type-ellipsis,
-.win-h1.win-type-ellipsis {
-  line-height: 1.4286;
-}
-h2.win-type-ellipsis,
-.win-type-subheader.win-type-ellipsis,
-.win-h2.win-type-ellipsis {
-  line-height: 1.5;
-}
-.win-scrollview {
-  overflow-x: auto;
-  overflow-y: hidden;
-  height: 400px;
-  width: 100%;
-}
-h1.win-type-header,
-h2.win-type-subheader,
-h3.win-type-title,
-h4.win-type-subtitle,
-h5.win-type-base,
-h6.win-type-body,
-h1.win-h1,
-h2.win-h2,
-h3.win-h3,
-h4.win-h4,
-h5.win-h5,
-h6.win-h6 {
-  margin-top: 0px;
-  margin-bottom: 0px;
-}
-.win-type-body p,
-p.win-type-body {
-  font-weight: 300;
-}
-.win-listview {
-  overflow: hidden;
-  height: 400px;
-}
-.win-listview .win-surface {
-  overflow: visible;
-}
-.win-listview > .win-viewport.win-horizontal .win-surface {
-  height: 100%;
-}
-.win-listview > .win-viewport.win-vertical .win-surface {
-  width: 100%;
-}
-.win-listview > .win-viewport {
-  position: relative;
-  width: 100%;
-  height: 100%;
-  z-index: 0;
-  -ms-overflow-style: -ms-autohiding-scrollbar;
-  -webkit-overflow-scrolling: touch;
-  white-space: nowrap;
-}
-.win-listview > .win-viewport.win-horizontal {
-  overflow-x: auto;
-  overflow-y: hidden;
-}
-.win-listview > .win-viewport.win-vertical {
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.win-listview .win-itemscontainer {
-  overflow: hidden;
-}
-.win-listview .win-itemscontainer-padder {
-  width: 0;
-  height: 0;
-  margin: 0;
-  padding: 0;
-  border: 0;
-  overflow: hidden;
-}
-.win-listview > .win-horizontal .win-container {
-  margin: 10px 5px 0px 5px;
-}
-.win-listview > .win-vertical .win-container {
-  margin: 10px 24px 0px 7px;
-}
-.win-listview.win-rtl > .win-vertical .win-container {
-  margin: 10px 7px 0px 24px;
-}
-.win-listview .win-container,
-.win-listview .win-itembox,
-.win-itemcontainer.win-container,
-.win-itemcontainer .win-itembox {
-  cursor: default;
-  z-index: 0;
-}
-.win-listview .win-container {
-  touch-action: pan-x pan-y pinch-zoom;
-}
-.win-semanticzoom .win-listview > .win-viewport * {
-  touch-action: auto;
-}
-.win-semanticzoom .win-listview > .win-viewport.win-zooming-x {
-  overflow-x: visible;
-}
-.win-semanticzoom .win-listview > .win-viewport.win-zooming-y {
-  overflow-y: visible;
-}
-.win-listview .win-itembox,
-.win-itemcontainer .win-itembox {
-  width: 100%;
-  height: 100%;
-}
-.win-listview .win-item,
-.win-itemcontainer .win-item {
-  z-index: 1;
-}
-.win-listview .win-item,
-.win-itemcontainer .win-item {
-  overflow: hidden;
-  position: relative;
-}
-.win-listview > .win-vertical .win-item {
-  width: 100%;
-}
-.win-listview .win-item:focus,
-.win-itemcontainer .win-item:focus {
-  outline-style: none;
-}
-.win-listview .win-focusedoutline,
-.win-itemcontainer .win-focusedoutline {
-  width: calc(100% - 4px);
-  height: calc(100% - 4px);
-  left: 2px;
-  top: 2px;
-  position: absolute;
-  z-index: 5;
-  pointer-events: none;
-}
-.win-container.win-selected .win-selectionborder {
-  border-width: 2px;
-  border-style: solid;
-}
-html.win-hoverable .win-container.win-selected:hover .win-selectionborder {
-  border-width: 2px;
-  border-style: solid;
-}
-html.win-hoverable .win-listview .win-itembox:hover::before,
-html.win-hoverable .win-itemcontainer .win-itembox:hover::before {
-  position: absolute;
-  left: 0px;
-  top: 0px;
-  content: "";
-  width: calc(100% - 4px);
-  height: calc(100% - 4px);
-  pointer-events: none;
-  border-style: solid;
-  border-width: 2px;
-  z-index: 3;
-}
-html.win-hoverable .win-listview.win-selectionstylefilled .win-itembox:hover::before,
-html.win-hoverable .win-itemcontainer.win-selectionstylefilled .win-itembox:hover::before,
-html.win-hoverable .win-listview .win-itembox.win-selected:hover::before,
-html.win-hoverable .win-itemcontainer.win-itembox.win-selected:hover::before,
-html.win-hoverable .win-itemcontainer.win-itembox.win-selected:hover::before {
-  display: none;
-}
-.win-listview .win-groupheader {
-  padding: 10px 10px 10px 2px;
-  overflow: hidden;
-  outline-width: 0.01px;
-  outline-style: none;
-  float: left;
-  font-size: 34px;
-  font-weight: 200;
-  line-height: 1.176;
-}
-.win-listview .win-groupheadercontainer {
-  z-index: 1;
-  touch-action: pan-x pan-y pinch-zoom;
-  overflow: hidden;
-}
-.win-listview .win-horizontal .win-headercontainer,
-.win-listview .win-horizontal .win-footercontainer {
-  height: 100%;
-  display: inline-block;
-  overflow: hidden;
-  white-space: normal;
-}
-.win-listview .win-vertical .win-headercontainer,
-.win-listview .win-vertical .win-footercontainer {
-  width: 100%;
-  display: block;
-  overflow: hidden;
-  white-space: normal;
-}
-.win-listview .win-groupheader.win-focused {
-  outline-style: dotted;
-}
-.win-listview.win-rtl .win-groupheader {
-  padding-left: 10px;
-  padding-right: 2px;
-  float: right;
-}
-.win-listview.win-groups .win-horizontal .win-groupleader {
-  margin-left: 70px;
-}
-.win-listview.win-groups.win-rtl .win-horizontal .win-groupleader {
-  margin-left: 0;
-  margin-right: 70px;
-}
-.win-listview.win-groups .win-vertical .win-listlayout .win-groupleader,
-.win-listview.win-groups .win-vertical .win-gridlayout .win-groupleader {
-  margin-top: 70px;
-}
-.win-listview.win-groups > .win-vertical .win-surface.win-listlayout,
-.win-listview.win-groups > .win-vertical .win-surface.win-gridlayout {
-  margin-top: -65px;
-}
-.win-listview.win-groups > .win-horizontal .win-surface {
-  margin-left: -70px;
-}
-.win-listview.win-groups.win-rtl > .win-horizontal .win-surface {
-  margin-left: 0;
-  margin-right: -70px;
-}
-.win-listview .win-surface {
-  -webkit-margin-collapse: separate;
-  white-space: normal;
-}
-.win-surface ._win-proxy {
-  position: relative;
-  overflow: hidden;
-  width: 0;
-  height: 0;
-  touch-action: none;
-}
-.win-selectionborder {
-  position: absolute;
-  opacity: inherit;
-  z-index: 2;
-  pointer-events: none;
-}
-.win-container.win-selected .win-selectionborder {
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-}
-.win-selectionbackground {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  z-index: 0;
-}
-.win-selectioncheckmarkbackground {
-  position: absolute;
-  top: 2px;
-  right: 2px;
-  width: 14px;
-  height: 11px;
-  margin: 0;
-  padding: 0;
-  border-left-width: 2px;
-  border-right-width: 2px;
-  border-top-width: 4px;
-  border-bottom-width: 3px;
-  border-style: solid;
-  z-index: 3;
-  display: none;
-}
-.win-listview.win-rtl .win-selectioncheckmarkbackground,
-.win-itemcontainer.win-rtl .win-selectioncheckmarkbackground {
-  left: 2px;
-  right: auto;
-}
-.win-selectionmode.win-itemcontainer .win-selectioncheckmarkbackground,
-.win-selectionmode.win-itemcontainer.win-selectionmode .win-selectioncheckmark,
-.win-selectionmode .win-itemcontainer .win-selectioncheckmarkbackground,
-.win-selectionmode .win-itemcontainer.win-selectionmode .win-selectioncheckmark,
-.win-listview .win-selectionmode .win-selectioncheckmarkbackground,
-.win-listview .win-selectionmode .win-selectioncheckmark {
-  display: block;
-}
-.win-selectioncheckmark {
-  position: absolute;
-  margin: 0;
-  padding: 2px;
-  right: 1px;
-  top: 1px;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-size: 14px;
-  z-index: 4;
-  line-height: 1;
-  display: none;
-}
-.win-rtl .win-selectioncheckmark {
-  right: auto;
-  left: 0px;
-}
-.win-selectionstylefilled.win-container,
-.win-selectionstylefilled .win-container {
-  overflow: hidden;
-}
-.win-selectionmode .win-itemcontainer.win-container .win-itembox::after,
-.win-selectionmode.win-itemcontainer.win-container .win-itembox::after,
-.win-listview .win-surface.win-selectionmode .win-itembox::after {
-  content: "";
-  position: absolute;
-  width: 18px;
-  height: 18px;
-  pointer-events: none;
-  right: 2px;
-  top: 2px;
-  z-index: 3;
-}
-.win-rtl .win-selectionmode .win-itemcontainer.win-container .win-itembox::after,
-.win-itemcontainer.win-rtl.win-selectionmode.win-container .win-itembox::after,
-.win-listview.win-rtl .win-surface.win-selectionmode .win-itembox::after {
-  right: auto;
-  left: 2px;
-}
-.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-item {
-  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  transform: translate(40px, 0px);
-  -webkit-transform: translate(40px, 0px);
-}
-.win-listview.win-rtl.win-selectionstylefilled .win-surface.win-selectionmode .win-item {
-  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  transform: translate(-40px, 0px);
-  -webkit-transform: translate(-40px, 0px);
-}
-.win-listview.win-selectionstylefilled .win-surface.win-hidingselectionmode .win-item {
-  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  transform: none;
-  -webkit-transform: none;
-}
-.win-listview.win-rtl.win-selectionstylefilled .win-surface.win-hideselectionmode .win-item {
-  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  transform: none;
-  -webkit-transform: none;
-}
-.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox::after {
-  left: 12px;
-  right: auto;
-  top: 50%;
-  margin-top: -9px;
-  display: block;
-  border: 2px solid;
-  width: 16px;
-  height: 16px;
-}
-.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-itembox::after {
-  left: auto;
-  right: 12px;
-}
-.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-selectioncheckmarkbackground {
-  left: 12px;
-  top: 50%;
-  margin-top: -9px;
-  display: block;
-  border: 2px solid;
-  width: 16px;
-  height: 16px;
-}
-.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-selectioncheckmarkbackground {
-  left: auto;
-  right: 12px;
-}
-.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-selectioncheckmark {
-  left: 13px;
-  top: 50%;
-  margin-top: -8px;
-  display: block;
-  width: 14px;
-  height: 14px;
-}
-.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-selectioncheckmark {
-  left: 0;
-  right: 10px;
-}
-.win-selectionmode .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox.win-selected::after,
-.win-itemcontainer.win-selectionmode.win-selectionstylefilled.win-container .win-itembox.win-selected::after,
-.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox.win-nonselectable::after,
-.win-listview .win-surface.win-selectionmode .win-itembox.win-selected::after {
-  display: none;
-}
-.win-listview .win-progress {
-  left: 50%;
-  top: 50%;
-  width: 60px;
-  height: 60px;
-  margin-left: -30px;
-  margin-top: -30px;
-  z-index: 1;
-  position: absolute;
-}
-.win-listview .win-progress::-ms-fill {
-  animation-name: -ms-ring;
-}
-.win-listview .win-itemsblock {
-  overflow: hidden;
-}
-.win-listview .win-surface.win-nocssgrid.win-gridlayout,
-.win-listview .win-horizontal .win-nocssgrid.win-listlayout,
-.win-listview .win-vertical .win-nocssgrid.win-listlayout.win-headerpositionleft {
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  vertical-align: top;
-}
-.win-listview .win-horizontal .win-surface.win-nocssgrid {
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-line-pack: start;
-  -webkit-align-content: flex-start;
-  align-content: flex-start;
-}
-.win-listview .win-vertical .win-surface.win-nocssgrid {
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-line-pack: start;
-  -webkit-align-content: flex-start;
-  align-content: flex-start;
-}
-.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout,
-.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout,
-.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,
-.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout {
-  display: block;
-}
-.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout .win-itemscontainer-padder,
-.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout .win-itemscontainer-padder,
-.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout .win-itemscontainer-padder,
-.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout .win-itemscontainer-padder {
-  height: 0;
-  width: 0;
-}
-.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer,
-.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer,
-.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer,
-.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer {
-  display: none;
-}
-.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer.win-laidout,
-.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer.win-laidout,
-.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer.win-laidout {
-  display: block;
-}
-.win-listview .win-listlayout .win-itemscontainer {
-  overflow: visible;
-}
-.win-listview .win-listlayout .win-itemsblock {
-  padding-bottom: 4px;
-  margin-bottom: -4px;
-}
-.win-listview > .win-vertical .win-listlayout.win-headerpositiontop .win-groupheader {
-  float: none;
-}
-.win-listview > .win-vertical .win-surface.win-listlayout {
-  margin-bottom: 5px;
-}
-.win-listview .win-vertical .win-listlayout.win-headerpositionleft.win-surface {
-  display: -ms-inline-grid;
-  -ms-grid-columns: auto 1fr;
-  -ms-grid-rows: auto;
-}
-.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer {
-  -ms-grid-column: 1;
-}
-.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer {
-  -ms-grid-column: 2;
-}
-.win-listview > .win-horizontal .win-surface.win-listlayout {
-  display: -ms-inline-grid;
-  -ms-grid-columns: auto;
-  -ms-grid-rows: auto;
-  vertical-align: top;
-}
-.win-listview .win-horizontal .win-listlayout .win-itemsblock {
-  height: 100%;
-}
-.win-listview .win-horizontal .win-listlayout .win-itemscontainer {
-  margin-bottom: 24px;
-}
-.win-listview .win-horizontal .win-listlayout .win-container {
-  height: calc(100% - 10px);
-}
-.win-listview > .win-horizontal .win-surface.win-listlayout.win-headerpositiontop {
-  -ms-grid-rows: auto 1fr;
-}
-.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-groupheadercontainer {
-  -ms-grid-row: 1;
-}
-.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-itemscontainer {
-  -ms-grid-row: 2;
-}
-.win-listview .win-gridlayout.win-surface {
-  display: -ms-inline-grid;
-  vertical-align: top;
-}
-.win-listview .win-gridlayout .win-container {
-  margin: 5px;
-}
-.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-groupheadercontainer,
-.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-groupheadercontainer {
-  -ms-grid-column: 1;
-}
-.win-listview.win-groups .win-gridlayout .win-itemscontainer,
-.win-listview.win-groups .win-gridlayout .win-groupheadercontainer {
-  display: none;
-}
-.win-listview.win-groups .win-gridlayout .win-groupheadercontainer.win-laidout {
-  display: block;
-}
-.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop.win-surface {
-  -ms-grid-columns: auto;
-  -ms-grid-rows: auto 1fr;
-}
-.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-groupheadercontainer {
-  -ms-grid-row: 1;
-}
-.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-itemscontainer {
-  -ms-grid-row: 2;
-}
-.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft.win-surface {
-  -ms-grid-columns: auto;
-  -ms-grid-rows: auto;
-}
-.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-groupheadercontainer {
-  -ms-grid-row: 1;
-}
-.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-itemscontainer {
-  -ms-grid-row: 1;
-}
-.win-listview .win-vertical .win-gridlayout.win-headerpositiontop.win-surface {
-  -ms-grid-columns: auto;
-  -ms-grid-rows: auto;
-}
-.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-itemscontainer {
-  -ms-grid-column: 1;
-}
-.win-listview .win-vertical .win-gridlayout.win-headerpositionleft.win-surface {
-  -ms-grid-columns: auto 1fr;
-  -ms-grid-rows: auto;
-}
-.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-itemscontainer {
-  -ms-grid-column: 2;
-}
-.win-listview .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-}
-.win-listview .win-horizontal .win-listlayout .win-itemscontainer,
-.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer.win-laidout,
-.win-listview .win-horizontal .win-listlayout .win-itemsblock,
-.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,
-.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-line-pack: start;
-  -webkit-align-content: flex-start;
-  align-content: flex-start;
-}
-.win-listview .win-horizontal .win-itemscontainer-padder {
-  height: 100%;
-}
-.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock {
-  height: 100%;
-}
-.win-listview .win-horizontal .win-gridlayout .win-cellspanninggridlayout.win-itemscontainer.win-laidout {
-  display: -ms-grid;
-}
-.win-listview .win-vertical .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-}
-.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,
-.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-line-pack: start;
-  -webkit-align-content: flex-start;
-  align-content: flex-start;
-}
-.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock {
-  width: 100%;
-}
-.win-listview .win-cellspanninggridlayout .win-container.win-laidout {
-  display: block;
-}
-.win-listview .win-cellspanninggridlayout .win-container {
-  display: none;
-}
-.win-listview .win-itembox {
-  position: relative;
-}
-.win-listview.win-dragover .win-itembox {
-  transform: scale(0.86);
-  -webkit-transform: scale(0.86);
-}
-.win-listview .win-itembox.win-dragsource,
-.win-itemcontainer .win-itembox.win-dragsource {
-  opacity: 0.5;
-  transition: opacity cubic-bezier(0.1, 0.9, 0.2, 1) 167ms, transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;
-  -webkit-transition: opacity cubic-bezier(0.1, 0.9, 0.2, 1) 167ms, transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;
-}
-.win-listview.win-dragover .win-itembox.win-dragsource {
-  opacity: 0;
-  transition: none;
-  -webkit-transition: none;
-}
-html.win-hoverable .win-listview.win-dragover .win-container:hover {
-  outline: none;
-}
-.win-listview .win-itembox {
-  transition: transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;
-  -webkit-transition: -webkit-transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;
-}
-.win-listview.win-groups > .win-vertical .win-surface.win-listlayout.win-headerpositionleft {
-  margin-left: 70px;
-}
-.win-listview.win-groups.win-rtl > .win-vertical .win-surface.win-listlayout.win-headerpositionleft {
-  margin-left: 0px;
-  margin-right: 70px;
-}
-.win-listview > .win-horizontal .win-surface.win-listlayout {
-  margin-left: 70px;
-}
-.win-listview.win-rtl > .win-horizontal .win-surface.win-listlayout {
-  margin-left: 0px;
-  margin-right: 70px;
-}
-.win-listview .win-vertical .win-gridlayout.win-surface {
-  margin-left: 20px;
-}
-.win-listview.win-rtl .win-vertical .win-gridlayout.win-surface {
-  margin-left: 0px;
-  margin-right: 20px;
-}
-.win-itemcontainer .win-itembox,
-.win-itemcontainer.win-container {
-  position: relative;
-}
-.win-itemcontainer {
-  touch-action: pan-x pan-y pinch-zoom;
-}
-html.win-hoverable .win-listview .win-itembox:hover::before,
-html.win-hoverable .win-itemcontainer .win-itembox:hover::before {
-  opacity: 0.4;
-}
-html.win-hoverable .win-listview .win-pressed .win-itembox:hover::before,
-html.win-hoverable .win-listview .win-pressed.win-itembox:hover::before,
-html.win-hoverable .win-itemcontainer.win-pressed .win-itembox:hover::before {
-  opacity: 0.6;
-}
-html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover,
-html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover,
-html.win-hoverable .win-selectionstylefilled .win-itemcontainer.win-container:hover {
-  outline: none;
-}
-.win-selectionstylefilled.win-itemcontainer .win-itembox,
-.win-selectionstylefilled .win-itemcontainer .win-itembox,
-.win-listview.win-selectionstylefilled .win-itembox {
-  background-color: transparent;
-}
-.win-listview.win-selectionstylefilled .win-container.win-selected .win-selectionborder,
-.win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-selectionborder {
-  border-color: transparent;
-}
-.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox::after {
-  background-color: transparent;
-}
-.win-listview.win-selectionstylefilled .win-selectioncheckmarkbackground,
-.win-itemcontainer.win-selectionstylefilled .win-selectioncheckmarkbackground {
-  border-color: transparent;
-}
-.win-listview.win-selectionstylefilled .win-selected a,
-.win-listview.win-selectionstylefilled .win-selected progress,
-.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-full,
-.win-itemcontainer.win-selectionstylefilled.win-selected a,
-.win-itemcontainer.win-selectionstylefilled.win-selected progress,
-.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-full {
-  color: #ffffff;
-}
-.win-listview.win-selectionstylefilled .win-selected.win-selected a:hover:active,
-.win-itemcontainer.win-selectionstylefilled.win-selected.win-selected a:hover:active {
-  color: rgba(255, 255, 255, 0.6);
-}
-html.win-hoverable .win-listview.win-selectionstylefilled .win-selected a:hover,
-html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected a:hover {
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-listview.win-selectionstylefilled .win-selected button,
-.win-listview.win-selectionstylefilled .win-selected input[type=button],
-.win-listview.win-selectionstylefilled .win-selected input[type=reset],
-.win-listview.win-selectionstylefilled .win-selected input[type=text],
-.win-listview.win-selectionstylefilled .win-selected input[type=password],
-.win-listview.win-selectionstylefilled .win-selected input[type=email],
-.win-listview.win-selectionstylefilled .win-selected input[type=number],
-.win-listview.win-selectionstylefilled .win-selected input[type=tel],
-.win-listview.win-selectionstylefilled .win-selected input[type=url],
-.win-listview.win-selectionstylefilled .win-selected input[type=search],
-.win-listview.win-selectionstylefilled .win-selected input::-ms-check,
-.win-listview.win-selectionstylefilled .win-selected textarea,
-.win-listview.win-selectionstylefilled .win-selected .win-textarea,
-.win-listview.win-selectionstylefilled .win-selected select,
-.win-itemcontainer.win-selectionstylefilled.win-selected button,
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=button],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=reset],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=text],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=password],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=email],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=number],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=tel],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=url],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=search],
-.win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-check,
-.win-itemcontainer.win-selectionstylefilled.win-selected textarea,
-.win-itemcontainer.win-selectionstylefilled.win-selected .win-textarea,
-.win-itemcontainer.win-selectionstylefilled.win-selected select {
-  background-clip: border-box;
-  background-color: rgba(255, 255, 255, 0.8);
-  border-color: transparent;
-  color: #000000;
-}
-.win-listview.win-selectionstylefilled .win-selected button[type=submit],
-.win-listview.win-selectionstylefilled .win-selected input[type=submit],
-.win-itemcontainer.win-selectionstylefilled.win-selected button[type=submit],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=submit] {
-  border-color: #ffffff;
-}
-.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-lower,
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-lower {
-  background-color: #ffffff;
-}
-.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-thumb,
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-thumb {
-  background-color: #000000;
-}
-.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-upper,
-.win-listview.win-selectionstylefilled .win-selected progress,
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-upper,
-.win-itemcontainer.win-selectionstylefilled.win-selected progress {
-  background-color: rgba(255, 255, 255, 0.16);
-}
-.win-listview.win-selectionstylefilled .win-selected progress:indeterminate,
-.win-itemcontainer.win-selectionstylefilled.win-selected progress:indeterminate {
-  background-color: transparent;
-}
-.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-empty,
-.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-empty {
-  color: rgba(255, 255, 255, 0.16);
-}
-.win-listview .win-viewport {
-  outline: none;
-}
-@media (-ms-high-contrast) {
-  .win-listview .win-groupheader {
-    color: WindowText;
-  }
-  .win-selectioncheckmark {
-    color: HighlightText;
-  }
-  .win-listview .win-focusedoutline,
-  .win-listview .win-groupheader,
-  .win-itemcontainer .win-focusedoutline {
-    outline-color: WindowText;
-  }
-  .win-listview.win-selectionstylefilled .win-itembox,
-  .win-itemcontainer.win-selectionstylefilled .win-itembox {
-    background-color: Window;
-    color: WindowText;
-  }
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-itembox,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-itembox {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-listview.win-selectionstylefilled .win-container.win-selected .win-itembox,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-selected:hover .win-itembox,
-  .win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-itembox,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-selected:hover .win-itembox {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-listview:not(.win-selectionstylefilled) .win-container.win-selected .win-selectionborder,
-  .win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected .win-selectionborder {
-    border-color: Highlight;
-  }
-  .win-listview.win-selectionstylefilled .win-container.win-selected .win-selectionborder,
-  .win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-selectionborder {
-    border-color: transparent;
-  }
-  html.win-hoverable .win-listview:not(.win-selectionstylefilled) .win-container.win-selected:hover .win-selectionborder,
-  html.win-hoverable .win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected:hover .win-selectionborder {
-    border-color: Highlight;
-  }
-  .win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,
-  .win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-listview.win-selectionstylefilled .win-selectioncheckmarkbackground,
-  .win-itemcontainer.win-selectionstylefilled .win-selectioncheckmarkbackground {
-    border-color: transparent;
-  }
-  .win-listview.win-selectionstylefilled .win-selected a,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover a,
-  .win-listview.win-selectionstylefilled .win-selected progress,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,
-  .win-listview.win-selectionstylefilled .win-selected .win-rating .win-star:after,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star:after,
-  .win-itemcontainer.win-selectionstylefilled.win-selected a,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover a,
-  .win-itemcontainer.win-selectionstylefilled.win-selected progress,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,
-  .win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star:after,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star:after {
-    color: HighlightText;
-  }
-  .win-listview.win-selectionstylefilled .win-selected input,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input,
-  .win-listview.win-selectionstylefilled .win-selected input::-ms-check,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-check,
-  .win-listview.win-selectionstylefilled .win-selected input::-ms-value,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-value,
-  .win-listview.win-selectionstylefilled .win-selected input::-ms-track,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-track,
-  .win-listview.win-selectionstylefilled .win-selected button,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover button,
-  .win-listview.win-selectionstylefilled .win-selected progress,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,
-  .win-listview.win-selectionstylefilled .win-selected progress::-ms-fill,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress::-ms-fill,
-  .win-listview.win-selectionstylefilled .win-selected select,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover select,
-  .win-listview.win-selectionstylefilled .win-selected textarea,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover textarea,
-  .win-listview.win-selectionstylefilled.win-selected input,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input,
-  .win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-check,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-check,
-  .win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-value,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-value,
-  .win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-track,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-track,
-  .win-itemcontainer.win-selectionstylefilled.win-selected button,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover button,
-  .win-itemcontainer.win-selectionstylefilled.win-selected progress,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,
-  .win-itemcontainer.win-selectionstylefilled.win-selected progress::-ms-fill,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress::-ms-fill,
-  .win-itemcontainer.win-selectionstylefilled.win-selected select,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover select,
-  .win-itemcontainer.win-selectionstylefilled.win-selected textarea,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover textarea {
-    border-color: HighlightText;
-  }
-  .win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-lower,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input[type=range]::-ms-fill-lower,
-  .win-listview.win-selectionstylefilled .win-selected progress::-ms-fill,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress::-ms-fill,
-  .win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-lower,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input[type=range]::-ms-fill-lower,
-  .win-itemcontainer.win-selectionstylefilled.win-selected progress::-ms-fill,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress::-ms-fill {
-    background-color: HighlightText;
-  }
-  .win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-upper,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input[type=range]::-ms-fill-upper,
-  .win-listview.win-selectionstylefilled .win-selected progress,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,
-  .win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-upper,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input[type=range]::-ms-fill-upper,
-  .win-itemcontainer.win-selectionstylefilled.win-selected progress,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress {
-    background-color: Highlight;
-  }
-  .win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-full:before,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star.win-full:before,
-  .win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-full:before,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star.win-full:before {
-    color: ButtonFace;
-  }
-  .win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-empty:before,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star.win-empty:before,
-  .win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-empty:before,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star.win-empty:before {
-    color: Highlight;
-  }
-  html.win-hoverable .win-listview .win-container:hover,
-  html.win-hoverable .win-itemcontainer.win-container:hover {
-    outline: Highlight solid 3px;
-  }
-}
-.win-flipview {
-  overflow: hidden;
-  height: 400px;
-  /* Necessary for detecting element resize */
-  position: relative;
-}
-.win-flipview .win-surface {
-  -ms-scroll-chaining: none;
-}
-.win-flipview .win-navleft {
-  left: 0%;
-  top: 50%;
-  margin-top: -19px;
-}
-.win-flipview .win-navright {
-  left: 100%;
-  top: 50%;
-  margin-left: -20px;
-  margin-top: -19px;
-}
-.win-flipview .win-navtop {
-  left: 50%;
-  top: 0%;
-  margin-left: -35px;
-}
-.win-flipview .win-navbottom {
-  left: 50%;
-  top: 100%;
-  margin-left: -35px;
-  margin-top: -36px;
-}
-.win-flipview .win-navbutton {
-  touch-action: manipulation;
-  border: none;
-  width: 20px;
-  height: 36px;
-  z-index: 1;
-  position: absolute;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-size: 16px;
-  padding: 0;
-  min-width: 0;
-}
-.win-flipview .win-item,
-.win-flipview .win-item > .win-template {
-  height: 100%;
-  width: 100%;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-align: center;
-  -webkit-align-items: center;
-  align-items: center;
-  -ms-flex-pack: center;
-  -webkit-justify-content: center;
-  justify-content: center;
-}
-@media (-ms-high-contrast) {
-  .win-flipview .win-navbottom {
-    left: 50%;
-    top: 100%;
-    margin-left: -35px;
-    margin-top: -35px;
-  }
-  .win-flipview .win-navbutton {
-    background-color: ButtonFace;
-    color: ButtonText;
-    border: 2px solid ButtonText;
-    width: 65px;
-    height: 35px;
-  }
-  .win-flipview .win-navbutton.win-navbutton:hover:active,
-  .win-flipview .win-navbutton.win-navbutton:active {
-    background-color: ButtonText;
-    color: ButtonFace;
-  }
-  .win-flipview .win-navright {
-    margin-left: -65px;
-  }
-  html.win-hoverable .win-flipview .win-navbutton:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-}
-.win-datepicker {
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  height: auto;
-  width: auto;
-}
-.win-datepicker select {
-  min-width: 80px;
-  margin-top: 4px;
-  margin-bottom: 4px;
-}
-.win-datepicker .win-datepicker-month {
-  margin-right: 20px;
-}
-.win-datepicker .win-datepicker-date.win-order0,
-.win-datepicker .win-datepicker-date.win-order1 {
-  margin-right: 20px;
-}
-.win-datepicker .win-datepicker-year.win-order0 {
-  margin-right: 20px;
-}
-.win-datepicker .win-datepicker-month:lang(ar),
-.win-datepicker .win-datepicker-month:lang(dv),
-.win-datepicker .win-datepicker-month:lang(fa),
-.win-datepicker .win-datepicker-month:lang(he),
-.win-datepicker .win-datepicker-month:lang(ku-Arab),
-.win-datepicker .win-datepicker-month:lang(pa-Arab),
-.win-datepicker .win-datepicker-month:lang(prs),
-.win-datepicker .win-datepicker-month:lang(ps),
-.win-datepicker .win-datepicker-month:lang(sd-Arab),
-.win-datepicker .win-datepicker-month:lang(syr),
-.win-datepicker .win-datepicker-month:lang(ug),
-.win-datepicker .win-datepicker-month:lang(ur),
-.win-datepicker .win-datepicker-month:lang(qps-plocm),
-.win-datepicker .win-datepicker-date.win-order0:lang(ar),
-.win-datepicker .win-datepicker-date.win-order0:lang(dv),
-.win-datepicker .win-datepicker-date.win-order0:lang(fa),
-.win-datepicker .win-datepicker-date.win-order0:lang(he),
-.win-datepicker .win-datepicker-date.win-order0:lang(ku-Arab),
-.win-datepicker .win-datepicker-date.win-order0:lang(pa-Arab),
-.win-datepicker .win-datepicker-date.win-order0:lang(prs),
-.win-datepicker .win-datepicker-date.win-order0:lang(ps),
-.win-datepicker .win-datepicker-date.win-order0:lang(sd-Arab),
-.win-datepicker .win-datepicker-date.win-order0:lang(syr),
-.win-datepicker .win-datepicker-date.win-order0:lang(ug),
-.win-datepicker .win-datepicker-date.win-order0:lang(ur),
-.win-datepicker .win-datepicker-date.win-order0:lang(qps-plocm),
-.win-datepicker .win-datepicker-date.win-order1:lang(ar),
-.win-datepicker .win-datepicker-date.win-order1:lang(dv),
-.win-datepicker .win-datepicker-date.win-order1:lang(fa),
-.win-datepicker .win-datepicker-date.win-order1:lang(he),
-.win-datepicker .win-datepicker-date.win-order1:lang(ku-Arab),
-.win-datepicker .win-datepicker-date.win-order1:lang(pa-Arab),
-.win-datepicker .win-datepicker-date.win-order1:lang(prs),
-.win-datepicker .win-datepicker-date.win-order1:lang(ps),
-.win-datepicker .win-datepicker-date.win-order1:lang(sd-Arab),
-.win-datepicker .win-datepicker-date.win-order1:lang(syr),
-.win-datepicker .win-datepicker-date.win-order1:lang(ug),
-.win-datepicker .win-datepicker-date.win-order1:lang(ur),
-.win-datepicker .win-datepicker-date.win-order1:lang(qps-plocm),
-.win-datepicker .win-datepicker-year.win-order0:lang(ar),
-.win-datepicker .win-datepicker-year.win-order0:lang(dv),
-.win-datepicker .win-datepicker-year.win-order0:lang(fa),
-.win-datepicker .win-datepicker-year.win-order0:lang(he),
-.win-datepicker .win-datepicker-year.win-order0:lang(ku-Arab),
-.win-datepicker .win-datepicker-year.win-order0:lang(pa-Arab),
-.win-datepicker .win-datepicker-year.win-order0:lang(prs),
-.win-datepicker .win-datepicker-year.win-order0:lang(ps),
-.win-datepicker .win-datepicker-year.win-order0:lang(sd-Arab),
-.win-datepicker .win-datepicker-year.win-order0:lang(syr),
-.win-datepicker .win-datepicker-year.win-order0:lang(ug),
-.win-datepicker .win-datepicker-year.win-order0:lang(ur),
-.win-datepicker .win-datepicker-year.win-order0:lang(qps-plocm) {
-  margin-right: 0;
-  margin-left: 20px;
-}
-.win-timepicker {
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  height: auto;
-  width: auto;
-}
-.win-timepicker select {
-  min-width: 80px;
-  margin-top: 4px;
-  margin-bottom: 4px;
-}
-.win-timepicker .win-timepicker-hour {
-  margin-right: 20px;
-}
-.win-timepicker .win-timepicker-period.win-order0 {
-  margin-right: 20px;
-}
-.win-timepicker .win-timepicker-minute.win-order1 {
-  margin-right: 20px;
-}
-.win-timepicker .win-timepicker-period.win-order0:lang(ar),
-.win-timepicker .win-timepicker-period.win-order0:lang(dv),
-.win-timepicker .win-timepicker-period.win-order0:lang(fa),
-.win-timepicker .win-timepicker-period.win-order0:lang(he),
-.win-timepicker .win-timepicker-period.win-order0:lang(ku-Arab),
-.win-timepicker .win-timepicker-period.win-order0:lang(pa-Arab),
-.win-timepicker .win-timepicker-period.win-order0:lang(prs),
-.win-timepicker .win-timepicker-period.win-order0:lang(ps),
-.win-timepicker .win-timepicker-period.win-order0:lang(sd-Arab),
-.win-timepicker .win-timepicker-period.win-order0:lang(syr),
-.win-timepicker .win-timepicker-period.win-order0:lang(ug),
-.win-timepicker .win-timepicker-period.win-order0:lang(ur),
-.win-timepicker .win-timepicker-period.win-order0:lang(qps-plocm),
-.win-timepicker .win-timepicker-hour:lang(ar),
-.win-timepicker .win-timepicker-hour:lang(dv),
-.win-timepicker .win-timepicker-hour:lang(fa),
-.win-timepicker .win-timepicker-hour:lang(he),
-.win-timepicker .win-timepicker-hour:lang(ku-Arab),
-.win-timepicker .win-timepicker-hour:lang(pa-Arab),
-.win-timepicker .win-timepicker-hour:lang(prs),
-.win-timepicker .win-timepicker-hour:lang(ps),
-.win-timepicker .win-timepicker-hour:lang(sd-Arab),
-.win-timepicker .win-timepicker-hour:lang(syr),
-.win-timepicker .win-timepicker-hour:lang(ug),
-.win-timepicker .win-timepicker-hour:lang(ur),
-.win-timepicker .win-timepicker-hour:lang(qps-plocm) {
-  margin-right: 0;
-  margin-left: 20px;
-}
-.win-timepicker .win-timepicker-minute.win-order1:lang(ar),
-.win-timepicker .win-timepicker-minute.win-order1:lang(dv),
-.win-timepicker .win-timepicker-minute.win-order1:lang(fa),
-.win-timepicker .win-timepicker-minute.win-order1:lang(he),
-.win-timepicker .win-timepicker-minute.win-order1:lang(ku-Arab),
-.win-timepicker .win-timepicker-minute.win-order1:lang(pa-Arab),
-.win-timepicker .win-timepicker-minute.win-order1:lang(prs),
-.win-timepicker .win-timepicker-minute.win-order1:lang(ps),
-.win-timepicker .win-timepicker-minute.win-order1:lang(sd-Arab),
-.win-timepicker .win-timepicker-minute.win-order1:lang(syr),
-.win-timepicker .win-timepicker-minute.win-order1:lang(ug),
-.win-timepicker .win-timepicker-minute.win-order1:lang(ur),
-.win-timepicker .win-timepicker-minute.win-order1:lang(qps-plocm),
-.win-timepicker .win-timepicker-minute.win-order0:lang(ar),
-.win-timepicker .win-timepicker-minute.win-order0:lang(dv),
-.win-timepicker .win-timepicker-minute.win-order0:lang(fa),
-.win-timepicker .win-timepicker-minute.win-order0:lang(he),
-.win-timepicker .win-timepicker-minute.win-order0:lang(ku-Arab),
-.win-timepicker .win-timepicker-minute.win-order0:lang(pa-Arab),
-.win-timepicker .win-timepicker-minute.win-order0:lang(prs),
-.win-timepicker .win-timepicker-minute.win-order0:lang(ps),
-.win-timepicker .win-timepicker-minute.win-order0:lang(sd-Arab),
-.win-timepicker .win-timepicker-minute.win-order0:lang(syr),
-.win-timepicker .win-timepicker-minute.win-order0:lang(ug),
-.win-timepicker .win-timepicker-minute.win-order0:lang(ur),
-.win-timepicker .win-timepicker-minute.win-order0:lang(qps-plocm) {
-  margin-left: 20px;
-  margin-right: 0;
-}
-body > .win-navigation-backbutton {
-  position: absolute;
-  top: 50px;
-  left: 20px;
-}
-.win-backbutton,
-.win-navigation-backbutton,
-.win-back {
-  touch-action: manipulation;
-  display: inline-block;
-  min-width: 0;
-  min-height: 0;
-  padding: 0;
-  text-align: center;
-  width: 41px;
-  height: 41px;
-  font-size: 24px;
-  line-height: 41px;
-  vertical-align: baseline;
-}
-.win-backbutton::before,
-.win-back::before {
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-weight: normal;
-  content: "\E0D5";
-  vertical-align: 50%;
-}
-.win-backbutton:lang(ar)::before,
-.win-backbutton:lang(dv)::before,
-.win-backbutton:lang(fa)::before,
-.win-backbutton:lang(he)::before,
-.win-backbutton:lang(ku-Arab)::before,
-.win-backbutton:lang(pa-Arab)::before,
-.win-backbutton:lang(prs)::before,
-.win-backbutton:lang(ps)::before,
-.win-backbutton:lang(sd-Arab)::before,
-.win-backbutton:lang(syr)::before,
-.win-backbutton:lang(ug)::before,
-.win-backbutton:lang(ur)::before,
-.win-backbutton:lang(qps-plocm)::before,
-.win-back:lang(ar)::before,
-.win-back:lang(dv)::before,
-.win-back:lang(fa)::before,
-.win-back:lang(he)::before,
-.win-back:lang(ku-Arab)::before,
-.win-back:lang(pa-Arab)::before,
-.win-back:lang(prs)::before,
-.win-back:lang(ps)::before,
-.win-back:lang(sd-Arab)::before,
-.win-back:lang(syr)::before,
-.win-back:lang(ug)::before,
-.win-back:lang(ur)::before,
-.win-back:lang(qps-plocm)::before {
-  content: "\E0AE";
-}
-button.win-navigation-backbutton,
-button.win-navigation-backbutton:active,
-html.win-hoverable button.win-navigation-backbutton:enabled:hover,
-button.win-navigation-backbutton:enabled:hover:active {
-  background-color: transparent;
-  border: none;
-}
-@media (-ms-high-contrast) {
-  button.win-navigation-backbutton,
-  button.win-navigation-backbutton:active,
-  html.win-hoverable button.win-navigation-backbutton:enabled:hover,
-  button.win-navigation-backbutton:enabled:hover:active {
-    /* Overwrite default background and border styles from BackButton control's <button> element */
-    background-color: transparent;
-    border: none;
-  }
-  .win-backbutton,
-  .win-back {
-    background-color: ButtonFace;
-    border-color: ButtonText;
-    color: ButtonText;
-  }
-  .win-backbutton.win-backbutton:enabled:hover:active,
-  .win-navigation-backbutton.win-navigation-backbutton:enabled:hover:active .win-back {
-    background-clip: border-box;
-    background-color: ButtonText;
-    border-color: transparent;
-    color: ButtonFace;
-  }
-  .win-backbutton:disabled,
-  .win-navigation-backbutton:disabled .win-back,
-  .win-backbutton:disabled:active,
-  .win-navigation-backbutton:disabled:active .win-back {
-    background-color: ButtonFace;
-    border-color: GrayText;
-    color: GrayText;
-  }
-  .win-backbutton:-ms-keyboard-active,
-  .win-navigation-backbutton:-ms-keyboard-active .win-back {
-    background-clip: border-box;
-    background-color: ButtonText;
-    border-color: transparent;
-    color: ButtonFace;
-  }
-  html.win-hoverable .win-backbutton:enabled:hover,
-  html.win-hoverable .win-navigation-backbutton:enabled:hover .win-back {
-    background-color: Highlight;
-    border-color: ButtonText;
-    color: HighlightText;
-  }
-}
-.win-tooltip {
-  display: block;
-  position: fixed;
-  top: 30px;
-  left: 30px;
-  max-width: 320px;
-  box-sizing: border-box;
-  margin: 0;
-  padding: 4px 7px 6px 7px;
-  border-style: solid;
-  border-width: 1px;
-  z-index: 9999;
-  word-wrap: break-word;
-  animation-fill-mode: both;
-  font-size: 12px;
-  font-weight: 400;
-  line-height: 1.167;
-}
-.win-tooltip-phantom {
-  display: block;
-  position: fixed;
-  top: 30px;
-  left: 30px;
-  background-color: transparent;
-  border-width: 0;
-  margin: 0;
-  padding: 0;
-}
-@media (-ms-high-contrast) {
-  .win-tooltip {
-    background-color: Window;
-    border-color: WindowText;
-    color: WindowText;
-  }
-}
-.win-rating {
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  -ms-flex-pack: self;
-  -webkit-justify-content: self;
-  justify-content: self;
-  -ms-flex-align: stretch;
-  -webkit-align-items: stretch;
-  align-items: stretch;
-  height: auto;
-  width: auto;
-  white-space: normal;
-  outline: 0;
-}
-.win-rating .win-star {
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  height: 24px;
-  width: 24px;
-  padding: 9px 10px 11px 10px;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-size: 24px;
-  overflow: hidden;
-  text-indent: 0;
-  line-height: 1;
-  cursor: default;
-  position: relative;
-  letter-spacing: 0;
-  -ms-touch-action: none;
-  touch-action: none;
-}
-.win-rating.win-small .win-star {
-  width: 12px;
-  height: 12px;
-  font-size: 12px;
-  padding: 3px 4px 5px 4px;
-}
-.win-rating .win-star:before {
-  content: "\E082";
-}
-.win-rating .win-star.win-disabled {
-  cursor: default;
-  -ms-touch-action: auto;
-  touch-action: auto;
-}
-@media (-ms-high-contrast) {
-  .win-rating .win-star:before {
-    content: "\E082" !important;
-  }
-  .win-rating .win-star.win-full {
-    color: HighLight;
-  }
-  .win-rating .win-star.win-tentative.win-full {
-    color: ButtonText;
-  }
-  .win-rating .win-star.win-empty {
-    color: ButtonFace;
-  }
-  .win-rating .win-star:after {
-    content: "\E224" !important;
-    position: relative;
-    top: -100%;
-    color: ButtonText;
-  }
-}
-.win-toggleswitch {
-  outline: 0;
-}
-.win-toggleswitch .win-toggleswitch-header {
-  max-width: 470px;
-  margin-bottom: 14px;
-  margin-top: 22px;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-toggleswitch .win-toggleswitch-values {
-  display: inline-block;
-  vertical-align: top;
-}
-.win-toggleswitch .win-toggleswitch-value {
-  margin-left: 12px;
-  height: 20px;
-  vertical-align: top;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 20px;
-}
-.win-toggleswitch .win-toggleswitch-description {
-  font-size: 12px;
-  width: 22em;
-  margin-top: 28px;
-  display: none;
-}
-.win-toggleswitch .win-toggleswitch-clickregion {
-  display: inline-block;
-  touch-action: none;
-  -ms-user-select: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  user-select: none;
-  padding-top: 5px;
-}
-.win-toggleswitch .win-toggleswitch-track {
-  position: relative;
-  display: inline-block;
-  width: 44px;
-  height: 20px;
-  border-style: solid;
-  border-width: 2px;
-  border-radius: 10px;
-  box-sizing: border-box;
-}
-.win-toggleswitch .win-toggleswitch-thumb {
-  position: absolute;
-  top: 3px;
-  display: inline-block;
-  width: 10px;
-  height: 10px;
-  border-radius: 5px;
-  -webkit-transition: left 0.1s;
-  transition: left 0.1s;
-}
-.win-toggleswitch:focus .win-toggleswitch-clickregion {
-  outline-width: 1px;
-  outline-style: dotted;
-}
-.win-toggleswitch.win-toggleswitch-dragging .win-toggleswitch-thumb {
-  -webkit-transition: none;
-  transition: none;
-}
-.win-toggleswitch.win-toggleswitch-off .win-toggleswitch-value-on {
-  visibility: hidden;
-  height: 0;
-  font-size: 0;
-  line-height: 0;
-}
-.win-toggleswitch.win-toggleswitch-on .win-toggleswitch-value-off {
-  visibility: hidden;
-  height: 0;
-  font-size: 0;
-  line-height: 0;
-}
-.win-toggleswitch.win-toggleswitch-on .win-toggleswitch-thumb {
-  left: 27px;
-}
-.win-toggleswitch.win-toggleswitch-off .win-toggleswitch-thumb {
-  left: 3px;
-}
-.win-toggleswitch:lang(ar),
-.win-toggleswitch:lang(dv),
-.win-toggleswitch:lang(fa),
-.win-toggleswitch:lang(he),
-.win-toggleswitch:lang(ku-Arab),
-.win-toggleswitch:lang(pa-Arab),
-.win-toggleswitch:lang(prs),
-.win-toggleswitch:lang(ps),
-.win-toggleswitch:lang(sd-Arab),
-.win-toggleswitch:lang(syr),
-.win-toggleswitch:lang(ug),
-.win-toggleswitch:lang(ur),
-.win-toggleswitch:lang(qps-plocm) {
-  direction: rtl;
-}
-.win-toggleswitch:lang(ar).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(dv).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(fa).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(he).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ku-Arab).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(pa-Arab).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(prs).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ps).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(sd-Arab).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(syr).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ug).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ur).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(qps-plocm).win-toggleswitch-on .win-toggleswitch-thumb {
-  left: 3px;
-}
-.win-toggleswitch:lang(ar).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(dv).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(fa).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(he).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ku-Arab).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(pa-Arab).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(prs).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ps).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(sd-Arab).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(syr).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ug).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ur).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(qps-plocm).win-toggleswitch-off .win-toggleswitch-thumb {
-  left: 27px;
-}
-.win-semanticzoom {
-  touch-action: pan-x pan-y double-tap-zoom;
-  height: 400px;
-  /* Necessary to detect element resize */
-  position: relative;
-}
-.win-semanticzoom .win-listview > .win-viewport * {
-  touch-action: auto;
-}
-.win-semanticzoom * {
-  touch-action: inherit;
-}
-.win-semanticzoom-button {
-  z-index: 100;
-  position: absolute;
-  min-width: 25px;
-  min-height: 25px;
-  width: 25px;
-  height: 25px;
-  padding: 0px;
-  bottom: 21px;
-  touch-action: none;
-}
-.win-semanticzoom-button::before {
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-weight: normal;
-  font-size: 11px;
-  content: "\E0B8";
-  /* minus sign */
-}
-.win-semanticzoom-button-location {
-  left: auto;
-  right: 4px;
-}
-.win-semanticzoom-button-location:lang(ar),
-.win-semanticzoom-button-location:lang(dv),
-.win-semanticzoom-button-location:lang(fa),
-.win-semanticzoom-button-location:lang(he),
-.win-semanticzoom-button-location:lang(ku-Arab),
-.win-semanticzoom-button-location:lang(pa-Arab),
-.win-semanticzoom-button-location:lang(prs),
-.win-semanticzoom-button-location:lang(ps),
-.win-semanticzoom-button-location:lang(sd-Arab),
-.win-semanticzoom-button-location:lang(syr),
-.win-semanticzoom-button-location:lang(ug),
-.win-semanticzoom-button-location:lang(ur),
-.win-semanticzoom-button-location:lang(qps-plocm) {
-  left: 4px;
-  right: auto;
-}
-@media (-ms-high-contrast) {
-  .win-semanticzoom-button {
-    background-color: ButtonFace;
-    border-color: ButtonText;
-    color: ButtonText;
-  }
-  .win-semanticzoom-button.win-semanticzoom-button:hover:active {
-    background-clip: border-box;
-    background-color: ButtonText;
-    border-color: transparent;
-    color: ButtonFace;
-  }
-  .win-semanticzoom-button:-ms-keyboard-active {
-    background-clip: border-box;
-    background-color: ButtonText;
-    border-color: transparent;
-    color: ButtonFace;
-  }
-  html.win-hoverable .win-semanticzoom-button:hover {
-    background-color: Highlight;
-    border-color: ButtonText;
-    color: HighlightText;
-  }
-}
-.win-pivot {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-wrap: none;
-  -webkit-flex-wrap: nowrap;
-  flex-wrap: nowrap;
-  height: 100%;
-  width: 100%;
-  overflow: hidden;
-  -ms-scroll-limit-x-max: 0px;
-  touch-action: manipulation;
-  /* Necessary for detecting when this element has resized */
-  position: relative;
-}
-.win-pivot .win-pivot-navbutton {
-  touch-action: manipulation;
-  position: absolute;
-  width: 20px;
-  height: 36px;
-  padding: 0px;
-  margin: 0px;
-  top: 10px;
-  min-width: 0px;
-  border-width: 0px;
-  cursor: pointer;
-  opacity: 0;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-}
-.win-pivot .win-pivot-headers.win-pivot-shownavbuttons .win-pivot-navbutton {
-  opacity: 1;
-}
-.win-pivot .win-pivot-headers .win-pivot-navbutton-prev:before {
-  content: "\E096";
-}
-.win-pivot .win-pivot-headers .win-pivot-navbutton-next:before {
-  content: "\E09B";
-}
-.win-pivot .win-pivot-title {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  font-family: "Segoe UI", sans-serif, "Segoe MDL2 Assets", "Symbols", "Segoe UI Emoji";
-  font-size: 15px;
-  font-weight: bold;
-  white-space: nowrap;
-  margin: 14px 0 13px 24px;
-}
-.win-pivot .win-pivot-title:lang(ar),
-.win-pivot .win-pivot-title:lang(dv),
-.win-pivot .win-pivot-title:lang(fa),
-.win-pivot .win-pivot-title:lang(he),
-.win-pivot .win-pivot-title:lang(ku-Arab),
-.win-pivot .win-pivot-title:lang(pa-Arab),
-.win-pivot .win-pivot-title:lang(prs),
-.win-pivot .win-pivot-title:lang(ps),
-.win-pivot .win-pivot-title:lang(sd-Arab),
-.win-pivot .win-pivot-title:lang(syr),
-.win-pivot .win-pivot-title:lang(ug),
-.win-pivot .win-pivot-title:lang(ur),
-.win-pivot .win-pivot-title:lang(qps-plocm) {
-  margin: 14px 24px 13px 0;
-}
-.win-pivot > .win-pivot-item {
-  /*
-        Hide the pivot items defined declaratively until we reparent them to ensure correct
-        measuring and to avoid showing unprocessed content in the wrong location.
-        */
-  display: none;
-}
-.win-pivot .win-pivot-header-area {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-}
-.win-pivot .win-pivot-header-leftcustom,
-.win-pivot .win-pivot-header-rightcustom {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  margin-top: 13px;
-}
-.win-pivot .win-pivot-header-items {
-  -ms-flex: 1 1 0%;
-  -webkit-flex: 1 1 0%;
-  flex: 1 1 0%;
-  overflow-x: hidden;
-  padding: 1px;
-}
-.win-pivot .win-pivot-headers {
-  white-space: nowrap;
-  position: relative;
-  overflow-y: visible;
-  height: 48px;
-  touch-action: none;
-  -ms-touch-action: none;
-  outline: 0;
-}
-.win-pivot .win-pivot-headers.win-keyboard:focus {
-  outline-style: dotted;
-  outline-width: 1px;
-}
-.win-pivot .win-pivot-header,
-.win-pivot .win-pivot-header.win-pivot-header:hover:active {
-  touch-action: manipulation;
-  font-size: 24px;
-  font-weight: 300;
-  line-height: 1.167;
-  display: inline-block;
-  transition: opacity linear 167ms;
-  -webkit-transition: opacity linear 167ms;
-  overflow: hidden;
-  height: 30px;
-  border: 0;
-  padding: 0;
-  outline: 0;
-  margin: 12px 12px 0px 12px;
-  min-height: 0;
-  min-width: 0;
-}
-.win-pivot.win-pivot-locked .win-pivot-header {
-  opacity: 0;
-  visibility: hidden;
-}
-.win-pivot .win-pivot-header.win-pivot-header-selected,
-.win-pivot.win-pivot-locked .win-pivot-header.win-pivot-header-selected {
-  opacity: 1.0;
-  visibility: inherit;
-}
-.win-pivot .win-pivot-viewport {
-  /* Overlap the headers but not the title */
-  height: 100%;
-  overflow-x: auto;
-  overflow-y: hidden;
-  -ms-scroll-snap-type: mandatory;
-  -ms-scroll-snap-points-x: snapInterval(0%, 100%);
-  -ms-overflow-style: none;
-  /* The following 3 styles take advantage of a Trident bug to make the viewport pannable on the header track. The viewport is extended over the
-            header track space, and position: relative allows interacting with it as if the viewport was drawn over the header track.
-        */
-  position: relative;
-  padding-top: 48px;
-  margin-top: -48px;
-}
-.win-pivot.win-pivot-customheaders .win-pivot-viewport {
-  padding-top: inherit;
-  margin-top: inherit;
-}
-.win-pivot.win-pivot-mouse .win-pivot-viewport {
-  padding-top: 0px;
-  margin-top: 0px;
-}
-.win-pivot.win-pivot-locked .win-pivot-viewport {
-  overflow: hidden;
-}
-.win-pivot .win-pivot-surface {
-  /* Surface is 3x of viewport to allow panning. */
-  width: 300%;
-  height: 100%;
-  position: relative;
-}
-html.win-hoverable .win-pivot button.win-pivot-header:hover {
-  background-color: transparent;
-  border: 0;
-  padding: 0;
-  letter-spacing: 0px;
-  margin: 12px 12px 0px 12px;
-  min-height: 0;
-  min-width: 0;
-}
-html.win-hoverable .win-pivot .win-pivot-navbutton:hover {
-  margin: 0px;
-  padding: 0px;
-  border-width: 0px;
-  cursor: pointer;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-}
-/*
-    PivotItem
-*/
-.win-pivot-item {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  /* Since the surface is 3x in width, 33.3% here means the size of the viewport. */
-  width: 33.3%;
-  left: 33.3%;
-}
-.win-pivot-item:lang(ar),
-.win-pivot-item:lang(dv),
-.win-pivot-item:lang(fa),
-.win-pivot-item:lang(he),
-.win-pivot-item:lang(ku-Arab),
-.win-pivot-item:lang(pa-Arab),
-.win-pivot-item:lang(prs),
-.win-pivot-item:lang(ps),
-.win-pivot-item:lang(sd-Arab),
-.win-pivot-item:lang(syr),
-.win-pivot-item:lang(ug),
-.win-pivot-item:lang(ur),
-.win-pivot-item:lang(qps-plocm) {
-  left: auto;
-  right: 33.3%;
-}
-.win-pivot-item .win-pivot-item-content {
-  height: 100%;
-  overflow-y: auto;
-  -ms-overflow-style: -ms-autohiding-scrollbar;
-  padding: 0px 24px;
-}
-/*
-    Modified styles for when the Pivot is in nosnap mode
-*/
-.win-pivot.win-pivot-nosnap .win-pivot-viewport {
-  padding-top: 0px;
-  margin-top: 0px;
-  overflow: hidden;
-}
-.win-pivot.win-pivot-nosnap .win-pivot-surface,
-.win-pivot.win-pivot-nosnap .win-pivot-item {
-  width: 100%;
-  position: static;
-}
-.win-hub {
-  height: 100%;
-  width: 100%;
-  /* Necessary for detecting when this element has resized */
-  position: relative;
-}
-.win-hub-progress {
-  position: absolute;
-  top: 10px;
-  width: 100%;
-  z-index: 1;
-}
-.win-hub-viewport {
-  height: 100%;
-  width: 100%;
-  -ms-scroll-snap-type: proximity;
-  -webkit-overflow-scrolling: touch;
-}
-.win-hub-horizontal .win-hub-viewport {
-  overflow-x: auto;
-  overflow-y: hidden;
-  white-space: nowrap;
-}
-.win-hub-vertical .win-hub-viewport {
-  position: relative;
-  overflow-y: auto;
-  overflow-x: hidden;
-}
-.win-hub-surface {
-  display: inline-block;
-}
-.win-hub-vertical .win-hub-surface {
-  width: calc(100% - 24px);
-  padding: 0px 12px 8px 12px;
-  margin-top: -24px;
-  /* Keep in sync w/ hub-section padding-top */
-}
-.win-hub-horizontal .win-hub-surface {
-  height: 100%;
-  padding-left: 12px;
-}
-.win-hub-horizontal .win-hub-surface:lang(ar),
-.win-hub-horizontal .win-hub-surface:lang(dv),
-.win-hub-horizontal .win-hub-surface:lang(fa),
-.win-hub-horizontal .win-hub-surface:lang(he),
-.win-hub-horizontal .win-hub-surface:lang(ku-Arab),
-.win-hub-horizontal .win-hub-surface:lang(pa-Arab),
-.win-hub-horizontal .win-hub-surface:lang(prs),
-.win-hub-horizontal .win-hub-surface:lang(ps),
-.win-hub-horizontal .win-hub-surface:lang(sd-Arab),
-.win-hub-horizontal .win-hub-surface:lang(syr),
-.win-hub-horizontal .win-hub-surface:lang(ug),
-.win-hub-horizontal .win-hub-surface:lang(ur),
-.win-hub-horizontal .win-hub-surface:lang(qps-plocm) {
-  padding-left: 0;
-  padding-right: 12px;
-}
-.win-hub-section {
-  display: inline-block;
-  vertical-align: top;
-  white-space: normal;
-}
-.win-hub-horizontal .win-hub-section {
-  height: 100%;
-  padding-right: 24px;
-}
-.win-hub-horizontal .win-hub-section:lang(ar),
-.win-hub-horizontal .win-hub-section:lang(dv),
-.win-hub-horizontal .win-hub-section:lang(fa),
-.win-hub-horizontal .win-hub-section:lang(he),
-.win-hub-horizontal .win-hub-section:lang(ku-Arab),
-.win-hub-horizontal .win-hub-section:lang(pa-Arab),
-.win-hub-horizontal .win-hub-section:lang(prs),
-.win-hub-horizontal .win-hub-section:lang(ps),
-.win-hub-horizontal .win-hub-section:lang(sd-Arab),
-.win-hub-horizontal .win-hub-section:lang(syr),
-.win-hub-horizontal .win-hub-section:lang(ug),
-.win-hub-horizontal .win-hub-section:lang(ur),
-.win-hub-horizontal .win-hub-section:lang(qps-plocm) {
-  padding-right: 0;
-  padding-left: 24px;
-}
-.win-hub-horizontal .win-hub-section-header {
-  margin-top: 62px;
-}
-.win-hub-vertical .win-hub-section {
-  width: 100%;
-  padding-top: 24px;
-  /* Keep in sync w/ hub-surface margin-top */
-}
-.win-hub-section-header {
-  margin-bottom: 9px;
-  height: 28px;
-}
-button.win-hub-section-header-tabstop,
-html.win-hoverable button.win-hub-section-header-tabstop:hover,
-button.win-hub-section-header-tabstop:hover:active {
-  touch-action: manipulation;
-  width: 100%;
-  background-color: transparent;
-  border: 0;
-  min-height: 0;
-  min-width: 0;
-  max-width: 100%;
-  padding: 0;
-}
-button.win-hub-section-header-tabstop:focus {
-  outline: none;
-}
-button.win-hub-section-header-tabstop:-ms-keyboard-active {
-  background-color: transparent;
-}
-.win-hub-section-header-wrapper {
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-align: stretch;
-  -webkit-align-items: stretch;
-  align-items: stretch;
-  width: 100%;
-  outline: none;
-}
-.win-hub-section-header-content {
-  font-size: 20px;
-  font-weight: 400;
-  line-height: 1.5;
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  text-align: left;
-  vertical-align: bottom;
-  overflow: hidden;
-  text-overflow: clip;
-  white-space: nowrap;
-}
-.win-hub-section-header-content:lang(ar),
-.win-hub-section-header-content:lang(dv),
-.win-hub-section-header-content:lang(fa),
-.win-hub-section-header-content:lang(he),
-.win-hub-section-header-content:lang(ku-Arab),
-.win-hub-section-header-content:lang(pa-Arab),
-.win-hub-section-header-content:lang(prs),
-.win-hub-section-header-content:lang(ps),
-.win-hub-section-header-content:lang(sd-Arab),
-.win-hub-section-header-content:lang(syr),
-.win-hub-section-header-content:lang(ug),
-.win-hub-section-header-content:lang(ur),
-.win-hub-section-header-content:lang(qps-plocm) {
-  text-align: right;
-}
-.win-hub-section-header-chevron {
-  display: none;
-}
-.win-hub-section-header-interactive .win-hub-section-header-chevron {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  display: inline-block;
-  margin-left: 24px;
-  line-height: 1.5;
-  padding-top: 7px;
-  text-align: right;
-  vertical-align: bottom;
-}
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ar),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(dv),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(fa),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(he),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ku-Arab),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(pa-Arab),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(prs),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ps),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(sd-Arab),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(syr),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ug),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ur),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(qps-plocm) {
-  text-align: left;
-  margin-left: 0;
-  margin-right: 24px;
-}
-.win-hub-horizontal .win-hub-section-content {
-  height: calc(100% - 99px);
-}
-.win-hub-vertical .win-hub-section-content {
-  width: 100%;
-}
-@media (-ms-high-contrast) {
-  button.win-hub-section-header-tabstop,
-  html.win-hoverable button.win-hub-section-header-tabstop:hover,
-  button.win-hub-section-header-tabstop:hover:active {
-    background-color: transparent;
-    color: WindowText;
-  }
-  button.win-hub-section-header-tabstop:-ms-keyboard-active {
-    color: WindowText;
-  }
-  html.win-hoverable button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover,
-  button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover:active {
-    color: -ms-hotlight;
-  }
-  button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active {
-    color: -ms-hotlight;
-  }
-}
-.win-clickeater {
-  background-color: transparent;
-  width: 110%;
-  height: 110%;
-  left: -5%;
-  top: -5%;
-  position: fixed;
-  touch-action: none;
-  outline: 1px solid Purple;
-  /*Necessary to block passthrough over webviews*/
-  -ms-high-contrast-adjust: none;
-}
-/*
-Command buttons.
-*/
-button.win-command {
-  touch-action: manipulation;
-  background: none;
-  background-clip: border-box;
-  height: auto;
-  padding: 0;
-  margin: 0;
-  border: 1px dotted;
-  /* reserve focus rect */
-  min-width: 40px;
-  min-height: 48px;
-  text-align: center;
-  font-size: 12px;
-  line-height: 16px;
-  font-weight: normal;
-  overflow: visible;
-  /* Commands are lrtb */
-  writing-mode: lr-tb;
-  position: relative;
-  z-index: 0;
-}
-button.win-command::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-button:lang(ar),
-button:lang(dv),
-button:lang(fa),
-button:lang(he),
-button:lang(ku-Arab),
-button:lang(pa-Arab),
-button:lang(prs),
-button:lang(ps),
-button:lang(sd-Arab),
-button:lang(syr),
-button:lang(ug),
-button:lang(ur),
-button:lang(qps-plocm) {
-  writing-mode: rl-tb;
-}
-/*
-Always hide the outline, not just when :focus is applied.
-https://github.com/winjs/winjs/issues/859
-*/
-button.win-command {
-  outline: none;
-}
-/*
-Command button icons.
-*/
-.win-commandicon {
-  display: block;
-  margin: 11px 21px;
-  /* left/right margin: 22px = 1px focus rect + 21px. Affects margin-top of  button.win-command .win-label */
-  min-width: 0;
-  min-height: 0;
-  padding: 0;
-  /* Normal sizing */
-  width: 24px;
-  height: 24px;
-  box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  cursor: default;
-  position: relative;
-  outline: none;
-}
-.win-commandimage {
-  /* Default font for glyphs. */
-  font-family: "Segoe UI Command", "Symbols";
-  letter-spacing: 0;
-  /* Applications provide their own content, like &#xE0D5;. */
-  vertical-align: middle;
-  font-size: 20px;
-  margin: 0;
-  line-height: 24px;
-  /* line-height must match the content box height */
-  background-position: 0 0;
-  background-origin: border-box;
-  display: inline-block;
-  width: 24px;
-  height: 24px;
-  background-size: 96px 48px;
-  outline: none;
-}
-.win-commandimage.win-commandglyph {
-  position: absolute;
-  left: 0;
-}
-/*
-Offsets for sprite versions.
-*/
-html.win-hoverable button:enabled:hover .win-commandimage,
-button:active .win-commandimage {
-  background-position: -24px 0;
-}
-button:enabled:hover:active .win-commandimage.win-commandimage {
-  background-position: -48px 0;
-}
-button:-ms-keyboard-active .win-commandimage {
-  background-position: -48px 0;
-}
-button:disabled .win-commandimage,
-button:disabled:active .win-commandimage {
-  background-position: -72px 0;
-}
-/*
-Offsets for sprite versions in selected state.
-*/
-button[aria-checked=true] .win-commandimage {
-  background-position: 0 -24px;
-}
-html.win-hoverable button[aria-checked=true]:enabled:hover .win-commandimage,
-button[aria-checked=true]:active .win-commandimage {
-  background-position: -24px -24px;
-}
-button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {
-  background-position: -48px -24px;
-}
-button[aria-checked=true]:-ms-keyboard-active .win-commandimage {
-  background-position: -48px -24px;
-}
-button[aria-checked=true]:disabled .win-commandimage,
-button[aria-checked=true]:disabled:active .win-commandimage {
-  background-position: -72px -24px;
-}
-/*
-Command button labels.
-*/
-button.win-command .win-label {
-  font-family: "Segoe UI", sans-serif, "Segoe MDL2 Assets", "Symbols", "Segoe UI Emoji";
-  font-size: 12px;
-  font-weight: 400;
-  line-height: 1.167;
-  position: relative;
-  line-height: 16px;
-  display: block;
-  max-width: 66px;
-  /* 68px button, but allow for 2*1px for focus border on each side */
-  margin-top: -10px;
-  /* 2px = 12px margin-bottom of .win-commandicon  - 10px*/
-  margin-bottom: 6px;
-  padding: 0;
-  overflow: hidden;
-  word-wrap: break-word;
-  word-break: keep-all;
-  outline: none;
-}
-/*
-AppBarCommand separator types.
-*/
-hr.win-command {
-  display: inline-block;
-  padding: 0;
-  margin: 12px 16px;
-  width: 2px;
-  height: 24px;
-  border: 0;
-  vertical-align: top;
-}
-/*
-AppBarCommand content types.
-*/
-div.win-command {
-  display: inline-block;
-  min-width: 0;
-  min-height: 0;
-  padding: 0px 31px;
-  border: 1px dotted;
-  /* reserve focus rect */
-  text-align: center;
-  font-size: 12px;
-  line-height: 16px;
-  font-weight: normal;
-  vertical-align: top;
-  /* Content Commands are lrtb */
-  writing-mode: lr-tb;
-  position: relative;
-}
-div.win-command:lang(ar),
-div.win-command:lang(dv),
-div.win-command:lang(fa),
-div.win-command:lang(he),
-div.win-command:lang(ku-Arab),
-div.win-command:lang(pa-Arab),
-div.win-command:lang(prs),
-div.win-command:lang(ps),
-div.win-command:lang(sd-Arab),
-div.win-command:lang(syr),
-div.win-command:lang(ug),
-div.win-command:lang(ur),
-div.win-command:lang(qps-plocm) {
-  writing-mode: rl-tb;
-}
-div.win-command:focus {
-  outline: none;
-}
-.win-command.win-command-hidden {
-  display: none;
-}
-/*
-AppBar
-*/
-.win-navbar {
-  border-width: 0;
-  width: 100%;
-  height: auto;
-  left: 0;
-  position: fixed;
-  position: -ms-device-fixed;
-  min-height: 48px;
-}
-.win-navbar.win-navbar-minimal {
-  min-height: 25px;
-}
-.win-navbar.win-navbar-minimal.win-navbar-closed .win-navbar-invokebutton .win-navbar-ellipsis {
-  top: 5px;
-}
-.win-navbar.win-navbar-closing.win-navbar-minimal > :not(.win-navbar-invokebutton) {
-  opacity: 0;
-}
-.win-navbar.win-menulayout.win-navbar-closing .win-navbar-menu {
-  opacity: 1;
-}
-.win-navbar.win-navbar-closed.win-navbar-minimal > :not(.win-navbar-invokebutton) {
-  display: none !important;
-}
-.win-navbar.win-navbar-closing.win-navbar-minimal .win-navbar-invokebutton,
-.win-navbar.win-navbar-closed.win-navbar-minimal .win-navbar-invokebutton {
-  width: 100%;
-}
-.win-navbar.win-menulayout.win-navbar-opening .win-navbar-invokebutton,
-.win-navbar.win-menulayout.win-navbar-opened .win-navbar-invokebutton,
-.win-navbar.win-menulayout.win-navbar-closing .win-navbar-invokebutton {
-  visibility: hidden;
-}
-.win-navbar.win-menulayout.win-navbar-opening .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton,
-.win-navbar.win-menulayout.win-navbar-opened .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton,
-.win-navbar.win-menulayout.win-navbar-closing .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton {
-  visibility: visible;
-}
-.win-navbar .win-navbar-invokebutton {
-  touch-action: manipulation;
-  width: 32px;
-  height: 100%;
-  min-height: 25px;
-  position: absolute;
-  right: 0px;
-  margin: 0px;
-  padding: 0px;
-  border: dotted 1px;
-  min-width: 0px;
-  background-clip: border-box;
-  display: none;
-  z-index: 1;
-}
-.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis {
-  width: 32px;
-  height: 100%;
-  right: 0px;
-  top: 15px;
-  position: absolute;
-  display: inline-block;
-  font-size: 14px;
-  text-align: center;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-}
-.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis::before {
-  content: "\E10C";
-  position: relative;
-}
-.win-navbar:lang(ar) .win-navbar-invokebutton,
-.win-navbar:lang(dv) .win-navbar-invokebutton,
-.win-navbar:lang(fa) .win-navbar-invokebutton,
-.win-navbar:lang(he) .win-navbar-invokebutton,
-.win-navbar:lang(ku-Arab) .win-navbar-invokebutton,
-.win-navbar:lang(pa-Arab) .win-navbar-invokebutton,
-.win-navbar:lang(prs) .win-navbar-invokebutton,
-.win-navbar:lang(ps) .win-navbar-invokebutton,
-.win-navbar:lang(sd-Arab) .win-navbar-invokebutton,
-.win-navbar:lang(syr) .win-navbar-invokebutton,
-.win-navbar:lang(ug) .win-navbar-invokebutton,
-.win-navbar:lang(ur) .win-navbar-invokebutton,
-.win-navbar:lang(qps-plocm) .win-navbar-invokebutton,
-.win-navbar:lang(ar) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(dv) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(fa) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(he) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(ku-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(pa-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(prs) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(ps) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(sd-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(syr) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(ug) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(ur) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(qps-plocm) .win-navbar-invokebutton .win-navbar-ellipsis {
-  right: auto;
-  left: 0px;
-}
-.win-navbar.win-navbar-minimal .win-navbar-invokebutton,
-.win-navbar.win-navbar-compact .win-navbar-invokebutton {
-  display: block;
-}
-/*
-AppBar commands layout
-*/
-.win-commandlayout {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-wrap: none;
-  -webkit-flex-wrap: nowrap;
-  flex-wrap: nowrap;
-  -ms-flex-pack: center;
-  -webkit-justify-content: center;
-  justify-content: center;
-  -ms-flex-align: start;
-  -webkit-align-items: flex-start;
-  align-items: flex-start;
-}
-.win-commandlayout .win-primarygroup {
-  -ms-flex-order: 2;
-  flex-order: 2;
-  -webkit-order: 2;
-  order: 2;
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-pack: end;
-  -webkit-justify-content: flex-end;
-  justify-content: flex-end;
-  -ms-flex-align: start;
-  -webkit-align-items: flex-start;
-  align-items: flex-start;
-}
-.win-commandlayout .win-secondarygroup {
-  -ms-flex-order: 1;
-  flex-order: 1;
-  -webkit-order: 1;
-  order: 1;
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-pack: start;
-  -webkit-justify-content: flex-start;
-  justify-content: flex-start;
-  -ms-flex-align: start;
-  -webkit-align-items: flex-start;
-  align-items: flex-start;
-}
-.win-commandlayout .win-command {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-}
-.win-commandlayout.win-navbar-opening,
-.win-commandlayout.win-navbar-opened,
-.win-commandlayout.win-navbar-closing {
-  min-height: 62px;
-}
-.win-commandlayout.win-navbar-opening.win-navbar-compact,
-.win-commandlayout.win-navbar-opened.win-navbar-compact,
-.win-commandlayout.win-navbar-closing.win-navbar-compact {
-  min-height: 48px;
-}
-.win-commandlayout.win-navbar-minimal,
-.win-commandlayout.win-navbar-compact {
-  padding-right: 32px;
-  width: calc(100% - 32px);
-}
-.win-commandlayout.win-navbar-compact button.win-command .win-label {
-  display: none;
-}
-.win-commandlayout.win-navbar-compact.win-navbar-closing button.win-command .win-label {
-  display: block;
-  visibility: hidden;
-}
-.win-commandlayout.win-navbar-compact.win-navbar-opened button.win-command .win-label,
-.win-commandlayout.win-navbar-compact.win-navbar-opening button.win-command .win-label {
-  display: block;
-  visibility: visible;
-}
-/* CommandsLayout RTL */
-.win-commandlayout:lang(ar).win-navbar-minimal,
-.win-commandlayout:lang(dv).win-navbar-minimal,
-.win-commandlayout:lang(fa).win-navbar-minimal,
-.win-commandlayout:lang(he).win-navbar-minimal,
-.win-commandlayout:lang(ku-Arab).win-navbar-minimal,
-.win-commandlayout:lang(pa-Arab).win-navbar-minimal,
-.win-commandlayout:lang(prs).win-navbar-minimal,
-.win-commandlayout:lang(ps).win-navbar-minimal,
-.win-commandlayout:lang(sd-Arab).win-navbar-minimal,
-.win-commandlayout:lang(syr).win-navbar-minimal,
-.win-commandlayout:lang(ug).win-navbar-minimal,
-.win-commandlayout:lang(ur).win-navbar-minimal,
-.win-commandlayout:lang(qps-plocm).win-navbar-minimal,
-.win-commandlayout:lang(ar).win-navbar-compact,
-.win-commandlayout:lang(dv).win-navbar-compact,
-.win-commandlayout:lang(fa).win-navbar-compact,
-.win-commandlayout:lang(he).win-navbar-compact,
-.win-commandlayout:lang(ku-Arab).win-navbar-compact,
-.win-commandlayout:lang(pa-Arab).win-navbar-compact,
-.win-commandlayout:lang(prs).win-navbar-compact,
-.win-commandlayout:lang(ps).win-navbar-compact,
-.win-commandlayout:lang(sd-Arab).win-navbar-compact,
-.win-commandlayout:lang(syr).win-navbar-compact,
-.win-commandlayout:lang(ug).win-navbar-compact,
-.win-commandlayout:lang(ur).win-navbar-compact,
-.win-commandlayout:lang(qps-plocm).win-navbar-compact {
-  padding-right: 0px;
-  padding-left: 32px;
-}
-/*
-AppBar menu layout
-*/
-.win-menulayout .win-navbar-menu {
-  position: absolute;
-  right: 0;
-  top: 0;
-  overflow: hidden;
-}
-.win-menulayout .win-navbar-menu:lang(ar),
-.win-menulayout .win-navbar-menu:lang(dv),
-.win-menulayout .win-navbar-menu:lang(fa),
-.win-menulayout .win-navbar-menu:lang(he),
-.win-menulayout .win-navbar-menu:lang(ku-Arab),
-.win-menulayout .win-navbar-menu:lang(pa-Arab),
-.win-menulayout .win-navbar-menu:lang(prs),
-.win-menulayout .win-navbar-menu:lang(ps),
-.win-menulayout .win-navbar-menu:lang(sd-Arab),
-.win-menulayout .win-navbar-menu:lang(syr),
-.win-menulayout .win-navbar-menu:lang(ug),
-.win-menulayout .win-navbar-menu:lang(ur),
-.win-menulayout .win-navbar-menu:lang(qps-plocm) {
-  left: 0;
-  right: auto;
-}
-.win-menulayout.win-bottom .win-navbar-menu {
-  overflow: visible;
-}
-.win-menulayout .win-toolbar {
-  max-width: 100vw;
-}
-.win-menulayout.win-navbar-compact button.win-command .win-label {
-  display: none;
-  visibility: hidden;
-}
-.win-menulayout.win-navbar-compact.win-navbar-closing button.win-command .win-label,
-.win-menulayout.win-navbar-compact.win-navbar-opening button.win-command .win-label {
-  display: block;
-  visibility: visible;
-}
-.win-menulayout.win-navbar-compact.win-navbar-opened button.win-command .win-label {
-  display: block;
-  visibility: visible;
-}
-.win-menulayout.win-navbar-compact.win-navbar-closed {
-  overflow: hidden;
-}
-.win-menulayout.win-navbar-compact.win-navbar-closed .win-toolbar-overflowarea {
-  visibility: hidden;
-}
-/*
-High contrast AppBar needs a border
-*/
-@media (-ms-high-contrast) {
-  /*
-    AppBar Borders
-    */
-  .win-navbar {
-    border: solid 2px;
-  }
-  .win-navbar.win-top {
-    border-top: none;
-    border-left: none;
-    border-right: none;
-  }
-  .win-navbar.win-bottom {
-    border-bottom: none;
-    border-left: none;
-    border-right: none;
-  }
-  .win-navbar.win-top button.win-command,
-  .win-navbar.win-top div.win-command {
-    padding-bottom: 7px;
-    /* 7px - 2px smaller to account for the high-constrast appbar border */
-  }
-  .win-navbar.win-bottom button.win-command,
-  .win-navbar.win-bottom div.win-command {
-    padding-top: 7px;
-    /* 7px - 2px smaller to account for the high-constrast appbar border */
-  }
-  .win-navbar.win-top hr.win-command {
-    margin-bottom: 28px;
-  }
-  .win-navbar.win-bottom hr.win-command {
-    margin-top: 8px;
-  }
-  .win-commandlayout.win-navbar-opening,
-  .win-commandlayout.win-navbar-opened,
-  .win-commandlayout.win-navbar-closing {
-    min-height: 62px;
-  }
-}
-/*
-Flyout control.
-*/
-.win-flyout {
-  position: fixed;
-  position: -ms-device-fixed;
-  padding: 12px;
-  border-style: solid;
-  border-width: 1px;
-  margin: 4px;
-  min-width: 70px;
-  /* 96px - 2px border - 24px padding */
-  max-width: 430px;
-  /* 456px - 2px border - 24px padding */
-  min-height: 16px;
-  /* 44px - 2px border - 24px padding */
-  max-height: 730px;
-  /* 758px - 2px border - 24px padding */
-  width: auto;
-  height: auto;
-  word-wrap: break-word;
-  overflow: auto;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-flyout.win-leftalign {
-  margin-left: 0;
-}
-.win-flyout.win-rightalign {
-  margin-right: 0;
-}
-.win-flyout.win-scrolls {
-  overflow: auto;
-}
-@media (max-width: 464px) {
-  .win-flyout {
-    max-width: calc(100% - 34px);
-    /* 100% - 8px margin - 2px border - 24px padding */
-  }
-}
-/*
-Menu control.
-*/
-.win-menu {
-  padding: 0;
-  line-height: 33px;
-  text-align: left;
-  /* Set explicitly in case our parent has different alignment, like appbar overflow. */
-  min-height: 42px;
-  /* 44px - 2px border */
-  max-height: calc(100% - 26px);
-  min-width: 134px;
-  /* 136px - 2px border */
-  max-width: 454px;
-  /* 456px - 2px border */
-}
-/*
-Menu commands.
-*/
-.win-menu button.win-command {
-  display: block;
-  margin-left: 0;
-  margin-right: 0;
-  text-align: left;
-  width: 100%;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-menu button.win-command:focus {
-  outline: none;
-}
-.win-menu button.win-command .win-menucommand-liner {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-wrap: none;
-  -webkit-flex-wrap: nowrap;
-  flex-wrap: nowrap;
-  -ms-flex-align: center;
-  -webkit-align-items: center;
-  align-items: center;
-  width: 100%;
-  position: relative;
-}
-.win-menu button.win-command .win-menucommand-liner .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner .win-flyouticon {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  display: none;
-  visibility: hidden;
-  font-size: 16px;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-}
-.win-menu button.win-command .win-menucommand-liner .win-toggleicon {
-  margin-left: 12px;
-}
-.win-menu button.win-command .win-menucommand-liner .win-toggleicon::before {
-  content: "\E0E7";
-}
-.win-menu button.win-command .win-menucommand-liner .win-flyouticon {
-  margin-left: 12px;
-  margin-right: 16px;
-}
-.win-menu button.win-command .win-menucommand-liner .win-flyouticon::before {
-  content: "\E26B";
-}
-.win-menu button.win-command .win-menucommand-liner .win-label {
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  font-size: 15px;
-  line-height: inherit;
-  min-width: 112px;
-  max-width: none;
-  white-space: nowrap;
-  text-overflow: clip;
-  margin: 0px;
-  padding: 0px 12px;
-}
-.win-menu button.win-command .win-menucommand-liner:lang(ar),
-.win-menu button.win-command .win-menucommand-liner:lang(dv),
-.win-menu button.win-command .win-menucommand-liner:lang(fa),
-.win-menu button.win-command .win-menucommand-liner:lang(he),
-.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab),
-.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab),
-.win-menu button.win-command .win-menucommand-liner:lang(prs),
-.win-menu button.win-command .win-menucommand-liner:lang(ps),
-.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab),
-.win-menu button.win-command .win-menucommand-liner:lang(syr),
-.win-menu button.win-command .win-menucommand-liner:lang(ug),
-.win-menu button.win-command .win-menucommand-liner:lang(ur),
-.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) {
-  text-align: right;
-}
-.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(he) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-toggleicon {
-  margin-left: 0px;
-  margin-right: 12px;
-}
-.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(he) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-flyouticon {
-  margin-left: 16px;
-  margin-right: 12px;
-}
-.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(he) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-flyouticon::before {
-  content: "\E26C";
-}
-.win-menu.win-menu-mousespacing button.win-command {
-  padding-top: 5px;
-  padding-bottom: 7px;
-  min-height: 32px;
-}
-.win-menu.win-menu-touchspacing button.win-command {
-  padding-top: 11px;
-  padding-bottom: 13px;
-  min-height: 44px;
-}
-.win-menu hr.win-command {
-  display: block;
-  height: 1px;
-  width: auto;
-  border: 0;
-  padding: 0;
-  margin: 9px 20px 10px 20px;
-}
-/*
-Menu toggle and flyout commands.
-*/
-.win-menu-containstogglecommand button.win-command .win-menucommand-liner .win-toggleicon,
-.win-menu-containsflyoutcommand button.win-command .win-menucommand-liner .win-flyouticon {
-  display: inline-block;
-}
-.win-menu-containstogglecommand button.win-command-toggle[aria-checked=true] .win-menucommand-liner .win-toggleicon,
-.win-menu-containsflyoutcommand button.win-command-flyout .win-menucommand-liner .win-flyouticon {
-  visibility: visible;
-}
-@media (max-width: 464px) {
-  .win-menu {
-    max-width: calc(100% - 10px);
-    /* 100% - 8px margin - 2px border */
-  }
-}
-/*
-Grippers in touch selection do not dissapear when focus moves to an element outside of the selection range and they are always drawn on a layer above all HTML elemements.
-When an _Overlay derived control such as AppBar/Flyout/Menu/SettingsFlyout is invoked and steals focus, if that _Overlay is laid out on top of the elements in the touch selection,
-the grippers can still be seen over the _Overlay and its contents. However, all grippers any where in the document will be hidden whenever the current active element has or inherits
-the style "-ms-touch-select: none;"
-*/
-.win-overlay {
-  -ms-touch-select: none;
-}
-/* For input elements we filter type using the :not selector to capture any unrecognized user specified types which would just default to the form and function of a textbox*/
-.win-overlay input:not([type="file"]),
-.win-overlay input:not([type="radio"]),
-.win-overlay input:not([type="checkbox"]),
-.win-overlay input:not([type="button"]),
-.win-overlay input:not([type="range"]),
-.win-overlay input:not([type="image"]),
-.win-overlay input:not([type="reset"]),
-.win-overlay input:not([type="hidden"]),
-.win-overlay input:not([type="submit"]),
-.win-overlay textarea,
-.win-overlay [contenteditable=true] {
-  -ms-touch-select: grippers;
-}
-/* Singleton element maintained by _Overlay, used for getting accurate floating point measurements of the total size of the visual viewport.
-    Floating point is necesary in high DPI resolutions. */
-.win-visualviewport-space {
-  position: fixed;
-  position: -ms-device-fixed;
-  height: 100%;
-  width: 100%;
-  visibility: hidden;
-}
-/*
-Settings Pane
-*/
-.win-settingsflyout {
-  border-left: 1px solid;
-  position: fixed;
-  top: 0;
-  right: 0;
-  height: 100%;
-  width: 319px;
-  /* 320px - border (1px) */
-  /* Settings back button is slightly smaller. */
-}
-.win-settingsflyout:lang(ar),
-.win-settingsflyout:lang(dv),
-.win-settingsflyout:lang(fa),
-.win-settingsflyout:lang(he),
-.win-settingsflyout:lang(ku-Arab),
-.win-settingsflyout:lang(pa-Arab),
-.win-settingsflyout:lang(prs),
-.win-settingsflyout:lang(ps),
-.win-settingsflyout:lang(sd-Arab),
-.win-settingsflyout:lang(syr),
-.win-settingsflyout:lang(ug),
-.win-settingsflyout:lang(ur),
-.win-settingsflyout:lang(qps-plocm) {
-  border-left: none;
-  border-right: 1px solid;
-}
-.win-settingsflyout.win-wide {
-  /* .win-wide is deprecated in Windows 8.1 */
-  width: 645px;
-  /* 646px - border (1px) */
-}
-.win-settingsflyout .win-backbutton,
-.win-settingsflyout .win-back {
-  width: 32px;
-  height: 32px;
-  font-size: 20px;
-  line-height: 32px;
-}
-.win-settingsflyout .win-header {
-  padding-top: 6px;
-  padding-bottom: 10px;
-  padding-left: 52px;
-  /* 40px for the backbutton */
-  padding-right: 12px;
-  height: 32px;
-  position: relative;
-}
-.win-settingsflyout .win-header .win-label {
-  display: inline-block;
-  font-size: 24px;
-  font-weight: 300;
-  line-height: 32px;
-  white-space: nowrap;
-}
-.win-settingsflyout .win-header .win-backbutton,
-.win-settingsflyout .win-header .win-navigation-backbutton {
-  position: absolute;
-  left: 12px;
-}
-.win-settingsflyout .win-content {
-  overflow: auto;
-  padding: 0px 12px;
-}
-.win-settingsflyout .win-content .win-label {
-  font-size: 20px;
-  font-weight: 400;
-  line-height: 1.2;
-}
-.win-settingsflyout .win-content .win-settings-section {
-  padding-bottom: 39px;
-  margin: 0;
-  padding-top: 0;
-  padding-bottom: 20px;
-}
-.win-settingsflyout .win-content .win-settings-section p {
-  margin: 0;
-  padding-top: 0;
-  padding-bottom: 25px;
-}
-.win-settingsflyout .win-content .win-settings-section a {
-  margin: 0;
-  padding-top: 0;
-  padding-bottom: 25px;
-  display: inline-block;
-}
-.win-settingsflyout .win-content .win-settings-section label {
-  display: block;
-  padding-bottom: 7px;
-}
-.win-settingsflyout .win-content .win-settings-section button,
-.win-settingsflyout .win-content .win-settings-section select,
-.win-settingsflyout .win-content .win-settings-section input[type=button],
-.win-settingsflyout .win-content .win-settings-section input[type=text] {
-  margin-bottom: 25px;
-  margin-left: 0;
-  margin-right: 20px;
-}
-.win-settingsflyout .win-content .win-settings-section button:lang(ar),
-.win-settingsflyout .win-content .win-settings-section select:lang(ar),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ar),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ar),
-.win-settingsflyout .win-content .win-settings-section button:lang(dv),
-.win-settingsflyout .win-content .win-settings-section select:lang(dv),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(dv),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(dv),
-.win-settingsflyout .win-content .win-settings-section button:lang(fa),
-.win-settingsflyout .win-content .win-settings-section select:lang(fa),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(fa),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(fa),
-.win-settingsflyout .win-content .win-settings-section button:lang(he),
-.win-settingsflyout .win-content .win-settings-section select:lang(he),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(he),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(he),
-.win-settingsflyout .win-content .win-settings-section button:lang(ku-Arab),
-.win-settingsflyout .win-content .win-settings-section select:lang(ku-Arab),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ku-Arab),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ku-Arab),
-.win-settingsflyout .win-content .win-settings-section button:lang(pa-Arab),
-.win-settingsflyout .win-content .win-settings-section select:lang(pa-Arab),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(pa-Arab),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(pa-Arab),
-.win-settingsflyout .win-content .win-settings-section button:lang(prs),
-.win-settingsflyout .win-content .win-settings-section select:lang(prs),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(prs),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(prs),
-.win-settingsflyout .win-content .win-settings-section button:lang(ps),
-.win-settingsflyout .win-content .win-settings-section select:lang(ps),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ps),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ps),
-.win-settingsflyout .win-content .win-settings-section button:lang(sd-Arab),
-.win-settingsflyout .win-content .win-settings-section select:lang(sd-Arab),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(sd-Arab),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(sd-Arab),
-.win-settingsflyout .win-content .win-settings-section button:lang(syr),
-.win-settingsflyout .win-content .win-settings-section select:lang(syr),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(syr),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(syr),
-.win-settingsflyout .win-content .win-settings-section button:lang(ug),
-.win-settingsflyout .win-content .win-settings-section select:lang(ug),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ug),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ug),
-.win-settingsflyout .win-content .win-settings-section button:lang(ur),
-.win-settingsflyout .win-content .win-settings-section select:lang(ur),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ur),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ur),
-.win-settingsflyout .win-content .win-settings-section button:lang(qps-plocm),
-.win-settingsflyout .win-content .win-settings-section select:lang(qps-plocm),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(qps-plocm),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(qps-plocm) {
-  margin-bottom: 25px;
-  margin-left: 20px;
-  margin-right: 0;
-}
-.win-settingsflyout .win-content .win-settings-section input[type=radio] {
-  margin-top: 0;
-  margin-bottom: 0;
-  padding-bottom: 15px;
-}
-/*Flyout control animations*/
-@keyframes WinJS-showFlyoutTop {
-  from {
-    transform: translateY(50px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-showFlyoutBottom {
-  from {
-    transform: translateY(-50px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-showFlyoutLeft {
-  from {
-    transform: translateX(50px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-showFlyoutRight {
-  from {
-    transform: translateX(-50px);
-  }
-  to {
-    transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showFlyoutTop {
-  from {
-    -webkit-transform: translateY(50px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showFlyoutBottom {
-  from {
-    -webkit-transform: translateY(-50px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showFlyoutLeft {
-  from {
-    -webkit-transform: translateX(50px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showFlyoutRight {
-  from {
-    -webkit-transform: translateX(-50px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-.win-commandingsurface {
-  outline: none;
-  min-width: 32px;
-  /* enough to fit the overflowbutton */
-  position: relative;
-}
-.win-commandingsurface.win-commandingsurface-overflowbottom .win-commandingsurface-overflowareacontainer {
-  top: 100%;
-}
-.win-commandingsurface.win-commandingsurface-overflowtop .win-commandingsurface-overflowareacontainer {
-  bottom: 100%;
-}
-.win-commandingsurface .win-commandingsurface-actionarea {
-  min-height: 24px;
-  vertical-align: top;
-  overflow: hidden;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-pack: end;
-  -webkit-justify-content: flex-end;
-  justify-content: flex-end;
-  -ms-flex-align: start;
-  -webkit-align-items: flex-start;
-  align-items: flex-start;
-}
-.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-spacer {
-  visibility: hidden;
-  min-height: 48px;
-  /* height of a primary command with no label */
-  width: 0px;
-}
-.win-commandingsurface .win-commandingsurface-actionarea .win-command,
-.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton {
-  touch-action: manipulation;
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-}
-.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton {
-  width: 32px;
-  /* 30px + 2px border */
-  margin: 0px;
-  padding: 0px;
-  border-width: 1px;
-  border-style: dotted;
-  min-width: 0px;
-  min-height: 0px;
-  outline: none;
-  -ms-flex-item-align: stretch;
-  -webkit-align-self: stretch;
-  align-self: stretch;
-  box-sizing: border-box;
-  background-clip: border-box;
-}
-.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis {
-  font-size: 16px;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-}
-.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis::before {
-  content: "\E10C";
-}
-.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-actionarea {
-  height: auto;
-}
-.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-overflowarea,
-.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-overflowareacontainer {
-  display: block;
-}
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayfull .win-commandingsurface-actionarea {
-  height: auto;
-}
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaycompact .win-commandingsurface-actionarea {
-  height: 48px;
-}
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaycompact .win-commandingsurface-actionarea .win-command .win-label {
-  display: none;
-}
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea {
-  height: 24px;
-}
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea .win-command,
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea .win-commandingsurface-spacer {
-  display: none;
-}
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaynone {
-  display: none;
-}
-.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-overflowarea,
-.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-overflowareacontainer {
-  display: none;
-}
-.win-commandingsurface .win-commandingsurface-insetoutline {
-  /* Display none except in High Contrast scenarios */
-  display: none;
-}
-.win-commandingsurface .win-commandingsurface-overflowareacontainer {
-  position: absolute;
-  overflow: hidden;
-  right: 0;
-  left: auto;
-}
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ar),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(dv),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(fa),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(he),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ku-Arab),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(pa-Arab),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(prs),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ps),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(sd-Arab),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(syr),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ug),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ur),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(qps-plocm) {
-  left: 0;
-  right: auto;
-}
-.win-commandingsurface .win-commandingsurface-overflowarea,
-.win-commandingsurface .win-commandingsurface-overflowareacontainer {
-  min-width: 160px;
-  min-height: 0;
-  max-height: 50vh;
-  padding: 0;
-}
-.win-commandingsurface .win-commandingsurface-overflowarea {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  overflow-y: auto;
-  overflow-x: hidden;
-}
-.win-commandingsurface .win-commandingsurface-overflowarea.win-menu {
-  max-width: 480px;
-  /* override max-width styles from WinJS.UI.Menu */
-}
-.win-commandingsurface .win-commandingsurface-overflowarea .win-commandingsurface-spacer {
-  /* Reserves space at the bottom of the overflow area */
-  visibility: hidden;
-  height: 24px;
-}
-.win-commandingsurface .win-commandingsurface-overflowarea button.win-command {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  min-height: 44px;
-  border: 1px dotted transparent;
-  padding: 10px 11px 12px 11px;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-  white-space: nowrap;
-  overflow: hidden;
-}
-.win-commandingsurface .win-commandingsurface-overflowarea hr.win-command {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  height: 2px;
-  margin: 6px 12px 4px 12px;
-}
-.win-commandingsurface .win-commandingsurface-actionareacontainer {
-  overflow: hidden;
-  position: relative;
-}
-.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplaycompact .win-command .win-label,
-.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplayminimal .win-command,
-.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplaynone .win-command {
-  opacity: 0;
-}
-.win-commandingsurface .win-command.win-command-hidden {
-  display: inline-block;
-}
-.win-commandingsurface .win-command.win-commandingsurface-command-hidden {
-  display: none;
-}
-.win-commandingsurface .win-command.win-commandingsurface-command-primary-overflown,
-.win-commandingsurface .win-command.win-commandingsurface-command-secondary-overflown,
-.win-commandingsurface .win-command.win-commandingsurface-command-separator-hidden {
-  display: none;
-}
-@media (max-width: 480px) {
-  .win-commandingsurface .win-commandingsurface-overflowarea.win-menu {
-    width: 100vw;
-  }
-}
-.win-toolbar {
-  min-width: 32px;
-  /* enough to fit the overflowbutton */
-}
-.win-toolbar.win-toolbar-opened {
-  position: fixed;
-}
-.win-autosuggestbox {
-  white-space: normal;
-  position: relative;
-  width: 266px;
-  min-width: 265px;
-  min-height: 28px;
-}
-.win-autosuggestbox-flyout {
-  position: absolute;
-  top: 100%;
-  width: 100%;
-  z-index: 100;
-  max-height: 374px;
-  min-height: 44px;
-  overflow: auto;
-  -ms-scroll-chaining: none;
-  touch-action: none;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-autosuggestbox-flyout-above {
-  bottom: 100%;
-  top: auto;
-}
-.win-autosuggestbox-flyout-above .win-repeater {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column-reverse;
-  -webkit-flex-direction: column-reverse;
-  flex-direction: column-reverse;
-}
-.win-autosuggestbox .win-autosuggestbox-input {
-  -ms-ime-align: after;
-  margin: 0;
-  width: 100%;
-}
-.win-autosuggestbox-suggestion-selected {
-  outline-style: dotted;
-  outline-width: 1px;
-}
-.win-autosuggestbox-suggestion-result {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  padding: 0 18px;
-  height: 60px;
-  font-size: 11pt;
-  outline: none;
-}
-.win-autosuggestbox-suggestion-result div {
-  line-height: 20px;
-  white-space: nowrap;
-  overflow: hidden;
-}
-.win-autosuggestbox-suggestion-result-text {
-  padding-top: 9px;
-  padding-bottom: 11px;
-  height: 60px;
-  width: 179px;
-  white-space: nowrap;
-  overflow: hidden;
-  line-height: 20px;
-}
-.win-autosuggestbox-suggestion-result-detailed-text {
-  display: inline-block;
-  overflow: hidden;
-  line-height: 22px;
-  /* Some characters get clipped if line height is < 22px. Work around by setting -2 margin. */
-  margin-top: -1px;
-  width: 100%;
-}
-.win-autosuggestbox-suggestion-result img {
-  width: 40px;
-  height: 40px;
-  margin-left: 0;
-  padding-right: 10px;
-  padding-top: 10px;
-  padding-bottom: 10px;
-}
-.win-autosuggestbox-suggestion-result img:lang(ar),
-.win-autosuggestbox-suggestion-result img:lang(dv),
-.win-autosuggestbox-suggestion-result img:lang(fa),
-.win-autosuggestbox-suggestion-result img:lang(he),
-.win-autosuggestbox-suggestion-result img:lang(ku-Arab),
-.win-autosuggestbox-suggestion-result img:lang(pa-Arab),
-.win-autosuggestbox-suggestion-result img:lang(prs),
-.win-autosuggestbox-suggestion-result img:lang(ps),
-.win-autosuggestbox-suggestion-result img:lang(sd-Arab),
-.win-autosuggestbox-suggestion-result img:lang(syr),
-.win-autosuggestbox-suggestion-result img:lang(ug),
-.win-autosuggestbox-suggestion-result img:lang(ur),
-.win-autosuggestbox-suggestion-result img:lang(qps-plocm) {
-  margin-right: 0;
-  margin-left: auto;
-  padding-left: 10px;
-  padding-right: 0;
-}
-.win-autosuggestbox-suggestion-query {
-  height: 20px;
-  padding: 11px 0px 13px 12px;
-  outline: none;
-  white-space: nowrap;
-  overflow: hidden;
-  line-height: 20px;
-}
-.win-autosuggestbox-suggestion-separator {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  padding: 0 18px;
-  height: 40px;
-  font-size: 11pt;
-}
-.win-autosuggestbox-suggestion-separator hr {
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  margin-top: 18px;
-  border-style: solid;
-  border-width: 1px 0px 0px 0px;
-}
-.win-autosuggestbox-suggestion-separator hr:lang(ar),
-.win-autosuggestbox-suggestion-separator hr:lang(dv),
-.win-autosuggestbox-suggestion-separator hr:lang(fa),
-.win-autosuggestbox-suggestion-separator hr:lang(he),
-.win-autosuggestbox-suggestion-separator hr:lang(ku-Arab),
-.win-autosuggestbox-suggestion-separator hr:lang(pa-Arab),
-.win-autosuggestbox-suggestion-separator hr:lang(prs),
-.win-autosuggestbox-suggestion-separator hr:lang(ps),
-.win-autosuggestbox-suggestion-separator hr:lang(sd-Arab),
-.win-autosuggestbox-suggestion-separator hr:lang(syr),
-.win-autosuggestbox-suggestion-separator hr:lang(ug),
-.win-autosuggestbox-suggestion-separator hr:lang(ur),
-.win-autosuggestbox-suggestion-separator hr:lang(qps-plocm) {
-  margin-right: 10px;
-  margin-left: auto;
-}
-.win-autosuggestbox-suggestion-separator div {
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  overflow: hidden;
-  padding-top: 9px;
-  padding-bottom: 11px;
-  line-height: 20px;
-  margin-right: 10px;
-}
-.win-autosuggestbox-suggestion-separator div:lang(ar),
-.win-autosuggestbox-suggestion-separator div:lang(dv),
-.win-autosuggestbox-suggestion-separator div:lang(fa),
-.win-autosuggestbox-suggestion-separator div:lang(he),
-.win-autosuggestbox-suggestion-separator div:lang(ku-Arab),
-.win-autosuggestbox-suggestion-separator div:lang(pa-Arab),
-.win-autosuggestbox-suggestion-separator div:lang(prs),
-.win-autosuggestbox-suggestion-separator div:lang(ps),
-.win-autosuggestbox-suggestion-separator div:lang(sd-Arab),
-.win-autosuggestbox-suggestion-separator div:lang(syr),
-.win-autosuggestbox-suggestion-separator div:lang(ug),
-.win-autosuggestbox-suggestion-separator div:lang(ur),
-.win-autosuggestbox-suggestion-separator div:lang(qps-plocm) {
-  margin-left: 10px;
-  margin-right: auto;
-}
-/*
-ASB control animations
-*/
-@keyframes WinJS-flyoutBelowASB-showPopup {
-  from {
-    transform: translateY(0px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-flyoutAboveASB-showPopup {
-  from {
-    transform: translateY(0px);
-  }
-  to {
-    transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-flyoutBelowASB-showPopup {
-  from {
-    -webkit-transform: translateY(0px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-flyoutAboveASB-showPopup {
-  from {
-    -webkit-transform: translateY(0px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@media (-ms-high-contrast) {
-  .win-autosuggestbox {
-    border-color: ButtonText;
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  .win-autosuggestbox-disabled {
-    background-color: ButtonFace;
-    border-color: GrayText;
-  }
-  .win-autosuggestbox-disabled input[disabled] {
-    background-color: ButtonFace;
-    color: GrayText;
-    border-color: GrayText;
-  }
-  .win-autosuggestbox-disabled div {
-    color: GrayText;
-    background-color: ButtonFace;
-  }
-  .win-autosuggestbox:-ms-input-placeholder,
-  .win-autosuggestbox::-webkit-input-placeholder,
-  .win-autosuggestbox::-moz-input-placeholder {
-    color: GrayText;
-  }
-  .win-autosuggestbox-flyout {
-    border-color: ButtonText;
-    background-color: ButtonFace;
-  }
-  .win-autosuggestbox-flyout-highlighttext {
-    color: ButtonText;
-  }
-  html.win-hoverable .win-autosuggestbox-suggestion-result:hover,
-  html.win-hoverable .win-autosuggestbox-query:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  html.win-hoverable .win-autosuggestbox-suggestion-result:hover .win-autosuggestbox-flyout-highlighttext,
-  html.win-hoverable .win-autosuggestbox-suggestion-query:hover .win-autosuggestbox-flyout-highlighttext {
-    color: HighlightText;
-  }
-  .win-autosuggestbox-suggestion-query,
-  .win-autosuggestbox-suggestion-result {
-    color: ButtonText;
-  }
-  .win-autosuggestbox-suggestion-selected {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-autosuggestbox-suggestion-separator {
-    color: ButtonText;
-  }
-  .win-autosuggestbox-suggestion-separator hr {
-    border-color: ButtonText;
-  }
-  .win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext {
-    color: HighlightText;
-  }
-}
-/*
-Hide clear button in search box control.
-*/
-.win-searchbox input[type=search]::-ms-clear {
-  display: none;
-}
-.win-searchbox input[type=search]::-webkit-search-cancel-button {
-  display: none;
-}
-.win-searchbox-button {
-  position: absolute;
-  right: 0;
-  top: 0;
-  width: 32px;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-size: 15px;
-  border-style: none;
-  height: 100%;
-  text-align: center;
-}
-.win-searchbox-button:lang(ar),
-.win-searchbox-button:lang(dv),
-.win-searchbox-button:lang(fa),
-.win-searchbox-button:lang(he),
-.win-searchbox-button:lang(ku-Arab),
-.win-searchbox-button:lang(pa-Arab),
-.win-searchbox-button:lang(prs),
-.win-searchbox-button:lang(ps),
-.win-searchbox-button:lang(sd-Arab),
-.win-searchbox-button:lang(syr),
-.win-searchbox-button:lang(ug),
-.win-searchbox-button:lang(ur),
-.win-searchbox-button:lang(qps-plocm) {
-  right: auto;
-  left: 0;
-}
-.win-searchbox-button.win-searchbox-button:before {
-  content: "\E094";
-  position: absolute;
-  left: 8px;
-  top: 8px;
-  line-height: 100%;
-}
-@media (-ms-high-contrast) {
-  .win-searchbox-button {
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  html.win-hoverable .win-searchbox-button[disabled=false]:hover {
-    border-color: ButtonText;
-    background-color: HighLight;
-    color: HighLightText;
-  }
-  .win-searchbox-button-input-focus {
-    background-color: ButtonText;
-    color: ButtonFace;
-  }
-  html.win-hoverable .win-searchbox-button-input-focus:hover {
-    border-color: ButtonText;
-    background-color: HighLight;
-    color: HighLightText;
-  }
-  .win-searchbox-button:active {
-    background-color: ButtonText;
-    color: ButtonFace;
-  }
-}
-/*
-    SplitViewCommand
-*/
-.win-splitviewcommand {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  touch-action: manipulation;
-}
-.win-splitviewcommand-button {
-  -ms-flex: 1 1 0%;
-  -webkit-flex: 1 1 0%;
-  flex: 1 1 0%;
-  position: relative;
-}
-.win-splitviewcommand-button-content {
-  position: relative;
-  height: 48px;
-  padding-left: 16px;
-  padding-right: 16px;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-}
-.win-splitviewcommand-button:focus {
-  z-index: 1;
-  outline: none;
-}
-.win-splitviewcommand-icon {
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  height: 16px;
-  width: 16px;
-  font-size: 16px;
-  margin-left: 0;
-  margin-right: 16px;
-  margin-top: 14px;
-  /* Center icon vertically */
-  line-height: 1;
-  /* Ensure icon is exactly font-size */
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-}
-.win-splitviewcommand-icon:lang(ar),
-.win-splitviewcommand-icon:lang(dv),
-.win-splitviewcommand-icon:lang(fa),
-.win-splitviewcommand-icon:lang(he),
-.win-splitviewcommand-icon:lang(ku-Arab),
-.win-splitviewcommand-icon:lang(pa-Arab),
-.win-splitviewcommand-icon:lang(prs),
-.win-splitviewcommand-icon:lang(ps),
-.win-splitviewcommand-icon:lang(sd-Arab),
-.win-splitviewcommand-icon:lang(syr),
-.win-splitviewcommand-icon:lang(ug),
-.win-splitviewcommand-icon:lang(ur),
-.win-splitviewcommand-icon:lang(qps-plocm) {
-  margin-right: 0;
-  margin-left: 16px;
-}
-.win-splitviewcommand-label {
-  -ms-flex: 1 1 0%;
-  -webkit-flex: 1 1 0%;
-  flex: 1 1 0%;
-  overflow: hidden;
-  white-space: nowrap;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-  margin-top: 13px;
-  margin-bottom: 15px;
-}
-@media (-ms-high-contrast) {
-  /*
-        SplitViewCommand colors.
-    */
-  .win-splitviewcommand-button {
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  .win-splitviewcommand-button:after {
-    position: absolute;
-    top: 0;
-    left: 0;
-    border: 2px solid ButtonText;
-    content: "";
-    width: calc(100% - 3px);
-    height: calc(100% - 3px);
-    pointer-events: none;
-  }
-  html.win-hoverable .win-splitviewcommand-button:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-splitviewcommand-button.win-pressed,
-  html.win-hoverable .win-splitviewcommand-button.win-pressed:hover {
-    background-color: ButtonText;
-    color: ButtonFace;
-  }
-}
-.win-navbar {
-  /* NavBar should overlay content in the body when opened or closed.
-     * This z-index value is chosen to be smaller than light dismissables.
-     * z-index will be overwritten by the light dismiss service to an even
-     * higher value when the NavBar is in the opened state.
-     */
-  z-index: 999;
-}
-.win-navbar.win-navbar-showing,
-.win-navbar.win-navbar-shown,
-.win-navbar.win-navbar-hiding {
-  min-height: 60px;
-}
-.win-navbar .win-navbar-invokebutton {
-  width: 32px;
-  min-height: 0;
-  height: 24px;
-}
-.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis {
-  width: 32px;
-}
-.win-navbar.win-top .win-navbar-invokebutton {
-  bottom: 0;
-}
-.win-navbar.win-top .win-navbar-invokebutton .win-navbar-ellipsis {
-  top: 5px;
-}
-.win-navbar.win-bottom .win-navbar-invokebutton {
-  top: 0;
-}
-.win-navbar.win-bottom .win-navbar-invokebutton .win-navbar-ellipsis {
-  top: 0;
-}
-.win-navbarcontainer {
-  width: 100%;
-  position: relative;
-}
-.win-navbarcontainer-pageindicator-box {
-  position: absolute;
-  width: 100%;
-  text-align: center;
-  pointer-events: none;
-}
-.win-navbarcontainer-vertical .win-navbarcontainer-pageindicator-box {
-  display: none;
-}
-.win-navbarcontainer-pageindicator {
-  display: inline-block;
-  width: 40px;
-  height: 4px;
-  margin: 4px 2px 16px 2px;
-}
-.win-navbarcontainer-horizontal .win-navbarcontainer-viewport::-webkit-scrollbar {
-  width: 0;
-  height: 0;
-}
-.win-navbarcontainer-horizontal .win-navbarcontainer-viewport {
-  padding: 20px 0;
-  overflow-x: auto;
-  overflow-y: hidden;
-  overflow: -moz-scrollbars-none;
-  -ms-scroll-snap-type: mandatory;
-  -ms-scroll-snap-points-x: snapInterval(0%, 100%);
-  -ms-overflow-style: none;
-  touch-action: pan-x;
-}
-.win-navbarcontainer-vertical .win-navbarcontainer-viewport {
-  overflow-x: hidden;
-  overflow-y: auto;
-  max-height: 216px;
-  -ms-overflow-style: -ms-autohiding-scrollbar;
-  touch-action: pan-y;
-  -webkit-overflow-scrolling: touch;
-}
-.win-navbarcontainer-horizontal .win-navbarcontainer-surface {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-line-pack: start;
-  -webkit-align-content: flex-start;
-  align-content: flex-start;
-}
-.win-navbarcontainer-vertical .win-navbarcontainer-surface {
-  padding: 12px 0;
-}
-.win-navbarcontainer-navarrow {
-  touch-action: manipulation;
-  position: absolute;
-  z-index: 2;
-  top: 24px;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-align: center;
-  -webkit-align-items: center;
-  align-items: center;
-  -ms-flex-pack: center;
-  -webkit-justify-content: center;
-  justify-content: center;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  height: calc(100% - 48px);
-  width: 20px;
-  font-size: 16px;
-  overflow: hidden;
-}
-.win-navbarcontainer-vertical .win-navbarcontainer-navarrow {
-  display: none;
-}
-.win-navbarcontainer-navleft {
-  left: 0;
-  margin-right: 2px;
-}
-.win-navbarcontainer-navleft::before {
-  content: '\E0E2';
-}
-.win-navbarcontainer-navright {
-  right: 0;
-  margin-left: 2px;
-}
-.win-navbarcontainer-navright::before {
-  content: '\E0E3';
-}
-/*
-    NavBarCommand
-*/
-.win-navbarcommand {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  touch-action: manipulation;
-}
-.win-navbarcontainer-horizontal .win-navbarcommand {
-  margin: 4px;
-  width: 192px;
-}
-.win-navbarcontainer-vertical .win-navbarcommand {
-  margin: 4px 24px;
-}
-.win-navbarcommand-button {
-  -ms-flex: 1 1 0%;
-  -webkit-flex: 1 1 0%;
-  flex: 1 1 0%;
-  position: relative;
-}
-.win-navbarcommand-button-content {
-  position: relative;
-  height: 48px;
-  padding-left: 16px;
-  padding-right: 16px;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-}
-.win-navbarcommand-button:focus {
-  z-index: 1;
-  outline: none;
-}
-.win-navbarcommand-icon {
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  height: 16px;
-  width: 16px;
-  font-size: 16px;
-  margin-left: 0;
-  margin-right: 16px;
-  margin-top: 14px;
-  /* Center icon vertically */
-  line-height: 1;
-  /* Ensure icon is exactly font-size */
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-}
-.win-navbarcommand-icon:lang(ar),
-.win-navbarcommand-icon:lang(dv),
-.win-navbarcommand-icon:lang(fa),
-.win-navbarcommand-icon:lang(he),
-.win-navbarcommand-icon:lang(ku-Arab),
-.win-navbarcommand-icon:lang(pa-Arab),
-.win-navbarcommand-icon:lang(prs),
-.win-navbarcommand-icon:lang(ps),
-.win-navbarcommand-icon:lang(sd-Arab),
-.win-navbarcommand-icon:lang(syr),
-.win-navbarcommand-icon:lang(ug),
-.win-navbarcommand-icon:lang(ur),
-.win-navbarcommand-icon:lang(qps-plocm) {
-  margin-right: 0;
-  margin-left: 16px;
-}
-.win-navbarcommand-label {
-  -ms-flex: 1 1 0%;
-  -webkit-flex: 1 1 0%;
-  flex: 1 1 0%;
-  overflow: hidden;
-  white-space: nowrap;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-  margin-top: 13px;
-  margin-bottom: 15px;
-}
-.win-navbarcommand-splitbutton {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  width: 48px;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-size: 16px;
-  margin-right: 0;
-  margin-left: 2px;
-  position: relative;
-}
-.win-navbarcommand-splitbutton:lang(ar),
-.win-navbarcommand-splitbutton:lang(dv),
-.win-navbarcommand-splitbutton:lang(fa),
-.win-navbarcommand-splitbutton:lang(he),
-.win-navbarcommand-splitbutton:lang(ku-Arab),
-.win-navbarcommand-splitbutton:lang(pa-Arab),
-.win-navbarcommand-splitbutton:lang(prs),
-.win-navbarcommand-splitbutton:lang(ps),
-.win-navbarcommand-splitbutton:lang(sd-Arab),
-.win-navbarcommand-splitbutton:lang(syr),
-.win-navbarcommand-splitbutton:lang(ug),
-.win-navbarcommand-splitbutton:lang(ur),
-.win-navbarcommand-splitbutton:lang(qps-plocm) {
-  margin-left: 0;
-  margin-right: 2px;
-}
-.win-navbarcommand-splitbutton::before {
-  content: '\E019';
-  pointer-events: none;
-  position: absolute;
-  box-sizing: border-box;
-  top: 0;
-  left: 0;
-  height: 100%;
-  width: 100%;
-  text-align: center;
-  line-height: 46px;
-  border: 1px dotted transparent;
-}
-.win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened::before {
-  content: '\E018';
-}
-.win-navbarcommand-splitbutton:focus {
-  outline: none;
-}
-@media (-ms-high-contrast) {
-  .win-navbarcontainer-pageindicator {
-    background-color: ButtonFace;
-  }
-  .win-navbarcontainer-pageindicator:after {
-    display: block;
-    border: 1px solid ButtonText;
-    content: "";
-    width: calc(100% - 2px);
-    height: calc(100% - 2px);
-  }
-  .win-navbarcontainer-pageindicator-current {
-    background-color: ButtonText;
-  }
-  html.win-hoverable .win-navbarcontainer-pageindicator:hover {
-    background-color: Highlight;
-  }
-  html.win-hoverable .win-navbarcontainer-pageindicator-current:hover {
-    background-color: ButtonText;
-  }
-  .win-navbarcontainer-pageindicator:hover:active {
-    background-color: ButtonText;
-  }
-  .win-navbarcontainer-navarrow {
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  .win-navbarcontainer-navarrow:after {
-    position: absolute;
-    top: 0;
-    left: 0;
-    border: 2px solid ButtonText;
-    content: "";
-    width: calc(100% - 3px);
-    height: calc(100% - 3px);
-  }
-  html.win-hoverable .win-navbarcontainer-navarrow:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-navbarcontainer-navarrow:hover:active {
-    background-color: ButtonText;
-    color: ButtonFace;
-  }
-  /*
-        NavBarCommand colors.
-    */
-  .win-navbarcommand-button,
-  .win-navbarcommand-splitbutton {
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  .win-navbarcommand-button:after,
-  .win-navbarcommand-splitbutton:after {
-    position: absolute;
-    top: 0;
-    left: 0;
-    border: 2px solid ButtonText;
-    content: "";
-    width: calc(100% - 3px);
-    height: calc(100% - 3px);
-    pointer-events: none;
-  }
-  html.win-hoverable .win-navbarcommand-button:hover,
-  html.win-hoverable .win-navbarcommand-splitbutton:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened,
-  html.win-hoverable .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover,
-  .win-navbarcommand-button.win-pressed,
-  html.win-hoverable .win-navbarcommand-button.win-pressed:hover,
-  .win-navbarcommand-splitbutton.win-pressed,
-  html.win-hoverable .win-navbarcommand-splitbutton.win-pressed:hover {
-    background-color: ButtonText;
-    color: ButtonFace;
-  }
-}
-.win-viewbox {
-  width: 100%;
-  height: 100%;
-  position: relative;
-}
-.win-contentdialog {
-  /* Dialog's positioning and sizing rules:
-      - Horizontal alignment
-        - Always horizontally centered
-      - Vertical alignment
-        - If height of window < @dialogVerticallyCenteredThreshold, dialog is attached to top of window
-        - Otherwise, dialog is vertically centered
-      - Width:
-        - Always stays between @minWidth and @maxWidth
-        - Sizes to width of window
-      - Height:
-        - Always stays between @minHeight and @maxHeight
-        - If window height < @maxHeight and dialog height > 50% of window
-          height, dialog height = window height
-        - Otherwise, dialog height sizes to its content
-     */
-  /* Purpose of this element is to control the dialog body's height based on the height
-       of the window. The dialog body's height should:
-         - Match height of window when dialog body's intrinsic height < 50% of window height.
-           In this case, .win-contentdialog-column0or1 will be in column 1 allowing
-           the dialog's body to fill the height of the window.
-         - Size to content otherwise.
-           In this case, .win-contentdialog-column0or1 will be in column 0 preventing
-           the dialog's body from growing.
-       This element works by moving between flexbox columns as the window's height changes.
-     */
-}
-.win-contentdialog.win-contentdialog-verticalalignment {
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  height: 100vh;
-  overflow: hidden;
-  display: none;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-pack: center;
-  -webkit-justify-content: center;
-  justify-content: center;
-  /* center on flex axis (vertically) */
-  -ms-flex-line-pack: center;
-  -webkit-align-content: center;
-  align-content: center;
-  /* maintain horizontal centering when the flexbox has 2 columns */
-}
-.win-contentdialog.win-contentdialog-verticalalignment.win-contentdialog-devicefixedsupported {
-  position: -ms-device-fixed;
-  height: auto;
-  bottom: 0;
-}
-.win-contentdialog.win-contentdialog-verticalalignment.win-contentdialog-visible {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-}
-.win-contentdialog .win-contentdialog-backgroundoverlay {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-}
-.win-contentdialog .win-contentdialog-dialog {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  z-index: 1;
-  /* Put the dialog's body above the backgroundoverlay */
-  outline-style: solid;
-  outline-width: 1px;
-  box-sizing: border-box;
-  padding: 18px 24px 24px 24px;
-  width: 100%;
-  min-width: 320px;
-  max-width: 456px;
-  min-height: 184px;
-  max-height: 758px;
-  /* Center horizontally */
-  margin-left: auto;
-  margin-right: auto;
-}
-.win-contentdialog .win-contentdialog-column0or1 {
-  -ms-flex: 10000 0 50%;
-  -webkit-flex: 10000 0 50%;
-  flex: 10000 0 50%;
-  width: 0;
-}
-@media (min-height: 640px) {
-  .win-contentdialog .win-contentdialog-dialog {
-    -ms-flex: 0 1 auto;
-    -webkit-flex: 0 1 auto;
-    flex: 0 1 auto;
-  }
-  .win-contentdialog .win-contentdialog-column0or1 {
-    display: none;
-  }
-}
-.win-contentdialog .win-contentdialog-scroller {
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  overflow: auto;
-}
-.win-contentdialog .win-contentdialog-title {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  font-size: 20px;
-  font-weight: 400;
-  line-height: 1.2;
-  margin: 0;
-}
-.win-contentdialog .win-contentdialog-content {
-  -ms-flex: 1 0 auto;
-  -webkit-flex: 1 0 auto;
-  flex: 1 0 auto;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-contentdialog .win-contentdialog-commands {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  margin-top: 24px;
-  margin-right: -4px;
-  /* Chop off margin on last command */
-}
-.win-contentdialog .win-contentdialog-commandspacer {
-  visibility: hidden;
-}
-.win-contentdialog .win-contentdialog-commands > button {
-  /* Each command should have the same width. Flexbox distributes widths using each
-           item's width and flex-grow as weights. Giving each command a flex-grow of 1
-           and a width of 0 causes each item to have equal weights and thus equal widths.
-         */
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  width: 0;
-  margin-right: 4px;
-  /* 4px of space between each command */
-  white-space: nowrap;
-}
-.win-splitview {
-  position: relative;
-  width: 100%;
-  height: 100%;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  overflow: hidden;
-}
-.win-splitview.win-splitview-placementtop,
-.win-splitview.win-splitview-placementbottom {
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-}
-.win-splitview.win-splitview-placementtop .win-splitview-panewrapper,
-.win-splitview.win-splitview-placementbottom .win-splitview-panewrapper {
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-}
-.win-splitview .win-splitview-panewrapper {
-  position: relative;
-  z-index: 1;
-  outline: none;
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  overflow: hidden;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-}
-.win-splitview .win-splitview-paneoutline {
-  display: none;
-  pointer-events: none;
-  position: absolute;
-  top: 0;
-  left: 0;
-  border: 1px solid transparent;
-  width: calc(100% - 2px);
-  height: calc(100% - 2px);
-  z-index: 1;
-}
-.win-splitview .win-splitview-pane {
-  outline: none;
-}
-.win-splitview .win-splitview-pane,
-.win-splitview .win-splitview-paneplaceholder {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  overflow: hidden;
-}
-.win-splitview .win-splitview-contentwrapper {
-  position: relative;
-  z-index: 0;
-  -ms-flex: 1 1 0%;
-  -webkit-flex: 1 1 0%;
-  flex: 1 1 0%;
-  overflow: hidden;
-}
-.win-splitview .win-splitview-content {
-  position: absolute;
-  width: 100%;
-  height: 100%;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-placementleft .win-splitview-pane,
-.win-splitview.win-splitview-pane-opened.win-splitview-placementright .win-splitview-pane {
-  width: 320px;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-placementtop .win-splitview-pane,
-.win-splitview.win-splitview-pane-opened.win-splitview-placementbottom .win-splitview-pane {
-  height: 60px;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementtop .win-splitview-panewrapper {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100%;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementbottom .win-splitview-panewrapper {
-  position: absolute;
-  bottom: 0;
-  left: 0;
-  width: 100%;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft {
-  position: static;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft .win-splitview-panewrapper {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: auto;
-  height: 100%;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ar) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(dv) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(fa) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(he) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ku-Arab) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(pa-Arab) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(prs) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ps) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(sd-Arab) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(syr) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ug) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ur) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(qps-plocm) .win-splitview-panewrapper {
-  position: absolute;
-  top: 0;
-  left: auto;
-  right: 0;
-  height: 100%;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright .win-splitview-panewrapper {
-  position: absolute;
-  top: 0;
-  left: auto;
-  right: 0;
-  height: 100%;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ar) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(dv) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(fa) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(he) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ku-Arab) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(pa-Arab) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(prs) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ps) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(sd-Arab) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(syr) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ug) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ur) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(qps-plocm) .win-splitview-panewrapper {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: auto;
-  height: 100%;
-}
-.win-splitview.win-splitview-pane-closed .win-splitview-paneplaceholder {
-  display: none;
-}
-.win-splitview.win-splitview-pane-closed.win-splitview-placementtop .win-splitview-pane,
-.win-splitview.win-splitview-pane-closed.win-splitview-placementbottom .win-splitview-pane {
-  height: 24px;
-}
-.win-splitview.win-splitview-pane-closed.win-splitview-placementleft .win-splitview-pane,
-.win-splitview.win-splitview-pane-closed.win-splitview-placementright .win-splitview-pane {
-  width: 48px;
-}
-.win-splitview.win-splitview-pane-closed.win-splitview-closeddisplaynone .win-splitview-pane {
-  display: none;
-}
-.win-splitview.win-splitview-openeddisplayinline .win-splitview-paneplaceholder {
-  display: none;
-}
-button.win-splitviewpanetoggle {
-  touch-action: manipulation;
-  box-sizing: border-box;
-  height: 48px;
-  width: 48px;
-  min-height: 0;
-  min-width: 0;
-  padding: 0;
-  border: none;
-  margin: 0;
-  outline: none;
-}
-button.win-splitviewpanetoggle:after {
-  font-size: 24px;
-  font-family: 'Segoe MDL2 Assets', 'Symbols';
-  font-weight: 400;
-  line-height: 1.333;
-  content: "\E700";
-}
-.win-appbar {
-  width: 100%;
-  min-width: 32px;
-  /* enough to fit the overflowbutton */
-  position: fixed;
-  position: -ms-device-fixed;
-  /* AppBar should overlay content in the body when opened or closed.
-     * This z-index value is chosen to be smaller than light dismissables.
-     * z-index will be overwritten by the light dismiss service to an even
-     * higher value when the AppBar is in the opened state.
-     */
-  z-index: 999;
-}
-.win-appbar.win-appbar-top {
-  top: 0;
-}
-.win-appbar.win-appbar-bottom {
-  bottom: 0;
-}
-.win-appbar.win-appbar-closed.win-appbar-closeddisplaynone {
-  display: none;
-}
-body {
-  background-color: #000000;
-  color: #ffffff;
-}
-.win-ui-dark {
-  background-color: #000000;
-  color: #ffffff;
-}
-.win-ui-light {
-  background-color: #ffffff;
-  color: #000000;
-}
-winjs-themedetection-tag {
-  opacity: 0;
-}
-::selection {
-  color: #fff;
-}
-.win-link:hover {
-  color: rgba(255, 255, 255, 0.6);
-}
-.win-link:active {
-  color: rgba(255, 255, 255, 0.4);
-}
-.win-link[disabled] {
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-checkbox::-ms-check {
-  color: #ffffff;
-  border-color: rgba(255, 255, 255, 0.8);
-  background-color: transparent;
-}
-.win-checkbox:indeterminate::-ms-check {
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-checkbox:checked::-ms-check {
-  color: #fff;
-  border-color: transparent;
-}
-.win-checkbox:hover::-ms-check {
-  border-color: #ffffff;
-}
-.win-checkbox:hover:indeterminate::-ms-check {
-  color: #ffffff;
-}
-.win-checkbox:active::-ms-check {
-  border-color: transparent;
-  background-color: rgba(255, 255, 255, 0.6);
-}
-.win-checkbox:indeterminate:active::-ms-check {
-  color: rgba(255, 255, 255, 0.6);
-  border-color: rgba(255, 255, 255, 0.8);
-  background-color: transparent;
-}
-.win-checkbox:disabled::-ms-check,
-.win-checkbox:indeterminate:disabled::-ms-check {
-  color: rgba(255, 255, 255, 0.2);
-  border-color: rgba(255, 255, 255, 0.2);
-  background-color: transparent;
-}
-.win-radio::-ms-check {
-  color: rgba(255, 255, 255, 0.8);
-  border-color: rgba(255, 255, 255, 0.8);
-  background-color: transparent;
-}
-.win-radio:hover::-ms-check {
-  border-color: #ffffff;
-}
-.win-radio:hover::-ms-check {
-  color: #ffffff;
-}
-.win-radio:active::-ms-check {
-  color: rgba(255, 255, 255, 0.6);
-  border-color: rgba(255, 255, 255, 0.6);
-}
-.win-radio:disabled::-ms-check {
-  color: rgba(255, 255, 255, 0.2);
-  border-color: rgba(255, 255, 255, 0.2);
-}
-.win-progress-bar:not(:indeterminate),
-.win-progress-ring:not(:indeterminate),
-.win-ring:not(:indeterminate) {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-progress-bar::-webkit-progress-bar,
-.win-progress-ring::-webkit-progress-bar,
-.win-ring::-webkit-progress-bar {
-  background-color: transparent;
-}
-.win-progress-ring,
-.win-ring {
-  background-color: transparent;
-}
-.win-button {
-  color: #ffffff;
-  background-color: rgba(255, 255, 255, 0.2);
-  border-color: transparent;
-}
-.win-button.win-button-primary {
-  color: #fff;
-}
-.win-button:hover,
-.win-button.win-button-primary:hover {
-  border-color: rgba(255, 255, 255, 0.4);
-}
-.win-button:active,
-.win-button.win-button-primary:active {
-  background-color: rgba(255, 255, 255, 0.4);
-}
-.win-button:disabled,
-.win-button.win-button-primary:disabled {
-  color: rgba(255, 255, 255, 0.2);
-  background-color: rgba(255, 255, 255, 0.2);
-  border-color: transparent;
-}
-.win-dropdown {
-  color: #ffffff;
-  background-color: rgba(255, 255, 255, 0.2);
-  border-color: rgba(255, 255, 255, 0.4);
-}
-.win-dropdown::-ms-expand {
-  color: rgba(255, 255, 255, 0.8);
-  background-color: transparent;
-}
-.win-dropdown:hover {
-  background-color: #2b2b2b;
-  border-color: rgba(255, 255, 255, 0.6);
-}
-.win-dropdown:disabled {
-  color: rgba(255, 255, 255, 0.2);
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-dropdown:disabled::-ms-expand {
-  color: rgba(255, 255, 255, 0.2);
-  border-color: rgba(255, 255, 255, 0.2);
-}
-.win-dropdown option {
-  color: #ffffff;
-  background-color: #2b2b2b;
-}
-.win-dropdown option:checked {
-  color: #ffffff;
-}
-.win-dropdown option:hover,
-.win-dropdown option:active {
-  background-color: rgba(0, 0, 0, 0.2);
-  color: #ffffff;
-}
-.win-dropdown optgroup {
-  color: #ffffff;
-  background-color: #2b2b2b;
-}
-.win-dropdown optgroup:disabled {
-  color: rgba(255, 255, 255, 0.2);
-}
-select[multiple].win-dropdown {
-  border: none;
-  background-color: #2b2b2b;
-}
-select[multiple].win-dropdown option {
-  color: #ffffff;
-}
-select[multiple].win-dropdown option:hover {
-  color: #ffffff;
-}
-select[multiple].win-dropdown option:checked {
-  color: #ffffff;
-}
-.win-slider {
-  background-color: transparent;
-}
-.win-slider:hover::-ms-thumb {
-  background: #f9f9f9;
-}
-.win-slider:hover::-webkit-slider-thumb {
-  background: #f9f9f9;
-}
-.win-slider:hover::-moz-range-thumb {
-  background: #f9f9f9;
-}
-.win-slider:active::-ms-thumb {
-  background: #767676;
-}
-.win-slider:active::-webkit-slider-thumb {
-  background: #767676;
-}
-.win-slider:active::-moz-range-thumb {
-  background: #767676;
-}
-.win-slider:disabled::-ms-thumb {
-  background: #333333;
-}
-.win-slider:disabled::-webkit-slider-thumb {
-  background: #333333;
-}
-.win-slider:disabled::-moz-range-thumb {
-  background: #333333;
-}
-.win-slider:disabled::-ms-fill-lower {
-  background: rgba(255, 255, 255, 0.2);
-}
-.win-slider::-ms-fill-upper {
-  background: rgba(255, 255, 255, 0.4);
-}
-.win-slider::-webkit-slider-runnable-track {
-  background: rgba(255, 255, 255, 0.4);
-}
-.win-slider::-moz-range-track {
-  background: rgba(255, 255, 255, 0.4);
-}
-.win-slider:active::-ms-fill-upper {
-  background: rgba(255, 255, 255, 0.4);
-}
-.win-slider:active::-webkit-slider-runnable-track {
-  background: rgba(255, 255, 255, 0.4);
-}
-.win-slider:active::-moz-range-track {
-  background: rgba(255, 255, 255, 0.4);
-}
-.win-slider:disabled::-ms-fill-upper {
-  background: rgba(255, 255, 255, 0.2);
-}
-.win-slider:disabled::-webkit-slider-runnable-track {
-  background: rgba(255, 255, 255, 0.2);
-}
-.win-slider:disabled::-moz-range-track {
-  background: rgba(255, 255, 255, 0.2);
-}
-.win-slider::-ms-track {
-  color: transparent;
-  background-color: transparent;
-}
-.win-slider::-ms-ticks-before,
-.win-slider::-ms-ticks-after {
-  color: rgba(255, 255, 255, 0.4);
-}
-.win-textbox,
-.win-textarea {
-  color: #ffffff;
-  background-color: rgba(0, 0, 0, 0.4);
-  border-color: rgba(255, 255, 255, 0.4);
-}
-.win-textbox:-ms-input-placeholder,
-.win-textarea:-ms-input-placeholder {
-  color: rgba(255, 255, 255, 0.6);
-}
-.win-textbox::-webkit-input-placeholder,
-.win-textarea::-webkit-input-placeholder {
-  color: rgba(255, 255, 255, 0.6);
-}
-.win-textbox::-moz-input-placeholder,
-.win-textarea::-moz-input-placeholder {
-  color: rgba(255, 255, 255, 0.6);
-}
-.win-textbox:hover,
-.win-textarea:hover {
-  background-color: rgba(0, 0, 0, 0.6);
-  border-color: rgba(255, 255, 255, 0.6);
-}
-.win-textbox:focus,
-.win-textarea:focus {
-  color: #000000;
-  background-color: #ffffff;
-}
-.win-textbox::-ms-clear,
-.win-textbox::-ms-reveal {
-  display: block;
-  color: rgba(0, 0, 0, 0.6);
-}
-.win-textbox::-ms-clear:active,
-.win-textbox::-ms-reveal:active {
-  color: #ffffff;
-}
-.win-xbox :focus {
-  outline: 2px solid white;
-}
-.win-selectionmode .win-itemcontainer.win-container .win-itembox::after,
-.win-itemcontainer.win-selectionmode.win-container .win-itembox::after,
-.win-listview .win-surface.win-selectionmode .win-itembox::after {
-  border-color: #ffffff;
-  background-color: #393939;
-}
-.win-selectioncheckmark {
-  color: #ffffff;
-}
-html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,
-html.win-hoverable .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,
-html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox,
-.win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,
-.win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,
-.win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-listview .win-itembox,
-.win-itemcontainer .win-itembox {
-  background-color: #1d1d1d;
-}
-.win-listview .win-container.win-backdrop {
-  background-color: rgba(155, 155, 155, 0.23);
-}
-.win-listview .win-groupheader {
-  outline-color: #ffffff;
-}
-.win-listview .win-focusedoutline,
-.win-itemcontainer .win-focusedoutline {
-  outline: #ffffff dashed 2px;
-}
-.win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,
-.win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground {
-  opacity: 0.6;
-}
-.win-listview.win-selectionstylefilled .win-selected,
-.win-itemcontainer.win-selectionstylefilled.win-selected {
-  color: #ffffff;
-}
-.win-flipview .win-navbutton {
-  background-color: rgba(255, 255, 255, 0.4);
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-flipview .win-navbutton:hover:active {
-  background-color: rgba(255, 255, 255, 0.8);
-}
-html.win-hoverable .win-flipview .win-navbutton:hover {
-  background-color: rgba(255, 255, 255, 0.6);
-}
-.win-backbutton,
-.win-back,
-.win-navigation-backbutton {
-  background-color: transparent;
-  border: none;
-  color: #ffffff;
-}
-.win-backbutton:hover,
-.win-navigation-backbutton:hover .win-back {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-.win-backbutton:active,
-.win-navigation-backbutton:active .win-back {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-backbutton:disabled,
-.win-backbutton:disabled:active,
-.win-navigation-backbutton:disabled,
-.win-navigation-backbutton:disabled .win-back,
-.win-navigation-backbutton:disabled:active .win-back {
-  color: rgba(255, 255, 255, 0.4);
-  background-color: transparent;
-}
-.win-backbutton:focus,
-.win-navigation-backbutton:focus .win-back {
-  outline-color: #ffffff;
-}
-.win-tooltip {
-  color: #ffffff;
-  border-color: #767676;
-  background-color: #2b2b2b;
-}
-.win-rating .win-star.win-tentative.win-full {
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-rating .win-star.win-average.win-full,
-.win-rating .win-star.win-average.win-full.win-disabled {
-  color: rgba(255, 255, 255, 0.4);
-}
-.win-rating .win-star.win-empty {
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-toggleswitch-header,
-.win-toggleswitch-value {
-  color: #ffffff;
-}
-.win-toggleswitch-thumb {
-  background-color: rgba(255, 255, 255, 0.8);
-}
-.win-toggleswitch-off .win-toggleswitch-track {
-  border-color: rgba(255, 255, 255, 0.8);
-}
-.win-toggleswitch-pressed .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-.win-toggleswitch-pressed .win-toggleswitch-track {
-  border-color: transparent;
-  background-color: rgba(255, 255, 255, 0.6);
-}
-.win-toggleswitch-disabled .win-toggleswitch-header,
-.win-toggleswitch-disabled .win-toggleswitch-value {
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-toggleswitch-disabled .win-toggleswitch-thumb {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-toggleswitch-disabled .win-toggleswitch-track {
-  border-color: rgba(255, 255, 255, 0.2);
-}
-.win-toggleswitch-on .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-.win-toggleswitch-on .win-toggleswitch-track {
-  border-color: transparent;
-}
-.win-toggleswitch-on.win-toggleswitch-pressed .win-toggleswitch-track {
-  background-color: rgba(255, 255, 255, 0.6);
-}
-.win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-thumb {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-semanticzoom-button {
-  background-color: rgba(216, 216, 216, 0.33);
-  border-color: transparent;
-}
-button.win-semanticzoom-button.win-semanticzoom-button:active,
-button.win-semanticzoom-button.win-semanticzoom-button:hover:active {
-  background-color: #ffffff;
-}
-.win-pivot .win-pivot-title {
-  color: #ffffff;
-}
-.win-pivot .win-pivot-navbutton {
-  background-color: rgba(255, 255, 255, 0.4);
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active {
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-pivot button.win-pivot-header {
-  color: rgba(255, 255, 255, 0.6);
-  background-color: transparent;
-}
-.win-pivot button.win-pivot-header:focus,
-.win-pivot button.win-pivot-header.win-pivot-header:hover:active {
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-pivot button.win-pivot-header.win-pivot-header-selected {
-  color: #ffffff;
-  background-color: transparent;
-}
-.win-pivot-header[disabled] {
-  color: rgba(255, 255, 255, 0.4);
-}
-button.win-hub-section-header-tabstop,
-button.win-hub-section-header-tabstop:hover:active {
-  color: #ffffff;
-}
-button.win-hub-section-header-tabstop.win-keyboard:focus {
-  outline: 1px dotted #ffffff;
-}
-button.win-hub-section-header-tabstop:-ms-keyboard-active {
-  color: #ffffff;
-}
-button.win-hub-section-header-tabstop.win-hub-section-header-interactive.win-hub-section-header-interactive:hover:active {
-  color: rgba(255, 255, 255, 0.4);
-}
-button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active {
-  color: rgba(255, 255, 255, 0.4);
-}
-.win-overlay {
-  outline: none;
-}
-hr.win-command {
-  background-color: rgba(255, 255, 255, 0.4);
-}
-div.win-command,
-button.win-command {
-  border-color: transparent;
-  background-color: transparent;
-}
-div.win-command:hover:active,
-button.win-command:hover:active {
-  border-color: transparent;
-}
-button:enabled.win-command.win-keyboard:focus,
-div.win-command.win-keyboard:focus,
-button:enabled.win-command.win-command.win-keyboard:hover:focus,
-div.win-command.win-command.win-keyboard:hover:focus {
-  border-color: #ffffff;
-}
-.win-commandimage {
-  color: #ffffff;
-}
-button.win-command.win-command:enabled:hover:active,
-button.win-command.win-command:enabled:active {
-  background-color: rgba(255, 255, 255, 0.2);
-  color: #ffffff;
-}
-button:enabled:hover:active .win-commandimage,
-button:enabled:active .win-commandimage {
-  color: #ffffff;
-}
-button:disabled .win-commandimage,
-button:disabled:active .win-commandimage {
-  color: rgba(255, 255, 255, 0.2);
-}
-button .win-label {
-  color: #ffffff;
-}
-button[aria-checked=true]:enabled .win-label,
-button[aria-checked=true]:enabled .win-commandimage,
-button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {
-  color: #ffffff;
-}
-button[aria-checked=true]:-ms-keyboard-active .win-commandimage {
-  color: #ffffff;
-}
-button[aria-checked=true].win-command:before {
-  position: absolute;
-  height: 100%;
-  width: 100%;
-  opacity: 0.6;
-  box-sizing: content-box;
-  content: "";
-  /* We want this pseudo element to cover the border of its parent. */
-  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/
-  border-width: 1px;
-  border-style: solid;
-  top: -1px;
-  left: -1px;
-}
-button.win-command:enabled:-ms-keyboard-active {
-  background-color: rgba(255, 255, 255, 0.2);
-  color: #ffffff;
-}
-button[aria-checked=true].win-command:enabled:hover:active {
-  background-color: transparent;
-}
-button.win-command:disabled,
-button.win-command:disabled:hover:active {
-  background-color: transparent;
-  border-color: transparent;
-}
-button.win-command:disabled .win-label,
-button.win-command:disabled:active .win-label {
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-navbar,
-.win-navbar {
-  background-color: #393939;
-  border-color: #393939;
-}
-.win-navbar.win-menulayout .win-navbar-menu,
-.win-navbar.win-menulayout .win-navbar-menu,
-.win-navbar.win-menulayout .win-toolbar,
-.win-navbar.win-menulayout .win-toolbar {
-  background-color: inherit;
-}
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton {
-  background-color: transparent;
-  outline: none;
-  border-color: transparent;
-}
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active {
-  background-color: transparent;
-}
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis {
-  color: #ffffff;
-}
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus {
-  border-color: #ffffff;
-}
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active {
-  background-color: transparent;
-}
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis {
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis {
-  color: #ffffff;
-}
-.win-flyout,
-.win-flyout {
-  background-color: #000000;
-}
-.win-settingsflyout {
-  background-color: #000000;
-}
-.win-menu button,
-.win-menu button {
-  background-color: transparent;
-  color: #ffffff;
-}
-.win-menu button.win-command.win-command:enabled:hover:active,
-.win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active {
-  background-color: rgba(255, 255, 255, 0.2);
-  color: #ffffff;
-}
-.win-menu-containsflyoutcommand button.win-command-flyout-activated:before,
-.win-menu-containsflyoutcommand button.win-command-flyout-activated:before {
-  position: absolute;
-  height: 100%;
-  width: 100%;
-  opacity: 0.6;
-  content: "";
-  box-sizing: content-box;
-  /* We want this pseudo element to cover the border of its parent. */
-  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/
-  border-width: 1px;
-  border-style: solid;
-  top: -1px;
-  left: -1px;
-}
-.win-menu button[aria-checked=true].win-command:before,
-.win-menu button[aria-checked=true].win-command:before {
-  background-color: transparent;
-  border-color: transparent;
-}
-.win-menu button:disabled,
-.win-menu button:disabled,
-.win-menu button:disabled:active,
-.win-menu button:disabled:active {
-  background-color: transparent;
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-commandingsurface .win-commandingsurface-actionarea,
-.win-commandingsurface .win-commandingsurface-actionarea {
-  background-color: #393939;
-}
-.win-commandingsurface button.win-commandingsurface-overflowbutton,
-.win-commandingsurface button.win-commandingsurface-overflowbutton {
-  background-color: transparent;
-  border-color: transparent;
-}
-.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,
-.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active {
-  background-color: transparent;
-}
-.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,
-.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis {
-  color: #ffffff;
-}
-.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,
-.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus {
-  border-color: #ffffff;
-}
-.win-commandingsurface .win-commandingsurface-overflowarea,
-.win-commandingsurface .win-commandingsurface-overflowarea {
-  background-color: #2b2b2b;
-}
-.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,
-.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,
-.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active {
-  color: #ffffff;
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-autosuggestbox-flyout-highlighttext {
-  color: #4617b4;
-}
-.win-autosuggestbox-suggestion-separator {
-  color: #7a7a7a;
-}
-.win-autosuggestbox-suggestion-separator hr {
-  border-color: #7a7a7a;
-}
-.win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext {
-  color: #a38bda;
-}
-.win-autosuggestbox-flyout {
-  background-color: #2b2b2b;
-  color: #ffffff;
-}
-.win-autosuggestbox-suggestion-result:hover:active,
-.win-autosuggestbox-suggestion-query:hover:active {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-searchbox-button {
-  color: rgba(255, 255, 255, 0.4);
-}
-.win-searchbox-button-input-focus {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {
-  color: #ffffff;
-}
-.win-splitviewcommand-button {
-  background-color: transparent;
-  color: #ffffff;
-}
-.win-splitviewcommand-button.win-pressed {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-splitviewcommand-button.win-keyboard:focus::before {
-  content: "";
-  pointer-events: none;
-  position: absolute;
-  box-sizing: border-box;
-  top: 0;
-  left: 0;
-  height: 100%;
-  width: 100%;
-  border: 1px dotted #ffffff;
-}
-.win-navbarcontainer-pageindicator {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-navbarcontainer-pageindicator-current {
-  background-color: rgba(255, 255, 255, 0.6);
-}
-.win-navbarcontainer-navarrow {
-  background-color: rgba(255, 255, 255, 0.4);
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-navbarcontainer-navarrow.win-navbarcontainer-navarrow:hover:active {
-  background-color: rgba(255, 255, 255, 0.8);
-}
-.win-navbarcommand-button,
-.win-navbarcommand-splitbutton {
-  background-color: rgba(255, 255, 255, 0.1);
-  color: #ffffff;
-}
-.win-navbarcommand-button.win-pressed,
-.win-navbarcommand-splitbutton.win-pressed {
-  background-color: rgba(255, 255, 255, 0.28);
-}
-.win-navbarcommand-button.win-keyboard:focus::before {
-  content: "";
-  pointer-events: none;
-  position: absolute;
-  box-sizing: border-box;
-  top: 0;
-  left: 0;
-  height: 100%;
-  width: 100%;
-  border: 1px dotted #ffffff;
-}
-.win-navbarcommand-splitbutton.win-keyboard:focus::before {
-  border-color: #ffffff;
-}
-.win-contentdialog-dialog {
-  background-color: #2b2b2b;
-}
-.win-contentdialog-title {
-  color: #ffffff;
-}
-.win-contentdialog-content {
-  color: #ffffff;
-}
-.win-contentdialog-backgroundoverlay {
-  background-color: #000000;
-  opacity: 0.6;
-}
-.win-splitview-pane {
-  background-color: #171717;
-}
-button.win-splitviewpanetoggle {
-  color: #ffffff;
-  background-color: transparent;
-}
-button.win-splitviewpanetoggle:active,
-button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover {
-  color: #ffffff;
-  background-color: rgba(255, 255, 255, 0.2);
-}
-button.win-splitviewpanetoggle.win-keyboard:focus {
-  border: 1px dotted #ffffff;
-}
-button.win-splitviewpanetoggle:disabled,
-button.win-splitviewpanetoggle:disabled:active,
-button.win-splitviewpanetoggle.win-splitviewpanetoggle:disabled:hover {
-  color: rgba(255, 255, 255, 0.2);
-  background-color: transparent;
-}
-html.win-hoverable {
-  /* LegacyAppBar control colors */
-}
-html.win-hoverable .win-selectionstylefilled .win-container:hover .win-itembox,
-html.win-hoverable .win-selectionstylefilled.win-container:hover .win-itembox {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-html.win-hoverable .win-listview .win-itembox:hover::before,
-html.win-hoverable .win-itemcontainer .win-itembox:hover::before {
-  border-color: #ffffff;
-}
-html.win-hoverable .win-listview .win-container.win-selected:hover .win-selectionborder,
-html.win-hoverable .win-itemcontainer.win-container.win-selected:hover .win-selectionborder,
-html.win-hoverable .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,
-html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground {
-  opacity: 0.8;
-}
-html.win-hoverable .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-html.win-hoverable .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed).win-toggleswitch-on .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-html.win-hoverable .win-toggleswitch-off:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track {
-  border-color: #ffffff;
-}
-html.win-hoverable button:hover.win-semanticzoom-button {
-  background-color: #d8d8d8;
-}
-html.win-hoverable .win-pivot .win-pivot-navbutton:hover {
-  color: rgba(255, 255, 255, 0.6);
-}
-html.win-hoverable .win-pivot button.win-pivot-header:hover {
-  color: baseMediumHigh;
-}
-html.win-hoverable button.win-hub-section-header-tabstop:hover {
-  color: #ffffff;
-}
-html.win-hoverable button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover {
-  color: rgba(255, 255, 255, 0.8);
-}
-html.win-hoverable.win-navbar button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-navbar button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable.win-navbar button.win-navbar-invokebutton:disabled:hover,
-html.win-hoverable .win-navbar button.win-navbar-invokebutton:disabled:hover {
-  background-color: transparent;
-}
-html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {
-  color: #ffffff;
-}
-html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {
-  color: #ffffff;
-}
-html.win-hoverable button.win-command:enabled:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-  color: #ffffff;
-}
-html.win-hoverable button.win-command:enabled:hover .win-commandglyph {
-  color: #ffffff;
-}
-html.win-hoverable .win-menu button.win-command:enabled:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-  color: #ffffff;
-}
-html.win-hoverable button[aria-checked=true].win-command:hover {
-  background-color: transparent;
-}
-html.win-hoverable button:enabled[aria-checked=true].win-command:hover:before {
-  opacity: 0.8;
-}
-html.win-hoverable button:enabled[aria-checked=true].win-command:hover:active:before {
-  opacity: 0.9;
-}
-html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover,
-html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,
-html.win-hoverable.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,
-html.win-hoverable .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,
-html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis {
-  color: #ffffff;
-}
-html.win-hoverable .win-autosuggestbox-suggestion-result:hover,
-html.win-hoverable .win-autosuggestbox-suggestion-query:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-html.win-hoverable .win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {
-  color: #ffffff;
-}
-html.win-hoverable .win-splitviewcommand-button:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-html.win-hoverable .win-splitviewcommand-button:hover.win-pressed {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-html.win-hoverable .win-navbarcontainer-navarrow:hover {
-  background-color: rgba(255, 255, 255, 0.6);
-}
-html.win-hoverable .win-navbarcommand-button:hover,
-html.win-hoverable .win-navbarcommand-splitbutton:hover {
-  background-color: rgba(255, 255, 255, 0.19);
-}
-html.win-hoverable .win-navbarcommand-button:hover.win-pressed,
-html.win-hoverable .win-navbarcommand-splitbutton:hover.win-pressed {
-  background-color: rgba(255, 255, 255, 0.28);
-}
-html.win-hoverable button.win-splitviewpanetoggle:hover {
-  color: #ffffff;
-  background-color: rgba(255, 255, 255, 0.1);
-}
-.win-ui-light body {
-  background-color: #ffffff;
-  color: #000000;
-}
-.win-ui-light .win-ui-light {
-  background-color: #ffffff;
-  color: #000000;
-}
-.win-ui-light .win-ui-dark {
-  background-color: #000000;
-  color: #ffffff;
-}
-.win-ui-light ::selection {
-  color: #fff;
-}
-.win-ui-light .win-link:hover {
-  color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-light .win-link:active {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-link[disabled] {
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-checkbox::-ms-check {
-  color: #000000;
-  border-color: rgba(0, 0, 0, 0.8);
-  background-color: transparent;
-}
-.win-ui-light .win-checkbox:indeterminate::-ms-check {
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-ui-light .win-checkbox:checked::-ms-check {
-  color: #fff;
-  border-color: transparent;
-}
-.win-ui-light .win-checkbox:hover::-ms-check {
-  border-color: #000000;
-}
-.win-ui-light .win-checkbox:hover:indeterminate::-ms-check {
-  color: #000000;
-}
-.win-ui-light .win-checkbox:active::-ms-check {
-  border-color: transparent;
-  background-color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-light .win-checkbox:indeterminate:active::-ms-check {
-  color: rgba(0, 0, 0, 0.6);
-  border-color: rgba(0, 0, 0, 0.8);
-  background-color: transparent;
-}
-.win-ui-light .win-checkbox:disabled::-ms-check,
-.win-ui-light .win-checkbox:indeterminate:disabled::-ms-check {
-  color: rgba(0, 0, 0, 0.2);
-  border-color: rgba(0, 0, 0, 0.2);
-  background-color: transparent;
-}
-.win-ui-light .win-radio::-ms-check {
-  color: rgba(0, 0, 0, 0.8);
-  border-color: rgba(0, 0, 0, 0.8);
-  background-color: transparent;
-}
-.win-ui-light .win-radio:hover::-ms-check {
-  border-color: #000000;
-}
-.win-ui-light .win-radio:hover::-ms-check {
-  color: #000000;
-}
-.win-ui-light .win-radio:active::-ms-check {
-  color: rgba(0, 0, 0, 0.6);
-  border-color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-light .win-radio:disabled::-ms-check {
-  color: rgba(0, 0, 0, 0.2);
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-progress-bar:not(:indeterminate),
-.win-ui-light .win-progress-ring:not(:indeterminate),
-.win-ui-light .win-ring:not(:indeterminate) {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-progress-bar::-webkit-progress-bar,
-.win-ui-light .win-progress-ring::-webkit-progress-bar,
-.win-ui-light .win-ring::-webkit-progress-bar {
-  background-color: transparent;
-}
-.win-ui-light .win-progress-ring,
-.win-ui-light .win-ring {
-  background-color: transparent;
-}
-.win-ui-light .win-button {
-  color: #000000;
-  background-color: rgba(0, 0, 0, 0.2);
-  border-color: transparent;
-}
-.win-ui-light .win-button.win-button-primary {
-  color: #fff;
-}
-.win-ui-light .win-button:hover,
-.win-ui-light .win-button.win-button-primary:hover {
-  border-color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-button:active,
-.win-ui-light .win-button.win-button-primary:active {
-  background-color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-button:disabled,
-.win-ui-light .win-button.win-button-primary:disabled {
-  color: rgba(0, 0, 0, 0.2);
-  background-color: rgba(0, 0, 0, 0.2);
-  border-color: transparent;
-}
-.win-ui-light .win-dropdown {
-  color: #000000;
-  background-color: rgba(0, 0, 0, 0.2);
-  border-color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-dropdown::-ms-expand {
-  color: rgba(0, 0, 0, 0.8);
-  background-color: transparent;
-}
-.win-ui-light .win-dropdown:hover {
-  background-color: #f2f2f2;
-  border-color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-light .win-dropdown:disabled {
-  color: rgba(0, 0, 0, 0.2);
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-dropdown:disabled::-ms-expand {
-  color: rgba(0, 0, 0, 0.2);
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-dropdown option {
-  color: #000000;
-  background-color: #f2f2f2;
-}
-.win-ui-light .win-dropdown option:checked {
-  color: #ffffff;
-}
-.win-ui-light .win-dropdown option:hover,
-.win-ui-light .win-dropdown option:active {
-  background-color: rgba(0, 0, 0, 0.2);
-  color: #000000;
-}
-.win-ui-light .win-dropdown optgroup {
-  color: #000000;
-  background-color: #f2f2f2;
-}
-.win-ui-light .win-dropdown optgroup:disabled {
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light select[multiple].win-dropdown {
-  border: none;
-  background-color: #f2f2f2;
-}
-.win-ui-light select[multiple].win-dropdown option {
-  color: #000000;
-}
-.win-ui-light select[multiple].win-dropdown option:hover {
-  color: #000000;
-}
-.win-ui-light select[multiple].win-dropdown option:checked {
-  color: #ffffff;
-}
-.win-ui-light .win-slider {
-  background-color: transparent;
-}
-.win-ui-light .win-slider:hover::-ms-thumb {
-  background: #1f1f1f;
-}
-.win-ui-light .win-slider:hover::-webkit-slider-thumb {
-  background: #1f1f1f;
-}
-.win-ui-light .win-slider:hover::-moz-range-thumb {
-  background: #1f1f1f;
-}
-.win-ui-light .win-slider:active::-ms-thumb {
-  background: #cccccc;
-}
-.win-ui-light .win-slider:active::-webkit-slider-thumb {
-  background: #cccccc;
-}
-.win-ui-light .win-slider:active::-moz-range-thumb {
-  background: #cccccc;
-}
-.win-ui-light .win-slider:disabled::-ms-thumb {
-  background: #cccccc;
-}
-.win-ui-light .win-slider:disabled::-webkit-slider-thumb {
-  background: #cccccc;
-}
-.win-ui-light .win-slider:disabled::-moz-range-thumb {
-  background: #cccccc;
-}
-.win-ui-light .win-slider:disabled::-ms-fill-lower {
-  background: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-slider::-ms-fill-upper {
-  background: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-slider::-webkit-slider-runnable-track {
-  background: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-slider::-moz-range-track {
-  background: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-slider:active::-ms-fill-upper {
-  background: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-slider:active::-webkit-slider-runnable-track {
-  background: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-slider:active::-moz-range-track {
-  background: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-slider:disabled::-ms-fill-upper {
-  background: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-slider:disabled::-webkit-slider-runnable-track {
-  background: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-slider:disabled::-moz-range-track {
-  background: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-slider::-ms-track {
-  color: transparent;
-  background-color: transparent;
-}
-.win-ui-light .win-slider::-ms-ticks-before,
-.win-ui-light .win-slider::-ms-ticks-after {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-textbox,
-.win-ui-light .win-textarea {
-  color: #000000;
-  background-color: rgba(255, 255, 255, 0.4);
-  border-color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-textbox:-ms-input-placeholder,
-.win-ui-light .win-textarea:-ms-input-placeholder {
-  color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-light .win-textbox::-webkit-input-placeholder,
-.win-ui-light .win-textarea::-webkit-input-placeholder {
-  color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-light .win-textbox::-moz-input-placeholder,
-.win-ui-light .win-textarea::-moz-input-placeholder {
-  color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-light .win-textbox:hover,
-.win-ui-light .win-textarea:hover {
-  background-color: rgba(255, 255, 255, 0.6);
-  border-color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-light .win-textbox:focus,
-.win-ui-light .win-textarea:focus {
-  color: #000000;
-  background-color: #ffffff;
-}
-.win-ui-light .win-textbox::-ms-clear,
-.win-ui-light .win-textbox::-ms-reveal {
-  display: block;
-  color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-light .win-textbox::-ms-clear:active,
-.win-ui-light .win-textbox::-ms-reveal:active {
-  color: #ffffff;
-}
-.win-ui-light .win-xbox :focus {
-  outline: 2px solid white;
-}
-.win-ui-light .win-selectionmode .win-itemcontainer.win-container .win-itembox::after,
-.win-ui-light .win-itemcontainer.win-selectionmode.win-container .win-itembox::after,
-.win-ui-light .win-listview .win-surface.win-selectionmode .win-itembox::after {
-  border-color: #000000;
-  background-color: #e6e6e6;
-}
-.win-ui-light .win-selectioncheckmark {
-  color: #000000;
-}
-.win-ui-light html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,
-.win-ui-light html.win-hoverable .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,
-.win-ui-light html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox,
-.win-ui-light .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,
-.win-ui-light .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,
-.win-ui-light .win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-listview .win-itembox,
-.win-ui-light .win-itemcontainer .win-itembox {
-  background-color: #ffffff;
-}
-.win-ui-light .win-listview .win-container.win-backdrop {
-  background-color: rgba(155, 155, 155, 0.23);
-}
-.win-ui-light .win-listview .win-groupheader {
-  outline-color: #000000;
-}
-.win-ui-light .win-listview .win-focusedoutline,
-.win-ui-light .win-itemcontainer .win-focusedoutline {
-  outline: #000000 dashed 2px;
-}
-.win-ui-light .win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,
-.win-ui-light .win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground {
-  opacity: 0.4;
-}
-.win-ui-light .win-listview.win-selectionstylefilled .win-selected,
-.win-ui-light .win-itemcontainer.win-selectionstylefilled.win-selected {
-  color: #000000;
-}
-.win-ui-light .win-flipview .win-navbutton {
-  background-color: rgba(0, 0, 0, 0.4);
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-ui-light .win-flipview .win-navbutton:hover:active {
-  background-color: rgba(0, 0, 0, 0.8);
-}
-.win-ui-light html.win-hoverable .win-flipview .win-navbutton:hover {
-  background-color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-light .win-backbutton,
-.win-ui-light .win-back,
-.win-ui-light .win-navigation-backbutton {
-  background-color: transparent;
-  border: none;
-  color: #000000;
-}
-.win-ui-light .win-backbutton:hover,
-.win-ui-light .win-navigation-backbutton:hover .win-back {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-.win-ui-light .win-backbutton:active,
-.win-ui-light .win-navigation-backbutton:active .win-back {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-backbutton:disabled,
-.win-ui-light .win-backbutton:disabled:active,
-.win-ui-light .win-navigation-backbutton:disabled,
-.win-ui-light .win-navigation-backbutton:disabled .win-back,
-.win-ui-light .win-navigation-backbutton:disabled:active .win-back {
-  color: rgba(0, 0, 0, 0.4);
-  background-color: transparent;
-}
-.win-ui-light .win-backbutton:focus,
-.win-ui-light .win-navigation-backbutton:focus .win-back {
-  outline-color: #000000;
-}
-.win-ui-light .win-tooltip {
-  color: #000000;
-  border-color: #cccccc;
-  background-color: #f2f2f2;
-}
-.win-ui-light .win-rating .win-star.win-tentative.win-full {
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-ui-light .win-rating .win-star.win-average.win-full,
-.win-ui-light .win-rating .win-star.win-average.win-full.win-disabled {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-rating .win-star.win-empty {
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-toggleswitch-header,
-.win-ui-light .win-toggleswitch-value {
-  color: #000000;
-}
-.win-ui-light .win-toggleswitch-thumb {
-  background-color: rgba(0, 0, 0, 0.8);
-}
-.win-ui-light .win-toggleswitch-off .win-toggleswitch-track {
-  border-color: rgba(0, 0, 0, 0.8);
-}
-.win-ui-light .win-toggleswitch-pressed .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-.win-ui-light .win-toggleswitch-pressed .win-toggleswitch-track {
-  border-color: transparent;
-  background-color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-light .win-toggleswitch-disabled .win-toggleswitch-header,
-.win-ui-light .win-toggleswitch-disabled .win-toggleswitch-value {
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-toggleswitch-disabled .win-toggleswitch-thumb {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-toggleswitch-disabled .win-toggleswitch-track {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-toggleswitch-on .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-.win-ui-light .win-toggleswitch-on .win-toggleswitch-track {
-  border-color: transparent;
-}
-.win-ui-light .win-toggleswitch-on.win-toggleswitch-pressed .win-toggleswitch-track {
-  background-color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-light .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-thumb {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-semanticzoom-button {
-  background-color: rgba(216, 216, 216, 0.33);
-  border-color: transparent;
-}
-.win-ui-light button.win-semanticzoom-button.win-semanticzoom-button:active,
-.win-ui-light button.win-semanticzoom-button.win-semanticzoom-button:hover:active {
-  background-color: #000000;
-}
-.win-ui-light .win-pivot .win-pivot-title {
-  color: #000000;
-}
-.win-ui-light .win-pivot .win-pivot-navbutton {
-  background-color: rgba(0, 0, 0, 0.4);
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-ui-light .win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active {
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-ui-light .win-pivot button.win-pivot-header {
-  color: rgba(0, 0, 0, 0.6);
-  background-color: transparent;
-}
-.win-ui-light .win-pivot button.win-pivot-header:focus,
-.win-ui-light .win-pivot button.win-pivot-header.win-pivot-header:hover:active {
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-ui-light .win-pivot button.win-pivot-header.win-pivot-header-selected {
-  color: #000000;
-  background-color: transparent;
-}
-.win-ui-light .win-pivot-header[disabled] {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light button.win-hub-section-header-tabstop,
-.win-ui-light button.win-hub-section-header-tabstop:hover:active {
-  color: #000000;
-}
-.win-ui-light button.win-hub-section-header-tabstop.win-keyboard:focus {
-  outline: 1px dotted #000000;
-}
-.win-ui-light button.win-hub-section-header-tabstop:-ms-keyboard-active {
-  color: #000000;
-}
-.win-ui-light button.win-hub-section-header-tabstop.win-hub-section-header-interactive.win-hub-section-header-interactive:hover:active {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-overlay {
-  outline: none;
-}
-.win-ui-light hr.win-command {
-  background-color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light div.win-command,
-.win-ui-light button.win-command {
-  border-color: transparent;
-  background-color: transparent;
-}
-.win-ui-light div.win-command:hover:active,
-.win-ui-light button.win-command:hover:active {
-  border-color: transparent;
-}
-.win-ui-light button:enabled.win-command.win-keyboard:focus,
-.win-ui-light div.win-command.win-keyboard:focus,
-.win-ui-light button:enabled.win-command.win-command.win-keyboard:hover:focus,
-.win-ui-light div.win-command.win-command.win-keyboard:hover:focus {
-  border-color: #000000;
-}
-.win-ui-light .win-commandimage {
-  color: #000000;
-}
-.win-ui-light button.win-command.win-command:enabled:hover:active,
-.win-ui-light button.win-command.win-command:enabled:active {
-  background-color: rgba(0, 0, 0, 0.2);
-  color: #000000;
-}
-.win-ui-light button:enabled:hover:active .win-commandimage,
-.win-ui-light button:enabled:active .win-commandimage {
-  color: #000000;
-}
-.win-ui-light button:disabled .win-commandimage,
-.win-ui-light button:disabled:active .win-commandimage {
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light button .win-label {
-  color: #000000;
-}
-.win-ui-light button[aria-checked=true]:enabled .win-label,
-.win-ui-light button[aria-checked=true]:enabled .win-commandimage,
-.win-ui-light button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {
-  color: #000000;
-}
-.win-ui-light button[aria-checked=true]:-ms-keyboard-active .win-commandimage {
-  color: #000000;
-}
-.win-ui-light button[aria-checked=true].win-command:before {
-  position: absolute;
-  height: 100%;
-  width: 100%;
-  opacity: 0.4;
-  box-sizing: content-box;
-  content: "";
-  /* We want this pseudo element to cover the border of its parent. */
-  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/
-  border-width: 1px;
-  border-style: solid;
-  top: -1px;
-  left: -1px;
-}
-.win-ui-light button.win-command:enabled:-ms-keyboard-active {
-  background-color: rgba(0, 0, 0, 0.2);
-  color: #000000;
-}
-.win-ui-light button[aria-checked=true].win-command:enabled:hover:active {
-  background-color: transparent;
-}
-.win-ui-light button.win-command:disabled,
-.win-ui-light button.win-command:disabled:hover:active {
-  background-color: transparent;
-  border-color: transparent;
-}
-.win-ui-light button.win-command:disabled .win-label,
-.win-ui-light button.win-command:disabled:active .win-label {
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light.win-navbar,
-.win-ui-light .win-navbar {
-  background-color: #e6e6e6;
-  border-color: #e6e6e6;
-}
-.win-ui-light.win-navbar.win-menulayout .win-navbar-menu,
-.win-ui-light .win-navbar.win-menulayout .win-navbar-menu,
-.win-ui-light.win-navbar.win-menulayout .win-toolbar,
-.win-ui-light .win-navbar.win-menulayout .win-toolbar {
-  background-color: inherit;
-}
-.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,
-.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton {
-  background-color: transparent;
-  outline: none;
-  border-color: transparent;
-}
-.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,
-.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active {
-  background-color: transparent;
-}
-.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,
-.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis {
-  color: #000000;
-}
-.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,
-.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus {
-  border-color: #000000;
-}
-.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,
-.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,
-.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,
-.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active {
-  background-color: transparent;
-}
-.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,
-.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis {
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-light .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-light.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-light .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-light.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-light .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-light.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-light .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-light .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-light.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-light .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-light.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-light .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-light.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-light .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis {
-  color: #000000;
-}
-.win-ui-light.win-flyout,
-.win-ui-light .win-flyout {
-  background-color: #ffffff;
-}
-.win-ui-light .win-settingsflyout {
-  background-color: #ffffff;
-}
-.win-ui-light.win-menu button,
-.win-ui-light .win-menu button {
-  background-color: transparent;
-  color: #000000;
-}
-.win-ui-light .win-menu button.win-command.win-command:enabled:hover:active,
-.win-ui-light .win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active {
-  background-color: rgba(0, 0, 0, 0.2);
-  color: #000000;
-}
-.win-ui-light.win-menu-containsflyoutcommand button.win-command-flyout-activated:before,
-.win-ui-light .win-menu-containsflyoutcommand button.win-command-flyout-activated:before {
-  position: absolute;
-  height: 100%;
-  width: 100%;
-  opacity: 0.4;
-  content: "";
-  box-sizing: content-box;
-  /* We want this pseudo element to cover the border of its parent. */
-  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/
-  border-width: 1px;
-  border-style: solid;
-  top: -1px;
-  left: -1px;
-}
-.win-ui-light.win-menu button[aria-checked=true].win-command:before,
-.win-ui-light .win-menu button[aria-checked=true].win-command:before {
-  background-color: transparent;
-  border-color: transparent;
-}
-.win-ui-light.win-menu button:disabled,
-.win-ui-light .win-menu button:disabled,
-.win-ui-light.win-menu button:disabled:active,
-.win-ui-light .win-menu button:disabled:active {
-  background-color: transparent;
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light.win-commandingsurface .win-commandingsurface-actionarea,
-.win-ui-light .win-commandingsurface .win-commandingsurface-actionarea {
-  background-color: #e6e6e6;
-}
-.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton,
-.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton {
-  background-color: transparent;
-  border-color: transparent;
-}
-.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,
-.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active {
-  background-color: transparent;
-}
-.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,
-.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis {
-  color: #000000;
-}
-.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,
-.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus {
-  border-color: #000000;
-}
-.win-ui-light.win-commandingsurface .win-commandingsurface-overflowarea,
-.win-ui-light .win-commandingsurface .win-commandingsurface-overflowarea {
-  background-color: #f2f2f2;
-}
-.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,
-.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,
-.win-ui-light .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active {
-  color: #000000;
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-autosuggestbox-flyout-highlighttext {
-  color: #4617b4;
-}
-.win-ui-light .win-autosuggestbox-suggestion-separator {
-  color: #7a7a7a;
-}
-.win-ui-light .win-autosuggestbox-suggestion-separator hr {
-  border-color: #7a7a7a;
-}
-.win-ui-light .win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext {
-  color: #a38bda;
-}
-.win-ui-light .win-autosuggestbox-flyout {
-  background-color: #f2f2f2;
-  color: #000000;
-}
-.win-ui-light .win-autosuggestbox-suggestion-result:hover:active,
-.win-ui-light .win-autosuggestbox-suggestion-query:hover:active {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-searchbox-button {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-searchbox-button-input-focus {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-light .win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {
-  color: #ffffff;
-}
-.win-ui-light .win-splitviewcommand-button {
-  background-color: transparent;
-  color: #000000;
-}
-.win-ui-light .win-splitviewcommand-button.win-pressed {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-splitviewcommand-button.win-keyboard:focus::before {
-  content: "";
-  pointer-events: none;
-  position: absolute;
-  box-sizing: border-box;
-  top: 0;
-  left: 0;
-  height: 100%;
-  width: 100%;
-  border: 1px dotted #000000;
-}
-.win-ui-light .win-navbarcontainer-pageindicator {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light .win-navbarcontainer-pageindicator-current {
-  background-color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-light .win-navbarcontainer-navarrow {
-  background-color: rgba(0, 0, 0, 0.4);
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-ui-light .win-navbarcontainer-navarrow.win-navbarcontainer-navarrow:hover:active {
-  background-color: rgba(0, 0, 0, 0.8);
-}
-.win-ui-light .win-navbarcommand-button,
-.win-ui-light .win-navbarcommand-splitbutton {
-  background-color: rgba(0, 0, 0, 0.1);
-  color: #000000;
-}
-.win-ui-light .win-navbarcommand-button.win-pressed,
-.win-ui-light .win-navbarcommand-splitbutton.win-pressed {
-  background-color: rgba(0, 0, 0, 0.28);
-}
-.win-ui-light .win-navbarcommand-button.win-keyboard:focus::before {
-  content: "";
-  pointer-events: none;
-  position: absolute;
-  box-sizing: border-box;
-  top: 0;
-  left: 0;
-  height: 100%;
-  width: 100%;
-  border: 1px dotted #000000;
-}
-.win-ui-light .win-navbarcommand-splitbutton.win-keyboard:focus::before {
-  border-color: #000000;
-}
-.win-ui-light .win-contentdialog-dialog {
-  background-color: #f2f2f2;
-}
-.win-ui-light .win-contentdialog-title {
-  color: #000000;
-}
-.win-ui-light .win-contentdialog-content {
-  color: #000000;
-}
-.win-ui-light .win-contentdialog-backgroundoverlay {
-  background-color: #ffffff;
-  opacity: 0.6;
-}
-.win-ui-light .win-splitview-pane {
-  background-color: #f2f2f2;
-}
-.win-ui-light button.win-splitviewpanetoggle {
-  color: #000000;
-  background-color: transparent;
-}
-.win-ui-light button.win-splitviewpanetoggle:active,
-.win-ui-light button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover {
-  color: #000000;
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-ui-light button.win-splitviewpanetoggle.win-keyboard:focus {
-  border: 1px dotted #000000;
-}
-.win-ui-light button.win-splitviewpanetoggle:disabled,
-.win-ui-light button.win-splitviewpanetoggle:disabled:active,
-.win-ui-light button.win-splitviewpanetoggle.win-splitviewpanetoggle:disabled:hover {
-  color: rgba(0, 0, 0, 0.2);
-  background-color: transparent;
-}
-html.win-hoverable .win-ui-light {
-  /* LegacyAppBar control colors */
-}
-html.win-hoverable .win-ui-light .win-selectionstylefilled .win-container:hover .win-itembox,
-html.win-hoverable .win-ui-light .win-selectionstylefilled.win-container:hover .win-itembox {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-html.win-hoverable .win-ui-light .win-listview .win-itembox:hover::before,
-html.win-hoverable .win-ui-light .win-itemcontainer .win-itembox:hover::before {
-  border-color: #000000;
-}
-html.win-hoverable .win-ui-light .win-listview .win-container.win-selected:hover .win-selectionborder,
-html.win-hoverable .win-ui-light .win-itemcontainer.win-container.win-selected:hover .win-selectionborder,
-html.win-hoverable .win-ui-light .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,
-html.win-hoverable .win-ui-light .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground {
-  opacity: 0.6;
-}
-html.win-hoverable .win-ui-light .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {
-  background-color: #000000;
-}
-html.win-hoverable .win-ui-light .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed).win-toggleswitch-on .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-html.win-hoverable .win-ui-light .win-toggleswitch-off:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track {
-  border-color: #000000;
-}
-html.win-hoverable .win-ui-light button:hover.win-semanticzoom-button {
-  background-color: #d8d8d8;
-}
-html.win-hoverable .win-ui-light .win-pivot .win-pivot-navbutton:hover {
-  color: rgba(0, 0, 0, 0.6);
-}
-html.win-hoverable .win-ui-light .win-pivot button.win-pivot-header:hover {
-  color: baseMediumHigh;
-}
-html.win-hoverable .win-ui-light button.win-hub-section-header-tabstop:hover {
-  color: #000000;
-}
-html.win-hoverable .win-ui-light button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover {
-  color: rgba(0, 0, 0, 0.8);
-}
-html.win-hoverable .win-ui-light.win-navbar button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-light .win-navbar button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-light.win-navbar button.win-navbar-invokebutton:disabled:hover,
-html.win-hoverable .win-ui-light .win-navbar button.win-navbar-invokebutton:disabled:hover {
-  background-color: transparent;
-}
-html.win-hoverable .win-ui-light.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-light .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-light.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-light .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-html.win-hoverable .win-ui-light.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-ui-light .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-ui-light.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-ui-light .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {
-  color: #000000;
-}
-html.win-hoverable .win-ui-light.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-light .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-light.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-light .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-html.win-hoverable .win-ui-light.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-ui-light .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-ui-light.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-ui-light .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {
-  color: #000000;
-}
-html.win-hoverable .win-ui-light button.win-command:enabled:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-  color: #000000;
-}
-html.win-hoverable .win-ui-light button.win-command:enabled:hover .win-commandglyph {
-  color: #000000;
-}
-html.win-hoverable .win-ui-light .win-menu button.win-command:enabled:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-  color: #000000;
-}
-html.win-hoverable .win-ui-light button[aria-checked=true].win-command:hover {
-  background-color: transparent;
-}
-html.win-hoverable .win-ui-light button:enabled[aria-checked=true].win-command:hover:before {
-  opacity: 0.6;
-}
-html.win-hoverable .win-ui-light button:enabled[aria-checked=true].win-command:hover:active:before {
-  opacity: 0.7;
-}
-html.win-hoverable .win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton:hover,
-html.win-hoverable .win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,
-html.win-hoverable .win-ui-light.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,
-html.win-hoverable .win-ui-light .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-html.win-hoverable .win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,
-html.win-hoverable .win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis {
-  color: #000000;
-}
-html.win-hoverable .win-ui-light .win-autosuggestbox-suggestion-result:hover,
-html.win-hoverable .win-ui-light .win-autosuggestbox-suggestion-query:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-html.win-hoverable .win-ui-light .win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {
-  color: #ffffff;
-}
-html.win-hoverable .win-ui-light .win-splitviewcommand-button:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-html.win-hoverable .win-ui-light .win-splitviewcommand-button:hover.win-pressed {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-html.win-hoverable .win-ui-light .win-navbarcontainer-navarrow:hover {
-  background-color: rgba(0, 0, 0, 0.6);
-}
-html.win-hoverable .win-ui-light .win-navbarcommand-button:hover,
-html.win-hoverable .win-ui-light .win-navbarcommand-splitbutton:hover {
-  background-color: rgba(255, 255, 255, 0.19);
-}
-html.win-hoverable .win-ui-light .win-navbarcommand-button:hover.win-pressed,
-html.win-hoverable .win-ui-light .win-navbarcommand-splitbutton:hover.win-pressed {
-  background-color: rgba(255, 255, 255, 0.28);
-}
-html.win-hoverable .win-ui-light button.win-splitviewpanetoggle:hover {
-  color: #000000;
-  background-color: rgba(0, 0, 0, 0.1);
-}
-@media (-ms-high-contrast) {
-  ::selection {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-link {
-    color: -ms-hotlight;
-  }
-  .win-link:active {
-    color: Highlight;
-  }
-  .win-link[disabled] {
-    color: GrayText;
-  }
-  .win-checkbox::-ms-check,
-  .win-radio::-ms-check {
-    background-color: ButtonFace;
-    border-color: ButtonText;
-    color: HighlightText;
-  }
-  .win-checkbox:indeterminate::-ms-check,
-  .win-radio:indeterminate::-ms-check {
-    background-color: Highlight;
-    border-color: ButtonText;
-    color: ButtonText;
-  }
-  .win-checkbox:checked::-ms-check,
-  .win-radio:checked::-ms-check {
-    background-color: Highlight;
-    border-color: HighlightText;
-  }
-  .win-checkbox:hover::-ms-check,
-  .win-radio:hover::-ms-check {
-    border-color: Highlight;
-  }
-  .win-checkbox:hover:active::-ms-check,
-  .win-radio:hover:active::-ms-check,
-  .win-checkbox:-ms-keyboard-active::-ms-check,
-  .win-radio:-ms-keyboard-active::-ms-check {
-    border-color: Highlight;
-  }
-  .win-checkbox:disabled::-ms-check,
-  .win-radio:disabled::-ms-check,
-  .win-checkbox:disabled:active::-ms-check,
-  .win-radio:disabled:active::-ms-check {
-    background-color: ButtonFace;
-    border-color: GrayText;
-    color: GrayText;
-  }
-  .win-progress-bar,
-  .win-progress-ring,
-  .win-ring {
-    background-color: ButtonFace;
-    color: Highlight;
-  }
-  .win-progress-bar::-ms-fill,
-  .win-progress-ring::-ms-fill,
-  .win-ring::-ms-fill {
-    background-color: Highlight;
-  }
-  .win-progress-bar.win-paused:not(:indeterminate)::-ms-fill,
-  .win-progress-ring.win-paused:not(:indeterminate)::-ms-fill,
-  .win-ring.win-paused:not(:indeterminate)::-ms-fill {
-    background-color: GrayText;
-  }
-  .win-progress-bar.win-paused:not(:indeterminate),
-  .win-progress-ring.win-paused:not(:indeterminate),
-  .win-ring.win-paused:not(:indeterminate) {
-    animation-name: none;
-    opacity: 1.0;
-  }
-  .win-button {
-    border-color: ButtonText;
-    color: ButtonText;
-  }
-  .win-button:hover {
-    border-color: Highlight;
-    color: Highlight;
-  }
-  .win-button:active {
-    border-color: Highlight;
-    color: Highlight;
-  }
-  .win-button:disabled {
-    border-color: GrayText;
-    color: GrayText;
-  }
-  .win-dropdown {
-    background-color: ButtonFace;
-    border-color: ButtonText;
-    color: WindowText;
-  }
-  .win-dropdown:hover {
-    border-color: Highlight;
-  }
-  .win-dropdown:active {
-    border-color: Highlight;
-  }
-  .win-dropdown:disabled {
-    border-color: GrayText;
-    color: GrayText;
-  }
-  .win-dropdown::-ms-expand {
-    color: ButtonText;
-  }
-  .win-dropdown:disabled::-ms-expand {
-    color: GrayText;
-  }
-  .win-dropdown option {
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  .win-dropdown option:hover,
-  .win-dropdown option:active,
-  .win-dropdown option:checked {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-dropdown option:disabled {
-    background-color: ButtonFace;
-    color: GrayText;
-  }
-  select[multiple].win-dropdown {
-    border: none;
-  }
-  select[multiple].win-dropdown:disabled option {
-    background-color: ButtonFace;
-    color: GrayText;
-  }
-  select[multiple].win-dropdown:disabled option:checked {
-    background-color: GrayText;
-    color: ButtonFace;
-  }
-  .win-slider::-ms-track {
-    color: transparent;
-  }
-  .win-slider::-ms-ticks-before,
-  .win-slider::-ms-ticks-after {
-    color: ButtonText;
-  }
-  .win-slider::-ms-fill-lower {
-    background-color: Highlight;
-  }
-  .win-slider::-ms-fill-upper {
-    background-color: ButtonText;
-  }
-  .win-slider::-ms-thumb {
-    background-color: ButtonText;
-  }
-  .win-slider:hover::-ms-thumb {
-    background-color: Highlight;
-  }
-  .win-slider:active::-ms-thumb {
-    background-color: Highlight;
-  }
-  .win-slider:disabled::-ms-fill-lower,
-  .win-slider:disabled::-ms-fill-upper,
-  .win-slider:disabled::-ms-thumb {
-    background-color: GrayText;
-  }
-  .win-textbox,
-  .win-textarea {
-    border-color: ButtonText;
-    color: ButtonText;
-  }
-  .win-textbox:hover,
-  .win-textarea:hover,
-  .win-textbox:active,
-  .win-textarea:active,
-  .win-textbox:focus,
-  .win-textarea:focus {
-    border-color: Highlight;
-  }
-  .win-textbox:disabled,
-  .win-textarea:disabled {
-    border-color: GrayText;
-    color: GrayText;
-  }
-  .win-textbox:-ms-input-placeholder,
-  .win-textarea:-ms-input-placeholder {
-    color: WindowText;
-  }
-  .win-textbox::-ms-input-placeholder,
-  .win-textarea::-ms-input-placeholder {
-    color: WindowText;
-  }
-  .win-textbox:disabled:-ms-input-placeholder,
-  .win-textarea:disabled:-ms-input-placeholder {
-    color: GrayText;
-  }
-  .win-textbox:disabled::-ms-input-placeholder,
-  .win-textarea:disabled::-ms-input-placeholder {
-    color: GrayText;
-  }
-  .win-textbox::-ms-clear,
-  .win-textbox::-ms-reveal {
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  .win-textbox::-ms-clear:hover,
-  .win-textbox::-ms-reveal:hover {
-    color: Highlight;
-  }
-  .win-textbox::-ms-clear:active,
-  .win-textbox::-ms-reveal:active {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-toggleswitch-header,
-  .win-toggleswitch-value {
-    color: HighlightText;
-  }
-  .win-toggleswitch-thumb {
-    background-color: HighlightText;
-  }
-  .win-toggleswitch-off .win-toggleswitch-track {
-    border-color: HighlightText;
-  }
-  .win-toggleswitch-pressed .win-toggleswitch-thumb {
-    background-color: HighlightText;
-  }
-  .win-toggleswitch-pressed .win-toggleswitch-track {
-    border-color: Highlight;
-    background-color: Highlight;
-  }
-  .win-toggleswitch-disabled .win-toggleswitch-header,
-  .win-toggleswitch-disabled .win-toggleswitch-value {
-    color: GrayText;
-  }
-  .win-toggleswitch-disabled .win-toggleswitch-thumb {
-    background-color: GrayText;
-  }
-  .win-toggleswitch-disabled .win-toggleswitch-track {
-    border-color: GrayText;
-  }
-  .win-toggleswitch-on .win-toggleswitch-thumb {
-    background-color: HighlightText;
-  }
-  .win-toggleswitch-on .win-toggleswitch-track {
-    border-color: HighlightText;
-  }
-  .win-toggleswitch-on.win-toggleswitch-pressed .win-toggleswitch-track {
-    background-color: Highlight;
-  }
-  .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-thumb {
-    background-color: Background;
-  }
-  .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track {
-    background-color: GrayText;
-  }
-  /* Override Accent Color styles */
-  .win-toggleswitch-on.win-toggleswitch-enabled:not(.win-toggleswitch-pressed) .win-toggleswitch-track {
-    background-color: Highlight;
-  }
-  .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track {
-    border-color: GrayText;
-  }
-  .win-toggleswitch-enabled .win-toggleswitch-clickregion:hover .win-toggleswitch-track {
-    border-color: Highlight;
-  }
-  .win-toggleswitch-off.win-toggleswitch-enabled:not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {
-    background-color: Highlight;
-  }
-  .win-pivot .win-pivot-title {
-    color: WindowText;
-  }
-  .win-pivot .win-pivot-navbutton {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active {
-    color: HighlightText;
-  }
-  .win-pivot button.win-pivot-header {
-    color: HighlightText;
-    background-color: transparent;
-  }
-  .win-pivot button.win-pivot-header:focus,
-  .win-pivot button.win-pivot-header.win-pivot-header:hover:active {
-    color: HighlightText;
-  }
-  .win-pivot button.win-pivot-header.win-pivot-header-selected {
-    color: HighlightText;
-    background-color: Highlight;
-  }
-  .win-pivot-header[disabled] {
-    color: GrayText;
-  }
-  .win-overlay {
-    outline: none;
-  }
-  hr.win-command {
-    background-color: ButtonText;
-  }
-  div.win-command,
-  button.win-command {
-    border-color: transparent;
-    background-color: transparent;
-  }
-  div.win-command:hover:active,
-  button.win-command:hover:active {
-    border-color: transparent;
-  }
-  button:enabled.win-command.win-keyboard:focus,
-  div.win-command.win-keyboard:focus,
-  button:enabled.win-command.win-command.win-keyboard:hover:focus,
-  div.win-command.win-command.win-keyboard:hover:focus {
-    border-color: ButtonText;
-  }
-  .win-commandimage {
-    color: ButtonText;
-  }
-  button.win-command.win-command:enabled:hover:active,
-  button.win-command.win-command:enabled:active {
-    background-color: Highlight;
-    color: ButtonText;
-  }
-  button:enabled:hover:active .win-commandimage,
-  button:enabled:active .win-commandimage {
-    color: ButtonText;
-  }
-  button:disabled .win-commandimage,
-  button:disabled:active .win-commandimage {
-    color: GrayText;
-  }
-  button .win-label {
-    color: ButtonText;
-  }
-  button[aria-checked=true]:enabled .win-label,
-  button[aria-checked=true]:enabled .win-commandimage,
-  button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {
-    color: ButtonText;
-  }
-  button[aria-checked=true]:-ms-keyboard-active .win-commandimage {
-    color: ButtonText;
-  }
-  button[aria-checked=true].win-command:before {
-    position: absolute;
-    height: 100%;
-    width: 100%;
-    opacity: 1;
-    box-sizing: content-box;
-    content: "";
-    /* We want this pseudo element to cover the border of its parent. */
-    /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/
-    border-width: 1px;
-    border-style: solid;
-    top: -1px;
-    left: -1px;
-  }
-  button.win-command:enabled:-ms-keyboard-active {
-    background-color: Highlight;
-    color: ButtonText;
-  }
-  button[aria-checked=true].win-command:enabled:hover:active {
-    background-color: transparent;
-  }
-  button.win-command:disabled,
-  button.win-command:disabled:hover:active {
-    background-color: transparent;
-    border-color: transparent;
-  }
-  button.win-command:disabled .win-label,
-  button.win-command:disabled:active .win-label {
-    color: GrayText;
-  }
-  .win-navbar,
-  .win-navbar {
-    background-color: ButtonFace;
-    border-color: Highlight;
-  }
-  .win-navbar.win-menulayout .win-navbar-menu,
-  .win-navbar.win-menulayout .win-navbar-menu,
-  .win-navbar.win-menulayout .win-toolbar,
-  .win-navbar.win-menulayout .win-toolbar {
-    background-color: inherit;
-  }
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton {
-    background-color: transparent;
-    outline: none;
-    border-color: transparent;
-  }
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active {
-    background-color: transparent;
-  }
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis {
-    color: ButtonText;
-  }
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus {
-    border-color: ButtonText;
-  }
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active {
-    background-color: transparent;
-  }
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis {
-    color: GrayText;
-  }
-  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active {
-    background-color: Highlight;
-  }
-  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis {
-    color: ButtonText;
-  }
-  .win-flyout,
-  .win-flyout {
-    background-color: ButtonFace;
-  }
-  .win-settingsflyout {
-    background-color: ButtonFace;
-  }
-  .win-menu button,
-  .win-menu button {
-    background-color: transparent;
-    color: ButtonText;
-  }
-  .win-menu button.win-command.win-command:enabled:hover:active,
-  .win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active {
-    background-color: Highlight;
-    color: ButtonText;
-  }
-  .win-menu-containsflyoutcommand button.win-command-flyout-activated:before,
-  .win-menu-containsflyoutcommand button.win-command-flyout-activated:before {
-    position: absolute;
-    height: 100%;
-    width: 100%;
-    opacity: 0.6;
-    content: "";
-    box-sizing: content-box;
-    /* We want this pseudo element to cover the border of its parent. */
-    /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/
-    border-width: 1px;
-    border-style: solid;
-    top: -1px;
-    left: -1px;
-  }
-  .win-menu button[aria-checked=true].win-command:before,
-  .win-menu button[aria-checked=true].win-command:before {
-    background-color: transparent;
-    border-color: transparent;
-  }
-  .win-menu button:disabled,
-  .win-menu button:disabled,
-  .win-menu button:disabled:active,
-  .win-menu button:disabled:active {
-    background-color: transparent;
-    color: GrayText;
-  }
-  button[aria-checked=true].win-command:before {
-    border-color: Highlight;
-    background-color: Highlight;
-  }
-  .win-commandingsurface .win-commandingsurface-actionarea,
-  .win-commandingsurface .win-commandingsurface-actionarea {
-    background-color: ButtonFace;
-  }
-  .win-commandingsurface button.win-commandingsurface-overflowbutton,
-  .win-commandingsurface button.win-commandingsurface-overflowbutton {
-    background-color: ButtonFace;
-    border-color: transparent;
-  }
-  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,
-  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active {
-    background-color: ButtonFace;
-  }
-  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,
-  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis {
-    color: ButtonText;
-  }
-  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,
-  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus {
-    border-color: ButtonText;
-  }
-  .win-commandingsurface .win-commandingsurface-overflowarea,
-  .win-commandingsurface .win-commandingsurface-overflowarea {
-    background-color: ButtonFace;
-  }
-  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,
-  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active {
-    background-color: Highlight;
-  }
-  .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,
-  .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active {
-    color: ButtonText;
-    background-color: Highlight;
-  }
-  .win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-insetoutline {
-    display: block;
-    /* The element is only used to draw a border inside of the edges of its parent element without displacing content. */
-    border: solid 1px ButtonText;
-    pointer-events: none;
-    background-color: transparent;
-    z-index: 1;
-    position: absolute;
-    top: 0px;
-    left: 0px;
-    height: calc(100% - 2px);
-    width: calc(100% - 2px);
-  }
-  .win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-insetoutline,
-  .win-commandingsurface.win-commandingsurface-closing .win-commandingsurface-insetoutline,
-  .win-commandingsurface.win-commandingsurface-opening .win-commandingsurface-insetoutline {
-    display: none;
-  }
-  .win-contentdialog-dialog {
-    background-color: Window;
-  }
-  .win-contentdialog-title {
-    color: WindowText;
-  }
-  .win-contentdialog-content {
-    color: WindowText;
-  }
-  .win-contentdialog-backgroundoverlay {
-    background-color: Window;
-    opacity: 0.6;
-  }
-  .win-splitview-pane {
-    background-color: ButtonFace;
-  }
-  .win-splitview.win-splitview-pane-opened .win-splitview-paneoutline {
-    display: block;
-    border-color: ButtonText;
-  }
-  .win-splitview.win-splitview-animating .win-splitview-paneoutline {
-    display: none;
-  }
-  button.win-splitviewpanetoggle {
-    color: ButtonText;
-    background-color: transparent;
-  }
-  button.win-splitviewpanetoggle:active,
-  button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover {
-    color: ButtonText;
-    background-color: Highlight;
-  }
-  button.win-splitviewpanetoggle.win-keyboard:focus {
-    border: 1px dotted ButtonText;
-  }
-  button.win-splitviewpanetoggle:disabled,
-  button.win-splitviewpanetoggle:disabled:active,
-  button.win-splitviewpanetoggle.win-splitviewpanetoggle:disabled:hover {
-    color: GrayText;
-    background-color: transparent;
-  }
-  html.win-hoverable {
-    /* LegacyAppBar control colors */
-  }
-  html.win-hoverable.win-navbar button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable .win-navbar button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable.win-navbar button.win-navbar-invokebutton:disabled:hover,
-  html.win-hoverable .win-navbar button.win-navbar-invokebutton:disabled:hover {
-    background-color: transparent;
-  }
-  html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover {
-    background-color: Highlight;
-  }
-  html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-  html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-  html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-  html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {
-    color: HighlightText;
-  }
-  html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover {
-    background-color: Highlight;
-  }
-  html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-  html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-  html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-  html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {
-    color: HighlightText;
-  }
-  html.win-hoverable button.win-command:enabled:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  html.win-hoverable button.win-command:enabled:hover .win-commandglyph {
-    color: HighlightText;
-  }
-  html.win-hoverable .win-menu button.win-command:enabled:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  html.win-hoverable button[aria-checked=true].win-command:hover {
-    background-color: transparent;
-  }
-  html.win-hoverable button:enabled[aria-checked=true].win-command:hover:before {
-    opacity: 1;
-  }
-  html.win-hoverable button:enabled[aria-checked=true].win-command:hover:active:before {
-    opacity: 1;
-  }
-  html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover,
-  html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,
-  html.win-hoverable.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,
-  html.win-hoverable .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover {
-    background-color: Highlight;
-  }
-  html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,
-  html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis {
-    color: HighlightText;
-  }
-  html.win-hoverable button.win-splitviewpanetoggle:hover {
-    color: ButtonText;
-    background-color: Highlight;
-  }
-}
diff --git a/node_modules/winjs/css/ui-dark.min.css b/node_modules/winjs/css/ui-dark.min.css
deleted file mode 100644
index 30c68c8..0000000
--- a/node_modules/winjs/css/ui-dark.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.win-button,.win-slider{-webkit-appearance:none}.win-button,.win-link{touch-action:manipulation}@keyframes WinJS-node-inserted{from{outline-color:#000}to{outline-color:#001}}@keyframes WinJS-opacity-in{from{opacity:0}to{opacity:1}}@keyframes WinJS-opacity-out{from{opacity:1}to{opacity:0}}@keyframes WinJS-scale-up{from{transform:scale(.85)}to{transform:scale(1)}}@keyframes WinJS-scale-down{from{transform:scale(1)}to{transform:scale(.85)}}@keyframes WinJS-default-remove{from{transform:translateX(11px)}to{transform:none}}@keyframes WinJS-default-remove-rtl{from{transform:translateX(-11px)}to{transform:none}}@keyframes WinJS-default-apply{from{transform:none}to{transform:translateX(11px)}}@keyframes WinJS-default-apply-rtl{from{transform:none}to{transform:translateX(-11px)}}@keyframes WinJS-showEdgeUI{from{transform:translateY(-70px)}to{transform:none}}@keyframes WinJS-showPanel{from{transform:translateX(364px)}to{transform:none}}@keyframes WinJS-showPanel-rtl{from{transform:translateX(-364px)}to{transform:none}}@keyframes WinJS-hideEdgeUI{from{transform:none}to{transform:translateY(-70px)}}@keyframes WinJS-hidePanel{from{transform:none}to{transform:translateX(364px)}}@keyframes WinJS-hidePanel-rtl{from{transform:none}to{transform:translateX(-364px)}}@keyframes WinJS-showPopup{from{transform:translateY(50px)}to{transform:none}}@keyframes WinJS-dragSourceEnd{from{transform:translateX(11px) scale(1.05)}to{transform:none}}@keyframes WinJS-dragSourceEnd-rtl{from{transform:translateX(-11px) scale(1.05)}to{transform:none}}@keyframes WinJS-enterContent{from{transform:translateY(28px)}to{transform:none}}@keyframes WinJS-exit{from,to{transform:none}}@keyframes WinJS-enterPage{from{transform:translateY(28px)}to{transform:none}}@keyframes WinJS-updateBadge{from{transform:translateY(24px)}to{transform:none}}@-webkit-keyframes WinJS-node-inserted{from{outline-color:#000}to{outline-color:#001}}@-webkit-keyframes -webkit-WinJS-opacity-in{from{opacity:0}to{opacity:1}}@-webkit-keyframes -webkit-WinJS-opacity-out{from{opacity:1}to{opacity:0}}@-webkit-keyframes -webkit-WinJS-scale-up{from{-webkit-transform:scale(.85)}to{-webkit-transform:scale(1)}}@-webkit-keyframes -webkit-WinJS-scale-down{from{-webkit-transform:scale(1)}to{-webkit-transform:scale(.85)}}@-webkit-keyframes -webkit-WinJS-default-remove{from{-webkit-transform:translateX(11px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-default-remove-rtl{from{-webkit-transform:translateX(-11px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-default-apply{from{-webkit-transform:none}to{-webkit-transform:translateX(11px)}}@-webkit-keyframes -webkit-WinJS-default-apply-rtl{from{-webkit-transform:none}to{-webkit-transform:translateX(-11px)}}@-webkit-keyframes -webkit-WinJS-showEdgeUI{from{-webkit-transform:translateY(-70px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-showPanel{from{-webkit-transform:translateX(364px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-showPanel-rtl{from{-webkit-transform:translateX(-364px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-hideEdgeUI{from{-webkit-transform:none}to{-webkit-transform:translateY(-70px)}}@-webkit-keyframes -webkit-WinJS-hidePanel{from{-webkit-transform:none}to{-webkit-transform:translateX(364px)}}@-webkit-keyframes -webkit-WinJS-hidePanel-rtl{from{-webkit-transform:none}to{-webkit-transform:translateX(-364px)}}@-webkit-keyframes -webkit-WinJS-showPopup{from{-webkit-transform:translateY(50px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-dragSourceEnd{from{-webkit-transform:translateX(11px) scale(1.05)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-dragSourceEnd-rtl{from{-webkit-transform:translateX(-11px) scale(1.05)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-enterContent{from{-webkit-transform:translateY(28px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-exit{from,to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-enterPage{from{-webkit-transform:translateY(28px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-updateBadge{from{-webkit-transform:translateY(24px)}to{-webkit-transform:none}}@font-face{font-family:"Segoe UI Command";src:local("Segoe MDL2 Assets");font-weight:400;font-style:normal}@font-face{font-family:Symbols;src:url(../fonts/Symbols.ttf)}.win-h1,.win-type-header{font-size:46px;font-weight:200;line-height:1.216;letter-spacing:0}.win-h2,.win-type-subheader{font-size:34px;font-weight:200;line-height:1.176}.win-h3,.win-type-title{font-size:24px;font-weight:300;line-height:1.167}.win-h4,.win-type-subtitle{font-size:20px;font-weight:400;line-height:1.2}.win-h6,.win-type-body{font-size:15px;font-weight:400;line-height:1.333}.win-h5,.win-type-base{font-size:15px;font-weight:500;line-height:1.333}.win-type-caption{font-size:12px;font-weight:400;line-height:1.167}@font-face{font-family:"Segoe UI";font-weight:200;src:local("Segoe UI Light")}@font-face{font-family:"Segoe UI";font-weight:300;src:local("Segoe UI Semilight")}@font-face{font-family:"Segoe UI";font-weight:400;src:local("Segoe UI")}@font-face{font-family:"Segoe UI";font-weight:500;src:local("Segoe UI Semibold")}@font-face{font-family:"Segoe UI";font-weight:600;src:local("Segoe UI Bold")}@font-face{font-family:"Segoe UI";font-style:italic;font-weight:400;src:local("Segoe UI Italic")}@font-face{font-family:"Segoe UI";font-style:italic;font-weight:700;src:local("Segoe UI Bold Italic")}@font-face{font-family:"Microsoft Yahei UI";font-weight:200;src:local("Microsoft Yahei UI Light")}@font-face{font-family:"Microsoft Yahei UI";font-weight:300;src:local("Microsoft Yahei UI")}@font-face{font-family:"Microsoft Yahei UI";font-weight:500;src:local("Microsoft Yahei UI")}@font-face{font-family:"Microsoft Yahei UI";font-weight:600;src:local("Microsoft Yahei UI Bold")}@font-face{font-family:"Microsoft JhengHei UI";font-weight:200;src:local("Microsoft JhengHei UI Light")}@font-face{font-family:"Microsoft JhengHei UI";font-weight:300;src:local("Microsoft JhengHei UI")}@font-face{font-family:"Microsoft JhengHei UI";font-weight:500;src:local("Microsoft JhengHei UI")}@font-face{font-family:"Microsoft JhengHei UI";font-weight:600;src:local("Microsoft JhengHei UI Bold")}.win-button:-ms-lang(am,ti),.win-dropdown:-ms-lang(am,ti),.win-h1:-ms-lang(am,ti),.win-h2:-ms-lang(am,ti),.win-h3:-ms-lang(am,ti),.win-h4:-ms-lang(am,ti),.win-h5:-ms-lang(am,ti),.win-h6:-ms-lang(am,ti),.win-link:-ms-lang(am,ti),.win-textarea:-ms-lang(am,ti),.win-textbox:-ms-lang(am,ti),.win-type-base:-ms-lang(am,ti),.win-type-body:-ms-lang(am,ti),.win-type-caption:-ms-lang(am,ti),.win-type-header:-ms-lang(am,ti),.win-type-subheader:-ms-lang(am,ti),.win-type-subtitle:-ms-lang(am,ti),.win-type-title:-ms-lang(am,ti){font-family:Ebrima,Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-dropdown:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-h1:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-h2:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-h3:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-h4:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-h5:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-h6:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-link:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-textarea:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-textbox:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-base:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-body:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-caption:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-header:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-subheader:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-subtitle:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-title:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te){font-family:"Nirmala UI",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(chr-CHER-US),.win-dropdown:-ms-lang(chr-CHER-US),.win-h1:-ms-lang(chr-CHER-US),.win-h2:-ms-lang(chr-CHER-US),.win-h3:-ms-lang(chr-CHER-US),.win-h4:-ms-lang(chr-CHER-US),.win-h5:-ms-lang(chr-CHER-US),.win-h6:-ms-lang(chr-CHER-US),.win-link:-ms-lang(chr-CHER-US),.win-textarea:-ms-lang(chr-CHER-US),.win-textbox:-ms-lang(chr-CHER-US),.win-type-base:-ms-lang(chr-CHER-US),.win-type-body:-ms-lang(chr-CHER-US),.win-type-caption:-ms-lang(chr-CHER-US),.win-type-header:-ms-lang(chr-CHER-US),.win-type-subheader:-ms-lang(chr-CHER-US),.win-type-subtitle:-ms-lang(chr-CHER-US),.win-type-title:-ms-lang(chr-CHER-US){font-family:Gadugi,Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(ja),.win-dropdown:-ms-lang(ja),.win-h1:-ms-lang(ja),.win-h2:-ms-lang(ja),.win-h3:-ms-lang(ja),.win-h4:-ms-lang(ja),.win-h5:-ms-lang(ja),.win-h6:-ms-lang(ja),.win-link:-ms-lang(ja),.win-textarea:-ms-lang(ja),.win-textbox:-ms-lang(ja),.win-type-base:-ms-lang(ja),.win-type-body:-ms-lang(ja),.win-type-caption:-ms-lang(ja),.win-type-header:-ms-lang(ja),.win-type-subheader:-ms-lang(ja),.win-type-subtitle:-ms-lang(ja),.win-type-title:-ms-lang(ja){font-family:"Yu Gothic UI",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(km,lo,th,bug-Bugi),.win-dropdown:-ms-lang(km,lo,th,bug-Bugi),.win-h1:-ms-lang(km,lo,th,bug-Bugi),.win-h2:-ms-lang(km,lo,th,bug-Bugi),.win-h3:-ms-lang(km,lo,th,bug-Bugi),.win-h4:-ms-lang(km,lo,th,bug-Bugi),.win-h5:-ms-lang(km,lo,th,bug-Bugi),.win-h6:-ms-lang(km,lo,th,bug-Bugi),.win-link:-ms-lang(km,lo,th,bug-Bugi),.win-textarea:-ms-lang(km,lo,th,bug-Bugi),.win-textbox:-ms-lang(km,lo,th,bug-Bugi),.win-type-base:-ms-lang(km,lo,th,bug-Bugi),.win-type-body:-ms-lang(km,lo,th,bug-Bugi),.win-type-caption:-ms-lang(km,lo,th,bug-Bugi),.win-type-header:-ms-lang(km,lo,th,bug-Bugi),.win-type-subheader:-ms-lang(km,lo,th,bug-Bugi),.win-type-subtitle:-ms-lang(km,lo,th,bug-Bugi),.win-type-title:-ms-lang(km,lo,th,bug-Bugi){font-family:"Leelawadee UI",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(ko),.win-dropdown:-ms-lang(ko),.win-h1:-ms-lang(ko),.win-h2:-ms-lang(ko),.win-h3:-ms-lang(ko),.win-h4:-ms-lang(ko),.win-h5:-ms-lang(ko),.win-h6:-ms-lang(ko),.win-link:-ms-lang(ko),.win-textarea:-ms-lang(ko),.win-textbox:-ms-lang(ko),.win-type-base:-ms-lang(ko),.win-type-body:-ms-lang(ko),.win-type-caption:-ms-lang(ko),.win-type-header:-ms-lang(ko),.win-type-subheader:-ms-lang(ko),.win-type-subtitle:-ms-lang(ko),.win-type-title:-ms-lang(ko){font-family:"Malgun Gothic",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(jv-Java),.win-dropdown:-ms-lang(jv-Java),.win-h1:-ms-lang(jv-Java),.win-h2:-ms-lang(jv-Java),.win-h3:-ms-lang(jv-Java),.win-h4:-ms-lang(jv-Java),.win-h5:-ms-lang(jv-Java),.win-h6:-ms-lang(jv-Java),.win-link:-ms-lang(jv-Java),.win-textarea:-ms-lang(jv-Java),.win-textbox:-ms-lang(jv-Java),.win-type-base:-ms-lang(jv-Java),.win-type-body:-ms-lang(jv-Java),.win-type-caption:-ms-lang(jv-Java),.win-type-header:-ms-lang(jv-Java),.win-type-subheader:-ms-lang(jv-Java),.win-type-subtitle:-ms-lang(jv-Java),.win-type-title:-ms-lang(jv-Java){font-family:"Javanese Text",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(cop-Copt),.win-dropdown:-ms-lang(cop-Copt),.win-h1:-ms-lang(cop-Copt),.win-h2:-ms-lang(cop-Copt),.win-h3:-ms-lang(cop-Copt),.win-h4:-ms-lang(cop-Copt),.win-h5:-ms-lang(cop-Copt),.win-h6:-ms-lang(cop-Copt),.win-link:-ms-lang(cop-Copt),.win-textarea:-ms-lang(cop-Copt),.win-textbox:-ms-lang(cop-Copt),.win-type-base:-ms-lang(cop-Copt),.win-type-body:-ms-lang(cop-Copt),.win-type-caption:-ms-lang(cop-Copt),.win-type-header:-ms-lang(cop-Copt),.win-type-subheader:-ms-lang(cop-Copt),.win-type-subtitle:-ms-lang(cop-Copt),.win-type-title:-ms-lang(cop-Copt){font-family:"Segoe MDL2 Assets",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-dropdown:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-h1:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-h2:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-h3:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-h4:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-h5:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-h6:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-link:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-textarea:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-textbox:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-base:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-body:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-caption:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-header:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-subheader:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-subtitle:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-title:-ms-lang(zh-CN,zh-Hans,zh-SG){font-family:"Microsoft YaHei UI",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-dropdown:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-h1:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-h2:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-h3:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-h4:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-h5:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-h6:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-link:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-textarea:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-textbox:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-base:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-body:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-caption:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-header:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-subheader:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-subtitle:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-title:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO){font-family:"Microsoft JhengHei UI",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}body,html{width:100%;height:100%;margin:0;cursor:default;-webkit-touch-callout:none;-ms-scroll-translation:vertical-to-horizontal;-webkit-tap-highlight-color:transparent}html{overflow:hidden;direction:ltr}.win-toggleswitch:lang(ar),.win-toggleswitch:lang(dv),.win-toggleswitch:lang(fa),.win-toggleswitch:lang(he),.win-toggleswitch:lang(ku-Arab),.win-toggleswitch:lang(pa-Arab),.win-toggleswitch:lang(prs),.win-toggleswitch:lang(ps),.win-toggleswitch:lang(qps-plocm),.win-toggleswitch:lang(sd-Arab),.win-toggleswitch:lang(syr),.win-toggleswitch:lang(ug),.win-toggleswitch:lang(ur),html:lang(ar),html:lang(dv),html:lang(fa),html:lang(he),html:lang(ku-Arab),html:lang(pa-Arab),html:lang(prs),html:lang(ps),html:lang(qps-plocm),html:lang(sd-Arab),html:lang(syr),html:lang(ug),html:lang(ur){direction:rtl}body{-ms-content-zooming:none}iframe{border:0}.win-button,.win-textarea,.win-textbox{border-style:solid;border-width:2px;background-clip:border-box;border-radius:0;font-size:15px;font-weight:400;line-height:1.333}.win-button,.win-dropdown,.win-h1,.win-h2,.win-h3,.win-h4,.win-h5,.win-h6,.win-link,.win-textarea,.win-textbox,.win-type-base,.win-type-body,.win-type-caption,.win-type-header,.win-type-subheader,.win-type-subtitle,.win-type-title{font-family:"Segoe UI",sans-serif,"Segoe MDL2 Assets",Symbols,"Segoe UI Emoji"}.win-textarea,.win-textbox{-ms-user-select:element;margin:8px 0;width:296px;min-width:64px;min-height:28px;box-sizing:border-box;padding:3px 6px 5px 10px;outline:0}.win-textbox::-ms-value{margin:0;padding:0}.win-textbox::-ms-clear,.win-textbox::-ms-reveal{padding-right:2px;width:30px;height:32px;margin:-8px -8px -8px 2px}.win-textbox:lang(ar)::-ms-clear,.win-textbox:lang(ar)::-ms-reveal,.win-textbox:lang(dv)::-ms-clear,.win-textbox:lang(dv)::-ms-reveal,.win-textbox:lang(fa)::-ms-clear,.win-textbox:lang(fa)::-ms-reveal,.win-textbox:lang(he)::-ms-clear,.win-textbox:lang(he)::-ms-reveal,.win-textbox:lang(ku-Arab)::-ms-clear,.win-textbox:lang(ku-Arab)::-ms-reveal,.win-textbox:lang(pa-Arab)::-ms-clear,.win-textbox:lang(pa-Arab)::-ms-reveal,.win-textbox:lang(prs)::-ms-clear,.win-textbox:lang(prs)::-ms-reveal,.win-textbox:lang(ps)::-ms-clear,.win-textbox:lang(ps)::-ms-reveal,.win-textbox:lang(qps-plocm)::-ms-clear,.win-textbox:lang(qps-plocm)::-ms-reveal,.win-textbox:lang(sd-Arab)::-ms-clear,.win-textbox:lang(sd-Arab)::-ms-reveal,.win-textbox:lang(syr)::-ms-clear,.win-textbox:lang(syr)::-ms-reveal,.win-textbox:lang(ug)::-ms-clear,.win-textbox:lang(ug)::-ms-reveal,.win-textbox:lang(ur)::-ms-clear,.win-textbox:lang(ur)::-ms-reveal{margin-left:-8px;margin-right:2px}.win-textarea{resize:none;overflow-y:auto}.win-checkbox,.win-radio{width:20px;height:20px;margin-right:8px;margin-top:12px;margin-bottom:12px}.win-checkbox:lang(ar),.win-checkbox:lang(dv),.win-checkbox:lang(fa),.win-checkbox:lang(he),.win-checkbox:lang(ku-Arab),.win-checkbox:lang(pa-Arab),.win-checkbox:lang(prs),.win-checkbox:lang(ps),.win-checkbox:lang(qps-plocm),.win-checkbox:lang(sd-Arab),.win-checkbox:lang(syr),.win-checkbox:lang(ug),.win-checkbox:lang(ur),.win-radio:lang(ar),.win-radio:lang(dv),.win-radio:lang(fa),.win-radio:lang(he),.win-radio:lang(ku-Arab),.win-radio:lang(pa-Arab),.win-radio:lang(prs),.win-radio:lang(ps),.win-radio:lang(qps-plocm),.win-radio:lang(sd-Arab),.win-radio:lang(syr),.win-radio:lang(ug),.win-radio:lang(ur){margin-left:8px;margin-right:0}.win-checkbox::-ms-check,.win-radio::-ms-check{border-style:solid;display:inline-block;border-width:2px;background-clip:border-box}.win-button{margin:0;min-height:32px;min-width:120px;padding:4px 8px}.win-button.win-button-file{border:none;min-width:100px;min-height:20px;width:340px;height:32px;padding:0;margin:7px 8px 21px;background-clip:padding-box}.win-button.win-button-file::-ms-value{margin:0;border-width:2px;border-style:solid none solid solid;border-radius:0;background-clip:border-box;font-size:15px;font-weight:400;line-height:1.333}.win-button.win-button-file:lang(ar)::-ms-value,.win-button.win-button-file:lang(dv)::-ms-value,.win-button.win-button-file:lang(fa)::-ms-value,.win-button.win-button-file:lang(he)::-ms-value,.win-button.win-button-file:lang(ku-Arab)::-ms-value,.win-button.win-button-file:lang(pa-Arab)::-ms-value,.win-button.win-button-file:lang(prs)::-ms-value,.win-button.win-button-file:lang(ps)::-ms-value,.win-button.win-button-file:lang(qps-plocm)::-ms-value,.win-button.win-button-file:lang(sd-Arab)::-ms-value,.win-button.win-button-file:lang(syr)::-ms-value,.win-button.win-button-file:lang(ug)::-ms-value,.win-button.win-button-file:lang(ur)::-ms-value{border-left-style:none;border-right-style:solid}.win-button.win-button-file::-ms-browse{margin:0;padding:0 18px;border-width:2px;border-style:solid;background-clip:padding-box;font-size:15px;font-weight:400;line-height:1.333}.win-dropdown{min-width:56px;max-width:368px;min-height:32px;margin:8px 0;border-style:solid;border-width:2px;background-clip:border-box;background-image:none;box-sizing:border-box;border-radius:0;font-size:15px;font-weight:400;line-height:1.333}.win-dropdown::-ms-value{padding:5px 12px 7px;margin:0}.win-dropdown::-ms-expand{border:none;margin-right:5px;margin-left:3px;margin-bottom:-2px;font-size:20px}.win-code,.win-dropdown option{font-size:15px;font-weight:400;line-height:1.333}select[multiple].win-dropdown{padding:0 0 0 12px;vertical-align:bottom}.win-progress-bar,.win-progress-ring,.win-ring{width:180px;height:4px;-webkit-appearance:none}.win-progress-bar:not(:indeterminate),.win-progress-ring:not(:indeterminate),.win-ring:not(:indeterminate){border-style:none}.win-progress-bar::-ms-fill,.win-progress-ring::-ms-fill,.win-ring::-ms-fill{border-style:none}.win-progress-bar.win-medium,.win-progress-ring.win-medium,.win-ring.win-medium{width:296px}.win-progress-bar.win-large,.win-progress-ring.win-large,.win-ring.win-large{width:100%}.win-progress-bar:indeterminate::-webkit-progress-value,.win-progress-ring:indeterminate::-webkit-progress-value,.win-ring:indeterminate::-webkit-progress-value{position:relative;-webkit-animation:win-progress-indeterminate 3s linear infinite}.win-progress-bar.win-paused:not(:indeterminate),.win-progress-ring.win-paused:not(:indeterminate),.win-ring.win-paused:not(:indeterminate){animation-name:win-progress-fade-out;animation-duration:3s;animation-timing-function:cubic-bezier(.03,.76,.31,1);opacity:.5}.win-progress-bar.win-error::-ms-fill,.win-progress-ring.win-error::-ms-fill,.win-ring.win-error::-ms-fill{opacity:0}.win-progress-ring,.win-ring{width:20px;height:20px}.win-progress-ring:indeterminate::-ms-fill,.win-ring:indeterminate::-ms-fill{animation-name:-ms-ring}.win-progress-ring.win-medium,.win-ring.win-medium{width:40px;height:40px}.win-progress-ring.win-large,.win-ring.win-large{width:60px;height:60px}@-webkit-keyframes win-progress-indeterminate{0%{left:0;width:25%}50%{left:calc(75%);width:25%}75%{left:calc(100%);width:0}75.1%{left:0;width:0}100%{left:0;width:25%}}@keyframes win-progress-fade-out{from{opacity:1}to{opacity:.5}}.win-slider{width:280px;height:44px}.win-slider::-ms-track{height:2px;border-style:none}.win-slider::-webkit-slider-runnable-track{height:2px;border-style:none}.win-slider::-moz-range-track{height:2px;border-style:none}.win-slider::-moz-range-thumb{width:8px;height:24px;border-radius:4px;border-style:none}.win-slider::-webkit-slider-thumb{-webkit-appearance:none;margin-top:-11px;width:8px;height:24px;border-radius:4px;border-style:none}.win-slider::-ms-thumb{margin-top:inherit;width:8px;height:24px;border-radius:4px;border-style:none}.win-slider.win-vertical{writing-mode:bt-lr;width:44px;height:280px}.win-slider.win-vertical::-ms-track{width:2px;height:auto}.win-slider.win-vertical::-ms-thumb{width:24px;height:8px}.win-slider.win-vertical:lang(ar),.win-slider.win-vertical:lang(dv),.win-slider.win-vertical:lang(fa),.win-slider.win-vertical:lang(he),.win-slider.win-vertical:lang(ku-Arab),.win-slider.win-vertical:lang(pa-Arab),.win-slider.win-vertical:lang(prs),.win-slider.win-vertical:lang(ps),.win-slider.win-vertical:lang(qps-plocm),.win-slider.win-vertical:lang(sd-Arab),.win-slider.win-vertical:lang(syr),.win-slider.win-vertical:lang(ug),.win-slider.win-vertical:lang(ur){writing-mode:bt-rl}.win-link{text-decoration:underline;cursor:pointer}.win-code{font-family:Consolas,Menlo,Monaco,"Courier New",monospace}.win-back::before,.win-backbutton::before,.win-flipview .win-navbutton,.win-pivot .win-pivot-navbutton,.win-rating .win-star,.win-selectioncheckmark,.win-semanticzoom-button::before{font-family:"Segoe MDL2 Assets",Symbols}.win-type-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.win-h1.win-type-ellipsis,.win-type-header.win-type-ellipsis,h1.win-type-ellipsis{line-height:1.4286}.win-h2.win-type-ellipsis,.win-type-subheader.win-type-ellipsis,h2.win-type-ellipsis{line-height:1.5}.win-scrollview{overflow-x:auto;overflow-y:hidden;height:400px;width:100%}h1.win-h1,h1.win-type-header,h2.win-h2,h2.win-type-subheader,h3.win-h3,h3.win-type-title,h4.win-h4,h4.win-type-subtitle,h5.win-h5,h5.win-type-base,h6.win-h6,h6.win-type-body{margin-top:0;margin-bottom:0}.win-type-body p,p.win-type-body{font-weight:300}.win-listview{overflow:hidden;height:400px}.win-listview .win-surface{overflow:visible}.win-listview>.win-viewport.win-horizontal .win-surface{height:100%}.win-listview>.win-viewport.win-vertical .win-surface{width:100%}.win-listview>.win-viewport{position:relative;width:100%;height:100%;z-index:0;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch;white-space:nowrap}.win-listview>.win-viewport.win-horizontal{overflow-x:auto;overflow-y:hidden}.win-listview>.win-viewport.win-vertical{overflow-x:hidden;overflow-y:auto}.win-listview .win-itemscontainer{overflow:hidden}.win-listview .win-itemscontainer-padder{width:0;height:0;margin:0;padding:0;border:0;overflow:hidden}.win-listview>.win-horizontal .win-container{margin:10px 5px 0}.win-listview>.win-vertical .win-container{margin:10px 24px 0 7px}.win-listview.win-rtl>.win-vertical .win-container{margin:10px 7px 0 24px}.win-itemcontainer .win-itembox,.win-itemcontainer.win-container,.win-listview .win-container,.win-listview .win-itembox{cursor:default;z-index:0}.win-listview .win-container{touch-action:pan-x pan-y pinch-zoom}.win-semanticzoom .win-listview>.win-viewport.win-zooming-x{overflow-x:visible}.win-semanticzoom .win-listview>.win-viewport.win-zooming-y{overflow-y:visible}.win-itemcontainer .win-itembox,.win-listview .win-itembox{width:100%;height:100%}.win-itemcontainer .win-item,.win-listview .win-item{z-index:1;overflow:hidden;position:relative}.win-listview>.win-vertical .win-item{width:100%}.win-itemcontainer .win-item:focus,.win-listview .win-item:focus{outline-style:none}.win-itemcontainer .win-focusedoutline,.win-listview .win-focusedoutline{width:calc(100% - 4px);height:calc(100% - 4px);left:2px;top:2px;position:absolute;z-index:5;pointer-events:none}.win-container.win-selected .win-selectionborder,html.win-hoverable .win-container.win-selected:hover .win-selectionborder{border-width:2px;border-style:solid}html.win-hoverable .win-itemcontainer .win-itembox:hover::before,html.win-hoverable .win-listview .win-itembox:hover::before{position:absolute;left:0;top:0;content:"";width:calc(100% - 4px);height:calc(100% - 4px);pointer-events:none;border-style:solid;border-width:2px;z-index:3}html.win-hoverable .win-itemcontainer.win-itembox.win-selected:hover::before,html.win-hoverable .win-itemcontainer.win-selectionstylefilled .win-itembox:hover::before,html.win-hoverable .win-listview .win-itembox.win-selected:hover::before,html.win-hoverable .win-listview.win-selectionstylefilled .win-itembox:hover::before{display:none}.win-listview .win-groupheader{padding:10px 10px 10px 2px;overflow:hidden;outline-width:.01px;outline-style:none;float:left;font-size:34px;font-weight:200;line-height:1.176}.win-listview .win-groupheadercontainer{z-index:1;touch-action:pan-x pan-y pinch-zoom;overflow:hidden}.win-listview .win-horizontal .win-footercontainer,.win-listview .win-horizontal .win-headercontainer{height:100%;display:inline-block;overflow:hidden;white-space:normal}.win-listview .win-vertical .win-footercontainer,.win-listview .win-vertical .win-headercontainer{width:100%;display:block;overflow:hidden;white-space:normal}.win-listview .win-groupheader.win-focused{outline-style:dotted}.win-listview .win-viewport,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover,html.win-hoverable .win-listview.win-dragover .win-container:hover,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover,html.win-hoverable .win-selectionstylefilled .win-itemcontainer.win-container:hover{outline:0}.win-listview.win-rtl .win-groupheader{padding-left:10px;padding-right:2px;float:right}.win-listview.win-groups .win-horizontal .win-groupleader{margin-left:70px}.win-listview.win-groups.win-rtl .win-horizontal .win-groupleader{margin-left:0;margin-right:70px}.win-listview.win-groups .win-vertical .win-gridlayout .win-groupleader,.win-listview.win-groups .win-vertical .win-listlayout .win-groupleader{margin-top:70px}.win-listview.win-groups>.win-vertical .win-surface.win-gridlayout,.win-listview.win-groups>.win-vertical .win-surface.win-listlayout{margin-top:-65px}.win-listview.win-groups>.win-horizontal .win-surface{margin-left:-70px}.win-listview.win-groups.win-rtl>.win-horizontal .win-surface{margin-left:0;margin-right:-70px}.win-listview .win-surface{-webkit-margin-collapse:separate;white-space:normal}.win-surface ._win-proxy{position:relative;overflow:hidden;width:0;height:0;touch-action:none}.win-selectionborder{position:absolute;opacity:inherit;z-index:2;pointer-events:none}.win-container.win-selected .win-selectionborder{top:0;left:0;right:0;bottom:0}.win-selectionbackground{position:absolute;top:0;left:0;right:0;bottom:0;z-index:0}.win-selectioncheckmarkbackground{position:absolute;top:2px;right:2px;width:14px;height:11px;margin:0;padding:0;border-style:solid;z-index:3;display:none;border-width:4px 2px 3px}.win-itemcontainer.win-rtl .win-selectioncheckmarkbackground,.win-listview.win-rtl .win-selectioncheckmarkbackground{left:2px;right:auto}.win-listview .win-selectionmode .win-selectioncheckmark,.win-listview .win-selectionmode .win-selectioncheckmarkbackground,.win-selectionmode .win-itemcontainer .win-selectioncheckmarkbackground,.win-selectionmode .win-itemcontainer.win-selectionmode .win-selectioncheckmark,.win-selectionmode.win-itemcontainer .win-selectioncheckmarkbackground,.win-selectionmode.win-itemcontainer.win-selectionmode .win-selectioncheckmark{display:block}.win-selectioncheckmark{position:absolute;margin:0;padding:2px;right:1px;top:1px;font-size:14px;z-index:4;line-height:1;display:none}.win-rtl .win-selectioncheckmark{right:auto;left:0}.win-selectionstylefilled .win-container,.win-selectionstylefilled.win-container{overflow:hidden}.win-listview .win-surface.win-selectionmode .win-itembox::after,.win-selectionmode .win-itemcontainer.win-container .win-itembox::after,.win-selectionmode.win-itemcontainer.win-container .win-itembox::after{content:"";position:absolute;width:18px;height:18px;pointer-events:none;right:2px;top:2px;z-index:3}.win-itemcontainer.win-rtl.win-selectionmode.win-container .win-itembox::after,.win-listview.win-rtl .win-surface.win-selectionmode .win-itembox::after,.win-rtl .win-selectionmode .win-itemcontainer.win-container .win-itembox::after{right:auto;left:2px}.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-item{transition:transform 250ms cubic-bezier(.17,.79,.215,1.0025);-webkit-transition:-webkit-transform 250ms cubic-bezier(.17,.79,.215,1.0025);transform:translate(40px,0);-webkit-transform:translate(40px,0)}.win-listview.win-rtl.win-selectionstylefilled .win-surface.win-selectionmode .win-item{transition:transform 250ms cubic-bezier(.17,.79,.215,1.0025);-webkit-transition:-webkit-transform 250ms cubic-bezier(.17,.79,.215,1.0025);transform:translate(-40px,0);-webkit-transform:translate(-40px,0)}.win-listview.win-rtl.win-selectionstylefilled .win-surface.win-hideselectionmode .win-item,.win-listview.win-selectionstylefilled .win-surface.win-hidingselectionmode .win-item{transition:transform 250ms cubic-bezier(.17,.79,.215,1.0025);-webkit-transition:-webkit-transform 250ms cubic-bezier(.17,.79,.215,1.0025);transform:none;-webkit-transform:none}.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox::after{left:12px;right:auto;top:50%;margin-top:-9px;display:block;border:2px solid;width:16px;height:16px;background-color:transparent}.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-itembox::after{left:auto;right:12px}.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-selectioncheckmarkbackground{left:12px;top:50%;margin-top:-9px;display:block;border:2px solid;width:16px;height:16px}.win-itemcontainer.win-selectionstylefilled .win-selectioncheckmarkbackground,.win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-selectionborder,.win-listview.win-selectionstylefilled .win-container.win-selected .win-selectionborder,.win-listview.win-selectionstylefilled .win-selectioncheckmarkbackground{border-color:transparent}.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-selectioncheckmarkbackground{left:auto;right:12px}.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-selectioncheckmark{left:13px;top:50%;margin-top:-8px;display:block;width:14px;height:14px}.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-selectioncheckmark{left:0;right:10px}.win-itemcontainer.win-selectionmode.win-selectionstylefilled.win-container .win-itembox.win-selected::after,.win-listview .win-surface.win-selectionmode .win-itembox.win-selected::after,.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox.win-nonselectable::after,.win-selectionmode .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox.win-selected::after{display:none}.win-listview .win-progress{left:50%;top:50%;width:60px;height:60px;margin-left:-30px;margin-top:-30px;z-index:1;position:absolute}.win-flipview,.win-itemcontainer .win-itembox,.win-itemcontainer.win-container{position:relative}.win-listview .win-progress::-ms-fill{animation-name:-ms-ring}.win-listview .win-itemsblock{overflow:hidden}.win-listview .win-horizontal .win-nocssgrid.win-listlayout,.win-listview .win-surface.win-nocssgrid.win-gridlayout,.win-listview .win-vertical .win-nocssgrid.win-listlayout.win-headerpositionleft{display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;vertical-align:top}.win-listview .win-horizontal .win-surface.win-nocssgrid{-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;-webkit-align-content:flex-start;align-content:flex-start}.win-listview .win-vertical .win-surface.win-nocssgrid{-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;-webkit-align-content:flex-start;align-content:flex-start}.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout,.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout{display:block}.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout .win-itemscontainer-padder,.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout .win-itemscontainer-padder,.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout .win-itemscontainer-padder,.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout .win-itemscontainer-padder{height:0;width:0}.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer,.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer,.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer,.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer{display:none}.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer.win-laidout,.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer.win-laidout,.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer.win-laidout{display:block}.win-listview .win-listlayout .win-itemscontainer{overflow:visible}.win-listview .win-listlayout .win-itemsblock{padding-bottom:4px;margin-bottom:-4px}.win-listview>.win-vertical .win-listlayout.win-headerpositiontop .win-groupheader{float:none}.win-listview>.win-vertical .win-surface.win-listlayout{margin-bottom:5px}.win-listview .win-vertical .win-listlayout.win-headerpositionleft.win-surface{display:-ms-inline-grid;-ms-grid-columns:auto 1fr;-ms-grid-rows:auto}.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer{-ms-grid-column:1}.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer{-ms-grid-column:2}.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-groupheadercontainer,.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-groupheadercontainer,.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-itemscontainer{-ms-grid-column:1}.win-listview>.win-horizontal .win-surface.win-listlayout{display:-ms-inline-grid;-ms-grid-columns:auto;-ms-grid-rows:auto;vertical-align:top}.win-listview .win-horizontal .win-listlayout .win-itemsblock{height:100%}.win-listview .win-horizontal .win-listlayout .win-itemscontainer{margin-bottom:24px}.win-listview .win-horizontal .win-listlayout .win-container{height:calc(100% - 10px)}.win-listview>.win-horizontal .win-surface.win-listlayout.win-headerpositiontop{-ms-grid-rows:auto 1fr}.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-groupheadercontainer{-ms-grid-row:1}.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-itemscontainer{-ms-grid-row:2}.win-listview .win-gridlayout.win-surface{display:-ms-inline-grid;vertical-align:top}.win-listview .win-gridlayout .win-container{margin:5px}.win-listview.win-groups .win-gridlayout .win-groupheadercontainer,.win-listview.win-groups .win-gridlayout .win-itemscontainer{display:none}.win-listview.win-groups .win-gridlayout .win-groupheadercontainer.win-laidout{display:block}.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop.win-surface{-ms-grid-columns:auto;-ms-grid-rows:auto 1fr}.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-groupheadercontainer{-ms-grid-row:1}.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-itemscontainer{-ms-grid-row:2}.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft.win-surface{-ms-grid-columns:auto;-ms-grid-rows:auto}.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-groupheadercontainer,.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-itemscontainer{-ms-grid-row:1}.win-listview .win-vertical .win-gridlayout.win-headerpositiontop.win-surface{-ms-grid-columns:auto;-ms-grid-rows:auto}.win-listview .win-vertical .win-gridlayout.win-headerpositionleft.win-surface{-ms-grid-columns:auto 1fr;-ms-grid-rows:auto}.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-itemscontainer{-ms-grid-column:2}.win-listview .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock,.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,.win-listview .win-horizontal .win-listlayout .win-itemsblock,.win-listview .win-horizontal .win-listlayout .win-itemscontainer,.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer.win-laidout{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;-webkit-align-content:flex-start;align-content:flex-start}.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock,.win-listview .win-horizontal .win-itemscontainer-padder{height:100%}.win-listview .win-horizontal .win-gridlayout .win-cellspanninggridlayout.win-itemscontainer.win-laidout{display:-ms-grid}.win-listview .win-vertical .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock,.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;-webkit-align-content:flex-start;align-content:flex-start}.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock{width:100%}.win-listview .win-cellspanninggridlayout .win-container.win-laidout{display:block}.win-listview .win-cellspanninggridlayout .win-container{display:none}.win-listview.win-dragover .win-itembox{transform:scale(.86);-webkit-transform:scale(.86)}.win-itemcontainer .win-itembox.win-dragsource,.win-listview .win-itembox.win-dragsource{opacity:.5;transition:opacity cubic-bezier(.1,.9,.2,1) 167ms,transform cubic-bezier(.1,.9,.2,1) 220ms;-webkit-transition:opacity cubic-bezier(.1,.9,.2,1) 167ms,transform cubic-bezier(.1,.9,.2,1) 220ms}.win-listview.win-dragover .win-itembox.win-dragsource{opacity:0;transition:none;-webkit-transition:none}.win-listview .win-itembox{position:relative;transition:transform cubic-bezier(.1,.9,.2,1) 220ms;-webkit-transition:-webkit-transform cubic-bezier(.1,.9,.2,1) 220ms}.win-listview.win-groups>.win-vertical .win-surface.win-listlayout.win-headerpositionleft{margin-left:70px}.win-listview.win-groups.win-rtl>.win-vertical .win-surface.win-listlayout.win-headerpositionleft{margin-left:0;margin-right:70px}.win-listview>.win-horizontal .win-surface.win-listlayout{margin-left:70px}.win-listview.win-rtl>.win-horizontal .win-surface.win-listlayout{margin-left:0;margin-right:70px}.win-listview .win-vertical .win-gridlayout.win-surface{margin-left:20px}.win-listview.win-rtl .win-vertical .win-gridlayout.win-surface{margin-left:0;margin-right:20px}.win-itemcontainer{touch-action:pan-x pan-y pinch-zoom}html.win-hoverable .win-itemcontainer .win-itembox:hover::before,html.win-hoverable .win-listview .win-itembox:hover::before{opacity:.4}html.win-hoverable .win-itemcontainer.win-pressed .win-itembox:hover::before,html.win-hoverable .win-listview .win-pressed .win-itembox:hover::before,html.win-hoverable .win-listview .win-pressed.win-itembox:hover::before{opacity:.6}.win-listview.win-selectionstylefilled .win-itembox,.win-selectionstylefilled .win-itemcontainer .win-itembox,.win-selectionstylefilled.win-itemcontainer .win-itembox{background-color:transparent}.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-full,.win-itemcontainer.win-selectionstylefilled.win-selected a,.win-itemcontainer.win-selectionstylefilled.win-selected progress,.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-full,.win-listview.win-selectionstylefilled .win-selected a,.win-listview.win-selectionstylefilled .win-selected progress{color:#fff}.win-itemcontainer.win-selectionstylefilled.win-selected.win-selected a:hover:active,.win-listview.win-selectionstylefilled .win-selected.win-selected a:hover:active{color:rgba(255,255,255,.6)}html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected a:hover,html.win-hoverable .win-listview.win-selectionstylefilled .win-selected a:hover{color:rgba(255,255,255,.8)}.win-itemcontainer.win-selectionstylefilled.win-selected .win-textarea,.win-itemcontainer.win-selectionstylefilled.win-selected button,.win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-check,.win-itemcontainer.win-selectionstylefilled.win-selected input[type=button],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=email],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=number],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=password],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=reset],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=search],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=tel],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=text],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=url],.win-itemcontainer.win-selectionstylefilled.win-selected select,.win-itemcontainer.win-selectionstylefilled.win-selected textarea,.win-listview.win-selectionstylefilled .win-selected .win-textarea,.win-listview.win-selectionstylefilled .win-selected button,.win-listview.win-selectionstylefilled .win-selected input::-ms-check,.win-listview.win-selectionstylefilled .win-selected input[type=button],.win-listview.win-selectionstylefilled .win-selected input[type=email],.win-listview.win-selectionstylefilled .win-selected input[type=number],.win-listview.win-selectionstylefilled .win-selected input[type=password],.win-listview.win-selectionstylefilled .win-selected input[type=reset],.win-listview.win-selectionstylefilled .win-selected input[type=search],.win-listview.win-selectionstylefilled .win-selected input[type=tel],.win-listview.win-selectionstylefilled .win-selected input[type=text],.win-listview.win-selectionstylefilled .win-selected input[type=url],.win-listview.win-selectionstylefilled .win-selected select,.win-listview.win-selectionstylefilled .win-selected textarea{background-clip:border-box;background-color:rgba(255,255,255,.8);border-color:transparent;color:#000}.win-itemcontainer.win-selectionstylefilled.win-selected button[type=submit],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=submit],.win-listview.win-selectionstylefilled .win-selected button[type=submit],.win-listview.win-selectionstylefilled .win-selected input[type=submit]{border-color:#fff}.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-lower,.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-lower{background-color:#fff}.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-thumb,.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-thumb{background-color:#000}.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-upper,.win-itemcontainer.win-selectionstylefilled.win-selected progress,.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-upper,.win-listview.win-selectionstylefilled .win-selected progress{background-color:rgba(255,255,255,.16)}.win-itemcontainer.win-selectionstylefilled.win-selected progress:indeterminate,.win-listview.win-selectionstylefilled .win-selected progress:indeterminate{background-color:transparent}.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-empty,.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-empty{color:rgba(255,255,255,.16)}@media (-ms-high-contrast){.win-listview .win-groupheader{color:WindowText}.win-selectioncheckmark{color:HighlightText}.win-itemcontainer .win-focusedoutline,.win-listview .win-focusedoutline,.win-listview .win-groupheader{outline-color:WindowText}.win-itemcontainer.win-selectionstylefilled .win-itembox,.win-listview.win-selectionstylefilled .win-itembox{background-color:Window;color:WindowText}.win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-itembox,.win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground,.win-listview.win-selectionstylefilled .win-container.win-selected .win-itembox,.win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-selected:hover .win-itembox,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-itembox,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground,html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-selected:hover .win-itembox,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-itembox,html.win-hoverable .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground{background-color:Highlight;color:HighlightText}.win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected .win-selectionborder,.win-listview:not(.win-selectionstylefilled) .win-container.win-selected .win-selectionborder{border-color:Highlight}.win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-selectionborder,.win-listview.win-selectionstylefilled .win-container.win-selected .win-selectionborder{border-color:transparent}html.win-hoverable .win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected:hover .win-selectionborder,html.win-hoverable .win-listview:not(.win-selectionstylefilled) .win-container.win-selected:hover .win-selectionborder{border-color:Highlight}.win-itemcontainer.win-selectionstylefilled .win-selectioncheckmarkbackground,.win-listview.win-selectionstylefilled .win-selectioncheckmarkbackground{border-color:transparent}.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star:after,.win-itemcontainer.win-selectionstylefilled.win-selected a,.win-itemcontainer.win-selectionstylefilled.win-selected progress,.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star:after,.win-listview.win-selectionstylefilled .win-selected a,.win-listview.win-selectionstylefilled .win-selected progress,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star:after,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover a,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star:after,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover a,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress{color:HighlightText}.win-itemcontainer.win-selectionstylefilled.win-selected button,.win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-check,.win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-track,.win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-value,.win-itemcontainer.win-selectionstylefilled.win-selected progress,.win-itemcontainer.win-selectionstylefilled.win-selected progress::-ms-fill,.win-itemcontainer.win-selectionstylefilled.win-selected select,.win-itemcontainer.win-selectionstylefilled.win-selected textarea,.win-listview.win-selectionstylefilled .win-selected button,.win-listview.win-selectionstylefilled .win-selected input,.win-listview.win-selectionstylefilled .win-selected input::-ms-check,.win-listview.win-selectionstylefilled .win-selected input::-ms-track,.win-listview.win-selectionstylefilled .win-selected input::-ms-value,.win-listview.win-selectionstylefilled .win-selected progress,.win-listview.win-selectionstylefilled .win-selected progress::-ms-fill,.win-listview.win-selectionstylefilled .win-selected select,.win-listview.win-selectionstylefilled .win-selected textarea,.win-listview.win-selectionstylefilled.win-selected input,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover button,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-check,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-track,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-value,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress::-ms-fill,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover select,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover textarea,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover button,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-check,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-track,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-value,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress::-ms-fill,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover select,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover textarea{border-color:HighlightText}.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-lower,.win-itemcontainer.win-selectionstylefilled.win-selected progress::-ms-fill,.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-lower,.win-listview.win-selectionstylefilled .win-selected progress::-ms-fill,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input[type=range]::-ms-fill-lower,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress::-ms-fill,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input[type=range]::-ms-fill-lower,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress::-ms-fill{background-color:HighlightText}.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-upper,.win-itemcontainer.win-selectionstylefilled.win-selected progress,.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-upper,.win-listview.win-selectionstylefilled .win-selected progress,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input[type=range]::-ms-fill-upper,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input[type=range]::-ms-fill-upper,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress{background-color:Highlight}.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-full:before,.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-full:before,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star.win-full:before,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star.win-full:before{color:ButtonFace}.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-empty:before,.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-empty:before,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star.win-empty:before,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star.win-empty:before{color:Highlight}html.win-hoverable .win-itemcontainer.win-container:hover,html.win-hoverable .win-listview .win-container:hover{outline:Highlight solid 3px}}.win-flipview{overflow:hidden;height:400px}.win-flipview .win-surface{-ms-scroll-chaining:none}.win-flipview .win-navleft{left:0;top:50%;margin-top:-19px}.win-flipview .win-navright{left:100%;top:50%;margin-left:-20px;margin-top:-19px}.win-flipview .win-navtop{left:50%;top:0;margin-left:-35px}.win-flipview .win-navbottom{left:50%;top:100%;margin-left:-35px;margin-top:-36px}.win-flipview .win-navbutton{touch-action:manipulation;border:none;width:20px;height:36px;z-index:1;position:absolute;font-size:16px;padding:0;min-width:0}.win-flipview .win-item,.win-flipview .win-item>.win-template{height:100%;width:100%;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}@media (-ms-high-contrast){.win-flipview .win-navbottom{left:50%;top:100%;margin-left:-35px;margin-top:-35px}.win-flipview .win-navbutton{background-color:ButtonFace;color:ButtonText;border:2px solid ButtonText;width:65px;height:35px}.win-flipview .win-navbutton.win-navbutton:active,.win-flipview .win-navbutton.win-navbutton:hover:active{background-color:ButtonText;color:ButtonFace}.win-flipview .win-navright{margin-left:-65px}html.win-hoverable .win-flipview .win-navbutton:hover{background-color:Highlight;color:HighlightText}}.win-datepicker select,.win-timepicker select{min-width:80px;margin-top:4px;margin-bottom:4px}.win-datepicker{display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;height:auto;width:auto}.win-datepicker .win-datepicker-date.win-order0,.win-datepicker .win-datepicker-date.win-order1,.win-datepicker .win-datepicker-month,.win-datepicker .win-datepicker-year.win-order0{margin-right:20px}.win-datepicker .win-datepicker-date.win-order0:lang(ar),.win-datepicker .win-datepicker-date.win-order0:lang(dv),.win-datepicker .win-datepicker-date.win-order0:lang(fa),.win-datepicker .win-datepicker-date.win-order0:lang(he),.win-datepicker .win-datepicker-date.win-order0:lang(ku-Arab),.win-datepicker .win-datepicker-date.win-order0:lang(pa-Arab),.win-datepicker .win-datepicker-date.win-order0:lang(prs),.win-datepicker .win-datepicker-date.win-order0:lang(ps),.win-datepicker .win-datepicker-date.win-order0:lang(qps-plocm),.win-datepicker .win-datepicker-date.win-order0:lang(sd-Arab),.win-datepicker .win-datepicker-date.win-order0:lang(syr),.win-datepicker .win-datepicker-date.win-order0:lang(ug),.win-datepicker .win-datepicker-date.win-order0:lang(ur),.win-datepicker .win-datepicker-date.win-order1:lang(ar),.win-datepicker .win-datepicker-date.win-order1:lang(dv),.win-datepicker .win-datepicker-date.win-order1:lang(fa),.win-datepicker .win-datepicker-date.win-order1:lang(he),.win-datepicker .win-datepicker-date.win-order1:lang(ku-Arab),.win-datepicker .win-datepicker-date.win-order1:lang(pa-Arab),.win-datepicker .win-datepicker-date.win-order1:lang(prs),.win-datepicker .win-datepicker-date.win-order1:lang(ps),.win-datepicker .win-datepicker-date.win-order1:lang(qps-plocm),.win-datepicker .win-datepicker-date.win-order1:lang(sd-Arab),.win-datepicker .win-datepicker-date.win-order1:lang(syr),.win-datepicker .win-datepicker-date.win-order1:lang(ug),.win-datepicker .win-datepicker-date.win-order1:lang(ur),.win-datepicker .win-datepicker-month:lang(ar),.win-datepicker .win-datepicker-month:lang(dv),.win-datepicker .win-datepicker-month:lang(fa),.win-datepicker .win-datepicker-month:lang(he),.win-datepicker .win-datepicker-month:lang(ku-Arab),.win-datepicker .win-datepicker-month:lang(pa-Arab),.win-datepicker .win-datepicker-month:lang(prs),.win-datepicker .win-datepicker-month:lang(ps),.win-datepicker .win-datepicker-month:lang(qps-plocm),.win-datepicker .win-datepicker-month:lang(sd-Arab),.win-datepicker .win-datepicker-month:lang(syr),.win-datepicker .win-datepicker-month:lang(ug),.win-datepicker .win-datepicker-month:lang(ur),.win-datepicker .win-datepicker-year.win-order0:lang(ar),.win-datepicker .win-datepicker-year.win-order0:lang(dv),.win-datepicker .win-datepicker-year.win-order0:lang(fa),.win-datepicker .win-datepicker-year.win-order0:lang(he),.win-datepicker .win-datepicker-year.win-order0:lang(ku-Arab),.win-datepicker .win-datepicker-year.win-order0:lang(pa-Arab),.win-datepicker .win-datepicker-year.win-order0:lang(prs),.win-datepicker .win-datepicker-year.win-order0:lang(ps),.win-datepicker .win-datepicker-year.win-order0:lang(qps-plocm),.win-datepicker .win-datepicker-year.win-order0:lang(sd-Arab),.win-datepicker .win-datepicker-year.win-order0:lang(syr),.win-datepicker .win-datepicker-year.win-order0:lang(ug),.win-datepicker .win-datepicker-year.win-order0:lang(ur){margin-right:0;margin-left:20px}.win-timepicker{display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;height:auto;width:auto}.win-timepicker .win-timepicker-hour,.win-timepicker .win-timepicker-minute.win-order1,.win-timepicker .win-timepicker-period.win-order0{margin-right:20px}.win-timepicker .win-timepicker-hour:lang(ar),.win-timepicker .win-timepicker-hour:lang(dv),.win-timepicker .win-timepicker-hour:lang(fa),.win-timepicker .win-timepicker-hour:lang(he),.win-timepicker .win-timepicker-hour:lang(ku-Arab),.win-timepicker .win-timepicker-hour:lang(pa-Arab),.win-timepicker .win-timepicker-hour:lang(prs),.win-timepicker .win-timepicker-hour:lang(ps),.win-timepicker .win-timepicker-hour:lang(qps-plocm),.win-timepicker .win-timepicker-hour:lang(sd-Arab),.win-timepicker .win-timepicker-hour:lang(syr),.win-timepicker .win-timepicker-hour:lang(ug),.win-timepicker .win-timepicker-hour:lang(ur),.win-timepicker .win-timepicker-minute.win-order0:lang(ar),.win-timepicker .win-timepicker-minute.win-order0:lang(dv),.win-timepicker .win-timepicker-minute.win-order0:lang(fa),.win-timepicker .win-timepicker-minute.win-order0:lang(he),.win-timepicker .win-timepicker-minute.win-order0:lang(ku-Arab),.win-timepicker .win-timepicker-minute.win-order0:lang(pa-Arab),.win-timepicker .win-timepicker-minute.win-order0:lang(prs),.win-timepicker .win-timepicker-minute.win-order0:lang(ps),.win-timepicker .win-timepicker-minute.win-order0:lang(qps-plocm),.win-timepicker .win-timepicker-minute.win-order0:lang(sd-Arab),.win-timepicker .win-timepicker-minute.win-order0:lang(syr),.win-timepicker .win-timepicker-minute.win-order0:lang(ug),.win-timepicker .win-timepicker-minute.win-order0:lang(ur),.win-timepicker .win-timepicker-minute.win-order1:lang(ar),.win-timepicker .win-timepicker-minute.win-order1:lang(dv),.win-timepicker .win-timepicker-minute.win-order1:lang(fa),.win-timepicker .win-timepicker-minute.win-order1:lang(he),.win-timepicker .win-timepicker-minute.win-order1:lang(ku-Arab),.win-timepicker .win-timepicker-minute.win-order1:lang(pa-Arab),.win-timepicker .win-timepicker-minute.win-order1:lang(prs),.win-timepicker .win-timepicker-minute.win-order1:lang(ps),.win-timepicker .win-timepicker-minute.win-order1:lang(qps-plocm),.win-timepicker .win-timepicker-minute.win-order1:lang(sd-Arab),.win-timepicker .win-timepicker-minute.win-order1:lang(syr),.win-timepicker .win-timepicker-minute.win-order1:lang(ug),.win-timepicker .win-timepicker-minute.win-order1:lang(ur),.win-timepicker .win-timepicker-period.win-order0:lang(ar),.win-timepicker .win-timepicker-period.win-order0:lang(dv),.win-timepicker .win-timepicker-period.win-order0:lang(fa),.win-timepicker .win-timepicker-period.win-order0:lang(he),.win-timepicker .win-timepicker-period.win-order0:lang(ku-Arab),.win-timepicker .win-timepicker-period.win-order0:lang(pa-Arab),.win-timepicker .win-timepicker-period.win-order0:lang(prs),.win-timepicker .win-timepicker-period.win-order0:lang(ps),.win-timepicker .win-timepicker-period.win-order0:lang(qps-plocm),.win-timepicker .win-timepicker-period.win-order0:lang(sd-Arab),.win-timepicker .win-timepicker-period.win-order0:lang(syr),.win-timepicker .win-timepicker-period.win-order0:lang(ug),.win-timepicker .win-timepicker-period.win-order0:lang(ur){margin-left:20px;margin-right:0}body>.win-navigation-backbutton{position:absolute;top:50px;left:20px}.win-back,.win-backbutton,.win-navigation-backbutton{touch-action:manipulation;display:inline-block;min-width:0;min-height:0;padding:0;text-align:center;width:41px;height:41px;font-size:24px;line-height:41px;vertical-align:baseline}.win-tooltip,.win-tooltip-phantom{display:block;position:fixed;top:30px;left:30px;margin:0}.win-back::before,.win-backbutton::before{font-weight:400;content:"\E0D5";vertical-align:50%}.win-back:lang(ar)::before,.win-back:lang(dv)::before,.win-back:lang(fa)::before,.win-back:lang(he)::before,.win-back:lang(ku-Arab)::before,.win-back:lang(pa-Arab)::before,.win-back:lang(prs)::before,.win-back:lang(ps)::before,.win-back:lang(qps-plocm)::before,.win-back:lang(sd-Arab)::before,.win-back:lang(syr)::before,.win-back:lang(ug)::before,.win-back:lang(ur)::before,.win-backbutton:lang(ar)::before,.win-backbutton:lang(dv)::before,.win-backbutton:lang(fa)::before,.win-backbutton:lang(he)::before,.win-backbutton:lang(ku-Arab)::before,.win-backbutton:lang(pa-Arab)::before,.win-backbutton:lang(prs)::before,.win-backbutton:lang(ps)::before,.win-backbutton:lang(qps-plocm)::before,.win-backbutton:lang(sd-Arab)::before,.win-backbutton:lang(syr)::before,.win-backbutton:lang(ug)::before,.win-backbutton:lang(ur)::before{content:"\E0AE"}button.win-navigation-backbutton,button.win-navigation-backbutton:active,button.win-navigation-backbutton:enabled:hover:active,html.win-hoverable button.win-navigation-backbutton:enabled:hover{background-color:transparent;border:none}@media (-ms-high-contrast){button.win-navigation-backbutton,button.win-navigation-backbutton:active,button.win-navigation-backbutton:enabled:hover:active,html.win-hoverable button.win-navigation-backbutton:enabled:hover{background-color:transparent;border:none}.win-back,.win-backbutton{background-color:ButtonFace;border-color:ButtonText;color:ButtonText}.win-backbutton.win-backbutton:enabled:hover:active,.win-navigation-backbutton.win-navigation-backbutton:enabled:hover:active .win-back{background-clip:border-box;background-color:ButtonText;border-color:transparent;color:ButtonFace}.win-backbutton:disabled,.win-backbutton:disabled:active,.win-navigation-backbutton:disabled .win-back,.win-navigation-backbutton:disabled:active .win-back{background-color:ButtonFace;border-color:GrayText;color:GrayText}.win-backbutton:-ms-keyboard-active,.win-navigation-backbutton:-ms-keyboard-active .win-back{background-clip:border-box;background-color:ButtonText;border-color:transparent;color:ButtonFace}html.win-hoverable .win-backbutton:enabled:hover,html.win-hoverable .win-navigation-backbutton:enabled:hover .win-back{background-color:Highlight;border-color:ButtonText;color:HighlightText}}.win-tooltip{max-width:320px;box-sizing:border-box;padding:4px 7px 6px;border-style:solid;border-width:1px;z-index:9999;word-wrap:break-word;animation-fill-mode:both;font-size:12px;font-weight:400;line-height:1.167}.win-tooltip-phantom{background-color:transparent;border-width:0;padding:0}.win-rating{display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-pack:self;-webkit-justify-content:self;justify-content:self;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;height:auto;width:auto;white-space:normal;outline:0}.win-rating .win-star{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;height:24px;width:24px;padding:9px 10px 11px;font-size:24px;overflow:hidden;text-indent:0;line-height:1;cursor:default;position:relative;letter-spacing:0;-ms-touch-action:none;touch-action:none}.win-rating.win-small .win-star{width:12px;height:12px;font-size:12px;padding:3px 4px 5px}.win-rating .win-star:before{content:"\E082"}.win-rating .win-star.win-disabled{cursor:default;-ms-touch-action:auto;touch-action:auto}@media (-ms-high-contrast){.win-tooltip{background-color:Window;border-color:WindowText;color:WindowText}.win-rating .win-star:before{content:"\E082"!important}.win-rating .win-star.win-full{color:HighLight}.win-rating .win-star.win-tentative.win-full{color:ButtonText}.win-rating .win-star.win-empty{color:ButtonFace}.win-rating .win-star:after{content:"\E224"!important;position:relative;top:-100%;color:ButtonText}.win-semanticzoom-button{background-color:ButtonFace;border-color:ButtonText;color:ButtonText}.win-semanticzoom-button.win-semanticzoom-button:hover:active{background-clip:border-box;background-color:ButtonText;border-color:transparent;color:ButtonFace}.win-semanticzoom-button:-ms-keyboard-active{background-clip:border-box;background-color:ButtonText;border-color:transparent;color:ButtonFace}html.win-hoverable .win-semanticzoom-button:hover{background-color:Highlight;border-color:ButtonText;color:HighlightText}}.win-toggleswitch{outline:0}.win-toggleswitch .win-toggleswitch-header{max-width:470px;margin-bottom:14px;margin-top:22px;font-size:15px;font-weight:400;line-height:1.333}.win-toggleswitch .win-toggleswitch-values{display:inline-block;vertical-align:top}.win-toggleswitch .win-toggleswitch-value{margin-left:12px;height:20px;vertical-align:top;font-size:15px;font-weight:400;line-height:20px}.win-toggleswitch .win-toggleswitch-description{font-size:12px;width:22em;margin-top:28px;display:none}.win-toggleswitch .win-toggleswitch-clickregion{display:inline-block;touch-action:none;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;padding-top:5px}.win-toggleswitch .win-toggleswitch-track{position:relative;display:inline-block;width:44px;height:20px;border-style:solid;border-width:2px;border-radius:10px;box-sizing:border-box}.win-toggleswitch .win-toggleswitch-thumb{position:absolute;top:3px;display:inline-block;width:10px;height:10px;border-radius:5px;-webkit-transition:left .1s;transition:left .1s}.win-toggleswitch:focus .win-toggleswitch-clickregion{outline-width:1px;outline-style:dotted}.win-toggleswitch.win-toggleswitch-dragging .win-toggleswitch-thumb{-webkit-transition:none;transition:none}.win-toggleswitch.win-toggleswitch-off .win-toggleswitch-value-on,.win-toggleswitch.win-toggleswitch-on .win-toggleswitch-value-off{visibility:hidden;height:0;font-size:0;line-height:0}.win-toggleswitch.win-toggleswitch-on .win-toggleswitch-thumb{left:27px}.win-toggleswitch.win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(ar).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(dv).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(fa).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(he).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(ku-Arab).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(pa-Arab).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(prs).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(ps).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(qps-plocm).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(sd-Arab).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(syr).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(ug).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(ur).win-toggleswitch-on .win-toggleswitch-thumb{left:3px}.win-toggleswitch:lang(ar).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(dv).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(fa).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(he).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(ku-Arab).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(pa-Arab).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(prs).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(ps).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(qps-plocm).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(sd-Arab).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(syr).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(ug).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(ur).win-toggleswitch-off .win-toggleswitch-thumb{left:27px}.win-semanticzoom{touch-action:pan-x pan-y double-tap-zoom;height:400px;position:relative}.win-semanticzoom .win-listview>.win-viewport *{touch-action:auto}.win-semanticzoom *{touch-action:inherit}.win-semanticzoom-button{z-index:100;position:absolute;min-width:25px;min-height:25px;width:25px;height:25px;padding:0;bottom:21px;touch-action:none}.win-semanticzoom-button::before{font-weight:400;font-size:11px;content:"\E0B8"}.win-semanticzoom-button-location{left:auto;right:4px}.win-semanticzoom-button-location:lang(ar),.win-semanticzoom-button-location:lang(dv),.win-semanticzoom-button-location:lang(fa),.win-semanticzoom-button-location:lang(he),.win-semanticzoom-button-location:lang(ku-Arab),.win-semanticzoom-button-location:lang(pa-Arab),.win-semanticzoom-button-location:lang(prs),.win-semanticzoom-button-location:lang(ps),.win-semanticzoom-button-location:lang(qps-plocm),.win-semanticzoom-button-location:lang(sd-Arab),.win-semanticzoom-button-location:lang(syr),.win-semanticzoom-button-location:lang(ug),.win-semanticzoom-button-location:lang(ur){left:4px;right:auto}.win-pivot{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex-wrap:none;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;height:100%;width:100%;overflow:hidden;-ms-scroll-limit-x-max:0;touch-action:manipulation;position:relative}.win-pivot .win-pivot-navbutton{touch-action:manipulation;position:absolute;width:20px;height:36px;padding:0;margin:0;top:10px;min-width:0;border-width:0;cursor:pointer;opacity:0}.win-pivot .win-pivot-headers.win-pivot-shownavbuttons .win-pivot-navbutton{opacity:1}.win-pivot .win-pivot-headers .win-pivot-navbutton-prev:before{content:"\E096"}.win-pivot .win-pivot-headers .win-pivot-navbutton-next:before{content:"\E09B"}.win-pivot .win-pivot-title{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;font-family:"Segoe UI",sans-serif,"Segoe MDL2 Assets",Symbols,"Segoe UI Emoji";font-size:15px;font-weight:700;white-space:nowrap;margin:14px 0 13px 24px}.win-pivot .win-pivot-title:lang(ar),.win-pivot .win-pivot-title:lang(dv),.win-pivot .win-pivot-title:lang(fa),.win-pivot .win-pivot-title:lang(he),.win-pivot .win-pivot-title:lang(ku-Arab),.win-pivot .win-pivot-title:lang(pa-Arab),.win-pivot .win-pivot-title:lang(prs),.win-pivot .win-pivot-title:lang(ps),.win-pivot .win-pivot-title:lang(qps-plocm),.win-pivot .win-pivot-title:lang(sd-Arab),.win-pivot .win-pivot-title:lang(syr),.win-pivot .win-pivot-title:lang(ug),.win-pivot .win-pivot-title:lang(ur){margin:14px 24px 13px 0}.win-pivot>.win-pivot-item{display:none}.win-pivot .win-pivot-header-area{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.win-hub-section,.win-hub-surface{display:inline-block}.win-pivot .win-pivot-header-leftcustom,.win-pivot .win-pivot-header-rightcustom{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;margin-top:13px}.win-pivot .win-pivot-header-items{-ms-flex:1 1 0%;-webkit-flex:1 1 0%;flex:1 1 0%;overflow-x:hidden;padding:1px}.win-pivot .win-pivot-headers{white-space:nowrap;position:relative;overflow-y:visible;height:48px;touch-action:none;-ms-touch-action:none;outline:0}.win-pivot .win-pivot-headers.win-keyboard:focus{outline-style:dotted;outline-width:1px}.win-pivot .win-pivot-header,.win-pivot .win-pivot-header.win-pivot-header:hover:active{touch-action:manipulation;font-size:24px;font-weight:300;line-height:1.167;display:inline-block;transition:opacity linear 167ms;-webkit-transition:opacity linear 167ms;overflow:hidden;height:30px;border:0;padding:0;outline:0;margin:12px 12px 0;min-height:0;min-width:0}.win-pivot.win-pivot-locked .win-pivot-header{opacity:0;visibility:hidden}.win-pivot .win-pivot-header.win-pivot-header-selected,.win-pivot.win-pivot-locked .win-pivot-header.win-pivot-header-selected{opacity:1;visibility:inherit}.win-pivot .win-pivot-viewport{height:100%;overflow-x:auto;overflow-y:hidden;-ms-scroll-snap-type:mandatory;-ms-scroll-snap-points-x:snapInterval(0,100%);-ms-overflow-style:none;position:relative;padding-top:48px;margin-top:-48px}.win-pivot.win-pivot-customheaders .win-pivot-viewport{padding-top:inherit;margin-top:inherit}.win-pivot.win-pivot-mouse .win-pivot-viewport{padding-top:0;margin-top:0}.win-pivot.win-pivot-locked .win-pivot-viewport{overflow:hidden}.win-pivot .win-pivot-surface{width:300%;height:100%;position:relative}html.win-hoverable .win-pivot button.win-pivot-header:hover{background-color:transparent;border:0;padding:0;letter-spacing:0;margin:12px 12px 0;min-height:0;min-width:0}html.win-hoverable .win-pivot .win-pivot-navbutton:hover{margin:0;padding:0;border-width:0;cursor:pointer;font-family:"Segoe MDL2 Assets",Symbols}.win-pivot-item{position:absolute;top:0;bottom:0;width:33.3%;left:33.3%}.win-pivot-item:lang(ar),.win-pivot-item:lang(dv),.win-pivot-item:lang(fa),.win-pivot-item:lang(he),.win-pivot-item:lang(ku-Arab),.win-pivot-item:lang(pa-Arab),.win-pivot-item:lang(prs),.win-pivot-item:lang(ps),.win-pivot-item:lang(qps-plocm),.win-pivot-item:lang(sd-Arab),.win-pivot-item:lang(syr),.win-pivot-item:lang(ug),.win-pivot-item:lang(ur){left:auto;right:33.3%}.win-pivot-item .win-pivot-item-content{height:100%;overflow-y:auto;-ms-overflow-style:-ms-autohiding-scrollbar;padding:0 24px}.win-pivot.win-pivot-nosnap .win-pivot-viewport{padding-top:0;margin-top:0;overflow:hidden}.win-pivot.win-pivot-nosnap .win-pivot-item,.win-pivot.win-pivot-nosnap .win-pivot-surface{width:100%;position:static}.win-hub{height:100%;width:100%;position:relative}.win-hub-progress{position:absolute;top:10px;width:100%;z-index:1}.win-hub-viewport{height:100%;width:100%;-ms-scroll-snap-type:proximity;-webkit-overflow-scrolling:touch}.win-hub-horizontal .win-hub-viewport{overflow-x:auto;overflow-y:hidden;white-space:nowrap}.win-hub-vertical .win-hub-viewport{position:relative;overflow-y:auto;overflow-x:hidden}.win-hub-vertical .win-hub-surface{width:calc(100% - 24px);padding:0 12px 8px;margin-top:-24px}.win-hub-horizontal .win-hub-surface{height:100%;padding-left:12px}.win-hub-horizontal .win-hub-surface:lang(ar),.win-hub-horizontal .win-hub-surface:lang(dv),.win-hub-horizontal .win-hub-surface:lang(fa),.win-hub-horizontal .win-hub-surface:lang(he),.win-hub-horizontal .win-hub-surface:lang(ku-Arab),.win-hub-horizontal .win-hub-surface:lang(pa-Arab),.win-hub-horizontal .win-hub-surface:lang(prs),.win-hub-horizontal .win-hub-surface:lang(ps),.win-hub-horizontal .win-hub-surface:lang(qps-plocm),.win-hub-horizontal .win-hub-surface:lang(sd-Arab),.win-hub-horizontal .win-hub-surface:lang(syr),.win-hub-horizontal .win-hub-surface:lang(ug),.win-hub-horizontal .win-hub-surface:lang(ur){padding-left:0;padding-right:12px}.win-hub-section{vertical-align:top;white-space:normal}.win-hub-horizontal .win-hub-section{height:100%;padding-right:24px}.win-hub-horizontal .win-hub-section:lang(ar),.win-hub-horizontal .win-hub-section:lang(dv),.win-hub-horizontal .win-hub-section:lang(fa),.win-hub-horizontal .win-hub-section:lang(he),.win-hub-horizontal .win-hub-section:lang(ku-Arab),.win-hub-horizontal .win-hub-section:lang(pa-Arab),.win-hub-horizontal .win-hub-section:lang(prs),.win-hub-horizontal .win-hub-section:lang(ps),.win-hub-horizontal .win-hub-section:lang(qps-plocm),.win-hub-horizontal .win-hub-section:lang(sd-Arab),.win-hub-horizontal .win-hub-section:lang(syr),.win-hub-horizontal .win-hub-section:lang(ug),.win-hub-horizontal .win-hub-section:lang(ur){padding-right:0;padding-left:24px}.win-hub-horizontal .win-hub-section-header{margin-top:62px}.win-hub-vertical .win-hub-section{width:100%;padding-top:24px}.win-hub-section-header{margin-bottom:9px;height:28px}button.win-hub-section-header-tabstop,button.win-hub-section-header-tabstop:hover:active,html.win-hoverable button.win-hub-section-header-tabstop:hover{touch-action:manipulation;width:100%;background-color:transparent;border:0;min-height:0;min-width:0;max-width:100%;padding:0}button.win-hub-section-header-tabstop:focus{outline:0}button.win-hub-section-header-tabstop:-ms-keyboard-active{background-color:transparent}.win-hub-section-header-wrapper{display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;width:100%;outline:0}.win-hub-section-header-content{font-size:20px;font-weight:400;line-height:1.5;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;text-align:left;vertical-align:bottom;overflow:hidden;text-overflow:clip;white-space:nowrap}.win-hub-section-header-content:lang(ar),.win-hub-section-header-content:lang(dv),.win-hub-section-header-content:lang(fa),.win-hub-section-header-content:lang(he),.win-hub-section-header-content:lang(ku-Arab),.win-hub-section-header-content:lang(pa-Arab),.win-hub-section-header-content:lang(prs),.win-hub-section-header-content:lang(ps),.win-hub-section-header-content:lang(qps-plocm),.win-hub-section-header-content:lang(sd-Arab),.win-hub-section-header-content:lang(syr),.win-hub-section-header-content:lang(ug),.win-hub-section-header-content:lang(ur){text-align:right}.win-hub-section-header-chevron{display:none}.win-hub-section-header-interactive .win-hub-section-header-chevron{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;display:inline-block;margin-left:24px;line-height:1.5;padding-top:7px;text-align:right;vertical-align:bottom}.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ar),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(dv),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(fa),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(he),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ku-Arab),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(pa-Arab),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(prs),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ps),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(qps-plocm),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(sd-Arab),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(syr),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ug),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ur){text-align:left;margin-left:0;margin-right:24px}.win-hub-horizontal .win-hub-section-content{height:calc(100% - 99px)}.win-hub-vertical .win-hub-section-content{width:100%}@media (-ms-high-contrast){button.win-hub-section-header-tabstop,button.win-hub-section-header-tabstop:hover:active,html.win-hoverable button.win-hub-section-header-tabstop:hover{background-color:transparent;color:WindowText}button.win-hub-section-header-tabstop:-ms-keyboard-active{color:WindowText}button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover:active,html.win-hoverable button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover{color:-ms-hotlight}button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active{color:-ms-hotlight}}.win-clickeater{background-color:transparent;width:110%;height:110%;left:-5%;top:-5%;position:fixed;touch-action:none;outline:Purple solid 1px;-ms-high-contrast-adjust:none}button.win-command{touch-action:manipulation;background:0 0;background-clip:border-box;height:auto;padding:0;margin:0;border:1px dotted;min-width:40px;min-height:48px;text-align:center;font-size:12px;line-height:16px;font-weight:400;overflow:visible;writing-mode:lr-tb;position:relative;z-index:0;outline:0}button.win-command::-moz-focus-inner{padding:0;border:0}button:lang(ar),button:lang(dv),button:lang(fa),button:lang(he),button:lang(ku-Arab),button:lang(pa-Arab),button:lang(prs),button:lang(ps),button:lang(qps-plocm),button:lang(sd-Arab),button:lang(syr),button:lang(ug),button:lang(ur){writing-mode:rl-tb}.win-commandicon{display:block;margin:11px 21px;min-width:0;min-height:0;padding:0;width:24px;height:24px;box-sizing:border-box;-moz-box-sizing:border-box;cursor:default;position:relative;outline:0}.win-commandimage{font-family:"Segoe UI Command",Symbols;letter-spacing:0;vertical-align:middle;font-size:20px;margin:0;line-height:24px;background-position:0 0;background-origin:border-box;display:inline-block;width:24px;height:24px;background-size:96px 48px;outline:0}.win-commandimage.win-commandglyph{position:absolute;left:0}button.win-command .win-label,div.win-command{font-size:12px;line-height:16px;position:relative;font-weight:400}button:active .win-commandimage,html.win-hoverable button:enabled:hover .win-commandimage{background-position:-24px 0}button:enabled:hover:active .win-commandimage.win-commandimage{background-position:-48px 0}button:-ms-keyboard-active .win-commandimage{background-position:-48px 0}button:disabled .win-commandimage,button:disabled:active .win-commandimage{background-position:-72px 0}button[aria-checked=true] .win-commandimage{background-position:0 -24px}button[aria-checked=true]:active .win-commandimage,html.win-hoverable button[aria-checked=true]:enabled:hover .win-commandimage{background-position:-24px -24px}button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage{background-position:-48px -24px}button[aria-checked=true]:-ms-keyboard-active .win-commandimage{background-position:-48px -24px}button[aria-checked=true]:disabled .win-commandimage,button[aria-checked=true]:disabled:active .win-commandimage{background-position:-72px -24px}button.win-command .win-label{font-family:"Segoe UI",sans-serif,"Segoe MDL2 Assets",Symbols,"Segoe UI Emoji";display:block;max-width:66px;margin-top:-10px;margin-bottom:6px;padding:0;overflow:hidden;word-wrap:break-word;word-break:keep-all;outline:0}.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis,.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis,.win-searchbox-button,.win-splitviewcommand-icon{font-family:"Segoe MDL2 Assets",Symbols}div.win-command,hr.win-command{display:inline-block;vertical-align:top}hr.win-command{padding:0;margin:12px 16px;width:2px;height:24px;border:0}div.win-command{min-width:0;min-height:0;padding:0 31px;border:1px dotted;text-align:center;writing-mode:lr-tb}div.win-command:lang(ar),div.win-command:lang(dv),div.win-command:lang(fa),div.win-command:lang(he),div.win-command:lang(ku-Arab),div.win-command:lang(pa-Arab),div.win-command:lang(prs),div.win-command:lang(ps),div.win-command:lang(qps-plocm),div.win-command:lang(sd-Arab),div.win-command:lang(syr),div.win-command:lang(ug),div.win-command:lang(ur){writing-mode:rl-tb}div.win-command:focus{outline:0}.win-command.win-command-hidden{display:none}.win-navbar{border-width:0;width:100%;height:auto;left:0;position:fixed;position:-ms-device-fixed;min-height:48px}.win-navbar.win-navbar-minimal{min-height:25px}.win-navbar.win-navbar-minimal.win-navbar-closed .win-navbar-invokebutton .win-navbar-ellipsis{top:5px}.win-navbar.win-navbar-closing.win-navbar-minimal>:not(.win-navbar-invokebutton){opacity:0}.win-navbar.win-menulayout.win-navbar-closing .win-navbar-menu{opacity:1}.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplaycompact .win-command .win-label,.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplayminimal .win-command,.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplaynone .win-command,winjs-themedetection-tag{opacity:0}.win-navbar.win-navbar-closed.win-navbar-minimal>:not(.win-navbar-invokebutton){display:none!important}.win-navbar.win-navbar-closed.win-navbar-minimal .win-navbar-invokebutton,.win-navbar.win-navbar-closing.win-navbar-minimal .win-navbar-invokebutton{width:100%}.win-navbar.win-menulayout.win-navbar-closing .win-navbar-invokebutton,.win-navbar.win-menulayout.win-navbar-opened .win-navbar-invokebutton,.win-navbar.win-menulayout.win-navbar-opening .win-navbar-invokebutton{visibility:hidden}.win-navbar.win-menulayout.win-navbar-closing .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton,.win-navbar.win-menulayout.win-navbar-opened .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton,.win-navbar.win-menulayout.win-navbar-opening .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton{visibility:visible}.win-navbar .win-navbar-invokebutton{touch-action:manipulation;position:absolute;right:0;margin:0;padding:0;border:1px dotted;min-width:0;background-clip:border-box;display:none;z-index:1}.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis{height:100%;right:0;top:15px;position:absolute;display:inline-block;font-size:14px;text-align:center}.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis::before{content:"\E10C";position:relative}.win-navbar:lang(ar) .win-navbar-invokebutton,.win-navbar:lang(ar) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(dv) .win-navbar-invokebutton,.win-navbar:lang(dv) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(fa) .win-navbar-invokebutton,.win-navbar:lang(fa) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(he) .win-navbar-invokebutton,.win-navbar:lang(he) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(ku-Arab) .win-navbar-invokebutton,.win-navbar:lang(ku-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(pa-Arab) .win-navbar-invokebutton,.win-navbar:lang(pa-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(prs) .win-navbar-invokebutton,.win-navbar:lang(prs) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(ps) .win-navbar-invokebutton,.win-navbar:lang(ps) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(qps-plocm) .win-navbar-invokebutton,.win-navbar:lang(qps-plocm) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(sd-Arab) .win-navbar-invokebutton,.win-navbar:lang(sd-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(syr) .win-navbar-invokebutton,.win-navbar:lang(syr) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(ug) .win-navbar-invokebutton,.win-navbar:lang(ug) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(ur) .win-navbar-invokebutton,.win-navbar:lang(ur) .win-navbar-invokebutton .win-navbar-ellipsis{right:auto;left:0}.win-navbar.win-navbar-compact .win-navbar-invokebutton,.win-navbar.win-navbar-minimal .win-navbar-invokebutton{display:block}.win-commandlayout{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:none;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.win-commandlayout .win-primarygroup{-ms-flex-order:2;flex-order:2;-webkit-order:2;order:2;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.win-commandlayout .win-secondarygroup{-ms-flex-order:1;flex-order:1;-webkit-order:1;order:1;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.win-commandlayout .win-command{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto}.win-commandlayout.win-navbar-closing,.win-commandlayout.win-navbar-opened,.win-commandlayout.win-navbar-opening{min-height:62px}.win-commandlayout.win-navbar-closing.win-navbar-compact,.win-commandlayout.win-navbar-opened.win-navbar-compact,.win-commandlayout.win-navbar-opening.win-navbar-compact{min-height:48px}.win-commandlayout.win-navbar-compact,.win-commandlayout.win-navbar-minimal{padding-right:32px;width:calc(100% - 32px)}.win-commandlayout.win-navbar-compact button.win-command .win-label{display:none}.win-commandlayout.win-navbar-compact.win-navbar-closing button.win-command .win-label{display:block;visibility:hidden}.win-commandlayout.win-navbar-compact.win-navbar-opened button.win-command .win-label,.win-commandlayout.win-navbar-compact.win-navbar-opening button.win-command .win-label{display:block;visibility:visible}.win-commandlayout:lang(ar).win-navbar-compact,.win-commandlayout:lang(ar).win-navbar-minimal,.win-commandlayout:lang(dv).win-navbar-compact,.win-commandlayout:lang(dv).win-navbar-minimal,.win-commandlayout:lang(fa).win-navbar-compact,.win-commandlayout:lang(fa).win-navbar-minimal,.win-commandlayout:lang(he).win-navbar-compact,.win-commandlayout:lang(he).win-navbar-minimal,.win-commandlayout:lang(ku-Arab).win-navbar-compact,.win-commandlayout:lang(ku-Arab).win-navbar-minimal,.win-commandlayout:lang(pa-Arab).win-navbar-compact,.win-commandlayout:lang(pa-Arab).win-navbar-minimal,.win-commandlayout:lang(prs).win-navbar-compact,.win-commandlayout:lang(prs).win-navbar-minimal,.win-commandlayout:lang(ps).win-navbar-compact,.win-commandlayout:lang(ps).win-navbar-minimal,.win-commandlayout:lang(qps-plocm).win-navbar-compact,.win-commandlayout:lang(qps-plocm).win-navbar-minimal,.win-commandlayout:lang(sd-Arab).win-navbar-compact,.win-commandlayout:lang(sd-Arab).win-navbar-minimal,.win-commandlayout:lang(syr).win-navbar-compact,.win-commandlayout:lang(syr).win-navbar-minimal,.win-commandlayout:lang(ug).win-navbar-compact,.win-commandlayout:lang(ug).win-navbar-minimal,.win-commandlayout:lang(ur).win-navbar-compact,.win-commandlayout:lang(ur).win-navbar-minimal{padding-right:0;padding-left:32px}.win-menulayout .win-navbar-menu{position:absolute;right:0;top:0;overflow:hidden}.win-menulayout .win-navbar-menu:lang(ar),.win-menulayout .win-navbar-menu:lang(dv),.win-menulayout .win-navbar-menu:lang(fa),.win-menulayout .win-navbar-menu:lang(he),.win-menulayout .win-navbar-menu:lang(ku-Arab),.win-menulayout .win-navbar-menu:lang(pa-Arab),.win-menulayout .win-navbar-menu:lang(prs),.win-menulayout .win-navbar-menu:lang(ps),.win-menulayout .win-navbar-menu:lang(qps-plocm),.win-menulayout .win-navbar-menu:lang(sd-Arab),.win-menulayout .win-navbar-menu:lang(syr),.win-menulayout .win-navbar-menu:lang(ug),.win-menulayout .win-navbar-menu:lang(ur){left:0;right:auto}.win-menulayout.win-bottom .win-navbar-menu{overflow:visible}.win-menulayout .win-toolbar{max-width:100vw}.win-menulayout.win-navbar-compact button.win-command .win-label{display:none;visibility:hidden}.win-menulayout.win-navbar-compact.win-navbar-closing button.win-command .win-label,.win-menulayout.win-navbar-compact.win-navbar-opened button.win-command .win-label,.win-menulayout.win-navbar-compact.win-navbar-opening button.win-command .win-label{display:block;visibility:visible}.win-menulayout.win-navbar-compact.win-navbar-closed{overflow:hidden}.win-flyout,.win-flyout.win-scrolls{overflow:auto}.win-menulayout.win-navbar-compact.win-navbar-closed .win-toolbar-overflowarea{visibility:hidden}@media (-ms-high-contrast){.win-navbar{border:2px solid}.win-navbar.win-top{border-top:none;border-left:none;border-right:none}.win-navbar.win-bottom{border-bottom:none;border-left:none;border-right:none}.win-navbar.win-top button.win-command,.win-navbar.win-top div.win-command{padding-bottom:7px}.win-navbar.win-bottom button.win-command,.win-navbar.win-bottom div.win-command{padding-top:7px}.win-navbar.win-top hr.win-command{margin-bottom:28px}.win-navbar.win-bottom hr.win-command{margin-top:8px}.win-commandlayout.win-navbar-closing,.win-commandlayout.win-navbar-opened,.win-commandlayout.win-navbar-opening{min-height:62px}}.win-flyout{position:fixed;position:-ms-device-fixed;padding:12px;border-style:solid;border-width:1px;margin:4px;min-width:70px;max-width:430px;min-height:16px;max-height:730px;width:auto;height:auto;word-wrap:break-word;font-size:15px;font-weight:400;line-height:1.333}.win-flyout.win-leftalign{margin-left:0}.win-flyout.win-rightalign{margin-right:0}@media (max-width:464px){.win-flyout{max-width:calc(100% - 34px)}}.win-menu{padding:0;line-height:33px;text-align:left;min-height:42px;max-height:calc(100% - 26px);min-width:134px;max-width:454px}.win-menu button.win-command{display:block;margin-left:0;margin-right:0;text-align:left;width:100%;font-size:15px;font-weight:400;line-height:1.333}.win-menu button.win-command:focus{outline:0}.win-menu button.win-command .win-menucommand-liner{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:none;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-align:center;-webkit-align-items:center;align-items:center;width:100%;position:relative}.win-menu button.win-command .win-menucommand-liner .win-flyouticon,.win-menu button.win-command .win-menucommand-liner .win-toggleicon{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;display:none;visibility:hidden;font-size:16px;font-family:"Segoe MDL2 Assets",Symbols}.win-menu button.win-command .win-menucommand-liner .win-toggleicon{margin-left:12px}.win-menu button.win-command .win-menucommand-liner .win-toggleicon::before{content:"\E0E7"}.win-menu button.win-command .win-menucommand-liner .win-flyouticon{margin-left:12px;margin-right:16px}.win-menu button.win-command .win-menucommand-liner .win-flyouticon::before{content:"\E26B"}.win-menu button.win-command .win-menucommand-liner .win-label{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;font-size:15px;line-height:inherit;min-width:112px;max-width:none;white-space:nowrap;text-overflow:clip;margin:0;padding:0 12px}.win-menu button.win-command .win-menucommand-liner:lang(ar),.win-menu button.win-command .win-menucommand-liner:lang(dv),.win-menu button.win-command .win-menucommand-liner:lang(fa),.win-menu button.win-command .win-menucommand-liner:lang(he),.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab),.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab),.win-menu button.win-command .win-menucommand-liner:lang(prs),.win-menu button.win-command .win-menucommand-liner:lang(ps),.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm),.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab),.win-menu button.win-command .win-menucommand-liner:lang(syr),.win-menu button.win-command .win-menucommand-liner:lang(ug),.win-menu button.win-command .win-menucommand-liner:lang(ur){text-align:right}.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(he) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-toggleicon{margin-left:0;margin-right:12px}.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(he) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-flyouticon{margin-left:16px;margin-right:12px}.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(he) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-flyouticon::before{content:"\E26C"}.win-menu.win-menu-mousespacing button.win-command{padding-top:5px;padding-bottom:7px;min-height:32px}.win-menu.win-menu-touchspacing button.win-command{padding-top:11px;padding-bottom:13px;min-height:44px}.win-menu hr.win-command{display:block;height:1px;width:auto;border:0;padding:0;margin:9px 20px 10px}.win-menu-containsflyoutcommand button.win-command .win-menucommand-liner .win-flyouticon,.win-menu-containstogglecommand button.win-command .win-menucommand-liner .win-toggleicon{display:inline-block}.win-menu-containsflyoutcommand button.win-command-flyout .win-menucommand-liner .win-flyouticon,.win-menu-containstogglecommand button.win-command-toggle[aria-checked=true] .win-menucommand-liner .win-toggleicon{visibility:visible}@media (max-width:464px){.win-menu{max-width:calc(100% - 10px)}}.win-overlay{-ms-touch-select:none}.win-overlay [contenteditable=true],.win-overlay input:not([type=file]),.win-overlay input:not([type=radio]),.win-overlay input:not([type=checkbox]),.win-overlay input:not([type=button]),.win-overlay input:not([type=range]),.win-overlay input:not([type=image]),.win-overlay input:not([type=reset]),.win-overlay input:not([type=hidden]),.win-overlay input:not([type=submit]),.win-overlay textarea{-ms-touch-select:grippers}.win-visualviewport-space{position:fixed;position:-ms-device-fixed;height:100%;width:100%;visibility:hidden}.win-settingsflyout{border-left:1px solid;position:fixed;top:0;right:0;height:100%;width:319px}.win-settingsflyout:lang(ar),.win-settingsflyout:lang(dv),.win-settingsflyout:lang(fa),.win-settingsflyout:lang(he),.win-settingsflyout:lang(ku-Arab),.win-settingsflyout:lang(pa-Arab),.win-settingsflyout:lang(prs),.win-settingsflyout:lang(ps),.win-settingsflyout:lang(qps-plocm),.win-settingsflyout:lang(sd-Arab),.win-settingsflyout:lang(syr),.win-settingsflyout:lang(ug),.win-settingsflyout:lang(ur){border-left:none;border-right:1px solid}.win-settingsflyout.win-wide{width:645px}.win-settingsflyout .win-back,.win-settingsflyout .win-backbutton{width:32px;height:32px;font-size:20px;line-height:32px}.win-settingsflyout .win-header{height:32px;position:relative;padding:6px 12px 10px 52px}.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayfull .win-commandingsurface-actionarea,.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-actionarea{height:auto}.win-settingsflyout .win-header .win-label{display:inline-block;font-size:24px;font-weight:300;line-height:32px;white-space:nowrap}.win-settingsflyout .win-header .win-backbutton,.win-settingsflyout .win-header .win-navigation-backbutton{position:absolute;left:12px}.win-settingsflyout .win-content{overflow:auto;padding:0 12px}.win-settingsflyout .win-content .win-label{font-size:20px;font-weight:400;line-height:1.2}.win-settingsflyout .win-content .win-settings-section{margin:0;padding-top:0;padding-bottom:20px}.win-settingsflyout .win-content .win-settings-section p{margin:0;padding-top:0;padding-bottom:25px}.win-settingsflyout .win-content .win-settings-section a{margin:0;padding-top:0;padding-bottom:25px;display:inline-block}.win-settingsflyout .win-content .win-settings-section label{display:block;padding-bottom:7px}.win-settingsflyout .win-content .win-settings-section button,.win-settingsflyout .win-content .win-settings-section input[type=button],.win-settingsflyout .win-content .win-settings-section input[type=text],.win-settingsflyout .win-content .win-settings-section select{margin-bottom:25px;margin-left:0;margin-right:20px}.win-settingsflyout .win-content .win-settings-section button:lang(ar),.win-settingsflyout .win-content .win-settings-section button:lang(dv),.win-settingsflyout .win-content .win-settings-section button:lang(fa),.win-settingsflyout .win-content .win-settings-section button:lang(he),.win-settingsflyout .win-content .win-settings-section button:lang(ku-Arab),.win-settingsflyout .win-content .win-settings-section button:lang(pa-Arab),.win-settingsflyout .win-content .win-settings-section button:lang(prs),.win-settingsflyout .win-content .win-settings-section button:lang(ps),.win-settingsflyout .win-content .win-settings-section button:lang(qps-plocm),.win-settingsflyout .win-content .win-settings-section button:lang(sd-Arab),.win-settingsflyout .win-content .win-settings-section button:lang(syr),.win-settingsflyout .win-content .win-settings-section button:lang(ug),.win-settingsflyout .win-content .win-settings-section button:lang(ur),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ar),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(dv),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(fa),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(he),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ku-Arab),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(pa-Arab),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(prs),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ps),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(qps-plocm),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(sd-Arab),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(syr),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ug),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ur),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ar),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(dv),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(fa),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(he),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ku-Arab),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(pa-Arab),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(prs),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ps),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(qps-plocm),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(sd-Arab),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(syr),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ug),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ur),.win-settingsflyout .win-content .win-settings-section select:lang(ar),.win-settingsflyout .win-content .win-settings-section select:lang(dv),.win-settingsflyout .win-content .win-settings-section select:lang(fa),.win-settingsflyout .win-content .win-settings-section select:lang(he),.win-settingsflyout .win-content .win-settings-section select:lang(ku-Arab),.win-settingsflyout .win-content .win-settings-section select:lang(pa-Arab),.win-settingsflyout .win-content .win-settings-section select:lang(prs),.win-settingsflyout .win-content .win-settings-section select:lang(ps),.win-settingsflyout .win-content .win-settings-section select:lang(qps-plocm),.win-settingsflyout .win-content .win-settings-section select:lang(sd-Arab),.win-settingsflyout .win-content .win-settings-section select:lang(syr),.win-settingsflyout .win-content .win-settings-section select:lang(ug),.win-settingsflyout .win-content .win-settings-section select:lang(ur){margin-bottom:25px;margin-left:20px;margin-right:0}.win-settingsflyout .win-content .win-settings-section input[type=radio]{margin-top:0;margin-bottom:0;padding-bottom:15px}@keyframes WinJS-showFlyoutTop{from{transform:translateY(50px)}to{transform:none}}@keyframes WinJS-showFlyoutBottom{from{transform:translateY(-50px)}to{transform:none}}@keyframes WinJS-showFlyoutLeft{from{transform:translateX(50px)}to{transform:none}}@keyframes WinJS-showFlyoutRight{from{transform:translateX(-50px)}to{transform:none}}@-webkit-keyframes -webkit-WinJS-showFlyoutTop{from{-webkit-transform:translateY(50px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-showFlyoutBottom{from{-webkit-transform:translateY(-50px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-showFlyoutLeft{from{-webkit-transform:translateX(50px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-showFlyoutRight{from{-webkit-transform:translateX(-50px)}to{-webkit-transform:none}}.win-commandingsurface{outline:0;min-width:32px;position:relative}.win-commandingsurface.win-commandingsurface-overflowbottom .win-commandingsurface-overflowareacontainer{top:100%}.win-commandingsurface.win-commandingsurface-overflowtop .win-commandingsurface-overflowareacontainer{bottom:100%}.win-commandingsurface .win-commandingsurface-actionarea{min-height:24px;vertical-align:top;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-spacer{visibility:hidden;min-height:48px;width:0}.win-commandingsurface .win-commandingsurface-actionarea .win-command,.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton{touch-action:manipulation;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto}.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton{width:32px;margin:0;padding:0;border-width:1px;border-style:dotted;min-width:0;min-height:0;outline:0;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;box-sizing:border-box;background-clip:border-box}.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis{font-size:16px}.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis::before{content:"\E10C"}.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-overflowarea,.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-overflowareacontainer{display:block}.win-commandingsurface .win-commandingsurface-insetoutline,.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-overflowarea,.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-overflowareacontainer,.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaycompact .win-commandingsurface-actionarea .win-command .win-label,.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea .win-command,.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea .win-commandingsurface-spacer,.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaynone{display:none}.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaycompact .win-commandingsurface-actionarea{height:48px}.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea{height:24px}.win-commandingsurface .win-commandingsurface-overflowareacontainer{position:absolute;overflow:hidden;right:0;left:auto}.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ar),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(dv),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(fa),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(he),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ku-Arab),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(pa-Arab),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(prs),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ps),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(qps-plocm),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(sd-Arab),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(syr),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ug),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ur){left:0;right:auto}.win-commandingsurface .win-commandingsurface-overflowarea,.win-commandingsurface .win-commandingsurface-overflowareacontainer{min-width:160px;min-height:0;max-height:50vh;padding:0}.win-commandingsurface .win-commandingsurface-overflowarea{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;overflow-y:auto;overflow-x:hidden}.win-commandingsurface .win-commandingsurface-overflowarea.win-menu{max-width:480px}.win-commandingsurface .win-commandingsurface-overflowarea .win-commandingsurface-spacer{visibility:hidden;height:24px}.win-commandingsurface .win-commandingsurface-overflowarea button.win-command{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;min-height:44px;border:1px dotted transparent;padding:10px 11px 12px;font-size:15px;font-weight:400;line-height:1.333;white-space:nowrap;overflow:hidden}.win-commandingsurface .win-commandingsurface-overflowarea hr.win-command{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;height:2px;margin:6px 12px 4px}.win-commandingsurface .win-commandingsurface-actionareacontainer{overflow:hidden;position:relative}.win-commandingsurface .win-command.win-command-hidden{display:inline-block}.win-commandingsurface .win-command.win-commandingsurface-command-hidden,.win-commandingsurface .win-command.win-commandingsurface-command-primary-overflown,.win-commandingsurface .win-command.win-commandingsurface-command-secondary-overflown,.win-commandingsurface .win-command.win-commandingsurface-command-separator-hidden{display:none}@media (max-width:480px){.win-commandingsurface .win-commandingsurface-overflowarea.win-menu{width:100vw}}.win-toolbar{min-width:32px}.win-toolbar.win-toolbar-opened{position:fixed}.win-autosuggestbox{white-space:normal;position:relative;width:266px;min-width:265px;min-height:28px}.win-autosuggestbox-flyout{position:absolute;top:100%;width:100%;z-index:100;max-height:374px;min-height:44px;overflow:auto;-ms-scroll-chaining:none;touch-action:none;font-size:15px;font-weight:400;line-height:1.333}.win-autosuggestbox-suggestion-result div,.win-autosuggestbox-suggestion-result-text{line-height:20px;overflow:hidden;white-space:nowrap}.win-autosuggestbox-flyout-above{bottom:100%;top:auto}.win-autosuggestbox-flyout-above .win-repeater{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column-reverse;-webkit-flex-direction:column-reverse;flex-direction:column-reverse}.win-autosuggestbox .win-autosuggestbox-input{-ms-ime-align:after;margin:0;width:100%}.win-autosuggestbox-suggestion-selected{outline-style:dotted;outline-width:1px}.win-autosuggestbox-suggestion-result{display:-ms-flexbox;display:-webkit-flex;display:flex;padding:0 18px;height:60px;font-size:11pt;outline:0}.win-autosuggestbox-suggestion-result-text{padding-top:9px;padding-bottom:11px;height:60px;width:179px}.win-autosuggestbox-suggestion-result-detailed-text{display:inline-block;overflow:hidden;line-height:22px;margin-top:-1px;width:100%}.win-autosuggestbox-suggestion-result img{width:40px;height:40px;margin-left:0;padding-right:10px;padding-top:10px;padding-bottom:10px}.win-autosuggestbox-suggestion-result img:lang(ar),.win-autosuggestbox-suggestion-result img:lang(dv),.win-autosuggestbox-suggestion-result img:lang(fa),.win-autosuggestbox-suggestion-result img:lang(he),.win-autosuggestbox-suggestion-result img:lang(ku-Arab),.win-autosuggestbox-suggestion-result img:lang(pa-Arab),.win-autosuggestbox-suggestion-result img:lang(prs),.win-autosuggestbox-suggestion-result img:lang(ps),.win-autosuggestbox-suggestion-result img:lang(qps-plocm),.win-autosuggestbox-suggestion-result img:lang(sd-Arab),.win-autosuggestbox-suggestion-result img:lang(syr),.win-autosuggestbox-suggestion-result img:lang(ug),.win-autosuggestbox-suggestion-result img:lang(ur){margin-right:0;margin-left:auto;padding-left:10px;padding-right:0}.win-autosuggestbox-suggestion-query{height:20px;padding:11px 0 13px 12px;outline:0;white-space:nowrap;overflow:hidden;line-height:20px}.win-autosuggestbox-suggestion-separator{display:-ms-flexbox;display:-webkit-flex;display:flex;padding:0 18px;height:40px;font-size:11pt}.win-autosuggestbox-suggestion-separator hr{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;margin-top:18px;border-style:solid;border-width:1px 0 0}.win-autosuggestbox-suggestion-separator hr:lang(ar),.win-autosuggestbox-suggestion-separator hr:lang(dv),.win-autosuggestbox-suggestion-separator hr:lang(fa),.win-autosuggestbox-suggestion-separator hr:lang(he),.win-autosuggestbox-suggestion-separator hr:lang(ku-Arab),.win-autosuggestbox-suggestion-separator hr:lang(pa-Arab),.win-autosuggestbox-suggestion-separator hr:lang(prs),.win-autosuggestbox-suggestion-separator hr:lang(ps),.win-autosuggestbox-suggestion-separator hr:lang(qps-plocm),.win-autosuggestbox-suggestion-separator hr:lang(sd-Arab),.win-autosuggestbox-suggestion-separator hr:lang(syr),.win-autosuggestbox-suggestion-separator hr:lang(ug),.win-autosuggestbox-suggestion-separator hr:lang(ur){margin-right:10px;margin-left:auto}.win-autosuggestbox-suggestion-separator div{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;padding-top:9px;padding-bottom:11px;line-height:20px;margin-right:10px}.win-autosuggestbox-suggestion-separator div:lang(ar),.win-autosuggestbox-suggestion-separator div:lang(dv),.win-autosuggestbox-suggestion-separator div:lang(fa),.win-autosuggestbox-suggestion-separator div:lang(he),.win-autosuggestbox-suggestion-separator div:lang(ku-Arab),.win-autosuggestbox-suggestion-separator div:lang(pa-Arab),.win-autosuggestbox-suggestion-separator div:lang(prs),.win-autosuggestbox-suggestion-separator div:lang(ps),.win-autosuggestbox-suggestion-separator div:lang(qps-plocm),.win-autosuggestbox-suggestion-separator div:lang(sd-Arab),.win-autosuggestbox-suggestion-separator div:lang(syr),.win-autosuggestbox-suggestion-separator div:lang(ug),.win-autosuggestbox-suggestion-separator div:lang(ur){margin-left:10px;margin-right:auto}@keyframes WinJS-flyoutBelowASB-showPopup{from{transform:translateY(0)}to{transform:none}}@keyframes WinJS-flyoutAboveASB-showPopup{from{transform:translateY(0)}to{transform:none}}@-webkit-keyframes -webkit-WinJS-flyoutBelowASB-showPopup{from{-webkit-transform:translateY(0)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-flyoutAboveASB-showPopup{from{-webkit-transform:translateY(0)}to{-webkit-transform:none}}.win-searchbox input[type=search]::-ms-clear{display:none}.win-searchbox input[type=search]::-webkit-search-cancel-button{display:none}.win-searchbox-button{position:absolute;right:0;top:0;width:32px;font-size:15px;border-style:none;height:100%;text-align:center}.win-searchbox-button:lang(ar),.win-searchbox-button:lang(dv),.win-searchbox-button:lang(fa),.win-searchbox-button:lang(he),.win-searchbox-button:lang(ku-Arab),.win-searchbox-button:lang(pa-Arab),.win-searchbox-button:lang(prs),.win-searchbox-button:lang(ps),.win-searchbox-button:lang(qps-plocm),.win-searchbox-button:lang(sd-Arab),.win-searchbox-button:lang(syr),.win-searchbox-button:lang(ug),.win-searchbox-button:lang(ur){right:auto;left:0}.win-searchbox-button.win-searchbox-button:before{content:"\E094";position:absolute;left:8px;top:8px;line-height:100%}.win-splitviewcommand{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;touch-action:manipulation}.win-splitviewcommand-button{-ms-flex:1 1 0%;-webkit-flex:1 1 0%;flex:1 1 0%;position:relative}.win-splitviewcommand-button-content{position:relative;height:48px;padding-left:16px;padding-right:16px;display:-ms-flexbox;display:-webkit-flex;display:flex}.win-splitviewcommand-button:focus{z-index:1;outline:0}.win-splitviewcommand-icon{height:16px;width:16px;font-size:16px;margin-left:0;margin-right:16px;margin-top:14px;line-height:1;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto}.win-splitviewcommand-icon:lang(ar),.win-splitviewcommand-icon:lang(dv),.win-splitviewcommand-icon:lang(fa),.win-splitviewcommand-icon:lang(he),.win-splitviewcommand-icon:lang(ku-Arab),.win-splitviewcommand-icon:lang(pa-Arab),.win-splitviewcommand-icon:lang(prs),.win-splitviewcommand-icon:lang(ps),.win-splitviewcommand-icon:lang(qps-plocm),.win-splitviewcommand-icon:lang(sd-Arab),.win-splitviewcommand-icon:lang(syr),.win-splitviewcommand-icon:lang(ug),.win-splitviewcommand-icon:lang(ur){margin-right:0;margin-left:16px}.win-splitviewcommand-label{-ms-flex:1 1 0%;-webkit-flex:1 1 0%;flex:1 1 0%;overflow:hidden;white-space:nowrap;font-size:15px;font-weight:400;line-height:1.333;margin-top:13px;margin-bottom:15px}.win-navbarcommand-icon,.win-navbarcontainer-navarrow{font-size:16px;font-family:"Segoe MDL2 Assets",Symbols}@media (-ms-high-contrast){.win-autosuggestbox{border-color:ButtonText;background-color:ButtonFace;color:ButtonText}.win-autosuggestbox-disabled,.win-autosuggestbox-disabled input[disabled]{border-color:GrayText;background-color:ButtonFace}.win-autosuggestbox-disabled input[disabled]{color:GrayText}.win-autosuggestbox-disabled div{color:GrayText;background-color:ButtonFace}.win-autosuggestbox:-ms-input-placeholder,.win-autosuggestbox::-moz-input-placeholder,.win-autosuggestbox::-webkit-input-placeholder{color:GrayText}.win-autosuggestbox-flyout{border-color:ButtonText;background-color:ButtonFace}.win-autosuggestbox-flyout-highlighttext{color:ButtonText}html.win-hoverable .win-autosuggestbox-query:hover,html.win-hoverable .win-autosuggestbox-suggestion-result:hover{background-color:Highlight;color:HighlightText}html.win-hoverable .win-autosuggestbox-suggestion-query:hover .win-autosuggestbox-flyout-highlighttext,html.win-hoverable .win-autosuggestbox-suggestion-result:hover .win-autosuggestbox-flyout-highlighttext{color:HighlightText}.win-autosuggestbox-suggestion-query,.win-autosuggestbox-suggestion-result{color:ButtonText}.win-autosuggestbox-suggestion-selected{background-color:Highlight;color:HighlightText}.win-autosuggestbox-suggestion-separator{color:ButtonText}.win-autosuggestbox-suggestion-separator hr{border-color:ButtonText}.win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext{color:HighlightText}.win-searchbox-button{background-color:ButtonFace;color:ButtonText}html.win-hoverable .win-searchbox-button[disabled=false]:hover{border-color:ButtonText;background-color:HighLight;color:HighLightText}.win-searchbox-button-input-focus{background-color:ButtonText;color:ButtonFace}html.win-hoverable .win-searchbox-button-input-focus:hover{border-color:ButtonText;background-color:HighLight;color:HighLightText}.win-searchbox-button:active{background-color:ButtonText;color:ButtonFace}.win-splitviewcommand-button{background-color:ButtonFace;color:ButtonText}.win-splitviewcommand-button:after{position:absolute;top:0;left:0;border:2px solid ButtonText;content:"";width:calc(100% - 3px);height:calc(100% - 3px);pointer-events:none}html.win-hoverable .win-splitviewcommand-button:hover{background-color:Highlight;color:HighlightText}.win-splitviewcommand-button.win-pressed,html.win-hoverable .win-splitviewcommand-button.win-pressed:hover{background-color:ButtonText;color:ButtonFace}}.win-navbar{z-index:999}.win-navbar.win-navbar-hiding,.win-navbar.win-navbar-showing,.win-navbar.win-navbar-shown{min-height:60px}.win-navbar .win-navbar-invokebutton{width:32px;min-height:0;height:24px}.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis{width:32px}.win-navbar.win-top .win-navbar-invokebutton{bottom:0}.win-navbar.win-top .win-navbar-invokebutton .win-navbar-ellipsis{top:5px}.win-navbar.win-bottom .win-navbar-invokebutton,.win-navbar.win-bottom .win-navbar-invokebutton .win-navbar-ellipsis{top:0}.win-navbarcontainer{width:100%;position:relative}.win-navbarcontainer-pageindicator-box{position:absolute;width:100%;text-align:center;pointer-events:none}.win-navbarcontainer-vertical .win-navbarcontainer-pageindicator-box{display:none}.win-navbarcontainer-pageindicator{display:inline-block;width:40px;height:4px;margin:4px 2px 16px}.win-navbarcontainer-horizontal .win-navbarcontainer-viewport::-webkit-scrollbar{width:0;height:0}.win-navbarcontainer-horizontal .win-navbarcontainer-viewport{padding:20px 0;overflow-x:auto;overflow-y:hidden;overflow:-moz-scrollbars-none;-ms-scroll-snap-type:mandatory;-ms-scroll-snap-points-x:snapInterval(0,100%);-ms-overflow-style:none;touch-action:pan-x}.win-navbarcontainer-vertical .win-navbarcontainer-viewport{overflow-x:hidden;overflow-y:auto;max-height:216px;-ms-overflow-style:-ms-autohiding-scrollbar;touch-action:pan-y;-webkit-overflow-scrolling:touch}.win-navbarcontainer-horizontal .win-navbarcontainer-surface{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;-webkit-align-content:flex-start;align-content:flex-start}.win-navbarcommand,.win-navbarcontainer-navarrow{display:-ms-flexbox;display:-webkit-flex;touch-action:manipulation}.win-navbarcontainer-vertical .win-navbarcontainer-surface{padding:12px 0}.win-navbarcontainer-navarrow{position:absolute;z-index:2;top:24px;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;height:calc(100% - 48px);width:20px;overflow:hidden}.win-navbarcontainer-vertical .win-navbarcontainer-navarrow{display:none}.win-navbarcontainer-navleft{left:0;margin-right:2px}.win-navbarcontainer-navleft::before{content:'\E0E2'}.win-navbarcontainer-navright{right:0;margin-left:2px}.win-navbarcontainer-navright::before{content:'\E0E3'}.win-navbarcommand{display:flex;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto}.win-navbarcontainer-horizontal .win-navbarcommand{margin:4px;width:192px}.win-navbarcontainer-vertical .win-navbarcommand{margin:4px 24px}.win-navbarcommand-button{-ms-flex:1 1 0%;-webkit-flex:1 1 0%;flex:1 1 0%;position:relative}.win-navbarcommand-button-content{position:relative;height:48px;padding-left:16px;padding-right:16px;display:-ms-flexbox;display:-webkit-flex;display:flex}.win-navbarcommand-button:focus{z-index:1;outline:0}.win-navbarcommand-icon{height:16px;width:16px;margin-left:0;margin-right:16px;margin-top:14px;line-height:1;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto}.win-navbarcommand-icon:lang(ar),.win-navbarcommand-icon:lang(dv),.win-navbarcommand-icon:lang(fa),.win-navbarcommand-icon:lang(he),.win-navbarcommand-icon:lang(ku-Arab),.win-navbarcommand-icon:lang(pa-Arab),.win-navbarcommand-icon:lang(prs),.win-navbarcommand-icon:lang(ps),.win-navbarcommand-icon:lang(qps-plocm),.win-navbarcommand-icon:lang(sd-Arab),.win-navbarcommand-icon:lang(syr),.win-navbarcommand-icon:lang(ug),.win-navbarcommand-icon:lang(ur){margin-right:0;margin-left:16px}.win-navbarcommand-label{-ms-flex:1 1 0%;-webkit-flex:1 1 0%;flex:1 1 0%;overflow:hidden;white-space:nowrap;font-size:15px;font-weight:400;line-height:1.333;margin-top:13px;margin-bottom:15px}.win-navbarcommand-splitbutton{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;width:48px;font-family:"Segoe MDL2 Assets",Symbols;font-size:16px;margin-right:0;margin-left:2px;position:relative}.win-navbarcommand-splitbutton:lang(ar),.win-navbarcommand-splitbutton:lang(dv),.win-navbarcommand-splitbutton:lang(fa),.win-navbarcommand-splitbutton:lang(he),.win-navbarcommand-splitbutton:lang(ku-Arab),.win-navbarcommand-splitbutton:lang(pa-Arab),.win-navbarcommand-splitbutton:lang(prs),.win-navbarcommand-splitbutton:lang(ps),.win-navbarcommand-splitbutton:lang(qps-plocm),.win-navbarcommand-splitbutton:lang(sd-Arab),.win-navbarcommand-splitbutton:lang(syr),.win-navbarcommand-splitbutton:lang(ug),.win-navbarcommand-splitbutton:lang(ur){margin-left:0;margin-right:2px}.win-navbarcommand-splitbutton::before{content:'\E019';pointer-events:none;position:absolute;box-sizing:border-box;top:0;left:0;height:100%;width:100%;text-align:center;line-height:46px;border:1px dotted transparent}.win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened::before{content:'\E018'}.win-navbarcommand-splitbutton:focus{outline:0}@media (-ms-high-contrast){.win-navbarcontainer-pageindicator{background-color:ButtonFace}.win-navbarcontainer-pageindicator:after{display:block;border:1px solid ButtonText;content:"";width:calc(100% - 2px);height:calc(100% - 2px)}.win-navbarcommand-button:after,.win-navbarcommand-splitbutton:after,.win-navbarcontainer-navarrow:after{position:absolute;top:0;left:0;border:2px solid ButtonText;content:"";width:calc(100% - 3px);height:calc(100% - 3px)}.win-navbarcontainer-pageindicator-current{background-color:ButtonText}html.win-hoverable .win-navbarcontainer-pageindicator:hover{background-color:Highlight}.win-navbarcontainer-pageindicator:hover:active,html.win-hoverable .win-navbarcontainer-pageindicator-current:hover{background-color:ButtonText}.win-navbarcontainer-navarrow{background-color:ButtonFace;color:ButtonText}html.win-hoverable .win-navbarcontainer-navarrow:hover{background-color:Highlight;color:HighlightText}.win-navbarcontainer-navarrow:hover:active{background-color:ButtonText;color:ButtonFace}.win-navbarcommand-button,.win-navbarcommand-splitbutton{background-color:ButtonFace;color:ButtonText}.win-navbarcommand-button:after,.win-navbarcommand-splitbutton:after{pointer-events:none}html.win-hoverable .win-navbarcommand-button:hover,html.win-hoverable .win-navbarcommand-splitbutton:hover{background-color:Highlight;color:HighlightText}.win-navbarcommand-button.win-pressed,.win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened,.win-navbarcommand-splitbutton.win-pressed,html.win-hoverable .win-navbarcommand-button.win-pressed:hover,html.win-hoverable .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover,html.win-hoverable .win-navbarcommand-splitbutton.win-pressed:hover{background-color:ButtonText;color:ButtonFace}}.win-viewbox{width:100%;height:100%;position:relative}.win-contentdialog.win-contentdialog-verticalalignment{position:fixed;top:0;left:0;right:0;height:100vh;overflow:hidden;display:none;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center}.win-contentdialog.win-contentdialog-verticalalignment.win-contentdialog-devicefixedsupported{position:-ms-device-fixed;height:auto;bottom:0}.win-contentdialog.win-contentdialog-verticalalignment.win-contentdialog-visible{display:-ms-flexbox;display:-webkit-flex;display:flex}.win-contentdialog .win-contentdialog-backgroundoverlay{position:absolute;top:0;left:0;width:100%;height:100%}.win-contentdialog .win-contentdialog-dialog{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;z-index:1;outline-style:solid;outline-width:1px;box-sizing:border-box;padding:18px 24px 24px;width:100%;min-width:320px;max-width:456px;min-height:184px;max-height:758px;margin-left:auto;margin-right:auto}.win-contentdialog .win-contentdialog-column0or1{-ms-flex:10000 0 50%;-webkit-flex:10000 0 50%;flex:10000 0 50%;width:0}@media (min-height:640px){.win-contentdialog .win-contentdialog-dialog{-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.win-contentdialog .win-contentdialog-column0or1{display:none}}.win-contentdialog .win-contentdialog-scroller{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;overflow:auto}.win-contentdialog .win-contentdialog-title{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;font-size:20px;font-weight:400;line-height:1.2;margin:0}.win-contentdialog .win-contentdialog-content{-ms-flex:1 0 auto;-webkit-flex:1 0 auto;flex:1 0 auto;font-size:15px;font-weight:400;line-height:1.333}.win-contentdialog .win-contentdialog-commands{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;display:-ms-flexbox;display:-webkit-flex;display:flex;margin-top:24px;margin-right:-4px}.win-contentdialog .win-contentdialog-commandspacer{visibility:hidden}.win-contentdialog .win-contentdialog-commands>button{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;width:0;margin-right:4px;white-space:nowrap}.win-splitview{position:relative;width:100%;height:100%;display:-ms-flexbox;display:-webkit-flex;display:flex;overflow:hidden}.win-splitview.win-splitview-placementbottom,.win-splitview.win-splitview-placementbottom .win-splitview-panewrapper,.win-splitview.win-splitview-placementtop,.win-splitview.win-splitview-placementtop .win-splitview-panewrapper{-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.win-splitview .win-splitview-panewrapper{position:relative;z-index:1;outline:0;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex}.win-appbar.win-appbar-closed.win-appbar-closeddisplaynone,.win-splitview.win-splitview-openeddisplayinline .win-splitview-paneplaceholder,.win-splitview.win-splitview-pane-closed .win-splitview-paneplaceholder,.win-splitview.win-splitview-pane-closed.win-splitview-closeddisplaynone .win-splitview-pane{display:none}.win-splitview .win-splitview-paneoutline{display:none;pointer-events:none;position:absolute;top:0;left:0;border:1px solid transparent;width:calc(100% - 2px);height:calc(100% - 2px);z-index:1}.win-splitview .win-splitview-pane{outline:0}.win-splitview .win-splitview-pane,.win-splitview .win-splitview-paneplaceholder{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;overflow:hidden}.win-splitview .win-splitview-contentwrapper{position:relative;z-index:0;-ms-flex:1 1 0%;-webkit-flex:1 1 0%;flex:1 1 0%;overflow:hidden}.win-splitview .win-splitview-content{position:absolute;width:100%;height:100%}.win-splitview.win-splitview-pane-opened.win-splitview-placementleft .win-splitview-pane,.win-splitview.win-splitview-pane-opened.win-splitview-placementright .win-splitview-pane{width:320px}.win-splitview.win-splitview-pane-opened.win-splitview-placementbottom .win-splitview-pane,.win-splitview.win-splitview-pane-opened.win-splitview-placementtop .win-splitview-pane{height:60px}.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementtop .win-splitview-panewrapper{position:absolute;top:0;left:0;width:100%}.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementbottom .win-splitview-panewrapper{position:absolute;bottom:0;left:0;width:100%}.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft{position:static}.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft .win-splitview-panewrapper{position:absolute;top:0;left:0;right:auto;height:100%}.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ar) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(dv) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(fa) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(he) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ku-Arab) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(pa-Arab) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(prs) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ps) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(qps-plocm) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(sd-Arab) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(syr) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ug) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ur) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright .win-splitview-panewrapper{position:absolute;top:0;left:auto;right:0;height:100%}.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ar) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(dv) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(fa) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(he) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ku-Arab) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(pa-Arab) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(prs) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ps) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(qps-plocm) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(sd-Arab) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(syr) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ug) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ur) .win-splitview-panewrapper{position:absolute;top:0;left:0;right:auto;height:100%}.win-splitview.win-splitview-pane-closed.win-splitview-placementbottom .win-splitview-pane,.win-splitview.win-splitview-pane-closed.win-splitview-placementtop .win-splitview-pane{height:24px}.win-splitview.win-splitview-pane-closed.win-splitview-placementleft .win-splitview-pane,.win-splitview.win-splitview-pane-closed.win-splitview-placementright .win-splitview-pane{width:48px}button.win-splitviewpanetoggle{touch-action:manipulation;box-sizing:border-box;height:48px;width:48px;min-height:0;min-width:0;padding:0;border:none;margin:0;outline:0}button.win-splitviewpanetoggle:after{font-size:24px;font-family:'Segoe MDL2 Assets',Symbols;font-weight:400;line-height:1.333;content:"\E700"}.win-appbar{width:100%;min-width:32px;position:fixed;position:-ms-device-fixed;z-index:999}.win-appbar.win-appbar-top{top:0}.win-appbar.win-appbar-bottom{bottom:0}.win-ui-dark,body{background-color:#000;color:#fff}.win-ui-light{background-color:#fff;color:#000}::selection{color:#fff}.win-link:hover{color:rgba(255,255,255,.6)}.win-link:active{color:rgba(255,255,255,.4)}.win-link[disabled]{color:rgba(255,255,255,.2)}.win-checkbox::-ms-check{color:#fff;border-color:rgba(255,255,255,.8);background-color:transparent}.win-checkbox:indeterminate::-ms-check{color:rgba(255,255,255,.8)}.win-checkbox:checked::-ms-check{color:#fff;border-color:transparent}.win-checkbox:hover::-ms-check{border-color:#fff}.win-checkbox:hover:indeterminate::-ms-check{color:#fff}.win-checkbox:active::-ms-check{border-color:transparent;background-color:rgba(255,255,255,.6)}.win-checkbox:indeterminate:active::-ms-check{color:rgba(255,255,255,.6);border-color:rgba(255,255,255,.8);background-color:transparent}.win-checkbox:disabled::-ms-check,.win-checkbox:indeterminate:disabled::-ms-check{color:rgba(255,255,255,.2);border-color:rgba(255,255,255,.2);background-color:transparent}.win-radio::-ms-check{color:rgba(255,255,255,.8);border-color:rgba(255,255,255,.8);background-color:transparent}.win-radio:hover::-ms-check{border-color:#fff;color:#fff}.win-radio:active::-ms-check{color:rgba(255,255,255,.6);border-color:rgba(255,255,255,.6)}.win-radio:disabled::-ms-check{color:rgba(255,255,255,.2);border-color:rgba(255,255,255,.2)}.win-progress-bar:not(:indeterminate),.win-progress-ring:not(:indeterminate),.win-ring:not(:indeterminate){background-color:rgba(255,255,255,.2)}.win-progress-bar::-webkit-progress-bar,.win-progress-ring::-webkit-progress-bar,.win-ring::-webkit-progress-bar{background-color:transparent}.win-progress-ring,.win-ring{background-color:transparent}.win-button{color:#fff;background-color:rgba(255,255,255,.2);border-color:transparent}.win-button.win-button-primary{color:#fff}.win-button.win-button-primary:hover,.win-button:hover{border-color:rgba(255,255,255,.4)}.win-button.win-button-primary:active,.win-button:active{background-color:rgba(255,255,255,.4)}.win-button.win-button-primary:disabled,.win-button:disabled{color:rgba(255,255,255,.2);background-color:rgba(255,255,255,.2);border-color:transparent}.win-dropdown{color:#fff;background-color:rgba(255,255,255,.2);border-color:rgba(255,255,255,.4)}.win-dropdown::-ms-expand{color:rgba(255,255,255,.8);background-color:transparent}.win-dropdown:hover{background-color:#2b2b2b;border-color:rgba(255,255,255,.6)}.win-dropdown:disabled{color:rgba(255,255,255,.2);background-color:rgba(255,255,255,.2)}.win-dropdown:disabled::-ms-expand{color:rgba(255,255,255,.2);border-color:rgba(255,255,255,.2)}.win-dropdown option{color:#fff;background-color:#2b2b2b}.win-dropdown option:checked{color:#fff}.win-dropdown option:active,.win-dropdown option:hover{background-color:rgba(0,0,0,.2);color:#fff}.win-dropdown optgroup{color:#fff;background-color:#2b2b2b}.win-dropdown optgroup:disabled{color:rgba(255,255,255,.2)}select[multiple].win-dropdown{border:none;background-color:#2b2b2b}select[multiple].win-dropdown option,select[multiple].win-dropdown option:checked,select[multiple].win-dropdown option:hover{color:#fff}.win-slider{background-color:transparent}.win-slider:hover::-ms-thumb{background:#f9f9f9}.win-slider:hover::-webkit-slider-thumb{background:#f9f9f9}.win-slider:hover::-moz-range-thumb{background:#f9f9f9}.win-slider:active::-ms-thumb{background:#767676}.win-slider:active::-webkit-slider-thumb{background:#767676}.win-slider:active::-moz-range-thumb{background:#767676}.win-slider:disabled::-ms-thumb{background:#333}.win-slider:disabled::-webkit-slider-thumb{background:#333}.win-slider:disabled::-moz-range-thumb{background:#333}.win-slider:disabled::-ms-fill-lower{background:rgba(255,255,255,.2)}.win-slider::-ms-fill-upper{background:rgba(255,255,255,.4)}.win-slider::-webkit-slider-runnable-track{background:rgba(255,255,255,.4)}.win-slider::-moz-range-track{background:rgba(255,255,255,.4)}.win-slider:active::-ms-fill-upper{background:rgba(255,255,255,.4)}.win-slider:active::-webkit-slider-runnable-track{background:rgba(255,255,255,.4)}.win-slider:active::-moz-range-track{background:rgba(255,255,255,.4)}.win-slider:disabled::-ms-fill-upper{background:rgba(255,255,255,.2)}.win-slider:disabled::-webkit-slider-runnable-track{background:rgba(255,255,255,.2)}.win-slider:disabled::-moz-range-track{background:rgba(255,255,255,.2)}.win-slider::-ms-track{color:transparent;background-color:transparent}.win-slider::-ms-ticks-after,.win-slider::-ms-ticks-before{color:rgba(255,255,255,.4)}.win-textarea,.win-textbox{color:#fff;background-color:rgba(0,0,0,.4);border-color:rgba(255,255,255,.4)}.win-textarea:-ms-input-placeholder,.win-textbox:-ms-input-placeholder{color:rgba(255,255,255,.6)}.win-textarea::-webkit-input-placeholder,.win-textbox::-webkit-input-placeholder{color:rgba(255,255,255,.6)}.win-textarea::-moz-input-placeholder,.win-textbox::-moz-input-placeholder{color:rgba(255,255,255,.6)}.win-textarea:hover,.win-textbox:hover{background-color:rgba(0,0,0,.6);border-color:rgba(255,255,255,.6)}.win-textarea:focus,.win-textbox:focus{color:#000;background-color:#fff}.win-textbox::-ms-clear,.win-textbox::-ms-reveal{display:block;color:rgba(0,0,0,.6)}.win-itemcontainer.win-selectionstylefilled.win-selected,.win-listview.win-selectionstylefilled .win-selected,.win-selectioncheckmark{color:#fff}.win-textbox::-ms-clear:active,.win-textbox::-ms-reveal:active{color:#fff}.win-xbox :focus{outline:#fff solid 2px}.win-backbutton:focus,.win-listview .win-groupheader,.win-navigation-backbutton:focus .win-back{outline-color:#fff}.win-itemcontainer.win-selectionmode.win-container .win-itembox::after,.win-listview .win-surface.win-selectionmode .win-itembox::after,.win-selectionmode .win-itemcontainer.win-container .win-itembox::after{border-color:#fff;background-color:#393939}.win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox,.win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,.win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox,html.win-hoverable .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox{background-color:rgba(255,255,255,.2)}.win-itemcontainer .win-itembox,.win-listview .win-itembox{background-color:#1d1d1d}.win-listview .win-container.win-backdrop{background-color:rgba(155,155,155,.23)}.win-itemcontainer .win-focusedoutline,.win-listview .win-focusedoutline{outline:#fff dashed 2px}.win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground,.win-listview.win-selectionstylefilled .win-selected .win-selectionbackground{opacity:.6}.win-flipview .win-navbutton{background-color:rgba(255,255,255,.4);color:rgba(0,0,0,.8)}.win-flipview .win-navbutton:hover:active{background-color:rgba(255,255,255,.8)}html.win-hoverable .win-flipview .win-navbutton:hover{background-color:rgba(255,255,255,.6)}.win-back,.win-backbutton,.win-navigation-backbutton{background-color:transparent;border:none;color:#fff}.win-menu-containsflyoutcommand button.win-command-flyout-activated:before,button[aria-checked=true].win-command:before{position:absolute;height:100%;width:100%;content:"";box-sizing:content-box;border-width:1px;border-style:solid;top:-1px;left:-1px;opacity:.6}.win-backbutton:hover,.win-navigation-backbutton:hover .win-back{background-color:rgba(255,255,255,.1)}.win-backbutton:active,.win-navigation-backbutton:active .win-back{background-color:rgba(255,255,255,.2)}.win-backbutton:disabled,.win-backbutton:disabled:active,.win-navigation-backbutton:disabled,.win-navigation-backbutton:disabled .win-back,.win-navigation-backbutton:disabled:active .win-back{color:rgba(255,255,255,.4);background-color:transparent}.win-tooltip{color:#fff;border-color:#767676;background-color:#2b2b2b}.win-rating .win-star.win-tentative.win-full{color:rgba(255,255,255,.8)}.win-rating .win-star.win-average.win-full,.win-rating .win-star.win-average.win-full.win-disabled{color:rgba(255,255,255,.4)}.win-rating .win-star.win-empty{color:rgba(255,255,255,.2)}.win-toggleswitch-header,.win-toggleswitch-value{color:#fff}.win-toggleswitch-thumb{background-color:rgba(255,255,255,.8)}.win-toggleswitch-off .win-toggleswitch-track{border-color:rgba(255,255,255,.8)}.win-toggleswitch-pressed .win-toggleswitch-thumb{background-color:#fff}.win-toggleswitch-pressed .win-toggleswitch-track{border-color:transparent;background-color:rgba(255,255,255,.6)}.win-toggleswitch-disabled .win-toggleswitch-header,.win-toggleswitch-disabled .win-toggleswitch-value{color:rgba(255,255,255,.2)}.win-toggleswitch-disabled .win-toggleswitch-thumb{background-color:rgba(255,255,255,.2)}.win-toggleswitch-disabled .win-toggleswitch-track{border-color:rgba(255,255,255,.2)}.win-semanticzoom-button,.win-toggleswitch-on .win-toggleswitch-track,button.win-command:hover:active,div.win-command:hover:active{border-color:transparent}.win-toggleswitch-on .win-toggleswitch-thumb{background-color:#fff}.win-toggleswitch-on.win-toggleswitch-pressed .win-toggleswitch-track{background-color:rgba(255,255,255,.6)}.win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-thumb,.win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track{background-color:rgba(255,255,255,.2)}.win-semanticzoom-button{background-color:rgba(216,216,216,.33)}button.win-semanticzoom-button.win-semanticzoom-button:active,button.win-semanticzoom-button.win-semanticzoom-button:hover:active{background-color:#fff}.win-pivot .win-pivot-title{color:#fff}.win-pivot .win-pivot-navbutton{background-color:rgba(255,255,255,.4);color:rgba(0,0,0,.8)}.win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active{color:rgba(255,255,255,.8)}.win-pivot button.win-pivot-header{color:rgba(255,255,255,.6);background-color:transparent}.win-pivot button.win-pivot-header.win-pivot-header:hover:active,.win-pivot button.win-pivot-header:focus{color:rgba(255,255,255,.8)}.win-pivot button.win-pivot-header.win-pivot-header-selected{color:#fff;background-color:transparent}.win-pivot-header[disabled]{color:rgba(255,255,255,.4)}button.win-hub-section-header-tabstop,button.win-hub-section-header-tabstop:hover:active{color:#fff}button.win-hub-section-header-tabstop.win-keyboard:focus{outline:#fff dotted 1px}button.win-hub-section-header-tabstop:-ms-keyboard-active{color:#fff}button.win-hub-section-header-tabstop.win-hub-section-header-interactive.win-hub-section-header-interactive:hover:active{color:rgba(255,255,255,.4)}button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active{color:rgba(255,255,255,.4)}.win-commandimage,button:enabled:active .win-commandimage,button:enabled:hover:active .win-commandimage{color:#fff}.win-overlay{outline:0}hr.win-command{background-color:rgba(255,255,255,.4)}button.win-command,div.win-command{border-color:transparent;background-color:transparent}button:enabled.win-command.win-command.win-keyboard:hover:focus,button:enabled.win-command.win-keyboard:focus,div.win-command.win-command.win-keyboard:hover:focus,div.win-command.win-keyboard:focus{border-color:#fff}button.win-command.win-command:enabled:active,button.win-command.win-command:enabled:hover:active{background-color:rgba(255,255,255,.2);color:#fff}button:disabled .win-commandimage,button:disabled:active .win-commandimage{color:rgba(255,255,255,.2)}button .win-label,button[aria-checked=true]:enabled .win-commandimage,button[aria-checked=true]:enabled .win-label,button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage{color:#fff}button[aria-checked=true]:-ms-keyboard-active .win-commandimage{color:#fff}button.win-command:enabled:-ms-keyboard-active{background-color:rgba(255,255,255,.2);color:#fff}button[aria-checked=true].win-command:enabled:hover:active{background-color:transparent}button.win-command:disabled,button.win-command:disabled:hover:active{background-color:transparent;border-color:transparent}button.win-command:disabled .win-label,button.win-command:disabled:active .win-label{color:rgba(255,255,255,.2)}.win-navbar{background-color:#393939;border-color:#393939}.win-navbar.win-menulayout .win-navbar-menu,.win-navbar.win-menulayout .win-toolbar{background-color:inherit}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton{background-color:transparent;outline:0;border-color:transparent}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active{background-color:transparent}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis{color:#fff}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus{border-color:#fff}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active{background-color:transparent}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis{color:rgba(255,255,255,.2)}.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active{background-color:rgba(255,255,255,.2)}.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis{color:#fff}.win-flyout,.win-settingsflyout{background-color:#000}.win-menu button{background-color:transparent;color:#fff}.win-menu button.win-command.win-command:enabled:hover:active,.win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active{background-color:rgba(255,255,255,.2);color:#fff}.win-menu button[aria-checked=true].win-command:before{background-color:transparent;border-color:transparent}.win-menu button:disabled,.win-menu button:disabled:active{background-color:transparent;color:rgba(255,255,255,.2)}.win-commandingsurface .win-commandingsurface-actionarea{background-color:#393939}.win-commandingsurface button.win-commandingsurface-overflowbutton{background-color:transparent;border-color:transparent}.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active{background-color:transparent}.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis{color:#fff}.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus{border-color:#fff}.win-commandingsurface .win-commandingsurface-overflowarea{background-color:#2b2b2b}.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active{background-color:rgba(255,255,255,.2)}.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active{color:#fff;background-color:rgba(255,255,255,.2)}.win-autosuggestbox-flyout-highlighttext{color:#4617b4}.win-autosuggestbox-suggestion-separator{color:#7a7a7a}.win-autosuggestbox-suggestion-separator hr{border-color:#7a7a7a}.win-navbarcommand-button.win-keyboard:focus::before,.win-splitviewcommand-button.win-keyboard:focus::before{content:"";pointer-events:none;position:absolute;box-sizing:border-box;top:0;left:0;height:100%;width:100%;border:1px dotted #fff}.win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext{color:#a38bda}.win-autosuggestbox-flyout{background-color:#2b2b2b;color:#fff}.win-autosuggestbox-suggestion-query:hover:active,.win-autosuggestbox-suggestion-result:hover:active{background-color:rgba(255,255,255,.2)}.win-searchbox-button{color:rgba(255,255,255,.4)}.win-searchbox-button-input-focus{color:rgba(0,0,0,.4)}.win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active{color:#fff}.win-splitviewcommand-button{background-color:transparent;color:#fff}.win-navbarcontainer-pageindicator,.win-splitviewcommand-button.win-pressed{background-color:rgba(255,255,255,.2)}.win-navbarcontainer-pageindicator-current{background-color:rgba(255,255,255,.6)}.win-navbarcontainer-navarrow{background-color:rgba(255,255,255,.4);color:rgba(0,0,0,.8)}.win-navbarcontainer-navarrow.win-navbarcontainer-navarrow:hover:active{background-color:rgba(255,255,255,.8)}.win-navbarcommand-button,.win-navbarcommand-splitbutton{background-color:rgba(255,255,255,.1);color:#fff}.win-navbarcommand-button.win-pressed,.win-navbarcommand-splitbutton.win-pressed{background-color:rgba(255,255,255,.28)}.win-navbarcommand-splitbutton.win-keyboard:focus::before{border-color:#fff}.win-contentdialog-dialog{background-color:#2b2b2b}.win-contentdialog-content,.win-contentdialog-title{color:#fff}.win-contentdialog-backgroundoverlay{background-color:#000;opacity:.6}html.win-hoverable .win-itemcontainer.win-container.win-selected:hover .win-selectionborder,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground,html.win-hoverable .win-listview .win-container.win-selected:hover .win-selectionborder,html.win-hoverable .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,html.win-hoverable button:enabled[aria-checked=true].win-command:hover:before{opacity:.8}.win-splitview-pane{background-color:#171717}button.win-splitviewpanetoggle{color:#fff;background-color:transparent}button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover,button.win-splitviewpanetoggle:active{color:#fff;background-color:rgba(255,255,255,.2)}button.win-splitviewpanetoggle.win-keyboard:focus{border:1px dotted #fff}html.win-hoverable .win-itemcontainer .win-itembox:hover::before,html.win-hoverable .win-listview .win-itembox:hover::before,html.win-hoverable .win-toggleswitch-off:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track{border-color:#fff}button.win-splitviewpanetoggle.win-splitviewpanetoggle:disabled:hover,button.win-splitviewpanetoggle:disabled,button.win-splitviewpanetoggle:disabled:active{color:rgba(255,255,255,.2);background-color:transparent}html.win-hoverable .win-selectionstylefilled .win-container:hover .win-itembox,html.win-hoverable .win-selectionstylefilled.win-container:hover .win-itembox{background-color:rgba(255,255,255,.1)}html.win-hoverable .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb,html.win-hoverable .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed).win-toggleswitch-on .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb{background-color:#fff}html.win-hoverable button:hover.win-semanticzoom-button{background-color:#d8d8d8}html.win-hoverable .win-pivot .win-pivot-navbutton:hover{color:rgba(255,255,255,.6)}html.win-hoverable .win-pivot button.win-pivot-header:hover{color:baseMediumHigh}html.win-hoverable button.win-hub-section-header-tabstop:hover{color:#fff}html.win-hoverable button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover{color:rgba(255,255,255,.8)}html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-searchbox-button:not(.win-searchbox-button-disabled):hover:active,html.win-hoverable button.win-command:enabled:hover,html.win-hoverable button.win-command:enabled:hover .win-commandglyph,html.win-hoverable button.win-splitviewpanetoggle:hover,html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis{color:#fff}html.win-hoverable .win-navbar button.win-navbar-invokebutton:disabled:hover,html.win-hoverable .win-navbar button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar button.win-navbar-invokebutton:disabled:hover,html.win-hoverable.win-navbar button.win-navbar-invokebutton:enabled:hover{background-color:transparent}html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,html.win-hoverable button.win-command:enabled:hover,html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover{background-color:rgba(255,255,255,.1)}html.win-hoverable .win-menu button.win-command:enabled:hover{background-color:rgba(255,255,255,.1);color:#fff}html.win-hoverable button[aria-checked=true].win-command:hover{background-color:transparent}html.win-hoverable .win-autosuggestbox-suggestion-query:hover,html.win-hoverable .win-autosuggestbox-suggestion-result:hover,html.win-hoverable .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,html.win-hoverable .win-splitviewcommand-button:hover,html.win-hoverable.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover{background-color:rgba(255,255,255,.1)}html.win-hoverable button:enabled[aria-checked=true].win-command:hover:active:before{opacity:.9}html.win-hoverable .win-splitviewcommand-button:hover.win-pressed{background-color:rgba(255,255,255,.2)}html.win-hoverable .win-navbarcontainer-navarrow:hover{background-color:rgba(255,255,255,.6)}html.win-hoverable .win-navbarcommand-button:hover,html.win-hoverable .win-navbarcommand-splitbutton:hover{background-color:rgba(255,255,255,.19)}html.win-hoverable .win-navbarcommand-button:hover.win-pressed,html.win-hoverable .win-navbarcommand-splitbutton:hover.win-pressed{background-color:rgba(255,255,255,.28)}html.win-hoverable button.win-splitviewpanetoggle:hover{background-color:rgba(255,255,255,.1)}.win-ui-light .win-ui-light,.win-ui-light body{background-color:#fff;color:#000}.win-ui-light .win-ui-dark{background-color:#000;color:#fff}.win-ui-light ::selection{color:#fff}.win-ui-light .win-link:hover{color:rgba(0,0,0,.6)}.win-ui-light .win-link:active{color:rgba(0,0,0,.4)}.win-ui-light .win-link[disabled]{color:rgba(0,0,0,.2)}.win-ui-light .win-checkbox::-ms-check{color:#000;border-color:rgba(0,0,0,.8);background-color:transparent}.win-ui-light .win-checkbox:indeterminate::-ms-check{color:rgba(0,0,0,.8)}.win-ui-light .win-checkbox:checked::-ms-check{color:#fff;border-color:transparent}.win-ui-light .win-checkbox:hover::-ms-check{border-color:#000}.win-ui-light .win-checkbox:hover:indeterminate::-ms-check{color:#000}.win-ui-light .win-checkbox:active::-ms-check{border-color:transparent;background-color:rgba(0,0,0,.6)}.win-ui-light .win-checkbox:indeterminate:active::-ms-check{color:rgba(0,0,0,.6);border-color:rgba(0,0,0,.8);background-color:transparent}.win-ui-light .win-checkbox:disabled::-ms-check,.win-ui-light .win-checkbox:indeterminate:disabled::-ms-check{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2);background-color:transparent}.win-ui-light .win-radio::-ms-check{color:rgba(0,0,0,.8);border-color:rgba(0,0,0,.8);background-color:transparent}.win-ui-light .win-radio:hover::-ms-check{border-color:#000;color:#000}.win-ui-light .win-radio:active::-ms-check{color:rgba(0,0,0,.6);border-color:rgba(0,0,0,.6)}.win-ui-light .win-radio:disabled::-ms-check{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}.win-ui-light .win-progress-bar:not(:indeterminate),.win-ui-light .win-progress-ring:not(:indeterminate),.win-ui-light .win-ring:not(:indeterminate){background-color:rgba(0,0,0,.2)}.win-ui-light .win-progress-bar::-webkit-progress-bar,.win-ui-light .win-progress-ring::-webkit-progress-bar,.win-ui-light .win-ring::-webkit-progress-bar{background-color:transparent}.win-ui-light .win-progress-ring,.win-ui-light .win-ring{background-color:transparent}.win-ui-light .win-button{color:#000;background-color:rgba(0,0,0,.2);border-color:transparent}.win-ui-light .win-button.win-button-primary{color:#fff}.win-ui-light .win-button.win-button-primary:hover,.win-ui-light .win-button:hover{border-color:rgba(0,0,0,.4)}.win-ui-light .win-button.win-button-primary:active,.win-ui-light .win-button:active{background-color:rgba(0,0,0,.4)}.win-ui-light .win-button.win-button-primary:disabled,.win-ui-light .win-button:disabled{color:rgba(0,0,0,.2);background-color:rgba(0,0,0,.2);border-color:transparent}.win-ui-light .win-dropdown{color:#000;background-color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.4)}.win-ui-light .win-dropdown::-ms-expand{color:rgba(0,0,0,.8);background-color:transparent}.win-ui-light .win-dropdown:hover{background-color:#f2f2f2;border-color:rgba(0,0,0,.6)}.win-ui-light .win-dropdown:disabled{color:rgba(0,0,0,.2);background-color:rgba(0,0,0,.2)}.win-ui-light .win-dropdown:disabled::-ms-expand{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}.win-ui-light .win-dropdown option{color:#000;background-color:#f2f2f2}.win-ui-light .win-dropdown option:checked{color:#fff}.win-ui-light .win-dropdown option:active,.win-ui-light .win-dropdown option:hover{background-color:rgba(0,0,0,.2);color:#000}.win-ui-light .win-dropdown optgroup{color:#000;background-color:#f2f2f2}.win-ui-light .win-dropdown optgroup:disabled{color:rgba(0,0,0,.2)}.win-ui-light select[multiple].win-dropdown{border:none;background-color:#f2f2f2}.win-ui-light select[multiple].win-dropdown option,.win-ui-light select[multiple].win-dropdown option:hover{color:#000}.win-ui-light select[multiple].win-dropdown option:checked{color:#fff}.win-ui-light .win-slider{background-color:transparent}.win-ui-light .win-slider:hover::-ms-thumb{background:#1f1f1f}.win-ui-light .win-slider:hover::-webkit-slider-thumb{background:#1f1f1f}.win-ui-light .win-slider:hover::-moz-range-thumb{background:#1f1f1f}.win-ui-light .win-slider:active::-ms-thumb{background:#ccc}.win-ui-light .win-slider:active::-webkit-slider-thumb{background:#ccc}.win-ui-light .win-slider:active::-moz-range-thumb{background:#ccc}.win-ui-light .win-slider:disabled::-ms-thumb{background:#ccc}.win-ui-light .win-slider:disabled::-webkit-slider-thumb{background:#ccc}.win-ui-light .win-slider:disabled::-moz-range-thumb{background:#ccc}.win-ui-light .win-slider:disabled::-ms-fill-lower{background:rgba(0,0,0,.2)}.win-ui-light .win-slider::-ms-fill-upper{background:rgba(0,0,0,.4)}.win-ui-light .win-slider::-webkit-slider-runnable-track{background:rgba(0,0,0,.4)}.win-ui-light .win-slider::-moz-range-track{background:rgba(0,0,0,.4)}.win-ui-light .win-slider:active::-ms-fill-upper{background:rgba(0,0,0,.4)}.win-ui-light .win-slider:active::-webkit-slider-runnable-track{background:rgba(0,0,0,.4)}.win-ui-light .win-slider:active::-moz-range-track{background:rgba(0,0,0,.4)}.win-ui-light .win-slider:disabled::-ms-fill-upper{background:rgba(0,0,0,.2)}.win-ui-light .win-slider:disabled::-webkit-slider-runnable-track{background:rgba(0,0,0,.2)}.win-ui-light .win-slider:disabled::-moz-range-track{background:rgba(0,0,0,.2)}.win-ui-light .win-slider::-ms-track{color:transparent;background-color:transparent}.win-ui-light .win-slider::-ms-ticks-after,.win-ui-light .win-slider::-ms-ticks-before{color:rgba(0,0,0,.4)}.win-ui-light .win-textarea,.win-ui-light .win-textbox{color:#000;background-color:rgba(255,255,255,.4);border-color:rgba(0,0,0,.4)}.win-ui-light .win-textarea:-ms-input-placeholder,.win-ui-light .win-textbox:-ms-input-placeholder{color:rgba(0,0,0,.6)}.win-ui-light .win-textarea::-webkit-input-placeholder,.win-ui-light .win-textbox::-webkit-input-placeholder{color:rgba(0,0,0,.6)}.win-ui-light .win-textarea::-moz-input-placeholder,.win-ui-light .win-textbox::-moz-input-placeholder{color:rgba(0,0,0,.6)}.win-ui-light .win-textarea:hover,.win-ui-light .win-textbox:hover{background-color:rgba(255,255,255,.6);border-color:rgba(0,0,0,.6)}.win-ui-light .win-textarea:focus,.win-ui-light .win-textbox:focus{color:#000;background-color:#fff}.win-ui-light .win-textbox::-ms-clear,.win-ui-light .win-textbox::-ms-reveal{display:block;color:rgba(0,0,0,.6)}.win-ui-light .win-textbox::-ms-clear:active,.win-ui-light .win-textbox::-ms-reveal:active{color:#fff}.win-ui-light .win-itemcontainer.win-selectionstylefilled.win-selected,.win-ui-light .win-listview.win-selectionstylefilled .win-selected,.win-ui-light .win-selectioncheckmark{color:#000}.win-ui-light .win-xbox :focus{outline:#fff solid 2px}.win-ui-light .win-backbutton:focus,.win-ui-light .win-listview .win-groupheader,.win-ui-light .win-navigation-backbutton:focus .win-back{outline-color:#000}.win-ui-light .win-itemcontainer.win-selectionmode.win-container .win-itembox::after,.win-ui-light .win-listview .win-surface.win-selectionmode .win-itembox::after,.win-ui-light .win-selectionmode .win-itemcontainer.win-container .win-itembox::after{border-color:#000;background-color:#e6e6e6}.win-ui-light .win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox,.win-ui-light .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,.win-ui-light .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,.win-ui-light html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox,.win-ui-light html.win-hoverable .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,.win-ui-light html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox{background-color:rgba(0,0,0,.2)}.win-ui-light .win-itemcontainer .win-itembox,.win-ui-light .win-listview .win-itembox{background-color:#fff}.win-ui-light .win-listview .win-container.win-backdrop{background-color:rgba(155,155,155,.23)}.win-ui-light .win-itemcontainer .win-focusedoutline,.win-ui-light .win-listview .win-focusedoutline{outline:#000 dashed 2px}.win-ui-light .win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground,.win-ui-light .win-listview.win-selectionstylefilled .win-selected .win-selectionbackground{opacity:.4}.win-ui-light .win-flipview .win-navbutton{background-color:rgba(0,0,0,.4);color:rgba(255,255,255,.8)}.win-ui-light .win-flipview .win-navbutton:hover:active{background-color:rgba(0,0,0,.8)}.win-ui-light html.win-hoverable .win-flipview .win-navbutton:hover{background-color:rgba(0,0,0,.6)}.win-ui-light .win-back,.win-ui-light .win-backbutton,.win-ui-light .win-navigation-backbutton{background-color:transparent;border:none;color:#000}.win-ui-light .win-menu-containsflyoutcommand button.win-command-flyout-activated:before,.win-ui-light button[aria-checked=true].win-command:before,.win-ui-light.win-menu-containsflyoutcommand button.win-command-flyout-activated:before{position:absolute;height:100%;width:100%;opacity:.4;content:"";box-sizing:content-box;border-width:1px;border-style:solid;top:-1px;left:-1px}.win-ui-light .win-backbutton:hover,.win-ui-light .win-navigation-backbutton:hover .win-back{background-color:rgba(0,0,0,.1)}.win-ui-light .win-backbutton:active,.win-ui-light .win-navigation-backbutton:active .win-back{background-color:rgba(0,0,0,.2)}.win-ui-light .win-backbutton:disabled,.win-ui-light .win-backbutton:disabled:active,.win-ui-light .win-navigation-backbutton:disabled,.win-ui-light .win-navigation-backbutton:disabled .win-back,.win-ui-light .win-navigation-backbutton:disabled:active .win-back{color:rgba(0,0,0,.4);background-color:transparent}.win-ui-light .win-tooltip{color:#000;border-color:#ccc;background-color:#f2f2f2}.win-ui-light .win-rating .win-star.win-tentative.win-full{color:rgba(0,0,0,.8)}.win-ui-light .win-rating .win-star.win-average.win-full,.win-ui-light .win-rating .win-star.win-average.win-full.win-disabled{color:rgba(0,0,0,.4)}.win-ui-light .win-rating .win-star.win-empty{color:rgba(0,0,0,.2)}.win-ui-light .win-toggleswitch-header,.win-ui-light .win-toggleswitch-value{color:#000}.win-ui-light .win-toggleswitch-thumb{background-color:rgba(0,0,0,.8)}.win-ui-light .win-toggleswitch-off .win-toggleswitch-track{border-color:rgba(0,0,0,.8)}.win-ui-light .win-toggleswitch-pressed .win-toggleswitch-thumb{background-color:#fff}.win-ui-light .win-toggleswitch-pressed .win-toggleswitch-track{border-color:transparent;background-color:rgba(0,0,0,.6)}.win-ui-light .win-toggleswitch-disabled .win-toggleswitch-header,.win-ui-light .win-toggleswitch-disabled .win-toggleswitch-value{color:rgba(0,0,0,.2)}.win-ui-light .win-toggleswitch-disabled .win-toggleswitch-thumb{background-color:rgba(0,0,0,.2)}.win-ui-light .win-toggleswitch-disabled .win-toggleswitch-track{border-color:rgba(0,0,0,.2)}.win-ui-light .win-semanticzoom-button,.win-ui-light .win-toggleswitch-on .win-toggleswitch-track,.win-ui-light button.win-command:hover:active,.win-ui-light div.win-command:hover:active{border-color:transparent}.win-ui-light .win-toggleswitch-on .win-toggleswitch-thumb{background-color:#fff}.win-ui-light .win-toggleswitch-on.win-toggleswitch-pressed .win-toggleswitch-track{background-color:rgba(0,0,0,.6)}.win-ui-light .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-thumb,.win-ui-light .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track{background-color:rgba(0,0,0,.2)}.win-ui-light .win-semanticzoom-button{background-color:rgba(216,216,216,.33)}.win-ui-light button.win-semanticzoom-button.win-semanticzoom-button:active,.win-ui-light button.win-semanticzoom-button.win-semanticzoom-button:hover:active{background-color:#000}.win-ui-light .win-pivot .win-pivot-title{color:#000}.win-ui-light .win-pivot .win-pivot-navbutton{background-color:rgba(0,0,0,.4);color:rgba(255,255,255,.8)}.win-ui-light .win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active{color:rgba(0,0,0,.8)}.win-ui-light .win-pivot button.win-pivot-header{color:rgba(0,0,0,.6);background-color:transparent}.win-ui-light .win-pivot button.win-pivot-header.win-pivot-header:hover:active,.win-ui-light .win-pivot button.win-pivot-header:focus{color:rgba(0,0,0,.8)}.win-ui-light .win-pivot button.win-pivot-header.win-pivot-header-selected{color:#000;background-color:transparent}.win-ui-light .win-pivot-header[disabled]{color:rgba(0,0,0,.4)}.win-ui-light button.win-hub-section-header-tabstop,.win-ui-light button.win-hub-section-header-tabstop:hover:active{color:#000}.win-ui-light button.win-hub-section-header-tabstop.win-keyboard:focus{outline:#000 dotted 1px}.win-ui-light button.win-hub-section-header-tabstop:-ms-keyboard-active{color:#000}.win-ui-light button.win-hub-section-header-tabstop.win-hub-section-header-interactive.win-hub-section-header-interactive:hover:active{color:rgba(0,0,0,.4)}.win-ui-light button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active{color:rgba(0,0,0,.4)}.win-ui-light .win-commandimage,.win-ui-light button:enabled:active .win-commandimage,.win-ui-light button:enabled:hover:active .win-commandimage{color:#000}.win-ui-light .win-overlay{outline:0}.win-ui-light hr.win-command{background-color:rgba(0,0,0,.4)}.win-ui-light button.win-command,.win-ui-light div.win-command{border-color:transparent;background-color:transparent}.win-ui-light button:enabled.win-command.win-command.win-keyboard:hover:focus,.win-ui-light button:enabled.win-command.win-keyboard:focus,.win-ui-light div.win-command.win-command.win-keyboard:hover:focus,.win-ui-light div.win-command.win-keyboard:focus{border-color:#000}.win-ui-light button.win-command.win-command:enabled:active,.win-ui-light button.win-command.win-command:enabled:hover:active{background-color:rgba(0,0,0,.2);color:#000}.win-ui-light button:disabled .win-commandimage,.win-ui-light button:disabled:active .win-commandimage{color:rgba(0,0,0,.2)}.win-ui-light button .win-label,.win-ui-light button[aria-checked=true]:enabled .win-commandimage,.win-ui-light button[aria-checked=true]:enabled .win-label,.win-ui-light button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage{color:#000}.win-ui-light button[aria-checked=true]:-ms-keyboard-active .win-commandimage{color:#000}.win-ui-light button.win-command:enabled:-ms-keyboard-active{background-color:rgba(0,0,0,.2);color:#000}.win-ui-light button[aria-checked=true].win-command:enabled:hover:active{background-color:transparent}.win-ui-light button.win-command:disabled,.win-ui-light button.win-command:disabled:hover:active{background-color:transparent;border-color:transparent}.win-ui-light button.win-command:disabled .win-label,.win-ui-light button.win-command:disabled:active .win-label{color:rgba(0,0,0,.2)}.win-ui-light .win-navbar,.win-ui-light.win-navbar{background-color:#e6e6e6;border-color:#e6e6e6}.win-ui-light .win-navbar.win-menulayout .win-navbar-menu,.win-ui-light .win-navbar.win-menulayout .win-toolbar,.win-ui-light.win-navbar.win-menulayout .win-navbar-menu,.win-ui-light.win-navbar.win-menulayout .win-toolbar{background-color:inherit}.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton{background-color:transparent;outline:0;border-color:transparent}.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active{background-color:transparent}.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis{color:#000}.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus{border-color:#000}.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active{background-color:transparent}.win-ui-light .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,.win-ui-light.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis{color:rgba(0,0,0,.2)}.win-ui-light .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-light .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-light .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-light .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-light.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-light.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-light.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-light.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active{background-color:rgba(0,0,0,.2)}.win-ui-light .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-light .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-light .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-light .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-light.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-light.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-light.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-light.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis{color:#000}.win-ui-light .win-flyout,.win-ui-light .win-settingsflyout,.win-ui-light.win-flyout{background-color:#fff}.win-ui-light .win-menu button,.win-ui-light.win-menu button{background-color:transparent;color:#000}.win-ui-light .win-menu button.win-command.win-command:enabled:hover:active,.win-ui-light .win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active{background-color:rgba(0,0,0,.2);color:#000}html.win-hoverable .win-ui-light .win-itemcontainer.win-container.win-selected:hover .win-selectionborder,html.win-hoverable .win-ui-light .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground,html.win-hoverable .win-ui-light .win-listview .win-container.win-selected:hover .win-selectionborder,html.win-hoverable .win-ui-light .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,html.win-hoverable .win-ui-light button:enabled[aria-checked=true].win-command:hover:before{opacity:.6}.win-ui-light .win-menu button[aria-checked=true].win-command:before,.win-ui-light.win-menu button[aria-checked=true].win-command:before{background-color:transparent;border-color:transparent}.win-ui-light .win-menu button:disabled,.win-ui-light .win-menu button:disabled:active,.win-ui-light.win-menu button:disabled,.win-ui-light.win-menu button:disabled:active{background-color:transparent;color:rgba(0,0,0,.2)}.win-ui-light .win-commandingsurface .win-commandingsurface-actionarea,.win-ui-light.win-commandingsurface .win-commandingsurface-actionarea{background-color:#e6e6e6}.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton,.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton{background-color:transparent;border-color:transparent}.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active{background-color:transparent}.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis{color:#000}.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus{border-color:#000}.win-ui-light .win-commandingsurface .win-commandingsurface-overflowarea,.win-ui-light.win-commandingsurface .win-commandingsurface-overflowarea{background-color:#f2f2f2}.win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,.win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active{background-color:rgba(0,0,0,.2)}.win-ui-light .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,.win-ui-light.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active{color:#000;background-color:rgba(0,0,0,.2)}.win-ui-light .win-autosuggestbox-flyout-highlighttext{color:#4617b4}.win-ui-light .win-autosuggestbox-suggestion-separator{color:#7a7a7a}.win-ui-light .win-autosuggestbox-suggestion-separator hr{border-color:#7a7a7a}.win-ui-light .win-navbarcommand-button.win-keyboard:focus::before,.win-ui-light .win-splitviewcommand-button.win-keyboard:focus::before{content:"";pointer-events:none;position:absolute;box-sizing:border-box;top:0;left:0;height:100%;width:100%;border:1px dotted #000}.win-ui-light .win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext{color:#a38bda}.win-ui-light .win-autosuggestbox-flyout{background-color:#f2f2f2;color:#000}.win-ui-light .win-autosuggestbox-suggestion-query:hover:active,.win-ui-light .win-autosuggestbox-suggestion-result:hover:active{background-color:rgba(0,0,0,.2)}.win-ui-light .win-searchbox-button,.win-ui-light .win-searchbox-button-input-focus{color:rgba(0,0,0,.4)}.win-ui-light .win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active{color:#fff}.win-ui-light .win-splitviewcommand-button{background-color:transparent;color:#000}.win-ui-light .win-navbarcontainer-pageindicator,.win-ui-light .win-splitviewcommand-button.win-pressed{background-color:rgba(0,0,0,.2)}.win-ui-light .win-navbarcontainer-pageindicator-current{background-color:rgba(0,0,0,.6)}.win-ui-light .win-navbarcontainer-navarrow{background-color:rgba(0,0,0,.4);color:rgba(255,255,255,.8)}.win-ui-light .win-navbarcontainer-navarrow.win-navbarcontainer-navarrow:hover:active{background-color:rgba(0,0,0,.8)}.win-ui-light .win-navbarcommand-button,.win-ui-light .win-navbarcommand-splitbutton{background-color:rgba(0,0,0,.1);color:#000}.win-ui-light .win-navbarcommand-button.win-pressed,.win-ui-light .win-navbarcommand-splitbutton.win-pressed{background-color:rgba(0,0,0,.28)}.win-ui-light .win-navbarcommand-splitbutton.win-keyboard:focus::before{border-color:#000}.win-ui-light .win-contentdialog-dialog{background-color:#f2f2f2}.win-ui-light .win-contentdialog-content,.win-ui-light .win-contentdialog-title{color:#000}.win-ui-light .win-contentdialog-backgroundoverlay{background-color:#fff;opacity:.6}.win-ui-light .win-splitview-pane{background-color:#f2f2f2}.win-ui-light button.win-splitviewpanetoggle{color:#000;background-color:transparent}.win-ui-light button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover,.win-ui-light button.win-splitviewpanetoggle:active{color:#000;background-color:rgba(0,0,0,.2)}.win-ui-light button.win-splitviewpanetoggle.win-keyboard:focus{border:1px dotted #000}html.win-hoverable .win-ui-light .win-itemcontainer .win-itembox:hover::before,html.win-hoverable .win-ui-light .win-listview .win-itembox:hover::before,html.win-hoverable .win-ui-light .win-toggleswitch-off:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track{border-color:#000}.win-ui-light button.win-splitviewpanetoggle.win-splitviewpanetoggle:disabled:hover,.win-ui-light button.win-splitviewpanetoggle:disabled,.win-ui-light button.win-splitviewpanetoggle:disabled:active{color:rgba(0,0,0,.2);background-color:transparent}html.win-hoverable .win-ui-light .win-selectionstylefilled .win-container:hover .win-itembox,html.win-hoverable .win-ui-light .win-selectionstylefilled.win-container:hover .win-itembox{background-color:rgba(0,0,0,.1)}html.win-hoverable .win-ui-light .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb{background-color:#000}html.win-hoverable .win-ui-light .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed).win-toggleswitch-on .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb{background-color:#fff}html.win-hoverable .win-ui-light button:hover.win-semanticzoom-button{background-color:#d8d8d8}html.win-hoverable .win-ui-light .win-pivot .win-pivot-navbutton:hover{color:rgba(0,0,0,.6)}html.win-hoverable .win-ui-light .win-pivot button.win-pivot-header:hover{color:baseMediumHigh}html.win-hoverable .win-ui-light button.win-hub-section-header-tabstop:hover{color:#000}html.win-hoverable .win-ui-light button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover{color:rgba(0,0,0,.8)}html.win-hoverable .win-ui-light .win-navbar button.win-navbar-invokebutton:disabled:hover,html.win-hoverable .win-ui-light .win-navbar button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-light.win-navbar button.win-navbar-invokebutton:disabled:hover,html.win-hoverable .win-ui-light.win-navbar button.win-navbar-invokebutton:enabled:hover{background-color:transparent}html.win-hoverable .win-ui-light .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-light .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-light.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-light.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover{background-color:rgba(0,0,0,.1)}html.win-hoverable .win-ui-light .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-ui-light .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-ui-light.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-ui-light.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis{color:#000}html.win-hoverable .win-ui-light .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-light .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-light.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-light.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover{background-color:rgba(0,0,0,.1)}html.win-hoverable .win-ui-light .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-ui-light .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-ui-light.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-ui-light.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis{color:#000}html.win-hoverable .win-ui-light button.win-command:enabled:hover{background-color:rgba(0,0,0,.1);color:#000}html.win-hoverable .win-ui-light button.win-command:enabled:hover .win-commandglyph{color:#000}html.win-hoverable .win-ui-light .win-menu button.win-command:enabled:hover{background-color:rgba(0,0,0,.1);color:#000}html.win-hoverable .win-ui-light button[aria-checked=true].win-command:hover{background-color:transparent}html.win-hoverable .win-ui-light .win-autosuggestbox-suggestion-query:hover,html.win-hoverable .win-ui-light .win-autosuggestbox-suggestion-result:hover,html.win-hoverable .win-ui-light .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,html.win-hoverable .win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,html.win-hoverable .win-ui-light.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,html.win-hoverable .win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton:hover{background-color:rgba(0,0,0,.1)}html.win-hoverable .win-ui-light button:enabled[aria-checked=true].win-command:hover:active:before{opacity:.7}html.win-hoverable .win-ui-light .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,html.win-hoverable .win-ui-light.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis{color:#000}html.win-hoverable .win-ui-light .win-searchbox-button:not(.win-searchbox-button-disabled):hover:active{color:#fff}html.win-hoverable .win-ui-light .win-splitviewcommand-button:hover{background-color:rgba(255,255,255,.1)}html.win-hoverable .win-ui-light .win-splitviewcommand-button:hover.win-pressed{background-color:rgba(255,255,255,.2)}html.win-hoverable .win-ui-light .win-navbarcontainer-navarrow:hover{background-color:rgba(0,0,0,.6)}html.win-hoverable .win-ui-light .win-navbarcommand-button:hover,html.win-hoverable .win-ui-light .win-navbarcommand-splitbutton:hover{background-color:rgba(255,255,255,.19)}html.win-hoverable .win-ui-light .win-navbarcommand-button:hover.win-pressed,html.win-hoverable .win-ui-light .win-navbarcommand-splitbutton:hover.win-pressed{background-color:rgba(255,255,255,.28)}html.win-hoverable .win-ui-light button.win-splitviewpanetoggle:hover{color:#000;background-color:rgba(0,0,0,.1)}@media (-ms-high-contrast){::selection{background-color:Highlight;color:HighlightText}.win-link{color:-ms-hotlight}.win-link:active{color:Highlight}.win-link[disabled]{color:GrayText}.win-checkbox::-ms-check,.win-radio::-ms-check{background-color:ButtonFace;border-color:ButtonText;color:HighlightText}.win-checkbox:indeterminate::-ms-check,.win-radio:indeterminate::-ms-check{background-color:Highlight;border-color:ButtonText;color:ButtonText}.win-checkbox:checked::-ms-check,.win-radio:checked::-ms-check{background-color:Highlight;border-color:HighlightText}.win-checkbox:hover::-ms-check,.win-radio:hover::-ms-check{border-color:Highlight}.win-checkbox:-ms-keyboard-active::-ms-check,.win-checkbox:hover:active::-ms-check,.win-radio:-ms-keyboard-active::-ms-check,.win-radio:hover:active::-ms-check{border-color:Highlight}.win-checkbox:disabled::-ms-check,.win-checkbox:disabled:active::-ms-check,.win-radio:disabled::-ms-check,.win-radio:disabled:active::-ms-check{background-color:ButtonFace;border-color:GrayText;color:GrayText}.win-progress-bar,.win-progress-ring,.win-ring{background-color:ButtonFace;color:Highlight}.win-progress-bar::-ms-fill,.win-progress-ring::-ms-fill,.win-ring::-ms-fill{background-color:Highlight}.win-progress-bar.win-paused:not(:indeterminate)::-ms-fill,.win-progress-ring.win-paused:not(:indeterminate)::-ms-fill,.win-ring.win-paused:not(:indeterminate)::-ms-fill{background-color:GrayText}.win-progress-bar.win-paused:not(:indeterminate),.win-progress-ring.win-paused:not(:indeterminate),.win-ring.win-paused:not(:indeterminate){animation-name:none;opacity:1}.win-button{border-color:ButtonText;color:ButtonText}.win-button:active,.win-button:hover{border-color:Highlight;color:Highlight}.win-button:disabled{border-color:GrayText;color:GrayText}.win-dropdown{background-color:ButtonFace;border-color:ButtonText;color:WindowText}.win-dropdown:active,.win-dropdown:hover{border-color:Highlight}.win-dropdown:disabled{border-color:GrayText;color:GrayText}.win-dropdown::-ms-expand{color:ButtonText}.win-dropdown:disabled::-ms-expand{color:GrayText}.win-dropdown option{background-color:ButtonFace;color:ButtonText}.win-dropdown option:active,.win-dropdown option:checked,.win-dropdown option:hover{background-color:Highlight;color:HighlightText}.win-dropdown option:disabled,select[multiple].win-dropdown:disabled option{background-color:ButtonFace;color:GrayText}select[multiple].win-dropdown{border:none}.win-menu-containsflyoutcommand button.win-command-flyout-activated:before,button[aria-checked=true].win-command:before{height:100%;width:100%;content:"";box-sizing:content-box;border-width:1px;border-style:solid;top:-1px;left:-1px;position:absolute}select[multiple].win-dropdown:disabled option:checked{background-color:GrayText;color:ButtonFace}.win-slider::-ms-track{color:transparent}.win-slider::-ms-ticks-after,.win-slider::-ms-ticks-before{color:ButtonText}.win-slider::-ms-fill-lower{background-color:Highlight}.win-slider::-ms-fill-upper{background-color:ButtonText}.win-slider::-ms-thumb{background-color:ButtonText}.win-slider:hover::-ms-thumb{background-color:Highlight}.win-slider:active::-ms-thumb{background-color:Highlight}.win-slider:disabled::-ms-fill-lower,.win-slider:disabled::-ms-fill-upper,.win-slider:disabled::-ms-thumb{background-color:GrayText}.win-textarea,.win-textbox{border-color:ButtonText;color:ButtonText}.win-textarea:active,.win-textarea:focus,.win-textarea:hover,.win-textbox:active,.win-textbox:focus,.win-textbox:hover{border-color:Highlight}.win-textarea:disabled,.win-textbox:disabled{border-color:GrayText;color:GrayText}.win-textarea:-ms-input-placeholder,.win-textbox:-ms-input-placeholder{color:WindowText}.win-textarea::-ms-input-placeholder,.win-textbox::-ms-input-placeholder{color:WindowText}.win-textarea:disabled:-ms-input-placeholder,.win-textbox:disabled:-ms-input-placeholder{color:GrayText}.win-textarea:disabled::-ms-input-placeholder,.win-textbox:disabled::-ms-input-placeholder{color:GrayText}.win-textbox::-ms-clear,.win-textbox::-ms-reveal{background-color:ButtonFace;color:ButtonText}.win-textbox::-ms-clear:hover,.win-textbox::-ms-reveal:hover{color:Highlight}.win-textbox::-ms-clear:active,.win-textbox::-ms-reveal:active{background-color:Highlight;color:HighlightText}.win-toggleswitch-pressed .win-toggleswitch-thumb,.win-toggleswitch-thumb{background-color:HighlightText}.win-toggleswitch-header,.win-toggleswitch-value{color:HighlightText}.win-toggleswitch-off .win-toggleswitch-track{border-color:HighlightText}.win-toggleswitch-pressed .win-toggleswitch-track{border-color:Highlight;background-color:Highlight}.win-toggleswitch-disabled .win-toggleswitch-header,.win-toggleswitch-disabled .win-toggleswitch-value{color:GrayText}.win-toggleswitch-disabled .win-toggleswitch-thumb{background-color:GrayText}.win-toggleswitch-disabled .win-toggleswitch-track{border-color:GrayText}.win-toggleswitch-on .win-toggleswitch-thumb{background-color:HighlightText}.win-toggleswitch-on .win-toggleswitch-track{border-color:HighlightText}.win-toggleswitch-on.win-toggleswitch-pressed .win-toggleswitch-track{background-color:Highlight}.win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-thumb{background-color:Background}.win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track{background-color:GrayText;border-color:GrayText}.win-toggleswitch-off.win-toggleswitch-enabled:not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb,.win-toggleswitch-on.win-toggleswitch-enabled:not(.win-toggleswitch-pressed) .win-toggleswitch-track{background-color:Highlight}.win-toggleswitch-enabled .win-toggleswitch-clickregion:hover .win-toggleswitch-track{border-color:Highlight}.win-pivot .win-pivot-title{color:WindowText}.win-pivot .win-pivot-navbutton{background-color:Highlight;color:HighlightText}.win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active{color:HighlightText}.win-pivot button.win-pivot-header{color:HighlightText;background-color:transparent}.win-pivot button.win-pivot-header.win-pivot-header:hover:active,.win-pivot button.win-pivot-header:focus{color:HighlightText}.win-pivot button.win-pivot-header.win-pivot-header-selected{color:HighlightText;background-color:Highlight}.win-pivot-header[disabled]{color:GrayText}.win-commandimage,button:enabled:active .win-commandimage,button:enabled:hover:active .win-commandimage{color:ButtonText}.win-overlay{outline:0}hr.win-command{background-color:ButtonText}button.win-command,div.win-command{border-color:transparent;background-color:transparent}button.win-command:hover:active,div.win-command:hover:active{border-color:transparent}button:enabled.win-command.win-command.win-keyboard:hover:focus,button:enabled.win-command.win-keyboard:focus,div.win-command.win-command.win-keyboard:hover:focus,div.win-command.win-keyboard:focus{border-color:ButtonText}button.win-command.win-command:enabled:active,button.win-command.win-command:enabled:hover:active{background-color:Highlight;color:ButtonText}button:disabled .win-commandimage,button:disabled:active .win-commandimage{color:GrayText}button .win-label,button[aria-checked=true]:enabled .win-commandimage,button[aria-checked=true]:enabled .win-label,button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage{color:ButtonText}button[aria-checked=true]:-ms-keyboard-active .win-commandimage{color:ButtonText}button[aria-checked=true].win-command:before{opacity:1}button.win-command:enabled:-ms-keyboard-active{background-color:Highlight;color:ButtonText}button[aria-checked=true].win-command:enabled:hover:active{background-color:transparent}button.win-command:disabled,button.win-command:disabled:hover:active{background-color:transparent;border-color:transparent}button.win-command:disabled .win-label,button.win-command:disabled:active .win-label{color:GrayText}.win-navbar{background-color:ButtonFace;border-color:Highlight}.win-navbar.win-menulayout .win-navbar-menu,.win-navbar.win-menulayout .win-toolbar{background-color:inherit}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton{background-color:transparent;outline:0;border-color:transparent}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active{background-color:transparent}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis{color:ButtonText}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus{border-color:ButtonText}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active{background-color:transparent}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis{color:GrayText}.win-menu button,.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis{color:ButtonText}.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active{background-color:Highlight}.win-flyout,.win-settingsflyout{background-color:ButtonFace}.win-menu button{background-color:transparent}.win-menu button.win-command.win-command:enabled:hover:active,.win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active{background-color:Highlight;color:ButtonText}.win-menu-containsflyoutcommand button.win-command-flyout-activated:before{opacity:.6}.win-menu button[aria-checked=true].win-command:before{background-color:transparent;border-color:transparent}.win-menu button:disabled,.win-menu button:disabled:active{background-color:transparent;color:GrayText}button[aria-checked=true].win-command:before{border-color:Highlight;background-color:Highlight}.win-commandingsurface .win-commandingsurface-actionarea,.win-commandingsurface .win-commandingsurface-overflowarea{background-color:ButtonFace}.win-commandingsurface button.win-commandingsurface-overflowbutton{background-color:ButtonFace;border-color:transparent}.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active{background-color:ButtonFace}.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis{color:ButtonText}.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus{border-color:ButtonText}.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active{background-color:Highlight}.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active{color:ButtonText;background-color:Highlight}.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-insetoutline{display:block;border:1px solid ButtonText;pointer-events:none;background-color:transparent;z-index:1;position:absolute;top:0;left:0;height:calc(100% - 2px);width:calc(100% - 2px)}.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-insetoutline,.win-commandingsurface.win-commandingsurface-closing .win-commandingsurface-insetoutline,.win-commandingsurface.win-commandingsurface-opening .win-commandingsurface-insetoutline{display:none}.win-contentdialog-dialog{background-color:Window}.win-contentdialog-content,.win-contentdialog-title{color:WindowText}.win-contentdialog-backgroundoverlay{background-color:Window;opacity:.6}.win-splitview-pane{background-color:ButtonFace}.win-splitview.win-splitview-pane-opened .win-splitview-paneoutline{display:block;border-color:ButtonText}.win-splitview.win-splitview-animating .win-splitview-paneoutline{display:none}button.win-splitviewpanetoggle{color:ButtonText;background-color:transparent}button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover,button.win-splitviewpanetoggle:active{color:ButtonText;background-color:Highlight}button.win-splitviewpanetoggle.win-keyboard:focus{border:1px dotted ButtonText}button.win-splitviewpanetoggle.win-splitviewpanetoggle:disabled:hover,button.win-splitviewpanetoggle:disabled,button.win-splitviewpanetoggle:disabled:active{color:GrayText;background-color:transparent}html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable button.win-command:enabled:hover,html.win-hoverable button.win-command:enabled:hover .win-commandglyph,html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis{color:HighlightText}html.win-hoverable .win-navbar button.win-navbar-invokebutton:disabled:hover,html.win-hoverable .win-navbar button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar button.win-navbar-invokebutton:disabled:hover,html.win-hoverable.win-navbar button.win-navbar-invokebutton:enabled:hover{background-color:transparent}html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,html.win-hoverable button.win-command:enabled:hover,html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover{background-color:Highlight}html.win-hoverable .win-menu button.win-command:enabled:hover{background-color:Highlight;color:HighlightText}html.win-hoverable button[aria-checked=true].win-command:hover{background-color:transparent}html.win-hoverable button:enabled[aria-checked=true].win-command:hover:active:before,html.win-hoverable button:enabled[aria-checked=true].win-command:hover:before{opacity:1}html.win-hoverable .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,html.win-hoverable.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover{background-color:Highlight}html.win-hoverable button.win-splitviewpanetoggle:hover{color:ButtonText;background-color:Highlight}}
\ No newline at end of file
diff --git a/node_modules/winjs/css/ui-light.css b/node_modules/winjs/css/ui-light.css
deleted file mode 100644
index 3bd3a3c..0000000
--- a/node_modules/winjs/css/ui-light.css
+++ /dev/null
@@ -1,7957 +0,0 @@
-/* Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. */
-@keyframes WinJS-node-inserted {
-  from {
-    outline-color: #000;
-  }
-  to {
-    outline-color: #001;
-  }
-}
-@keyframes WinJS-opacity-in {
-  from {
-    opacity: 0;
-  }
-  to {
-    opacity: 1;
-  }
-}
-@keyframes WinJS-opacity-out {
-  from {
-    opacity: 1;
-  }
-  to {
-    opacity: 0;
-  }
-}
-@keyframes WinJS-scale-up {
-  from {
-    transform: scale(0.85);
-  }
-  to {
-    transform: scale(1);
-  }
-}
-@keyframes WinJS-scale-down {
-  from {
-    transform: scale(1);
-  }
-  to {
-    transform: scale(0.85);
-  }
-}
-@keyframes WinJS-default-remove {
-  from {
-    transform: translateX(11px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-default-remove-rtl {
-  from {
-    transform: translateX(-11px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-default-apply {
-  from {
-    transform: none;
-  }
-  to {
-    transform: translateX(11px);
-  }
-}
-@keyframes WinJS-default-apply-rtl {
-  from {
-    transform: none;
-  }
-  to {
-    transform: translateX(-11px);
-  }
-}
-@keyframes WinJS-showEdgeUI {
-  from {
-    transform: translateY(-70px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-showPanel {
-  from {
-    transform: translateX(364px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-showPanel-rtl {
-  from {
-    transform: translateX(-364px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-hideEdgeUI {
-  from {
-    transform: none;
-  }
-  to {
-    transform: translateY(-70px);
-  }
-}
-@keyframes WinJS-hidePanel {
-  from {
-    transform: none;
-  }
-  to {
-    transform: translateX(364px);
-  }
-}
-@keyframes WinJS-hidePanel-rtl {
-  from {
-    transform: none;
-  }
-  to {
-    transform: translateX(-364px);
-  }
-}
-@keyframes WinJS-showPopup {
-  from {
-    transform: translateY(50px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-dragSourceEnd {
-  from {
-    transform: translateX(11px) scale(1.05);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-dragSourceEnd-rtl {
-  from {
-    transform: translateX(-11px) scale(1.05);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-enterContent {
-  from {
-    transform: translateY(28px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-exit {
-  from {
-    transform: none;
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-enterPage {
-  from {
-    transform: translateY(28px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-updateBadge {
-  from {
-    transform: translateY(24px);
-  }
-  to {
-    transform: none;
-  }
-}
-@-webkit-keyframes WinJS-node-inserted {
-  from {
-    outline-color: #000;
-  }
-  to {
-    outline-color: #001;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-opacity-in {
-  from {
-    opacity: 0;
-  }
-  to {
-    opacity: 1;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-opacity-out {
-  from {
-    opacity: 1;
-  }
-  to {
-    opacity: 0;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-scale-up {
-  from {
-    -webkit-transform: scale(0.85);
-  }
-  to {
-    -webkit-transform: scale(1);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-scale-down {
-  from {
-    -webkit-transform: scale(1);
-  }
-  to {
-    -webkit-transform: scale(0.85);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-default-remove {
-  from {
-    -webkit-transform: translateX(11px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-default-remove-rtl {
-  from {
-    -webkit-transform: translateX(-11px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-default-apply {
-  from {
-    -webkit-transform: none;
-  }
-  to {
-    -webkit-transform: translateX(11px);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-default-apply-rtl {
-  from {
-    -webkit-transform: none;
-  }
-  to {
-    -webkit-transform: translateX(-11px);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showEdgeUI {
-  from {
-    -webkit-transform: translateY(-70px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showPanel {
-  from {
-    -webkit-transform: translateX(364px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showPanel-rtl {
-  from {
-    -webkit-transform: translateX(-364px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-hideEdgeUI {
-  from {
-    -webkit-transform: none;
-  }
-  to {
-    -webkit-transform: translateY(-70px);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-hidePanel {
-  from {
-    -webkit-transform: none;
-  }
-  to {
-    -webkit-transform: translateX(364px);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-hidePanel-rtl {
-  from {
-    -webkit-transform: none;
-  }
-  to {
-    -webkit-transform: translateX(-364px);
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showPopup {
-  from {
-    -webkit-transform: translateY(50px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-dragSourceEnd {
-  from {
-    -webkit-transform: translateX(11px) scale(1.05);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-dragSourceEnd-rtl {
-  from {
-    -webkit-transform: translateX(-11px) scale(1.05);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-enterContent {
-  from {
-    -webkit-transform: translateY(28px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-exit {
-  from {
-    -webkit-transform: none;
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-enterPage {
-  from {
-    -webkit-transform: translateY(28px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-updateBadge {
-  from {
-    -webkit-transform: translateY(24px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@font-face {
-  font-family: "Segoe UI Command";
-  src: local("Segoe MDL2 Assets");
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: "Symbols";
-  src: url(../fonts/Symbols.ttf);
-}
-.win-type-header,
-.win-h1 {
-  font-size: 46px;
-  font-weight: 200;
-  line-height: 1.216;
-  letter-spacing: 0px;
-}
-.win-type-subheader,
-.win-h2 {
-  font-size: 34px;
-  font-weight: 200;
-  line-height: 1.176;
-}
-.win-type-title,
-.win-h3 {
-  font-size: 24px;
-  font-weight: 300;
-  line-height: 1.167;
-}
-.win-type-subtitle,
-.win-h4 {
-  font-size: 20px;
-  font-weight: 400;
-  line-height: 1.2;
-}
-.win-type-body,
-.win-h6 {
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-type-base,
-.win-h5 {
-  font-size: 15px;
-  font-weight: 500;
-  line-height: 1.333;
-}
-.win-type-caption {
-  font-size: 12px;
-  font-weight: 400;
-  line-height: 1.167;
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-weight: 200;
-  src: local("Segoe UI Light");
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-weight: 300;
-  src: local("Segoe UI Semilight");
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-weight: 400;
-  src: local("Segoe UI");
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-weight: 500;
-  src: local("Segoe UI Semibold");
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-weight: 600;
-  src: local("Segoe UI Bold");
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-style: italic;
-  font-weight: 400;
-  src: local("Segoe UI Italic");
-}
-@font-face {
-  font-family: "Segoe UI";
-  font-style: italic;
-  font-weight: 700;
-  src: local("Segoe UI Bold Italic");
-}
-@font-face {
-  font-family: "Microsoft Yahei UI";
-  font-weight: 200;
-  src: local("Microsoft Yahei UI Light");
-}
-@font-face {
-  font-family: "Microsoft Yahei UI";
-  font-weight: 300;
-  src: local("Microsoft Yahei UI");
-}
-@font-face {
-  font-family: "Microsoft Yahei UI";
-  font-weight: 500;
-  src: local("Microsoft Yahei UI");
-}
-@font-face {
-  font-family: "Microsoft Yahei UI";
-  font-weight: 600;
-  src: local("Microsoft Yahei UI Bold");
-}
-@font-face {
-  font-family: "Microsoft JhengHei UI";
-  font-weight: 200;
-  src: local("Microsoft JhengHei UI Light");
-}
-@font-face {
-  font-family: "Microsoft JhengHei UI";
-  font-weight: 300;
-  src: local("Microsoft JhengHei UI");
-}
-@font-face {
-  font-family: "Microsoft JhengHei UI";
-  font-weight: 500;
-  src: local("Microsoft JhengHei UI");
-}
-@font-face {
-  font-family: "Microsoft JhengHei UI";
-  font-weight: 600;
-  src: local("Microsoft JhengHei UI Bold");
-}
-.win-type-header:-ms-lang(am, ti),
-.win-type-subheader:-ms-lang(am, ti),
-.win-type-title:-ms-lang(am, ti),
-.win-type-subtitle:-ms-lang(am, ti),
-.win-type-base:-ms-lang(am, ti),
-.win-type-body:-ms-lang(am, ti),
-.win-type-caption:-ms-lang(am, ti),
-.win-h1:-ms-lang(am, ti),
-.win-h2:-ms-lang(am, ti),
-.win-h3:-ms-lang(am, ti),
-.win-h4:-ms-lang(am, ti),
-.win-h5:-ms-lang(am, ti),
-.win-h6:-ms-lang(am, ti),
-.win-button:-ms-lang(am, ti),
-.win-dropdown:-ms-lang(am, ti),
-.win-textbox:-ms-lang(am, ti),
-.win-link:-ms-lang(am, ti),
-.win-textarea:-ms-lang(am, ti) {
-  font-family: "Ebrima", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-type-subheader:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-type-title:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-type-subtitle:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-type-base:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-type-body:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-type-caption:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-h1:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-h2:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-h3:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-h4:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-h5:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-h6:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-button:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-dropdown:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-textbox:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-link:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te),
-.win-textarea:-ms-lang(as, bn, gu, hi, kn, kok, ml, mr, ne, or, pa, sat-Olck, si, srb-Sora, ta, te) {
-  font-family: "Nirmala UI", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(chr-CHER-US),
-.win-type-subheader:-ms-lang(chr-CHER-US),
-.win-type-title:-ms-lang(chr-CHER-US),
-.win-type-subtitle:-ms-lang(chr-CHER-US),
-.win-type-base:-ms-lang(chr-CHER-US),
-.win-type-body:-ms-lang(chr-CHER-US),
-.win-type-caption:-ms-lang(chr-CHER-US),
-.win-h1:-ms-lang(chr-CHER-US),
-.win-h2:-ms-lang(chr-CHER-US),
-.win-h3:-ms-lang(chr-CHER-US),
-.win-h4:-ms-lang(chr-CHER-US),
-.win-h5:-ms-lang(chr-CHER-US),
-.win-h6:-ms-lang(chr-CHER-US),
-.win-button:-ms-lang(chr-CHER-US),
-.win-dropdown:-ms-lang(chr-CHER-US),
-.win-textbox:-ms-lang(chr-CHER-US),
-.win-link:-ms-lang(chr-CHER-US),
-.win-textarea:-ms-lang(chr-CHER-US) {
-  font-family: "Gadugi", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(ja),
-.win-type-subheader:-ms-lang(ja),
-.win-type-title:-ms-lang(ja),
-.win-type-subtitle:-ms-lang(ja),
-.win-type-base:-ms-lang(ja),
-.win-type-body:-ms-lang(ja),
-.win-type-caption:-ms-lang(ja),
-.win-h1:-ms-lang(ja),
-.win-h2:-ms-lang(ja),
-.win-h3:-ms-lang(ja),
-.win-h4:-ms-lang(ja),
-.win-h5:-ms-lang(ja),
-.win-h6:-ms-lang(ja),
-.win-button:-ms-lang(ja),
-.win-dropdown:-ms-lang(ja),
-.win-textbox:-ms-lang(ja),
-.win-link:-ms-lang(ja),
-.win-textarea:-ms-lang(ja) {
-  font-family: "Yu Gothic UI", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(km, lo, th, bug-Bugi),
-.win-type-subheader:-ms-lang(km, lo, th, bug-Bugi),
-.win-type-title:-ms-lang(km, lo, th, bug-Bugi),
-.win-type-subtitle:-ms-lang(km, lo, th, bug-Bugi),
-.win-type-base:-ms-lang(km, lo, th, bug-Bugi),
-.win-type-body:-ms-lang(km, lo, th, bug-Bugi),
-.win-type-caption:-ms-lang(km, lo, th, bug-Bugi),
-.win-h1:-ms-lang(km, lo, th, bug-Bugi),
-.win-h2:-ms-lang(km, lo, th, bug-Bugi),
-.win-h3:-ms-lang(km, lo, th, bug-Bugi),
-.win-h4:-ms-lang(km, lo, th, bug-Bugi),
-.win-h5:-ms-lang(km, lo, th, bug-Bugi),
-.win-h6:-ms-lang(km, lo, th, bug-Bugi),
-.win-button:-ms-lang(km, lo, th, bug-Bugi),
-.win-dropdown:-ms-lang(km, lo, th, bug-Bugi),
-.win-textbox:-ms-lang(km, lo, th, bug-Bugi),
-.win-link:-ms-lang(km, lo, th, bug-Bugi),
-.win-textarea:-ms-lang(km, lo, th, bug-Bugi) {
-  font-family: "Leelawadee UI", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(ko),
-.win-type-subheader:-ms-lang(ko),
-.win-type-title:-ms-lang(ko),
-.win-type-subtitle:-ms-lang(ko),
-.win-type-base:-ms-lang(ko),
-.win-type-body:-ms-lang(ko),
-.win-type-caption:-ms-lang(ko),
-.win-h1:-ms-lang(ko),
-.win-h2:-ms-lang(ko),
-.win-h3:-ms-lang(ko),
-.win-h4:-ms-lang(ko),
-.win-h5:-ms-lang(ko),
-.win-h6:-ms-lang(ko),
-.win-button:-ms-lang(ko),
-.win-dropdown:-ms-lang(ko),
-.win-textbox:-ms-lang(ko),
-.win-link:-ms-lang(ko),
-.win-textarea:-ms-lang(ko) {
-  font-family: "Malgun Gothic", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(jv-Java),
-.win-type-subheader:-ms-lang(jv-Java),
-.win-type-title:-ms-lang(jv-Java),
-.win-type-subtitle:-ms-lang(jv-Java),
-.win-type-base:-ms-lang(jv-Java),
-.win-type-body:-ms-lang(jv-Java),
-.win-type-caption:-ms-lang(jv-Java),
-.win-h1:-ms-lang(jv-Java),
-.win-h2:-ms-lang(jv-Java),
-.win-h3:-ms-lang(jv-Java),
-.win-h4:-ms-lang(jv-Java),
-.win-h5:-ms-lang(jv-Java),
-.win-h6:-ms-lang(jv-Java),
-.win-button:-ms-lang(jv-Java),
-.win-dropdown:-ms-lang(jv-Java),
-.win-textbox:-ms-lang(jv-Java),
-.win-link:-ms-lang(jv-Java),
-.win-textarea:-ms-lang(jv-Java) {
-  font-family: "Javanese Text", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(cop-Copt),
-.win-type-subheader:-ms-lang(cop-Copt),
-.win-type-title:-ms-lang(cop-Copt),
-.win-type-subtitle:-ms-lang(cop-Copt),
-.win-type-base:-ms-lang(cop-Copt),
-.win-type-body:-ms-lang(cop-Copt),
-.win-type-caption:-ms-lang(cop-Copt),
-.win-h1:-ms-lang(cop-Copt),
-.win-h2:-ms-lang(cop-Copt),
-.win-h3:-ms-lang(cop-Copt),
-.win-h4:-ms-lang(cop-Copt),
-.win-h5:-ms-lang(cop-Copt),
-.win-h6:-ms-lang(cop-Copt),
-.win-button:-ms-lang(cop-Copt),
-.win-dropdown:-ms-lang(cop-Copt),
-.win-textbox:-ms-lang(cop-Copt),
-.win-link:-ms-lang(cop-Copt),
-.win-textarea:-ms-lang(cop-Copt) {
-  font-family: "Segoe MDL2 Assets", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-type-subheader:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-type-title:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-type-subtitle:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-type-base:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-type-body:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-type-caption:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-h1:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-h2:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-h3:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-h4:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-h5:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-h6:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-button:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-dropdown:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-textbox:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-link:-ms-lang(zh-CN, zh-Hans, zh-SG),
-.win-textarea:-ms-lang(zh-CN, zh-Hans, zh-SG) {
-  font-family: "Microsoft YaHei UI", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-.win-type-header:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-type-subheader:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-type-title:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-type-subtitle:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-type-base:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-type-body:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-type-caption:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-h1:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-h2:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-h3:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-h4:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-h5:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-h6:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-button:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-dropdown:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-textbox:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-link:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO),
-.win-textarea:-ms-lang(zh-HK, zh-TW, zh-Hant, zh-MO) {
-  font-family: "Microsoft JhengHei UI", "Ebrima", "Nirmala UI", "Gadugi", "Segoe UI Emoji", "Segoe MDL2 Assets", "Symbols", "Yu Gothic UI", "Yu Gothic", "Meiryo UI", "Leelawadee UI", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "Segoe UI Historic", "Estrangelo Edessa", "Microsoft Himalaya", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Tai Le", "Microsoft Yi Baiti", "Mongolian Baiti", "MV Boli", "Myanmar Text", "Javanese Text", "Cambria Math";
-}
-html,
-body {
-  width: 100%;
-  height: 100%;
-  margin: 0px;
-  cursor: default;
-  -webkit-touch-callout: none;
-  -ms-scroll-translation: vertical-to-horizontal;
-  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-html {
-  overflow: hidden;
-  direction: ltr;
-}
-html:lang(ar),
-html:lang(dv),
-html:lang(fa),
-html:lang(he),
-html:lang(ku-Arab),
-html:lang(pa-Arab),
-html:lang(prs),
-html:lang(ps),
-html:lang(sd-Arab),
-html:lang(syr),
-html:lang(ug),
-html:lang(ur),
-html:lang(qps-plocm) {
-  direction: rtl;
-}
-body {
-  -ms-content-zooming: none;
-}
-iframe {
-  border: 0;
-}
-.win-type-header,
-.win-type-subheader,
-.win-type-title,
-.win-type-subtitle,
-.win-type-base,
-.win-type-body,
-.win-type-caption,
-.win-h1,
-.win-h2,
-.win-h3,
-.win-h4,
-.win-h5,
-.win-h6,
-.win-button,
-.win-dropdown,
-.win-textbox,
-.win-link,
-.win-textarea {
-  font-family: "Segoe UI", sans-serif, "Segoe MDL2 Assets", "Symbols", "Segoe UI Emoji";
-}
-.win-textbox,
-.win-textarea {
-  -ms-user-select: element;
-  border-style: solid;
-  border-width: 2px;
-  border-radius: 0;
-  margin: 8px 0px;
-  width: 296px;
-  min-width: 64px;
-  min-height: 28px;
-  background-clip: border-box;
-  box-sizing: border-box;
-  padding: 3px 6px 5px 10px;
-  outline: 0;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-textbox::-ms-value {
-  margin: 0;
-  padding: 0;
-}
-.win-textbox::-ms-clear,
-.win-textbox::-ms-reveal {
-  padding-right: 2px;
-  margin-right: -8px;
-  margin-left: 2px;
-  margin-top: -8px;
-  margin-bottom: -8px;
-  width: 30px;
-  height: 32px;
-}
-.win-textbox:lang(ar)::-ms-clear,
-.win-textbox:lang(dv)::-ms-clear,
-.win-textbox:lang(fa)::-ms-clear,
-.win-textbox:lang(he)::-ms-clear,
-.win-textbox:lang(ku-Arab)::-ms-clear,
-.win-textbox:lang(pa-Arab)::-ms-clear,
-.win-textbox:lang(prs)::-ms-clear,
-.win-textbox:lang(ps)::-ms-clear,
-.win-textbox:lang(sd-Arab)::-ms-clear,
-.win-textbox:lang(syr)::-ms-clear,
-.win-textbox:lang(ug)::-ms-clear,
-.win-textbox:lang(ur)::-ms-clear,
-.win-textbox:lang(qps-plocm)::-ms-clear,
-.win-textbox:lang(ar)::-ms-reveal,
-.win-textbox:lang(dv)::-ms-reveal,
-.win-textbox:lang(fa)::-ms-reveal,
-.win-textbox:lang(he)::-ms-reveal,
-.win-textbox:lang(ku-Arab)::-ms-reveal,
-.win-textbox:lang(pa-Arab)::-ms-reveal,
-.win-textbox:lang(prs)::-ms-reveal,
-.win-textbox:lang(ps)::-ms-reveal,
-.win-textbox:lang(sd-Arab)::-ms-reveal,
-.win-textbox:lang(syr)::-ms-reveal,
-.win-textbox:lang(ug)::-ms-reveal,
-.win-textbox:lang(ur)::-ms-reveal,
-.win-textbox:lang(qps-plocm)::-ms-reveal {
-  margin-left: -8px;
-  margin-right: 2px;
-}
-.win-textarea {
-  resize: none;
-  overflow-y: auto;
-}
-.win-radio,
-.win-checkbox {
-  width: 20px;
-  height: 20px;
-  margin-right: 8px;
-  margin-top: 12px;
-  margin-bottom: 12px;
-}
-.win-radio:lang(ar),
-.win-checkbox:lang(ar),
-.win-radio:lang(dv),
-.win-checkbox:lang(dv),
-.win-radio:lang(fa),
-.win-checkbox:lang(fa),
-.win-radio:lang(he),
-.win-checkbox:lang(he),
-.win-radio:lang(ku-Arab),
-.win-checkbox:lang(ku-Arab),
-.win-radio:lang(pa-Arab),
-.win-checkbox:lang(pa-Arab),
-.win-radio:lang(prs),
-.win-checkbox:lang(prs),
-.win-radio:lang(ps),
-.win-checkbox:lang(ps),
-.win-radio:lang(sd-Arab),
-.win-checkbox:lang(sd-Arab),
-.win-radio:lang(syr),
-.win-checkbox:lang(syr),
-.win-radio:lang(ug),
-.win-checkbox:lang(ug),
-.win-radio:lang(ur),
-.win-checkbox:lang(ur),
-.win-radio:lang(qps-plocm),
-.win-checkbox:lang(qps-plocm) {
-  margin-left: 8px;
-  margin-right: 0px;
-}
-.win-radio::-ms-check,
-.win-checkbox::-ms-check {
-  border-style: solid;
-  display: inline-block;
-  border-width: 2px;
-  background-clip: border-box;
-}
-.win-button {
-  border-style: solid;
-  margin: 0px;
-  min-height: 32px;
-  min-width: 120px;
-  padding: 4px 8px;
-  border-width: 2px;
-  background-clip: border-box;
-  border-radius: 0;
-  touch-action: manipulation;
-  -webkit-appearance: none;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-button.win-button-file {
-  border: none;
-  min-width: 100px;
-  min-height: 20px;
-  width: 340px;
-  height: 32px;
-  padding: 0px;
-  margin: 7px 8px 21px 8px;
-  background-clip: padding-box;
-}
-.win-button.win-button-file::-ms-value {
-  margin: 0;
-  border-width: 2px;
-  border-style: solid;
-  border-right-style: none;
-  border-radius: 0;
-  background-clip: border-box;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-button.win-button-file:lang(ar)::-ms-value,
-.win-button.win-button-file:lang(dv)::-ms-value,
-.win-button.win-button-file:lang(fa)::-ms-value,
-.win-button.win-button-file:lang(he)::-ms-value,
-.win-button.win-button-file:lang(ku-Arab)::-ms-value,
-.win-button.win-button-file:lang(pa-Arab)::-ms-value,
-.win-button.win-button-file:lang(prs)::-ms-value,
-.win-button.win-button-file:lang(ps)::-ms-value,
-.win-button.win-button-file:lang(sd-Arab)::-ms-value,
-.win-button.win-button-file:lang(syr)::-ms-value,
-.win-button.win-button-file:lang(ug)::-ms-value,
-.win-button.win-button-file:lang(ur)::-ms-value,
-.win-button.win-button-file:lang(qps-plocm)::-ms-value {
-  border-left-style: none;
-  border-right-style: solid;
-}
-.win-button.win-button-file::-ms-browse {
-  margin: 0;
-  padding: 0 18px;
-  border-width: 2px;
-  border-style: solid;
-  background-clip: padding-box;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-dropdown {
-  min-width: 56px;
-  max-width: 368px;
-  min-height: 32px;
-  margin: 8px 0;
-  border-style: solid;
-  border-width: 2px;
-  background-clip: border-box;
-  background-image: none;
-  box-sizing: border-box;
-  border-radius: 0;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-dropdown::-ms-value {
-  padding: 5px 12px 7px 12px;
-  margin: 0;
-}
-.win-dropdown::-ms-expand {
-  border: none;
-  margin-right: 5px;
-  margin-left: 3px;
-  margin-bottom: -2px;
-  font-size: 20px;
-}
-select[multiple].win-dropdown {
-  padding: 0 0 0 12px;
-  vertical-align: bottom;
-}
-.win-dropdown option {
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-progress-bar,
-.win-progress-ring,
-.win-ring {
-  width: 180px;
-  height: 4px;
-  -webkit-appearance: none;
-}
-.win-progress-bar:not(:indeterminate),
-.win-progress-ring:not(:indeterminate),
-.win-ring:not(:indeterminate) {
-  border-style: none;
-}
-.win-progress-bar::-ms-fill,
-.win-progress-ring::-ms-fill,
-.win-ring::-ms-fill {
-  border-style: none;
-}
-.win-progress-bar.win-medium,
-.win-progress-ring.win-medium,
-.win-ring.win-medium {
-  width: 296px;
-}
-.win-progress-bar.win-large,
-.win-progress-ring.win-large,
-.win-ring.win-large {
-  width: 100%;
-}
-.win-progress-bar:indeterminate::-webkit-progress-value,
-.win-progress-ring:indeterminate::-webkit-progress-value,
-.win-ring:indeterminate::-webkit-progress-value {
-  position: relative;
-  -webkit-animation: win-progress-indeterminate 3s linear infinite;
-}
-.win-progress-bar.win-paused:not(:indeterminate),
-.win-progress-ring.win-paused:not(:indeterminate),
-.win-ring.win-paused:not(:indeterminate) {
-  animation-name: win-progress-fade-out;
-  animation-duration: 3s;
-  animation-timing-function: cubic-bezier(0.03, 0.76, 0.31, 1);
-  opacity: 0.5;
-}
-.win-progress-bar.win-error::-ms-fill,
-.win-progress-ring.win-error::-ms-fill,
-.win-ring.win-error::-ms-fill {
-  opacity: 0;
-}
-.win-progress-ring,
-.win-ring {
-  width: 20px;
-  height: 20px;
-}
-.win-progress-ring:indeterminate::-ms-fill,
-.win-ring:indeterminate::-ms-fill {
-  animation-name: -ms-ring;
-}
-.win-progress-ring.win-medium,
-.win-ring.win-medium {
-  width: 40px;
-  height: 40px;
-}
-.win-progress-ring.win-large,
-.win-ring.win-large {
-  width: 60px;
-  height: 60px;
-}
-@-webkit-keyframes win-progress-indeterminate {
-  0% {
-    left: 0;
-    width: 25%;
-  }
-  50% {
-    left: calc(75%);
-    width: 25%;
-  }
-  75% {
-    left: calc(100%);
-    width: 0%;
-  }
-  75.1% {
-    left: 0;
-    width: 0%;
-  }
-  100% {
-    left: 0;
-    width: 25%;
-  }
-}
-@keyframes win-progress-fade-out {
-  from {
-    opacity: 1.0;
-  }
-  to {
-    opacity: 0.5;
-  }
-}
-.win-slider {
-  -webkit-appearance: none;
-  width: 280px;
-  height: 44px;
-}
-.win-slider::-ms-track {
-  height: 2px;
-  border-style: none;
-}
-.win-slider::-webkit-slider-runnable-track {
-  height: 2px;
-  border-style: none;
-}
-.win-slider::-moz-range-track {
-  height: 2px;
-  border-style: none;
-}
-.win-slider::-moz-range-thumb {
-  width: 8px;
-  height: 24px;
-  border-radius: 4px;
-  border-style: none;
-}
-.win-slider::-webkit-slider-thumb {
-  -webkit-appearance: none;
-  margin-top: -11px;
-  width: 8px;
-  height: 24px;
-  border-radius: 4px;
-  border-style: none;
-}
-.win-slider::-ms-thumb {
-  margin-top: inherit;
-  width: 8px;
-  height: 24px;
-  border-radius: 4px;
-  border-style: none;
-}
-.win-slider.win-vertical {
-  writing-mode: bt-lr;
-  width: 44px;
-  height: 280px;
-}
-.win-slider.win-vertical::-ms-track {
-  width: 2px;
-  height: auto;
-}
-.win-slider.win-vertical::-ms-thumb {
-  width: 24px;
-  height: 8px;
-}
-.win-slider.win-vertical:lang(ar),
-.win-slider.win-vertical:lang(dv),
-.win-slider.win-vertical:lang(fa),
-.win-slider.win-vertical:lang(he),
-.win-slider.win-vertical:lang(ku-Arab),
-.win-slider.win-vertical:lang(pa-Arab),
-.win-slider.win-vertical:lang(prs),
-.win-slider.win-vertical:lang(ps),
-.win-slider.win-vertical:lang(sd-Arab),
-.win-slider.win-vertical:lang(syr),
-.win-slider.win-vertical:lang(ug),
-.win-slider.win-vertical:lang(ur),
-.win-slider.win-vertical:lang(qps-plocm) {
-  writing-mode: bt-rl;
-}
-.win-link {
-  text-decoration: underline;
-  cursor: pointer;
-  touch-action: manipulation;
-}
-.win-code {
-  font-family: "Consolas", "Menlo", "Monaco", "Courier New", monospace;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-type-ellipsis {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-h1.win-type-ellipsis,
-.win-type-header.win-type-ellipsis,
-.win-h1.win-type-ellipsis {
-  line-height: 1.4286;
-}
-h2.win-type-ellipsis,
-.win-type-subheader.win-type-ellipsis,
-.win-h2.win-type-ellipsis {
-  line-height: 1.5;
-}
-.win-scrollview {
-  overflow-x: auto;
-  overflow-y: hidden;
-  height: 400px;
-  width: 100%;
-}
-h1.win-type-header,
-h2.win-type-subheader,
-h3.win-type-title,
-h4.win-type-subtitle,
-h5.win-type-base,
-h6.win-type-body,
-h1.win-h1,
-h2.win-h2,
-h3.win-h3,
-h4.win-h4,
-h5.win-h5,
-h6.win-h6 {
-  margin-top: 0px;
-  margin-bottom: 0px;
-}
-.win-type-body p,
-p.win-type-body {
-  font-weight: 300;
-}
-.win-listview {
-  overflow: hidden;
-  height: 400px;
-}
-.win-listview .win-surface {
-  overflow: visible;
-}
-.win-listview > .win-viewport.win-horizontal .win-surface {
-  height: 100%;
-}
-.win-listview > .win-viewport.win-vertical .win-surface {
-  width: 100%;
-}
-.win-listview > .win-viewport {
-  position: relative;
-  width: 100%;
-  height: 100%;
-  z-index: 0;
-  -ms-overflow-style: -ms-autohiding-scrollbar;
-  -webkit-overflow-scrolling: touch;
-  white-space: nowrap;
-}
-.win-listview > .win-viewport.win-horizontal {
-  overflow-x: auto;
-  overflow-y: hidden;
-}
-.win-listview > .win-viewport.win-vertical {
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-.win-listview .win-itemscontainer {
-  overflow: hidden;
-}
-.win-listview .win-itemscontainer-padder {
-  width: 0;
-  height: 0;
-  margin: 0;
-  padding: 0;
-  border: 0;
-  overflow: hidden;
-}
-.win-listview > .win-horizontal .win-container {
-  margin: 10px 5px 0px 5px;
-}
-.win-listview > .win-vertical .win-container {
-  margin: 10px 24px 0px 7px;
-}
-.win-listview.win-rtl > .win-vertical .win-container {
-  margin: 10px 7px 0px 24px;
-}
-.win-listview .win-container,
-.win-listview .win-itembox,
-.win-itemcontainer.win-container,
-.win-itemcontainer .win-itembox {
-  cursor: default;
-  z-index: 0;
-}
-.win-listview .win-container {
-  touch-action: pan-x pan-y pinch-zoom;
-}
-.win-semanticzoom .win-listview > .win-viewport * {
-  touch-action: auto;
-}
-.win-semanticzoom .win-listview > .win-viewport.win-zooming-x {
-  overflow-x: visible;
-}
-.win-semanticzoom .win-listview > .win-viewport.win-zooming-y {
-  overflow-y: visible;
-}
-.win-listview .win-itembox,
-.win-itemcontainer .win-itembox {
-  width: 100%;
-  height: 100%;
-}
-.win-listview .win-item,
-.win-itemcontainer .win-item {
-  z-index: 1;
-}
-.win-listview .win-item,
-.win-itemcontainer .win-item {
-  overflow: hidden;
-  position: relative;
-}
-.win-listview > .win-vertical .win-item {
-  width: 100%;
-}
-.win-listview .win-item:focus,
-.win-itemcontainer .win-item:focus {
-  outline-style: none;
-}
-.win-listview .win-focusedoutline,
-.win-itemcontainer .win-focusedoutline {
-  width: calc(100% - 4px);
-  height: calc(100% - 4px);
-  left: 2px;
-  top: 2px;
-  position: absolute;
-  z-index: 5;
-  pointer-events: none;
-}
-.win-container.win-selected .win-selectionborder {
-  border-width: 2px;
-  border-style: solid;
-}
-html.win-hoverable .win-container.win-selected:hover .win-selectionborder {
-  border-width: 2px;
-  border-style: solid;
-}
-html.win-hoverable .win-listview .win-itembox:hover::before,
-html.win-hoverable .win-itemcontainer .win-itembox:hover::before {
-  position: absolute;
-  left: 0px;
-  top: 0px;
-  content: "";
-  width: calc(100% - 4px);
-  height: calc(100% - 4px);
-  pointer-events: none;
-  border-style: solid;
-  border-width: 2px;
-  z-index: 3;
-}
-html.win-hoverable .win-listview.win-selectionstylefilled .win-itembox:hover::before,
-html.win-hoverable .win-itemcontainer.win-selectionstylefilled .win-itembox:hover::before,
-html.win-hoverable .win-listview .win-itembox.win-selected:hover::before,
-html.win-hoverable .win-itemcontainer.win-itembox.win-selected:hover::before,
-html.win-hoverable .win-itemcontainer.win-itembox.win-selected:hover::before {
-  display: none;
-}
-.win-listview .win-groupheader {
-  padding: 10px 10px 10px 2px;
-  overflow: hidden;
-  outline-width: 0.01px;
-  outline-style: none;
-  float: left;
-  font-size: 34px;
-  font-weight: 200;
-  line-height: 1.176;
-}
-.win-listview .win-groupheadercontainer {
-  z-index: 1;
-  touch-action: pan-x pan-y pinch-zoom;
-  overflow: hidden;
-}
-.win-listview .win-horizontal .win-headercontainer,
-.win-listview .win-horizontal .win-footercontainer {
-  height: 100%;
-  display: inline-block;
-  overflow: hidden;
-  white-space: normal;
-}
-.win-listview .win-vertical .win-headercontainer,
-.win-listview .win-vertical .win-footercontainer {
-  width: 100%;
-  display: block;
-  overflow: hidden;
-  white-space: normal;
-}
-.win-listview .win-groupheader.win-focused {
-  outline-style: dotted;
-}
-.win-listview.win-rtl .win-groupheader {
-  padding-left: 10px;
-  padding-right: 2px;
-  float: right;
-}
-.win-listview.win-groups .win-horizontal .win-groupleader {
-  margin-left: 70px;
-}
-.win-listview.win-groups.win-rtl .win-horizontal .win-groupleader {
-  margin-left: 0;
-  margin-right: 70px;
-}
-.win-listview.win-groups .win-vertical .win-listlayout .win-groupleader,
-.win-listview.win-groups .win-vertical .win-gridlayout .win-groupleader {
-  margin-top: 70px;
-}
-.win-listview.win-groups > .win-vertical .win-surface.win-listlayout,
-.win-listview.win-groups > .win-vertical .win-surface.win-gridlayout {
-  margin-top: -65px;
-}
-.win-listview.win-groups > .win-horizontal .win-surface {
-  margin-left: -70px;
-}
-.win-listview.win-groups.win-rtl > .win-horizontal .win-surface {
-  margin-left: 0;
-  margin-right: -70px;
-}
-.win-listview .win-surface {
-  -webkit-margin-collapse: separate;
-  white-space: normal;
-}
-.win-surface ._win-proxy {
-  position: relative;
-  overflow: hidden;
-  width: 0;
-  height: 0;
-  touch-action: none;
-}
-.win-selectionborder {
-  position: absolute;
-  opacity: inherit;
-  z-index: 2;
-  pointer-events: none;
-}
-.win-container.win-selected .win-selectionborder {
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-}
-.win-selectionbackground {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  z-index: 0;
-}
-.win-selectioncheckmarkbackground {
-  position: absolute;
-  top: 2px;
-  right: 2px;
-  width: 14px;
-  height: 11px;
-  margin: 0;
-  padding: 0;
-  border-left-width: 2px;
-  border-right-width: 2px;
-  border-top-width: 4px;
-  border-bottom-width: 3px;
-  border-style: solid;
-  z-index: 3;
-  display: none;
-}
-.win-listview.win-rtl .win-selectioncheckmarkbackground,
-.win-itemcontainer.win-rtl .win-selectioncheckmarkbackground {
-  left: 2px;
-  right: auto;
-}
-.win-selectionmode.win-itemcontainer .win-selectioncheckmarkbackground,
-.win-selectionmode.win-itemcontainer.win-selectionmode .win-selectioncheckmark,
-.win-selectionmode .win-itemcontainer .win-selectioncheckmarkbackground,
-.win-selectionmode .win-itemcontainer.win-selectionmode .win-selectioncheckmark,
-.win-listview .win-selectionmode .win-selectioncheckmarkbackground,
-.win-listview .win-selectionmode .win-selectioncheckmark {
-  display: block;
-}
-.win-selectioncheckmark {
-  position: absolute;
-  margin: 0;
-  padding: 2px;
-  right: 1px;
-  top: 1px;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-size: 14px;
-  z-index: 4;
-  line-height: 1;
-  display: none;
-}
-.win-rtl .win-selectioncheckmark {
-  right: auto;
-  left: 0px;
-}
-.win-selectionstylefilled.win-container,
-.win-selectionstylefilled .win-container {
-  overflow: hidden;
-}
-.win-selectionmode .win-itemcontainer.win-container .win-itembox::after,
-.win-selectionmode.win-itemcontainer.win-container .win-itembox::after,
-.win-listview .win-surface.win-selectionmode .win-itembox::after {
-  content: "";
-  position: absolute;
-  width: 18px;
-  height: 18px;
-  pointer-events: none;
-  right: 2px;
-  top: 2px;
-  z-index: 3;
-}
-.win-rtl .win-selectionmode .win-itemcontainer.win-container .win-itembox::after,
-.win-itemcontainer.win-rtl.win-selectionmode.win-container .win-itembox::after,
-.win-listview.win-rtl .win-surface.win-selectionmode .win-itembox::after {
-  right: auto;
-  left: 2px;
-}
-.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-item {
-  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  transform: translate(40px, 0px);
-  -webkit-transform: translate(40px, 0px);
-}
-.win-listview.win-rtl.win-selectionstylefilled .win-surface.win-selectionmode .win-item {
-  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  transform: translate(-40px, 0px);
-  -webkit-transform: translate(-40px, 0px);
-}
-.win-listview.win-selectionstylefilled .win-surface.win-hidingselectionmode .win-item {
-  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  transform: none;
-  -webkit-transform: none;
-}
-.win-listview.win-rtl.win-selectionstylefilled .win-surface.win-hideselectionmode .win-item {
-  transition: transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  -webkit-transition: -webkit-transform 250ms cubic-bezier(0.17, 0.79, 0.215, 1.0025);
-  transform: none;
-  -webkit-transform: none;
-}
-.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox::after {
-  left: 12px;
-  right: auto;
-  top: 50%;
-  margin-top: -9px;
-  display: block;
-  border: 2px solid;
-  width: 16px;
-  height: 16px;
-}
-.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-itembox::after {
-  left: auto;
-  right: 12px;
-}
-.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-selectioncheckmarkbackground {
-  left: 12px;
-  top: 50%;
-  margin-top: -9px;
-  display: block;
-  border: 2px solid;
-  width: 16px;
-  height: 16px;
-}
-.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-selectioncheckmarkbackground {
-  left: auto;
-  right: 12px;
-}
-.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-selectioncheckmark {
-  left: 13px;
-  top: 50%;
-  margin-top: -8px;
-  display: block;
-  width: 14px;
-  height: 14px;
-}
-.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-selectioncheckmark {
-  left: 0;
-  right: 10px;
-}
-.win-selectionmode .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox.win-selected::after,
-.win-itemcontainer.win-selectionmode.win-selectionstylefilled.win-container .win-itembox.win-selected::after,
-.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox.win-nonselectable::after,
-.win-listview .win-surface.win-selectionmode .win-itembox.win-selected::after {
-  display: none;
-}
-.win-listview .win-progress {
-  left: 50%;
-  top: 50%;
-  width: 60px;
-  height: 60px;
-  margin-left: -30px;
-  margin-top: -30px;
-  z-index: 1;
-  position: absolute;
-}
-.win-listview .win-progress::-ms-fill {
-  animation-name: -ms-ring;
-}
-.win-listview .win-itemsblock {
-  overflow: hidden;
-}
-.win-listview .win-surface.win-nocssgrid.win-gridlayout,
-.win-listview .win-horizontal .win-nocssgrid.win-listlayout,
-.win-listview .win-vertical .win-nocssgrid.win-listlayout.win-headerpositionleft {
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  vertical-align: top;
-}
-.win-listview .win-horizontal .win-surface.win-nocssgrid {
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-line-pack: start;
-  -webkit-align-content: flex-start;
-  align-content: flex-start;
-}
-.win-listview .win-vertical .win-surface.win-nocssgrid {
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-line-pack: start;
-  -webkit-align-content: flex-start;
-  align-content: flex-start;
-}
-.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout,
-.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout,
-.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,
-.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout {
-  display: block;
-}
-.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout .win-itemscontainer-padder,
-.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout .win-itemscontainer-padder,
-.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout .win-itemscontainer-padder,
-.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout .win-itemscontainer-padder {
-  height: 0;
-  width: 0;
-}
-.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer,
-.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer,
-.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer,
-.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer {
-  display: none;
-}
-.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer.win-laidout,
-.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer.win-laidout,
-.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer.win-laidout {
-  display: block;
-}
-.win-listview .win-listlayout .win-itemscontainer {
-  overflow: visible;
-}
-.win-listview .win-listlayout .win-itemsblock {
-  padding-bottom: 4px;
-  margin-bottom: -4px;
-}
-.win-listview > .win-vertical .win-listlayout.win-headerpositiontop .win-groupheader {
-  float: none;
-}
-.win-listview > .win-vertical .win-surface.win-listlayout {
-  margin-bottom: 5px;
-}
-.win-listview .win-vertical .win-listlayout.win-headerpositionleft.win-surface {
-  display: -ms-inline-grid;
-  -ms-grid-columns: auto 1fr;
-  -ms-grid-rows: auto;
-}
-.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer {
-  -ms-grid-column: 1;
-}
-.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer {
-  -ms-grid-column: 2;
-}
-.win-listview > .win-horizontal .win-surface.win-listlayout {
-  display: -ms-inline-grid;
-  -ms-grid-columns: auto;
-  -ms-grid-rows: auto;
-  vertical-align: top;
-}
-.win-listview .win-horizontal .win-listlayout .win-itemsblock {
-  height: 100%;
-}
-.win-listview .win-horizontal .win-listlayout .win-itemscontainer {
-  margin-bottom: 24px;
-}
-.win-listview .win-horizontal .win-listlayout .win-container {
-  height: calc(100% - 10px);
-}
-.win-listview > .win-horizontal .win-surface.win-listlayout.win-headerpositiontop {
-  -ms-grid-rows: auto 1fr;
-}
-.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-groupheadercontainer {
-  -ms-grid-row: 1;
-}
-.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-itemscontainer {
-  -ms-grid-row: 2;
-}
-.win-listview .win-gridlayout.win-surface {
-  display: -ms-inline-grid;
-  vertical-align: top;
-}
-.win-listview .win-gridlayout .win-container {
-  margin: 5px;
-}
-.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-groupheadercontainer,
-.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-groupheadercontainer {
-  -ms-grid-column: 1;
-}
-.win-listview.win-groups .win-gridlayout .win-itemscontainer,
-.win-listview.win-groups .win-gridlayout .win-groupheadercontainer {
-  display: none;
-}
-.win-listview.win-groups .win-gridlayout .win-groupheadercontainer.win-laidout {
-  display: block;
-}
-.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop.win-surface {
-  -ms-grid-columns: auto;
-  -ms-grid-rows: auto 1fr;
-}
-.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-groupheadercontainer {
-  -ms-grid-row: 1;
-}
-.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-itemscontainer {
-  -ms-grid-row: 2;
-}
-.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft.win-surface {
-  -ms-grid-columns: auto;
-  -ms-grid-rows: auto;
-}
-.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-groupheadercontainer {
-  -ms-grid-row: 1;
-}
-.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-itemscontainer {
-  -ms-grid-row: 1;
-}
-.win-listview .win-vertical .win-gridlayout.win-headerpositiontop.win-surface {
-  -ms-grid-columns: auto;
-  -ms-grid-rows: auto;
-}
-.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-itemscontainer {
-  -ms-grid-column: 1;
-}
-.win-listview .win-vertical .win-gridlayout.win-headerpositionleft.win-surface {
-  -ms-grid-columns: auto 1fr;
-  -ms-grid-rows: auto;
-}
-.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-itemscontainer {
-  -ms-grid-column: 2;
-}
-.win-listview .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-}
-.win-listview .win-horizontal .win-listlayout .win-itemscontainer,
-.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer.win-laidout,
-.win-listview .win-horizontal .win-listlayout .win-itemsblock,
-.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,
-.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-line-pack: start;
-  -webkit-align-content: flex-start;
-  align-content: flex-start;
-}
-.win-listview .win-horizontal .win-itemscontainer-padder {
-  height: 100%;
-}
-.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock {
-  height: 100%;
-}
-.win-listview .win-horizontal .win-gridlayout .win-cellspanninggridlayout.win-itemscontainer.win-laidout {
-  display: -ms-grid;
-}
-.win-listview .win-vertical .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-}
-.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,
-.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-line-pack: start;
-  -webkit-align-content: flex-start;
-  align-content: flex-start;
-}
-.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock {
-  width: 100%;
-}
-.win-listview .win-cellspanninggridlayout .win-container.win-laidout {
-  display: block;
-}
-.win-listview .win-cellspanninggridlayout .win-container {
-  display: none;
-}
-.win-listview .win-itembox {
-  position: relative;
-}
-.win-listview.win-dragover .win-itembox {
-  transform: scale(0.86);
-  -webkit-transform: scale(0.86);
-}
-.win-listview .win-itembox.win-dragsource,
-.win-itemcontainer .win-itembox.win-dragsource {
-  opacity: 0.5;
-  transition: opacity cubic-bezier(0.1, 0.9, 0.2, 1) 167ms, transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;
-  -webkit-transition: opacity cubic-bezier(0.1, 0.9, 0.2, 1) 167ms, transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;
-}
-.win-listview.win-dragover .win-itembox.win-dragsource {
-  opacity: 0;
-  transition: none;
-  -webkit-transition: none;
-}
-html.win-hoverable .win-listview.win-dragover .win-container:hover {
-  outline: none;
-}
-.win-listview .win-itembox {
-  transition: transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;
-  -webkit-transition: -webkit-transform cubic-bezier(0.1, 0.9, 0.2, 1) 220ms;
-}
-.win-listview.win-groups > .win-vertical .win-surface.win-listlayout.win-headerpositionleft {
-  margin-left: 70px;
-}
-.win-listview.win-groups.win-rtl > .win-vertical .win-surface.win-listlayout.win-headerpositionleft {
-  margin-left: 0px;
-  margin-right: 70px;
-}
-.win-listview > .win-horizontal .win-surface.win-listlayout {
-  margin-left: 70px;
-}
-.win-listview.win-rtl > .win-horizontal .win-surface.win-listlayout {
-  margin-left: 0px;
-  margin-right: 70px;
-}
-.win-listview .win-vertical .win-gridlayout.win-surface {
-  margin-left: 20px;
-}
-.win-listview.win-rtl .win-vertical .win-gridlayout.win-surface {
-  margin-left: 0px;
-  margin-right: 20px;
-}
-.win-itemcontainer .win-itembox,
-.win-itemcontainer.win-container {
-  position: relative;
-}
-.win-itemcontainer {
-  touch-action: pan-x pan-y pinch-zoom;
-}
-html.win-hoverable .win-listview .win-itembox:hover::before,
-html.win-hoverable .win-itemcontainer .win-itembox:hover::before {
-  opacity: 0.4;
-}
-html.win-hoverable .win-listview .win-pressed .win-itembox:hover::before,
-html.win-hoverable .win-listview .win-pressed.win-itembox:hover::before,
-html.win-hoverable .win-itemcontainer.win-pressed .win-itembox:hover::before {
-  opacity: 0.6;
-}
-html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover,
-html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover,
-html.win-hoverable .win-selectionstylefilled .win-itemcontainer.win-container:hover {
-  outline: none;
-}
-.win-selectionstylefilled.win-itemcontainer .win-itembox,
-.win-selectionstylefilled .win-itemcontainer .win-itembox,
-.win-listview.win-selectionstylefilled .win-itembox {
-  background-color: transparent;
-}
-.win-listview.win-selectionstylefilled .win-container.win-selected .win-selectionborder,
-.win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-selectionborder {
-  border-color: transparent;
-}
-.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox::after {
-  background-color: transparent;
-}
-.win-listview.win-selectionstylefilled .win-selectioncheckmarkbackground,
-.win-itemcontainer.win-selectionstylefilled .win-selectioncheckmarkbackground {
-  border-color: transparent;
-}
-.win-listview.win-selectionstylefilled .win-selected a,
-.win-listview.win-selectionstylefilled .win-selected progress,
-.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-full,
-.win-itemcontainer.win-selectionstylefilled.win-selected a,
-.win-itemcontainer.win-selectionstylefilled.win-selected progress,
-.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-full {
-  color: #ffffff;
-}
-.win-listview.win-selectionstylefilled .win-selected.win-selected a:hover:active,
-.win-itemcontainer.win-selectionstylefilled.win-selected.win-selected a:hover:active {
-  color: rgba(255, 255, 255, 0.6);
-}
-html.win-hoverable .win-listview.win-selectionstylefilled .win-selected a:hover,
-html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected a:hover {
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-listview.win-selectionstylefilled .win-selected button,
-.win-listview.win-selectionstylefilled .win-selected input[type=button],
-.win-listview.win-selectionstylefilled .win-selected input[type=reset],
-.win-listview.win-selectionstylefilled .win-selected input[type=text],
-.win-listview.win-selectionstylefilled .win-selected input[type=password],
-.win-listview.win-selectionstylefilled .win-selected input[type=email],
-.win-listview.win-selectionstylefilled .win-selected input[type=number],
-.win-listview.win-selectionstylefilled .win-selected input[type=tel],
-.win-listview.win-selectionstylefilled .win-selected input[type=url],
-.win-listview.win-selectionstylefilled .win-selected input[type=search],
-.win-listview.win-selectionstylefilled .win-selected input::-ms-check,
-.win-listview.win-selectionstylefilled .win-selected textarea,
-.win-listview.win-selectionstylefilled .win-selected .win-textarea,
-.win-listview.win-selectionstylefilled .win-selected select,
-.win-itemcontainer.win-selectionstylefilled.win-selected button,
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=button],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=reset],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=text],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=password],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=email],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=number],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=tel],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=url],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=search],
-.win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-check,
-.win-itemcontainer.win-selectionstylefilled.win-selected textarea,
-.win-itemcontainer.win-selectionstylefilled.win-selected .win-textarea,
-.win-itemcontainer.win-selectionstylefilled.win-selected select {
-  background-clip: border-box;
-  background-color: rgba(255, 255, 255, 0.8);
-  border-color: transparent;
-  color: #000000;
-}
-.win-listview.win-selectionstylefilled .win-selected button[type=submit],
-.win-listview.win-selectionstylefilled .win-selected input[type=submit],
-.win-itemcontainer.win-selectionstylefilled.win-selected button[type=submit],
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=submit] {
-  border-color: #ffffff;
-}
-.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-lower,
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-lower {
-  background-color: #ffffff;
-}
-.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-thumb,
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-thumb {
-  background-color: #000000;
-}
-.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-upper,
-.win-listview.win-selectionstylefilled .win-selected progress,
-.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-upper,
-.win-itemcontainer.win-selectionstylefilled.win-selected progress {
-  background-color: rgba(255, 255, 255, 0.16);
-}
-.win-listview.win-selectionstylefilled .win-selected progress:indeterminate,
-.win-itemcontainer.win-selectionstylefilled.win-selected progress:indeterminate {
-  background-color: transparent;
-}
-.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-empty,
-.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-empty {
-  color: rgba(255, 255, 255, 0.16);
-}
-.win-listview .win-viewport {
-  outline: none;
-}
-@media (-ms-high-contrast) {
-  .win-listview .win-groupheader {
-    color: WindowText;
-  }
-  .win-selectioncheckmark {
-    color: HighlightText;
-  }
-  .win-listview .win-focusedoutline,
-  .win-listview .win-groupheader,
-  .win-itemcontainer .win-focusedoutline {
-    outline-color: WindowText;
-  }
-  .win-listview.win-selectionstylefilled .win-itembox,
-  .win-itemcontainer.win-selectionstylefilled .win-itembox {
-    background-color: Window;
-    color: WindowText;
-  }
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-itembox,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-itembox {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-listview.win-selectionstylefilled .win-container.win-selected .win-itembox,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-selected:hover .win-itembox,
-  .win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-itembox,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-selected:hover .win-itembox {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-listview:not(.win-selectionstylefilled) .win-container.win-selected .win-selectionborder,
-  .win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected .win-selectionborder {
-    border-color: Highlight;
-  }
-  .win-listview.win-selectionstylefilled .win-container.win-selected .win-selectionborder,
-  .win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-selectionborder {
-    border-color: transparent;
-  }
-  html.win-hoverable .win-listview:not(.win-selectionstylefilled) .win-container.win-selected:hover .win-selectionborder,
-  html.win-hoverable .win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected:hover .win-selectionborder {
-    border-color: Highlight;
-  }
-  .win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,
-  .win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-listview.win-selectionstylefilled .win-selectioncheckmarkbackground,
-  .win-itemcontainer.win-selectionstylefilled .win-selectioncheckmarkbackground {
-    border-color: transparent;
-  }
-  .win-listview.win-selectionstylefilled .win-selected a,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover a,
-  .win-listview.win-selectionstylefilled .win-selected progress,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,
-  .win-listview.win-selectionstylefilled .win-selected .win-rating .win-star:after,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star:after,
-  .win-itemcontainer.win-selectionstylefilled.win-selected a,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover a,
-  .win-itemcontainer.win-selectionstylefilled.win-selected progress,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,
-  .win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star:after,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star:after {
-    color: HighlightText;
-  }
-  .win-listview.win-selectionstylefilled .win-selected input,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input,
-  .win-listview.win-selectionstylefilled .win-selected input::-ms-check,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-check,
-  .win-listview.win-selectionstylefilled .win-selected input::-ms-value,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-value,
-  .win-listview.win-selectionstylefilled .win-selected input::-ms-track,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-track,
-  .win-listview.win-selectionstylefilled .win-selected button,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover button,
-  .win-listview.win-selectionstylefilled .win-selected progress,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,
-  .win-listview.win-selectionstylefilled .win-selected progress::-ms-fill,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress::-ms-fill,
-  .win-listview.win-selectionstylefilled .win-selected select,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover select,
-  .win-listview.win-selectionstylefilled .win-selected textarea,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover textarea,
-  .win-listview.win-selectionstylefilled.win-selected input,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input,
-  .win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-check,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-check,
-  .win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-value,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-value,
-  .win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-track,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-track,
-  .win-itemcontainer.win-selectionstylefilled.win-selected button,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover button,
-  .win-itemcontainer.win-selectionstylefilled.win-selected progress,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,
-  .win-itemcontainer.win-selectionstylefilled.win-selected progress::-ms-fill,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress::-ms-fill,
-  .win-itemcontainer.win-selectionstylefilled.win-selected select,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover select,
-  .win-itemcontainer.win-selectionstylefilled.win-selected textarea,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover textarea {
-    border-color: HighlightText;
-  }
-  .win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-lower,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input[type=range]::-ms-fill-lower,
-  .win-listview.win-selectionstylefilled .win-selected progress::-ms-fill,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress::-ms-fill,
-  .win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-lower,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input[type=range]::-ms-fill-lower,
-  .win-itemcontainer.win-selectionstylefilled.win-selected progress::-ms-fill,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress::-ms-fill {
-    background-color: HighlightText;
-  }
-  .win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-upper,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input[type=range]::-ms-fill-upper,
-  .win-listview.win-selectionstylefilled .win-selected progress,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,
-  .win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-upper,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input[type=range]::-ms-fill-upper,
-  .win-itemcontainer.win-selectionstylefilled.win-selected progress,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress {
-    background-color: Highlight;
-  }
-  .win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-full:before,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star.win-full:before,
-  .win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-full:before,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star.win-full:before {
-    color: ButtonFace;
-  }
-  .win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-empty:before,
-  html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star.win-empty:before,
-  .win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-empty:before,
-  html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star.win-empty:before {
-    color: Highlight;
-  }
-  html.win-hoverable .win-listview .win-container:hover,
-  html.win-hoverable .win-itemcontainer.win-container:hover {
-    outline: Highlight solid 3px;
-  }
-}
-.win-flipview {
-  overflow: hidden;
-  height: 400px;
-  /* Necessary for detecting element resize */
-  position: relative;
-}
-.win-flipview .win-surface {
-  -ms-scroll-chaining: none;
-}
-.win-flipview .win-navleft {
-  left: 0%;
-  top: 50%;
-  margin-top: -19px;
-}
-.win-flipview .win-navright {
-  left: 100%;
-  top: 50%;
-  margin-left: -20px;
-  margin-top: -19px;
-}
-.win-flipview .win-navtop {
-  left: 50%;
-  top: 0%;
-  margin-left: -35px;
-}
-.win-flipview .win-navbottom {
-  left: 50%;
-  top: 100%;
-  margin-left: -35px;
-  margin-top: -36px;
-}
-.win-flipview .win-navbutton {
-  touch-action: manipulation;
-  border: none;
-  width: 20px;
-  height: 36px;
-  z-index: 1;
-  position: absolute;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-size: 16px;
-  padding: 0;
-  min-width: 0;
-}
-.win-flipview .win-item,
-.win-flipview .win-item > .win-template {
-  height: 100%;
-  width: 100%;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-align: center;
-  -webkit-align-items: center;
-  align-items: center;
-  -ms-flex-pack: center;
-  -webkit-justify-content: center;
-  justify-content: center;
-}
-@media (-ms-high-contrast) {
-  .win-flipview .win-navbottom {
-    left: 50%;
-    top: 100%;
-    margin-left: -35px;
-    margin-top: -35px;
-  }
-  .win-flipview .win-navbutton {
-    background-color: ButtonFace;
-    color: ButtonText;
-    border: 2px solid ButtonText;
-    width: 65px;
-    height: 35px;
-  }
-  .win-flipview .win-navbutton.win-navbutton:hover:active,
-  .win-flipview .win-navbutton.win-navbutton:active {
-    background-color: ButtonText;
-    color: ButtonFace;
-  }
-  .win-flipview .win-navright {
-    margin-left: -65px;
-  }
-  html.win-hoverable .win-flipview .win-navbutton:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-}
-.win-datepicker {
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  height: auto;
-  width: auto;
-}
-.win-datepicker select {
-  min-width: 80px;
-  margin-top: 4px;
-  margin-bottom: 4px;
-}
-.win-datepicker .win-datepicker-month {
-  margin-right: 20px;
-}
-.win-datepicker .win-datepicker-date.win-order0,
-.win-datepicker .win-datepicker-date.win-order1 {
-  margin-right: 20px;
-}
-.win-datepicker .win-datepicker-year.win-order0 {
-  margin-right: 20px;
-}
-.win-datepicker .win-datepicker-month:lang(ar),
-.win-datepicker .win-datepicker-month:lang(dv),
-.win-datepicker .win-datepicker-month:lang(fa),
-.win-datepicker .win-datepicker-month:lang(he),
-.win-datepicker .win-datepicker-month:lang(ku-Arab),
-.win-datepicker .win-datepicker-month:lang(pa-Arab),
-.win-datepicker .win-datepicker-month:lang(prs),
-.win-datepicker .win-datepicker-month:lang(ps),
-.win-datepicker .win-datepicker-month:lang(sd-Arab),
-.win-datepicker .win-datepicker-month:lang(syr),
-.win-datepicker .win-datepicker-month:lang(ug),
-.win-datepicker .win-datepicker-month:lang(ur),
-.win-datepicker .win-datepicker-month:lang(qps-plocm),
-.win-datepicker .win-datepicker-date.win-order0:lang(ar),
-.win-datepicker .win-datepicker-date.win-order0:lang(dv),
-.win-datepicker .win-datepicker-date.win-order0:lang(fa),
-.win-datepicker .win-datepicker-date.win-order0:lang(he),
-.win-datepicker .win-datepicker-date.win-order0:lang(ku-Arab),
-.win-datepicker .win-datepicker-date.win-order0:lang(pa-Arab),
-.win-datepicker .win-datepicker-date.win-order0:lang(prs),
-.win-datepicker .win-datepicker-date.win-order0:lang(ps),
-.win-datepicker .win-datepicker-date.win-order0:lang(sd-Arab),
-.win-datepicker .win-datepicker-date.win-order0:lang(syr),
-.win-datepicker .win-datepicker-date.win-order0:lang(ug),
-.win-datepicker .win-datepicker-date.win-order0:lang(ur),
-.win-datepicker .win-datepicker-date.win-order0:lang(qps-plocm),
-.win-datepicker .win-datepicker-date.win-order1:lang(ar),
-.win-datepicker .win-datepicker-date.win-order1:lang(dv),
-.win-datepicker .win-datepicker-date.win-order1:lang(fa),
-.win-datepicker .win-datepicker-date.win-order1:lang(he),
-.win-datepicker .win-datepicker-date.win-order1:lang(ku-Arab),
-.win-datepicker .win-datepicker-date.win-order1:lang(pa-Arab),
-.win-datepicker .win-datepicker-date.win-order1:lang(prs),
-.win-datepicker .win-datepicker-date.win-order1:lang(ps),
-.win-datepicker .win-datepicker-date.win-order1:lang(sd-Arab),
-.win-datepicker .win-datepicker-date.win-order1:lang(syr),
-.win-datepicker .win-datepicker-date.win-order1:lang(ug),
-.win-datepicker .win-datepicker-date.win-order1:lang(ur),
-.win-datepicker .win-datepicker-date.win-order1:lang(qps-plocm),
-.win-datepicker .win-datepicker-year.win-order0:lang(ar),
-.win-datepicker .win-datepicker-year.win-order0:lang(dv),
-.win-datepicker .win-datepicker-year.win-order0:lang(fa),
-.win-datepicker .win-datepicker-year.win-order0:lang(he),
-.win-datepicker .win-datepicker-year.win-order0:lang(ku-Arab),
-.win-datepicker .win-datepicker-year.win-order0:lang(pa-Arab),
-.win-datepicker .win-datepicker-year.win-order0:lang(prs),
-.win-datepicker .win-datepicker-year.win-order0:lang(ps),
-.win-datepicker .win-datepicker-year.win-order0:lang(sd-Arab),
-.win-datepicker .win-datepicker-year.win-order0:lang(syr),
-.win-datepicker .win-datepicker-year.win-order0:lang(ug),
-.win-datepicker .win-datepicker-year.win-order0:lang(ur),
-.win-datepicker .win-datepicker-year.win-order0:lang(qps-plocm) {
-  margin-right: 0;
-  margin-left: 20px;
-}
-.win-timepicker {
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  height: auto;
-  width: auto;
-}
-.win-timepicker select {
-  min-width: 80px;
-  margin-top: 4px;
-  margin-bottom: 4px;
-}
-.win-timepicker .win-timepicker-hour {
-  margin-right: 20px;
-}
-.win-timepicker .win-timepicker-period.win-order0 {
-  margin-right: 20px;
-}
-.win-timepicker .win-timepicker-minute.win-order1 {
-  margin-right: 20px;
-}
-.win-timepicker .win-timepicker-period.win-order0:lang(ar),
-.win-timepicker .win-timepicker-period.win-order0:lang(dv),
-.win-timepicker .win-timepicker-period.win-order0:lang(fa),
-.win-timepicker .win-timepicker-period.win-order0:lang(he),
-.win-timepicker .win-timepicker-period.win-order0:lang(ku-Arab),
-.win-timepicker .win-timepicker-period.win-order0:lang(pa-Arab),
-.win-timepicker .win-timepicker-period.win-order0:lang(prs),
-.win-timepicker .win-timepicker-period.win-order0:lang(ps),
-.win-timepicker .win-timepicker-period.win-order0:lang(sd-Arab),
-.win-timepicker .win-timepicker-period.win-order0:lang(syr),
-.win-timepicker .win-timepicker-period.win-order0:lang(ug),
-.win-timepicker .win-timepicker-period.win-order0:lang(ur),
-.win-timepicker .win-timepicker-period.win-order0:lang(qps-plocm),
-.win-timepicker .win-timepicker-hour:lang(ar),
-.win-timepicker .win-timepicker-hour:lang(dv),
-.win-timepicker .win-timepicker-hour:lang(fa),
-.win-timepicker .win-timepicker-hour:lang(he),
-.win-timepicker .win-timepicker-hour:lang(ku-Arab),
-.win-timepicker .win-timepicker-hour:lang(pa-Arab),
-.win-timepicker .win-timepicker-hour:lang(prs),
-.win-timepicker .win-timepicker-hour:lang(ps),
-.win-timepicker .win-timepicker-hour:lang(sd-Arab),
-.win-timepicker .win-timepicker-hour:lang(syr),
-.win-timepicker .win-timepicker-hour:lang(ug),
-.win-timepicker .win-timepicker-hour:lang(ur),
-.win-timepicker .win-timepicker-hour:lang(qps-plocm) {
-  margin-right: 0;
-  margin-left: 20px;
-}
-.win-timepicker .win-timepicker-minute.win-order1:lang(ar),
-.win-timepicker .win-timepicker-minute.win-order1:lang(dv),
-.win-timepicker .win-timepicker-minute.win-order1:lang(fa),
-.win-timepicker .win-timepicker-minute.win-order1:lang(he),
-.win-timepicker .win-timepicker-minute.win-order1:lang(ku-Arab),
-.win-timepicker .win-timepicker-minute.win-order1:lang(pa-Arab),
-.win-timepicker .win-timepicker-minute.win-order1:lang(prs),
-.win-timepicker .win-timepicker-minute.win-order1:lang(ps),
-.win-timepicker .win-timepicker-minute.win-order1:lang(sd-Arab),
-.win-timepicker .win-timepicker-minute.win-order1:lang(syr),
-.win-timepicker .win-timepicker-minute.win-order1:lang(ug),
-.win-timepicker .win-timepicker-minute.win-order1:lang(ur),
-.win-timepicker .win-timepicker-minute.win-order1:lang(qps-plocm),
-.win-timepicker .win-timepicker-minute.win-order0:lang(ar),
-.win-timepicker .win-timepicker-minute.win-order0:lang(dv),
-.win-timepicker .win-timepicker-minute.win-order0:lang(fa),
-.win-timepicker .win-timepicker-minute.win-order0:lang(he),
-.win-timepicker .win-timepicker-minute.win-order0:lang(ku-Arab),
-.win-timepicker .win-timepicker-minute.win-order0:lang(pa-Arab),
-.win-timepicker .win-timepicker-minute.win-order0:lang(prs),
-.win-timepicker .win-timepicker-minute.win-order0:lang(ps),
-.win-timepicker .win-timepicker-minute.win-order0:lang(sd-Arab),
-.win-timepicker .win-timepicker-minute.win-order0:lang(syr),
-.win-timepicker .win-timepicker-minute.win-order0:lang(ug),
-.win-timepicker .win-timepicker-minute.win-order0:lang(ur),
-.win-timepicker .win-timepicker-minute.win-order0:lang(qps-plocm) {
-  margin-left: 20px;
-  margin-right: 0;
-}
-body > .win-navigation-backbutton {
-  position: absolute;
-  top: 50px;
-  left: 20px;
-}
-.win-backbutton,
-.win-navigation-backbutton,
-.win-back {
-  touch-action: manipulation;
-  display: inline-block;
-  min-width: 0;
-  min-height: 0;
-  padding: 0;
-  text-align: center;
-  width: 41px;
-  height: 41px;
-  font-size: 24px;
-  line-height: 41px;
-  vertical-align: baseline;
-}
-.win-backbutton::before,
-.win-back::before {
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-weight: normal;
-  content: "\E0D5";
-  vertical-align: 50%;
-}
-.win-backbutton:lang(ar)::before,
-.win-backbutton:lang(dv)::before,
-.win-backbutton:lang(fa)::before,
-.win-backbutton:lang(he)::before,
-.win-backbutton:lang(ku-Arab)::before,
-.win-backbutton:lang(pa-Arab)::before,
-.win-backbutton:lang(prs)::before,
-.win-backbutton:lang(ps)::before,
-.win-backbutton:lang(sd-Arab)::before,
-.win-backbutton:lang(syr)::before,
-.win-backbutton:lang(ug)::before,
-.win-backbutton:lang(ur)::before,
-.win-backbutton:lang(qps-plocm)::before,
-.win-back:lang(ar)::before,
-.win-back:lang(dv)::before,
-.win-back:lang(fa)::before,
-.win-back:lang(he)::before,
-.win-back:lang(ku-Arab)::before,
-.win-back:lang(pa-Arab)::before,
-.win-back:lang(prs)::before,
-.win-back:lang(ps)::before,
-.win-back:lang(sd-Arab)::before,
-.win-back:lang(syr)::before,
-.win-back:lang(ug)::before,
-.win-back:lang(ur)::before,
-.win-back:lang(qps-plocm)::before {
-  content: "\E0AE";
-}
-button.win-navigation-backbutton,
-button.win-navigation-backbutton:active,
-html.win-hoverable button.win-navigation-backbutton:enabled:hover,
-button.win-navigation-backbutton:enabled:hover:active {
-  background-color: transparent;
-  border: none;
-}
-@media (-ms-high-contrast) {
-  button.win-navigation-backbutton,
-  button.win-navigation-backbutton:active,
-  html.win-hoverable button.win-navigation-backbutton:enabled:hover,
-  button.win-navigation-backbutton:enabled:hover:active {
-    /* Overwrite default background and border styles from BackButton control's <button> element */
-    background-color: transparent;
-    border: none;
-  }
-  .win-backbutton,
-  .win-back {
-    background-color: ButtonFace;
-    border-color: ButtonText;
-    color: ButtonText;
-  }
-  .win-backbutton.win-backbutton:enabled:hover:active,
-  .win-navigation-backbutton.win-navigation-backbutton:enabled:hover:active .win-back {
-    background-clip: border-box;
-    background-color: ButtonText;
-    border-color: transparent;
-    color: ButtonFace;
-  }
-  .win-backbutton:disabled,
-  .win-navigation-backbutton:disabled .win-back,
-  .win-backbutton:disabled:active,
-  .win-navigation-backbutton:disabled:active .win-back {
-    background-color: ButtonFace;
-    border-color: GrayText;
-    color: GrayText;
-  }
-  .win-backbutton:-ms-keyboard-active,
-  .win-navigation-backbutton:-ms-keyboard-active .win-back {
-    background-clip: border-box;
-    background-color: ButtonText;
-    border-color: transparent;
-    color: ButtonFace;
-  }
-  html.win-hoverable .win-backbutton:enabled:hover,
-  html.win-hoverable .win-navigation-backbutton:enabled:hover .win-back {
-    background-color: Highlight;
-    border-color: ButtonText;
-    color: HighlightText;
-  }
-}
-.win-tooltip {
-  display: block;
-  position: fixed;
-  top: 30px;
-  left: 30px;
-  max-width: 320px;
-  box-sizing: border-box;
-  margin: 0;
-  padding: 4px 7px 6px 7px;
-  border-style: solid;
-  border-width: 1px;
-  z-index: 9999;
-  word-wrap: break-word;
-  animation-fill-mode: both;
-  font-size: 12px;
-  font-weight: 400;
-  line-height: 1.167;
-}
-.win-tooltip-phantom {
-  display: block;
-  position: fixed;
-  top: 30px;
-  left: 30px;
-  background-color: transparent;
-  border-width: 0;
-  margin: 0;
-  padding: 0;
-}
-@media (-ms-high-contrast) {
-  .win-tooltip {
-    background-color: Window;
-    border-color: WindowText;
-    color: WindowText;
-  }
-}
-.win-rating {
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  -ms-flex-pack: self;
-  -webkit-justify-content: self;
-  justify-content: self;
-  -ms-flex-align: stretch;
-  -webkit-align-items: stretch;
-  align-items: stretch;
-  height: auto;
-  width: auto;
-  white-space: normal;
-  outline: 0;
-}
-.win-rating .win-star {
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  height: 24px;
-  width: 24px;
-  padding: 9px 10px 11px 10px;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-size: 24px;
-  overflow: hidden;
-  text-indent: 0;
-  line-height: 1;
-  cursor: default;
-  position: relative;
-  letter-spacing: 0;
-  -ms-touch-action: none;
-  touch-action: none;
-}
-.win-rating.win-small .win-star {
-  width: 12px;
-  height: 12px;
-  font-size: 12px;
-  padding: 3px 4px 5px 4px;
-}
-.win-rating .win-star:before {
-  content: "\E082";
-}
-.win-rating .win-star.win-disabled {
-  cursor: default;
-  -ms-touch-action: auto;
-  touch-action: auto;
-}
-@media (-ms-high-contrast) {
-  .win-rating .win-star:before {
-    content: "\E082" !important;
-  }
-  .win-rating .win-star.win-full {
-    color: HighLight;
-  }
-  .win-rating .win-star.win-tentative.win-full {
-    color: ButtonText;
-  }
-  .win-rating .win-star.win-empty {
-    color: ButtonFace;
-  }
-  .win-rating .win-star:after {
-    content: "\E224" !important;
-    position: relative;
-    top: -100%;
-    color: ButtonText;
-  }
-}
-.win-toggleswitch {
-  outline: 0;
-}
-.win-toggleswitch .win-toggleswitch-header {
-  max-width: 470px;
-  margin-bottom: 14px;
-  margin-top: 22px;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-toggleswitch .win-toggleswitch-values {
-  display: inline-block;
-  vertical-align: top;
-}
-.win-toggleswitch .win-toggleswitch-value {
-  margin-left: 12px;
-  height: 20px;
-  vertical-align: top;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 20px;
-}
-.win-toggleswitch .win-toggleswitch-description {
-  font-size: 12px;
-  width: 22em;
-  margin-top: 28px;
-  display: none;
-}
-.win-toggleswitch .win-toggleswitch-clickregion {
-  display: inline-block;
-  touch-action: none;
-  -ms-user-select: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  user-select: none;
-  padding-top: 5px;
-}
-.win-toggleswitch .win-toggleswitch-track {
-  position: relative;
-  display: inline-block;
-  width: 44px;
-  height: 20px;
-  border-style: solid;
-  border-width: 2px;
-  border-radius: 10px;
-  box-sizing: border-box;
-}
-.win-toggleswitch .win-toggleswitch-thumb {
-  position: absolute;
-  top: 3px;
-  display: inline-block;
-  width: 10px;
-  height: 10px;
-  border-radius: 5px;
-  -webkit-transition: left 0.1s;
-  transition: left 0.1s;
-}
-.win-toggleswitch:focus .win-toggleswitch-clickregion {
-  outline-width: 1px;
-  outline-style: dotted;
-}
-.win-toggleswitch.win-toggleswitch-dragging .win-toggleswitch-thumb {
-  -webkit-transition: none;
-  transition: none;
-}
-.win-toggleswitch.win-toggleswitch-off .win-toggleswitch-value-on {
-  visibility: hidden;
-  height: 0;
-  font-size: 0;
-  line-height: 0;
-}
-.win-toggleswitch.win-toggleswitch-on .win-toggleswitch-value-off {
-  visibility: hidden;
-  height: 0;
-  font-size: 0;
-  line-height: 0;
-}
-.win-toggleswitch.win-toggleswitch-on .win-toggleswitch-thumb {
-  left: 27px;
-}
-.win-toggleswitch.win-toggleswitch-off .win-toggleswitch-thumb {
-  left: 3px;
-}
-.win-toggleswitch:lang(ar),
-.win-toggleswitch:lang(dv),
-.win-toggleswitch:lang(fa),
-.win-toggleswitch:lang(he),
-.win-toggleswitch:lang(ku-Arab),
-.win-toggleswitch:lang(pa-Arab),
-.win-toggleswitch:lang(prs),
-.win-toggleswitch:lang(ps),
-.win-toggleswitch:lang(sd-Arab),
-.win-toggleswitch:lang(syr),
-.win-toggleswitch:lang(ug),
-.win-toggleswitch:lang(ur),
-.win-toggleswitch:lang(qps-plocm) {
-  direction: rtl;
-}
-.win-toggleswitch:lang(ar).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(dv).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(fa).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(he).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ku-Arab).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(pa-Arab).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(prs).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ps).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(sd-Arab).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(syr).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ug).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ur).win-toggleswitch-on .win-toggleswitch-thumb,
-.win-toggleswitch:lang(qps-plocm).win-toggleswitch-on .win-toggleswitch-thumb {
-  left: 3px;
-}
-.win-toggleswitch:lang(ar).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(dv).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(fa).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(he).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ku-Arab).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(pa-Arab).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(prs).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ps).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(sd-Arab).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(syr).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ug).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(ur).win-toggleswitch-off .win-toggleswitch-thumb,
-.win-toggleswitch:lang(qps-plocm).win-toggleswitch-off .win-toggleswitch-thumb {
-  left: 27px;
-}
-.win-semanticzoom {
-  touch-action: pan-x pan-y double-tap-zoom;
-  height: 400px;
-  /* Necessary to detect element resize */
-  position: relative;
-}
-.win-semanticzoom .win-listview > .win-viewport * {
-  touch-action: auto;
-}
-.win-semanticzoom * {
-  touch-action: inherit;
-}
-.win-semanticzoom-button {
-  z-index: 100;
-  position: absolute;
-  min-width: 25px;
-  min-height: 25px;
-  width: 25px;
-  height: 25px;
-  padding: 0px;
-  bottom: 21px;
-  touch-action: none;
-}
-.win-semanticzoom-button::before {
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-weight: normal;
-  font-size: 11px;
-  content: "\E0B8";
-  /* minus sign */
-}
-.win-semanticzoom-button-location {
-  left: auto;
-  right: 4px;
-}
-.win-semanticzoom-button-location:lang(ar),
-.win-semanticzoom-button-location:lang(dv),
-.win-semanticzoom-button-location:lang(fa),
-.win-semanticzoom-button-location:lang(he),
-.win-semanticzoom-button-location:lang(ku-Arab),
-.win-semanticzoom-button-location:lang(pa-Arab),
-.win-semanticzoom-button-location:lang(prs),
-.win-semanticzoom-button-location:lang(ps),
-.win-semanticzoom-button-location:lang(sd-Arab),
-.win-semanticzoom-button-location:lang(syr),
-.win-semanticzoom-button-location:lang(ug),
-.win-semanticzoom-button-location:lang(ur),
-.win-semanticzoom-button-location:lang(qps-plocm) {
-  left: 4px;
-  right: auto;
-}
-@media (-ms-high-contrast) {
-  .win-semanticzoom-button {
-    background-color: ButtonFace;
-    border-color: ButtonText;
-    color: ButtonText;
-  }
-  .win-semanticzoom-button.win-semanticzoom-button:hover:active {
-    background-clip: border-box;
-    background-color: ButtonText;
-    border-color: transparent;
-    color: ButtonFace;
-  }
-  .win-semanticzoom-button:-ms-keyboard-active {
-    background-clip: border-box;
-    background-color: ButtonText;
-    border-color: transparent;
-    color: ButtonFace;
-  }
-  html.win-hoverable .win-semanticzoom-button:hover {
-    background-color: Highlight;
-    border-color: ButtonText;
-    color: HighlightText;
-  }
-}
-.win-pivot {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-wrap: none;
-  -webkit-flex-wrap: nowrap;
-  flex-wrap: nowrap;
-  height: 100%;
-  width: 100%;
-  overflow: hidden;
-  -ms-scroll-limit-x-max: 0px;
-  touch-action: manipulation;
-  /* Necessary for detecting when this element has resized */
-  position: relative;
-}
-.win-pivot .win-pivot-navbutton {
-  touch-action: manipulation;
-  position: absolute;
-  width: 20px;
-  height: 36px;
-  padding: 0px;
-  margin: 0px;
-  top: 10px;
-  min-width: 0px;
-  border-width: 0px;
-  cursor: pointer;
-  opacity: 0;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-}
-.win-pivot .win-pivot-headers.win-pivot-shownavbuttons .win-pivot-navbutton {
-  opacity: 1;
-}
-.win-pivot .win-pivot-headers .win-pivot-navbutton-prev:before {
-  content: "\E096";
-}
-.win-pivot .win-pivot-headers .win-pivot-navbutton-next:before {
-  content: "\E09B";
-}
-.win-pivot .win-pivot-title {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  font-family: "Segoe UI", sans-serif, "Segoe MDL2 Assets", "Symbols", "Segoe UI Emoji";
-  font-size: 15px;
-  font-weight: bold;
-  white-space: nowrap;
-  margin: 14px 0 13px 24px;
-}
-.win-pivot .win-pivot-title:lang(ar),
-.win-pivot .win-pivot-title:lang(dv),
-.win-pivot .win-pivot-title:lang(fa),
-.win-pivot .win-pivot-title:lang(he),
-.win-pivot .win-pivot-title:lang(ku-Arab),
-.win-pivot .win-pivot-title:lang(pa-Arab),
-.win-pivot .win-pivot-title:lang(prs),
-.win-pivot .win-pivot-title:lang(ps),
-.win-pivot .win-pivot-title:lang(sd-Arab),
-.win-pivot .win-pivot-title:lang(syr),
-.win-pivot .win-pivot-title:lang(ug),
-.win-pivot .win-pivot-title:lang(ur),
-.win-pivot .win-pivot-title:lang(qps-plocm) {
-  margin: 14px 24px 13px 0;
-}
-.win-pivot > .win-pivot-item {
-  /*
-        Hide the pivot items defined declaratively until we reparent them to ensure correct
-        measuring and to avoid showing unprocessed content in the wrong location.
-        */
-  display: none;
-}
-.win-pivot .win-pivot-header-area {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-}
-.win-pivot .win-pivot-header-leftcustom,
-.win-pivot .win-pivot-header-rightcustom {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  margin-top: 13px;
-}
-.win-pivot .win-pivot-header-items {
-  -ms-flex: 1 1 0%;
-  -webkit-flex: 1 1 0%;
-  flex: 1 1 0%;
-  overflow-x: hidden;
-  padding: 1px;
-}
-.win-pivot .win-pivot-headers {
-  white-space: nowrap;
-  position: relative;
-  overflow-y: visible;
-  height: 48px;
-  touch-action: none;
-  -ms-touch-action: none;
-  outline: 0;
-}
-.win-pivot .win-pivot-headers.win-keyboard:focus {
-  outline-style: dotted;
-  outline-width: 1px;
-}
-.win-pivot .win-pivot-header,
-.win-pivot .win-pivot-header.win-pivot-header:hover:active {
-  touch-action: manipulation;
-  font-size: 24px;
-  font-weight: 300;
-  line-height: 1.167;
-  display: inline-block;
-  transition: opacity linear 167ms;
-  -webkit-transition: opacity linear 167ms;
-  overflow: hidden;
-  height: 30px;
-  border: 0;
-  padding: 0;
-  outline: 0;
-  margin: 12px 12px 0px 12px;
-  min-height: 0;
-  min-width: 0;
-}
-.win-pivot.win-pivot-locked .win-pivot-header {
-  opacity: 0;
-  visibility: hidden;
-}
-.win-pivot .win-pivot-header.win-pivot-header-selected,
-.win-pivot.win-pivot-locked .win-pivot-header.win-pivot-header-selected {
-  opacity: 1.0;
-  visibility: inherit;
-}
-.win-pivot .win-pivot-viewport {
-  /* Overlap the headers but not the title */
-  height: 100%;
-  overflow-x: auto;
-  overflow-y: hidden;
-  -ms-scroll-snap-type: mandatory;
-  -ms-scroll-snap-points-x: snapInterval(0%, 100%);
-  -ms-overflow-style: none;
-  /* The following 3 styles take advantage of a Trident bug to make the viewport pannable on the header track. The viewport is extended over the
-            header track space, and position: relative allows interacting with it as if the viewport was drawn over the header track.
-        */
-  position: relative;
-  padding-top: 48px;
-  margin-top: -48px;
-}
-.win-pivot.win-pivot-customheaders .win-pivot-viewport {
-  padding-top: inherit;
-  margin-top: inherit;
-}
-.win-pivot.win-pivot-mouse .win-pivot-viewport {
-  padding-top: 0px;
-  margin-top: 0px;
-}
-.win-pivot.win-pivot-locked .win-pivot-viewport {
-  overflow: hidden;
-}
-.win-pivot .win-pivot-surface {
-  /* Surface is 3x of viewport to allow panning. */
-  width: 300%;
-  height: 100%;
-  position: relative;
-}
-html.win-hoverable .win-pivot button.win-pivot-header:hover {
-  background-color: transparent;
-  border: 0;
-  padding: 0;
-  letter-spacing: 0px;
-  margin: 12px 12px 0px 12px;
-  min-height: 0;
-  min-width: 0;
-}
-html.win-hoverable .win-pivot .win-pivot-navbutton:hover {
-  margin: 0px;
-  padding: 0px;
-  border-width: 0px;
-  cursor: pointer;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-}
-/*
-    PivotItem
-*/
-.win-pivot-item {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  /* Since the surface is 3x in width, 33.3% here means the size of the viewport. */
-  width: 33.3%;
-  left: 33.3%;
-}
-.win-pivot-item:lang(ar),
-.win-pivot-item:lang(dv),
-.win-pivot-item:lang(fa),
-.win-pivot-item:lang(he),
-.win-pivot-item:lang(ku-Arab),
-.win-pivot-item:lang(pa-Arab),
-.win-pivot-item:lang(prs),
-.win-pivot-item:lang(ps),
-.win-pivot-item:lang(sd-Arab),
-.win-pivot-item:lang(syr),
-.win-pivot-item:lang(ug),
-.win-pivot-item:lang(ur),
-.win-pivot-item:lang(qps-plocm) {
-  left: auto;
-  right: 33.3%;
-}
-.win-pivot-item .win-pivot-item-content {
-  height: 100%;
-  overflow-y: auto;
-  -ms-overflow-style: -ms-autohiding-scrollbar;
-  padding: 0px 24px;
-}
-/*
-    Modified styles for when the Pivot is in nosnap mode
-*/
-.win-pivot.win-pivot-nosnap .win-pivot-viewport {
-  padding-top: 0px;
-  margin-top: 0px;
-  overflow: hidden;
-}
-.win-pivot.win-pivot-nosnap .win-pivot-surface,
-.win-pivot.win-pivot-nosnap .win-pivot-item {
-  width: 100%;
-  position: static;
-}
-.win-hub {
-  height: 100%;
-  width: 100%;
-  /* Necessary for detecting when this element has resized */
-  position: relative;
-}
-.win-hub-progress {
-  position: absolute;
-  top: 10px;
-  width: 100%;
-  z-index: 1;
-}
-.win-hub-viewport {
-  height: 100%;
-  width: 100%;
-  -ms-scroll-snap-type: proximity;
-  -webkit-overflow-scrolling: touch;
-}
-.win-hub-horizontal .win-hub-viewport {
-  overflow-x: auto;
-  overflow-y: hidden;
-  white-space: nowrap;
-}
-.win-hub-vertical .win-hub-viewport {
-  position: relative;
-  overflow-y: auto;
-  overflow-x: hidden;
-}
-.win-hub-surface {
-  display: inline-block;
-}
-.win-hub-vertical .win-hub-surface {
-  width: calc(100% - 24px);
-  padding: 0px 12px 8px 12px;
-  margin-top: -24px;
-  /* Keep in sync w/ hub-section padding-top */
-}
-.win-hub-horizontal .win-hub-surface {
-  height: 100%;
-  padding-left: 12px;
-}
-.win-hub-horizontal .win-hub-surface:lang(ar),
-.win-hub-horizontal .win-hub-surface:lang(dv),
-.win-hub-horizontal .win-hub-surface:lang(fa),
-.win-hub-horizontal .win-hub-surface:lang(he),
-.win-hub-horizontal .win-hub-surface:lang(ku-Arab),
-.win-hub-horizontal .win-hub-surface:lang(pa-Arab),
-.win-hub-horizontal .win-hub-surface:lang(prs),
-.win-hub-horizontal .win-hub-surface:lang(ps),
-.win-hub-horizontal .win-hub-surface:lang(sd-Arab),
-.win-hub-horizontal .win-hub-surface:lang(syr),
-.win-hub-horizontal .win-hub-surface:lang(ug),
-.win-hub-horizontal .win-hub-surface:lang(ur),
-.win-hub-horizontal .win-hub-surface:lang(qps-plocm) {
-  padding-left: 0;
-  padding-right: 12px;
-}
-.win-hub-section {
-  display: inline-block;
-  vertical-align: top;
-  white-space: normal;
-}
-.win-hub-horizontal .win-hub-section {
-  height: 100%;
-  padding-right: 24px;
-}
-.win-hub-horizontal .win-hub-section:lang(ar),
-.win-hub-horizontal .win-hub-section:lang(dv),
-.win-hub-horizontal .win-hub-section:lang(fa),
-.win-hub-horizontal .win-hub-section:lang(he),
-.win-hub-horizontal .win-hub-section:lang(ku-Arab),
-.win-hub-horizontal .win-hub-section:lang(pa-Arab),
-.win-hub-horizontal .win-hub-section:lang(prs),
-.win-hub-horizontal .win-hub-section:lang(ps),
-.win-hub-horizontal .win-hub-section:lang(sd-Arab),
-.win-hub-horizontal .win-hub-section:lang(syr),
-.win-hub-horizontal .win-hub-section:lang(ug),
-.win-hub-horizontal .win-hub-section:lang(ur),
-.win-hub-horizontal .win-hub-section:lang(qps-plocm) {
-  padding-right: 0;
-  padding-left: 24px;
-}
-.win-hub-horizontal .win-hub-section-header {
-  margin-top: 62px;
-}
-.win-hub-vertical .win-hub-section {
-  width: 100%;
-  padding-top: 24px;
-  /* Keep in sync w/ hub-surface margin-top */
-}
-.win-hub-section-header {
-  margin-bottom: 9px;
-  height: 28px;
-}
-button.win-hub-section-header-tabstop,
-html.win-hoverable button.win-hub-section-header-tabstop:hover,
-button.win-hub-section-header-tabstop:hover:active {
-  touch-action: manipulation;
-  width: 100%;
-  background-color: transparent;
-  border: 0;
-  min-height: 0;
-  min-width: 0;
-  max-width: 100%;
-  padding: 0;
-}
-button.win-hub-section-header-tabstop:focus {
-  outline: none;
-}
-button.win-hub-section-header-tabstop:-ms-keyboard-active {
-  background-color: transparent;
-}
-.win-hub-section-header-wrapper {
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-align: stretch;
-  -webkit-align-items: stretch;
-  align-items: stretch;
-  width: 100%;
-  outline: none;
-}
-.win-hub-section-header-content {
-  font-size: 20px;
-  font-weight: 400;
-  line-height: 1.5;
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  text-align: left;
-  vertical-align: bottom;
-  overflow: hidden;
-  text-overflow: clip;
-  white-space: nowrap;
-}
-.win-hub-section-header-content:lang(ar),
-.win-hub-section-header-content:lang(dv),
-.win-hub-section-header-content:lang(fa),
-.win-hub-section-header-content:lang(he),
-.win-hub-section-header-content:lang(ku-Arab),
-.win-hub-section-header-content:lang(pa-Arab),
-.win-hub-section-header-content:lang(prs),
-.win-hub-section-header-content:lang(ps),
-.win-hub-section-header-content:lang(sd-Arab),
-.win-hub-section-header-content:lang(syr),
-.win-hub-section-header-content:lang(ug),
-.win-hub-section-header-content:lang(ur),
-.win-hub-section-header-content:lang(qps-plocm) {
-  text-align: right;
-}
-.win-hub-section-header-chevron {
-  display: none;
-}
-.win-hub-section-header-interactive .win-hub-section-header-chevron {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  display: inline-block;
-  margin-left: 24px;
-  line-height: 1.5;
-  padding-top: 7px;
-  text-align: right;
-  vertical-align: bottom;
-}
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ar),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(dv),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(fa),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(he),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ku-Arab),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(pa-Arab),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(prs),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ps),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(sd-Arab),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(syr),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ug),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ur),
-.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(qps-plocm) {
-  text-align: left;
-  margin-left: 0;
-  margin-right: 24px;
-}
-.win-hub-horizontal .win-hub-section-content {
-  height: calc(100% - 99px);
-}
-.win-hub-vertical .win-hub-section-content {
-  width: 100%;
-}
-@media (-ms-high-contrast) {
-  button.win-hub-section-header-tabstop,
-  html.win-hoverable button.win-hub-section-header-tabstop:hover,
-  button.win-hub-section-header-tabstop:hover:active {
-    background-color: transparent;
-    color: WindowText;
-  }
-  button.win-hub-section-header-tabstop:-ms-keyboard-active {
-    color: WindowText;
-  }
-  html.win-hoverable button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover,
-  button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover:active {
-    color: -ms-hotlight;
-  }
-  button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active {
-    color: -ms-hotlight;
-  }
-}
-.win-clickeater {
-  background-color: transparent;
-  width: 110%;
-  height: 110%;
-  left: -5%;
-  top: -5%;
-  position: fixed;
-  touch-action: none;
-  outline: 1px solid Purple;
-  /*Necessary to block passthrough over webviews*/
-  -ms-high-contrast-adjust: none;
-}
-/*
-Command buttons.
-*/
-button.win-command {
-  touch-action: manipulation;
-  background: none;
-  background-clip: border-box;
-  height: auto;
-  padding: 0;
-  margin: 0;
-  border: 1px dotted;
-  /* reserve focus rect */
-  min-width: 40px;
-  min-height: 48px;
-  text-align: center;
-  font-size: 12px;
-  line-height: 16px;
-  font-weight: normal;
-  overflow: visible;
-  /* Commands are lrtb */
-  writing-mode: lr-tb;
-  position: relative;
-  z-index: 0;
-}
-button.win-command::-moz-focus-inner {
-  padding: 0;
-  border: 0;
-}
-button:lang(ar),
-button:lang(dv),
-button:lang(fa),
-button:lang(he),
-button:lang(ku-Arab),
-button:lang(pa-Arab),
-button:lang(prs),
-button:lang(ps),
-button:lang(sd-Arab),
-button:lang(syr),
-button:lang(ug),
-button:lang(ur),
-button:lang(qps-plocm) {
-  writing-mode: rl-tb;
-}
-/*
-Always hide the outline, not just when :focus is applied.
-https://github.com/winjs/winjs/issues/859
-*/
-button.win-command {
-  outline: none;
-}
-/*
-Command button icons.
-*/
-.win-commandicon {
-  display: block;
-  margin: 11px 21px;
-  /* left/right margin: 22px = 1px focus rect + 21px. Affects margin-top of  button.win-command .win-label */
-  min-width: 0;
-  min-height: 0;
-  padding: 0;
-  /* Normal sizing */
-  width: 24px;
-  height: 24px;
-  box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  cursor: default;
-  position: relative;
-  outline: none;
-}
-.win-commandimage {
-  /* Default font for glyphs. */
-  font-family: "Segoe UI Command", "Symbols";
-  letter-spacing: 0;
-  /* Applications provide their own content, like &#xE0D5;. */
-  vertical-align: middle;
-  font-size: 20px;
-  margin: 0;
-  line-height: 24px;
-  /* line-height must match the content box height */
-  background-position: 0 0;
-  background-origin: border-box;
-  display: inline-block;
-  width: 24px;
-  height: 24px;
-  background-size: 96px 48px;
-  outline: none;
-}
-.win-commandimage.win-commandglyph {
-  position: absolute;
-  left: 0;
-}
-/*
-Offsets for sprite versions.
-*/
-html.win-hoverable button:enabled:hover .win-commandimage,
-button:active .win-commandimage {
-  background-position: -24px 0;
-}
-button:enabled:hover:active .win-commandimage.win-commandimage {
-  background-position: -48px 0;
-}
-button:-ms-keyboard-active .win-commandimage {
-  background-position: -48px 0;
-}
-button:disabled .win-commandimage,
-button:disabled:active .win-commandimage {
-  background-position: -72px 0;
-}
-/*
-Offsets for sprite versions in selected state.
-*/
-button[aria-checked=true] .win-commandimage {
-  background-position: 0 -24px;
-}
-html.win-hoverable button[aria-checked=true]:enabled:hover .win-commandimage,
-button[aria-checked=true]:active .win-commandimage {
-  background-position: -24px -24px;
-}
-button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {
-  background-position: -48px -24px;
-}
-button[aria-checked=true]:-ms-keyboard-active .win-commandimage {
-  background-position: -48px -24px;
-}
-button[aria-checked=true]:disabled .win-commandimage,
-button[aria-checked=true]:disabled:active .win-commandimage {
-  background-position: -72px -24px;
-}
-/*
-Command button labels.
-*/
-button.win-command .win-label {
-  font-family: "Segoe UI", sans-serif, "Segoe MDL2 Assets", "Symbols", "Segoe UI Emoji";
-  font-size: 12px;
-  font-weight: 400;
-  line-height: 1.167;
-  position: relative;
-  line-height: 16px;
-  display: block;
-  max-width: 66px;
-  /* 68px button, but allow for 2*1px for focus border on each side */
-  margin-top: -10px;
-  /* 2px = 12px margin-bottom of .win-commandicon  - 10px*/
-  margin-bottom: 6px;
-  padding: 0;
-  overflow: hidden;
-  word-wrap: break-word;
-  word-break: keep-all;
-  outline: none;
-}
-/*
-AppBarCommand separator types.
-*/
-hr.win-command {
-  display: inline-block;
-  padding: 0;
-  margin: 12px 16px;
-  width: 2px;
-  height: 24px;
-  border: 0;
-  vertical-align: top;
-}
-/*
-AppBarCommand content types.
-*/
-div.win-command {
-  display: inline-block;
-  min-width: 0;
-  min-height: 0;
-  padding: 0px 31px;
-  border: 1px dotted;
-  /* reserve focus rect */
-  text-align: center;
-  font-size: 12px;
-  line-height: 16px;
-  font-weight: normal;
-  vertical-align: top;
-  /* Content Commands are lrtb */
-  writing-mode: lr-tb;
-  position: relative;
-}
-div.win-command:lang(ar),
-div.win-command:lang(dv),
-div.win-command:lang(fa),
-div.win-command:lang(he),
-div.win-command:lang(ku-Arab),
-div.win-command:lang(pa-Arab),
-div.win-command:lang(prs),
-div.win-command:lang(ps),
-div.win-command:lang(sd-Arab),
-div.win-command:lang(syr),
-div.win-command:lang(ug),
-div.win-command:lang(ur),
-div.win-command:lang(qps-plocm) {
-  writing-mode: rl-tb;
-}
-div.win-command:focus {
-  outline: none;
-}
-.win-command.win-command-hidden {
-  display: none;
-}
-/*
-AppBar
-*/
-.win-navbar {
-  border-width: 0;
-  width: 100%;
-  height: auto;
-  left: 0;
-  position: fixed;
-  position: -ms-device-fixed;
-  min-height: 48px;
-}
-.win-navbar.win-navbar-minimal {
-  min-height: 25px;
-}
-.win-navbar.win-navbar-minimal.win-navbar-closed .win-navbar-invokebutton .win-navbar-ellipsis {
-  top: 5px;
-}
-.win-navbar.win-navbar-closing.win-navbar-minimal > :not(.win-navbar-invokebutton) {
-  opacity: 0;
-}
-.win-navbar.win-menulayout.win-navbar-closing .win-navbar-menu {
-  opacity: 1;
-}
-.win-navbar.win-navbar-closed.win-navbar-minimal > :not(.win-navbar-invokebutton) {
-  display: none !important;
-}
-.win-navbar.win-navbar-closing.win-navbar-minimal .win-navbar-invokebutton,
-.win-navbar.win-navbar-closed.win-navbar-minimal .win-navbar-invokebutton {
-  width: 100%;
-}
-.win-navbar.win-menulayout.win-navbar-opening .win-navbar-invokebutton,
-.win-navbar.win-menulayout.win-navbar-opened .win-navbar-invokebutton,
-.win-navbar.win-menulayout.win-navbar-closing .win-navbar-invokebutton {
-  visibility: hidden;
-}
-.win-navbar.win-menulayout.win-navbar-opening .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton,
-.win-navbar.win-menulayout.win-navbar-opened .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton,
-.win-navbar.win-menulayout.win-navbar-closing .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton {
-  visibility: visible;
-}
-.win-navbar .win-navbar-invokebutton {
-  touch-action: manipulation;
-  width: 32px;
-  height: 100%;
-  min-height: 25px;
-  position: absolute;
-  right: 0px;
-  margin: 0px;
-  padding: 0px;
-  border: dotted 1px;
-  min-width: 0px;
-  background-clip: border-box;
-  display: none;
-  z-index: 1;
-}
-.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis {
-  width: 32px;
-  height: 100%;
-  right: 0px;
-  top: 15px;
-  position: absolute;
-  display: inline-block;
-  font-size: 14px;
-  text-align: center;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-}
-.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis::before {
-  content: "\E10C";
-  position: relative;
-}
-.win-navbar:lang(ar) .win-navbar-invokebutton,
-.win-navbar:lang(dv) .win-navbar-invokebutton,
-.win-navbar:lang(fa) .win-navbar-invokebutton,
-.win-navbar:lang(he) .win-navbar-invokebutton,
-.win-navbar:lang(ku-Arab) .win-navbar-invokebutton,
-.win-navbar:lang(pa-Arab) .win-navbar-invokebutton,
-.win-navbar:lang(prs) .win-navbar-invokebutton,
-.win-navbar:lang(ps) .win-navbar-invokebutton,
-.win-navbar:lang(sd-Arab) .win-navbar-invokebutton,
-.win-navbar:lang(syr) .win-navbar-invokebutton,
-.win-navbar:lang(ug) .win-navbar-invokebutton,
-.win-navbar:lang(ur) .win-navbar-invokebutton,
-.win-navbar:lang(qps-plocm) .win-navbar-invokebutton,
-.win-navbar:lang(ar) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(dv) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(fa) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(he) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(ku-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(pa-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(prs) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(ps) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(sd-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(syr) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(ug) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(ur) .win-navbar-invokebutton .win-navbar-ellipsis,
-.win-navbar:lang(qps-plocm) .win-navbar-invokebutton .win-navbar-ellipsis {
-  right: auto;
-  left: 0px;
-}
-.win-navbar.win-navbar-minimal .win-navbar-invokebutton,
-.win-navbar.win-navbar-compact .win-navbar-invokebutton {
-  display: block;
-}
-/*
-AppBar commands layout
-*/
-.win-commandlayout {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-wrap: none;
-  -webkit-flex-wrap: nowrap;
-  flex-wrap: nowrap;
-  -ms-flex-pack: center;
-  -webkit-justify-content: center;
-  justify-content: center;
-  -ms-flex-align: start;
-  -webkit-align-items: flex-start;
-  align-items: flex-start;
-}
-.win-commandlayout .win-primarygroup {
-  -ms-flex-order: 2;
-  flex-order: 2;
-  -webkit-order: 2;
-  order: 2;
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-pack: end;
-  -webkit-justify-content: flex-end;
-  justify-content: flex-end;
-  -ms-flex-align: start;
-  -webkit-align-items: flex-start;
-  align-items: flex-start;
-}
-.win-commandlayout .win-secondarygroup {
-  -ms-flex-order: 1;
-  flex-order: 1;
-  -webkit-order: 1;
-  order: 1;
-  display: -ms-inline-flexbox;
-  display: -webkit-inline-flex;
-  display: inline-flex;
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-pack: start;
-  -webkit-justify-content: flex-start;
-  justify-content: flex-start;
-  -ms-flex-align: start;
-  -webkit-align-items: flex-start;
-  align-items: flex-start;
-}
-.win-commandlayout .win-command {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-}
-.win-commandlayout.win-navbar-opening,
-.win-commandlayout.win-navbar-opened,
-.win-commandlayout.win-navbar-closing {
-  min-height: 62px;
-}
-.win-commandlayout.win-navbar-opening.win-navbar-compact,
-.win-commandlayout.win-navbar-opened.win-navbar-compact,
-.win-commandlayout.win-navbar-closing.win-navbar-compact {
-  min-height: 48px;
-}
-.win-commandlayout.win-navbar-minimal,
-.win-commandlayout.win-navbar-compact {
-  padding-right: 32px;
-  width: calc(100% - 32px);
-}
-.win-commandlayout.win-navbar-compact button.win-command .win-label {
-  display: none;
-}
-.win-commandlayout.win-navbar-compact.win-navbar-closing button.win-command .win-label {
-  display: block;
-  visibility: hidden;
-}
-.win-commandlayout.win-navbar-compact.win-navbar-opened button.win-command .win-label,
-.win-commandlayout.win-navbar-compact.win-navbar-opening button.win-command .win-label {
-  display: block;
-  visibility: visible;
-}
-/* CommandsLayout RTL */
-.win-commandlayout:lang(ar).win-navbar-minimal,
-.win-commandlayout:lang(dv).win-navbar-minimal,
-.win-commandlayout:lang(fa).win-navbar-minimal,
-.win-commandlayout:lang(he).win-navbar-minimal,
-.win-commandlayout:lang(ku-Arab).win-navbar-minimal,
-.win-commandlayout:lang(pa-Arab).win-navbar-minimal,
-.win-commandlayout:lang(prs).win-navbar-minimal,
-.win-commandlayout:lang(ps).win-navbar-minimal,
-.win-commandlayout:lang(sd-Arab).win-navbar-minimal,
-.win-commandlayout:lang(syr).win-navbar-minimal,
-.win-commandlayout:lang(ug).win-navbar-minimal,
-.win-commandlayout:lang(ur).win-navbar-minimal,
-.win-commandlayout:lang(qps-plocm).win-navbar-minimal,
-.win-commandlayout:lang(ar).win-navbar-compact,
-.win-commandlayout:lang(dv).win-navbar-compact,
-.win-commandlayout:lang(fa).win-navbar-compact,
-.win-commandlayout:lang(he).win-navbar-compact,
-.win-commandlayout:lang(ku-Arab).win-navbar-compact,
-.win-commandlayout:lang(pa-Arab).win-navbar-compact,
-.win-commandlayout:lang(prs).win-navbar-compact,
-.win-commandlayout:lang(ps).win-navbar-compact,
-.win-commandlayout:lang(sd-Arab).win-navbar-compact,
-.win-commandlayout:lang(syr).win-navbar-compact,
-.win-commandlayout:lang(ug).win-navbar-compact,
-.win-commandlayout:lang(ur).win-navbar-compact,
-.win-commandlayout:lang(qps-plocm).win-navbar-compact {
-  padding-right: 0px;
-  padding-left: 32px;
-}
-/*
-AppBar menu layout
-*/
-.win-menulayout .win-navbar-menu {
-  position: absolute;
-  right: 0;
-  top: 0;
-  overflow: hidden;
-}
-.win-menulayout .win-navbar-menu:lang(ar),
-.win-menulayout .win-navbar-menu:lang(dv),
-.win-menulayout .win-navbar-menu:lang(fa),
-.win-menulayout .win-navbar-menu:lang(he),
-.win-menulayout .win-navbar-menu:lang(ku-Arab),
-.win-menulayout .win-navbar-menu:lang(pa-Arab),
-.win-menulayout .win-navbar-menu:lang(prs),
-.win-menulayout .win-navbar-menu:lang(ps),
-.win-menulayout .win-navbar-menu:lang(sd-Arab),
-.win-menulayout .win-navbar-menu:lang(syr),
-.win-menulayout .win-navbar-menu:lang(ug),
-.win-menulayout .win-navbar-menu:lang(ur),
-.win-menulayout .win-navbar-menu:lang(qps-plocm) {
-  left: 0;
-  right: auto;
-}
-.win-menulayout.win-bottom .win-navbar-menu {
-  overflow: visible;
-}
-.win-menulayout .win-toolbar {
-  max-width: 100vw;
-}
-.win-menulayout.win-navbar-compact button.win-command .win-label {
-  display: none;
-  visibility: hidden;
-}
-.win-menulayout.win-navbar-compact.win-navbar-closing button.win-command .win-label,
-.win-menulayout.win-navbar-compact.win-navbar-opening button.win-command .win-label {
-  display: block;
-  visibility: visible;
-}
-.win-menulayout.win-navbar-compact.win-navbar-opened button.win-command .win-label {
-  display: block;
-  visibility: visible;
-}
-.win-menulayout.win-navbar-compact.win-navbar-closed {
-  overflow: hidden;
-}
-.win-menulayout.win-navbar-compact.win-navbar-closed .win-toolbar-overflowarea {
-  visibility: hidden;
-}
-/*
-High contrast AppBar needs a border
-*/
-@media (-ms-high-contrast) {
-  /*
-    AppBar Borders
-    */
-  .win-navbar {
-    border: solid 2px;
-  }
-  .win-navbar.win-top {
-    border-top: none;
-    border-left: none;
-    border-right: none;
-  }
-  .win-navbar.win-bottom {
-    border-bottom: none;
-    border-left: none;
-    border-right: none;
-  }
-  .win-navbar.win-top button.win-command,
-  .win-navbar.win-top div.win-command {
-    padding-bottom: 7px;
-    /* 7px - 2px smaller to account for the high-constrast appbar border */
-  }
-  .win-navbar.win-bottom button.win-command,
-  .win-navbar.win-bottom div.win-command {
-    padding-top: 7px;
-    /* 7px - 2px smaller to account for the high-constrast appbar border */
-  }
-  .win-navbar.win-top hr.win-command {
-    margin-bottom: 28px;
-  }
-  .win-navbar.win-bottom hr.win-command {
-    margin-top: 8px;
-  }
-  .win-commandlayout.win-navbar-opening,
-  .win-commandlayout.win-navbar-opened,
-  .win-commandlayout.win-navbar-closing {
-    min-height: 62px;
-  }
-}
-/*
-Flyout control.
-*/
-.win-flyout {
-  position: fixed;
-  position: -ms-device-fixed;
-  padding: 12px;
-  border-style: solid;
-  border-width: 1px;
-  margin: 4px;
-  min-width: 70px;
-  /* 96px - 2px border - 24px padding */
-  max-width: 430px;
-  /* 456px - 2px border - 24px padding */
-  min-height: 16px;
-  /* 44px - 2px border - 24px padding */
-  max-height: 730px;
-  /* 758px - 2px border - 24px padding */
-  width: auto;
-  height: auto;
-  word-wrap: break-word;
-  overflow: auto;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-flyout.win-leftalign {
-  margin-left: 0;
-}
-.win-flyout.win-rightalign {
-  margin-right: 0;
-}
-.win-flyout.win-scrolls {
-  overflow: auto;
-}
-@media (max-width: 464px) {
-  .win-flyout {
-    max-width: calc(100% - 34px);
-    /* 100% - 8px margin - 2px border - 24px padding */
-  }
-}
-/*
-Menu control.
-*/
-.win-menu {
-  padding: 0;
-  line-height: 33px;
-  text-align: left;
-  /* Set explicitly in case our parent has different alignment, like appbar overflow. */
-  min-height: 42px;
-  /* 44px - 2px border */
-  max-height: calc(100% - 26px);
-  min-width: 134px;
-  /* 136px - 2px border */
-  max-width: 454px;
-  /* 456px - 2px border */
-}
-/*
-Menu commands.
-*/
-.win-menu button.win-command {
-  display: block;
-  margin-left: 0;
-  margin-right: 0;
-  text-align: left;
-  width: 100%;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-menu button.win-command:focus {
-  outline: none;
-}
-.win-menu button.win-command .win-menucommand-liner {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: row;
-  -webkit-flex-direction: row;
-  flex-direction: row;
-  -ms-flex-wrap: none;
-  -webkit-flex-wrap: nowrap;
-  flex-wrap: nowrap;
-  -ms-flex-align: center;
-  -webkit-align-items: center;
-  align-items: center;
-  width: 100%;
-  position: relative;
-}
-.win-menu button.win-command .win-menucommand-liner .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner .win-flyouticon {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  display: none;
-  visibility: hidden;
-  font-size: 16px;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-}
-.win-menu button.win-command .win-menucommand-liner .win-toggleicon {
-  margin-left: 12px;
-}
-.win-menu button.win-command .win-menucommand-liner .win-toggleicon::before {
-  content: "\E0E7";
-}
-.win-menu button.win-command .win-menucommand-liner .win-flyouticon {
-  margin-left: 12px;
-  margin-right: 16px;
-}
-.win-menu button.win-command .win-menucommand-liner .win-flyouticon::before {
-  content: "\E26B";
-}
-.win-menu button.win-command .win-menucommand-liner .win-label {
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  font-size: 15px;
-  line-height: inherit;
-  min-width: 112px;
-  max-width: none;
-  white-space: nowrap;
-  text-overflow: clip;
-  margin: 0px;
-  padding: 0px 12px;
-}
-.win-menu button.win-command .win-menucommand-liner:lang(ar),
-.win-menu button.win-command .win-menucommand-liner:lang(dv),
-.win-menu button.win-command .win-menucommand-liner:lang(fa),
-.win-menu button.win-command .win-menucommand-liner:lang(he),
-.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab),
-.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab),
-.win-menu button.win-command .win-menucommand-liner:lang(prs),
-.win-menu button.win-command .win-menucommand-liner:lang(ps),
-.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab),
-.win-menu button.win-command .win-menucommand-liner:lang(syr),
-.win-menu button.win-command .win-menucommand-liner:lang(ug),
-.win-menu button.win-command .win-menucommand-liner:lang(ur),
-.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) {
-  text-align: right;
-}
-.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(he) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-toggleicon,
-.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-toggleicon {
-  margin-left: 0px;
-  margin-right: 12px;
-}
-.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(he) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-flyouticon,
-.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-flyouticon {
-  margin-left: 16px;
-  margin-right: 12px;
-}
-.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(he) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-flyouticon::before,
-.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-flyouticon::before {
-  content: "\E26C";
-}
-.win-menu.win-menu-mousespacing button.win-command {
-  padding-top: 5px;
-  padding-bottom: 7px;
-  min-height: 32px;
-}
-.win-menu.win-menu-touchspacing button.win-command {
-  padding-top: 11px;
-  padding-bottom: 13px;
-  min-height: 44px;
-}
-.win-menu hr.win-command {
-  display: block;
-  height: 1px;
-  width: auto;
-  border: 0;
-  padding: 0;
-  margin: 9px 20px 10px 20px;
-}
-/*
-Menu toggle and flyout commands.
-*/
-.win-menu-containstogglecommand button.win-command .win-menucommand-liner .win-toggleicon,
-.win-menu-containsflyoutcommand button.win-command .win-menucommand-liner .win-flyouticon {
-  display: inline-block;
-}
-.win-menu-containstogglecommand button.win-command-toggle[aria-checked=true] .win-menucommand-liner .win-toggleicon,
-.win-menu-containsflyoutcommand button.win-command-flyout .win-menucommand-liner .win-flyouticon {
-  visibility: visible;
-}
-@media (max-width: 464px) {
-  .win-menu {
-    max-width: calc(100% - 10px);
-    /* 100% - 8px margin - 2px border */
-  }
-}
-/*
-Grippers in touch selection do not dissapear when focus moves to an element outside of the selection range and they are always drawn on a layer above all HTML elemements.
-When an _Overlay derived control such as AppBar/Flyout/Menu/SettingsFlyout is invoked and steals focus, if that _Overlay is laid out on top of the elements in the touch selection,
-the grippers can still be seen over the _Overlay and its contents. However, all grippers any where in the document will be hidden whenever the current active element has or inherits
-the style "-ms-touch-select: none;"
-*/
-.win-overlay {
-  -ms-touch-select: none;
-}
-/* For input elements we filter type using the :not selector to capture any unrecognized user specified types which would just default to the form and function of a textbox*/
-.win-overlay input:not([type="file"]),
-.win-overlay input:not([type="radio"]),
-.win-overlay input:not([type="checkbox"]),
-.win-overlay input:not([type="button"]),
-.win-overlay input:not([type="range"]),
-.win-overlay input:not([type="image"]),
-.win-overlay input:not([type="reset"]),
-.win-overlay input:not([type="hidden"]),
-.win-overlay input:not([type="submit"]),
-.win-overlay textarea,
-.win-overlay [contenteditable=true] {
-  -ms-touch-select: grippers;
-}
-/* Singleton element maintained by _Overlay, used for getting accurate floating point measurements of the total size of the visual viewport.
-    Floating point is necesary in high DPI resolutions. */
-.win-visualviewport-space {
-  position: fixed;
-  position: -ms-device-fixed;
-  height: 100%;
-  width: 100%;
-  visibility: hidden;
-}
-/*
-Settings Pane
-*/
-.win-settingsflyout {
-  border-left: 1px solid;
-  position: fixed;
-  top: 0;
-  right: 0;
-  height: 100%;
-  width: 319px;
-  /* 320px - border (1px) */
-  /* Settings back button is slightly smaller. */
-}
-.win-settingsflyout:lang(ar),
-.win-settingsflyout:lang(dv),
-.win-settingsflyout:lang(fa),
-.win-settingsflyout:lang(he),
-.win-settingsflyout:lang(ku-Arab),
-.win-settingsflyout:lang(pa-Arab),
-.win-settingsflyout:lang(prs),
-.win-settingsflyout:lang(ps),
-.win-settingsflyout:lang(sd-Arab),
-.win-settingsflyout:lang(syr),
-.win-settingsflyout:lang(ug),
-.win-settingsflyout:lang(ur),
-.win-settingsflyout:lang(qps-plocm) {
-  border-left: none;
-  border-right: 1px solid;
-}
-.win-settingsflyout.win-wide {
-  /* .win-wide is deprecated in Windows 8.1 */
-  width: 645px;
-  /* 646px - border (1px) */
-}
-.win-settingsflyout .win-backbutton,
-.win-settingsflyout .win-back {
-  width: 32px;
-  height: 32px;
-  font-size: 20px;
-  line-height: 32px;
-}
-.win-settingsflyout .win-header {
-  padding-top: 6px;
-  padding-bottom: 10px;
-  padding-left: 52px;
-  /* 40px for the backbutton */
-  padding-right: 12px;
-  height: 32px;
-  position: relative;
-}
-.win-settingsflyout .win-header .win-label {
-  display: inline-block;
-  font-size: 24px;
-  font-weight: 300;
-  line-height: 32px;
-  white-space: nowrap;
-}
-.win-settingsflyout .win-header .win-backbutton,
-.win-settingsflyout .win-header .win-navigation-backbutton {
-  position: absolute;
-  left: 12px;
-}
-.win-settingsflyout .win-content {
-  overflow: auto;
-  padding: 0px 12px;
-}
-.win-settingsflyout .win-content .win-label {
-  font-size: 20px;
-  font-weight: 400;
-  line-height: 1.2;
-}
-.win-settingsflyout .win-content .win-settings-section {
-  padding-bottom: 39px;
-  margin: 0;
-  padding-top: 0;
-  padding-bottom: 20px;
-}
-.win-settingsflyout .win-content .win-settings-section p {
-  margin: 0;
-  padding-top: 0;
-  padding-bottom: 25px;
-}
-.win-settingsflyout .win-content .win-settings-section a {
-  margin: 0;
-  padding-top: 0;
-  padding-bottom: 25px;
-  display: inline-block;
-}
-.win-settingsflyout .win-content .win-settings-section label {
-  display: block;
-  padding-bottom: 7px;
-}
-.win-settingsflyout .win-content .win-settings-section button,
-.win-settingsflyout .win-content .win-settings-section select,
-.win-settingsflyout .win-content .win-settings-section input[type=button],
-.win-settingsflyout .win-content .win-settings-section input[type=text] {
-  margin-bottom: 25px;
-  margin-left: 0;
-  margin-right: 20px;
-}
-.win-settingsflyout .win-content .win-settings-section button:lang(ar),
-.win-settingsflyout .win-content .win-settings-section select:lang(ar),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ar),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ar),
-.win-settingsflyout .win-content .win-settings-section button:lang(dv),
-.win-settingsflyout .win-content .win-settings-section select:lang(dv),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(dv),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(dv),
-.win-settingsflyout .win-content .win-settings-section button:lang(fa),
-.win-settingsflyout .win-content .win-settings-section select:lang(fa),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(fa),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(fa),
-.win-settingsflyout .win-content .win-settings-section button:lang(he),
-.win-settingsflyout .win-content .win-settings-section select:lang(he),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(he),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(he),
-.win-settingsflyout .win-content .win-settings-section button:lang(ku-Arab),
-.win-settingsflyout .win-content .win-settings-section select:lang(ku-Arab),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ku-Arab),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ku-Arab),
-.win-settingsflyout .win-content .win-settings-section button:lang(pa-Arab),
-.win-settingsflyout .win-content .win-settings-section select:lang(pa-Arab),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(pa-Arab),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(pa-Arab),
-.win-settingsflyout .win-content .win-settings-section button:lang(prs),
-.win-settingsflyout .win-content .win-settings-section select:lang(prs),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(prs),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(prs),
-.win-settingsflyout .win-content .win-settings-section button:lang(ps),
-.win-settingsflyout .win-content .win-settings-section select:lang(ps),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ps),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ps),
-.win-settingsflyout .win-content .win-settings-section button:lang(sd-Arab),
-.win-settingsflyout .win-content .win-settings-section select:lang(sd-Arab),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(sd-Arab),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(sd-Arab),
-.win-settingsflyout .win-content .win-settings-section button:lang(syr),
-.win-settingsflyout .win-content .win-settings-section select:lang(syr),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(syr),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(syr),
-.win-settingsflyout .win-content .win-settings-section button:lang(ug),
-.win-settingsflyout .win-content .win-settings-section select:lang(ug),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ug),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ug),
-.win-settingsflyout .win-content .win-settings-section button:lang(ur),
-.win-settingsflyout .win-content .win-settings-section select:lang(ur),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ur),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ur),
-.win-settingsflyout .win-content .win-settings-section button:lang(qps-plocm),
-.win-settingsflyout .win-content .win-settings-section select:lang(qps-plocm),
-.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(qps-plocm),
-.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(qps-plocm) {
-  margin-bottom: 25px;
-  margin-left: 20px;
-  margin-right: 0;
-}
-.win-settingsflyout .win-content .win-settings-section input[type=radio] {
-  margin-top: 0;
-  margin-bottom: 0;
-  padding-bottom: 15px;
-}
-/*Flyout control animations*/
-@keyframes WinJS-showFlyoutTop {
-  from {
-    transform: translateY(50px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-showFlyoutBottom {
-  from {
-    transform: translateY(-50px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-showFlyoutLeft {
-  from {
-    transform: translateX(50px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-showFlyoutRight {
-  from {
-    transform: translateX(-50px);
-  }
-  to {
-    transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showFlyoutTop {
-  from {
-    -webkit-transform: translateY(50px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showFlyoutBottom {
-  from {
-    -webkit-transform: translateY(-50px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showFlyoutLeft {
-  from {
-    -webkit-transform: translateX(50px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-showFlyoutRight {
-  from {
-    -webkit-transform: translateX(-50px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-.win-commandingsurface {
-  outline: none;
-  min-width: 32px;
-  /* enough to fit the overflowbutton */
-  position: relative;
-}
-.win-commandingsurface.win-commandingsurface-overflowbottom .win-commandingsurface-overflowareacontainer {
-  top: 100%;
-}
-.win-commandingsurface.win-commandingsurface-overflowtop .win-commandingsurface-overflowareacontainer {
-  bottom: 100%;
-}
-.win-commandingsurface .win-commandingsurface-actionarea {
-  min-height: 24px;
-  vertical-align: top;
-  overflow: hidden;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-pack: end;
-  -webkit-justify-content: flex-end;
-  justify-content: flex-end;
-  -ms-flex-align: start;
-  -webkit-align-items: flex-start;
-  align-items: flex-start;
-}
-.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-spacer {
-  visibility: hidden;
-  min-height: 48px;
-  /* height of a primary command with no label */
-  width: 0px;
-}
-.win-commandingsurface .win-commandingsurface-actionarea .win-command,
-.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton {
-  touch-action: manipulation;
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-}
-.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton {
-  width: 32px;
-  /* 30px + 2px border */
-  margin: 0px;
-  padding: 0px;
-  border-width: 1px;
-  border-style: dotted;
-  min-width: 0px;
-  min-height: 0px;
-  outline: none;
-  -ms-flex-item-align: stretch;
-  -webkit-align-self: stretch;
-  align-self: stretch;
-  box-sizing: border-box;
-  background-clip: border-box;
-}
-.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis {
-  font-size: 16px;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-}
-.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis::before {
-  content: "\E10C";
-}
-.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-actionarea {
-  height: auto;
-}
-.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-overflowarea,
-.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-overflowareacontainer {
-  display: block;
-}
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayfull .win-commandingsurface-actionarea {
-  height: auto;
-}
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaycompact .win-commandingsurface-actionarea {
-  height: 48px;
-}
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaycompact .win-commandingsurface-actionarea .win-command .win-label {
-  display: none;
-}
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea {
-  height: 24px;
-}
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea .win-command,
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea .win-commandingsurface-spacer {
-  display: none;
-}
-.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaynone {
-  display: none;
-}
-.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-overflowarea,
-.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-overflowareacontainer {
-  display: none;
-}
-.win-commandingsurface .win-commandingsurface-insetoutline {
-  /* Display none except in High Contrast scenarios */
-  display: none;
-}
-.win-commandingsurface .win-commandingsurface-overflowareacontainer {
-  position: absolute;
-  overflow: hidden;
-  right: 0;
-  left: auto;
-}
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ar),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(dv),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(fa),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(he),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ku-Arab),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(pa-Arab),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(prs),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ps),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(sd-Arab),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(syr),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ug),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ur),
-.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(qps-plocm) {
-  left: 0;
-  right: auto;
-}
-.win-commandingsurface .win-commandingsurface-overflowarea,
-.win-commandingsurface .win-commandingsurface-overflowareacontainer {
-  min-width: 160px;
-  min-height: 0;
-  max-height: 50vh;
-  padding: 0;
-}
-.win-commandingsurface .win-commandingsurface-overflowarea {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  overflow-y: auto;
-  overflow-x: hidden;
-}
-.win-commandingsurface .win-commandingsurface-overflowarea.win-menu {
-  max-width: 480px;
-  /* override max-width styles from WinJS.UI.Menu */
-}
-.win-commandingsurface .win-commandingsurface-overflowarea .win-commandingsurface-spacer {
-  /* Reserves space at the bottom of the overflow area */
-  visibility: hidden;
-  height: 24px;
-}
-.win-commandingsurface .win-commandingsurface-overflowarea button.win-command {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  min-height: 44px;
-  border: 1px dotted transparent;
-  padding: 10px 11px 12px 11px;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-  white-space: nowrap;
-  overflow: hidden;
-}
-.win-commandingsurface .win-commandingsurface-overflowarea hr.win-command {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  height: 2px;
-  margin: 6px 12px 4px 12px;
-}
-.win-commandingsurface .win-commandingsurface-actionareacontainer {
-  overflow: hidden;
-  position: relative;
-}
-.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplaycompact .win-command .win-label,
-.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplayminimal .win-command,
-.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplaynone .win-command {
-  opacity: 0;
-}
-.win-commandingsurface .win-command.win-command-hidden {
-  display: inline-block;
-}
-.win-commandingsurface .win-command.win-commandingsurface-command-hidden {
-  display: none;
-}
-.win-commandingsurface .win-command.win-commandingsurface-command-primary-overflown,
-.win-commandingsurface .win-command.win-commandingsurface-command-secondary-overflown,
-.win-commandingsurface .win-command.win-commandingsurface-command-separator-hidden {
-  display: none;
-}
-@media (max-width: 480px) {
-  .win-commandingsurface .win-commandingsurface-overflowarea.win-menu {
-    width: 100vw;
-  }
-}
-.win-toolbar {
-  min-width: 32px;
-  /* enough to fit the overflowbutton */
-}
-.win-toolbar.win-toolbar-opened {
-  position: fixed;
-}
-.win-autosuggestbox {
-  white-space: normal;
-  position: relative;
-  width: 266px;
-  min-width: 265px;
-  min-height: 28px;
-}
-.win-autosuggestbox-flyout {
-  position: absolute;
-  top: 100%;
-  width: 100%;
-  z-index: 100;
-  max-height: 374px;
-  min-height: 44px;
-  overflow: auto;
-  -ms-scroll-chaining: none;
-  touch-action: none;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-autosuggestbox-flyout-above {
-  bottom: 100%;
-  top: auto;
-}
-.win-autosuggestbox-flyout-above .win-repeater {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column-reverse;
-  -webkit-flex-direction: column-reverse;
-  flex-direction: column-reverse;
-}
-.win-autosuggestbox .win-autosuggestbox-input {
-  -ms-ime-align: after;
-  margin: 0;
-  width: 100%;
-}
-.win-autosuggestbox-suggestion-selected {
-  outline-style: dotted;
-  outline-width: 1px;
-}
-.win-autosuggestbox-suggestion-result {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  padding: 0 18px;
-  height: 60px;
-  font-size: 11pt;
-  outline: none;
-}
-.win-autosuggestbox-suggestion-result div {
-  line-height: 20px;
-  white-space: nowrap;
-  overflow: hidden;
-}
-.win-autosuggestbox-suggestion-result-text {
-  padding-top: 9px;
-  padding-bottom: 11px;
-  height: 60px;
-  width: 179px;
-  white-space: nowrap;
-  overflow: hidden;
-  line-height: 20px;
-}
-.win-autosuggestbox-suggestion-result-detailed-text {
-  display: inline-block;
-  overflow: hidden;
-  line-height: 22px;
-  /* Some characters get clipped if line height is < 22px. Work around by setting -2 margin. */
-  margin-top: -1px;
-  width: 100%;
-}
-.win-autosuggestbox-suggestion-result img {
-  width: 40px;
-  height: 40px;
-  margin-left: 0;
-  padding-right: 10px;
-  padding-top: 10px;
-  padding-bottom: 10px;
-}
-.win-autosuggestbox-suggestion-result img:lang(ar),
-.win-autosuggestbox-suggestion-result img:lang(dv),
-.win-autosuggestbox-suggestion-result img:lang(fa),
-.win-autosuggestbox-suggestion-result img:lang(he),
-.win-autosuggestbox-suggestion-result img:lang(ku-Arab),
-.win-autosuggestbox-suggestion-result img:lang(pa-Arab),
-.win-autosuggestbox-suggestion-result img:lang(prs),
-.win-autosuggestbox-suggestion-result img:lang(ps),
-.win-autosuggestbox-suggestion-result img:lang(sd-Arab),
-.win-autosuggestbox-suggestion-result img:lang(syr),
-.win-autosuggestbox-suggestion-result img:lang(ug),
-.win-autosuggestbox-suggestion-result img:lang(ur),
-.win-autosuggestbox-suggestion-result img:lang(qps-plocm) {
-  margin-right: 0;
-  margin-left: auto;
-  padding-left: 10px;
-  padding-right: 0;
-}
-.win-autosuggestbox-suggestion-query {
-  height: 20px;
-  padding: 11px 0px 13px 12px;
-  outline: none;
-  white-space: nowrap;
-  overflow: hidden;
-  line-height: 20px;
-}
-.win-autosuggestbox-suggestion-separator {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  padding: 0 18px;
-  height: 40px;
-  font-size: 11pt;
-}
-.win-autosuggestbox-suggestion-separator hr {
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  margin-top: 18px;
-  border-style: solid;
-  border-width: 1px 0px 0px 0px;
-}
-.win-autosuggestbox-suggestion-separator hr:lang(ar),
-.win-autosuggestbox-suggestion-separator hr:lang(dv),
-.win-autosuggestbox-suggestion-separator hr:lang(fa),
-.win-autosuggestbox-suggestion-separator hr:lang(he),
-.win-autosuggestbox-suggestion-separator hr:lang(ku-Arab),
-.win-autosuggestbox-suggestion-separator hr:lang(pa-Arab),
-.win-autosuggestbox-suggestion-separator hr:lang(prs),
-.win-autosuggestbox-suggestion-separator hr:lang(ps),
-.win-autosuggestbox-suggestion-separator hr:lang(sd-Arab),
-.win-autosuggestbox-suggestion-separator hr:lang(syr),
-.win-autosuggestbox-suggestion-separator hr:lang(ug),
-.win-autosuggestbox-suggestion-separator hr:lang(ur),
-.win-autosuggestbox-suggestion-separator hr:lang(qps-plocm) {
-  margin-right: 10px;
-  margin-left: auto;
-}
-.win-autosuggestbox-suggestion-separator div {
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  overflow: hidden;
-  padding-top: 9px;
-  padding-bottom: 11px;
-  line-height: 20px;
-  margin-right: 10px;
-}
-.win-autosuggestbox-suggestion-separator div:lang(ar),
-.win-autosuggestbox-suggestion-separator div:lang(dv),
-.win-autosuggestbox-suggestion-separator div:lang(fa),
-.win-autosuggestbox-suggestion-separator div:lang(he),
-.win-autosuggestbox-suggestion-separator div:lang(ku-Arab),
-.win-autosuggestbox-suggestion-separator div:lang(pa-Arab),
-.win-autosuggestbox-suggestion-separator div:lang(prs),
-.win-autosuggestbox-suggestion-separator div:lang(ps),
-.win-autosuggestbox-suggestion-separator div:lang(sd-Arab),
-.win-autosuggestbox-suggestion-separator div:lang(syr),
-.win-autosuggestbox-suggestion-separator div:lang(ug),
-.win-autosuggestbox-suggestion-separator div:lang(ur),
-.win-autosuggestbox-suggestion-separator div:lang(qps-plocm) {
-  margin-left: 10px;
-  margin-right: auto;
-}
-/*
-ASB control animations
-*/
-@keyframes WinJS-flyoutBelowASB-showPopup {
-  from {
-    transform: translateY(0px);
-  }
-  to {
-    transform: none;
-  }
-}
-@keyframes WinJS-flyoutAboveASB-showPopup {
-  from {
-    transform: translateY(0px);
-  }
-  to {
-    transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-flyoutBelowASB-showPopup {
-  from {
-    -webkit-transform: translateY(0px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@-webkit-keyframes -webkit-WinJS-flyoutAboveASB-showPopup {
-  from {
-    -webkit-transform: translateY(0px);
-  }
-  to {
-    -webkit-transform: none;
-  }
-}
-@media (-ms-high-contrast) {
-  .win-autosuggestbox {
-    border-color: ButtonText;
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  .win-autosuggestbox-disabled {
-    background-color: ButtonFace;
-    border-color: GrayText;
-  }
-  .win-autosuggestbox-disabled input[disabled] {
-    background-color: ButtonFace;
-    color: GrayText;
-    border-color: GrayText;
-  }
-  .win-autosuggestbox-disabled div {
-    color: GrayText;
-    background-color: ButtonFace;
-  }
-  .win-autosuggestbox:-ms-input-placeholder,
-  .win-autosuggestbox::-webkit-input-placeholder,
-  .win-autosuggestbox::-moz-input-placeholder {
-    color: GrayText;
-  }
-  .win-autosuggestbox-flyout {
-    border-color: ButtonText;
-    background-color: ButtonFace;
-  }
-  .win-autosuggestbox-flyout-highlighttext {
-    color: ButtonText;
-  }
-  html.win-hoverable .win-autosuggestbox-suggestion-result:hover,
-  html.win-hoverable .win-autosuggestbox-query:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  html.win-hoverable .win-autosuggestbox-suggestion-result:hover .win-autosuggestbox-flyout-highlighttext,
-  html.win-hoverable .win-autosuggestbox-suggestion-query:hover .win-autosuggestbox-flyout-highlighttext {
-    color: HighlightText;
-  }
-  .win-autosuggestbox-suggestion-query,
-  .win-autosuggestbox-suggestion-result {
-    color: ButtonText;
-  }
-  .win-autosuggestbox-suggestion-selected {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-autosuggestbox-suggestion-separator {
-    color: ButtonText;
-  }
-  .win-autosuggestbox-suggestion-separator hr {
-    border-color: ButtonText;
-  }
-  .win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext {
-    color: HighlightText;
-  }
-}
-/*
-Hide clear button in search box control.
-*/
-.win-searchbox input[type=search]::-ms-clear {
-  display: none;
-}
-.win-searchbox input[type=search]::-webkit-search-cancel-button {
-  display: none;
-}
-.win-searchbox-button {
-  position: absolute;
-  right: 0;
-  top: 0;
-  width: 32px;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-size: 15px;
-  border-style: none;
-  height: 100%;
-  text-align: center;
-}
-.win-searchbox-button:lang(ar),
-.win-searchbox-button:lang(dv),
-.win-searchbox-button:lang(fa),
-.win-searchbox-button:lang(he),
-.win-searchbox-button:lang(ku-Arab),
-.win-searchbox-button:lang(pa-Arab),
-.win-searchbox-button:lang(prs),
-.win-searchbox-button:lang(ps),
-.win-searchbox-button:lang(sd-Arab),
-.win-searchbox-button:lang(syr),
-.win-searchbox-button:lang(ug),
-.win-searchbox-button:lang(ur),
-.win-searchbox-button:lang(qps-plocm) {
-  right: auto;
-  left: 0;
-}
-.win-searchbox-button.win-searchbox-button:before {
-  content: "\E094";
-  position: absolute;
-  left: 8px;
-  top: 8px;
-  line-height: 100%;
-}
-@media (-ms-high-contrast) {
-  .win-searchbox-button {
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  html.win-hoverable .win-searchbox-button[disabled=false]:hover {
-    border-color: ButtonText;
-    background-color: HighLight;
-    color: HighLightText;
-  }
-  .win-searchbox-button-input-focus {
-    background-color: ButtonText;
-    color: ButtonFace;
-  }
-  html.win-hoverable .win-searchbox-button-input-focus:hover {
-    border-color: ButtonText;
-    background-color: HighLight;
-    color: HighLightText;
-  }
-  .win-searchbox-button:active {
-    background-color: ButtonText;
-    color: ButtonFace;
-  }
-}
-/*
-    SplitViewCommand
-*/
-.win-splitviewcommand {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  touch-action: manipulation;
-}
-.win-splitviewcommand-button {
-  -ms-flex: 1 1 0%;
-  -webkit-flex: 1 1 0%;
-  flex: 1 1 0%;
-  position: relative;
-}
-.win-splitviewcommand-button-content {
-  position: relative;
-  height: 48px;
-  padding-left: 16px;
-  padding-right: 16px;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-}
-.win-splitviewcommand-button:focus {
-  z-index: 1;
-  outline: none;
-}
-.win-splitviewcommand-icon {
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  height: 16px;
-  width: 16px;
-  font-size: 16px;
-  margin-left: 0;
-  margin-right: 16px;
-  margin-top: 14px;
-  /* Center icon vertically */
-  line-height: 1;
-  /* Ensure icon is exactly font-size */
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-}
-.win-splitviewcommand-icon:lang(ar),
-.win-splitviewcommand-icon:lang(dv),
-.win-splitviewcommand-icon:lang(fa),
-.win-splitviewcommand-icon:lang(he),
-.win-splitviewcommand-icon:lang(ku-Arab),
-.win-splitviewcommand-icon:lang(pa-Arab),
-.win-splitviewcommand-icon:lang(prs),
-.win-splitviewcommand-icon:lang(ps),
-.win-splitviewcommand-icon:lang(sd-Arab),
-.win-splitviewcommand-icon:lang(syr),
-.win-splitviewcommand-icon:lang(ug),
-.win-splitviewcommand-icon:lang(ur),
-.win-splitviewcommand-icon:lang(qps-plocm) {
-  margin-right: 0;
-  margin-left: 16px;
-}
-.win-splitviewcommand-label {
-  -ms-flex: 1 1 0%;
-  -webkit-flex: 1 1 0%;
-  flex: 1 1 0%;
-  overflow: hidden;
-  white-space: nowrap;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-  margin-top: 13px;
-  margin-bottom: 15px;
-}
-@media (-ms-high-contrast) {
-  /*
-        SplitViewCommand colors.
-    */
-  .win-splitviewcommand-button {
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  .win-splitviewcommand-button:after {
-    position: absolute;
-    top: 0;
-    left: 0;
-    border: 2px solid ButtonText;
-    content: "";
-    width: calc(100% - 3px);
-    height: calc(100% - 3px);
-    pointer-events: none;
-  }
-  html.win-hoverable .win-splitviewcommand-button:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-splitviewcommand-button.win-pressed,
-  html.win-hoverable .win-splitviewcommand-button.win-pressed:hover {
-    background-color: ButtonText;
-    color: ButtonFace;
-  }
-}
-.win-navbar {
-  /* NavBar should overlay content in the body when opened or closed.
-     * This z-index value is chosen to be smaller than light dismissables.
-     * z-index will be overwritten by the light dismiss service to an even
-     * higher value when the NavBar is in the opened state.
-     */
-  z-index: 999;
-}
-.win-navbar.win-navbar-showing,
-.win-navbar.win-navbar-shown,
-.win-navbar.win-navbar-hiding {
-  min-height: 60px;
-}
-.win-navbar .win-navbar-invokebutton {
-  width: 32px;
-  min-height: 0;
-  height: 24px;
-}
-.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis {
-  width: 32px;
-}
-.win-navbar.win-top .win-navbar-invokebutton {
-  bottom: 0;
-}
-.win-navbar.win-top .win-navbar-invokebutton .win-navbar-ellipsis {
-  top: 5px;
-}
-.win-navbar.win-bottom .win-navbar-invokebutton {
-  top: 0;
-}
-.win-navbar.win-bottom .win-navbar-invokebutton .win-navbar-ellipsis {
-  top: 0;
-}
-.win-navbarcontainer {
-  width: 100%;
-  position: relative;
-}
-.win-navbarcontainer-pageindicator-box {
-  position: absolute;
-  width: 100%;
-  text-align: center;
-  pointer-events: none;
-}
-.win-navbarcontainer-vertical .win-navbarcontainer-pageindicator-box {
-  display: none;
-}
-.win-navbarcontainer-pageindicator {
-  display: inline-block;
-  width: 40px;
-  height: 4px;
-  margin: 4px 2px 16px 2px;
-}
-.win-navbarcontainer-horizontal .win-navbarcontainer-viewport::-webkit-scrollbar {
-  width: 0;
-  height: 0;
-}
-.win-navbarcontainer-horizontal .win-navbarcontainer-viewport {
-  padding: 20px 0;
-  overflow-x: auto;
-  overflow-y: hidden;
-  overflow: -moz-scrollbars-none;
-  -ms-scroll-snap-type: mandatory;
-  -ms-scroll-snap-points-x: snapInterval(0%, 100%);
-  -ms-overflow-style: none;
-  touch-action: pan-x;
-}
-.win-navbarcontainer-vertical .win-navbarcontainer-viewport {
-  overflow-x: hidden;
-  overflow-y: auto;
-  max-height: 216px;
-  -ms-overflow-style: -ms-autohiding-scrollbar;
-  touch-action: pan-y;
-  -webkit-overflow-scrolling: touch;
-}
-.win-navbarcontainer-horizontal .win-navbarcontainer-surface {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-line-pack: start;
-  -webkit-align-content: flex-start;
-  align-content: flex-start;
-}
-.win-navbarcontainer-vertical .win-navbarcontainer-surface {
-  padding: 12px 0;
-}
-.win-navbarcontainer-navarrow {
-  touch-action: manipulation;
-  position: absolute;
-  z-index: 2;
-  top: 24px;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-align: center;
-  -webkit-align-items: center;
-  align-items: center;
-  -ms-flex-pack: center;
-  -webkit-justify-content: center;
-  justify-content: center;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  height: calc(100% - 48px);
-  width: 20px;
-  font-size: 16px;
-  overflow: hidden;
-}
-.win-navbarcontainer-vertical .win-navbarcontainer-navarrow {
-  display: none;
-}
-.win-navbarcontainer-navleft {
-  left: 0;
-  margin-right: 2px;
-}
-.win-navbarcontainer-navleft::before {
-  content: '\E0E2';
-}
-.win-navbarcontainer-navright {
-  right: 0;
-  margin-left: 2px;
-}
-.win-navbarcontainer-navright::before {
-  content: '\E0E3';
-}
-/*
-    NavBarCommand
-*/
-.win-navbarcommand {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  touch-action: manipulation;
-}
-.win-navbarcontainer-horizontal .win-navbarcommand {
-  margin: 4px;
-  width: 192px;
-}
-.win-navbarcontainer-vertical .win-navbarcommand {
-  margin: 4px 24px;
-}
-.win-navbarcommand-button {
-  -ms-flex: 1 1 0%;
-  -webkit-flex: 1 1 0%;
-  flex: 1 1 0%;
-  position: relative;
-}
-.win-navbarcommand-button-content {
-  position: relative;
-  height: 48px;
-  padding-left: 16px;
-  padding-right: 16px;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-}
-.win-navbarcommand-button:focus {
-  z-index: 1;
-  outline: none;
-}
-.win-navbarcommand-icon {
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  height: 16px;
-  width: 16px;
-  font-size: 16px;
-  margin-left: 0;
-  margin-right: 16px;
-  margin-top: 14px;
-  /* Center icon vertically */
-  line-height: 1;
-  /* Ensure icon is exactly font-size */
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-}
-.win-navbarcommand-icon:lang(ar),
-.win-navbarcommand-icon:lang(dv),
-.win-navbarcommand-icon:lang(fa),
-.win-navbarcommand-icon:lang(he),
-.win-navbarcommand-icon:lang(ku-Arab),
-.win-navbarcommand-icon:lang(pa-Arab),
-.win-navbarcommand-icon:lang(prs),
-.win-navbarcommand-icon:lang(ps),
-.win-navbarcommand-icon:lang(sd-Arab),
-.win-navbarcommand-icon:lang(syr),
-.win-navbarcommand-icon:lang(ug),
-.win-navbarcommand-icon:lang(ur),
-.win-navbarcommand-icon:lang(qps-plocm) {
-  margin-right: 0;
-  margin-left: 16px;
-}
-.win-navbarcommand-label {
-  -ms-flex: 1 1 0%;
-  -webkit-flex: 1 1 0%;
-  flex: 1 1 0%;
-  overflow: hidden;
-  white-space: nowrap;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-  margin-top: 13px;
-  margin-bottom: 15px;
-}
-.win-navbarcommand-splitbutton {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  width: 48px;
-  font-family: "Segoe MDL2 Assets", "Symbols";
-  font-size: 16px;
-  margin-right: 0;
-  margin-left: 2px;
-  position: relative;
-}
-.win-navbarcommand-splitbutton:lang(ar),
-.win-navbarcommand-splitbutton:lang(dv),
-.win-navbarcommand-splitbutton:lang(fa),
-.win-navbarcommand-splitbutton:lang(he),
-.win-navbarcommand-splitbutton:lang(ku-Arab),
-.win-navbarcommand-splitbutton:lang(pa-Arab),
-.win-navbarcommand-splitbutton:lang(prs),
-.win-navbarcommand-splitbutton:lang(ps),
-.win-navbarcommand-splitbutton:lang(sd-Arab),
-.win-navbarcommand-splitbutton:lang(syr),
-.win-navbarcommand-splitbutton:lang(ug),
-.win-navbarcommand-splitbutton:lang(ur),
-.win-navbarcommand-splitbutton:lang(qps-plocm) {
-  margin-left: 0;
-  margin-right: 2px;
-}
-.win-navbarcommand-splitbutton::before {
-  content: '\E019';
-  pointer-events: none;
-  position: absolute;
-  box-sizing: border-box;
-  top: 0;
-  left: 0;
-  height: 100%;
-  width: 100%;
-  text-align: center;
-  line-height: 46px;
-  border: 1px dotted transparent;
-}
-.win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened::before {
-  content: '\E018';
-}
-.win-navbarcommand-splitbutton:focus {
-  outline: none;
-}
-@media (-ms-high-contrast) {
-  .win-navbarcontainer-pageindicator {
-    background-color: ButtonFace;
-  }
-  .win-navbarcontainer-pageindicator:after {
-    display: block;
-    border: 1px solid ButtonText;
-    content: "";
-    width: calc(100% - 2px);
-    height: calc(100% - 2px);
-  }
-  .win-navbarcontainer-pageindicator-current {
-    background-color: ButtonText;
-  }
-  html.win-hoverable .win-navbarcontainer-pageindicator:hover {
-    background-color: Highlight;
-  }
-  html.win-hoverable .win-navbarcontainer-pageindicator-current:hover {
-    background-color: ButtonText;
-  }
-  .win-navbarcontainer-pageindicator:hover:active {
-    background-color: ButtonText;
-  }
-  .win-navbarcontainer-navarrow {
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  .win-navbarcontainer-navarrow:after {
-    position: absolute;
-    top: 0;
-    left: 0;
-    border: 2px solid ButtonText;
-    content: "";
-    width: calc(100% - 3px);
-    height: calc(100% - 3px);
-  }
-  html.win-hoverable .win-navbarcontainer-navarrow:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-navbarcontainer-navarrow:hover:active {
-    background-color: ButtonText;
-    color: ButtonFace;
-  }
-  /*
-        NavBarCommand colors.
-    */
-  .win-navbarcommand-button,
-  .win-navbarcommand-splitbutton {
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  .win-navbarcommand-button:after,
-  .win-navbarcommand-splitbutton:after {
-    position: absolute;
-    top: 0;
-    left: 0;
-    border: 2px solid ButtonText;
-    content: "";
-    width: calc(100% - 3px);
-    height: calc(100% - 3px);
-    pointer-events: none;
-  }
-  html.win-hoverable .win-navbarcommand-button:hover,
-  html.win-hoverable .win-navbarcommand-splitbutton:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened,
-  html.win-hoverable .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover,
-  .win-navbarcommand-button.win-pressed,
-  html.win-hoverable .win-navbarcommand-button.win-pressed:hover,
-  .win-navbarcommand-splitbutton.win-pressed,
-  html.win-hoverable .win-navbarcommand-splitbutton.win-pressed:hover {
-    background-color: ButtonText;
-    color: ButtonFace;
-  }
-}
-.win-viewbox {
-  width: 100%;
-  height: 100%;
-  position: relative;
-}
-.win-contentdialog {
-  /* Dialog's positioning and sizing rules:
-      - Horizontal alignment
-        - Always horizontally centered
-      - Vertical alignment
-        - If height of window < @dialogVerticallyCenteredThreshold, dialog is attached to top of window
-        - Otherwise, dialog is vertically centered
-      - Width:
-        - Always stays between @minWidth and @maxWidth
-        - Sizes to width of window
-      - Height:
-        - Always stays between @minHeight and @maxHeight
-        - If window height < @maxHeight and dialog height > 50% of window
-          height, dialog height = window height
-        - Otherwise, dialog height sizes to its content
-     */
-  /* Purpose of this element is to control the dialog body's height based on the height
-       of the window. The dialog body's height should:
-         - Match height of window when dialog body's intrinsic height < 50% of window height.
-           In this case, .win-contentdialog-column0or1 will be in column 1 allowing
-           the dialog's body to fill the height of the window.
-         - Size to content otherwise.
-           In this case, .win-contentdialog-column0or1 will be in column 0 preventing
-           the dialog's body from growing.
-       This element works by moving between flexbox columns as the window's height changes.
-     */
-}
-.win-contentdialog.win-contentdialog-verticalalignment {
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  height: 100vh;
-  overflow: hidden;
-  display: none;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex-wrap: wrap;
-  -webkit-flex-wrap: wrap;
-  flex-wrap: wrap;
-  -ms-flex-pack: center;
-  -webkit-justify-content: center;
-  justify-content: center;
-  /* center on flex axis (vertically) */
-  -ms-flex-line-pack: center;
-  -webkit-align-content: center;
-  align-content: center;
-  /* maintain horizontal centering when the flexbox has 2 columns */
-}
-.win-contentdialog.win-contentdialog-verticalalignment.win-contentdialog-devicefixedsupported {
-  position: -ms-device-fixed;
-  height: auto;
-  bottom: 0;
-}
-.win-contentdialog.win-contentdialog-verticalalignment.win-contentdialog-visible {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-}
-.win-contentdialog .win-contentdialog-backgroundoverlay {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-}
-.win-contentdialog .win-contentdialog-dialog {
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  z-index: 1;
-  /* Put the dialog's body above the backgroundoverlay */
-  outline-style: solid;
-  outline-width: 1px;
-  box-sizing: border-box;
-  padding: 18px 24px 24px 24px;
-  width: 100%;
-  min-width: 320px;
-  max-width: 456px;
-  min-height: 184px;
-  max-height: 758px;
-  /* Center horizontally */
-  margin-left: auto;
-  margin-right: auto;
-}
-.win-contentdialog .win-contentdialog-column0or1 {
-  -ms-flex: 10000 0 50%;
-  -webkit-flex: 10000 0 50%;
-  flex: 10000 0 50%;
-  width: 0;
-}
-@media (min-height: 640px) {
-  .win-contentdialog .win-contentdialog-dialog {
-    -ms-flex: 0 1 auto;
-    -webkit-flex: 0 1 auto;
-    flex: 0 1 auto;
-  }
-  .win-contentdialog .win-contentdialog-column0or1 {
-    display: none;
-  }
-}
-.win-contentdialog .win-contentdialog-scroller {
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-  overflow: auto;
-}
-.win-contentdialog .win-contentdialog-title {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  font-size: 20px;
-  font-weight: 400;
-  line-height: 1.2;
-  margin: 0;
-}
-.win-contentdialog .win-contentdialog-content {
-  -ms-flex: 1 0 auto;
-  -webkit-flex: 1 0 auto;
-  flex: 1 0 auto;
-  font-size: 15px;
-  font-weight: 400;
-  line-height: 1.333;
-}
-.win-contentdialog .win-contentdialog-commands {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  margin-top: 24px;
-  margin-right: -4px;
-  /* Chop off margin on last command */
-}
-.win-contentdialog .win-contentdialog-commandspacer {
-  visibility: hidden;
-}
-.win-contentdialog .win-contentdialog-commands > button {
-  /* Each command should have the same width. Flexbox distributes widths using each
-           item's width and flex-grow as weights. Giving each command a flex-grow of 1
-           and a width of 0 causes each item to have equal weights and thus equal widths.
-         */
-  -ms-flex: 1 1 auto;
-  -webkit-flex: 1 1 auto;
-  flex: 1 1 auto;
-  width: 0;
-  margin-right: 4px;
-  /* 4px of space between each command */
-  white-space: nowrap;
-}
-.win-splitview {
-  position: relative;
-  width: 100%;
-  height: 100%;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-  overflow: hidden;
-}
-.win-splitview.win-splitview-placementtop,
-.win-splitview.win-splitview-placementbottom {
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-}
-.win-splitview.win-splitview-placementtop .win-splitview-panewrapper,
-.win-splitview.win-splitview-placementbottom .win-splitview-panewrapper {
-  -ms-flex-direction: column;
-  -webkit-flex-direction: column;
-  flex-direction: column;
-}
-.win-splitview .win-splitview-panewrapper {
-  position: relative;
-  z-index: 1;
-  outline: none;
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  overflow: hidden;
-  display: -ms-flexbox;
-  display: -webkit-flex;
-  display: flex;
-}
-.win-splitview .win-splitview-paneoutline {
-  display: none;
-  pointer-events: none;
-  position: absolute;
-  top: 0;
-  left: 0;
-  border: 1px solid transparent;
-  width: calc(100% - 2px);
-  height: calc(100% - 2px);
-  z-index: 1;
-}
-.win-splitview .win-splitview-pane {
-  outline: none;
-}
-.win-splitview .win-splitview-pane,
-.win-splitview .win-splitview-paneplaceholder {
-  -ms-flex: 0 0 auto;
-  -webkit-flex: 0 0 auto;
-  flex: 0 0 auto;
-  overflow: hidden;
-}
-.win-splitview .win-splitview-contentwrapper {
-  position: relative;
-  z-index: 0;
-  -ms-flex: 1 1 0%;
-  -webkit-flex: 1 1 0%;
-  flex: 1 1 0%;
-  overflow: hidden;
-}
-.win-splitview .win-splitview-content {
-  position: absolute;
-  width: 100%;
-  height: 100%;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-placementleft .win-splitview-pane,
-.win-splitview.win-splitview-pane-opened.win-splitview-placementright .win-splitview-pane {
-  width: 320px;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-placementtop .win-splitview-pane,
-.win-splitview.win-splitview-pane-opened.win-splitview-placementbottom .win-splitview-pane {
-  height: 60px;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementtop .win-splitview-panewrapper {
-  position: absolute;
-  top: 0;
-  left: 0;
-  width: 100%;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementbottom .win-splitview-panewrapper {
-  position: absolute;
-  bottom: 0;
-  left: 0;
-  width: 100%;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft {
-  position: static;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft .win-splitview-panewrapper {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: auto;
-  height: 100%;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ar) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(dv) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(fa) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(he) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ku-Arab) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(pa-Arab) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(prs) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ps) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(sd-Arab) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(syr) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ug) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ur) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(qps-plocm) .win-splitview-panewrapper {
-  position: absolute;
-  top: 0;
-  left: auto;
-  right: 0;
-  height: 100%;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright .win-splitview-panewrapper {
-  position: absolute;
-  top: 0;
-  left: auto;
-  right: 0;
-  height: 100%;
-}
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ar) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(dv) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(fa) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(he) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ku-Arab) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(pa-Arab) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(prs) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ps) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(sd-Arab) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(syr) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ug) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ur) .win-splitview-panewrapper,
-.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(qps-plocm) .win-splitview-panewrapper {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: auto;
-  height: 100%;
-}
-.win-splitview.win-splitview-pane-closed .win-splitview-paneplaceholder {
-  display: none;
-}
-.win-splitview.win-splitview-pane-closed.win-splitview-placementtop .win-splitview-pane,
-.win-splitview.win-splitview-pane-closed.win-splitview-placementbottom .win-splitview-pane {
-  height: 24px;
-}
-.win-splitview.win-splitview-pane-closed.win-splitview-placementleft .win-splitview-pane,
-.win-splitview.win-splitview-pane-closed.win-splitview-placementright .win-splitview-pane {
-  width: 48px;
-}
-.win-splitview.win-splitview-pane-closed.win-splitview-closeddisplaynone .win-splitview-pane {
-  display: none;
-}
-.win-splitview.win-splitview-openeddisplayinline .win-splitview-paneplaceholder {
-  display: none;
-}
-button.win-splitviewpanetoggle {
-  touch-action: manipulation;
-  box-sizing: border-box;
-  height: 48px;
-  width: 48px;
-  min-height: 0;
-  min-width: 0;
-  padding: 0;
-  border: none;
-  margin: 0;
-  outline: none;
-}
-button.win-splitviewpanetoggle:after {
-  font-size: 24px;
-  font-family: 'Segoe MDL2 Assets', 'Symbols';
-  font-weight: 400;
-  line-height: 1.333;
-  content: "\E700";
-}
-.win-appbar {
-  width: 100%;
-  min-width: 32px;
-  /* enough to fit the overflowbutton */
-  position: fixed;
-  position: -ms-device-fixed;
-  /* AppBar should overlay content in the body when opened or closed.
-     * This z-index value is chosen to be smaller than light dismissables.
-     * z-index will be overwritten by the light dismiss service to an even
-     * higher value when the AppBar is in the opened state.
-     */
-  z-index: 999;
-}
-.win-appbar.win-appbar-top {
-  top: 0;
-}
-.win-appbar.win-appbar-bottom {
-  bottom: 0;
-}
-.win-appbar.win-appbar-closed.win-appbar-closeddisplaynone {
-  display: none;
-}
-body {
-  background-color: #ffffff;
-  color: #000000;
-}
-.win-ui-light {
-  background-color: #ffffff;
-  color: #000000;
-}
-.win-ui-dark {
-  background-color: #000000;
-  color: #ffffff;
-}
-::selection {
-  color: #fff;
-}
-.win-link:hover {
-  color: rgba(0, 0, 0, 0.6);
-}
-.win-link:active {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-link[disabled] {
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-checkbox::-ms-check {
-  color: #000000;
-  border-color: rgba(0, 0, 0, 0.8);
-  background-color: transparent;
-}
-.win-checkbox:indeterminate::-ms-check {
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-checkbox:checked::-ms-check {
-  color: #fff;
-  border-color: transparent;
-}
-.win-checkbox:hover::-ms-check {
-  border-color: #000000;
-}
-.win-checkbox:hover:indeterminate::-ms-check {
-  color: #000000;
-}
-.win-checkbox:active::-ms-check {
-  border-color: transparent;
-  background-color: rgba(0, 0, 0, 0.6);
-}
-.win-checkbox:indeterminate:active::-ms-check {
-  color: rgba(0, 0, 0, 0.6);
-  border-color: rgba(0, 0, 0, 0.8);
-  background-color: transparent;
-}
-.win-checkbox:disabled::-ms-check,
-.win-checkbox:indeterminate:disabled::-ms-check {
-  color: rgba(0, 0, 0, 0.2);
-  border-color: rgba(0, 0, 0, 0.2);
-  background-color: transparent;
-}
-.win-radio::-ms-check {
-  color: rgba(0, 0, 0, 0.8);
-  border-color: rgba(0, 0, 0, 0.8);
-  background-color: transparent;
-}
-.win-radio:hover::-ms-check {
-  border-color: #000000;
-}
-.win-radio:hover::-ms-check {
-  color: #000000;
-}
-.win-radio:active::-ms-check {
-  color: rgba(0, 0, 0, 0.6);
-  border-color: rgba(0, 0, 0, 0.6);
-}
-.win-radio:disabled::-ms-check {
-  color: rgba(0, 0, 0, 0.2);
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.win-progress-bar:not(:indeterminate),
-.win-progress-ring:not(:indeterminate),
-.win-ring:not(:indeterminate) {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-progress-bar::-webkit-progress-bar,
-.win-progress-ring::-webkit-progress-bar,
-.win-ring::-webkit-progress-bar {
-  background-color: transparent;
-}
-.win-progress-ring,
-.win-ring {
-  background-color: transparent;
-}
-.win-button {
-  color: #000000;
-  background-color: rgba(0, 0, 0, 0.2);
-  border-color: transparent;
-}
-.win-button.win-button-primary {
-  color: #fff;
-}
-.win-button:hover,
-.win-button.win-button-primary:hover {
-  border-color: rgba(0, 0, 0, 0.4);
-}
-.win-button:active,
-.win-button.win-button-primary:active {
-  background-color: rgba(0, 0, 0, 0.4);
-}
-.win-button:disabled,
-.win-button.win-button-primary:disabled {
-  color: rgba(0, 0, 0, 0.2);
-  background-color: rgba(0, 0, 0, 0.2);
-  border-color: transparent;
-}
-.win-dropdown {
-  color: #000000;
-  background-color: rgba(0, 0, 0, 0.2);
-  border-color: rgba(0, 0, 0, 0.4);
-}
-.win-dropdown::-ms-expand {
-  color: rgba(0, 0, 0, 0.8);
-  background-color: transparent;
-}
-.win-dropdown:hover {
-  background-color: #f2f2f2;
-  border-color: rgba(0, 0, 0, 0.6);
-}
-.win-dropdown:disabled {
-  color: rgba(0, 0, 0, 0.2);
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-dropdown:disabled::-ms-expand {
-  color: rgba(0, 0, 0, 0.2);
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.win-dropdown option {
-  color: #000000;
-  background-color: #f2f2f2;
-}
-.win-dropdown option:checked {
-  color: #ffffff;
-}
-.win-dropdown option:hover,
-.win-dropdown option:active {
-  background-color: rgba(0, 0, 0, 0.2);
-  color: #000000;
-}
-.win-dropdown optgroup {
-  color: #000000;
-  background-color: #f2f2f2;
-}
-.win-dropdown optgroup:disabled {
-  color: rgba(0, 0, 0, 0.2);
-}
-select[multiple].win-dropdown {
-  border: none;
-  background-color: #f2f2f2;
-}
-select[multiple].win-dropdown option {
-  color: #000000;
-}
-select[multiple].win-dropdown option:hover {
-  color: #000000;
-}
-select[multiple].win-dropdown option:checked {
-  color: #ffffff;
-}
-.win-slider {
-  background-color: transparent;
-}
-.win-slider:hover::-ms-thumb {
-  background: #1f1f1f;
-}
-.win-slider:hover::-webkit-slider-thumb {
-  background: #1f1f1f;
-}
-.win-slider:hover::-moz-range-thumb {
-  background: #1f1f1f;
-}
-.win-slider:active::-ms-thumb {
-  background: #cccccc;
-}
-.win-slider:active::-webkit-slider-thumb {
-  background: #cccccc;
-}
-.win-slider:active::-moz-range-thumb {
-  background: #cccccc;
-}
-.win-slider:disabled::-ms-thumb {
-  background: #cccccc;
-}
-.win-slider:disabled::-webkit-slider-thumb {
-  background: #cccccc;
-}
-.win-slider:disabled::-moz-range-thumb {
-  background: #cccccc;
-}
-.win-slider:disabled::-ms-fill-lower {
-  background: rgba(0, 0, 0, 0.2);
-}
-.win-slider::-ms-fill-upper {
-  background: rgba(0, 0, 0, 0.4);
-}
-.win-slider::-webkit-slider-runnable-track {
-  background: rgba(0, 0, 0, 0.4);
-}
-.win-slider::-moz-range-track {
-  background: rgba(0, 0, 0, 0.4);
-}
-.win-slider:active::-ms-fill-upper {
-  background: rgba(0, 0, 0, 0.4);
-}
-.win-slider:active::-webkit-slider-runnable-track {
-  background: rgba(0, 0, 0, 0.4);
-}
-.win-slider:active::-moz-range-track {
-  background: rgba(0, 0, 0, 0.4);
-}
-.win-slider:disabled::-ms-fill-upper {
-  background: rgba(0, 0, 0, 0.2);
-}
-.win-slider:disabled::-webkit-slider-runnable-track {
-  background: rgba(0, 0, 0, 0.2);
-}
-.win-slider:disabled::-moz-range-track {
-  background: rgba(0, 0, 0, 0.2);
-}
-.win-slider::-ms-track {
-  color: transparent;
-  background-color: transparent;
-}
-.win-slider::-ms-ticks-before,
-.win-slider::-ms-ticks-after {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-textbox,
-.win-textarea {
-  color: #000000;
-  background-color: rgba(255, 255, 255, 0.4);
-  border-color: rgba(0, 0, 0, 0.4);
-}
-.win-textbox:-ms-input-placeholder,
-.win-textarea:-ms-input-placeholder {
-  color: rgba(0, 0, 0, 0.6);
-}
-.win-textbox::-webkit-input-placeholder,
-.win-textarea::-webkit-input-placeholder {
-  color: rgba(0, 0, 0, 0.6);
-}
-.win-textbox::-moz-input-placeholder,
-.win-textarea::-moz-input-placeholder {
-  color: rgba(0, 0, 0, 0.6);
-}
-.win-textbox:hover,
-.win-textarea:hover {
-  background-color: rgba(255, 255, 255, 0.6);
-  border-color: rgba(0, 0, 0, 0.6);
-}
-.win-textbox:focus,
-.win-textarea:focus {
-  color: #000000;
-  background-color: #ffffff;
-}
-.win-textbox::-ms-clear,
-.win-textbox::-ms-reveal {
-  display: block;
-  color: rgba(0, 0, 0, 0.6);
-}
-.win-textbox::-ms-clear:active,
-.win-textbox::-ms-reveal:active {
-  color: #ffffff;
-}
-.win-xbox :focus {
-  outline: 2px solid white;
-}
-.win-selectionmode .win-itemcontainer.win-container .win-itembox::after,
-.win-itemcontainer.win-selectionmode.win-container .win-itembox::after,
-.win-listview .win-surface.win-selectionmode .win-itembox::after {
-  border-color: #000000;
-  background-color: #e6e6e6;
-}
-.win-selectioncheckmark {
-  color: #000000;
-}
-html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,
-html.win-hoverable .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,
-html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox,
-.win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,
-.win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,
-.win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-listview .win-itembox,
-.win-itemcontainer .win-itembox {
-  background-color: #ffffff;
-}
-.win-listview .win-container.win-backdrop {
-  background-color: rgba(155, 155, 155, 0.23);
-}
-.win-listview .win-groupheader {
-  outline-color: #000000;
-}
-.win-listview .win-focusedoutline,
-.win-itemcontainer .win-focusedoutline {
-  outline: #000000 dashed 2px;
-}
-.win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,
-.win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground {
-  opacity: 0.4;
-}
-.win-listview.win-selectionstylefilled .win-selected,
-.win-itemcontainer.win-selectionstylefilled.win-selected {
-  color: #000000;
-}
-.win-flipview .win-navbutton {
-  background-color: rgba(0, 0, 0, 0.4);
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-flipview .win-navbutton:hover:active {
-  background-color: rgba(0, 0, 0, 0.8);
-}
-html.win-hoverable .win-flipview .win-navbutton:hover {
-  background-color: rgba(0, 0, 0, 0.6);
-}
-.win-backbutton,
-.win-back,
-.win-navigation-backbutton {
-  background-color: transparent;
-  border: none;
-  color: #000000;
-}
-.win-backbutton:hover,
-.win-navigation-backbutton:hover .win-back {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-.win-backbutton:active,
-.win-navigation-backbutton:active .win-back {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-backbutton:disabled,
-.win-backbutton:disabled:active,
-.win-navigation-backbutton:disabled,
-.win-navigation-backbutton:disabled .win-back,
-.win-navigation-backbutton:disabled:active .win-back {
-  color: rgba(0, 0, 0, 0.4);
-  background-color: transparent;
-}
-.win-backbutton:focus,
-.win-navigation-backbutton:focus .win-back {
-  outline-color: #000000;
-}
-.win-tooltip {
-  color: #000000;
-  border-color: #cccccc;
-  background-color: #f2f2f2;
-}
-.win-rating .win-star.win-tentative.win-full {
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-rating .win-star.win-average.win-full,
-.win-rating .win-star.win-average.win-full.win-disabled {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-rating .win-star.win-empty {
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-toggleswitch-header,
-.win-toggleswitch-value {
-  color: #000000;
-}
-.win-toggleswitch-thumb {
-  background-color: rgba(0, 0, 0, 0.8);
-}
-.win-toggleswitch-off .win-toggleswitch-track {
-  border-color: rgba(0, 0, 0, 0.8);
-}
-.win-toggleswitch-pressed .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-.win-toggleswitch-pressed .win-toggleswitch-track {
-  border-color: transparent;
-  background-color: rgba(0, 0, 0, 0.6);
-}
-.win-toggleswitch-disabled .win-toggleswitch-header,
-.win-toggleswitch-disabled .win-toggleswitch-value {
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-toggleswitch-disabled .win-toggleswitch-thumb {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-toggleswitch-disabled .win-toggleswitch-track {
-  border-color: rgba(0, 0, 0, 0.2);
-}
-.win-toggleswitch-on .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-.win-toggleswitch-on .win-toggleswitch-track {
-  border-color: transparent;
-}
-.win-toggleswitch-on.win-toggleswitch-pressed .win-toggleswitch-track {
-  background-color: rgba(0, 0, 0, 0.6);
-}
-.win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-thumb {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-semanticzoom-button {
-  background-color: rgba(216, 216, 216, 0.33);
-  border-color: transparent;
-}
-button.win-semanticzoom-button.win-semanticzoom-button:active,
-button.win-semanticzoom-button.win-semanticzoom-button:hover:active {
-  background-color: #000000;
-}
-.win-pivot .win-pivot-title {
-  color: #000000;
-}
-.win-pivot .win-pivot-navbutton {
-  background-color: rgba(0, 0, 0, 0.4);
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active {
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-pivot button.win-pivot-header {
-  color: rgba(0, 0, 0, 0.6);
-  background-color: transparent;
-}
-.win-pivot button.win-pivot-header:focus,
-.win-pivot button.win-pivot-header.win-pivot-header:hover:active {
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-pivot button.win-pivot-header.win-pivot-header-selected {
-  color: #000000;
-  background-color: transparent;
-}
-.win-pivot-header[disabled] {
-  color: rgba(0, 0, 0, 0.4);
-}
-button.win-hub-section-header-tabstop,
-button.win-hub-section-header-tabstop:hover:active {
-  color: #000000;
-}
-button.win-hub-section-header-tabstop.win-keyboard:focus {
-  outline: 1px dotted #000000;
-}
-button.win-hub-section-header-tabstop:-ms-keyboard-active {
-  color: #000000;
-}
-button.win-hub-section-header-tabstop.win-hub-section-header-interactive.win-hub-section-header-interactive:hover:active {
-  color: rgba(0, 0, 0, 0.4);
-}
-button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-overlay {
-  outline: none;
-}
-hr.win-command {
-  background-color: rgba(0, 0, 0, 0.4);
-}
-div.win-command,
-button.win-command {
-  border-color: transparent;
-  background-color: transparent;
-}
-div.win-command:hover:active,
-button.win-command:hover:active {
-  border-color: transparent;
-}
-button:enabled.win-command.win-keyboard:focus,
-div.win-command.win-keyboard:focus,
-button:enabled.win-command.win-command.win-keyboard:hover:focus,
-div.win-command.win-command.win-keyboard:hover:focus {
-  border-color: #000000;
-}
-.win-commandimage {
-  color: #000000;
-}
-button.win-command.win-command:enabled:hover:active,
-button.win-command.win-command:enabled:active {
-  background-color: rgba(0, 0, 0, 0.2);
-  color: #000000;
-}
-button:enabled:hover:active .win-commandimage,
-button:enabled:active .win-commandimage {
-  color: #000000;
-}
-button:disabled .win-commandimage,
-button:disabled:active .win-commandimage {
-  color: rgba(0, 0, 0, 0.2);
-}
-button .win-label {
-  color: #000000;
-}
-button[aria-checked=true]:enabled .win-label,
-button[aria-checked=true]:enabled .win-commandimage,
-button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {
-  color: #000000;
-}
-button[aria-checked=true]:-ms-keyboard-active .win-commandimage {
-  color: #000000;
-}
-button[aria-checked=true].win-command:before {
-  position: absolute;
-  height: 100%;
-  width: 100%;
-  opacity: 0.4;
-  box-sizing: content-box;
-  content: "";
-  /* We want this pseudo element to cover the border of its parent. */
-  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/
-  border-width: 1px;
-  border-style: solid;
-  top: -1px;
-  left: -1px;
-}
-button.win-command:enabled:-ms-keyboard-active {
-  background-color: rgba(0, 0, 0, 0.2);
-  color: #000000;
-}
-button[aria-checked=true].win-command:enabled:hover:active {
-  background-color: transparent;
-}
-button.win-command:disabled,
-button.win-command:disabled:hover:active {
-  background-color: transparent;
-  border-color: transparent;
-}
-button.win-command:disabled .win-label,
-button.win-command:disabled:active .win-label {
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-navbar,
-.win-navbar {
-  background-color: #e6e6e6;
-  border-color: #e6e6e6;
-}
-.win-navbar.win-menulayout .win-navbar-menu,
-.win-navbar.win-menulayout .win-navbar-menu,
-.win-navbar.win-menulayout .win-toolbar,
-.win-navbar.win-menulayout .win-toolbar {
-  background-color: inherit;
-}
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton {
-  background-color: transparent;
-  outline: none;
-  border-color: transparent;
-}
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active {
-  background-color: transparent;
-}
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis {
-  color: #000000;
-}
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus {
-  border-color: #000000;
-}
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active {
-  background-color: transparent;
-}
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,
-.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis {
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis {
-  color: #000000;
-}
-.win-flyout,
-.win-flyout {
-  background-color: #ffffff;
-}
-.win-settingsflyout {
-  background-color: #ffffff;
-}
-.win-menu button,
-.win-menu button {
-  background-color: transparent;
-  color: #000000;
-}
-.win-menu button.win-command.win-command:enabled:hover:active,
-.win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active {
-  background-color: rgba(0, 0, 0, 0.2);
-  color: #000000;
-}
-.win-menu-containsflyoutcommand button.win-command-flyout-activated:before,
-.win-menu-containsflyoutcommand button.win-command-flyout-activated:before {
-  position: absolute;
-  height: 100%;
-  width: 100%;
-  opacity: 0.4;
-  content: "";
-  box-sizing: content-box;
-  /* We want this pseudo element to cover the border of its parent. */
-  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/
-  border-width: 1px;
-  border-style: solid;
-  top: -1px;
-  left: -1px;
-}
-.win-menu button[aria-checked=true].win-command:before,
-.win-menu button[aria-checked=true].win-command:before {
-  background-color: transparent;
-  border-color: transparent;
-}
-.win-menu button:disabled,
-.win-menu button:disabled,
-.win-menu button:disabled:active,
-.win-menu button:disabled:active {
-  background-color: transparent;
-  color: rgba(0, 0, 0, 0.2);
-}
-.win-commandingsurface .win-commandingsurface-actionarea,
-.win-commandingsurface .win-commandingsurface-actionarea {
-  background-color: #e6e6e6;
-}
-.win-commandingsurface button.win-commandingsurface-overflowbutton,
-.win-commandingsurface button.win-commandingsurface-overflowbutton {
-  background-color: transparent;
-  border-color: transparent;
-}
-.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,
-.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active {
-  background-color: transparent;
-}
-.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,
-.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis {
-  color: #000000;
-}
-.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,
-.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus {
-  border-color: #000000;
-}
-.win-commandingsurface .win-commandingsurface-overflowarea,
-.win-commandingsurface .win-commandingsurface-overflowarea {
-  background-color: #f2f2f2;
-}
-.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,
-.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,
-.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active {
-  color: #000000;
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-autosuggestbox-flyout-highlighttext {
-  color: #4617b4;
-}
-.win-autosuggestbox-suggestion-separator {
-  color: #7a7a7a;
-}
-.win-autosuggestbox-suggestion-separator hr {
-  border-color: #7a7a7a;
-}
-.win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext {
-  color: #a38bda;
-}
-.win-autosuggestbox-flyout {
-  background-color: #f2f2f2;
-  color: #000000;
-}
-.win-autosuggestbox-suggestion-result:hover:active,
-.win-autosuggestbox-suggestion-query:hover:active {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-searchbox-button {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-searchbox-button-input-focus {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {
-  color: #ffffff;
-}
-.win-splitviewcommand-button {
-  background-color: transparent;
-  color: #000000;
-}
-.win-splitviewcommand-button.win-pressed {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-splitviewcommand-button.win-keyboard:focus::before {
-  content: "";
-  pointer-events: none;
-  position: absolute;
-  box-sizing: border-box;
-  top: 0;
-  left: 0;
-  height: 100%;
-  width: 100%;
-  border: 1px dotted #000000;
-}
-.win-navbarcontainer-pageindicator {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-.win-navbarcontainer-pageindicator-current {
-  background-color: rgba(0, 0, 0, 0.6);
-}
-.win-navbarcontainer-navarrow {
-  background-color: rgba(0, 0, 0, 0.4);
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-navbarcontainer-navarrow.win-navbarcontainer-navarrow:hover:active {
-  background-color: rgba(0, 0, 0, 0.8);
-}
-.win-navbarcommand-button,
-.win-navbarcommand-splitbutton {
-  background-color: rgba(0, 0, 0, 0.1);
-  color: #000000;
-}
-.win-navbarcommand-button.win-pressed,
-.win-navbarcommand-splitbutton.win-pressed {
-  background-color: rgba(0, 0, 0, 0.28);
-}
-.win-navbarcommand-button.win-keyboard:focus::before {
-  content: "";
-  pointer-events: none;
-  position: absolute;
-  box-sizing: border-box;
-  top: 0;
-  left: 0;
-  height: 100%;
-  width: 100%;
-  border: 1px dotted #000000;
-}
-.win-navbarcommand-splitbutton.win-keyboard:focus::before {
-  border-color: #000000;
-}
-.win-contentdialog-dialog {
-  background-color: #f2f2f2;
-}
-.win-contentdialog-title {
-  color: #000000;
-}
-.win-contentdialog-content {
-  color: #000000;
-}
-.win-contentdialog-backgroundoverlay {
-  background-color: #ffffff;
-  opacity: 0.6;
-}
-.win-splitview-pane {
-  background-color: #f2f2f2;
-}
-button.win-splitviewpanetoggle {
-  color: #000000;
-  background-color: transparent;
-}
-button.win-splitviewpanetoggle:active,
-button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover {
-  color: #000000;
-  background-color: rgba(0, 0, 0, 0.2);
-}
-button.win-splitviewpanetoggle.win-keyboard:focus {
-  border: 1px dotted #000000;
-}
-button.win-splitviewpanetoggle:disabled,
-button.win-splitviewpanetoggle:disabled:active,
-button.win-splitviewpanetoggle.win-splitviewpanetoggle:disabled:hover {
-  color: rgba(0, 0, 0, 0.2);
-  background-color: transparent;
-}
-html.win-hoverable {
-  /* LegacyAppBar control colors */
-}
-html.win-hoverable .win-selectionstylefilled .win-container:hover .win-itembox,
-html.win-hoverable .win-selectionstylefilled.win-container:hover .win-itembox {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-html.win-hoverable .win-listview .win-itembox:hover::before,
-html.win-hoverable .win-itemcontainer .win-itembox:hover::before {
-  border-color: #000000;
-}
-html.win-hoverable .win-listview .win-container.win-selected:hover .win-selectionborder,
-html.win-hoverable .win-itemcontainer.win-container.win-selected:hover .win-selectionborder,
-html.win-hoverable .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,
-html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground {
-  opacity: 0.6;
-}
-html.win-hoverable .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {
-  background-color: #000000;
-}
-html.win-hoverable .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed).win-toggleswitch-on .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-html.win-hoverable .win-toggleswitch-off:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track {
-  border-color: #000000;
-}
-html.win-hoverable button:hover.win-semanticzoom-button {
-  background-color: #d8d8d8;
-}
-html.win-hoverable .win-pivot .win-pivot-navbutton:hover {
-  color: rgba(0, 0, 0, 0.6);
-}
-html.win-hoverable .win-pivot button.win-pivot-header:hover {
-  color: baseMediumHigh;
-}
-html.win-hoverable button.win-hub-section-header-tabstop:hover {
-  color: #000000;
-}
-html.win-hoverable button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover {
-  color: rgba(0, 0, 0, 0.8);
-}
-html.win-hoverable.win-navbar button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-navbar button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable.win-navbar button.win-navbar-invokebutton:disabled:hover,
-html.win-hoverable .win-navbar button.win-navbar-invokebutton:disabled:hover {
-  background-color: transparent;
-}
-html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {
-  color: #000000;
-}
-html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {
-  color: #000000;
-}
-html.win-hoverable button.win-command:enabled:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-  color: #000000;
-}
-html.win-hoverable button.win-command:enabled:hover .win-commandglyph {
-  color: #000000;
-}
-html.win-hoverable .win-menu button.win-command:enabled:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-  color: #000000;
-}
-html.win-hoverable button[aria-checked=true].win-command:hover {
-  background-color: transparent;
-}
-html.win-hoverable button:enabled[aria-checked=true].win-command:hover:before {
-  opacity: 0.6;
-}
-html.win-hoverable button:enabled[aria-checked=true].win-command:hover:active:before {
-  opacity: 0.7;
-}
-html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover,
-html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,
-html.win-hoverable.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,
-html.win-hoverable .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,
-html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis {
-  color: #000000;
-}
-html.win-hoverable .win-autosuggestbox-suggestion-result:hover,
-html.win-hoverable .win-autosuggestbox-suggestion-query:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-html.win-hoverable .win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {
-  color: #ffffff;
-}
-html.win-hoverable .win-splitviewcommand-button:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-html.win-hoverable .win-splitviewcommand-button:hover.win-pressed {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-html.win-hoverable .win-navbarcontainer-navarrow:hover {
-  background-color: rgba(0, 0, 0, 0.6);
-}
-html.win-hoverable .win-navbarcommand-button:hover,
-html.win-hoverable .win-navbarcommand-splitbutton:hover {
-  background-color: rgba(0, 0, 0, 0.19);
-}
-html.win-hoverable .win-navbarcommand-button:hover.win-pressed,
-html.win-hoverable .win-navbarcommand-splitbutton:hover.win-pressed {
-  background-color: rgba(0, 0, 0, 0.28);
-}
-html.win-hoverable button.win-splitviewpanetoggle:hover {
-  color: #000000;
-  background-color: rgba(0, 0, 0, 0.1);
-}
-.win-ui-dark body {
-  background-color: #000000;
-  color: #ffffff;
-}
-.win-ui-dark .win-ui-dark {
-  background-color: #000000;
-  color: #ffffff;
-}
-.win-ui-dark .win-ui-light {
-  background-color: #ffffff;
-  color: #000000;
-}
-.win-ui-dark winjs-themedetection-tag {
-  opacity: 0;
-}
-.win-ui-dark ::selection {
-  color: #fff;
-}
-.win-ui-dark .win-link:hover {
-  color: rgba(255, 255, 255, 0.6);
-}
-.win-ui-dark .win-link:active {
-  color: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-link[disabled] {
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-checkbox::-ms-check {
-  color: #ffffff;
-  border-color: rgba(255, 255, 255, 0.8);
-  background-color: transparent;
-}
-.win-ui-dark .win-checkbox:indeterminate::-ms-check {
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-ui-dark .win-checkbox:checked::-ms-check {
-  color: #fff;
-  border-color: transparent;
-}
-.win-ui-dark .win-checkbox:hover::-ms-check {
-  border-color: #ffffff;
-}
-.win-ui-dark .win-checkbox:hover:indeterminate::-ms-check {
-  color: #ffffff;
-}
-.win-ui-dark .win-checkbox:active::-ms-check {
-  border-color: transparent;
-  background-color: rgba(255, 255, 255, 0.6);
-}
-.win-ui-dark .win-checkbox:indeterminate:active::-ms-check {
-  color: rgba(255, 255, 255, 0.6);
-  border-color: rgba(255, 255, 255, 0.8);
-  background-color: transparent;
-}
-.win-ui-dark .win-checkbox:disabled::-ms-check,
-.win-ui-dark .win-checkbox:indeterminate:disabled::-ms-check {
-  color: rgba(255, 255, 255, 0.2);
-  border-color: rgba(255, 255, 255, 0.2);
-  background-color: transparent;
-}
-.win-ui-dark .win-radio::-ms-check {
-  color: rgba(255, 255, 255, 0.8);
-  border-color: rgba(255, 255, 255, 0.8);
-  background-color: transparent;
-}
-.win-ui-dark .win-radio:hover::-ms-check {
-  border-color: #ffffff;
-}
-.win-ui-dark .win-radio:hover::-ms-check {
-  color: #ffffff;
-}
-.win-ui-dark .win-radio:active::-ms-check {
-  color: rgba(255, 255, 255, 0.6);
-  border-color: rgba(255, 255, 255, 0.6);
-}
-.win-ui-dark .win-radio:disabled::-ms-check {
-  color: rgba(255, 255, 255, 0.2);
-  border-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-progress-bar:not(:indeterminate),
-.win-ui-dark .win-progress-ring:not(:indeterminate),
-.win-ui-dark .win-ring:not(:indeterminate) {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-progress-bar::-webkit-progress-bar,
-.win-ui-dark .win-progress-ring::-webkit-progress-bar,
-.win-ui-dark .win-ring::-webkit-progress-bar {
-  background-color: transparent;
-}
-.win-ui-dark .win-progress-ring,
-.win-ui-dark .win-ring {
-  background-color: transparent;
-}
-.win-ui-dark .win-button {
-  color: #ffffff;
-  background-color: rgba(255, 255, 255, 0.2);
-  border-color: transparent;
-}
-.win-ui-dark .win-button.win-button-primary {
-  color: #fff;
-}
-.win-ui-dark .win-button:hover,
-.win-ui-dark .win-button.win-button-primary:hover {
-  border-color: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-button:active,
-.win-ui-dark .win-button.win-button-primary:active {
-  background-color: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-button:disabled,
-.win-ui-dark .win-button.win-button-primary:disabled {
-  color: rgba(255, 255, 255, 0.2);
-  background-color: rgba(255, 255, 255, 0.2);
-  border-color: transparent;
-}
-.win-ui-dark .win-dropdown {
-  color: #ffffff;
-  background-color: rgba(255, 255, 255, 0.2);
-  border-color: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-dropdown::-ms-expand {
-  color: rgba(255, 255, 255, 0.8);
-  background-color: transparent;
-}
-.win-ui-dark .win-dropdown:hover {
-  background-color: #2b2b2b;
-  border-color: rgba(255, 255, 255, 0.6);
-}
-.win-ui-dark .win-dropdown:disabled {
-  color: rgba(255, 255, 255, 0.2);
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-dropdown:disabled::-ms-expand {
-  color: rgba(255, 255, 255, 0.2);
-  border-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-dropdown option {
-  color: #ffffff;
-  background-color: #2b2b2b;
-}
-.win-ui-dark .win-dropdown option:checked {
-  color: #ffffff;
-}
-.win-ui-dark .win-dropdown option:hover,
-.win-ui-dark .win-dropdown option:active {
-  background-color: rgba(0, 0, 0, 0.2);
-  color: #ffffff;
-}
-.win-ui-dark .win-dropdown optgroup {
-  color: #ffffff;
-  background-color: #2b2b2b;
-}
-.win-ui-dark .win-dropdown optgroup:disabled {
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark select[multiple].win-dropdown {
-  border: none;
-  background-color: #2b2b2b;
-}
-.win-ui-dark select[multiple].win-dropdown option {
-  color: #ffffff;
-}
-.win-ui-dark select[multiple].win-dropdown option:hover {
-  color: #ffffff;
-}
-.win-ui-dark select[multiple].win-dropdown option:checked {
-  color: #ffffff;
-}
-.win-ui-dark .win-slider {
-  background-color: transparent;
-}
-.win-ui-dark .win-slider:hover::-ms-thumb {
-  background: #f9f9f9;
-}
-.win-ui-dark .win-slider:hover::-webkit-slider-thumb {
-  background: #f9f9f9;
-}
-.win-ui-dark .win-slider:hover::-moz-range-thumb {
-  background: #f9f9f9;
-}
-.win-ui-dark .win-slider:active::-ms-thumb {
-  background: #767676;
-}
-.win-ui-dark .win-slider:active::-webkit-slider-thumb {
-  background: #767676;
-}
-.win-ui-dark .win-slider:active::-moz-range-thumb {
-  background: #767676;
-}
-.win-ui-dark .win-slider:disabled::-ms-thumb {
-  background: #333333;
-}
-.win-ui-dark .win-slider:disabled::-webkit-slider-thumb {
-  background: #333333;
-}
-.win-ui-dark .win-slider:disabled::-moz-range-thumb {
-  background: #333333;
-}
-.win-ui-dark .win-slider:disabled::-ms-fill-lower {
-  background: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-slider::-ms-fill-upper {
-  background: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-slider::-webkit-slider-runnable-track {
-  background: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-slider::-moz-range-track {
-  background: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-slider:active::-ms-fill-upper {
-  background: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-slider:active::-webkit-slider-runnable-track {
-  background: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-slider:active::-moz-range-track {
-  background: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-slider:disabled::-ms-fill-upper {
-  background: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-slider:disabled::-webkit-slider-runnable-track {
-  background: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-slider:disabled::-moz-range-track {
-  background: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-slider::-ms-track {
-  color: transparent;
-  background-color: transparent;
-}
-.win-ui-dark .win-slider::-ms-ticks-before,
-.win-ui-dark .win-slider::-ms-ticks-after {
-  color: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-textbox,
-.win-ui-dark .win-textarea {
-  color: #ffffff;
-  background-color: rgba(0, 0, 0, 0.4);
-  border-color: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-textbox:-ms-input-placeholder,
-.win-ui-dark .win-textarea:-ms-input-placeholder {
-  color: rgba(255, 255, 255, 0.6);
-}
-.win-ui-dark .win-textbox::-webkit-input-placeholder,
-.win-ui-dark .win-textarea::-webkit-input-placeholder {
-  color: rgba(255, 255, 255, 0.6);
-}
-.win-ui-dark .win-textbox::-moz-input-placeholder,
-.win-ui-dark .win-textarea::-moz-input-placeholder {
-  color: rgba(255, 255, 255, 0.6);
-}
-.win-ui-dark .win-textbox:hover,
-.win-ui-dark .win-textarea:hover {
-  background-color: rgba(0, 0, 0, 0.6);
-  border-color: rgba(255, 255, 255, 0.6);
-}
-.win-ui-dark .win-textbox:focus,
-.win-ui-dark .win-textarea:focus {
-  color: #000000;
-  background-color: #ffffff;
-}
-.win-ui-dark .win-textbox::-ms-clear,
-.win-ui-dark .win-textbox::-ms-reveal {
-  display: block;
-  color: rgba(0, 0, 0, 0.6);
-}
-.win-ui-dark .win-textbox::-ms-clear:active,
-.win-ui-dark .win-textbox::-ms-reveal:active {
-  color: #ffffff;
-}
-.win-ui-dark .win-xbox :focus {
-  outline: 2px solid white;
-}
-.win-ui-dark .win-selectionmode .win-itemcontainer.win-container .win-itembox::after,
-.win-ui-dark .win-itemcontainer.win-selectionmode.win-container .win-itembox::after,
-.win-ui-dark .win-listview .win-surface.win-selectionmode .win-itembox::after {
-  border-color: #ffffff;
-  background-color: #393939;
-}
-.win-ui-dark .win-selectioncheckmark {
-  color: #ffffff;
-}
-.win-ui-dark html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,
-.win-ui-dark html.win-hoverable .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,
-.win-ui-dark html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox,
-.win-ui-dark .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,
-.win-ui-dark .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,
-.win-ui-dark .win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-listview .win-itembox,
-.win-ui-dark .win-itemcontainer .win-itembox {
-  background-color: #1d1d1d;
-}
-.win-ui-dark .win-listview .win-container.win-backdrop {
-  background-color: rgba(155, 155, 155, 0.23);
-}
-.win-ui-dark .win-listview .win-groupheader {
-  outline-color: #ffffff;
-}
-.win-ui-dark .win-listview .win-focusedoutline,
-.win-ui-dark .win-itemcontainer .win-focusedoutline {
-  outline: #ffffff dashed 2px;
-}
-.win-ui-dark .win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,
-.win-ui-dark .win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground {
-  opacity: 0.6;
-}
-.win-ui-dark .win-listview.win-selectionstylefilled .win-selected,
-.win-ui-dark .win-itemcontainer.win-selectionstylefilled.win-selected {
-  color: #ffffff;
-}
-.win-ui-dark .win-flipview .win-navbutton {
-  background-color: rgba(255, 255, 255, 0.4);
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-ui-dark .win-flipview .win-navbutton:hover:active {
-  background-color: rgba(255, 255, 255, 0.8);
-}
-.win-ui-dark html.win-hoverable .win-flipview .win-navbutton:hover {
-  background-color: rgba(255, 255, 255, 0.6);
-}
-.win-ui-dark .win-backbutton,
-.win-ui-dark .win-back,
-.win-ui-dark .win-navigation-backbutton {
-  background-color: transparent;
-  border: none;
-  color: #ffffff;
-}
-.win-ui-dark .win-backbutton:hover,
-.win-ui-dark .win-navigation-backbutton:hover .win-back {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-.win-ui-dark .win-backbutton:active,
-.win-ui-dark .win-navigation-backbutton:active .win-back {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-backbutton:disabled,
-.win-ui-dark .win-backbutton:disabled:active,
-.win-ui-dark .win-navigation-backbutton:disabled,
-.win-ui-dark .win-navigation-backbutton:disabled .win-back,
-.win-ui-dark .win-navigation-backbutton:disabled:active .win-back {
-  color: rgba(255, 255, 255, 0.4);
-  background-color: transparent;
-}
-.win-ui-dark .win-backbutton:focus,
-.win-ui-dark .win-navigation-backbutton:focus .win-back {
-  outline-color: #ffffff;
-}
-.win-ui-dark .win-tooltip {
-  color: #ffffff;
-  border-color: #767676;
-  background-color: #2b2b2b;
-}
-.win-ui-dark .win-rating .win-star.win-tentative.win-full {
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-ui-dark .win-rating .win-star.win-average.win-full,
-.win-ui-dark .win-rating .win-star.win-average.win-full.win-disabled {
-  color: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-rating .win-star.win-empty {
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-toggleswitch-header,
-.win-ui-dark .win-toggleswitch-value {
-  color: #ffffff;
-}
-.win-ui-dark .win-toggleswitch-thumb {
-  background-color: rgba(255, 255, 255, 0.8);
-}
-.win-ui-dark .win-toggleswitch-off .win-toggleswitch-track {
-  border-color: rgba(255, 255, 255, 0.8);
-}
-.win-ui-dark .win-toggleswitch-pressed .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-.win-ui-dark .win-toggleswitch-pressed .win-toggleswitch-track {
-  border-color: transparent;
-  background-color: rgba(255, 255, 255, 0.6);
-}
-.win-ui-dark .win-toggleswitch-disabled .win-toggleswitch-header,
-.win-ui-dark .win-toggleswitch-disabled .win-toggleswitch-value {
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-toggleswitch-disabled .win-toggleswitch-thumb {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-toggleswitch-disabled .win-toggleswitch-track {
-  border-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-toggleswitch-on .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-.win-ui-dark .win-toggleswitch-on .win-toggleswitch-track {
-  border-color: transparent;
-}
-.win-ui-dark .win-toggleswitch-on.win-toggleswitch-pressed .win-toggleswitch-track {
-  background-color: rgba(255, 255, 255, 0.6);
-}
-.win-ui-dark .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-thumb {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-semanticzoom-button {
-  background-color: rgba(216, 216, 216, 0.33);
-  border-color: transparent;
-}
-.win-ui-dark button.win-semanticzoom-button.win-semanticzoom-button:active,
-.win-ui-dark button.win-semanticzoom-button.win-semanticzoom-button:hover:active {
-  background-color: #ffffff;
-}
-.win-ui-dark .win-pivot .win-pivot-title {
-  color: #ffffff;
-}
-.win-ui-dark .win-pivot .win-pivot-navbutton {
-  background-color: rgba(255, 255, 255, 0.4);
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-ui-dark .win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active {
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-ui-dark .win-pivot button.win-pivot-header {
-  color: rgba(255, 255, 255, 0.6);
-  background-color: transparent;
-}
-.win-ui-dark .win-pivot button.win-pivot-header:focus,
-.win-ui-dark .win-pivot button.win-pivot-header.win-pivot-header:hover:active {
-  color: rgba(255, 255, 255, 0.8);
-}
-.win-ui-dark .win-pivot button.win-pivot-header.win-pivot-header-selected {
-  color: #ffffff;
-  background-color: transparent;
-}
-.win-ui-dark .win-pivot-header[disabled] {
-  color: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark button.win-hub-section-header-tabstop,
-.win-ui-dark button.win-hub-section-header-tabstop:hover:active {
-  color: #ffffff;
-}
-.win-ui-dark button.win-hub-section-header-tabstop.win-keyboard:focus {
-  outline: 1px dotted #ffffff;
-}
-.win-ui-dark button.win-hub-section-header-tabstop:-ms-keyboard-active {
-  color: #ffffff;
-}
-.win-ui-dark button.win-hub-section-header-tabstop.win-hub-section-header-interactive.win-hub-section-header-interactive:hover:active {
-  color: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active {
-  color: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-overlay {
-  outline: none;
-}
-.win-ui-dark hr.win-command {
-  background-color: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark div.win-command,
-.win-ui-dark button.win-command {
-  border-color: transparent;
-  background-color: transparent;
-}
-.win-ui-dark div.win-command:hover:active,
-.win-ui-dark button.win-command:hover:active {
-  border-color: transparent;
-}
-.win-ui-dark button:enabled.win-command.win-keyboard:focus,
-.win-ui-dark div.win-command.win-keyboard:focus,
-.win-ui-dark button:enabled.win-command.win-command.win-keyboard:hover:focus,
-.win-ui-dark div.win-command.win-command.win-keyboard:hover:focus {
-  border-color: #ffffff;
-}
-.win-ui-dark .win-commandimage {
-  color: #ffffff;
-}
-.win-ui-dark button.win-command.win-command:enabled:hover:active,
-.win-ui-dark button.win-command.win-command:enabled:active {
-  background-color: rgba(255, 255, 255, 0.2);
-  color: #ffffff;
-}
-.win-ui-dark button:enabled:hover:active .win-commandimage,
-.win-ui-dark button:enabled:active .win-commandimage {
-  color: #ffffff;
-}
-.win-ui-dark button:disabled .win-commandimage,
-.win-ui-dark button:disabled:active .win-commandimage {
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark button .win-label {
-  color: #ffffff;
-}
-.win-ui-dark button[aria-checked=true]:enabled .win-label,
-.win-ui-dark button[aria-checked=true]:enabled .win-commandimage,
-.win-ui-dark button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {
-  color: #ffffff;
-}
-.win-ui-dark button[aria-checked=true]:-ms-keyboard-active .win-commandimage {
-  color: #ffffff;
-}
-.win-ui-dark button[aria-checked=true].win-command:before {
-  position: absolute;
-  height: 100%;
-  width: 100%;
-  opacity: 0.6;
-  box-sizing: content-box;
-  content: "";
-  /* We want this pseudo element to cover the border of its parent. */
-  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/
-  border-width: 1px;
-  border-style: solid;
-  top: -1px;
-  left: -1px;
-}
-.win-ui-dark button.win-command:enabled:-ms-keyboard-active {
-  background-color: rgba(255, 255, 255, 0.2);
-  color: #ffffff;
-}
-.win-ui-dark button[aria-checked=true].win-command:enabled:hover:active {
-  background-color: transparent;
-}
-.win-ui-dark button.win-command:disabled,
-.win-ui-dark button.win-command:disabled:hover:active {
-  background-color: transparent;
-  border-color: transparent;
-}
-.win-ui-dark button.win-command:disabled .win-label,
-.win-ui-dark button.win-command:disabled:active .win-label {
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark.win-navbar,
-.win-ui-dark .win-navbar {
-  background-color: #393939;
-  border-color: #393939;
-}
-.win-ui-dark.win-navbar.win-menulayout .win-navbar-menu,
-.win-ui-dark .win-navbar.win-menulayout .win-navbar-menu,
-.win-ui-dark.win-navbar.win-menulayout .win-toolbar,
-.win-ui-dark .win-navbar.win-menulayout .win-toolbar {
-  background-color: inherit;
-}
-.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,
-.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton {
-  background-color: transparent;
-  outline: none;
-  border-color: transparent;
-}
-.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,
-.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active {
-  background-color: transparent;
-}
-.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,
-.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis {
-  color: #ffffff;
-}
-.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,
-.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus {
-  border-color: #ffffff;
-}
-.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,
-.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,
-.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,
-.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active {
-  background-color: transparent;
-}
-.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,
-.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis {
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-dark .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-dark.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-dark .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-dark.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-dark .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-dark.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-.win-ui-dark .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-dark .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-dark.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-dark .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-dark.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-dark .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-dark.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-.win-ui-dark .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis {
-  color: #ffffff;
-}
-.win-ui-dark.win-flyout,
-.win-ui-dark .win-flyout {
-  background-color: #000000;
-}
-.win-ui-dark .win-settingsflyout {
-  background-color: #000000;
-}
-.win-ui-dark.win-menu button,
-.win-ui-dark .win-menu button {
-  background-color: transparent;
-  color: #ffffff;
-}
-.win-ui-dark .win-menu button.win-command.win-command:enabled:hover:active,
-.win-ui-dark .win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active {
-  background-color: rgba(255, 255, 255, 0.2);
-  color: #ffffff;
-}
-.win-ui-dark.win-menu-containsflyoutcommand button.win-command-flyout-activated:before,
-.win-ui-dark .win-menu-containsflyoutcommand button.win-command-flyout-activated:before {
-  position: absolute;
-  height: 100%;
-  width: 100%;
-  opacity: 0.6;
-  content: "";
-  box-sizing: content-box;
-  /* We want this pseudo element to cover the border of its parent. */
-  /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/
-  border-width: 1px;
-  border-style: solid;
-  top: -1px;
-  left: -1px;
-}
-.win-ui-dark.win-menu button[aria-checked=true].win-command:before,
-.win-ui-dark .win-menu button[aria-checked=true].win-command:before {
-  background-color: transparent;
-  border-color: transparent;
-}
-.win-ui-dark.win-menu button:disabled,
-.win-ui-dark .win-menu button:disabled,
-.win-ui-dark.win-menu button:disabled:active,
-.win-ui-dark .win-menu button:disabled:active {
-  background-color: transparent;
-  color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark.win-commandingsurface .win-commandingsurface-actionarea,
-.win-ui-dark .win-commandingsurface .win-commandingsurface-actionarea {
-  background-color: #393939;
-}
-.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton,
-.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton {
-  background-color: transparent;
-  border-color: transparent;
-}
-.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,
-.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active {
-  background-color: transparent;
-}
-.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,
-.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis {
-  color: #ffffff;
-}
-.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,
-.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus {
-  border-color: #ffffff;
-}
-.win-ui-dark.win-commandingsurface .win-commandingsurface-overflowarea,
-.win-ui-dark .win-commandingsurface .win-commandingsurface-overflowarea {
-  background-color: #2b2b2b;
-}
-.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,
-.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,
-.win-ui-dark .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active {
-  color: #ffffff;
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-autosuggestbox-flyout-highlighttext {
-  color: #4617b4;
-}
-.win-ui-dark .win-autosuggestbox-suggestion-separator {
-  color: #7a7a7a;
-}
-.win-ui-dark .win-autosuggestbox-suggestion-separator hr {
-  border-color: #7a7a7a;
-}
-.win-ui-dark .win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext {
-  color: #a38bda;
-}
-.win-ui-dark .win-autosuggestbox-flyout {
-  background-color: #2b2b2b;
-  color: #ffffff;
-}
-.win-ui-dark .win-autosuggestbox-suggestion-result:hover:active,
-.win-ui-dark .win-autosuggestbox-suggestion-query:hover:active {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-searchbox-button {
-  color: rgba(255, 255, 255, 0.4);
-}
-.win-ui-dark .win-searchbox-button-input-focus {
-  color: rgba(0, 0, 0, 0.4);
-}
-.win-ui-dark .win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {
-  color: #ffffff;
-}
-.win-ui-dark .win-splitviewcommand-button {
-  background-color: transparent;
-  color: #ffffff;
-}
-.win-ui-dark .win-splitviewcommand-button.win-pressed {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-splitviewcommand-button.win-keyboard:focus::before {
-  content: "";
-  pointer-events: none;
-  position: absolute;
-  box-sizing: border-box;
-  top: 0;
-  left: 0;
-  height: 100%;
-  width: 100%;
-  border: 1px dotted #ffffff;
-}
-.win-ui-dark .win-navbarcontainer-pageindicator {
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark .win-navbarcontainer-pageindicator-current {
-  background-color: rgba(255, 255, 255, 0.6);
-}
-.win-ui-dark .win-navbarcontainer-navarrow {
-  background-color: rgba(255, 255, 255, 0.4);
-  color: rgba(0, 0, 0, 0.8);
-}
-.win-ui-dark .win-navbarcontainer-navarrow.win-navbarcontainer-navarrow:hover:active {
-  background-color: rgba(255, 255, 255, 0.8);
-}
-.win-ui-dark .win-navbarcommand-button,
-.win-ui-dark .win-navbarcommand-splitbutton {
-  background-color: rgba(255, 255, 255, 0.1);
-  color: #ffffff;
-}
-.win-ui-dark .win-navbarcommand-button.win-pressed,
-.win-ui-dark .win-navbarcommand-splitbutton.win-pressed {
-  background-color: rgba(255, 255, 255, 0.28);
-}
-.win-ui-dark .win-navbarcommand-button.win-keyboard:focus::before {
-  content: "";
-  pointer-events: none;
-  position: absolute;
-  box-sizing: border-box;
-  top: 0;
-  left: 0;
-  height: 100%;
-  width: 100%;
-  border: 1px dotted #ffffff;
-}
-.win-ui-dark .win-navbarcommand-splitbutton.win-keyboard:focus::before {
-  border-color: #ffffff;
-}
-.win-ui-dark .win-contentdialog-dialog {
-  background-color: #2b2b2b;
-}
-.win-ui-dark .win-contentdialog-title {
-  color: #ffffff;
-}
-.win-ui-dark .win-contentdialog-content {
-  color: #ffffff;
-}
-.win-ui-dark .win-contentdialog-backgroundoverlay {
-  background-color: #000000;
-  opacity: 0.6;
-}
-.win-ui-dark .win-splitview-pane {
-  background-color: #171717;
-}
-.win-ui-dark button.win-splitviewpanetoggle {
-  color: #ffffff;
-  background-color: transparent;
-}
-.win-ui-dark button.win-splitviewpanetoggle:active,
-.win-ui-dark button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover {
-  color: #ffffff;
-  background-color: rgba(255, 255, 255, 0.2);
-}
-.win-ui-dark button.win-splitviewpanetoggle.win-keyboard:focus {
-  border: 1px dotted #ffffff;
-}
-.win-ui-dark button.win-splitviewpanetoggle:disabled,
-.win-ui-dark button.win-splitviewpanetoggle:disabled:active,
-.win-ui-dark button.win-splitviewpanetoggle.win-splitviewpanetoggle:disabled:hover {
-  color: rgba(255, 255, 255, 0.2);
-  background-color: transparent;
-}
-html.win-hoverable .win-ui-dark {
-  /* LegacyAppBar control colors */
-}
-html.win-hoverable .win-ui-dark .win-selectionstylefilled .win-container:hover .win-itembox,
-html.win-hoverable .win-ui-dark .win-selectionstylefilled.win-container:hover .win-itembox {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-html.win-hoverable .win-ui-dark .win-listview .win-itembox:hover::before,
-html.win-hoverable .win-ui-dark .win-itemcontainer .win-itembox:hover::before {
-  border-color: #ffffff;
-}
-html.win-hoverable .win-ui-dark .win-listview .win-container.win-selected:hover .win-selectionborder,
-html.win-hoverable .win-ui-dark .win-itemcontainer.win-container.win-selected:hover .win-selectionborder,
-html.win-hoverable .win-ui-dark .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,
-html.win-hoverable .win-ui-dark .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground {
-  opacity: 0.8;
-}
-html.win-hoverable .win-ui-dark .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-html.win-hoverable .win-ui-dark .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed).win-toggleswitch-on .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {
-  background-color: #ffffff;
-}
-html.win-hoverable .win-ui-dark .win-toggleswitch-off:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track {
-  border-color: #ffffff;
-}
-html.win-hoverable .win-ui-dark button:hover.win-semanticzoom-button {
-  background-color: #d8d8d8;
-}
-html.win-hoverable .win-ui-dark .win-pivot .win-pivot-navbutton:hover {
-  color: rgba(255, 255, 255, 0.6);
-}
-html.win-hoverable .win-ui-dark .win-pivot button.win-pivot-header:hover {
-  color: baseMediumHigh;
-}
-html.win-hoverable .win-ui-dark button.win-hub-section-header-tabstop:hover {
-  color: #ffffff;
-}
-html.win-hoverable .win-ui-dark button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover {
-  color: rgba(255, 255, 255, 0.8);
-}
-html.win-hoverable .win-ui-dark.win-navbar button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-dark .win-navbar button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-dark.win-navbar button.win-navbar-invokebutton:disabled:hover,
-html.win-hoverable .win-ui-dark .win-navbar button.win-navbar-invokebutton:disabled:hover {
-  background-color: transparent;
-}
-html.win-hoverable .win-ui-dark.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-dark .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-dark.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-dark .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-html.win-hoverable .win-ui-dark.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-ui-dark .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-ui-dark.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-ui-dark .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {
-  color: #ffffff;
-}
-html.win-hoverable .win-ui-dark.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-dark .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-dark.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,
-html.win-hoverable .win-ui-dark .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-html.win-hoverable .win-ui-dark.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-ui-dark .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-ui-dark.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-html.win-hoverable .win-ui-dark .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {
-  color: #ffffff;
-}
-html.win-hoverable .win-ui-dark button.win-command:enabled:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-  color: #ffffff;
-}
-html.win-hoverable .win-ui-dark button.win-command:enabled:hover .win-commandglyph {
-  color: #ffffff;
-}
-html.win-hoverable .win-ui-dark .win-menu button.win-command:enabled:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-  color: #ffffff;
-}
-html.win-hoverable .win-ui-dark button[aria-checked=true].win-command:hover {
-  background-color: transparent;
-}
-html.win-hoverable .win-ui-dark button:enabled[aria-checked=true].win-command:hover:before {
-  opacity: 0.8;
-}
-html.win-hoverable .win-ui-dark button:enabled[aria-checked=true].win-command:hover:active:before {
-  opacity: 0.9;
-}
-html.win-hoverable .win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton:hover,
-html.win-hoverable .win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,
-html.win-hoverable .win-ui-dark.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,
-html.win-hoverable .win-ui-dark .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-html.win-hoverable .win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,
-html.win-hoverable .win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis {
-  color: #ffffff;
-}
-html.win-hoverable .win-ui-dark .win-autosuggestbox-suggestion-result:hover,
-html.win-hoverable .win-ui-dark .win-autosuggestbox-suggestion-query:hover {
-  background-color: rgba(255, 255, 255, 0.1);
-}
-html.win-hoverable .win-ui-dark .win-searchbox-button:not(.win-searchbox-button-disabled):hover:active {
-  color: #ffffff;
-}
-html.win-hoverable .win-ui-dark .win-splitviewcommand-button:hover {
-  background-color: rgba(0, 0, 0, 0.1);
-}
-html.win-hoverable .win-ui-dark .win-splitviewcommand-button:hover.win-pressed {
-  background-color: rgba(0, 0, 0, 0.2);
-}
-html.win-hoverable .win-ui-dark .win-navbarcontainer-navarrow:hover {
-  background-color: rgba(255, 255, 255, 0.6);
-}
-html.win-hoverable .win-ui-dark .win-navbarcommand-button:hover,
-html.win-hoverable .win-ui-dark .win-navbarcommand-splitbutton:hover {
-  background-color: rgba(0, 0, 0, 0.19);
-}
-html.win-hoverable .win-ui-dark .win-navbarcommand-button:hover.win-pressed,
-html.win-hoverable .win-ui-dark .win-navbarcommand-splitbutton:hover.win-pressed {
-  background-color: rgba(0, 0, 0, 0.28);
-}
-html.win-hoverable .win-ui-dark button.win-splitviewpanetoggle:hover {
-  color: #ffffff;
-  background-color: rgba(255, 255, 255, 0.1);
-}
-@media (-ms-high-contrast) {
-  ::selection {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-link {
-    color: -ms-hotlight;
-  }
-  .win-link:active {
-    color: Highlight;
-  }
-  .win-link[disabled] {
-    color: GrayText;
-  }
-  .win-checkbox::-ms-check,
-  .win-radio::-ms-check {
-    background-color: ButtonFace;
-    border-color: ButtonText;
-    color: HighlightText;
-  }
-  .win-checkbox:indeterminate::-ms-check,
-  .win-radio:indeterminate::-ms-check {
-    background-color: Highlight;
-    border-color: ButtonText;
-    color: ButtonText;
-  }
-  .win-checkbox:checked::-ms-check,
-  .win-radio:checked::-ms-check {
-    background-color: Highlight;
-    border-color: HighlightText;
-  }
-  .win-checkbox:hover::-ms-check,
-  .win-radio:hover::-ms-check {
-    border-color: Highlight;
-  }
-  .win-checkbox:hover:active::-ms-check,
-  .win-radio:hover:active::-ms-check,
-  .win-checkbox:-ms-keyboard-active::-ms-check,
-  .win-radio:-ms-keyboard-active::-ms-check {
-    border-color: Highlight;
-  }
-  .win-checkbox:disabled::-ms-check,
-  .win-radio:disabled::-ms-check,
-  .win-checkbox:disabled:active::-ms-check,
-  .win-radio:disabled:active::-ms-check {
-    background-color: ButtonFace;
-    border-color: GrayText;
-    color: GrayText;
-  }
-  .win-progress-bar,
-  .win-progress-ring,
-  .win-ring {
-    background-color: ButtonFace;
-    color: Highlight;
-  }
-  .win-progress-bar::-ms-fill,
-  .win-progress-ring::-ms-fill,
-  .win-ring::-ms-fill {
-    background-color: Highlight;
-  }
-  .win-progress-bar.win-paused:not(:indeterminate)::-ms-fill,
-  .win-progress-ring.win-paused:not(:indeterminate)::-ms-fill,
-  .win-ring.win-paused:not(:indeterminate)::-ms-fill {
-    background-color: GrayText;
-  }
-  .win-progress-bar.win-paused:not(:indeterminate),
-  .win-progress-ring.win-paused:not(:indeterminate),
-  .win-ring.win-paused:not(:indeterminate) {
-    animation-name: none;
-    opacity: 1.0;
-  }
-  .win-button {
-    border-color: ButtonText;
-    color: ButtonText;
-  }
-  .win-button:hover {
-    border-color: Highlight;
-    color: Highlight;
-  }
-  .win-button:active {
-    border-color: Highlight;
-    color: Highlight;
-  }
-  .win-button:disabled {
-    border-color: GrayText;
-    color: GrayText;
-  }
-  .win-dropdown {
-    background-color: ButtonFace;
-    border-color: ButtonText;
-    color: WindowText;
-  }
-  .win-dropdown:hover {
-    border-color: Highlight;
-  }
-  .win-dropdown:active {
-    border-color: Highlight;
-  }
-  .win-dropdown:disabled {
-    border-color: GrayText;
-    color: GrayText;
-  }
-  .win-dropdown::-ms-expand {
-    color: ButtonText;
-  }
-  .win-dropdown:disabled::-ms-expand {
-    color: GrayText;
-  }
-  .win-dropdown option {
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  .win-dropdown option:hover,
-  .win-dropdown option:active,
-  .win-dropdown option:checked {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-dropdown option:disabled {
-    background-color: ButtonFace;
-    color: GrayText;
-  }
-  select[multiple].win-dropdown {
-    border: none;
-  }
-  select[multiple].win-dropdown:disabled option {
-    background-color: ButtonFace;
-    color: GrayText;
-  }
-  select[multiple].win-dropdown:disabled option:checked {
-    background-color: GrayText;
-    color: ButtonFace;
-  }
-  .win-slider::-ms-track {
-    color: transparent;
-  }
-  .win-slider::-ms-ticks-before,
-  .win-slider::-ms-ticks-after {
-    color: ButtonText;
-  }
-  .win-slider::-ms-fill-lower {
-    background-color: Highlight;
-  }
-  .win-slider::-ms-fill-upper {
-    background-color: ButtonText;
-  }
-  .win-slider::-ms-thumb {
-    background-color: ButtonText;
-  }
-  .win-slider:hover::-ms-thumb {
-    background-color: Highlight;
-  }
-  .win-slider:active::-ms-thumb {
-    background-color: Highlight;
-  }
-  .win-slider:disabled::-ms-fill-lower,
-  .win-slider:disabled::-ms-fill-upper,
-  .win-slider:disabled::-ms-thumb {
-    background-color: GrayText;
-  }
-  .win-textbox,
-  .win-textarea {
-    border-color: ButtonText;
-    color: ButtonText;
-  }
-  .win-textbox:hover,
-  .win-textarea:hover,
-  .win-textbox:active,
-  .win-textarea:active,
-  .win-textbox:focus,
-  .win-textarea:focus {
-    border-color: Highlight;
-  }
-  .win-textbox:disabled,
-  .win-textarea:disabled {
-    border-color: GrayText;
-    color: GrayText;
-  }
-  .win-textbox:-ms-input-placeholder,
-  .win-textarea:-ms-input-placeholder {
-    color: WindowText;
-  }
-  .win-textbox::-ms-input-placeholder,
-  .win-textarea::-ms-input-placeholder {
-    color: WindowText;
-  }
-  .win-textbox:disabled:-ms-input-placeholder,
-  .win-textarea:disabled:-ms-input-placeholder {
-    color: GrayText;
-  }
-  .win-textbox:disabled::-ms-input-placeholder,
-  .win-textarea:disabled::-ms-input-placeholder {
-    color: GrayText;
-  }
-  .win-textbox::-ms-clear,
-  .win-textbox::-ms-reveal {
-    background-color: ButtonFace;
-    color: ButtonText;
-  }
-  .win-textbox::-ms-clear:hover,
-  .win-textbox::-ms-reveal:hover {
-    color: Highlight;
-  }
-  .win-textbox::-ms-clear:active,
-  .win-textbox::-ms-reveal:active {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-toggleswitch-header,
-  .win-toggleswitch-value {
-    color: HighlightText;
-  }
-  .win-toggleswitch-thumb {
-    background-color: HighlightText;
-  }
-  .win-toggleswitch-off .win-toggleswitch-track {
-    border-color: HighlightText;
-  }
-  .win-toggleswitch-pressed .win-toggleswitch-thumb {
-    background-color: HighlightText;
-  }
-  .win-toggleswitch-pressed .win-toggleswitch-track {
-    border-color: Highlight;
-    background-color: Highlight;
-  }
-  .win-toggleswitch-disabled .win-toggleswitch-header,
-  .win-toggleswitch-disabled .win-toggleswitch-value {
-    color: GrayText;
-  }
-  .win-toggleswitch-disabled .win-toggleswitch-thumb {
-    background-color: GrayText;
-  }
-  .win-toggleswitch-disabled .win-toggleswitch-track {
-    border-color: GrayText;
-  }
-  .win-toggleswitch-on .win-toggleswitch-thumb {
-    background-color: HighlightText;
-  }
-  .win-toggleswitch-on .win-toggleswitch-track {
-    border-color: HighlightText;
-  }
-  .win-toggleswitch-on.win-toggleswitch-pressed .win-toggleswitch-track {
-    background-color: Highlight;
-  }
-  .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-thumb {
-    background-color: Background;
-  }
-  .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track {
-    background-color: GrayText;
-  }
-  /* Override Accent Color styles */
-  .win-toggleswitch-on.win-toggleswitch-enabled:not(.win-toggleswitch-pressed) .win-toggleswitch-track {
-    background-color: Highlight;
-  }
-  .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track {
-    border-color: GrayText;
-  }
-  .win-toggleswitch-enabled .win-toggleswitch-clickregion:hover .win-toggleswitch-track {
-    border-color: Highlight;
-  }
-  .win-toggleswitch-off.win-toggleswitch-enabled:not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb {
-    background-color: Highlight;
-  }
-  .win-pivot .win-pivot-title {
-    color: WindowText;
-  }
-  .win-pivot .win-pivot-navbutton {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  .win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active {
-    color: HighlightText;
-  }
-  .win-pivot button.win-pivot-header {
-    color: HighlightText;
-    background-color: transparent;
-  }
-  .win-pivot button.win-pivot-header:focus,
-  .win-pivot button.win-pivot-header.win-pivot-header:hover:active {
-    color: HighlightText;
-  }
-  .win-pivot button.win-pivot-header.win-pivot-header-selected {
-    color: HighlightText;
-    background-color: Highlight;
-  }
-  .win-pivot-header[disabled] {
-    color: GrayText;
-  }
-  .win-overlay {
-    outline: none;
-  }
-  hr.win-command {
-    background-color: ButtonText;
-  }
-  div.win-command,
-  button.win-command {
-    border-color: transparent;
-    background-color: transparent;
-  }
-  div.win-command:hover:active,
-  button.win-command:hover:active {
-    border-color: transparent;
-  }
-  button:enabled.win-command.win-keyboard:focus,
-  div.win-command.win-keyboard:focus,
-  button:enabled.win-command.win-command.win-keyboard:hover:focus,
-  div.win-command.win-command.win-keyboard:hover:focus {
-    border-color: ButtonText;
-  }
-  .win-commandimage {
-    color: ButtonText;
-  }
-  button.win-command.win-command:enabled:hover:active,
-  button.win-command.win-command:enabled:active {
-    background-color: Highlight;
-    color: ButtonText;
-  }
-  button:enabled:hover:active .win-commandimage,
-  button:enabled:active .win-commandimage {
-    color: ButtonText;
-  }
-  button:disabled .win-commandimage,
-  button:disabled:active .win-commandimage {
-    color: GrayText;
-  }
-  button .win-label {
-    color: ButtonText;
-  }
-  button[aria-checked=true]:enabled .win-label,
-  button[aria-checked=true]:enabled .win-commandimage,
-  button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage {
-    color: ButtonText;
-  }
-  button[aria-checked=true]:-ms-keyboard-active .win-commandimage {
-    color: ButtonText;
-  }
-  button[aria-checked=true].win-command:before {
-    position: absolute;
-    height: 100%;
-    width: 100%;
-    opacity: 1;
-    box-sizing: content-box;
-    content: "";
-    /* We want this pseudo element to cover the border of its parent. */
-    /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/
-    border-width: 1px;
-    border-style: solid;
-    top: -1px;
-    left: -1px;
-  }
-  button.win-command:enabled:-ms-keyboard-active {
-    background-color: Highlight;
-    color: ButtonText;
-  }
-  button[aria-checked=true].win-command:enabled:hover:active {
-    background-color: transparent;
-  }
-  button.win-command:disabled,
-  button.win-command:disabled:hover:active {
-    background-color: transparent;
-    border-color: transparent;
-  }
-  button.win-command:disabled .win-label,
-  button.win-command:disabled:active .win-label {
-    color: GrayText;
-  }
-  .win-navbar,
-  .win-navbar {
-    background-color: ButtonFace;
-    border-color: Highlight;
-  }
-  .win-navbar.win-menulayout .win-navbar-menu,
-  .win-navbar.win-menulayout .win-navbar-menu,
-  .win-navbar.win-menulayout .win-toolbar,
-  .win-navbar.win-menulayout .win-toolbar {
-    background-color: inherit;
-  }
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton {
-    background-color: transparent;
-    outline: none;
-    border-color: transparent;
-  }
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active {
-    background-color: transparent;
-  }
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis {
-    color: ButtonText;
-  }
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus {
-    border-color: ButtonText;
-  }
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active {
-    background-color: transparent;
-  }
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,
-  .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis {
-    color: GrayText;
-  }
-  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,
-  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active {
-    background-color: Highlight;
-  }
-  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,
-  .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis {
-    color: ButtonText;
-  }
-  .win-flyout,
-  .win-flyout {
-    background-color: ButtonFace;
-  }
-  .win-settingsflyout {
-    background-color: ButtonFace;
-  }
-  .win-menu button,
-  .win-menu button {
-    background-color: transparent;
-    color: ButtonText;
-  }
-  .win-menu button.win-command.win-command:enabled:hover:active,
-  .win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active {
-    background-color: Highlight;
-    color: ButtonText;
-  }
-  .win-menu-containsflyoutcommand button.win-command-flyout-activated:before,
-  .win-menu-containsflyoutcommand button.win-command-flyout-activated:before {
-    position: absolute;
-    height: 100%;
-    width: 100%;
-    opacity: 0.4;
-    content: "";
-    box-sizing: content-box;
-    /* We want this pseudo element to cover the border of its parent. */
-    /* Put a 1px border on this element to make it larger and then set its top/left to -1px.*/
-    border-width: 1px;
-    border-style: solid;
-    top: -1px;
-    left: -1px;
-  }
-  .win-menu button[aria-checked=true].win-command:before,
-  .win-menu button[aria-checked=true].win-command:before {
-    background-color: transparent;
-    border-color: transparent;
-  }
-  .win-menu button:disabled,
-  .win-menu button:disabled,
-  .win-menu button:disabled:active,
-  .win-menu button:disabled:active {
-    background-color: transparent;
-    color: GrayText;
-  }
-  button[aria-checked=true].win-command:before {
-    border-color: Highlight;
-    background-color: Highlight;
-  }
-  .win-commandingsurface .win-commandingsurface-actionarea,
-  .win-commandingsurface .win-commandingsurface-actionarea {
-    background-color: ButtonFace;
-  }
-  .win-commandingsurface button.win-commandingsurface-overflowbutton,
-  .win-commandingsurface button.win-commandingsurface-overflowbutton {
-    background-color: ButtonFace;
-    border-color: transparent;
-  }
-  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,
-  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active {
-    background-color: ButtonFace;
-  }
-  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,
-  .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis {
-    color: ButtonText;
-  }
-  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,
-  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus {
-    border-color: ButtonText;
-  }
-  .win-commandingsurface .win-commandingsurface-overflowarea,
-  .win-commandingsurface .win-commandingsurface-overflowarea {
-    background-color: ButtonFace;
-  }
-  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,
-  .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active {
-    background-color: Highlight;
-  }
-  .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,
-  .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active {
-    color: ButtonText;
-    background-color: Highlight;
-  }
-  .win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-insetoutline {
-    display: block;
-    /* The element is only used to draw a border inside of the edges of its parent element without displacing content. */
-    border: solid 1px ButtonText;
-    pointer-events: none;
-    background-color: transparent;
-    z-index: 1;
-    position: absolute;
-    top: 0px;
-    left: 0px;
-    height: calc(100% - 2px);
-    width: calc(100% - 2px);
-  }
-  .win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-insetoutline,
-  .win-commandingsurface.win-commandingsurface-closing .win-commandingsurface-insetoutline,
-  .win-commandingsurface.win-commandingsurface-opening .win-commandingsurface-insetoutline {
-    display: none;
-  }
-  .win-contentdialog-dialog {
-    background-color: Window;
-  }
-  .win-contentdialog-title {
-    color: WindowText;
-  }
-  .win-contentdialog-content {
-    color: WindowText;
-  }
-  .win-contentdialog-backgroundoverlay {
-    background-color: Window;
-    opacity: 0.6;
-  }
-  .win-splitview-pane {
-    background-color: ButtonFace;
-  }
-  .win-splitview.win-splitview-pane-opened .win-splitview-paneoutline {
-    display: block;
-    border-color: ButtonText;
-  }
-  .win-splitview.win-splitview-animating .win-splitview-paneoutline {
-    display: none;
-  }
-  button.win-splitviewpanetoggle {
-    color: ButtonText;
-    background-color: transparent;
-  }
-  button.win-splitviewpanetoggle:active,
-  button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover {
-    color: ButtonText;
-    background-color: Highlight;
-  }
-  button.win-splitviewpanetoggle.win-keyboard:focus {
-    border: 1px dotted ButtonText;
-  }
-  button.win-splitviewpanetoggle:disabled,
-  button.win-splitviewpanetoggle:disabled:active,
-  button.win-splitviewpanetoggle.win-splitviewpanetoggle:disabled:hover {
-    color: GrayText;
-    background-color: transparent;
-  }
-  html.win-hoverable {
-    /* LegacyAppBar control colors */
-  }
-  html.win-hoverable.win-navbar button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable .win-navbar button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable.win-navbar button.win-navbar-invokebutton:disabled:hover,
-  html.win-hoverable .win-navbar button.win-navbar-invokebutton:disabled:hover {
-    background-color: transparent;
-  }
-  html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover {
-    background-color: Highlight;
-  }
-  html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-  html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-  html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-  html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {
-    color: HighlightText;
-  }
-  html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,
-  html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover {
-    background-color: Highlight;
-  }
-  html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-  html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-  html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,
-  html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis {
-    color: HighlightText;
-  }
-  html.win-hoverable button.win-command:enabled:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  html.win-hoverable button.win-command:enabled:hover .win-commandglyph {
-    color: HighlightText;
-  }
-  html.win-hoverable .win-menu button.win-command:enabled:hover {
-    background-color: Highlight;
-    color: HighlightText;
-  }
-  html.win-hoverable button[aria-checked=true].win-command:hover {
-    background-color: transparent;
-  }
-  html.win-hoverable button:enabled[aria-checked=true].win-command:hover:before {
-    opacity: 1;
-  }
-  html.win-hoverable button:enabled[aria-checked=true].win-command:hover:active:before {
-    opacity: 1;
-  }
-  html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover,
-  html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,
-  html.win-hoverable.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,
-  html.win-hoverable .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover {
-    background-color: Highlight;
-  }
-  html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,
-  html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis {
-    color: HighlightText;
-  }
-  html.win-hoverable button.win-splitviewpanetoggle:hover {
-    color: ButtonText;
-    background-color: Highlight;
-  }
-}
diff --git a/node_modules/winjs/css/ui-light.min.css b/node_modules/winjs/css/ui-light.min.css
deleted file mode 100644
index eb79270..0000000
--- a/node_modules/winjs/css/ui-light.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.win-button,.win-slider{-webkit-appearance:none}.win-button,.win-link{touch-action:manipulation}@keyframes WinJS-node-inserted{from{outline-color:#000}to{outline-color:#001}}@keyframes WinJS-opacity-in{from{opacity:0}to{opacity:1}}@keyframes WinJS-opacity-out{from{opacity:1}to{opacity:0}}@keyframes WinJS-scale-up{from{transform:scale(.85)}to{transform:scale(1)}}@keyframes WinJS-scale-down{from{transform:scale(1)}to{transform:scale(.85)}}@keyframes WinJS-default-remove{from{transform:translateX(11px)}to{transform:none}}@keyframes WinJS-default-remove-rtl{from{transform:translateX(-11px)}to{transform:none}}@keyframes WinJS-default-apply{from{transform:none}to{transform:translateX(11px)}}@keyframes WinJS-default-apply-rtl{from{transform:none}to{transform:translateX(-11px)}}@keyframes WinJS-showEdgeUI{from{transform:translateY(-70px)}to{transform:none}}@keyframes WinJS-showPanel{from{transform:translateX(364px)}to{transform:none}}@keyframes WinJS-showPanel-rtl{from{transform:translateX(-364px)}to{transform:none}}@keyframes WinJS-hideEdgeUI{from{transform:none}to{transform:translateY(-70px)}}@keyframes WinJS-hidePanel{from{transform:none}to{transform:translateX(364px)}}@keyframes WinJS-hidePanel-rtl{from{transform:none}to{transform:translateX(-364px)}}@keyframes WinJS-showPopup{from{transform:translateY(50px)}to{transform:none}}@keyframes WinJS-dragSourceEnd{from{transform:translateX(11px) scale(1.05)}to{transform:none}}@keyframes WinJS-dragSourceEnd-rtl{from{transform:translateX(-11px) scale(1.05)}to{transform:none}}@keyframes WinJS-enterContent{from{transform:translateY(28px)}to{transform:none}}@keyframes WinJS-exit{from,to{transform:none}}@keyframes WinJS-enterPage{from{transform:translateY(28px)}to{transform:none}}@keyframes WinJS-updateBadge{from{transform:translateY(24px)}to{transform:none}}@-webkit-keyframes WinJS-node-inserted{from{outline-color:#000}to{outline-color:#001}}@-webkit-keyframes -webkit-WinJS-opacity-in{from{opacity:0}to{opacity:1}}@-webkit-keyframes -webkit-WinJS-opacity-out{from{opacity:1}to{opacity:0}}@-webkit-keyframes -webkit-WinJS-scale-up{from{-webkit-transform:scale(.85)}to{-webkit-transform:scale(1)}}@-webkit-keyframes -webkit-WinJS-scale-down{from{-webkit-transform:scale(1)}to{-webkit-transform:scale(.85)}}@-webkit-keyframes -webkit-WinJS-default-remove{from{-webkit-transform:translateX(11px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-default-remove-rtl{from{-webkit-transform:translateX(-11px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-default-apply{from{-webkit-transform:none}to{-webkit-transform:translateX(11px)}}@-webkit-keyframes -webkit-WinJS-default-apply-rtl{from{-webkit-transform:none}to{-webkit-transform:translateX(-11px)}}@-webkit-keyframes -webkit-WinJS-showEdgeUI{from{-webkit-transform:translateY(-70px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-showPanel{from{-webkit-transform:translateX(364px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-showPanel-rtl{from{-webkit-transform:translateX(-364px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-hideEdgeUI{from{-webkit-transform:none}to{-webkit-transform:translateY(-70px)}}@-webkit-keyframes -webkit-WinJS-hidePanel{from{-webkit-transform:none}to{-webkit-transform:translateX(364px)}}@-webkit-keyframes -webkit-WinJS-hidePanel-rtl{from{-webkit-transform:none}to{-webkit-transform:translateX(-364px)}}@-webkit-keyframes -webkit-WinJS-showPopup{from{-webkit-transform:translateY(50px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-dragSourceEnd{from{-webkit-transform:translateX(11px) scale(1.05)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-dragSourceEnd-rtl{from{-webkit-transform:translateX(-11px) scale(1.05)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-enterContent{from{-webkit-transform:translateY(28px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-exit{from,to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-enterPage{from{-webkit-transform:translateY(28px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-updateBadge{from{-webkit-transform:translateY(24px)}to{-webkit-transform:none}}@font-face{font-family:"Segoe UI Command";src:local("Segoe MDL2 Assets");font-weight:400;font-style:normal}@font-face{font-family:Symbols;src:url(../fonts/Symbols.ttf)}.win-h1,.win-type-header{font-size:46px;font-weight:200;line-height:1.216;letter-spacing:0}.win-h2,.win-type-subheader{font-size:34px;font-weight:200;line-height:1.176}.win-h3,.win-type-title{font-size:24px;font-weight:300;line-height:1.167}.win-h4,.win-type-subtitle{font-size:20px;font-weight:400;line-height:1.2}.win-h6,.win-type-body{font-size:15px;font-weight:400;line-height:1.333}.win-h5,.win-type-base{font-size:15px;font-weight:500;line-height:1.333}.win-type-caption{font-size:12px;font-weight:400;line-height:1.167}@font-face{font-family:"Segoe UI";font-weight:200;src:local("Segoe UI Light")}@font-face{font-family:"Segoe UI";font-weight:300;src:local("Segoe UI Semilight")}@font-face{font-family:"Segoe UI";font-weight:400;src:local("Segoe UI")}@font-face{font-family:"Segoe UI";font-weight:500;src:local("Segoe UI Semibold")}@font-face{font-family:"Segoe UI";font-weight:600;src:local("Segoe UI Bold")}@font-face{font-family:"Segoe UI";font-style:italic;font-weight:400;src:local("Segoe UI Italic")}@font-face{font-family:"Segoe UI";font-style:italic;font-weight:700;src:local("Segoe UI Bold Italic")}@font-face{font-family:"Microsoft Yahei UI";font-weight:200;src:local("Microsoft Yahei UI Light")}@font-face{font-family:"Microsoft Yahei UI";font-weight:300;src:local("Microsoft Yahei UI")}@font-face{font-family:"Microsoft Yahei UI";font-weight:500;src:local("Microsoft Yahei UI")}@font-face{font-family:"Microsoft Yahei UI";font-weight:600;src:local("Microsoft Yahei UI Bold")}@font-face{font-family:"Microsoft JhengHei UI";font-weight:200;src:local("Microsoft JhengHei UI Light")}@font-face{font-family:"Microsoft JhengHei UI";font-weight:300;src:local("Microsoft JhengHei UI")}@font-face{font-family:"Microsoft JhengHei UI";font-weight:500;src:local("Microsoft JhengHei UI")}@font-face{font-family:"Microsoft JhengHei UI";font-weight:600;src:local("Microsoft JhengHei UI Bold")}.win-button:-ms-lang(am,ti),.win-dropdown:-ms-lang(am,ti),.win-h1:-ms-lang(am,ti),.win-h2:-ms-lang(am,ti),.win-h3:-ms-lang(am,ti),.win-h4:-ms-lang(am,ti),.win-h5:-ms-lang(am,ti),.win-h6:-ms-lang(am,ti),.win-link:-ms-lang(am,ti),.win-textarea:-ms-lang(am,ti),.win-textbox:-ms-lang(am,ti),.win-type-base:-ms-lang(am,ti),.win-type-body:-ms-lang(am,ti),.win-type-caption:-ms-lang(am,ti),.win-type-header:-ms-lang(am,ti),.win-type-subheader:-ms-lang(am,ti),.win-type-subtitle:-ms-lang(am,ti),.win-type-title:-ms-lang(am,ti){font-family:Ebrima,Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-dropdown:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-h1:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-h2:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-h3:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-h4:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-h5:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-h6:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-link:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-textarea:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-textbox:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-base:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-body:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-caption:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-header:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-subheader:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-subtitle:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te),.win-type-title:-ms-lang(as,bn,gu,hi,kn,kok,ml,mr,ne,or,pa,sat-Olck,si,srb-Sora,ta,te){font-family:"Nirmala UI",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(chr-CHER-US),.win-dropdown:-ms-lang(chr-CHER-US),.win-h1:-ms-lang(chr-CHER-US),.win-h2:-ms-lang(chr-CHER-US),.win-h3:-ms-lang(chr-CHER-US),.win-h4:-ms-lang(chr-CHER-US),.win-h5:-ms-lang(chr-CHER-US),.win-h6:-ms-lang(chr-CHER-US),.win-link:-ms-lang(chr-CHER-US),.win-textarea:-ms-lang(chr-CHER-US),.win-textbox:-ms-lang(chr-CHER-US),.win-type-base:-ms-lang(chr-CHER-US),.win-type-body:-ms-lang(chr-CHER-US),.win-type-caption:-ms-lang(chr-CHER-US),.win-type-header:-ms-lang(chr-CHER-US),.win-type-subheader:-ms-lang(chr-CHER-US),.win-type-subtitle:-ms-lang(chr-CHER-US),.win-type-title:-ms-lang(chr-CHER-US){font-family:Gadugi,Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(ja),.win-dropdown:-ms-lang(ja),.win-h1:-ms-lang(ja),.win-h2:-ms-lang(ja),.win-h3:-ms-lang(ja),.win-h4:-ms-lang(ja),.win-h5:-ms-lang(ja),.win-h6:-ms-lang(ja),.win-link:-ms-lang(ja),.win-textarea:-ms-lang(ja),.win-textbox:-ms-lang(ja),.win-type-base:-ms-lang(ja),.win-type-body:-ms-lang(ja),.win-type-caption:-ms-lang(ja),.win-type-header:-ms-lang(ja),.win-type-subheader:-ms-lang(ja),.win-type-subtitle:-ms-lang(ja),.win-type-title:-ms-lang(ja){font-family:"Yu Gothic UI",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(km,lo,th,bug-Bugi),.win-dropdown:-ms-lang(km,lo,th,bug-Bugi),.win-h1:-ms-lang(km,lo,th,bug-Bugi),.win-h2:-ms-lang(km,lo,th,bug-Bugi),.win-h3:-ms-lang(km,lo,th,bug-Bugi),.win-h4:-ms-lang(km,lo,th,bug-Bugi),.win-h5:-ms-lang(km,lo,th,bug-Bugi),.win-h6:-ms-lang(km,lo,th,bug-Bugi),.win-link:-ms-lang(km,lo,th,bug-Bugi),.win-textarea:-ms-lang(km,lo,th,bug-Bugi),.win-textbox:-ms-lang(km,lo,th,bug-Bugi),.win-type-base:-ms-lang(km,lo,th,bug-Bugi),.win-type-body:-ms-lang(km,lo,th,bug-Bugi),.win-type-caption:-ms-lang(km,lo,th,bug-Bugi),.win-type-header:-ms-lang(km,lo,th,bug-Bugi),.win-type-subheader:-ms-lang(km,lo,th,bug-Bugi),.win-type-subtitle:-ms-lang(km,lo,th,bug-Bugi),.win-type-title:-ms-lang(km,lo,th,bug-Bugi){font-family:"Leelawadee UI",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(ko),.win-dropdown:-ms-lang(ko),.win-h1:-ms-lang(ko),.win-h2:-ms-lang(ko),.win-h3:-ms-lang(ko),.win-h4:-ms-lang(ko),.win-h5:-ms-lang(ko),.win-h6:-ms-lang(ko),.win-link:-ms-lang(ko),.win-textarea:-ms-lang(ko),.win-textbox:-ms-lang(ko),.win-type-base:-ms-lang(ko),.win-type-body:-ms-lang(ko),.win-type-caption:-ms-lang(ko),.win-type-header:-ms-lang(ko),.win-type-subheader:-ms-lang(ko),.win-type-subtitle:-ms-lang(ko),.win-type-title:-ms-lang(ko){font-family:"Malgun Gothic",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(jv-Java),.win-dropdown:-ms-lang(jv-Java),.win-h1:-ms-lang(jv-Java),.win-h2:-ms-lang(jv-Java),.win-h3:-ms-lang(jv-Java),.win-h4:-ms-lang(jv-Java),.win-h5:-ms-lang(jv-Java),.win-h6:-ms-lang(jv-Java),.win-link:-ms-lang(jv-Java),.win-textarea:-ms-lang(jv-Java),.win-textbox:-ms-lang(jv-Java),.win-type-base:-ms-lang(jv-Java),.win-type-body:-ms-lang(jv-Java),.win-type-caption:-ms-lang(jv-Java),.win-type-header:-ms-lang(jv-Java),.win-type-subheader:-ms-lang(jv-Java),.win-type-subtitle:-ms-lang(jv-Java),.win-type-title:-ms-lang(jv-Java){font-family:"Javanese Text",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(cop-Copt),.win-dropdown:-ms-lang(cop-Copt),.win-h1:-ms-lang(cop-Copt),.win-h2:-ms-lang(cop-Copt),.win-h3:-ms-lang(cop-Copt),.win-h4:-ms-lang(cop-Copt),.win-h5:-ms-lang(cop-Copt),.win-h6:-ms-lang(cop-Copt),.win-link:-ms-lang(cop-Copt),.win-textarea:-ms-lang(cop-Copt),.win-textbox:-ms-lang(cop-Copt),.win-type-base:-ms-lang(cop-Copt),.win-type-body:-ms-lang(cop-Copt),.win-type-caption:-ms-lang(cop-Copt),.win-type-header:-ms-lang(cop-Copt),.win-type-subheader:-ms-lang(cop-Copt),.win-type-subtitle:-ms-lang(cop-Copt),.win-type-title:-ms-lang(cop-Copt){font-family:"Segoe MDL2 Assets",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-dropdown:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-h1:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-h2:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-h3:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-h4:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-h5:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-h6:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-link:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-textarea:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-textbox:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-base:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-body:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-caption:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-header:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-subheader:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-subtitle:-ms-lang(zh-CN,zh-Hans,zh-SG),.win-type-title:-ms-lang(zh-CN,zh-Hans,zh-SG){font-family:"Microsoft YaHei UI",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}.win-button:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-dropdown:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-h1:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-h2:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-h3:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-h4:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-h5:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-h6:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-link:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-textarea:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-textbox:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-base:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-body:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-caption:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-header:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-subheader:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-subtitle:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO),.win-type-title:-ms-lang(zh-HK,zh-TW,zh-Hant,zh-MO){font-family:"Microsoft JhengHei UI",Ebrima,"Nirmala UI",Gadugi,"Segoe UI Emoji","Segoe MDL2 Assets",Symbols,"Yu Gothic UI","Yu Gothic","Meiryo UI","Leelawadee UI","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Segoe UI Historic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Javanese Text","Cambria Math"}body,html{width:100%;height:100%;margin:0;cursor:default;-webkit-touch-callout:none;-ms-scroll-translation:vertical-to-horizontal;-webkit-tap-highlight-color:transparent}html{overflow:hidden;direction:ltr}.win-toggleswitch:lang(ar),.win-toggleswitch:lang(dv),.win-toggleswitch:lang(fa),.win-toggleswitch:lang(he),.win-toggleswitch:lang(ku-Arab),.win-toggleswitch:lang(pa-Arab),.win-toggleswitch:lang(prs),.win-toggleswitch:lang(ps),.win-toggleswitch:lang(qps-plocm),.win-toggleswitch:lang(sd-Arab),.win-toggleswitch:lang(syr),.win-toggleswitch:lang(ug),.win-toggleswitch:lang(ur),html:lang(ar),html:lang(dv),html:lang(fa),html:lang(he),html:lang(ku-Arab),html:lang(pa-Arab),html:lang(prs),html:lang(ps),html:lang(qps-plocm),html:lang(sd-Arab),html:lang(syr),html:lang(ug),html:lang(ur){direction:rtl}body{-ms-content-zooming:none}iframe{border:0}.win-button,.win-textarea,.win-textbox{border-style:solid;border-width:2px;background-clip:border-box;border-radius:0;font-size:15px;font-weight:400;line-height:1.333}.win-button,.win-dropdown,.win-h1,.win-h2,.win-h3,.win-h4,.win-h5,.win-h6,.win-link,.win-textarea,.win-textbox,.win-type-base,.win-type-body,.win-type-caption,.win-type-header,.win-type-subheader,.win-type-subtitle,.win-type-title{font-family:"Segoe UI",sans-serif,"Segoe MDL2 Assets",Symbols,"Segoe UI Emoji"}.win-textarea,.win-textbox{-ms-user-select:element;margin:8px 0;width:296px;min-width:64px;min-height:28px;box-sizing:border-box;padding:3px 6px 5px 10px;outline:0}.win-textbox::-ms-value{margin:0;padding:0}.win-textbox::-ms-clear,.win-textbox::-ms-reveal{padding-right:2px;width:30px;height:32px;margin:-8px -8px -8px 2px}.win-textbox:lang(ar)::-ms-clear,.win-textbox:lang(ar)::-ms-reveal,.win-textbox:lang(dv)::-ms-clear,.win-textbox:lang(dv)::-ms-reveal,.win-textbox:lang(fa)::-ms-clear,.win-textbox:lang(fa)::-ms-reveal,.win-textbox:lang(he)::-ms-clear,.win-textbox:lang(he)::-ms-reveal,.win-textbox:lang(ku-Arab)::-ms-clear,.win-textbox:lang(ku-Arab)::-ms-reveal,.win-textbox:lang(pa-Arab)::-ms-clear,.win-textbox:lang(pa-Arab)::-ms-reveal,.win-textbox:lang(prs)::-ms-clear,.win-textbox:lang(prs)::-ms-reveal,.win-textbox:lang(ps)::-ms-clear,.win-textbox:lang(ps)::-ms-reveal,.win-textbox:lang(qps-plocm)::-ms-clear,.win-textbox:lang(qps-plocm)::-ms-reveal,.win-textbox:lang(sd-Arab)::-ms-clear,.win-textbox:lang(sd-Arab)::-ms-reveal,.win-textbox:lang(syr)::-ms-clear,.win-textbox:lang(syr)::-ms-reveal,.win-textbox:lang(ug)::-ms-clear,.win-textbox:lang(ug)::-ms-reveal,.win-textbox:lang(ur)::-ms-clear,.win-textbox:lang(ur)::-ms-reveal{margin-left:-8px;margin-right:2px}.win-textarea{resize:none;overflow-y:auto}.win-checkbox,.win-radio{width:20px;height:20px;margin-right:8px;margin-top:12px;margin-bottom:12px}.win-checkbox:lang(ar),.win-checkbox:lang(dv),.win-checkbox:lang(fa),.win-checkbox:lang(he),.win-checkbox:lang(ku-Arab),.win-checkbox:lang(pa-Arab),.win-checkbox:lang(prs),.win-checkbox:lang(ps),.win-checkbox:lang(qps-plocm),.win-checkbox:lang(sd-Arab),.win-checkbox:lang(syr),.win-checkbox:lang(ug),.win-checkbox:lang(ur),.win-radio:lang(ar),.win-radio:lang(dv),.win-radio:lang(fa),.win-radio:lang(he),.win-radio:lang(ku-Arab),.win-radio:lang(pa-Arab),.win-radio:lang(prs),.win-radio:lang(ps),.win-radio:lang(qps-plocm),.win-radio:lang(sd-Arab),.win-radio:lang(syr),.win-radio:lang(ug),.win-radio:lang(ur){margin-left:8px;margin-right:0}.win-checkbox::-ms-check,.win-radio::-ms-check{border-style:solid;display:inline-block;border-width:2px;background-clip:border-box}.win-button{margin:0;min-height:32px;min-width:120px;padding:4px 8px}.win-button.win-button-file{border:none;min-width:100px;min-height:20px;width:340px;height:32px;padding:0;margin:7px 8px 21px;background-clip:padding-box}.win-button.win-button-file::-ms-value{margin:0;border-width:2px;border-style:solid none solid solid;border-radius:0;background-clip:border-box;font-size:15px;font-weight:400;line-height:1.333}.win-button.win-button-file:lang(ar)::-ms-value,.win-button.win-button-file:lang(dv)::-ms-value,.win-button.win-button-file:lang(fa)::-ms-value,.win-button.win-button-file:lang(he)::-ms-value,.win-button.win-button-file:lang(ku-Arab)::-ms-value,.win-button.win-button-file:lang(pa-Arab)::-ms-value,.win-button.win-button-file:lang(prs)::-ms-value,.win-button.win-button-file:lang(ps)::-ms-value,.win-button.win-button-file:lang(qps-plocm)::-ms-value,.win-button.win-button-file:lang(sd-Arab)::-ms-value,.win-button.win-button-file:lang(syr)::-ms-value,.win-button.win-button-file:lang(ug)::-ms-value,.win-button.win-button-file:lang(ur)::-ms-value{border-left-style:none;border-right-style:solid}.win-button.win-button-file::-ms-browse{margin:0;padding:0 18px;border-width:2px;border-style:solid;background-clip:padding-box;font-size:15px;font-weight:400;line-height:1.333}.win-dropdown{min-width:56px;max-width:368px;min-height:32px;margin:8px 0;border-style:solid;border-width:2px;background-clip:border-box;background-image:none;box-sizing:border-box;border-radius:0;font-size:15px;font-weight:400;line-height:1.333}.win-dropdown::-ms-value{padding:5px 12px 7px;margin:0}.win-dropdown::-ms-expand{border:none;margin-right:5px;margin-left:3px;margin-bottom:-2px;font-size:20px}.win-code,.win-dropdown option{font-size:15px;font-weight:400;line-height:1.333}select[multiple].win-dropdown{padding:0 0 0 12px;vertical-align:bottom}.win-progress-bar,.win-progress-ring,.win-ring{width:180px;height:4px;-webkit-appearance:none}.win-progress-bar:not(:indeterminate),.win-progress-ring:not(:indeterminate),.win-ring:not(:indeterminate){border-style:none}.win-progress-bar::-ms-fill,.win-progress-ring::-ms-fill,.win-ring::-ms-fill{border-style:none}.win-progress-bar.win-medium,.win-progress-ring.win-medium,.win-ring.win-medium{width:296px}.win-progress-bar.win-large,.win-progress-ring.win-large,.win-ring.win-large{width:100%}.win-progress-bar:indeterminate::-webkit-progress-value,.win-progress-ring:indeterminate::-webkit-progress-value,.win-ring:indeterminate::-webkit-progress-value{position:relative;-webkit-animation:win-progress-indeterminate 3s linear infinite}.win-progress-bar.win-paused:not(:indeterminate),.win-progress-ring.win-paused:not(:indeterminate),.win-ring.win-paused:not(:indeterminate){animation-name:win-progress-fade-out;animation-duration:3s;animation-timing-function:cubic-bezier(.03,.76,.31,1);opacity:.5}.win-progress-bar.win-error::-ms-fill,.win-progress-ring.win-error::-ms-fill,.win-ring.win-error::-ms-fill{opacity:0}.win-progress-ring,.win-ring{width:20px;height:20px}.win-progress-ring:indeterminate::-ms-fill,.win-ring:indeterminate::-ms-fill{animation-name:-ms-ring}.win-progress-ring.win-medium,.win-ring.win-medium{width:40px;height:40px}.win-progress-ring.win-large,.win-ring.win-large{width:60px;height:60px}@-webkit-keyframes win-progress-indeterminate{0%{left:0;width:25%}50%{left:calc(75%);width:25%}75%{left:calc(100%);width:0}75.1%{left:0;width:0}100%{left:0;width:25%}}@keyframes win-progress-fade-out{from{opacity:1}to{opacity:.5}}.win-slider{width:280px;height:44px}.win-slider::-ms-track{height:2px;border-style:none}.win-slider::-webkit-slider-runnable-track{height:2px;border-style:none}.win-slider::-moz-range-track{height:2px;border-style:none}.win-slider::-moz-range-thumb{width:8px;height:24px;border-radius:4px;border-style:none}.win-slider::-webkit-slider-thumb{-webkit-appearance:none;margin-top:-11px;width:8px;height:24px;border-radius:4px;border-style:none}.win-slider::-ms-thumb{margin-top:inherit;width:8px;height:24px;border-radius:4px;border-style:none}.win-slider.win-vertical{writing-mode:bt-lr;width:44px;height:280px}.win-slider.win-vertical::-ms-track{width:2px;height:auto}.win-slider.win-vertical::-ms-thumb{width:24px;height:8px}.win-slider.win-vertical:lang(ar),.win-slider.win-vertical:lang(dv),.win-slider.win-vertical:lang(fa),.win-slider.win-vertical:lang(he),.win-slider.win-vertical:lang(ku-Arab),.win-slider.win-vertical:lang(pa-Arab),.win-slider.win-vertical:lang(prs),.win-slider.win-vertical:lang(ps),.win-slider.win-vertical:lang(qps-plocm),.win-slider.win-vertical:lang(sd-Arab),.win-slider.win-vertical:lang(syr),.win-slider.win-vertical:lang(ug),.win-slider.win-vertical:lang(ur){writing-mode:bt-rl}.win-link{text-decoration:underline;cursor:pointer}.win-code{font-family:Consolas,Menlo,Monaco,"Courier New",monospace}.win-back::before,.win-backbutton::before,.win-flipview .win-navbutton,.win-pivot .win-pivot-navbutton,.win-rating .win-star,.win-selectioncheckmark,.win-semanticzoom-button::before{font-family:"Segoe MDL2 Assets",Symbols}.win-type-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.win-h1.win-type-ellipsis,.win-type-header.win-type-ellipsis,h1.win-type-ellipsis{line-height:1.4286}.win-h2.win-type-ellipsis,.win-type-subheader.win-type-ellipsis,h2.win-type-ellipsis{line-height:1.5}.win-scrollview{overflow-x:auto;overflow-y:hidden;height:400px;width:100%}h1.win-h1,h1.win-type-header,h2.win-h2,h2.win-type-subheader,h3.win-h3,h3.win-type-title,h4.win-h4,h4.win-type-subtitle,h5.win-h5,h5.win-type-base,h6.win-h6,h6.win-type-body{margin-top:0;margin-bottom:0}.win-type-body p,p.win-type-body{font-weight:300}.win-listview{overflow:hidden;height:400px}.win-listview .win-surface{overflow:visible}.win-listview>.win-viewport.win-horizontal .win-surface{height:100%}.win-listview>.win-viewport.win-vertical .win-surface{width:100%}.win-listview>.win-viewport{position:relative;width:100%;height:100%;z-index:0;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch;white-space:nowrap}.win-listview>.win-viewport.win-horizontal{overflow-x:auto;overflow-y:hidden}.win-listview>.win-viewport.win-vertical{overflow-x:hidden;overflow-y:auto}.win-listview .win-itemscontainer{overflow:hidden}.win-listview .win-itemscontainer-padder{width:0;height:0;margin:0;padding:0;border:0;overflow:hidden}.win-listview>.win-horizontal .win-container{margin:10px 5px 0}.win-listview>.win-vertical .win-container{margin:10px 24px 0 7px}.win-listview.win-rtl>.win-vertical .win-container{margin:10px 7px 0 24px}.win-itemcontainer .win-itembox,.win-itemcontainer.win-container,.win-listview .win-container,.win-listview .win-itembox{cursor:default;z-index:0}.win-listview .win-container{touch-action:pan-x pan-y pinch-zoom}.win-semanticzoom .win-listview>.win-viewport.win-zooming-x{overflow-x:visible}.win-semanticzoom .win-listview>.win-viewport.win-zooming-y{overflow-y:visible}.win-itemcontainer .win-itembox,.win-listview .win-itembox{width:100%;height:100%}.win-itemcontainer .win-item,.win-listview .win-item{z-index:1;overflow:hidden;position:relative}.win-listview>.win-vertical .win-item{width:100%}.win-itemcontainer .win-item:focus,.win-listview .win-item:focus{outline-style:none}.win-itemcontainer .win-focusedoutline,.win-listview .win-focusedoutline{width:calc(100% - 4px);height:calc(100% - 4px);left:2px;top:2px;position:absolute;z-index:5;pointer-events:none}.win-container.win-selected .win-selectionborder,html.win-hoverable .win-container.win-selected:hover .win-selectionborder{border-width:2px;border-style:solid}html.win-hoverable .win-itemcontainer .win-itembox:hover::before,html.win-hoverable .win-listview .win-itembox:hover::before{position:absolute;left:0;top:0;content:"";width:calc(100% - 4px);height:calc(100% - 4px);pointer-events:none;border-style:solid;border-width:2px;z-index:3}html.win-hoverable .win-itemcontainer.win-itembox.win-selected:hover::before,html.win-hoverable .win-itemcontainer.win-selectionstylefilled .win-itembox:hover::before,html.win-hoverable .win-listview .win-itembox.win-selected:hover::before,html.win-hoverable .win-listview.win-selectionstylefilled .win-itembox:hover::before{display:none}.win-listview .win-groupheader{padding:10px 10px 10px 2px;overflow:hidden;outline-width:.01px;outline-style:none;float:left;font-size:34px;font-weight:200;line-height:1.176}.win-listview .win-groupheadercontainer{z-index:1;touch-action:pan-x pan-y pinch-zoom;overflow:hidden}.win-listview .win-horizontal .win-footercontainer,.win-listview .win-horizontal .win-headercontainer{height:100%;display:inline-block;overflow:hidden;white-space:normal}.win-listview .win-vertical .win-footercontainer,.win-listview .win-vertical .win-headercontainer{width:100%;display:block;overflow:hidden;white-space:normal}.win-listview .win-groupheader.win-focused{outline-style:dotted}.win-listview .win-viewport,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover,html.win-hoverable .win-listview.win-dragover .win-container:hover,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover,html.win-hoverable .win-selectionstylefilled .win-itemcontainer.win-container:hover{outline:0}.win-listview.win-rtl .win-groupheader{padding-left:10px;padding-right:2px;float:right}.win-listview.win-groups .win-horizontal .win-groupleader{margin-left:70px}.win-listview.win-groups.win-rtl .win-horizontal .win-groupleader{margin-left:0;margin-right:70px}.win-listview.win-groups .win-vertical .win-gridlayout .win-groupleader,.win-listview.win-groups .win-vertical .win-listlayout .win-groupleader{margin-top:70px}.win-listview.win-groups>.win-vertical .win-surface.win-gridlayout,.win-listview.win-groups>.win-vertical .win-surface.win-listlayout{margin-top:-65px}.win-listview.win-groups>.win-horizontal .win-surface{margin-left:-70px}.win-listview.win-groups.win-rtl>.win-horizontal .win-surface{margin-left:0;margin-right:-70px}.win-listview .win-surface{-webkit-margin-collapse:separate;white-space:normal}.win-surface ._win-proxy{position:relative;overflow:hidden;width:0;height:0;touch-action:none}.win-selectionborder{position:absolute;opacity:inherit;z-index:2;pointer-events:none}.win-container.win-selected .win-selectionborder{top:0;left:0;right:0;bottom:0}.win-selectionbackground{position:absolute;top:0;left:0;right:0;bottom:0;z-index:0}.win-selectioncheckmarkbackground{position:absolute;top:2px;right:2px;width:14px;height:11px;margin:0;padding:0;border-style:solid;z-index:3;display:none;border-width:4px 2px 3px}.win-itemcontainer.win-rtl .win-selectioncheckmarkbackground,.win-listview.win-rtl .win-selectioncheckmarkbackground{left:2px;right:auto}.win-listview .win-selectionmode .win-selectioncheckmark,.win-listview .win-selectionmode .win-selectioncheckmarkbackground,.win-selectionmode .win-itemcontainer .win-selectioncheckmarkbackground,.win-selectionmode .win-itemcontainer.win-selectionmode .win-selectioncheckmark,.win-selectionmode.win-itemcontainer .win-selectioncheckmarkbackground,.win-selectionmode.win-itemcontainer.win-selectionmode .win-selectioncheckmark{display:block}.win-selectioncheckmark{position:absolute;margin:0;padding:2px;right:1px;top:1px;font-size:14px;z-index:4;line-height:1;display:none}.win-rtl .win-selectioncheckmark{right:auto;left:0}.win-selectionstylefilled .win-container,.win-selectionstylefilled.win-container{overflow:hidden}.win-listview .win-surface.win-selectionmode .win-itembox::after,.win-selectionmode .win-itemcontainer.win-container .win-itembox::after,.win-selectionmode.win-itemcontainer.win-container .win-itembox::after{content:"";position:absolute;width:18px;height:18px;pointer-events:none;right:2px;top:2px;z-index:3}.win-itemcontainer.win-rtl.win-selectionmode.win-container .win-itembox::after,.win-listview.win-rtl .win-surface.win-selectionmode .win-itembox::after,.win-rtl .win-selectionmode .win-itemcontainer.win-container .win-itembox::after{right:auto;left:2px}.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-item{transition:transform 250ms cubic-bezier(.17,.79,.215,1.0025);-webkit-transition:-webkit-transform 250ms cubic-bezier(.17,.79,.215,1.0025);transform:translate(40px,0);-webkit-transform:translate(40px,0)}.win-listview.win-rtl.win-selectionstylefilled .win-surface.win-selectionmode .win-item{transition:transform 250ms cubic-bezier(.17,.79,.215,1.0025);-webkit-transition:-webkit-transform 250ms cubic-bezier(.17,.79,.215,1.0025);transform:translate(-40px,0);-webkit-transform:translate(-40px,0)}.win-listview.win-rtl.win-selectionstylefilled .win-surface.win-hideselectionmode .win-item,.win-listview.win-selectionstylefilled .win-surface.win-hidingselectionmode .win-item{transition:transform 250ms cubic-bezier(.17,.79,.215,1.0025);-webkit-transition:-webkit-transform 250ms cubic-bezier(.17,.79,.215,1.0025);transform:none;-webkit-transform:none}.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox::after{left:12px;right:auto;top:50%;margin-top:-9px;display:block;border:2px solid;width:16px;height:16px;background-color:transparent}.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-itembox::after{left:auto;right:12px}.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-selectioncheckmarkbackground{left:12px;top:50%;margin-top:-9px;display:block;border:2px solid;width:16px;height:16px}.win-itemcontainer.win-selectionstylefilled .win-selectioncheckmarkbackground,.win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-selectionborder,.win-listview.win-selectionstylefilled .win-container.win-selected .win-selectionborder,.win-listview.win-selectionstylefilled .win-selectioncheckmarkbackground{border-color:transparent}.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-selectioncheckmarkbackground{left:auto;right:12px}.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-selectioncheckmark{left:13px;top:50%;margin-top:-8px;display:block;width:14px;height:14px}.win-listview.win-selectionstylefilled.win-rtl .win-surface.win-selectionmode .win-selectioncheckmark{left:0;right:10px}.win-itemcontainer.win-selectionmode.win-selectionstylefilled.win-container .win-itembox.win-selected::after,.win-listview .win-surface.win-selectionmode .win-itembox.win-selected::after,.win-listview.win-selectionstylefilled .win-surface.win-selectionmode .win-itembox.win-nonselectable::after,.win-selectionmode .win-itemcontainer.win-selectionstylefilled.win-container .win-itembox.win-selected::after{display:none}.win-listview .win-progress{left:50%;top:50%;width:60px;height:60px;margin-left:-30px;margin-top:-30px;z-index:1;position:absolute}.win-flipview,.win-itemcontainer .win-itembox,.win-itemcontainer.win-container{position:relative}.win-listview .win-progress::-ms-fill{animation-name:-ms-ring}.win-listview .win-itemsblock{overflow:hidden}.win-listview .win-horizontal .win-nocssgrid.win-listlayout,.win-listview .win-surface.win-nocssgrid.win-gridlayout,.win-listview .win-vertical .win-nocssgrid.win-listlayout.win-headerpositionleft{display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;vertical-align:top}.win-listview .win-horizontal .win-surface.win-nocssgrid{-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;-webkit-align-content:flex-start;align-content:flex-start}.win-listview .win-vertical .win-surface.win-nocssgrid{-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;-webkit-align-content:flex-start;align-content:flex-start}.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout,.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout{display:block}.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout .win-itemscontainer-padder,.win-listview .win-horizontal .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout .win-itemscontainer-padder,.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout .win-itemscontainer-padder,.win-listview .win-vertical .win-structuralnodes.win-single-itemsblock.win-listlayout .win-itemscontainer.win-laidout .win-itemscontainer-padder{height:0;width:0}.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer,.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer,.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer,.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer{display:none}.win-listview.win-groups .win-horizontal .win-listlayout .win-groupheadercontainer.win-laidout,.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer.win-laidout,.win-listview.win-groups .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer.win-laidout{display:block}.win-listview .win-listlayout .win-itemscontainer{overflow:visible}.win-listview .win-listlayout .win-itemsblock{padding-bottom:4px;margin-bottom:-4px}.win-listview>.win-vertical .win-listlayout.win-headerpositiontop .win-groupheader{float:none}.win-listview>.win-vertical .win-surface.win-listlayout{margin-bottom:5px}.win-listview .win-vertical .win-listlayout.win-headerpositionleft.win-surface{display:-ms-inline-grid;-ms-grid-columns:auto 1fr;-ms-grid-rows:auto}.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-groupheadercontainer{-ms-grid-column:1}.win-listview .win-vertical .win-listlayout.win-headerpositionleft .win-itemscontainer{-ms-grid-column:2}.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-groupheadercontainer,.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-groupheadercontainer,.win-listview .win-vertical .win-gridlayout.win-headerpositiontop .win-itemscontainer{-ms-grid-column:1}.win-listview>.win-horizontal .win-surface.win-listlayout{display:-ms-inline-grid;-ms-grid-columns:auto;-ms-grid-rows:auto;vertical-align:top}.win-listview .win-horizontal .win-listlayout .win-itemsblock{height:100%}.win-listview .win-horizontal .win-listlayout .win-itemscontainer{margin-bottom:24px}.win-listview .win-horizontal .win-listlayout .win-container{height:calc(100% - 10px)}.win-listview>.win-horizontal .win-surface.win-listlayout.win-headerpositiontop{-ms-grid-rows:auto 1fr}.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-groupheadercontainer{-ms-grid-row:1}.win-listview .win-horizontal .win-listlayout.win-headerpositiontop .win-itemscontainer{-ms-grid-row:2}.win-listview .win-gridlayout.win-surface{display:-ms-inline-grid;vertical-align:top}.win-listview .win-gridlayout .win-container{margin:5px}.win-listview.win-groups .win-gridlayout .win-groupheadercontainer,.win-listview.win-groups .win-gridlayout .win-itemscontainer{display:none}.win-listview.win-groups .win-gridlayout .win-groupheadercontainer.win-laidout{display:block}.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop.win-surface{-ms-grid-columns:auto;-ms-grid-rows:auto 1fr}.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-groupheadercontainer{-ms-grid-row:1}.win-listview .win-horizontal .win-gridlayout.win-headerpositiontop .win-itemscontainer{-ms-grid-row:2}.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft.win-surface{-ms-grid-columns:auto;-ms-grid-rows:auto}.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-groupheadercontainer,.win-listview .win-horizontal .win-gridlayout.win-headerpositionleft .win-itemscontainer{-ms-grid-row:1}.win-listview .win-vertical .win-gridlayout.win-headerpositiontop.win-surface{-ms-grid-columns:auto;-ms-grid-rows:auto}.win-listview .win-vertical .win-gridlayout.win-headerpositionleft.win-surface{-ms-grid-columns:auto 1fr;-ms-grid-rows:auto}.win-listview .win-vertical .win-gridlayout.win-headerpositionleft .win-itemscontainer{-ms-grid-column:2}.win-listview .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock,.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout,.win-listview .win-horizontal .win-listlayout .win-itemsblock,.win-listview .win-horizontal .win-listlayout .win-itemscontainer,.win-listview.win-groups .win-horizontal .win-listlayout .win-itemscontainer.win-laidout{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;-webkit-align-content:flex-start;align-content:flex-start}.win-listview .win-horizontal .win-gridlayout .win-uniformgridlayout .win-itemsblock,.win-listview .win-horizontal .win-itemscontainer-padder{height:100%}.win-listview .win-horizontal .win-gridlayout .win-cellspanninggridlayout.win-itemscontainer.win-laidout{display:-ms-grid}.win-listview .win-vertical .win-gridlayout.win-structuralnodes .win-uniformgridlayout.win-itemscontainer.win-laidout{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock,.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout.win-itemscontainer.win-laidout{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;-webkit-align-content:flex-start;align-content:flex-start}.win-listview .win-vertical .win-gridlayout .win-uniformgridlayout .win-itemsblock{width:100%}.win-listview .win-cellspanninggridlayout .win-container.win-laidout{display:block}.win-listview .win-cellspanninggridlayout .win-container{display:none}.win-listview.win-dragover .win-itembox{transform:scale(.86);-webkit-transform:scale(.86)}.win-itemcontainer .win-itembox.win-dragsource,.win-listview .win-itembox.win-dragsource{opacity:.5;transition:opacity cubic-bezier(.1,.9,.2,1) 167ms,transform cubic-bezier(.1,.9,.2,1) 220ms;-webkit-transition:opacity cubic-bezier(.1,.9,.2,1) 167ms,transform cubic-bezier(.1,.9,.2,1) 220ms}.win-listview.win-dragover .win-itembox.win-dragsource{opacity:0;transition:none;-webkit-transition:none}.win-listview .win-itembox{position:relative;transition:transform cubic-bezier(.1,.9,.2,1) 220ms;-webkit-transition:-webkit-transform cubic-bezier(.1,.9,.2,1) 220ms}.win-listview.win-groups>.win-vertical .win-surface.win-listlayout.win-headerpositionleft{margin-left:70px}.win-listview.win-groups.win-rtl>.win-vertical .win-surface.win-listlayout.win-headerpositionleft{margin-left:0;margin-right:70px}.win-listview>.win-horizontal .win-surface.win-listlayout{margin-left:70px}.win-listview.win-rtl>.win-horizontal .win-surface.win-listlayout{margin-left:0;margin-right:70px}.win-listview .win-vertical .win-gridlayout.win-surface{margin-left:20px}.win-listview.win-rtl .win-vertical .win-gridlayout.win-surface{margin-left:0;margin-right:20px}.win-itemcontainer{touch-action:pan-x pan-y pinch-zoom}html.win-hoverable .win-itemcontainer .win-itembox:hover::before,html.win-hoverable .win-listview .win-itembox:hover::before{opacity:.4}html.win-hoverable .win-itemcontainer.win-pressed .win-itembox:hover::before,html.win-hoverable .win-listview .win-pressed .win-itembox:hover::before,html.win-hoverable .win-listview .win-pressed.win-itembox:hover::before{opacity:.6}.win-listview.win-selectionstylefilled .win-itembox,.win-selectionstylefilled .win-itemcontainer .win-itembox,.win-selectionstylefilled.win-itemcontainer .win-itembox{background-color:transparent}.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-full,.win-itemcontainer.win-selectionstylefilled.win-selected a,.win-itemcontainer.win-selectionstylefilled.win-selected progress,.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-full,.win-listview.win-selectionstylefilled .win-selected a,.win-listview.win-selectionstylefilled .win-selected progress{color:#fff}.win-itemcontainer.win-selectionstylefilled.win-selected.win-selected a:hover:active,.win-listview.win-selectionstylefilled .win-selected.win-selected a:hover:active{color:rgba(255,255,255,.6)}html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected a:hover,html.win-hoverable .win-listview.win-selectionstylefilled .win-selected a:hover{color:rgba(255,255,255,.8)}.win-itemcontainer.win-selectionstylefilled.win-selected .win-textarea,.win-itemcontainer.win-selectionstylefilled.win-selected button,.win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-check,.win-itemcontainer.win-selectionstylefilled.win-selected input[type=button],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=email],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=number],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=password],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=reset],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=search],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=tel],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=text],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=url],.win-itemcontainer.win-selectionstylefilled.win-selected select,.win-itemcontainer.win-selectionstylefilled.win-selected textarea,.win-listview.win-selectionstylefilled .win-selected .win-textarea,.win-listview.win-selectionstylefilled .win-selected button,.win-listview.win-selectionstylefilled .win-selected input::-ms-check,.win-listview.win-selectionstylefilled .win-selected input[type=button],.win-listview.win-selectionstylefilled .win-selected input[type=email],.win-listview.win-selectionstylefilled .win-selected input[type=number],.win-listview.win-selectionstylefilled .win-selected input[type=password],.win-listview.win-selectionstylefilled .win-selected input[type=reset],.win-listview.win-selectionstylefilled .win-selected input[type=search],.win-listview.win-selectionstylefilled .win-selected input[type=tel],.win-listview.win-selectionstylefilled .win-selected input[type=text],.win-listview.win-selectionstylefilled .win-selected input[type=url],.win-listview.win-selectionstylefilled .win-selected select,.win-listview.win-selectionstylefilled .win-selected textarea{background-clip:border-box;background-color:rgba(255,255,255,.8);border-color:transparent;color:#000}.win-itemcontainer.win-selectionstylefilled.win-selected button[type=submit],.win-itemcontainer.win-selectionstylefilled.win-selected input[type=submit],.win-listview.win-selectionstylefilled .win-selected button[type=submit],.win-listview.win-selectionstylefilled .win-selected input[type=submit]{border-color:#fff}.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-lower,.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-lower{background-color:#fff}.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-thumb,.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-thumb{background-color:#000}.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-upper,.win-itemcontainer.win-selectionstylefilled.win-selected progress,.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-upper,.win-listview.win-selectionstylefilled .win-selected progress{background-color:rgba(255,255,255,.16)}.win-itemcontainer.win-selectionstylefilled.win-selected progress:indeterminate,.win-listview.win-selectionstylefilled .win-selected progress:indeterminate{background-color:transparent}.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-empty,.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-empty{color:rgba(255,255,255,.16)}@media (-ms-high-contrast){.win-listview .win-groupheader{color:WindowText}.win-selectioncheckmark{color:HighlightText}.win-itemcontainer .win-focusedoutline,.win-listview .win-focusedoutline,.win-listview .win-groupheader{outline-color:WindowText}.win-itemcontainer.win-selectionstylefilled .win-itembox,.win-listview.win-selectionstylefilled .win-itembox{background-color:Window;color:WindowText}.win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-itembox,.win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground,.win-listview.win-selectionstylefilled .win-container.win-selected .win-itembox,.win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-selected:hover .win-itembox,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-itembox,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground,html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-selected:hover .win-itembox,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-itembox,html.win-hoverable .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground{background-color:Highlight;color:HighlightText}.win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected .win-selectionborder,.win-listview:not(.win-selectionstylefilled) .win-container.win-selected .win-selectionborder{border-color:Highlight}.win-itemcontainer.win-selectionstylefilled.win-container.win-selected .win-selectionborder,.win-listview.win-selectionstylefilled .win-container.win-selected .win-selectionborder{border-color:transparent}html.win-hoverable .win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected:hover .win-selectionborder,html.win-hoverable .win-listview:not(.win-selectionstylefilled) .win-container.win-selected:hover .win-selectionborder{border-color:Highlight}.win-itemcontainer.win-selectionstylefilled .win-selectioncheckmarkbackground,.win-listview.win-selectionstylefilled .win-selectioncheckmarkbackground{border-color:transparent}.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star:after,.win-itemcontainer.win-selectionstylefilled.win-selected a,.win-itemcontainer.win-selectionstylefilled.win-selected progress,.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star:after,.win-listview.win-selectionstylefilled .win-selected a,.win-listview.win-selectionstylefilled .win-selected progress,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star:after,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover a,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star:after,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover a,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress{color:HighlightText}.win-itemcontainer.win-selectionstylefilled.win-selected button,.win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-check,.win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-track,.win-itemcontainer.win-selectionstylefilled.win-selected input::-ms-value,.win-itemcontainer.win-selectionstylefilled.win-selected progress,.win-itemcontainer.win-selectionstylefilled.win-selected progress::-ms-fill,.win-itemcontainer.win-selectionstylefilled.win-selected select,.win-itemcontainer.win-selectionstylefilled.win-selected textarea,.win-listview.win-selectionstylefilled .win-selected button,.win-listview.win-selectionstylefilled .win-selected input,.win-listview.win-selectionstylefilled .win-selected input::-ms-check,.win-listview.win-selectionstylefilled .win-selected input::-ms-track,.win-listview.win-selectionstylefilled .win-selected input::-ms-value,.win-listview.win-selectionstylefilled .win-selected progress,.win-listview.win-selectionstylefilled .win-selected progress::-ms-fill,.win-listview.win-selectionstylefilled .win-selected select,.win-listview.win-selectionstylefilled .win-selected textarea,.win-listview.win-selectionstylefilled.win-selected input,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover button,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-check,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-track,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input::-ms-value,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress::-ms-fill,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover select,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover textarea,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover button,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-check,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-track,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input::-ms-value,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress::-ms-fill,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover select,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover textarea{border-color:HighlightText}.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-lower,.win-itemcontainer.win-selectionstylefilled.win-selected progress::-ms-fill,.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-lower,.win-listview.win-selectionstylefilled .win-selected progress::-ms-fill,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input[type=range]::-ms-fill-lower,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress::-ms-fill,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input[type=range]::-ms-fill-lower,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress::-ms-fill{background-color:HighlightText}.win-itemcontainer.win-selectionstylefilled.win-selected input[type=range]::-ms-fill-upper,.win-itemcontainer.win-selectionstylefilled.win-selected progress,.win-listview.win-selectionstylefilled .win-selected input[type=range]::-ms-fill-upper,.win-listview.win-selectionstylefilled .win-selected progress,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover input[type=range]::-ms-fill-upper,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover progress,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover input[type=range]::-ms-fill-upper,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover progress{background-color:Highlight}.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-full:before,.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-full:before,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star.win-full:before,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star.win-full:before{color:ButtonFace}.win-itemcontainer.win-selectionstylefilled.win-selected .win-rating .win-star.win-empty:before,.win-listview.win-selectionstylefilled .win-selected .win-rating .win-star.win-empty:before,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container:hover .win-rating .win-star.win-empty:before,html.win-hoverable .win-listview.win-selectionstylefilled .win-container:hover .win-rating .win-star.win-empty:before{color:Highlight}html.win-hoverable .win-itemcontainer.win-container:hover,html.win-hoverable .win-listview .win-container:hover{outline:Highlight solid 3px}}.win-flipview{overflow:hidden;height:400px}.win-flipview .win-surface{-ms-scroll-chaining:none}.win-flipview .win-navleft{left:0;top:50%;margin-top:-19px}.win-flipview .win-navright{left:100%;top:50%;margin-left:-20px;margin-top:-19px}.win-flipview .win-navtop{left:50%;top:0;margin-left:-35px}.win-flipview .win-navbottom{left:50%;top:100%;margin-left:-35px;margin-top:-36px}.win-flipview .win-navbutton{touch-action:manipulation;border:none;width:20px;height:36px;z-index:1;position:absolute;font-size:16px;padding:0;min-width:0}.win-flipview .win-item,.win-flipview .win-item>.win-template{height:100%;width:100%;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}@media (-ms-high-contrast){.win-flipview .win-navbottom{left:50%;top:100%;margin-left:-35px;margin-top:-35px}.win-flipview .win-navbutton{background-color:ButtonFace;color:ButtonText;border:2px solid ButtonText;width:65px;height:35px}.win-flipview .win-navbutton.win-navbutton:active,.win-flipview .win-navbutton.win-navbutton:hover:active{background-color:ButtonText;color:ButtonFace}.win-flipview .win-navright{margin-left:-65px}html.win-hoverable .win-flipview .win-navbutton:hover{background-color:Highlight;color:HighlightText}}.win-datepicker select,.win-timepicker select{min-width:80px;margin-top:4px;margin-bottom:4px}.win-datepicker{display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;height:auto;width:auto}.win-datepicker .win-datepicker-date.win-order0,.win-datepicker .win-datepicker-date.win-order1,.win-datepicker .win-datepicker-month,.win-datepicker .win-datepicker-year.win-order0{margin-right:20px}.win-datepicker .win-datepicker-date.win-order0:lang(ar),.win-datepicker .win-datepicker-date.win-order0:lang(dv),.win-datepicker .win-datepicker-date.win-order0:lang(fa),.win-datepicker .win-datepicker-date.win-order0:lang(he),.win-datepicker .win-datepicker-date.win-order0:lang(ku-Arab),.win-datepicker .win-datepicker-date.win-order0:lang(pa-Arab),.win-datepicker .win-datepicker-date.win-order0:lang(prs),.win-datepicker .win-datepicker-date.win-order0:lang(ps),.win-datepicker .win-datepicker-date.win-order0:lang(qps-plocm),.win-datepicker .win-datepicker-date.win-order0:lang(sd-Arab),.win-datepicker .win-datepicker-date.win-order0:lang(syr),.win-datepicker .win-datepicker-date.win-order0:lang(ug),.win-datepicker .win-datepicker-date.win-order0:lang(ur),.win-datepicker .win-datepicker-date.win-order1:lang(ar),.win-datepicker .win-datepicker-date.win-order1:lang(dv),.win-datepicker .win-datepicker-date.win-order1:lang(fa),.win-datepicker .win-datepicker-date.win-order1:lang(he),.win-datepicker .win-datepicker-date.win-order1:lang(ku-Arab),.win-datepicker .win-datepicker-date.win-order1:lang(pa-Arab),.win-datepicker .win-datepicker-date.win-order1:lang(prs),.win-datepicker .win-datepicker-date.win-order1:lang(ps),.win-datepicker .win-datepicker-date.win-order1:lang(qps-plocm),.win-datepicker .win-datepicker-date.win-order1:lang(sd-Arab),.win-datepicker .win-datepicker-date.win-order1:lang(syr),.win-datepicker .win-datepicker-date.win-order1:lang(ug),.win-datepicker .win-datepicker-date.win-order1:lang(ur),.win-datepicker .win-datepicker-month:lang(ar),.win-datepicker .win-datepicker-month:lang(dv),.win-datepicker .win-datepicker-month:lang(fa),.win-datepicker .win-datepicker-month:lang(he),.win-datepicker .win-datepicker-month:lang(ku-Arab),.win-datepicker .win-datepicker-month:lang(pa-Arab),.win-datepicker .win-datepicker-month:lang(prs),.win-datepicker .win-datepicker-month:lang(ps),.win-datepicker .win-datepicker-month:lang(qps-plocm),.win-datepicker .win-datepicker-month:lang(sd-Arab),.win-datepicker .win-datepicker-month:lang(syr),.win-datepicker .win-datepicker-month:lang(ug),.win-datepicker .win-datepicker-month:lang(ur),.win-datepicker .win-datepicker-year.win-order0:lang(ar),.win-datepicker .win-datepicker-year.win-order0:lang(dv),.win-datepicker .win-datepicker-year.win-order0:lang(fa),.win-datepicker .win-datepicker-year.win-order0:lang(he),.win-datepicker .win-datepicker-year.win-order0:lang(ku-Arab),.win-datepicker .win-datepicker-year.win-order0:lang(pa-Arab),.win-datepicker .win-datepicker-year.win-order0:lang(prs),.win-datepicker .win-datepicker-year.win-order0:lang(ps),.win-datepicker .win-datepicker-year.win-order0:lang(qps-plocm),.win-datepicker .win-datepicker-year.win-order0:lang(sd-Arab),.win-datepicker .win-datepicker-year.win-order0:lang(syr),.win-datepicker .win-datepicker-year.win-order0:lang(ug),.win-datepicker .win-datepicker-year.win-order0:lang(ur){margin-right:0;margin-left:20px}.win-timepicker{display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;height:auto;width:auto}.win-timepicker .win-timepicker-hour,.win-timepicker .win-timepicker-minute.win-order1,.win-timepicker .win-timepicker-period.win-order0{margin-right:20px}.win-timepicker .win-timepicker-hour:lang(ar),.win-timepicker .win-timepicker-hour:lang(dv),.win-timepicker .win-timepicker-hour:lang(fa),.win-timepicker .win-timepicker-hour:lang(he),.win-timepicker .win-timepicker-hour:lang(ku-Arab),.win-timepicker .win-timepicker-hour:lang(pa-Arab),.win-timepicker .win-timepicker-hour:lang(prs),.win-timepicker .win-timepicker-hour:lang(ps),.win-timepicker .win-timepicker-hour:lang(qps-plocm),.win-timepicker .win-timepicker-hour:lang(sd-Arab),.win-timepicker .win-timepicker-hour:lang(syr),.win-timepicker .win-timepicker-hour:lang(ug),.win-timepicker .win-timepicker-hour:lang(ur),.win-timepicker .win-timepicker-minute.win-order0:lang(ar),.win-timepicker .win-timepicker-minute.win-order0:lang(dv),.win-timepicker .win-timepicker-minute.win-order0:lang(fa),.win-timepicker .win-timepicker-minute.win-order0:lang(he),.win-timepicker .win-timepicker-minute.win-order0:lang(ku-Arab),.win-timepicker .win-timepicker-minute.win-order0:lang(pa-Arab),.win-timepicker .win-timepicker-minute.win-order0:lang(prs),.win-timepicker .win-timepicker-minute.win-order0:lang(ps),.win-timepicker .win-timepicker-minute.win-order0:lang(qps-plocm),.win-timepicker .win-timepicker-minute.win-order0:lang(sd-Arab),.win-timepicker .win-timepicker-minute.win-order0:lang(syr),.win-timepicker .win-timepicker-minute.win-order0:lang(ug),.win-timepicker .win-timepicker-minute.win-order0:lang(ur),.win-timepicker .win-timepicker-minute.win-order1:lang(ar),.win-timepicker .win-timepicker-minute.win-order1:lang(dv),.win-timepicker .win-timepicker-minute.win-order1:lang(fa),.win-timepicker .win-timepicker-minute.win-order1:lang(he),.win-timepicker .win-timepicker-minute.win-order1:lang(ku-Arab),.win-timepicker .win-timepicker-minute.win-order1:lang(pa-Arab),.win-timepicker .win-timepicker-minute.win-order1:lang(prs),.win-timepicker .win-timepicker-minute.win-order1:lang(ps),.win-timepicker .win-timepicker-minute.win-order1:lang(qps-plocm),.win-timepicker .win-timepicker-minute.win-order1:lang(sd-Arab),.win-timepicker .win-timepicker-minute.win-order1:lang(syr),.win-timepicker .win-timepicker-minute.win-order1:lang(ug),.win-timepicker .win-timepicker-minute.win-order1:lang(ur),.win-timepicker .win-timepicker-period.win-order0:lang(ar),.win-timepicker .win-timepicker-period.win-order0:lang(dv),.win-timepicker .win-timepicker-period.win-order0:lang(fa),.win-timepicker .win-timepicker-period.win-order0:lang(he),.win-timepicker .win-timepicker-period.win-order0:lang(ku-Arab),.win-timepicker .win-timepicker-period.win-order0:lang(pa-Arab),.win-timepicker .win-timepicker-period.win-order0:lang(prs),.win-timepicker .win-timepicker-period.win-order0:lang(ps),.win-timepicker .win-timepicker-period.win-order0:lang(qps-plocm),.win-timepicker .win-timepicker-period.win-order0:lang(sd-Arab),.win-timepicker .win-timepicker-period.win-order0:lang(syr),.win-timepicker .win-timepicker-period.win-order0:lang(ug),.win-timepicker .win-timepicker-period.win-order0:lang(ur){margin-left:20px;margin-right:0}body>.win-navigation-backbutton{position:absolute;top:50px;left:20px}.win-back,.win-backbutton,.win-navigation-backbutton{touch-action:manipulation;display:inline-block;min-width:0;min-height:0;padding:0;text-align:center;width:41px;height:41px;font-size:24px;line-height:41px;vertical-align:baseline}.win-tooltip,.win-tooltip-phantom{display:block;position:fixed;top:30px;left:30px;margin:0}.win-back::before,.win-backbutton::before{font-weight:400;content:"\E0D5";vertical-align:50%}.win-back:lang(ar)::before,.win-back:lang(dv)::before,.win-back:lang(fa)::before,.win-back:lang(he)::before,.win-back:lang(ku-Arab)::before,.win-back:lang(pa-Arab)::before,.win-back:lang(prs)::before,.win-back:lang(ps)::before,.win-back:lang(qps-plocm)::before,.win-back:lang(sd-Arab)::before,.win-back:lang(syr)::before,.win-back:lang(ug)::before,.win-back:lang(ur)::before,.win-backbutton:lang(ar)::before,.win-backbutton:lang(dv)::before,.win-backbutton:lang(fa)::before,.win-backbutton:lang(he)::before,.win-backbutton:lang(ku-Arab)::before,.win-backbutton:lang(pa-Arab)::before,.win-backbutton:lang(prs)::before,.win-backbutton:lang(ps)::before,.win-backbutton:lang(qps-plocm)::before,.win-backbutton:lang(sd-Arab)::before,.win-backbutton:lang(syr)::before,.win-backbutton:lang(ug)::before,.win-backbutton:lang(ur)::before{content:"\E0AE"}button.win-navigation-backbutton,button.win-navigation-backbutton:active,button.win-navigation-backbutton:enabled:hover:active,html.win-hoverable button.win-navigation-backbutton:enabled:hover{background-color:transparent;border:none}@media (-ms-high-contrast){button.win-navigation-backbutton,button.win-navigation-backbutton:active,button.win-navigation-backbutton:enabled:hover:active,html.win-hoverable button.win-navigation-backbutton:enabled:hover{background-color:transparent;border:none}.win-back,.win-backbutton{background-color:ButtonFace;border-color:ButtonText;color:ButtonText}.win-backbutton.win-backbutton:enabled:hover:active,.win-navigation-backbutton.win-navigation-backbutton:enabled:hover:active .win-back{background-clip:border-box;background-color:ButtonText;border-color:transparent;color:ButtonFace}.win-backbutton:disabled,.win-backbutton:disabled:active,.win-navigation-backbutton:disabled .win-back,.win-navigation-backbutton:disabled:active .win-back{background-color:ButtonFace;border-color:GrayText;color:GrayText}.win-backbutton:-ms-keyboard-active,.win-navigation-backbutton:-ms-keyboard-active .win-back{background-clip:border-box;background-color:ButtonText;border-color:transparent;color:ButtonFace}html.win-hoverable .win-backbutton:enabled:hover,html.win-hoverable .win-navigation-backbutton:enabled:hover .win-back{background-color:Highlight;border-color:ButtonText;color:HighlightText}}.win-tooltip{max-width:320px;box-sizing:border-box;padding:4px 7px 6px;border-style:solid;border-width:1px;z-index:9999;word-wrap:break-word;animation-fill-mode:both;font-size:12px;font-weight:400;line-height:1.167}.win-tooltip-phantom{background-color:transparent;border-width:0;padding:0}.win-rating{display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-pack:self;-webkit-justify-content:self;justify-content:self;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;height:auto;width:auto;white-space:normal;outline:0}.win-rating .win-star{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;height:24px;width:24px;padding:9px 10px 11px;font-size:24px;overflow:hidden;text-indent:0;line-height:1;cursor:default;position:relative;letter-spacing:0;-ms-touch-action:none;touch-action:none}.win-rating.win-small .win-star{width:12px;height:12px;font-size:12px;padding:3px 4px 5px}.win-rating .win-star:before{content:"\E082"}.win-rating .win-star.win-disabled{cursor:default;-ms-touch-action:auto;touch-action:auto}@media (-ms-high-contrast){.win-tooltip{background-color:Window;border-color:WindowText;color:WindowText}.win-rating .win-star:before{content:"\E082"!important}.win-rating .win-star.win-full{color:HighLight}.win-rating .win-star.win-tentative.win-full{color:ButtonText}.win-rating .win-star.win-empty{color:ButtonFace}.win-rating .win-star:after{content:"\E224"!important;position:relative;top:-100%;color:ButtonText}.win-semanticzoom-button{background-color:ButtonFace;border-color:ButtonText;color:ButtonText}.win-semanticzoom-button.win-semanticzoom-button:hover:active{background-clip:border-box;background-color:ButtonText;border-color:transparent;color:ButtonFace}.win-semanticzoom-button:-ms-keyboard-active{background-clip:border-box;background-color:ButtonText;border-color:transparent;color:ButtonFace}html.win-hoverable .win-semanticzoom-button:hover{background-color:Highlight;border-color:ButtonText;color:HighlightText}}.win-toggleswitch{outline:0}.win-toggleswitch .win-toggleswitch-header{max-width:470px;margin-bottom:14px;margin-top:22px;font-size:15px;font-weight:400;line-height:1.333}.win-toggleswitch .win-toggleswitch-values{display:inline-block;vertical-align:top}.win-toggleswitch .win-toggleswitch-value{margin-left:12px;height:20px;vertical-align:top;font-size:15px;font-weight:400;line-height:20px}.win-toggleswitch .win-toggleswitch-description{font-size:12px;width:22em;margin-top:28px;display:none}.win-toggleswitch .win-toggleswitch-clickregion{display:inline-block;touch-action:none;-ms-user-select:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;padding-top:5px}.win-toggleswitch .win-toggleswitch-track{position:relative;display:inline-block;width:44px;height:20px;border-style:solid;border-width:2px;border-radius:10px;box-sizing:border-box}.win-toggleswitch .win-toggleswitch-thumb{position:absolute;top:3px;display:inline-block;width:10px;height:10px;border-radius:5px;-webkit-transition:left .1s;transition:left .1s}.win-toggleswitch:focus .win-toggleswitch-clickregion{outline-width:1px;outline-style:dotted}.win-toggleswitch.win-toggleswitch-dragging .win-toggleswitch-thumb{-webkit-transition:none;transition:none}.win-toggleswitch.win-toggleswitch-off .win-toggleswitch-value-on,.win-toggleswitch.win-toggleswitch-on .win-toggleswitch-value-off{visibility:hidden;height:0;font-size:0;line-height:0}.win-toggleswitch.win-toggleswitch-on .win-toggleswitch-thumb{left:27px}.win-toggleswitch.win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(ar).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(dv).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(fa).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(he).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(ku-Arab).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(pa-Arab).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(prs).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(ps).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(qps-plocm).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(sd-Arab).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(syr).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(ug).win-toggleswitch-on .win-toggleswitch-thumb,.win-toggleswitch:lang(ur).win-toggleswitch-on .win-toggleswitch-thumb{left:3px}.win-toggleswitch:lang(ar).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(dv).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(fa).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(he).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(ku-Arab).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(pa-Arab).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(prs).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(ps).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(qps-plocm).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(sd-Arab).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(syr).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(ug).win-toggleswitch-off .win-toggleswitch-thumb,.win-toggleswitch:lang(ur).win-toggleswitch-off .win-toggleswitch-thumb{left:27px}.win-semanticzoom{touch-action:pan-x pan-y double-tap-zoom;height:400px;position:relative}.win-semanticzoom .win-listview>.win-viewport *{touch-action:auto}.win-semanticzoom *{touch-action:inherit}.win-semanticzoom-button{z-index:100;position:absolute;min-width:25px;min-height:25px;width:25px;height:25px;padding:0;bottom:21px;touch-action:none}.win-semanticzoom-button::before{font-weight:400;font-size:11px;content:"\E0B8"}.win-semanticzoom-button-location{left:auto;right:4px}.win-semanticzoom-button-location:lang(ar),.win-semanticzoom-button-location:lang(dv),.win-semanticzoom-button-location:lang(fa),.win-semanticzoom-button-location:lang(he),.win-semanticzoom-button-location:lang(ku-Arab),.win-semanticzoom-button-location:lang(pa-Arab),.win-semanticzoom-button-location:lang(prs),.win-semanticzoom-button-location:lang(ps),.win-semanticzoom-button-location:lang(qps-plocm),.win-semanticzoom-button-location:lang(sd-Arab),.win-semanticzoom-button-location:lang(syr),.win-semanticzoom-button-location:lang(ug),.win-semanticzoom-button-location:lang(ur){left:4px;right:auto}.win-pivot{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex-wrap:none;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;height:100%;width:100%;overflow:hidden;-ms-scroll-limit-x-max:0;touch-action:manipulation;position:relative}.win-pivot .win-pivot-navbutton{touch-action:manipulation;position:absolute;width:20px;height:36px;padding:0;margin:0;top:10px;min-width:0;border-width:0;cursor:pointer;opacity:0}.win-pivot .win-pivot-headers.win-pivot-shownavbuttons .win-pivot-navbutton{opacity:1}.win-pivot .win-pivot-headers .win-pivot-navbutton-prev:before{content:"\E096"}.win-pivot .win-pivot-headers .win-pivot-navbutton-next:before{content:"\E09B"}.win-pivot .win-pivot-title{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;font-family:"Segoe UI",sans-serif,"Segoe MDL2 Assets",Symbols,"Segoe UI Emoji";font-size:15px;font-weight:700;white-space:nowrap;margin:14px 0 13px 24px}.win-pivot .win-pivot-title:lang(ar),.win-pivot .win-pivot-title:lang(dv),.win-pivot .win-pivot-title:lang(fa),.win-pivot .win-pivot-title:lang(he),.win-pivot .win-pivot-title:lang(ku-Arab),.win-pivot .win-pivot-title:lang(pa-Arab),.win-pivot .win-pivot-title:lang(prs),.win-pivot .win-pivot-title:lang(ps),.win-pivot .win-pivot-title:lang(qps-plocm),.win-pivot .win-pivot-title:lang(sd-Arab),.win-pivot .win-pivot-title:lang(syr),.win-pivot .win-pivot-title:lang(ug),.win-pivot .win-pivot-title:lang(ur){margin:14px 24px 13px 0}.win-pivot>.win-pivot-item{display:none}.win-pivot .win-pivot-header-area{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.win-hub-section,.win-hub-surface{display:inline-block}.win-pivot .win-pivot-header-leftcustom,.win-pivot .win-pivot-header-rightcustom{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;margin-top:13px}.win-pivot .win-pivot-header-items{-ms-flex:1 1 0%;-webkit-flex:1 1 0%;flex:1 1 0%;overflow-x:hidden;padding:1px}.win-pivot .win-pivot-headers{white-space:nowrap;position:relative;overflow-y:visible;height:48px;touch-action:none;-ms-touch-action:none;outline:0}.win-pivot .win-pivot-headers.win-keyboard:focus{outline-style:dotted;outline-width:1px}.win-pivot .win-pivot-header,.win-pivot .win-pivot-header.win-pivot-header:hover:active{touch-action:manipulation;font-size:24px;font-weight:300;line-height:1.167;display:inline-block;transition:opacity linear 167ms;-webkit-transition:opacity linear 167ms;overflow:hidden;height:30px;border:0;padding:0;outline:0;margin:12px 12px 0;min-height:0;min-width:0}.win-pivot.win-pivot-locked .win-pivot-header{opacity:0;visibility:hidden}.win-pivot .win-pivot-header.win-pivot-header-selected,.win-pivot.win-pivot-locked .win-pivot-header.win-pivot-header-selected{opacity:1;visibility:inherit}.win-pivot .win-pivot-viewport{height:100%;overflow-x:auto;overflow-y:hidden;-ms-scroll-snap-type:mandatory;-ms-scroll-snap-points-x:snapInterval(0,100%);-ms-overflow-style:none;position:relative;padding-top:48px;margin-top:-48px}.win-pivot.win-pivot-customheaders .win-pivot-viewport{padding-top:inherit;margin-top:inherit}.win-pivot.win-pivot-mouse .win-pivot-viewport{padding-top:0;margin-top:0}.win-pivot.win-pivot-locked .win-pivot-viewport{overflow:hidden}.win-pivot .win-pivot-surface{width:300%;height:100%;position:relative}html.win-hoverable .win-pivot button.win-pivot-header:hover{background-color:transparent;border:0;padding:0;letter-spacing:0;margin:12px 12px 0;min-height:0;min-width:0}html.win-hoverable .win-pivot .win-pivot-navbutton:hover{margin:0;padding:0;border-width:0;cursor:pointer;font-family:"Segoe MDL2 Assets",Symbols}.win-pivot-item{position:absolute;top:0;bottom:0;width:33.3%;left:33.3%}.win-pivot-item:lang(ar),.win-pivot-item:lang(dv),.win-pivot-item:lang(fa),.win-pivot-item:lang(he),.win-pivot-item:lang(ku-Arab),.win-pivot-item:lang(pa-Arab),.win-pivot-item:lang(prs),.win-pivot-item:lang(ps),.win-pivot-item:lang(qps-plocm),.win-pivot-item:lang(sd-Arab),.win-pivot-item:lang(syr),.win-pivot-item:lang(ug),.win-pivot-item:lang(ur){left:auto;right:33.3%}.win-pivot-item .win-pivot-item-content{height:100%;overflow-y:auto;-ms-overflow-style:-ms-autohiding-scrollbar;padding:0 24px}.win-pivot.win-pivot-nosnap .win-pivot-viewport{padding-top:0;margin-top:0;overflow:hidden}.win-pivot.win-pivot-nosnap .win-pivot-item,.win-pivot.win-pivot-nosnap .win-pivot-surface{width:100%;position:static}.win-hub{height:100%;width:100%;position:relative}.win-hub-progress{position:absolute;top:10px;width:100%;z-index:1}.win-hub-viewport{height:100%;width:100%;-ms-scroll-snap-type:proximity;-webkit-overflow-scrolling:touch}.win-hub-horizontal .win-hub-viewport{overflow-x:auto;overflow-y:hidden;white-space:nowrap}.win-hub-vertical .win-hub-viewport{position:relative;overflow-y:auto;overflow-x:hidden}.win-hub-vertical .win-hub-surface{width:calc(100% - 24px);padding:0 12px 8px;margin-top:-24px}.win-hub-horizontal .win-hub-surface{height:100%;padding-left:12px}.win-hub-horizontal .win-hub-surface:lang(ar),.win-hub-horizontal .win-hub-surface:lang(dv),.win-hub-horizontal .win-hub-surface:lang(fa),.win-hub-horizontal .win-hub-surface:lang(he),.win-hub-horizontal .win-hub-surface:lang(ku-Arab),.win-hub-horizontal .win-hub-surface:lang(pa-Arab),.win-hub-horizontal .win-hub-surface:lang(prs),.win-hub-horizontal .win-hub-surface:lang(ps),.win-hub-horizontal .win-hub-surface:lang(qps-plocm),.win-hub-horizontal .win-hub-surface:lang(sd-Arab),.win-hub-horizontal .win-hub-surface:lang(syr),.win-hub-horizontal .win-hub-surface:lang(ug),.win-hub-horizontal .win-hub-surface:lang(ur){padding-left:0;padding-right:12px}.win-hub-section{vertical-align:top;white-space:normal}.win-hub-horizontal .win-hub-section{height:100%;padding-right:24px}.win-hub-horizontal .win-hub-section:lang(ar),.win-hub-horizontal .win-hub-section:lang(dv),.win-hub-horizontal .win-hub-section:lang(fa),.win-hub-horizontal .win-hub-section:lang(he),.win-hub-horizontal .win-hub-section:lang(ku-Arab),.win-hub-horizontal .win-hub-section:lang(pa-Arab),.win-hub-horizontal .win-hub-section:lang(prs),.win-hub-horizontal .win-hub-section:lang(ps),.win-hub-horizontal .win-hub-section:lang(qps-plocm),.win-hub-horizontal .win-hub-section:lang(sd-Arab),.win-hub-horizontal .win-hub-section:lang(syr),.win-hub-horizontal .win-hub-section:lang(ug),.win-hub-horizontal .win-hub-section:lang(ur){padding-right:0;padding-left:24px}.win-hub-horizontal .win-hub-section-header{margin-top:62px}.win-hub-vertical .win-hub-section{width:100%;padding-top:24px}.win-hub-section-header{margin-bottom:9px;height:28px}button.win-hub-section-header-tabstop,button.win-hub-section-header-tabstop:hover:active,html.win-hoverable button.win-hub-section-header-tabstop:hover{touch-action:manipulation;width:100%;background-color:transparent;border:0;min-height:0;min-width:0;max-width:100%;padding:0}button.win-hub-section-header-tabstop:focus{outline:0}button.win-hub-section-header-tabstop:-ms-keyboard-active{background-color:transparent}.win-hub-section-header-wrapper{display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;width:100%;outline:0}.win-hub-section-header-content{font-size:20px;font-weight:400;line-height:1.5;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;text-align:left;vertical-align:bottom;overflow:hidden;text-overflow:clip;white-space:nowrap}.win-hub-section-header-content:lang(ar),.win-hub-section-header-content:lang(dv),.win-hub-section-header-content:lang(fa),.win-hub-section-header-content:lang(he),.win-hub-section-header-content:lang(ku-Arab),.win-hub-section-header-content:lang(pa-Arab),.win-hub-section-header-content:lang(prs),.win-hub-section-header-content:lang(ps),.win-hub-section-header-content:lang(qps-plocm),.win-hub-section-header-content:lang(sd-Arab),.win-hub-section-header-content:lang(syr),.win-hub-section-header-content:lang(ug),.win-hub-section-header-content:lang(ur){text-align:right}.win-hub-section-header-chevron{display:none}.win-hub-section-header-interactive .win-hub-section-header-chevron{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;display:inline-block;margin-left:24px;line-height:1.5;padding-top:7px;text-align:right;vertical-align:bottom}.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ar),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(dv),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(fa),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(he),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ku-Arab),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(pa-Arab),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(prs),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ps),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(qps-plocm),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(sd-Arab),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(syr),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ug),.win-hub-section-header-interactive .win-hub-section-header-chevron:lang(ur){text-align:left;margin-left:0;margin-right:24px}.win-hub-horizontal .win-hub-section-content{height:calc(100% - 99px)}.win-hub-vertical .win-hub-section-content{width:100%}@media (-ms-high-contrast){button.win-hub-section-header-tabstop,button.win-hub-section-header-tabstop:hover:active,html.win-hoverable button.win-hub-section-header-tabstop:hover{background-color:transparent;color:WindowText}button.win-hub-section-header-tabstop:-ms-keyboard-active{color:WindowText}button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover:active,html.win-hoverable button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover{color:-ms-hotlight}button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active{color:-ms-hotlight}}.win-clickeater{background-color:transparent;width:110%;height:110%;left:-5%;top:-5%;position:fixed;touch-action:none;outline:Purple solid 1px;-ms-high-contrast-adjust:none}button.win-command{touch-action:manipulation;background:0 0;background-clip:border-box;height:auto;padding:0;margin:0;border:1px dotted;min-width:40px;min-height:48px;text-align:center;font-size:12px;line-height:16px;font-weight:400;overflow:visible;writing-mode:lr-tb;position:relative;z-index:0;outline:0}button.win-command::-moz-focus-inner{padding:0;border:0}button:lang(ar),button:lang(dv),button:lang(fa),button:lang(he),button:lang(ku-Arab),button:lang(pa-Arab),button:lang(prs),button:lang(ps),button:lang(qps-plocm),button:lang(sd-Arab),button:lang(syr),button:lang(ug),button:lang(ur){writing-mode:rl-tb}.win-commandicon{display:block;margin:11px 21px;min-width:0;min-height:0;padding:0;width:24px;height:24px;box-sizing:border-box;-moz-box-sizing:border-box;cursor:default;position:relative;outline:0}.win-commandimage{font-family:"Segoe UI Command",Symbols;letter-spacing:0;vertical-align:middle;font-size:20px;margin:0;line-height:24px;background-position:0 0;background-origin:border-box;display:inline-block;width:24px;height:24px;background-size:96px 48px;outline:0}.win-commandimage.win-commandglyph{position:absolute;left:0}button.win-command .win-label,div.win-command{font-size:12px;line-height:16px;position:relative;font-weight:400}button:active .win-commandimage,html.win-hoverable button:enabled:hover .win-commandimage{background-position:-24px 0}button:enabled:hover:active .win-commandimage.win-commandimage{background-position:-48px 0}button:-ms-keyboard-active .win-commandimage{background-position:-48px 0}button:disabled .win-commandimage,button:disabled:active .win-commandimage{background-position:-72px 0}button[aria-checked=true] .win-commandimage{background-position:0 -24px}button[aria-checked=true]:active .win-commandimage,html.win-hoverable button[aria-checked=true]:enabled:hover .win-commandimage{background-position:-24px -24px}button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage{background-position:-48px -24px}button[aria-checked=true]:-ms-keyboard-active .win-commandimage{background-position:-48px -24px}button[aria-checked=true]:disabled .win-commandimage,button[aria-checked=true]:disabled:active .win-commandimage{background-position:-72px -24px}button.win-command .win-label{font-family:"Segoe UI",sans-serif,"Segoe MDL2 Assets",Symbols,"Segoe UI Emoji";display:block;max-width:66px;margin-top:-10px;margin-bottom:6px;padding:0;overflow:hidden;word-wrap:break-word;word-break:keep-all;outline:0}.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis,.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis,.win-searchbox-button,.win-splitviewcommand-icon{font-family:"Segoe MDL2 Assets",Symbols}div.win-command,hr.win-command{display:inline-block;vertical-align:top}hr.win-command{padding:0;margin:12px 16px;width:2px;height:24px;border:0}div.win-command{min-width:0;min-height:0;padding:0 31px;border:1px dotted;text-align:center;writing-mode:lr-tb}div.win-command:lang(ar),div.win-command:lang(dv),div.win-command:lang(fa),div.win-command:lang(he),div.win-command:lang(ku-Arab),div.win-command:lang(pa-Arab),div.win-command:lang(prs),div.win-command:lang(ps),div.win-command:lang(qps-plocm),div.win-command:lang(sd-Arab),div.win-command:lang(syr),div.win-command:lang(ug),div.win-command:lang(ur){writing-mode:rl-tb}div.win-command:focus{outline:0}.win-command.win-command-hidden{display:none}.win-navbar{border-width:0;width:100%;height:auto;left:0;position:fixed;position:-ms-device-fixed;min-height:48px}.win-navbar.win-navbar-minimal{min-height:25px}.win-navbar.win-navbar-minimal.win-navbar-closed .win-navbar-invokebutton .win-navbar-ellipsis{top:5px}.win-navbar.win-navbar-closing.win-navbar-minimal>:not(.win-navbar-invokebutton){opacity:0}.win-navbar.win-menulayout.win-navbar-closing .win-navbar-menu{opacity:1}.win-navbar.win-navbar-closed.win-navbar-minimal>:not(.win-navbar-invokebutton){display:none!important}.win-navbar.win-navbar-closed.win-navbar-minimal .win-navbar-invokebutton,.win-navbar.win-navbar-closing.win-navbar-minimal .win-navbar-invokebutton{width:100%}.win-navbar.win-menulayout.win-navbar-closing .win-navbar-invokebutton,.win-navbar.win-menulayout.win-navbar-opened .win-navbar-invokebutton,.win-navbar.win-menulayout.win-navbar-opening .win-navbar-invokebutton{visibility:hidden}.win-navbar.win-menulayout.win-navbar-closing .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton,.win-navbar.win-menulayout.win-navbar-opened .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton,.win-navbar.win-menulayout.win-navbar-opening .win-toolbar.win-toolbar-showndisplayfull .win-toolbar-overflowbutton{visibility:visible}.win-navbar .win-navbar-invokebutton{touch-action:manipulation;position:absolute;right:0;margin:0;padding:0;border:1px dotted;min-width:0;background-clip:border-box;display:none;z-index:1}.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis{height:100%;right:0;top:15px;position:absolute;display:inline-block;font-size:14px;text-align:center}.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis::before{content:"\E10C";position:relative}.win-navbar:lang(ar) .win-navbar-invokebutton,.win-navbar:lang(ar) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(dv) .win-navbar-invokebutton,.win-navbar:lang(dv) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(fa) .win-navbar-invokebutton,.win-navbar:lang(fa) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(he) .win-navbar-invokebutton,.win-navbar:lang(he) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(ku-Arab) .win-navbar-invokebutton,.win-navbar:lang(ku-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(pa-Arab) .win-navbar-invokebutton,.win-navbar:lang(pa-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(prs) .win-navbar-invokebutton,.win-navbar:lang(prs) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(ps) .win-navbar-invokebutton,.win-navbar:lang(ps) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(qps-plocm) .win-navbar-invokebutton,.win-navbar:lang(qps-plocm) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(sd-Arab) .win-navbar-invokebutton,.win-navbar:lang(sd-Arab) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(syr) .win-navbar-invokebutton,.win-navbar:lang(syr) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(ug) .win-navbar-invokebutton,.win-navbar:lang(ug) .win-navbar-invokebutton .win-navbar-ellipsis,.win-navbar:lang(ur) .win-navbar-invokebutton,.win-navbar:lang(ur) .win-navbar-invokebutton .win-navbar-ellipsis{right:auto;left:0}.win-navbar.win-navbar-compact .win-navbar-invokebutton,.win-navbar.win-navbar-minimal .win-navbar-invokebutton{display:block}.win-commandlayout{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:none;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.win-commandlayout .win-primarygroup{-ms-flex-order:2;flex-order:2;-webkit-order:2;order:2;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.win-commandlayout .win-secondarygroup{-ms-flex-order:1;flex-order:1;-webkit-order:1;order:1;display:-ms-inline-flexbox;display:-webkit-inline-flex;display:inline-flex;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.win-commandlayout .win-command{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto}.win-commandlayout.win-navbar-closing,.win-commandlayout.win-navbar-opened,.win-commandlayout.win-navbar-opening{min-height:62px}.win-commandlayout.win-navbar-closing.win-navbar-compact,.win-commandlayout.win-navbar-opened.win-navbar-compact,.win-commandlayout.win-navbar-opening.win-navbar-compact{min-height:48px}.win-commandlayout.win-navbar-compact,.win-commandlayout.win-navbar-minimal{padding-right:32px;width:calc(100% - 32px)}.win-commandlayout.win-navbar-compact button.win-command .win-label{display:none}.win-commandlayout.win-navbar-compact.win-navbar-closing button.win-command .win-label{display:block;visibility:hidden}.win-commandlayout.win-navbar-compact.win-navbar-opened button.win-command .win-label,.win-commandlayout.win-navbar-compact.win-navbar-opening button.win-command .win-label{display:block;visibility:visible}.win-commandlayout:lang(ar).win-navbar-compact,.win-commandlayout:lang(ar).win-navbar-minimal,.win-commandlayout:lang(dv).win-navbar-compact,.win-commandlayout:lang(dv).win-navbar-minimal,.win-commandlayout:lang(fa).win-navbar-compact,.win-commandlayout:lang(fa).win-navbar-minimal,.win-commandlayout:lang(he).win-navbar-compact,.win-commandlayout:lang(he).win-navbar-minimal,.win-commandlayout:lang(ku-Arab).win-navbar-compact,.win-commandlayout:lang(ku-Arab).win-navbar-minimal,.win-commandlayout:lang(pa-Arab).win-navbar-compact,.win-commandlayout:lang(pa-Arab).win-navbar-minimal,.win-commandlayout:lang(prs).win-navbar-compact,.win-commandlayout:lang(prs).win-navbar-minimal,.win-commandlayout:lang(ps).win-navbar-compact,.win-commandlayout:lang(ps).win-navbar-minimal,.win-commandlayout:lang(qps-plocm).win-navbar-compact,.win-commandlayout:lang(qps-plocm).win-navbar-minimal,.win-commandlayout:lang(sd-Arab).win-navbar-compact,.win-commandlayout:lang(sd-Arab).win-navbar-minimal,.win-commandlayout:lang(syr).win-navbar-compact,.win-commandlayout:lang(syr).win-navbar-minimal,.win-commandlayout:lang(ug).win-navbar-compact,.win-commandlayout:lang(ug).win-navbar-minimal,.win-commandlayout:lang(ur).win-navbar-compact,.win-commandlayout:lang(ur).win-navbar-minimal{padding-right:0;padding-left:32px}.win-menulayout .win-navbar-menu{position:absolute;right:0;top:0;overflow:hidden}.win-menulayout .win-navbar-menu:lang(ar),.win-menulayout .win-navbar-menu:lang(dv),.win-menulayout .win-navbar-menu:lang(fa),.win-menulayout .win-navbar-menu:lang(he),.win-menulayout .win-navbar-menu:lang(ku-Arab),.win-menulayout .win-navbar-menu:lang(pa-Arab),.win-menulayout .win-navbar-menu:lang(prs),.win-menulayout .win-navbar-menu:lang(ps),.win-menulayout .win-navbar-menu:lang(qps-plocm),.win-menulayout .win-navbar-menu:lang(sd-Arab),.win-menulayout .win-navbar-menu:lang(syr),.win-menulayout .win-navbar-menu:lang(ug),.win-menulayout .win-navbar-menu:lang(ur){left:0;right:auto}.win-menulayout.win-bottom .win-navbar-menu{overflow:visible}.win-menulayout .win-toolbar{max-width:100vw}.win-menulayout.win-navbar-compact button.win-command .win-label{display:none;visibility:hidden}.win-menulayout.win-navbar-compact.win-navbar-closing button.win-command .win-label,.win-menulayout.win-navbar-compact.win-navbar-opened button.win-command .win-label,.win-menulayout.win-navbar-compact.win-navbar-opening button.win-command .win-label{display:block;visibility:visible}.win-menulayout.win-navbar-compact.win-navbar-closed{overflow:hidden}.win-flyout,.win-flyout.win-scrolls{overflow:auto}.win-menulayout.win-navbar-compact.win-navbar-closed .win-toolbar-overflowarea{visibility:hidden}@media (-ms-high-contrast){.win-navbar{border:2px solid}.win-navbar.win-top{border-top:none;border-left:none;border-right:none}.win-navbar.win-bottom{border-bottom:none;border-left:none;border-right:none}.win-navbar.win-top button.win-command,.win-navbar.win-top div.win-command{padding-bottom:7px}.win-navbar.win-bottom button.win-command,.win-navbar.win-bottom div.win-command{padding-top:7px}.win-navbar.win-top hr.win-command{margin-bottom:28px}.win-navbar.win-bottom hr.win-command{margin-top:8px}.win-commandlayout.win-navbar-closing,.win-commandlayout.win-navbar-opened,.win-commandlayout.win-navbar-opening{min-height:62px}}.win-flyout{position:fixed;position:-ms-device-fixed;padding:12px;border-style:solid;border-width:1px;margin:4px;min-width:70px;max-width:430px;min-height:16px;max-height:730px;width:auto;height:auto;word-wrap:break-word;font-size:15px;font-weight:400;line-height:1.333}.win-flyout.win-leftalign{margin-left:0}.win-flyout.win-rightalign{margin-right:0}@media (max-width:464px){.win-flyout{max-width:calc(100% - 34px)}}.win-menu{padding:0;line-height:33px;text-align:left;min-height:42px;max-height:calc(100% - 26px);min-width:134px;max-width:454px}.win-menu button.win-command{display:block;margin-left:0;margin-right:0;text-align:left;width:100%;font-size:15px;font-weight:400;line-height:1.333}.win-menu button.win-command:focus{outline:0}.win-menu button.win-command .win-menucommand-liner{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row;-ms-flex-wrap:none;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-align:center;-webkit-align-items:center;align-items:center;width:100%;position:relative}.win-menu button.win-command .win-menucommand-liner .win-flyouticon,.win-menu button.win-command .win-menucommand-liner .win-toggleicon{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;display:none;visibility:hidden;font-size:16px;font-family:"Segoe MDL2 Assets",Symbols}.win-menu button.win-command .win-menucommand-liner .win-toggleicon{margin-left:12px}.win-menu button.win-command .win-menucommand-liner .win-toggleicon::before{content:"\E0E7"}.win-menu button.win-command .win-menucommand-liner .win-flyouticon{margin-left:12px;margin-right:16px}.win-menu button.win-command .win-menucommand-liner .win-flyouticon::before{content:"\E26B"}.win-menu button.win-command .win-menucommand-liner .win-label{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;font-size:15px;line-height:inherit;min-width:112px;max-width:none;white-space:nowrap;text-overflow:clip;margin:0;padding:0 12px}.win-menu button.win-command .win-menucommand-liner:lang(ar),.win-menu button.win-command .win-menucommand-liner:lang(dv),.win-menu button.win-command .win-menucommand-liner:lang(fa),.win-menu button.win-command .win-menucommand-liner:lang(he),.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab),.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab),.win-menu button.win-command .win-menucommand-liner:lang(prs),.win-menu button.win-command .win-menucommand-liner:lang(ps),.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm),.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab),.win-menu button.win-command .win-menucommand-liner:lang(syr),.win-menu button.win-command .win-menucommand-liner:lang(ug),.win-menu button.win-command .win-menucommand-liner:lang(ur){text-align:right}.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(he) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-toggleicon,.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-toggleicon{margin-left:0;margin-right:12px}.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(he) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-flyouticon,.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-flyouticon{margin-left:16px;margin-right:12px}.win-menu button.win-command .win-menucommand-liner:lang(ar) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(dv) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(fa) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(he) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(ku-Arab) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(pa-Arab) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(prs) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(ps) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(qps-plocm) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(sd-Arab) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(syr) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(ug) .win-flyouticon::before,.win-menu button.win-command .win-menucommand-liner:lang(ur) .win-flyouticon::before{content:"\E26C"}.win-menu.win-menu-mousespacing button.win-command{padding-top:5px;padding-bottom:7px;min-height:32px}.win-menu.win-menu-touchspacing button.win-command{padding-top:11px;padding-bottom:13px;min-height:44px}.win-menu hr.win-command{display:block;height:1px;width:auto;border:0;padding:0;margin:9px 20px 10px}.win-menu-containsflyoutcommand button.win-command .win-menucommand-liner .win-flyouticon,.win-menu-containstogglecommand button.win-command .win-menucommand-liner .win-toggleicon{display:inline-block}.win-menu-containsflyoutcommand button.win-command-flyout .win-menucommand-liner .win-flyouticon,.win-menu-containstogglecommand button.win-command-toggle[aria-checked=true] .win-menucommand-liner .win-toggleicon{visibility:visible}@media (max-width:464px){.win-menu{max-width:calc(100% - 10px)}}.win-overlay{-ms-touch-select:none}.win-overlay [contenteditable=true],.win-overlay input:not([type=file]),.win-overlay input:not([type=radio]),.win-overlay input:not([type=checkbox]),.win-overlay input:not([type=button]),.win-overlay input:not([type=range]),.win-overlay input:not([type=image]),.win-overlay input:not([type=reset]),.win-overlay input:not([type=hidden]),.win-overlay input:not([type=submit]),.win-overlay textarea{-ms-touch-select:grippers}.win-visualviewport-space{position:fixed;position:-ms-device-fixed;height:100%;width:100%;visibility:hidden}.win-settingsflyout{border-left:1px solid;position:fixed;top:0;right:0;height:100%;width:319px}.win-settingsflyout:lang(ar),.win-settingsflyout:lang(dv),.win-settingsflyout:lang(fa),.win-settingsflyout:lang(he),.win-settingsflyout:lang(ku-Arab),.win-settingsflyout:lang(pa-Arab),.win-settingsflyout:lang(prs),.win-settingsflyout:lang(ps),.win-settingsflyout:lang(qps-plocm),.win-settingsflyout:lang(sd-Arab),.win-settingsflyout:lang(syr),.win-settingsflyout:lang(ug),.win-settingsflyout:lang(ur){border-left:none;border-right:1px solid}.win-settingsflyout.win-wide{width:645px}.win-settingsflyout .win-back,.win-settingsflyout .win-backbutton{width:32px;height:32px;font-size:20px;line-height:32px}.win-settingsflyout .win-header{height:32px;position:relative;padding:6px 12px 10px 52px}.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayfull .win-commandingsurface-actionarea,.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-actionarea{height:auto}.win-settingsflyout .win-header .win-label{display:inline-block;font-size:24px;font-weight:300;line-height:32px;white-space:nowrap}.win-settingsflyout .win-header .win-backbutton,.win-settingsflyout .win-header .win-navigation-backbutton{position:absolute;left:12px}.win-settingsflyout .win-content{overflow:auto;padding:0 12px}.win-settingsflyout .win-content .win-label{font-size:20px;font-weight:400;line-height:1.2}.win-settingsflyout .win-content .win-settings-section{margin:0;padding-top:0;padding-bottom:20px}.win-settingsflyout .win-content .win-settings-section p{margin:0;padding-top:0;padding-bottom:25px}.win-settingsflyout .win-content .win-settings-section a{margin:0;padding-top:0;padding-bottom:25px;display:inline-block}.win-settingsflyout .win-content .win-settings-section label{display:block;padding-bottom:7px}.win-settingsflyout .win-content .win-settings-section button,.win-settingsflyout .win-content .win-settings-section input[type=button],.win-settingsflyout .win-content .win-settings-section input[type=text],.win-settingsflyout .win-content .win-settings-section select{margin-bottom:25px;margin-left:0;margin-right:20px}.win-settingsflyout .win-content .win-settings-section button:lang(ar),.win-settingsflyout .win-content .win-settings-section button:lang(dv),.win-settingsflyout .win-content .win-settings-section button:lang(fa),.win-settingsflyout .win-content .win-settings-section button:lang(he),.win-settingsflyout .win-content .win-settings-section button:lang(ku-Arab),.win-settingsflyout .win-content .win-settings-section button:lang(pa-Arab),.win-settingsflyout .win-content .win-settings-section button:lang(prs),.win-settingsflyout .win-content .win-settings-section button:lang(ps),.win-settingsflyout .win-content .win-settings-section button:lang(qps-plocm),.win-settingsflyout .win-content .win-settings-section button:lang(sd-Arab),.win-settingsflyout .win-content .win-settings-section button:lang(syr),.win-settingsflyout .win-content .win-settings-section button:lang(ug),.win-settingsflyout .win-content .win-settings-section button:lang(ur),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ar),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(dv),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(fa),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(he),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ku-Arab),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(pa-Arab),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(prs),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ps),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(qps-plocm),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(sd-Arab),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(syr),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ug),.win-settingsflyout .win-content .win-settings-section input[type=button]:lang(ur),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ar),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(dv),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(fa),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(he),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ku-Arab),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(pa-Arab),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(prs),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ps),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(qps-plocm),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(sd-Arab),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(syr),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ug),.win-settingsflyout .win-content .win-settings-section input[type=text]:lang(ur),.win-settingsflyout .win-content .win-settings-section select:lang(ar),.win-settingsflyout .win-content .win-settings-section select:lang(dv),.win-settingsflyout .win-content .win-settings-section select:lang(fa),.win-settingsflyout .win-content .win-settings-section select:lang(he),.win-settingsflyout .win-content .win-settings-section select:lang(ku-Arab),.win-settingsflyout .win-content .win-settings-section select:lang(pa-Arab),.win-settingsflyout .win-content .win-settings-section select:lang(prs),.win-settingsflyout .win-content .win-settings-section select:lang(ps),.win-settingsflyout .win-content .win-settings-section select:lang(qps-plocm),.win-settingsflyout .win-content .win-settings-section select:lang(sd-Arab),.win-settingsflyout .win-content .win-settings-section select:lang(syr),.win-settingsflyout .win-content .win-settings-section select:lang(ug),.win-settingsflyout .win-content .win-settings-section select:lang(ur){margin-bottom:25px;margin-left:20px;margin-right:0}.win-settingsflyout .win-content .win-settings-section input[type=radio]{margin-top:0;margin-bottom:0;padding-bottom:15px}@keyframes WinJS-showFlyoutTop{from{transform:translateY(50px)}to{transform:none}}@keyframes WinJS-showFlyoutBottom{from{transform:translateY(-50px)}to{transform:none}}@keyframes WinJS-showFlyoutLeft{from{transform:translateX(50px)}to{transform:none}}@keyframes WinJS-showFlyoutRight{from{transform:translateX(-50px)}to{transform:none}}@-webkit-keyframes -webkit-WinJS-showFlyoutTop{from{-webkit-transform:translateY(50px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-showFlyoutBottom{from{-webkit-transform:translateY(-50px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-showFlyoutLeft{from{-webkit-transform:translateX(50px)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-showFlyoutRight{from{-webkit-transform:translateX(-50px)}to{-webkit-transform:none}}.win-commandingsurface{outline:0;min-width:32px;position:relative}.win-commandingsurface.win-commandingsurface-overflowbottom .win-commandingsurface-overflowareacontainer{top:100%}.win-commandingsurface.win-commandingsurface-overflowtop .win-commandingsurface-overflowareacontainer{bottom:100%}.win-commandingsurface .win-commandingsurface-actionarea{min-height:24px;vertical-align:top;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-spacer{visibility:hidden;min-height:48px;width:0}.win-commandingsurface .win-commandingsurface-actionarea .win-command,.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton{touch-action:manipulation;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto}.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton{width:32px;margin:0;padding:0;border-width:1px;border-style:dotted;min-width:0;min-height:0;outline:0;-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;box-sizing:border-box;background-clip:border-box}.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis{font-size:16px}.win-commandingsurface .win-commandingsurface-actionarea .win-commandingsurface-overflowbutton .win-commandingsurface-ellipsis::before{content:"\E10C"}.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-overflowarea,.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-overflowareacontainer{display:block}.win-commandingsurface .win-commandingsurface-insetoutline,.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-overflowarea,.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-overflowareacontainer,.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaycompact .win-commandingsurface-actionarea .win-command .win-label,.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea .win-command,.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea .win-commandingsurface-spacer,.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaynone{display:none}.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplaycompact .win-commandingsurface-actionarea{height:48px}.win-commandingsurface.win-commandingsurface-closed.win-commandingsurface-closeddisplayminimal .win-commandingsurface-actionarea{height:24px}.win-commandingsurface .win-commandingsurface-overflowareacontainer{position:absolute;overflow:hidden;right:0;left:auto}.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ar),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(dv),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(fa),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(he),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ku-Arab),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(pa-Arab),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(prs),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ps),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(qps-plocm),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(sd-Arab),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(syr),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ug),.win-commandingsurface .win-commandingsurface-overflowareacontainer:lang(ur){left:0;right:auto}.win-commandingsurface .win-commandingsurface-overflowarea,.win-commandingsurface .win-commandingsurface-overflowareacontainer{min-width:160px;min-height:0;max-height:50vh;padding:0}.win-commandingsurface .win-commandingsurface-overflowarea{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;overflow-y:auto;overflow-x:hidden}.win-commandingsurface .win-commandingsurface-overflowarea.win-menu{max-width:480px}.win-commandingsurface .win-commandingsurface-overflowarea .win-commandingsurface-spacer{visibility:hidden;height:24px}.win-commandingsurface .win-commandingsurface-overflowarea button.win-command{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;min-height:44px;border:1px dotted transparent;padding:10px 11px 12px;font-size:15px;font-weight:400;line-height:1.333;white-space:nowrap;overflow:hidden}.win-commandingsurface .win-commandingsurface-overflowarea hr.win-command{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;height:2px;margin:6px 12px 4px}.win-commandingsurface .win-commandingsurface-actionareacontainer{overflow:hidden;position:relative}.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplaycompact .win-command .win-label,.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplayminimal .win-command,.win-commandingsurface.win-commandingsurface-closing.win-commandingsurface-closeddisplaynone .win-command{opacity:0}.win-commandingsurface .win-command.win-command-hidden{display:inline-block}.win-commandingsurface .win-command.win-commandingsurface-command-hidden,.win-commandingsurface .win-command.win-commandingsurface-command-primary-overflown,.win-commandingsurface .win-command.win-commandingsurface-command-secondary-overflown,.win-commandingsurface .win-command.win-commandingsurface-command-separator-hidden{display:none}@media (max-width:480px){.win-commandingsurface .win-commandingsurface-overflowarea.win-menu{width:100vw}}.win-toolbar{min-width:32px}.win-toolbar.win-toolbar-opened{position:fixed}.win-autosuggestbox{white-space:normal;position:relative;width:266px;min-width:265px;min-height:28px}.win-autosuggestbox-flyout{position:absolute;top:100%;width:100%;z-index:100;max-height:374px;min-height:44px;overflow:auto;-ms-scroll-chaining:none;touch-action:none;font-size:15px;font-weight:400;line-height:1.333}.win-autosuggestbox-suggestion-result div,.win-autosuggestbox-suggestion-result-text{line-height:20px;overflow:hidden;white-space:nowrap}.win-autosuggestbox-flyout-above{bottom:100%;top:auto}.win-autosuggestbox-flyout-above .win-repeater{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column-reverse;-webkit-flex-direction:column-reverse;flex-direction:column-reverse}.win-autosuggestbox .win-autosuggestbox-input{-ms-ime-align:after;margin:0;width:100%}.win-autosuggestbox-suggestion-selected{outline-style:dotted;outline-width:1px}.win-autosuggestbox-suggestion-result{display:-ms-flexbox;display:-webkit-flex;display:flex;padding:0 18px;height:60px;font-size:11pt;outline:0}.win-autosuggestbox-suggestion-result-text{padding-top:9px;padding-bottom:11px;height:60px;width:179px}.win-autosuggestbox-suggestion-result-detailed-text{display:inline-block;overflow:hidden;line-height:22px;margin-top:-1px;width:100%}.win-autosuggestbox-suggestion-result img{width:40px;height:40px;margin-left:0;padding-right:10px;padding-top:10px;padding-bottom:10px}.win-autosuggestbox-suggestion-result img:lang(ar),.win-autosuggestbox-suggestion-result img:lang(dv),.win-autosuggestbox-suggestion-result img:lang(fa),.win-autosuggestbox-suggestion-result img:lang(he),.win-autosuggestbox-suggestion-result img:lang(ku-Arab),.win-autosuggestbox-suggestion-result img:lang(pa-Arab),.win-autosuggestbox-suggestion-result img:lang(prs),.win-autosuggestbox-suggestion-result img:lang(ps),.win-autosuggestbox-suggestion-result img:lang(qps-plocm),.win-autosuggestbox-suggestion-result img:lang(sd-Arab),.win-autosuggestbox-suggestion-result img:lang(syr),.win-autosuggestbox-suggestion-result img:lang(ug),.win-autosuggestbox-suggestion-result img:lang(ur){margin-right:0;margin-left:auto;padding-left:10px;padding-right:0}.win-autosuggestbox-suggestion-query{height:20px;padding:11px 0 13px 12px;outline:0;white-space:nowrap;overflow:hidden;line-height:20px}.win-autosuggestbox-suggestion-separator{display:-ms-flexbox;display:-webkit-flex;display:flex;padding:0 18px;height:40px;font-size:11pt}.win-autosuggestbox-suggestion-separator hr{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;margin-top:18px;border-style:solid;border-width:1px 0 0}.win-autosuggestbox-suggestion-separator hr:lang(ar),.win-autosuggestbox-suggestion-separator hr:lang(dv),.win-autosuggestbox-suggestion-separator hr:lang(fa),.win-autosuggestbox-suggestion-separator hr:lang(he),.win-autosuggestbox-suggestion-separator hr:lang(ku-Arab),.win-autosuggestbox-suggestion-separator hr:lang(pa-Arab),.win-autosuggestbox-suggestion-separator hr:lang(prs),.win-autosuggestbox-suggestion-separator hr:lang(ps),.win-autosuggestbox-suggestion-separator hr:lang(qps-plocm),.win-autosuggestbox-suggestion-separator hr:lang(sd-Arab),.win-autosuggestbox-suggestion-separator hr:lang(syr),.win-autosuggestbox-suggestion-separator hr:lang(ug),.win-autosuggestbox-suggestion-separator hr:lang(ur){margin-right:10px;margin-left:auto}.win-autosuggestbox-suggestion-separator div{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;padding-top:9px;padding-bottom:11px;line-height:20px;margin-right:10px}.win-autosuggestbox-suggestion-separator div:lang(ar),.win-autosuggestbox-suggestion-separator div:lang(dv),.win-autosuggestbox-suggestion-separator div:lang(fa),.win-autosuggestbox-suggestion-separator div:lang(he),.win-autosuggestbox-suggestion-separator div:lang(ku-Arab),.win-autosuggestbox-suggestion-separator div:lang(pa-Arab),.win-autosuggestbox-suggestion-separator div:lang(prs),.win-autosuggestbox-suggestion-separator div:lang(ps),.win-autosuggestbox-suggestion-separator div:lang(qps-plocm),.win-autosuggestbox-suggestion-separator div:lang(sd-Arab),.win-autosuggestbox-suggestion-separator div:lang(syr),.win-autosuggestbox-suggestion-separator div:lang(ug),.win-autosuggestbox-suggestion-separator div:lang(ur){margin-left:10px;margin-right:auto}@keyframes WinJS-flyoutBelowASB-showPopup{from{transform:translateY(0)}to{transform:none}}@keyframes WinJS-flyoutAboveASB-showPopup{from{transform:translateY(0)}to{transform:none}}@-webkit-keyframes -webkit-WinJS-flyoutBelowASB-showPopup{from{-webkit-transform:translateY(0)}to{-webkit-transform:none}}@-webkit-keyframes -webkit-WinJS-flyoutAboveASB-showPopup{from{-webkit-transform:translateY(0)}to{-webkit-transform:none}}.win-searchbox input[type=search]::-ms-clear{display:none}.win-searchbox input[type=search]::-webkit-search-cancel-button{display:none}.win-searchbox-button{position:absolute;right:0;top:0;width:32px;font-size:15px;border-style:none;height:100%;text-align:center}.win-searchbox-button:lang(ar),.win-searchbox-button:lang(dv),.win-searchbox-button:lang(fa),.win-searchbox-button:lang(he),.win-searchbox-button:lang(ku-Arab),.win-searchbox-button:lang(pa-Arab),.win-searchbox-button:lang(prs),.win-searchbox-button:lang(ps),.win-searchbox-button:lang(qps-plocm),.win-searchbox-button:lang(sd-Arab),.win-searchbox-button:lang(syr),.win-searchbox-button:lang(ug),.win-searchbox-button:lang(ur){right:auto;left:0}.win-searchbox-button.win-searchbox-button:before{content:"\E094";position:absolute;left:8px;top:8px;line-height:100%}.win-splitviewcommand{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;touch-action:manipulation}.win-splitviewcommand-button{-ms-flex:1 1 0%;-webkit-flex:1 1 0%;flex:1 1 0%;position:relative}.win-splitviewcommand-button-content{position:relative;height:48px;padding-left:16px;padding-right:16px;display:-ms-flexbox;display:-webkit-flex;display:flex}.win-splitviewcommand-button:focus{z-index:1;outline:0}.win-splitviewcommand-icon{height:16px;width:16px;font-size:16px;margin-left:0;margin-right:16px;margin-top:14px;line-height:1;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto}.win-splitviewcommand-icon:lang(ar),.win-splitviewcommand-icon:lang(dv),.win-splitviewcommand-icon:lang(fa),.win-splitviewcommand-icon:lang(he),.win-splitviewcommand-icon:lang(ku-Arab),.win-splitviewcommand-icon:lang(pa-Arab),.win-splitviewcommand-icon:lang(prs),.win-splitviewcommand-icon:lang(ps),.win-splitviewcommand-icon:lang(qps-plocm),.win-splitviewcommand-icon:lang(sd-Arab),.win-splitviewcommand-icon:lang(syr),.win-splitviewcommand-icon:lang(ug),.win-splitviewcommand-icon:lang(ur){margin-right:0;margin-left:16px}.win-splitviewcommand-label{-ms-flex:1 1 0%;-webkit-flex:1 1 0%;flex:1 1 0%;overflow:hidden;white-space:nowrap;font-size:15px;font-weight:400;line-height:1.333;margin-top:13px;margin-bottom:15px}.win-navbarcommand-icon,.win-navbarcontainer-navarrow{font-size:16px;font-family:"Segoe MDL2 Assets",Symbols}@media (-ms-high-contrast){.win-autosuggestbox{border-color:ButtonText;background-color:ButtonFace;color:ButtonText}.win-autosuggestbox-disabled,.win-autosuggestbox-disabled input[disabled]{border-color:GrayText;background-color:ButtonFace}.win-autosuggestbox-disabled input[disabled]{color:GrayText}.win-autosuggestbox-disabled div{color:GrayText;background-color:ButtonFace}.win-autosuggestbox:-ms-input-placeholder,.win-autosuggestbox::-moz-input-placeholder,.win-autosuggestbox::-webkit-input-placeholder{color:GrayText}.win-autosuggestbox-flyout{border-color:ButtonText;background-color:ButtonFace}.win-autosuggestbox-flyout-highlighttext{color:ButtonText}html.win-hoverable .win-autosuggestbox-query:hover,html.win-hoverable .win-autosuggestbox-suggestion-result:hover{background-color:Highlight;color:HighlightText}html.win-hoverable .win-autosuggestbox-suggestion-query:hover .win-autosuggestbox-flyout-highlighttext,html.win-hoverable .win-autosuggestbox-suggestion-result:hover .win-autosuggestbox-flyout-highlighttext{color:HighlightText}.win-autosuggestbox-suggestion-query,.win-autosuggestbox-suggestion-result{color:ButtonText}.win-autosuggestbox-suggestion-selected{background-color:Highlight;color:HighlightText}.win-autosuggestbox-suggestion-separator{color:ButtonText}.win-autosuggestbox-suggestion-separator hr{border-color:ButtonText}.win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext{color:HighlightText}.win-searchbox-button{background-color:ButtonFace;color:ButtonText}html.win-hoverable .win-searchbox-button[disabled=false]:hover{border-color:ButtonText;background-color:HighLight;color:HighLightText}.win-searchbox-button-input-focus{background-color:ButtonText;color:ButtonFace}html.win-hoverable .win-searchbox-button-input-focus:hover{border-color:ButtonText;background-color:HighLight;color:HighLightText}.win-searchbox-button:active{background-color:ButtonText;color:ButtonFace}.win-splitviewcommand-button{background-color:ButtonFace;color:ButtonText}.win-splitviewcommand-button:after{position:absolute;top:0;left:0;border:2px solid ButtonText;content:"";width:calc(100% - 3px);height:calc(100% - 3px);pointer-events:none}html.win-hoverable .win-splitviewcommand-button:hover{background-color:Highlight;color:HighlightText}.win-splitviewcommand-button.win-pressed,html.win-hoverable .win-splitviewcommand-button.win-pressed:hover{background-color:ButtonText;color:ButtonFace}}.win-navbar{z-index:999}.win-navbar.win-navbar-hiding,.win-navbar.win-navbar-showing,.win-navbar.win-navbar-shown{min-height:60px}.win-navbar .win-navbar-invokebutton{width:32px;min-height:0;height:24px}.win-navbar .win-navbar-invokebutton .win-navbar-ellipsis{width:32px}.win-navbar.win-top .win-navbar-invokebutton{bottom:0}.win-navbar.win-top .win-navbar-invokebutton .win-navbar-ellipsis{top:5px}.win-navbar.win-bottom .win-navbar-invokebutton,.win-navbar.win-bottom .win-navbar-invokebutton .win-navbar-ellipsis{top:0}.win-navbarcontainer{width:100%;position:relative}.win-navbarcontainer-pageindicator-box{position:absolute;width:100%;text-align:center;pointer-events:none}.win-navbarcontainer-vertical .win-navbarcontainer-pageindicator-box{display:none}.win-navbarcontainer-pageindicator{display:inline-block;width:40px;height:4px;margin:4px 2px 16px}.win-navbarcontainer-horizontal .win-navbarcontainer-viewport::-webkit-scrollbar{width:0;height:0}.win-navbarcontainer-horizontal .win-navbarcontainer-viewport{padding:20px 0;overflow-x:auto;overflow-y:hidden;overflow:-moz-scrollbars-none;-ms-scroll-snap-type:mandatory;-ms-scroll-snap-points-x:snapInterval(0,100%);-ms-overflow-style:none;touch-action:pan-x}.win-navbarcontainer-vertical .win-navbarcontainer-viewport{overflow-x:hidden;overflow-y:auto;max-height:216px;-ms-overflow-style:-ms-autohiding-scrollbar;touch-action:pan-y;-webkit-overflow-scrolling:touch}.win-navbarcontainer-horizontal .win-navbarcontainer-surface{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:start;-webkit-align-content:flex-start;align-content:flex-start}.win-navbarcommand,.win-navbarcontainer-navarrow{display:-ms-flexbox;display:-webkit-flex;touch-action:manipulation}.win-navbarcontainer-vertical .win-navbarcontainer-surface{padding:12px 0}.win-navbarcontainer-navarrow{position:absolute;z-index:2;top:24px;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;height:calc(100% - 48px);width:20px;overflow:hidden}.win-navbarcontainer-vertical .win-navbarcontainer-navarrow{display:none}.win-navbarcontainer-navleft{left:0;margin-right:2px}.win-navbarcontainer-navleft::before{content:'\E0E2'}.win-navbarcontainer-navright{right:0;margin-left:2px}.win-navbarcontainer-navright::before{content:'\E0E3'}.win-navbarcommand{display:flex;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto}.win-navbarcontainer-horizontal .win-navbarcommand{margin:4px;width:192px}.win-navbarcontainer-vertical .win-navbarcommand{margin:4px 24px}.win-navbarcommand-button{-ms-flex:1 1 0%;-webkit-flex:1 1 0%;flex:1 1 0%;position:relative}.win-navbarcommand-button-content{position:relative;height:48px;padding-left:16px;padding-right:16px;display:-ms-flexbox;display:-webkit-flex;display:flex}.win-navbarcommand-button:focus{z-index:1;outline:0}.win-navbarcommand-icon{height:16px;width:16px;margin-left:0;margin-right:16px;margin-top:14px;line-height:1;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto}.win-navbarcommand-icon:lang(ar),.win-navbarcommand-icon:lang(dv),.win-navbarcommand-icon:lang(fa),.win-navbarcommand-icon:lang(he),.win-navbarcommand-icon:lang(ku-Arab),.win-navbarcommand-icon:lang(pa-Arab),.win-navbarcommand-icon:lang(prs),.win-navbarcommand-icon:lang(ps),.win-navbarcommand-icon:lang(qps-plocm),.win-navbarcommand-icon:lang(sd-Arab),.win-navbarcommand-icon:lang(syr),.win-navbarcommand-icon:lang(ug),.win-navbarcommand-icon:lang(ur){margin-right:0;margin-left:16px}.win-navbarcommand-label{-ms-flex:1 1 0%;-webkit-flex:1 1 0%;flex:1 1 0%;overflow:hidden;white-space:nowrap;font-size:15px;font-weight:400;line-height:1.333;margin-top:13px;margin-bottom:15px}.win-navbarcommand-splitbutton{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;width:48px;font-family:"Segoe MDL2 Assets",Symbols;font-size:16px;margin-right:0;margin-left:2px;position:relative}.win-navbarcommand-splitbutton:lang(ar),.win-navbarcommand-splitbutton:lang(dv),.win-navbarcommand-splitbutton:lang(fa),.win-navbarcommand-splitbutton:lang(he),.win-navbarcommand-splitbutton:lang(ku-Arab),.win-navbarcommand-splitbutton:lang(pa-Arab),.win-navbarcommand-splitbutton:lang(prs),.win-navbarcommand-splitbutton:lang(ps),.win-navbarcommand-splitbutton:lang(qps-plocm),.win-navbarcommand-splitbutton:lang(sd-Arab),.win-navbarcommand-splitbutton:lang(syr),.win-navbarcommand-splitbutton:lang(ug),.win-navbarcommand-splitbutton:lang(ur){margin-left:0;margin-right:2px}.win-navbarcommand-splitbutton::before{content:'\E019';pointer-events:none;position:absolute;box-sizing:border-box;top:0;left:0;height:100%;width:100%;text-align:center;line-height:46px;border:1px dotted transparent}.win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened::before{content:'\E018'}.win-navbarcommand-splitbutton:focus{outline:0}@media (-ms-high-contrast){.win-navbarcontainer-pageindicator{background-color:ButtonFace}.win-navbarcontainer-pageindicator:after{display:block;border:1px solid ButtonText;content:"";width:calc(100% - 2px);height:calc(100% - 2px)}.win-navbarcommand-button:after,.win-navbarcommand-splitbutton:after,.win-navbarcontainer-navarrow:after{position:absolute;top:0;left:0;border:2px solid ButtonText;content:"";width:calc(100% - 3px);height:calc(100% - 3px)}.win-navbarcontainer-pageindicator-current{background-color:ButtonText}html.win-hoverable .win-navbarcontainer-pageindicator:hover{background-color:Highlight}.win-navbarcontainer-pageindicator:hover:active,html.win-hoverable .win-navbarcontainer-pageindicator-current:hover{background-color:ButtonText}.win-navbarcontainer-navarrow{background-color:ButtonFace;color:ButtonText}html.win-hoverable .win-navbarcontainer-navarrow:hover{background-color:Highlight;color:HighlightText}.win-navbarcontainer-navarrow:hover:active{background-color:ButtonText;color:ButtonFace}.win-navbarcommand-button,.win-navbarcommand-splitbutton{background-color:ButtonFace;color:ButtonText}.win-navbarcommand-button:after,.win-navbarcommand-splitbutton:after{pointer-events:none}html.win-hoverable .win-navbarcommand-button:hover,html.win-hoverable .win-navbarcommand-splitbutton:hover{background-color:Highlight;color:HighlightText}.win-navbarcommand-button.win-pressed,.win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened,.win-navbarcommand-splitbutton.win-pressed,html.win-hoverable .win-navbarcommand-button.win-pressed:hover,html.win-hoverable .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover,html.win-hoverable .win-navbarcommand-splitbutton.win-pressed:hover{background-color:ButtonText;color:ButtonFace}}.win-viewbox{width:100%;height:100%;position:relative}.win-contentdialog.win-contentdialog-verticalalignment{position:fixed;top:0;left:0;right:0;height:100vh;overflow:hidden;display:none;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center}.win-contentdialog.win-contentdialog-verticalalignment.win-contentdialog-devicefixedsupported{position:-ms-device-fixed;height:auto;bottom:0}.win-contentdialog.win-contentdialog-verticalalignment.win-contentdialog-visible{display:-ms-flexbox;display:-webkit-flex;display:flex}.win-contentdialog .win-contentdialog-backgroundoverlay{position:absolute;top:0;left:0;width:100%;height:100%}.win-contentdialog .win-contentdialog-dialog{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;z-index:1;outline-style:solid;outline-width:1px;box-sizing:border-box;padding:18px 24px 24px;width:100%;min-width:320px;max-width:456px;min-height:184px;max-height:758px;margin-left:auto;margin-right:auto}.win-contentdialog .win-contentdialog-column0or1{-ms-flex:10000 0 50%;-webkit-flex:10000 0 50%;flex:10000 0 50%;width:0}@media (min-height:640px){.win-contentdialog .win-contentdialog-dialog{-ms-flex:0 1 auto;-webkit-flex:0 1 auto;flex:0 1 auto}.win-contentdialog .win-contentdialog-column0or1{display:none}}.win-contentdialog .win-contentdialog-scroller{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;overflow:auto}.win-contentdialog .win-contentdialog-title{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;font-size:20px;font-weight:400;line-height:1.2;margin:0}.win-contentdialog .win-contentdialog-content{-ms-flex:1 0 auto;-webkit-flex:1 0 auto;flex:1 0 auto;font-size:15px;font-weight:400;line-height:1.333}.win-contentdialog .win-contentdialog-commands{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;display:-ms-flexbox;display:-webkit-flex;display:flex;margin-top:24px;margin-right:-4px}.win-contentdialog .win-contentdialog-commandspacer{visibility:hidden}.win-contentdialog .win-contentdialog-commands>button{-ms-flex:1 1 auto;-webkit-flex:1 1 auto;flex:1 1 auto;width:0;margin-right:4px;white-space:nowrap}.win-splitview{position:relative;width:100%;height:100%;display:-ms-flexbox;display:-webkit-flex;display:flex;overflow:hidden}.win-splitview.win-splitview-placementbottom,.win-splitview.win-splitview-placementbottom .win-splitview-panewrapper,.win-splitview.win-splitview-placementtop,.win-splitview.win-splitview-placementtop .win-splitview-panewrapper{-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.win-splitview .win-splitview-panewrapper{position:relative;z-index:1;outline:0;-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;overflow:hidden;display:-ms-flexbox;display:-webkit-flex;display:flex}.win-appbar.win-appbar-closed.win-appbar-closeddisplaynone,.win-splitview.win-splitview-openeddisplayinline .win-splitview-paneplaceholder,.win-splitview.win-splitview-pane-closed .win-splitview-paneplaceholder,.win-splitview.win-splitview-pane-closed.win-splitview-closeddisplaynone .win-splitview-pane{display:none}.win-splitview .win-splitview-paneoutline{display:none;pointer-events:none;position:absolute;top:0;left:0;border:1px solid transparent;width:calc(100% - 2px);height:calc(100% - 2px);z-index:1}.win-splitview .win-splitview-pane{outline:0}.win-splitview .win-splitview-pane,.win-splitview .win-splitview-paneplaceholder{-ms-flex:0 0 auto;-webkit-flex:0 0 auto;flex:0 0 auto;overflow:hidden}.win-splitview .win-splitview-contentwrapper{position:relative;z-index:0;-ms-flex:1 1 0%;-webkit-flex:1 1 0%;flex:1 1 0%;overflow:hidden}.win-splitview .win-splitview-content{position:absolute;width:100%;height:100%}.win-splitview.win-splitview-pane-opened.win-splitview-placementleft .win-splitview-pane,.win-splitview.win-splitview-pane-opened.win-splitview-placementright .win-splitview-pane{width:320px}.win-splitview.win-splitview-pane-opened.win-splitview-placementbottom .win-splitview-pane,.win-splitview.win-splitview-pane-opened.win-splitview-placementtop .win-splitview-pane{height:60px}.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementtop .win-splitview-panewrapper{position:absolute;top:0;left:0;width:100%}.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementbottom .win-splitview-panewrapper{position:absolute;bottom:0;left:0;width:100%}.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft{position:static}.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft .win-splitview-panewrapper{position:absolute;top:0;left:0;right:auto;height:100%}.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ar) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(dv) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(fa) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(he) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ku-Arab) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(pa-Arab) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(prs) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ps) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(qps-plocm) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(sd-Arab) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(syr) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ug) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementleft:lang(ur) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright .win-splitview-panewrapper{position:absolute;top:0;left:auto;right:0;height:100%}.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ar) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(dv) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(fa) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(he) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ku-Arab) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(pa-Arab) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(prs) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ps) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(qps-plocm) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(sd-Arab) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(syr) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ug) .win-splitview-panewrapper,.win-splitview.win-splitview-pane-opened.win-splitview-openeddisplayoverlay.win-splitview-placementright:lang(ur) .win-splitview-panewrapper{position:absolute;top:0;left:0;right:auto;height:100%}.win-splitview.win-splitview-pane-closed.win-splitview-placementbottom .win-splitview-pane,.win-splitview.win-splitview-pane-closed.win-splitview-placementtop .win-splitview-pane{height:24px}.win-splitview.win-splitview-pane-closed.win-splitview-placementleft .win-splitview-pane,.win-splitview.win-splitview-pane-closed.win-splitview-placementright .win-splitview-pane{width:48px}button.win-splitviewpanetoggle{touch-action:manipulation;box-sizing:border-box;height:48px;width:48px;min-height:0;min-width:0;padding:0;border:none;margin:0;outline:0}button.win-splitviewpanetoggle:after{font-size:24px;font-family:'Segoe MDL2 Assets',Symbols;font-weight:400;line-height:1.333;content:"\E700"}.win-appbar{width:100%;min-width:32px;position:fixed;position:-ms-device-fixed;z-index:999}.win-appbar.win-appbar-top{top:0}.win-appbar.win-appbar-bottom{bottom:0}.win-ui-light,body{background-color:#fff;color:#000}.win-ui-dark{background-color:#000;color:#fff}::selection{color:#fff}.win-link:hover{color:rgba(0,0,0,.6)}.win-link:active{color:rgba(0,0,0,.4)}.win-link[disabled]{color:rgba(0,0,0,.2)}.win-checkbox::-ms-check{color:#000;border-color:rgba(0,0,0,.8);background-color:transparent}.win-checkbox:indeterminate::-ms-check{color:rgba(0,0,0,.8)}.win-checkbox:checked::-ms-check{color:#fff;border-color:transparent}.win-checkbox:hover::-ms-check{border-color:#000}.win-checkbox:hover:indeterminate::-ms-check{color:#000}.win-checkbox:active::-ms-check{border-color:transparent;background-color:rgba(0,0,0,.6)}.win-checkbox:indeterminate:active::-ms-check{color:rgba(0,0,0,.6);border-color:rgba(0,0,0,.8);background-color:transparent}.win-checkbox:disabled::-ms-check,.win-checkbox:indeterminate:disabled::-ms-check{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2);background-color:transparent}.win-radio::-ms-check{color:rgba(0,0,0,.8);border-color:rgba(0,0,0,.8);background-color:transparent}.win-radio:hover::-ms-check{border-color:#000;color:#000}.win-radio:active::-ms-check{color:rgba(0,0,0,.6);border-color:rgba(0,0,0,.6)}.win-radio:disabled::-ms-check{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}.win-progress-bar:not(:indeterminate),.win-progress-ring:not(:indeterminate),.win-ring:not(:indeterminate){background-color:rgba(0,0,0,.2)}.win-progress-bar::-webkit-progress-bar,.win-progress-ring::-webkit-progress-bar,.win-ring::-webkit-progress-bar{background-color:transparent}.win-progress-ring,.win-ring{background-color:transparent}.win-button{color:#000;background-color:rgba(0,0,0,.2);border-color:transparent}.win-button.win-button-primary{color:#fff}.win-button.win-button-primary:hover,.win-button:hover{border-color:rgba(0,0,0,.4)}.win-button.win-button-primary:active,.win-button:active{background-color:rgba(0,0,0,.4)}.win-button.win-button-primary:disabled,.win-button:disabled{color:rgba(0,0,0,.2);background-color:rgba(0,0,0,.2);border-color:transparent}.win-dropdown{color:#000;background-color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.4)}.win-dropdown::-ms-expand{color:rgba(0,0,0,.8);background-color:transparent}.win-dropdown:hover{background-color:#f2f2f2;border-color:rgba(0,0,0,.6)}.win-dropdown:disabled{color:rgba(0,0,0,.2);background-color:rgba(0,0,0,.2)}.win-dropdown:disabled::-ms-expand{color:rgba(0,0,0,.2);border-color:rgba(0,0,0,.2)}.win-dropdown option{color:#000;background-color:#f2f2f2}.win-dropdown option:checked{color:#fff}.win-dropdown option:active,.win-dropdown option:hover{background-color:rgba(0,0,0,.2);color:#000}.win-dropdown optgroup{color:#000;background-color:#f2f2f2}.win-dropdown optgroup:disabled{color:rgba(0,0,0,.2)}select[multiple].win-dropdown{border:none;background-color:#f2f2f2}select[multiple].win-dropdown option,select[multiple].win-dropdown option:hover{color:#000}select[multiple].win-dropdown option:checked{color:#fff}.win-slider{background-color:transparent}.win-slider:hover::-ms-thumb{background:#1f1f1f}.win-slider:hover::-webkit-slider-thumb{background:#1f1f1f}.win-slider:hover::-moz-range-thumb{background:#1f1f1f}.win-slider:active::-ms-thumb{background:#ccc}.win-slider:active::-webkit-slider-thumb{background:#ccc}.win-slider:active::-moz-range-thumb{background:#ccc}.win-slider:disabled::-ms-thumb{background:#ccc}.win-slider:disabled::-webkit-slider-thumb{background:#ccc}.win-slider:disabled::-moz-range-thumb{background:#ccc}.win-slider:disabled::-ms-fill-lower{background:rgba(0,0,0,.2)}.win-slider::-ms-fill-upper{background:rgba(0,0,0,.4)}.win-slider::-webkit-slider-runnable-track{background:rgba(0,0,0,.4)}.win-slider::-moz-range-track{background:rgba(0,0,0,.4)}.win-slider:active::-ms-fill-upper{background:rgba(0,0,0,.4)}.win-slider:active::-webkit-slider-runnable-track{background:rgba(0,0,0,.4)}.win-slider:active::-moz-range-track{background:rgba(0,0,0,.4)}.win-slider:disabled::-ms-fill-upper{background:rgba(0,0,0,.2)}.win-slider:disabled::-webkit-slider-runnable-track{background:rgba(0,0,0,.2)}.win-slider:disabled::-moz-range-track{background:rgba(0,0,0,.2)}.win-slider::-ms-track{color:transparent;background-color:transparent}.win-slider::-ms-ticks-after,.win-slider::-ms-ticks-before{color:rgba(0,0,0,.4)}.win-textarea,.win-textbox{color:#000;background-color:rgba(255,255,255,.4);border-color:rgba(0,0,0,.4)}.win-textarea:-ms-input-placeholder,.win-textbox:-ms-input-placeholder{color:rgba(0,0,0,.6)}.win-textarea::-webkit-input-placeholder,.win-textbox::-webkit-input-placeholder{color:rgba(0,0,0,.6)}.win-textarea::-moz-input-placeholder,.win-textbox::-moz-input-placeholder{color:rgba(0,0,0,.6)}.win-textarea:hover,.win-textbox:hover{background-color:rgba(255,255,255,.6);border-color:rgba(0,0,0,.6)}.win-textarea:focus,.win-textbox:focus{color:#000;background-color:#fff}.win-textbox::-ms-clear,.win-textbox::-ms-reveal{display:block;color:rgba(0,0,0,.6)}.win-textbox::-ms-clear:active,.win-textbox::-ms-reveal:active{color:#fff}.win-itemcontainer.win-selectionstylefilled.win-selected,.win-listview.win-selectionstylefilled .win-selected,.win-selectioncheckmark{color:#000}.win-xbox :focus{outline:#fff solid 2px}.win-backbutton:focus,.win-listview .win-groupheader,.win-navigation-backbutton:focus .win-back{outline-color:#000}.win-itemcontainer.win-selectionmode.win-container .win-itembox::after,.win-listview .win-surface.win-selectionmode .win-itembox::after,.win-selectionmode .win-itemcontainer.win-container .win-itembox::after{border-color:#000;background-color:#e6e6e6}.win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox,.win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,.win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox,html.win-hoverable .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox{background-color:rgba(0,0,0,.2)}.win-itemcontainer .win-itembox,.win-listview .win-itembox{background-color:#fff}.win-listview .win-container.win-backdrop{background-color:rgba(155,155,155,.23)}.win-itemcontainer .win-focusedoutline,.win-listview .win-focusedoutline{outline:#000 dashed 2px}.win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground,.win-listview.win-selectionstylefilled .win-selected .win-selectionbackground{opacity:.4}.win-flipview .win-navbutton{background-color:rgba(0,0,0,.4);color:rgba(255,255,255,.8)}.win-flipview .win-navbutton:hover:active{background-color:rgba(0,0,0,.8)}html.win-hoverable .win-flipview .win-navbutton:hover{background-color:rgba(0,0,0,.6)}.win-back,.win-backbutton,.win-navigation-backbutton{background-color:transparent;border:none;color:#000}.win-menu-containsflyoutcommand button.win-command-flyout-activated:before,button[aria-checked=true].win-command:before{position:absolute;height:100%;width:100%;opacity:.4;content:"";box-sizing:content-box;border-width:1px;border-style:solid;top:-1px;left:-1px}.win-backbutton:hover,.win-navigation-backbutton:hover .win-back{background-color:rgba(0,0,0,.1)}.win-backbutton:active,.win-navigation-backbutton:active .win-back{background-color:rgba(0,0,0,.2)}.win-backbutton:disabled,.win-backbutton:disabled:active,.win-navigation-backbutton:disabled,.win-navigation-backbutton:disabled .win-back,.win-navigation-backbutton:disabled:active .win-back{color:rgba(0,0,0,.4);background-color:transparent}.win-tooltip{color:#000;border-color:#ccc;background-color:#f2f2f2}.win-rating .win-star.win-tentative.win-full{color:rgba(0,0,0,.8)}.win-rating .win-star.win-average.win-full,.win-rating .win-star.win-average.win-full.win-disabled{color:rgba(0,0,0,.4)}.win-rating .win-star.win-empty{color:rgba(0,0,0,.2)}.win-toggleswitch-header,.win-toggleswitch-value{color:#000}.win-toggleswitch-thumb{background-color:rgba(0,0,0,.8)}.win-toggleswitch-off .win-toggleswitch-track{border-color:rgba(0,0,0,.8)}.win-toggleswitch-pressed .win-toggleswitch-thumb{background-color:#fff}.win-toggleswitch-pressed .win-toggleswitch-track{border-color:transparent;background-color:rgba(0,0,0,.6)}.win-toggleswitch-disabled .win-toggleswitch-header,.win-toggleswitch-disabled .win-toggleswitch-value{color:rgba(0,0,0,.2)}.win-toggleswitch-disabled .win-toggleswitch-thumb{background-color:rgba(0,0,0,.2)}.win-toggleswitch-disabled .win-toggleswitch-track{border-color:rgba(0,0,0,.2)}.win-semanticzoom-button,.win-toggleswitch-on .win-toggleswitch-track,button.win-command:hover:active,div.win-command:hover:active{border-color:transparent}.win-toggleswitch-on .win-toggleswitch-thumb{background-color:#fff}.win-toggleswitch-on.win-toggleswitch-pressed .win-toggleswitch-track{background-color:rgba(0,0,0,.6)}.win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-thumb,.win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track{background-color:rgba(0,0,0,.2)}.win-semanticzoom-button{background-color:rgba(216,216,216,.33)}button.win-semanticzoom-button.win-semanticzoom-button:active,button.win-semanticzoom-button.win-semanticzoom-button:hover:active{background-color:#000}.win-pivot .win-pivot-title{color:#000}.win-pivot .win-pivot-navbutton{background-color:rgba(0,0,0,.4);color:rgba(255,255,255,.8)}.win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active{color:rgba(0,0,0,.8)}.win-pivot button.win-pivot-header{color:rgba(0,0,0,.6);background-color:transparent}.win-pivot button.win-pivot-header.win-pivot-header:hover:active,.win-pivot button.win-pivot-header:focus{color:rgba(0,0,0,.8)}.win-pivot button.win-pivot-header.win-pivot-header-selected{color:#000;background-color:transparent}.win-pivot-header[disabled]{color:rgba(0,0,0,.4)}button.win-hub-section-header-tabstop,button.win-hub-section-header-tabstop:hover:active{color:#000}button.win-hub-section-header-tabstop.win-keyboard:focus{outline:#000 dotted 1px}button.win-hub-section-header-tabstop:-ms-keyboard-active{color:#000}button.win-hub-section-header-tabstop.win-hub-section-header-interactive.win-hub-section-header-interactive:hover:active{color:rgba(0,0,0,.4)}button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active{color:rgba(0,0,0,.4)}.win-commandimage,button:enabled:active .win-commandimage,button:enabled:hover:active .win-commandimage{color:#000}.win-overlay{outline:0}hr.win-command{background-color:rgba(0,0,0,.4)}button.win-command,div.win-command{border-color:transparent;background-color:transparent}button:enabled.win-command.win-command.win-keyboard:hover:focus,button:enabled.win-command.win-keyboard:focus,div.win-command.win-command.win-keyboard:hover:focus,div.win-command.win-keyboard:focus{border-color:#000}button.win-command.win-command:enabled:active,button.win-command.win-command:enabled:hover:active{background-color:rgba(0,0,0,.2);color:#000}button:disabled .win-commandimage,button:disabled:active .win-commandimage{color:rgba(0,0,0,.2)}button .win-label,button[aria-checked=true]:enabled .win-commandimage,button[aria-checked=true]:enabled .win-label,button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage{color:#000}button[aria-checked=true]:-ms-keyboard-active .win-commandimage{color:#000}button.win-command:enabled:-ms-keyboard-active{background-color:rgba(0,0,0,.2);color:#000}button[aria-checked=true].win-command:enabled:hover:active{background-color:transparent}button.win-command:disabled,button.win-command:disabled:hover:active{background-color:transparent;border-color:transparent}button.win-command:disabled .win-label,button.win-command:disabled:active .win-label{color:rgba(0,0,0,.2)}.win-navbar{background-color:#e6e6e6;border-color:#e6e6e6}.win-navbar.win-menulayout .win-navbar-menu,.win-navbar.win-menulayout .win-toolbar{background-color:inherit}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton{background-color:transparent;outline:0;border-color:transparent}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active{background-color:transparent}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis{color:#000}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus{border-color:#000}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active{background-color:transparent}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis{color:rgba(0,0,0,.2)}.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active{background-color:rgba(0,0,0,.2)}.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis{color:#000}.win-flyout,.win-settingsflyout{background-color:#fff}.win-menu button{background-color:transparent;color:#000}.win-menu button.win-command.win-command:enabled:hover:active,.win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active{background-color:rgba(0,0,0,.2);color:#000}html.win-hoverable .win-itemcontainer.win-container.win-selected:hover .win-selectionborder,html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground,html.win-hoverable .win-listview .win-container.win-selected:hover .win-selectionborder,html.win-hoverable .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,html.win-hoverable button:enabled[aria-checked=true].win-command:hover:before{opacity:.6}.win-menu button[aria-checked=true].win-command:before{background-color:transparent;border-color:transparent}.win-menu button:disabled,.win-menu button:disabled:active{background-color:transparent;color:rgba(0,0,0,.2)}.win-commandingsurface .win-commandingsurface-actionarea{background-color:#e6e6e6}.win-commandingsurface button.win-commandingsurface-overflowbutton{background-color:transparent;border-color:transparent}.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active{background-color:transparent}.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis{color:#000}.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus{border-color:#000}.win-commandingsurface .win-commandingsurface-overflowarea{background-color:#f2f2f2}.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active{background-color:rgba(0,0,0,.2)}.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active{color:#000;background-color:rgba(0,0,0,.2)}.win-autosuggestbox-flyout-highlighttext{color:#4617b4}.win-autosuggestbox-suggestion-separator{color:#7a7a7a}.win-autosuggestbox-suggestion-separator hr{border-color:#7a7a7a}.win-navbarcommand-button.win-keyboard:focus::before,.win-splitviewcommand-button.win-keyboard:focus::before{content:"";pointer-events:none;position:absolute;box-sizing:border-box;top:0;left:0;height:100%;width:100%;border:1px dotted #000}.win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext{color:#a38bda}.win-autosuggestbox-flyout{background-color:#f2f2f2;color:#000}.win-autosuggestbox-suggestion-query:hover:active,.win-autosuggestbox-suggestion-result:hover:active{background-color:rgba(0,0,0,.2)}.win-searchbox-button,.win-searchbox-button-input-focus{color:rgba(0,0,0,.4)}.win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active{color:#fff}.win-splitviewcommand-button{background-color:transparent;color:#000}.win-navbarcontainer-pageindicator,.win-splitviewcommand-button.win-pressed{background-color:rgba(0,0,0,.2)}.win-navbarcontainer-pageindicator-current{background-color:rgba(0,0,0,.6)}.win-navbarcontainer-navarrow{background-color:rgba(0,0,0,.4);color:rgba(255,255,255,.8)}.win-navbarcontainer-navarrow.win-navbarcontainer-navarrow:hover:active{background-color:rgba(0,0,0,.8)}.win-navbarcommand-button,.win-navbarcommand-splitbutton{background-color:rgba(0,0,0,.1);color:#000}.win-navbarcommand-button.win-pressed,.win-navbarcommand-splitbutton.win-pressed{background-color:rgba(0,0,0,.28)}.win-navbarcommand-splitbutton.win-keyboard:focus::before{border-color:#000}.win-contentdialog-dialog{background-color:#f2f2f2}.win-contentdialog-content,.win-contentdialog-title{color:#000}.win-contentdialog-backgroundoverlay{background-color:#fff;opacity:.6}.win-splitview-pane{background-color:#f2f2f2}button.win-splitviewpanetoggle{color:#000;background-color:transparent}button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover,button.win-splitviewpanetoggle:active{color:#000;background-color:rgba(0,0,0,.2)}button.win-splitviewpanetoggle.win-keyboard:focus{border:1px dotted #000}html.win-hoverable .win-itemcontainer .win-itembox:hover::before,html.win-hoverable .win-listview .win-itembox:hover::before,html.win-hoverable .win-toggleswitch-off:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track{border-color:#000}button.win-splitviewpanetoggle.win-splitviewpanetoggle:disabled:hover,button.win-splitviewpanetoggle:disabled,button.win-splitviewpanetoggle:disabled:active{color:rgba(0,0,0,.2);background-color:transparent}html.win-hoverable .win-selectionstylefilled .win-container:hover .win-itembox,html.win-hoverable .win-selectionstylefilled.win-container:hover .win-itembox{background-color:rgba(0,0,0,.1)}html.win-hoverable .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb{background-color:#000}html.win-hoverable .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed).win-toggleswitch-on .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb{background-color:#fff}html.win-hoverable button:hover.win-semanticzoom-button{background-color:#d8d8d8}html.win-hoverable .win-pivot .win-pivot-navbutton:hover{color:rgba(0,0,0,.6)}html.win-hoverable .win-pivot button.win-pivot-header:hover{color:baseMediumHigh}html.win-hoverable button.win-hub-section-header-tabstop:hover{color:#000}html.win-hoverable button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover{color:rgba(0,0,0,.8)}html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable button.win-command:enabled:hover,html.win-hoverable button.win-command:enabled:hover .win-commandglyph,html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis{color:#000}html.win-hoverable .win-navbar button.win-navbar-invokebutton:disabled:hover,html.win-hoverable .win-navbar button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar button.win-navbar-invokebutton:disabled:hover,html.win-hoverable.win-navbar button.win-navbar-invokebutton:enabled:hover{background-color:transparent}html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,html.win-hoverable button.win-command:enabled:hover,html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover{background-color:rgba(0,0,0,.1)}html.win-hoverable .win-menu button.win-command:enabled:hover{background-color:rgba(0,0,0,.1);color:#000}html.win-hoverable button[aria-checked=true].win-command:hover{background-color:transparent}html.win-hoverable .win-autosuggestbox-suggestion-query:hover,html.win-hoverable .win-autosuggestbox-suggestion-result:hover,html.win-hoverable .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,html.win-hoverable .win-splitviewcommand-button:hover,html.win-hoverable.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover{background-color:rgba(0,0,0,.1)}html.win-hoverable button:enabled[aria-checked=true].win-command:hover:active:before{opacity:.7}html.win-hoverable .win-searchbox-button:not(.win-searchbox-button-disabled):hover:active{color:#fff}html.win-hoverable .win-splitviewcommand-button:hover.win-pressed{background-color:rgba(0,0,0,.2)}html.win-hoverable .win-navbarcontainer-navarrow:hover{background-color:rgba(0,0,0,.6)}html.win-hoverable .win-navbarcommand-button:hover,html.win-hoverable .win-navbarcommand-splitbutton:hover{background-color:rgba(0,0,0,.19)}html.win-hoverable .win-navbarcommand-button:hover.win-pressed,html.win-hoverable .win-navbarcommand-splitbutton:hover.win-pressed{background-color:rgba(0,0,0,.28)}html.win-hoverable button.win-splitviewpanetoggle:hover{color:#000;background-color:rgba(0,0,0,.1)}.win-ui-dark .win-ui-dark,.win-ui-dark body{background-color:#000;color:#fff}.win-ui-dark .win-ui-light{background-color:#fff;color:#000}.win-ui-dark winjs-themedetection-tag{opacity:0}.win-ui-dark ::selection{color:#fff}.win-ui-dark .win-link:hover{color:rgba(255,255,255,.6)}.win-ui-dark .win-link:active{color:rgba(255,255,255,.4)}.win-ui-dark .win-link[disabled]{color:rgba(255,255,255,.2)}.win-ui-dark .win-checkbox::-ms-check{color:#fff;border-color:rgba(255,255,255,.8);background-color:transparent}.win-ui-dark .win-checkbox:indeterminate::-ms-check{color:rgba(255,255,255,.8)}.win-ui-dark .win-checkbox:checked::-ms-check{color:#fff;border-color:transparent}.win-ui-dark .win-checkbox:hover::-ms-check{border-color:#fff}.win-ui-dark .win-checkbox:hover:indeterminate::-ms-check{color:#fff}.win-ui-dark .win-checkbox:active::-ms-check{border-color:transparent;background-color:rgba(255,255,255,.6)}.win-ui-dark .win-checkbox:indeterminate:active::-ms-check{color:rgba(255,255,255,.6);border-color:rgba(255,255,255,.8);background-color:transparent}.win-ui-dark .win-checkbox:disabled::-ms-check,.win-ui-dark .win-checkbox:indeterminate:disabled::-ms-check{color:rgba(255,255,255,.2);border-color:rgba(255,255,255,.2);background-color:transparent}.win-ui-dark .win-radio::-ms-check{color:rgba(255,255,255,.8);border-color:rgba(255,255,255,.8);background-color:transparent}.win-ui-dark .win-radio:hover::-ms-check{border-color:#fff;color:#fff}.win-ui-dark .win-radio:active::-ms-check{color:rgba(255,255,255,.6);border-color:rgba(255,255,255,.6)}.win-ui-dark .win-radio:disabled::-ms-check{color:rgba(255,255,255,.2);border-color:rgba(255,255,255,.2)}.win-ui-dark .win-progress-bar:not(:indeterminate),.win-ui-dark .win-progress-ring:not(:indeterminate),.win-ui-dark .win-ring:not(:indeterminate){background-color:rgba(255,255,255,.2)}.win-ui-dark .win-progress-bar::-webkit-progress-bar,.win-ui-dark .win-progress-ring::-webkit-progress-bar,.win-ui-dark .win-ring::-webkit-progress-bar{background-color:transparent}.win-ui-dark .win-progress-ring,.win-ui-dark .win-ring{background-color:transparent}.win-ui-dark .win-button{color:#fff;background-color:rgba(255,255,255,.2);border-color:transparent}.win-ui-dark .win-button.win-button-primary{color:#fff}.win-ui-dark .win-button.win-button-primary:hover,.win-ui-dark .win-button:hover{border-color:rgba(255,255,255,.4)}.win-ui-dark .win-button.win-button-primary:active,.win-ui-dark .win-button:active{background-color:rgba(255,255,255,.4)}.win-ui-dark .win-button.win-button-primary:disabled,.win-ui-dark .win-button:disabled{color:rgba(255,255,255,.2);background-color:rgba(255,255,255,.2);border-color:transparent}.win-ui-dark .win-dropdown{color:#fff;background-color:rgba(255,255,255,.2);border-color:rgba(255,255,255,.4)}.win-ui-dark .win-dropdown::-ms-expand{color:rgba(255,255,255,.8);background-color:transparent}.win-ui-dark .win-dropdown:hover{background-color:#2b2b2b;border-color:rgba(255,255,255,.6)}.win-ui-dark .win-dropdown:disabled{color:rgba(255,255,255,.2);background-color:rgba(255,255,255,.2)}.win-ui-dark .win-dropdown:disabled::-ms-expand{color:rgba(255,255,255,.2);border-color:rgba(255,255,255,.2)}.win-ui-dark .win-dropdown option{color:#fff;background-color:#2b2b2b}.win-ui-dark .win-dropdown option:checked{color:#fff}.win-ui-dark .win-dropdown option:active,.win-ui-dark .win-dropdown option:hover{background-color:rgba(0,0,0,.2);color:#fff}.win-ui-dark .win-dropdown optgroup{color:#fff;background-color:#2b2b2b}.win-ui-dark .win-dropdown optgroup:disabled{color:rgba(255,255,255,.2)}.win-ui-dark select[multiple].win-dropdown{border:none;background-color:#2b2b2b}.win-ui-dark select[multiple].win-dropdown option,.win-ui-dark select[multiple].win-dropdown option:checked,.win-ui-dark select[multiple].win-dropdown option:hover{color:#fff}.win-ui-dark .win-slider{background-color:transparent}.win-ui-dark .win-slider:hover::-ms-thumb{background:#f9f9f9}.win-ui-dark .win-slider:hover::-webkit-slider-thumb{background:#f9f9f9}.win-ui-dark .win-slider:hover::-moz-range-thumb{background:#f9f9f9}.win-ui-dark .win-slider:active::-ms-thumb{background:#767676}.win-ui-dark .win-slider:active::-webkit-slider-thumb{background:#767676}.win-ui-dark .win-slider:active::-moz-range-thumb{background:#767676}.win-ui-dark .win-slider:disabled::-ms-thumb{background:#333}.win-ui-dark .win-slider:disabled::-webkit-slider-thumb{background:#333}.win-ui-dark .win-slider:disabled::-moz-range-thumb{background:#333}.win-ui-dark .win-slider:disabled::-ms-fill-lower{background:rgba(255,255,255,.2)}.win-ui-dark .win-slider::-ms-fill-upper{background:rgba(255,255,255,.4)}.win-ui-dark .win-slider::-webkit-slider-runnable-track{background:rgba(255,255,255,.4)}.win-ui-dark .win-slider::-moz-range-track{background:rgba(255,255,255,.4)}.win-ui-dark .win-slider:active::-ms-fill-upper{background:rgba(255,255,255,.4)}.win-ui-dark .win-slider:active::-webkit-slider-runnable-track{background:rgba(255,255,255,.4)}.win-ui-dark .win-slider:active::-moz-range-track{background:rgba(255,255,255,.4)}.win-ui-dark .win-slider:disabled::-ms-fill-upper{background:rgba(255,255,255,.2)}.win-ui-dark .win-slider:disabled::-webkit-slider-runnable-track{background:rgba(255,255,255,.2)}.win-ui-dark .win-slider:disabled::-moz-range-track{background:rgba(255,255,255,.2)}.win-ui-dark .win-slider::-ms-track{color:transparent;background-color:transparent}.win-ui-dark .win-slider::-ms-ticks-after,.win-ui-dark .win-slider::-ms-ticks-before{color:rgba(255,255,255,.4)}.win-ui-dark .win-textarea,.win-ui-dark .win-textbox{color:#fff;background-color:rgba(0,0,0,.4);border-color:rgba(255,255,255,.4)}.win-ui-dark .win-textarea:-ms-input-placeholder,.win-ui-dark .win-textbox:-ms-input-placeholder{color:rgba(255,255,255,.6)}.win-ui-dark .win-textarea::-webkit-input-placeholder,.win-ui-dark .win-textbox::-webkit-input-placeholder{color:rgba(255,255,255,.6)}.win-ui-dark .win-textarea::-moz-input-placeholder,.win-ui-dark .win-textbox::-moz-input-placeholder{color:rgba(255,255,255,.6)}.win-ui-dark .win-textarea:hover,.win-ui-dark .win-textbox:hover{background-color:rgba(0,0,0,.6);border-color:rgba(255,255,255,.6)}.win-ui-dark .win-textarea:focus,.win-ui-dark .win-textbox:focus{color:#000;background-color:#fff}.win-ui-dark .win-textbox::-ms-clear,.win-ui-dark .win-textbox::-ms-reveal{display:block;color:rgba(0,0,0,.6)}.win-ui-dark .win-itemcontainer.win-selectionstylefilled.win-selected,.win-ui-dark .win-listview.win-selectionstylefilled .win-selected,.win-ui-dark .win-selectioncheckmark{color:#fff}.win-ui-dark .win-textbox::-ms-clear:active,.win-ui-dark .win-textbox::-ms-reveal:active{color:#fff}.win-ui-dark .win-xbox :focus{outline:#fff solid 2px}.win-ui-dark .win-backbutton:focus,.win-ui-dark .win-listview .win-groupheader,.win-ui-dark .win-navigation-backbutton:focus .win-back{outline-color:#fff}.win-ui-dark .win-itemcontainer.win-selectionmode.win-container .win-itembox::after,.win-ui-dark .win-listview .win-surface.win-selectionmode .win-itembox::after,.win-ui-dark .win-selectionmode .win-itemcontainer.win-container .win-itembox::after{border-color:#fff;background-color:#393939}.win-ui-dark .win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox,.win-ui-dark .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,.win-ui-dark .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox,.win-ui-dark html.win-hoverable .win-itemcontainer.win-selectionstylefilled.win-container.win-pressed .win-itembox,.win-ui-dark html.win-hoverable .win-listview.win-selectionstylefilled .win-container .win-itembox.win-pressed,.win-ui-dark html.win-hoverable .win-listview.win-selectionstylefilled .win-container.win-pressed .win-itembox{background-color:rgba(255,255,255,.2)}.win-ui-dark .win-itemcontainer .win-itembox,.win-ui-dark .win-listview .win-itembox{background-color:#1d1d1d}.win-ui-dark .win-listview .win-container.win-backdrop{background-color:rgba(155,155,155,.23)}.win-ui-dark .win-itemcontainer .win-focusedoutline,.win-ui-dark .win-listview .win-focusedoutline{outline:#fff dashed 2px}.win-ui-dark .win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground,.win-ui-dark .win-listview.win-selectionstylefilled .win-selected .win-selectionbackground{opacity:.6}.win-ui-dark .win-flipview .win-navbutton{background-color:rgba(255,255,255,.4);color:rgba(0,0,0,.8)}.win-ui-dark .win-flipview .win-navbutton:hover:active{background-color:rgba(255,255,255,.8)}.win-ui-dark html.win-hoverable .win-flipview .win-navbutton:hover{background-color:rgba(255,255,255,.6)}.win-ui-dark .win-back,.win-ui-dark .win-backbutton,.win-ui-dark .win-navigation-backbutton{background-color:transparent;border:none;color:#fff}.win-ui-dark .win-menu-containsflyoutcommand button.win-command-flyout-activated:before,.win-ui-dark button[aria-checked=true].win-command:before,.win-ui-dark.win-menu-containsflyoutcommand button.win-command-flyout-activated:before{position:absolute;height:100%;width:100%;content:"";box-sizing:content-box;border-width:1px;border-style:solid;top:-1px;left:-1px;opacity:.6}.win-ui-dark .win-backbutton:hover,.win-ui-dark .win-navigation-backbutton:hover .win-back{background-color:rgba(255,255,255,.1)}.win-ui-dark .win-backbutton:active,.win-ui-dark .win-navigation-backbutton:active .win-back{background-color:rgba(255,255,255,.2)}.win-ui-dark .win-backbutton:disabled,.win-ui-dark .win-backbutton:disabled:active,.win-ui-dark .win-navigation-backbutton:disabled,.win-ui-dark .win-navigation-backbutton:disabled .win-back,.win-ui-dark .win-navigation-backbutton:disabled:active .win-back{color:rgba(255,255,255,.4);background-color:transparent}.win-ui-dark .win-tooltip{color:#fff;border-color:#767676;background-color:#2b2b2b}.win-ui-dark .win-rating .win-star.win-tentative.win-full{color:rgba(255,255,255,.8)}.win-ui-dark .win-rating .win-star.win-average.win-full,.win-ui-dark .win-rating .win-star.win-average.win-full.win-disabled{color:rgba(255,255,255,.4)}.win-ui-dark .win-rating .win-star.win-empty{color:rgba(255,255,255,.2)}.win-ui-dark .win-toggleswitch-header,.win-ui-dark .win-toggleswitch-value{color:#fff}.win-ui-dark .win-toggleswitch-thumb{background-color:rgba(255,255,255,.8)}.win-ui-dark .win-toggleswitch-off .win-toggleswitch-track{border-color:rgba(255,255,255,.8)}.win-ui-dark .win-toggleswitch-pressed .win-toggleswitch-thumb{background-color:#fff}.win-ui-dark .win-toggleswitch-pressed .win-toggleswitch-track{border-color:transparent;background-color:rgba(255,255,255,.6)}.win-ui-dark .win-toggleswitch-disabled .win-toggleswitch-header,.win-ui-dark .win-toggleswitch-disabled .win-toggleswitch-value{color:rgba(255,255,255,.2)}.win-ui-dark .win-toggleswitch-disabled .win-toggleswitch-thumb{background-color:rgba(255,255,255,.2)}.win-ui-dark .win-toggleswitch-disabled .win-toggleswitch-track{border-color:rgba(255,255,255,.2)}.win-ui-dark .win-semanticzoom-button,.win-ui-dark .win-toggleswitch-on .win-toggleswitch-track,.win-ui-dark button.win-command:hover:active,.win-ui-dark div.win-command:hover:active{border-color:transparent}.win-ui-dark .win-toggleswitch-on .win-toggleswitch-thumb{background-color:#fff}.win-ui-dark .win-toggleswitch-on.win-toggleswitch-pressed .win-toggleswitch-track{background-color:rgba(255,255,255,.6)}.win-ui-dark .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-thumb,.win-ui-dark .win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track{background-color:rgba(255,255,255,.2)}.win-ui-dark .win-semanticzoom-button{background-color:rgba(216,216,216,.33)}.win-ui-dark button.win-semanticzoom-button.win-semanticzoom-button:active,.win-ui-dark button.win-semanticzoom-button.win-semanticzoom-button:hover:active{background-color:#fff}.win-ui-dark .win-pivot .win-pivot-title{color:#fff}.win-ui-dark .win-pivot .win-pivot-navbutton{background-color:rgba(255,255,255,.4);color:rgba(0,0,0,.8)}.win-ui-dark .win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active{color:rgba(255,255,255,.8)}.win-ui-dark .win-pivot button.win-pivot-header{color:rgba(255,255,255,.6);background-color:transparent}.win-ui-dark .win-pivot button.win-pivot-header.win-pivot-header:hover:active,.win-ui-dark .win-pivot button.win-pivot-header:focus{color:rgba(255,255,255,.8)}.win-ui-dark .win-pivot button.win-pivot-header.win-pivot-header-selected{color:#fff;background-color:transparent}.win-ui-dark .win-pivot-header[disabled]{color:rgba(255,255,255,.4)}.win-ui-dark button.win-hub-section-header-tabstop,.win-ui-dark button.win-hub-section-header-tabstop:hover:active{color:#fff}.win-ui-dark button.win-hub-section-header-tabstop.win-keyboard:focus{outline:#fff dotted 1px}.win-ui-dark button.win-hub-section-header-tabstop:-ms-keyboard-active{color:#fff}.win-ui-dark button.win-hub-section-header-tabstop.win-hub-section-header-interactive.win-hub-section-header-interactive:hover:active{color:rgba(255,255,255,.4)}.win-ui-dark button.win-hub-section-header-tabstop.win-hub-section-header-interactive:-ms-keyboard-active{color:rgba(255,255,255,.4)}.win-ui-dark .win-commandimage,.win-ui-dark button:enabled:active .win-commandimage,.win-ui-dark button:enabled:hover:active .win-commandimage{color:#fff}.win-ui-dark .win-overlay{outline:0}.win-ui-dark hr.win-command{background-color:rgba(255,255,255,.4)}.win-ui-dark button.win-command,.win-ui-dark div.win-command{border-color:transparent;background-color:transparent}.win-ui-dark button:enabled.win-command.win-command.win-keyboard:hover:focus,.win-ui-dark button:enabled.win-command.win-keyboard:focus,.win-ui-dark div.win-command.win-command.win-keyboard:hover:focus,.win-ui-dark div.win-command.win-keyboard:focus{border-color:#fff}.win-ui-dark button.win-command.win-command:enabled:active,.win-ui-dark button.win-command.win-command:enabled:hover:active{background-color:rgba(255,255,255,.2);color:#fff}.win-ui-dark button:disabled .win-commandimage,.win-ui-dark button:disabled:active .win-commandimage{color:rgba(255,255,255,.2)}.win-ui-dark button .win-label,.win-ui-dark button[aria-checked=true]:enabled .win-commandimage,.win-ui-dark button[aria-checked=true]:enabled .win-label,.win-ui-dark button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage{color:#fff}.win-ui-dark button[aria-checked=true]:-ms-keyboard-active .win-commandimage{color:#fff}.win-ui-dark button.win-command:enabled:-ms-keyboard-active{background-color:rgba(255,255,255,.2);color:#fff}.win-ui-dark button[aria-checked=true].win-command:enabled:hover:active{background-color:transparent}.win-ui-dark button.win-command:disabled,.win-ui-dark button.win-command:disabled:hover:active{background-color:transparent;border-color:transparent}.win-ui-dark button.win-command:disabled .win-label,.win-ui-dark button.win-command:disabled:active .win-label{color:rgba(255,255,255,.2)}.win-ui-dark .win-navbar,.win-ui-dark.win-navbar{background-color:#393939;border-color:#393939}.win-ui-dark .win-navbar.win-menulayout .win-navbar-menu,.win-ui-dark .win-navbar.win-menulayout .win-toolbar,.win-ui-dark.win-navbar.win-menulayout .win-navbar-menu,.win-ui-dark.win-navbar.win-menulayout .win-toolbar{background-color:inherit}.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton,.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton{background-color:transparent;outline:0;border-color:transparent}.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active,.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active{background-color:transparent}.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis,.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis{color:#fff}.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus,.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus{border-color:#fff}.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active,.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active{background-color:transparent}.win-ui-dark .win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis,.win-ui-dark.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis{color:rgba(255,255,255,.2)}.win-ui-dark .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-dark .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-dark .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-dark .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-dark.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-dark.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-dark.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-ui-dark.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active{background-color:rgba(255,255,255,.2)}.win-ui-dark .win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-dark .win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-dark .win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-dark .win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-dark.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-dark.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-dark.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-ui-dark.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis{color:#fff}.win-ui-dark .win-flyout,.win-ui-dark .win-settingsflyout,.win-ui-dark.win-flyout{background-color:#000}.win-ui-dark .win-menu button,.win-ui-dark.win-menu button{background-color:transparent;color:#fff}.win-ui-dark .win-menu button.win-command.win-command:enabled:hover:active,.win-ui-dark .win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active{background-color:rgba(255,255,255,.2);color:#fff}.win-ui-dark .win-menu button[aria-checked=true].win-command:before,.win-ui-dark.win-menu button[aria-checked=true].win-command:before{background-color:transparent;border-color:transparent}.win-ui-dark .win-menu button:disabled,.win-ui-dark .win-menu button:disabled:active,.win-ui-dark.win-menu button:disabled,.win-ui-dark.win-menu button:disabled:active{background-color:transparent;color:rgba(255,255,255,.2)}.win-ui-dark .win-commandingsurface .win-commandingsurface-actionarea,.win-ui-dark.win-commandingsurface .win-commandingsurface-actionarea{background-color:#393939}.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton,.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton{background-color:transparent;border-color:transparent}.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active,.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active{background-color:transparent}.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis,.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis{color:#fff}.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus,.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus{border-color:#fff}.win-ui-dark .win-commandingsurface .win-commandingsurface-overflowarea,.win-ui-dark.win-commandingsurface .win-commandingsurface-overflowarea{background-color:#2b2b2b}.win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active,.win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active{background-color:rgba(255,255,255,.2)}.win-ui-dark .win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active,.win-ui-dark.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active{color:#fff;background-color:rgba(255,255,255,.2)}.win-ui-dark .win-autosuggestbox-flyout-highlighttext{color:#4617b4}.win-ui-dark .win-autosuggestbox-suggestion-separator{color:#7a7a7a}.win-ui-dark .win-autosuggestbox-suggestion-separator hr{border-color:#7a7a7a}.win-ui-dark .win-navbarcommand-button.win-keyboard:focus::before,.win-ui-dark .win-splitviewcommand-button.win-keyboard:focus::before{content:"";pointer-events:none;position:absolute;box-sizing:border-box;top:0;left:0;height:100%;width:100%;border:1px dotted #fff}.win-ui-dark .win-autosuggestbox-suggestion-selected .win-autosuggestbox-flyout-highlighttext{color:#a38bda}.win-ui-dark .win-autosuggestbox-flyout{background-color:#2b2b2b;color:#fff}.win-ui-dark .win-autosuggestbox-suggestion-query:hover:active,.win-ui-dark .win-autosuggestbox-suggestion-result:hover:active{background-color:rgba(255,255,255,.2)}.win-ui-dark .win-searchbox-button{color:rgba(255,255,255,.4)}.win-ui-dark .win-searchbox-button-input-focus{color:rgba(0,0,0,.4)}.win-ui-dark .win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active{color:#fff}.win-ui-dark .win-splitviewcommand-button{background-color:transparent;color:#fff}.win-ui-dark .win-navbarcontainer-pageindicator,.win-ui-dark .win-splitviewcommand-button.win-pressed{background-color:rgba(255,255,255,.2)}.win-ui-dark .win-navbarcontainer-pageindicator-current{background-color:rgba(255,255,255,.6)}.win-ui-dark .win-navbarcontainer-navarrow{background-color:rgba(255,255,255,.4);color:rgba(0,0,0,.8)}.win-ui-dark .win-navbarcontainer-navarrow.win-navbarcontainer-navarrow:hover:active{background-color:rgba(255,255,255,.8)}.win-ui-dark .win-navbarcommand-button,.win-ui-dark .win-navbarcommand-splitbutton{background-color:rgba(255,255,255,.1);color:#fff}.win-ui-dark .win-navbarcommand-button.win-pressed,.win-ui-dark .win-navbarcommand-splitbutton.win-pressed{background-color:rgba(255,255,255,.28)}.win-ui-dark .win-navbarcommand-splitbutton.win-keyboard:focus::before{border-color:#fff}.win-ui-dark .win-contentdialog-dialog{background-color:#2b2b2b}.win-ui-dark .win-contentdialog-content,.win-ui-dark .win-contentdialog-title{color:#fff}.win-ui-dark .win-contentdialog-backgroundoverlay{background-color:#000;opacity:.6}html.win-hoverable .win-ui-dark .win-itemcontainer.win-container.win-selected:hover .win-selectionborder,html.win-hoverable .win-ui-dark .win-itemcontainer.win-selectionstylefilled.win-selected:hover .win-selectionbackground,html.win-hoverable .win-ui-dark .win-listview .win-container.win-selected:hover .win-selectionborder,html.win-hoverable .win-ui-dark .win-listview.win-selectionstylefilled .win-selected:hover .win-selectionbackground,html.win-hoverable .win-ui-dark button:enabled[aria-checked=true].win-command:hover:before{opacity:.8}.win-ui-dark .win-splitview-pane{background-color:#171717}.win-ui-dark button.win-splitviewpanetoggle{color:#fff;background-color:transparent}.win-ui-dark button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover,.win-ui-dark button.win-splitviewpanetoggle:active{color:#fff;background-color:rgba(255,255,255,.2)}.win-ui-dark button.win-splitviewpanetoggle.win-keyboard:focus{border:1px dotted #fff}html.win-hoverable .win-ui-dark .win-itemcontainer .win-itembox:hover::before,html.win-hoverable .win-ui-dark .win-listview .win-itembox:hover::before,html.win-hoverable .win-ui-dark .win-toggleswitch-off:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track{border-color:#fff}.win-ui-dark button.win-splitviewpanetoggle.win-splitviewpanetoggle:disabled:hover,.win-ui-dark button.win-splitviewpanetoggle:disabled,.win-ui-dark button.win-splitviewpanetoggle:disabled:active{color:rgba(255,255,255,.2);background-color:transparent}html.win-hoverable .win-ui-dark .win-selectionstylefilled .win-container:hover .win-itembox,html.win-hoverable .win-ui-dark .win-selectionstylefilled.win-container:hover .win-itembox{background-color:rgba(255,255,255,.1)}html.win-hoverable .win-ui-dark .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb,html.win-hoverable .win-ui-dark .win-toggleswitch:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed).win-toggleswitch-on .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb{background-color:#fff}html.win-hoverable .win-ui-dark button:hover.win-semanticzoom-button{background-color:#d8d8d8}html.win-hoverable .win-ui-dark .win-pivot .win-pivot-navbutton:hover{color:rgba(255,255,255,.6)}html.win-hoverable .win-ui-dark .win-pivot button.win-pivot-header:hover{color:baseMediumHigh}html.win-hoverable .win-ui-dark button.win-hub-section-header-tabstop:hover{color:#fff}html.win-hoverable .win-ui-dark button.win-hub-section-header-tabstop.win-hub-section-header-interactive:hover{color:rgba(255,255,255,.8)}html.win-hoverable .win-ui-dark .win-navbar button.win-navbar-invokebutton:disabled:hover,html.win-hoverable .win-ui-dark .win-navbar button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-dark.win-navbar button.win-navbar-invokebutton:disabled:hover,html.win-hoverable .win-ui-dark.win-navbar button.win-navbar-invokebutton:enabled:hover{background-color:transparent}html.win-hoverable .win-ui-dark .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-dark .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-dark .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-dark .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-dark button.win-command:enabled:hover,html.win-hoverable .win-ui-dark.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-dark.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-dark.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-ui-dark.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover{background-color:rgba(255,255,255,.1)}html.win-hoverable .win-ui-dark .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-ui-dark .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-ui-dark.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-ui-dark.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis{color:#fff}html.win-hoverable .win-ui-dark .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-ui-dark .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-ui-dark button.win-command:enabled:hover,html.win-hoverable .win-ui-dark button.win-command:enabled:hover .win-commandglyph,html.win-hoverable .win-ui-dark.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-ui-dark.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis{color:#fff}html.win-hoverable .win-ui-dark .win-menu button.win-command:enabled:hover{background-color:rgba(255,255,255,.1);color:#fff}html.win-hoverable .win-ui-dark button[aria-checked=true].win-command:hover{background-color:transparent}html.win-hoverable .win-ui-dark .win-autosuggestbox-suggestion-query:hover,html.win-hoverable .win-ui-dark .win-autosuggestbox-suggestion-result:hover,html.win-hoverable .win-ui-dark .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,html.win-hoverable .win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,html.win-hoverable .win-ui-dark.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,html.win-hoverable .win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton:hover{background-color:rgba(255,255,255,.1)}html.win-hoverable .win-ui-dark button:enabled[aria-checked=true].win-command:hover:active:before{opacity:.9}html.win-hoverable .win-ui-dark .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,html.win-hoverable .win-ui-dark.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis{color:#fff}html.win-hoverable .win-ui-dark .win-searchbox-button:not(.win-searchbox-button-disabled):hover:active{color:#fff}html.win-hoverable .win-ui-dark .win-splitviewcommand-button:hover{background-color:rgba(0,0,0,.1)}html.win-hoverable .win-ui-dark .win-splitviewcommand-button:hover.win-pressed{background-color:rgba(0,0,0,.2)}html.win-hoverable .win-ui-dark .win-navbarcontainer-navarrow:hover{background-color:rgba(255,255,255,.6)}html.win-hoverable .win-ui-dark .win-navbarcommand-button:hover,html.win-hoverable .win-ui-dark .win-navbarcommand-splitbutton:hover{background-color:rgba(0,0,0,.19)}html.win-hoverable .win-ui-dark .win-navbarcommand-button:hover.win-pressed,html.win-hoverable .win-ui-dark .win-navbarcommand-splitbutton:hover.win-pressed{background-color:rgba(0,0,0,.28)}html.win-hoverable .win-ui-dark button.win-splitviewpanetoggle:hover{color:#fff;background-color:rgba(255,255,255,.1)}@media (-ms-high-contrast){::selection{background-color:Highlight;color:HighlightText}.win-link{color:-ms-hotlight}.win-link:active{color:Highlight}.win-link[disabled]{color:GrayText}.win-checkbox::-ms-check,.win-radio::-ms-check{background-color:ButtonFace;border-color:ButtonText;color:HighlightText}.win-checkbox:indeterminate::-ms-check,.win-radio:indeterminate::-ms-check{background-color:Highlight;border-color:ButtonText;color:ButtonText}.win-checkbox:checked::-ms-check,.win-radio:checked::-ms-check{background-color:Highlight;border-color:HighlightText}.win-checkbox:hover::-ms-check,.win-radio:hover::-ms-check{border-color:Highlight}.win-checkbox:-ms-keyboard-active::-ms-check,.win-checkbox:hover:active::-ms-check,.win-radio:-ms-keyboard-active::-ms-check,.win-radio:hover:active::-ms-check{border-color:Highlight}.win-checkbox:disabled::-ms-check,.win-checkbox:disabled:active::-ms-check,.win-radio:disabled::-ms-check,.win-radio:disabled:active::-ms-check{background-color:ButtonFace;border-color:GrayText;color:GrayText}.win-progress-bar,.win-progress-ring,.win-ring{background-color:ButtonFace;color:Highlight}.win-progress-bar::-ms-fill,.win-progress-ring::-ms-fill,.win-ring::-ms-fill{background-color:Highlight}.win-progress-bar.win-paused:not(:indeterminate)::-ms-fill,.win-progress-ring.win-paused:not(:indeterminate)::-ms-fill,.win-ring.win-paused:not(:indeterminate)::-ms-fill{background-color:GrayText}.win-progress-bar.win-paused:not(:indeterminate),.win-progress-ring.win-paused:not(:indeterminate),.win-ring.win-paused:not(:indeterminate){animation-name:none;opacity:1}.win-button{border-color:ButtonText;color:ButtonText}.win-button:active,.win-button:hover{border-color:Highlight;color:Highlight}.win-button:disabled{border-color:GrayText;color:GrayText}.win-dropdown{background-color:ButtonFace;border-color:ButtonText;color:WindowText}.win-dropdown:active,.win-dropdown:hover{border-color:Highlight}.win-dropdown:disabled{border-color:GrayText;color:GrayText}.win-dropdown::-ms-expand{color:ButtonText}.win-dropdown:disabled::-ms-expand{color:GrayText}.win-dropdown option{background-color:ButtonFace;color:ButtonText}.win-dropdown option:active,.win-dropdown option:checked,.win-dropdown option:hover{background-color:Highlight;color:HighlightText}.win-dropdown option:disabled,select[multiple].win-dropdown:disabled option{background-color:ButtonFace;color:GrayText}select[multiple].win-dropdown{border:none}.win-menu-containsflyoutcommand button.win-command-flyout-activated:before,button[aria-checked=true].win-command:before{height:100%;width:100%;content:"";box-sizing:content-box;border-width:1px;border-style:solid;top:-1px;left:-1px;position:absolute}select[multiple].win-dropdown:disabled option:checked{background-color:GrayText;color:ButtonFace}.win-slider::-ms-track{color:transparent}.win-slider::-ms-ticks-after,.win-slider::-ms-ticks-before{color:ButtonText}.win-slider::-ms-fill-lower{background-color:Highlight}.win-slider::-ms-fill-upper{background-color:ButtonText}.win-slider::-ms-thumb{background-color:ButtonText}.win-slider:hover::-ms-thumb{background-color:Highlight}.win-slider:active::-ms-thumb{background-color:Highlight}.win-slider:disabled::-ms-fill-lower,.win-slider:disabled::-ms-fill-upper,.win-slider:disabled::-ms-thumb{background-color:GrayText}.win-textarea,.win-textbox{border-color:ButtonText;color:ButtonText}.win-textarea:active,.win-textarea:focus,.win-textarea:hover,.win-textbox:active,.win-textbox:focus,.win-textbox:hover{border-color:Highlight}.win-textarea:disabled,.win-textbox:disabled{border-color:GrayText;color:GrayText}.win-textarea:-ms-input-placeholder,.win-textbox:-ms-input-placeholder{color:WindowText}.win-textarea::-ms-input-placeholder,.win-textbox::-ms-input-placeholder{color:WindowText}.win-textarea:disabled:-ms-input-placeholder,.win-textbox:disabled:-ms-input-placeholder{color:GrayText}.win-textarea:disabled::-ms-input-placeholder,.win-textbox:disabled::-ms-input-placeholder{color:GrayText}.win-textbox::-ms-clear,.win-textbox::-ms-reveal{background-color:ButtonFace;color:ButtonText}.win-textbox::-ms-clear:hover,.win-textbox::-ms-reveal:hover{color:Highlight}.win-textbox::-ms-clear:active,.win-textbox::-ms-reveal:active{background-color:Highlight;color:HighlightText}.win-toggleswitch-pressed .win-toggleswitch-thumb,.win-toggleswitch-thumb{background-color:HighlightText}.win-toggleswitch-header,.win-toggleswitch-value{color:HighlightText}.win-toggleswitch-off .win-toggleswitch-track{border-color:HighlightText}.win-toggleswitch-pressed .win-toggleswitch-track{border-color:Highlight;background-color:Highlight}.win-toggleswitch-disabled .win-toggleswitch-header,.win-toggleswitch-disabled .win-toggleswitch-value{color:GrayText}.win-toggleswitch-disabled .win-toggleswitch-thumb{background-color:GrayText}.win-toggleswitch-disabled .win-toggleswitch-track{border-color:GrayText}.win-toggleswitch-on .win-toggleswitch-thumb{background-color:HighlightText}.win-toggleswitch-on .win-toggleswitch-track{border-color:HighlightText}.win-toggleswitch-on.win-toggleswitch-pressed .win-toggleswitch-track{background-color:Highlight}.win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-thumb{background-color:Background}.win-toggleswitch-on.win-toggleswitch-disabled .win-toggleswitch-track{background-color:GrayText;border-color:GrayText}.win-toggleswitch-off.win-toggleswitch-enabled:not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-thumb,.win-toggleswitch-on.win-toggleswitch-enabled:not(.win-toggleswitch-pressed) .win-toggleswitch-track{background-color:Highlight}.win-toggleswitch-enabled .win-toggleswitch-clickregion:hover .win-toggleswitch-track{border-color:Highlight}.win-pivot .win-pivot-title{color:WindowText}.win-pivot .win-pivot-navbutton{background-color:Highlight;color:HighlightText}.win-pivot .win-pivot-navbutton.win-pivot-navbutton:hover:active{color:HighlightText}.win-pivot button.win-pivot-header{color:HighlightText;background-color:transparent}.win-pivot button.win-pivot-header.win-pivot-header:hover:active,.win-pivot button.win-pivot-header:focus{color:HighlightText}.win-pivot button.win-pivot-header.win-pivot-header-selected{color:HighlightText;background-color:Highlight}.win-pivot-header[disabled]{color:GrayText}.win-commandimage,button:enabled:active .win-commandimage,button:enabled:hover:active .win-commandimage{color:ButtonText}.win-overlay{outline:0}hr.win-command{background-color:ButtonText}button.win-command,div.win-command{border-color:transparent;background-color:transparent}button.win-command:hover:active,div.win-command:hover:active{border-color:transparent}button:enabled.win-command.win-command.win-keyboard:hover:focus,button:enabled.win-command.win-keyboard:focus,div.win-command.win-command.win-keyboard:hover:focus,div.win-command.win-keyboard:focus{border-color:ButtonText}button.win-command.win-command:enabled:active,button.win-command.win-command:enabled:hover:active{background-color:Highlight;color:ButtonText}button:disabled .win-commandimage,button:disabled:active .win-commandimage{color:GrayText}button .win-label,button[aria-checked=true]:enabled .win-commandimage,button[aria-checked=true]:enabled .win-label,button[aria-checked=true]:enabled:hover:active .win-commandimage.win-commandimage{color:ButtonText}button[aria-checked=true]:-ms-keyboard-active .win-commandimage{color:ButtonText}button[aria-checked=true].win-command:before{opacity:1}button.win-command:enabled:-ms-keyboard-active{background-color:Highlight;color:ButtonText}button[aria-checked=true].win-command:enabled:hover:active{background-color:transparent}button.win-command:disabled,button.win-command:disabled:hover:active{background-color:transparent;border-color:transparent}button.win-command:disabled .win-label,button.win-command:disabled:active .win-label{color:GrayText}.win-navbar{background-color:ButtonFace;border-color:Highlight}.win-navbar.win-menulayout .win-navbar-menu,.win-navbar.win-menulayout .win-toolbar{background-color:inherit}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton{background-color:transparent;outline:0;border-color:transparent}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:-ms-keyboard-active{background-color:transparent}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled .win-navbar-ellipsis{color:ButtonText}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:enabled.win-keyboard:focus{border-color:ButtonText}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:active,.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled:hover:active{background-color:transparent}.win-navbar button.win-navbar-invokebutton.win-navbar-invokebutton:disabled .win-navbar-ellipsis{color:GrayText}.win-menu button,.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis,.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active .win-navbar-ellipsis{color:ButtonText}.win-navbar.win-navbar-closed button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-navbar.win-navbar-closing button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-navbar.win-navbar-opened button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active,.win-navbar.win-navbar-opening button.win-navbar-invokebutton.win-navbar-invokebutton:enabled:hover:active{background-color:Highlight}.win-flyout,.win-settingsflyout{background-color:ButtonFace}.win-menu button{background-color:transparent}.win-menu button.win-command.win-command:enabled:hover:active,.win-menu button[aria-checked=true].win-command.win-command:enabled:hover:active{background-color:Highlight;color:ButtonText}.win-menu-containsflyoutcommand button.win-command-flyout-activated:before{opacity:.4}.win-menu button[aria-checked=true].win-command:before{background-color:transparent;border-color:transparent}.win-menu button:disabled,.win-menu button:disabled:active{background-color:transparent;color:GrayText}button[aria-checked=true].win-command:before{border-color:Highlight;background-color:Highlight}.win-commandingsurface .win-commandingsurface-actionarea,.win-commandingsurface .win-commandingsurface-overflowarea{background-color:ButtonFace}.win-commandingsurface button.win-commandingsurface-overflowbutton{background-color:ButtonFace;border-color:transparent}.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled:-ms-keyboard-active{background-color:ButtonFace}.win-commandingsurface button.win-commandingsurface-overflowbutton:enabled .win-commandingsurface-ellipsis{color:ButtonText}.win-commandingsurface button.win-commandingsurface-overflowbutton.win-keyboard:focus{border-color:ButtonText}.win-commandingsurface button.win-commandingsurface-overflowbutton.win-commandingsurface-overflowbutton:hover:active{background-color:Highlight}.win-commandingsurface .win-commandingsurface-overflowarea button:enabled.win-command:hover:active{color:ButtonText;background-color:Highlight}.win-commandingsurface.win-commandingsurface-opened .win-commandingsurface-insetoutline{display:block;border:1px solid ButtonText;pointer-events:none;background-color:transparent;z-index:1;position:absolute;top:0;left:0;height:calc(100% - 2px);width:calc(100% - 2px)}.win-commandingsurface.win-commandingsurface-closed .win-commandingsurface-insetoutline,.win-commandingsurface.win-commandingsurface-closing .win-commandingsurface-insetoutline,.win-commandingsurface.win-commandingsurface-opening .win-commandingsurface-insetoutline{display:none}.win-contentdialog-dialog{background-color:Window}.win-contentdialog-content,.win-contentdialog-title{color:WindowText}.win-contentdialog-backgroundoverlay{background-color:Window;opacity:.6}.win-splitview-pane{background-color:ButtonFace}.win-splitview.win-splitview-pane-opened .win-splitview-paneoutline{display:block;border-color:ButtonText}.win-splitview.win-splitview-animating .win-splitview-paneoutline{display:none}button.win-splitviewpanetoggle{color:ButtonText;background-color:transparent}button.win-splitviewpanetoggle.win-splitviewpanetoggle:active:hover,button.win-splitviewpanetoggle:active{color:ButtonText;background-color:Highlight}button.win-splitviewpanetoggle.win-keyboard:focus{border:1px dotted ButtonText}button.win-splitviewpanetoggle.win-splitviewpanetoggle:disabled:hover,button.win-splitviewpanetoggle:disabled,button.win-splitviewpanetoggle:disabled:active{color:GrayText;background-color:transparent}html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable button.win-command:enabled:hover,html.win-hoverable button.win-command:enabled:hover .win-commandglyph,html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover .win-commandingsurface-ellipsis,html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis,html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover .win-navbar-ellipsis{color:HighlightText}html.win-hoverable .win-navbar button.win-navbar-invokebutton:disabled:hover,html.win-hoverable .win-navbar button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar button.win-navbar-invokebutton:disabled:hover,html.win-hoverable.win-navbar button.win-navbar-invokebutton:enabled:hover{background-color:transparent}html.win-hoverable .win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,html.win-hoverable .win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover,html.win-hoverable button.win-command:enabled:hover,html.win-hoverable.win-navbar.win-navbar-closed button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar.win-navbar-closing button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar.win-navbar-opened button.win-navbar-invokebutton:enabled:hover,html.win-hoverable.win-navbar.win-navbar-opening button.win-navbar-invokebutton:enabled:hover{background-color:Highlight}html.win-hoverable .win-menu button.win-command:enabled:hover{background-color:Highlight;color:HighlightText}html.win-hoverable button[aria-checked=true].win-command:hover{background-color:transparent}html.win-hoverable button:enabled[aria-checked=true].win-command:hover:active:before,html.win-hoverable button:enabled[aria-checked=true].win-command:hover:before{opacity:1}html.win-hoverable .win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,html.win-hoverable .win-commandingsurface button.win-commandingsurface-overflowbutton:hover,html.win-hoverable.win-commandingsurface .win-commandingsurface-overflowarea button.win-command:hover,html.win-hoverable.win-commandingsurface button.win-commandingsurface-overflowbutton:hover{background-color:Highlight}html.win-hoverable button.win-splitviewpanetoggle:hover{color:ButtonText;background-color:Highlight}}
\ No newline at end of file
diff --git a/node_modules/winjs/fonts/Symbols.ttf b/node_modules/winjs/fonts/Symbols.ttf
deleted file mode 100644
index ad24323..0000000
--- a/node_modules/winjs/fonts/Symbols.ttf
+++ /dev/null
Binary files differ
diff --git a/node_modules/winjs/js/WinJS.intellisense-setup.js b/node_modules/winjs/js/WinJS.intellisense-setup.js
deleted file mode 100644
index e506887..0000000
--- a/node_modules/winjs/js/WinJS.intellisense-setup.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/* global intellisense, window */
-(function () {
-    "use strict";
-
-    var redirect = intellisense.redirectDefinition;
-
-    var originalKeys = Object.keys;
-    function baseKeys(o) {
-        var values = Object.getOwnPropertyNames(o);
-        for (var i = 0, len = values.length; i < len; ++i) {
-            if (values[i].substr(0, 7) === "_$field") { return values; }
-        }
-        return originalKeys(o);
-    }
-    Object.keys = baseKeys;
-
-    redirect(baseKeys, originalKeys);
-
-    window._$originalAddEventListener = window.addEventListener;
-    function addEventListener(type, handler, useCapture) {
-        if (typeof (type) === "string" && (type === "pointerdown" || type === "keydown")) {
-            handler = function () { };
-        }
-        return window._$originalAddEventListener(type, handler, useCapture);
-    }
-    window.addEventListener = addEventListener;
-
-    redirect(addEventListener, window._$originalAddEventListener);
-})();
\ No newline at end of file
diff --git a/node_modules/winjs/js/WinJS.intellisense.js b/node_modules/winjs/js/WinJS.intellisense.js
deleted file mode 100644
index 587dbad..0000000
--- a/node_modules/winjs/js/WinJS.intellisense.js
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/* global intellisense, window, document, setTimeout, WinJS */
-(function () {
-    "use strict";
-    var redirect = intellisense.redirectDefinition;
-
-    function makeAllEnumerable(v) {
-        /// <param name="v" type="Object" />
-        if (v && typeof v === "object") {
-            Object.getOwnPropertyNames(v).forEach(function (name) {
-                var pd = Object.getOwnPropertyDescriptor(v, name);
-                if (!pd.enumerable && pd.configurable) {
-                    pd.enumerable = true;
-                    Object.defineProperty(v, name, pd);
-                }
-            });
-        }
-        return v;
-    }
-
-    function wrap(old) {
-        /// <param name="old" type="Function" />
-        var wrapper = function () {
-            var args = [];
-            for (var i = 0, len = arguments.length; i < len; i++) {
-                args.push(makeAllEnumerable(arguments[i]));
-            }
-            return old.apply(this, args);
-        };
-        redirect(wrapper, old);
-        return wrapper;
-    }
-
-    function wrapAllMethods(v) {
-        /// <param name="v" type="Object" />
-        if (v) {
-            Object.getOwnPropertyNames(v).forEach(function (name) {
-                var value = v[name];
-                if (typeof value === "function") {
-                    v[name] = wrap(value);
-                }
-            });
-        }
-        return v;
-    }
-
-    if (this.WinJS) {
-        wrapAllMethods(WinJS.Namespace);
-        wrapAllMethods(WinJS.Class);
-    }
-
-    (function () {
-        var originalApplicationStart = WinJS.Application.start;
-        WinJS.Application.start = function () {
-            // Call app.stop() when execution completes to ensure that the subsequent calls to app.start() do not see the app as running.
-            var app = this;
-            setTimeout(function () {
-                app.stop();
-            }, 0);
-            return originalApplicationStart.apply(this, arguments);
-        };
-        redirect(WinJS.Application.start, originalApplicationStart);
-
-        var originalPagesDefine = WinJS.UI.Pages.define;
-        WinJS.UI.Pages.define = function (uri, members) {
-            var result = originalPagesDefine.apply(this, arguments);
-
-            intellisense.callerDefines(result, members);
-            if (typeof uri === 'string') {
-                intellisense.declareNavigationContainer(result, "Page (" + uri + ")");
-            }
-
-            // Set the call contexts for IPageControlMembers
-            if (members) {
-                var pageInstance = new result();
-
-                if (typeof members.error === 'function') {
-                    intellisense.setCallContext(members.error, { thisArg: pageInstance, args: [new Error()] });
-                }
-                if (typeof members.init === 'function') {
-                    intellisense.setCallContext(members.init, { thisArg: pageInstance, args: [document.createElement('element'), {}] });
-                }
-                if (typeof members.load === 'function') {
-                    intellisense.setCallContext(members.load, { thisArg: pageInstance, args: [""] });
-                }
-                if (typeof members.processed === 'function') {
-                    intellisense.setCallContext(members.processed, { thisArg: pageInstance, args: [document.createElement('element'), {}] });
-                }
-                if (typeof members.ready === 'function') {
-                    intellisense.setCallContext(members.ready, { thisArg: pageInstance, args: [document.createElement('element'), {}] });
-                }
-                if (typeof members.render === 'function') {
-                    intellisense.setCallContext(members.render, { thisArg: pageInstance, args: [document.createElement('element'), {}, WinJS.Promise.wrap()] });
-                }
-            }
-
-            return result;
-        };
-        redirect(WinJS.UI.Pages.define, originalPagesDefine);
-
-        // Simulate a call to a class' instance/static methods for WinJS.Class.define
-        var originalClassDefine = WinJS.Class.define;
-        WinJS.Class.define = function (constructor, instanceMembers, staticMembers) {
-            var result = originalClassDefine.call(this, constructor, instanceMembers, staticMembers);
-            // Go through the instance members to find methods
-            if (instanceMembers) {
-                var classInstance;
-                Object.getOwnPropertyNames(instanceMembers).forEach(function (name) {
-                    var member = instanceMembers[name];
-                    if (typeof member === 'function') {
-                        intellisense.setCallContext(member, {
-                            get thisArg() {
-                                if (!classInstance) {
-                                    classInstance = new result();
-                                }
-                                return classInstance;
-                            }
-                        });
-                    }
-                });
-            }
-            // Go through the static members to find methods
-            if (staticMembers) {
-                Object.getOwnPropertyNames(staticMembers).forEach(function (name) {
-                    var member = staticMembers[name];
-                    if (typeof member === 'function') {
-                        intellisense.setCallContext(member, { thisArg: result });
-                    }
-                });
-            }
-
-            return result;
-        };
-        redirect(WinJS.Class.define, originalClassDefine);
-
-        // Define the caller location property for WinJS.Namespace.define
-        var originalNamespaceDefine = WinJS.Namespace.define;
-        WinJS.Namespace.define = function (name, members) {
-            var result = originalNamespaceDefine.call(this, name, members);
-            if (typeof name === 'string' && result) {
-                // Get the global object
-                var globalObj = (function () {
-                    return this;
-                })();
-
-                // Define the caller location of parent namespaces that haven't yet been defined
-                var path;
-                var namespaceParts = name.split(".");
-                for (var i = 0; i < namespaceParts.length - 1; i++) {
-                    path = ((i === 0) ? namespaceParts[i] : path += "." + namespaceParts[i]);
-                    var item = globalObj[path];
-                    if (item) {
-                        intellisense.callerDefines(item);
-                    }
-                }
-
-                // Define the caller location of the original namespace
-                intellisense.callerDefines(result, members);
-            }
-            return result;
-        };
-        redirect(WinJS.Namespace.define, originalNamespaceDefine);
-
-        intellisense.setCallContext(WinJS.Promise, { thisArg: {}, args: [function () { }] });
-    })();
-
-    (function () {
-        // In the language serivce all promises are completed promises. The completed promise class is private
-        // to WinJS, however, we can get access to the prototype through one of the promise instances by
-        // getting the instance's constructor's prototype.
-        var promisePrototype = WinJS.Promise.as(1).constructor.prototype;
-
-        // Setting the argument calling context of the done and then methods to be an instance of Error().
-        // The completion callback is handled in WinJS itself through a <returns> metadata comment.
-        var originalDone = promisePrototype.done;
-        promisePrototype.done = function (c, e, p) {
-            intellisense.setCallContext(e, { thisArg: this, args: [new Error()] });
-            return originalDone.apply(this, arguments);
-        };
-        redirect(promisePrototype.done, originalDone);
-
-        var originalThen = promisePrototype.then;
-        promisePrototype.then = function (c, e, p) {
-            intellisense.setCallContext(e, { thisArg: this, args: [new Error()] });
-            return originalThen.apply(this, arguments);
-        };
-        redirect(promisePrototype.then, originalThen);
-    })();
-
-    if (window._$originalAddEventListener) {
-        window.addEventListener = window._$originalAddEventListener;
-        window._$originalAddEventListener = null;
-        delete window._$originalAddEventListener;
-    }
-})();
\ No newline at end of file
diff --git a/node_modules/winjs/js/base.js b/node_modules/winjs/js/base.js
deleted file mode 100644
index c5d2451..0000000
--- a/node_modules/winjs/js/base.js
+++ /dev/null
@@ -1,26830 +0,0 @@
-
-/*! Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. */
-(function () {
-
-    var globalObject = 
-        typeof window !== 'undefined' ? window :
-        typeof self !== 'undefined' ? self :
-        typeof global !== 'undefined' ? global :
-        {};
-    (function (factory) {
-        if (typeof define === 'function' && define.amd) {
-            // amd
-            define([], factory);
-        } else {
-            globalObject.msWriteProfilerMark && msWriteProfilerMark('WinJS.4.4 4.4.2.winjs.2017.3.14 base.js,StartTM');
-            if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
-                // CommonJS
-                factory();
-            } else {
-                // No module system
-                factory(globalObject.WinJS);
-            }
-            globalObject.msWriteProfilerMark && msWriteProfilerMark('WinJS.4.4 4.4.2.winjs.2017.3.14 base.js,StopTM');
-        }
-    }(function (WinJS) {
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/*jshint ignore:start */
-var require;
-var define;
-/*jshint ignore:end */
-
-(function () {
-    "use strict";
-
-    var defined = {};
-    define = function (id, dependencies, factory) {
-        if (!Array.isArray(dependencies)) {
-            factory = dependencies;
-            dependencies = [];
-        }
-
-        var mod = {
-            dependencies: normalize(id, dependencies),
-            factory: factory
-        };
-
-        if (dependencies.indexOf('exports') !== -1) {
-            mod.exports = {};
-        }
-
-        defined[id] = mod;
-    };
-
-    // WinJS/Core depends on ./Core/_Base
-    // should return WinJS/Core/_Base
-    function normalize(id, dependencies) {
-        id = id || "";
-        var parent = id.split('/');
-        parent.pop();
-        return dependencies.map(function (dep) {
-            if (dep[0] === '.') {
-                var parts = dep.split('/');
-                var current = parent.slice(0);
-                parts.forEach(function (part) {
-                    if (part === '..') {
-                        current.pop();
-                    } else if (part !== '.') {
-                        current.push(part);
-                    }
-                });
-                return current.join('/');
-            } else {
-                return dep;
-            }
-        });
-    }
-
-    function resolve(dependencies, parent, exports) {
-        return dependencies.map(function (depName) {
-            if (depName === 'exports') {
-                return exports;
-            }
-
-            if (depName === 'require') {
-                return function (dependencies, factory) {
-                    require(normalize(parent, dependencies), factory);
-                };
-            }
-
-            var dep = defined[depName];
-            if (!dep) {
-                throw new Error("Undefined dependency: " + depName);
-            }
-
-            if (!dep.resolved) {
-                dep.resolved = load(dep.dependencies, dep.factory, depName, dep.exports);
-                if (typeof dep.resolved === "undefined") {
-                    dep.resolved = dep.exports;
-                }
-            }
-
-            return dep.resolved;
-        });
-    }
-
-    function load(dependencies, factory, parent, exports) {
-        var deps = resolve(dependencies, parent, exports);
-        if (factory && factory.apply) {
-            return factory.apply(null, deps);
-        } else {
-            return factory;
-        }
-    }
-    require = function (dependencies, factory) { //jshint ignore:line
-        if (!Array.isArray(dependencies)) {
-            dependencies = [dependencies];
-        }
-        load(dependencies, factory);
-    };
-
-
-})();
-define("amd", function(){});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Core/_WinJS',{});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Core/_Global',[], function () {
-    "use strict";
-    
-    // Appease jshint
-    /* global window, self, global */
-    
-    var globalObject =
-        typeof window !== 'undefined' ? window :
-        typeof self !== 'undefined' ? self :
-        typeof global !== 'undefined' ? global :
-        {};
-    return globalObject;
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Core/_BaseCoreUtils',[
-    './_Global'
-    ], function baseCoreUtilsInit(_Global) {
-    "use strict";
-
-    var hasWinRT = !!_Global.Windows;
-
-    function markSupportedForProcessing(func) {
-        /// <signature helpKeyword="WinJS.Utilities.markSupportedForProcessing">
-        /// <summary locid="WinJS.Utilities.markSupportedForProcessing">
-        /// Marks a function as being compatible with declarative processing, such as WinJS.UI.processAll
-        /// or WinJS.Binding.processAll.
-        /// </summary>
-        /// <param name="func" type="Function" locid="WinJS.Utilities.markSupportedForProcessing_p:func">
-        /// The function to be marked as compatible with declarative processing.
-        /// </param>
-        /// <returns type="Function" locid="WinJS.Utilities.markSupportedForProcessing_returnValue">
-        /// The input function.
-        /// </returns>
-        /// </signature>
-        func.supportedForProcessing = true;
-        return func;
-    }
-
-    return {
-        hasWinRT: hasWinRT,
-        markSupportedForProcessing: markSupportedForProcessing,
-        _setImmediate: _Global.setImmediate ? _Global.setImmediate.bind(_Global) : function (handler) {
-            _Global.setTimeout(handler, 0);
-        }
-    };
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Core/_WriteProfilerMark',[
-    './_Global'
-], function profilerInit(_Global) {
-    "use strict";
-
-    return _Global.msWriteProfilerMark || function () { };
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Core/_Base',[
-    './_WinJS',
-    './_Global',
-    './_BaseCoreUtils',
-    './_WriteProfilerMark'
-    ], function baseInit(_WinJS, _Global, _BaseCoreUtils, _WriteProfilerMark) {
-    "use strict";
-
-    function initializeProperties(target, members, prefix) {
-        var keys = Object.keys(members);
-        var isArray = Array.isArray(target);
-        var properties;
-        var i, len;
-        for (i = 0, len = keys.length; i < len; i++) {
-            var key = keys[i];
-            var enumerable = key.charCodeAt(0) !== /*_*/95;
-            var member = members[key];
-            if (member && typeof member === 'object') {
-                if (member.value !== undefined || typeof member.get === 'function' || typeof member.set === 'function') {
-                    if (member.enumerable === undefined) {
-                        member.enumerable = enumerable;
-                    }
-                    if (prefix && member.setName && typeof member.setName === 'function') {
-                        member.setName(prefix + "." + key);
-                    }
-                    properties = properties || {};
-                    properties[key] = member;
-                    continue;
-                }
-            }
-            if (!enumerable) {
-                properties = properties || {};
-                properties[key] = { value: member, enumerable: enumerable, configurable: true, writable: true };
-                continue;
-            }
-            if (isArray) {
-                target.forEach(function (target) {
-                    target[key] = member;
-                });
-            } else {
-                target[key] = member;
-            }
-        }
-        if (properties) {
-            if (isArray) {
-                target.forEach(function (target) {
-                    Object.defineProperties(target, properties);
-                });
-            } else {
-                Object.defineProperties(target, properties);
-            }
-        }
-    }
-
-    (function () {
-
-        var _rootNamespace = _WinJS;
-        if (!_rootNamespace.Namespace) {
-            _rootNamespace.Namespace = Object.create(Object.prototype);
-        }
-
-        function createNamespace(parentNamespace, name) {
-            var currentNamespace = parentNamespace || {};
-            if (name) {
-                var namespaceFragments = name.split(".");
-                if (currentNamespace === _Global && namespaceFragments[0] === "WinJS") {
-                    currentNamespace = _WinJS;
-                    namespaceFragments.splice(0, 1);
-                }
-                for (var i = 0, len = namespaceFragments.length; i < len; i++) {
-                    var namespaceName = namespaceFragments[i];
-                    if (!currentNamespace[namespaceName]) {
-                        Object.defineProperty(currentNamespace, namespaceName,
-                            { value: {}, writable: false, enumerable: true, configurable: true }
-                        );
-                    }
-                    currentNamespace = currentNamespace[namespaceName];
-                }
-            }
-            return currentNamespace;
-        }
-
-        function defineWithParent(parentNamespace, name, members) {
-            /// <signature helpKeyword="WinJS.Namespace.defineWithParent">
-            /// <summary locid="WinJS.Namespace.defineWithParent">
-            /// Defines a new namespace with the specified name under the specified parent namespace.
-            /// </summary>
-            /// <param name="parentNamespace" type="Object" locid="WinJS.Namespace.defineWithParent_p:parentNamespace">
-            /// The parent namespace.
-            /// </param>
-            /// <param name="name" type="String" locid="WinJS.Namespace.defineWithParent_p:name">
-            /// The name of the new namespace.
-            /// </param>
-            /// <param name="members" type="Object" locid="WinJS.Namespace.defineWithParent_p:members">
-            /// The members of the new namespace.
-            /// </param>
-            /// <returns type="Object" locid="WinJS.Namespace.defineWithParent_returnValue">
-            /// The newly-defined namespace.
-            /// </returns>
-            /// </signature>
-            var currentNamespace = createNamespace(parentNamespace, name);
-
-            if (members) {
-                initializeProperties(currentNamespace, members, name || "<ANONYMOUS>");
-            }
-
-            return currentNamespace;
-        }
-
-        function define(name, members) {
-            /// <signature helpKeyword="WinJS.Namespace.define">
-            /// <summary locid="WinJS.Namespace.define">
-            /// Defines a new namespace with the specified name.
-            /// </summary>
-            /// <param name="name" type="String" locid="WinJS.Namespace.define_p:name">
-            /// The name of the namespace. This could be a dot-separated name for nested namespaces.
-            /// </param>
-            /// <param name="members" type="Object" locid="WinJS.Namespace.define_p:members">
-            /// The members of the new namespace.
-            /// </param>
-            /// <returns type="Object" locid="WinJS.Namespace.define_returnValue">
-            /// The newly-defined namespace.
-            /// </returns>
-            /// </signature>
-            return defineWithParent(_Global, name, members);
-        }
-
-        var LazyStates = {
-            uninitialized: 1,
-            working: 2,
-            initialized: 3,
-        };
-
-        function lazy(f) {
-            var name;
-            var state = LazyStates.uninitialized;
-            var result;
-            return {
-                setName: function (value) {
-                    name = value;
-                },
-                get: function () {
-                    switch (state) {
-                        case LazyStates.initialized:
-                            return result;
-
-                        case LazyStates.uninitialized:
-                            state = LazyStates.working;
-                            try {
-                                _WriteProfilerMark("WinJS.Namespace._lazy:" + name + ",StartTM");
-                                result = f();
-                            } finally {
-                                _WriteProfilerMark("WinJS.Namespace._lazy:" + name + ",StopTM");
-                                state = LazyStates.uninitialized;
-                            }
-                            f = null;
-                            state = LazyStates.initialized;
-                            return result;
-
-                        case LazyStates.working:
-                            throw "Illegal: reentrancy on initialization";
-
-                        default:
-                            throw "Illegal";
-                    }
-                },
-                set: function (value) {
-                    switch (state) {
-                        case LazyStates.working:
-                            throw "Illegal: reentrancy on initialization";
-
-                        default:
-                            state = LazyStates.initialized;
-                            result = value;
-                            break;
-                    }
-                },
-                enumerable: true,
-                configurable: true,
-            };
-        }
-
-        // helper for defining AMD module members
-        function moduleDefine(exports, name, members) {
-            var target = [exports];
-            var publicNS = null;
-            if (name) {
-                publicNS = createNamespace(_Global, name);
-                target.push(publicNS);
-            }
-            initializeProperties(target, members, name || "<ANONYMOUS>");
-            return publicNS;
-        }
-
-        // Establish members of the "WinJS.Namespace" namespace
-        Object.defineProperties(_rootNamespace.Namespace, {
-
-            defineWithParent: { value: defineWithParent, writable: true, enumerable: true, configurable: true },
-
-            define: { value: define, writable: true, enumerable: true, configurable: true },
-
-            _lazy: { value: lazy, writable: true, enumerable: true, configurable: true },
-
-            _moduleDefine: { value: moduleDefine, writable: true, enumerable: true, configurable: true }
-
-        });
-
-    })();
-
-    (function () {
-
-        function define(constructor, instanceMembers, staticMembers) {
-            /// <signature helpKeyword="WinJS.Class.define">
-            /// <summary locid="WinJS.Class.define">
-            /// Defines a class using the given constructor and the specified instance members.
-            /// </summary>
-            /// <param name="constructor" type="Function" locid="WinJS.Class.define_p:constructor">
-            /// A constructor function that is used to instantiate this class.
-            /// </param>
-            /// <param name="instanceMembers" type="Object" locid="WinJS.Class.define_p:instanceMembers">
-            /// The set of instance fields, properties, and methods made available on the class.
-            /// </param>
-            /// <param name="staticMembers" type="Object" locid="WinJS.Class.define_p:staticMembers">
-            /// The set of static fields, properties, and methods made available on the class.
-            /// </param>
-            /// <returns type="Function" locid="WinJS.Class.define_returnValue">
-            /// The newly-defined class.
-            /// </returns>
-            /// </signature>
-            constructor = constructor || function () { };
-            _BaseCoreUtils.markSupportedForProcessing(constructor);
-            if (instanceMembers) {
-                initializeProperties(constructor.prototype, instanceMembers);
-            }
-            if (staticMembers) {
-                initializeProperties(constructor, staticMembers);
-            }
-            return constructor;
-        }
-
-        function derive(baseClass, constructor, instanceMembers, staticMembers) {
-            /// <signature helpKeyword="WinJS.Class.derive">
-            /// <summary locid="WinJS.Class.derive">
-            /// Creates a sub-class based on the supplied baseClass parameter, using prototypal inheritance.
-            /// </summary>
-            /// <param name="baseClass" type="Function" locid="WinJS.Class.derive_p:baseClass">
-            /// The class to inherit from.
-            /// </param>
-            /// <param name="constructor" type="Function" locid="WinJS.Class.derive_p:constructor">
-            /// A constructor function that is used to instantiate this class.
-            /// </param>
-            /// <param name="instanceMembers" type="Object" locid="WinJS.Class.derive_p:instanceMembers">
-            /// The set of instance fields, properties, and methods to be made available on the class.
-            /// </param>
-            /// <param name="staticMembers" type="Object" locid="WinJS.Class.derive_p:staticMembers">
-            /// The set of static fields, properties, and methods to be made available on the class.
-            /// </param>
-            /// <returns type="Function" locid="WinJS.Class.derive_returnValue">
-            /// The newly-defined class.
-            /// </returns>
-            /// </signature>
-            if (baseClass) {
-                constructor = constructor || function () { };
-                var basePrototype = baseClass.prototype;
-                constructor.prototype = Object.create(basePrototype);
-                _BaseCoreUtils.markSupportedForProcessing(constructor);
-                Object.defineProperty(constructor.prototype, "constructor", { value: constructor, writable: true, configurable: true, enumerable: true });
-                if (instanceMembers) {
-                    initializeProperties(constructor.prototype, instanceMembers);
-                }
-                if (staticMembers) {
-                    initializeProperties(constructor, staticMembers);
-                }
-                return constructor;
-            } else {
-                return define(constructor, instanceMembers, staticMembers);
-            }
-        }
-
-        function mix(constructor) {
-            /// <signature helpKeyword="WinJS.Class.mix">
-            /// <summary locid="WinJS.Class.mix">
-            /// Defines a class using the given constructor and the union of the set of instance members
-            /// specified by all the mixin objects. The mixin parameter list is of variable length.
-            /// </summary>
-            /// <param name="constructor" locid="WinJS.Class.mix_p:constructor">
-            /// A constructor function that is used to instantiate this class.
-            /// </param>
-            /// <returns type="Function" locid="WinJS.Class.mix_returnValue">
-            /// The newly-defined class.
-            /// </returns>
-            /// </signature>
-            constructor = constructor || function () { };
-            var i, len;
-            for (i = 1, len = arguments.length; i < len; i++) {
-                initializeProperties(constructor.prototype, arguments[i]);
-            }
-            return constructor;
-        }
-
-        // Establish members of "WinJS.Class" namespace
-        _WinJS.Namespace.define("WinJS.Class", {
-            define: define,
-            derive: derive,
-            mix: mix
-        });
-
-    })();
-
-    return {
-        Namespace: _WinJS.Namespace,
-        Class: _WinJS.Class
-    };
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Core/_ErrorFromName',[
-    './_Base'
-    ], function errorsInit(_Base) {
-    "use strict";
-
-    var ErrorFromName = _Base.Class.derive(Error, function (name, message) {
-        /// <signature helpKeyword="WinJS.ErrorFromName">
-        /// <summary locid="WinJS.ErrorFromName">
-        /// Creates an Error object with the specified name and message properties.
-        /// </summary>
-        /// <param name="name" type="String" locid="WinJS.ErrorFromName_p:name">The name of this error. The name is meant to be consumed programmatically and should not be localized.</param>
-        /// <param name="message" type="String" optional="true" locid="WinJS.ErrorFromName_p:message">The message for this error. The message is meant to be consumed by humans and should be localized.</param>
-        /// <returns type="Error" locid="WinJS.ErrorFromName_returnValue">Error instance with .name and .message properties populated</returns>
-        /// </signature>
-        this.name = name;
-        this.message = message || name;
-    }, {
-        /* empty */
-    }, {
-        supportedForProcessing: false,
-    });
-
-    _Base.Namespace.define("WinJS", {
-        // ErrorFromName establishes a simple pattern for returning error codes.
-        //
-        ErrorFromName: ErrorFromName
-    });
-
-    return ErrorFromName;
-
-});
-
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Core/_WinRT',[
-    'exports',
-    './_Global',
-    './_Base',
-], function winrtInit(exports, _Global, _Base) {
-    "use strict";
-
-    exports.msGetWeakWinRTProperty = _Global.msGetWeakWinRTProperty;
-    exports.msSetWeakWinRTProperty = _Global.msSetWeakWinRTProperty;
-
-    var APIs = [
-        "Windows.ApplicationModel.DesignMode.designModeEnabled",
-        "Windows.ApplicationModel.Resources.Core.ResourceContext",
-        "Windows.ApplicationModel.Resources.Core.ResourceManager",
-        "Windows.ApplicationModel.Search.SearchQueryLinguisticDetails",
-        "Windows.Data.Text.SemanticTextQuery",
-        "Windows.Foundation.Collections.CollectionChange",
-        "Windows.Foundation.Diagnostics",
-        "Windows.Foundation.Uri",
-        "Windows.Globalization.ApplicationLanguages",
-        "Windows.Globalization.Calendar",
-        "Windows.Globalization.DateTimeFormatting",
-        "Windows.Globalization.Language",
-        "Windows.Phone.UI.Input.HardwareButtons",
-        "Windows.Storage.ApplicationData",
-        "Windows.Storage.CreationCollisionOption",
-        "Windows.Storage.BulkAccess.FileInformationFactory",
-        "Windows.Storage.FileIO",
-        "Windows.Storage.FileProperties.ThumbnailType",
-        "Windows.Storage.FileProperties.ThumbnailMode",
-        "Windows.Storage.FileProperties.ThumbnailOptions",
-        "Windows.Storage.KnownFolders",
-        "Windows.Storage.Search.FolderDepth",
-        "Windows.Storage.Search.IndexerOption",
-        "Windows.Storage.Streams.RandomAccessStreamReference",
-        "Windows.UI.ApplicationSettings.SettingsEdgeLocation",
-        "Windows.UI.ApplicationSettings.SettingsCommand",
-        "Windows.UI.ApplicationSettings.SettingsPane",
-        "Windows.UI.Core.AnimationMetrics",
-        "Windows.UI.Core.SystemNavigationManager",
-        "Windows.UI.Input.EdgeGesture",
-        "Windows.UI.Input.EdgeGestureKind",
-        "Windows.UI.Input.PointerPoint",
-        "Windows.UI.ViewManagement.HandPreference",
-        "Windows.UI.ViewManagement.InputPane",
-        "Windows.UI.ViewManagement.UIColorType",
-        "Windows.UI.ViewManagement.UISettings",
-        "Windows.UI.WebUI.Core.WebUICommandBar",
-        "Windows.UI.WebUI.Core.WebUICommandBarBitmapIcon",
-        "Windows.UI.WebUI.Core.WebUICommandBarClosedDisplayMode",
-        "Windows.UI.WebUI.Core.WebUICommandBarIconButton",
-        "Windows.UI.WebUI.Core.WebUICommandBarSymbolIcon",
-        "Windows.UI.WebUI.WebUIApplication",
-    ];
-
-    // If getForCurrentView fails, it is an indication that we are running in a WebView without
-    // a CoreWindow where some WinRT APIs are not available. In this case, we just treat it as
-    // if no WinRT APIs are available.
-    var isCoreWindowAvailable = false;
-    try {
-        _Global.Windows.UI.ViewManagement.InputPane.getForCurrentView();
-        isCoreWindowAvailable = true;
-    } catch (e) { }
-
-    APIs.forEach(function (api) {
-        var parts = api.split(".");
-        var leaf = {};
-        leaf[parts[parts.length - 1]] = {
-            get: function () {
-                if (isCoreWindowAvailable) {
-                    return parts.reduce(function (current, part) { return current ? current[part] : null; }, _Global);
-                } else {
-                    return null;
-                }
-            }
-        };
-        _Base.Namespace.defineWithParent(exports, parts.slice(0, -1).join("."), leaf);
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Core/_Events',[
-    'exports',
-    './_Base'
-    ], function eventsInit(exports, _Base) {
-    "use strict";
-
-
-    function createEventProperty(name) {
-        var eventPropStateName = "_on" + name + "state";
-
-        return {
-            get: function () {
-                var state = this[eventPropStateName];
-                return state && state.userHandler;
-            },
-            set: function (handler) {
-                var state = this[eventPropStateName];
-                if (handler) {
-                    if (!state) {
-                        state = { wrapper: function (evt) { return state.userHandler(evt); }, userHandler: handler };
-                        Object.defineProperty(this, eventPropStateName, { value: state, enumerable: false, writable:true, configurable: true });
-                        this.addEventListener(name, state.wrapper, false);
-                    }
-                    state.userHandler = handler;
-                } else if (state) {
-                    this.removeEventListener(name, state.wrapper, false);
-                    this[eventPropStateName] = null;
-                }
-            },
-            enumerable: true
-        };
-    }
-
-    function createEventProperties() {
-        /// <signature helpKeyword="WinJS.Utilities.createEventProperties">
-        /// <summary locid="WinJS.Utilities.createEventProperties">
-        /// Creates an object that has one property for each name passed to the function.
-        /// </summary>
-        /// <param name="events" locid="WinJS.Utilities.createEventProperties_p:events">
-        /// A variable list of property names.
-        /// </param>
-        /// <returns type="Object" locid="WinJS.Utilities.createEventProperties_returnValue">
-        /// The object with the specified properties. The names of the properties are prefixed with 'on'.
-        /// </returns>
-        /// </signature>
-        var props = {};
-        for (var i = 0, len = arguments.length; i < len; i++) {
-            var name = arguments[i];
-            props["on" + name] = createEventProperty(name);
-        }
-        return props;
-    }
-
-    var EventMixinEvent = _Base.Class.define(
-        function EventMixinEvent_ctor(type, detail, target) {
-            this.detail = detail;
-            this.target = target;
-            this.timeStamp = Date.now();
-            this.type = type;
-        },
-        {
-            bubbles: { value: false, writable: false },
-            cancelable: { value: false, writable: false },
-            currentTarget: {
-                get: function () { return this.target; }
-            },
-            defaultPrevented: {
-                get: function () { return this._preventDefaultCalled; }
-            },
-            trusted: { value: false, writable: false },
-            eventPhase: { value: 0, writable: false },
-            target: null,
-            timeStamp: null,
-            type: null,
-
-            preventDefault: function () {
-                this._preventDefaultCalled = true;
-            },
-            stopImmediatePropagation: function () {
-                this._stopImmediatePropagationCalled = true;
-            },
-            stopPropagation: function () {
-            }
-        }, {
-            supportedForProcessing: false,
-        }
-    );
-
-    var eventMixin = {
-        _listeners: null,
-
-        addEventListener: function (type, listener, useCapture) {
-            /// <signature helpKeyword="WinJS.Utilities.eventMixin.addEventListener">
-            /// <summary locid="WinJS.Utilities.eventMixin.addEventListener">
-            /// Adds an event listener to the control.
-            /// </summary>
-            /// <param name="type" locid="WinJS.Utilities.eventMixin.addEventListener_p:type">
-            /// The type (name) of the event.
-            /// </param>
-            /// <param name="listener" locid="WinJS.Utilities.eventMixin.addEventListener_p:listener">
-            /// The listener to invoke when the event is raised.
-            /// </param>
-            /// <param name="useCapture" locid="WinJS.Utilities.eventMixin.addEventListener_p:useCapture">
-            /// if true initiates capture, otherwise false.
-            /// </param>
-            /// </signature>
-            useCapture = useCapture || false;
-            this._listeners = this._listeners || {};
-            var eventListeners = (this._listeners[type] = this._listeners[type] || []);
-            for (var i = 0, len = eventListeners.length; i < len; i++) {
-                var l = eventListeners[i];
-                if (l.useCapture === useCapture && l.listener === listener) {
-                    return;
-                }
-            }
-            eventListeners.push({ listener: listener, useCapture: useCapture });
-        },
-        dispatchEvent: function (type, details) {
-            /// <signature helpKeyword="WinJS.Utilities.eventMixin.dispatchEvent">
-            /// <summary locid="WinJS.Utilities.eventMixin.dispatchEvent">
-            /// Raises an event of the specified type and with the specified additional properties.
-            /// </summary>
-            /// <param name="type" locid="WinJS.Utilities.eventMixin.dispatchEvent_p:type">
-            /// The type (name) of the event.
-            /// </param>
-            /// <param name="details" locid="WinJS.Utilities.eventMixin.dispatchEvent_p:details">
-            /// The set of additional properties to be attached to the event object when the event is raised.
-            /// </param>
-            /// <returns type="Boolean" locid="WinJS.Utilities.eventMixin.dispatchEvent_returnValue">
-            /// true if preventDefault was called on the event.
-            /// </returns>
-            /// </signature>
-            var listeners = this._listeners && this._listeners[type];
-            if (listeners) {
-                var eventValue = new EventMixinEvent(type, details, this);
-                // Need to copy the array to protect against people unregistering while we are dispatching
-                listeners = listeners.slice(0, listeners.length);
-                for (var i = 0, len = listeners.length; i < len && !eventValue._stopImmediatePropagationCalled; i++) {
-                    listeners[i].listener(eventValue);
-                }
-                return eventValue.defaultPrevented || false;
-            }
-            return false;
-        },
-        removeEventListener: function (type, listener, useCapture) {
-            /// <signature helpKeyword="WinJS.Utilities.eventMixin.removeEventListener">
-            /// <summary locid="WinJS.Utilities.eventMixin.removeEventListener">
-            /// Removes an event listener from the control.
-            /// </summary>
-            /// <param name="type" locid="WinJS.Utilities.eventMixin.removeEventListener_p:type">
-            /// The type (name) of the event.
-            /// </param>
-            /// <param name="listener" locid="WinJS.Utilities.eventMixin.removeEventListener_p:listener">
-            /// The listener to remove.
-            /// </param>
-            /// <param name="useCapture" locid="WinJS.Utilities.eventMixin.removeEventListener_p:useCapture">
-            /// Specifies whether to initiate capture.
-            /// </param>
-            /// </signature>
-            useCapture = useCapture || false;
-            var listeners = this._listeners && this._listeners[type];
-            if (listeners) {
-                for (var i = 0, len = listeners.length; i < len; i++) {
-                    var l = listeners[i];
-                    if (l.listener === listener && l.useCapture === useCapture) {
-                        listeners.splice(i, 1);
-                        if (listeners.length === 0) {
-                            delete this._listeners[type];
-                        }
-                        // Only want to remove one element for each call to removeEventListener
-                        break;
-                    }
-                }
-            }
-        }
-    };
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Utilities", {
-        _createEventProperty: createEventProperty,
-        createEventProperties: createEventProperties,
-        eventMixin: eventMixin
-    });
-
-});
-
-
-define('require-json',{load: function(id){throw new Error("Dynamic load not allowed: " + id);}});
-
-define('require-json!strings/en-us/Microsoft.WinJS.resjson',{
-    "tv/scrollViewerPageDown": "Page Down",
-    "tv/scrollViewerPageUp": "Page Up",
-    "ui/appBarAriaLabel": "App Bar",
-    "ui/appBarCommandAriaLabel": "App Bar Item",
-    "ui/appBarOverflowButtonAriaLabel": "View more",
-    "ui/autoSuggestBoxAriaLabel": "Autosuggestbox",
-    "ui/autoSuggestBoxAriaLabelInputNoPlaceHolder": "Autosuggestbox, enter to submit query, esc to clear text",
-    "ui/autoSuggestBoxAriaLabelInputPlaceHolder": "Autosuggestbox, {0}, enter to submit query, esc to clear text",
-    "ui/autoSuggestBoxAriaLabelQuery": "Suggestion: {0}",
-    "_ui/autoSuggestBoxAriaLabelQuery.comment": "Suggestion: query text (example: Suggestion: contoso)",
-    "ui/autoSuggestBoxAriaLabelSeparator": "Separator: {0}",
-    "_ui/autoSuggestBoxAriaLabelSeparator.comment": "Separator: separator text (example: Separator: People or Separator: Apps)",
-    "ui/autoSuggestBoxAriaLabelResult": "Result: {0}, {1}",
-    "_ui/autoSuggestBoxAriaLabelResult.comment": "Result: text, detailed text (example: Result: contoso, www.contoso.com)",
-    "ui/averageRating": "Average Rating",
-    "ui/backbuttonarialabel": "Back",
-    "ui/chapterSkipBackMediaCommandDisplayText": "Chapter back",
-    "ui/chapterSkipForwardMediaCommandDisplayText": "Chapter forward",
-    "ui/clearYourRating": "Clear your rating",
-    "ui/closedCaptionsLabelNone": "Off",
-    "ui/closedCaptionsMediaCommandDisplayText": "Closed captioning",
-    "ui/closeOverlay": "Close",
-    "ui/commandingSurfaceAriaLabel": "CommandingSurface",
-    "ui/commandingSurfaceOverflowButtonAriaLabel": "View more",
-    "ui/datePicker": "Date Picker",
-    "ui/fastForwardMediaCommandDisplayText": "Fast forward",
-    "ui/fastForwardFeedbackDisplayText": " {0}X",
-    "ui/fastForwardFeedbackSlowMotionDisplayText": "0.5X",
-    "ui/flipViewPanningContainerAriaLabel": "Scrolling Container",
-    "ui/flyoutAriaLabel": "Flyout",
-    "ui/goToFullScreenButtonLabel": "Go full screen",
-    "ui/goToLiveMediaCommandDisplayText": "LIVE",
-    "ui/hubViewportAriaLabel": "Scrolling Container",
-    "ui/listViewViewportAriaLabel": "Scrolling Container",
-    "ui/mediaErrorAborted": "Playback was interrupted. Please try again.",
-    "ui/mediaErrorNetwork": "There was a network connection error.",
-    "ui/mediaErrorDecode": "The content could not be decoded",
-    "ui/mediaErrorSourceNotSupported": "This content type is not supported.",
-    "ui/mediaErrorUnknown": "There was an unknown error.",
-    "ui/mediaPlayerAudioTracksButtonLabel": "Audio tracks",
-    "ui/mediaPlayerCastButtonLabel": "Cast",
-    "ui/mediaPlayerChapterSkipBackButtonLabel": "Previous",
-    "ui/mediaPlayerChapterSkipForwardButtonLabel": "Next",
-    "ui/mediaPlayerClosedCaptionsButtonLabel": "Closed captions",
-    "ui/mediaPlayerFastForwardButtonLabel": "Fast forward",
-    "ui/mediaPlayerFullscreenButtonLabel": "Fullscreen",
-    "ui/mediaPlayerLiveButtonLabel": "LIVE",
-    "ui/mediaPlayerNextTrackButtonLabel": "Next",
-    "ui/mediaPlayerOverlayActiveOptionIndicator": "(On)",
-    "ui/mediaPlayerPauseButtonLabel": "Pause",
-    "ui/mediaPlayerPlayButtonLabel": "Play",
-    "ui/mediaPlayerPlayFromBeginningButtonLabel": "Replay",
-    "ui/mediaPlayerPlayRateButtonLabel": "Playback rate",
-    "ui/mediaPlayerPreviousTrackButtonLabel": "Previous",
-    "ui/mediaPlayerRewindButtonLabel": "Rewind",
-    "ui/mediaPlayerStopButtonLabel": "Stop",
-    "ui/mediaPlayerTimeSkipBackButtonLabel": "8 second replay",   
-    "ui/mediaPlayerTimeSkipForwardButtonLabel": "30 second skip",
-    "ui/mediaPlayerToggleSnapButtonLabel": "Snap",
-    "ui/mediaPlayerVolumeButtonLabel": "Volume",
-    "ui/mediaPlayerZoomButtonLabel": "Zoom",
-    "ui/menuCommandAriaLabel": "Menu Item",
-    "ui/menuAriaLabel": "Menu",
-    "ui/navBarContainerViewportAriaLabel": "Scrolling Container",
-    "ui/nextTrackMediaCommandDisplayText": "Next track",
-    "ui/off": "Off",
-    "ui/on": "On",
-    "ui/pauseMediaCommandDisplayText": "Pause",
-    "ui/playFromBeginningMediaCommandDisplayText": "Play again",
-    "ui/playbackRateHalfSpeedLabel": "0.5x",
-    "ui/playbackRateNormalSpeedLabel": "Normal",
-    "ui/playbackRateOneAndHalfSpeedLabel": "1.5x",
-    "ui/playbackRateDoubleSpeedLabel": "2x",
-    "ui/playMediaCommandDisplayText": "Play",
-    "ui/pivotAriaLabel": "Pivot",
-    "ui/pivotViewportAriaLabel": "Scrolling Container",
-    "ui/replayMediaCommandDisplayText": "Play again",
-    "ui/rewindMediaCommandDisplayText": "Rewind",
-    "ui/rewindFeedbackDisplayText": " {0}X",
-    "ui/rewindFeedbackSlowMotionDisplayText": "0.5X",
-    "ui/searchBoxAriaLabel": "Searchbox",
-    "ui/searchBoxAriaLabelInputNoPlaceHolder": "Searchbox, enter to submit query, esc to clear text",
-    "ui/searchBoxAriaLabelInputPlaceHolder": "Searchbox, {0}, enter to submit query, esc to clear text",
-    "ui/searchBoxAriaLabelButton": "Click to submit query",
-    "ui/seeMore":  "See more",
-    "ui/selectAMPM": "Select A.M P.M",
-    "ui/selectDay": "Select Day",
-    "ui/selectHour": "Select Hour",
-    "ui/selectMinute": "Select Minute",
-    "ui/selectMonth": "Select Month",
-    "ui/selectYear": "Select Year",
-    "ui/settingsFlyoutAriaLabel": "Settings Flyout",
-    "ui/stopMediaCommandDisplayText": "Stop",
-    "ui/tentativeRating": "Tentative Rating",
-    "ui/timePicker": "Time Picker",
-    "ui/timeSeparator": ":",
-    "ui/timeSkipBackMediaCommandDisplayText": "Skip back",
-    "ui/timeSkipForwardMediaCommandDisplayText": "Skip forward",
-    "ui/toolbarAriaLabel": "ToolBar",
-    "ui/toolbarOverflowButtonAriaLabel": "View more",
-    "ui/unrated": "Unrated",
-    "ui/userRating": "User Rating",
-    "ui/zoomMediaCommandDisplayText": "Zoom",
-    // AppBar Icons follow, the format of the ui.js and ui.resjson differ for
-    // the AppBarIcon namespace.  The remainder of the file therefore differs.
-    // Code point comments are the icon glyphs in the 'Segoe UI Symbol' font.
-    "ui/appBarIcons/previous":                            "\uE100", // group:Media
-    "_ui/appBarIcons/previous.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/next":                                "\uE101", // group:Media
-    "_ui/appBarIcons/next.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/play":                                "\uE102", // group:Media
-    "_ui/appBarIcons/play.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/pause":                               "\uE103", // group:Media
-    "_ui/appBarIcons/pause.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/edit":                                "\uE104", // group:File
-    "_ui/appBarIcons/edit.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/save":                                "\uE105", // group:File
-    "_ui/appBarIcons/save.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/clear":                               "\uE106", // group:File
-    "_ui/appBarIcons/clear.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/delete":                              "\uE107", // group:File
-    "_ui/appBarIcons/delete.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/remove":                              "\uE108", // group:File
-    "_ui/appBarIcons/remove.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/add":                                 "\uE109", // group:File
-    "_ui/appBarIcons/add.comment":                        "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/cancel":                              "\uE10A", // group:Editing
-    "_ui/appBarIcons/cancel.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/accept":                              "\uE10B", // group:General
-    "_ui/appBarIcons/accept.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/more":                                "\uE10C", // group:General
-    "_ui/appBarIcons/more.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/redo":                                "\uE10D", // group:Editing
-    "_ui/appBarIcons/redo.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/undo":                                "\uE10E", // group:Editing
-    "_ui/appBarIcons/undo.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/home":                                "\uE10F", // group:General
-    "_ui/appBarIcons/home.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/up":                                  "\uE110", // group:General
-    "_ui/appBarIcons/up.comment":                         "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/forward":                             "\uE111", // group:General
-    "_ui/appBarIcons/forward.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/right":                               "\uE111", // group:General
-    "_ui/appBarIcons/right.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/back":                                "\uE112", // group:General
-    "_ui/appBarIcons/back.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/left":                                "\uE112", // group:General
-    "_ui/appBarIcons/left.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/favorite":                            "\uE113", // group:Media
-    "_ui/appBarIcons/favorite.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/camera":                              "\uE114", // group:System
-    "_ui/appBarIcons/camera.comment":                     "{Locked=qps-ploc,qps-plocm}",    
-    "ui/appBarIcons/settings":                            "\uE115", // group:System
-    "_ui/appBarIcons/settings.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/video":                               "\uE116", // group:Media
-    "_ui/appBarIcons/video.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/sync":                                "\uE117", // group:Media
-    "_ui/appBarIcons/sync.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/download":                            "\uE118", // group:Media
-    "_ui/appBarIcons/download.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mail":                                "\uE119", // group:Mail and calendar
-    "_ui/appBarIcons/mail.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/find":                                "\uE11A", // group:Data
-    "_ui/appBarIcons/find.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/help":                                "\uE11B", // group:General
-    "_ui/appBarIcons/help.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/upload":                              "\uE11C", // group:Media
-    "_ui/appBarIcons/upload.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/emoji":                               "\uE11D", // group:Communications
-    "_ui/appBarIcons/emoji.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/twopage":                             "\uE11E", // group:Layout
-    "_ui/appBarIcons/twopage.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/leavechat":                           "\uE11F", // group:Communications
-    "_ui/appBarIcons/leavechat.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mailforward":                         "\uE120", // group:Mail and calendar
-    "_ui/appBarIcons/mailforward.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/clock":                               "\uE121", // group:General
-    "_ui/appBarIcons/clock.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/send":                                "\uE122", // group:Mail and calendar
-    "_ui/appBarIcons/send.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/crop":                                "\uE123", // group:Editing
-    "_ui/appBarIcons/crop.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/rotatecamera":                        "\uE124", // group:System
-    "_ui/appBarIcons/rotatecamera.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/people":                              "\uE125", // group:Communications
-    "_ui/appBarIcons/people.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/closepane":                           "\uE126", // group:Layout
-    "_ui/appBarIcons/closepane.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/openpane":                            "\uE127", // group:Layout
-    "_ui/appBarIcons/openpane.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/world":                               "\uE128", // group:General
-    "_ui/appBarIcons/world.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/flag":                                "\uE129", // group:Mail and calendar
-    "_ui/appBarIcons/flag.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/previewlink":                         "\uE12A", // group:General
-    "_ui/appBarIcons/previewlink.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/globe":                               "\uE12B", // group:Communications
-    "_ui/appBarIcons/globe.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/trim":                                "\uE12C", // group:Editing
-    "_ui/appBarIcons/trim.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/attachcamera":                        "\uE12D", // group:System
-    "_ui/appBarIcons/attachcamera.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/zoomin":                              "\uE12E", // group:Layout
-    "_ui/appBarIcons/zoomin.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/bookmarks":                           "\uE12F", // group:Editing
-    "_ui/appBarIcons/bookmarks.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/document":                            "\uE130", // group:File
-    "_ui/appBarIcons/document.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/protecteddocument":                   "\uE131", // group:File
-    "_ui/appBarIcons/protecteddocument.comment":          "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/page":                                "\uE132", // group:Layout
-    "_ui/appBarIcons/page.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/bullets":                             "\uE133", // group:Editing
-    "_ui/appBarIcons/bullets.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/comment":                             "\uE134", // group:Communications
-    "_ui/appBarIcons/comment.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mail2":                               "\uE135", // group:Mail and calendar
-    "_ui/appBarIcons/mail2.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/contactinfo":                         "\uE136", // group:Communications
-    "_ui/appBarIcons/contactinfo.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/hangup":                              "\uE137", // group:Communications
-    "_ui/appBarIcons/hangup.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/viewall":                             "\uE138", // group:Data
-    "_ui/appBarIcons/viewall.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mappin":                              "\uE139", // group:General
-    "_ui/appBarIcons/mappin.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/phone":                               "\uE13A", // group:Communications
-    "_ui/appBarIcons/phone.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/videochat":                           "\uE13B", // group:Communications
-    "_ui/appBarIcons/videochat.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/switch":                              "\uE13C", // group:Communications
-    "_ui/appBarIcons/switch.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/contact":                             "\uE13D", // group:Communications
-    "_ui/appBarIcons/contact.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/rename":                              "\uE13E", // group:File
-    "_ui/appBarIcons/rename.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/pin":                                 "\uE141", // group:System
-    "_ui/appBarIcons/pin.comment":                        "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/musicinfo":                           "\uE142", // group:Media
-    "_ui/appBarIcons/musicinfo.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/go":                                  "\uE143", // group:General
-    "_ui/appBarIcons/go.comment":                         "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/keyboard":                            "\uE144", // group:System
-    "_ui/appBarIcons/keyboard.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/dockleft":                            "\uE145", // group:Layout
-    "_ui/appBarIcons/dockleft.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/dockright":                           "\uE146", // group:Layout
-    "_ui/appBarIcons/dockright.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/dockbottom":                          "\uE147", // group:Layout
-    "_ui/appBarIcons/dockbottom.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/remote":                              "\uE148", // group:System
-    "_ui/appBarIcons/remote.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/refresh":                             "\uE149", // group:Data
-    "_ui/appBarIcons/refresh.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/rotate":                              "\uE14A", // group:Layout
-    "_ui/appBarIcons/rotate.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/shuffle":                             "\uE14B", // group:Media
-    "_ui/appBarIcons/shuffle.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/list":                                "\uE14C", // group:Editing
-    "_ui/appBarIcons/list.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/shop":                                "\uE14D", // group:General
-    "_ui/appBarIcons/shop.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/selectall":                           "\uE14E", // group:Data
-    "_ui/appBarIcons/selectall.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/orientation":                         "\uE14F", // group:Layout
-    "_ui/appBarIcons/orientation.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/import":                              "\uE150", // group:Data
-    "_ui/appBarIcons/import.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/importall":                           "\uE151", // group:Data
-    "_ui/appBarIcons/importall.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/browsephotos":                        "\uE155", // group:Media
-    "_ui/appBarIcons/browsephotos.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/webcam":                              "\uE156", // group:System
-    "_ui/appBarIcons/webcam.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/pictures":                            "\uE158", // group:Media
-    "_ui/appBarIcons/pictures.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/savelocal":                           "\uE159", // group:File
-    "_ui/appBarIcons/savelocal.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/caption":                             "\uE15A", // group:Media
-    "_ui/appBarIcons/caption.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/stop":                                "\uE15B", // group:Media
-    "_ui/appBarIcons/stop.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/showresults":                         "\uE15C", // group:Data
-    "_ui/appBarIcons/showresults.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/volume":                              "\uE15D", // group:Media
-    "_ui/appBarIcons/volume.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/repair":                              "\uE15E", // group:System
-    "_ui/appBarIcons/repair.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/message":                             "\uE15F", // group:Communications
-    "_ui/appBarIcons/message.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/page2":                               "\uE160", // group:Layout
-    "_ui/appBarIcons/page2.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/calendarday":                         "\uE161", // group:Mail and calendar
-    "_ui/appBarIcons/calendarday.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/calendarweek":                        "\uE162", // group:Mail and calendar
-    "_ui/appBarIcons/calendarweek.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/calendar":                            "\uE163", // group:Mail and calendar
-    "_ui/appBarIcons/calendar.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/characters":                          "\uE164", // group:Editing
-    "_ui/appBarIcons/characters.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mailreplyall":                        "\uE165", // group:Mail and calendar
-    "_ui/appBarIcons/mailreplyall.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/read":                                "\uE166", // group:Mail and calendar
-    "_ui/appBarIcons/read.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/link":                                "\uE167", // group:Communications
-    "_ui/appBarIcons/link.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/accounts":                            "\uE168", // group:Communications
-    "_ui/appBarIcons/accounts.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/showbcc":                             "\uE169", // group:Mail and calendar
-    "_ui/appBarIcons/showbcc.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/hidebcc":                             "\uE16A", // group:Mail and calendar
-    "_ui/appBarIcons/hidebcc.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/cut":                                 "\uE16B", // group:Editing
-    "_ui/appBarIcons/cut.comment":                        "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/attach":                              "\uE16C", // group:Mail and calendar
-    "_ui/appBarIcons/attach.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/paste":                               "\uE16D", // group:Editing
-    "_ui/appBarIcons/paste.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/filter":                              "\uE16E", // group:Data
-    "_ui/appBarIcons/filter.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/copy":                                "\uE16F", // group:Editing
-    "_ui/appBarIcons/copy.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/emoji2":                              "\uE170", // group:Mail and calendar
-    "_ui/appBarIcons/emoji2.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/important":                           "\uE171", // group:Mail and calendar
-    "_ui/appBarIcons/important.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mailreply":                           "\uE172", // group:Mail and calendar
-    "_ui/appBarIcons/mailreply.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/slideshow":                           "\uE173", // group:Media
-    "_ui/appBarIcons/slideshow.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/sort":                                "\uE174", // group:Data
-    "_ui/appBarIcons/sort.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/manage":                              "\uE178", // group:System
-    "_ui/appBarIcons/manage.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/allapps":                             "\uE179", // group:System
-    "_ui/appBarIcons/allapps.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/disconnectdrive":                     "\uE17A", // group:System
-    "_ui/appBarIcons/disconnectdrive.comment":            "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mapdrive":                            "\uE17B", // group:System
-    "_ui/appBarIcons/mapdrive.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/newwindow":                           "\uE17C", // group:System
-    "_ui/appBarIcons/newwindow.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/openwith":                            "\uE17D", // group:System
-    "_ui/appBarIcons/openwith.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/contactpresence":                     "\uE181", // group:Communications
-    "_ui/appBarIcons/contactpresence.comment":            "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/priority":                            "\uE182", // group:Mail and calendar
-    "_ui/appBarIcons/priority.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/uploadskydrive":                      "\uE183", // group:File
-    "_ui/appBarIcons/uploadskydrive.comment":             "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/gototoday":                           "\uE184", // group:Mail and calendar
-    "_ui/appBarIcons/gototoday.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/font":                                "\uE185", // group:Editing
-    "_ui/appBarIcons/font.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/fontcolor":                           "\uE186", // group:Editing
-    "_ui/appBarIcons/fontcolor.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/contact2":                            "\uE187", // group:Communications
-    "_ui/appBarIcons/contact2.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/folder":                              "\uE188", // group:File
-    "_ui/appBarIcons/folder.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/audio":                               "\uE189", // group:Media
-    "_ui/appBarIcons/audio.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/placeholder":                         "\uE18A", // group:General
-    "_ui/appBarIcons/placeholder.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/view":                                "\uE18B", // group:Layout
-    "_ui/appBarIcons/view.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/setlockscreen":                       "\uE18C", // group:System
-    "_ui/appBarIcons/setlockscreen.comment":              "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/settile":                             "\uE18D", // group:System
-    "_ui/appBarIcons/settile.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/cc":                                  "\uE190", // group:Media
-    "_ui/appBarIcons/cc.comment":                         "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/stopslideshow":                       "\uE191", // group:Media
-    "_ui/appBarIcons/stopslideshow.comment":              "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/permissions":                         "\uE192", // group:System
-    "_ui/appBarIcons/permissions.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/highlight":                           "\uE193", // group:Editing
-    "_ui/appBarIcons/highlight.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/disableupdates":                      "\uE194", // group:System
-    "_ui/appBarIcons/disableupdates.comment":             "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/unfavorite":                          "\uE195", // group:Media
-    "_ui/appBarIcons/unfavorite.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/unpin":                               "\uE196", // group:System
-    "_ui/appBarIcons/unpin.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/openlocal":                           "\uE197", // group:File
-    "_ui/appBarIcons/openlocal.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mute":                                "\uE198", // group:Media
-    "_ui/appBarIcons/mute.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/italic":                              "\uE199", // group:Editing
-    "_ui/appBarIcons/italic.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/underline":                           "\uE19A", // group:Editing
-    "_ui/appBarIcons/underline.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/bold":                                "\uE19B", // group:Editing
-    "_ui/appBarIcons/bold.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/movetofolder":                        "\uE19C", // group:File
-    "_ui/appBarIcons/movetofolder.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/likedislike":                         "\uE19D", // group:Data
-    "_ui/appBarIcons/likedislike.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/dislike":                             "\uE19E", // group:Data
-    "_ui/appBarIcons/dislike.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/like":                                "\uE19F", // group:Data
-    "_ui/appBarIcons/like.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/alignright":                          "\uE1A0", // group:Editing
-    "_ui/appBarIcons/alignright.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/aligncenter":                         "\uE1A1", // group:Editing
-    "_ui/appBarIcons/aligncenter.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/alignleft":                           "\uE1A2", // group:Editing
-    "_ui/appBarIcons/alignleft.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/zoom":                                "\uE1A3", // group:Layout
-    "_ui/appBarIcons/zoom.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/zoomout":                             "\uE1A4", // group:Layout
-    "_ui/appBarIcons/zoomout.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/openfile":                            "\uE1A5", // group:File
-    "_ui/appBarIcons/openfile.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/otheruser":                           "\uE1A6", // group:System
-    "_ui/appBarIcons/otheruser.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/admin":                               "\uE1A7", // group:System
-    "_ui/appBarIcons/admin.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/street":                              "\uE1C3", // group:General
-    "_ui/appBarIcons/street.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/map":                                 "\uE1C4", // group:General
-    "_ui/appBarIcons/map.comment":                        "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/clearselection":                      "\uE1C5", // group:Data
-    "_ui/appBarIcons/clearselection.comment":             "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/fontdecrease":                        "\uE1C6", // group:Editing
-    "_ui/appBarIcons/fontdecrease.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/fontincrease":                        "\uE1C7", // group:Editing
-    "_ui/appBarIcons/fontincrease.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/fontsize":                            "\uE1C8", // group:Editing
-    "_ui/appBarIcons/fontsize.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/cellphone":                           "\uE1C9", // group:Communications
-    "_ui/appBarIcons/cellphone.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/print":                               "\uE749", // group:Communications
-    "_ui/appBarIcons/print.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/share":                               "\uE72D", // group:Communications
-    "_ui/appBarIcons/share.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/reshare":                             "\uE1CA", // group:Communications
-    "_ui/appBarIcons/reshare.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/tag":                                 "\uE1CB", // group:Data
-    "_ui/appBarIcons/tag.comment":                        "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/repeatone":                           "\uE1CC", // group:Media
-    "_ui/appBarIcons/repeatone.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/repeatall":                           "\uE1CD", // group:Media
-    "_ui/appBarIcons/repeatall.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/outlinestar":                         "\uE1CE", // group:Data
-    "_ui/appBarIcons/outlinestar.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/solidstar":                           "\uE1CF", // group:Data
-    "_ui/appBarIcons/solidstar.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/calculator":                          "\uE1D0", // group:General
-    "_ui/appBarIcons/calculator.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/directions":                          "\uE1D1", // group:General
-    "_ui/appBarIcons/directions.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/target":                              "\uE1D2", // group:General
-    "_ui/appBarIcons/target.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/library":                             "\uE1D3", // group:Media
-    "_ui/appBarIcons/library.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/phonebook":                           "\uE1D4", // group:Communications
-    "_ui/appBarIcons/phonebook.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/memo":                                "\uE1D5", // group:Communications
-    "_ui/appBarIcons/memo.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/microphone":                          "\uE1D6", // group:System
-    "_ui/appBarIcons/microphone.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/postupdate":                          "\uE1D7", // group:Communications
-    "_ui/appBarIcons/postupdate.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/backtowindow":                        "\uE1D8", // group:Layout
-    "_ui/appBarIcons/backtowindow.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/fullscreen":                          "\uE1D9", // group:Layout
-    "_ui/appBarIcons/fullscreen.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/newfolder":                           "\uE1DA", // group:File
-    "_ui/appBarIcons/newfolder.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/calendarreply":                       "\uE1DB", // group:Mail and calendar
-    "_ui/appBarIcons/calendarreply.comment":              "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/unsyncfolder":                        "\uE1DD", // group:File
-    "_ui/appBarIcons/unsyncfolder.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/reporthacked":                        "\uE1DE", // group:Communications
-    "_ui/appBarIcons/reporthacked.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/syncfolder":                          "\uE1DF", // group:File
-    "_ui/appBarIcons/syncfolder.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/blockcontact":                        "\uE1E0", // group:Communications
-    "_ui/appBarIcons/blockcontact.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/switchapps":                          "\uE1E1", // group:System
-    "_ui/appBarIcons/switchapps.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/addfriend":                           "\uE1E2", // group:Communications
-    "_ui/appBarIcons/addfriend.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/touchpointer":                        "\uE1E3", // group:System
-    "_ui/appBarIcons/touchpointer.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/gotostart":                           "\uE1E4", // group:System
-    "_ui/appBarIcons/gotostart.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/zerobars":                            "\uE1E5", // group:System
-    "_ui/appBarIcons/zerobars.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/onebar":                              "\uE1E6", // group:System
-    "_ui/appBarIcons/onebar.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/twobars":                             "\uE1E7", // group:System
-    "_ui/appBarIcons/twobars.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/threebars":                           "\uE1E8", // group:System
-    "_ui/appBarIcons/threebars.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/fourbars":                            "\uE1E9", // group:System
-    "_ui/appBarIcons/fourbars.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/scan":                                "\uE294", // group:General
-    "_ui/appBarIcons/scan.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/preview":                             "\uE295", // group:General
-    "_ui/appBarIcons/preview.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/hamburger":                           "\uE700", // group:General
-    "_ui/appBarIcons/hamburger.comment":                  "{Locked=qps-ploc,qps-plocm}"
-}
-);
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Core/_Resources',[
-    'exports',
-    './_Global',
-    './_WinRT',
-    './_Base',
-    './_Events',
-    'require-json!strings/en-us/Microsoft.WinJS.resjson',
-    ], function resourcesInit(exports, _Global, _WinRT, _Base, _Events, defaultStrings) {
-    "use strict";
-
-    function _getWinJSString(id) {
-        var result = getString("ms-resource:///Microsoft.WinJS/" + id);
-
-        if (result.empty) {
-            result = _getStringBuiltIn(id);
-        }
-
-        return result;
-    }
-
-    function _getStringBuiltIn(resourceId) {
-        var str = defaultStrings[resourceId];
-
-        if (typeof str === "string") {
-            str = { value: str };
-        }
-
-        return str || { value: resourceId, empty: true };
-    }
-
-    var resourceMap;
-    var mrtEventHook = false;
-    var contextChangedET = "contextchanged";
-    var resourceContext;
-
-    var ListenerType = _Base.Class.mix(_Base.Class.define(null, { /* empty */ }, { supportedForProcessing: false }), _Events.eventMixin);
-    var listeners = new ListenerType();
-    var createEvent = _Events._createEventProperty;
-
-    var strings = {
-        get malformedFormatStringInput() { return "Malformed, did you mean to escape your '{0}'?"; },
-    };
-
-    _Base.Namespace.define("WinJS.Resources", {
-        _getWinJSString: _getWinJSString
-    });
-
-    function formatString(string) {
-        var args = arguments;
-        if (args.length > 1) {
-            string = string.replace(/({{)|(}})|{(\d+)}|({)|(})/g, function (unused, left, right, index, illegalLeft, illegalRight) {
-                if (illegalLeft || illegalRight) { throw formatString(strings.malformedFormatStringInput, illegalLeft || illegalRight); }
-                return (left && "{") || (right && "}") || args[(index | 0) + 1];
-            });
-        }
-        return string;
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Resources", {
-        addEventListener: function (type, listener, useCapture) {
-            /// <signature helpKeyword="WinJS.Resources.addEventListener">
-            /// <summary locid="WinJS.Resources.addEventListener">
-            /// Registers an event handler for the specified event.
-            /// </summary>
-            /// <param name='type' type="String" locid='WinJS.Resources.addEventListener_p:type'>
-            /// The name of the event to handle.
-            /// </param>
-            /// <param name='listener' type="Function" locid='WinJS.Resources.addEventListener_p:listener'>
-            /// The listener to invoke when the event gets raised.
-            /// </param>
-            /// <param name='useCapture' type="Boolean" locid='WinJS.Resources.addEventListener_p:useCapture'>
-            /// Set to true to register the event handler for the capturing phase; set to false to register for the bubbling phase.
-            /// </param>
-            /// </signature>
-            if (_WinRT.Windows.ApplicationModel.Resources.Core.ResourceManager && !mrtEventHook) {
-                if (type === contextChangedET) {
-                    try {
-                        var resContext = exports._getResourceContext();
-                        if (resContext) {
-                            resContext.qualifierValues.addEventListener("mapchanged", function (e) {
-                                exports.dispatchEvent(contextChangedET, { qualifier: e.key, changed: e.target[e.key] });
-                            }, false);
-
-                        } else {
-                            // The API can be called in the Background thread (web worker).
-                            _WinRT.Windows.ApplicationModel.Resources.Core.ResourceManager.current.defaultContext.qualifierValues.addEventListener("mapchanged", function (e) {
-                                exports.dispatchEvent(contextChangedET, { qualifier: e.key, changed: e.target[e.key] });
-                            }, false);
-                        }
-                        mrtEventHook = true;
-                    } catch (e) {
-                    }
-                }
-            }
-            listeners.addEventListener(type, listener, useCapture);
-        },
-        removeEventListener: listeners.removeEventListener.bind(listeners),
-        dispatchEvent: listeners.dispatchEvent.bind(listeners),
-
-        _formatString: formatString,
-
-        _getStringWinRT: function (resourceId) {
-            if (!resourceMap) {
-                var mainResourceMap = _WinRT.Windows.ApplicationModel.Resources.Core.ResourceManager.current.mainResourceMap;
-                try {
-                    resourceMap = mainResourceMap.getSubtree('Resources');
-                }
-                catch (e) {
-                }
-                if (!resourceMap) {
-                    resourceMap = mainResourceMap;
-                }
-            }
-
-            var stringValue;
-            var langValue;
-            var resCandidate;
-            try {
-                var resContext = exports._getResourceContext();
-                if (resContext) {
-                    resCandidate = resourceMap.getValue(resourceId, resContext);
-                } else {
-                    resCandidate = resourceMap.getValue(resourceId);
-                }
-
-                if (resCandidate) {
-                    stringValue = resCandidate.valueAsString;
-                    if (stringValue === undefined) {
-                        stringValue = resCandidate.toString();
-                    }
-                }
-            }
-            catch (e) { }
-
-            if (!stringValue) {
-                return exports._getStringJS(resourceId);
-            }
-
-            try {
-                langValue = resCandidate.getQualifierValue("Language");
-            }
-            catch (e) {
-                return { value: stringValue };
-            }
-
-            return { value: stringValue, lang: langValue };
-        },
-
-        _getStringJS: function (resourceId) {
-            var str = _Global.strings && _Global.strings[resourceId];
-            if (typeof str === "string") {
-                str = { value: str };
-            }
-            return str || { value: resourceId, empty: true };
-        },
-
-        _getResourceContext: function () {
-            if (_Global.document) {
-                if (typeof (resourceContext) === 'undefined') {
-                    var context = _WinRT.Windows.ApplicationModel.Resources.Core.ResourceContext;
-                    if (context.getForCurrentView) {
-                        resourceContext = context.getForCurrentView();
-                    } else {
-                        resourceContext = null;
-                    }
-
-                }
-            }
-            return resourceContext;
-        },
-
-        oncontextchanged: createEvent(contextChangedET)
-
-    });
-
-    var getStringImpl = _WinRT.Windows.ApplicationModel.Resources.Core.ResourceManager ? exports._getStringWinRT : exports._getStringJS;
-
-    var getString = function (resourceId) {
-        /// <signature helpKeyword="WinJS.Resources.getString">
-        /// <summary locid='WinJS.Resources.getString'>
-        /// Retrieves the resource string that has the specified resource id.
-        /// </summary>
-        /// <param name='resourceId' type="Number" locid='WinJS.Resources.getString._p:resourceId'>
-        /// The resource id of the string to retrieve.
-        /// </param>
-        /// <returns type='Object' locid='WinJS.Resources.getString_returnValue'>
-        /// An object that can contain these properties:
-        ///
-        /// value:
-        /// The value of the requested string. This property is always present.
-        ///
-        /// empty:
-        /// A value that specifies whether the requested string wasn't found.
-        /// If its true, the string wasn't found. If its false or undefined,
-        /// the requested string was found.
-        ///
-        /// lang:
-        /// The language of the string, if specified. This property is only present
-        /// for multi-language resources.
-        ///
-        /// </returns>
-        /// </signature>
-
-        return getStringImpl(resourceId);
-    };
-
-    _Base.Namespace._moduleDefine(exports, null, {
-        _formatString: formatString,
-        _getWinJSString: _getWinJSString
-    });
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Resources", {
-        getString: {
-            get: function () {
-                return getString;
-            },
-            set: function (value) {
-                getString = value;
-            }
-        }
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Core/_Trace',[
-    './_Global'
-    ], function traceInit(_Global) {
-    "use strict";
-
-    function nop(v) {
-        return v;
-    }
-
-    return {
-        _traceAsyncOperationStarting: (_Global.Debug && _Global.Debug.msTraceAsyncOperationStarting && _Global.Debug.msTraceAsyncOperationStarting.bind(_Global.Debug)) || nop,
-        _traceAsyncOperationCompleted: (_Global.Debug && _Global.Debug.msTraceAsyncOperationCompleted && _Global.Debug.msTraceAsyncOperationCompleted.bind(_Global.Debug)) || nop,
-        _traceAsyncCallbackStarting: (_Global.Debug && _Global.Debug.msTraceAsyncCallbackStarting && _Global.Debug.msTraceAsyncCallbackStarting.bind(_Global.Debug)) || nop,
-        _traceAsyncCallbackCompleted: (_Global.Debug && _Global.Debug.msTraceAsyncCallbackCompleted && _Global.Debug.msTraceAsyncCallbackCompleted.bind(_Global.Debug)) || nop
-    };
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Promise/_StateMachine',[
-    '../Core/_Global',
-    '../Core/_BaseCoreUtils',
-    '../Core/_Base',
-    '../Core/_ErrorFromName',
-    '../Core/_Events',
-    '../Core/_Trace'
-    ], function promiseStateMachineInit(_Global, _BaseCoreUtils, _Base, _ErrorFromName, _Events, _Trace) {
-    "use strict";
-
-    _Global.Debug && (_Global.Debug.setNonUserCodeExceptions = true);
-
-    var ListenerType = _Base.Class.mix(_Base.Class.define(null, { /*empty*/ }, { supportedForProcessing: false }), _Events.eventMixin);
-    var promiseEventListeners = new ListenerType();
-    // make sure there is a listeners collection so that we can do a more trivial check below
-    promiseEventListeners._listeners = {};
-    var errorET = "error";
-    var canceledName = "Canceled";
-    var tagWithStack = false;
-    var tag = {
-        promise: 0x01,
-        thenPromise: 0x02,
-        errorPromise: 0x04,
-        exceptionPromise: 0x08,
-        completePromise: 0x10,
-    };
-    tag.all = tag.promise | tag.thenPromise | tag.errorPromise | tag.exceptionPromise | tag.completePromise;
-
-    //
-    // Global error counter, for each error which enters the system we increment this once and then
-    // the error number travels with the error as it traverses the tree of potential handlers.
-    //
-    // When someone has registered to be told about errors (WinJS.Promise.callonerror) promises
-    // which are in error will get tagged with a ._errorId field. This tagged field is the
-    // contract by which nested promises with errors will be identified as chaining for the
-    // purposes of the callonerror semantics. If a nested promise in error is encountered without
-    // a ._errorId it will be assumed to be foreign and treated as an interop boundary and
-    // a new error id will be minted.
-    //
-    var error_number = 1;
-
-    //
-    // The state machine has a interesting hiccup in it with regards to notification, in order
-    // to flatten out notification and avoid recursion for synchronous completion we have an
-    // explicit set of *_notify states which are responsible for notifying their entire tree
-    // of children. They can do this because they know that immediate children are always
-    // ThenPromise instances and we can therefore reach into their state to access the
-    // _listeners collection.
-    //
-    // So, what happens is that a Promise will be fulfilled through the _completed or _error
-    // messages at which point it will enter a *_notify state and be responsible for to move
-    // its children into an (as appropriate) success or error state and also notify that child's
-    // listeners of the state transition, until leaf notes are reached.
-    //
-
-    var state_created,              // -> working
-        state_working,              // -> error | error_notify | success | success_notify | canceled | waiting
-        state_waiting,              // -> error | error_notify | success | success_notify | waiting_canceled
-        state_waiting_canceled,     // -> error | error_notify | success | success_notify | canceling
-        state_canceled,             // -> error | error_notify | success | success_notify | canceling
-        state_canceling,            // -> error_notify
-        state_success_notify,       // -> success
-        state_success,              // -> .
-        state_error_notify,         // -> error
-        state_error;                // -> .
-
-    // Noop function, used in the various states to indicate that they don't support a given
-    // message. Named with the somewhat cute name '_' because it reads really well in the states.
-
-    function _() { }
-
-    // Initial state
-    //
-    state_created = {
-        name: "created",
-        enter: function (promise) {
-            promise._setState(state_working);
-        },
-        cancel: _,
-        done: _,
-        then: _,
-        _completed: _,
-        _error: _,
-        _notify: _,
-        _progress: _,
-        _setCompleteValue: _,
-        _setErrorValue: _
-    };
-
-    // Ready state, waiting for a message (completed/error/progress), able to be canceled
-    //
-    state_working = {
-        name: "working",
-        enter: _,
-        cancel: function (promise) {
-            promise._setState(state_canceled);
-        },
-        done: done,
-        then: then,
-        _completed: completed,
-        _error: error,
-        _notify: _,
-        _progress: progress,
-        _setCompleteValue: setCompleteValue,
-        _setErrorValue: setErrorValue
-    };
-
-    // Waiting state, if a promise is completed with a value which is itself a promise
-    // (has a then() method) it signs up to be informed when that child promise is
-    // fulfilled at which point it will be fulfilled with that value.
-    //
-    state_waiting = {
-        name: "waiting",
-        enter: function (promise) {
-            var waitedUpon = promise._value;
-            // We can special case our own intermediate promises which are not in a
-            //  terminal state by just pushing this promise as a listener without
-            //  having to create new indirection functions
-            if (waitedUpon instanceof ThenPromise &&
-                waitedUpon._state !== state_error &&
-                waitedUpon._state !== state_success) {
-                pushListener(waitedUpon, { promise: promise });
-            } else {
-                var error = function (value) {
-                    if (waitedUpon._errorId) {
-                        promise._chainedError(value, waitedUpon);
-                    } else {
-                        // Because this is an interop boundary we want to indicate that this
-                        //  error has been handled by the promise infrastructure before we
-                        //  begin a new handling chain.
-                        //
-                        callonerror(promise, value, detailsForHandledError, waitedUpon, error);
-                        promise._error(value);
-                    }
-                };
-                error.handlesOnError = true;
-                waitedUpon.then(
-                    promise._completed.bind(promise),
-                    error,
-                    promise._progress.bind(promise)
-                );
-            }
-        },
-        cancel: function (promise) {
-            promise._setState(state_waiting_canceled);
-        },
-        done: done,
-        then: then,
-        _completed: completed,
-        _error: error,
-        _notify: _,
-        _progress: progress,
-        _setCompleteValue: setCompleteValue,
-        _setErrorValue: setErrorValue
-    };
-
-    // Waiting canceled state, when a promise has been in a waiting state and receives a
-    // request to cancel its pending work it will forward that request to the child promise
-    // and then waits to be informed of the result. This promise moves itself into the
-    // canceling state but understands that the child promise may instead push it to a
-    // different state.
-    //
-    state_waiting_canceled = {
-        name: "waiting_canceled",
-        enter: function (promise) {
-            // Initiate a transition to canceling. Triggering a cancel on the promise
-            // that we are waiting upon may result in a different state transition
-            // before the state machine pump runs again.
-            promise._setState(state_canceling);
-            var waitedUpon = promise._value;
-            if (waitedUpon.cancel) {
-                waitedUpon.cancel();
-            }
-        },
-        cancel: _,
-        done: done,
-        then: then,
-        _completed: completed,
-        _error: error,
-        _notify: _,
-        _progress: progress,
-        _setCompleteValue: setCompleteValue,
-        _setErrorValue: setErrorValue
-    };
-
-    // Canceled state, moves to the canceling state and then tells the promise to do
-    // whatever it might need to do on cancelation.
-    //
-    state_canceled = {
-        name: "canceled",
-        enter: function (promise) {
-            // Initiate a transition to canceling. The _cancelAction may change the state
-            // before the state machine pump runs again.
-            promise._setState(state_canceling);
-            promise._cancelAction();
-        },
-        cancel: _,
-        done: done,
-        then: then,
-        _completed: completed,
-        _error: error,
-        _notify: _,
-        _progress: progress,
-        _setCompleteValue: setCompleteValue,
-        _setErrorValue: setErrorValue
-    };
-
-    // Canceling state, commits to the promise moving to an error state with an error
-    // object whose 'name' and 'message' properties contain the string "Canceled"
-    //
-    state_canceling = {
-        name: "canceling",
-        enter: function (promise) {
-            var error = new Error(canceledName);
-            error.name = error.message;
-            promise._value = error;
-            promise._setState(state_error_notify);
-        },
-        cancel: _,
-        done: _,
-        then: _,
-        _completed: _,
-        _error: _,
-        _notify: _,
-        _progress: _,
-        _setCompleteValue: _,
-        _setErrorValue: _
-    };
-
-    // Success notify state, moves a promise to the success state and notifies all children
-    //
-    state_success_notify = {
-        name: "complete_notify",
-        enter: function (promise) {
-            promise.done = CompletePromise.prototype.done;
-            promise.then = CompletePromise.prototype.then;
-            if (promise._listeners) {
-                var queue = [promise];
-                var p;
-                while (queue.length) {
-                    p = queue.shift();
-                    p._state._notify(p, queue);
-                }
-            }
-            promise._setState(state_success);
-        },
-        cancel: _,
-        done: null, /*error to get here */
-        then: null, /*error to get here */
-        _completed: _,
-        _error: _,
-        _notify: notifySuccess,
-        _progress: _,
-        _setCompleteValue: _,
-        _setErrorValue: _
-    };
-
-    // Success state, moves a promise to the success state and does NOT notify any children.
-    // Some upstream promise is owning the notification pass.
-    //
-    state_success = {
-        name: "success",
-        enter: function (promise) {
-            promise.done = CompletePromise.prototype.done;
-            promise.then = CompletePromise.prototype.then;
-            promise._cleanupAction();
-        },
-        cancel: _,
-        done: null, /*error to get here */
-        then: null, /*error to get here */
-        _completed: _,
-        _error: _,
-        _notify: notifySuccess,
-        _progress: _,
-        _setCompleteValue: _,
-        _setErrorValue: _
-    };
-
-    // Error notify state, moves a promise to the error state and notifies all children
-    //
-    state_error_notify = {
-        name: "error_notify",
-        enter: function (promise) {
-            promise.done = ErrorPromise.prototype.done;
-            promise.then = ErrorPromise.prototype.then;
-            if (promise._listeners) {
-                var queue = [promise];
-                var p;
-                while (queue.length) {
-                    p = queue.shift();
-                    p._state._notify(p, queue);
-                }
-            }
-            promise._setState(state_error);
-        },
-        cancel: _,
-        done: null, /*error to get here*/
-        then: null, /*error to get here*/
-        _completed: _,
-        _error: _,
-        _notify: notifyError,
-        _progress: _,
-        _setCompleteValue: _,
-        _setErrorValue: _
-    };
-
-    // Error state, moves a promise to the error state and does NOT notify any children.
-    // Some upstream promise is owning the notification pass.
-    //
-    state_error = {
-        name: "error",
-        enter: function (promise) {
-            promise.done = ErrorPromise.prototype.done;
-            promise.then = ErrorPromise.prototype.then;
-            promise._cleanupAction();
-        },
-        cancel: _,
-        done: null, /*error to get here*/
-        then: null, /*error to get here*/
-        _completed: _,
-        _error: _,
-        _notify: notifyError,
-        _progress: _,
-        _setCompleteValue: _,
-        _setErrorValue: _
-    };
-
-    //
-    // The statemachine implementation follows a very particular pattern, the states are specified
-    // as static stateless bags of functions which are then indirected through the state machine
-    // instance (a Promise). As such all of the functions on each state have the promise instance
-    // passed to them explicitly as a parameter and the Promise instance members do a little
-    // dance where they indirect through the state and insert themselves in the argument list.
-    //
-    // We could instead call directly through the promise states however then every caller
-    // would have to remember to do things like pumping the state machine to catch state transitions.
-    //
-
-    var PromiseStateMachine = _Base.Class.define(null, {
-        _listeners: null,
-        _nextState: null,
-        _state: null,
-        _value: null,
-
-        cancel: function () {
-            /// <signature helpKeyword="WinJS.PromiseStateMachine.cancel">
-            /// <summary locid="WinJS.PromiseStateMachine.cancel">
-            /// Attempts to cancel the fulfillment of a promised value. If the promise hasn't
-            /// already been fulfilled and cancellation is supported, the promise enters
-            /// the error state with a value of Error("Canceled").
-            /// </summary>
-            /// </signature>
-            this._state.cancel(this);
-            this._run();
-        },
-        done: function Promise_done(onComplete, onError, onProgress) {
-            /// <signature helpKeyword="WinJS.PromiseStateMachine.done">
-            /// <summary locid="WinJS.PromiseStateMachine.done">
-            /// Allows you to specify the work to be done on the fulfillment of the promised value,
-            /// the error handling to be performed if the promise fails to fulfill
-            /// a value, and the handling of progress notifications along the way.
-            ///
-            /// After the handlers have finished executing, this function throws any error that would have been returned
-            /// from then() as a promise in the error state.
-            /// </summary>
-            /// <param name='onComplete' type='Function' locid="WinJS.PromiseStateMachine.done_p:onComplete">
-            /// The function to be called if the promise is fulfilled successfully with a value.
-            /// The fulfilled value is passed as the single argument. If the value is null,
-            /// the fulfilled value is returned. The value returned
-            /// from the function becomes the fulfilled value of the promise returned by
-            /// then(). If an exception is thrown while executing the function, the promise returned
-            /// by then() moves into the error state.
-            /// </param>
-            /// <param name='onError' type='Function' optional='true' locid="WinJS.PromiseStateMachine.done_p:onError">
-            /// The function to be called if the promise is fulfilled with an error. The error
-            /// is passed as the single argument. If it is null, the error is forwarded.
-            /// The value returned from the function is the fulfilled value of the promise returned by then().
-            /// </param>
-            /// <param name='onProgress' type='Function' optional='true' locid="WinJS.PromiseStateMachine.done_p:onProgress">
-            /// the function to be called if the promise reports progress. Data about the progress
-            /// is passed as the single argument. Promises are not required to support
-            /// progress.
-            /// </param>
-            /// </signature>
-            this._state.done(this, onComplete, onError, onProgress);
-        },
-        then: function Promise_then(onComplete, onError, onProgress) {
-            /// <signature helpKeyword="WinJS.PromiseStateMachine.then">
-            /// <summary locid="WinJS.PromiseStateMachine.then">
-            /// Allows you to specify the work to be done on the fulfillment of the promised value,
-            /// the error handling to be performed if the promise fails to fulfill
-            /// a value, and the handling of progress notifications along the way.
-            /// </summary>
-            /// <param name='onComplete' type='Function' locid="WinJS.PromiseStateMachine.then_p:onComplete">
-            /// The function to be called if the promise is fulfilled successfully with a value.
-            /// The value is passed as the single argument. If the value is null, the value is returned.
-            /// The value returned from the function becomes the fulfilled value of the promise returned by
-            /// then(). If an exception is thrown while this function is being executed, the promise returned
-            /// by then() moves into the error state.
-            /// </param>
-            /// <param name='onError' type='Function' optional='true' locid="WinJS.PromiseStateMachine.then_p:onError">
-            /// The function to be called if the promise is fulfilled with an error. The error
-            /// is passed as the single argument. If it is null, the error is forwarded.
-            /// The value returned from the function becomes the fulfilled value of the promise returned by then().
-            /// </param>
-            /// <param name='onProgress' type='Function' optional='true' locid="WinJS.PromiseStateMachine.then_p:onProgress">
-            /// The function to be called if the promise reports progress. Data about the progress
-            /// is passed as the single argument. Promises are not required to support
-            /// progress.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.PromiseStateMachine.then_returnValue">
-            /// The promise whose value is the result of executing the complete or
-            /// error function.
-            /// </returns>
-            /// </signature>
-            return this._state.then(this, onComplete, onError, onProgress);
-        },
-
-        _chainedError: function (value, context) {
-            var result = this._state._error(this, value, detailsForChainedError, context);
-            this._run();
-            return result;
-        },
-        _completed: function (value) {
-            var result = this._state._completed(this, value);
-            this._run();
-            return result;
-        },
-        _error: function (value) {
-            var result = this._state._error(this, value, detailsForError);
-            this._run();
-            return result;
-        },
-        _progress: function (value) {
-            this._state._progress(this, value);
-        },
-        _setState: function (state) {
-            this._nextState = state;
-        },
-        _setCompleteValue: function (value) {
-            this._state._setCompleteValue(this, value);
-            this._run();
-        },
-        _setChainedErrorValue: function (value, context) {
-            var result = this._state._setErrorValue(this, value, detailsForChainedError, context);
-            this._run();
-            return result;
-        },
-        _setExceptionValue: function (value) {
-            var result = this._state._setErrorValue(this, value, detailsForException);
-            this._run();
-            return result;
-        },
-        _run: function () {
-            while (this._nextState) {
-                this._state = this._nextState;
-                this._nextState = null;
-                this._state.enter(this);
-            }
-        }
-    }, {
-        supportedForProcessing: false
-    });
-
-    //
-    // Implementations of shared state machine code.
-    //
-
-    function completed(promise, value) {
-        var targetState;
-        if (value && typeof value === "object" && typeof value.then === "function") {
-            targetState = state_waiting;
-        } else {
-            targetState = state_success_notify;
-        }
-        promise._value = value;
-        promise._setState(targetState);
-    }
-    function createErrorDetails(exception, error, promise, id, parent, handler) {
-        return {
-            exception: exception,
-            error: error,
-            promise: promise,
-            handler: handler,
-            id: id,
-            parent: parent
-        };
-    }
-    function detailsForHandledError(promise, errorValue, context, handler) {
-        var exception = context._isException;
-        var errorId = context._errorId;
-        return createErrorDetails(
-            exception ? errorValue : null,
-            exception ? null : errorValue,
-            promise,
-            errorId,
-            context,
-            handler
-        );
-    }
-    function detailsForChainedError(promise, errorValue, context) {
-        var exception = context._isException;
-        var errorId = context._errorId;
-        setErrorInfo(promise, errorId, exception);
-        return createErrorDetails(
-            exception ? errorValue : null,
-            exception ? null : errorValue,
-            promise,
-            errorId,
-            context
-        );
-    }
-    function detailsForError(promise, errorValue) {
-        var errorId = ++error_number;
-        setErrorInfo(promise, errorId);
-        return createErrorDetails(
-            null,
-            errorValue,
-            promise,
-            errorId
-        );
-    }
-    function detailsForException(promise, exceptionValue) {
-        var errorId = ++error_number;
-        setErrorInfo(promise, errorId, true);
-        return createErrorDetails(
-            exceptionValue,
-            null,
-            promise,
-            errorId
-        );
-    }
-    function done(promise, onComplete, onError, onProgress) {
-        var asyncOpID = _Trace._traceAsyncOperationStarting("WinJS.Promise.done");
-        pushListener(promise, { c: onComplete, e: onError, p: onProgress, asyncOpID: asyncOpID });
-    }
-    function error(promise, value, onerrorDetails, context) {
-        promise._value = value;
-        callonerror(promise, value, onerrorDetails, context);
-        promise._setState(state_error_notify);
-    }
-    function notifySuccess(promise, queue) {
-        var value = promise._value;
-        var listeners = promise._listeners;
-        if (!listeners) {
-            return;
-        }
-        promise._listeners = null;
-        var i, len;
-        for (i = 0, len = Array.isArray(listeners) ? listeners.length : 1; i < len; i++) {
-            var listener = len === 1 ? listeners : listeners[i];
-            var onComplete = listener.c;
-            var target = listener.promise;
-
-            _Trace._traceAsyncOperationCompleted(listener.asyncOpID, _Global.Debug && _Global.Debug.MS_ASYNC_OP_STATUS_SUCCESS);
-
-            if (target) {
-                _Trace._traceAsyncCallbackStarting(listener.asyncOpID);
-                try {
-                    target._setCompleteValue(onComplete ? onComplete(value) : value);
-                } catch (ex) {
-                    target._setExceptionValue(ex);
-                } finally {
-                    _Trace._traceAsyncCallbackCompleted();
-                }
-                if (target._state !== state_waiting && target._listeners) {
-                    queue.push(target);
-                }
-            } else {
-                CompletePromise.prototype.done.call(promise, onComplete);
-            }
-        }
-    }
-    function notifyError(promise, queue) {
-        var value = promise._value;
-        var listeners = promise._listeners;
-        if (!listeners) {
-            return;
-        }
-        promise._listeners = null;
-        var i, len;
-        for (i = 0, len = Array.isArray(listeners) ? listeners.length : 1; i < len; i++) {
-            var listener = len === 1 ? listeners : listeners[i];
-            var onError = listener.e;
-            var target = listener.promise;
-
-            var errorID = _Global.Debug && (value && value.name === canceledName ? _Global.Debug.MS_ASYNC_OP_STATUS_CANCELED : _Global.Debug.MS_ASYNC_OP_STATUS_ERROR);
-            _Trace._traceAsyncOperationCompleted(listener.asyncOpID, errorID);
-
-            if (target) {
-                var asyncCallbackStarted = false;
-                try {
-                    if (onError) {
-                        _Trace._traceAsyncCallbackStarting(listener.asyncOpID);
-                        asyncCallbackStarted = true;
-                        if (!onError.handlesOnError) {
-                            callonerror(target, value, detailsForHandledError, promise, onError);
-                        }
-                        target._setCompleteValue(onError(value));
-                    } else {
-                        target._setChainedErrorValue(value, promise);
-                    }
-                } catch (ex) {
-                    target._setExceptionValue(ex);
-                } finally {
-                    if (asyncCallbackStarted) {
-                        _Trace._traceAsyncCallbackCompleted();
-                    }
-                }
-                if (target._state !== state_waiting && target._listeners) {
-                    queue.push(target);
-                }
-            } else {
-                ErrorPromise.prototype.done.call(promise, null, onError);
-            }
-        }
-    }
-    function callonerror(promise, value, onerrorDetailsGenerator, context, handler) {
-        if (promiseEventListeners._listeners[errorET]) {
-            if (value instanceof Error && value.message === canceledName) {
-                return;
-            }
-            promiseEventListeners.dispatchEvent(errorET, onerrorDetailsGenerator(promise, value, context, handler));
-        }
-    }
-    function progress(promise, value) {
-        var listeners = promise._listeners;
-        if (listeners) {
-            var i, len;
-            for (i = 0, len = Array.isArray(listeners) ? listeners.length : 1; i < len; i++) {
-                var listener = len === 1 ? listeners : listeners[i];
-                var onProgress = listener.p;
-                if (onProgress) {
-                    try { onProgress(value); } catch (ex) { }
-                }
-                if (!(listener.c || listener.e) && listener.promise) {
-                    listener.promise._progress(value);
-                }
-            }
-        }
-    }
-    function pushListener(promise, listener) {
-        var listeners = promise._listeners;
-        if (listeners) {
-            // We may have either a single listener (which will never be wrapped in an array)
-            // or 2+ listeners (which will be wrapped). Since we are now adding one more listener
-            // we may have to wrap the single listener before adding the second.
-            listeners = Array.isArray(listeners) ? listeners : [listeners];
-            listeners.push(listener);
-        } else {
-            listeners = listener;
-        }
-        promise._listeners = listeners;
-    }
-    // The difference beween setCompleteValue()/setErrorValue() and complete()/error() is that setXXXValue() moves
-    // a promise directly to the success/error state without starting another notification pass (because one
-    // is already ongoing).
-    function setErrorInfo(promise, errorId, isException) {
-        promise._isException = isException || false;
-        promise._errorId = errorId;
-    }
-    function setErrorValue(promise, value, onerrorDetails, context) {
-        promise._value = value;
-        callonerror(promise, value, onerrorDetails, context);
-        promise._setState(state_error);
-    }
-    function setCompleteValue(promise, value) {
-        var targetState;
-        if (value && typeof value === "object" && typeof value.then === "function") {
-            targetState = state_waiting;
-        } else {
-            targetState = state_success;
-        }
-        promise._value = value;
-        promise._setState(targetState);
-    }
-    function then(promise, onComplete, onError, onProgress) {
-        var result = new ThenPromise(promise);
-        var asyncOpID = _Trace._traceAsyncOperationStarting("WinJS.Promise.then");
-        pushListener(promise, { promise: result, c: onComplete, e: onError, p: onProgress, asyncOpID: asyncOpID });
-        return result;
-    }
-
-    //
-    // Internal implementation detail promise, ThenPromise is created when a promise needs
-    // to be returned from a then() method.
-    //
-    var ThenPromise = _Base.Class.derive(PromiseStateMachine,
-        function (creator) {
-
-            if (tagWithStack && (tagWithStack === true || (tagWithStack & tag.thenPromise))) {
-                this._stack = Promise._getStack();
-            }
-
-            this._creator = creator;
-            this._setState(state_created);
-            this._run();
-        }, {
-            _creator: null,
-
-            _cancelAction: function () { if (this._creator) { this._creator.cancel(); } },
-            _cleanupAction: function () { this._creator = null; }
-        }, {
-            supportedForProcessing: false
-        }
-    );
-
-    //
-    // Slim promise implementations for already completed promises, these are created
-    // under the hood on synchronous completion paths as well as by WinJS.Promise.wrap
-    // and WinJS.Promise.wrapError.
-    //
-
-    var ErrorPromise = _Base.Class.define(
-        function ErrorPromise_ctor(value) {
-
-            if (tagWithStack && (tagWithStack === true || (tagWithStack & tag.errorPromise))) {
-                this._stack = Promise._getStack();
-            }
-
-            this._value = value;
-            callonerror(this, value, detailsForError);
-        }, {
-            cancel: function () {
-                /// <signature helpKeyword="WinJS.PromiseStateMachine.cancel">
-                /// <summary locid="WinJS.PromiseStateMachine.cancel">
-                /// Attempts to cancel the fulfillment of a promised value. If the promise hasn't
-                /// already been fulfilled and cancellation is supported, the promise enters
-                /// the error state with a value of Error("Canceled").
-                /// </summary>
-                /// </signature>
-            },
-            done: function ErrorPromise_done(unused, onError) {
-                /// <signature helpKeyword="WinJS.PromiseStateMachine.done">
-                /// <summary locid="WinJS.PromiseStateMachine.done">
-                /// Allows you to specify the work to be done on the fulfillment of the promised value,
-                /// the error handling to be performed if the promise fails to fulfill
-                /// a value, and the handling of progress notifications along the way.
-                ///
-                /// After the handlers have finished executing, this function throws any error that would have been returned
-                /// from then() as a promise in the error state.
-                /// </summary>
-                /// <param name='onComplete' type='Function' locid="WinJS.PromiseStateMachine.done_p:onComplete">
-                /// The function to be called if the promise is fulfilled successfully with a value.
-                /// The fulfilled value is passed as the single argument. If the value is null,
-                /// the fulfilled value is returned. The value returned
-                /// from the function becomes the fulfilled value of the promise returned by
-                /// then(). If an exception is thrown while executing the function, the promise returned
-                /// by then() moves into the error state.
-                /// </param>
-                /// <param name='onError' type='Function' optional='true' locid="WinJS.PromiseStateMachine.done_p:onError">
-                /// The function to be called if the promise is fulfilled with an error. The error
-                /// is passed as the single argument. If it is null, the error is forwarded.
-                /// The value returned from the function is the fulfilled value of the promise returned by then().
-                /// </param>
-                /// <param name='onProgress' type='Function' optional='true' locid="WinJS.PromiseStateMachine.done_p:onProgress">
-                /// the function to be called if the promise reports progress. Data about the progress
-                /// is passed as the single argument. Promises are not required to support
-                /// progress.
-                /// </param>
-                /// </signature>
-                var value = this._value;
-                if (onError) {
-                    try {
-                        if (!onError.handlesOnError) {
-                            callonerror(null, value, detailsForHandledError, this, onError);
-                        }
-                        var result = onError(value);
-                        if (result && typeof result === "object" && typeof result.done === "function") {
-                            // If a promise is returned we need to wait on it.
-                            result.done();
-                        }
-                        return;
-                    } catch (ex) {
-                        value = ex;
-                    }
-                }
-                if (value instanceof Error && value.message === canceledName) {
-                    // suppress cancel
-                    return;
-                }
-                // force the exception to be thrown asyncronously to avoid any try/catch blocks
-                //
-                Promise._doneHandler(value);
-            },
-            then: function ErrorPromise_then(unused, onError) {
-                /// <signature helpKeyword="WinJS.PromiseStateMachine.then">
-                /// <summary locid="WinJS.PromiseStateMachine.then">
-                /// Allows you to specify the work to be done on the fulfillment of the promised value,
-                /// the error handling to be performed if the promise fails to fulfill
-                /// a value, and the handling of progress notifications along the way.
-                /// </summary>
-                /// <param name='onComplete' type='Function' locid="WinJS.PromiseStateMachine.then_p:onComplete">
-                /// The function to be called if the promise is fulfilled successfully with a value.
-                /// The value is passed as the single argument. If the value is null, the value is returned.
-                /// The value returned from the function becomes the fulfilled value of the promise returned by
-                /// then(). If an exception is thrown while this function is being executed, the promise returned
-                /// by then() moves into the error state.
-                /// </param>
-                /// <param name='onError' type='Function' optional='true' locid="WinJS.PromiseStateMachine.then_p:onError">
-                /// The function to be called if the promise is fulfilled with an error. The error
-                /// is passed as the single argument. If it is null, the error is forwarded.
-                /// The value returned from the function becomes the fulfilled value of the promise returned by then().
-                /// </param>
-                /// <param name='onProgress' type='Function' optional='true' locid="WinJS.PromiseStateMachine.then_p:onProgress">
-                /// The function to be called if the promise reports progress. Data about the progress
-                /// is passed as the single argument. Promises are not required to support
-                /// progress.
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.PromiseStateMachine.then_returnValue">
-                /// The promise whose value is the result of executing the complete or
-                /// error function.
-                /// </returns>
-                /// </signature>
-
-                // If the promise is already in a error state and no error handler is provided
-                // we optimize by simply returning the promise instead of creating a new one.
-                //
-                if (!onError) { return this; }
-                var result;
-                var value = this._value;
-                try {
-                    if (!onError.handlesOnError) {
-                        callonerror(null, value, detailsForHandledError, this, onError);
-                    }
-                    result = new CompletePromise(onError(value));
-                } catch (ex) {
-                    // If the value throw from the error handler is the same as the value
-                    // provided to the error handler then there is no need for a new promise.
-                    //
-                    if (ex === value) {
-                        result = this;
-                    } else {
-                        result = new ExceptionPromise(ex);
-                    }
-                }
-                return result;
-            }
-        }, {
-            supportedForProcessing: false
-        }
-    );
-
-    var ExceptionPromise = _Base.Class.derive(ErrorPromise,
-        function ExceptionPromise_ctor(value) {
-
-            if (tagWithStack && (tagWithStack === true || (tagWithStack & tag.exceptionPromise))) {
-                this._stack = Promise._getStack();
-            }
-
-            this._value = value;
-            callonerror(this, value, detailsForException);
-        }, {
-            /* empty */
-        }, {
-            supportedForProcessing: false
-        }
-    );
-
-    var CompletePromise = _Base.Class.define(
-        function CompletePromise_ctor(value) {
-
-            if (tagWithStack && (tagWithStack === true || (tagWithStack & tag.completePromise))) {
-                this._stack = Promise._getStack();
-            }
-
-            if (value && typeof value === "object" && typeof value.then === "function") {
-                var result = new ThenPromise(null);
-                result._setCompleteValue(value);
-                return result;
-            }
-            this._value = value;
-        }, {
-            cancel: function () {
-                /// <signature helpKeyword="WinJS.PromiseStateMachine.cancel">
-                /// <summary locid="WinJS.PromiseStateMachine.cancel">
-                /// Attempts to cancel the fulfillment of a promised value. If the promise hasn't
-                /// already been fulfilled and cancellation is supported, the promise enters
-                /// the error state with a value of Error("Canceled").
-                /// </summary>
-                /// </signature>
-            },
-            done: function CompletePromise_done(onComplete) {
-                /// <signature helpKeyword="WinJS.PromiseStateMachine.done">
-                /// <summary locid="WinJS.PromiseStateMachine.done">
-                /// Allows you to specify the work to be done on the fulfillment of the promised value,
-                /// the error handling to be performed if the promise fails to fulfill
-                /// a value, and the handling of progress notifications along the way.
-                ///
-                /// After the handlers have finished executing, this function throws any error that would have been returned
-                /// from then() as a promise in the error state.
-                /// </summary>
-                /// <param name='onComplete' type='Function' locid="WinJS.PromiseStateMachine.done_p:onComplete">
-                /// The function to be called if the promise is fulfilled successfully with a value.
-                /// The fulfilled value is passed as the single argument. If the value is null,
-                /// the fulfilled value is returned. The value returned
-                /// from the function becomes the fulfilled value of the promise returned by
-                /// then(). If an exception is thrown while executing the function, the promise returned
-                /// by then() moves into the error state.
-                /// </param>
-                /// <param name='onError' type='Function' optional='true' locid="WinJS.PromiseStateMachine.done_p:onError">
-                /// The function to be called if the promise is fulfilled with an error. The error
-                /// is passed as the single argument. If it is null, the error is forwarded.
-                /// The value returned from the function is the fulfilled value of the promise returned by then().
-                /// </param>
-                /// <param name='onProgress' type='Function' optional='true' locid="WinJS.PromiseStateMachine.done_p:onProgress">
-                /// the function to be called if the promise reports progress. Data about the progress
-                /// is passed as the single argument. Promises are not required to support
-                /// progress.
-                /// </param>
-                /// </signature>
-                if (!onComplete) { return; }
-                try {
-                    var result = onComplete(this._value);
-                    if (result && typeof result === "object" && typeof result.done === "function") {
-                        result.done();
-                    }
-                } catch (ex) {
-                    // force the exception to be thrown asynchronously to avoid any try/catch blocks
-                    Promise._doneHandler(ex);
-                }
-            },
-            then: function CompletePromise_then(onComplete) {
-                /// <signature helpKeyword="WinJS.PromiseStateMachine.then">
-                /// <summary locid="WinJS.PromiseStateMachine.then">
-                /// Allows you to specify the work to be done on the fulfillment of the promised value,
-                /// the error handling to be performed if the promise fails to fulfill
-                /// a value, and the handling of progress notifications along the way.
-                /// </summary>
-                /// <param name='onComplete' type='Function' locid="WinJS.PromiseStateMachine.then_p:onComplete">
-                /// The function to be called if the promise is fulfilled successfully with a value.
-                /// The value is passed as the single argument. If the value is null, the value is returned.
-                /// The value returned from the function becomes the fulfilled value of the promise returned by
-                /// then(). If an exception is thrown while this function is being executed, the promise returned
-                /// by then() moves into the error state.
-                /// </param>
-                /// <param name='onError' type='Function' optional='true' locid="WinJS.PromiseStateMachine.then_p:onError">
-                /// The function to be called if the promise is fulfilled with an error. The error
-                /// is passed as the single argument. If it is null, the error is forwarded.
-                /// The value returned from the function becomes the fulfilled value of the promise returned by then().
-                /// </param>
-                /// <param name='onProgress' type='Function' optional='true' locid="WinJS.PromiseStateMachine.then_p:onProgress">
-                /// The function to be called if the promise reports progress. Data about the progress
-                /// is passed as the single argument. Promises are not required to support
-                /// progress.
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.PromiseStateMachine.then_returnValue">
-                /// The promise whose value is the result of executing the complete or
-                /// error function.
-                /// </returns>
-                /// </signature>
-                try {
-                    // If the value returned from the completion handler is the same as the value
-                    // provided to the completion handler then there is no need for a new promise.
-                    //
-                    var newValue = onComplete ? onComplete(this._value) : this._value;
-                    return newValue === this._value ? this : new CompletePromise(newValue);
-                } catch (ex) {
-                    return new ExceptionPromise(ex);
-                }
-            }
-        }, {
-            supportedForProcessing: false
-        }
-    );
-
-    //
-    // Promise is the user-creatable WinJS.Promise object.
-    //
-
-    function timeout(timeoutMS) {
-        var id;
-        return new Promise(
-            function (c) {
-                if (timeoutMS) {
-                    id = _Global.setTimeout(c, timeoutMS);
-                } else {
-                    _BaseCoreUtils._setImmediate(c);
-                }
-            },
-            function () {
-                if (id) {
-                    _Global.clearTimeout(id);
-                }
-            }
-        );
-    }
-
-    function timeoutWithPromise(timeout, promise) {
-        var cancelPromise = function () { promise.cancel(); };
-        var cancelTimeout = function () { timeout.cancel(); };
-        timeout.then(cancelPromise);
-        promise.then(cancelTimeout, cancelTimeout);
-        return promise;
-    }
-
-    var staticCanceledPromise;
-
-    var Promise = _Base.Class.derive(PromiseStateMachine,
-        function Promise_ctor(init, oncancel) {
-            /// <signature helpKeyword="WinJS.Promise">
-            /// <summary locid="WinJS.Promise">
-            /// A promise provides a mechanism to schedule work to be done on a value that
-            /// has not yet been computed. It is a convenient abstraction for managing
-            /// interactions with asynchronous APIs.
-            /// </summary>
-            /// <param name="init" type="Function" locid="WinJS.Promise_p:init">
-            /// The function that is called during construction of the  promise. The function
-            /// is given three arguments (complete, error, progress). Inside this function
-            /// you should add event listeners for the notifications supported by this value.
-            /// </param>
-            /// <param name="oncancel" optional="true" locid="WinJS.Promise_p:oncancel">
-            /// The function to call if a consumer of this promise wants
-            /// to cancel its undone work. Promises are not required to
-            /// support cancellation.
-            /// </param>
-            /// </signature>
-
-            if (tagWithStack && (tagWithStack === true || (tagWithStack & tag.promise))) {
-                this._stack = Promise._getStack();
-            }
-
-            this._oncancel = oncancel;
-            this._setState(state_created);
-            this._run();
-
-            try {
-                var complete = this._completed.bind(this);
-                var error = this._error.bind(this);
-                var progress = this._progress.bind(this);
-                init(complete, error, progress);
-            } catch (ex) {
-                this._setExceptionValue(ex);
-            }
-        }, {
-            _oncancel: null,
-
-            _cancelAction: function () {
-                if (this._oncancel) {
-                    try { this._oncancel(); } catch (ex) { }
-                }
-            },
-            _cleanupAction: function () { this._oncancel = null; }
-        }, {
-
-            addEventListener: function Promise_addEventListener(eventType, listener, capture) {
-                /// <signature helpKeyword="WinJS.Promise.addEventListener">
-                /// <summary locid="WinJS.Promise.addEventListener">
-                /// Adds an event listener to the control.
-                /// </summary>
-                /// <param name="eventType" locid="WinJS.Promise.addEventListener_p:eventType">
-                /// The type (name) of the event.
-                /// </param>
-                /// <param name="listener" locid="WinJS.Promise.addEventListener_p:listener">
-                /// The listener to invoke when the event is raised.
-                /// </param>
-                /// <param name="capture" locid="WinJS.Promise.addEventListener_p:capture">
-                /// Specifies whether or not to initiate capture.
-                /// </param>
-                /// </signature>
-                promiseEventListeners.addEventListener(eventType, listener, capture);
-            },
-            any: function Promise_any(values) {
-                /// <signature helpKeyword="WinJS.Promise.any">
-                /// <summary locid="WinJS.Promise.any">
-                /// Returns a promise that is fulfilled when one of the input promises
-                /// has been fulfilled.
-                /// </summary>
-                /// <param name="values" type="Array" locid="WinJS.Promise.any_p:values">
-                /// An array that contains promise objects or objects whose property
-                /// values include promise objects.
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.Promise.any_returnValue">
-                /// A promise that on fulfillment yields the value of the input (complete or error).
-                /// </returns>
-                /// </signature>
-                return new Promise(
-                    function (complete, error) {
-                        var keys = Object.keys(values);
-                        if (keys.length === 0) {
-                            complete();
-                        }
-                        var canceled = 0;
-                        keys.forEach(function (key) {
-                            Promise.as(values[key]).then(
-                                function () { complete({ key: key, value: values[key] }); },
-                                function (e) {
-                                    if (e instanceof Error && e.name === canceledName) {
-                                        if ((++canceled) === keys.length) {
-                                            complete(Promise.cancel);
-                                        }
-                                        return;
-                                    }
-                                    error({ key: key, value: values[key] });
-                                }
-                            );
-                        });
-                    },
-                    function () {
-                        var keys = Object.keys(values);
-                        keys.forEach(function (key) {
-                            var promise = Promise.as(values[key]);
-                            if (typeof promise.cancel === "function") {
-                                promise.cancel();
-                            }
-                        });
-                    }
-                );
-            },
-            as: function Promise_as(value) {
-                /// <signature helpKeyword="WinJS.Promise.as">
-                /// <summary locid="WinJS.Promise.as">
-                /// Returns a promise. If the object is already a promise it is returned;
-                /// otherwise the object is wrapped in a promise.
-                /// </summary>
-                /// <param name="value" locid="WinJS.Promise.as_p:value">
-                /// The value to be treated as a promise.
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.Promise.as_returnValue">
-                /// A promise.
-                /// </returns>
-                /// </signature>
-                if (value && typeof value === "object" && typeof value.then === "function") {
-                    return value;
-                }
-                return new CompletePromise(value);
-            },
-            /// <field type="WinJS.Promise" helpKeyword="WinJS.Promise.cancel" locid="WinJS.Promise.cancel">
-            /// Canceled promise value, can be returned from a promise completion handler
-            /// to indicate cancelation of the promise chain.
-            /// </field>
-            cancel: {
-                get: function () {
-                    return (staticCanceledPromise = staticCanceledPromise || new ErrorPromise(new _ErrorFromName(canceledName)));
-                }
-            },
-            dispatchEvent: function Promise_dispatchEvent(eventType, details) {
-                /// <signature helpKeyword="WinJS.Promise.dispatchEvent">
-                /// <summary locid="WinJS.Promise.dispatchEvent">
-                /// Raises an event of the specified type and properties.
-                /// </summary>
-                /// <param name="eventType" locid="WinJS.Promise.dispatchEvent_p:eventType">
-                /// The type (name) of the event.
-                /// </param>
-                /// <param name="details" locid="WinJS.Promise.dispatchEvent_p:details">
-                /// The set of additional properties to be attached to the event object.
-                /// </param>
-                /// <returns type="Boolean" locid="WinJS.Promise.dispatchEvent_returnValue">
-                /// Specifies whether preventDefault was called on the event.
-                /// </returns>
-                /// </signature>
-                return promiseEventListeners.dispatchEvent(eventType, details);
-            },
-            is: function Promise_is(value) {
-                /// <signature helpKeyword="WinJS.Promise.is">
-                /// <summary locid="WinJS.Promise.is">
-                /// Determines whether a value fulfills the promise contract.
-                /// </summary>
-                /// <param name="value" locid="WinJS.Promise.is_p:value">
-                /// A value that may be a promise.
-                /// </param>
-                /// <returns type="Boolean" locid="WinJS.Promise.is_returnValue">
-                /// true if the specified value is a promise, otherwise false.
-                /// </returns>
-                /// </signature>
-                return value && typeof value === "object" && typeof value.then === "function";
-            },
-            join: function Promise_join(values) {
-                /// <signature helpKeyword="WinJS.Promise.join">
-                /// <summary locid="WinJS.Promise.join">
-                /// Creates a promise that is fulfilled when all the values are fulfilled.
-                /// </summary>
-                /// <param name="values" type="Object" locid="WinJS.Promise.join_p:values">
-                /// An object whose fields contain values, some of which may be promises.
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.Promise.join_returnValue">
-                /// A promise whose value is an object with the same field names as those of the object in the values parameter, where
-                /// each field value is the fulfilled value of a promise.
-                /// </returns>
-                /// </signature>
-                return new Promise(
-                    function (complete, error, progress) {
-                        var keys = Object.keys(values);
-                        var errors = Array.isArray(values) ? [] : {};
-                        var results = Array.isArray(values) ? [] : {};
-                        var undefineds = 0;
-                        var pending = keys.length;
-                        var argDone = function (key) {
-                            if ((--pending) === 0) {
-                                var errorCount = Object.keys(errors).length;
-                                if (errorCount === 0) {
-                                    complete(results);
-                                } else {
-                                    var canceledCount = 0;
-                                    keys.forEach(function (key) {
-                                        var e = errors[key];
-                                        if (e instanceof Error && e.name === canceledName) {
-                                            canceledCount++;
-                                        }
-                                    });
-                                    if (canceledCount === errorCount) {
-                                        complete(Promise.cancel);
-                                    } else {
-                                        error(errors);
-                                    }
-                                }
-                            } else {
-                                progress({ Key: key, Done: true });
-                            }
-                        };
-                        keys.forEach(function (key) {
-                            var value = values[key];
-                            if (value === undefined) {
-                                undefineds++;
-                            } else {
-                                Promise.then(value,
-                                    function (value) { results[key] = value; argDone(key); },
-                                    function (value) { errors[key] = value; argDone(key); }
-                                );
-                            }
-                        });
-                        pending -= undefineds;
-                        if (pending === 0) {
-                            complete(results);
-                            return;
-                        }
-                    },
-                    function () {
-                        Object.keys(values).forEach(function (key) {
-                            var promise = Promise.as(values[key]);
-                            if (typeof promise.cancel === "function") {
-                                promise.cancel();
-                            }
-                        });
-                    }
-                );
-            },
-            removeEventListener: function Promise_removeEventListener(eventType, listener, capture) {
-                /// <signature helpKeyword="WinJS.Promise.removeEventListener">
-                /// <summary locid="WinJS.Promise.removeEventListener">
-                /// Removes an event listener from the control.
-                /// </summary>
-                /// <param name='eventType' locid="WinJS.Promise.removeEventListener_eventType">
-                /// The type (name) of the event.
-                /// </param>
-                /// <param name='listener' locid="WinJS.Promise.removeEventListener_listener">
-                /// The listener to remove.
-                /// </param>
-                /// <param name='capture' locid="WinJS.Promise.removeEventListener_capture">
-                /// Specifies whether or not to initiate capture.
-                /// </param>
-                /// </signature>
-                promiseEventListeners.removeEventListener(eventType, listener, capture);
-            },
-            supportedForProcessing: false,
-            then: function Promise_then(value, onComplete, onError, onProgress) {
-                /// <signature helpKeyword="WinJS.Promise.then">
-                /// <summary locid="WinJS.Promise.then">
-                /// A static version of the promise instance method then().
-                /// </summary>
-                /// <param name="value" locid="WinJS.Promise.then_p:value">
-                /// the value to be treated as a promise.
-                /// </param>
-                /// <param name="onComplete" type="Function" locid="WinJS.Promise.then_p:complete">
-                /// The function to be called if the promise is fulfilled with a value.
-                /// If it is null, the promise simply
-                /// returns the value. The value is passed as the single argument.
-                /// </param>
-                /// <param name="onError" type="Function" optional="true" locid="WinJS.Promise.then_p:error">
-                /// The function to be called if the promise is fulfilled with an error. The error
-                /// is passed as the single argument.
-                /// </param>
-                /// <param name="onProgress" type="Function" optional="true" locid="WinJS.Promise.then_p:progress">
-                /// The function to be called if the promise reports progress. Data about the progress
-                /// is passed as the single argument. Promises are not required to support
-                /// progress.
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.Promise.then_returnValue">
-                /// A promise whose value is the result of executing the provided complete function.
-                /// </returns>
-                /// </signature>
-                return Promise.as(value).then(onComplete, onError, onProgress);
-            },
-            thenEach: function Promise_thenEach(values, onComplete, onError, onProgress) {
-                /// <signature helpKeyword="WinJS.Promise.thenEach">
-                /// <summary locid="WinJS.Promise.thenEach">
-                /// Performs an operation on all the input promises and returns a promise
-                /// that has the shape of the input and contains the result of the operation
-                /// that has been performed on each input.
-                /// </summary>
-                /// <param name="values" locid="WinJS.Promise.thenEach_p:values">
-                /// A set of values (which could be either an array or an object) of which some or all are promises.
-                /// </param>
-                /// <param name="onComplete" type="Function" locid="WinJS.Promise.thenEach_p:complete">
-                /// The function to be called if the promise is fulfilled with a value.
-                /// If the value is null, the promise returns the value.
-                /// The value is passed as the single argument.
-                /// </param>
-                /// <param name="onError" type="Function" optional="true" locid="WinJS.Promise.thenEach_p:error">
-                /// The function to be called if the promise is fulfilled with an error. The error
-                /// is passed as the single argument.
-                /// </param>
-                /// <param name="onProgress" type="Function" optional="true" locid="WinJS.Promise.thenEach_p:progress">
-                /// The function to be called if the promise reports progress. Data about the progress
-                /// is passed as the single argument. Promises are not required to support
-                /// progress.
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.Promise.thenEach_returnValue">
-                /// A promise that is the result of calling Promise.join on the values parameter.
-                /// </returns>
-                /// </signature>
-                var result = Array.isArray(values) ? [] : {};
-                Object.keys(values).forEach(function (key) {
-                    result[key] = Promise.as(values[key]).then(onComplete, onError, onProgress);
-                });
-                return Promise.join(result);
-            },
-            timeout: function Promise_timeout(time, promise) {
-                /// <signature helpKeyword="WinJS.Promise.timeout">
-                /// <summary locid="WinJS.Promise.timeout">
-                /// Creates a promise that is fulfilled after a timeout.
-                /// </summary>
-                /// <param name="timeout" type="Number" optional="true" locid="WinJS.Promise.timeout_p:timeout">
-                /// The timeout period in milliseconds. If this value is zero or not specified
-                /// setImmediate is called, otherwise setTimeout is called.
-                /// </param>
-                /// <param name="promise" type="Promise" optional="true" locid="WinJS.Promise.timeout_p:promise">
-                /// A promise that will be canceled if it doesn't complete before the
-                /// timeout has expired.
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.Promise.timeout_returnValue">
-                /// A promise that is completed asynchronously after the specified timeout.
-                /// </returns>
-                /// </signature>
-                var to = timeout(time);
-                return promise ? timeoutWithPromise(to, promise) : to;
-            },
-            wrap: function Promise_wrap(value) {
-                /// <signature helpKeyword="WinJS.Promise.wrap">
-                /// <summary locid="WinJS.Promise.wrap">
-                /// Wraps a non-promise value in a promise. You can use this function if you need
-                /// to pass a value to a function that requires a promise.
-                /// </summary>
-                /// <param name="value" locid="WinJS.Promise.wrap_p:value">
-                /// Some non-promise value to be wrapped in a promise.
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.Promise.wrap_returnValue">
-                /// A promise that is successfully fulfilled with the specified value
-                /// </returns>
-                /// </signature>
-                return new CompletePromise(value);
-            },
-            wrapError: function Promise_wrapError(error) {
-                /// <signature helpKeyword="WinJS.Promise.wrapError">
-                /// <summary locid="WinJS.Promise.wrapError">
-                /// Wraps a non-promise error value in a promise. You can use this function if you need
-                /// to pass an error to a function that requires a promise.
-                /// </summary>
-                /// <param name="error" locid="WinJS.Promise.wrapError_p:error">
-                /// A non-promise error value to be wrapped in a promise.
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.Promise.wrapError_returnValue">
-                /// A promise that is in an error state with the specified value.
-                /// </returns>
-                /// </signature>
-                return new ErrorPromise(error);
-            },
-
-            _veryExpensiveTagWithStack: {
-                get: function () { return tagWithStack; },
-                set: function (value) { tagWithStack = value; }
-            },
-            _veryExpensiveTagWithStack_tag: tag,
-            _getStack: function () {
-                if (_Global.Debug && _Global.Debug.debuggerEnabled) {
-                    try { throw new Error(); } catch (e) { return e.stack; }
-                }
-            },
-
-            _cancelBlocker: function Promise__cancelBlocker(input, oncancel) {
-                //
-                // Returns a promise which on cancelation will still result in downstream cancelation while
-                //  protecting the promise 'input' from being  canceled which has the effect of allowing
-                //  'input' to be shared amoung various consumers.
-                //
-                if (!Promise.is(input)) {
-                    return Promise.wrap(input);
-                }
-                var complete;
-                var error;
-                var output = new Promise(
-                    function (c, e) {
-                        complete = c;
-                        error = e;
-                    },
-                    function () {
-                        complete = null;
-                        error = null;
-                        oncancel && oncancel();
-                    }
-                );
-                input.then(
-                    function (v) { complete && complete(v); },
-                    function (e) { error && error(e); }
-                );
-                return output;
-            },
-
-        }
-    );
-    Object.defineProperties(Promise, _Events.createEventProperties(errorET));
-
-    Promise._doneHandler = function (value) {
-        _BaseCoreUtils._setImmediate(function Promise_done_rethrow() {
-            throw value;
-        });
-    };
-
-    return {
-        PromiseStateMachine: PromiseStateMachine,
-        Promise: Promise,
-        state_created: state_created
-    };
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Promise',[
-    './Core/_Base',
-    './Promise/_StateMachine'
-    ], function promiseInit( _Base, _StateMachine) {
-    "use strict";
-
-    _Base.Namespace.define("WinJS", {
-        Promise: _StateMachine.Promise
-    });
-
-    return _StateMachine.Promise;
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Core/_Log',[
-    'exports',
-    './_Global',
-    './_Base',
-    ], function logInit(exports, _Global, _Base) {
-    "use strict";
-
-    var spaceR = /\s+/g;
-    var typeR = /^(error|warn|info|log)$/;
-    var WinJSLog = null;
-
-    function format(message, tag, type) {
-        /// <signature helpKeyword="WinJS.Utilities.formatLog">
-        /// <summary locid="WinJS.Utilities.formatLog">
-        /// Adds tags and type to a logging message.
-        /// </summary>
-        /// <param name="message" type="String" locid="WinJS.Utilities.startLog_p:message">The message to format.</param>
-        /// <param name="tag" type="String" locid="WinJS.Utilities.startLog_p:tag">
-        /// The tag(s) to apply to the message. Separate multiple tags with spaces.
-        /// </param>
-        /// <param name="type" type="String" locid="WinJS.Utilities.startLog_p:type">The type of the message.</param>
-        /// <returns type="String" locid="WinJS.Utilities.startLog_returnValue">The formatted message.</returns>
-        /// </signature>
-        var m = message;
-        if (typeof (m) === "function") { m = m(); }
-
-        return ((type && typeR.test(type)) ? ("") : (type ? (type + ": ") : "")) +
-            (tag ? tag.replace(spaceR, ":") + ": " : "") +
-            m;
-    }
-    function defAction(message, tag, type) {
-        var m = exports.formatLog(message, tag, type);
-        if (_Global.console) {
-            _Global.console[(type && typeR.test(type)) ? type : "log"](m);
-        }
-    }
-    function escape(s) {
-        // \s (whitespace) is used as separator, so don't escape it
-        return s.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&");
-    }
-    _Base.Namespace._moduleDefine(exports, "WinJS.Utilities", {
-        startLog: function (options) {
-            /// <signature helpKeyword="WinJS.Utilities.startLog">
-            /// <summary locid="WinJS.Utilities.startLog">
-            /// Configures a logger that writes messages containing the specified tags from WinJS.log to console.log.
-            /// </summary>
-            /// <param name="options" type="String" locid="WinJS.Utilities.startLog_p:options">
-            /// The tags for messages to log. Separate multiple tags with spaces.
-            /// </param>
-            /// </signature>
-            /// <signature>
-            /// <summary locid="WinJS.Utilities.startLog2">
-            /// Configure a logger to write WinJS.log output.
-            /// </summary>
-            /// <param name="options" type="Object" locid="WinJS.Utilities.startLog_p:options2">
-            /// May contain .type, .tags, .excludeTags and .action properties.
-            ///  - .type is a required tag.
-            ///  - .excludeTags is a space-separated list of tags, any of which will result in a message not being logged.
-            ///  - .tags is a space-separated list of tags, any of which will result in a message being logged.
-            ///  - .action is a function that, if present, will be called with the log message, tags and type. The default is to log to the console.
-            /// </param>
-            /// </signature>
-            options = options || {};
-            if (typeof options === "string") {
-                options = { tags: options };
-            }
-            var el = options.type && new RegExp("^(" + escape(options.type).replace(spaceR, " ").split(" ").join("|") + ")$");
-            var not = options.excludeTags && new RegExp("(^|\\s)(" + escape(options.excludeTags).replace(spaceR, " ").split(" ").join("|") + ")(\\s|$)", "i");
-            var has = options.tags && new RegExp("(^|\\s)(" + escape(options.tags).replace(spaceR, " ").split(" ").join("|") + ")(\\s|$)", "i");
-            var action = options.action || defAction;
-
-            if (!el && !not && !has && !exports.log) {
-                exports.log = action;
-                return;
-            }
-
-            var result = function (message, tag, type) {
-                if (!((el && !el.test(type))          // if the expected log level is not satisfied
-                    || (not && not.test(tag))         // if any of the excluded categories exist
-                    || (has && !has.test(tag)))) {    // if at least one of the included categories doesn't exist
-                        action(message, tag, type);
-                    }
-
-                result.next && result.next(message, tag, type);
-            };
-            result.next = exports.log;
-            exports.log = result;
-        },
-        stopLog: function () {
-            /// <signature helpKeyword="WinJS.Utilities.stopLog">
-            /// <summary locid="WinJS.Utilities.stopLog">
-            /// Removes the previously set up logger.
-            /// </summary>
-            /// </signature>
-            exports.log = null;
-        },
-        formatLog: format
-    });
-
-    _Base.Namespace._moduleDefine(exports, "WinJS", {
-        log: {
-            get: function () {
-                return WinJSLog;
-            },
-            set: function (value) {
-                WinJSLog = value;
-            }
-        }
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Scheduler',[
-    'exports',
-    './Core/_Global',
-    './Core/_Base',
-    './Core/_ErrorFromName',
-    './Core/_Log',
-    './Core/_Resources',
-    './Core/_Trace',
-    './Core/_WriteProfilerMark',
-    './Promise'
-    ], function schedulerInit(exports, _Global, _Base, _ErrorFromName, _Log, _Resources, _Trace, _WriteProfilerMark, Promise) {
-    "use strict";
-
-    function linkedListMixin(name) {
-        var mixin = {};
-        var PREV = "_prev" + name;
-        var NEXT = "_next" + name;
-        mixin["_remove" + name] = function () {
-            // Assumes we always have a static head and tail.
-            //
-            var prev = this[PREV];
-            var next = this[NEXT];
-            // PREV <-> NEXT
-            //
-            next && (next[PREV] = prev);
-            prev && (prev[NEXT] = next);
-            // null <- this -> null
-            //
-            this[PREV] = null;
-            this[NEXT] = null;
-        };
-        mixin["_insert" + name + "Before"] = function (node) {
-            var prev = this[PREV];
-            // PREV -> node -> this
-            //
-            prev && (prev[NEXT] = node);
-            node[NEXT] = this;
-            // PREV <- node <- this
-            //
-            node[PREV] = prev;
-            this[PREV] = node;
-
-            return node;
-        };
-        mixin["_insert" + name + "After"] = function (node) {
-            var next = this[NEXT];
-            // this -> node -> NEXT
-            //
-            this[NEXT] = node;
-            node[NEXT] = next;
-            // this <- node <- NEXT
-            //
-            node[PREV] = this;
-            next && (next[PREV] = node);
-
-            return node;
-        };
-        return mixin;
-    }
-
-    _Base.Namespace.define("WinJS.Utilities", {
-
-        _linkedListMixin: linkedListMixin
-
-    });
-
-    var strings = {
-        get jobInfoIsNoLongerValid() { return "The job info object can only be used while the job is running"; }
-    };
-
-    //
-    // Profiler mark helpers
-    //
-    // markerType must be one of the following: info, StartTM, StopTM
-    //
-
-    function profilerMarkArgs(arg0, arg1, arg2) {
-        if (arg2 !== undefined) {
-            return "(" + arg0 + ";" + arg1 + ";" + arg2 + ")";
-        } else if (arg1 !== undefined) {
-            return "(" + arg0 + ";" + arg1 + ")";
-        } else if (arg0 !== undefined) {
-            return "(" + arg0 + ")";
-        } else {
-            return "";
-        }
-    }
-
-    function schedulerProfilerMark(operation, markerType, arg0, arg1) {
-        _WriteProfilerMark(
-            "WinJS.Scheduler:" + operation +
-            profilerMarkArgs(arg0, arg1) +
-            "," + markerType
-        );
-    }
-
-    function jobProfilerMark(job, operation, markerType, arg0, arg1) {
-        var argProvided = job.name || arg0 !== undefined || arg1 !== undefined;
-
-        _WriteProfilerMark(
-            "WinJS.Scheduler:" + operation + ":" + job.id +
-            (argProvided ? profilerMarkArgs(job.name, arg0, arg1) : "") +
-            "," + markerType
-        );
-    }
-
-    //
-    // Job type. This cannot be instantiated by developers and is instead handed back by the scheduler
-    //  schedule method. Its public interface is what is used when interacting with a job.
-    //
-
-    var JobNode = _Base.Class.define(function (id, work, priority, context, name, asyncOpID) {
-        this._id = id;
-        this._work = work;
-        this._context = context;
-        this._name = name;
-        this._asyncOpID = asyncOpID;
-        this._setPriority(priority);
-        this._setState(state_created);
-        jobProfilerMark(this, "job-scheduled", "info");
-    }, {
-
-        /// <field type="Boolean" locid="WinJS.Utilities.Scheduler._JobNode.completed" helpKeyword="WinJS.Utilities.Scheduler._JobNode.completed">
-        /// Gets a value that indicates whether the job has completed. This value is true if job has run to completion
-        /// and false if it hasn't yet run or was canceled.
-        /// </field>
-        completed: {
-            get: function () { return !!this._state.completed; }
-        },
-
-        /// <field type="Number" locid="WinJS.Utilities.Scheduler._JobNode.id" helpKeyword="WinJS.Utilities.Scheduler._JobNode.id">
-        /// Gets the unique identifier for this job.
-        /// </field>
-        id: {
-            get: function () { return this._id; }
-        },
-
-        /// <field type="String" locid="WinJS.Utilities.Scheduler._JobNode.name" helpKeyword="WinJS.Utilities.Scheduler._JobNode.name">
-        /// Gets or sets a string that specifies the diagnostic name for this job.
-        /// </field>
-        name: {
-            get: function () { return this._name; },
-            set: function (value) { this._name = value; }
-        },
-
-        /// <field type="WinJS.Utilities.Scheduler._OwnerToken" locid="WinJS.Utilities.Scheduler._JobNode.owner" helpKeyword="WinJS.Utilities.Scheduler._JobNode.owner">
-        /// Gets an owner token for the job. You can use this owner token's cancelAll method to cancel related jobs.
-        /// </field>
-        owner: {
-            get: function () { return this._owner; },
-            set: function (value) {
-                this._owner && this._owner._remove(this);
-                this._owner = value;
-                this._owner && this._owner._add(this);
-            }
-        },
-
-        /// <field type="WinJS.Utilities.Scheduler.Priority" locid="WinJS.Utilities.Scheduler._JobNode.priority" helpKeyword="WinJS.Utilities.Scheduler._JobNode.priority">
-        /// Gets or sets the priority at which this job is executed by the scheduler.
-        /// </field>
-        priority: {
-            get: function () { return this._priority; },
-            set: function (value) {
-                value = clampPriority(value);
-                this._state.setPriority(this, value);
-            }
-        },
-
-        cancel: function () {
-            /// <signature helpKeyword="WinJS.Utilities.Scheduler._JobNode.cancel">
-            /// <summary locid="WinJS.Utilities.Scheduler._JobNode.cancel">Cancels the job.</summary>
-            /// </signature>
-            this._state.cancel(this);
-        },
-
-        pause: function () {
-            /// <signature helpKeyword="WinJS.Utilities.Scheduler._JobNode.pause">
-            /// <summary locid="WinJS.Utilities.Scheduler._JobNode.pause">Pauses the job.</summary>
-            /// </signature>
-            this._state.pause(this);
-        },
-
-        resume: function () {
-            /// <signature helpKeyword="WinJS.Utilities.Scheduler._JobNode.resume">
-            /// <summary locid="WinJS.Utilities.Scheduler._JobNode.resume">Resumes the job if it's been paused.</summary>
-            /// </signature>
-            this._state.resume(this);
-        },
-
-        _execute: function (shouldYield) {
-            this._state.execute(this, shouldYield);
-        },
-
-        _executeDone: function (result) {
-            return this._state.executeDone(this, result);
-        },
-
-        _blockedDone: function (result) {
-            return this._state.blockedDone(this, result);
-        },
-
-        _setPriority: function (value) {
-            if (+this._priority === this._priority && this._priority !== value) {
-                jobProfilerMark(this, "job-priority-changed", "info",
-                    markerFromPriority(this._priority).name,
-                    markerFromPriority(value).name);
-            }
-            this._priority = value;
-        },
-
-        _setState: function (state, arg0, arg1) {
-            if (this._state) {
-                _Log.log && _Log.log("Transitioning job (" + this.id + ") from: " + this._state.name + " to: " + state.name, "winjs scheduler", "log");
-            }
-            this._state = state;
-            this._state.enter(this, arg0, arg1);
-        },
-
-    });
-    _Base.Class.mix(JobNode, linkedListMixin("Job"));
-
-    var YieldPolicy = {
-        complete: 1,
-        continue: 2,
-        block: 3,
-    };
-
-    //
-    // JobInfo object is passed to a work item when it is executed and allows the work to ask whether it
-    //  should cooperatively yield and in that event provide a continuation work function to run the
-    //  next time this job is scheduled. The JobInfo object additionally allows access to the job itself
-    //  and the ability to provide a Promise for a future continuation work function in order to have
-    //  jobs easily block on async work.
-    //
-
-    var JobInfo = _Base.Class.define(function (shouldYield, job) {
-        this._job = job;
-        this._result = null;
-        this._yieldPolicy = YieldPolicy.complete;
-        this._shouldYield = shouldYield;
-    }, {
-
-        /// <field type="WinJS.Utilities.Scheduler._JobNode" locid="WinJS.Utilities.Scheduler._JobInfo.job" helpKeyword="WinJS.Utilities.Scheduler._JobInfo.job">
-        /// The job instance for which the work is currently being executed.
-        /// </field>
-        job: {
-            get: function () {
-                this._throwIfDisabled();
-                return this._job;
-            }
-        },
-
-        /// <field type="Boolean" locid="WinJS.Utilities.Scheduler._JobInfo.shouldYield" helpKeyword="WinJS.Utilities.Scheduler._JobInfo.shouldYield">
-        /// A boolean which will become true when the work item is requested to cooperatively yield by the scheduler.
-        /// </field>
-        shouldYield: {
-            get: function () {
-                this._throwIfDisabled();
-                return this._shouldYield();
-            }
-        },
-
-        setPromise: function (promise) {
-            /// <signature helpKeyword="WinJS.Utilities.Scheduler._JobInfo.setPromise">
-            /// <summary locid="WinJS.Utilities.Scheduler._JobInfo.setPromise">
-            /// Called when the  work item is blocked on asynchronous work.
-            /// The scheduler waits for the specified Promise to complete before rescheduling the job.
-            /// </summary>
-            /// <param name="promise" type="WinJS.Promise" locid="WinJS.Utilities.Scheduler._JobInfo.setPromise_p:promise">
-            /// A Promise value which, when completed, provides a work item function to be re-scheduled.
-            /// </param>
-            /// </signature>
-            this._throwIfDisabled();
-            this._result = promise;
-            this._yieldPolicy = YieldPolicy.block;
-        },
-
-        setWork: function (work) {
-            /// <signature helpKeyword="WinJS.Utilities.Scheduler._JobInfo.setWork">
-            /// <summary locid="WinJS.Utilities.Scheduler._JobInfo.setWork">
-            /// Called  when the work item is cooperatively yielding to the scheduler and has more work to complete in the future.
-            /// Use this method to schedule additonal work for when the work item is about to yield.
-            /// </summary>
-            /// <param name="work" type="Function" locid="WinJS.Utilities.Scheduler._JobInfo.setWork_p:work">
-            /// The work function which will be re-scheduled.
-            /// </param>
-            /// </signature>
-            this._throwIfDisabled();
-            this._result = work;
-            this._yieldPolicy = YieldPolicy.continue;
-        },
-
-        _disablePublicApi: function () {
-            // _disablePublicApi should be called as soon as the job yields. This
-            //  says that the job info object should no longer be used by the
-            //  job and if the job tries to use it, job info will throw.
-            //
-            this._publicApiDisabled = true;
-        },
-
-        _throwIfDisabled: function () {
-            if (this._publicApiDisabled) {
-                throw new _ErrorFromName("WinJS.Utilities.Scheduler.JobInfoIsNoLongerValid", strings.jobInfoIsNoLongerValid);
-            }
-        }
-
-    });
-
-    //
-    // Owner type. Made available to developers through the createOwnerToken method.
-    //  Allows cancelation of jobs in bulk.
-    //
-
-    var OwnerToken = _Base.Class.define(function OwnerToken_ctor() {
-        this._jobs = {};
-    }, {
-        cancelAll: function OwnerToken_cancelAll() {
-            /// <signature helpKeyword="WinJS.Utilities.Scheduler._OwnerToken.cancelAll">
-            /// <summary locid="WinJS.Utilities.Scheduler._OwnerToken.cancelAll">
-            /// Cancels all jobs that are associated with this owner token.
-            /// </summary>
-            /// </signature>
-            var jobs = this._jobs,
-                jobIds = Object.keys(jobs);
-            this._jobs = {};
-
-            for (var i = 0, len = jobIds.length; i < len; i++) {
-                jobs[jobIds[i]].cancel();
-            }
-        },
-
-        _add: function OwnerToken_add(job) {
-            this._jobs[job.id] = job;
-        },
-
-        _remove: function OwnerToken_remove(job) {
-            delete this._jobs[job.id];
-        }
-    });
-
-    function _() {
-        // Noop function, used in the various states to indicate that they don't support a given
-        // message. Named with the somewhat cute name '_' because it reads really well in the states.
-        //
-        return false;
-    }
-    function illegal(job) {
-        /*jshint validthis: true */
-        throw "Illegal call by job(" + job.id + ") in state: " + this.name;
-    }
-
-    //
-    // Scheduler job state machine.
-    //
-    // A job normally goes through a lifecycle which is created -> scheduled -> running -> complete. The
-    //  Scheduler decides when to transition a job from scheduled to running based on its policies and
-    //  the other work which is scheduled.
-    //
-    // Additionally there are various operations which can be performed on a job which will change its
-    //  state like: cancel, pause, resume and setting the job's priority.
-    //
-    // Additionally when in the running state a job may either cooperatively yield, or block.
-    //
-    // The job state machine accounts for these various states and interactions.
-    //
-
-    var State = _Base.Class.define(function (name) {
-        this.name = name;
-        this.enter = illegal;
-        this.execute = illegal;
-        this.executeDone = illegal;
-        this.blockedDone = illegal;
-        this.cancel = illegal;
-        this.pause = illegal;
-        this.resume = illegal;
-        this.setPriority = illegal;
-    });
-
-    var state_created = new State("created"),                                   // -> scheduled
-        state_scheduled = new State("scheduled"),                               // -> running | canceled | paused
-        state_paused = new State("paused"),                                     // -> canceled | scheduled
-        state_canceled = new State("canceled"),                                 // -> .
-        state_running = new State("running"),                                   // -> cooperative_yield | blocked | complete | running_canceled | running_paused
-        state_running_paused = new State("running_paused"),                     // -> cooperative_yield_paused | blocked_paused | complete | running_canceled | running_resumed
-        state_running_resumed = new State("running_resumed"),                   // -> cooperative_yield | blocked | complete | running_canceled | running_paused
-        state_running_canceled = new State("running_canceled"),                 // -> canceled | running_canceled_blocked
-        state_running_canceled_blocked = new State("running_canceled_blocked"), // -> canceled
-        state_cooperative_yield = new State("cooperative_yield"),               // -> scheduled
-        state_cooperative_yield_paused = new State("cooperative_yield_paused"), // -> paused
-        state_blocked = new State("blocked"),                                   // -> blocked_waiting
-        state_blocked_waiting = new State("blocked_waiting"),                   // -> cooperative_yield | complete | blocked_canceled | blocked_paused_waiting
-        state_blocked_paused = new State("blocked_paused"),                     // -> blocked_paused_waiting
-        state_blocked_paused_waiting = new State("blocked_paused_waiting"),     // -> cooperative_yield_paused | complete | blocked_canceled | blocked_waiting
-        state_blocked_canceled = new State("blocked_canceled"),                 // -> canceled
-        state_complete = new State("complete");                                 // -> .
-
-    // A given state may include implementations for the following operations:
-    //
-    //  - enter(job, arg0, arg1)
-    //  - execute(job, shouldYield)
-    //  - executeDone(job, result) --> next state
-    //  - blockedDone(job, result, initialPriority)
-    //  - cancel(job)
-    //  - pause(job)
-    //  - resume(job)
-    //  - setPriority(job, priority)
-    //
-    // Any functions which are not implemented are illegal in that state.
-    // Any functions which have an implementation of _ are a nop in that state.
-    //
-
-    // Helper which yields a function that transitions to the specified state
-    //
-    function setState(state) {
-        return function (job, arg0, arg1) {
-            job._setState(state, arg0, arg1);
-        };
-    }
-
-    // Helper which sets the priority of a job.
-    //
-    function changePriority(job, priority) {
-        job._setPriority(priority);
-    }
-
-    // Created
-    //
-    state_created.enter = function (job) {
-        addJobAtTailOfPriority(job, job.priority);
-        job._setState(state_scheduled);
-    };
-
-    // Scheduled
-    //
-    state_scheduled.enter = function () {
-        startRunning();
-    };
-    state_scheduled.execute = setState(state_running);
-    state_scheduled.cancel = setState(state_canceled);
-    state_scheduled.pause = setState(state_paused);
-    state_scheduled.resume = _;
-    state_scheduled.setPriority = function (job, priority) {
-        if (job.priority !== priority) {
-            job._setPriority(priority);
-            job.pause();
-            job.resume();
-        }
-    };
-
-    // Paused
-    //
-    state_paused.enter = function (job) {
-        jobProfilerMark(job, "job-paused", "info");
-        job._removeJob();
-    };
-    state_paused.cancel = setState(state_canceled);
-    state_paused.pause = _;
-    state_paused.resume = function (job) {
-        jobProfilerMark(job, "job-resumed", "info");
-        addJobAtTailOfPriority(job, job.priority);
-        job._setState(state_scheduled);
-    };
-    state_paused.setPriority = changePriority;
-
-    // Canceled
-    //
-    state_canceled.enter = function (job) {
-        jobProfilerMark(job, "job-canceled", "info");
-        _Trace._traceAsyncOperationCompleted(job._asyncOpID, _Global.Debug && _Global.Debug.MS_ASYNC_OP_STATUS_CANCELED);
-        job._removeJob();
-        job._work = null;
-        job._context = null;
-        job.owner = null;
-    };
-    state_canceled.cancel = _;
-    state_canceled.pause = _;
-    state_canceled.resume = _;
-    state_canceled.setPriority = _;
-
-    // Running
-    //
-    state_running.enter = function (job, shouldYield) {
-        // Remove the job from the list in case it throws an exception, this means in the
-        //  yield case we have to add it back.
-        //
-        job._removeJob();
-
-        var priority = job.priority;
-        var work = job._work;
-        var context = job._context;
-
-        // Null out the work and context so they aren't leaked if the job throws an exception.
-        //
-        job._work = null;
-        job._context = null;
-
-        var jobInfo = new JobInfo(shouldYield, job);
-
-        _Trace._traceAsyncCallbackStarting(job._asyncOpID);
-        try {
-            MSApp.execAtPriority(function () {
-                work.call(context, jobInfo);
-            }, toWwaPriority(priority));
-        } finally {
-            _Trace._traceAsyncCallbackCompleted();
-            jobInfo._disablePublicApi();
-        }
-
-        // Restore the context in case it is needed due to yielding or blocking.
-        //
-        job._context = context;
-
-        var targetState = job._executeDone(jobInfo._yieldPolicy);
-
-        job._setState(targetState, jobInfo._result, priority);
-    };
-    state_running.executeDone = function (job, yieldPolicy) {
-        switch (yieldPolicy) {
-            case YieldPolicy.complete:
-                return state_complete;
-            case YieldPolicy.continue:
-                return state_cooperative_yield;
-            case YieldPolicy.block:
-                return state_blocked;
-        }
-    };
-    state_running.cancel = function (job) {
-        // Interaction with the singleton scheduler. The act of canceling a job pokes the scheduler
-        //  and tells it to start asking the job to yield.
-        //
-        immediateYield = true;
-        job._setState(state_running_canceled);
-    };
-    state_running.pause = function (job) {
-        // Interaction with the singleton scheduler. The act of pausing a job pokes the scheduler
-        //  and tells it to start asking the job to yield.
-        //
-        immediateYield = true;
-        job._setState(state_running_paused);
-    };
-    state_running.resume = _;
-    state_running.setPriority = changePriority;
-
-    // Running paused
-    //
-    state_running_paused.enter = _;
-    state_running_paused.executeDone = function (job, yieldPolicy) {
-        switch (yieldPolicy) {
-            case YieldPolicy.complete:
-                return state_complete;
-            case YieldPolicy.continue:
-                return state_cooperative_yield_paused;
-            case YieldPolicy.block:
-                return state_blocked_paused;
-        }
-    };
-    state_running_paused.cancel = setState(state_running_canceled);
-    state_running_paused.pause = _;
-    state_running_paused.resume = setState(state_running_resumed);
-    state_running_paused.setPriority = changePriority;
-
-    // Running resumed
-    //
-    state_running_resumed.enter = _;
-    state_running_resumed.executeDone = function (job, yieldPolicy) {
-        switch (yieldPolicy) {
-            case YieldPolicy.complete:
-                return state_complete;
-            case YieldPolicy.continue:
-                return state_cooperative_yield;
-            case YieldPolicy.block:
-                return state_blocked;
-        }
-    };
-    state_running_resumed.cancel = setState(state_running_canceled);
-    state_running_resumed.pause = setState(state_running_paused);
-    state_running_resumed.resume = _;
-    state_running_resumed.setPriority = changePriority;
-
-    // Running canceled
-    //
-    state_running_canceled.enter = _;
-    state_running_canceled.executeDone = function (job, yieldPolicy) {
-        switch (yieldPolicy) {
-            case YieldPolicy.complete:
-            case YieldPolicy.continue:
-                return state_canceled;
-            case YieldPolicy.block:
-                return state_running_canceled_blocked;
-        }
-    };
-    state_running_canceled.cancel = _;
-    state_running_canceled.pause = _;
-    state_running_canceled.resume = _;
-    state_running_canceled.setPriority = _;
-
-    // Running canceled -> blocked
-    //
-    state_running_canceled_blocked.enter = function (job, work) {
-        work.cancel();
-        job._setState(state_canceled);
-    };
-
-    // Cooperative yield
-    //
-    state_cooperative_yield.enter = function (job, work, initialPriority) {
-        jobProfilerMark(job, "job-yielded", "info");
-        if (initialPriority === job.priority) {
-            addJobAtHeadOfPriority(job, job.priority);
-        } else {
-            addJobAtTailOfPriority(job, job.priority);
-        }
-        job._work = work;
-        job._setState(state_scheduled);
-    };
-
-    // Cooperative yield paused
-    //
-    state_cooperative_yield_paused.enter = function (job, work) {
-        jobProfilerMark(job, "job-yielded", "info");
-        job._work = work;
-        job._setState(state_paused);
-    };
-
-    // Blocked
-    //
-    state_blocked.enter = function (job, work, initialPriority) {
-        jobProfilerMark(job, "job-blocked", "StartTM");
-        job._work = work;
-        job._setState(state_blocked_waiting);
-
-        // Sign up for a completion from the provided promise, after the completion occurs
-        //  transition from the current state at the completion time to the target state
-        //  depending on the completion value.
-        //
-        work.done(
-            function (newWork) {
-                jobProfilerMark(job, "job-blocked", "StopTM");
-                var targetState = job._blockedDone(newWork);
-                job._setState(targetState, newWork, initialPriority);
-            },
-            function (error) {
-                if (!(error && error.name === "Canceled")) {
-                    jobProfilerMark(job, "job-error", "info");
-                }
-                jobProfilerMark(job, "job-blocked", "StopTM");
-                job._setState(state_canceled);
-                return Promise.wrapError(error);
-            }
-        );
-    };
-
-    // Blocked waiting
-    //
-    state_blocked_waiting.enter = _;
-    state_blocked_waiting.blockedDone = function (job, result) {
-        if (typeof result === "function") {
-            return state_cooperative_yield;
-        } else {
-            return state_complete;
-        }
-    };
-    state_blocked_waiting.cancel = setState(state_blocked_canceled);
-    state_blocked_waiting.pause = setState(state_blocked_paused_waiting);
-    state_blocked_waiting.resume = _;
-    state_blocked_waiting.setPriority = changePriority;
-
-    // Blocked paused
-    //
-    state_blocked_paused.enter = function (job, work, initialPriority) {
-        jobProfilerMark(job, "job-blocked", "StartTM");
-        job._work = work;
-        job._setState(state_blocked_paused_waiting);
-
-        // Sign up for a completion from the provided promise, after the completion occurs
-        //  transition from the current state at the completion time to the target state
-        //  depending on the completion value.
-        //
-        work.done(
-            function (newWork) {
-                jobProfilerMark(job, "job-blocked", "StopTM");
-                var targetState = job._blockedDone(newWork);
-                job._setState(targetState, newWork, initialPriority);
-            },
-            function (error) {
-                if (!(error && error.name === "Canceled")) {
-                    jobProfilerMark(job, "job-error", "info");
-                }
-                jobProfilerMark(job, "job-blocked", "StopTM");
-                job._setState(state_canceled);
-                return Promise.wrapError(error);
-            }
-        );
-    };
-
-    // Blocked paused waiting
-    //
-    state_blocked_paused_waiting.enter = _;
-    state_blocked_paused_waiting.blockedDone = function (job, result) {
-        if (typeof result === "function") {
-            return state_cooperative_yield_paused;
-        } else {
-            return state_complete;
-        }
-    };
-    state_blocked_paused_waiting.cancel = setState(state_blocked_canceled);
-    state_blocked_paused_waiting.pause = _;
-    state_blocked_paused_waiting.resume = setState(state_blocked_waiting);
-    state_blocked_paused_waiting.setPriority = changePriority;
-
-    // Blocked canceled
-    //
-    state_blocked_canceled.enter = function (job) {
-        // Cancel the outstanding promise and then eventually it will complete, presumably with a 'canceled'
-        //  error at which point we will transition to the canceled state.
-        //
-        job._work.cancel();
-        job._work = null;
-    };
-    state_blocked_canceled.blockedDone = function () {
-        return state_canceled;
-    };
-    state_blocked_canceled.cancel = _;
-    state_blocked_canceled.pause = _;
-    state_blocked_canceled.resume = _;
-    state_blocked_canceled.setPriority = _;
-
-    // Complete
-    //
-    state_complete.completed = true;
-    state_complete.enter = function (job) {
-        _Trace._traceAsyncOperationCompleted(job._asyncOpID, _Global.Debug && _Global.Debug.MS_ASYNC_OP_STATUS_SUCCESS);
-        job._work = null;
-        job._context = null;
-        job.owner = null;
-        jobProfilerMark(job, "job-completed", "info");
-    };
-    state_complete.cancel = _;
-    state_complete.pause = _;
-    state_complete.resume = _;
-    state_complete.setPriority = _;
-
-    // Private Priority marker node in the Job list. The marker nodes are linked both into the job
-    //  list and a separate marker list. This is used so that jobs can be easily added into a given
-    //  priority level by simply traversing to the next marker in the list and inserting before it.
-    //
-    // Markers may either be "static" or "dynamic". Static markers are the set of things which are
-    //  named and are always in the list, they may exist with or without jobs at their priority
-    //  level. Dynamic markers are added as needed.
-    //
-    // @NOTE: Dynamic markers are NYI
-    //
-    var MarkerNode = _Base.Class.define(function (priority, name) {
-        this.priority = priority;
-        this.name = name;
-    }, {
-
-        // NYI
-        //
-        //dynamic: {
-        //    get: function () { return !this.name; }
-        //},
-
-    });
-    _Base.Class.mix(MarkerNode, linkedListMixin("Job"), linkedListMixin("Marker"));
-
-    //
-    // Scheduler state
-    //
-
-    // Unique ID per job.
-    //
-    var globalJobId = 0;
-
-    // Unique ID per drain request.
-    var globalDrainId = 0;
-
-    // Priority is: -15 ... 0 ... 15 where that maps to: 'min' ... 'normal' ... 'max'
-    //
-    var MIN_PRIORITY = -15;
-    var MAX_PRIORITY = 15;
-
-    // Named priorities
-    //
-    var Priority = {
-        max: 15,
-        high: 13,
-        aboveNormal: 9,
-        normal: 0,
-        belowNormal: -9,
-        idle: -13,
-        min: -15,
-    };
-
-    // Definition of the priorities, named have static markers.
-    //
-    var priorities = [
-        new MarkerNode(15, "max"),          // Priority.max
-        new MarkerNode(14, "14"),
-        new MarkerNode(13, "high"),         // Priority.high
-        new MarkerNode(12, "12"),
-        new MarkerNode(11, "11"),
-        new MarkerNode(10, "10"),
-        new MarkerNode(9, "aboveNormal"),   // Priority.aboveNormal
-        new MarkerNode(8, "8"),
-        new MarkerNode(7, "7"),
-        new MarkerNode(6, "6"),
-        new MarkerNode(5, "5"),
-        new MarkerNode(4, "4"),
-        new MarkerNode(3, "3"),
-        new MarkerNode(2, "2"),
-        new MarkerNode(1, "1"),
-        new MarkerNode(0, "normal"),        // Priority.normal
-        new MarkerNode(-1, "-1"),
-        new MarkerNode(-2, "-2"),
-        new MarkerNode(-3, "-3"),
-        new MarkerNode(-4, "-4"),
-        new MarkerNode(-5, "-5"),
-        new MarkerNode(-6, "-6"),
-        new MarkerNode(-7, "-7"),
-        new MarkerNode(-8, "-8"),
-        new MarkerNode(-9, "belowNormal"),  // Priority.belowNormal
-        new MarkerNode(-10, "-10"),
-        new MarkerNode(-11, "-11"),
-        new MarkerNode(-12, "-12"),
-        new MarkerNode(-13, "idle"),        // Priority.idle
-        new MarkerNode(-14, "-14"),
-        new MarkerNode(-15, "min"),         // Priority.min
-        new MarkerNode(-16, "<TAIL>")
-    ];
-
-    function dumpList(type, reverse) {
-        function dumpMarker(marker, pos) {
-            _Log.log && _Log.log(pos + ": MARKER: " + marker.name, "winjs scheduler", "log");
-        }
-        function dumpJob(job, pos) {
-            _Log.log && _Log.log(pos + ": JOB(" + job.id + "): state: " + (job._state ? job._state.name : "") + (job.name ? ", name: " + job.name : ""), "winjs scheduler", "log");
-        }
-        _Log.log && _Log.log("highWaterMark: " + highWaterMark, "winjs scheduler", "log");
-        var pos = 0;
-        var head = reverse ? priorities[priorities.length - 1] : priorities[0];
-        var current = head;
-        do {
-            if (current instanceof MarkerNode) {
-                dumpMarker(current, pos);
-            }
-            if (current instanceof JobNode) {
-                dumpJob(current, pos);
-            }
-            pos++;
-            current = reverse ? current["_prev" + type] : current["_next" + type];
-        } while (current);
-    }
-
-    function retrieveState() {
-        /// <signature helpKeyword="WinJS.Utilities.Scheduler.retrieveState">
-        /// <summary locid="WinJS.Utilities.Scheduler.retrieveState">
-        /// Returns a string representation of the scheduler's state for diagnostic
-        /// purposes. The jobs and drain requests are displayed in the order in which
-        /// they are currently expected to be processed. The current job and drain
-        /// request are marked by an asterisk.
-        /// </summary>
-        /// </signature>
-        var output = "";
-
-        function logJob(job, isRunning) {
-            output +=
-                "    " + (isRunning ? "*" : " ") +
-                "id: " + job.id +
-                ", priority: " + markerFromPriority(job.priority).name +
-                (job.name ? ", name: " + job.name : "") +
-                "\n";
-        }
-
-        output += "Jobs:\n";
-        var current = markerFromPriority(highWaterMark);
-        var jobCount = 0;
-        if (runningJob) {
-            logJob(runningJob, true);
-            jobCount++;
-        }
-        while (current.priority >= Priority.min) {
-            if (current instanceof JobNode) {
-                logJob(current, false);
-                jobCount++;
-            }
-            current = current._nextJob;
-        }
-        if (jobCount === 0) {
-            output += "     None\n";
-        }
-
-        output += "Drain requests:\n";
-        for (var i = 0, len = drainQueue.length; i < len; i++) {
-            output +=
-                "    " + (i === 0 ? "*" : " ") +
-                "priority: " + markerFromPriority(drainQueue[i].priority).name +
-                ", name: " + drainQueue[i].name +
-                "\n";
-        }
-        if (drainQueue.length === 0) {
-            output += "     None\n";
-        }
-
-        return output;
-    }
-
-    function isEmpty() {
-        var current = priorities[0];
-        do {
-            if (current instanceof JobNode) {
-                return false;
-            }
-            current = current._nextJob;
-        } while (current);
-
-        return true;
-    }
-
-    // The WWA priority at which the pump is currently scheduled on the WWA scheduler.
-    //  null when the pump is not scheduled.
-    //
-    var scheduledWwaPriority = null;
-
-    // Whether the scheduler pump is currently on the stack
-    //
-    var pumping;
-    // What priority is currently being pumped
-    //
-    var pumpingPriority;
-
-    // A reference to the job object that is currently running.
-    //  null when no job is running.
-    //
-    var runningJob = null;
-
-    // Whether we are using the WWA scheduler.
-    //
-    var usingWwaScheduler = !!(_Global.MSApp && _Global.MSApp.execAtPriority);
-
-    // Queue of drain listeners
-    //
-    var drainQueue = [];
-
-    // Bit indicating that we should yield immediately
-    //
-    var immediateYield;
-
-    // time slice for scheduler
-    //
-    var TIME_SLICE = 30;
-
-    // high-water-mark is maintained any time priorities are adjusted, new jobs are
-    //  added or the scheduler pumps itself down through a priority marker. The goal
-    //  of the high-water-mark is to be a fast check as to whether a job may exist
-    //  at a higher priority level than we are currently at. It may be wrong but it
-    //  may only be wrong by being higher than the current highest priority job, not
-    //  lower as that would cause the system to pump things out of order.
-    //
-    var highWaterMark = Priority.min;
-
-    //
-    // Initialize the scheduler
-    //
-
-    // Wire up the markers
-    //
-    priorities.reduce(function (prev, current) {
-        if (prev) {
-            prev._insertJobAfter(current);
-            prev._insertMarkerAfter(current);
-        }
-        return current;
-    });
-
-    //
-    // Draining mechanism
-    //
-    // For each active drain request, there is a unique drain listener in the
-    //  drainQueue. Requests are processed in FIFO order. The scheduler is in
-    //  drain mode precisely when the drainQueue is non-empty.
-    //
-
-    // Returns priority of the current drain request
-    //
-    function currentDrainPriority() {
-        return drainQueue.length === 0 ? null : drainQueue[0].priority;
-    }
-
-    function drainStarting(listener) {
-        schedulerProfilerMark("drain", "StartTM", listener.name, markerFromPriority(listener.priority).name);
-    }
-    function drainStopping(listener, canceled) {
-        if (canceled) {
-            schedulerProfilerMark("drain-canceled", "info", listener.name, markerFromPriority(listener.priority).name);
-        }
-        schedulerProfilerMark("drain", "StopTM", listener.name, markerFromPriority(listener.priority).name);
-    }
-
-    function addDrainListener(priority, complete, name) {
-        drainQueue.push({ priority: priority, complete: complete, name: name });
-        if (drainQueue.length === 1) {
-            drainStarting(drainQueue[0]);
-            if (priority > highWaterMark) {
-                highWaterMark = priority;
-                immediateYield = true;
-            }
-        }
-    }
-
-    function removeDrainListener(complete, canceled) {
-        var i,
-            len = drainQueue.length;
-
-        for (i = 0; i < len; i++) {
-            if (drainQueue[i].complete === complete) {
-                if (i === 0) {
-                    drainStopping(drainQueue[0], canceled);
-                    drainQueue[1] && drainStarting(drainQueue[1]);
-                }
-                drainQueue.splice(i, 1);
-                break;
-            }
-        }
-    }
-
-    // Notifies and removes the current drain listener
-    //
-    function notifyCurrentDrainListener() {
-        var listener = drainQueue.shift();
-
-        if (listener) {
-            drainStopping(listener);
-            drainQueue[0] && drainStarting(drainQueue[0]);
-            listener.complete();
-        }
-    }
-
-    // Notifies all drain listeners which are at a priority > highWaterMark.
-    //  Returns whether or not any drain listeners were notified. This
-    //  function sets pumpingPriority and reads highWaterMark. Note that
-    //  it may call into user code which may call back into the scheduler.
-    //
-    function notifyDrainListeners() {
-        var notifiedSomebody = false;
-        if (!!drainQueue.length) {
-            // As we exhaust priority levels, notify the appropriate drain listeners.
-            //
-            var drainPriority = currentDrainPriority();
-            while (+drainPriority === drainPriority && drainPriority > highWaterMark) {
-                pumpingPriority = drainPriority;
-                notifyCurrentDrainListener();
-                notifiedSomebody = true;
-                drainPriority = currentDrainPriority();
-            }
-        }
-        return notifiedSomebody;
-    }
-
-    //
-    // Interfacing with the WWA Scheduler
-    //
-
-    // The purpose of yielding to the host is to give the host the opportunity to do some work.
-    // setImmediate has this guarantee built-in so we prefer that. Otherwise, we do setTimeout 16
-    // which should give the host a decent amount of time to do work.
-    //
-    var scheduleWithHost = _Global.setImmediate ? _Global.setImmediate.bind(_Global) : function (callback) {
-        _Global.setTimeout(callback, 16);
-    };
-
-    // Stubs for the parts of the WWA scheduler APIs that we use. These stubs are
-    //  used in contexts where the WWA scheduler is not available.
-    //
-    var MSAppStubs = {
-        execAsyncAtPriority: function (callback, priority) {
-            // If it's a high priority callback then we additionally schedule using setTimeout(0)
-            //
-            if (priority === MSApp.HIGH) {
-                _Global.setTimeout(callback, 0);
-            }
-            // We always schedule using setImmediate
-            //
-            scheduleWithHost(callback);
-        },
-
-        execAtPriority: function (callback) {
-            return callback();
-        },
-
-        getCurrentPriority: function () {
-            return MSAppStubs.NORMAL;
-        },
-
-        isTaskScheduledAtPriorityOrHigher: function () {
-            return false;
-        },
-
-        HIGH: "high",
-        NORMAL: "normal",
-        IDLE: "idle"
-    };
-
-    var MSApp = (usingWwaScheduler ? _Global.MSApp : MSAppStubs);
-
-    function toWwaPriority(winjsPriority) {
-        if (winjsPriority >= Priority.aboveNormal + 1) { return MSApp.HIGH; }
-        if (winjsPriority >= Priority.belowNormal) { return MSApp.NORMAL; }
-        return MSApp.IDLE;
-    }
-
-    var wwaPriorityToInt = {};
-    wwaPriorityToInt[MSApp.IDLE] = 1;
-    wwaPriorityToInt[MSApp.NORMAL] = 2;
-    wwaPriorityToInt[MSApp.HIGH] = 3;
-
-    function isEqualOrHigherWwaPriority(priority1, priority2) {
-        return wwaPriorityToInt[priority1] >= wwaPriorityToInt[priority2];
-    }
-
-    function isHigherWwaPriority(priority1, priority2) {
-        return wwaPriorityToInt[priority1] > wwaPriorityToInt[priority2];
-    }
-
-    function wwaTaskScheduledAtPriorityHigherThan(wwaPriority) {
-        switch (wwaPriority) {
-            case MSApp.HIGH:
-                return false;
-            case MSApp.NORMAL:
-                return MSApp.isTaskScheduledAtPriorityOrHigher(MSApp.HIGH);
-            case MSApp.IDLE:
-                return MSApp.isTaskScheduledAtPriorityOrHigher(MSApp.NORMAL);
-        }
-    }
-
-    //
-    // Mechanism for the scheduler
-    //
-
-    function addJobAtHeadOfPriority(node, priority) {
-        var marker = markerFromPriority(priority);
-        if (marker.priority > highWaterMark) {
-            highWaterMark = marker.priority;
-            immediateYield = true;
-        }
-        marker._insertJobAfter(node);
-    }
-
-    function addJobAtTailOfPriority(node, priority) {
-        var marker = markerFromPriority(priority);
-        if (marker.priority > highWaterMark) {
-            highWaterMark = marker.priority;
-            immediateYield = true;
-        }
-        marker._nextMarker._insertJobBefore(node);
-    }
-
-    function clampPriority(priority) {
-        priority = priority | 0;
-        priority = Math.max(priority, MIN_PRIORITY);
-        priority = Math.min(priority, MAX_PRIORITY);
-        return priority;
-    }
-
-    function markerFromPriority(priority) {
-        priority = clampPriority(priority);
-
-        // The priority skip list is from high -> idle, add the offset and then make it positive.
-        //
-        return priorities[-1 * (priority - MAX_PRIORITY)];
-    }
-
-    // Performance.now is not defined in web workers.
-    //
-    var now = (_Global.performance && _Global.performance.now && _Global.performance.now.bind(_Global.performance)) || Date.now.bind(Date);
-
-    // Main scheduler pump.
-    //
-    function run(scheduled) {
-        pumping = true;
-        schedulerProfilerMark("timeslice", "StartTM");
-        var didWork;
-        var ranJobSuccessfully = true;
-        var current;
-        var lastLoggedPriority;
-        var timesliceExhausted = false;
-        var yieldForPriorityBoundary = false;
-
-        // Reset per-run state
-        //
-        immediateYield = false;
-
-        try {
-            var start = now();
-            var end = start + TIME_SLICE;
-
-            // Yielding policy
-            //
-            // @TODO, should we have a different scheduler policy when the debugger is attached. Today if you
-            //  break in user code we will generally yield immediately after that job due to the fact that any
-            //  breakpoint will take longer than TIME_SLICE to process.
-            //
-
-            var shouldYield = function () {
-                timesliceExhausted = false;
-                if (immediateYield) { return true; }
-                if (wwaTaskScheduledAtPriorityHigherThan(toWwaPriority(highWaterMark))) { return true; }
-                if (!!drainQueue.length) { return false; }
-                if (now() > end) {
-                    timesliceExhausted = true;
-                    return true;
-                }
-                return false;
-            };
-
-            // Run until we run out of jobs or decide it is time to yield
-            //
-            while (highWaterMark >= Priority.min && !shouldYield() && !yieldForPriorityBoundary) {
-
-                didWork = false;
-                current = markerFromPriority(highWaterMark)._nextJob;
-                do {
-                    // Record the priority currently being pumped
-                    //
-                    pumpingPriority = current.priority;
-
-                    if (current instanceof JobNode) {
-                        if (lastLoggedPriority !== current.priority) {
-                            if (+lastLoggedPriority === lastLoggedPriority) {
-                                schedulerProfilerMark("priority", "StopTM", markerFromPriority(lastLoggedPriority).name);
-                            }
-                            schedulerProfilerMark("priority", "StartTM", markerFromPriority(current.priority).name);
-                            lastLoggedPriority = current.priority;
-                        }
-
-                        // Important that we update this state before calling execute because the
-                        //  job may throw an exception and we don't want to stall the queue.
-                        //
-                        didWork = true;
-                        ranJobSuccessfully = false;
-                        runningJob = current;
-                        jobProfilerMark(runningJob, "job-running", "StartTM", markerFromPriority(pumpingPriority).name);
-                        current._execute(shouldYield);
-                        jobProfilerMark(runningJob, "job-running", "StopTM", markerFromPriority(pumpingPriority).name);
-                        runningJob = null;
-                        ranJobSuccessfully = true;
-                    } else {
-                        // As we pass marker nodes update our high water mark. It's important to do
-                        //  this before notifying drain listeners because they may schedule new jobs
-                        //  which will affect the highWaterMark.
-                        //
-                        var wwaPrevHighWaterMark = toWwaPriority(highWaterMark);
-                        highWaterMark = current.priority;
-
-                        didWork = notifyDrainListeners();
-
-                        var wwaHighWaterMark = toWwaPriority(highWaterMark);
-                        if (isHigherWwaPriority(wwaPrevHighWaterMark, wwaHighWaterMark) &&
-                                (!usingWwaScheduler || MSApp.isTaskScheduledAtPriorityOrHigher(wwaHighWaterMark))) {
-                            // Timeslice is moving to a lower WWA priority and the host
-                            //  has equally or more important work to do. Time to yield.
-                            //
-                            yieldForPriorityBoundary = true;
-                        }
-                    }
-
-                    current = current._nextJob;
-
-                    // When didWork is true we exit the loop because:
-                    //  - We've called into user code which may have modified the
-                    //    scheduler's queue. We need to restart at the high water mark.
-                    //  - We need to check if it's time for the scheduler to yield.
-                    //
-                } while (current && !didWork && !yieldForPriorityBoundary && !wwaTaskScheduledAtPriorityHigherThan(toWwaPriority(highWaterMark)));
-
-                // Reset per-item state
-                //
-                immediateYield = false;
-
-            }
-
-        } finally {
-            runningJob = null;
-
-            // If a job was started and did not run to completion due to an exception
-            //  we should transition it to a terminal state.
-            //
-            if (!ranJobSuccessfully) {
-                jobProfilerMark(current, "job-error", "info");
-                jobProfilerMark(current, "job-running", "StopTM", markerFromPriority(pumpingPriority).name);
-                current.cancel();
-            }
-
-            if (+lastLoggedPriority === lastLoggedPriority) {
-                schedulerProfilerMark("priority", "StopTM", markerFromPriority(lastLoggedPriority).name);
-            }
-            // Update high water mark to be the priority of the highest priority job.
-            //
-            var foundAJob = false;
-            while (highWaterMark >= Priority.min && !foundAJob) {
-
-                didWork = false;
-                current = markerFromPriority(highWaterMark)._nextJob;
-                do {
-
-                    if (current instanceof JobNode) {
-                        // We found a job. High water mark is now set to the priority
-                        //  of this job.
-                        //
-                        foundAJob = true;
-                    } else {
-                        // As we pass marker nodes update our high water mark. It's important to do
-                        //  this before notifying drain listeners because they may schedule new jobs
-                        //  which will affect the highWaterMark.
-                        //
-                        highWaterMark = current.priority;
-
-                        didWork = notifyDrainListeners();
-                    }
-
-                    current = current._nextJob;
-
-                    // When didWork is true we exit the loop because:
-                    //  - We've called into user code which may have modified the
-                    //    scheduler's queue. We need to restart at the high water mark.
-                    //
-                } while (current && !didWork && !foundAJob);
-            }
-
-            var reasonForYielding;
-            if (!ranJobSuccessfully) {
-                reasonForYielding = "job error";
-            } else if (timesliceExhausted) {
-                reasonForYielding = "timeslice exhausted";
-            } else if (highWaterMark < Priority.min) {
-                reasonForYielding = "jobs exhausted";
-            } else if (yieldForPriorityBoundary) {
-                reasonForYielding = "reached WWA priority boundary";
-            } else {
-                reasonForYielding = "WWA host work";
-            }
-
-            // If this was a scheduled call to the pump, then the pump is no longer
-            //  scheduled to be called and we should clear its scheduled priority.
-            //
-            if (scheduled) {
-                scheduledWwaPriority = null;
-            }
-
-            // If the high water mark has not reached the end of the queue then
-            //  we re-queue in order to see if there are more jobs to run.
-            //
-            pumping = false;
-            if (highWaterMark >= Priority.min) {
-                startRunning();
-            }
-            schedulerProfilerMark("yielding", "info", reasonForYielding);
-            schedulerProfilerMark("timeslice", "StopTM");
-        }
-    }
-
-    // When we schedule the pump we assign it a version. When we start executing one we check
-    //  to see what the max executed version is. If we have superseded it then we skip the call.
-    //
-    var scheduledVersion = 0;
-    var executedVersion = 0;
-
-    function startRunning(priority) {
-        if (+priority !== priority) {
-            priority = highWaterMark;
-        }
-        var priorityWwa = toWwaPriority(priority);
-
-        // Don't schedule the pump while pumping. The pump will be scheduled
-        //  immediately before yielding if necessary.
-        //
-        if (pumping) {
-            return;
-        }
-
-        // If the pump is already scheduled at priority or higher, then there
-        //  is no need to schedule the pump again.
-        // However, when we're not using the WWA scheduler, we fallback to immediate/timeout
-        //  which do not have a notion of priority. In this case, if the pump is scheduled,
-        //  there is no need to schedule another pump.
-        //
-        if (scheduledWwaPriority && (!usingWwaScheduler || isEqualOrHigherWwaPriority(scheduledWwaPriority, priorityWwa))) {
-            return;
-        }
-        var current = ++scheduledVersion;
-        var runner = function () {
-            if (executedVersion < current) {
-                executedVersion = scheduledVersion;
-                run(true);
-            }
-        };
-
-        MSApp.execAsyncAtPriority(runner, priorityWwa);
-        scheduledWwaPriority = priorityWwa;
-    }
-
-    function requestDrain(priority, name) {
-        /// <signature helpKeyword="WinJS.Utilities.Scheduler.requestDrain">
-        /// <summary locid="WinJS.Utilities.Scheduler.requestDrain">
-        /// Runs jobs in the scheduler without timeslicing until all jobs at the
-        /// specified priority and higher have executed.
-        /// </summary>
-        /// <param name="priority" isOptional="true" type="WinJS.Utilities.Scheduler.Priority" locid="WinJS.Utilities.Scheduler.requestDrain_p:priority">
-        /// The priority to which the scheduler should drain. The default is Priority.min, which drains all jobs in the queue.
-        /// </param>
-        /// <param name="name" isOptional="true" type="String" locid="WinJS.Utilities.Scheduler.requestDrain_p:name">
-        /// An optional description of the drain request for diagnostics.
-        /// </param>
-        /// <returns type="WinJS.Promise" locid="WinJS.Utilities.Scheduler.requestDrain_returnValue">
-        /// A promise which completes when the drain has finished. Canceling this
-        /// promise cancels the drain request. This promise will never enter an error state.
-        /// </returns>
-        /// </signature>
-
-        var id = globalDrainId++;
-        if (name === undefined) {
-            name = "Drain Request " + id;
-        }
-        priority = (+priority === priority) ? priority : Priority.min;
-        priority = clampPriority(priority);
-
-        var complete;
-        var promise = new Promise(function (c) {
-            complete = c;
-            addDrainListener(priority, complete, name);
-        }, function () {
-            removeDrainListener(complete, true);
-        });
-
-        if (!pumping) {
-            startRunning();
-        }
-
-        return promise;
-    }
-
-    function execHigh(callback) {
-        /// <signature helpKeyword="WinJS.Utilities.Scheduler.execHigh">
-        /// <summary locid="WinJS.Utilities.Scheduler.execHigh">
-        /// Runs the specified callback in a high priority context.
-        /// </summary>
-        /// <param name="callback" type="Function" locid="WinJS.Utilities.Scheduler.execHigh_p:callback">
-        /// The callback to run in a high priority context.
-        /// </param>
-        /// <returns type="Object" locid="WinJS.Utilities.Scheduler.execHigh_returnValue">
-        /// The return value of the callback.
-        /// </returns>
-        /// </signature>
-
-        return MSApp.execAtPriority(callback, MSApp.HIGH);
-    }
-
-    function createOwnerToken() {
-        /// <signature helpKeyword="WinJS.Utilities.Scheduler.createOwnerToken">
-        /// <summary locid="WinJS.Utilities.Scheduler.createOwnerToken">
-        /// Creates and returns a new owner token which can be set to the owner property of one or more jobs.
-        /// It can then be used to cancel all jobs it "owns".
-        /// </summary>
-        /// <returns type="WinJS.Utilities.Scheduler._OwnerToken" locid="WinJS.Utilities.Scheduler.createOwnerToken_returnValue">
-        /// The new owner token. You can use this token to control jobs that it owns.
-        /// </returns>
-        /// </signature>
-
-        return new OwnerToken();
-    }
-
-    function schedule(work, priority, thisArg, name) {
-        /// <signature helpKeyword="WinJS.Utilities.Scheduler.schedule">
-        /// <summary locid="WinJS.Utilities.Scheduler.schedule">
-        /// Schedules the specified function to execute asynchronously.
-        /// </summary>
-        /// <param name="work" type="Function" locid="WinJS.Utilities.Scheduler.schedule_p:work">
-        /// A function that represents the work item to be scheduled. When called the work item will receive as its first argument
-        /// a JobInfo object which allows the work item to ask the scheduler if it should yield cooperatively and if so allows the
-        /// work item to either provide a function to be run as a continuation or a WinJS.Promise which will when complete
-        /// provide a function to run as a continuation.
-        /// </param>
-        /// <param name="priority" isOptional="true" type="WinJS.Utilities.Scheduler.Priority" locid="WinJS.Utilities.Scheduler.schedule_p:priority">
-        /// The priority at which to schedule the work item. The default value is Priority.normal.
-        /// </param>
-        /// <param name="thisArg" isOptional="true" type="Object" locid="WinJS.Utilities.Scheduler.schedule_p:thisArg">
-        /// A 'this' instance to be bound into the work item. The default value is null.
-        /// </param>
-        /// <param name="name" isOptional="true" type="String" locid="WinJS.Utilities.Scheduler.schedule_p:name">
-        /// A description of the work item for diagnostics. The default value is an empty string.
-        /// </param>
-        /// <returns type="WinJS.Utilities.Scheduler._JobNode" locid="WinJS.Utilities.Scheduler.schedule_returnValue">
-        /// The Job instance which represents this work item.
-        /// </returns>
-        /// </signature>
-
-        priority = priority || Priority.normal;
-        thisArg = thisArg || null;
-        var jobId = ++globalJobId;
-        var asyncOpID = _Trace._traceAsyncOperationStarting("WinJS.Utilities.Scheduler.schedule: " + jobId + profilerMarkArgs(name));
-        name = name || "";
-        return new JobNode(jobId, work, priority, thisArg, name, asyncOpID);
-    }
-
-    function getCurrentPriority() {
-        if (pumping) {
-            return pumpingPriority;
-        } else {
-            switch (MSApp.getCurrentPriority()) {
-                case MSApp.HIGH: return Priority.high;
-                case MSApp.NORMAL: return Priority.normal;
-                case MSApp.IDLE: return Priority.idle;
-            }
-        }
-    }
-
-    function makeSchedulePromise(priority) {
-        return function (promiseValue, jobName) {
-            /// <signature helpKeyword="WinJS.Utilities.Scheduler.schedulePromise">
-            /// <summary locid="WinJS.Utilities.Scheduler.schedulePromise">
-            /// Schedules a job to complete a returned Promise.
-            /// There are four versions of this method for different commonly used priorities: schedulePromiseHigh,
-            /// schedulePromiseAboveNormal, schedulePromiseNormal, schedulePromiseBelowNormal,
-            /// and schedulePromiseIdle.
-            /// Example usage which shows how to
-            /// ensure that the last link in a promise chain is run on the scheduler at high priority:
-            /// asyncOp().then(Scheduler.schedulePromiseHigh).then(function (valueOfAsyncOp) { });
-            /// </summary>
-            /// <param name="promiseValue" isOptional="true" type="Object" locid="WinJS.Utilities.Scheduler.schedulePromise_p:promiseValue">
-            /// The value with which the returned promise will complete.
-            /// </param>
-            /// <param name="jobName" isOptional="true" type="String" locid="WinJS.Utilities.Scheduler.schedulePromise_p:jobName">
-            /// A string that describes the job for diagnostic purposes.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.Utilities.Scheduler.schedulePromise_returnValue">
-            /// A promise which completes within a job of the desired priority.
-            /// </returns>
-            /// </signature>
-            var job;
-            return new Promise(
-                function (c) {
-                    job = schedule(function schedulePromise() {
-                        c(promiseValue);
-                    }, priority, null, jobName);
-                },
-                function () {
-                    job.cancel();
-                }
-            );
-        };
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Utilities.Scheduler", {
-
-        Priority: Priority,
-
-        schedule: schedule,
-
-        createOwnerToken: createOwnerToken,
-
-        execHigh: execHigh,
-
-        requestDrain: requestDrain,
-
-        /// <field type="WinJS.Utilities.Scheduler.Priority" locid="WinJS.Utilities.Scheduler.currentPriority" helpKeyword="WinJS.Utilities.Scheduler.currentPriority">
-        /// Gets the current priority at which the caller is executing.
-        /// </field>
-        currentPriority: {
-            get: getCurrentPriority
-        },
-
-        // Promise helpers
-        //
-        schedulePromiseHigh: makeSchedulePromise(Priority.high),
-        schedulePromiseAboveNormal: makeSchedulePromise(Priority.aboveNormal),
-        schedulePromiseNormal: makeSchedulePromise(Priority.normal),
-        schedulePromiseBelowNormal: makeSchedulePromise(Priority.belowNormal),
-        schedulePromiseIdle: makeSchedulePromise(Priority.idle),
-
-        retrieveState: retrieveState,
-
-        _JobNode: JobNode,
-
-        _JobInfo: JobInfo,
-
-        _OwnerToken: OwnerToken,
-
-        _dumpList: dumpList,
-
-        _isEmpty: {
-            get: isEmpty
-        },
-
-        // The properties below are used for testing.
-        //
-
-        _usingWwaScheduler: {
-            get: function () {
-                return usingWwaScheduler;
-            },
-            set: function (value) {
-                usingWwaScheduler = value;
-                MSApp = (usingWwaScheduler ? _Global.MSApp : MSAppStubs);
-            }
-        },
-
-        _MSApp: {
-            get: function () {
-                return MSApp;
-            },
-            set: function (value) {
-                MSApp = value;
-            }
-        },
-
-        _TIME_SLICE: TIME_SLICE
-
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Core/_BaseUtils',[
-    'exports',
-    './_Global',
-    './_Base',
-    './_BaseCoreUtils',
-    './_ErrorFromName',
-    './_Resources',
-    './_Trace',
-    '../Promise',
-    '../Scheduler'
-    ], function baseUtilsInit(exports, _Global, _Base, _BaseCoreUtils, _ErrorFromName, _Resources, _Trace, Promise, Scheduler) {
-    "use strict";
-
-    var strings = {
-        get notSupportedForProcessing() { return "Value is not supported within a declarative processing context, if you want it to be supported mark it using WinJS.Utilities.markSupportedForProcessing. The value was: '{0}'"; }
-    };
-
-    var requestAnimationWorker;
-    var requestAnimationId = 0;
-    var requestAnimationHandlers = {};
-    var validation = false;
-    var platform = _Global.navigator.platform;
-    var isiOS = platform === "iPhone" || platform === "iPad" || platform === "iPod";
-
-    function nop(v) {
-        return v;
-    }
-
-    function getMemberFiltered(name, root, filter) {
-        return name.split(".").reduce(function (currentNamespace, name) {
-            if (currentNamespace) {
-                return filter(currentNamespace[name]);
-            }
-            return null;
-        }, root);
-    }
-
-    function getMember(name, root) {
-        /// <signature helpKeyword="WinJS.Utilities.getMember">
-        /// <summary locid="WinJS.Utilities.getMember">
-        /// Gets the leaf-level type or namespace specified by the name parameter.
-        /// </summary>
-        /// <param name="name" locid="WinJS.Utilities.getMember_p:name">
-        /// The name of the member.
-        /// </param>
-        /// <param name="root" locid="WinJS.Utilities.getMember_p:root">
-        /// The root to start in. Defaults to the global object.
-        /// </param>
-        /// <returns type="Object" locid="WinJS.Utilities.getMember_returnValue">
-        /// The leaf-level type or namespace in the specified parent namespace.
-        /// </returns>
-        /// </signature>
-        if (!name) {
-            return null;
-        }
-        return getMemberFiltered(name, root || _Global, nop);
-    }
-
-    function getCamelCasedName(styleName) {
-        // special case -moz prefixed styles because their JS property name starts with Moz
-        if (styleName.length > 0 && styleName.indexOf("-moz") !== 0 && styleName.charAt(0) === "-") {
-            styleName = styleName.slice(1);
-        }
-        return styleName.replace(/\-[a-z]/g, function (x) { return x[1].toUpperCase(); });
-    }
-
-    function addPrefixToCamelCasedName(prefix, name) {
-        if (prefix === "") {
-            return name;
-        }
-
-        return prefix + name.charAt(0).toUpperCase() + name.slice(1);
-    }
-
-    function addPrefixToCSSName(prefix, name) {
-        return (prefix !== "" ? "-" + prefix.toLowerCase() + "-" : "") + name;
-    }
-
-    function getBrowserStyleEquivalents() {
-        // not supported in WebWorker
-        if (!_Global.document) {
-            return {};
-        }
-
-        var equivalents = {},
-            docStyle = _Global.document.documentElement.style,
-            stylePrefixesToTest = ["", "webkit", "ms", "Moz"],
-            styles = ["animation",
-                "transition",
-                "transform",
-                "animation-name",
-                "animation-duration",
-                "animation-delay",
-                "animation-timing-function",
-                "animation-iteration-count",
-                "animation-direction",
-                "animation-fill-mode",
-                "grid-column",
-                "grid-columns",
-                "grid-column-span",
-                "grid-row",
-                "grid-rows",
-                "grid-row-span",
-                "transform-origin",
-                "transition-property",
-                "transition-duration",
-                "transition-delay",
-                "transition-timing-function",
-                "scroll-snap-points-x",
-                "scroll-snap-points-y",
-                "scroll-chaining",
-                "scroll-limit",
-                "scroll-limit-x-max",
-                "scroll-limit-x-min",
-                "scroll-limit-y-max",
-                "scroll-limit-y-min",
-                "scroll-snap-type",
-                "scroll-snap-x",
-                "scroll-snap-y",
-                "touch-action",
-                "overflow-style",
-                "user-select" // used for Template Compiler test
-            ],
-            prefixesUsedOnStyles = {};
-
-        for (var i = 0, len = styles.length; i < len; i++) {
-            var originalName = styles[i],
-                styleToTest = getCamelCasedName(originalName);
-            for (var j = 0, prefixLen = stylePrefixesToTest.length; j < prefixLen; j++) {
-                var prefix = stylePrefixesToTest[j];
-                var styleName = addPrefixToCamelCasedName(prefix, styleToTest);
-                if (styleName in docStyle) {
-                    // Firefox doesn't support dashed style names being get/set via script. (eg, something like element.style["transform-origin"] = "" wouldn't work).
-                    // For each style translation we create, we'll make a CSS name version and a script name version for it so each can be used where appropriate.
-                    var cssName = addPrefixToCSSName(prefix, originalName);
-                    equivalents[originalName] = {
-                        cssName: cssName,
-                        scriptName: styleName
-                    };
-                    prefixesUsedOnStyles[originalName] = prefix;
-                    break;
-                }
-            }
-        }
-
-        // Special cases:
-        equivalents.animationPrefix = addPrefixToCSSName(prefixesUsedOnStyles["animation"], "");
-        equivalents.keyframes = addPrefixToCSSName(prefixesUsedOnStyles["animation"], "keyframes");
-
-        return equivalents;
-    }
-
-    function getBrowserEventEquivalents() {
-        var equivalents = {};
-        var animationEventPrefixes = ["", "WebKit"],
-            animationEvents = [
-                {
-                    eventObject: "TransitionEvent",
-                    events: ["transitionStart", "transitionEnd"]
-                },
-                {
-                    eventObject: "AnimationEvent",
-                    events: ["animationStart", "animationEnd"]
-                }
-            ];
-
-        for (var i = 0, len = animationEvents.length; i < len; i++) {
-            var eventToTest = animationEvents[i],
-                chosenPrefix = "";
-            for (var j = 0, prefixLen = animationEventPrefixes.length; j < prefixLen; j++) {
-                var prefix = animationEventPrefixes[j];
-                if ((prefix + eventToTest.eventObject) in _Global) {
-                    chosenPrefix = prefix.toLowerCase();
-                    break;
-                }
-            }
-            for (var j = 0, eventsLen = eventToTest.events.length; j < eventsLen; j++) {
-                var eventName = eventToTest.events[j];
-                equivalents[eventName] = addPrefixToCamelCasedName(chosenPrefix, eventName);
-                if (chosenPrefix === "") {
-                    // Transition and animation events are case sensitive. When there's no prefix, the event name should be in lowercase.
-                    // In IE, Chrome and Firefox, an event handler listening to transitionend will be triggered properly, but transitionEnd will not.
-                    // When a prefix is provided, though, the event name needs to be case sensitive.
-                    // IE and Firefox will trigger an animationend event handler correctly, but Chrome won't trigger webkitanimationend -- it has to be webkitAnimationEnd.
-                    equivalents[eventName] = equivalents[eventName].toLowerCase();
-                }
-            }
-        }
-
-        // Non-standardized events
-        equivalents["manipulationStateChanged"] = ("MSManipulationEvent" in _Global ? "ManipulationEvent" : null);
-        return equivalents;
-    }
-
-    // Returns a function which, when called, will call *fn*. However,
-    // if called multiple times, it will only call *fn* at most once every
-    // *delay* milliseconds. Multiple calls during the throttling period
-    // will be coalesced into a single call to *fn* with the arguments being
-    // the ones from the last call received during the throttling period.
-    // Note that, due to the throttling period, *fn* may be invoked asynchronously
-    // relative to the time it was called so make sure its arguments are still valid
-    // (for example, eventObjects will not be valid).
-    //
-    // Example usage. If you want your key down handler to run once every 100 ms,
-    // you could do this:
-    //   var onKeyDown = throttledFunction(function (keyCode) {
-    //     // do something with keyCode
-    //   });
-    //   element.addEventListener("keydown", function (eventObject) { onKeyDown(eventObject.keyCode); });
-    //
-    function throttledFunction(delay, fn) {
-        var throttlePromise = null;
-        var pendingCallPromise = null;
-        var nextContext = null;
-        var nextArgs = null;
-
-        function makeThrottlePromise() {
-            return Promise.timeout(delay).then(function () {
-                throttlePromise = null;
-            });
-        }
-
-        return function () {
-            if (pendingCallPromise) {
-                nextContext = this;
-                nextArgs = [].slice.call(arguments, 0);
-            } else if (throttlePromise) {
-                nextContext = this;
-                nextArgs = [].slice.call(arguments, 0);
-                pendingCallPromise = throttlePromise.then(function () {
-                    var context = nextContext;
-                    nextContext = null;
-                    var args = nextArgs;
-                    nextArgs = null;
-                    throttlePromise = makeThrottlePromise();
-                    pendingCallPromise = null;
-                    fn.apply(context, args);
-                });
-            } else {
-                throttlePromise = makeThrottlePromise();
-                fn.apply(this, arguments);
-            }
-        };
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Utilities", {
-        // Used for mocking in tests
-        _setHasWinRT: {
-            value: function (value) {
-                _BaseCoreUtils.hasWinRT = value;
-            },
-            configurable: false,
-            writable: false,
-            enumerable: false
-        },
-
-        /// <field type="Boolean" locid="WinJS.Utilities.hasWinRT" helpKeyword="WinJS.Utilities.hasWinRT">Determine if WinRT is accessible in this script context.</field>
-        hasWinRT: {
-            get: function () { return _BaseCoreUtils.hasWinRT; },
-            configurable: false,
-            enumerable: true
-        },
-
-        // Used for mocking in tests
-        _setIsiOS: {
-            value: function (value) {
-                isiOS = value;
-            },
-            configurable: false,
-            writable: false,
-            enumerable: false
-        },
-
-        _isiOS: {
-            get: function () { return isiOS; },
-            configurable: false,
-            enumerable: true
-        },
-
-        _getMemberFiltered: getMemberFiltered,
-
-        getMember: getMember,
-
-        _browserStyleEquivalents: getBrowserStyleEquivalents(),
-        _browserEventEquivalents: getBrowserEventEquivalents(),
-        _getCamelCasedName: getCamelCasedName,
-
-        ready: function ready(callback, async) {
-            /// <signature helpKeyword="WinJS.Utilities.ready">
-            /// <summary locid="WinJS.Utilities.ready">
-            /// Ensures that the specified function executes only after the DOMContentLoaded event has fired
-            /// for the current page.
-            /// </summary>
-            /// <returns type="WinJS.Promise" locid="WinJS.Utilities.ready_returnValue">A promise that completes after DOMContentLoaded has occurred.</returns>
-            /// <param name="callback" optional="true" locid="WinJS.Utilities.ready_p:callback">
-            /// A function that executes after DOMContentLoaded has occurred.
-            /// </param>
-            /// <param name="async" optional="true" locid="WinJS.Utilities.ready_p:async">
-            /// If true, the callback is executed asynchronously.
-            /// </param>
-            /// </signature>
-            return new Promise(function (c, e) {
-                function complete() {
-                    if (callback) {
-                        try {
-                            callback();
-                            c();
-                        }
-                        catch (err) {
-                            e(err);
-                        }
-                    } else {
-                        c();
-                    }
-                }
-
-                var readyState = ready._testReadyState;
-                if (!readyState) {
-                    if (_Global.document) {
-                        readyState = _Global.document.readyState;
-                    } else {
-                        readyState = "complete";
-                    }
-                }
-                if (readyState === "complete" || (_Global.document && _Global.document.body !== null)) {
-                    if (async) {
-                        Scheduler.schedule(function WinJS_Utilities_ready() {
-                            complete();
-                        }, Scheduler.Priority.normal, null, "WinJS.Utilities.ready");
-                    } else {
-                        complete();
-                    }
-                } else {
-                    _Global.addEventListener("DOMContentLoaded", complete, false);
-                }
-            });
-        },
-
-        /// <field type="Boolean" locid="WinJS.Utilities.strictProcessing" helpKeyword="WinJS.Utilities.strictProcessing">Determines if strict declarative processing is enabled in this script context.</field>
-        strictProcessing: {
-            get: function () { return true; },
-            configurable: false,
-            enumerable: true,
-        },
-
-        markSupportedForProcessing: {
-            value: _BaseCoreUtils.markSupportedForProcessing,
-            configurable: false,
-            writable: false,
-            enumerable: true
-        },
-
-        requireSupportedForProcessing: {
-            value: function (value) {
-                /// <signature helpKeyword="WinJS.Utilities.requireSupportedForProcessing">
-                /// <summary locid="WinJS.Utilities.requireSupportedForProcessing">
-                /// Asserts that the value is compatible with declarative processing, such as WinJS.UI.processAll
-                /// or WinJS.Binding.processAll. If it is not compatible an exception will be thrown.
-                /// </summary>
-                /// <param name="value" type="Object" locid="WinJS.Utilities.requireSupportedForProcessing_p:value">
-                /// The value to be tested for compatibility with declarative processing. If the
-                /// value is a function it must be marked with a property 'supportedForProcessing'
-                /// with a value of true.
-                /// </param>
-                /// <returns type="Object" locid="WinJS.Utilities.requireSupportedForProcessing_returnValue">
-                /// The input value.
-                /// </returns>
-                /// </signature>
-                var supportedForProcessing = true;
-
-                supportedForProcessing = supportedForProcessing && value !== _Global;
-                supportedForProcessing = supportedForProcessing && value !== _Global.location;
-                supportedForProcessing = supportedForProcessing && !(value instanceof _Global.HTMLIFrameElement);
-                supportedForProcessing = supportedForProcessing && !(typeof value === "function" && !value.supportedForProcessing);
-
-                switch (_Global.frames.length) {
-                    case 0:
-                        break;
-
-                    case 1:
-                        supportedForProcessing = supportedForProcessing && value !== _Global.frames[0];
-                        break;
-
-                    default:
-                        for (var i = 0, len = _Global.frames.length; supportedForProcessing && i < len; i++) {
-                            supportedForProcessing = supportedForProcessing && value !== _Global.frames[i];
-                        }
-                        break;
-                }
-
-                if (supportedForProcessing) {
-                    return value;
-                }
-
-                throw new _ErrorFromName("WinJS.Utilities.requireSupportedForProcessing", _Resources._formatString(strings.notSupportedForProcessing, value));
-            },
-            configurable: false,
-            writable: false,
-            enumerable: true
-        },
-
-        _setImmediate: _BaseCoreUtils._setImmediate,
-
-        _requestAnimationFrame: _Global.requestAnimationFrame ? _Global.requestAnimationFrame.bind(_Global) : function (handler) {
-            var handle = ++requestAnimationId;
-            requestAnimationHandlers[handle] = handler;
-            requestAnimationWorker = requestAnimationWorker || _Global.setTimeout(function () {
-                var toProcess = requestAnimationHandlers;
-                var now = Date.now();
-                requestAnimationHandlers = {};
-                requestAnimationWorker = null;
-                Object.keys(toProcess).forEach(function (key) {
-                    toProcess[key](now);
-                });
-            }, 16);
-            return handle;
-        },
-
-        _cancelAnimationFrame: _Global.cancelAnimationFrame ? _Global.cancelAnimationFrame.bind(_Global) : function (handle) {
-            delete requestAnimationHandlers[handle];
-        },
-
-        // Allows the browser to finish dispatching its current set of events before running
-        // the callback.
-        _yieldForEvents: _Global.setImmediate ? _Global.setImmediate.bind(_Global) : function (handler) {
-            _Global.setTimeout(handler, 0);
-        },
-
-        // Allows the browser to notice a DOM modification before running the callback.
-        _yieldForDomModification: _Global.setImmediate ? _Global.setImmediate.bind(_Global) : function (handler) {
-            _Global.setTimeout(handler, 0);
-        },
-
-        _throttledFunction: throttledFunction,
-
-        _shallowCopy: function _shallowCopy(a) {
-            // Shallow copy a single object.
-            return this._mergeAll([a]);
-        },
-
-        _merge: function _merge(a, b) {
-            // Merge 2 objects together into a new object
-            return this._mergeAll([a, b]);
-        },
-
-        _mergeAll: function _mergeAll(list) {
-            // Merge a list of objects together
-            var o = {};
-            list.forEach(function (part) {
-                Object.keys(part).forEach(function (k) {
-                    o[k] = part[k];
-                });
-            });
-            return o;
-        },
-
-        _getProfilerMarkIdentifier: function _getProfilerMarkIdentifier(element) {
-            var profilerMarkIdentifier = "";
-            if (element.id) {
-                profilerMarkIdentifier += " id='" + element.id + "'";
-            }
-            if (element.className) {
-                profilerMarkIdentifier += " class='" + element.className + "'";
-            }
-            return profilerMarkIdentifier;
-        },
-
-        _now: function _now() {
-            return (_Global.performance && _Global.performance.now && _Global.performance.now()) || Date.now();
-        },
-
-        _traceAsyncOperationStarting: _Trace._traceAsyncOperationStarting,
-        _traceAsyncOperationCompleted: _Trace._traceAsyncOperationCompleted,
-        _traceAsyncCallbackStarting: _Trace._traceAsyncCallbackStarting,
-        _traceAsyncCallbackCompleted: _Trace._traceAsyncCallbackCompleted,
-
-        _version: "4.4.2"
-    });
-
-    _Base.Namespace._moduleDefine(exports, "WinJS", {
-        validation: {
-            get: function () {
-                return validation;
-            },
-            set: function (value) {
-                validation = value;
-            }
-        }
-    });
-
-    // strictProcessing also exists as a module member
-    _Base.Namespace.define("WinJS", {
-        strictProcessing: {
-            value: function () {
-                /// <signature helpKeyword="WinJS.strictProcessing">
-                /// <summary locid="WinJS.strictProcessing">
-                /// Strict processing is always enforced, this method has no effect.
-                /// </summary>
-                /// </signature>
-            },
-            configurable: false,
-            writable: false,
-            enumerable: false
-        }
-    });
-});
-
-
-define('WinJS/Core',[
-    './Core/_Base',
-    './Core/_BaseCoreUtils',
-    './Core/_BaseUtils',
-    './Core/_ErrorFromName',
-    './Core/_Events',
-    './Core/_Global',
-    './Core/_Log',
-    './Core/_Resources',
-    './Core/_Trace',
-    './Core/_WinRT',
-    './Core/_WriteProfilerMark'
-    ], function () {
-    // Wrapper module
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/_Signal',[
-    './Core/_Base',
-    './Promise/_StateMachine'
-    ], function signalInit(_Base, _StateMachine) {
-    "use strict";
-
-    var SignalPromise = _Base.Class.derive(_StateMachine.PromiseStateMachine,
-        function (cancel) {
-            this._oncancel = cancel;
-            this._setState(_StateMachine.state_created);
-            this._run();
-        }, {
-            _cancelAction: function () { this._oncancel && this._oncancel(); },
-            _cleanupAction: function () { this._oncancel = null; }
-        }, {
-            supportedForProcessing: false
-        }
-    );
-
-    var Signal = _Base.Class.define(
-        function Signal_ctor(oncancel) {
-            this._promise = new SignalPromise(oncancel);
-        }, {
-            promise: {
-                get: function () { return this._promise; }
-            },
-
-            cancel: function Signal_cancel() {
-                this._promise.cancel();
-            },
-            complete: function Signal_complete(value) {
-                this._promise._completed(value);
-            },
-            error: function Signal_error(value) {
-                this._promise._error(value);
-            },
-            progress: function Signal_progress(value) {
-                this._promise._progress(value);
-            }
-        }, {
-            supportedForProcessing: false,
-        }
-    );
-
-    _Base.Namespace.define("WinJS", {
-        _Signal: Signal
-    });
-
-    return Signal;
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_Control',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base'
-    ], function controlInit(exports, _Global, _Base) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-
-    function setOptions(control, options) {
-        /// <signature helpKeyword="WinJS.UI.setOptions">
-        /// <summary locid="WinJS.UI.setOptions">
-        /// Adds the set of declaratively specified options (properties and events) to the specified control.
-        /// If name of the options property begins with "on", the property value is a function and the control
-        /// supports addEventListener. The setOptions method calls the addEventListener method on the control.
-        /// </summary>
-        /// <param name="control" type="Object" domElement="false" locid="WinJS.UI.setOptions_p:control">
-        /// The control on which the properties and events are to be applied.
-        /// </param>
-        /// <param name="options" type="Object" domElement="false" locid="WinJS.UI.setOptions_p:options">
-        /// The set of options that are specified declaratively.
-        /// </param>
-        /// </signature>
-        _setOptions(control, options);
-    }
-
-    function _setOptions(control, options, eventsOnly) {
-        if (typeof options === "object") {
-            var keys = Object.keys(options);
-            for (var i = 0, len = keys.length; i < len; i++) {
-                var key = keys[i];
-                var value = options[key];
-                if (key.length > 2) {
-                    var ch1 = key[0];
-                    var ch2 = key[1];
-                    if ((ch1 === 'o' || ch1 === 'O') && (ch2 === 'n' || ch2 === 'N')) {
-                        if (typeof value === "function") {
-                            if (control.addEventListener) {
-                                control.addEventListener(key.substr(2), value);
-                                continue;
-                            }
-                        }
-                    }
-                }
-
-                if (!eventsOnly) {
-                    control[key] = value;
-                }
-            }
-        }
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        DOMEventMixin: _Base.Namespace._lazy(function () {
-            return {
-                _domElement: null,
-
-                addEventListener: function (type, listener, useCapture) {
-                    /// <signature helpKeyword="WinJS.UI.DOMEventMixin.addEventListener">
-                    /// <summary locid="WinJS.UI.DOMEventMixin.addEventListener">
-                    /// Adds an event listener to the control.
-                    /// </summary>
-                    /// <param name="type" type="String" locid="WinJS.UI.DOMEventMixin.addEventListener_p:type">
-                    /// The type (name) of the event.
-                    /// </param>
-                    /// <param name="listener" type="Function" locid="WinJS.UI.DOMEventMixin.addEventListener_p:listener">
-                    /// The listener to invoke when the event gets raised.
-                    /// </param>
-                    /// <param name="useCapture" type="Boolean" locid="WinJS.UI.DOMEventMixin.addEventListener_p:useCapture">
-                    /// true to initiate capture; otherwise, false.
-                    /// </param>
-                    /// </signature>
-                    (this.element || this._domElement).addEventListener(type, listener, useCapture || false);
-                },
-                dispatchEvent: function (type, eventProperties) {
-                    /// <signature helpKeyword="WinJS.UI.DOMEventMixin.dispatchEvent">
-                    /// <summary locid="WinJS.UI.DOMEventMixin.dispatchEvent">
-                    /// Raises an event of the specified type, adding the specified additional properties.
-                    /// </summary>
-                    /// <param name="type" type="String" locid="WinJS.UI.DOMEventMixin.dispatchEvent_p:type">
-                    /// The type (name) of the event.
-                    /// </param>
-                    /// <param name="eventProperties" type="Object" locid="WinJS.UI.DOMEventMixin.dispatchEvent_p:eventProperties">
-                    /// The set of additional properties to be attached to the event object when the event is raised.
-                    /// </param>
-                    /// <returns type="Boolean" locid="WinJS.UI.DOMEventMixin.dispatchEvent_returnValue">
-                    /// true if preventDefault was called on the event, otherwise false.
-                    /// </returns>
-                    /// </signature>
-                    var eventValue = _Global.document.createEvent("Event");
-                    eventValue.initEvent(type, false, false);
-                    eventValue.detail = eventProperties;
-                    if (typeof eventProperties === "object") {
-                        Object.keys(eventProperties).forEach(function (key) {
-                            eventValue[key] = eventProperties[key];
-                        });
-                    }
-                    return (this.element || this._domElement).dispatchEvent(eventValue);
-                },
-                removeEventListener: function (type, listener, useCapture) {
-                    /// <signature helpKeyword="WinJS.UI.DOMEventMixin.removeEventListener">
-                    /// <summary locid="WinJS.UI.DOMEventMixin.removeEventListener">
-                    /// Removes an event listener from the control.
-                    /// </summary>
-                    /// <param name="type" type="String" locid="WinJS.UI.DOMEventMixin.removeEventListener_p:type">
-                    /// The type (name) of the event.
-                    /// </param>
-                    /// <param name="listener" type="Function" locid="WinJS.UI.DOMEventMixin.removeEventListener_p:listener">
-                    /// The listener to remove.
-                    /// </param>
-                    /// <param name="useCapture" type="Boolean" locid="WinJS.UI.DOMEventMixin.removeEventListener_p:useCapture">
-                    /// true to initiate capture; otherwise, false.
-                    /// </param>
-                    /// </signature>
-                    (this.element || this._domElement).removeEventListener(type, listener, useCapture || false);
-                }
-            };
-        }),
-
-        setOptions: setOptions,
-
-        _setOptions: _setOptions
-    });
-
-});
-
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_ElementUtilities',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_WinRT',
-    '../Promise',
-    '../Scheduler'
-], function elementUtilities(exports, _Global, _Base, _BaseUtils, _WinRT, Promise, Scheduler) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-
-    var _zoomToDuration = 167;
-
-    // Firefox's implementation of getComputedStyle returns null when called within
-    // an iframe that is display:none. This is a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=548397
-    // _getComputedStyle is a helper which is guaranteed to return an object whose keys
-    // map to strings.
-    var defaultComputedStyle = null;
-    function getDefaultComputedStyle() {
-        if (!defaultComputedStyle) {
-            defaultComputedStyle = {};
-            Object.keys(_Global.CSS2Properties.prototype).forEach(function (cssProperty) {
-                defaultComputedStyle[cssProperty] = "";
-            });
-        }
-        return defaultComputedStyle;
-    }
-    function _getComputedStyle(element, pseudoElement) {
-        // jscs:disable disallowDirectGetComputedStyle
-        return _Global.getComputedStyle(element, pseudoElement) || getDefaultComputedStyle();
-        // jscs:enable disallowDirectGetComputedStyle
-    }
-
-    function removeEmpties(arr) {
-        var len = arr.length;
-        for (var i = len - 1; i >= 0; i--) {
-            if (!arr[i]) {
-                arr.splice(i, 1);
-                len--;
-            }
-        }
-        return len;
-    }
-
-    function getClassName(e) {
-        var name = e.className || "";
-        if (typeof (name) === "string") {
-            return name;
-        } else {
-            return name.baseVal || "";
-        }
-    }
-    function setClassName(e, value) {
-        // SVG elements (which use e.className.baseVal) are never undefined,
-        // so this logic makes the comparison a bit more compact.
-        //
-        var name = e.className || "";
-        if (typeof (name) === "string") {
-            e.className = value;
-        } else {
-            e.className.baseVal = value;
-        }
-        return e;
-    }
-    function addClass(e, name) {
-        /// <signature helpKeyword="WinJS.Utilities.addClass">
-        /// <summary locid="WinJS.Utilities.addClass">
-        /// Adds the specified class(es) to the specified element. Multiple classes can be added using space delimited names.
-        /// </summary>
-        /// <param name="e" type="HTMLElement" locid="WinJS.Utilities.addClass_p:e">
-        /// The element to which to add the class.
-        /// </param>
-        /// <param name="name" type="String" locid="WinJS.Utilities.addClass_p:name">
-        /// The name of the class to add, multiple classes can be added using space delimited names
-        /// </param>
-        /// <returns type="HTMLElement" locid="WinJS.Utilities.addClass_returnValue">
-        /// The element.
-        /// </returns>
-        /// </signature>
-        if (e.classList) {
-            // Fastpath: adding a single class, no need to string split the argument
-            if (name.indexOf(" ") < 0) {
-                e.classList.add(name);
-            } else {
-                var namesToAdd = name.split(" ");
-                removeEmpties(namesToAdd);
-
-                for (var i = 0, len = namesToAdd.length; i < len; i++) {
-                    e.classList.add(namesToAdd[i]);
-                }
-            }
-            return e;
-        } else {
-            var className = getClassName(e);
-            var names = className.split(" ");
-            var l = removeEmpties(names);
-            var toAdd;
-
-            // we have a fast path for the common case of a single name in the class name
-            //
-            if (name.indexOf(" ") >= 0) {
-                var namesToAdd = name.split(" ");
-                removeEmpties(namesToAdd);
-                for (var i = 0; i < l; i++) {
-                    var found = namesToAdd.indexOf(names[i]);
-                    if (found >= 0) {
-                        namesToAdd.splice(found, 1);
-                    }
-                }
-                if (namesToAdd.length > 0) {
-                    toAdd = namesToAdd.join(" ");
-                }
-            } else {
-                var saw = false;
-                for (var i = 0; i < l; i++) {
-                    if (names[i] === name) {
-                        saw = true;
-                        break;
-                    }
-                }
-                if (!saw) { toAdd = name; }
-
-            }
-            if (toAdd) {
-                if (l > 0 && names[0].length > 0) {
-                    setClassName(e, className + " " + toAdd);
-                } else {
-                    setClassName(e, toAdd);
-                }
-            }
-            return e;
-        }
-    }
-    function removeClass(e, name) {
-        /// <signature helpKeyword="WinJS.Utilities.removeClass">
-        /// <summary locid="WinJS.Utilities.removeClass">
-        /// Removes the specified class from the specified element.
-        /// </summary>
-        /// <param name="e" type="HTMLElement" locid="WinJS.Utilities.removeClass_p:e">
-        /// The element from which to remove the class.
-        /// </param>
-        /// <param name="name" type="String" locid="WinJS.Utilities.removeClass_p:name">
-        /// The name of the class to remove.
-        /// </param>
-        /// <returns type="HTMLElement" locid="WinJS.Utilities.removeClass_returnValue">
-        /// The element.
-        /// </returns>
-        /// </signature>
-        if (e.classList) {
-
-            // Fastpath: Nothing to remove
-            if (e.classList.length === 0) {
-                return e;
-            }
-            var namesToRemove = name.split(" ");
-            removeEmpties(namesToRemove);
-
-            for (var i = 0, len = namesToRemove.length; i < len; i++) {
-                e.classList.remove(namesToRemove[i]);
-            }
-            return e;
-        } else {
-            var original = getClassName(e);
-            var namesToRemove;
-            var namesToRemoveLen;
-
-            if (name.indexOf(" ") >= 0) {
-                namesToRemove = name.split(" ");
-                namesToRemoveLen = removeEmpties(namesToRemove);
-            } else {
-                // early out for the case where you ask to remove a single
-                // name and that name isn't found.
-                //
-                if (original.indexOf(name) < 0) {
-                    return e;
-                }
-                namesToRemove = [name];
-                namesToRemoveLen = 1;
-            }
-            var removed;
-            var names = original.split(" ");
-            var namesLen = removeEmpties(names);
-
-            for (var i = namesLen - 1; i >= 0; i--) {
-                if (namesToRemove.indexOf(names[i]) >= 0) {
-                    names.splice(i, 1);
-                    removed = true;
-                }
-            }
-
-            if (removed) {
-                setClassName(e, names.join(" "));
-            }
-            return e;
-        }
-    }
-    function toggleClass(e, name) {
-        /// <signature helpKeyword="WinJS.Utilities.toggleClass">
-        /// <summary locid="WinJS.Utilities.toggleClass">
-        /// Toggles (adds or removes) the specified class on the specified element.
-        /// If the class is present, it is removed; if it is absent, it is added.
-        /// </summary>
-        /// <param name="e" type="HTMLElement" locid="WinJS.Utilities.toggleClass_p:e">
-        /// The element on which to toggle the class.
-        /// </param>
-        /// <param name="name" type="String" locid="WinJS.Utilities.toggleClass_p:name">
-        /// The name of the class to toggle.
-        /// </param>
-        /// <returns type="HTMLElement" locid="WinJS.Utilities.toggleClass_returnValue">
-        /// The element.
-        /// </returns>
-        /// </signature>
-        if (e.classList) {
-            e.classList.toggle(name);
-            return e;
-        } else {
-            var className = getClassName(e);
-            var names = className.trim().split(" ");
-            var l = names.length;
-            var found = false;
-            for (var i = 0; i < l; i++) {
-                if (names[i] === name) {
-                    found = true;
-                }
-            }
-            if (!found) {
-                if (l > 0 && names[0].length > 0) {
-                    setClassName(e, className + " " + name);
-                } else {
-                    setClassName(e, className + name);
-                }
-            } else {
-                setClassName(e, names.reduce(function (r, e) {
-                    if (e === name) {
-                        return r;
-                    } else if (r && r.length > 0) {
-                        return r + " " + e;
-                    } else {
-                        return e;
-                    }
-                }, ""));
-            }
-            return e;
-        }
-    }
-
-    // Only set the attribute if its value has changed
-    function setAttribute(element, attribute, value) {
-        if (element.getAttribute(attribute) !== "" + value) {
-            element.setAttribute(attribute, value);
-        }
-    }
-
-    function _clamp(value, lowerBound, upperBound, defaultValue) {
-        var n = Math.max(lowerBound, Math.min(upperBound, +value));
-        return n === 0 ? 0 : n || Math.max(lowerBound, Math.min(upperBound, defaultValue));
-    }
-    var _pixelsRE = /^-?\d+\.?\d*(px)?$/i;
-    var _numberRE = /^-?\d+/i;
-    function convertToPixels(element, value) {
-        /// <signature helpKeyword="WinJS.Utilities.convertToPixels">
-        /// <summary locid="WinJS.Utilities.convertToPixels">
-        /// Converts a CSS positioning string for the specified element to pixels.
-        /// </summary>
-        /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.convertToPixels_p:element">
-        /// The element.
-        /// </param>
-        /// <param name="value" type="String" locid="WinJS.Utilities.convertToPixels_p:value">
-        /// The CSS positioning string.
-        /// </param>
-        /// <returns type="Number" locid="WinJS.Utilities.convertToPixels_returnValue">
-        /// The number of pixels.
-        /// </returns>
-        /// </signature>
-        if (!_pixelsRE.test(value) && _numberRE.test(value)) {
-            var previousValue = element.style.left;
-
-            element.style.left = value;
-            value = element.style.pixelLeft;
-
-            element.style.left = previousValue;
-
-            return value;
-        } else {
-            return Math.round(parseFloat(value)) || 0;
-        }
-    }
-
-    function getDimension(element, property) {
-        return convertToPixels(element, _getComputedStyle(element, null)[property]);
-    }
-
-    function _convertToPrecisePixels(value) {
-        return parseFloat(value) || 0;
-    }
-    function _getPreciseDimension(element, property) {
-        return _convertToPrecisePixels(_getComputedStyle(element, null)[property]);
-    }
-    function _getPreciseMargins(element) {
-        var style = _getComputedStyle(element);
-        return {
-            top: _convertToPrecisePixels(style.marginTop),
-            right: _convertToPrecisePixels(style.marginRight),
-            bottom: _convertToPrecisePixels(style.marginBottom),
-            left: _convertToPrecisePixels(style.marginLeft),
-        };
-    }
-
-    var _MSGestureEvent = _Global.MSGestureEvent || {
-        MSGESTURE_FLAG_BEGIN: 1,
-        MSGESTURE_FLAG_CANCEL: 4,
-        MSGESTURE_FLAG_END: 2,
-        MSGESTURE_FLAG_INERTIA: 8,
-        MSGESTURE_FLAG_NONE: 0
-    };
-
-    var _MSManipulationEvent = _Global.MSManipulationEvent || {
-        MS_MANIPULATION_STATE_ACTIVE: 1,
-        MS_MANIPULATION_STATE_CANCELLED: 6,
-        MS_MANIPULATION_STATE_COMMITTED: 7,
-        MS_MANIPULATION_STATE_DRAGGING: 5,
-        MS_MANIPULATION_STATE_INERTIA: 2,
-        MS_MANIPULATION_STATE_PRESELECT: 3,
-        MS_MANIPULATION_STATE_SELECTING: 4,
-        MS_MANIPULATION_STATE_STOPPED: 0
-    };
-
-    var _MSPointerEvent = _Global.MSPointerEvent || {
-        MSPOINTER_TYPE_TOUCH: "touch",
-        MSPOINTER_TYPE_PEN: "pen",
-        MSPOINTER_TYPE_MOUSE: "mouse",
-    };
-
-    // Helpers for managing element._eventsMap for custom events
-    //
-
-    function addListenerToEventMap(element, type, listener, useCapture, data) {
-        var eventNameLowercase = type.toLowerCase();
-        if (!element._eventsMap) {
-            element._eventsMap = {};
-        }
-        if (!element._eventsMap[eventNameLowercase]) {
-            element._eventsMap[eventNameLowercase] = [];
-        }
-        element._eventsMap[eventNameLowercase].push({
-            listener: listener,
-            useCapture: useCapture,
-            data: data
-        });
-    }
-
-    function removeListenerFromEventMap(element, type, listener, useCapture) {
-        var eventNameLowercase = type.toLowerCase();
-        var mappedEvents = element._eventsMap && element._eventsMap[eventNameLowercase];
-        if (mappedEvents) {
-            for (var i = mappedEvents.length - 1; i >= 0; i--) {
-                var mapping = mappedEvents[i];
-                if (mapping.listener === listener && (!!useCapture === !!mapping.useCapture)) {
-                    mappedEvents.splice(i, 1);
-                    return mapping;
-                }
-            }
-        }
-        return null;
-    }
-
-    function lookupListeners(element, type) {
-        var eventNameLowercase = type.toLowerCase();
-        return element._eventsMap && element._eventsMap[eventNameLowercase] && element._eventsMap[eventNameLowercase].slice(0) || [];
-    }
-
-    // Custom focusin/focusout events
-    // Generally, use these instead of using the browser's blur/focus/focusout/focusin events directly.
-    // However, this doesn't support the window object. If you need to listen to focus events on the window,
-    // use the browser's events directly.
-    //
-    // In order to send our custom focusin/focusout events synchronously on every browser, we feature detect
-    // for native "focusin" and "focusout" since every browser that supports them will fire them synchronously.
-    // Every browser in our support matrix, except for IE, also fires focus/blur synchronously, we fall back to
-    // those events in browsers such as Firefox that do not have native support for focusin/focusout.
-
-    function bubbleEvent(element, type, eventObject) {
-        while (element) {
-            var handlers = lookupListeners(element, type);
-            for (var i = 0, len = handlers.length; i < len; i++) {
-                handlers[i].listener.call(element, eventObject);
-            }
-
-            element = element.parentNode;
-        }
-    }
-
-    function prepareFocusEvent(eventObject) {
-        // If an iframe is involved, then relatedTarget should be null.
-        if (eventObject.relatedTarget && eventObject.relatedTarget.tagName === "IFRAME" ||
-                eventObject.target && eventObject.target.tagName === "IFRAME") {
-            eventObject.relatedTarget = null;
-        }
-
-        return eventObject;
-    }
-
-    var nativeSupportForFocusIn = "onfocusin" in _Global.document.documentElement;
-    var activeElement = null;
-    _Global.addEventListener(nativeSupportForFocusIn ? "focusout" : "blur", function (eventObject) {
-        // Fires focusout when focus move to another window or into an iframe.
-        if (eventObject.target === _Global) {
-            var previousActiveElement = activeElement;
-            if (previousActiveElement) {
-                bubbleEvent(previousActiveElement, "focusout", prepareFocusEvent({
-                    type: "focusout",
-                    target: previousActiveElement,
-                    relatedTarget: null
-                }));
-            }
-            activeElement = null;
-        }
-    });
-
-    _Global.document.documentElement.addEventListener(nativeSupportForFocusIn ? "focusin" : "focus", function (eventObject) {
-        var previousActiveElement = activeElement;
-        activeElement = eventObject.target;
-        if (previousActiveElement) {
-            bubbleEvent(previousActiveElement, "focusout", prepareFocusEvent({
-                type: "focusout",
-                target: previousActiveElement,
-                relatedTarget: activeElement
-            }));
-        }
-        if (activeElement) {
-            bubbleEvent(activeElement, "focusin", prepareFocusEvent({
-                type: "focusin",
-                target: activeElement,
-                relatedTarget: previousActiveElement
-            }));
-        }
-    }, true);
-
-    function registerBubbleListener(element, type, listener, useCapture) {
-        if (useCapture) {
-            throw "This custom WinJS event only supports bubbling";
-        }
-        addListenerToEventMap(element, type, listener, useCapture);
-    }
-
-    // Custom pointer events
-    //
-
-    // Sets the properties in *overrideProperties* on the object. Delegates all other
-    // property accesses to *eventObject*.
-    //
-    // The purpose of PointerEventProxy is that it allows us to customize properties on
-    // an eventObject despite those properties being unwritable and unconfigurable.
-    var PointerEventProxy = function (eventObject, overrideProperties) {
-        overrideProperties = overrideProperties || {};
-        this.__eventObject = eventObject;
-        var that = this;
-        Object.keys(overrideProperties).forEach(function (propertyName) {
-            Object.defineProperty(that, propertyName, {
-                value: overrideProperties[propertyName]
-            });
-        });
-    };
-
-    // Define PointerEventProxy properties which should be delegated to the original eventObject.
-    [
-        "altKey", "AT_TARGET", "bubbles", "BUBBLING_PHASE", "button", "buttons",
-        "cancelable", "cancelBubble", "CAPTURING_PHASE", "clientX", "clientY",
-        "ctrlKey", "currentTarget", "defaultPrevented", "detail", "eventPhase",
-        "fromElement", "getModifierState", "height", "hwTimestamp", "initEvent",
-        "initMouseEvent", "initPointerEvent", "initUIEvent", "isPrimary", "isTrusted",
-        "layerX", "layerY", "metaKey", "offsetX", "offsetY", "pageX", "pageY",
-        "pointerId", "pointerType", "pressure", "preventDefault", "relatedTarget",
-        "rotation", "screenX", "screenY", "shiftKey", "srcElement", "stopImmediatePropagation",
-        "stopPropagation", "target", "tiltX", "tiltY", "timeStamp", "toElement", "type",
-        "view", "which", "width", "x", "y", "_normalizedType", "_fakedBySemanticZoom"
-    ].forEach(function (propertyName) {
-        Object.defineProperty(PointerEventProxy.prototype, propertyName, {
-            get: function () {
-                var value = this.__eventObject[propertyName];
-                return typeof value === "function" ? value.bind(this.__eventObject) : value;
-            },
-            configurable: true
-        });
-    });
-
-    function touchEventTranslator(callback, eventObject) {
-        var changedTouches = eventObject.changedTouches,
-            retVal = null;
-
-        if (!changedTouches) {
-            return retVal;
-        }
-
-        for (var i = 0, len = changedTouches.length; i < len; i++) {
-            var touchObject = changedTouches[i];
-            var pointerEventObject = new PointerEventProxy(eventObject, {
-                pointerType: _MSPointerEvent.MSPOINTER_TYPE_TOUCH,
-                pointerId: touchObject.identifier,
-                isPrimary: i === 0,
-                screenX: touchObject.screenX,
-                screenY: touchObject.screenY,
-                clientX: touchObject.clientX,
-                clientY: touchObject.clientY,
-                pageX: touchObject.pageX,
-                pageY: touchObject.pageY,
-                radiusX: touchObject.radiusX,
-                radiusY: touchObject.radiusY,
-                rotationAngle: touchObject.rotationAngle,
-                force: touchObject.force,
-                _currentTouch: touchObject
-            });
-            var newRetVal = callback(pointerEventObject);
-            retVal = retVal || newRetVal;
-        }
-        return retVal;
-    }
-
-    function mouseEventTranslator(callback, eventObject) {
-        eventObject.pointerType = _MSPointerEvent.MSPOINTER_TYPE_MOUSE;
-        eventObject.pointerId = -1;
-        eventObject.isPrimary = true;
-        return callback(eventObject);
-    }
-
-    function mspointerEventTranslator(callback, eventObject) {
-        return callback(eventObject);
-    }
-
-    var eventTranslations = {
-        pointerdown: {
-            touch: "touchstart",
-            mspointer: "MSPointerDown",
-            mouse: "mousedown"
-        },
-        pointerup: {
-            touch: "touchend",
-            mspointer: "MSPointerUp",
-            mouse: "mouseup"
-        },
-        pointermove: {
-            touch: "touchmove",
-            mspointer: "MSPointerMove",
-            mouse: "mousemove"
-        },
-        pointerenter: {
-            touch: "touchenter",
-            mspointer: "MSPointerEnter",
-            mouse: "mouseenter"
-        },
-        pointerover: {
-            touch: null,
-            mspointer: "MSPointerOver",
-            mouse: "mouseover"
-        },
-        pointerout: {
-            touch: "touchleave",
-            mspointer: "MSPointerOut",
-            mouse: "mouseout"
-        },
-        pointercancel: {
-            touch: "touchcancel",
-            mspointer: "MSPointerCancel",
-            mouse: null
-        }
-    };
-
-    function registerPointerEvent(element, type, callback, capture) {
-        var eventNameLowercase = type.toLowerCase();
-
-        var mouseWrapper,
-            touchWrapper,
-            mspointerWrapper;
-        var translations = eventTranslations[eventNameLowercase];
-
-        // Browsers fire a touch event and then a mouse event when the input is touch. touchHandled is used to prevent invoking the pointer callback twice.
-        var touchHandled;
-
-        // If we are in IE10, we should use MSPointer as it provides a better interface than touch events
-        if (_Global.MSPointerEvent) {
-            mspointerWrapper = function (eventObject) {
-                eventObject._normalizedType = eventNameLowercase;
-                touchHandled = true;
-                return mspointerEventTranslator(callback, eventObject);
-            };
-            element.addEventListener(translations.mspointer, mspointerWrapper, capture);
-        } else {
-            // Otherwise, use a mouse and touch event
-            if (translations.mouse) {
-                mouseWrapper = function (eventObject) {
-                    eventObject._normalizedType = eventNameLowercase;
-                    if (!touchHandled) {
-                        return mouseEventTranslator(callback, eventObject);
-                    }
-                    touchHandled = false;
-                };
-                element.addEventListener(translations.mouse, mouseWrapper, capture);
-            }
-            if (translations.touch) {
-                touchWrapper = function (eventObject) {
-                    eventObject._normalizedType = eventNameLowercase;
-                    touchHandled = true;
-                    return touchEventTranslator(callback, eventObject);
-                };
-                element.addEventListener(translations.touch, touchWrapper, capture);
-            }
-        }
-
-        addListenerToEventMap(element, type, callback, capture, {
-            mouseWrapper: mouseWrapper,
-            touchWrapper: touchWrapper,
-            mspointerWrapper: mspointerWrapper
-        });
-    }
-
-    function unregisterPointerEvent(element, type, callback, capture) {
-        var eventNameLowercase = type.toLowerCase();
-
-        var mapping = removeListenerFromEventMap(element, type, callback, capture);
-        if (mapping) {
-            var translations = eventTranslations[eventNameLowercase];
-            if (mapping.data.mouseWrapper) {
-                element.removeEventListener(translations.mouse, mapping.data.mouseWrapper, capture);
-            }
-            if (mapping.data.touchWrapper) {
-                element.removeEventListener(translations.touch, mapping.data.touchWrapper, capture);
-            }
-            if (mapping.data.mspointerWrapper) {
-                element.removeEventListener(translations.mspointer, mapping.data.mspointerWrapper, capture);
-            }
-        }
-    }
-
-    // Custom events dispatch table. Event names should be lowercased.
-    //
-
-    var customEvents = {
-        focusout: {
-            register: registerBubbleListener,
-            unregister: removeListenerFromEventMap
-        },
-        focusin: {
-            register: registerBubbleListener,
-            unregister: removeListenerFromEventMap
-        },
-    };
-    if (!_Global.PointerEvent) {
-        var pointerEventEntry = {
-            register: registerPointerEvent,
-            unregister: unregisterPointerEvent
-        };
-
-        customEvents.pointerdown = pointerEventEntry;
-        customEvents.pointerup = pointerEventEntry;
-        customEvents.pointermove = pointerEventEntry;
-        customEvents.pointerenter = pointerEventEntry;
-        customEvents.pointerover = pointerEventEntry;
-        customEvents.pointerout = pointerEventEntry;
-        customEvents.pointercancel = pointerEventEntry;
-    }
-
-    // The MutationObserverShim only supports the following configuration:
-    //  attributes
-    //  attributeFilter
-    var MutationObserverShim = _Base.Class.define(
-        function MutationObserverShim_ctor(callback) {
-            this._callback = callback;
-            this._toDispose = [];
-            this._attributeFilter = [];
-            this._scheduled = false;
-            this._pendingChanges = [];
-            this._observerCount = 0;
-            this._handleCallback = this._handleCallback.bind(this);
-            this._targetElements = [];
-        },
-        {
-            observe: function MutationObserverShim_observe(element, configuration) {
-                if (this._targetElements.indexOf(element) === -1) {
-                    this._targetElements.push(element);
-                }
-                this._observerCount++;
-                if (configuration.attributes) {
-                    this._addRemovableListener(element, "DOMAttrModified", this._handleCallback);
-                }
-                if (configuration.attributeFilter) {
-                    this._attributeFilter = configuration.attributeFilter;
-                }
-            },
-            disconnect: function MutationObserverShim_disconnect() {
-                this._observerCount = 0;
-                this._targetElements = [];
-                this._toDispose.forEach(function (disposeFunc) {
-                    disposeFunc();
-                });
-            },
-            _addRemovableListener: function MutationObserverShim_addRemovableListener(target, event, listener) {
-                target.addEventListener(event, listener);
-                this._toDispose.push(function () {
-                    target.removeEventListener(event, listener);
-                });
-            },
-            _handleCallback: function MutationObserverShim_handleCallback(evt) {
-
-                // prevent multiple events from firing when nesting observers
-                evt.stopPropagation();
-
-                var attrName = evt.attrName;
-                if (this._attributeFilter.length && this._attributeFilter.indexOf(attrName) === -1) {
-                    return;
-                }
-
-                // subtree:true is not currently supported
-                if (this._targetElements.indexOf(evt.target) === -1) {
-                    return;
-                }
-
-                var isAriaMutation = attrName.indexOf("aria") >= 0;
-
-                // DOM mutation events use different naming for this attribute
-                if (attrName === 'tabindex') {
-                    attrName = 'tabIndex';
-                }
-
-                this._pendingChanges.push({
-                    type: 'attributes',
-                    target: evt.target,
-                    attributeName: attrName
-                });
-
-                if (this._observerCount === 1 && !isAriaMutation) {
-                    this._dispatchEvent();
-                } else if (this._scheduled === false) {
-                    this._scheduled = true;
-                    _BaseUtils._setImmediate(this._dispatchEvent.bind(this));
-                }
-
-            },
-            _dispatchEvent: function MutationObserverShim_dispatchEvent() {
-                try {
-                    this._callback(this._pendingChanges);
-                }
-                finally {
-                    this._pendingChanges = [];
-                    this._scheduled = false;
-                }
-            }
-        },
-        {
-            _isShim: true
-        }
-    );
-
-    var _MutationObserver = _Global.MutationObserver || MutationObserverShim;
-
-    // Lazily init singleton on first access.
-    var _resizeNotifier = null;
-
-    // Class to provide a global listener for window.onresize events.
-    // This keeps individual elements from having to listen to window.onresize
-    // and having to dispose themselves to avoid leaks.
-    var ResizeNotifier = _Base.Class.define(
-        function ElementResizer_ctor() {
-            _Global.addEventListener("resize", this._handleResize.bind(this));
-        },
-        {
-            subscribe: function ElementResizer_subscribe(element, handler) {
-                element.addEventListener(this._resizeEvent, handler);
-                addClass(element, this._resizeClass);
-            },
-            unsubscribe: function ElementResizer_unsubscribe(element, handler) {
-                removeClass(element, this._resizeClass);
-                element.removeEventListener(this._resizeEvent, handler);
-            },
-            _handleResize: function ElementResizer_handleResize() {
-                var resizables = _Global.document.querySelectorAll('.' + this._resizeClass);
-                var length = resizables.length;
-                for (var i = 0; i < length; i++) {
-                    var event = _Global.document.createEvent("Event");
-                    event.initEvent(this._resizeEvent, false, true);
-                    resizables[i].dispatchEvent(event);
-                }
-            },
-            _resizeClass: { get: function () { return 'win-element-resize'; } },
-            _resizeEvent: { get: function () { return 'WinJSElementResize'; } }
-        }
-    );
-
-    // - object: The object on which GenericListener will listen for events.
-    // - objectName: A string representing the name of *object*. This will be
-    //   incorporated into the names of the events and classNames created by
-    //   GenericListener.
-    // - options
-    //   - registerThruWinJSCustomEvents: If true, will register for events using
-    //     _exports._addEventListener so that you can take advantage of WinJS's custom
-    //     events (e.g. focusin, pointer*). Otherwise, registers directly on *object*
-    //     using its add/removeEventListener methods.
-    var GenericListener = _Base.Class.define(
-        function GenericListener_ctor(objectName, object, options) {
-            options = options || {};
-            this.registerThruWinJSCustomEvents = !!options.registerThruWinJSCustomEvents;
-
-            this.objectName = objectName;
-            this.object = object;
-            this.capture = {};
-            this.bubble = {};
-        },
-        {
-            addEventListener: function GenericListener_addEventListener(element, name, listener, capture) {
-                name = name.toLowerCase();
-                var handlers = this._getHandlers(capture);
-                var handler = handlers[name];
-
-                if (!handler) {
-                    handler = this._getListener(name, capture);
-                    handler.refCount = 0;
-                    handlers[name] = handler;
-
-                    if (this.registerThruWinJSCustomEvents) {
-                        exports._addEventListener(this.object, name, handler, capture);
-                    } else {
-                        this.object.addEventListener(name, handler, capture);
-                    }
-                }
-
-                handler.refCount++;
-                element.addEventListener(this._getEventName(name, capture), listener);
-                addClass(element, this._getClassName(name, capture));
-            },
-            removeEventListener: function GenericListener_removeEventListener(element, name, listener, capture) {
-                name = name.toLowerCase();
-                var handlers = this._getHandlers(capture);
-                var handler = handlers[name];
-
-                if (handler) {
-                    handler.refCount--;
-                    if (handler.refCount === 0) {
-                        if (this.registerThruWinJSCustomEvents) {
-                            exports._removeEventListener(this.object, name, handler, capture);
-                        } else {
-                            this.object.removeEventListener(name, handler, capture);
-                        }
-                        delete handlers[name];
-                    }
-                }
-
-                removeClass(element, this._getClassName(name, capture));
-                element.removeEventListener(this._getEventName(name, capture), listener);
-            },
-
-            _getHandlers: function GenericListener_getHandlers(capture) {
-                if (capture) {
-                    return this.capture;
-                } else {
-                    return this.bubble;
-                }
-            },
-
-            _getClassName: function GenericListener_getClassName(name, capture) {
-                var captureSuffix = capture ? 'capture' : 'bubble';
-                return 'win-' + this.objectName.toLowerCase() + '-event-' + name + captureSuffix;
-            },
-
-            _getEventName: function GenericListener_getEventName(name, capture) {
-                var captureSuffix = capture ? 'capture' : 'bubble';
-                return 'WinJS' + this.objectName + 'Event-' + name + captureSuffix;
-            },
-
-            _getListener: function GenericListener_getListener(name, capture) {
-                var listener = function GenericListener_generatedListener(ev) {
-
-                    var targets = _Global.document.querySelectorAll('.' + this._getClassName(name, capture));
-                    var length = targets.length;
-                    var handled = false;
-                    for (var i = 0; i < length; i++) {
-                        var event = _Global.document.createEvent("Event");
-                        event.initEvent(this._getEventName(name, capture), false, true);
-                        event.detail = { originalEvent: ev };
-                        var doDefault = targets[i].dispatchEvent(event);
-                        handled = handled || !doDefault;
-                    }
-                    return handled;
-                };
-
-                return listener.bind(this);
-            }
-        }
-    );
-
-    var determinedRTLEnvironment = false,
-        usingWebkitScrollCoordinates = false,
-        usingFirefoxScrollCoordinates = false;
-    function determineRTLEnvironment() {
-        var element = _Global.document.createElement("div");
-        element.style.direction = "rtl";
-        element.innerHTML = "" +
-            "<div style='width: 100px; height: 100px; overflow: scroll; visibility:hidden'>" +
-                "<div style='width: 10000px; height: 100px;'></div>" +
-            "</div>";
-        _Global.document.body.appendChild(element);
-        var elementScroller = element.firstChild;
-        if (elementScroller.scrollLeft > 0) {
-            usingWebkitScrollCoordinates = true;
-        }
-        elementScroller.scrollLeft += 100;
-        if (elementScroller.scrollLeft === 0) {
-            usingFirefoxScrollCoordinates = true;
-        }
-        _Global.document.body.removeChild(element);
-        determinedRTLEnvironment = true;
-    }
-
-    function getAdjustedScrollPosition(element) {
-        var computedStyle = _getComputedStyle(element),
-            scrollLeft = element.scrollLeft;
-        if (computedStyle.direction === "rtl") {
-            if (!determinedRTLEnvironment) {
-                determineRTLEnvironment();
-            }
-            if (usingWebkitScrollCoordinates) {
-                scrollLeft = element.scrollWidth - element.clientWidth - scrollLeft;
-            }
-            scrollLeft = Math.abs(scrollLeft);
-        }
-
-        return {
-            scrollLeft: scrollLeft,
-            scrollTop: element.scrollTop
-        };
-    }
-
-    function setAdjustedScrollPosition(element, scrollLeft, scrollTop) {
-        if (scrollLeft !== undefined) {
-            var computedStyle = _getComputedStyle(element);
-            if (computedStyle.direction === "rtl") {
-                if (!determinedRTLEnvironment) {
-                    determineRTLEnvironment();
-                }
-                if (usingFirefoxScrollCoordinates) {
-                    scrollLeft = -scrollLeft;
-                } else if (usingWebkitScrollCoordinates) {
-                    scrollLeft = element.scrollWidth - element.clientWidth - scrollLeft;
-                }
-            }
-            element.scrollLeft = scrollLeft;
-        }
-
-        if (scrollTop !== undefined) {
-            element.scrollTop = scrollTop;
-        }
-    }
-
-    function getScrollPosition(element) {
-        /// <signature helpKeyword="WinJS.Utilities.getScrollPosition">
-        /// <summary locid="WinJS.Utilities.getScrollPosition">
-        /// Gets the scrollLeft and scrollTop of the specified element, adjusting the scrollLeft to change from browser specific coordinates to logical coordinates when in RTL.
-        /// </summary>
-        /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.Utilities.getScrollPosition_p:element">
-        /// The element.
-        /// </param>
-        /// <returns type="Object" locid="WinJS.Utilities.getScrollPosition_returnValue">
-        /// An object with two properties: scrollLeft and scrollTop
-        /// </returns>
-        /// </signature>
-        return getAdjustedScrollPosition(element);
-    }
-
-    function setScrollPosition(element, position) {
-        /// <signature helpKeyword="WinJS.Utilities.setScrollPosition">
-        /// <summary locid="WinJS.Utilities.setScrollPosition">
-        /// Sets the scrollLeft and scrollTop of the specified element, changing the scrollLeft from logical coordinates to browser-specific coordinates when in RTL.
-        /// </summary>
-        /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.Utilities.setScrollPosition_p:element">
-        /// The element.
-        /// </param>
-        /// <param name="position" type="Object" domElement="true" locid="WinJS.Utilities.setScrollPosition_p:position">
-        /// The element.
-        /// </param>
-        /// </signature>
-        position = position || {};
-        setAdjustedScrollPosition(element, position.scrollLeft, position.scrollTop);
-    }
-
-    // navigator.msManipulationViewsEnabled tells us whether snap points work or not regardless of whether the style properties exist, however,
-    // on Phone WWAs, this check returns false even though snap points are supported. To work around this bug, we check for the presence of
-    // 'MSAppHost' in the user agent string which indicates that we are in a WWA environment; all WWA environments support snap points.
-    var supportsSnapPoints = _Global.navigator.msManipulationViewsEnabled || _Global.navigator.userAgent.indexOf("MSAppHost") >= 0;
-    var supportsTouchDetection = !!(_Global.MSPointerEvent || _Global.TouchEvent);
-
-    var uniqueElementIDCounter = 0;
-
-    function uniqueID(e) {
-        if (!(e.uniqueID || e._uniqueID)) {
-            e._uniqueID = "element__" + (++uniqueElementIDCounter);
-        }
-
-        return e.uniqueID || e._uniqueID;
-    }
-
-    function ensureId(element) {
-        if (!element.id) {
-            element.id = uniqueID(element);
-        }
-    }
-
-    function _getCursorPos(eventObject) {
-        var docElement = _Global.document.documentElement;
-        var docScrollPos = getScrollPosition(docElement);
-
-        return {
-            left: eventObject.clientX + (_Global.document.body.dir === "rtl" ? -docScrollPos.scrollLeft : docScrollPos.scrollLeft),
-            top: eventObject.clientY + docElement.scrollTop
-        };
-    }
-
-    function _getElementsByClasses(parent, classes) {
-        var retVal = [];
-
-        for (var i = 0, len = classes.length; i < len; i++) {
-            var element = parent.querySelector("." + classes[i]);
-            if (element) {
-                retVal.push(element);
-            }
-        }
-        return retVal;
-    }
-
-    var _selectionPartsSelector = ".win-selectionborder, .win-selectionbackground, .win-selectioncheckmark, .win-selectioncheckmarkbackground";
-    var _dataKey = "_msDataKey";
-    _Base.Namespace._moduleDefine(exports, "WinJS.Utilities", {
-        _dataKey: _dataKey,
-
-        _supportsSnapPoints: {
-            get: function () {
-                return supportsSnapPoints;
-            }
-        },
-
-        _supportsTouchDetection: {
-            get: function () {
-                return supportsTouchDetection;
-            }
-        },
-
-        _uniqueID: uniqueID,
-
-        _ensureId: ensureId,
-
-        _clamp: _clamp,
-
-        _getCursorPos: _getCursorPos,
-
-        _getElementsByClasses: _getElementsByClasses,
-
-        _createGestureRecognizer: function () {
-            if (_Global.MSGesture) {
-                return new _Global.MSGesture();
-            }
-
-            var doNothing = function () {
-            };
-            return {
-                addEventListener: doNothing,
-                removeEventListener: doNothing,
-                addPointer: doNothing,
-                stop: doNothing
-            };
-        },
-
-        _MSGestureEvent: _MSGestureEvent,
-        _MSManipulationEvent: _MSManipulationEvent,
-
-        _elementsFromPoint: function (x, y) {
-            if (_Global.document.msElementsFromPoint) {
-                return _Global.document.msElementsFromPoint(x, y);
-            } else {
-                var element = _Global.document.elementFromPoint(x, y);
-                return element ? [element] : null;
-            }
-        },
-
-        _matchesSelector: function _matchesSelector(element, selectorString) {
-            var matchesSelector = element.matches
-                    || element.msMatchesSelector
-                    || element.mozMatchesSelector
-                    || element.webkitMatchesSelector;
-            return matchesSelector.call(element, selectorString);
-        },
-
-        _selectionPartsSelector: _selectionPartsSelector,
-
-        _isSelectionRendered: function _isSelectionRendered(itemBox) {
-            // The tree is changed at pointerDown but _selectedClass is added only when the user drags an item below the selection threshold so checking for _selectedClass is not reliable.
-            return itemBox.querySelectorAll(_selectionPartsSelector).length > 0;
-        },
-
-        _addEventListener: function _addEventListener(element, type, listener, useCapture) {
-            var eventNameLower = type && type.toLowerCase();
-            var entry = customEvents[eventNameLower];
-            var equivalentEvent = _BaseUtils._browserEventEquivalents[type];
-            if (entry) {
-                entry.register(element, type, listener, useCapture);
-            } else if (equivalentEvent) {
-                element.addEventListener(equivalentEvent, listener, useCapture);
-            } else {
-                element.addEventListener(type, listener, useCapture);
-            }
-        },
-
-        _removeEventListener: function _removeEventListener(element, type, listener, useCapture) {
-            var eventNameLower = type && type.toLowerCase();
-            var entry = customEvents[eventNameLower];
-            var equivalentEvent = _BaseUtils._browserEventEquivalents[type];
-            if (entry) {
-                entry.unregister(element, type, listener, useCapture);
-            } else if (equivalentEvent) {
-                element.removeEventListener(equivalentEvent, listener, useCapture);
-            } else {
-                element.removeEventListener(type, listener, useCapture);
-            }
-        },
-
-        _initEventImpl: function (initType, event, eventType) {
-            eventType = eventType.toLowerCase();
-            var mapping = eventTranslations[eventType];
-            if (mapping) {
-                switch (initType.toLowerCase()) {
-                    case "pointer":
-                        if (!_Global.PointerEvent) {
-                            arguments[2] = mapping.mspointer;
-                        }
-                        break;
-
-                    default:
-                        arguments[2] = mapping[initType.toLowerCase()];
-                        break;
-                }
-            }
-            event["init" + initType + "Event"].apply(event, Array.prototype.slice.call(arguments, 2));
-        },
-
-        _initMouseEvent: function (event) {
-            this._initEventImpl.apply(this, ["Mouse", event].concat(Array.prototype.slice.call(arguments, 1)));
-        },
-
-        _initPointerEvent: function (event) {
-            this._initEventImpl.apply(this, ["Pointer", event].concat(Array.prototype.slice.call(arguments, 1)));
-        },
-
-        _PointerEventProxy: PointerEventProxy,
-
-        _bubbleEvent: bubbleEvent,
-
-        _setPointerCapture: function (element, pointerId) {
-            if (element.setPointerCapture) {
-                element.setPointerCapture(pointerId);
-            }
-        },
-
-        _releasePointerCapture: function (element, pointerId) {
-            if (element.releasePointerCapture) {
-                element.releasePointerCapture(pointerId);
-            }
-        },
-
-        _MSPointerEvent: _MSPointerEvent,
-
-        _getComputedStyle: _getComputedStyle,
-
-        _zoomToDuration: _zoomToDuration,
-
-        _zoomTo: function _zoomTo(element, args) {
-            if (this._supportsSnapPoints && element.msZoomTo) {
-                element.msZoomTo(args);
-            } else {
-                // Schedule to ensure that we're not running from within an event handler. For example, if running
-                // within a focus handler triggered by WinJS.Utilities._setActive, scroll position will not yet be
-                // restored.
-                Scheduler.schedule(function () {
-                    var initialPos = getAdjustedScrollPosition(element);
-                    var effectiveScrollLeft = (typeof element._zoomToDestX === "number" ? element._zoomToDestX : initialPos.scrollLeft);
-                    var effectiveScrollTop = (typeof element._zoomToDestY === "number" ? element._zoomToDestY : initialPos.scrollTop);
-                    var cs = _getComputedStyle(element);
-                    var scrollLimitX = element.scrollWidth - parseInt(cs.width, 10) - parseInt(cs.paddingLeft, 10) - parseInt(cs.paddingRight, 10);
-                    var scrollLimitY = element.scrollHeight - parseInt(cs.height, 10) - parseInt(cs.paddingTop, 10) - parseInt(cs.paddingBottom, 10);
-
-                    if (typeof args.contentX !== "number") {
-                        args.contentX = effectiveScrollLeft;
-                    }
-                    if (typeof args.contentY !== "number") {
-                        args.contentY = effectiveScrollTop;
-                    }
-
-                    var zoomToDestX = _clamp(args.contentX, 0, scrollLimitX);
-                    var zoomToDestY = _clamp(args.contentY, 0, scrollLimitY);
-                    if (zoomToDestX === effectiveScrollLeft && zoomToDestY === effectiveScrollTop) {
-                        // Scroll position is already in the proper state. This zoomTo is a no-op.
-                        return;
-                    }
-
-                    element._zoomToId = element._zoomToId || 0;
-                    element._zoomToId++;
-                    element._zoomToDestX = zoomToDestX;
-                    element._zoomToDestY = zoomToDestY;
-
-                    var thisZoomToId = element._zoomToId;
-                    var start = _BaseUtils._now();
-                    var xFactor = (element._zoomToDestX - initialPos.scrollLeft) / _zoomToDuration;
-                    var yFactor = (element._zoomToDestY - initialPos.scrollTop) / _zoomToDuration;
-
-                    var update = function () {
-                        var t = _BaseUtils._now() - start;
-                        if (element._zoomToId !== thisZoomToId) {
-                            return;
-                        } else if (t > _zoomToDuration) {
-                            setAdjustedScrollPosition(element, element._zoomToDestX, element._zoomToDestY);
-                            element._zoomToDestX = null;
-                            element._zoomToDestY = null;
-                        } else {
-                            setAdjustedScrollPosition(element, initialPos.scrollLeft + t * xFactor, initialPos.scrollTop + t * yFactor);
-                            _BaseUtils._requestAnimationFrame(update);
-                        }
-                    };
-
-                    _BaseUtils._requestAnimationFrame(update);
-                }, Scheduler.Priority.high, null, "WinJS.Utilities._zoomTo");
-            }
-        },
-
-        _setActive: function _setActive(element, scroller) {
-            var success = true;
-            try {
-                if (_Global.HTMLElement && _Global.HTMLElement.prototype.setActive) {
-                    element.setActive();
-                } else {
-                    // We are aware that, unlike setActive(), focus() will scroll to the element that gets focus. However, this is
-                    // our current cross-browser solution until there is an equivalent for setActive() in other browsers.
-                    //
-                    // This _setActive polyfill does have limited support for preventing scrolling: via the scroller parameter, it
-                    // can prevent one scroller from scrolling. This functionality is necessary in some scenarios. For example, when using
-                    // _zoomTo and _setActive together.
-
-                    var scrollLeft,
-                        scrollTop;
-
-                    if (scroller) {
-                        scrollLeft = scroller.scrollLeft;
-                        scrollTop = scroller.scrollTop;
-                    }
-                    element.focus();
-                    if (scroller) {
-                        scroller.scrollLeft = scrollLeft;
-                        scroller.scrollTop = scrollTop;
-                    }
-                }
-            } catch (e) {
-                // setActive() raises an exception when trying to focus an invisible item. Checking visibility is non-trivial, so it's best
-                // just to catch the exception and ignore it. focus() on the other hand, does not raise exceptions.
-                success = false;
-            }
-            return success;
-        },
-
-        _MutationObserver: _MutationObserver,
-
-        _resizeNotifier: {
-            get: function () {
-                if (!_resizeNotifier) {
-                    _resizeNotifier = new ResizeNotifier();
-                }
-                return _resizeNotifier;
-            }
-        },
-
-        _GenericListener: GenericListener,
-        _globalListener: new GenericListener("Global", _Global, { registerThruWinJSCustomEvents: true }),
-        _documentElementListener: new GenericListener("DocumentElement", _Global.document.documentElement, { registerThruWinJSCustomEvents: true }),
-        _inputPaneListener: _WinRT.Windows.UI.ViewManagement.InputPane ?
-            new GenericListener("InputPane", _WinRT.Windows.UI.ViewManagement.InputPane.getForCurrentView()) :
-            { addEventListener: function () { }, removeEventListener: function () { } },
-
-        // Appends a hidden child to the given element that will listen for being added
-        // to the DOM. When the hidden element is added to the DOM, it will dispatch a
-        // "WinJSNodeInserted" event on the provided element.
-        _addInsertedNotifier: function (element) {
-            var hiddenElement = _Global.document.createElement("div");
-            hiddenElement.style[_BaseUtils._browserStyleEquivalents["animation-name"].scriptName] = "WinJS-node-inserted";
-            hiddenElement.style[_BaseUtils._browserStyleEquivalents["animation-duration"].scriptName] = "0.01s";
-            hiddenElement.style["position"] = "absolute";
-            element.appendChild(hiddenElement);
-
-            exports._addEventListener(hiddenElement, "animationStart", function (e) {
-                if (e.animationName === "WinJS-node-inserted") {
-                    var e = _Global.document.createEvent("Event");
-                    e.initEvent("WinJSNodeInserted", false, true);
-                    element.dispatchEvent(e);
-                }
-            }, false);
-
-            return hiddenElement;
-        },
-
-        // Returns a promise which completes when *element* is in the DOM.
-        _inDom: function Utilities_inDom(element) {
-            return new Promise(function (c) {
-                if (_Global.document.body.contains(element)) {
-                    c();
-                } else {
-                    var nodeInsertedHandler = function () {
-                        element.removeEventListener("WinJSNodeInserted", nodeInsertedHandler, false);
-                        c();
-                    };
-                    exports._addInsertedNotifier(element);
-                    element.addEventListener("WinJSNodeInserted", nodeInsertedHandler, false);
-                }
-            });
-        },
-
-        // Browser agnostic method to set element flex style
-        // Param is an object in the form {grow: flex-grow, shrink: flex-shrink, basis: flex-basis}
-        // All fields optional
-        _setFlexStyle: function (element, flexParams) {
-            var styleObject = element.style;
-            if (typeof flexParams.grow !== "undefined") {
-                styleObject.msFlexPositive = flexParams.grow;
-                styleObject.webkitFlexGrow = flexParams.grow;
-                styleObject.flexGrow = flexParams.grow;
-            }
-            if (typeof flexParams.shrink !== "undefined") {
-                styleObject.msFlexNegative = flexParams.shrink;
-                styleObject.webkitFlexShrink = flexParams.shrink;
-                styleObject.flexShrink = flexParams.shrink;
-            }
-            if (typeof flexParams.basis !== "undefined") {
-                styleObject.msFlexPreferredSize = flexParams.basis;
-                styleObject.webkitFlexBasis = flexParams.basis;
-                styleObject.flexBasis = flexParams.basis;
-            }
-        },
-
-        /// <field locid="WinJS.Utilities.Key" helpKeyword="WinJS.Utilities.Key">
-        /// Defines a set of keyboard values.
-        /// </field>
-        Key: {
-            /// <field locid="WinJS.Utilities.Key.backspace" helpKeyword="WinJS.Utilities.Key.backspace">
-            /// BACKSPACE key.
-            /// </field>
-            backspace: 8,
-
-            /// <field locid="WinJS.Utilities.Key.tab" helpKeyword="WinJS.Utilities.Key.tab">
-            /// TAB key.
-            /// </field>
-            tab: 9,
-
-            /// <field locid="WinJS.Utilities.Key.enter" helpKeyword="WinJS.Utilities.Key.enter">
-            /// ENTER key.
-            /// </field>
-            enter: 13,
-
-            /// <field locid="WinJS.Utilities.Key.shift" helpKeyword="WinJS.Utilities.Key.shift">
-            /// Shift key.
-            /// </field>
-            shift: 16,
-
-            /// <field locid="WinJS.Utilities.Key.ctrl" helpKeyword="WinJS.Utilities.Key.ctrl">
-            /// CTRL key.
-            /// </field>
-            ctrl: 17,
-
-            /// <field locid="WinJS.Utilities.Key.alt" helpKeyword="WinJS.Utilities.Key.alt">
-            /// ALT key
-            /// </field>
-            alt: 18,
-
-            /// <field locid="WinJS.Utilities.Key.pause" helpKeyword="WinJS.Utilities.Key.pause">
-            /// Pause key.
-            /// </field>
-            pause: 19,
-
-            /// <field locid="WinJS.Utilities.Key.capsLock" helpKeyword="WinJS.Utilities.Key.capsLock">
-            /// CAPS LOCK key.
-            /// </field>
-            capsLock: 20,
-
-            /// <field locid="WinJS.Utilities.Key.escape" helpKeyword="WinJS.Utilities.Key.escape">
-            /// ESCAPE key.
-            /// </field>
-            escape: 27,
-
-            /// <field locid="WinJS.Utilities.Key.space" helpKeyword="WinJS.Utilities.Key.space">
-            /// SPACE key.
-            /// </field>
-            space: 32,
-
-            /// <field locid="WinJS.Utilities.Key.pageUp" helpKeyword="WinJS.Utilities.Key.pageUp">
-            /// PAGE UP key.
-            /// </field>
-            pageUp: 33,
-
-            /// <field locid="WinJS.Utilities.Key.pageDown" helpKeyword="WinJS.Utilities.Key.pageDown">
-            /// PAGE DOWN key.
-            /// </field>
-            pageDown: 34,
-
-            /// <field locid="WinJS.Utilities.Key.end" helpKeyword="WinJS.Utilities.Key.end">
-            /// END key.
-            /// </field>
-            end: 35,
-
-            /// <field locid="WinJS.Utilities.Key.home" helpKeyword="WinJS.Utilities.Key.home">
-            /// HOME key.
-            /// </field>
-            home: 36,
-
-            /// <field locid="WinJS.Utilities.Key.leftArrow" helpKeyword="WinJS.Utilities.Key.leftArrow">
-            /// Left arrow key.
-            /// </field>
-            leftArrow: 37,
-
-            /// <field locid="WinJS.Utilities.Key.upArrow" helpKeyword="WinJS.Utilities.Key.upArrow">
-            /// Up arrow key.
-            /// </field>
-            upArrow: 38,
-
-            /// <field locid="WinJS.Utilities.Key.rightArrow" helpKeyword="WinJS.Utilities.Key.rightArrow">
-            /// Right arrow key.
-            /// </field>
-            rightArrow: 39,
-
-            /// <field locid="WinJS.Utilities.Key.downArrow" helpKeyword="WinJS.Utilities.Key.downArrow">
-            /// Down arrow key.
-            /// </field>
-            downArrow: 40,
-
-            /// <field locid="WinJS.Utilities.Key.insert" helpKeyword="WinJS.Utilities.Key.insert">
-            /// INSERT key.
-            /// </field>
-            insert: 45,
-
-            /// <field locid="WinJS.Utilities.Key.deleteKey" helpKeyword="WinJS.Utilities.Key.deleteKey">
-            /// DELETE key.
-            /// </field>
-            deleteKey: 46,
-
-            /// <field locid="WinJS.Utilities.Key.num0" helpKeyword="WinJS.Utilities.Key.num0">
-            /// Number 0 key.
-            /// </field>
-            num0: 48,
-
-            /// <field locid="WinJS.Utilities.Key.num1" helpKeyword="WinJS.Utilities.Key.num1">
-            /// Number 1 key.
-            /// </field>
-            num1: 49,
-
-            /// <field locid="WinJS.Utilities.Key.num2" helpKeyword="WinJS.Utilities.Key.num2">
-            /// Number 2 key.
-            /// </field>
-            num2: 50,
-
-            /// <field locid="WinJS.Utilities.Key.num3" helpKeyword="WinJS.Utilities.Key.num3">
-            /// Number 3 key.
-            /// </field>
-            num3: 51,
-
-            /// <field locid="WinJS.Utilities.Key.num4" helpKeyword="WinJS.Utilities.Key.num4">
-            /// Number 4 key.
-            /// </field>
-            num4: 52,
-
-            /// <field locid="WinJS.Utilities.Key.num5" helpKeyword="WinJS.Utilities.Key.num5">
-            /// Number 5 key.
-            /// </field>
-            num5: 53,
-
-            /// <field locid="WinJS.Utilities.Key.num6" helpKeyword="WinJS.Utilities.Key.num6">
-            /// Number 6 key.
-            /// </field>
-            num6: 54,
-
-            /// <field locid="WinJS.Utilities.Key.num7" helpKeyword="WinJS.Utilities.Key.num7">
-            /// Number 7 key.
-            /// </field>
-            num7: 55,
-
-            /// <field locid="WinJS.Utilities.Key.num8" helpKeyword="WinJS.Utilities.Key.num8">
-            /// Number 8 key.
-            /// </field>
-            num8: 56,
-
-            /// <field locid="WinJS.Utilities.Key.num9" helpKeyword="WinJS.Utilities.Key.num9">
-            /// Number 9 key.
-            /// </field>
-            num9: 57,
-
-            /// <field locid="WinJS.Utilities.Key.a" helpKeyword="WinJS.Utilities.Key.a">
-            /// A key.
-            /// </field>
-            a: 65,
-
-            /// <field locid="WinJS.Utilities.Key.b" helpKeyword="WinJS.Utilities.Key.b">
-            /// B key.
-            /// </field>
-            b: 66,
-
-            /// <field locid="WinJS.Utilities.Key.c" helpKeyword="WinJS.Utilities.Key.c">
-            /// C key.
-            /// </field>
-            c: 67,
-
-            /// <field locid="WinJS.Utilities.Key.d" helpKeyword="WinJS.Utilities.Key.d">
-            /// D key.
-            /// </field>
-            d: 68,
-
-            /// <field locid="WinJS.Utilities.Key.e" helpKeyword="WinJS.Utilities.Key.e">
-            /// E key.
-            /// </field>
-            e: 69,
-
-            /// <field locid="WinJS.Utilities.Key.f" helpKeyword="WinJS.Utilities.Key.f">
-            /// F key.
-            /// </field>
-            f: 70,
-
-            /// <field locid="WinJS.Utilities.Key.g" helpKeyword="WinJS.Utilities.Key.g">
-            /// G key.
-            /// </field>
-            g: 71,
-
-            /// <field locid="WinJS.Utilities.Key.h" helpKeyword="WinJS.Utilities.Key.h">
-            /// H key.
-            /// </field>
-            h: 72,
-
-            /// <field locid="WinJS.Utilities.Key.i" helpKeyword="WinJS.Utilities.Key.i">
-            /// I key.
-            /// </field>
-            i: 73,
-
-            /// <field locid="WinJS.Utilities.Key.j" helpKeyword="WinJS.Utilities.Key.j">
-            /// J key.
-            /// </field>
-            j: 74,
-
-            /// <field locid="WinJS.Utilities.Key.k" helpKeyword="WinJS.Utilities.Key.k">
-            /// K key.
-            /// </field>
-            k: 75,
-
-            /// <field locid="WinJS.Utilities.Key.l" helpKeyword="WinJS.Utilities.Key.l">
-            /// L key.
-            /// </field>
-            l: 76,
-
-            /// <field locid="WinJS.Utilities.Key.m" helpKeyword="WinJS.Utilities.Key.m">
-            /// M key.
-            /// </field>
-            m: 77,
-
-            /// <field locid="WinJS.Utilities.Key.n" helpKeyword="WinJS.Utilities.Key.n">
-            /// N key.
-            /// </field>
-            n: 78,
-
-            /// <field locid="WinJS.Utilities.Key.o" helpKeyword="WinJS.Utilities.Key.o">
-            /// O key.
-            /// </field>
-            o: 79,
-
-            /// <field locid="WinJS.Utilities.Key.p" helpKeyword="WinJS.Utilities.Key.p">
-            /// P key.
-            /// </field>
-            p: 80,
-
-            /// <field locid="WinJS.Utilities.Key.q" helpKeyword="WinJS.Utilities.Key.q">
-            /// Q key.
-            /// </field>
-            q: 81,
-
-            /// <field locid="WinJS.Utilities.Key.r" helpKeyword="WinJS.Utilities.Key.r">
-            /// R key.
-            /// </field>
-            r: 82,
-
-            /// <field locid="WinJS.Utilities.Key.s" helpKeyword="WinJS.Utilities.Key.s">
-            /// S key.
-            /// </field>
-            s: 83,
-
-            /// <field locid="WinJS.Utilities.Key.t" helpKeyword="WinJS.Utilities.Key.t">
-            /// T key.
-            /// </field>
-            t: 84,
-
-            /// <field locid="WinJS.Utilities.Key.u" helpKeyword="WinJS.Utilities.Key.u">
-            /// U key.
-            /// </field>
-            u: 85,
-
-            /// <field locid="WinJS.Utilities.Key.v" helpKeyword="WinJS.Utilities.Key.v">
-            /// V key.
-            /// </field>
-            v: 86,
-
-            /// <field locid="WinJS.Utilities.Key.w" helpKeyword="WinJS.Utilities.Key.w">
-            /// W key.
-            /// </field>
-            w: 87,
-
-            /// <field locid="WinJS.Utilities.Key.x" helpKeyword="WinJS.Utilities.Key.x">
-            /// X key.
-            /// </field>
-            x: 88,
-
-            /// <field locid="WinJS.Utilities.Key.y" helpKeyword="WinJS.Utilities.Key.y">
-            /// Y key.
-            /// </field>
-            y: 89,
-
-            /// <field locid="WinJS.Utilities.Key.z" helpKeyword="WinJS.Utilities.Key.z">
-            /// Z key.
-            /// </field>
-            z: 90,
-
-            /// <field locid="WinJS.Utilities.Key.leftWindows" helpKeyword="WinJS.Utilities.Key.leftWindows">
-            /// Left Windows key.
-            /// </field>
-            leftWindows: 91,
-
-            /// <field locid="WinJS.Utilities.Key.rightWindows" helpKeyword="WinJS.Utilities.Key.rightWindows">
-            /// Right Windows key.
-            /// </field>
-            rightWindows: 92,
-
-            /// <field locid="WinJS.Utilities.Key.menu" helpKeyword="WinJS.Utilities.Key.menu">
-            /// Menu key.
-            /// </field>
-            menu: 93,
-
-            /// <field locid="WinJS.Utilities.Key.numPad0" helpKeyword="WinJS.Utilities.Key.numPad0">
-            /// Number pad 0 key.
-            /// </field>
-            numPad0: 96,
-
-            /// <field locid="WinJS.Utilities.Key.numPad1" helpKeyword="WinJS.Utilities.Key.numPad1">
-            /// Number pad 1 key.
-            /// </field>
-            numPad1: 97,
-
-            /// <field locid="WinJS.Utilities.Key.numPad2" helpKeyword="WinJS.Utilities.Key.numPad2">
-            /// Number pad 2 key.
-            /// </field>
-            numPad2: 98,
-
-            /// <field locid="WinJS.Utilities.Key.numPad3" helpKeyword="WinJS.Utilities.Key.numPad3">
-            /// Number pad 3 key.
-            /// </field>
-            numPad3: 99,
-
-            /// <field locid="WinJS.Utilities.Key.numPad4" helpKeyword="WinJS.Utilities.Key.numPad4">
-            /// Number pad 4 key.
-            /// </field>
-            numPad4: 100,
-
-            /// <field locid="WinJS.Utilities.Key.numPad5" helpKeyword="WinJS.Utilities.Key.numPad5">
-            /// Number pad 5 key.
-            /// </field>
-            numPad5: 101,
-
-            /// <field locid="WinJS.Utilities.Key.numPad6" helpKeyword="WinJS.Utilities.Key.numPad6">
-            /// Number pad 6 key.
-            /// </field>
-            numPad6: 102,
-
-            /// <field locid="WinJS.Utilities.Key.numPad7" helpKeyword="WinJS.Utilities.Key.numPad7">
-            /// Number pad 7 key.
-            /// </field>
-            numPad7: 103,
-
-            /// <field locid="WinJS.Utilities.Key.numPad8" helpKeyword="WinJS.Utilities.Key.numPad8">
-            /// Number pad 8 key.
-            /// </field>
-            numPad8: 104,
-
-            /// <field locid="WinJS.Utilities.Key.numPad9" helpKeyword="WinJS.Utilities.Key.numPad9">
-            /// Number pad 9 key.
-            /// </field>
-            numPad9: 105,
-
-            /// <field locid="WinJS.Utilities.Key.multiply" helpKeyword="WinJS.Utilities.Key.multiply">
-            /// Multiplication key.
-            /// </field>
-            multiply: 106,
-
-            /// <field locid="WinJS.Utilities.Key.add" helpKeyword="WinJS.Utilities.Key.add">
-            /// Addition key.
-            /// </field>
-            add: 107,
-
-            /// <field locid="WinJS.Utilities.Key.subtract" helpKeyword="WinJS.Utilities.Key.subtract">
-            /// Subtraction key.
-            /// </field>
-            subtract: 109,
-
-            /// <field locid="WinJS.Utilities.Key.decimalPoint" helpKeyword="WinJS.Utilities.Key.decimalPoint">
-            /// Decimal point key.
-            /// </field>
-            decimalPoint: 110,
-
-            /// <field locid="WinJS.Utilities.Key.divide" helpKeyword="WinJS.Utilities.Key.divide">
-            /// Division key.
-            /// </field>
-            divide: 111,
-
-            /// <field locid="WinJS.Utilities.Key.F1" helpKeyword="WinJS.Utilities.Key.F1">
-            /// F1 key.
-            /// </field>
-            F1: 112,
-
-            /// <field locid="WinJS.Utilities.Key.F2" helpKeyword="WinJS.Utilities.Key.F2">
-            /// F2 key.
-            /// </field>
-            F2: 113,
-
-            /// <field locid="WinJS.Utilities.Key.F3" helpKeyword="WinJS.Utilities.Key.F3">
-            /// F3 key.
-            /// </field>
-            F3: 114,
-
-            /// <field locid="WinJS.Utilities.Key.F4" helpKeyword="WinJS.Utilities.Key.F4">
-            /// F4 key.
-            /// </field>
-            F4: 115,
-
-            /// <field locid="WinJS.Utilities.Key.F5" helpKeyword="WinJS.Utilities.Key.F5">
-            /// F5 key.
-            /// </field>
-            F5: 116,
-
-            /// <field locid="WinJS.Utilities.Key.F6" helpKeyword="WinJS.Utilities.Key.F6">
-            /// F6 key.
-            /// </field>
-            F6: 117,
-
-            /// <field locid="WinJS.Utilities.Key.F7" helpKeyword="WinJS.Utilities.Key.F7">
-            /// F7 key.
-            /// </field>
-            F7: 118,
-
-            /// <field locid="WinJS.Utilities.Key.F8" helpKeyword="WinJS.Utilities.Key.F8">
-            /// F8 key.
-            /// </field>
-            F8: 119,
-
-            /// <field locid="WinJS.Utilities.Key.F9" helpKeyword="WinJS.Utilities.Key.F9">
-            /// F9 key.
-            /// </field>
-            F9: 120,
-
-            /// <field locid="WinJS.Utilities.Key.F10" helpKeyword="WinJS.Utilities.Key.F10">
-            /// F10 key.
-            /// </field>
-            F10: 121,
-
-            /// <field locid="WinJS.Utilities.Key.F11" helpKeyword="WinJS.Utilities.Key.F11">
-            /// F11 key.
-            /// </field>
-            F11: 122,
-
-            /// <field locid="WinJS.Utilities.Key.F12" helpKeyword="WinJS.Utilities.Key.F12">
-            /// F12 key.
-            /// </field>
-            F12: 123,
-
-            /// <field locid="WinJS.Utilities.Key.NavigationView" helpKeyword="WinJS.Utilities.Key.NavigationView">
-            /// XBox One Remote NavigationView key.
-            /// </field>
-            NavigationView: 136,
-
-            /// <field locid="WinJS.Utilities.Key.NavigationMenu" helpKeyword="WinJS.Utilities.Key.NavigationMenu">
-            /// XBox One Remote NavigationMenu key.
-            /// </field>
-            NavigationMenu: 137,
-
-            /// <field locid="WinJS.Utilities.Key.NavigationUp" helpKeyword="WinJS.Utilities.Key.NavigationUp">
-            /// XBox One Remote NavigationUp key.
-            /// </field>
-            NavigationUp: 138,
-
-            /// <field locid="WinJS.Utilities.Key.NavigationDown" helpKeyword="WinJS.Utilities.Key.NavigationDown">
-            /// XBox One Remote NavigationDown key.
-            /// </field>
-            NavigationDown: 139,
-
-            /// <field locid="WinJS.Utilities.Key.NavigationLeft" helpKeyword="WinJS.Utilities.Key.NavigationLeft">
-            /// XBox One Remote NavigationLeft key.
-            /// </field>
-            NavigationLeft: 140,
-
-            /// <field locid="WinJS.Utilities.Key.NavigationRight" helpKeyword="WinJS.Utilities.Key.NavigationRight">
-            /// XBox One Remote NavigationRight key.
-            /// </field>
-            NavigationRight: 141,
-
-            /// <field locid="WinJS.Utilities.Key.NavigationAccept" helpKeyword="WinJS.Utilities.Key.NavigationAccept">
-            /// XBox One Remote NavigationAccept key.
-            /// </field>
-            NavigationAccept: 142,
-
-            /// <field locid="WinJS.Utilities.Key.NavigationCancel" helpKeyword="WinJS.Utilities.Key.NavigationCancel">
-            /// XBox One Remote NavigationCancel key.
-            /// </field>
-            NavigationCancel: 143,
-
-            /// <field locid="WinJS.Utilities.Key.numLock" helpKeyword="WinJS.Utilities.Key.numLock">
-            /// NUMBER LOCK key.
-            /// </field>
-            numLock: 144,
-
-            /// <field locid="WinJS.Utilities.Key.scrollLock" helpKeyword="WinJS.Utilities.Key.scrollLock">
-            /// SCROLL LOCK key.
-            /// </field>
-            scrollLock: 145,
-
-            /// <field locid="WinJS.Utilities.Key.browserBack" helpKeyword="WinJS.Utilities.Key.browserBack">
-            /// Browser back key.
-            /// </field>
-            browserBack: 166,
-
-            /// <field locid="WinJS.Utilities.Key.browserForward" helpKeyword="WinJS.Utilities.Key.browserForward">
-            /// Browser forward key.
-            /// </field>
-            browserForward: 167,
-
-            /// <field locid="WinJS.Utilities.Key.semicolon" helpKeyword="WinJS.Utilities.Key.semicolon">
-            /// SEMICOLON key.
-            /// </field>
-            semicolon: 186,
-
-            /// <field locid="WinJS.Utilities.Key.equal" helpKeyword="WinJS.Utilities.Key.equal">
-            /// EQUAL key.
-            /// </field>
-            equal: 187,
-
-            /// <field locid="WinJS.Utilities.Key.comma" helpKeyword="WinJS.Utilities.Key.comma">
-            /// COMMA key.
-            /// </field>
-            comma: 188,
-
-            /// <field locid="WinJS.Utilities.Key.dash" helpKeyword="WinJS.Utilities.Key.dash">
-            /// DASH key.
-            /// </field>
-            dash: 189,
-
-            /// <field locid="WinJS.Utilities.Key.period" helpKeyword="WinJS.Utilities.Key.period">
-            /// PERIOD key.
-            /// </field>
-            period: 190,
-
-            /// <field locid="WinJS.Utilities.Key.forwardSlash" helpKeyword="WinJS.Utilities.Key.forwardSlash">
-            /// FORWARD SLASH key.
-            /// </field>
-            forwardSlash: 191,
-
-            /// <field locid="WinJS.Utilities.Key.graveAccent" helpKeyword="WinJS.Utilities.Key.graveAccent">
-            /// Accent grave key.
-            /// </field>
-            graveAccent: 192,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadA" helpKeyword="WinJS.Utilities.Key.GamepadA">
-            /// XBox One GamepadA key.
-            /// </field>
-            GamepadA: 195,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadB" helpKeyword="WinJS.Utilities.Key.GamepadB">
-            /// XBox One GamepadB key.
-            /// </field>
-            GamepadB: 196,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadX" helpKeyword="WinJS.Utilities.Key.GamepadX">
-            /// XBox One GamepadX key.
-            /// </field>
-            GamepadX: 197,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadY" helpKeyword="WinJS.Utilities.Key.GamepadY">
-            /// XBox One GamepadY key.
-            /// </field>
-            GamepadY: 198,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadRightShoulder" helpKeyword="WinJS.Utilities.Key.GamepadRightShoulder">
-            /// XBox One GamepadRightShoulder key.
-            /// </field>
-            GamepadRightShoulder: 199,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadLeftShoulder" helpKeyword="WinJS.Utilities.Key.GamepadLeftShoulder">
-            /// XBox One GamepadLeftShoulder key.
-            /// </field>
-            GamepadLeftShoulder: 200,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadLeftTrigger" helpKeyword="WinJS.Utilities.Key.GamepadLeftTrigger">
-            /// XBox One GamepadLeftTrigger key.
-            /// </field>
-            GamepadLeftTrigger: 201,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadRightTrigger" helpKeyword="WinJS.Utilities.Key.GamepadRightTrigger">
-            /// XBox One GamepadRightTrigger key.
-            /// </field>
-            GamepadRightTrigger: 202,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadDPadUp" helpKeyword="WinJS.Utilities.Key.GamepadDPadUp">
-            /// XBox One GamepadDPadUp key.
-            /// </field>
-            GamepadDPadUp: 203,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadDPadDown" helpKeyword="WinJS.Utilities.Key.GamepadDPadDown">
-            /// XBox One GamepadDPadDown key.
-            /// </field>
-            GamepadDPadDown: 204,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadDPadLeft" helpKeyword="WinJS.Utilities.Key.GamepadDPadLeft">
-            /// XBox One GamepadDPadLeft key.
-            /// </field>
-            GamepadDPadLeft: 205,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadDPadRight" helpKeyword="WinJS.Utilities.Key.GamepadDPadRight">
-            /// XBox One GamepadDPadRight key.
-            /// </field>
-            GamepadDPadRight: 206,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadMenu" helpKeyword="WinJS.Utilities.Key.GamepadMenu">
-            /// XBox One GamepadMenu key.
-            /// </field>
-            GamepadMenu: 207,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadView" helpKeyword="WinJS.Utilities.Key.GamepadView">
-            /// XBox One GamepadView key.
-            /// </field>
-            GamepadView: 208,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadLeftThumbstick" helpKeyword="WinJS.Utilities.Key.GamepadLeftThumbstick">
-            /// XBox One GamepadLeftThumbstick key.
-            /// </field>
-            GamepadLeftThumbstick: 209,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadRightThumbstick" helpKeyword="WinJS.Utilities.Key.GamepadRightThumbstick">
-            /// XBox One GamepadRightThumbstick key.
-            /// </field>
-            GamepadRightThumbstick: 210,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadLeftThumbstickUp" helpKeyword="WinJS.Utilities.Key.GamepadLeftThumbstickUp">
-            /// XBox One GamepadLeftThumbstickUp key.
-            /// </field>
-            GamepadLeftThumbstickUp: 211,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadLeftThumbstickDown" helpKeyword="WinJS.Utilities.Key.GamepadLeftThumbstickDown">
-            /// XBox One GamepadLeftThumbstickDown key.
-            /// </field>
-            GamepadLeftThumbstickDown: 212,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadLeftThumbstickRight" helpKeyword="WinJS.Utilities.Key.GamepadLeftThumbstickRight">
-            /// XBox One GamepadLeftThumbstickRight key.
-            /// </field>
-            GamepadLeftThumbstickRight: 213,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadLeftThumbstickLeft" helpKeyword="WinJS.Utilities.Key.GamepadLeftThumbstickLeft">
-            /// XBox One GamepadLeftThumbstickLeft key.
-            /// </field>
-            GamepadLeftThumbstickLeft: 214,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadRightThumbstickUp" helpKeyword="WinJS.Utilities.Key.GamepadRightThumbstickUp">
-            /// XBox One GamepadRightThumbstickUp key.
-            /// </field>
-            GamepadRightThumbstickUp: 215,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadRightThumbstickDown" helpKeyword="WinJS.Utilities.Key.GamepadRightThumbstickDown">
-            /// XBox One GamepadRightThumbstickDown key.
-            /// </field>
-            GamepadRightThumbstickDown: 216,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadRightThumbstickRight" helpKeyword="WinJS.Utilities.Key.GamepadRightThumbstickRight">
-            /// XBox One GamepadRightThumbstickRight key.
-            /// </field>
-            GamepadRightThumbstickRight: 217,
-
-            /// <field locid="WinJS.Utilities.Key.GamepadRightThumbstickLeft" helpKeyword="WinJS.Utilities.Key.GamepadRightThumbstickLeft">
-            /// XBox One GamepadRightThumbstickLeft key.
-            /// </field>
-            GamepadRightThumbstickLeft: 218,
-
-            /// <field locid="WinJS.Utilities.Key.openBracket" helpKeyword="WinJS.Utilities.Key.openBracket">
-            /// OPEN BRACKET key.
-            /// </field>
-            openBracket: 219,
-
-            /// <field locid="WinJS.Utilities.Key.backSlash" helpKeyword="WinJS.Utilities.Key.backSlash">
-            /// BACKSLASH key.
-            /// </field>
-            backSlash: 220,
-
-            /// <field locid="WinJS.Utilities.Key.closeBracket" helpKeyword="WinJS.Utilities.Key.closeBracket">
-            /// CLOSE BRACKET key.
-            /// </field>
-            closeBracket: 221,
-
-            /// <field locid="WinJS.Utilities.Key.singleQuote" helpKeyword="WinJS.Utilities.Key.singleQuote">
-            /// SINGLE QUOTE key.
-            /// </field>
-            singleQuote: 222,
-
-            /// <field locid="WinJS.Utilities.Key.IME" helpKeyword="WinJS.Utilities.Key.IME">
-            /// Any IME input.
-            /// </field>
-            IME: 229
-        },
-
-        data: function (element) {
-            /// <signature helpKeyword="WinJS.Utilities.data">
-            /// <summary locid="WinJS.Utilities.data">
-            /// Gets the data value associated with the specified element.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.data_p:element">
-            /// The element.
-            /// </param>
-            /// <returns type="Object" locid="WinJS.Utilities.data_returnValue">
-            /// The value associated with the element.
-            /// </returns>
-            /// </signature>
-            if (!element[_dataKey]) {
-                element[_dataKey] = {};
-            }
-            return element[_dataKey];
-        },
-
-        hasClass: function (e, name) {
-            /// <signature helpKeyword="WinJS.Utilities.hasClass">
-            /// <summary locid="WinJS.Utilities.hasClass">
-            /// Determines whether the specified element has the specified class.
-            /// </summary>
-            /// <param name="e" type="HTMLElement" locid="WinJS.Utilities.hasClass_p:e">
-            /// The element.
-            /// </param>
-            /// <param name="name" type="String" locid="WinJS.Utilities.hasClass_p:name">
-            /// The name of the class.
-            /// </param>
-            /// <returns type="Boolean" locid="WinJS.Utilities.hasClass_returnValue">
-            /// true if the specified element contains the specified class; otherwise, false.
-            /// </returns>
-            /// </signature>
-
-            if (e.classList) {
-                return e.classList.contains(name);
-            } else {
-                var className = getClassName(e);
-                var names = className.trim().split(" ");
-                var l = names.length;
-                for (var i = 0; i < l; i++) {
-                    if (names[i] === name) {
-                        return true;
-                    }
-                }
-                return false;
-            }
-        },
-
-        addClass: addClass,
-
-        removeClass: removeClass,
-
-        toggleClass: toggleClass,
-
-        _setAttribute: setAttribute,
-
-        getRelativeLeft: function (element, parent) {
-            /// <signature helpKeyword="WinJS.Utilities.getRelativeLeft">
-            /// <summary locid="WinJS.Utilities.getRelativeLeft">
-            /// Gets the left coordinate of the specified element relative to the specified parent.
-            /// </summary>
-            /// <param name="element" domElement="true" locid="WinJS.Utilities.getRelativeLeft_p:element">
-            /// The element.
-            /// </param>
-            /// <param name="parent" domElement="true" locid="WinJS.Utilities.getRelativeLeft_p:parent">
-            /// The parent element.
-            /// </param>
-            /// <returns type="Number" locid="WinJS.Utilities.getRelativeLeft_returnValue">
-            /// The relative left coordinate.
-            /// </returns>
-            /// </signature>
-            if (!element) {
-                return 0;
-            }
-
-            var elementPosition = exports._getPositionRelativeTo(element, null);
-            var parentPosition = exports._getPositionRelativeTo(parent, null);
-            return elementPosition.left - parentPosition.left;
-        },
-
-        getRelativeTop: function (element, parent) {
-            /// <signature helpKeyword="WinJS.Utilities.getRelativeTop">
-            /// <summary locid="WinJS.Utilities.getRelativeTop">
-            /// Gets the top coordinate of the element relative to the specified parent.
-            /// </summary>
-            /// <param name="element" domElement="true" locid="WinJS.Utilities.getRelativeTop_p:element">
-            /// The element.
-            /// </param>
-            /// <param name="parent" domElement="true" locid="WinJS.Utilities.getRelativeTop_p:parent">
-            /// The parent element.
-            /// </param>
-            /// <returns type="Number" locid="WinJS.Utilities.getRelativeTop_returnValue">
-            /// The relative top coordinate.
-            /// </returns>
-            /// </signature>
-            if (!element) {
-                return 0;
-            }
-
-            var elementPosition = exports._getPositionRelativeTo(element, null);
-            var parentPosition = exports._getPositionRelativeTo(parent, null);
-            return elementPosition.top - parentPosition.top;
-        },
-
-        getScrollPosition: getScrollPosition,
-
-        setScrollPosition: setScrollPosition,
-
-        empty: function (element) {
-            /// <signature helpKeyword="WinJS.Utilities.empty">
-            /// <summary locid="WinJS.Utilities.empty">
-            /// Removes all the child nodes from the specified element.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.Utilities.empty_p:element">
-            /// The element.
-            /// </param>
-            /// <returns type="HTMLElement" locid="WinJS.Utilities.empty_returnValue">
-            /// The element.
-            /// </returns>
-            /// </signature>
-            if (element.childNodes && element.childNodes.length > 0) {
-                for (var i = element.childNodes.length - 1; i >= 0; i--) {
-                    element.removeChild(element.childNodes.item(i));
-                }
-            }
-            return element;
-        },
-
-        _isDOMElement: function (element) {
-            return element &&
-                typeof element === "object" &&
-                typeof element.tagName === "string";
-        },
-
-        getContentWidth: function (element) {
-            /// <signature helpKeyword="WinJS.Utilities.getContentWidth">
-            /// <summary locid="WinJS.Utilities.getContentWidth">
-            /// Gets the width of the content of the specified element. The content width does not include borders or padding.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.getContentWidth_p:element">
-            /// The element.
-            /// </param>
-            /// <returns type="Number" locid="WinJS.Utilities.getContentWidth_returnValue">
-            /// The content width of the element.
-            /// </returns>
-            /// </signature>
-            var border = getDimension(element, "borderLeftWidth") + getDimension(element, "borderRightWidth"),
-                padding = getDimension(element, "paddingLeft") + getDimension(element, "paddingRight");
-            return element.offsetWidth - border - padding;
-        },
-        _getPreciseContentWidth: function (element) {
-            var border = _getPreciseDimension(element, "borderLeftWidth") + _getPreciseDimension(element, "borderRightWidth"),
-                padding = _getPreciseDimension(element, "paddingLeft") + _getPreciseDimension(element, "paddingRight");
-            return element.offsetWidth - border - padding;
-        },
-
-        getTotalWidth: function (element) {
-            /// <signature helpKeyword="WinJS.Utilities.getTotalWidth">
-            /// <summary locid="WinJS.Utilities.getTotalWidth">
-            /// Gets the width of the element, including margins.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.getTotalWidth_p:element">
-            /// The element.
-            /// </param>
-            /// <returns type="Number" locid="WinJS.Utilities.getTotalWidth_returnValue">
-            /// The width of the element including margins.
-            /// </returns>
-            /// </signature>
-            var margin = getDimension(element, "marginLeft") + getDimension(element, "marginRight");
-            return element.offsetWidth + margin;
-        },
-        _getPreciseTotalWidth: function (element) {
-            var margin = _getPreciseDimension(element, "marginLeft") + _getPreciseDimension(element, "marginRight");
-            return element.offsetWidth + margin;
-        },
-
-        getContentHeight: function (element) {
-            /// <signature helpKeyword="WinJS.Utilities.getContentHeight">
-            /// <summary locid="WinJS.Utilities.getContentHeight">
-            /// Gets the height of the content of the specified element. The content height does not include borders or padding.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.getContentHeight_p:element">
-            /// The element.
-            /// </param>
-            /// <returns type="Number" integer="true" locid="WinJS.Utilities.getContentHeight_returnValue">
-            /// The content height of the element.
-            /// </returns>
-            /// </signature>
-            var border = getDimension(element, "borderTopWidth") + getDimension(element, "borderBottomWidth"),
-                padding = getDimension(element, "paddingTop") + getDimension(element, "paddingBottom");
-            return element.offsetHeight - border - padding;
-        },
-        _getPreciseContentHeight: function (element) {
-            var border = _getPreciseDimension(element, "borderTopWidth") + _getPreciseDimension(element, "borderBottomWidth"),
-                padding = _getPreciseDimension(element, "paddingTop") + _getPreciseDimension(element, "paddingBottom");
-            return element.offsetHeight - border - padding;
-        },
-
-        getTotalHeight: function (element) {
-            /// <signature helpKeyword="WinJS.Utilities.getTotalHeight">
-            /// <summary locid="WinJS.Utilities.getTotalHeight">
-            /// Gets the height of the element, including its margins.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.getTotalHeight_p:element">
-            /// The element.
-            /// </param>
-            /// <returns type="Number" locid="WinJS.Utilities.getTotalHeight_returnValue">
-            /// The height of the element including margins.
-            /// </returns>
-            /// </signature>
-            var margin = getDimension(element, "marginTop") + getDimension(element, "marginBottom");
-            return element.offsetHeight + margin;
-        },
-        _getPreciseTotalHeight: function (element) {
-            var margin = _getPreciseDimension(element, "marginTop") + _getPreciseDimension(element, "marginBottom");
-            return element.offsetHeight + margin;
-        },
-
-        getPosition: function (element) {
-            /// <signature helpKeyword="WinJS.Utilities.getPosition">
-            /// <summary locid="WinJS.Utilities.getPosition">
-            /// Gets the position of the specified element.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.getPosition_p:element">
-            /// The element.
-            /// </param>
-            /// <returns type="Object" locid="WinJS.Utilities.getPosition_returnValue">
-            /// An object that contains the left, top, width and height properties of the element.
-            /// </returns>
-            /// </signature>
-            return exports._getPositionRelativeTo(element, null);
-        },
-
-        getTabIndex: function (element) {
-            /// <signature helpKeyword="WinJS.Utilities.getTabIndex">
-            /// <summary locid="WinJS.Utilities.getTabIndex">
-            /// Gets the tabIndex of the specified element.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.getTabIndex_p:element">
-            /// The element.
-            /// </param>
-            /// <returns type="Number" locid="WinJS.Utilities.getTabIndex_returnValue">
-            /// The tabIndex of the element. Returns -1 if the element cannot be tabbed to
-            /// </returns>
-            /// </signature>
-            // For reference: http://www.w3.org/html/wg/drafts/html/master/single-page.html#specially-focusable
-            var tabbableElementsRE = /BUTTON|COMMAND|MENUITEM|OBJECT|SELECT|TEXTAREA/;
-            if (element.disabled) {
-                return -1;
-            }
-            var tabIndex = element.getAttribute("tabindex");
-            if (tabIndex === null || tabIndex === undefined) {
-                var name = element.tagName;
-                if (tabbableElementsRE.test(name) ||
-                    (element.href && (name === "A" || name === "AREA" || name === "LINK")) ||
-                    (name === "INPUT" && element.type !== "hidden") ||
-                    (name === "TH" && element.sorted)) {
-                    return 0;
-                }
-                return -1;
-            }
-            return parseInt(tabIndex, 10);
-        },
-
-        convertToPixels: convertToPixels,
-        _convertToPrecisePixels: _convertToPrecisePixels,
-        _getPreciseMargins: _getPreciseMargins,
-
-
-        eventWithinElement: function (element, event) {
-            /// <signature helpKeyword="WinJS.Utilities.eventWithinElement">
-            /// <summary locid="WinJS.Utilities.eventWithinElement">
-            /// Determines whether the specified event occurred within the specified element.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.eventWithinElement_p:element">
-            /// The element.
-            /// </param>
-            /// <param name="event" type="Event" locid="WinJS.Utilities.eventWithinElement_p:event">
-            /// The event.
-            /// </param>
-            /// <returns type="Boolean" locid="WinJS.Utilities.eventWithinElement_returnValue">
-            /// true if the event occurred within the element; otherwise, false.
-            /// </returns>
-            /// </signature>
-            var related = event.relatedTarget;
-            if (related && related !== element) {
-                return element.contains(related);
-            }
-
-            return false;
-        },
-
-        //UI Utilities
-        _deprecated: function (message) {
-            _Global.console && _Global.console.warn(message);
-        },
-
-        // Take a renderer which may be a function (signature: (data) => element) or a WinJS.Binding.Template
-        //  and return a function with a unified synchronous contract which is:
-        //
-        //  (data, container) => element
-        //
-        // Where:
-        //
-        //  1) if you pass container the content will be rendered into the container and the
-        //     container will be returned.
-        //
-        //  2) if you don't pass a container the content will be rendered and returned.
-        //
-        _syncRenderer: function (renderer, tagName) {
-            tagName = tagName || "div";
-            if (typeof renderer === "function") {
-                return function (data, container) {
-                    if (container) {
-                        container.appendChild(renderer(data));
-                        return container;
-                    } else {
-                        return renderer(data);
-                    }
-                };
-            }
-
-            var template;
-            if (typeof renderer.render === "function") {
-                template = renderer;
-            } else if (renderer.winControl && typeof renderer.winControl.render === "function") {
-                template = renderer.winControl;
-            }
-
-            return function (data, container) {
-                var host = container || _Global.document.createElement(tagName);
-                template.render(data, host);
-                if (container) {
-                    return container;
-                } else {
-                    // The expectation is that the creation of the DOM elements happens synchronously
-                    //  and as such we steal the first child and make it the root element.
-                    //
-                    var element = host.firstElementChild;
-
-                    // Because we have changed the "root" we may need to move the dispose method
-                    //  created by the template to the child and do a little switcheroo on dispose.
-                    //
-                    if (element && host.dispose) {
-                        var prev = element.dispose;
-                        element.dispose = function () {
-                            element.dispose = prev;
-                            host.appendChild(element);
-                            host.dispose();
-                        };
-                    }
-                    return element;
-                }
-            };
-        },
-
-        _getPositionRelativeTo: function Utilities_getPositionRelativeTo(element, ancestor) {
-            var fromElement = element,
-                offsetParent = element.offsetParent,
-                top = element.offsetTop,
-                left = element.offsetLeft;
-
-            while ((element = element.parentNode) &&
-                    element !== ancestor &&
-                    element !== _Global.document.body &&
-                    element !== _Global.document.documentElement) {
-                top -= element.scrollTop;
-                var dir = _getComputedStyle(element, null).direction;
-                left -= dir !== "rtl" ? element.scrollLeft : -getAdjustedScrollPosition(element).scrollLeft;
-
-                if (element === offsetParent) {
-                    top += element.offsetTop;
-                    left += element.offsetLeft;
-                    offsetParent = element.offsetParent;
-                }
-            }
-
-            return {
-                left: left,
-                top: top,
-                width: fromElement.offsetWidth,
-                height: fromElement.offsetHeight
-            };
-        },
-
-        // *element* is not included in the tabIndex search
-        _getHighAndLowTabIndices: function Utilities_getHighAndLowTabIndices(element) {
-            var descendants = element.getElementsByTagName("*");
-            var lowestTabIndex = 0;
-            var highestTabIndex = 0;
-            // tabIndex=0 is the highest (considered higher than positive tab indices) so
-            // we can stop searching for a higher tab index once we find tabIndex=0.
-            var foundTabIndex0 = false;
-            for (var i = 0, len = descendants.length; i < len; i++) {
-                var tabIndexStr = descendants[i].getAttribute("tabIndex");
-                if (tabIndexStr !== null && tabIndexStr !== undefined) {
-                    var tabIndex = parseInt(tabIndexStr, 10);
-                    // Update lowest
-                    if (tabIndex > 0 && (tabIndex < lowestTabIndex || lowestTabIndex === 0)) {
-                        lowestTabIndex = tabIndex;
-                    }
-                    // Update highest
-                    if (!foundTabIndex0) {
-                        if (tabIndex === 0) {
-                            foundTabIndex0 = true;
-                            highestTabIndex = 0;
-                        } else if (tabIndex > highestTabIndex) {
-                            highestTabIndex = tabIndex;
-                        }
-                    }
-                }
-            }
-
-            return {
-                highest: highestTabIndex,
-                lowest: lowestTabIndex
-            };
-        },
-
-        _getLowestTabIndexInList: function Utilities_getLowestTabIndexInList(elements) {
-            // Returns the lowest positive tabIndex in a list of elements.
-            // Returns 0 if there are no positive tabIndices.
-            var lowestTabIndex = 0;
-            var elmTabIndex;
-            for (var i = 0; i < elements.length; i++) {
-                elmTabIndex = parseInt(elements[i].getAttribute("tabIndex"), 10);
-                if ((0 < elmTabIndex)
-                 && ((elmTabIndex < lowestTabIndex) || !lowestTabIndex)) {
-                    lowestTabIndex = elmTabIndex;
-                }
-            }
-
-            return lowestTabIndex;
-        },
-
-        _getHighestTabIndexInList: function Utilities_getHighestTabIndexInList(elements) {
-            // Returns 0 if any element is explicitly set to 0. (0 is the highest tabIndex)
-            // Returns the highest tabIndex in the list of elements.
-            // Returns 0 if there are no positive tabIndices.
-            var highestTabIndex = 0;
-            var elmTabIndex;
-            for (var i = 0; i < elements.length; i++) {
-                elmTabIndex = parseInt(elements[i].getAttribute("tabIndex"), 10);
-                if (elmTabIndex === 0) {
-                    return elmTabIndex;
-                } else if (highestTabIndex < elmTabIndex) {
-                    highestTabIndex = elmTabIndex;
-                }
-            }
-
-            return highestTabIndex;
-        },
-
-        _hasCursorKeysBehaviors: function Utilities_hasCursorKeysBehaviors(element) {
-            if (element.tagName === "SELECT" ||
-                element.tagName === "TEXTAREA") {
-                return true;
-            }
-            if (element.tagName === "INPUT") {
-                return element.type === "" ||
-                    element.type === "date" ||
-                    element.type === "datetime" ||
-                    element.type === "datetime-local" ||
-                    element.type === "email" ||
-                    element.type === "month" ||
-                    element.type === "number" ||
-                    element.type === "password" ||
-                    element.type === "range" ||
-                    element.type === "search" ||
-                    element.type === "tel" ||
-                    element.type === "text" ||
-                    element.type === "time" ||
-                    element.type === "url" ||
-                    element.type === "week";
-            }
-            return false;
-        },
-
-        _reparentChildren: function (originalParent, destinationParent) {
-            var child = originalParent.firstChild;
-            while (child) {
-                var sibling = child.nextSibling;
-                destinationParent.appendChild(child);
-                child = sibling;
-            }
-        },
-
-        // Ensures that the same element has focus before and after *callback* is
-        // called. Useful if moving focus is an unintentional side effect of *callback*.
-        // For example, this could happen if *callback* removes and reinserts elements
-        // to the DOM.
-        _maintainFocus: function ElementUtilities_maintainFocus(callback) {
-            var focusedElement = _Global.document.activeElement;
-            callback();
-            exports._trySetActiveOnAnyElement(focusedElement);
-        },
-
-        // Tries to give focus to an element (even if its tabIndex is -1) via setActive.
-        _trySetActiveOnAnyElement: function Utilities_trySetActiveOnAnyElement(element, scroller) {
-            return exports._tryFocusOnAnyElement(element, true, scroller);
-        },
-
-        // Tries to give focus to an element (even if its tabIndex is -1).
-        _tryFocusOnAnyElement: function Utilities_tryFocusOnAnyElement(element, useSetActive, scroller) {
-            var previousActiveElement = _Global.document.activeElement;
-
-            if (element === previousActiveElement) {
-                return true;
-            }
-
-            if (useSetActive) {
-                exports._setActive(element, scroller);
-            } else {
-                element.focus();
-            }
-
-            return previousActiveElement !== _Global.document.activeElement;
-        },
-
-        // Tries to give focus to an element which is a tabstop (i.e. tabIndex >= 0)
-        // via setActive.
-        _trySetActive: function Utilities_trySetActive(elem, scroller) {
-            return this._tryFocus(elem, true, scroller);
-        },
-
-        // Tries to give focus to an element which is a tabstop (i.e. tabIndex >= 0).
-        _tryFocus: function Utilities_tryFocus(elem, useSetActive, scroller) {
-            var previousActiveElement = _Global.document.activeElement;
-
-            if (elem === previousActiveElement) {
-                return true;
-            }
-
-            var simpleLogicForValidTabStop = (exports.getTabIndex(elem) >= 0);
-            if (!simpleLogicForValidTabStop) {
-                return false;
-            }
-
-            if (useSetActive) {
-                exports._setActive(elem, scroller);
-            } else {
-                elem.focus();
-            }
-
-            if (previousActiveElement !== _Global.document.activeElement) {
-                return true;
-            }
-            return false;
-        },
-
-        _setActiveFirstFocusableElement: function Utilities_setActiveFirstFocusableElement(rootEl, scroller) {
-            return this._focusFirstFocusableElement(rootEl, true, scroller);
-        },
-
-        _focusFirstFocusableElement: function Utilities_focusFirstFocusableElement(rootEl, useSetActive, scroller) {
-            var _elms = rootEl.getElementsByTagName("*");
-
-            // Get the tabIndex set to the firstDiv (which is the lowest)
-            var _lowestTabIndex = this._getLowestTabIndexInList(_elms);
-            var _nextLowestTabIndex = 0;
-
-            // If there are positive tabIndices, set focus to the element with the lowest tabIndex.
-            // Keep trying with the next lowest tabIndex until all tabIndices have been exhausted.
-            // Otherwise set focus to the first focusable element in DOM order.
-            var i;
-            while (_lowestTabIndex) {
-                for (i = 0; i < _elms.length; i++) {
-                    if (_elms[i].tabIndex === _lowestTabIndex) {
-                        if (this._tryFocus(_elms[i], useSetActive, scroller)) {
-                            return true;
-                        }
-                    } else if ((_lowestTabIndex < _elms[i].tabIndex)
-                            && ((_elms[i].tabIndex < _nextLowestTabIndex) || (_nextLowestTabIndex === 0))) {
-                        // Here if _lowestTabIndex < _elms[i].tabIndex < _nextLowestTabIndex
-                        _nextLowestTabIndex = _elms[i].tabIndex;
-                    }
-                }
-
-                // We weren't able to set focus to anything at that tabIndex
-                // If we found a higher valid tabIndex, try that now
-                _lowestTabIndex = _nextLowestTabIndex;
-                _nextLowestTabIndex = 0;
-            }
-
-            // Wasn't able to set focus to anything with a positive tabIndex, try everything now.
-            // This is where things with tabIndex of 0 will be tried.
-            for (i = 0; i < _elms.length; i++) {
-                if (this._tryFocus(_elms[i], useSetActive, scroller)) {
-                    return true;
-                }
-            }
-
-            return false;
-        },
-
-        _setActiveLastFocusableElement: function Utilities_setActiveLastFocusableElement(rootEl, scroller) {
-            return this._focusLastFocusableElement(rootEl, true, scroller);
-        },
-
-        _focusLastFocusableElement: function Utilities_focusLastFocusableElement(rootEl, useSetActive, scroller) {
-            var _elms = rootEl.getElementsByTagName("*");
-            // Get the tabIndex set to the finalDiv (which is the highest)
-            var _highestTabIndex = this._getHighestTabIndexInList(_elms);
-            var _nextHighestTabIndex = 0;
-
-            // Try all tabIndex 0 first. After this conditional the _highestTabIndex
-            // should be equal to the highest positive tabIndex.
-            var i;
-            if (_highestTabIndex === 0) {
-                for (i = _elms.length - 1; i >= 0; i--) {
-                    if (_elms[i].tabIndex === _highestTabIndex) {
-                        if (this._tryFocus(_elms[i], useSetActive, scroller)) {
-                            return true;
-                        }
-                    } else if (_nextHighestTabIndex < _elms[i].tabIndex) {
-                        _nextHighestTabIndex = _elms[i].tabIndex;
-                    }
-                }
-
-                _highestTabIndex = _nextHighestTabIndex;
-                _nextHighestTabIndex = 0;
-            }
-
-            // If there are positive tabIndices, set focus to the element with the highest tabIndex.
-            // Keep trying with the next highest tabIndex until all tabIndices have been exhausted.
-            // Otherwise set focus to the last focusable element in DOM order.
-            while (_highestTabIndex) {
-                for (i = _elms.length - 1; i >= 0; i--) {
-                    if (_elms[i].tabIndex === _highestTabIndex) {
-                        if (this._tryFocus(_elms[i], useSetActive, scroller)) {
-                            return true;
-                        }
-                    } else if ((_nextHighestTabIndex < _elms[i].tabIndex) && (_elms[i].tabIndex < _highestTabIndex)) {
-                        // Here if _nextHighestTabIndex < _elms[i].tabIndex < _highestTabIndex
-                        _nextHighestTabIndex = _elms[i].tabIndex;
-                    }
-                }
-
-                // We weren't able to set focus to anything at that tabIndex
-                // If we found a lower valid tabIndex, try that now
-                _highestTabIndex = _nextHighestTabIndex;
-                _nextHighestTabIndex = 0;
-            }
-
-            // Wasn't able to set focus to anything with a tabIndex, try everything now
-            for (i = _elms.length - 2; i > 0; i--) {
-                if (this._tryFocus(_elms[i], useSetActive, scroller)) {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_Dispose',[
-    'exports',
-    '../Core/_Base',
-    '../Core/_WriteProfilerMark',
-    './_ElementUtilities'
-    ], function (exports, _Base, _WriteProfilerMark, _ElementUtilities) {
-    "use strict";
-
-    function markDisposable(element, disposeImpl) {
-            /// <signature helpKeyword="WinJS.Utilities.markDisposable">
-            /// <summary locid="WinJS.Utilities.markDisposable">
-            /// Adds the specified dispose implementation to the specified element and marks it as disposable.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.markDisposable_p:element">
-            /// The element to mark as disposable.
-            /// </param>
-            /// <param name="disposeImpl" type="Function" locid="WinJS.Utilities.markDisposable_p:disposeImpl">
-            /// The function containing the element-specific dispose logic that will be called by the dispose function.
-            /// </param>
-            /// </signature>
-            var disposed = false;
-            _ElementUtilities.addClass(element, "win-disposable");
-
-            var disposable = element.winControl || element;
-            disposable.dispose = function () {
-                if (disposed) {
-                    return;
-                }
-
-                disposed = true;
-                disposeSubTree(element);
-                if (disposeImpl) {
-                    disposeImpl();
-                }
-            };
-        }
-
-    function disposeSubTree(element) {
-        /// <signature helpKeyword="WinJS.Utilities.disposeSubTree">
-        /// <summary locid="WinJS.Utilities.disposeSubTree">
-        /// Disposes all first-generation disposable elements that are descendents of the specified element.
-        /// The specified element itself is not disposed.
-        /// </summary>
-        /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.disposeSubTree_p:element">
-        /// The root element whose sub-tree is to be disposed.
-        /// </param>
-        /// </signature>
-        if (!element) {
-            return;
-        }
-
-        _WriteProfilerMark("WinJS.Utilities.disposeSubTree,StartTM");
-        var query = element.querySelectorAll(".win-disposable");
-
-        var index = 0;
-        var length = query.length;
-        while (index < length) {
-            var disposable = query[index];
-            if (disposable.winControl && disposable.winControl.dispose) {
-                disposable.winControl.dispose();
-            }
-            if (disposable.dispose) {
-                disposable.dispose();
-            }
-
-            // Skip over disposable's descendants since they are this disposable's responsibility to clean up.
-            index += disposable.querySelectorAll(".win-disposable").length + 1;
-        }
-        _WriteProfilerMark("WinJS.Utilities.disposeSubTree,StopTM");
-    }
-
-    function _disposeElement(element) {
-        // This helper should only be used for supporting dispose scenarios predating the dispose pattern.
-        // The specified element should be well enough defined so we don't have to check whether it
-        // a) has a disposable winControl,
-        // b) is disposable itself,
-        // or has disposable descendants in which case either a) or b) must have been true when designed correctly.
-        if (!element) {
-            return;
-        }
-
-        var disposed = false;
-        if (element.winControl && element.winControl.dispose) {
-            element.winControl.dispose();
-            disposed = true;
-        }
-        if (element.dispose) {
-            element.dispose();
-            disposed = true;
-        }
-
-        if (!disposed) {
-            disposeSubTree(element);
-        }
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Utilities", {
-
-        markDisposable: markDisposable,
-
-        disposeSubTree: disposeSubTree,
-
-        _disposeElement: _disposeElement
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/ControlProcessor/_OptionsLexer',[
-    'exports',
-    '../Core/_Base'
-    ], function optionsLexerInit(exports, _Base) {
-    "use strict";
-
-    /*
-
-Lexical grammar is defined in ECMA-262-5, section 7.
-
-Lexical productions used in this grammar defined in ECMA-262-5:
-
-Production          Section
---------------------------------
-Identifier          7.6
-NullLiteral         7.8.1
-BooleanLiteral      7.8.2
-NumberLiteral       7.8.3
-StringLiteral       7.8.4
-
-*/
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _optionsLexer: _Base.Namespace._lazy(function () {
-
-            var tokenType = {
-                leftBrace: 1,           // {
-                rightBrace: 2,          // }
-                leftBracket: 3,         // [
-                rightBracket: 4,        // ]
-                separator: 5,           // ECMA-262-5, 7.2
-                colon: 6,               // :
-                semicolon: 7,           // ;
-                comma: 8,               // ,
-                dot: 9,                 // .
-                nullLiteral: 10,        // ECMA-262-5, 7.8.1 (null)
-                trueLiteral: 11,        // ECMA-262-5, 7.8.2 (true)
-                falseLiteral: 12,       // ECMA-262-5, 7.8.2 (false)
-                numberLiteral: 13,      // ECMA-262-5, 7.8.3
-                stringLiteral: 14,      // ECMA-262-5, 7.8.4
-                identifier: 15,         // ECMA-262-5, 7.6
-                reservedWord: 16,
-                thisKeyword: 17,
-                leftParentheses: 18,    // (
-                rightParentheses: 19,   // )
-                eof: 20,
-                error: 21
-            };
-            // debugging - this costs something like 20%
-            //
-            //Object.keys(tokenType).forEach(function (key) {
-            //    tokenType[key] = key.toString();
-            //});
-            var tokens = {
-                leftBrace: { type: tokenType.leftBrace, length: 1 },
-                rightBrace: { type: tokenType.rightBrace, length: 1 },
-                leftBracket: { type: tokenType.leftBracket, length: 1 },
-                rightBracket: { type: tokenType.rightBracket, length: 1 },
-                colon: { type: tokenType.colon, length: 1 },
-                semicolon: { type: tokenType.semicolon, length: 1 },
-                comma: { type: tokenType.comma, length: 1 },
-                dot: { type: tokenType.dot, length: 1 },
-                nullLiteral: { type: tokenType.nullLiteral, length: 4, value: null, keyword: true },
-                trueLiteral: { type: tokenType.trueLiteral, length: 4, value: true, keyword: true },
-                falseLiteral: { type: tokenType.falseLiteral, length: 5, value: false, keyword: true },
-                thisKeyword: { type: tokenType.thisKeyword, length: 4, value: "this", keyword: true },
-                leftParentheses: { type: tokenType.leftParentheses, length: 1 },
-                rightParentheses: { type: tokenType.rightParentheses, length: 1 },
-                eof: { type: tokenType.eof, length: 0 }
-            };
-
-            function reservedWord(word) {
-                return { type: tokenType.reservedWord, value: word, length: word.length, keyword: true };
-            }
-            function reservedWordLookup(identifier) {
-                // Moving from a simple object literal lookup for reserved words to this
-                // switch was worth a non-trivial performance increase (5-7%) as this path
-                // gets taken for any identifier.
-                //
-                switch (identifier.charCodeAt(0)) {
-                    case /*b*/98:
-                        switch (identifier) {
-                            case 'break':
-                                return reservedWord(identifier);
-                        }
-                        break;
-
-                    case /*c*/99:
-                        switch (identifier) {
-                            case 'case':
-                            case 'catch':
-                            case 'class':
-                            case 'const':
-                            case 'continue':
-                                return reservedWord(identifier);
-                        }
-                        break;
-
-                    case /*d*/100:
-                        switch (identifier) {
-                            case 'debugger':
-                            case 'default':
-                            case 'delete':
-                            case 'do':
-                                return reservedWord(identifier);
-                        }
-                        break;
-
-                    case /*e*/101:
-                        switch (identifier) {
-                            case 'else':
-                            case 'enum':
-                            case 'export':
-                            case 'extends':
-                                return reservedWord(identifier);
-                        }
-                        break;
-
-                    case /*f*/102:
-                        switch (identifier) {
-                            case 'false':
-                                return tokens.falseLiteral;
-
-                            case 'finally':
-                            case 'for':
-                            case 'function':
-                                return reservedWord(identifier);
-                        }
-
-                        break;
-                    case /*i*/105:
-                        switch (identifier) {
-                            case 'if':
-                            case 'import':
-                            case 'in':
-                            case 'instanceof':
-                                return reservedWord(identifier);
-                        }
-                        break;
-
-                    case /*n*/110:
-                        switch (identifier) {
-                            case 'null':
-                                return tokens.nullLiteral;
-
-                            case 'new':
-                                return reservedWord(identifier);
-                        }
-                        break;
-
-                    case /*r*/114:
-                        switch (identifier) {
-                            case 'return':
-                                return reservedWord(identifier);
-                        }
-                        break;
-
-                    case /*s*/115:
-                        switch (identifier) {
-                            case 'super':
-                            case 'switch':
-                                return reservedWord(identifier);
-                        }
-                        break;
-
-                    case /*t*/116:
-                        switch (identifier) {
-                            case 'true':
-                                return tokens.trueLiteral;
-
-                            case 'this':
-                                return tokens.thisKeyword;
-
-                            case 'throw':
-                            case 'try':
-                            case 'typeof':
-                                return reservedWord(identifier);
-                        }
-                        break;
-
-                    case /*v*/118:
-                        switch (identifier) {
-                            case 'var':
-                            case 'void':
-                                return reservedWord(identifier);
-                        }
-                        break;
-
-                    case /*w*/119:
-                        switch (identifier) {
-                            case 'while':
-                            case 'with':
-                                return reservedWord(identifier);
-                        }
-                        break;
-                }
-                return;
-            }
-
-            var lexer = (function () {
-                function isIdentifierStartCharacter(code, text, offset, limit) {
-                    // The ES5 spec decalares that identifiers consist of a bunch of unicode classes, without
-                    // WinRT support for determining unicode class membership we are looking at 2500+ lines of
-                    // javascript code to encode the relevant class tables. Instead we look for everything
-                    // which is legal and < 0x7f, we exclude whitespace and line terminators, and then accept
-                    // everything > 0x7f.
-                    //
-                    // Here's the ES5 production:
-                    //
-                    //  Lu | Ll | Lt | Lm | Lo | Nl
-                    //  $
-                    //  _
-                    //  \ UnicodeEscapeSequence
-                    //
-                    switch (code) {
-                        case (code >= /*a*/97 && code <= /*z*/122) && code:
-                        case (code >= /*A*/65 && code <= /*Z*/90) && code:
-                        case /*$*/36:
-                        case /*_*/95:
-                            return true;
-
-                        case isWhitespace(code) && code:
-                        case isLineTerminator(code) && code:
-                            return false;
-
-                        case (code > 0x7f) && code:
-                            return true;
-
-                        case /*\*/92:
-                            if (offset + 4 < limit) {
-                                if (text.charCodeAt(offset) === /*u*/117 &&
-                                    isHexDigit(text.charCodeAt(offset + 1)) &&
-                                    isHexDigit(text.charCodeAt(offset + 2)) &&
-                                    isHexDigit(text.charCodeAt(offset + 3)) &&
-                                    isHexDigit(text.charCodeAt(offset + 4))) {
-                                    return true;
-                                }
-                            }
-                            return false;
-
-                        default:
-                            return false;
-                    }
-                }
-                /*
-        // Hand-inlined into readIdentifierPart
-        function isIdentifierPartCharacter(code) {
-        // See comment in isIdentifierStartCharacter.
-        //
-        // Mn | Mc | Nd | Pc
-        // <ZWNJ> | <ZWJ>
-        //
-        switch (code) {
-        case isIdentifierStartCharacter(code) && code:
-        case isDecimalDigit(code) && code:
-        return true;
-
-        default:
-        return false;
-        }
-        }
-        */
-                function readIdentifierPart(text, offset, limit) {
-                    var hasEscape = false;
-                    while (offset < limit) {
-                        var code = text.charCodeAt(offset);
-                        switch (code) {
-                            //case isIdentifierStartCharacter(code) && code:
-                            case (code >= /*a*/97 && code <= /*z*/122) && code:
-                            case (code >= /*A*/65 && code <= /*Z*/90) && code:
-                            case /*$*/36:
-                            case /*_*/95:
-                                break;
-
-                            case isWhitespace(code) && code:
-                            case isLineTerminator(code) && code:
-                                return hasEscape ? -offset : offset;
-
-                            case (code > 0x7f) && code:
-                                break;
-
-                                //case isDecimalDigit(code) && code:
-                            case (code >= /*0*/48 && code <= /*9*/57) && code:
-                                break;
-
-                            case /*\*/92:
-                                if (offset + 5 < limit) {
-                                    if (text.charCodeAt(offset + 1) === /*u*/117 &&
-                                        isHexDigit(text.charCodeAt(offset + 2)) &&
-                                        isHexDigit(text.charCodeAt(offset + 3)) &&
-                                        isHexDigit(text.charCodeAt(offset + 4)) &&
-                                        isHexDigit(text.charCodeAt(offset + 5))) {
-                                        offset += 5;
-                                        hasEscape = true;
-                                        break;
-                                    }
-                                }
-                                return hasEscape ? -offset : offset;
-
-                            default:
-                                return hasEscape ? -offset : offset;
-                        }
-                        offset++;
-                    }
-                    return hasEscape ? -offset : offset;
-                }
-                function readIdentifierToken(text, offset, limit) {
-                    var startOffset = offset;
-                    offset = readIdentifierPart(text, offset, limit);
-                    var hasEscape = false;
-                    if (offset < 0) {
-                        offset = -offset;
-                        hasEscape = true;
-                    }
-                    var identifier = text.substr(startOffset, offset - startOffset);
-                    if (hasEscape) {
-                        identifier = "" + JSON.parse('"' + identifier + '"');
-                    }
-                    var wordToken = reservedWordLookup(identifier);
-                    if (wordToken) {
-                        return wordToken;
-                    }
-                    return {
-                        type: tokenType.identifier,
-                        length: offset - startOffset,
-                        value: identifier
-                    };
-                }
-                function isHexDigit(code) {
-                    switch (code) {
-                        case (code >= /*0*/48 && code <= /*9*/57) && code:
-                        case (code >= /*a*/97 && code <= /*f*/102) && code:
-                        case (code >= /*A*/65 && code <= /*F*/70) && code:
-                            return true;
-
-                        default:
-                            return false;
-                    }
-                }
-                function readHexIntegerLiteral(text, offset, limit) {
-                    while (offset < limit && isHexDigit(text.charCodeAt(offset))) {
-                        offset++;
-                    }
-                    return offset;
-                }
-                function isDecimalDigit(code) {
-                    switch (code) {
-                        case (code >= /*0*/48 && code <= /*9*/57) && code:
-                            return true;
-
-                        default:
-                            return false;
-                    }
-                }
-                function readDecimalDigits(text, offset, limit) {
-                    while (offset < limit && isDecimalDigit(text.charCodeAt(offset))) {
-                        offset++;
-                    }
-                    return offset;
-                }
-                function readDecimalLiteral(text, offset, limit) {
-                    offset = readDecimalDigits(text, offset, limit);
-                    if (offset < limit && text.charCodeAt(offset) === /*.*/46 && offset + 1 < limit && isDecimalDigit(text.charCodeAt(offset + 1))) {
-                        offset = readDecimalDigits(text, offset + 2, limit);
-                    }
-                    if (offset < limit) {
-                        var code = text.charCodeAt(offset);
-                        if (code === /*e*/101 || code === /*E*/69) {
-                            var tempOffset = offset + 1;
-                            if (tempOffset < limit) {
-                                code = text.charCodeAt(tempOffset);
-                                if (code === /*+*/43 || code === /*-*/45) {
-                                    tempOffset++;
-                                }
-                                offset = readDecimalDigits(text, tempOffset, limit);
-                            }
-                        }
-                    }
-                    return offset;
-                }
-                function readDecimalLiteralToken(text, start, offset, limit) {
-                    var offset = readDecimalLiteral(text, offset, limit);
-                    var length = offset - start;
-                    return {
-                        type: tokenType.numberLiteral,
-                        length: length,
-                        value: +text.substr(start, length)
-                    };
-                }
-                function isLineTerminator(code) {
-                    switch (code) {
-                        case 0x000A:    // line feed
-                        case 0x000D:    // carriage return
-                        case 0x2028:    // line separator
-                        case 0x2029:    // paragraph separator
-                            return true;
-
-                        default:
-                            return false;
-                    }
-                }
-                function readStringLiteralToken(text, offset, limit) {
-                    var startOffset = offset;
-                    var quoteCharCode = text.charCodeAt(offset);
-                    var hasEscape = false;
-                    offset++;
-                    while (offset < limit && !isLineTerminator(text.charCodeAt(offset))) {
-                        if (offset + 1 < limit && text.charCodeAt(offset) === /*\*/92) {
-                            hasEscape = true;
-
-                            switch (text.charCodeAt(offset + 1)) {
-                                case quoteCharCode:
-                                case 0x005C:    // \
-                                case 0x000A:    // line feed
-                                case 0x2028:    // line separator
-                                case 0x2029:    // paragraph separator
-                                    offset += 2;
-                                    continue;
-
-                                case 0x000D:    // carriage return
-                                    if (offset + 2 < limit && text.charCodeAt(offset + 2) === 0x000A) {
-                                        // Skip \r\n
-                                        offset += 3;
-                                    } else {
-                                        offset += 2;
-                                    }
-                                    continue;
-                            }
-                        }
-                        offset++;
-                        if (text.charCodeAt(offset - 1) === quoteCharCode) {
-                            break;
-                        }
-                    }
-                    var length = offset - startOffset;
-                    // If we don't have a terminating quote go through the escape path.
-                    hasEscape = hasEscape || length === 1 || text.charCodeAt(offset - 1) !== quoteCharCode;
-                    var stringValue;
-                    if (hasEscape) {
-                        stringValue = eval(text.substr(startOffset, length)); // jshint ignore:line
-                    } else {
-                        stringValue = text.substr(startOffset + 1, length - 2);
-                    }
-                    return {
-                        type: tokenType.stringLiteral,
-                        length: length,
-                        value: stringValue
-                    };
-                }
-                function isWhitespace(code) {
-                    switch (code) {
-                        case 0x0009:    // tab
-                        case 0x000B:    // vertical tab
-                        case 0x000C:    // form feed
-                        case 0x0020:    // space
-                        case 0x00A0:    // no-breaking space
-                        case 0xFEFF:    // BOM
-                            return true;
-
-                            // There are no category Zs between 0x00A0 and 0x1680.
-                            //
-                        case (code < 0x1680) && code:
-                            return false;
-
-                            // Unicode category Zs
-                            //
-                        case 0x1680:
-                        case 0x180e:
-                        case (code >= 0x2000 && code <= 0x200a) && code:
-                        case 0x202f:
-                        case 0x205f:
-                        case 0x3000:
-                            return true;
-
-                        default:
-                            return false;
-                    }
-                }
-                // Hand-inlined isWhitespace.
-                function readWhitespace(text, offset, limit) {
-                    while (offset < limit) {
-                        var code = text.charCodeAt(offset);
-                        switch (code) {
-                            case 0x0009:    // tab
-                            case 0x000B:    // vertical tab
-                            case 0x000C:    // form feed
-                            case 0x0020:    // space
-                            case 0x00A0:    // no-breaking space
-                            case 0xFEFF:    // BOM
-                                break;
-
-                                // There are no category Zs between 0x00A0 and 0x1680.
-                                //
-                            case (code < 0x1680) && code:
-                                return offset;
-
-                                // Unicode category Zs
-                                //
-                            case 0x1680:
-                            case 0x180e:
-                            case (code >= 0x2000 && code <= 0x200a) && code:
-                            case 0x202f:
-                            case 0x205f:
-                            case 0x3000:
-                                break;
-
-                            default:
-                                return offset;
-                        }
-                        offset++;
-                    }
-                    return offset;
-                }
-                function lex(result, text, offset, limit) {
-                    while (offset < limit) {
-                        var startOffset = offset;
-                        var code = text.charCodeAt(offset++);
-                        var token;
-                        switch (code) {
-                            case isWhitespace(code) && code:
-                            case isLineTerminator(code) && code:
-                                offset = readWhitespace(text, offset, limit);
-                                token = { type: tokenType.separator, length: offset - startOffset };
-                                // don't include whitespace in the token stream.
-                                continue;
-
-                            case /*"*/34:
-                            case /*'*/39:
-                                token = readStringLiteralToken(text, offset - 1, limit);
-                                break;
-
-                            case /*(*/40:
-                                token = tokens.leftParentheses;
-                                break;
-
-                            case /*)*/41:
-                                token = tokens.rightParentheses;
-                                break;
-
-                            case /*+*/43:
-                            case /*-*/45:
-                                if (offset < limit) {
-                                    var afterSign = text.charCodeAt(offset);
-                                    if (afterSign === /*.*/46) {
-                                        var signOffset = offset + 1;
-                                        if (signOffset < limit && isDecimalDigit(text.charCodeAt(signOffset))) {
-                                            token = readDecimalLiteralToken(text, startOffset, signOffset, limit);
-                                            break;
-                                        }
-                                    } else if (isDecimalDigit(afterSign)) {
-                                        token = readDecimalLiteralToken(text, startOffset, offset, limit);
-                                        break;
-                                    }
-                                }
-                                token = { type: tokenType.error, length: offset - startOffset, value: text.substring(startOffset, offset) };
-                                break;
-
-                            case /*,*/44:
-                                token = tokens.comma;
-                                break;
-
-                            case /*.*/46:
-                                token = tokens.dot;
-                                if (offset < limit && isDecimalDigit(text.charCodeAt(offset))) {
-                                    token = readDecimalLiteralToken(text, startOffset, offset, limit);
-                                }
-                                break;
-
-                            case /*0*/48:
-                                var ch2 = (offset < limit ? text.charCodeAt(offset) : 0);
-                                if (ch2 === /*x*/120 || ch2 === /*X*/88) {
-                                    var hexOffset = readHexIntegerLiteral(text, offset + 1, limit);
-                                    token = {
-                                        type: tokenType.numberLiteral,
-                                        length: hexOffset - startOffset,
-                                        value: +text.substr(startOffset, hexOffset - startOffset)
-                                    };
-                                } else {
-                                    token = readDecimalLiteralToken(text, startOffset, offset, limit);
-                                }
-                                break;
-
-                            case (code >= /*1*/49 && code <= /*9*/57) && code:
-                                token = readDecimalLiteralToken(text, startOffset, offset, limit);
-                                break;
-
-                            case /*:*/58:
-                                token = tokens.colon;
-                                break;
-
-                            case /*;*/59:
-                                token = tokens.semicolon;
-                                break;
-
-                            case /*[*/91:
-                                token = tokens.leftBracket;
-                                break;
-
-                            case /*]*/93:
-                                token = tokens.rightBracket;
-                                break;
-
-                            case /*{*/123:
-                                token = tokens.leftBrace;
-                                break;
-
-                            case /*}*/125:
-                                token = tokens.rightBrace;
-                                break;
-
-                            default:
-                                if (isIdentifierStartCharacter(code, text, offset, limit)) {
-                                    token = readIdentifierToken(text, offset - 1, limit);
-                                    break;
-                                }
-                                token = { type: tokenType.error, length: offset - startOffset, value: text.substring(startOffset, offset) };
-                                break;
-                        }
-
-                        offset += (token.length - 1);
-                        result.push(token);
-                    }
-                }
-                return function (text) {
-                    var result = [];
-                    lex(result, text, 0, text.length);
-                    result.push(tokens.eof);
-                    return result;
-                };
-            })();
-            lexer.tokenType = tokenType;
-            return lexer;
-        })
-    });
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/ControlProcessor/_OptionsParser',[
-    'exports',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Resources',
-    './_OptionsLexer'
-    ], function optionsParserInit(exports, _Base, _BaseUtils, _ErrorFromName, _Resources, _OptionsLexer) {
-    "use strict";
-
-    var strings = {
-        get invalidOptionsRecord() { return "Invalid options record: '{0}', expected to be in the format of an object literal. {1}"; },
-        get unexpectedTokenExpectedToken() { return "Unexpected token: {0}, expected token: {1}, at offset {2}"; },
-        get unexpectedTokenExpectedTokens() { return "Unexpected token: {0}, expected one of: {1}, at offset {2}"; },
-        get unexpectedTokenGeneric() { return "Unexpected token: {0}, at offset {1}"; },
-    };
-
-    /*
-    Notation is described in ECMA-262-5 (ECMAScript Language Specification, 5th edition) section 5.
-
-    Lexical grammar is defined in ECMA-262-5, section 7.
-
-    Lexical productions used in this grammar defined in ECMA-262-5:
-
-        Production          Section
-        --------------------------------
-        Identifier          7.6
-        NullLiteral         7.8.1
-        BooleanLiteral      7.8.2
-        NumberLiteral       7.8.3
-        StringLiteral       7.8.4
-
-    Syntactic grammar for the value of the data-win-options attribute.
-
-        OptionsLiteral:
-            ObjectLiteral
-
-        ObjectLiteral:
-            { }
-            { ObjectProperties }
-            { ObjectProperties , }
-
-        ObjectProperties:
-            ObjectProperty
-            ObjectProperties, ObjectProperty
-
-        ObjectProperty:
-            PropertyName : Value
-
-        PropertyName:                       (from ECMA-262-6, 11.1.5)
-            StringLiteral
-            NumberLiteral
-            Identifier
-
-        ArrayLiteral:
-            [ ]
-            [ Elision ]
-            [ ArrayElements ]
-            [ ArrayElements , ]
-            [ ArrayElements , Elision ]
-
-        ArrayElements:
-            Value
-            Elision Value
-            ArrayElements , Value
-            ArrayElements , Elision Value
-
-        Elision:
-            ,
-            Elision ,
-
-        Value:
-            NullLiteral
-            NumberLiteral
-            BooleanLiteral
-            StringLiteral
-            ArrayLiteral
-            ObjectLiteral
-            IdentifierExpression
-            ObjectQueryExpression
-
-        AccessExpression:
-            [ Value ]
-            . Identifier
-
-        AccessExpressions:
-            AccessExpression
-            AccessExpressions AccessExpression
-
-        IdentifierExpression:
-            Identifier
-            Identifier AccessExpressions
-
-        ObjectQueryExpression:
-            Identifier ( StringLiteral )
-            Identifier ( StringLiteral ) AccessExpressions
-
-
-    NOTE: We have factored the above grammar to allow the infrastructure to be used
-          by the BindingInterpreter as well. The BaseInterpreter does NOT provide an
-          implementation of _evaluateValue(), this is expected to be provided by the
-          derived class since right now the two have different grammars for Value
-
-        AccessExpression:
-            [ Value ]
-            . Identifier
-
-        AccessExpressions:
-            AccessExpression
-            AccessExpressions AccessExpression
-
-        Identifier:
-            Identifier                      (from ECMA-262-6, 7.6)
-
-        IdentifierExpression:
-            Identifier
-            Identifier AccessExpressions
-
-        Value:
-            *** Provided by concrete interpreter ***
-
-*/
-
-    function illegal() {
-        throw "Illegal";
-    }
-
-    var imports = _Base.Namespace.defineWithParent(null, null, {
-        lexer: _Base.Namespace._lazy(function () {
-            return _OptionsLexer._optionsLexer;
-        }),
-        tokenType: _Base.Namespace._lazy(function () {
-            return _OptionsLexer._optionsLexer.tokenType;
-        }),
-    });
-
-    var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;
-
-    function tokenTypeName(type) {
-        var keys = Object.keys(imports.tokenType);
-        for (var i = 0, len = keys.length; i < len; i++) {
-            if (type === imports.tokenType[keys[i]]) {
-                return keys[i];
-            }
-        }
-        return "<unknown>";
-    }
-
-    var local = _Base.Namespace.defineWithParent(null, null, {
-
-        BaseInterpreter: _Base.Namespace._lazy(function () {
-            return _Base.Class.define(null, {
-                _error: function (message) {
-                    throw new _ErrorFromName("WinJS.UI.ParseError", message);
-                },
-                _currentOffset: function () {
-                    var p = this._pos;
-                    var offset = 0;
-                    for (var i = 0; i < p; i++) {
-                        offset += this._tokens[i].length;
-                    }
-                    return offset;
-                },
-                _evaluateAccessExpression: function (value) {
-                    switch (this._current.type) {
-                        case imports.tokenType.dot:
-                            this._read();
-                            switch (this._current.type) {
-                                case imports.tokenType.identifier:
-                                case this._current.keyword && this._current.type:
-                                    var id = this._current.value;
-                                    this._read();
-                                    return value[id];
-
-                                default:
-                                    this._unexpectedToken(imports.tokenType.identifier, imports.tokenType.reservedWord);
-                                    break;
-                            }
-                            return;
-
-                        case imports.tokenType.leftBracket:
-                            this._read();
-                            var index = this._evaluateValue();
-                            this._read(imports.tokenType.rightBracket);
-                            return value[index];
-
-                            // default: is unreachable because all the callers are conditional on
-                            // the next token being either a . or {
-                            //
-                    }
-                },
-                _evaluateAccessExpressions: function (value) {
-                    while (true) {
-                        switch (this._current.type) {
-                            case imports.tokenType.dot:
-                            case imports.tokenType.leftBracket:
-                                value = this._evaluateAccessExpression(value);
-                                break;
-
-                            default:
-                                return value;
-                        }
-                    }
-                },
-                _evaluateIdentifier: function (nested, value) {
-                    var id = this._readIdentifier();
-                    value = nested ? value[id] : this._context[id];
-                    return value;
-                },
-                _evaluateIdentifierExpression: function () {
-                    var value = this._evaluateIdentifier(false);
-
-                    switch (this._current.type) {
-                        case imports.tokenType.dot:
-                        case imports.tokenType.leftBracket:
-                            return this._evaluateAccessExpressions(value);
-                        default:
-                            return value;
-                    }
-                },
-                _initialize: function (tokens, originalSource, context, functionContext) {
-                    this._originalSource = originalSource;
-                    this._tokens = tokens;
-                    this._context = context;
-                    this._functionContext = functionContext;
-                    this._pos = 0;
-                    this._current = this._tokens[0];
-                },
-                _read: function (expected) {
-                    if (expected && this._current.type !== expected) {
-                        this._unexpectedToken(expected);
-                    }
-                    if (this._current !== imports.tokenType.eof) {
-                        this._current = this._tokens[++this._pos];
-                    }
-                },
-                _peek: function (expected) {
-                    if (expected && this._current.type !== expected) {
-                        return;
-                    }
-                    if (this._current !== imports.tokenType.eof) {
-                        return this._tokens[this._pos + 1];
-                    }
-                },
-                _readAccessExpression: function (parts) {
-                    switch (this._current.type) {
-                        case imports.tokenType.dot:
-                            this._read();
-                            switch (this._current.type) {
-                                case imports.tokenType.identifier:
-                                case this._current.keyword && this._current.type:
-                                    parts.push(this._current.value);
-                                    this._read();
-                                    break;
-
-                                default:
-                                    this._unexpectedToken(imports.tokenType.identifier, imports.tokenType.reservedWord);
-                                    break;
-                            }
-                            return;
-
-                        case imports.tokenType.leftBracket:
-                            this._read();
-                            parts.push(this._evaluateValue());
-                            this._read(imports.tokenType.rightBracket);
-                            return;
-
-                            // default: is unreachable because all the callers are conditional on
-                            // the next token being either a . or {
-                            //
-                    }
-                },
-                _readAccessExpressions: function (parts) {
-                    while (true) {
-                        switch (this._current.type) {
-                            case imports.tokenType.dot:
-                            case imports.tokenType.leftBracket:
-                                this._readAccessExpression(parts);
-                                break;
-
-                            default:
-                                return;
-                        }
-                    }
-                },
-                _readIdentifier: function () {
-                    var id = this._current.value;
-                    this._read(imports.tokenType.identifier);
-                    return id;
-                },
-                _readIdentifierExpression: function () {
-                    var parts = [];
-                    if (this._peek(imports.tokenType.thisKeyword) && parts.length === 0) {
-                        this._read();
-                    } else {
-                        parts.push(this._readIdentifier());
-                    }
-
-                    switch (this._current.type) {
-                        case imports.tokenType.dot:
-                        case imports.tokenType.leftBracket:
-                            this._readAccessExpressions(parts);
-                            break;
-                    }
-
-                    return parts;
-                },
-                _unexpectedToken: function (expected) {
-                    var unexpected = (this._current.type === imports.tokenType.error ? "'" + this._current.value + "'" : tokenTypeName(this._current.type));
-                    if (expected) {
-                        if (arguments.length === 1) {
-                            expected = tokenTypeName(expected);
-                            this._error(_Resources._formatString(strings.unexpectedTokenExpectedToken, unexpected, expected, this._currentOffset()));
-                        } else {
-                            var names = [];
-                            for (var i = 0, len = arguments.length; i < len; i++) {
-                                names.push(tokenTypeName(arguments[i]));
-                            }
-                            expected = names.join(", ");
-                            this._error(_Resources._formatString(strings.unexpectedTokenExpectedTokens, unexpected, expected, this._currentOffset()));
-                        }
-                    } else {
-                        this._error(_Resources._formatString(strings.unexpectedTokenGeneric, unexpected, this._currentOffset()));
-                    }
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-        }),
-
-        OptionsInterpreter: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(local.BaseInterpreter, function (tokens, originalSource, context, functionContext) {
-                this._initialize(tokens, originalSource, context, functionContext);
-            }, {
-                _error: function (message) {
-                    throw new _ErrorFromName("WinJS.UI.ParseError", _Resources._formatString(strings.invalidOptionsRecord, this._originalSource, message));
-                },
-                _evaluateArrayLiteral: function () {
-                    var a = [];
-                    this._read(imports.tokenType.leftBracket);
-                    this._readArrayElements(a);
-                    this._read(imports.tokenType.rightBracket);
-                    return a;
-                },
-                _evaluateObjectLiteral: function () {
-                    var o = {};
-                    this._read(imports.tokenType.leftBrace);
-                    this._readObjectProperties(o);
-                    this._tryReadComma();
-                    this._read(imports.tokenType.rightBrace);
-                    return o;
-                },
-                _evaluateOptionsLiteral: function () {
-                    var value = this._evaluateValue();
-                    if (this._current.type !== imports.tokenType.eof) {
-                        this._unexpectedToken(imports.tokenType.eof);
-                    }
-                    return value;
-                },
-                _peekValue: function () {
-                    switch (this._current.type) {
-                        case imports.tokenType.falseLiteral:
-                        case imports.tokenType.nullLiteral:
-                        case imports.tokenType.stringLiteral:
-                        case imports.tokenType.trueLiteral:
-                        case imports.tokenType.numberLiteral:
-                        case imports.tokenType.leftBrace:
-                        case imports.tokenType.leftBracket:
-                        case imports.tokenType.identifier:
-                            return true;
-                        default:
-                            return false;
-                    }
-                },
-                _evaluateValue: function () {
-                    switch (this._current.type) {
-                        case imports.tokenType.falseLiteral:
-                        case imports.tokenType.nullLiteral:
-                        case imports.tokenType.stringLiteral:
-                        case imports.tokenType.trueLiteral:
-                        case imports.tokenType.numberLiteral:
-                            var value = this._current.value;
-                            this._read();
-                            return value;
-
-                        case imports.tokenType.leftBrace:
-                            return this._evaluateObjectLiteral();
-
-                        case imports.tokenType.leftBracket:
-                            return this._evaluateArrayLiteral();
-
-                        case imports.tokenType.identifier:
-                            if (this._peek(imports.tokenType.identifier).type === imports.tokenType.leftParentheses) {
-                                return requireSupportedForProcessing(this._evaluateObjectQueryExpression());
-                            }
-                            return requireSupportedForProcessing(this._evaluateIdentifierExpression());
-
-                        default:
-                            this._unexpectedToken(imports.tokenType.falseLiteral, imports.tokenType.nullLiteral, imports.tokenType.stringLiteral,
-                                imports.tokenType.trueLiteral, imports.tokenType.numberLiteral, imports.tokenType.leftBrace, imports.tokenType.leftBracket,
-                                imports.tokenType.identifier);
-                            break;
-                    }
-                },
-                _tryReadElement: function (a) {
-                    if (this._peekValue()) {
-                        a.push(this._evaluateValue());
-                        return true;
-                    } else {
-                        return false;
-                    }
-                },
-                _tryReadComma: function () {
-                    if (this._peek(imports.tokenType.comma)) {
-                        this._read();
-                        return true;
-                    }
-                    return false;
-                },
-                _tryReadElision: function (a) {
-                    var found = false;
-                    while (this._tryReadComma()) {
-                        a.push(undefined);
-                        found = true;
-                    }
-                    return found;
-                },
-                _readArrayElements: function (a) {
-                    while (!this._peek(imports.tokenType.rightBracket)) {
-                        var elision = this._tryReadElision(a);
-                        var element = this._tryReadElement(a);
-                        var comma = this._peek(imports.tokenType.comma);
-                        if (element && comma) {
-                            // if we had a element followed by a comma, eat the comma and try to read the next element
-                            this._read();
-                        } else if (element || elision) {
-                            // if we had a element without a trailing comma or if all we had were commas we're done
-                            break;
-                        } else {
-                            // if we didn't have a element or elision then we are done and in error
-                            this._unexpectedToken(imports.tokenType.falseLiteral, imports.tokenType.nullLiteral, imports.tokenType.stringLiteral,
-                                imports.tokenType.trueLiteral, imports.tokenType.numberLiteral, imports.tokenType.leftBrace, imports.tokenType.leftBracket,
-                                imports.tokenType.identifier);
-                            break;
-                        }
-                    }
-                },
-                _readObjectProperties: function (o) {
-                    while (!this._peek(imports.tokenType.rightBrace)) {
-                        var property = this._tryReadObjectProperty(o);
-                        var comma = this._peek(imports.tokenType.comma);
-                        if (property && comma) {
-                            // if we had a property followed by a comma, eat the comma and try to read the next property
-                            this._read();
-                        } else if (property) {
-                            // if we had a property without a trailing comma we're done
-                            break;
-                        } else {
-                            // if we didn't have a property then we are done and in error
-                            this._unexpectedToken(imports.tokenType.numberLiteral, imports.tokenType.stringLiteral, imports.tokenType.identifier);
-                            break;
-                        }
-                    }
-                },
-                _tryReadObjectProperty: function (o) {
-                    switch (this._current.type) {
-                        case imports.tokenType.numberLiteral:
-                        case imports.tokenType.stringLiteral:
-                        case imports.tokenType.identifier:
-                        case this._current.keyword && this._current.type:
-                            var propertyName = this._current.value;
-                            this._read();
-                            this._read(imports.tokenType.colon);
-                            o[propertyName] = this._evaluateValue();
-                            return true;
-
-                        default:
-                            return false;
-                    }
-                },
-                _failReadObjectProperty: function () {
-                    this._unexpectedToken(imports.tokenType.numberLiteral, imports.tokenType.stringLiteral, imports.tokenType.identifier, imports.tokenType.reservedWord);
-                },
-                _evaluateObjectQueryExpression: function () {
-                    var functionName = this._current.value;
-                    this._read(imports.tokenType.identifier);
-                    this._read(imports.tokenType.leftParentheses);
-                    var queryExpression = this._current.value;
-                    this._read(imports.tokenType.stringLiteral);
-                    this._read(imports.tokenType.rightParentheses);
-
-                    var value = requireSupportedForProcessing(this._functionContext[functionName])(queryExpression);
-                    switch (this._current.type) {
-                        case imports.tokenType.dot:
-                        case imports.tokenType.leftBracket:
-                            return this._evaluateAccessExpressions(value);
-
-                        default:
-                            return value;
-                    }
-                },
-                run: function () {
-                    return this._evaluateOptionsLiteral();
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-        }),
-
-        OptionsParser: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(local.OptionsInterpreter, function (tokens, originalSource) {
-                this._initialize(tokens, originalSource);
-            }, {
-                // When parsing it is illegal to get to any of these "evaluate" RHS productions because
-                //  we will always instead go to the "read" version
-                //
-                _evaluateAccessExpression: illegal,
-                _evaluateAccessExpressions: illegal,
-                _evaluateIdentifier: illegal,
-                _evaluateIdentifierExpression: illegal,
-                _evaluateObjectQueryExpression: illegal,
-
-                _evaluateValue: function () {
-                    switch (this._current.type) {
-                        case imports.tokenType.falseLiteral:
-                        case imports.tokenType.nullLiteral:
-                        case imports.tokenType.stringLiteral:
-                        case imports.tokenType.trueLiteral:
-                        case imports.tokenType.numberLiteral:
-                            var value = this._current.value;
-                            this._read();
-                            return value;
-
-                        case imports.tokenType.leftBrace:
-                            return this._evaluateObjectLiteral();
-
-                        case imports.tokenType.leftBracket:
-                            return this._evaluateArrayLiteral();
-
-                        case imports.tokenType.identifier:
-                            if (this._peek(imports.tokenType.identifier).type === imports.tokenType.leftParentheses) {
-                                return this._readObjectQueryExpression();
-                            }
-                            return this._readIdentifierExpression();
-
-                        default:
-                            this._unexpectedToken(imports.tokenType.falseLiteral, imports.tokenType.nullLiteral, imports.tokenType.stringLiteral,
-                                imports.tokenType.trueLiteral, imports.tokenType.numberLiteral, imports.tokenType.leftBrace, imports.tokenType.leftBracket,
-                                imports.tokenType.identifier);
-                            break;
-                    }
-                },
-
-                _readIdentifierExpression: function () {
-                    var parts = local.BaseInterpreter.prototype._readIdentifierExpression.call(this);
-                    return new IdentifierExpression(parts);
-                },
-                _readObjectQueryExpression: function () {
-                    var functionName = this._current.value;
-                    this._read(imports.tokenType.identifier);
-                    this._read(imports.tokenType.leftParentheses);
-                    var queryExpressionLiteral = this._current.value;
-                    this._read(imports.tokenType.stringLiteral);
-                    this._read(imports.tokenType.rightParentheses);
-
-                    var call = new CallExpression(functionName, queryExpressionLiteral);
-                    switch (this._current.type) {
-                        case imports.tokenType.dot:
-                        case imports.tokenType.leftBracket:
-                            var parts = [call];
-                            this._readAccessExpressions(parts);
-                            return new IdentifierExpression(parts);
-
-                        default:
-                            return call;
-                    }
-                },
-            }, {
-                supportedForProcessing: false,
-            });
-        })
-
-    });
-
-    var parser = function (text, context, functionContext) {
-        var tokens = imports.lexer(text);
-        var interpreter = new local.OptionsInterpreter(tokens, text, context || {}, functionContext || {});
-        return interpreter.run();
-    };
-    Object.defineProperty(parser, "_BaseInterpreter", { get: function () { return local.BaseInterpreter; } });
-
-    var parser2 = function (text) {
-        var tokens = imports.lexer(text);
-        var parser = new local.OptionsParser(tokens, text);
-        return parser.run();
-    };
-
-    // Consumers of parser2 need to be able to see the AST for RHS expression in order to emit
-    //  code representing these portions of the options record
-    //
-    var CallExpression = _Base.Class.define(function (target, arg0Value) {
-        this.target = target;
-        this.arg0Value = arg0Value;
-    });
-    CallExpression.supportedForProcessing = false;
-
-    var IdentifierExpression = _Base.Class.define(function (parts) {
-        this.parts = parts;
-    });
-    IdentifierExpression.supportedForProcessing = false;
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-
-        // This is the mis-named interpreter version of the options record processor.
-        //
-        optionsParser: parser,
-
-        // This is the actual parser version of the options record processor.
-        //
-        _optionsParser: parser2,
-        _CallExpression: CallExpression,
-        _IdentifierExpression: IdentifierExpression,
-
-    });
-
-});
-
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/ControlProcessor',[
-    'exports',
-    './Core/_Global',
-    './Core/_Base',
-    './Core/_BaseUtils',
-    './Core/_Log',
-    './Core/_Resources',
-    './Core/_WriteProfilerMark',
-    './ControlProcessor/_OptionsParser',
-    './Promise',
-    './Utilities/_ElementUtilities'
-    ], function declarativeControlsInit(exports, _Global, _Base, _BaseUtils, _Log, _Resources, _WriteProfilerMark, _OptionsParser, Promise, _ElementUtilities) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-
-    var strings = {
-        get errorActivatingControl() { return "Error activating control: {0}"; },
-    };
-
-    var markSupportedForProcessing = _BaseUtils.markSupportedForProcessing;
-    var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;
-    var processedAllCalled = false;
-
-    function createSelect(element) {
-        var result = function select(selector) {
-            /// <signature helpKeyword="WinJS.UI.select.createSelect">
-            /// <summary locid="WinJS.UI.select.createSelect">
-            /// Walks the DOM tree from the given  element to the root of the document, whenever
-            /// a selector scope is encountered select performs a lookup within that scope for
-            /// the given selector string. The first matching element is returned.
-            /// </summary>
-            /// <param name="selector" type="String" locid="WinJS.UI.select.createSelect_p:selector">The selector string.</param>
-            /// <returns type="HTMLElement" domElement="true" locid="WinJS.UI.select.createSelect_returnValue">The target element, if found.</returns>
-            /// </signature>
-            var current = element;
-            var selected;
-            while (current) {
-                if (current.msParentSelectorScope) {
-                    var scope = current.parentNode;
-                    if (scope) {
-                        selected = _ElementUtilities._matchesSelector(scope, selector) ? scope : scope.querySelector(selector);
-                        if (selected) {
-                            break;
-                        }
-                    }
-                }
-                current = current.parentNode;
-            }
-
-            return selected || _Global.document.querySelector(selector);
-        };
-        return markSupportedForProcessing(result);
-    }
-
-    function activate(element, Handler) {
-        return new Promise(function activate2(complete, error) {
-            try {
-                var options;
-                var optionsAttribute = element.getAttribute("data-win-options");
-                if (optionsAttribute) {
-                    options = _OptionsParser.optionsParser(optionsAttribute, _Global, {
-                        select: createSelect(element)
-                    });
-                }
-
-                var ctl;
-                var count = 1;
-
-                // handler is required to call complete if it takes that parameter
-                //
-                if (Handler.length > 2) {
-                    count++;
-                }
-                var checkComplete = function checkComplete() {
-                    count--;
-                    if (count === 0) {
-                        element.winControl = element.winControl || ctl;
-                        complete(ctl);
-                    }
-                };
-
-                // async exceptions from the handler get dropped on the floor...
-                //
-                ctl = new Handler(element, options, checkComplete);
-                checkComplete();
-            }
-            catch (err) {
-                _Log.log && _Log.log(_Resources._formatString(strings.errorActivatingControl, err && err.message), "winjs controls", "error");
-                error(err);
-            }
-        });
-    }
-
-    function processAllImpl(rootElement, skipRootElement) {
-        return new Promise(function processAllImpl2(complete, error) {
-            _WriteProfilerMark("WinJS.UI:processAll,StartTM");
-            rootElement = rootElement || _Global.document.body;
-            var pending = 0;
-            var selector = "[data-win-control]";
-            var allElements = rootElement.querySelectorAll(selector);
-            var elements = [];
-            if (!skipRootElement && getControlHandler(rootElement)) {
-                elements.push(rootElement);
-            }
-            for (var i = 0, len = allElements.length; i < len; i++) {
-                elements.push(allElements[i]);
-            }
-
-            // bail early if there is nothing to process
-            //
-            if (elements.length === 0) {
-                _WriteProfilerMark("WinJS.UI:processAll,StopTM");
-                complete(rootElement);
-                return;
-            }
-
-            var checkAllComplete = function () {
-                pending = pending - 1;
-                if (pending < 0) {
-                    _WriteProfilerMark("WinJS.UI:processAll,StopTM");
-                    complete(rootElement);
-                }
-            };
-
-            // First go through and determine which elements to activate
-            //
-            var controls = new Array(elements.length);
-            for (var i = 0, len = elements.length; i < len; i++) {
-                var element = elements[i];
-                var control;
-                var instance = element.winControl;
-                if (instance) {
-                    control = instance.constructor;
-                    // already activated, don't need to add to controls array
-                } else {
-                    controls[i] = control = getControlHandler(element);
-                }
-                if (control && control.isDeclarativeControlContainer) {
-                    i += element.querySelectorAll(selector).length;
-                }
-            }
-
-            // Now go through and activate those
-            //
-            _WriteProfilerMark("WinJS.UI:processAllActivateControls,StartTM");
-            for (var i = 0, len = elements.length; i < len; i++) {
-                var ctl = controls[i];
-                var element = elements[i];
-                if (ctl && !element.winControl) {
-                    pending++;
-                    activate(element, ctl).then(checkAllComplete, function (e) {
-                        _WriteProfilerMark("WinJS.UI:processAll,StopTM");
-                        error(e);
-                    });
-
-                    if (ctl.isDeclarativeControlContainer && typeof ctl.isDeclarativeControlContainer === "function") {
-                        var idcc = requireSupportedForProcessing(ctl.isDeclarativeControlContainer);
-                        idcc(element.winControl, processAll);
-                    }
-                }
-            }
-            _WriteProfilerMark("WinJS.UI:processAllActivateControls,StopTM");
-
-            checkAllComplete();
-        });
-    }
-
-    function getControlHandler(element) {
-        if (element.getAttribute) {
-            var evaluator = element.getAttribute("data-win-control");
-            if (evaluator) {
-                return _BaseUtils._getMemberFiltered(evaluator.trim(), _Global, requireSupportedForProcessing);
-            }
-        }
-    }
-
-    function scopedSelect(selector, element) {
-        /// <signature helpKeyword="WinJS.UI.scopedSelect">
-        /// <summary locid="WinJS.UI.scopedSelect">
-        /// Walks the DOM tree from the given  element to the root of the document, whenever
-        /// a selector scope is encountered select performs a lookup within that scope for
-        /// the given selector string. The first matching element is returned.
-        /// </summary>
-        /// <param name="selector" type="String" locid="WinJS.UI.scopedSelect_p:selector">The selector string.</param>
-        /// <returns type="HTMLElement" domElement="true" locid="WinJS.UI.scopedSelect_returnValue">The target element, if found.</returns>
-        /// </signature>
-        return createSelect(element)(selector);
-    }
-
-    function processAll(rootElement, skipRoot) {
-        /// <signature helpKeyword="WinJS.UI.processAll">
-        /// <summary locid="WinJS.UI.processAll">
-        /// Applies declarative control binding to all elements, starting at the specified root element.
-        /// </summary>
-        /// <param name="rootElement" type="Object" domElement="true" locid="WinJS.UI.processAll_p:rootElement">
-        /// The element at which to start applying the binding. If this parameter is not specified, the binding is applied to the entire document.
-        /// </param>
-        /// <param name="skipRoot" type="Boolean" optional="true" locid="WinJS.UI.processAll_p:skipRoot">
-        /// If true, the elements to be bound skip the specified root element and include only the children.
-        /// </param>
-        /// <returns type="WinJS.Promise" locid="WinJS.UI.processAll_returnValue">
-        /// A promise that is fulfilled when binding has been applied to all the controls.
-        /// </returns>
-        /// </signature>
-        if (!processedAllCalled) {
-            return _BaseUtils.ready().then(function () {
-                processedAllCalled = true;
-                return processAllImpl(rootElement, skipRoot);
-            });
-        } else {
-            return processAllImpl(rootElement, skipRoot);
-        }
-    }
-
-    function process(element) {
-        /// <signature helpKeyword="WinJS.UI.process">
-        /// <summary locid="WinJS.UI.process">
-        /// Applies declarative control binding to the specified element.
-        /// </summary>
-        /// <param name="element" type="Object" domElement="true" locid="WinJS.UI.process_p:element">
-        /// The element to bind.
-        /// </param>
-        /// <returns type="WinJS.Promise" locid="WinJS.UI.process_returnValue">
-        /// A promise that is fulfilled after the control is activated. The value of the
-        /// promise is the control that is attached to element.
-        /// </returns>
-        /// </signature>
-
-        if (element && element.winControl) {
-            return Promise.as(element.winControl);
-        }
-        var handler = getControlHandler(element);
-        if (!handler) {
-            return Promise.as(); // undefined, no handler
-        } else {
-            return activate(element, handler);
-        }
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        scopedSelect: scopedSelect,
-        processAll: processAll,
-        process: process
-    });
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_ElementListUtilities',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../ControlProcessor',
-    '../Promise',
-    '../Utilities/_Control',
-    '../Utilities/_ElementUtilities'
-    ], function elementListUtilities(exports, _Global, _Base, ControlProcessor, Promise, _Control, _ElementUtilities) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Utilities", {
-        QueryCollection: _Base.Class.derive(Array, function (items) {
-            /// <signature helpKeyword="WinJS.Utilities.QueryCollection">
-            /// <summary locid="WinJS.Utilities.QueryCollection">
-            /// Represents the result of a query selector, and provides
-            /// various operations that perform actions over the elements of
-            /// the collection.
-            /// </summary>
-            /// <param name="items" locid="WinJS.Utilities.QueryCollection_p:items">
-            /// The items resulting from the query.
-            /// </param>
-            /// </signature>
-            if (items) {
-                this.include(items);
-            }
-        }, {
-            forEach: function (callbackFn, thisArg) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.forEach">
-                /// <summary locid="WinJS.Utilities.QueryCollection.forEach">
-                /// Performs an action on each item in the QueryCollection
-                /// </summary>
-                /// <param name="callbackFn" type="function(value, Number index, traversedObject)" locid="WinJS.Utilities.QueryCollection.forEach_p:callbackFn">
-                /// Action to perform on each item.
-                /// </param>
-                /// <param name="thisArg" isOptional="true" type="function(value, Number index, traversedObject)" locid="WinJS.Utilities.QueryCollection.forEach_p:thisArg">
-                /// Argument to bind to callbackFn
-                /// </param>
-                /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.QueryCollection.forEach_returnValue">
-                /// Returns the QueryCollection
-                /// </returns>
-                /// </signature>
-                Array.prototype.forEach.apply(this, [callbackFn, thisArg]);
-                return this;
-            },
-            get: function (index) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.get">
-                /// <summary locid="WinJS.Utilities.QueryCollection.get">
-                /// Gets an item from the QueryCollection.
-                /// </summary>
-                /// <param name="index" type="Number" locid="WinJS.Utilities.QueryCollection.get_p:index">
-                /// The index of the item to return.
-                /// </param>
-                /// <returns type="Object" locid="WinJS.Utilities.QueryCollection.get_returnValue">
-                /// A single item from the collection.
-                /// </returns>
-                /// </signature>
-                return this[index];
-            },
-            setAttribute: function (name, value) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.setAttribute">
-                /// <summary locid="WinJS.Utilities.QueryCollection.setAttribute">
-                /// Sets an attribute value on all the items in the collection.
-                /// </summary>
-                /// <param name="name" type="String" locid="WinJS.Utilities.QueryCollection.setAttribute_p:name">
-                /// The name of the attribute to be set.
-                /// </param>
-                /// <param name="value" type="String" locid="WinJS.Utilities.QueryCollection.setAttribute_p:value">
-                /// The value of the attribute to be set.
-                /// </param>
-                /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.QueryCollection.setAttribute_returnValue">
-                /// This QueryCollection object.
-                /// </returns>
-                /// </signature>
-                this.forEach(function (item) {
-                    item.setAttribute(name, value);
-                });
-                return this;
-            },
-            getAttribute: function (name) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.getAttribute">
-                /// <summary locid="WinJS.Utilities.QueryCollection.getAttribute">
-                /// Gets an attribute value from the first element in the collection.
-                /// </summary>
-                /// <param name="name" type="String" locid="WinJS.Utilities.QueryCollection.getAttribute_p:name">
-                /// The name of the attribute.
-                /// </param>
-                /// <returns type="String" locid="WinJS.Utilities.QueryCollection.getAttribute_returnValue">
-                /// The value of the attribute.
-                /// </returns>
-                /// </signature>
-                if (this.length > 0) {
-                    return this[0].getAttribute(name);
-                }
-            },
-            addClass: function (name) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.addClass">
-                /// <summary locid="WinJS.Utilities.QueryCollection.addClass">
-                /// Adds the specified class to all the elements in the collection.
-                /// </summary>
-                /// <param name="name" type="String" locid="WinJS.Utilities.QueryCollection.addClass_p:name">
-                /// The name of the class to add.
-                /// </param>
-                /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.QueryCollection.addClass_returnValue">
-                /// This QueryCollection object.
-                /// </returns>
-                /// </signature>
-                this.forEach(function (item) {
-                    _ElementUtilities.addClass(item, name);
-                });
-                return this;
-            },
-            hasClass: function (name) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.hasClass">
-                /// <summary locid="WinJS.Utilities.QueryCollection.hasClass">
-                /// Determines whether the specified class exists on the first element of the collection.
-                /// </summary>
-                /// <param name="name" type="String" locid="WinJS.Utilities.QueryCollection.hasClass_p:name">
-                /// The name of the class.
-                /// </param>
-                /// <returns type="Boolean" locid="WinJS.Utilities.QueryCollection.hasClass_returnValue">
-                /// true if the element has the specified class; otherwise, false.
-                /// </returns>
-                /// </signature>
-                if (this.length > 0) {
-                    return _ElementUtilities.hasClass(this[0], name);
-                }
-                return false;
-            },
-            removeClass: function (name) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.removeClass">
-                /// <summary locid="WinJS.Utilities.QueryCollection.removeClass">
-                /// Removes the specified class from all the elements in the collection.
-                /// </summary>
-                /// <param name="name" type="String" locid="WinJS.Utilities.QueryCollection.removeClass_p:name">
-                /// The name of the class to be removed.
-                /// </param>
-                /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.QueryCollection.removeClass_returnValue">
-                /// This QueryCollection object.
-                /// </returns>
-                /// </signature>
-                this.forEach(function (item) {
-                    _ElementUtilities.removeClass(item, name);
-                });
-                return this;
-            },
-            toggleClass: function (name) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.toggleClass">
-                /// <summary locid="WinJS.Utilities.QueryCollection.toggleClass">
-                /// Toggles (adds or removes) the specified class on all the elements in the collection.
-                /// If the class is present, it is removed; if it is absent, it is added.
-                /// </summary>
-                /// <param name="name" type="String" locid="WinJS.Utilities.QueryCollection.toggleClass_p:name">
-                /// The name of the class to be toggled.
-                /// </param>
-                /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.QueryCollection.toggleClass_returnValue">
-                /// This QueryCollection object.
-                /// </returns>
-                /// </signature>
-                this.forEach(function (item) {
-                    _ElementUtilities.toggleClass(item, name);
-                });
-                return this;
-            },
-            listen: function (eventType, listener, capture) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.listen">
-                /// <summary locid="WinJS.Utilities.QueryCollection.listen">
-                /// Registers the listener for the specified event on all the elements in the collection.
-                /// </summary>
-                /// <param name="eventType" type="String" locid="WinJS.Utilities.QueryCollection.listen_p:eventType">
-                /// The name of the event.
-                /// </param>
-                /// <param name="listener" type="Function" locid="WinJS.Utilities.QueryCollection.listen_p:listener">
-                /// The event handler function to be called when the event occurs.
-                /// </param>
-                /// <param name="capture" type="Boolean" locid="WinJS.Utilities.QueryCollection.listen_p:capture">
-                /// true if capture == true is to be passed to addEventListener; otherwise, false.
-                /// </param>
-                /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.QueryCollection.listen_returnValue">
-                /// This QueryCollection object.
-                /// </returns>
-                /// </signature>
-                this.forEach(function (item) {
-                    item.addEventListener(eventType, listener, capture);
-                });
-                return this;
-            },
-            removeEventListener: function (eventType, listener, capture) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.removeEventListener">
-                /// <summary locid="WinJS.Utilities.QueryCollection.removeEventListener">
-                /// Unregisters the listener for the specified event on all the elements in the collection.
-                /// </summary>
-                /// <param name="eventType" type="String" locid="WinJS.Utilities.QueryCollection.removeEventListener_p:eventType">
-                /// The name of the event.
-                /// </param>
-                /// <param name="listener" type="Function" locid="WinJS.Utilities.QueryCollection.removeEventListener_p:listener">
-                /// The event handler function.
-                /// </param>
-                /// <param name="capture" type="Boolean" locid="WinJS.Utilities.QueryCollection.removeEventListener_p:capture">
-                /// true if capture == true; otherwise, false.
-                /// </param>
-                /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.QueryCollection.removeEventListener_returnValue">
-                /// This QueryCollection object.
-                /// </returns>
-                /// </signature>
-                this.forEach(function (item) {
-                    item.removeEventListener(eventType, listener, capture);
-                });
-                return this;
-            },
-            setStyle: function (name, value) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.setStyle">
-                /// <summary locid="WinJS.Utilities.QueryCollection.setStyle">
-                /// Sets the specified style property for all the elements in the collection.
-                /// </summary>
-                /// <param name="name" type="String" locid="WinJS.Utilities.QueryCollection.setStyle_p:name">
-                /// The name of the style property.
-                /// </param>
-                /// <param name="value" type="String" locid="WinJS.Utilities.QueryCollection.setStyle_p:value">
-                /// The value for the property.
-                /// </param>
-                /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.QueryCollection.setStyle_returnValue">
-                /// This QueryCollection object.
-                /// </returns>
-                /// </signature>
-                this.forEach(function (item) {
-                    item.style[name] = value;
-                });
-                return this;
-            },
-            clearStyle: function (name) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.clearStyle">
-                /// <summary locid="WinJS.Utilities.QueryCollection.clearStyle">
-                /// Clears the specified style property for all the elements in the collection.
-                /// </summary>
-                /// <param name="name" type="String" locid="WinJS.Utilities.QueryCollection.clearStyle_p:name">
-                /// The name of the style property to be cleared.
-                /// </param>
-                /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.QueryCollection.clearStyle_returnValue">
-                /// This QueryCollection object.
-                /// </returns>
-                /// </signature>
-                this.forEach(function (item) {
-                    item.style[name] = "";
-                });
-                return this;
-            },
-            query: function (query) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.query">
-                /// <summary locid="WinJS.Utilities.QueryCollection.query">
-                /// Executes a query selector on all the elements in the collection
-                /// and aggregates the result into a QueryCollection.
-                /// </summary>
-                /// <param name="query" type="String" locid="WinJS.Utilities.QueryCollection.query_p:query">
-                /// The query selector string.
-                /// </param>
-                /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.QueryCollection.query_returnValue">
-                /// A QueryCollection object containing the aggregate results of
-                /// executing the query on all the elements in the collection.
-                /// </returns>
-                /// </signature>
-                var newCollection = new exports.QueryCollection();
-                this.forEach(function (item) {
-                    newCollection.include(item.querySelectorAll(query));
-                });
-                return newCollection;
-            },
-            include: function (items) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.include">
-                /// <summary locid="WinJS.Utilities.QueryCollection.include">
-                /// Adds a set of items to this QueryCollection.
-                /// </summary>
-                /// <param name="items" locid="WinJS.Utilities.QueryCollection.include_p:items">
-                /// The items to add to the QueryCollection. This may be an
-                /// array-like object, a document fragment, or a single item.
-                /// </param>
-                /// </signature>
-                if (typeof items.length === "number") {
-                    for (var i = 0; i < items.length; i++) {
-                        this.push(items[i]);
-                    }
-                } else if (items.DOCUMENT_FRAGMENT_NODE && items.nodeType === items.DOCUMENT_FRAGMENT_NODE) {
-                    this.include(items.childNodes);
-                } else {
-                    this.push(items);
-                }
-            },
-            control: function (Ctor, options) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.control">
-                /// <summary locid="WinJS.Utilities.QueryCollection.control">
-                /// Creates controls that are attached to the elements in this QueryCollection.
-                /// </summary>
-                /// <param name='Ctor' locid="WinJS.Utilities.QueryCollection.control_p:ctor">
-                /// A constructor function that is used to create controls to attach to the elements.
-                /// </param>
-                /// <param name='options' locid="WinJS.Utilities.QueryCollection.control_p:options">
-                /// The options passed to the newly-created controls.
-                /// </param>
-                /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.QueryCollection.control_returnValue">
-                /// This QueryCollection object.
-                /// </returns>
-                /// </signature>
-                /// <signature>
-                /// <summary locid="WinJS.Utilities.QueryCollection.control2">
-                /// Configures the controls that are attached to the elements in this QueryCollection.
-                /// </summary>
-                /// <param name='ctor' locid="WinJS.Utilities.QueryCollection.control_p:ctor2">
-                /// The options passed to the controls.
-                /// </param>
-                /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.QueryCollection.control_returnValue2">
-                /// This QueryCollection object.
-                /// </returns>
-                /// </signature>
-
-                if (Ctor && typeof (Ctor) === "function") {
-                    this.forEach(function (element) {
-                        element.winControl = new Ctor(element, options);
-                    });
-                } else {
-                    options = Ctor;
-                    this.forEach(function (element) {
-                        ControlProcessor.process(element).done(function (control) {
-                            control && _Control.setOptions(control, options);
-                        });
-                    });
-                }
-                return this;
-            },
-            template: function (templateElement, data, renderDonePromiseCallback) {
-                /// <signature helpKeyword="WinJS.Utilities.QueryCollection.template">
-                /// <summary locid="WinJS.Utilities.QueryCollection.template">
-                /// Renders a template that is bound to the given data
-                /// and parented to the elements included in the QueryCollection.
-                /// If the QueryCollection contains multiple elements, the template
-                /// is rendered multiple times, once at each element in the QueryCollection
-                /// per item of data passed.
-                /// </summary>
-                /// <param name="templateElement" type="DOMElement" locid="WinJS.Utilities.QueryCollection.template_p:templateElement">
-                /// The DOM element to which the template control is attached to.
-                /// </param>
-                /// <param name="data" type="Object" locid="WinJS.Utilities.QueryCollection.template_p:data">
-                /// The data to render. If the data is an array (or any other object
-                /// that has a forEach method) then the template is rendered
-                /// multiple times, once for each item in the collection.
-                /// </param>
-                /// <param name="renderDonePromiseCallback" type="Function" locid="WinJS.Utilities.QueryCollection.template_p:renderDonePromiseCallback">
-                /// If supplied, this function is called
-                /// each time the template gets rendered, and is passed a promise
-                /// that is fulfilled when the template rendering is complete.
-                /// </param>
-                /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.QueryCollection.template_returnValue">
-                /// The QueryCollection.
-                /// </returns>
-                /// </signature>
-                if (templateElement instanceof exports.QueryCollection) {
-                    templateElement = templateElement[0];
-                }
-                var template = templateElement.winControl;
-
-                if (data === null || data === undefined || !data.forEach) {
-                    data = [data];
-                }
-
-                renderDonePromiseCallback = renderDonePromiseCallback || function () { };
-
-                var that = this;
-                var donePromises = [];
-                data.forEach(function (datum) {
-                    that.forEach(function (element) {
-                        donePromises.push(template.render(datum, element));
-                    });
-                });
-                renderDonePromiseCallback(Promise.join(donePromises));
-
-                return this;
-            }
-        }, {
-            supportedForProcessing: false,
-        }),
-
-        query: function (query, element) {
-            /// <signature helpKeyword="WinJS.Utilities.query">
-            /// <summary locid="WinJS.Utilities.query">
-            /// Executes a query selector on the specified element or the entire document.
-            /// </summary>
-            /// <param name="query" type="String" locid="WinJS.Utilities.query_p:query">
-            /// The query selector to be executed.
-            /// </param>
-            /// <param name="element" optional="true" type="HTMLElement" locid="WinJS.Utilities.query_p:element">
-            /// The element on which to execute the query. If this parameter is not specified, the
-            /// query is executed on the entire document.
-            /// </param>
-            /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.query_returnValue">
-            /// The QueryCollection that contains the results of the query.
-            /// </returns>
-            /// </signature>
-            return new exports.QueryCollection((element || _Global.document).querySelectorAll(query));
-        },
-
-        id: function (id) {
-            /// <signature helpKeyword="WinJS.Utilities.id">
-            /// <summary locid="WinJS.Utilities.id">
-            /// Looks up an element by ID and wraps the result in a QueryCollection.
-            /// </summary>
-            /// <param name="id" type="String" locid="WinJS.Utilities.id_p:id">
-            /// The ID of the element.
-            /// </param>
-            /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.id_returnValue">
-            /// A QueryCollection that contains the element, if it is found.
-            /// </returns>
-            /// </signature>
-            var e = _Global.document.getElementById(id);
-            return new exports.QueryCollection(e ? [e] : []);
-        },
-
-        children: function (element) {
-            /// <signature helpKeyword="WinJS.Utilities.children">
-            /// <summary locid="WinJS.Utilities.children">
-            /// Creates a QueryCollection that contains the children of the specified parent element.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.children_p:element">
-            /// The parent element.
-            /// </param>
-            /// <returns type="WinJS.Utilities.QueryCollection" locid="WinJS.Utilities.children_returnValue">
-            /// The QueryCollection that contains the children of the element.
-            /// </returns>
-            /// </signature>
-            return new exports.QueryCollection(element.children);
-        }
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_Hoverable',[
-    'exports',
-    '../Core/_Global'
-], function hoverable(exports, _Global) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-
-    _Global.document.documentElement.classList.add("win-hoverable");
-    exports.isHoverable = true;
-
-    if (!_Global.MSPointerEvent) {
-        var touchStartHandler = function () {
-            _Global.document.removeEventListener("touchstart", touchStartHandler);
-            // Remove win-hoverable CSS class fromstartt . <html> to avoid :hover styles in webkit when there is
-            // touch support.
-            _Global.document.documentElement.classList.remove("win-hoverable");
-            exports.isHoverable = false;
-        };
-
-        _Global.document.addEventListener("touchstart", touchStartHandler);
-    }
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_ParallelWorkQueue',[
-    'exports',
-    '../Core/_Base',
-    '../Promise',
-    '../Scheduler'
-    ], function parallelWorkQueueInit(exports, _Base, Promise, Scheduler) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _ParallelWorkQueue : _Base.Namespace._lazy(function () {
-            return _Base.Class.define(function ParallelWorkQueue_ctor(maxRunning) {
-                var workIndex = 0;
-                var workItems = {};
-                var workQueue = [];
-
-                maxRunning = maxRunning || 3;
-                var running = 0;
-                var processing = 0;
-                function runNext() {
-                    running--;
-                    // if we have fallen out of this loop, then we know we are already
-                    // async, so "post" is OK. If we are still in the loop, then the
-                    // loop will continue to run, so we don't need to "post" or
-                    // recurse. This avoids stack overflow in the sync case.
-                    //
-                    if (!processing) {
-                        Scheduler.schedule(run, Scheduler.Priority.normal,
-                            null, "WinJS._ParallelWorkQueue.runNext");
-                    }
-                }
-                function run() {
-                    processing++;
-                    for (; running < maxRunning; running++) {
-                        var next;
-                        var nextWork;
-                        do {
-                            next = workQueue.shift();
-                            nextWork = next && workItems[next];
-                        } while (next && !nextWork);
-
-                        if (nextWork) {
-                            delete workItems[next];
-                            try {
-                                nextWork().then(runNext, runNext);
-                            }
-                            catch (err) {
-                                // this will only get hit if there is a queued item that
-                                // fails to return something that conforms to the Promise
-                                // contract
-                                //
-                                runNext();
-                            }
-                        } else {
-                            break;
-                        }
-                    }
-                    processing--;
-                }
-                function queue(f, data, first) {
-                    var id = "w" + (workIndex++);
-                    var workPromise;
-                    return new Promise(
-                        function (c, e, p) {
-                            var w = function () {
-                                workPromise = f().then(c, e, p);
-                                return workPromise;
-                            };
-                            w.data = data;
-                            workItems[id] = w;
-                            if (first) {
-                                workQueue.unshift(id);
-                            } else {
-                                workQueue.push(id);
-                            }
-                            run();
-                        },
-                        function () {
-                            delete workItems[id];
-                            if (workPromise) {
-                                workPromise.cancel();
-                            }
-                        }
-                    );
-                }
-
-                this.sort = function (f) {
-                    workQueue.sort(function (a, b) {
-                        a = workItems[a];
-                        b = workItems[b];
-                        return a === undefined && b === undefined ? 0 : a === undefined ? 1 : b === undefined ? -1 : f(a.data, b.data);
-                    });
-                };
-                this.queue = queue;
-            }, {
-                /* empty */
-            }, {
-                supportedForProcessing: false,
-            });
-        })
-    });
-
-});
-
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_VersionManager',[
-    'exports',
-    '../Core/_Base',
-    '../_Signal'
-    ], function versionManagerInit(exports, _Base, _Signal) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _VersionManager: _Base.Namespace._lazy(function () {
-            return _Base.Class.define(function _VersionManager_ctor() {
-                this._unlocked = new _Signal();
-                this._unlocked.complete();
-            }, {
-                _cancelCount: 0,
-                _notificationCount: 0,
-                _updateCount: 0,
-                _version: 0,
-
-                // This should be used generally for all logic that should be suspended while data changes are happening
-                //
-                locked: { get: function () { return this._notificationCount !== 0 || this._updateCount !== 0; } },
-
-                // this should only be accessed by the update logic in ListViewImpl.js
-                //
-                noOutstandingNotifications: { get: function () { return this._notificationCount === 0; } },
-                version: { get: function () { return this._version; } },
-
-                unlocked: { get: function () { return this._unlocked.promise; } },
-
-                _dispose: function () {
-                    if (this._unlocked) {
-                        this._unlocked.cancel();
-                        this._unlocked = null;
-                    }
-                },
-
-                beginUpdating: function () {
-                    this._checkLocked();
-                    this._updateCount++;
-                },
-                endUpdating: function () {
-                    this._updateCount--;
-                    this._checkUnlocked();
-                },
-                beginNotifications: function () {
-                    this._checkLocked();
-                    this._notificationCount++;
-                },
-                endNotifications: function () {
-                    this._notificationCount--;
-                    this._checkUnlocked();
-                },
-                _checkLocked: function () {
-                    if (!this.locked) {
-                        this._dispose();
-                        this._unlocked = new _Signal();
-                    }
-                },
-                _checkUnlocked: function () {
-                    if (!this.locked) {
-                        this._unlocked.complete();
-                    }
-                },
-                receivedNotification: function () {
-                    this._version++;
-                    if (this._cancel) {
-                        var cancel = this._cancel;
-                        this._cancel = null;
-                        cancel.forEach(function (p) { p && p.cancel(); });
-                    }
-                },
-                cancelOnNotification: function (promise) {
-                    if (!this._cancel) {
-                        this._cancel = [];
-                        this._cancelCount = 0;
-                    }
-                    this._cancel[this._cancelCount++] = promise;
-                    return this._cancelCount - 1;
-                },
-                clearCancelOnNotification: function (token) {
-                    if (this._cancel) {
-                        delete this._cancel[token];
-                    }
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-        })
-    });
-
-});
-
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// Items Manager
-
-define('WinJS/Utilities/_ItemsManager',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../Promise',
-    '../_Signal',
-    '../Scheduler',
-    '../Utilities/_ElementUtilities',
-    './_ParallelWorkQueue',
-    './_VersionManager'
-    ], function itemsManagerInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Resources, _WriteProfilerMark, Promise, _Signal, Scheduler, _ElementUtilities, _ParallelWorkQueue, _VersionManager) {
-    "use strict";
-
-    var markSupportedForProcessing = _BaseUtils.markSupportedForProcessing;
-    var uniqueID = _ElementUtilities._uniqueID;
-
-    function simpleItemRenderer(f) {
-        return markSupportedForProcessing(function (itemPromise, element) {
-            return itemPromise.then(function (item) {
-                return (item ? f(item, element) : null);
-            });
-        });
-    }
-
-    var trivialHtmlRenderer = simpleItemRenderer(function (item) {
-        if (_ElementUtilities._isDOMElement(item.data)) {
-            return item.data;
-        }
-
-        var data = item.data;
-        if (data === undefined) {
-            data = "undefined";
-        } else if (data === null) {
-            data = "null";
-        } else if (typeof data === "object") {
-            data = JSON.stringify(data);
-        }
-
-        var element = _Global.document.createElement("span");
-        element.textContent = data.toString();
-        return element;
-    });
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _normalizeRendererReturn: function (v) {
-            if (v) {
-                if (typeof v === "object" && v.element) {
-                    var elementPromise = Promise.as(v.element);
-                    return elementPromise.then(function (e) { return { element: e, renderComplete: Promise.as(v.renderComplete) }; });
-                } else {
-                    var elementPromise = Promise.as(v);
-                    return elementPromise.then(function (e) { return { element: e, renderComplete: Promise.as() }; });
-                }
-            } else {
-                return { element: null, renderComplete: Promise.as() };
-            }
-        },
-        simpleItemRenderer: simpleItemRenderer,
-        _trivialHtmlRenderer: trivialHtmlRenderer
-    });
-
-    // Private statics
-
-    var strings = {
-        get listDataSourceIsInvalid() { return "Invalid argument: dataSource must be an object."; },
-        get itemRendererIsInvalid() { return "Invalid argument: itemRenderer must be a function."; },
-        get itemIsInvalid() { return "Invalid argument: item must be a DOM element that was returned by the Items Manager, and has not been replaced or released."; },
-    };
-
-    var imageLoader;
-    var lastSort = new Date();
-    var minDurationBetweenImageSort = 64;
-
-    // This optimization is good for a couple of reasons:
-    // - It is a global optimizer, which means that all on screen images take precedence over all off screen images.
-    // - It avoids resorting too frequently by only resorting when a new image loads and it has been at least 64 ms since
-    //   the last sort.
-    // Also, it is worth noting that "sort" on an empty queue does no work (besides the function call).
-    function compareImageLoadPriority(a, b) {
-        var aon = false;
-        var bon = false;
-
-        // Currently isOnScreen is synchronous and fast for list view
-        a.isOnScreen().then(function (v) { aon = v; });
-        b.isOnScreen().then(function (v) { bon = v; });
-
-        return (aon ? 0 : 1) - (bon ? 0 : 1);
-    }
-
-    var nextImageLoaderId = 0;
-    var seenUrls = {};
-    var seenUrlsMRU = [];
-    var SEEN_URLS_MAXSIZE = 250;
-    var SEEN_URLS_MRU_MAXSIZE = 1000;
-
-    function seenUrl(srcUrl) {
-        if ((/^blob:/i).test(srcUrl)) {
-            return;
-        }
-
-        seenUrls[srcUrl] = true;
-        seenUrlsMRU.push(srcUrl);
-
-        if (seenUrlsMRU.length > SEEN_URLS_MRU_MAXSIZE) {
-            var mru = seenUrlsMRU;
-            seenUrls = {};
-            seenUrlsMRU = [];
-
-            for (var count = 0, i = mru.length - 1; i >= 0 && count < SEEN_URLS_MAXSIZE; i--) {
-                var url = mru[i];
-                if (!seenUrls[url]) {
-                    seenUrls[url] = true;
-                    count++;
-                }
-            }
-        }
-    }
-
-    // Exposing the seenUrl related members to use them in unit tests
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _seenUrl: seenUrl,
-        _getSeenUrls: function () {
-            return seenUrls;
-        },
-        _getSeenUrlsMRU: function () {
-            return seenUrlsMRU;
-        },
-        _seenUrlsMaxSize: SEEN_URLS_MAXSIZE,
-        _seenUrlsMRUMaxSize: SEEN_URLS_MRU_MAXSIZE
-    });
-
-    function loadImage(srcUrl, image, data) {
-        var imageId = nextImageLoaderId++;
-        imageLoader = imageLoader || new _ParallelWorkQueue._ParallelWorkQueue(6);
-        return imageLoader.queue(function () {
-            return new Promise(function (c, e) {
-                Scheduler.schedule(function ImageLoader_async_loadImage(jobInfo) {
-                    if (!image) {
-                        image = _Global.document.createElement("img");
-                    }
-
-                    var seen = seenUrls[srcUrl];
-
-                    if (!seen) {
-                        jobInfo.setPromise(new Promise(function (imageLoadComplete) {
-                            var tempImage = _Global.document.createElement("img");
-
-                            var cleanup = function () {
-                                tempImage.removeEventListener("load", loadComplete, false);
-                                tempImage.removeEventListener("error", loadError, false);
-
-                                // One time use blob images are cleaned up as soon as they are not referenced by images any longer.
-                                // We set the image src before clearing the tempImage src to make sure the blob image is always
-                                // referenced.
-                                image.src = srcUrl;
-
-                                var currentDate = new Date();
-                                if (currentDate - lastSort > minDurationBetweenImageSort) {
-                                    lastSort = currentDate;
-                                    imageLoader.sort(compareImageLoadPriority);
-                                }
-                            };
-
-                            var loadComplete = function () {
-                                imageLoadComplete(jobComplete);
-                            };
-                            var loadError = function () {
-                                imageLoadComplete(jobError);
-                            };
-
-                            var jobComplete = function () {
-                                seenUrl(srcUrl);
-                                cleanup();
-                                c(image);
-                            };
-                            var jobError = function () {
-                                cleanup();
-                                e(image);
-                            };
-
-                            tempImage.addEventListener("load", loadComplete, false);
-                            tempImage.addEventListener("error", loadError, false);
-                            tempImage.src = srcUrl;
-                        }));
-                    } else {
-                        seenUrl(srcUrl);
-                        image.src = srcUrl;
-                        c(image);
-                    }
-                }, Scheduler.Priority.normal, null, "WinJS.UI._ImageLoader._image" + imageId);
-            });
-        }, data);
-    }
-
-    function isImageCached(srcUrl) {
-        return seenUrls[srcUrl];
-    }
-
-    function defaultRenderer() {
-        return _Global.document.createElement("div");
-    }
-
-    // Public definitions
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _createItemsManager: _Base.Namespace._lazy(function () {
-            var ListNotificationHandler = _Base.Class.define(function ListNotificationHandler_ctor(itemsManager) {
-                // Constructor
-
-                this._itemsManager = itemsManager;
-            }, {
-                // Public methods
-
-                beginNotifications: function () {
-                    this._itemsManager._versionManager.beginNotifications();
-                    this._itemsManager._beginNotifications();
-                },
-
-                // itemAvailable: not implemented
-
-                inserted: function (itemPromise, previousHandle, nextHandle) {
-                    this._itemsManager._versionManager.receivedNotification();
-                    this._itemsManager._inserted(itemPromise, previousHandle, nextHandle);
-                },
-
-                changed: function (newItem, oldItem) {
-                    this._itemsManager._versionManager.receivedNotification();
-                    this._itemsManager._changed(newItem, oldItem);
-                },
-
-                moved: function (itemPromise, previousHandle, nextHandle) {
-                    this._itemsManager._versionManager.receivedNotification();
-                    this._itemsManager._moved(itemPromise, previousHandle, nextHandle);
-                },
-
-                removed: function (handle, mirage) {
-                    this._itemsManager._versionManager.receivedNotification();
-                    this._itemsManager._removed(handle, mirage);
-                },
-
-                countChanged: function (newCount, oldCount) {
-                    this._itemsManager._versionManager.receivedNotification();
-                    this._itemsManager._countChanged(newCount, oldCount);
-                },
-
-                indexChanged: function (handle, newIndex, oldIndex) {
-                    this._itemsManager._versionManager.receivedNotification();
-                    this._itemsManager._indexChanged(handle, newIndex, oldIndex);
-                },
-
-                affectedRange: function (range) {
-                    this._itemsManager._versionManager.receivedNotification();
-                    this._itemsManager._affectedRange(range);
-                },
-
-                endNotifications: function () {
-                    this._itemsManager._versionManager.endNotifications();
-                    this._itemsManager._endNotifications();
-                },
-
-                reload: function () {
-                    this._itemsManager._versionManager.receivedNotification();
-                    this._itemsManager._reload();
-                }
-            }, { // Static Members
-                supportedForProcessing: false,
-            });
-
-            var ItemsManager = _Base.Class.define(function ItemsManager_ctor(listDataSource, itemRenderer, elementNotificationHandler, options) {
-                // Constructor
-
-                if (!listDataSource) {
-                    throw new _ErrorFromName("WinJS.UI.ItemsManager.ListDataSourceIsInvalid", strings.listDataSourceIsInvalid);
-                }
-                if (!itemRenderer) {
-                    throw new _ErrorFromName("WinJS.UI.ItemsManager.ItemRendererIsInvalid", strings.itemRendererIsInvalid);
-                }
-
-                this.$pipeline_callbacksMap = {};
-
-                this._listDataSource = listDataSource;
-
-                this.dataSource = this._listDataSource;
-
-                this._elementNotificationHandler = elementNotificationHandler;
-
-                this._listBinding = this._listDataSource.createListBinding(new ListNotificationHandler(this));
-
-                if (options) {
-                    if (options.ownerElement) {
-                        this._ownerElement = options.ownerElement;
-                    }
-                    this._profilerId = options.profilerId;
-                    this._versionManager = options.versionManager || new _VersionManager._VersionManager();
-                }
-
-                this._indexInView = options && options.indexInView;
-                this._itemRenderer = itemRenderer;
-                this._viewCallsReady = options && options.viewCallsReady;
-
-                // Map of (the uniqueIDs of) elements to records for items
-                this._elementMap = {};
-
-                // Map of handles to records for items
-                this._handleMap = {};
-
-                // Owner for use with jobs on the scheduler. Allows for easy cancellation of jobs during clean up.
-                this._jobOwner = Scheduler.createOwnerToken();
-
-                // Boolean to track whether endNotifications needs to be called on the ElementNotificationHandler
-                this._notificationsSent = false;
-
-                // Only enable the lastItem method if the data source implements the itemsFromEnd method
-                if (this._listBinding.last) {
-                    this.lastItem = function () {
-                        return this._elementForItem(this._listBinding.last());
-                    };
-                }
-            }, {
-                _itemFromItemPromise: function (itemPromise) {
-                    return this._waitForElement(this._elementForItem(itemPromise));
-                },
-                // If stage 0 is not yet complete, caller is responsible for transitioning the item from stage 0 to stage 1
-                _itemFromItemPromiseThrottled: function (itemPromise) {
-                    return this._waitForElement(this._elementForItem(itemPromise, true));
-                },
-                _itemAtIndex: function (index) {
-                    var itemPromise = this._itemPromiseAtIndex(index);
-                    this._itemFromItemPromise(itemPromise).then(null, function (e) {
-                        itemPromise.cancel();
-                        return Promise.wrapError(e);
-                    });
-                },
-                _itemPromiseAtIndex: function (index) {
-                    return this._listBinding.fromIndex(index);
-                },
-                _waitForElement: function (possiblePlaceholder) {
-                    var that = this;
-                    return new Promise(function (c) {
-                        if (possiblePlaceholder) {
-                            if (!that.isPlaceholder(possiblePlaceholder)) {
-                                c(possiblePlaceholder);
-                            } else {
-                                var placeholderID = uniqueID(possiblePlaceholder);
-                                var callbacks = that.$pipeline_callbacksMap[placeholderID];
-                                if (!callbacks) {
-                                    that.$pipeline_callbacksMap[placeholderID] = [c];
-                                } else {
-                                    callbacks.push(c);
-                                }
-                            }
-                        } else {
-                            c(possiblePlaceholder);
-                        }
-                    });
-                },
-                _updateElement: function (newElement, oldElement) {
-                    var placeholderID = uniqueID(oldElement);
-                    var callbacks = this.$pipeline_callbacksMap[placeholderID];
-                    if (callbacks) {
-                        delete this.$pipeline_callbacksMap[placeholderID];
-                        callbacks.forEach(function (c) { c(newElement); });
-                    }
-                },
-                _firstItem: function () {
-                    return this._waitForElement(this._elementForItem(this._listBinding.first()));
-                },
-                _lastItem: function () {
-                    return this._waitForElement(this._elementForItem(this._listBinding.last()));
-                },
-                _previousItem: function (element) {
-                    this._listBinding.jumpToItem(this._itemFromElement(element));
-                    return this._waitForElement(this._elementForItem(this._listBinding.previous()));
-                },
-                _nextItem: function (element) {
-                    this._listBinding.jumpToItem(this._itemFromElement(element));
-                    return this._waitForElement(this._elementForItem(this._listBinding.next()));
-                },
-                _itemFromPromise: function (itemPromise) {
-                    return this._waitForElement(this._elementForItem(itemPromise));
-                },
-                isPlaceholder: function (item) {
-                    return !!this._recordFromElement(item).elementIsPlaceholder;
-                },
-
-                itemObject: function (element) {
-                    return this._itemFromElement(element);
-                },
-
-                release: function () {
-                    this._listBinding.release();
-                    this._elementNotificationHandler = null;
-                    this._listBinding = null;
-                    this._jobOwner.cancelAll();
-                    this._released = true;
-                },
-
-                releaseItemPromise: function (itemPromise) {
-                    var handle = itemPromise.handle;
-                    var record = this._handleMap[handle];
-                    if (!record) {
-                        // The item promise is not in our handle map so we didn't even try to render it yet.
-                        itemPromise.cancel();
-                    } else {
-                        this._releaseRecord(record);
-                    }
-                },
-
-                releaseItem: function (element) {
-                    var record = this._elementMap[uniqueID(element)];
-                    this._releaseRecord(record);
-                },
-
-                _releaseRecord: function (record) {
-                    if (!record) { return; }
-
-                    if (record.renderPromise) {
-                        record.renderPromise.cancel();
-                    }
-                    if (record.itemPromise) {
-                        record.itemPromise.cancel();
-                    }
-                    if (record.imagePromises) {
-                        record.imagePromises.forEach(function (promise) {
-                            promise.cancel();
-                        });
-                    }
-                    if (record.itemReadyPromise) {
-                        record.itemReadyPromise.cancel();
-                    }
-                    if (record.renderComplete) {
-                        record.renderComplete.cancel();
-                    }
-
-                    this._removeEntryFromElementMap(record.element);
-                    this._removeEntryFromHandleMap(record.itemPromise.handle, record);
-
-                    if (record.item) {
-                        this._listBinding.releaseItem(record.item);
-                    }
-
-                },
-
-                refresh: function () {
-                    return this._listDataSource.invalidateAll();
-                },
-
-                // Private members
-
-                _handlerToNotifyCaresAboutItemAvailable: function () {
-                    return !!(this._elementNotificationHandler && this._elementNotificationHandler.itemAvailable);
-                },
-
-                _handlerToNotify: function () {
-                    if (!this._notificationsSent) {
-                        this._notificationsSent = true;
-
-                        if (this._elementNotificationHandler && this._elementNotificationHandler.beginNotifications) {
-                            this._elementNotificationHandler.beginNotifications();
-                        }
-                    }
-                    return this._elementNotificationHandler;
-                },
-
-                _defineIndexProperty: function (itemForRenderer, item, record) {
-                    record.indexObserved = false;
-                    Object.defineProperty(itemForRenderer, "index", {
-                        get: function () {
-                            record.indexObserved = true;
-                            return item.index;
-                        }
-                    });
-                },
-
-                _renderPlaceholder: function (record) {
-                    var itemForRenderer = {};
-                    var elementPlaceholder = defaultRenderer(itemForRenderer);
-                    record.elementIsPlaceholder = true;
-                    return elementPlaceholder;
-                },
-
-                _renderItem: function (itemPromise, record, callerThrottlesStage1) {
-                    var that = this;
-                    var indexInView = that._indexInView || function () { return true; };
-                    var stage1Signal = new _Signal();
-                    var readySignal = new _Signal();
-                    var perfItemPromiseId = "_renderItem(" + record.item.index + "):itemPromise";
-
-                    var stage0RunningSync = true;
-                    var stage0Ran = false;
-                    itemPromise.then(function (item) {
-                        stage0Ran = true;
-                        if (stage0RunningSync) {
-                            stage1Signal.complete(item);
-                        }
-                    });
-                    stage0RunningSync = false;
-
-                    var itemForRendererPromise = stage1Signal.promise.then(function (item) {
-                        if (item) {
-                            var itemForRenderer = Object.create(item);
-                            // Derive a new item and override its index property, to track whether it is read
-                            that._defineIndexProperty(itemForRenderer, item, record);
-                            itemForRenderer.ready = readySignal.promise;
-                            itemForRenderer.isOnScreen = function () {
-                                return Promise.wrap(indexInView(item.index));
-                            };
-                            itemForRenderer.loadImage = function (srcUrl, image) {
-                                var loadImagePromise = loadImage(srcUrl, image, itemForRenderer);
-                                if (record.imagePromises) {
-                                    record.imagePromises.push(loadImagePromise);
-                                } else {
-                                    record.imagePromises = [loadImagePromise];
-                                }
-                                return loadImagePromise;
-                            };
-                            itemForRenderer.isImageCached = isImageCached;
-                            return itemForRenderer;
-                        } else {
-                            return Promise.cancel;
-                        }
-                    });
-
-                    function queueAsyncStage1() {
-                        itemPromise.then(function (item) {
-                            that._writeProfilerMark(perfItemPromiseId + ",StartTM");
-                            stage1Signal.complete(item);
-                            that._writeProfilerMark(perfItemPromiseId + ",StopTM");
-                        });
-                    }
-                    if (!stage0Ran) {
-                        if (callerThrottlesStage1) {
-                            record.stage0 = itemPromise;
-                            record.startStage1 = function () {
-                                record.startStage1 = null;
-                                queueAsyncStage1();
-                            };
-                        } else {
-                            queueAsyncStage1();
-                        }
-                    }
-
-                    itemForRendererPromise.handle = itemPromise.handle;
-                    record.itemPromise = itemForRendererPromise;
-                    record.itemReadyPromise = readySignal.promise;
-                    record.readyComplete = false;
-
-                    // perfRendererWorkId = stage 1 rendering (if itemPromise is async) or stage 1+2 (if itemPromise is sync and ran inline)
-                    // perfItemPromiseId = stage 2 rendering only (should only be emitted if itemPromise was async)
-                    // perfItemReadyId = stage 3 rendering
-                    var perfRendererWorkId = "_renderItem(" + record.item.index + (stage0Ran ? "):syncItemPromise" : "):placeholder");
-                    var perfItemReadyId = "_renderItem(" + record.item.index + "):itemReady";
-
-                    this._writeProfilerMark(perfRendererWorkId + ",StartTM");
-                    var rendererPromise = Promise.as(that._itemRenderer(itemForRendererPromise, record.element)).
-                        then(exports._normalizeRendererReturn).
-                        then(function (v) {
-                            if (that._released) {
-                                return Promise.cancel;
-                            }
-
-                            itemForRendererPromise.then(function (item) {
-                                // Store pending ready callback off record so ScrollView can call it during realizePage. Otherwise
-                                // call it ourselves.
-                                record.pendingReady = function () {
-                                    if (record.pendingReady) {
-                                        record.pendingReady = null;
-                                        record.readyComplete = true;
-                                        that._writeProfilerMark(perfItemReadyId + ",StartTM");
-                                        readySignal.complete(item);
-                                        that._writeProfilerMark(perfItemReadyId + ",StopTM");
-                                    }
-                                };
-                                if (!that._viewCallsReady) {
-                                    var job = Scheduler.schedule(record.pendingReady, Scheduler.Priority.normal,
-                                        record, "WinJS.UI._ItemsManager._pendingReady");
-                                    job.owner = that._jobOwner;
-                                }
-                            });
-                            return v;
-                        });
-
-                    this._writeProfilerMark(perfRendererWorkId + ",StopTM");
-                    return rendererPromise;
-                },
-
-                _replaceElement: function (record, elementNew) {
-                    this._removeEntryFromElementMap(record.element);
-                    record.element = elementNew;
-                    this._addEntryToElementMap(elementNew, record);
-                },
-
-                _changeElement: function (record, elementNew, elementNewIsPlaceholder) {
-                    record.renderPromise = null;
-                    var elementOld = record.element,
-                        itemOld = record.item;
-
-                    if (record.newItem) {
-                        record.item = record.newItem;
-                        record.newItem = null;
-                    }
-
-                    this._replaceElement(record, elementNew);
-
-                    if (record.item && record.elementIsPlaceholder && !elementNewIsPlaceholder) {
-                        record.elementDelayed = null;
-                        record.elementIsPlaceholder = false;
-                        this._updateElement(record.element, elementOld);
-                        if (this._handlerToNotifyCaresAboutItemAvailable()) {
-                            this._handlerToNotify().itemAvailable(record.element, elementOld);
-                        }
-                    } else {
-                        this._handlerToNotify().changed(elementNew, elementOld, itemOld);
-                    }
-                },
-
-                _elementForItem: function (itemPromise, callerThrottlesStage1) {
-                    var handle = itemPromise.handle,
-                        record = this._recordFromHandle(handle, true),
-                        element;
-
-                    if (!handle) {
-                        return null;
-                    }
-
-                    if (record) {
-                        element = record.element;
-                    } else {
-                        // Create a new record for this item
-                        record = {
-                            item: itemPromise,
-                            itemPromise: itemPromise
-                        };
-                        this._addEntryToHandleMap(handle, record);
-
-                        var that = this;
-                        var mirage = false;
-                        var synchronous = false;
-
-                        var renderPromise =
-                            that._renderItem(itemPromise, record, callerThrottlesStage1).
-                            then(function (v) {
-                                var elementNew = v.element;
-                                record.renderComplete = v.renderComplete;
-
-                                itemPromise.then(function (item) {
-                                    record.item = item;
-                                    if (!item) {
-                                        mirage = true;
-                                        element = null;
-                                    }
-                                });
-
-                                synchronous = true;
-                                record.renderPromise = null;
-
-                                if (elementNew) {
-                                    if (element) {
-                                        that._presentElements(record, elementNew);
-                                    } else {
-                                        element = elementNew;
-                                    }
-                                }
-                            });
-
-                        if (!mirage) {
-                            if (!synchronous) {
-                                record.renderPromise = renderPromise;
-                            }
-
-                            if (!element) {
-                                element = this._renderPlaceholder(record);
-                            }
-
-                            record.element = element;
-                            this._addEntryToElementMap(element, record);
-
-                            itemPromise.retain();
-                        }
-                    }
-
-                    return element;
-                },
-
-                _addEntryToElementMap: function (element, record) {
-                    this._elementMap[uniqueID(element)] = record;
-                },
-
-                _removeEntryFromElementMap: function (element) {
-                    delete this._elementMap[uniqueID(element)];
-                },
-
-                _recordFromElement: function (element) {
-                    var record = this._elementMap[uniqueID(element)];
-                    if (!record) {
-                        this._writeProfilerMark("_recordFromElement:ItemIsInvalidError,info");
-                        throw new _ErrorFromName("WinJS.UI.ItemsManager.ItemIsInvalid", strings.itemIsInvalid);
-                    }
-
-                    return record;
-                },
-
-                _addEntryToHandleMap: function (handle, record) {
-                    this._handleMap[handle] = record;
-                },
-
-                _removeEntryFromHandleMap: function (handle) {
-                    delete this._handleMap[handle];
-                },
-
-                _handleInHandleMap: function (handle) {
-                    return !!this._handleMap[handle];
-                },
-
-                _recordFromHandle: function (handle, ignoreFailure) {
-                    var record = this._handleMap[handle];
-                    if (!record && !ignoreFailure) {
-                        throw new _ErrorFromName("WinJS.UI.ItemsManager.ItemIsInvalid", strings.itemIsInvalid);
-                    }
-                    return record;
-                },
-
-                _foreachRecord: function (callback) {
-                    var records = this._handleMap;
-                    for (var property in records) {
-                        var record = records[property];
-                        callback(record);
-                    }
-                },
-
-                _itemFromElement: function (element) {
-                    return this._recordFromElement(element).item;
-                },
-
-                _elementFromHandle: function (handle) {
-                    if (handle) {
-                        var record = this._recordFromHandle(handle, true);
-
-                        if (record && record.element) {
-                            return record.element;
-                        }
-                    }
-
-                    return null;
-                },
-
-                _inserted: function (itemPromise, previousHandle, nextHandle) {
-                    this._handlerToNotify().inserted(itemPromise, previousHandle, nextHandle);
-                },
-
-                _changed: function (newItem, oldItem) {
-                    if (!this._handleInHandleMap(oldItem.handle)) { return; }
-
-                    var record = this._recordFromHandle(oldItem.handle);
-
-                    if (record.renderPromise) {
-                        record.renderPromise.cancel();
-                    }
-                    if (record.itemPromise) {
-                        record.itemPromise.cancel();
-                    }
-                    if (record.imagePromises) {
-                        record.imagePromises.forEach(function (promise) {
-                            promise.cancel();
-                        });
-                    }
-                    if (record.itemReadyPromise) {
-                        record.itemReadyPromise.cancel();
-                    }
-                    if (record.renderComplete) {
-                        record.renderComplete.cancel();
-                    }
-
-                    record.newItem = newItem;
-
-                    var that = this;
-                    var newItemPromise = Promise.as(newItem);
-                    newItemPromise.handle = record.itemPromise.handle;
-                    record.renderPromise = this._renderItem(newItemPromise, record).
-                        then(function (v) {
-                            record.renderComplete = v.renderComplete;
-                            that._changeElement(record, v.element, false);
-                            that._presentElements(record);
-                        });
-                },
-
-                _moved: function (itemPromise, previousHandle, nextHandle) {
-                    // no check for haveHandle, as we get move notification for items we
-                    // are "next" to, so we handle the "null element" cases below
-                    //
-                    var element = this._elementFromHandle(itemPromise.handle);
-                    var previous = this._elementFromHandle(previousHandle);
-                    var next = this._elementFromHandle(nextHandle);
-
-                    this._handlerToNotify().moved(element, previous, next, itemPromise);
-                    this._presentAllElements();
-                },
-
-                _removed: function (handle, mirage) {
-                    if (this._handleInHandleMap(handle)) {
-                        var element = this._elementFromHandle(handle);
-
-                        this._handlerToNotify().removed(element, mirage, handle);
-                        this.releaseItem(element);
-                        this._presentAllElements();
-                    } else {
-                        this._handlerToNotify().removed(null, mirage, handle);
-                    }
-                },
-
-                _countChanged: function (newCount, oldCount) {
-                    if (this._elementNotificationHandler && this._elementNotificationHandler.countChanged) {
-                        this._handlerToNotify().countChanged(newCount, oldCount);
-                    }
-                },
-
-                _indexChanged: function (handle, newIndex, oldIndex) {
-                    var element;
-                    if (this._handleInHandleMap(handle)) {
-                        var record = this._recordFromHandle(handle);
-                        if (record.indexObserved) {
-                            if (!record.elementIsPlaceholder) {
-                                if (record.item.index !== newIndex) {
-                                    if (record.renderPromise) {
-                                        record.renderPromise.cancel();
-                                    }
-                                    if (record.renderComplete) {
-                                        record.renderComplete.cancel();
-                                    }
-
-                                    var itemToRender = record.newItem || record.item;
-                                    itemToRender.index = newIndex;
-
-                                    var newItemPromise = Promise.as(itemToRender);
-                                    newItemPromise.handle = record.itemPromise.handle;
-
-                                    var that = this;
-                                    record.renderPromise = this._renderItem(newItemPromise, record).
-                                        then(function (v) {
-                                            record.renderComplete = v.renderComplete;
-                                            that._changeElement(record, v.element, false);
-                                            that._presentElements(record);
-                                        });
-                                }
-                            } else {
-                                this._changeElement(record, this._renderPlaceholder(record), true);
-                            }
-                        }
-                        element = record.element;
-                    }
-                    if (this._elementNotificationHandler && this._elementNotificationHandler.indexChanged) {
-                        this._handlerToNotify().indexChanged(element, newIndex, oldIndex);
-                    }
-                },
-
-                _affectedRange: function (range) {
-                    if (this._elementNotificationHandler && this._elementNotificationHandler.updateAffectedRange) {
-                        this._handlerToNotify().updateAffectedRange(range);
-                    }
-                },
-
-                _beginNotifications: function () {
-                    // accessing _handlerToNotify will force the call to beginNotifications on the client
-                    //
-                    this._externalBegin = true;
-                    this._handlerToNotify();
-                },
-                _endNotifications: function () {
-                    if (this._notificationsSent) {
-                        this._notificationsSent = false;
-                        this._externalBegin = false;
-
-                        if (this._elementNotificationHandler && this._elementNotificationHandler.endNotifications) {
-                            this._elementNotificationHandler.endNotifications();
-                        }
-                    }
-                },
-
-                _reload: function () {
-                    if (this._elementNotificationHandler && this._elementNotificationHandler.reload) {
-                        this._elementNotificationHandler.reload();
-                    }
-                },
-
-                // Some functions may be called synchronously or asynchronously, so it's best to post _endNotifications to avoid
-                // calling it prematurely.
-                _postEndNotifications: function () {
-                    if (this._notificationsSent && !this._externalBegin && !this._endNotificationsPosted) {
-                        this._endNotificationsPosted = true;
-                        var that = this;
-                        Scheduler.schedule(function ItemsManager_async_endNotifications() {
-                            that._endNotificationsPosted = false;
-                            that._endNotifications();
-                        }, Scheduler.Priority.high, null, "WinJS.UI._ItemsManager._postEndNotifications");
-                    }
-                },
-
-                _presentElement: function (record) {
-                    var elementOld = record.element;
-                    // Finish modifying the slot before calling back into user code, in case there is a reentrant call
-                    this._replaceElement(record, record.elementDelayed);
-                    record.elementDelayed = null;
-
-                    record.elementIsPlaceholder = false;
-                    this._updateElement(record.element, elementOld);
-                    if (this._handlerToNotifyCaresAboutItemAvailable()) {
-                        this._handlerToNotify().itemAvailable(record.element, elementOld);
-                    }
-                },
-
-                _presentElements: function (record, elementDelayed) {
-                    if (elementDelayed) {
-                        record.elementDelayed = elementDelayed;
-                    }
-
-                    this._listBinding.jumpToItem(record.item);
-                    if (record.elementDelayed) {
-                        this._presentElement(record);
-                    }
-
-                    this._postEndNotifications();
-                },
-
-                // Presents all delayed elements
-                _presentAllElements: function () {
-                    var that = this;
-                    this._foreachRecord(function (record) {
-                        if (record.elementDelayed) {
-                            that._presentElement(record);
-                        }
-                    });
-                },
-
-                _writeProfilerMark: function (text) {
-                    var message = "WinJS.UI._ItemsManager:" + (this._profilerId ? (this._profilerId + ":") : ":") + text;
-                    _WriteProfilerMark(message);
-                }
-            }, { // Static Members
-                supportedForProcessing: false,
-            });
-
-            return function (dataSource, itemRenderer, elementNotificationHandler, options) {
-                return new ItemsManager(dataSource, itemRenderer, elementNotificationHandler, options);
-            };
-        })
-    });
-
-});
-
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_TabContainer',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    './_ElementUtilities'
-    ], function tabManagerInit(exports, _Global, _Base, _BaseUtils, _ElementUtilities) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-
-    function fireEvent(element, name, forward, cancelable) {
-        var event = _Global.document.createEvent('UIEvent');
-        event.initUIEvent(name, false, !!cancelable, _Global, forward ? 1 : 0);
-        return !element.dispatchEvent(event);
-    }
-
-    var getTabIndex = _ElementUtilities.getTabIndex;
-
-    // tabbableElementsNodeFilter works with the TreeWalker to create a view of the DOM tree that is built up of what we want the focusable tree to look like.
-    // When it runs into a tab contained area, it rejects anything except the childFocus element so that any potentially tabbable things that the TabContainer
-    // doesn't want tabbed to get ignored.
-    function tabbableElementsNodeFilter(node) {
-        var nodeStyle = _ElementUtilities._getComputedStyle(node);
-        if (nodeStyle.display === "none" || nodeStyle.visibility === "hidden") {
-            return _Global.NodeFilter.FILTER_REJECT;
-        }
-        if (node._tabContainer) {
-            return _Global.NodeFilter.FILTER_ACCEPT;
-        }
-        if (node.parentNode && node.parentNode._tabContainer) {
-            var managedTarget = node.parentNode._tabContainer.childFocus;
-            // Ignore subtrees that are under a tab manager but not the child focus. If a node is contained in the child focus, either accept it (if it's tabbable itself), or skip it and find tabbable content inside of it.
-            if (managedTarget && node.contains(managedTarget)) {
-                return (getTabIndex(node) >= 0 ? _Global.NodeFilter.FILTER_ACCEPT : _Global.NodeFilter.FILTER_SKIP);
-            }
-            return _Global.NodeFilter.FILTER_REJECT;
-        }
-        var tabIndex = getTabIndex(node);
-        if (tabIndex >= 0) {
-            return _Global.NodeFilter.FILTER_ACCEPT;
-        }
-        return _Global.NodeFilter.FILTER_SKIP;
-    }
-
-    // We've got to manually scrape the results the walker generated, since the walker will have generated a fairly good representation of the tabbable tree, but
-    // won't have a perfect image. Trees like this cause a problem for the walker:
-    //     [ tabContainer element ]
-    //   [ element containing childFocus ]
-    //  [ childFocus ] [ sibling of child focus that has tabIndex >= 0 ]
-    // We can't tell the tree walker to jump right to the childFocus, so it'll collect the childFocus but also that sibling element. We don't want that sibling element
-    // to appear in our version of the tabOrder, so scrapeTabManagedSubtree will take the pretty accurate representation we get from the TreeWalker, and do a little
-    // more pruning to give us only the nodes we're interested in.
-    function scrapeTabManagedSubtree(walker) {
-        var tabManagedElement = walker.currentNode,
-            childFocus = tabManagedElement._tabContainer.childFocus,
-            elementsFound = [];
-
-        if (!childFocus) {
-            return [];
-        }
-
-        walker.currentNode = childFocus;
-        function scrapeSubtree() {
-            if (walker.currentNode._tabContainer) {
-                elementsFound = elementsFound.concat(scrapeTabManagedSubtree(walker));
-            } else {
-                // A child focus can have tabIndex = -1, so check the tabIndex before marking it as valid
-                if (getTabIndex(walker.currentNode) >= 0) {
-                    elementsFound.push(walker.currentNode);
-                }
-                if (walker.firstChild()) {
-                    do {
-                        scrapeSubtree();
-                    } while (walker.nextSibling());
-                    walker.parentNode();
-                }
-            }
-        }
-        scrapeSubtree();
-        walker.currentNode = tabManagedElement;
-
-        return elementsFound;
-    }
-
-    function TabHelperObject(element, tabIndex) {
-        function createCatcher() {
-            var fragment = _Global.document.createElement("DIV");
-            fragment.tabIndex = (tabIndex ? tabIndex : 0);
-            fragment.setAttribute("aria-hidden", true);
-            return fragment;
-        }
-
-        var parent = element.parentNode;
-
-        // Insert prefix focus catcher
-        var catcherBegin = createCatcher();
-        parent.insertBefore(catcherBegin, element);
-
-        // Insert postfix focus catcher
-        var catcherEnd = createCatcher();
-        parent.insertBefore(catcherEnd, element.nextSibling);
-
-        catcherBegin.addEventListener("focus", function () {
-            fireEvent(element, "onTabEnter", true);
-        }, true);
-        catcherEnd.addEventListener("focus", function () {
-            fireEvent(element, "onTabEnter", false);
-        }, true);
-
-        this._catcherBegin = catcherBegin;
-        this._catcherEnd = catcherEnd;
-        var refCount = 1;
-        this.addRef = function () {
-            refCount++;
-        };
-        this.release = function () {
-            if (--refCount === 0) {
-                if (catcherBegin.parentElement) {
-                    parent.removeChild(catcherBegin);
-                }
-                if (catcherEnd.parentElement) {
-                    parent.removeChild(catcherEnd);
-                }
-            }
-            return refCount;
-        };
-        this.updateTabIndex = function (tabIndex) {
-            catcherBegin.tabIndex = tabIndex;
-            catcherEnd.tabIndex = tabIndex;
-        };
-    }
-
-    var TrackTabBehavior = {
-        attach: function (element, tabIndex) {
-            ///
-            if (!element["win-trackTabHelperObject"]) {
-                element["win-trackTabHelperObject"] = new TabHelperObject(element, tabIndex);
-            } else {
-                element["win-trackTabHelperObject"].addRef();
-            }
-
-            return element["win-trackTabHelperObject"];
-        },
-
-        detach: function (element) {
-            ///
-            if (!element["win-trackTabHelperObject"].release()) {
-                delete element["win-trackTabHelperObject"];
-            }
-        }
-    };
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        TrackTabBehavior: TrackTabBehavior,
-        TabContainer: _Base.Class.define(function TabContainer_ctor(element) {
-            /// <signature helpKeyword="WinJS.UI.TabContainer.TabContainer">
-            /// <summary locid="WinJS.UI.TabContainer.constructor">
-            /// Constructs the TabContainer.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.UI.TabContainer.constructor_p:element">
-            /// The DOM element to be associated with the TabContainer.
-            /// </param>
-            /// <param name="options" type="Object" locid="WinJS.UI.TabContainer.constructor_p:options">
-            /// The set of options to be applied initially to the TabContainer.
-            /// </param>
-            /// <returns type="WinJS.UI.TabContainer" locid="WinJS.UI.TabContainer.constructor_returnValue">
-            /// A constructed TabContainer.
-            /// </returns>
-            /// </signature>
-            this._element = element;
-            this._tabIndex = 0;
-            element._tabContainer = this;
-            if (element.getAttribute("tabindex") === null) {
-                element.tabIndex = -1;
-            }
-            var that = this;
-
-            element.addEventListener("onTabEnter", function (e) {
-                var skipDefaultBehavior = fireEvent(that._element, "onTabEntered", e.detail, true);
-                if (skipDefaultBehavior) {
-                    return;
-                }
-
-                if (that.childFocus) {
-                    that.childFocus.focus();
-                } else {
-                    element.focus();
-                }
-            });
-            element.addEventListener("keydown", function (e) {
-                var targetElement = e.target;
-                if (e.keyCode === _ElementUtilities.Key.tab) {
-                    var forwardTab = !e.shiftKey;
-                    var canKeepTabbing = that._hasMoreElementsInTabOrder(targetElement, forwardTab);
-                    if (!canKeepTabbing) {
-                        var skipTabExitHandling = fireEvent(that._element, "onTabExiting", forwardTab, true);
-                        if (skipTabExitHandling) {
-                            e.stopPropagation();
-                            e.preventDefault();
-                            return;
-                        }
-                        var allTabbableElements = that._element.querySelectorAll("a[href],area[href],button,command,input,link,menuitem,object,select,textarea,th[sorted],[tabindex]"),
-                            len = allTabbableElements.length,
-                            originalTabIndices = [];
-
-                        for (var i = 0; i < len; i++) {
-                            var element = allTabbableElements[i];
-                            originalTabIndices.push(element.tabIndex);
-                            element.tabIndex = -1;
-                        }
-                        // If there's nothing else that can be tabbed to on the page, tab should wrap around back to the tab contained area.
-                        // We'll disable the sentinel node that's directly in the path of the tab order (catcherEnd for forward tabs, and
-                        // catcherBegin for shift+tabs), but leave the other sentinel node untouched so tab can wrap around back into the region.
-                        that._elementTabHelper[forwardTab ? "_catcherEnd" : "_catcherBegin"].tabIndex = -1;
-
-                        var restoreTabIndicesOnBlur = function () {
-                            targetElement.removeEventListener("blur", restoreTabIndicesOnBlur, false);
-                            for (var i = 0; i < len; i++) {
-                                if (originalTabIndices[i] !== -1) {
-                                    // When the original tabIndex was -1, don't try restoring to -1 again. A nested TabContainer might also be in the middle of handling this same code,
-                                    // and so would have set tabIndex = -1 on this element. The nested tab container will restore the element's tabIndex properly.
-                                    allTabbableElements[i].tabIndex = originalTabIndices[i];
-                                }
-                            }
-                            that._elementTabHelper._catcherBegin.tabIndex = that._tabIndex;
-                            that._elementTabHelper._catcherEnd.tabIndex = that._tabIndex;
-                        };
-                        targetElement.addEventListener("blur", restoreTabIndicesOnBlur, false);
-                        _BaseUtils._yieldForEvents(function () {
-                            fireEvent(that._element, "onTabExit", forwardTab);
-                        });
-                    }
-                }
-            });
-
-            this._elementTabHelper = TrackTabBehavior.attach(element, this._tabIndex);
-            this._elementTabHelper._catcherBegin.tabIndex = 0;
-            this._elementTabHelper._catcherEnd.tabIndex = 0;
-        }, {
-
-            // Public members
-
-            /// <signature helpKeyword="WinJS.UI.TabContainer.dispose">
-            /// <summary locid="WinJS.UI.TabContainer.dispose">
-            /// Disposes the Tab Container.
-            /// </summary>
-            /// </signature>
-            dispose: function () {
-                TrackTabBehavior.detach(this._element, this._tabIndex);
-            },
-
-            /// <field type="HTMLElement" domElement="true" locid="WinJS.UI.TabContainer.childFocus" helpKeyword="WinJS.UI.TabContainer.childFocus">
-            /// Gets or sets the child element that has focus.
-            /// </field>
-            childFocus: {
-                set: function (e) {
-                    if (e !== this._focusElement) {
-                        if (e && e.parentNode) {
-                            this._focusElement = e;
-                        } else {
-                            this._focusElement = null;
-                        }
-                    }
-                },
-                get: function () {
-                    return this._focusElement;
-                }
-            },
-
-            /// <field type="Number" integer="true" locid="WinJS.UI.TabContainer.tabIndex" helpKeyword="WinJS.UI.TabContainer.tabIndex">
-            /// Gets or sets the tab order of the control within its container.
-            /// </field>
-            tabIndex: {
-                set: function (tabIndex) {
-                    this._tabIndex = tabIndex;
-                    this._elementTabHelper.updateTabIndex(tabIndex);
-                },
-
-                get: function () {
-                    return this._tabIndex;
-                }
-            },
-
-            // Private members
-
-            _element: null,
-            _skipper: function (e) {
-                e.stopPropagation();
-                e.preventDefault();
-            },
-            _hasMoreElementsInTabOrder: function (currentFocus, movingForwards) {
-                if (!this.childFocus) {
-                    return false;
-                }
-                var walker = _Global.document.createTreeWalker(this._element, _Global.NodeFilter.SHOW_ELEMENT, tabbableElementsNodeFilter, false);
-                var tabStops = scrapeTabManagedSubtree(walker);
-                for (var i = 0; i < tabStops.length; i++) {
-                    if (tabStops[i] === currentFocus) {
-                        return (movingForwards ? (i < tabStops.length - 1) : (i > 0));
-                    }
-                }
-                return false;
-            },
-            _focusElement: null
-
-        }, { // Static Members
-            supportedForProcessing: false,
-        })
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_KeyboardBehavior',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    './_Control',
-    './_ElementUtilities',
-    './_TabContainer'
-], function KeyboardBehaviorInit(exports, _Global, _Base, _Control, _ElementUtilities, _TabContainer) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-    
-    var InputTypes = {
-        touch: "touch",
-        pen: "pen",
-        mouse: "mouse",
-        keyboard: "keyboard"
-    };
-    var _lastInputType = InputTypes.mouse;
-    
-    // Keys should be the same as the values for a PointerEvent's pointerType.
-    var pointerTypeToInputType = {
-        // IE 10 uses numbers for its pointerType
-        2: InputTypes.touch,
-        3: InputTypes.pen,
-        4: InputTypes.mouse,
-        
-        // Others use strings for their pointerTypes
-        touch: InputTypes.touch,
-        pen: InputTypes.pen,
-        mouse: InputTypes.mouse
-    };
-
-    _ElementUtilities._addEventListener(_Global, "pointerdown", function (eventObject) {
-        _lastInputType = pointerTypeToInputType[eventObject.pointerType] || InputTypes.mouse;
-    }, true);
-
-    _Global.addEventListener("keydown", function () {
-        _lastInputType = InputTypes.keyboard;
-    }, true);
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _keyboardSeenLast: {
-            get: function _keyboardSeenLast_get() {
-                return _lastInputType === InputTypes.keyboard;
-            },
-            set: function _keyboardSeenLast_set(value) {
-                _lastInputType = (value ? InputTypes.keyboard : InputTypes.mouse);
-            }
-        },
-        _lastInputType: {
-            get: function _lastInputType_get() {
-                return _lastInputType;
-            },
-            set: function _lastInputType_set(value) {
-                if (InputTypes[value]) {
-                    _lastInputType = value;
-                }
-            }
-        },
-        _InputTypes: InputTypes,
-        _WinKeyboard: function (element) {
-            // Win Keyboard behavior is a solution that would be similar to -ms-keyboard-focus.
-            // It monitors the last input (keyboard/mouse) and adds/removes a win-keyboard class
-            // so that you can style .foo.win-keyboard:focus vs .foo:focus to add a keyboard rect
-            // on an item only when the last input method was keyboard.
-            // Reminder: Touch edgy does not count as an input method.
-            _ElementUtilities._addEventListener(element, "pointerdown", function (ev) {
-                // In case pointer down came on the active element.
-                _ElementUtilities.removeClass(ev.target, "win-keyboard");
-            }, true);
-            element.addEventListener("keydown", function (ev) {
-                _ElementUtilities.addClass(ev.target, "win-keyboard");
-            }, true);
-            _ElementUtilities._addEventListener(element, "focusin", function (ev) {
-                exports._keyboardSeenLast && _ElementUtilities.addClass(ev.target, "win-keyboard");
-            }, false);
-            _ElementUtilities._addEventListener(element, "focusout", function (ev) {
-                _ElementUtilities.removeClass(ev.target, "win-keyboard");
-            }, false);
-        },
-        _KeyboardBehavior: _Base.Namespace._lazy(function () {
-            var Key = _ElementUtilities.Key;
-
-            var _KeyboardBehavior = _Base.Class.define(function KeyboardBehavior_ctor(element, options) {
-                // KeyboardBehavior allows you to easily convert a bunch of tabable elements into a single tab stop with
-                // navigation replaced by keyboard arrow (Up/Down/Left/Right) + Home + End + Custom keys.
-                //
-                // Example use cases:
-                //
-                // 1 Dimensional list: FixedDirection = height and FixedSize = 1;
-                // [1] [ 2 ] [  3  ] [4] [  5  ]...
-                //
-                // 2 Dimensional list: FixedDirection = height and FixedSize = 2;
-                // [1] [3] [5] [7] ...
-                // [2] [4] [6] [8]
-                //
-                // 1 Dimensional list: FixedDirection = width and FixedSize = 1;
-                // [ 1 ]
-                // -   -
-                // |   |
-                // | 2 |
-                // |   |
-                // -   -
-                // [ 3 ]
-                // [ 4 ]
-                //  ...
-                //
-                // 2 Dimensional list: FixedDirection = width and FixedSize = 2;
-                // [1][2]
-                // [3][4]
-                // [5][6]
-                // ...
-                //
-                // Currently it is a "behavior" instead of a "control" so it can be attached to the same element as a
-                // winControl. The main scenario for this would be to attach it to the same element as a repeater.
-                //
-                // It also blocks "Portaling" where you go off the end of one column and wrap around to the other
-                // column. It also blocks "Carousel" where you go from the end of the list to the beginning.
-                //
-                // Keyboarding behavior supports nesting. It supports your tab stops having sub tab stops. If you want
-                // an interactive element within the tab stop you need to use the win-interactive classname or during the
-                // keydown event stop propogation so that the event is skipped.
-                //
-                // If you have custom keyboarding the getAdjacent API is provided. This can be used to enable keyboarding
-                // in multisize 2d lists or custom keyboard commands. PageDown and PageUp are the most common since this
-                // behavior does not detect scrollers.
-                //
-                // It also allows developers to show/hide keyboard focus rectangles themselves.
-                //
-                // It has an API called currentIndex so that Tab (or Shift+Tab) or a developer imitating Tab will result in
-                // the correct item having focus.
-                //
-                // It also allows an element to be represented as 2 arrow stops (commonly used for a split button) by calling
-                // the _getFocusInto API on the child element's winControl if it exists.
-
-                element = element || _Global.document.createElement("DIV");
-                options = options || {};
-
-                element._keyboardBehavior = this;
-                this._element = element;
-
-                this._fixedDirection = _KeyboardBehavior.FixedDirection.width;
-                this._fixedSize = 1;
-                this._currentIndex = 0;
-
-                _Control.setOptions(this, options);
-
-                // If there's a scroller, the TabContainer can't be inside of the scroller. Otherwise, tabbing into the
-                // TabContainer will cause the scroller to scroll.
-                this._tabContainer = new _TabContainer.TabContainer(this.scroller || this._element);
-                this._tabContainer.tabIndex = 0;
-                if (this._element.children.length > 0) {
-                    this._tabContainer.childFocus = this._getFocusInto(this._element.children[0]);
-                }
-
-                this._element.addEventListener('keydown', this._keyDownHandler.bind(this));
-                _ElementUtilities._addEventListener(this._element, 'pointerdown', this._MSPointerDownHandler.bind(this));
-            }, {
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-
-                fixedDirection: {
-                    get: function () {
-                        return this._fixedDirection;
-                    },
-                    set: function (value) {
-                        this._fixedDirection = value;
-                    }
-                },
-
-                fixedSize: {
-                    get: function () {
-                        return this._fixedSize;
-                    },
-                    set: function (value) {
-                        if (+value === value) {
-                            value = Math.max(1, value);
-                            this._fixedSize = value;
-                        }
-                    }
-                },
-
-                currentIndex: {
-                    get: function () {
-                        if (this._element.children.length > 0) {
-                            return this._currentIndex;
-                        }
-                        return -1;
-                    },
-                    set: function (value) {
-                        if (+value === value) {
-                            var length = this._element.children.length;
-                            value = Math.max(0, Math.min(length - 1, value));
-                            this._currentIndex = value;
-                            this._tabContainer.childFocus = this._getFocusInto(this._element.children[value]);
-                        }
-                    }
-                },
-
-                getAdjacent: {
-                    get: function () {
-                        return this._getAdjacent;
-                    },
-                    set: function (value) {
-                        this._getAdjacent = value;
-                    }
-                },
-
-                // If set, KeyboardBehavior will prevent *scroller* from scrolling when moving focus
-                scroller: {
-                    get: function () {
-                        return this._scroller;
-                    },
-                    set: function (value) {
-                        this._scroller = value;
-                    }
-                },
-
-                _keyDownHandler: function _KeyboardBehavior_keyDownHandler(ev) {
-                    if (!ev.altKey) {
-                        if (_ElementUtilities._matchesSelector(ev.target, ".win-interactive, .win-interactive *")) {
-                            return;
-                        }
-                        var newIndex = this.currentIndex;
-                        var maxIndex = this._element.children.length - 1;
-
-                        var rtl = _ElementUtilities._getComputedStyle(this._element).direction === "rtl";
-                        var leftStr = rtl ? Key.rightArrow : Key.leftArrow;
-                        var rightStr = rtl ? Key.leftArrow : Key.rightArrow;
-
-                        var targetIndex = this.getAdjacent && this.getAdjacent(newIndex, ev.keyCode);
-                        if (+targetIndex === targetIndex) {
-                            newIndex = targetIndex;
-                        } else {
-                            var modFixedSize = newIndex % this.fixedSize;
-
-                            if (ev.keyCode === leftStr) {
-                                if (this.fixedDirection === _KeyboardBehavior.FixedDirection.width) {
-                                    if (modFixedSize !== 0) {
-                                        newIndex--;
-                                    }
-                                } else {
-                                    if (newIndex >= this.fixedSize) {
-                                        newIndex -= this.fixedSize;
-                                    }
-                                }
-                            } else if (ev.keyCode === rightStr) {
-                                if (this.fixedDirection === _KeyboardBehavior.FixedDirection.width) {
-                                    if (modFixedSize !== this.fixedSize - 1) {
-                                        newIndex++;
-                                    }
-                                } else {
-                                    if (newIndex + this.fixedSize - modFixedSize <= maxIndex) {
-                                        newIndex += this.fixedSize;
-                                    }
-                                }
-                            } else if (ev.keyCode === Key.upArrow) {
-                                if (this.fixedDirection === _KeyboardBehavior.FixedDirection.height) {
-                                    if (modFixedSize !== 0) {
-                                        newIndex--;
-                                    }
-                                } else {
-                                    if (newIndex >= this.fixedSize) {
-                                        newIndex -= this.fixedSize;
-                                    }
-                                }
-                            } else if (ev.keyCode === Key.downArrow) {
-                                if (this.fixedDirection === _KeyboardBehavior.FixedDirection.height) {
-                                    if (modFixedSize !== this.fixedSize - 1) {
-                                        newIndex++;
-                                    }
-                                } else {
-                                    if (newIndex + this.fixedSize - modFixedSize <= maxIndex) {
-                                        newIndex += this.fixedSize;
-                                    }
-                                }
-                            } else if (ev.keyCode === Key.home) {
-                                newIndex = 0;
-                            } else if (ev.keyCode === Key.end) {
-                                newIndex = this._element.children.length - 1;
-                            }
-                        }
-
-                        newIndex = Math.max(0, Math.min(this._element.children.length - 1, newIndex));
-
-                        if (newIndex !== this.currentIndex) {
-                            this._focus(newIndex, ev.keyCode);
-
-                            // Allow KeyboardBehavior to be nested
-                            if (ev.keyCode === leftStr || ev.keyCode === rightStr || ev.keyCode === Key.upArrow || ev.keyCode === Key.downArrow) {
-                                ev.stopPropagation();
-                            }
-
-                            ev.preventDefault();
-                        }
-                    }
-                },
-
-                _getFocusInto: function _KeyboardBehavior_getFocusInto(elementToFocus, keyCode) {
-                    return elementToFocus && elementToFocus.winControl && elementToFocus.winControl._getFocusInto ?
-                        elementToFocus.winControl._getFocusInto(keyCode) :
-                        elementToFocus;
-                },
-
-                _focus: function _KeyboardBehavior_focus(index, keyCode) {
-                    index = (+index === index) ? index : this.currentIndex;
-
-                    var elementToFocus = this._element.children[index];
-                    if (elementToFocus) {
-                        elementToFocus = this._getFocusInto(elementToFocus, keyCode);
-
-                        this.currentIndex = index;
-
-                        _ElementUtilities._setActive(elementToFocus, this.scroller);
-                    }
-                },
-
-                _MSPointerDownHandler: function _KeyboardBehavior_MSPointerDownHandler(ev) {
-                    var srcElement = ev.target;
-                    if (srcElement === this.element) {
-                        return;
-                    }
-
-                    while (srcElement.parentNode !== this.element) {
-                        srcElement = srcElement.parentNode;
-                    }
-
-                    var index = -1;
-                    while (srcElement) {
-                        index++;
-                        srcElement = srcElement.previousElementSibling;
-                    }
-
-                    this.currentIndex = index;
-                }
-            }, {
-                FixedDirection: {
-                    height: "height",
-                    width: "width"
-                }
-            });
-
-            return _KeyboardBehavior;
-        })
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_SafeHtml',[
-    'exports',
-    '../Core/_WinJS',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_ErrorFromName',
-    '../Core/_Resources'
-    ], function safeHTMLInit(exports, _WinJS, _Global, _Base, _ErrorFromName, _Resources) {
-    "use strict";
-
-
-    var setInnerHTML,
-        setInnerHTMLUnsafe,
-        setOuterHTML,
-        setOuterHTMLUnsafe,
-        insertAdjacentHTML,
-        insertAdjacentHTMLUnsafe;
-
-    var strings = {
-        get nonStaticHTML() { return "Unable to add dynamic content. A script attempted to inject dynamic content, or elements previously modified dynamically, that might be unsafe. For example, using the innerHTML property or the document.write method to add a script element will generate this exception. If the content is safe and from a trusted source, use a method to explicitly manipulate elements and attributes, such as createElement, or use setInnerHTMLUnsafe (or other unsafe method)."; },
-    };
-
-    setInnerHTML = setInnerHTMLUnsafe = function (element, text) {
-        /// <signature helpKeyword="WinJS.Utilities.setInnerHTML">
-        /// <summary locid="WinJS.Utilities.setInnerHTML">
-        /// Sets the innerHTML property of the specified element to the specified text.
-        /// </summary>
-        /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.setInnerHTML_p:element">
-        /// The element on which the innerHTML property is to be set.
-        /// </param>
-        /// <param name="text" type="String" locid="WinJS.Utilities.setInnerHTML_p:text">
-        /// The value to be set to the innerHTML property.
-        /// </param>
-        /// </signature>
-        element.innerHTML = text;
-    };
-    setOuterHTML = setOuterHTMLUnsafe = function (element, text) {
-        /// <signature helpKeyword="WinJS.Utilities.setOuterHTML">
-        /// <summary locid="WinJS.Utilities.setOuterHTML">
-        /// Sets the outerHTML property of the specified element to the specified text.
-        /// </summary>
-        /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.setOuterHTML_p:element">
-        /// The element on which the outerHTML property is to be set.
-        /// </param>
-        /// <param name="text" type="String" locid="WinJS.Utilities.setOuterHTML_p:text">
-        /// The value to be set to the outerHTML property.
-        /// </param>
-        /// </signature>
-        element.outerHTML = text;
-    };
-    insertAdjacentHTML = insertAdjacentHTMLUnsafe = function (element, position, text) {
-        /// <signature helpKeyword="WinJS.Utilities.insertAdjacentHTML">
-        /// <summary locid="WinJS.Utilities.insertAdjacentHTML">
-        /// Calls insertAdjacentHTML on the specified element.
-        /// </summary>
-        /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.insertAdjacentHTML_p:element">
-        /// The element on which insertAdjacentHTML is to be called.
-        /// </param>
-        /// <param name="position" type="String" locid="WinJS.Utilities.insertAdjacentHTML_p:position">
-        /// The position relative to the element at which to insert the HTML.
-        /// </param>
-        /// <param name="text" type="String" locid="WinJS.Utilities.insertAdjacentHTML_p:text">
-        /// The value to be provided to insertAdjacentHTML.
-        /// </param>
-        /// </signature>
-        element.insertAdjacentHTML(position, text);
-    };
-
-    var msApp = _Global.MSApp;
-    if (msApp && msApp.execUnsafeLocalFunction) {
-        setInnerHTMLUnsafe = function (element, text) {
-            /// <signature helpKeyword="WinJS.Utilities.setInnerHTMLUnsafe">
-            /// <summary locid="WinJS.Utilities.setInnerHTMLUnsafe">
-            /// Sets the innerHTML property of the specified element to the specified text.
-            /// </summary>
-            /// <param name='element' type='HTMLElement' locid="WinJS.Utilities.setInnerHTMLUnsafe_p:element">
-            /// The element on which the innerHTML property is to be set.
-            /// </param>
-            /// <param name='text' type="String" locid="WinJS.Utilities.setInnerHTMLUnsafe_p:text">
-            /// The value to be set to the innerHTML property.
-            /// </param>
-            /// </signature>
-            msApp.execUnsafeLocalFunction(function () {
-                try {
-                    _WinJS._execUnsafe = true;
-                    element.innerHTML = text;
-                } finally {
-                    _WinJS._execUnsafe = false;
-                }
-            });
-        };
-        setOuterHTMLUnsafe = function (element, text) {
-            /// <signature helpKeyword="WinJS.Utilities.setOuterHTMLUnsafe">
-            /// <summary locid="WinJS.Utilities.setOuterHTMLUnsafe">
-            /// Sets the outerHTML property of the specified element to the specified text
-            /// in the context of msWWA.execUnsafeLocalFunction.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.setOuterHTMLUnsafe_p:element">
-            /// The element on which the outerHTML property is to be set.
-            /// </param>
-            /// <param name="text" type="String" locid="WinJS.Utilities.setOuterHTMLUnsafe_p:text">
-            /// The value to be set to the outerHTML property.
-            /// </param>
-            /// </signature>
-            msApp.execUnsafeLocalFunction(function () {
-                try {
-                    _WinJS._execUnsafe = true;
-                    element.outerHTML = text;
-                } finally {
-                    _WinJS._execUnsafe = false;
-                }
-            });
-        };
-        insertAdjacentHTMLUnsafe = function (element, position, text) {
-            /// <signature helpKeyword="WinJS.Utilities.insertAdjacentHTMLUnsafe">
-            /// <summary locid="WinJS.Utilities.insertAdjacentHTMLUnsafe">
-            /// Calls insertAdjacentHTML on the specified element in the context
-            /// of msWWA.execUnsafeLocalFunction.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.insertAdjacentHTMLUnsafe_p:element">
-            /// The element on which insertAdjacentHTML is to be called.
-            /// </param>
-            /// <param name="position" type="String" locid="WinJS.Utilities.insertAdjacentHTMLUnsafe_p:position">
-            /// The position relative to the element at which to insert the HTML.
-            /// </param>
-            /// <param name="text" type="String" locid="WinJS.Utilities.insertAdjacentHTMLUnsafe_p:text">
-            /// Value to be provided to insertAdjacentHTML.
-            /// </param>
-            /// </signature>
-            msApp.execUnsafeLocalFunction(function () {
-                try {
-                    _WinJS._execUnsafe = true;
-                    element.insertAdjacentHTML(position, text);
-                } finally {
-                    _WinJS._execUnsafe = false;
-                }
-            });
-        };
-    } else if (_Global.msIsStaticHTML) {
-        var check = function (str) {
-            if (!_Global.msIsStaticHTML(str)) {
-                throw new _ErrorFromName("WinJS.Utitilies.NonStaticHTML", strings.nonStaticHTML);
-            }
-        };
-        // If we ever get isStaticHTML we can attempt to recreate the behavior we have in the local
-        // compartment, in the mean-time all we can do is sanitize the input.
-        //
-        setInnerHTML = function (element, text) {
-            /// <signature helpKeyword="WinJS.Utilities.setInnerHTML">
-            /// <summary locid="WinJS.Utilities.msIsStaticHTML.setInnerHTML">
-            /// Sets the innerHTML property of a element to the specified text
-            /// if it passes a msIsStaticHTML check.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.msIsStaticHTML.setInnerHTML_p:element">
-            /// The element on which the innerHTML property is to be set.
-            /// </param>
-            /// <param name="text" type="String" locid="WinJS.Utilities.msIsStaticHTML.setInnerHTML_p:text">
-            /// The value to be set to the innerHTML property.
-            /// </param>
-            /// </signature>
-            check(text);
-            element.innerHTML = text;
-        };
-        setOuterHTML = function (element, text) {
-            /// <signature helpKeyword="WinJS.Utilities.setOuterHTML">
-            /// <summary locid="WinJS.Utilities.msIsStaticHTML.setOuterHTML">
-            /// Sets the outerHTML property of a element to the specified text
-            /// if it passes a msIsStaticHTML check.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.msIsStaticHTML.setOuterHTML_p:element">
-            /// The element on which the outerHTML property is to be set.
-            /// </param>
-            /// <param name="text" type="String" locid="WinJS.Utilities.msIsStaticHTML.setOuterHTML_p:text">
-            /// The value to be set to the outerHTML property.
-            /// </param>
-            /// </signature>
-            check(text);
-            element.outerHTML = text;
-        };
-        insertAdjacentHTML = function (element, position, text) {
-            /// <signature helpKeyword="WinJS.Utilities.insertAdjacentHTML">
-            /// <summary locid="WinJS.Utilities.msIsStaticHTML.insertAdjacentHTML">
-            /// Calls insertAdjacentHTML on the element if it passes
-            /// a msIsStaticHTML check.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" locid="WinJS.Utilities.msIsStaticHTML.insertAdjacentHTML_p:element">
-            /// The element on which insertAdjacentHTML is to be called.
-            /// </param>
-            /// <param name="position" type="String" locid="WinJS.Utilities.msIsStaticHTML.insertAdjacentHTML_p:position">
-            /// The position relative to the element at which to insert the HTML.
-            /// </param>
-            /// <param name="text" type="String" locid="WinJS.Utilities.msIsStaticHTML.insertAdjacentHTML_p:text">
-            /// The value to be provided to insertAdjacentHTML.
-            /// </param>
-            /// </signature>
-            check(text);
-            element.insertAdjacentHTML(position, text);
-        };
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Utilities", {
-        setInnerHTML: setInnerHTML,
-        setInnerHTMLUnsafe: setInnerHTMLUnsafe,
-        setOuterHTML: setOuterHTML,
-        setOuterHTMLUnsafe: setOuterHTMLUnsafe,
-        insertAdjacentHTML: insertAdjacentHTML,
-        insertAdjacentHTMLUnsafe: insertAdjacentHTMLUnsafe
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_Select',[
-    'exports',
-    '../Core/_Base',
-    './_SafeHtml'
-    ], function selectInit(exports, _Base, _SafeHtml) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _Select: _Base.Namespace._lazy(function () {
-            var encodeHtmlRegEx = /[&<>'"]/g;
-            var encodeHtmlEscapeMap = {
-                "&": "&amp;",
-                "<": "&lt;",
-                ">": "&gt;",
-                "'": "&#39;",
-                '"': "&quot;"
-            };
-            var stringDirectionRegEx = /[\u200e\u200f]/g;
-            function encodeHtml(str) {
-                return str.replace(encodeHtmlRegEx, function (m) {
-                    return encodeHtmlEscapeMap[m] || "";
-                });
-            }
-            function stripDirectionMarker(str) {
-                return str.replace(stringDirectionRegEx, "");
-            }
-            function stockGetValue(index) {
-                /*jshint validthis: true */
-                return this[index];
-            }
-            function stockGetLength() {
-                /*jshint validthis: true */
-                return this.length;
-            }
-            function fixDataSource(dataSource) {
-                if (!dataSource.getValue) {
-                    dataSource.getValue = stockGetValue;
-                }
-
-                if (!dataSource.getLength) {
-                    dataSource.getLength = stockGetLength;
-                }
-                return dataSource;
-            }
-
-            return _Base.Class.define(function _Select_ctor(element, options) {
-                // This is an implementation detail of the TimePicker and DatePicker, designed
-                // to provide a primitive "data bound" select control. This is not designed to
-                // be used outside of the TimePicker and DatePicker controls.
-                //
-
-                this._dataSource = fixDataSource(options.dataSource);
-                this._index = options.index || 0;
-
-                this._domElement = element;
-                // Mark this as a tab stop
-                this._domElement.tabIndex = 0;
-
-                if (options.disabled) {
-                    this.setDisabled(options.disabled);
-                }
-
-                var that = this;
-                this._domElement.addEventListener("change", function () {
-                    //Should be set to _index to prevent events from firing twice
-                    that._index = that._domElement.selectedIndex;
-                }, false);
-
-                //update runtime accessibility value after initialization
-                this._createSelectElement();
-            }, {
-                _index: 0,
-                _dataSource: null,
-
-                dataSource: {
-                    get: function () { return this._dataSource; },
-                    set: function (value) {
-                        this._dataSource = fixDataSource(value);
-
-                        //Update layout as data source change
-                        if (this._domElement) {
-                            this._createSelectElement();
-                        }
-                    }
-                },
-
-                setDisabled: function (disabled) {
-                    if (disabled) {
-                        this._domElement.setAttribute("disabled", "disabled");
-                    } else {
-                        this._domElement.removeAttribute("disabled");
-                    }
-                },
-
-                _createSelectElement: function () {
-                    var dataSourceLength = this._dataSource.getLength();
-                    var text = "";
-                    for (var i = 0; i < dataSourceLength; i++) {
-                        var value = "" + this._dataSource.getValue(i);
-                        var escaped = encodeHtml(value);
-                        // WinRT localization often tags the strings with reading direction. We want this
-                        // for display text (escaped), but don't want this in the value space, as it
-                        // only present for display.
-                        //
-                        var stripped = stripDirectionMarker(escaped);
-                        text += "<option value='" + stripped + "'>" + escaped + "</option>";
-                    }
-                    _SafeHtml.setInnerHTMLUnsafe(this._domElement, text);
-                    this._domElement.selectedIndex = this._index;
-                },
-
-                index: {
-                    get: function () {
-                        return Math.max(0, Math.min(this._index, this._dataSource.getLength() - 1));
-                    },
-                    set: function (value) {
-                        if (this._index !== value) {
-                            this._index = value;
-
-                            var d = this._domElement;
-                            if (d && d.selectedIndex !== value) {
-                                d.selectedIndex = value;
-                            }
-                        }
-                    }
-                },
-
-                value: {
-                    get: function () {
-                        return this._dataSource.getValue(this.index);
-                    }
-                }
-            });
-        })
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_Telemetry',[
-    'exports'
-    ], function telemetryInit(exports) {
-    "use strict";
-
-    /// NOTE: This file should be included when NOT building
-    /// Microsoft WinJS Framework Package which will be available in Windows Store.
-
-    exports.send = function (name, params) {
-    /// <signature helpKeyword="WinJS._Telemetry.send">
-    /// <summary locid="WinJS._Telemetry.send">
-    /// Formatter to upload the name/value pair to Asimov in the correct format.
-    /// This will result in no-op when built outside of Microsoft Framework Package.
-    /// </summary>
-    /// <param name="params" type="Object" locid="WinJS._Telemetry.send_p:params">
-    /// Object of name/value pair items that need to be logged. They can be of type,
-    /// bool, int32, string.  Any other type will be ignored.
-    /// </param>
-    /// </signature>
-        /* empty */
-    };
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_UI',[
-    'exports',
-    '../Core/_BaseCoreUtils',
-    '../Core/_Base'
-    ], function uiInit(exports, _BaseCoreUtils, _Base) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        eventHandler: function (handler) {
-            /// <signature helpKeyword="WinJS.UI.eventHandler">
-            /// <summary locid="WinJS.UI.eventHandler">
-            /// Marks a event handler function as being compatible with declarative processing.
-            /// </summary>
-            /// <param name="handler" type="Object" locid="WinJS.UI.eventHandler_p:handler">
-            /// The handler to be marked as compatible with declarative processing.
-            /// </param>
-            /// <returns type="Object" locid="WinJS.UI.eventHandler_returnValue">
-            /// The input handler.
-            /// </returns>
-            /// </signature>
-            return _BaseCoreUtils.markSupportedForProcessing(handler);
-        },
-        /// <field locid="WinJS.UI.Orientation" helpKeyword="WinJS.UI.Orientation">
-        /// Orientation options for a control's property
-        /// </field>
-        Orientation: {
-            /// <field locid="WinJS.UI.Orientation.horizontal" helpKeyword="WinJS.UI.Orientation.horizontal">
-            /// Horizontal
-            /// </field>
-            horizontal: "horizontal",
-            /// <field locid="WinJS.UI.Orientation.vertical" helpKeyword="WinJS.UI.Orientation.vertical">
-            /// Vertical
-            /// </field>
-            vertical: "vertical"
-        },
-
-        CountResult: {
-            unknown: "unknown"
-        },
-
-        CountError: {
-            noResponse: "noResponse"
-        },
-
-        DataSourceStatus: {
-            ready: "ready",
-            waiting: "waiting",
-            failure: "failure"
-        },
-
-        FetchError: {
-            noResponse: "noResponse",
-            doesNotExist: "doesNotExist"
-        },
-
-        EditError: {
-            noResponse: "noResponse",
-            canceled: "canceled",
-            notPermitted: "notPermitted",
-            noLongerMeaningful: "noLongerMeaningful"
-        },
-
-        /// <field locid="WinJS.UI.ListView.ObjectType" helpKeyword="WinJS.UI.ObjectType">
-        /// Specifies the type of an IListViewEntity.
-        /// </field>
-        ObjectType: {
-            /// <field locid="WinJS.UI.ListView.ObjectType.item" helpKeyword="WinJS.UI.ObjectType.item">
-            /// This value represents a ListView item.
-            /// </field>
-            item: "item",
-            /// <field locid="WinJS.UI.ListView.ObjectType.groupHeader" helpKeyword="WinJS.UI.ObjectType.groupHeader">
-            /// This value represents a ListView group header.
-            /// </field>
-            groupHeader: "groupHeader",
-            /// <field locid="WinJS.UI.ListView.ObjectType.header" helpKeyword="WinJS.UI.ObjectType.header">
-            /// This value represents the ListView's header.
-            /// </field>
-            header: "header",
-            /// <field locid="WinJS.UI.ListView.ObjectType.footer" helpKeyword="WinJS.UI.ObjectType.footer">
-            /// This value represents the ListView's footer.
-            /// </field>
-            footer: "footer",
-        },
-
-        /// <field locid="WinJS.UI.ListView.SelectionMode" helpKeyword="WinJS.UI.SelectionMode">
-        /// Specifies the selection mode for a ListView.
-        /// </field>
-        SelectionMode: {
-            /// <field locid="WinJS.UI.ListView.SelectionMode.none" helpKeyword="WinJS.UI.SelectionMode.none">
-            /// Items cannot be selected.
-            /// </field>
-            none: "none",
-            /// <field locid="WinJS.UI.ListView.SelectionMode.single" helpKeyword="WinJS.UI.SelectionMode.single">
-            /// A single item may be selected.
-            /// <compatibleWith platform="Windows" minVersion="8.0"/>
-            /// </field>
-            single: "single",
-            /// <field locid="WinJS.UI.ListView.SelectionMode.multi" helpKeyword="WinJS.UI.SelectionMode.multi">
-            /// Multiple items may be selected.
-            /// </field>
-            multi: "multi"
-        },
-
-        /// <field locid="WinJS.UI.TapBehavior" helpKeyword="WinJS.UI.TapBehavior">
-        /// Specifies how an ItemContainer or items in a ListView respond to the tap interaction.
-        /// </field>
-        TapBehavior: {
-            /// <field locid="WinJS.UI.TapBehavior.directSelect" helpKeyword="WinJS.UI.TapBehavior.directSelect">
-            /// Tapping the item invokes it and selects it. Navigating to the item with the keyboard changes the
-            /// the selection so that the focused item is the only item that is selected.
-            /// <compatibleWith platform="Windows" minVersion="8.0"/>
-            /// </field>
-            directSelect: "directSelect",
-            /// <field locid="WinJS.UI.TapBehavior.toggleSelect" helpKeyword="WinJS.UI.TapBehavior.toggleSelect">
-            /// Tapping the item invokes it. If the item was selected, tapping it clears the selection. If the item wasn't
-            /// selected, tapping the item selects it.
-            /// Navigating to the item with the keyboard does not select or invoke it.
-            /// </field>
-            toggleSelect: "toggleSelect",
-            /// <field locid="WinJS.UI.TapBehavior.invokeOnly" helpKeyword="WinJS.UI.TapBehavior.invokeOnly">
-            /// Tapping the item invokes it. Navigating to the item with keyboard does not select it or invoke it.
-            /// </field>
-            invokeOnly: "invokeOnly",
-            /// <field locid="WinJS.UI.TapBehavior.none" helpKeyword="WinJS.UI.TapBehavior.none">
-            /// Nothing happens.
-            /// </field>
-            none: "none"
-        },
-
-        /// <field locid="WinJS.UI.SwipeBehavior" helpKeyword="WinJS.UI.SwipeBehavior">
-        /// Specifies whether items are selected when the user performs a swipe interaction.
-        /// <compatibleWith platform="Windows" minVersion="8.0"/>
-        /// </field>
-        SwipeBehavior: {
-            /// <field locid="WinJS.UI.SwipeBehavior.select" helpKeyword="WinJS.UI.SwipeBehavior.select">
-            /// The swipe interaction selects the items touched by the swipe.
-            /// </field>
-            select: "select",
-            /// <field locid="WinJS.UI.SwipeBehavior.none" helpKeyword="WinJS.UI.SwipeBehavior.none">
-            /// The swipe interaction does not change which items are selected.
-            /// </field>
-            none: "none"
-        },
-
-        /// <field locid="WinJS.UI.GroupHeaderTapBehavior" helpKeyword="WinJS.UI.GroupHeaderTapBehavior">
-        /// Specifies how group headers in a ListView respond to the tap interaction.
-        /// </field>
-        GroupHeaderTapBehavior: {
-            /// <field locid="WinJS.UI.GroupHeaderTapBehavior.invoke" helpKeyword="WinJS.UI.GroupHeaderTapBehavior.invoke">
-            /// Tapping the group header invokes it.
-            /// </field>
-            invoke: "invoke",
-            /// <field locid="WinJS.UI.GroupHeaderTapBehavior.none" helpKeyword="WinJS.UI.GroupHeaderTapBehavior.none">
-            /// Nothing happens.
-            /// </field>
-            none: "none"
-        }
-
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities/_Xhr',[
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Promise',
-    '../Scheduler'
-    ], function xhrInit(_Global, _Base, Promise, Scheduler) {
-    "use strict";
-
-    function schedule(f, arg, priority) {
-        Scheduler.schedule(function xhr_callback() {
-            f(arg);
-        }, priority, null, "WinJS.xhr");
-    }
-
-    function noop() {
-    }
-
-    var schemeRegex = /^(\w+)\:\/\//;
-
-    function xhr(options) {
-        /// <signature helpKeyword="WinJS.xhr">
-        /// <summary locid="WinJS.xhr">
-        /// Wraps calls to XMLHttpRequest in a promise.
-        /// </summary>
-        /// <param name="options" type="Object" locid="WinJS.xhr_p:options">
-        /// The options that are applied to the XMLHttpRequest object. They are: type,
-        /// url, user, password, headers, responseType, data, and customRequestInitializer.
-        /// </param>
-        /// <returns type="WinJS.Promise" locid="WinJS.xhr_returnValue">
-        /// A promise that returns the XMLHttpRequest object when it completes.
-        /// </returns>
-        /// </signature>
-        var req;
-        return new Promise(
-            function (c, e, p) {
-                /// <returns value="c(new XMLHttpRequest())" locid="WinJS.xhr.constructor._returnValue" />
-                var priority = Scheduler.currentPriority;
-                req = new _Global.XMLHttpRequest();
-
-                var isLocalRequest = false;
-                var schemeMatch = schemeRegex.exec(options.url.toLowerCase());
-                if (schemeMatch) {
-                    if (schemeMatch[1] === 'file') {
-                        isLocalRequest = true;
-                    }
-                } else if (_Global.location.protocol === 'file:'){
-                    isLocalRequest = true;
-                }
-
-
-                req.onreadystatechange = function () {
-                    if (req._canceled) {
-                        req.onreadystatechange = noop;
-                        return;
-                    }
-
-                    if (req.readyState === 4) {
-                        if ((req.status >= 200 && req.status < 300) || (isLocalRequest && req.status === 0)) {
-                            schedule(c, req, priority);
-                        } else {
-                            schedule(e, req, priority);
-                        }
-                        req.onreadystatechange = noop;
-                    } else {
-                        schedule(p, req, priority);
-                    }
-                };
-
-                req.open(
-                    options.type || "GET",
-                    options.url,
-                    // Promise based XHR does not support sync.
-                    //
-                    true,
-                    options.user,
-                    options.password
-                );
-                req.responseType = options.responseType || "";
-
-                Object.keys(options.headers || {}).forEach(function (k) {
-                    req.setRequestHeader(k, options.headers[k]);
-                });
-
-                if (options.customRequestInitializer) {
-                    options.customRequestInitializer(req);
-                }
-
-                if (options.data === undefined) {
-                    req.send();
-                } else {
-                    req.send(options.data);
-                }
-            },
-            function () {
-                req.onreadystatechange = noop;
-                req._canceled = true;
-                req.abort();
-            }
-        );
-    }
-
-    _Base.Namespace.define("WinJS", {
-        xhr: xhr
-    });
-
-    return xhr;
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Utilities',[
-    './Utilities/_Control',
-    './Utilities/_Dispose',
-    './Utilities/_ElementListUtilities',
-    './Utilities/_ElementUtilities',
-    './Utilities/_Hoverable',
-    './Utilities/_ItemsManager',
-    './Utilities/_KeyboardBehavior',
-    './Utilities/_ParallelWorkQueue',
-    './Utilities/_SafeHtml',
-    './Utilities/_Select',
-    './Utilities/_TabContainer',
-    './Utilities/_Telemetry',
-    './Utilities/_UI',
-    './Utilities/_VersionManager',
-    './Utilities/_Xhr' ], function () {
-
-    //wrapper module
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/XYFocus',["require", "exports", "./Core/_Global", "./Core/_Base", "./Core/_BaseUtils", "./Utilities/_ElementUtilities", "./Core/_Events", "./ControlProcessor/_OptionsParser"], function (require, exports, _Global, _Base, _BaseUtils, _ElementUtilities, _Events, _OptionsParser) {
-    "use strict";
-    var Keys = _ElementUtilities.Key;
-    var AttributeNames = {
-        focusOverride: "data-win-xyfocus",
-        focusOverrideLegacy: "data-win-focus"
-    };
-    var ClassNames = {
-        focusable: "win-focusable",
-        suspended: "win-xyfocus-suspended",
-        toggleMode: "win-xyfocus-togglemode",
-        toggleModeActive: "win-xyfocus-togglemode-active",
-        xboxPlatform: "win-xbox",
-    };
-    var CrossDomainMessageConstants = {
-        messageDataProperty: "msWinJSXYFocusControlMessage",
-        register: "register",
-        unregister: "unregister",
-        dFocusEnter: "dFocusEnter",
-        dFocusExit: "dFocusExit"
-    };
-    var DirectionNames = {
-        left: "left",
-        right: "right",
-        up: "up",
-        down: "down"
-    };
-    var EventNames = {
-        focusChanging: "focuschanging",
-        focusChanged: "focuschanged"
-    };
-    var FocusableTagNames = [
-        "A",
-        "BUTTON",
-        "IFRAME",
-        "INPUT",
-        "SELECT",
-        "TEXTAREA"
-    ];
-    // These factors can be tweaked to adjust which elements are favored by the focus algorithm
-    var ScoringConstants = {
-        primaryAxisDistanceWeight: 30,
-        secondaryAxisDistanceWeight: 20,
-        percentInHistoryShadowWeight: 100000
-    };
-    /**
-     * Gets the mapping object that maps keycodes to XYFocus actions.
-    **/
-    exports.keyCodeMap = {
-        left: [],
-        right: [],
-        up: [],
-        down: [],
-        accept: [],
-        cancel: [],
-    };
-    /**
-     * Gets or sets the focus root when invoking XYFocus APIs.
-    **/
-    exports.focusRoot;
-    function findNextFocusElement(direction, options) {
-        var result = _findNextFocusElementInternal(direction, options);
-        return result ? result.target : null;
-    }
-    exports.findNextFocusElement = findNextFocusElement;
-    function moveFocus(direction, options) {
-        var result = findNextFocusElement(direction, options);
-        if (result) {
-            var previousFocusElement = _Global.document.activeElement;
-            if (_trySetFocus(result, -1)) {
-                eventSrc.dispatchEvent(EventNames.focusChanged, { previousFocusElement: previousFocusElement, keyCode: -1 });
-                return result;
-            }
-        }
-        return null;
-    }
-    exports.moveFocus = moveFocus;
-    // Privates
-    var _lastTarget;
-    var _cachedLastTargetRect;
-    var _historyRect;
-    /**
-     * Executes XYFocus algorithm with the given parameters. Returns true if focus was moved, false otherwise.
-     * @param direction The direction to move focus.
-     * @param keyCode The key code of the pressed key.
-     * @param (optional) A rectangle to use as the source coordinates for finding the next focusable element.
-     * @param (optional) Indicates whether this focus request is allowed to propagate to its parent if we are in iframe.
-    **/
-    function _xyFocus(direction, keyCode, referenceRect, dontExit) {
-        // If focus has moved since the last XYFocus movement, scrolling occured, or an explicit
-        // reference rectangle was given to us, then we invalidate the history rectangle.
-        if (referenceRect || _Global.document.activeElement !== _lastTarget) {
-            _historyRect = null;
-            _lastTarget = null;
-            _cachedLastTargetRect = null;
-        }
-        else if (_lastTarget && _cachedLastTargetRect) {
-            var lastTargetRect = _toIRect(_lastTarget.getBoundingClientRect());
-            if (lastTargetRect.left !== _cachedLastTargetRect.left || lastTargetRect.top !== _cachedLastTargetRect.top) {
-                _historyRect = null;
-                _lastTarget = null;
-                _cachedLastTargetRect = null;
-            }
-        }
-        var activeElement = _Global.document.activeElement;
-        var lastTarget = _lastTarget;
-        var result = _findNextFocusElementInternal(direction, {
-            focusRoot: exports.focusRoot,
-            historyRect: _historyRect,
-            referenceElement: _lastTarget,
-            referenceRect: referenceRect
-        });
-        if (result && _trySetFocus(result.target, keyCode)) {
-            // A focus target was found
-            updateHistoryRect(direction, result);
-            _lastTarget = result.target;
-            _cachedLastTargetRect = result.targetRect;
-            if (_ElementUtilities.hasClass(result.target, ClassNames.toggleMode)) {
-                _ElementUtilities.removeClass(result.target, ClassNames.toggleModeActive);
-            }
-            if (result.target.tagName === "IFRAME") {
-                var targetIframe = result.target;
-                if (IFrameHelper.isXYFocusEnabled(targetIframe)) {
-                    // If we successfully moved focus and the new focused item is an IFRAME, then we need to notify it
-                    // Note on coordinates: When signaling enter, DO transform the coordinates into the child frame's coordinate system.
-                    var refRect = _toIRect({
-                        left: result.referenceRect.left - result.targetRect.left,
-                        top: result.referenceRect.top - result.targetRect.top,
-                        width: result.referenceRect.width,
-                        height: result.referenceRect.height
-                    });
-                    var message = {};
-                    message[CrossDomainMessageConstants.messageDataProperty] = {
-                        type: CrossDomainMessageConstants.dFocusEnter,
-                        direction: direction,
-                        referenceRect: refRect
-                    };
-                    // postMessage API is safe even in cross-domain scenarios.
-                    targetIframe.contentWindow.postMessage(message, "*");
-                }
-            }
-            eventSrc.dispatchEvent(EventNames.focusChanged, { previousFocusElement: activeElement, keyCode: keyCode });
-            return true;
-        }
-        else {
-            // No focus target was found; if we are inside an IFRAME and focus is allowed to propagate out, notify the parent that focus is exiting this IFRAME
-            // Note on coordinates: When signaling exit, do NOT transform the coordinates into the parent's coordinate system.
-            if (!dontExit && top !== window) {
-                var refRect = referenceRect;
-                if (!refRect) {
-                    refRect = _Global.document.activeElement ? _toIRect(_Global.document.activeElement.getBoundingClientRect()) : _defaultRect();
-                }
-                var message = {};
-                message[CrossDomainMessageConstants.messageDataProperty] = {
-                    type: CrossDomainMessageConstants.dFocusExit,
-                    direction: direction,
-                    referenceRect: refRect
-                };
-                // postMessage API is safe even in cross-domain scenarios.
-                _Global.parent.postMessage(message, "*");
-                return true;
-            }
-        }
-        return false;
-        // Nested Helpers
-        function updateHistoryRect(direction, result) {
-            var newHistoryRect = _defaultRect();
-            // It's possible to get into a situation where the target element has no overlap with the reference edge.
-            //
-            //..╔══════════════╗..........................
-            //..║   reference  ║..........................
-            //..╚══════════════╝..........................
-            //.....................╔═══════════════════╗..
-            //.....................║                   ║..
-            //.....................║       target      ║..
-            //.....................║                   ║..
-            //.....................╚═══════════════════╝..
-            //
-            // If that is the case, we need to reset the coordinates to the edge of the target element.
-            if (direction === DirectionNames.left || direction === DirectionNames.right) {
-                newHistoryRect.top = Math.max(result.targetRect.top, result.referenceRect.top, _historyRect ? _historyRect.top : Number.MIN_VALUE);
-                newHistoryRect.bottom = Math.min(result.targetRect.bottom, result.referenceRect.bottom, _historyRect ? _historyRect.bottom : Number.MAX_VALUE);
-                if (newHistoryRect.bottom <= newHistoryRect.top) {
-                    newHistoryRect.top = result.targetRect.top;
-                    newHistoryRect.bottom = result.targetRect.bottom;
-                }
-                newHistoryRect.height = newHistoryRect.bottom - newHistoryRect.top;
-                newHistoryRect.width = Number.MAX_VALUE;
-                newHistoryRect.left = Number.MIN_VALUE;
-                newHistoryRect.right = Number.MAX_VALUE;
-            }
-            else {
-                newHistoryRect.left = Math.max(result.targetRect.left, result.referenceRect.left, _historyRect ? _historyRect.left : Number.MIN_VALUE);
-                newHistoryRect.right = Math.min(result.targetRect.right, result.referenceRect.right, _historyRect ? _historyRect.right : Number.MAX_VALUE);
-                if (newHistoryRect.right <= newHistoryRect.left) {
-                    newHistoryRect.left = result.targetRect.left;
-                    newHistoryRect.right = result.targetRect.right;
-                }
-                newHistoryRect.width = newHistoryRect.right - newHistoryRect.left;
-                newHistoryRect.height = Number.MAX_VALUE;
-                newHistoryRect.top = Number.MIN_VALUE;
-                newHistoryRect.bottom = Number.MAX_VALUE;
-            }
-            _historyRect = newHistoryRect;
-        }
-    }
-    function _findNextFocusElementInternal(direction, options) {
-        options = options || {};
-        options.focusRoot = options.focusRoot || exports.focusRoot || _Global.document.body;
-        options.historyRect = options.historyRect || _defaultRect();
-        var maxDistance = Math.max(_Global.screen.availHeight, _Global.screen.availWidth);
-        var refObj = getReferenceObject(options.referenceElement, options.referenceRect);
-        // Handle override
-        if (refObj.element) {
-            var manualOverrideOptions = refObj.element.getAttribute(AttributeNames.focusOverride) || refObj.element.getAttribute(AttributeNames.focusOverrideLegacy);
-            if (manualOverrideOptions) {
-                var parsedOptions = _OptionsParser.optionsParser(manualOverrideOptions);
-                // The left-hand side can be cased as either "left" or "Left".
-                var selector = parsedOptions[direction] || parsedOptions[direction[0].toUpperCase() + direction.substr(1)];
-                if (selector) {
-                    var target;
-                    var element = refObj.element;
-                    while (!target && element) {
-                        target = element.querySelector(selector);
-                        element = element.parentElement;
-                    }
-                    if (target) {
-                        if (target === _Global.document.activeElement) {
-                            return null;
-                        }
-                        return { target: target, targetRect: _toIRect(target.getBoundingClientRect()), referenceRect: refObj.rect, usedOverride: true };
-                    }
-                }
-            }
-        }
-        // Calculate scores for each element in the root
-        var bestPotential = {
-            element: null,
-            rect: null,
-            score: 0
-        };
-        var allElements = options.focusRoot.querySelectorAll("*");
-        for (var i = 0, length = allElements.length; i < length; i++) {
-            var potentialElement = allElements[i];
-            if (refObj.element === potentialElement || !_isFocusable(potentialElement) || _isInInactiveToggleModeContainer(potentialElement)) {
-                continue;
-            }
-            var potentialRect = _toIRect(potentialElement.getBoundingClientRect());
-            // Skip elements that have either a width of zero or a height of zero
-            if (potentialRect.width === 0 || potentialRect.height === 0) {
-                continue;
-            }
-            var score = calculateScore(direction, maxDistance, options.historyRect, refObj.rect, potentialRect);
-            if (score > bestPotential.score) {
-                bestPotential.element = potentialElement;
-                bestPotential.rect = potentialRect;
-                bestPotential.score = score;
-            }
-        }
-        return bestPotential.element ? { target: bestPotential.element, targetRect: bestPotential.rect, referenceRect: refObj.rect, usedOverride: false } : null;
-        // Nested Helpers
-        function calculatePercentInShadow(minReferenceCoord, maxReferenceCoord, minPotentialCoord, maxPotentialCoord) {
-            /// Calculates the percentage of the potential element that is in the shadow of the reference element.
-            if ((minReferenceCoord >= maxPotentialCoord) || (maxReferenceCoord <= minPotentialCoord)) {
-                // Potential is not in the reference's shadow.
-                return 0;
-            }
-            var pixelOverlap = Math.min(maxReferenceCoord, maxPotentialCoord) - Math.max(minReferenceCoord, minPotentialCoord);
-            var shortEdge = Math.min(maxPotentialCoord - minPotentialCoord, maxReferenceCoord - minReferenceCoord);
-            return shortEdge === 0 ? 0 : (pixelOverlap / shortEdge);
-        }
-        function calculateScore(direction, maxDistance, historyRect, referenceRect, potentialRect) {
-            var score = 0;
-            var percentInShadow;
-            var primaryAxisDistance;
-            var secondaryAxisDistance = 0;
-            var percentInHistoryShadow = 0;
-            switch (direction) {
-                case DirectionNames.left:
-                    // Make sure we don't evaluate any potential elements to the right of the reference element
-                    if (potentialRect.left >= referenceRect.left) {
-                        break;
-                    }
-                    percentInShadow = calculatePercentInShadow(referenceRect.top, referenceRect.bottom, potentialRect.top, potentialRect.bottom);
-                    primaryAxisDistance = referenceRect.left - potentialRect.right;
-                    if (percentInShadow > 0) {
-                        percentInHistoryShadow = calculatePercentInShadow(historyRect.top, historyRect.bottom, potentialRect.top, potentialRect.bottom);
-                    }
-                    else {
-                        // If the potential element is not in the shadow, then we calculate secondary axis distance
-                        secondaryAxisDistance = (referenceRect.bottom <= potentialRect.top) ? (potentialRect.top - referenceRect.bottom) : referenceRect.top - potentialRect.bottom;
-                    }
-                    break;
-                case DirectionNames.right:
-                    // Make sure we don't evaluate any potential elements to the left of the reference element
-                    if (potentialRect.right <= referenceRect.right) {
-                        break;
-                    }
-                    percentInShadow = calculatePercentInShadow(referenceRect.top, referenceRect.bottom, potentialRect.top, potentialRect.bottom);
-                    primaryAxisDistance = potentialRect.left - referenceRect.right;
-                    if (percentInShadow > 0) {
-                        percentInHistoryShadow = calculatePercentInShadow(historyRect.top, historyRect.bottom, potentialRect.top, potentialRect.bottom);
-                    }
-                    else {
-                        // If the potential element is not in the shadow, then we calculate secondary axis distance
-                        secondaryAxisDistance = (referenceRect.bottom <= potentialRect.top) ? (potentialRect.top - referenceRect.bottom) : referenceRect.top - potentialRect.bottom;
-                    }
-                    break;
-                case DirectionNames.up:
-                    // Make sure we don't evaluate any potential elements below the reference element
-                    if (potentialRect.top >= referenceRect.top) {
-                        break;
-                    }
-                    percentInShadow = calculatePercentInShadow(referenceRect.left, referenceRect.right, potentialRect.left, potentialRect.right);
-                    primaryAxisDistance = referenceRect.top - potentialRect.bottom;
-                    if (percentInShadow > 0) {
-                        percentInHistoryShadow = calculatePercentInShadow(historyRect.left, historyRect.right, potentialRect.left, potentialRect.right);
-                    }
-                    else {
-                        // If the potential element is not in the shadow, then we calculate secondary axis distance
-                        secondaryAxisDistance = (referenceRect.right <= potentialRect.left) ? (potentialRect.left - referenceRect.right) : referenceRect.left - potentialRect.right;
-                    }
-                    break;
-                case DirectionNames.down:
-                    // Make sure we don't evaluate any potential elements above the reference element
-                    if (potentialRect.bottom <= referenceRect.bottom) {
-                        break;
-                    }
-                    percentInShadow = calculatePercentInShadow(referenceRect.left, referenceRect.right, potentialRect.left, potentialRect.right);
-                    primaryAxisDistance = potentialRect.top - referenceRect.bottom;
-                    if (percentInShadow > 0) {
-                        percentInHistoryShadow = calculatePercentInShadow(historyRect.left, historyRect.right, potentialRect.left, potentialRect.right);
-                    }
-                    else {
-                        // If the potential element is not in the shadow, then we calculate secondary axis distance
-                        secondaryAxisDistance = (referenceRect.right <= potentialRect.left) ? (potentialRect.left - referenceRect.right) : referenceRect.left - potentialRect.right;
-                    }
-                    break;
-            }
-            if (primaryAxisDistance >= 0) {
-                // The score needs to be a positive number so we make these distances positive numbers
-                primaryAxisDistance = maxDistance - primaryAxisDistance;
-                secondaryAxisDistance = maxDistance - secondaryAxisDistance;
-                if (primaryAxisDistance >= 0 && secondaryAxisDistance >= 0) {
-                    // Potential elements in the shadow get a multiplier to their final score
-                    primaryAxisDistance += primaryAxisDistance * percentInShadow;
-                    score = primaryAxisDistance * ScoringConstants.primaryAxisDistanceWeight + secondaryAxisDistance * ScoringConstants.secondaryAxisDistanceWeight + percentInHistoryShadow * ScoringConstants.percentInHistoryShadowWeight;
-                }
-            }
-            return score;
-        }
-        function getReferenceObject(referenceElement, referenceRect) {
-            var refElement;
-            var refRect;
-            if ((!referenceElement && !referenceRect) || (referenceElement && !referenceElement.parentNode)) {
-                // Note: We need to check to make sure 'parentNode' is not null otherwise there is a case
-                // where _lastTarget is defined, but calling getBoundingClientRect will throw a native exception.
-                // This case happens if the innerHTML of the parent of the _lastTarget is set to "".
-                // If no valid reference is supplied, we'll use _Global.document.activeElement unless it's the body
-                if (_Global.document.activeElement !== _Global.document.body) {
-                    referenceElement = _Global.document.activeElement;
-                }
-            }
-            if (referenceElement) {
-                refElement = referenceElement;
-                refRect = _toIRect(refElement.getBoundingClientRect());
-            }
-            else if (referenceRect) {
-                refRect = _toIRect(referenceRect);
-            }
-            else {
-                refRect = _defaultRect();
-            }
-            return {
-                element: refElement,
-                rect: refRect
-            };
-        }
-    }
-    function _defaultRect() {
-        // We set the top, left, bottom and right properties of the referenceBoundingRectangle to '-1'
-        // (as opposed to '0') because we want to make sure that even elements that are up to the edge
-        // of the screen can receive focus.
-        return {
-            top: -1,
-            bottom: -1,
-            right: -1,
-            left: -1,
-            height: 0,
-            width: 0
-        };
-    }
-    function _toIRect(rect) {
-        return {
-            top: Math.floor(rect.top),
-            bottom: Math.floor(rect.top + rect.height),
-            right: Math.floor(rect.left + rect.width),
-            left: Math.floor(rect.left),
-            height: Math.floor(rect.height),
-            width: Math.floor(rect.width),
-        };
-    }
-    function _trySetFocus(element, keyCode) {
-        // We raise an event on the focusRoot before focus changes to give listeners
-        // a chance to prevent the next focus target from receiving focus if they want.
-        var canceled = eventSrc.dispatchEvent(EventNames.focusChanging, { nextFocusElement: element, keyCode: keyCode });
-        if (!canceled) {
-            element.focus();
-        }
-        return _Global.document.activeElement === element;
-    }
-    function _isFocusable(element) {
-        var elementTagName = element.tagName;
-        if (!element.hasAttribute("tabindex") && FocusableTagNames.indexOf(elementTagName) === -1 && !_ElementUtilities.hasClass(element, ClassNames.focusable)) {
-            // If the current potential element is not one of the tags we consider to be focusable, then exit
-            return false;
-        }
-        if (elementTagName === "IFRAME" && !IFrameHelper.isXYFocusEnabled(element)) {
-            // Skip IFRAMEs without compatible XYFocus implementation
-            return false;
-        }
-        if (elementTagName === "DIV" && element["winControl"] && element["winControl"].disabled) {
-            // Skip disabled WinJS controls
-            return false;
-        }
-        var style = _ElementUtilities._getComputedStyle(element);
-        if (element.getAttribute("tabIndex") === "-1" || style.display === "none" || style.visibility === "hidden" || element.disabled) {
-            // Skip elements that are hidden
-            // Note: We don't check for opacity === 0, because the browser cannot tell us this value accurately.
-            return false;
-        }
-        return true;
-    }
-    function _findParentToggleModeContainer(element) {
-        var toggleModeRoot = element.parentElement;
-        while (toggleModeRoot && !_isToggleMode(toggleModeRoot)) {
-            toggleModeRoot = toggleModeRoot.parentElement;
-        }
-        return toggleModeRoot;
-    }
-    function _isInInactiveToggleModeContainer(element) {
-        var container = _findParentToggleModeContainer(element);
-        return container && !_ElementUtilities.hasClass(container, ClassNames.toggleModeActive);
-    }
-    function _isToggleMode(element) {
-        if (_ElementUtilities.hasClass(_Global.document.body, ClassNames.xboxPlatform)) {
-            return false;
-        }
-        if (_ElementUtilities.hasClass(element, ClassNames.toggleMode)) {
-            return true;
-        }
-        if (element.tagName === "INPUT") {
-            var inputType = element.type.toLowerCase();
-            if (inputType === "date" || inputType === "datetime" || inputType === "datetime-local" || inputType === "email" || inputType === "month" || inputType === "number" || inputType === "password" || inputType === "range" || inputType === "search" || inputType === "tel" || inputType === "text" || inputType === "time" || inputType === "url" || inputType === "week") {
-                return true;
-            }
-        }
-        else if (element.tagName === "TEXTAREA") {
-            return true;
-        }
-        return false;
-    }
-    function _getStateHandler(element) {
-        var suspended = false;
-        var toggleMode = false;
-        var toggleModeActive = false;
-        if (element) {
-            suspended = _ElementUtilities._matchesSelector(element, "." + ClassNames.suspended + ", ." + ClassNames.suspended + " *");
-            toggleMode = _isToggleMode(element);
-            toggleModeActive = _ElementUtilities.hasClass(element, ClassNames.toggleModeActive);
-        }
-        var stateHandler = KeyHandlerStates.RestState;
-        if (suspended) {
-            stateHandler = KeyHandlerStates.SuspendedState;
-        }
-        else {
-            if (toggleMode) {
-                if (toggleModeActive) {
-                    stateHandler = KeyHandlerStates.ToggleModeActiveState;
-                }
-                else {
-                    stateHandler = KeyHandlerStates.ToggleModeRestState;
-                }
-            }
-        }
-        return stateHandler;
-    }
-    function _handleKeyEvent(e) {
-        if (e.defaultPrevented) {
-            return;
-        }
-        var stateHandler = _getStateHandler(document.activeElement);
-        var direction = "";
-        if (exports.keyCodeMap.up.indexOf(e.keyCode) !== -1) {
-            direction = "up";
-        }
-        else if (exports.keyCodeMap.down.indexOf(e.keyCode) !== -1) {
-            direction = "down";
-        }
-        else if (exports.keyCodeMap.left.indexOf(e.keyCode) !== -1) {
-            direction = "left";
-        }
-        else if (exports.keyCodeMap.right.indexOf(e.keyCode) !== -1) {
-            direction = "right";
-        }
-        if (direction) {
-            var shouldPreventDefault = stateHandler.xyFocus(direction, e.keyCode);
-            if (shouldPreventDefault) {
-                e.preventDefault();
-            }
-        }
-    }
-    function _handleCaptureKeyEvent(e) {
-        if (e.defaultPrevented) {
-            return;
-        }
-        var activeElement = document.activeElement;
-        var shouldPreventDefault = false;
-        var stateHandler = _getStateHandler(document.activeElement);
-        if (exports.keyCodeMap.accept.indexOf(e.keyCode) !== -1) {
-            shouldPreventDefault = stateHandler.accept(activeElement);
-        }
-        else if (exports.keyCodeMap.cancel.indexOf(e.keyCode) !== -1) {
-            shouldPreventDefault = stateHandler.cancel(activeElement);
-        }
-        if (shouldPreventDefault) {
-            e.preventDefault();
-        }
-    }
-    var KeyHandlerStates;
-    (function (KeyHandlerStates) {
-        // Element is not suspended and does not use toggle mode.
-        var RestState = (function () {
-            function RestState() {
-            }
-            RestState.accept = _clickElement;
-            RestState.cancel = _nop;
-            RestState.xyFocus = _xyFocus; // Prevent default when XYFocus moves focus
-            return RestState;
-        })();
-        KeyHandlerStates.RestState = RestState;
-        // Element has opted out of XYFocus.
-        var SuspendedState = (function () {
-            function SuspendedState() {
-            }
-            SuspendedState.accept = _nop;
-            SuspendedState.cancel = _nop;
-            SuspendedState.xyFocus = _nop;
-            return SuspendedState;
-        })();
-        KeyHandlerStates.SuspendedState = SuspendedState;
-        // Element uses toggle mode but is not toggled nor opted out of XYFocus.
-        var ToggleModeRestState = (function () {
-            function ToggleModeRestState() {
-            }
-            ToggleModeRestState.accept = function (element) {
-                _ElementUtilities.addClass(element, ClassNames.toggleModeActive);
-                return true;
-            };
-            ToggleModeRestState.cancel = _nop;
-            ToggleModeRestState.xyFocus = _xyFocus; // Prevent default when XYFocus moves focus
-            return ToggleModeRestState;
-        })();
-        KeyHandlerStates.ToggleModeRestState = ToggleModeRestState;
-        // Element uses toggle mode and is toggled and did not opt out of XYFocus.
-        var ToggleModeActiveState = (function () {
-            function ToggleModeActiveState() {
-            }
-            ToggleModeActiveState.cancel = function (element) {
-                element && _ElementUtilities.removeClass(element, ClassNames.toggleModeActive);
-                return true;
-            };
-            ToggleModeActiveState.accept = _clickElement;
-            ToggleModeActiveState.xyFocus = _nop;
-            return ToggleModeActiveState;
-        })();
-        KeyHandlerStates.ToggleModeActiveState = ToggleModeActiveState;
-        function _clickElement(element) {
-            element && element.click && element.click();
-            return false;
-        }
-        function _nop() {
-            var args = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                args[_i - 0] = arguments[_i];
-            }
-            return false;
-        }
-    })(KeyHandlerStates || (KeyHandlerStates = {}));
-    var IFrameHelper;
-    (function (IFrameHelper) {
-        // XYFocus caches registered iframes and iterates over the cache for its focus navigation implementation.
-        // However, since there is no reliable way for an iframe to unregister with its parent as it can be
-        // spontaneously taken out of the DOM, the cache can go stale. This helper module makes sure that on
-        // every query to the iframe cache, stale iframes are removed.
-        // Furthermore, merely accessing an iframe that has been garbage collected by the platform will cause an
-        // exception so each iteration during a query must be in a try/catch block.
-        var iframes = [];
-        function count() {
-            // Iterating over it causes stale iframes to be cleared from the cache.
-            _safeForEach(function () { return false; });
-            return iframes.length;
-        }
-        IFrameHelper.count = count;
-        function getIFrameFromWindow(win) {
-            var iframes = _Global.document.querySelectorAll("IFRAME");
-            var found = Array.prototype.filter.call(iframes, function (x) { return x.contentWindow === win; });
-            return found.length ? found[0] : null;
-        }
-        IFrameHelper.getIFrameFromWindow = getIFrameFromWindow;
-        function isXYFocusEnabled(iframe) {
-            var found = false;
-            _safeForEach(function (ifr) {
-                if (ifr === iframe) {
-                    found = true;
-                }
-            });
-            return found;
-        }
-        IFrameHelper.isXYFocusEnabled = isXYFocusEnabled;
-        function registerIFrame(iframe) {
-            iframes.push(iframe);
-        }
-        IFrameHelper.registerIFrame = registerIFrame;
-        function unregisterIFrame(iframe) {
-            var index = -1;
-            _safeForEach(function (ifr, i) {
-                if (ifr === iframe) {
-                    index = i;
-                }
-            });
-            if (index !== -1) {
-                iframes.splice(index, 1);
-            }
-        }
-        IFrameHelper.unregisterIFrame = unregisterIFrame;
-        function _safeForEach(callback) {
-            for (var i = iframes.length - 1; i >= 0; i--) {
-                try {
-                    var iframe = iframes[i];
-                    if (!iframe.contentWindow) {
-                        iframes.splice(i, 1);
-                    }
-                    else {
-                        callback(iframe, i);
-                    }
-                }
-                catch (e) {
-                    // Iframe has been GC'd
-                    iframes.splice(i, 1);
-                }
-            }
-        }
-    })(IFrameHelper || (IFrameHelper = {}));
-    if (_Global.document) {
-        // Note: This module is not supported in WebWorker
-        // Default mappings
-        exports.keyCodeMap.left.push(Keys.GamepadLeftThumbstickLeft, Keys.GamepadDPadLeft, Keys.NavigationLeft);
-        exports.keyCodeMap.right.push(Keys.GamepadLeftThumbstickRight, Keys.GamepadDPadRight, Keys.NavigationRight);
-        exports.keyCodeMap.up.push(Keys.GamepadLeftThumbstickUp, Keys.GamepadDPadUp, Keys.NavigationUp);
-        exports.keyCodeMap.down.push(Keys.GamepadLeftThumbstickDown, Keys.GamepadDPadDown, Keys.NavigationDown);
-        exports.keyCodeMap.accept.push(Keys.GamepadA, Keys.NavigationAccept);
-        exports.keyCodeMap.cancel.push(Keys.GamepadB, Keys.NavigationCancel);
-        _Global.addEventListener("message", function (e) {
-            // Note: e.source is the Window object of an iframe which could be hosting content
-            // from a different domain. No properties on e.source should be accessed or we may
-            // run into a cross-domain access violation exception.
-            var sourceWindow = null;
-            try {
-                // Since messages are async, by the time we get this message, the iframe could've
-                // been removed from the DOM and e.source is null or throws an exception on access.
-                sourceWindow = e.source;
-                if (!sourceWindow) {
-                    return;
-                }
-            }
-            catch (e) {
-                return;
-            }
-            if (!e.data || !e.data[CrossDomainMessageConstants.messageDataProperty]) {
-                return;
-            }
-            var data = e.data[CrossDomainMessageConstants.messageDataProperty];
-            switch (data.type) {
-                case CrossDomainMessageConstants.register:
-                    var iframe = IFrameHelper.getIFrameFromWindow(sourceWindow);
-                    iframe && IFrameHelper.registerIFrame(iframe);
-                    break;
-                case CrossDomainMessageConstants.unregister:
-                    var iframe = IFrameHelper.getIFrameFromWindow(sourceWindow);
-                    iframe && IFrameHelper.unregisterIFrame(iframe);
-                    break;
-                case CrossDomainMessageConstants.dFocusEnter:
-                    // The coordinates stored in data.refRect are already in this frame's coordinate system.
-                    // First try to focus anything within this iframe without leaving the current frame.
-                    var focused = _xyFocus(data.direction, -1, data.referenceRect, true);
-                    if (!focused) {
-                        // No focusable element was found, we'll focus document.body if it is focusable.
-                        if (_isFocusable(_Global.document.body)) {
-                            _Global.document.body.focus();
-                        }
-                        else {
-                            // Nothing within this iframe is focusable, we call _xyFocus again without a refRect
-                            // and allow the request to propagate to the parent.
-                            _xyFocus(data.direction, -1);
-                        }
-                    }
-                    break;
-                case CrossDomainMessageConstants.dFocusExit:
-                    var iframe = IFrameHelper.getIFrameFromWindow(sourceWindow);
-                    if (_Global.document.activeElement !== iframe) {
-                        break;
-                    }
-                    // The coordinates stored in data.refRect are in the IFRAME's coordinate system,
-                    // so we must first transform them into this frame's coordinate system.
-                    var refRect = data.referenceRect;
-                    var iframeRect = iframe.getBoundingClientRect();
-                    refRect.left += iframeRect.left;
-                    refRect.top += iframeRect.top;
-                    if (typeof refRect.right === "number") {
-                        refRect.right += iframeRect.left;
-                    }
-                    if (typeof refRect.bottom === "number") {
-                        refRect.bottom += iframeRect.top;
-                    }
-                    _xyFocus(data.direction, -1, refRect);
-                    break;
-            }
-        });
-        _BaseUtils.ready().then(function () {
-            if (_ElementUtilities.hasWinRT && _Global["Windows"] && _Global["Windows"]["Xbox"]) {
-                _ElementUtilities.addClass(_Global.document.body, ClassNames.xboxPlatform);
-            }
-            // Subscribe on capture phase to prevent this key event from interacting with
-            // the element/control if XYFocus handled it for accept/cancel keys.
-            _Global.document.addEventListener("keydown", _handleCaptureKeyEvent, true);
-            // Subscribe on bubble phase to allow developers to override XYFocus behaviors for directional keys.
-            _Global.document.addEventListener("keydown", _handleKeyEvent);
-            // If we are running within an iframe, we send a registration message to the parent window
-            if (_Global.top !== _Global.window) {
-                var message = {};
-                message[CrossDomainMessageConstants.messageDataProperty] = {
-                    type: CrossDomainMessageConstants.register,
-                    version: 1.0
-                };
-                _Global.parent.postMessage(message, "*");
-            }
-        });
-        // Publish to WinJS namespace
-        var toPublish = {
-            focusRoot: {
-                get: function () {
-                    return exports.focusRoot;
-                },
-                set: function (value) {
-                    exports.focusRoot = value;
-                }
-            },
-            findNextFocusElement: findNextFocusElement,
-            keyCodeMap: exports.keyCodeMap,
-            moveFocus: moveFocus,
-            onfocuschanged: _Events._createEventProperty(EventNames.focusChanged),
-            onfocuschanging: _Events._createEventProperty(EventNames.focusChanging),
-            _xyFocus: _xyFocus,
-            _iframeHelper: IFrameHelper
-        };
-        toPublish = _BaseUtils._merge(toPublish, _Events.eventMixin);
-        toPublish["_listeners"] = {};
-        var eventSrc = toPublish;
-        _Base.Namespace.define("WinJS.UI.XYFocus", toPublish);
-    }
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Fragments',[
-    'exports',
-    './Core/_Global',
-    './Core/_WinRT',
-    './Core/_Base',
-    './Core/_BaseUtils',
-    './Core/_ErrorFromName',
-    './Core/_Resources',
-    './Core/_WriteProfilerMark',
-    './Promise',
-    './Utilities/_ElementUtilities',
-    './Utilities/_SafeHtml',
-    './Utilities/_Xhr'
-], function fragmentLoaderInit(exports, _Global, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Resources, _WriteProfilerMark, Promise, _ElementUtilities, _SafeHtml, _Xhr) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-
-    var forEach = function (arrayLikeValue, action) {
-        for (var i = 0, l = arrayLikeValue.length; i < l; i++) {
-            action(arrayLikeValue[i], i);
-        }
-    };
-    var head = _Global.document.head || _Global.document.getElementsByTagName("head")[0];
-    var scripts = {};
-    var styles = {};
-    var links = {};
-    var initialized = false;
-    var cacheStore = {};
-    var uniqueId = 1;
-
-    function addScript(scriptTag, fragmentHref, position, lastNonInlineScriptPromise) {
-        // We synthesize a name for inline scripts because today we put the
-        // inline scripts in the same processing pipeline as src scripts. If
-        // we seperated inline scripts into their own logic, we could simplify
-        // this somewhat.
-        //
-        var src = scriptTag.src;
-        var inline = !src;
-        if (inline) {
-            src = fragmentHref + "script[" + position + "]";
-        }
-        src = src.toLowerCase();
-
-        if (!(src in scripts)) {
-            var promise = null;
-
-            scripts[src] = true;
-            var n = _Global.document.createElement("script");
-            if (scriptTag.language) {
-                n.setAttribute("language", "javascript");
-            }
-            n.setAttribute("type", scriptTag.type);
-            n.setAttribute("async", "false");
-            if (scriptTag.id) {
-                n.setAttribute("id", scriptTag.id);
-            }
-            if (inline) {
-                var text = scriptTag.text;
-                promise = lastNonInlineScriptPromise.then(function () {
-                    n.text = text;
-                }).then(null, function () {
-                    // eat error
-                });
-            } else {
-                promise = new Promise(function (c) {
-                    n.onload = n.onerror = function () {
-                        c();
-                    };
-
-                    // Using scriptTag.src to maintain the original casing
-                    n.setAttribute("src", scriptTag.src);
-                });
-            }
-            head.appendChild(n);
-
-            return {
-                promise: promise,
-                inline: inline,
-            };
-        }
-    }
-
-    function addStyle(styleTag, fragmentHref, position) {
-        var src = (fragmentHref + "script[" + position + "]").toLowerCase();
-        if (!(src in styles)) {
-            styles[src] = true;
-            head.appendChild(styleTag.cloneNode(true));
-        }
-    }
-
-    function addLink(styleTag) {
-        var src = styleTag.href.toLowerCase();
-        if (!(src in links)) {
-            links[src] = true;
-            var n = styleTag.cloneNode(false);
-
-            // Using scriptTag.href  to maintain the original casing
-            n.href = styleTag.href;
-            head.appendChild(n);
-        }
-    }
-
-    function getStateRecord(href, removeFromCache) {
-        if (typeof href === "string") {
-            return loadFromCache(href, removeFromCache);
-        } else {
-            var state = {
-                docfrag: _ElementUtilities.data(href).docFragment
-            };
-            if (!state.docfrag) {
-                var fragment = _Global.document.createDocumentFragment();
-                while (href.childNodes.length > 0) {
-                    fragment.appendChild(href.childNodes[0]);
-                }
-                state.docfrag = _ElementUtilities.data(href).docFragment = fragment;
-                href.setAttribute("data-win-hasfragment", "");
-            }
-            if (removeFromCache) {
-                clearCache(href);
-            }
-            return Promise.as(state);
-        }
-    }
-    function createEntry(state, href) {
-        return populateDocument(state, href).
-            then(function () {
-                if (state.document) {
-                    return processDocument(href, state);
-                } else {
-                    return state;
-                }
-            }).
-            then(function () {
-                if (state.document) {
-                    delete state.document;
-                }
-                return state;
-            });
-    }
-
-    function loadFromCache(href, removeFromCache) {
-        var fragmentId = href.toLowerCase();
-        var state = cacheStore[fragmentId];
-
-        if (state) {
-            if (removeFromCache) {
-                delete cacheStore[fragmentId];
-            }
-            if (state.promise) {
-                return state.promise;
-            } else {
-                return Promise.as(state);
-            }
-        } else {
-            state = {};
-            if (!removeFromCache) {
-                cacheStore[fragmentId] = state;
-            }
-            var result = state.promise = createEntry(state, href);
-            state.promise.then(function () { delete state.promise; });
-            return result;
-        }
-    }
-
-    function processDocument(href, state) {
-        // Once the control's static state has been loaded in the temporary iframe,
-        // this method spelunks the iframe's document to retrieve all relevant information. Also,
-        // this performs any needed fixups on the DOM (like adjusting relative URLs).
-
-        var cd = state.document;
-        var b = cd.body;
-        var sp = [];
-
-        forEach(cd.querySelectorAll('link[rel="stylesheet"], link[type="text/css"]'), addLink);
-        forEach(cd.getElementsByTagName('style'), function (e, i) { addStyle(e, href, i); });
-
-        // In DOCMODE 11 IE moved to the standards based script loading behavior of
-        // having out-of-line script elements which are dynamically added to the DOM
-        // asynchronously load. This raises two problems for our fragment loader,
-        //
-        //  1) out-of-line scripts need to execute in order
-        //
-        //  2) so do in-line scripts.
-        //
-        // In order to mitigate this behavior we do two things:
-        //
-        //  A) We mark all scripts with the attribute async='false' which makes
-        //     out-of-line scripts respect DOM append order for execution when they
-        //     are eventually retrieved
-        //
-        //  B) We chain the setting of in-line script element's 'text' property
-        //     on the completion of the previous out-of-line script's execution.
-        //     This relies on the fact that the out-of-line script elements will
-        //     synchronously run their onload handler immediately after executing
-        //     thus assuring that the in-line script will run before the next
-        //     trailing out-of-line script.
-        //
-        var lastNonInlineScriptPromise = Promise.as();
-        forEach(cd.getElementsByTagName('script'), function (e, i) {
-            var result = addScript(e, href, i, lastNonInlineScriptPromise);
-            if (result) {
-                if (!result.inline) {
-                    lastNonInlineScriptPromise = result.promise;
-                }
-                sp.push(result.promise);
-            }
-        });
-
-        forEach(b.getElementsByTagName('img'), function (e) { e.src = e.src; });
-        forEach(b.getElementsByTagName('a'), function (e) {
-            // for # only anchor tags, we don't update the href
-            //
-            if (e.href !== "") {
-                var href = e.getAttribute("href");
-                if (href && href[0] !== "#") {
-                    e.href = e.href;
-                }
-            }
-        });
-
-        // strip inline scripts from the body, they got copied to the
-        // host document with the rest of the scripts above...
-        //
-        var localScripts = b.getElementsByTagName("script");
-        while (localScripts.length > 0) {
-            var s = localScripts[0];
-            s.parentNode.removeChild(s);
-        }
-
-        return Promise.join(sp).then(function () {
-            // Create the docfrag which is just the body children
-            //
-            var fragment = _Global.document.createDocumentFragment();
-            var imported = _Global.document.importNode(cd.body, true);
-            while (imported.childNodes.length > 0) {
-                fragment.appendChild(imported.childNodes[0]);
-            }
-            state.docfrag = fragment;
-
-            return state;
-        });
-    }
-
-    function initialize() {
-        if (initialized) { return; }
-
-        initialized = true;
-
-        forEach(head.querySelectorAll("script"), function (e) {
-            scripts[e.src.toLowerCase()] = true;
-        });
-
-
-        forEach(head.querySelectorAll('link[rel="stylesheet"], link[type="text/css"]'), function (e) {
-            links[e.href.toLowerCase()] = true;
-        });
-    }
-
-    function renderCopy(href, target) {
-        /// <signature helpKeyword="WinJS.UI.Fragments.renderCopy">
-        /// <summary locid="WinJS.UI.Fragments.renderCopy">
-        /// Copies the contents of the specified URI into the specified element.
-        /// </summary>
-        /// <param name="href" type="String" locid="WinJS.UI.Fragments.renderCopy_p:href">
-        /// The URI that contains the fragment to copy.
-        /// </param>
-        /// <param name="target" type="HTMLElement" optional="true" locid="WinJS.UI.Fragments.renderCopy_p:target">
-        /// The element to which the fragment is appended.
-        /// </param>
-        /// <returns type="WinJS.Promise" locid="WinJS.UI.Fragments.renderCopy_returnValue">
-        /// A promise that is fulfilled when the fragment has been loaded.
-        /// If a target element is not specified, the copied fragment is the
-        /// completed value.
-        /// </returns>
-        /// </signature>
-
-        return renderImpl(href, target, true);
-    }
-
-    function renderImpl(href, target, copy) {
-        var profilerMarkIdentifier = (href instanceof _Global.HTMLElement ? _BaseUtils._getProfilerMarkIdentifier(href) : " href='" + href + "'") + "[" + (++uniqueId) + "]";
-        writeProfilerMark("WinJS.UI.Fragments:render" + profilerMarkIdentifier + ",StartTM");
-
-        initialize();
-        return getStateRecord(href, !copy).then(function (state) {
-            var frag = state.docfrag;
-            if (copy) {
-                frag = frag.cloneNode(true);
-            }
-
-            var child = frag.firstChild;
-            while (child) {
-                if (child.nodeType === 1 /*Element node*/) {
-                    child.msParentSelectorScope = true;
-                }
-                child = child.nextSibling;
-            }
-
-            var retVal;
-            if (target) {
-                target.appendChild(frag);
-                retVal = target;
-            } else {
-                retVal = frag;
-            }
-            writeProfilerMark("WinJS.UI.Fragments:render" + profilerMarkIdentifier + ",StopTM");
-            return retVal;
-        });
-    }
-
-    function render(href, target) {
-        /// <signature helpKeyword="WinJS.UI.Fragments.render">
-        /// <summary locid="WinJS.UI.Fragments.render">
-        /// Copies the contents of the specified URI into the specified element.
-        /// </summary>
-        /// <param name='href' type='String' locid="WinJS.UI.Fragments.render_p:href">
-        /// The URI that contains the fragment to copy.
-        /// </param>
-        /// <param name='target' type='HTMLElement' optional='true' locid="WinJS.UI.Fragments.render_p:target">
-        /// The element to which the fragment is appended.
-        /// </param>
-        /// <returns type="WinJS.Promise" locid="WinJS.UI.Fragments.render_returnValue">
-        /// A promise that is fulfilled when the fragment has been loaded.
-        /// If a target element is not specified, the copied fragment is the
-        /// completed value.
-        /// </returns>
-        /// </signature>
-
-        return renderImpl(href, target, false);
-    }
-
-    function cache(href) {
-        /// <signature helpKeyword="WinJS.UI.Fragments.cache">
-        /// <summary locid="WinJS.UI.Fragments.cache">
-        /// Starts loading the fragment at the specified location. The returned promise completes
-        /// when the fragment is ready to be copied.
-        /// </summary>
-        /// <param name="href" type="String or DOMElement" locid="WinJS.UI.Fragments.cache_p:href">
-        /// The URI that contains the fragment to be copied.
-        /// </param>
-        /// <returns type="WinJS.Promise" locid="WinJS.UI.Fragments.cache_returnValue">
-        /// A promise that is fulfilled when the fragment has been prepared for copying.
-        /// </returns>
-        /// </signature>
-        initialize();
-        return getStateRecord(href).then(function (state) { return state.docfrag; });
-    }
-
-    function clearCache(href) {
-        /// <signature helpKeyword="WinJS.UI.Fragments.clearCache">
-        /// <summary locid="WinJS.UI.Fragments.clearCache">
-        /// Removes any cached information about the specified fragment. This method does not unload any scripts
-        /// or styles that are referenced by the fragment.
-        /// </summary>
-        /// <param name="href" type="String or DOMElement" locid="WinJS.UI.Fragments.clearCache_p:href">
-        /// The URI that contains the fragment to be cleared. If no URI is provided, the entire contents of the cache are cleared.
-        /// </param>
-        /// </signature>
-
-        if (!href) {
-            cacheStore = {};
-        } else if (typeof (href) === "string") {
-            delete cacheStore[href.toLowerCase()];
-        } else {
-            delete _ElementUtilities.data(href).docFragment;
-            href.removeAttribute("data-win-hasfragment");
-        }
-    }
-
-    function populateDocument(state, href) {
-
-        var htmlDoc = _Global.document.implementation.createHTMLDocument("frag");
-        var base = htmlDoc.createElement("base");
-        htmlDoc.head.appendChild(base);
-        var anchor = htmlDoc.createElement("a");
-        htmlDoc.body.appendChild(anchor);
-        base.href = _Global.document.location.href; // Initialize base URL to primary document URL
-        anchor.setAttribute("href", href); // Resolve the relative path to an absolute path
-        base.href = anchor.href; // Update the base URL to be the resolved absolute path
-        // 'anchor' is no longer needed at this point and will be removed by the innerHTML call
-        state.document = htmlDoc;
-        return getFragmentContents(href).then(function (text) {
-            _SafeHtml.setInnerHTMLUnsafe(htmlDoc.documentElement, text);
-            htmlDoc.head.appendChild(base);
-        });
-    }
-
-    var writeProfilerMark = _WriteProfilerMark;
-
-    var getFragmentContents = getFragmentContentsXHR;
-    function getFragmentContentsXHR(href) {
-        return _Xhr({ url: href }).then(function (req) {
-            return req.responseText;
-        });
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI.Fragments", {
-        renderCopy: renderCopy,
-        render: render,
-        cache: cache,
-        clearCache: clearCache,
-        _cacheStore: { get: function () { return cacheStore; } },
-        _getFragmentContents: {
-            get: function () {
-                return getFragmentContents;
-            },
-            set: function (value) {
-                getFragmentContents = value;
-            }
-        },
-        _writeProfilerMark: {
-            get: function () {
-                return writeProfilerMark;
-            },
-            set: function (value) {
-                writeProfilerMark = value;
-            }
-        }
-    });
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Application/_State',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Promise'
-    ], function stateInit(exports, _Global, _WinRT, _Base, _BaseUtils, Promise) {
-    "use strict";
-
-    function initWithWinRT() {
-        var local, temp, roaming;
-
-        var IOHelper = _Base.Class.define(
-        function IOHelper_ctor(folder) {
-            this.folder = folder;
-            this._path = folder.path;
-            if (folder.tryGetItemAsync) {
-                this._tryGetItemAsync = folder.tryGetItemAsync.bind(folder);
-            }
-        }, {
-            _tryGetItemAsync: function (fileName) {
-                return this.folder.getFileAsync(fileName).then(null, function () { return false; });
-            },
-
-            exists: function (fileName) {
-                /// <signature helpKeyword="WinJS.Application.IOHelper.exists">
-                /// <summary locid="WinJS.Application.IOHelper.exists">
-                /// Determines if the specified file exists in the container
-                /// </summary>
-                /// <param name="fileName" type="String" locid="WinJS.Application.IOHelper.exists_p:fileName">
-                /// The file which may exist within this folder
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.Application.IOHelper.exists_returnValue">
-                /// Promise with either true (file exists) or false.
-                /// </returns>
-                /// </signature>
-                return this._tryGetItemAsync(fileName).then(function (fileItem) {
-                    return fileItem ? true : false;
-                });
-            },
-            remove: function (fileName) {
-                /// <signature helpKeyword="WinJS.Application.IOHelper.remove">
-                /// <summary locid="WinJS.Application.IOHelper.remove">
-                /// Delets a file in the container
-                /// </summary>
-                /// <param name="fileName" type="String" locid="WinJS.Application.IOHelper.remove_p:fileName">
-                /// The file to be deleted
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.Application.IOHelper.remove_returnValue">
-                /// Promise which is fulfilled when the file has been deleted
-                /// </returns>
-                /// </signature>
-                return this._tryGetItemAsync(fileName).then(function (fileItem) {
-                    return fileItem ? fileItem.deleteAsync() : false;
-                }).then(null, function () { return false; });
-            },
-            writeText: function (fileName, str) {
-                /// <signature helpKeyword="WinJS.Application.IOHelper.writeText">
-                /// <summary locid="WinJS.Application.IOHelper.writeText">
-                /// Writes a file to the container with the specified text
-                /// </summary>
-                /// <param name="fileName" type="String" locid="WinJS.Application.IOHelper.writeText_p:fileName">
-                /// The file to write to
-                /// </param>
-                /// <param name="str" type="String" locid="WinJS.Application.IOHelper.writeText_p:str">
-                /// Content to be written to the file
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.Application.IOHelper.writeText_returnValue">
-                /// Promise which is fulfilled when the file has been written
-                /// </returns>
-                /// </signature>
-                var sto = _WinRT.Windows.Storage;
-                var that = this;
-                return that.folder.createFileAsync(fileName, sto.CreationCollisionOption.openIfExists).
-                    then(function (fileItem) {
-                        return sto.FileIO.writeTextAsync(fileItem, str);
-                    });
-            },
-
-            readText: function (fileName, def) {
-                /// <signature helpKeyword="WinJS.Application.IOHelper.readText">
-                /// <summary locid="WinJS.Application.IOHelper.readText">
-                /// Reads the contents of a file from the container, if the file
-                /// doesn't exist, def is returned.
-                /// </summary>
-                /// <param name="fileName" type="String" locid="WinJS.Application.IOHelper.readText_p:fileName">
-                /// The file to read from
-                /// </param>
-                /// <param name="def" type="String" locid="WinJS.Application.IOHelper.readText_p:def">
-                /// Default value to be returned if the file failed to open
-                /// </param>
-                /// <returns type="WinJS.Promise" locid="WinJS.Application.IOHelper.readText_returnValue">
-                /// Promise containing the contents of the file, or def.
-                /// </returns>
-                /// </signature>
-                var sto = _WinRT.Windows.Storage;
-                return this._tryGetItemAsync(fileName).then(function (fileItem) {
-                    return fileItem ? sto.FileIO.readTextAsync(fileItem) : def;
-                }).then(null, function () { return def; });
-            }
-
-        }, {
-            supportedForProcessing: false,
-        });
-
-        _Base.Namespace._moduleDefine(exports, "WinJS.Application", {
-            /// <field type="Object" helpKeyword="WinJS.Application.local" locid="WinJS.Application.local">
-            /// Allows access to create files in the application local storage, which is preserved across runs
-            /// of an application and does not roam.
-            /// </field>
-            local: {
-                get: function () {
-                    if (!local) {
-                        local = new IOHelper(_WinRT.Windows.Storage.ApplicationData.current.localFolder);
-                    }
-                    return local;
-                }
-            },
-            /// <field type="Object" helpKeyword="WinJS.Application.temp" locid="WinJS.Application.temp">
-            /// Allows access to create files in the application temp storage, which may be reclaimed
-            /// by the system between application runs.
-            /// </field>
-            temp: {
-                get: function () {
-                    if (!temp) {
-                        temp = new IOHelper(_WinRT.Windows.Storage.ApplicationData.current.temporaryFolder);
-                    }
-                    return temp;
-                }
-            },
-            /// <field type="Object" helpKeyword="WinJS.Application.roaming" locid="WinJS.Application.roaming">
-            /// Allows access to create files in the application roaming storage, which is preserved across runs
-            /// of an application and roams with the user across multiple machines.
-            /// </field>
-            roaming: {
-                get: function () {
-                    if (!roaming) {
-                        roaming = new IOHelper(_WinRT.Windows.Storage.ApplicationData.current.roamingFolder);
-                    }
-                    return roaming;
-                }
-            }
-        });
-    }
-
-    function initWithStub() {
-        var InMemoryHelper = _Base.Class.define(
-            function InMemoryHelper_ctor() {
-                this.storage = {};
-            }, {
-                exists: function (fileName) {
-                    /// <signature helpKeyword="WinJS.Application.InMemoryHelper.exists">
-                    /// <summary locid="WinJS.Application.InMemoryHelper.exists">
-                    /// Determines if the specified file exists in the container
-                    /// </summary>
-                    /// <param name="fileName" type="String" locid="WinJS.Application.InMemoryHelper.exists_p:fileName">
-                    /// The filename which may exist within this folder
-                    /// </param>
-                    /// <returns type="WinJS.Promise" locid="WinJS.Application.InMemoryHelper.exists_returnValue">
-                    /// Promise with either true (file exists) or false.
-                    /// </returns>
-                    /// </signature>
-                    // force conversion to boolean
-                    //
-                    return Promise.as(this.storage[fileName] !== undefined);
-                },
-                remove: function (fileName) {
-                    /// <signature helpKeyword="WinJS.Application.InMemoryHelper.remove">
-                    /// <summary locid="WinJS.Application.InMemoryHelper.remove">
-                    /// Deletes a file in the container
-                    /// </summary>
-                    /// <param name="fileName" type="String" locid="WinJS.Application.InMemoryHelper.remove_p:fileName">
-                    /// The file to be deleted
-                    /// </param>
-                    /// <returns type="WinJS.Promise" locid="WinJS.Application.InMemoryHelper.remove_returnValue">
-                    /// Promise which is fulfilled when the file has been deleted
-                    /// </returns>
-                    /// </signature>
-                    delete this.storage[fileName];
-                    return Promise.as();
-                },
-                writeText: function (fileName, str) {
-                    /// <signature helpKeyword="WinJS.Application.InMemoryHelper.writeText">
-                    /// <summary locid="WinJS.Application.InMemoryHelper.writeText">
-                    /// Writes a file to the container with the specified text
-                    /// </summary>
-                    /// <param name="fileName" type="String" locid="WinJS.Application.InMemoryHelper.writeText_p:fileName">
-                    /// The filename to write to
-                    /// </param>
-                    /// <param name="str" type="String" locid="WinJS.Application.InMemoryHelper.writeText_p:str">
-                    /// Content to be written to the file
-                    /// </param>
-                    /// <returns type="WinJS.Promise" locid="WinJS.Application.InMemoryHelper.writeText_returnValue">
-                    /// Promise which is fulfilled when the file has been written
-                    /// </returns>
-                    /// </signature>
-                    this.storage[fileName] = str;
-                    return Promise.as(str.length);
-                },
-                readText: function (fileName, def) {
-                    /// <signature helpKeyword="WinJS.Application.InMemoryHelper.readText">
-                    /// <summary locid="WinJS.Application.InMemoryHelper.readText">
-                    /// Reads the contents of a file from the container, if the file
-                    /// doesn't exist, def is returned.
-                    /// </summary>
-                    /// <param name="fileName" type="String" locid="WinJS.Application.InMemoryHelper.readText_p:fileName">
-                    /// The filename to read from
-                    /// </param>
-                    /// <param name="def" type="String" locid="WinJS.Application.InMemoryHelper.readText_p:def">
-                    /// Default value to be returned if the file failed to open
-                    /// </param>
-                    /// <returns type="WinJS.Promise" locid="WinJS.Application.InMemoryHelper.readText_returnValue">
-                    /// Promise containing the contents of the file, or def.
-                    /// </returns>
-                    /// </signature>
-                    var result = this.storage[fileName];
-                    return Promise.as(typeof result === "string" ? result : def);
-                }
-            }, {
-                supportedForProcessing: false,
-            }
-        );
-
-        _Base.Namespace._moduleDefine(exports, "WinJS.Application", {
-            /// <field type="Object" helpKeyword="WinJS.Application.local" locid="WinJS.Application.local">
-            /// Allows access to create files in the application local storage, which is preserved across runs
-            /// of an application and does not roam.
-            /// </field>
-            local: new InMemoryHelper(),
-            /// <field type="Object" helpKeyword="WinJS.Application.temp" locid="WinJS.Application.temp">
-            /// Allows access to create files in the application temp storage, which may be reclaimed
-            /// by the system between application runs.
-            /// </field>
-            temp: new InMemoryHelper(),
-            /// <field type="Object" helpKeyword="WinJS.Application.roaming" locid="WinJS.Application.roaming">
-            /// Allows access to create files in the application roaming storage, which is preserved across runs
-            /// of an application and roams with the user across multiple machines.
-            /// </field>
-            roaming: new InMemoryHelper()
-        });
-    }
-
-    if (_WinRT.Windows.Storage.FileIO && _WinRT.Windows.Storage.ApplicationData && _WinRT.Windows.Storage.CreationCollisionOption) {
-        initWithWinRT();
-    } else {
-        initWithStub();
-    }
-
-    var sessionState = {};
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Application", {
-        sessionState: {
-            get: function () {
-                return sessionState;
-            },
-            set: function (value) {
-                sessionState = value;
-            }
-        },
-        _loadState: function (e) {
-            // we only restore state if we are coming back from a clear termination from PLM
-            //
-            if (e.previousExecutionState === 3 /* ApplicationExecutionState.Terminated */) {
-                return exports.local.readText("_sessionState.json", "{}").
-                    then(function (str) {
-                        var sessionState = JSON.parse(str);
-                        if (sessionState && Object.keys(sessionState).length > 0) {
-                            exports._sessionStateLoaded = true;
-                        }
-                        exports.sessionState = sessionState;
-                    }).
-                    then(null, function () {
-                        exports.sessionState = {};
-                    });
-            } else {
-                return Promise.as();
-            }
-        },
-        _oncheckpoint: function (event, Application) {
-            if (_Global.MSApp && _Global.MSApp.getViewOpener && _Global.MSApp.getViewOpener()) {
-                // don't save state in child windows.
-                return;
-            }
-            var sessionState = exports.sessionState;
-            if ((sessionState && Object.keys(sessionState).length > 0) || exports._sessionStateLoaded) {
-                var stateString;
-                try {
-                    stateString = JSON.stringify(sessionState);
-                } catch (e) {
-                    stateString = "";
-                    Application.queueEvent({ type: "error", detail: e });
-                }
-                event.setPromise(
-                    exports.local.writeText("_sessionState.json", stateString).
-                        then(null, function (err) {
-                            Application.queueEvent({ type: "error", detail: err });
-                        })
-                );
-            }
-        }
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Navigation',[
-    'exports',
-    './Core/_Base',
-    './Core/_Events',
-    './Core/_WriteProfilerMark',
-    './Promise'
-    ], function navigationInit(exports, _Base, _Events, _WriteProfilerMark, Promise) {
-    "use strict";
-
-    var navigatedEventName = "navigated";
-    var navigatingEventName = "navigating";
-    var beforenavigateEventName = "beforenavigate";
-    var ListenerType = _Base.Class.mix(_Base.Class.define(null, { /* empty */ }, { supportedForProcessing: false }), _Events.eventMixin);
-    var listeners = new ListenerType();
-    var history = {
-        backStack: [],
-        current: { location: "", initialPlaceholder: true },
-        forwardStack: []
-    };
-    var createEvent = _Events._createEventProperty;
-
-    var raiseBeforeNavigate = function (proposed) {
-        _WriteProfilerMark("WinJS.Navigation:navigation,StartTM");
-        return Promise.as().
-            then(function () {
-                var waitForPromise = Promise.as();
-                var defaultPrevented = listeners.dispatchEvent(beforenavigateEventName, {
-                    setPromise: function (promise) {
-                        /// <signature helpKeyword="WinJS.Navigation.beforenavigate.setPromise">
-                        /// <summary locid="WinJS.Navigation.beforenavigate.setPromise">
-                        /// Used to inform the ListView that asynchronous work is being performed, and that this
-                        /// event handler should not be considered complete until the promise completes.
-                        /// </summary>
-                        /// <param name="promise" type="WinJS.Promise" locid="WinJS.Navigation.beforenavigate.setPromise_p:promise">
-                        /// The promise to wait for.
-                        /// </param>
-                        /// </signature>
-
-                        waitForPromise = waitForPromise.then(function () { return promise; });
-                    },
-                    location: proposed.location,
-                    state: proposed.state
-                });
-                return waitForPromise.then(function beforeNavComplete(cancel) {
-                    return defaultPrevented || cancel;
-                });
-            });
-    };
-    var raiseNavigating = function (delta) {
-        return Promise.as().
-            then(function () {
-                var waitForPromise = Promise.as();
-                listeners.dispatchEvent(navigatingEventName, {
-                    setPromise: function (promise) {
-                        /// <signature helpKeyword="WinJS.Navigation.navigating.setPromise">
-                        /// <summary locid="WinJS.Navigation.navigating.setPromise">
-                        /// Used to inform the ListView that asynchronous work is being performed, and that this
-                        /// event handler should not be considered complete until the promise completes.
-                        /// </summary>
-                        /// <param name="promise" type="WinJS.Promise" locid="WinJS.Navigation.navigating.setPromise_p:promise">
-                        /// The promise to wait for.
-                        /// </param>
-                        /// </signature>
-
-                        waitForPromise = waitForPromise.then(function () { return promise; });
-                    },
-                    location: history.current.location,
-                    state: history.current.state,
-                    delta: delta
-                });
-                return waitForPromise;
-            });
-    };
-    var raiseNavigated = function (value, err) {
-        _WriteProfilerMark("WinJS.Navigation:navigation,StopTM");
-        var waitForPromise = Promise.as();
-        var detail = {
-            value: value,
-            location: history.current.location,
-            state: history.current.state,
-            setPromise: function (promise) {
-                /// <signature helpKeyword="WinJS.Navigation.navigated.setPromise">
-                /// <summary locid="WinJS.Navigation.navigated.setPromise">
-                /// Used to inform the ListView that asynchronous work is being performed, and that this
-                /// event handler should not be considered complete until the promise completes.
-                /// </summary>
-                /// <param name="promise" type="WinJS.Promise" locid="WinJS.Navigation.navigated.setPromise_p:promise">
-                /// The promise to wait for.
-                /// </param>
-                /// </signature>
-
-                waitForPromise = waitForPromise.then(function () { return promise; });
-            }
-        };
-        if (!value && err) {
-            detail.error = err;
-        }
-        listeners.dispatchEvent(navigatedEventName, detail);
-        return waitForPromise;
-    };
-
-    var go = function (distance, fromStack, toStack, delta) {
-        distance = Math.min(distance, fromStack.length);
-        if (distance > 0) {
-            return raiseBeforeNavigate(fromStack[fromStack.length - distance]).
-                then(function goBeforeCompleted(cancel) {
-                    if (!cancel) {
-                        toStack.push(history.current);
-                        while (distance - 1 > 0) {
-                            distance--;
-                            toStack.push(fromStack.pop());
-                        }
-                        history.current = fromStack.pop();
-                        return raiseNavigating(delta).then(
-                            raiseNavigated,
-                            function (err) {
-                                raiseNavigated(undefined, err || true);
-                                throw err;
-                            }).then(function () { return true; });
-                    } else {
-                        return false;
-                    }
-                });
-        }
-        return Promise.wrap(false);
-    };
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Navigation", {
-        /// <field name="canGoForward" type="Boolean" locid="WinJS.Navigation.canGoForward" helpKeyword="WinJS.Navigation.canGoForward">
-        /// Determines whether it is possible to navigate forwards.
-        /// </field>
-        canGoForward: {
-            get: function () {
-                return history.forwardStack.length > 0;
-            }
-        },
-        /// <field name="canGoBack" type="Boolean" locid="WinJS.Navigation.canGoBack" helpKeyword="WinJS.Navigation.canGoBack">
-        /// Determines whether it is possible to navigate backwards.
-        /// </field>
-        canGoBack: {
-            get: function () {
-                return history.backStack.length > 0;
-            }
-        },
-        /// <field name="location" locid="WinJS.Navigation.location" helpKeyword="WinJS.Navigation.location">
-        /// Gets the current location.
-        /// </field>
-        location: {
-            get: function () {
-                return history.current.location;
-            }
-        },
-        /// <field name="state" locid="WinJS.Navigation.state" helpKeyword="WinJS.Navigation.state">
-        /// Gets or sets the navigation state.
-        /// </field>
-        state: {
-            get: function () {
-                return history.current.state;
-            },
-            set: function (value) {
-                history.current.state = value;
-            }
-        },
-        /// <field name="history" locid="WinJS.Navigation.history" helpKeyword="WinJS.Navigation.history">
-        /// Gets or sets the navigation history.
-        /// </field>
-        history: {
-            get: function () {
-                return history;
-            },
-            set: function (value) {
-                history = value;
-
-                // ensure the require fields are present
-                //
-                history.backStack = history.backStack || [];
-                history.forwardStack = history.forwardStack || [];
-                history.current = history.current || { location: "", initialPlaceholder: true };
-                history.current.location = history.current.location || "";
-            }
-        },
-        forward: function (distance) {
-            /// <signature helpKeyword="WinJS.Navigation.forward">
-            /// <summary locid="WinJS.Navigation.forward">
-            /// Navigates forwards.
-            /// </summary>
-            /// <param name="distance" type="Number" optional="true" locid="WinJS.Navigation.forward_p:distance">
-            /// The number of entries to go forward.
-            /// </param>
-            /// <returns type="Promise" locid="WinJS.Navigation.forward_returnValue">
-            /// A promise that is completed with a value that indicates whether or not
-            /// the navigation was successful.
-            /// </returns>
-            /// </signature>
-            distance = distance || 1;
-            return go(distance, history.forwardStack, history.backStack, distance);
-        },
-        back: function (distance) {
-            /// <signature helpKeyword="WinJS.Navigation.back">
-            /// <summary locid="WinJS.Navigation.back">
-            /// Navigates backwards.
-            /// </summary>
-            /// <param name="distance" type="Number" optional="true" locid="WinJS.Navigation.back_p:distance">
-            /// The number of entries to go back into the history.
-            /// </param>
-            /// <returns type="Promise" locid="WinJS.Navigation.back_returnValue">
-            /// A promise that is completed with a value that indicates whether or not
-            /// the navigation was successful.
-            /// </returns>
-            /// </signature>
-            distance = distance || 1;
-            return go(distance, history.backStack, history.forwardStack, -distance);
-        },
-        navigate: function (location, initialState) {
-            /// <signature helpKeyword="WinJS.Navigation.navigate">
-            /// <summary locid="WinJS.Navigation.navigate">
-            /// Navigates to a location.
-            /// </summary>
-            /// <param name="location" type="Object" locid="WinJS.Navigation.navigate_p:location">
-            /// The location to navigate to. Generally the location is a string, but
-            /// it may be anything.
-            /// </param>
-            /// <param name="initialState" type="Object" locid="WinJS.Navigation.navigate_p:initialState">
-            /// The navigation state that may be accessed through WinJS.Navigation.state.
-            /// </param>
-            /// <returns type="Promise" locid="WinJS.Navigation.navigate_returnValue">
-            /// A promise that is completed with a value that indicates whether or not
-            /// the navigation was successful.
-            /// </returns>
-            /// </signature>
-            var proposed = { location: location, state: initialState };
-            return raiseBeforeNavigate(proposed).
-                then(function navBeforeCompleted(cancel) {
-                    if (!cancel) {
-                        if (!history.current.initialPlaceholder) {
-                            history.backStack.push(history.current);
-                        }
-                        history.forwardStack = [];
-                        history.current = proposed;
-
-                        // error or no, we go from navigating -> navigated
-                        // cancelation should be handled with "beforenavigate"
-                        //
-                        return raiseNavigating().then(
-                            raiseNavigated,
-                            function (err) {
-                                raiseNavigated(undefined, err || true);
-                                throw err;
-                            }).then(function () { return true; });
-                    } else {
-                        return false;
-                    }
-                });
-        },
-        addEventListener: function (eventType, listener, capture) {
-            /// <signature helpKeyword="WinJS.Navigation.addEventListener">
-            /// <summary locid="WinJS.Navigation.addEventListener">
-            /// Adds an event listener to the control.
-            /// </summary>
-            /// <param name="eventType" type="String" locid="WinJS.Navigation.addEventListener_p:eventType">
-            /// The type (name) of the event.
-            /// </param>
-            /// <param name="listener" type="Function" locid="WinJS.Navigation.addEventListener_p:listener">
-            /// The listener to invoke when the event gets raised.
-            /// </param>
-            /// <param name="capture" type="Boolean" locid="WinJS.Navigation.addEventListener_p:capture">
-            /// Specifies whether or not to initiate capture.
-            /// </param>
-            /// </signature>
-            listeners.addEventListener(eventType, listener, capture);
-        },
-        removeEventListener: function (eventType, listener, capture) {
-            /// <signature helpKeyword="WinJS.Navigation.removeEventListener">
-            /// <summary locid="WinJS.Navigation.removeEventListener">
-            /// Removes an event listener from the control.
-            /// </summary>
-            /// <param name='eventType' type="String" locid="WinJS.Navigation.removeEventListener_p:eventType">
-            /// The type (name) of the event.
-            /// </param>
-            /// <param name='listener' type='Function' locid="WinJS.Navigation.removeEventListener_p:listener">
-            /// The listener to remove.
-            /// </param>
-            /// <param name='capture' type='Boolean' locid="WinJS.Navigation.removeEventListener_p:capture">
-            /// Specifies whether or not to initiate capture.
-            /// </param>
-            /// </signature>
-            listeners.removeEventListener(eventType, listener, capture);
-        },
-        /// <field type="Function" locid="WinJS.Navigation.onnavigated" helpKeyword="WinJS.Navigation.onnavigated">
-        /// A page navigation event that occurs after onbeforenavigate and onnavigating. This event can be used to perform other actions after navigation is complete.
-        /// </field>
-        onnavigated: createEvent(navigatedEventName),
-        /// <field type="Function" locid="WinJS.Navigation.onnavigating" helpKeyword="WinJS.Navigation.onnavigating">
-        /// A page navigation event that occurs after onbeforenavigate and before onnavigated. This event can be used to perform other actions during navigation.
-        /// </field>
-        onnavigating: createEvent(navigatingEventName),
-        /// <field type="Function" locid="WinJS.Navigation.onbeforenavigate" helpKeyword="WinJS.Navigation.onbeforenavigate">
-        /// A page navigation event that occurs before onnavigating and onnavigated. This event can be used to cancel navigation or perform other actions prior to navigation.
-        /// </field>
-        onbeforenavigate: createEvent(beforenavigateEventName)
-    });
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Application',[
-    'exports',
-    './Core/_Global',
-    './Core/_WinRT',
-    './Core/_Base',
-    './Core/_Events',
-    './Core/_Log',
-    './Core/_WriteProfilerMark',
-    './Application/_State',
-    './Navigation',
-    './Promise',
-    './_Signal',
-    './Scheduler',
-    './Utilities/_ElementUtilities'
-], function applicationInit(exports, _Global, _WinRT, _Base, _Events, _Log, _WriteProfilerMark, _State, Navigation, Promise, _Signal, Scheduler, _ElementUtilities) {
-    "use strict";
-
-    _Global.Debug && (_Global.Debug.setNonUserCodeExceptions = true);
-
-    var checkpointET = "checkpoint",
-        unloadET = "unload",
-        activatedET = "activated",
-        loadedET = "loaded",
-        readyET = "ready",
-        errorET = "error",
-        settingsET = "settings",
-        backClickET = "backclick",
-        beforeRequestingFocusOnKeyboardInputET = "beforerequestingfocusonkeyboardinput",
-        requestingFocusOnKeyboardInputET = "requestingfocusonkeyboardinput",
-        edgyStartingET = "edgystarting",
-        edgyCompletedET = "edgycompleted",
-        edgyCanceledET = "edgycanceled";
-
-    var outstandingPromiseErrors;
-    var eventQueue = [];
-    var eventQueueJob = null;
-    var eventQueuedSignal = null;
-    var running = false;
-    var registered = false;
-
-    var Symbol = _Global.Symbol;
-    var isModern = !!Symbol && typeof Symbol.iterator === "symbol"; // jshint ignore:line
-
-    var ListenerType = _Base.Class.mix(_Base.Class.define(null, { /* empty */ }, { supportedForProcessing: false }), _Events.eventMixin);
-    var listeners = new ListenerType();
-    var createEvent = _Events._createEventProperty;
-    var pendingDeferrals = {};
-    var pendingDeferralID = 0;
-    var TypeToSearch = {
-        _registered: false,
-
-        updateRegistration: function Application_TypeToSearch_updateRegistration() {
-            var ls = listeners._listeners && listeners._listeners[requestingFocusOnKeyboardInputET] || [];
-            if (!TypeToSearch._registered && ls.length > 0) {
-                TypeToSearch._updateKeydownCaptureListeners(_Global.top, true /*add*/);
-                TypeToSearch._registered = true;
-            }
-            if (TypeToSearch._registered && ls.length === 0) {
-                TypeToSearch._updateKeydownCaptureListeners(_Global.top, false /*add*/);
-                TypeToSearch._registered = false;
-            }
-        },
-
-        _keydownCaptureHandler: function Application_TypeToSearch_keydownCaptureHandler(event) {
-            if (TypeToSearch._registered && TypeToSearch._shouldKeyTriggerTypeToSearch(event)) {
-                requestingFocusOnKeyboardInput();
-            }
-        },
-
-        _frameLoadCaptureHandler: function Application_TypeToSearch_frameLoadCaptureHandler(event) {
-            if (TypeToSearch._registered) {
-                TypeToSearch._updateKeydownCaptureListeners(event.target.contentWindow, true /*add*/);
-            }
-        },
-
-        _updateKeydownCaptureListeners: function Application_TypeToSearch_updateKeydownCaptureListeners(win, add) {
-            if (!win) {
-                // This occurs when this handler gets called from an IFrame event that is no longer in the DOM
-                // and therefore does not have a valid contentWindow object.
-                return;
-            }
-
-            // Register for child frame keydown events in order to support FocusOnKeyboardInput
-            // when focus is in a child frame.  Also register for child frame load events so
-            // it still works after frame navigations.
-            // Note: This won't catch iframes added programmatically later, but that can be worked
-            // around by toggling FocusOnKeyboardInput off/on after the new iframe is added.
-            try {
-                if (add) {
-                    win.document.addEventListener('keydown', TypeToSearch._keydownCaptureHandler, true);
-                } else {
-                    win.document.removeEventListener('keydown', TypeToSearch._keydownCaptureHandler, true);
-                }
-            } catch (e) { // if the IFrame crosses domains, we'll get a permission denied error
-            }
-
-            if (win.frames) {
-                for (var i = 0, l = win.frames.length; i < l; i++) {
-                    var childWin = win.frames[i];
-                    TypeToSearch._updateKeydownCaptureListeners(childWin, add);
-
-                    try {
-                        if (add) {
-                            if (childWin.frameElement) {
-                                childWin.frameElement.addEventListener('load', TypeToSearch._frameLoadCaptureHandler, true);
-                            }
-                        } else {
-                            if (childWin.frameElement) {
-                                childWin.frameElement.removeEventListener('load', TypeToSearch._frameLoadCaptureHandler, true);
-                            }
-                        }
-                    } catch (e) { // if the IFrame crosses domains, we'll get a permission denied error
-                    }
-                }
-            }
-        },
-
-        _shouldKeyTriggerTypeToSearch: function Application_TypeToSearch_shouldKeyTriggerTypeToSearch(event) {
-            var shouldTrigger = false;
-            // First, check if a metaKey is pressed (only applies to MacOS). If so, do nothing here.
-            if (!event.metaKey) {
-                // We also don't handle CTRL/ALT combinations, unless ALTGR is also set. Since there is no shortcut for checking AltGR,
-                // we need to use getModifierState, however, Safari currently doesn't support this.
-                if ((!event.ctrlKey && !event.altKey) || (event.getModifierState && event.getModifierState("AltGraph"))) {
-                    // Show on most keys for visible characters like letters, numbers, etc.
-                    switch (event.keyCode) {
-                        case 0x30:  //0x30 0 key
-                        case 0x31:  //0x31 1 key
-                        case 0x32:  //0x32 2 key
-                        case 0x33:  //0x33 3 key
-                        case 0x34:  //0x34 4 key
-                        case 0x35:  //0x35 5 key
-                        case 0x36:  //0x36 6 key
-                        case 0x37:  //0x37 7 key
-                        case 0x38:  //0x38 8 key
-                        case 0x39:  //0x39 9 key
-
-                        case 0x41:  //0x41 A key
-                        case 0x42:  //0x42 B key
-                        case 0x43:  //0x43 C key
-                        case 0x44:  //0x44 D key
-                        case 0x45:  //0x45 E key
-                        case 0x46:  //0x46 F key
-                        case 0x47:  //0x47 G key
-                        case 0x48:  //0x48 H key
-                        case 0x49:  //0x49 I key
-                        case 0x4A:  //0x4A J key
-                        case 0x4B:  //0x4B K key
-                        case 0x4C:  //0x4C L key
-                        case 0x4D:  //0x4D M key
-                        case 0x4E:  //0x4E N key
-                        case 0x4F:  //0x4F O key
-                        case 0x50:  //0x50 P key
-                        case 0x51:  //0x51 Q key
-                        case 0x52:  //0x52 R key
-                        case 0x53:  //0x53 S key
-                        case 0x54:  //0x54 T key
-                        case 0x55:  //0x55 U key
-                        case 0x56:  //0x56 V key
-                        case 0x57:  //0x57 W key
-                        case 0x58:  //0x58 X key
-                        case 0x59:  //0x59 Y key
-                        case 0x5A:  //0x5A Z key
-
-                        case 0x60:  // VK_NUMPAD0,             //0x60 Numeric keypad 0 key
-                        case 0x61:  // VK_NUMPAD1,             //0x61 Numeric keypad 1 key
-                        case 0x62:  // VK_NUMPAD2,             //0x62 Numeric keypad 2 key
-                        case 0x63:  // VK_NUMPAD3,             //0x63 Numeric keypad 3 key
-                        case 0x64:  // VK_NUMPAD4,             //0x64 Numeric keypad 4 key
-                        case 0x65:  // VK_NUMPAD5,             //0x65 Numeric keypad 5 key
-                        case 0x66:  // VK_NUMPAD6,             //0x66 Numeric keypad 6 key
-                        case 0x67:  // VK_NUMPAD7,             //0x67 Numeric keypad 7 key
-                        case 0x68:  // VK_NUMPAD8,             //0x68 Numeric keypad 8 key
-                        case 0x69:  // VK_NUMPAD9,             //0x69 Numeric keypad 9 key
-                        case 0x6A:  // VK_MULTIPLY,            //0x6A Multiply key
-                        case 0x6B:  // VK_ADD,                 //0x6B Add key
-                        case 0x6C:  // VK_SEPARATOR,           //0x6C Separator key
-                        case 0x6D:  // VK_SUBTRACT,            //0x6D Subtract key
-                        case 0x6E:  // VK_DECIMAL,             //0x6E Decimal key
-                        case 0x6F:  // VK_DIVIDE,              //0x6F Divide key
-
-                        case 0xBA:  // VK_OEM_1,               //0xBA Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ';:' key
-                        case 0xBB:  // VK_OEM_PLUS,            //0xBB For any country/region, the '+' key
-                        case 0xBC:  // VK_OEM_COMMA,           //0xBC For any country/region, the ',' key
-                        case 0xBD:  // VK_OEM_MINUS,           //0xBD For any country/region, the '-' key
-                        case 0xBE:  // VK_OEM_PERIOD,          //0xBE For any country/region, the '.' key
-                        case 0xBF:  // VK_OEM_2,               //0xBF Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '/?' key
-                        case 0xC0:  // VK_OEM_3,               //0xC0 Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '`~' key
-
-                        case 0xDB:  // VK_OEM_4,               //0xDB Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '[{' key
-                        case 0xDC:  // VK_OEM_5,               //0xDC Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '\|' key
-                        case 0xDD:  // VK_OEM_6,               //0xDD Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ']}' key
-                        case 0xDE:  // VK_OEM_7,               //0xDE Used for miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the 'single-quote/double-quote' key
-                        case 0xDF:  // VK_OEM_8,               //0xDF Used for miscellaneous characters; it can vary by keyboard.
-
-                        case 0xE2:  // VK_OEM_102,             //0xE2 Either the angle bracket key or the backslash key on the RT 102-key keyboard
-
-                        case 0xE5:  // VK_PROCESSKEY,          //0xE5 IME PROCESS key
-
-                        case 0xE7:  // VK_PACKET,              //0xE7 Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP
-                            shouldTrigger = true;
-                            break;
-                    }
-                }
-            }
-            return shouldTrigger;
-        }
-    };
-
-    function safeSerialize(obj) {
-        var str;
-        try {
-            var seenObjects = [];
-            str = JSON.stringify(obj, function (key, value) {
-                if (value === _Global) {
-                    return "[window]";
-                } else if (value instanceof _Global.HTMLElement) {
-                    return "[HTMLElement]";
-                } else if (typeof value === "function") {
-                    return "[function]";
-                } else if (typeof value === "object") {
-                    if (value === null) {
-                        return value;
-                    } else if (seenObjects.indexOf(value) === -1) {
-                        seenObjects.push(value);
-                        return value;
-                    } else {
-                        return "[circular]";
-                    }
-                } else {
-                    return value;
-                }
-
-            });
-        }
-        catch (err) {
-            // primitives, undefined, null, etc, all get serialized fine. In the
-            // case that stringify fails (typically due to circular graphs) we
-            // just show "[object]". While we may be able to tighten the condition
-            // for the exception, we never way this serialize to fail.
-            //
-            // Note: we make this be a JSON string, so that consumers of the log
-            // can always call JSON.parse.
-            str = JSON.stringify("[object]");
-        }
-        return str;
-    }
-
-    function fatalErrorHandler(e) {
-        _Log.log && _Log.log(safeSerialize(e), "winjs", "error");
-
-        if (_Global.document && exports._terminateApp) {
-            var data = e.detail;
-            var number = data && (data.number || (data.exception && (data.exception.number || data.exception.code)) || (data.error && data.error.number) || data.errorCode || 0);
-            var terminateData = {
-                description: safeSerialize(data),
-                // note: because of how we listen to events, we rarely get a stack
-                stack: data && (data.stack || (data.exception && (data.exception.stack || data.exception.message)) || (data.error && data.error.stack) || null),
-                errorNumber: number,
-                number: number
-            };
-            exports._terminateApp(terminateData, e);
-        }
-    }
-
-    function defaultTerminateAppHandler(data, e) {
-        /*jshint unused: false*/
-        // This is the unhandled exception handler in WinJS. This handler is invoked whenever a promise
-        // has an exception occur that is not handled (via an error handler passed to then() or a call to done()).
-        //
-        // To see the original exception stack, look at data.stack.
-        // For more information on debugging and exception handling go to http://go.microsoft.com/fwlink/p/?LinkId=253583.
-
-        debugger; // jshint ignore:line
-        if (_Global.MSApp) {
-            _Global.MSApp.terminateApp(data);
-        }
-    }
-
-    var terminateAppHandler = defaultTerminateAppHandler;
-
-    function captureDeferral(obj) {
-        var id = "def" + (pendingDeferralID++);
-        return { deferral: pendingDeferrals[id] = obj.getDeferral(), id: id };
-    }
-    function completeDeferral(deferral, deferralID) {
-        // If we have a deferralID we our table to find the
-        // deferral. Since we remove it on completion, this
-        // ensures that we never double notify a deferral
-        // in the case of a user call "Application.stop" in
-        // the middle of processing an event
-        //
-        if (deferralID) {
-            deferral = pendingDeferrals[deferralID];
-            delete pendingDeferrals[deferralID];
-        }
-        if (deferral) {
-            deferral.complete();
-        }
-    }
-    function cleanupAllPendingDeferrals() {
-        if (pendingDeferrals) {
-            Object.keys(pendingDeferrals).forEach(function (k) {
-                pendingDeferrals[k].complete();
-            });
-            pendingDeferrals = {};
-        }
-    }
-
-    function dispatchEvent(eventRecord) {
-        _WriteProfilerMark("WinJS.Application:Event_" + eventRecord.type + ",StartTM");
-
-        var waitForPromise = Promise.as();
-        eventRecord.setPromise = function (promise) {
-            /// <signature helpKeyword="WinJS.Application.eventRecord.setPromise">
-            /// <summary locid="WinJS.Application.event.setPromise">
-            /// Used to inform the application object that asynchronous work is being performed, and that this
-            /// event handler should not be considered complete until the promise completes.
-            /// </summary>
-            /// <param name="promise" type="WinJS.Promise" locid="WinJS.Application.eventRecord.setPromise_p:promise">
-            /// The promise to wait for.
-            /// </param>
-            /// </signature>
-            waitForPromise = waitForPromise.then(function () { return promise; });
-        };
-        eventRecord._stoppedImmediatePropagation = false;
-        eventRecord.stopImmediatePropagation = function () {
-            eventRecord._stoppedImmediatePropagation = true;
-        };
-        eventRecord.detail = eventRecord.detail || {};
-        if (typeof (eventRecord.detail) === "object") {
-            eventRecord.detail.setPromise = eventRecord.setPromise;
-        }
-
-        try {
-            if (listeners._listeners) {
-                var handled = false;
-                l = listeners._listeners[eventRecord.type];
-                if (l) {
-                    for (var i = 0, len = l.length; i < len && !eventRecord._stoppedImmediatePropagation; i++) {
-                        handled = l[i].listener(eventRecord) || handled;
-                    }
-                }
-            }
-
-            // Fire built in listeners last, for checkpoint this is important
-            // as it lets our built in serialization see any mutations to
-            // app.sessionState
-            //
-            var l = builtInListeners[eventRecord.type];
-            if (l) {
-                l.forEach(function dispatchOne(e) { e(eventRecord, handled); });
-            }
-        }
-        catch (err) {
-            if (eventRecord.type === errorET) {
-                fatalErrorHandler(eventRecord);
-            } else {
-                queueEvent({ type: errorET, detail: err });
-            }
-        }
-
-
-        function cleanup(r) {
-            _WriteProfilerMark("WinJS.Application:Event_" + eventRecord.type + ",StopTM");
-
-            if (eventRecord._deferral) {
-                completeDeferral(eventRecord._deferral, eventRecord._deferralID);
-            }
-            return r;
-        }
-
-        return waitForPromise.then(cleanup, function (r) {
-            r = cleanup(r);
-            if (r && r.name === "Canceled") {
-                return;
-            }
-            return Promise.wrapError(r);
-        });
-    }
-
-    function createEventQueuedSignal() {
-        if (!eventQueuedSignal) {
-            eventQueuedSignal = new _Signal();
-            eventQueuedSignal.promise.done(function () {
-                eventQueuedSignal = null;
-            }, function () {
-                eventQueuedSignal = null;
-            });
-        }
-        return eventQueuedSignal;
-    }
-
-    function drainOneEvent(queue) {
-        function drainError(err) {
-            queueEvent({ type: errorET, detail: err });
-        }
-
-        if (queue.length === 0) {
-            return createEventQueuedSignal().promise;
-        } else {
-            return dispatchEvent(queue.shift()).then(null, drainError);
-        }
-    }
-
-    // Drains the event queue via the scheduler
-    //
-    function drainQueue(jobInfo) {
-        function drainNext() {
-            return drainQueue;
-        }
-
-        var queue = jobInfo.job._queue;
-
-        if (queue.length === 0 && eventQueue.length > 0) {
-            queue = jobInfo.job._queue = copyAndClearQueue();
-        }
-
-        jobInfo.setPromise(drainOneEvent(queue).then(drainNext, drainNext));
-    }
-
-    function startEventQueue() {
-        function markSync() {
-            sync = true;
-        }
-
-        var queue = [];
-        var sync = true;
-        var promise;
-
-        // Drain the queue as long as there are events and they complete synchronously
-        //
-        while (sync) {
-            if (queue.length === 0 && eventQueue.length > 0) {
-                queue = copyAndClearQueue();
-            }
-
-            sync = false;
-            promise = drainOneEvent(queue);
-            promise.done(markSync, markSync);
-        }
-
-        // Schedule a job which will be responsible for draining events for the
-        //  lifetime of the application.
-        //
-        eventQueueJob = Scheduler.schedule(function Application_pumpEventQueue(jobInfo) {
-            function drainNext() {
-                return drainQueue;
-            }
-            jobInfo.setPromise(promise.then(drainNext, drainNext));
-        }, Scheduler.Priority.high, null, "WinJS.Application._pumpEventQueue");
-        eventQueueJob._queue = queue;
-    }
-
-    function queueEvent(eventRecord) {
-        /// <signature helpKeyword="WinJS.Application.queueEvent">
-        /// <summary locid="WinJS.Application.queueEvent">
-        /// Queues an event to be processed by the WinJS.Application event queue.
-        /// </summary>
-        /// <param name="eventRecord" type="Object" locid="WinJS.Application.queueEvent_p:eventRecord">
-        /// The event object is expected to have a type property that is
-        /// used as the event name when dispatching on the WinJS.Application
-        /// event queue. The entire object is provided to event listeners
-        /// in the detail property of the event.
-        /// </param>
-        /// </signature>
-        _WriteProfilerMark("WinJS.Application:Event_" + eventRecord.type + " queued,Info");
-        eventQueue.push(eventRecord);
-        if (running && eventQueuedSignal) {
-            eventQueuedSignal.complete(drainQueue);
-        }
-    }
-
-    function copyAndClearQueue() {
-        var queue = eventQueue;
-        eventQueue = [];
-        return queue;
-    }
-
-    var builtInListeners = {
-        activated: [
-            function Application_activatedHandler() {
-                queueEvent({ type: readyET });
-            }
-        ],
-        checkpoint: [
-            function Application_checkpointHandler(e) {
-                _State._oncheckpoint(e, exports);
-            }
-        ],
-        error: [
-            function Application_errorHandler(e, handled) {
-                if (handled) {
-                    return;
-                }
-                fatalErrorHandler(e);
-            }
-        ],
-        backclick: [
-            function Application_backClickHandler(e, handled) {
-                if (handled) {
-                    e._winRTBackPressedEvent.handled = true;
-                } else if (Navigation.canGoBack) {
-                    Navigation.back();
-                    e._winRTBackPressedEvent.handled = true;
-                }
-            }
-        ],
-        beforerequestingfocusonkeyboardinput: [
-            function Application_beforeRequestingFocusOnKeyboardInputHandler(e, handled) {
-                if (!handled) {
-                    dispatchEvent({ type: requestingFocusOnKeyboardInputET });
-                }
-            }
-        ]
-    };
-
-    // loaded == DOMContentLoaded
-    // activated == after WinRT Activated
-    // ready == after all of the above
-    //
-    function activatedHandler(e) {
-        var def = captureDeferral(e.activatedOperation);
-        _State._loadState(e).then(function () {
-            queueEvent({ type: activatedET, detail: e, _deferral: def.deferral, _deferralID: def.id });
-        });
-    }
-    function suspendingHandler(e) {
-        var def = captureDeferral(e.suspendingOperation);
-        queueEvent({ type: checkpointET, _deferral: def.deferral, _deferralID: def.id });
-    }
-    function domContentLoadedHandler() {
-        queueEvent({ type: loadedET });
-        if (!(_Global.document && _WinRT.Windows.UI.WebUI.WebUIApplication)) {
-            var activatedArgs = {
-                arguments: "",
-                kind: "Windows.Launch",
-                previousExecutionState: 0 //_WinRT.Windows.ApplicationModel.Activation.ApplicationExecutionState.NotRunning
-            };
-            _State._loadState(activatedArgs).then(function () {
-                queueEvent({ type: activatedET, detail: activatedArgs });
-            });
-        }
-    }
-    function beforeUnloadHandler() {
-        cleanupAllPendingDeferrals();
-        queueEvent({ type: unloadET });
-    }
-    function errorHandler(e) {
-        var flattenedError = {};
-        for (var key in e) {
-            flattenedError[key] = e[key];
-        }
-        var data;
-        var handled = true;
-        var prev = exports._terminateApp;
-        try {
-            exports._terminateApp = function (d, e) {
-                handled = false;
-                data = d;
-                if (prev !== defaultTerminateAppHandler) {
-                    prev(d, e);
-                }
-            };
-            dispatchEvent({
-                type: errorET,
-                detail: {
-                    error: flattenedError,
-                    errorLine: e.lineno,
-                    errorCharacter: e.colno,
-                    errorUrl: e.filename,
-                    errorMessage: e.message
-                }
-            });
-        } finally {
-            exports._terminateApp = prev;
-        }
-        return handled;
-    }
-    function promiseErrorHandler(e) {
-        //
-        // e.detail looks like: { exception, error, promise, handler, id, parent }
-        //
-        var details = e.detail;
-        var id = details.id;
-
-        // If the error has a parent promise then this is not the origination of the
-        //  error so we check if it has a handler, and if so we mark that the error
-        //  was handled by removing it from outstandingPromiseErrors
-        //
-        if (details.parent) {
-            if (details.handler && outstandingPromiseErrors) {
-                delete outstandingPromiseErrors[id];
-            }
-            return;
-        }
-
-        // Work around browsers that don't serialize exceptions
-        if (details.exception instanceof Error) {
-            var error = {
-                stack: details.exception.stack,
-                message: details.exception.message
-            };
-            details.exception = error;
-        }
-
-        // If this is the first promise error to occur in this period we need to schedule
-        //  a helper to come along after a setImmediate that propagates any remaining
-        //  errors to the application's queue.
-        //
-        var shouldScheduleErrors = !outstandingPromiseErrors;
-
-        // Indicate that this error was orignated and needs to be handled
-        //
-        outstandingPromiseErrors = outstandingPromiseErrors || [];
-        outstandingPromiseErrors[id] = details;
-
-        if (shouldScheduleErrors) {
-            Scheduler.schedule(function Application_async_promiseErrorHandler() {
-                var errors = outstandingPromiseErrors;
-                outstandingPromiseErrors = null;
-                errors.forEach(function (error) {
-                    queueEvent({ type: errorET, detail: error });
-                });
-            }, Scheduler.Priority.high, null, "WinJS.Application._queuePromiseErrors");
-        }
-    }
-
-    // capture this early
-    //
-    if (_Global.document) {
-        _Global.document.addEventListener("DOMContentLoaded", domContentLoadedHandler, false);
-    }
-
-    function commandsRequested(e) {
-        var event = { e: e, applicationcommands: undefined };
-        listeners.dispatchEvent(settingsET, event);
-    }
-
-    function hardwareButtonBackPressed(winRTBackPressedEvent) {
-        // Fire WinJS.Application 'backclick' event. If the winRTBackPressedEvent is not handled, the app will get suspended.
-        var eventRecord = { type: backClickET };
-        Object.defineProperty(eventRecord, "_winRTBackPressedEvent", {
-            value: winRTBackPressedEvent,
-            enumerable: false
-        });
-        dispatchEvent(eventRecord);
-    }
-
-    function requestingFocusOnKeyboardInput() {
-        // Built in listener for beforeRequestingFocusOnKeyboardInputET will trigger
-        // requestingFocusOnKeyboardInputET if it wasn't handled.
-        dispatchEvent({ type: beforeRequestingFocusOnKeyboardInputET });
-    }
-
-    function edgyStarting(eventObject) {
-        dispatchEvent({ type: edgyStartingET, kind: eventObject.kind });
-    }
-
-    function edgyCompleted(eventObject) {
-        dispatchEvent({ type: edgyCompletedET, kind: eventObject.kind });
-    }
-
-    function edgyCanceled(eventObject) {
-        dispatchEvent({ type: edgyCanceledET, kind: eventObject.kind });
-    }
-
-    function getNavManager() {
-        // Use environment inference to avoid a critical error
-        // in `getForCurrentView` when running in Windows 8 compat mode.
-        var manager = _WinRT.Windows.UI.Core.SystemNavigationManager;
-        return (isModern && manager) ? manager.getForCurrentView() : null;
-    }
-
-    function register() {
-        if (!registered) {
-            registered = true;
-            _Global.addEventListener("beforeunload", beforeUnloadHandler, false);
-
-            // None of these are enabled in web worker
-            if (_Global.document) {
-                _Global.addEventListener("error", errorHandler, false);
-                if (_WinRT.Windows.UI.WebUI.WebUIApplication) {
-
-                    var wui = _WinRT.Windows.UI.WebUI.WebUIApplication;
-                    wui.addEventListener("activated", activatedHandler, false);
-                    wui.addEventListener("suspending", suspendingHandler, false);
-                }
-
-                if (_WinRT.Windows.UI.ApplicationSettings.SettingsPane) {
-                    var settingsPane = _WinRT.Windows.UI.ApplicationSettings.SettingsPane.getForCurrentView();
-                    settingsPane.addEventListener("commandsrequested", commandsRequested);
-                }
-
-                // This integrates WinJS.Application into the hardware or OS-provided back button.
-                var navManager = getNavManager();
-                if (navManager) {
-                    // On Win10 this accomodates hardware buttons (phone),
-                    // the taskbar's tablet mode button, and the optional window frame back button.
-                    navManager.addEventListener("backrequested", hardwareButtonBackPressed);
-                } else if (_WinRT.Windows.Phone.UI.Input.HardwareButtons) {
-                    // For WP 8.1
-                    _WinRT.Windows.Phone.UI.Input.HardwareButtons.addEventListener("backpressed", hardwareButtonBackPressed);
-                }
-
-                if (_WinRT.Windows.UI.Input.EdgeGesture) {
-                    var edgy = _WinRT.Windows.UI.Input.EdgeGesture.getForCurrentView();
-                    edgy.addEventListener("starting", edgyStarting);
-                    edgy.addEventListener("completed", edgyCompleted);
-                    edgy.addEventListener("canceled", edgyCanceled);
-                }
-            }
-
-            Promise.addEventListener("error", promiseErrorHandler);
-        }
-    }
-    function unregister() {
-        if (registered) {
-            registered = false;
-            _Global.removeEventListener("beforeunload", beforeUnloadHandler, false);
-
-            // None of these are enabled in web worker
-            if (_Global.document) {
-                if (_WinRT.Windows.UI.WebUI.WebUIApplication) {
-                    _Global.removeEventListener("error", errorHandler, false);
-
-                    var wui = _WinRT.Windows.UI.WebUI.WebUIApplication;
-                    wui.removeEventListener("activated", activatedHandler, false);
-                    wui.removeEventListener("suspending", suspendingHandler, false);
-                }
-
-                if (_WinRT.Windows.UI.ApplicationSettings.SettingsPane) {
-                    var settingsPane = _WinRT.Windows.UI.ApplicationSettings.SettingsPane.getForCurrentView();
-                    settingsPane.removeEventListener("commandsrequested", commandsRequested);
-                }
-
-                var navManager = getNavManager();
-                if (navManager) {
-                    navManager.removeEventListener("backrequested", hardwareButtonBackPressed);
-                } else if (_WinRT.Windows.Phone.UI.Input.HardwareButtons) {
-                    _WinRT.Windows.Phone.UI.Input.HardwareButtons.removeEventListener("backpressed", hardwareButtonBackPressed);
-                }
-
-                if (_WinRT.Windows.UI.Input.EdgeGesture) {
-                    var edgy = _WinRT.Windows.UI.Input.EdgeGesture.getForCurrentView();
-                    edgy.removeEventListener("starting", edgyStarting);
-                    edgy.removeEventListener("completed", edgyCompleted);
-                    edgy.removeEventListener("canceled", edgyCanceled);
-                }
-            }
-
-            Promise.removeEventListener("error", promiseErrorHandler);
-        }
-    }
-
-    var publicNS = _Base.Namespace._moduleDefine(exports, "WinJS.Application", {
-        stop: function Application_stop() {
-            /// <signature helpKeyword="WinJS.Application.stop">
-            /// <summary locid="WinJS.Application.stop">
-            /// Stops application event processing and resets WinJS.Application
-            /// to its initial state.
-            /// </summary>
-            /// </signature>
-
-            // Need to clear out the event properties explicitly to clear their backing
-            //  state.
-            //
-            publicNS.onactivated = null;
-            publicNS.oncheckpoint = null;
-            publicNS.onerror = null;
-            publicNS.onloaded = null;
-            publicNS.onready = null;
-            publicNS.onsettings = null;
-            publicNS.onunload = null;
-            publicNS.onbackclick = null;
-            listeners = new ListenerType();
-            _State.sessionState = {};
-            running = false;
-            copyAndClearQueue();
-            eventQueueJob && eventQueueJob.cancel();
-            eventQueueJob = null;
-            eventQueuedSignal = null;
-            unregister();
-            TypeToSearch.updateRegistration();
-            cleanupAllPendingDeferrals();
-        },
-
-        addEventListener: function Application_addEventListener(eventType, listener, capture) {
-            /// <signature helpKeyword="WinJS.Application.addEventListener">
-            /// <summary locid="WinJS.Application.addEventListener">
-            /// Adds an event listener to the control.
-            /// </summary>
-            /// <param name="eventType" locid="WinJS.Application.addEventListener_p:eventType">
-            /// The type (name) of the event.
-            /// </param>
-            /// <param name="listener" locid="WinJS.Application.addEventListener_p:listener">
-            /// The listener to invoke when the event is raised.
-            /// </param>
-            /// <param name="capture" locid="WinJS.Application.addEventListener_p:capture">
-            /// true to initiate capture; otherwise, false.
-            /// </param>
-            /// </signature>
-            listeners.addEventListener(eventType, listener, capture);
-            if (eventType === requestingFocusOnKeyboardInputET) {
-                TypeToSearch.updateRegistration();
-            }
-        },
-        removeEventListener: function Application_removeEventListener(eventType, listener, capture) {
-            /// <signature helpKeyword="WinJS.Application.removeEventListener">
-            /// <summary locid="WinJS.Application.removeEventListener">
-            /// Removes an event listener from the control.
-            /// </summary>
-            /// <param name="eventType" locid="WinJS.Application.removeEventListener_p:eventType">
-            /// The type (name) of the event.
-            /// </param>
-            /// <param name="listener" locid="WinJS.Application.removeEventListener_p:listener">
-            /// The listener to remove.
-            /// </param>
-            /// <param name="capture" locid="WinJS.Application.removeEventListener_p:capture">
-            /// Specifies whether or not to initiate capture.
-            /// </param>
-            /// </signature>
-            listeners.removeEventListener(eventType, listener, capture);
-            if (eventType === requestingFocusOnKeyboardInputET) {
-                TypeToSearch.updateRegistration();
-            }
-        },
-
-        checkpoint: function Application_checkpoint() {
-            /// <signature helpKeyword="WinJS.Application.checkpoint">
-            /// <summary locid="WinJS.Application.checkpoint">
-            /// Queues a checkpoint event.
-            /// </summary>
-            /// </signature>
-            queueEvent({ type: checkpointET });
-        },
-
-        start: function Application_start() {
-            /// <signature helpKeyword="WinJS.Application.start">
-            /// <summary locid="WinJS.Application.start">
-            /// Starts processing events in the WinJS.Application event queue.
-            /// </summary>
-            /// </signature>
-            register();
-            running = true;
-            startEventQueue();
-        },
-
-        queueEvent: queueEvent,
-
-        // Like queueEvent but fires the event synchronously. Useful in tests.
-        _dispatchEvent: dispatchEvent,
-
-        _terminateApp: {
-            get: function Application_terminateApp_get() {
-                return terminateAppHandler;
-            },
-            set: function Application_terminateApp_set(value) {
-                terminateAppHandler = value;
-            }
-        },
-
-        _applicationListener: _Base.Namespace._lazy(function () {
-            // Use _lazy because publicNS can't be referenced in its own definition
-            return new _ElementUtilities._GenericListener("Application", publicNS);
-        }),
-
-        /// <field type="Function" locid="WinJS.Application.oncheckpoint" helpKeyword="WinJS.Application.oncheckpoint">
-        /// Occurs when receiving Process Lifetime Management (PLM) notification or when the checkpoint function is called.
-        /// </field>
-        oncheckpoint: createEvent(checkpointET),
-        /// <field type="Function" locid="WinJS.Application.onunload" helpKeyword="WinJS.Application.onunload">
-        /// Occurs when the application is about to be unloaded.
-        /// </field>
-        onunload: createEvent(unloadET),
-        /// <field type="Function" locid="WinJS.Application.onactivated" helpKeyword="WinJS.Application.onactivated">
-        /// Occurs when Windows Runtime activation has occurred.
-        /// The name of this event is "activated" (and also "mainwindowactivated".)
-        /// This event occurs after the loaded event and before the ready event.
-        /// </field>
-        onactivated: createEvent(activatedET),
-        /// <field type="Function" locid="WinJS.Application.onloaded" helpKeyword="WinJS.Application.onloaded">
-        /// Occurs after the DOMContentLoaded event, which fires after the page has been parsed but before all the resources are loaded.
-        /// This event occurs before the activated event and the ready event.
-        /// </field>
-        onloaded: createEvent(loadedET),
-        /// <field type="Function" locid="WinJS.Application.onready" helpKeyword="WinJS.Application.onready">
-        /// Occurs when the application is ready. This event occurs after the onloaded event and the onactivated event.
-        /// </field>
-        onready: createEvent(readyET),
-        /// <field type="Function" locid="WinJS.Application.onsettings" helpKeyword="WinJS.Application.onsettings">
-        /// Occurs when the settings charm is invoked.
-        /// </field>
-        onsettings: createEvent(settingsET),
-        /// <field type="Function" locid="WinJS.Application.onerror" helpKeyword="WinJS.Application.onerror">
-        /// Occurs when an unhandled error has been raised.
-        /// </field>
-        onerror: createEvent(errorET),
-        /// <field type="Function" locid="WinJS.Application.onbackclick" helpKeyword="WinJS.Application.onbackclick">
-        /// Raised when the users clicks the hardware back button.
-        /// </field>
-        onbackclick: createEvent(backClickET)
-
-
-    });
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Animations/_Constants',[
-    'exports',
-    '../Core/_Base'
-    ], function animationsConstantsInit(exports, _Base) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field locid="WinJS.UI.PageNavigationAnimation" helpKeyword="WinJS.UI.PageNavigationAnimation">
-        /// Specifies what animation type should be returned by WinJS.UI.Animation.createPageNavigationAnimations.
-        /// </field>
-        PageNavigationAnimation: {
-            /// <field locid="WinJS.UI.PageNavigationAnimation.turnstile" helpKeyword="WinJS.UI.PageNavigationAnimation.turnstile">
-            /// The pages will exit and enter using a turnstile animation.
-            /// </field>
-            turnstile: "turnstile",
-            /// <field locid="WinJS.UI.PageNavigationAnimation.slide" helpKeyword="WinJS.UI.PageNavigationAnimation.slide">
-            /// The pages will exit and enter using an animation that slides up/down.
-            /// </field>
-            slide: "slide",
-            /// <field locid="WinJS.UI.PageNavigationAnimation.enterPage" helpKeyword="WinJS.UI.PageNavigationAnimation.enterPage">
-            /// The pages will enter using an enterPage animation, and exit with no animation.
-            /// </field>
-            enterPage: "enterPage",
-            /// <field locid="WinJS.UI.PageNavigationAnimation.continuum" helpKeyword="WinJS.UI.PageNavigationAnimation.continuum">
-            /// The pages will exit and enter using a continuum animation.
-            /// </field>
-            continuum: "continuum"
-        }
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Animations/_TransitionAnimation',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Promise',
-    '../Scheduler',
-    '../Utilities/_ElementUtilities'
-    ], function transitionAnimationInit(exports, _Global, _WinRT, _Base, _BaseUtils, Promise, Scheduler, _ElementUtilities) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-
-    var browserStyleEquivalents = _BaseUtils._browserStyleEquivalents;
-
-    function makeArray(elements) {
-        if (Array.isArray(elements) || elements instanceof _Global.NodeList || elements instanceof _Global.HTMLCollection) {
-            return elements;
-        } else if (elements) {
-            return [elements];
-        } else {
-            return [];
-        }
-    }
-
-    var keyframeCounter = 0;
-    function getUniqueKeyframeName() {
-        ++keyframeCounter;
-        return "WinJSUIAnimation" + keyframeCounter;
-    }
-    function isUniqueKeyframeName(s) {
-        return "WinJSUIAnimation" === s.substring(0, 16);
-    }
-
-    function resolveStyles(elem) {
-        _ElementUtilities._getComputedStyle(elem, null).opacity;
-    }
-
-    function copyWithEvaluation(iElem, elem) {
-        return function (obj) {
-            var newObj = {};
-            for (var p in obj) {
-                var v = obj[p];
-                if (typeof v === "function") {
-                    v = v(iElem, elem);
-                }
-                newObj[p] = v;
-            }
-            if (!newObj.exactTiming) {
-                newObj.delay += exports._libraryDelay;
-            }
-            return newObj;
-        };
-    }
-
-    var activeActions = [];
-
-    var reason_interrupted = 1;
-    var reason_canceled = 2;
-
-    function stopExistingAction(id, prop) {
-        var key = id + "|" + prop;
-        var finish = activeActions[key];
-        if (finish) {
-            finish(reason_interrupted);
-        }
-    }
-
-    function registerAction(id, prop, finish) {
-        activeActions[id + "|" + prop] = finish;
-    }
-
-    function unregisterAction(id, prop) {
-        delete activeActions[id + "|" + prop];
-    }
-
-    var StyleCache = _Base.Class.define(
-        // Constructor
-        function StyleCache_ctor(id, desc, style) {
-            this.cref = 0;
-            this.id = id;
-            this.desc = desc;
-            this.removed = {};
-            this.prevStyles = desc.props.map(function (p) { return style[p[0]]; });
-            this.prevNames = this.names = style[desc.nameProp];
-            desc.styleCaches[id] = this;
-        }, {
-            // Members
-            destroy: function StyleCache_destroy(style, skipStylesReset) {
-                var desc = this.desc;
-                delete desc.styleCaches[this.id];
-                if (!skipStylesReset) {
-                    if (this.prevNames === "" &&
-                        this.prevStyles.every(function (s) { return s === ""; })) {
-                        style[desc.shorthandProp] = "";
-                    } else {
-                        desc.props.forEach(function (p, i) {
-                            style[p[0]] = this.prevStyles[i];
-                        }, this);
-                        style[desc.nameProp] = this.prevNames;
-                    }
-                }
-            },
-            removeName: function StyleCache_removeName(style, name, elem, skipStylesReset) {
-                var nameValue = this.names;
-                var names = nameValue.split(", ");
-                var index = names.lastIndexOf(name);
-                if (index >= 0) {
-                    names.splice(index, 1);
-                    this.names = nameValue = names.join(", ");
-                    if (nameValue === "" && this.desc.isTransition) {
-                        nameValue = "none";
-                    }
-                }
-                if (--this.cref) {
-                    style[this.desc.nameProp] = nameValue;
-                    if (!isUniqueKeyframeName(name)) {
-                        this.removed[name] = true;
-                    }
-                } else {
-                    if (elem && nameValue === "none") {
-                        style[this.desc.nameProp] = nameValue;
-                        resolveStyles(elem);
-                    }
-                    this.destroy(style, skipStylesReset);
-                }
-            }
-        });
-
-    function setTemporaryStyles(elem, id, style, actions, desc) {
-        var styleCache = desc.styleCaches[id] ||
-                         new StyleCache(id, desc, style);
-        styleCache.cref += actions.length;
-
-        actions.forEach(function (action) {
-            stopExistingAction(id, action.property);
-        });
-
-        if (desc.isTransition ||
-            actions.some(function (action) {
-                return styleCache.removed[action[desc.nameField]];
-        })) {
-            resolveStyles(elem);
-            styleCache.removed = {};
-        }
-
-        var newShorthand = actions.map(function (action) {
-            return action[desc.nameField] + " " +
-                desc.props.map(function (p) {
-                    return (p[1] ? action[p[1]] : "") + p[2];
-                }).join(" ");
-        }).join(", ");
-
-        var newNames = actions.map(function (action) {
-            return action[desc.nameField];
-        }).join(", ");
-        if (styleCache.names !== "") {
-            newShorthand = styleCache.names + ", " + newShorthand;
-            newNames = styleCache.names + ", " + newNames;
-        }
-
-        style[desc.shorthandProp] = newShorthand;
-        styleCache.names = newNames;
-        return styleCache;
-    }
-
-    var elementTransitionProperties = {
-        shorthandProp: browserStyleEquivalents["transition"].scriptName,
-        nameProp: browserStyleEquivalents["transition-property"].scriptName,
-        nameField: "property",
-        props: [
-            [browserStyleEquivalents["transition-duration"].scriptName, "duration", "ms"],
-            [browserStyleEquivalents["transition-timing-function"].scriptName, "timing", ""],
-            [browserStyleEquivalents["transition-delay"].scriptName, "delay", "ms"]
-        ],
-        isTransition: true,
-        styleCaches: []
-    };
-
-    function completePromise(c, synchronous) {
-        if (synchronous) {
-            c();
-        } else {
-            Scheduler.schedule(function _Animation_completeAnimationPromise() {
-                c();
-            }, Scheduler.Priority.normal, null, "WinJS.UI._Animation._completeAnimationPromise");
-        }
-    }
-
-    var uniformizeStyle;
-    function executeElementTransition(elem, index, transitions, promises, animate) {
-        if (transitions.length > 0) {
-            var style = elem.style;
-            var id = _ElementUtilities._uniqueID(elem);
-            if (!uniformizeStyle) {
-                uniformizeStyle = _Global.document.createElement("DIV").style;
-            }
-            transitions = transitions.map(copyWithEvaluation(index, elem));
-            transitions.forEach(function (transition) {
-                var scriptNameOfProperty = _BaseUtils._getCamelCasedName(transition.property);
-                if (transition.hasOwnProperty("from")) {
-                    style[scriptNameOfProperty] = transition.from;
-                }
-                uniformizeStyle[scriptNameOfProperty] = transition.to;
-                transition.to = uniformizeStyle[scriptNameOfProperty];
-                transition.propertyScriptName = scriptNameOfProperty;
-            });
-
-            if (animate) {
-                var styleCache = setTemporaryStyles(elem, id, style, transitions, elementTransitionProperties);
-                var listener = elem.disabled ? _Global.document : elem;
-
-                transitions.forEach(function (transition) {
-                    var finish;
-                    promises.push(new Promise(function (c) {
-                        finish = function (reason) {
-                            if (onTransitionEnd) {
-                                listener.removeEventListener(_BaseUtils._browserEventEquivalents["transitionEnd"], onTransitionEnd, false);
-                                unregisterAction(id, transition.property);
-                                styleCache.removeName(style, transition.propertyScriptName, reason ? elem : null, transition.skipStylesReset);
-                                _Global.clearTimeout(timeoutId);
-                                onTransitionEnd = null;
-                            }
-                            completePromise(c, reason === reason_canceled);
-                        };
-
-                        var onTransitionEnd = function (event) {
-                            if (event.target === elem && event.propertyName === transition.property) {
-                                finish();
-                            }
-                        };
-
-                        registerAction(id, transition.property, finish);
-                        listener.addEventListener(_BaseUtils._browserEventEquivalents["transitionEnd"], onTransitionEnd, false);
-
-                        var padding = 0;
-                        if (style[transition.propertyScriptName] !== transition.to) {
-                            style[transition.propertyScriptName] = transition.to;
-                            padding = 50;
-                        }
-                        var timeoutId = _Global.setTimeout(function () {
-                            timeoutId = _Global.setTimeout(finish, transition.delay + transition.duration);
-                        }, padding);
-                    }, function () { finish(reason_canceled); }));
-                });
-            } else {
-                transitions.forEach(function (transition) {
-                    style[transition.propertyScriptName] = transition.to;
-                });
-            }
-        }
-    }
-
-    var elementAnimationProperties = {
-        shorthandProp: browserStyleEquivalents["animation"].scriptName,
-        nameProp: browserStyleEquivalents["animation-name"].scriptName,
-        nameField: "keyframe",
-        props: [
-            [browserStyleEquivalents["animation-duration"].scriptName, "duration", "ms"],
-            [browserStyleEquivalents["animation-timing-function"].scriptName, "timing", ""],
-            [browserStyleEquivalents["animation-delay"].scriptName, "delay", "ms"],
-            [browserStyleEquivalents["animation-iteration-count"].scriptName, "", "1"],
-            [browserStyleEquivalents["animation-direction"].scriptName, "", "normal"],
-            [browserStyleEquivalents["animation-fill-mode"].scriptName, "", "both"]
-        ],
-        isTransition: false,
-        styleCaches: []
-    };
-
-    function executeElementAnimation(elem, index, anims, promises, animate) {
-        if (animate && anims.length > 0) {
-            var style = elem.style;
-            var id = _ElementUtilities._uniqueID(elem);
-            anims = anims.map(copyWithEvaluation(index, elem));
-            var styleElem;
-            var listener = elem.disabled ? _Global.document : elem;
-            anims.forEach(function (anim) {
-                if (!anim.keyframe) {
-                    if (!styleElem) {
-                        styleElem = _Global.document.createElement("STYLE");
-                        _Global.document.documentElement.appendChild(styleElem);
-                    }
-                    anim.keyframe = getUniqueKeyframeName();
-                    var kf = "@" + browserStyleEquivalents["keyframes"] + " " + anim.keyframe + " { from {" + anim.property + ":" + anim.from + ";} to {" + anim.property + ":" + anim.to + ";}}";
-                    styleElem.sheet.insertRule(kf, 0);
-                } else {
-                    anim.keyframe = browserStyleEquivalents.animationPrefix + anim.keyframe;
-                }
-            });
-            var styleCache = setTemporaryStyles(elem, id, style, anims, elementAnimationProperties),
-                animationsToCleanUp = [],
-                animationPromises = [];
-            anims.forEach(function (anim) {
-                var finish;
-                animationPromises.push(new Promise(function (c) {
-                    finish = function (reason) {
-                        if (onAnimationEnd) {
-                            listener.removeEventListener(_BaseUtils._browserEventEquivalents["animationEnd"], onAnimationEnd, false);
-                            _Global.clearTimeout(timeoutId);
-                            onAnimationEnd = null;
-                        }
-                        completePromise(c, reason === reason_canceled);
-                    };
-
-                    var onAnimationEnd = function (event) {
-                        if (event.target === elem && event.animationName === anim.keyframe) {
-                            finish();
-                        }
-                    };
-
-                    registerAction(id, anim.property, finish);
-                    // Firefox will stop all animations if we clean up that animation's properties when there're other CSS animations still running
-                    // on an element. To work around this, we delay animation style cleanup until all parts of an animation finish.
-                    animationsToCleanUp.push({
-                        id: id,
-                        property: anim.property,
-                        style: style,
-                        keyframe: anim.keyframe
-                    });
-                    var timeoutId = _Global.setTimeout(function () {
-                        timeoutId = _Global.setTimeout(finish, anim.delay + anim.duration);
-                    }, 50);
-                    listener.addEventListener(_BaseUtils._browserEventEquivalents["animationEnd"], onAnimationEnd, false);
-                }, function () { finish(reason_canceled); }));
-            });
-            if (styleElem) {
-                _Global.setTimeout(function () {
-                    var parentElement = styleElem.parentElement;
-                    if (parentElement) {
-                        parentElement.removeChild(styleElem);
-                    }
-                }, 50);
-            }
-
-            var cleanupAnimations = function () {
-                for (var i = 0; i < animationsToCleanUp.length; i++) {
-                    var anim = animationsToCleanUp[i];
-                    unregisterAction(anim.id, anim.property);
-                    styleCache.removeName(anim.style, anim.keyframe);
-                }
-            };
-            promises.push(Promise.join(animationPromises).then(cleanupAnimations, cleanupAnimations));
-        }
-    }
-
-    var enableCount = 0;
-    var animationSettings;
-    function initAnimations() {
-        if (!animationSettings) {
-            if (_WinRT.Windows.UI.ViewManagement.UISettings) {
-                animationSettings = new _WinRT.Windows.UI.ViewManagement.UISettings();
-            } else {
-                animationSettings = { animationsEnabled: true };
-            }
-        }
-    }
-
-    var isAnimationEnabled = function isAnimationEnabledImpl() {
-        /// <signature helpKeyword="WinJS.UI.isAnimationEnabled">
-        /// <summary locid="WinJS.UI.isAnimationEnabled">
-        /// Determines whether the WinJS Animation Library will perform animations.
-        /// </summary>
-        /// <returns type="Boolean" locid="WinJS.UI.isAnimationEnabled_returnValue">
-        /// true if WinJS animations will be performed.
-        /// false if WinJS animations are suppressed.
-        /// </returns>
-        /// </signature>
-        initAnimations();
-        return enableCount + animationSettings.animationsEnabled > 0;
-    };
-
-    function applyAction(element, action, execAction) {
-        try {
-            var animate = exports.isAnimationEnabled();
-            var elems = makeArray(element);
-            var actions = makeArray(action);
-
-            var promises = [];
-
-            for (var i = 0; i < elems.length; i++) {
-                if (Array.isArray(elems[i])) {
-                    for (var j = 0; j < elems[i].length; j++) {
-                        execAction(elems[i][j], i, actions, promises, animate);
-                    }
-                } else {
-                    execAction(elems[i], i, actions, promises, animate);
-                }
-            }
-
-            if (promises.length) {
-                return Promise.join(promises);
-            } else {
-                return Scheduler.schedulePromiseNormal(null, "WinJS.UI._Animation._completeActionPromise").then(null, function () {
-                    // Convert a cancelation to the success path
-                });
-            }
-        } catch (e) {
-            return Promise.wrapError(e);
-        }
-    }
-
-    function adjustAnimationTime(animation) {
-        if (Array.isArray(animation)) {
-            return animation.map(function (animation) {
-                return adjustAnimationTime(animation);
-            });
-        } else if (animation) {
-            animation.delay = animationTimeAdjustment(animation.delay);
-            animation.duration = animationTimeAdjustment(animation.duration);
-            return animation;
-        } else {
-            return;
-        }
-    }
-
-    function animationAdjustment(animation) {
-        if (animationFactor === 1) {
-            return animation;
-        } else {
-            return adjustAnimationTime(animation);
-        }
-    }
-
-    var animationTimeAdjustment = function _animationTimeAdjustmentImpl(v) {
-        return v * animationFactor;
-    };
-
-    var animationFactor = 1;
-    var libraryDelay = 0;
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        disableAnimations: function () {
-            /// <signature helpKeyword="WinJS.UI.disableAnimations">
-            /// <summary locid="WinJS.UI.disableAnimations">
-            /// Disables animations in the WinJS Animation Library
-            /// by decrementing the animation enable count.
-            /// </summary>
-            /// </signature>
-            enableCount--;
-        },
-
-        enableAnimations: function () {
-            /// <signature helpKeyword="WinJS.UI.enableAnimations">
-            /// <summary locid="WinJS.UI.enableAnimations">
-            /// Enables animations in the WinJS Animation Library
-            /// by incrementing the animation enable count.
-            /// </summary>
-            /// </signature>
-            enableCount++;
-        },
-
-        isAnimationEnabled: {
-            get: function () {
-                return isAnimationEnabled;
-            },
-            set: function (value) {
-                isAnimationEnabled = value;
-            }
-        },
-
-        _libraryDelay: {
-            get: function () {
-                return libraryDelay;
-            },
-            set: function (value) {
-                libraryDelay = value;
-            }
-        },
-
-        executeAnimation: function (element, animation) {
-            /// <signature helpKeyword="WinJS.UI.executeAnimation">
-            /// <summary locid="WinJS.UI.executeAnimation">
-            /// Perform a CSS animation that can coexist with other
-            /// Animation Library animations. Applications are not expected
-            /// to call this function directly; they should prefer to use
-            /// the high-level animations in the Animation Library.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.executeAnimation_p:element">
-            /// Single element or collection of elements on which
-            /// to perform a CSS animation.
-            /// </param>
-            /// <param name="animation" locid="WinJS.UI.executeAnimation_p:animation">
-            /// Single animation description or array of animation descriptions.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.executeAnimation_returnValue">
-            /// Promise object that completes when the CSS animation is complete.
-            /// </returns>
-            /// </signature>
-            return applyAction(element, animationAdjustment(animation), executeElementAnimation);
-        },
-
-        executeTransition: function (element, transition) {
-            /// <signature helpKeyword="WinJS.UI.executeTransition">
-            /// <summary locid="WinJS.UI.executeTransition">
-            /// Perform a CSS transition that can coexist with other
-            /// Animation Library animations. Applications are not expected
-            /// to call this function directly; they should prefer to use
-            /// the high-level animations in the Animation Library.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.executeTransition_p:element">
-            /// Single element or collection of elements on which
-            /// to perform a CSS transition.
-            /// </param>
-            /// <param name="transition" locid="WinJS.UI.executeTransition_p:transition">
-            /// Single transition description or array of transition descriptions.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.executeTransition_returnValue">
-            /// Promise object that completes when the CSS transition is complete.
-            /// </returns>
-            /// </signature>
-            return applyAction(element, animationAdjustment(transition), executeElementTransition);
-        },
-
-        _animationTimeAdjustment: {
-            get: function () {
-                return animationTimeAdjustment;
-            },
-            set: function (value) {
-                animationTimeAdjustment = value;
-            }
-        }
-
-    });
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Utilities", {
-        _fastAnimations: {
-            get: function () {
-                return animationFactor === 1/20;
-            },
-            set: function (value) {
-                animationFactor = value ? 1/20 : 1;
-            }
-        },
-        _slowAnimations: {
-            get: function () {
-                return animationFactor === 3;
-            },
-            set: function (value) {
-                animationFactor = value ? 3 : 1;
-            }
-        },
-        _animationFactor: {
-            get: function () {
-                return animationFactor;
-            },
-            set: function (value) {
-                animationFactor = value;
-            }
-        },
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Animations',[
-    'exports',
-    './Core/_Global',
-    './Core/_Base',
-    './Core/_BaseUtils',
-    './Core/_WriteProfilerMark',
-    './Utilities/_ElementUtilities',
-    './Animations/_Constants',
-    './Animations/_TransitionAnimation',
-    './Promise'
-], function animationsInit(exports, _Global, _Base, _BaseUtils, _WriteProfilerMark, _ElementUtilities, _Constants, _TransitionAnimation, Promise) {
-    "use strict";
-
-    var transformNames = _BaseUtils._browserStyleEquivalents["transform"];
-
-    // Default to 11 pixel from the left (or right if RTL)
-    var defaultOffset = [{ top: "0px", left: "11px", rtlflip: true }];
-
-    var OffsetArray = _Base.Class.define(function OffsetArray_ctor(offset, keyframe, defOffset) {
-        // Constructor
-        defOffset = defOffset || defaultOffset;
-        if (Array.isArray(offset) && offset.length > 0) {
-            this.offsetArray = offset;
-            if (offset.length === 1) {
-                this.keyframe = checkKeyframe(offset[0], defOffset[0], keyframe);
-            }
-        } else if (offset && offset.hasOwnProperty("top") && offset.hasOwnProperty("left")) {
-            this.offsetArray = [offset];
-            this.keyframe = checkKeyframe(offset, defOffset[0], keyframe);
-        } else {
-            this.offsetArray = defOffset;
-            this.keyframe = chooseKeyframe(defOffset[0], keyframe);
-        }
-    }, { // Public Members
-        getOffset: function (i) {
-            if (i >= this.offsetArray.length) {
-                i = this.offsetArray.length - 1;
-            }
-            return this.offsetArray[i];
-        }
-    }, { // Static Members
-        supportedForProcessing: false,
-    });
-
-    function checkKeyframe(offset, defOffset, keyframe) {
-        if (offset.keyframe) {
-            return offset.keyframe;
-        }
-
-        if (!keyframe ||
-            offset.left !== defOffset.left ||
-            offset.top !== defOffset.top ||
-            (offset.rtlflip && !defOffset.rtlflip)) {
-            return null;
-        }
-
-        if (!offset.rtlflip) {
-            return keyframe;
-        }
-
-        return keyframeCallback(keyframe);
-    }
-
-    function chooseKeyframe(defOffset, keyframe) {
-        if (!keyframe || !defOffset.rtlflip) {
-            return keyframe;
-        }
-
-        return keyframeCallback(keyframe);
-    }
-
-    function keyframeCallback(keyframe) {
-        var keyframeRtl = keyframe + "-rtl";
-        return function (i, elem) {
-            return _ElementUtilities._getComputedStyle(elem).direction === "ltr" ? keyframe : keyframeRtl;
-        };
-    }
-
-    function makeArray(elements) {
-        if (Array.isArray(elements) || elements instanceof _Global.NodeList || elements instanceof _Global.HTMLCollection) {
-            return elements;
-        } else if (elements) {
-            return [elements];
-        } else {
-            return [];
-        }
-    }
-
-    function collectOffsetArray(elemArray) {
-        var offsetArray = [];
-        for (var i = 0; i < elemArray.length; i++) {
-            var offset = {
-                top: elemArray[i].offsetTop,
-                left: elemArray[i].offsetLeft
-            };
-            var matrix = _ElementUtilities._getComputedStyle(elemArray[i], null)[transformNames.scriptName].split(",");
-            if (matrix.length === 6) {
-                offset.left += parseFloat(matrix[4]);
-                offset.top += parseFloat(matrix[5]);
-            }
-            offsetArray.push(offset);
-        }
-        return offsetArray;
-    }
-
-    function staggerDelay(initialDelay, extraDelay, delayFactor, delayCap) {
-        return function (i) {
-            var ret = initialDelay;
-            for (var j = 0; j < i; j++) {
-                extraDelay *= delayFactor;
-                ret += extraDelay;
-            }
-            if (delayCap) {
-                ret = Math.min(ret, delayCap);
-            }
-            return ret;
-        };
-    }
-
-    function makeOffsetsRelative(elemArray, offsetArray) {
-        for (var i = 0; i < offsetArray.length; i++) {
-            offsetArray[i].top -= elemArray[i].offsetTop;
-            offsetArray[i].left -= elemArray[i].offsetLeft;
-        }
-    }
-
-    function animTranslate2DTransform(elemArray, offsetArray, transition) {
-        makeOffsetsRelative(elemArray, offsetArray);
-        for (var i = 0; i < elemArray.length; i++) {
-            if (offsetArray[i].top !== 0 || offsetArray[i].left !== 0) {
-                elemArray[i].style[transformNames.scriptName] = "translate(" + offsetArray[i].left + "px, " + offsetArray[i].top + "px)";
-            }
-        }
-        return _TransitionAnimation.executeTransition(elemArray, transition);
-    }
-
-    function animStaggeredSlide(curve, start, end, fadeIn, page, first, second, third) {
-        var elementArray = [],
-            startOffsetArray = [],
-            endOffsetArray = [];
-        function prepareSlide(elements, start, end) {
-            if (!elements) {
-                return;
-            }
-            var startOffset = {
-                left: start + "px",
-                top: "0px"
-            },
-            endOffset = {
-                left: end + "px",
-                top: "0px"
-            };
-            if (+elements.length === elements.length) {
-                for (var i = 0, len = elements.length; i < len; i++) {
-                    elementArray.push(elements[i]);
-                    startOffsetArray.push(startOffset);
-                    endOffsetArray.push(endOffset);
-                }
-            } else {
-                elementArray.push(elements);
-                startOffsetArray.push(startOffset);
-                endOffsetArray.push(endOffset);
-            }
-        }
-        var horizontalOffset = 200,
-            startOffset = (start !== 0 ? (start < 0 ? -horizontalOffset : horizontalOffset) : 0),
-            endOffset = (end !== 0 ? (end < 0 ? -horizontalOffset : horizontalOffset) : 0);
-        prepareSlide(page, start, end);
-        prepareSlide(first, startOffset, endOffset);
-        prepareSlide(second, startOffset * 2, endOffset * 2);
-        prepareSlide(third, startOffset * 3, endOffset * 3);
-        startOffsetArray = new OffsetArray(startOffsetArray);
-        endOffsetArray = new OffsetArray(endOffsetArray);
-        return _TransitionAnimation.executeTransition(
-            elementArray,
-            [{
-                property: transformNames.cssName,
-                delay: 0,
-                duration: 350,
-                timing: curve,
-                from: translateCallback(startOffsetArray),
-                to: translateCallback(endOffsetArray)
-            },
-            {
-                property: "opacity",
-                delay: 0,
-                duration: 350,
-                timing: fadeIn ? "steps(1, start)" : "steps(1, end)",
-                from: fadeIn ? 0 : 1,
-                to: fadeIn ? 1 : 0
-            }]);
-    }
-
-    function animRotationTransform(elemArray, origins, transition) {
-        elemArray = makeArray(elemArray);
-        origins = makeArray(origins);
-        for (var i = 0, len = elemArray.length; i < len; i++) {
-            var rtl = _ElementUtilities._getComputedStyle(elemArray[i]).direction === "rtl";
-            elemArray[i].style[_BaseUtils._browserStyleEquivalents["transform-origin"].scriptName] = origins[Math.min(origins.length - 1, i)][rtl ? "rtl" : "ltr"];
-        }
-        function onComplete() {
-            clearAnimRotationTransform(elemArray);
-        }
-        return _TransitionAnimation.executeTransition(elemArray, transition).then(onComplete, onComplete);
-    }
-
-    function clearAnimRotationTransform(elemArray) {
-        for (var i = 0, len = elemArray.length; i < len; i++) {
-            elemArray[i].style[_BaseUtils._browserStyleEquivalents["transform-origin"].scriptName] = "";
-            elemArray[i].style[transformNames.scriptName] = "";
-            elemArray[i].style.opacity = "";
-        }
-    }
-
-    function translateCallback(offsetArray, prefix) {
-        prefix = prefix || "";
-        return function (i, elem) {
-            var offset = offsetArray.getOffset(i);
-            var left = offset.left;
-            if (offset.rtlflip && _ElementUtilities._getComputedStyle(elem).direction === "rtl") {
-                left = left.toString();
-                if (left.charAt(0) === "-") {
-                    left = left.substring(1);
-                } else {
-                    left = "-" + left;
-                }
-            }
-            return prefix + "translate(" + left + ", " + offset.top + ")";
-        };
-    }
-
-    function translateCallbackAnimate(offsetArray, suffix) {
-        suffix = suffix || "";
-        return function (i) {
-            var offset = offsetArray[i];
-            return "translate(" + offset.left + "px, " + offset.top + "px) " + suffix;
-        };
-    }
-
-    function keyframeCallbackAnimate(offsetArray, keyframe) {
-        return function (i) {
-            var offset = offsetArray[i];
-            return (offset.left === 0 && offset.top === 0) ? keyframe : null;
-        };
-    }
-
-    function layoutTransition(LayoutTransition, target, affected, extra) {
-        var targetArray = makeArray(target);
-        var affectedArray = makeArray(affected);
-        var offsetArray = collectOffsetArray(affectedArray);
-        return new LayoutTransition(targetArray, affectedArray, offsetArray, extra);
-    }
-
-    function collectTurnstileTransformOrigins(elements) {
-        var origins = [];
-        for (var i = 0, len = elements.length; i < len; i++) {
-            var itemBoundingBox = elements[i].getBoundingClientRect();
-            var offsetLeftLTR = -(40 + itemBoundingBox.left);
-            var offsetLeftRTL = 40 + (_Global.innerWidth - itemBoundingBox.right);
-            var totalOffsetY = ((_Global.innerHeight / 2) - itemBoundingBox.top);
-            origins.push(
-                {
-                    ltr: offsetLeftLTR + "px " + totalOffsetY + "px",
-                    rtl: offsetLeftRTL + "px " + totalOffsetY + "px"
-                }
-            );
-        }
-
-        return origins;
-    }
-
-    function writeAnimationProfilerMark(text) {
-        _WriteProfilerMark("WinJS.UI.Animation:" + text);
-    }
-
-    var ExpandAnimation = _Base.Class.define(function ExpandAnimation_ctor(revealedArray, affectedArray, offsetArray) {
-        // Constructor
-        this.revealedArray = revealedArray;
-        this.affectedArray = affectedArray;
-        this.offsetArray = offsetArray;
-    }, { // Public Members
-        execute: function () {
-            writeAnimationProfilerMark("expandAnimation,StartTM");
-            var promise1 = _TransitionAnimation.executeAnimation(
-                this.revealedArray,
-                {
-                    keyframe: "WinJS-opacity-in",
-                    property: "opacity",
-                    delay: this.affectedArray.length > 0 ? 200 : 0,
-                    duration: 167,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: 0,
-                    to: 1
-                });
-            var promise2 = animTranslate2DTransform(
-                this.affectedArray,
-                this.offsetArray,
-                {
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 367,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: ""
-                });
-            return Promise.join([promise1, promise2])
-                .then(function () { writeAnimationProfilerMark("expandAnimation,StopTM"); });
-        }
-    }, { // Static Members
-        supportedForProcessing: false,
-    });
-
-    var CollapseAnimation = _Base.Class.define(function CollapseAnimation_ctor(hiddenArray, affectedArray, offsetArray) {
-        // Constructor
-        this.hiddenArray = hiddenArray;
-        this.affectedArray = affectedArray;
-        this.offsetArray = offsetArray;
-    }, { // Public Members
-        execute: function () {
-            writeAnimationProfilerMark("collapseAnimation,StartTM");
-            var promise1 = _TransitionAnimation.executeAnimation(
-                this.hiddenArray,
-                {
-                    keyframe: "WinJS-opacity-out",
-                    property: "opacity",
-                    delay: 0,
-                    duration: 167,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: 1,
-                    to: 0
-                });
-            var promise2 = animTranslate2DTransform(
-                this.affectedArray,
-                this.offsetArray,
-                {
-                    property: transformNames.cssName,
-                    delay: this.hiddenArray.length > 0 ? 167 : 0,
-                    duration: 367,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: ""
-                });
-            return Promise.join([promise1, promise2])
-                .then(function () { writeAnimationProfilerMark("collapseAnimation,StopTM"); });
-        }
-    }, { // Static Members
-        supportedForProcessing: false,
-    });
-
-    var RepositionAnimation = _Base.Class.define(function RepositionAnimation_ctor(target, elementArray, offsetArray) {
-        // Constructor
-        this.elementArray = elementArray;
-        this.offsetArray = offsetArray;
-    }, { // Public Members
-        execute: function () {
-            writeAnimationProfilerMark("repositionAnimation,StartTM");
-            return animTranslate2DTransform(
-                this.elementArray,
-                this.offsetArray,
-                {
-                    property: transformNames.cssName,
-                    delay: staggerDelay(0, 33, 1, 250),
-                    duration: 367,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: ""
-                })
-                .then(function () { writeAnimationProfilerMark("repositionAnimation,StopTM"); });
-        }
-    }, { // Static Members
-        supportedForProcessing: false,
-    });
-
-    var AddToListAnimation = _Base.Class.define(function AddToListAnimation_ctor(addedArray, affectedArray, offsetArray) {
-        // Constructor
-        this.addedArray = addedArray;
-        this.affectedArray = affectedArray;
-        this.offsetArray = offsetArray;
-    }, { // Public Members
-        execute: function () {
-            writeAnimationProfilerMark("addToListAnimation,StartTM");
-            var delay = this.affectedArray.length > 0 ? 240 : 0;
-            var promise1 = _TransitionAnimation.executeAnimation(
-                this.addedArray,
-                [{
-                    keyframe: "WinJS-scale-up",
-                    property: transformNames.cssName,
-                    delay: delay,
-                    duration: 120,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: "scale(0.85)",
-                    to: "none"
-                },
-                {
-                    keyframe: "WinJS-opacity-in",
-                    property: "opacity",
-                    delay: delay,
-                    duration: 120,
-                    timing: "linear",
-                    from: 0,
-                    to: 1
-                }]
-            );
-            var promise2 = animTranslate2DTransform(
-                this.affectedArray,
-                this.offsetArray,
-                {
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 400,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: ""
-                });
-            return Promise.join([promise1, promise2])
-                .then(function () { writeAnimationProfilerMark("addToListAnimation,StopTM"); });
-        }
-    }, { // Static Members
-        supportedForProcessing: false,
-    });
-
-    var DeleteFromListAnimation = _Base.Class.define(function DeleteFromListAnimation_ctor(deletedArray, remainingArray, offsetArray) {
-        // Constructor
-        this.deletedArray = deletedArray;
-        this.remainingArray = remainingArray;
-        this.offsetArray = offsetArray;
-    }, { // Public Members
-        execute: function () {
-            writeAnimationProfilerMark("deleteFromListAnimation,StartTM");
-            var promise1 = _TransitionAnimation.executeAnimation(
-                this.deletedArray,
-                [{
-                    keyframe: "WinJS-scale-down",
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 120,
-                    timing: "cubic-bezier(0.11, 0.5, 0.24, .96)",
-                    from: "none",
-                    to: "scale(0.85)"
-                },
-                {
-                    keyframe: "WinJS-opacity-out",
-                    property: "opacity",
-                    delay: 0,
-                    duration: 120,
-                    timing: "linear",
-                    from: 1,
-                    to: 0
-                }]);
-            var promise2 = animTranslate2DTransform(
-                this.remainingArray,
-                this.offsetArray,
-                {
-                    property: transformNames.cssName,
-                    delay: this.deletedArray.length > 0 ? 60 : 0,
-                    duration: 400,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: ""
-                });
-            return Promise.join([promise1, promise2])
-                .then(function () { writeAnimationProfilerMark("deleteFromListAnimation,StopTM"); });
-        }
-    }, { // Static Members
-        supportedForProcessing: false,
-    });
-
-    var _UpdateListAnimation = _Base.Class.define(function _UpdateListAnimation_ctor(addedArray, affectedArray, offsetArray, deleted) {
-        // Constructor
-        this.addedArray = addedArray;
-        this.affectedArray = affectedArray;
-        this.offsetArray = offsetArray;
-        var deletedArray = makeArray(deleted);
-        this.deletedArray = deletedArray;
-        this.deletedOffsetArray = collectOffsetArray(deletedArray);
-    }, { // Public Members
-        execute: function () {
-            writeAnimationProfilerMark("_updateListAnimation,StartTM");
-            makeOffsetsRelative(this.deletedArray, this.deletedOffsetArray);
-
-            var delay = 0;
-            var promise1 = _TransitionAnimation.executeAnimation(
-                this.deletedArray,
-                [{
-                    keyframe: keyframeCallbackAnimate(this.deletedOffsetArray, "WinJS-scale-down"),
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 120,
-                    timing: "cubic-bezier(0.11, 0.5, 0.24, .96)",
-                    from: translateCallbackAnimate(this.deletedOffsetArray),
-                    to: translateCallbackAnimate(this.deletedOffsetArray, "scale(0.85)")
-                },
-                {
-                    keyframe: "WinJS-opacity-out",
-                    property: "opacity",
-                    delay: 0,
-                    duration: 120,
-                    timing: "linear",
-                    from: 1,
-                    to: 0
-                }]);
-
-            if (this.deletedArray.length > 0) {
-                delay += 60;
-            }
-
-            var promise2 = animTranslate2DTransform(
-                this.affectedArray,
-                this.offsetArray,
-                {
-                    property: transformNames.cssName,
-                    delay: delay,
-                    duration: 400,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: ""
-                });
-
-            if (this.affectedArray.length > 0) {
-                delay += 240;
-            } else if (delay) {
-                delay += 60;
-            }
-
-            var promise3 = _TransitionAnimation.executeAnimation(
-                this.addedArray,
-                [{
-                    keyframe: "WinJS-scale-up",
-                    property: transformNames.cssName,
-                    delay: delay,
-                    duration: 120,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: "scale(0.85)",
-                    to: "none"
-                },
-                {
-                    keyframe: "WinJS-opacity-in",
-                    property: "opacity",
-                    delay: delay,
-                    duration: 120,
-                    timing: "linear",
-                    from: 0,
-                    to: 1
-                }]
-            );
-            return Promise.join([promise1, promise2, promise3])
-                .then(function () { writeAnimationProfilerMark("_updateListAnimation,StopTM"); });
-        }
-    }, { // Static Members
-        supportedForProcessing: false,
-    });
-
-
-    var AddToSearchListAnimation = _Base.Class.define(function AddToSearchListAnimation_ctor(addedArray, affectedArray, offsetArray) {
-        // Constructor
-        this.addedArray = addedArray;
-        this.affectedArray = affectedArray;
-        this.offsetArray = offsetArray;
-    }, { // Public Members
-        execute: function () {
-            writeAnimationProfilerMark("addToSearchListAnimation,StartTM");
-            var promise1 = _TransitionAnimation.executeAnimation(
-                this.addedArray,
-                {
-                    keyframe: "WinJS-opacity-in",
-                    property: "opacity",
-                    delay: this.affectedArray.length > 0 ? 240 : 0,
-                    duration: 117,
-                    timing: "linear",
-                    from: 0,
-                    to: 1
-                });
-            var promise2 = animTranslate2DTransform(
-                this.affectedArray,
-                this.offsetArray,
-                {
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 400,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: ""
-                });
-            return Promise.join([promise1, promise2])
-                .then(function () { writeAnimationProfilerMark("addToSearchListAnimation,StopTM"); });
-        }
-    }, { // Static Members
-        supportedForProcessing: false,
-    });
-
-    var DeleteFromSearchListAnimation = _Base.Class.define(function DeleteFromSearchListAnimation_ctor(deletedArray, remainingArray, offsetArray) {
-        // Constructor
-        this.deletedArray = deletedArray;
-        this.remainingArray = remainingArray;
-        this.offsetArray = offsetArray;
-    }, { // Public Members
-        execute: function () {
-            writeAnimationProfilerMark("deleteFromSearchListAnimation,StartTM");
-            var promise1 = _TransitionAnimation.executeAnimation(
-                this.deletedArray,
-                {
-                    keyframe: "WinJS-opacity-out",
-                    property: "opacity",
-                    delay: 0,
-                    duration: 93,
-                    timing: "linear",
-                    from: 1,
-                    to: 0
-                });
-            var promise2 = animTranslate2DTransform(
-                this.remainingArray,
-                this.offsetArray,
-                {
-                    property: transformNames.cssName,
-                    delay: this.deletedArray.length > 0 ? 60 : 0,
-                    duration: 400,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: ""
-                });
-            return Promise.join([promise1, promise2])
-                .then(function () { writeAnimationProfilerMark("deleteFromSearchListAnimation,StopTM"); });
-        }
-    }, { // Static Members
-        supportedForProcessing: false,
-    });
-
-    var PeekAnimation = _Base.Class.define(function PeekAnimation_ctor(target, elementArray, offsetArray) {
-        // Constructor
-        this.elementArray = elementArray;
-        this.offsetArray = offsetArray;
-    }, { // Public Members
-        execute: function () {
-            writeAnimationProfilerMark("peekAnimation,StartTM");
-            return animTranslate2DTransform(
-                this.elementArray,
-                this.offsetArray,
-                {
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 2000,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: ""
-                })
-                .then(function () { writeAnimationProfilerMark("peekAnimation,StopTM"); });
-        }
-    }, { // Static Members
-        supportedForProcessing: false,
-    });
-
-    //
-    // Resize animation
-    //  The resize animation requires 2 animations to run simultaneously in sync with each other. It's implemented
-    //  without PVL because PVL doesn't provide a way to guarantee that 2 animations will start at the same time.
-    //
-    function transformWithTransition(element, transition) {
-        // transition's properties:
-        // - duration: Number representing the duration of the animation in milliseconds.
-        // - timing: String representing the CSS timing function that controls the progress of the animation.
-        // - to: The value of *element*'s transform property after the animation.
-        var duration = transition.duration * _TransitionAnimation._animationFactor;
-        var transitionProperty = _BaseUtils._browserStyleEquivalents["transition"].scriptName;
-        element.style[transitionProperty] = duration + "ms " + transformNames.cssName + " " + transition.timing;
-        element.style[transformNames.scriptName] = transition.to;
-
-        var finish;
-        return new Promise(function (c) {
-            var onTransitionEnd = function (eventObject) {
-                if (eventObject.target === element && eventObject.propertyName === transformNames.cssName) {
-                    finish();
-                }
-            };
-
-            var didFinish = false;
-            finish = function () {
-                if (!didFinish) {
-                    _Global.clearTimeout(timeoutId);
-                    element.removeEventListener(_BaseUtils._browserEventEquivalents["transitionEnd"], onTransitionEnd);
-                    element.style[transitionProperty] = "";
-                    didFinish = true;
-                }
-                c();
-            };
-
-            // Watch dog timeout
-            var timeoutId = _Global.setTimeout(function () {
-                timeoutId = _Global.setTimeout(finish, duration);
-            }, 50);
-
-            element.addEventListener(_BaseUtils._browserEventEquivalents["transitionEnd"], onTransitionEnd);
-        }, function () {
-            finish(); // On cancelation, complete the promise successfully to match PVL
-        });
-    }
-
-    function getResizeDefaultTransitions() {
-        return {
-            defaultResizeGrowTransition: {
-                duration: 350,
-                timing: "cubic-bezier(0.1, 0.9, 0.2, 1)"
-            },
-
-            defaultResizeShrinkTransition: {
-                duration: 120,
-                timing: "cubic-bezier(0.1, 0.9, 0.2, 1)"
-            }
-        };
-    }
-
-    // See _resizeTransition's comment for documentation on *args*.
-    function resizeTransition(elementClipper, element, args) {
-        var defaultTransition = getResizeDefaultTransitions()[(args.to > args.from ? "defaultResizeGrowTransition" : "defaultResizeShrinkTransition")];
-        args = _BaseUtils._merge(args, {
-            duration: args.duration === undefined ? defaultTransition.duration : args.duration,
-            timing: args.timing === undefined ? defaultTransition.timing : args.timing
-        });
-
-        var start = args.actualSize - args.from;
-        var end = args.actualSize - args.to;
-        if (!args.anchorTrailingEdge) {
-            start = -start;
-            end = -end;
-        }
-        var translate = args.dimension === "width" ? "translateX" : "translateY";
-        var transition = {
-            duration: args.duration,
-            timing: args.timing
-        };
-
-        // Set up
-        elementClipper.style[transformNames.scriptName] = translate + "(" + start + "px)";
-        element.style[transformNames.scriptName] = translate + "(" + -start + "px)";
-
-        // Resolve styles
-        _ElementUtilities._getComputedStyle(elementClipper).opacity;
-        _ElementUtilities._getComputedStyle(element).opacity;
-
-        // Merge the transitions, but don't animate yet
-        var clipperTransition = _BaseUtils._merge(transition, { to: translate + "(" + end + "px)" });
-        var elementTransition = _BaseUtils._merge(transition, { to: translate + "(" + -end + "px)" });
-
-        // Return an array so that we can prepare any other animations before beginning everything (used by commanding surface open/close animations)
-        return [
-            { element: elementClipper, transition: clipperTransition },
-            { element: element, transition: elementTransition }
-        ];
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI.Animation", {
-
-        createExpandAnimation: function (revealed, affected) {
-            /// <signature helpKeyword="WinJS.UI.Animation.createExpandAnimation">
-            /// <summary locid="WinJS.UI.Animation.createExpandAnimation">
-            /// Creates an expand animation.
-            /// After creating the ExpandAnimation object,
-            /// modify the document to move the elements to their new positions,
-            /// then call the execute method on the ExpandAnimation object.
-            /// </summary>
-            /// <param name="revealed" locid="WinJS.UI.Animation.createExpandAnimation_p:revealed">
-            /// Single element or collection of elements which were revealed.
-            /// </param>
-            /// <param name="affected" locid="WinJS.UI.Animation.createExpandAnimation_p:affected">
-            /// Single element or collection of elements whose positions were
-            /// affected by the expand.
-            /// </param>
-            /// <returns type="{ execute: Function }" locid="WinJS.UI.Animation.createExpandAnimation_returnValue">
-            /// ExpandAnimation object whose execute method returns
-            /// a Promise that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            return layoutTransition(ExpandAnimation, revealed, affected);
-        },
-
-        createCollapseAnimation: function (hidden, affected) {
-            /// <signature helpKeyword="WinJS.UI.Animation.createCollapseAnimation">
-            /// <summary locid="WinJS.UI.Animation.createCollapseAnimation">
-            /// Creates a collapse animation.
-            /// After creating the CollapseAnimation object,
-            /// modify the document to move the elements to their new positions,
-            /// then call the execute method on the CollapseAnimation object.
-            /// </summary>
-            /// <param name="hidden" locid="WinJS.UI.Animation.createCollapseAnimation_p:hidden">
-            /// Single element or collection of elements being removed from view.
-            /// When the animation completes, the application should hide the elements
-            /// or remove them from the document.
-            /// </param>
-            /// <param name="affected" locid="WinJS.UI.Animation.createCollapseAnimation_p:affected">
-            /// Single element or collection of elements whose positions were
-            /// affected by the collapse.
-            /// </param>
-            /// <returns type="{ execute: Function }" locid="WinJS.UI.Animation.createCollapseAnimation_returnValue">
-            /// CollapseAnimation object whose execute method returns
-            /// a Promise that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            return layoutTransition(CollapseAnimation, hidden, affected);
-        },
-
-        createRepositionAnimation: function (element) {
-            /// <signature helpKeyword="WinJS.UI.Animation.createRepositionAnimation">
-            /// <summary locid="WinJS.UI.Animation.createRepositionAnimation">
-            /// Creates a reposition animation.
-            /// After creating the RepositionAnimation object,
-            /// modify the document to move the elements to their new positions,
-            /// then call the execute method on the RepositionAnimation object.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Animation.createRepositionAnimation_p:element">
-            /// Single element or collection of elements which were repositioned.
-            /// </param>
-            /// <returns type="{ execute: Function }" locid="WinJS.UI.Animation.createRepositionAnimation_returnValue">
-            /// RepositionAnimation object whose execute method returns
-            /// a Promise that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            return layoutTransition(RepositionAnimation, null, element);
-        },
-
-        fadeIn: function (shown) {
-            /// <signature helpKeyword="WinJS.UI.Animation.fadeIn">
-            /// <summary locid="WinJS.UI.Animation.fadeIn">
-            /// Execute a fade-in animation.
-            /// </summary>
-            /// <param name="shown" locid="WinJS.UI.Animation.fadeIn_p:element">
-            /// Single element or collection of elements to fade in.
-            /// At the end of the animation, the opacity of the elements is 1.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.fadeIn_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("fadeIn,StartTM");
-
-            return _TransitionAnimation.executeTransition(
-                shown,
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 250,
-                    timing: "linear",
-                    from: 0,
-                    to: 1
-                })
-                .then(function () { writeAnimationProfilerMark("fadeIn,StopTM"); });
-        },
-
-        fadeOut: function (hidden) {
-            /// <signature helpKeyword="WinJS.UI.Animation.fadeOut">
-            /// <summary locid="WinJS.UI.Animation.fadeOut">
-            /// Execute a fade-out animation.
-            /// </summary>
-            /// <param name="hidden" locid="WinJS.UI.Animation.fadeOut_p:element">
-            /// Single element or collection of elements to fade out.
-            /// At the end of the animation, the opacity of the elements is 0.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.fadeOut_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("fadeOut,StartTM");
-
-            return _TransitionAnimation.executeTransition(
-                hidden,
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 167,
-                    timing: "linear",
-                    to: 0
-                })
-                .then(function () { writeAnimationProfilerMark("fadeOut,StopTM"); });
-        },
-
-        createAddToListAnimation: function (added, affected) {
-            /// <signature helpKeyword="WinJS.UI.Animation.createAddToListAnimation" >
-            /// <summary locid="WinJS.UI.Animation.createAddToListAnimation">
-            /// Creates an animation for adding to a list.
-            /// After creating the AddToListAnimation object,
-            /// modify the document to move the elements to their new positions,
-            /// then call the execute method on the AddToListAnimation object.
-            /// </summary>
-            /// <param name="added" locid="WinJS.UI.Animation.createAddToListAnimation_p:added">
-            /// Single element or collection of elements which were added.
-            /// </param>
-            /// <param name="affected" locid="WinJS.UI.Animation.createAddToListAnimation_p:affected">
-            /// Single element or collection of elements whose positions were
-            /// affected by the add.
-            /// </param>
-            /// <returns type="{ execute: Function }" locid="WinJS.UI.Animation.createAddToListAnimation_returnValue">
-            /// AddToListAnimation object whose execute method returns
-            /// a Promise that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            return layoutTransition(AddToListAnimation, added, affected);
-        },
-
-        createDeleteFromListAnimation: function (deleted, remaining) {
-            /// <signature helpKeyword="WinJS.UI.Animation.createDeleteFromListAnimation">
-            /// <summary locid="WinJS.UI.Animation.createDeleteFromListAnimation">
-            /// Crestes an animation for deleting from a list.
-            /// After creating the DeleteFromListAnimation object,
-            /// modify the document to reflect the deletion,
-            /// then call the execute method on the DeleteFromListAnimation object.
-            /// </summary>
-            /// <param name="deleted" locid="WinJS.UI.Animation.createDeleteFromListAnimation_p:deleted">
-            /// Single element or collection of elements which will be deleted.
-            /// When the animation completes, the application should hide the elements
-            /// or remove them from the document.
-            /// </param>
-            /// <param name="remaining" locid="WinJS.UI.Animation.createDeleteFromListAnimation_p:remaining">
-            /// Single element or collection of elements whose positions were
-            /// affected by the deletion.
-            /// </param>
-            /// <returns type="{ execute: Function }" locid="WinJS.UI.Animation.createDeleteFromListAnimation_returnValue">
-            /// DeleteFromListAnimation object whose execute method returns
-            /// a Promise that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            return layoutTransition(DeleteFromListAnimation, deleted, remaining);
-        },
-
-        _createUpdateListAnimation: function (added, deleted, affected) {
-            return layoutTransition(_UpdateListAnimation, added, affected, deleted);
-        },
-
-        createAddToSearchListAnimation: function (added, affected) {
-            /// <signature helpKeyword="WinJS.UI.Animation.createAddToSearchListAnimation">
-            /// <summary locid="WinJS.UI.Animation.createAddToSearchListAnimation">
-            /// Creates an animation for adding to a list of search results.
-            /// This is similar to an AddToListAnimation, but faster.
-            /// After creating the AddToSearchListAnimation object,
-            /// modify the document to move the elements to their new positions,
-            /// then call the execute method on the AddToSearchListAnimation object.
-            /// </summary>
-            /// <param name="added" locid="WinJS.UI.Animation.createAddToSearchListAnimation_p:added">
-            /// Single element or collection of elements which were added.
-            /// </param>
-            /// <param name="affected" locid="WinJS.UI.Animation.createAddToSearchListAnimation_p:affected">
-            /// Single element or collection of elements whose positions were
-            /// affected by the add.
-            /// </param>
-            /// <returns type="{ execute: Function }" locid="WinJS.UI.Animation.createAddToSearchListAnimation_returnValue">
-            /// AddToSearchListAnimation object whose execute method returns
-            /// a Promise that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            return layoutTransition(AddToSearchListAnimation, added, affected);
-        },
-
-        createDeleteFromSearchListAnimation: function (deleted, remaining) {
-            /// <signature helpKeyword="WinJS.UI.Animation.createDeleteFromSearchListAnimation">
-            /// <summary locid="WinJS.UI.Animation.createDeleteFromSearchListAnimation">
-            /// Creates an animation for deleting from a list of search results.
-            /// This is similar to an DeleteFromListAnimation, but faster.
-            /// After creating the DeleteFromSearchListAnimation object,
-            /// modify the document to move the elements to their new positions,
-            /// then call the execute method on the DeleteFromSearchListAnimation object.
-            /// </summary>
-            /// <param name="deleted" locid="WinJS.UI.Animation.createDeleteFromSearchListAnimation_p:deleted">
-            /// Single element or collection of elements which will be deleted.
-            /// When the animation completes, the application should hide the elements
-            /// or remove them from the document.
-            /// </param>
-            /// <param name="remaining" locid="WinJS.UI.Animation.createDeleteFromSearchListAnimation_p:remaining">
-            /// Single element or collection of elements whose positions were
-            /// affected by the deletion.
-            /// </param>
-            /// <returns type="{ execute: Function }" locid="WinJS.UI.Animation.createDeleteFromSearchListAnimation_returnValue">
-            /// DeleteFromSearchListAnimation object whose execute method returns
-            /// a Promise that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            return layoutTransition(DeleteFromSearchListAnimation, deleted, remaining);
-        },
-
-
-        showEdgeUI: function (element, offset, options) {
-            /// <signature helpKeyword="WinJS.UI.Animation.showEdgeUI">
-            /// <summary locid="WinJS.UI.Animation.showEdgeUI">
-            /// Slides an element or elements into position at the edge of the screen.
-            /// This animation is designed for a small object like an appbar.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Animation.showEdgeUI_p:element">
-            /// Single element or collection of elements to be slid into position.
-            /// The elements should be at their final positions
-            /// at the time the function is called.
-            /// </param>
-            /// <param name="offset" locid="WinJS.UI.Animation.showEdgeUI_p:offset">
-            /// Optional offset object or collection of offset objects
-            /// array describing the starting point of the animation.
-            /// If the number of offset objects is less than the length of the
-            /// element parameter, then the last value is repeated for all
-            /// remaining elements.
-            /// If this parameter is omitted, then a default value is used.
-            /// </param>
-            /// <param name="options" type="Object" optional="true" locid="WinJS.UI.Animation.showEdgeUI_p:options">
-            /// Optional object which can specify the mechanism to use to play the animation. By default css
-            /// animations are used but if { mechanism: "transition" } is provided css transitions will be used.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.showEdgeUI_p:returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("showEdgeUI,StartTM");
-
-            var isTransition = options && options.mechanism === "transition";
-            var offsetArray = new OffsetArray(offset, "WinJS-showEdgeUI", [{ top: "-70px", left: "0px" }]);
-            return _TransitionAnimation[(isTransition ? "executeTransition" : "executeAnimation")](
-                element,
-                {
-                    keyframe: offsetArray.keyframe,
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 367,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: isTransition ? translateCallback(offsetArray) : (offsetArray.keyframe || translateCallback(offsetArray)),
-                    to: "none"
-                })
-                .then(function () { writeAnimationProfilerMark("showEdgeUI,StopTM"); });
-        },
-
-        showPanel: function (element, offset) {
-            /// <signature helpKeyword="WinJS.UI.Animation.showPanel">
-            /// <summary locid="WinJS.UI.Animation.showPanel">
-            /// Slides an element or elements into position at the edge of the screen.
-            /// This animation is designed for a large object like a keyboard.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Animation.showPanel_p:element">
-            /// Single element or collection of elements to be slid into position.
-            /// The elements should be at their final positions
-            /// at the time the function is called.
-            /// </param>
-            /// <param name="offset" locid="WinJS.UI.Animation.showPanel_p:offset">
-            /// Optional offset object or collection of offset objects
-            /// array describing the starting point of the animation.
-            /// If the number of offset objects is less than the length of the
-            /// element parameter, then the last value is repeated for all
-            /// remaining elements.
-            /// If this parameter is omitted, then a default value is used.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.showPanel_returnValue">
-            /// promise object
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("showPanel,StartTM");
-
-            var offsetArray = new OffsetArray(offset, "WinJS-showPanel", [{ top: "0px", left: "364px", rtlflip: true }]);
-            return _TransitionAnimation.executeAnimation(
-                element,
-                {
-                    keyframe: offsetArray.keyframe,
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 550,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: offsetArray.keyframe || translateCallback(offsetArray),
-                    to: "none"
-                })
-                .then(function () { writeAnimationProfilerMark("showPanel,StopTM"); });
-        },
-
-        hideEdgeUI: function (element, offset, options) {
-            /// <signature helpKeyword="WinJS.UI.Animation.hideEdgeUI">
-            /// <summary locid="WinJS.UI.Animation.hideEdgeUI">
-            /// Slides an element or elements at the edge of the screen out of view.
-            /// This animation is designed for a small object like an appbar.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Animation.hideEdgeUI_p:element">
-            /// Single element or collection of elements to be slid out.
-            /// The elements should be at their onscreen positions
-            /// at the time the function is called.
-            /// </param>
-            /// <param name="offset" locid="WinJS.UI.Animation.hideEdgeUI_p:offset">
-            /// Optional offset object or collection of offset objects
-            /// array describing the ending point of the animation.
-            /// If the number of offset objects is less than the length of the
-            /// element parameter, then the last value is repeated for all
-            /// remaining elements.
-            /// If this parameter is omitted, then a default value is used.
-            /// </param>
-            /// <param name="options" type="Object" optional="true" locid="WinJS.UI.Animation.hideEdgeUI_p:options">
-            /// Optional object which can specify the mechanism to use to play the animation. By default css
-            /// animations are used but if { mechanism: "transition" } is provided css transitions will be used.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.hideEdgeUI_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("hideEdgeUI,StartTM");
-
-            var isTransition = options && options.mechanism === "transition";
-            var offsetArray = new OffsetArray(offset, "WinJS-hideEdgeUI", [{ top: "-70px", left: "0px" }]);
-            return _TransitionAnimation[(isTransition ? "executeTransition" : "executeAnimation")](
-                element,
-                {
-                    keyframe: offsetArray.keyframe,
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 367,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: "none",
-                    to: isTransition ? translateCallback(offsetArray) : (offsetArray.keyframe || translateCallback(offsetArray))
-                })
-                .then(function () { writeAnimationProfilerMark("hideEdgeUI,StopTM"); });
-        },
-
-        hidePanel: function (element, offset) {
-            /// <signature helpKeyword="WinJS.UI.Animation.hidePanel">
-            /// <summary locid="WinJS.UI.Animation.hidePanel">
-            /// Slides an element or elements at the edge of the screen out of view.
-            /// This animation is designed for a large object like a keyboard.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Animation.hidePanel_p:element">
-            /// Single element or collection of elements to be slid out.
-            /// The elements should be at their onscreen positions
-            /// at the time the function is called.
-            /// </param>
-            /// <param name="offset" locid="WinJS.UI.Animation.hidePanel_p:offset">
-            /// Optional offset object or collection of offset objects
-            /// array describing the ending point of the animation.
-            /// If the number of offset objects is less than the length of the
-            /// element parameter, then the last value is repeated for all
-            /// remaining elements.
-            /// If this parameter is omitted, then a default value is used.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.hidePanel_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("hidePanel,StartTM");
-
-            var offsetArray = new OffsetArray(offset, "WinJS-hidePanel", [{ top: "0px", left: "364px", rtlflip: true }]);
-            return _TransitionAnimation.executeAnimation(
-                element,
-                {
-                    keyframe: offsetArray.keyframe,
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 550,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: "none",
-                    to: offsetArray.keyframe || translateCallback(offsetArray)
-                })
-                .then(function () { writeAnimationProfilerMark("hidePanel,StopTM"); });
-        },
-
-        showPopup: function (element, offset) {
-            /// <signature helpKeyword="WinJS.UI.Animation.showPopup">
-            /// <summary locid="WinJS.UI.Animation.showPopup">
-            /// Displays an element or elements in the style of a popup.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Animation.showPopup_p:element">
-            /// Single element or collection of elements to be shown like a popup.
-            /// </param>
-            /// <param name="offset" locid="WinJS.UI.Animation.showPopup_p:offset">
-            /// Optional offset object or collection of offset objects
-            /// array describing the starting point of the animation.
-            /// If the number of offset objects is less than the length of the
-            /// element parameter, then the last value is repeated for all
-            /// remaining elements.
-            /// If this parameter is omitted, then a default value is used.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.showPopup_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("showPopup,StartTM");
-
-            var offsetArray = new OffsetArray(offset, "WinJS-showPopup", [{ top: "50px", left: "0px" }]);
-            return _TransitionAnimation.executeAnimation(
-                element,
-                [{
-                    keyframe: "WinJS-opacity-in",
-                    property: "opacity",
-                    delay: 83,
-                    duration: 83,
-                    timing: "linear",
-                    from: 0,
-                    to: 1
-                },
-                {
-                    keyframe: offsetArray.keyframe,
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 367,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: offsetArray.keyframe || translateCallback(offsetArray),
-                    to: "none"
-                }])
-                .then(function () { writeAnimationProfilerMark("showPopup,StopTM"); });
-        },
-
-        hidePopup: function (element) {
-            /// <signature helpKeyword="WinJS.UI.Animation.hidePopup" >
-            /// <summary locid="WinJS.UI.Animation.hidePopup">
-            /// Removes a popup from the screen.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Animation.hidePopup_p:element">
-            /// Single element or collection of elements to be hidden like a popup.
-            /// When the animation completes, the application should hide the elements
-            /// or remove them from the document.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.hidePopup_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("hidePopup,StartTM");
-
-            return _TransitionAnimation.executeAnimation(
-                element,
-                {
-                    keyframe: "WinJS-opacity-out",
-                    property: "opacity",
-                    delay: 0,
-                    duration: 83,
-                    timing: "linear",
-                    from: 1,
-                    to: 0
-                })
-                .then(function () { writeAnimationProfilerMark("hidePopup,StopTM"); });
-        },
-
-        pointerDown: function (element) {
-            /// <signature helpKeyword="WinJS.UI.Animation.pointerDown">
-            /// <summary locid="WinJS.UI.Animation.pointerDown">
-            /// Execute a pointer-down animation.
-            /// Use the pointerUp animation to reverse the effect of this animation.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Animation.pointerDown_p:element">
-            /// Single element or collection of elements responding to the
-            /// pointer-down event.
-            /// At the end of the animation, the elements' properties have been
-            /// modified to reflect the pointer-down state.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.pointerDown_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("pointerDown,StartTM");
-
-            return _TransitionAnimation.executeTransition(
-                 element,
-                 {
-                     property: transformNames.cssName,
-                     delay: 0,
-                     duration: 167,
-                     timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                     to: "scale(0.975, 0.975)"
-                 })
-                .then(function () { writeAnimationProfilerMark("pointerDown,StopTM"); });
-        },
-
-        pointerUp: function (element) {
-            /// <signature helpKeyword="WinJS.UI.Animation.pointerUp">
-            /// <summary locid="WinJS.UI.Animation.pointerUp">
-            /// Execute a pointer-up animation.
-            /// This reverses the effect of a pointerDown animation.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Animation.pointerUp_p:element">
-            /// Single element or collection of elements responding to
-            /// the pointer-up event.
-            /// At the end of the animation, the elements' properties have been
-            /// returned to normal.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.pointerUp_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("pointerUp,StartTM");
-
-            return _TransitionAnimation.executeTransition(
-                 element,
-                 {
-                     property: transformNames.cssName,
-                     delay: 0,
-                     duration: 167,
-                     timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                     to: ""
-                 })
-                .then(function () { writeAnimationProfilerMark("pointerUp,StopTM"); });
-        },
-
-        dragSourceStart: function (dragSource, affected) {
-            /// <signature helpKeyword="WinJS.UI.Animation.dragSourceStart" >
-            /// <summary locid="WinJS.UI.Animation.dragSourceStart">
-            /// Execute a drag-start animation.
-            /// Use the dragSourceEnd animation to reverse the effects of this animation.
-            /// </summary>
-            /// <param name="dragSource" locid="WinJS.UI.Animation.dragSourceStart_p:dragSource">
-            /// Single element or collection of elements being dragged.
-            /// At the end of the animation, the elements' properties have been
-            /// modified to reflect the drag state.
-            /// </param>
-            /// <param name="affected" locid="WinJS.UI.Animation.dragSourceStart_p:affected">
-            /// Single element or collection of elements to highlight as not
-            /// being dragged.
-            /// At the end of the animation, the elements' properties have been
-            /// modified to reflect the drag state.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.dragSourceStart_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("dragSourceStart,StartTM");
-
-            var promise1 = _TransitionAnimation.executeTransition(
-                dragSource,
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 240,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: "scale(1.05)"
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 240,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: 0.65
-                }]);
-            var promise2 = _TransitionAnimation.executeTransition(
-                affected,
-                {
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 240,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: "scale(0.95)"
-                });
-            return Promise.join([promise1, promise2])
-                .then(function () { writeAnimationProfilerMark("dragSourceStart,StopTM"); });
-        },
-
-        dragSourceEnd: function (dragSource, offset, affected) {
-            /// <signature helpKeyword="WinJS.UI.Animation.dragSourceEnd">
-            /// <summary locid="WinJS.UI.Animation.dragSourceEnd">
-            /// Execute a drag-end animation.
-            /// This reverses the effect of the dragSourceStart animation.
-            /// </summary>
-            /// <param name="dragSource" locid="WinJS.UI.Animation.dragSourceEnd_p:dragSource">
-            /// Single element or collection of elements no longer being dragged.
-            /// At the end of the animation, the elements' properties have been
-            /// returned to normal.
-            /// </param>
-            /// <param name="offset" locid="WinJS.UI.Animation.dragSourceEnd_p:offset">
-            /// Optional offset object or collection of offset objects
-            /// array describing the starting point of the animation.
-            /// If the number of offset objects is less than the length of the
-            /// dragSource parameter, then the last value is repeated for all
-            /// remaining elements.
-            /// If this parameter is omitted, then a default value is used.
-            /// </param>
-            /// <param name="affected" locid="WinJS.UI.Animation.dragSourceEnd_p:affected">
-            /// Single element or collection of elements which were highlighted as not
-            /// being dragged.
-            /// At the end of the animation, the elements' properties have been
-            /// returned to normal.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.dragSourceEnd_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("dragSourceEnd,StartTM");
-
-            var offsetArray = new OffsetArray(offset, "WinJS-dragSourceEnd");
-            var promise1 = _TransitionAnimation.executeTransition(
-                dragSource,
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 500,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: "" // this removes the scale
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 500,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: 1
-                }]);
-
-            var promise2 = _TransitionAnimation.executeAnimation(
-                dragSource,
-                {
-                    keyframe: offsetArray.keyframe,
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 500,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: offsetArray.keyframe || translateCallback(offsetArray, "scale(1.05) "),
-                    to: "none"
-                });
-
-            var promise3 = _TransitionAnimation.executeTransition(
-                 affected,
-                 {
-                     property: transformNames.cssName,
-                     delay: 0,
-                     duration: 500,
-                     timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                     to: ""
-                 });
-            return Promise.join([promise1, promise2, promise3])
-                .then(function () { writeAnimationProfilerMark("dragSourceEnd,StopTM"); });
-        },
-
-
-        enterContent: function (incoming, offset, options) {
-            /// <signature helpKeyword="WinJS.UI.Animation.enterContent">
-            /// <summary locid="WinJS.UI.Animation.enterContent">
-            /// Execute an enter-content animation.
-            /// </summary>
-            /// <param name="incoming" locid="WinJS.UI.Animation.enterContent_p:incoming">
-            /// Single element or collection of elements which represent
-            /// the incoming content.
-            /// At the end of the animation, the opacity of the elements is 1.
-            /// </param>
-            /// <param name="offset" locid="WinJS.UI.Animation.enterContent_p:offset">
-            /// Optional offset object or collection of offset objects
-            /// array describing the starting point of the animation.
-            /// If the number of offset objects is less than the length of the
-            /// incoming parameter, then the last value is repeated for all
-            /// remaining elements.
-            /// If this parameter is omitted, then a default value is used.
-            /// </param>
-            /// <param name="options" type="Object" optional="true" locid="WinJS.UI.Animation.enterContent_p:options">
-            /// Optional object which can specify the mechanism to use to play the animation. By default css
-            /// animations are used but if { mechanism: "transition" } is provided css transitions will be used.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.enterContent_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("enterContent,StartTM");
-
-            var animationPromise;
-            var offsetArray = new OffsetArray(offset, "WinJS-enterContent", [{ top: "28px", left: "0px", rtlflip: false }]);
-            if (options && options.mechanism === "transition") {
-                animationPromise = _TransitionAnimation.executeTransition(
-                    incoming,
-                    [{
-                        property: transformNames.cssName,
-                        delay: 0,
-                        duration: 550,
-                        timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                        from: translateCallback(offsetArray),
-                        to: "none"
-                    },
-                    {
-                        property: "opacity",
-                        delay: 0,
-                        duration: 170,
-                        timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                        from: 0,
-                        to: 1
-                    }]);
-            } else {
-                var promise1 = _TransitionAnimation.executeAnimation(
-                    incoming,
-                    {
-                        keyframe: offsetArray.keyframe,
-                        property: transformNames.cssName,
-                        delay: 0,
-                        duration: 550,
-                        timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                        from: offsetArray.keyframe || translateCallback(offsetArray),
-                        to: "none"
-                    });
-                var promise2 = _TransitionAnimation.executeTransition(
-                    incoming,
-                    {
-                        property: "opacity",
-                        delay: 0,
-                        duration: 170,
-                        timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                        from: 0,
-                        to: 1
-                    });
-                animationPromise = Promise.join([promise1, promise2]);
-            }
-            return animationPromise.then(function () { writeAnimationProfilerMark("enterContent,StopTM"); });
-        },
-
-        exitContent: function (outgoing, offset) {
-            /// <signature helpKeyword="WinJS.UI.Animation.exitContent">
-            /// <summary locid="WinJS.UI.Animation.exitContent">
-            /// Execute an exit-content animation.
-            /// </summary>
-            /// <param name="outgoing" locid="WinJS.UI.Animation.exitContent_p:outgoing">
-            /// Single element or collection of elements which represent
-            /// the outgoing content.
-            /// At the end of the animation, the opacity of the elements is 0.
-            /// </param>
-            /// <param name="offset" locid="WinJS.UI.Animation.exitContent_p:offset">
-            /// Optional offset object or collection of offset objects
-            /// array describing the ending point of the animation.
-            /// If the number of offset objects is less than the length of the
-            /// outgoing parameter, then the last value is repeated for all
-            /// remaining elements.
-            /// If this parameter is omitted, then a default value is used.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.exitContent_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("exitContent,StartTM");
-
-            var offsetArray = new OffsetArray(offset, "WinJS-exit", [{ top: "0px", left: "0px" }]);
-            var promise1 = _TransitionAnimation.executeAnimation(
-                outgoing,
-                offset && {
-                    keyframe: offsetArray.keyframe,
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 117,
-                    timing: "linear",
-                    from: "none",
-                    to: offsetArray.keyframe || translateCallback(offsetArray)
-                });
-
-            var promise2 = _TransitionAnimation.executeTransition(
-                outgoing,
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 117,
-                    timing: "linear",
-                    to: 0
-                });
-            return Promise.join([promise1, promise2])
-                .then(function () { writeAnimationProfilerMark("exitContent,StopTM"); });
-        },
-
-        dragBetweenEnter: function (target, offset) {
-            /// <signature helpKeyword="WinJS.UI.Animation.dragBetweenEnter">
-            /// <summary locid="WinJS.UI.Animation.dragBetweenEnter">
-            /// Execute an animation which indicates that a dragged object
-            /// can be dropped between other elements.
-            /// Use the dragBetweenLeave animation to reverse the effects of this animation.
-            /// </summary>
-            /// <param name="target" locid="WinJS.UI.Animation.dragBetweenEnter_p:target">
-            /// Single element or collection of elements (usually two)
-            /// that the dragged object can be dropped between.
-            /// At the end of the animation, the elements' properties have been
-            /// modified to reflect the drag-between state.
-            /// </param>
-            /// <param name="offset" locid="WinJS.UI.Animation.dragBetweenEnter_p:offset">
-            /// Optional offset object or collection of offset objects
-            /// array describing the ending point of the animation.
-            /// If the number of offset objects is less than the length of the
-            /// element parameter, then the last value is repeated for all
-            /// remaining elements.
-            /// If this parameter is omitted, then a default value is used.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.dragBetweenEnter_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("dragBetweenEnter,StartTM");
-
-            var offsetArray = new OffsetArray(offset, null, [{ top: "-40px", left: "0px" }, { top: "40px", left: "0px" }]);
-            return _TransitionAnimation.executeTransition(
-                target,
-                {
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 200,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: translateCallback(offsetArray, "scale(0.95) ")
-                })
-                .then(function () { writeAnimationProfilerMark("dragBetweenEnter,StopTM"); });
-        },
-
-        dragBetweenLeave: function (target) {
-            /// <signature helpKeyword="WinJS.UI.Animation.dragBetweenLeave">
-            /// <summary locid="WinJS.UI.Animation.dragBetweenLeave">
-            /// Execute an animation which indicates that a dragged object
-            /// will no longer be dropped between other elements.
-            /// This reverses the effect of the dragBetweenEnter animation.
-            /// </summary>
-            /// <param name="target" locid="WinJS.UI.Animation.dragBetweenLeave_p:target">
-            /// Single element or collection of elements (usually two)
-            /// that the dragged object no longer will be dropped between.
-            /// At the end of the animation, the elements' properties have been
-            /// set to the dragSourceStart state.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.dragBetweenLeave_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("dragBetweenLeave,StartTM");
-
-            return _TransitionAnimation.executeTransition(
-                target,
-                {
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 200,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: "scale(0.95)"
-                })
-                .then(function () { writeAnimationProfilerMark("dragBetweenLeave,StopTM"); });
-        },
-
-        swipeSelect: function (selected, selection) {
-            /// <signature helpKeyword="WinJS.UI.Animation.swipeSelect">
-            /// <summary locid="WinJS.UI.Animation.swipeSelect">
-            /// Slide a swipe-selected object back into position when the
-            /// pointer is released, and show the selection mark.
-            /// </summary>
-            /// <param name="selected" locid="WinJS.UI.Animation.swipeSelect_p:selected">
-            /// Single element or collection of elements being selected.
-            /// At the end of the animation, the elements' properties have been
-            /// returned to normal.
-            /// </param>
-            /// <param name="selection" locid="WinJS.UI.Animation.swipeSelect_p:selection">
-            /// Single element or collection of elements that is the selection mark.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.swipeSelect_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("swipeSelect,StartTM");
-
-            var promise1 = _TransitionAnimation.executeTransition(
-                selected,
-                {
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 300,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: ""
-                });
-
-            var promise2 = _TransitionAnimation.executeAnimation(
-                selection,
-                {
-                    keyframe: "WinJS-opacity-in",
-                    property: "opacity",
-                    delay: 0,
-                    duration: 300,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: 0,
-                    to: 1
-                });
-            return Promise.join([promise1, promise2])
-                .then(function () { writeAnimationProfilerMark("swipeSelect,StopTM"); });
-        },
-
-        swipeDeselect: function (deselected, selection) {
-            /// <signature helpKeyword="WinJS.UI.Animation.swipeDeselect">
-            /// <summary locid="WinJS.UI.Animation.swipeDeselect">
-            /// Slide a swipe-deselected object back into position when the
-            /// pointer is released, and hide the selection mark.
-            /// </summary>
-            /// <param name="deselected" locid="WinJS.UI.Animation.swipeDeselect_p:deselected">
-            /// Single element or collection of elements being deselected.
-            /// At the end of the animation, the elements' properties have been
-            /// returned to normal.
-            /// </param>
-            /// <param name="selection" locid="WinJS.UI.Animation.swipeDeselect_p:selection">
-            /// Single element or collection of elements that is the selection mark.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.swipeDeselect_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("swipeDeselect,StartTM");
-
-            var promise1 = _TransitionAnimation.executeTransition(
-                deselected,
-                {
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 300,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: ""
-                });
-
-            var promise2 = _TransitionAnimation.executeAnimation(
-                selection,
-                {
-                    keyframe: "WinJS-opacity-out",
-                    property: "opacity",
-                    delay: 0,
-                    duration: 300,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: 1,
-                    to: 0
-                });
-            return Promise.join([promise1, promise2])
-                .then(function () { writeAnimationProfilerMark("swipeDeselect,StopTM"); });
-        },
-
-        swipeReveal: function (target, offset) {
-            /// <signature helpKeyword="WinJS.UI.Animation.swipeReveal">
-            /// <summary locid="WinJS.UI.Animation.swipeReveal">
-            /// Reveal an object as the result of a swipe, or slide the
-            /// swipe-selected object back into position after the reveal.
-            /// </summary>
-            /// <param name="target" locid="WinJS.UI.Animation.swipeReveal_p:target">
-            /// Single element or collection of elements being selected.
-            /// At the end of the animation, the elements' properties have been
-            /// modified to reflect the specified offset.
-            /// </param>
-            /// <param name="offset" locid="WinJS.UI.Animation.swipeReveal_p:offset">
-            /// Optional offset object or collection of offset objects
-            /// array describing the ending point of the animation.
-            /// When moving the object back into position, the offset should be
-            /// { top: "0px", left: "0px" }.
-            /// If the number of offset objects is less than the length of the
-            /// element parameter, then the last value is repeated for all
-            /// remaining elements.
-            /// If this parameter is omitted, then a default value is used.
-            /// The default value describes the motion for a reveal.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.swipeReveal_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("swipeReveal,StartTM");
-
-            var offsetArray = new OffsetArray(offset, null, [{ top: "25px", left: "0px" }]);
-            return _TransitionAnimation.executeTransition(
-                target,
-                {
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 300,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    to: translateCallback(offsetArray)
-                })
-                .then(function () { writeAnimationProfilerMark("swipeReveal,StopTM"); });
-        },
-
-        enterPage: function (element, offset) {
-            /// <signature helpKeyword="WinJS.UI.Animation.enterPage">
-            /// <summary locid="WinJS.UI.Animation.enterPage">
-            /// Execute an enterPage animation.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Animation.enterPage_p:element">
-            /// Single element or collection of elements representing the
-            /// incoming page.
-            /// At the end of the animation, the opacity of the elements is 1.
-            /// </param>
-            /// <param name="offset" locid="WinJS.UI.Animation.enterPage_p:offset">
-            /// Optional offset object or collection of offset objects
-            /// array describing the starting point of the animation.
-            /// If the number of offset objects is less than the length of the
-            /// element parameter, then the last value is repeated for all
-            /// remaining elements.
-            /// If this parameter is omitted, then a default value is used.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.enterPage_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("enterPage,StartTM");
-
-            var offsetArray = new OffsetArray(offset, "WinJS-enterPage", [{ top: "28px", left: "0px", rtlflip: false }]);
-            var promise1 = _TransitionAnimation.executeAnimation(
-                element,
-                {
-                    keyframe: offsetArray.keyframe,
-                    property: transformNames.cssName,
-                    delay: staggerDelay(0, 83, 1, 333),
-                    duration: 1000,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: offsetArray.keyframe || translateCallback(offsetArray),
-                    to: "none"
-                });
-            var promise2 = _TransitionAnimation.executeTransition(
-                element,
-                {
-                    property: "opacity",
-                    delay: staggerDelay(0, 83, 1, 333),
-                    duration: 170,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: 0,
-                    to: 1
-                });
-            return Promise.join([promise1, promise2])
-                .then(function () { writeAnimationProfilerMark("enterPage,StopTM"); });
-        },
-
-        exitPage: function (outgoing, offset) {
-            /// <signature helpKeyword="WinJS.UI.Animation.exitPage">
-            /// <summary locid="WinJS.UI.Animation.exitPage">
-            /// Execute an exitPage animation.
-            /// </summary>
-            /// <param name="outgoing" locid="WinJS.UI.Animation.exitPage_p:outgoing">
-            /// Single element or collection of elements representing
-            /// the outgoing page.
-            /// At the end of the animation, the opacity of the elements is 0.
-            /// </param>
-            /// <param name="offset" locid="WinJS.UI.Animation.exitPage_p:offset">
-            /// Optional offset object or collection of offset objects
-            /// array describing the ending point of the animation.
-            /// If the number of offset objects is less than the length of the
-            /// outgoing parameter, then the last value is repeated for all
-            /// remaining elements.
-            /// If this parameter is omitted, then a default value is used.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.exitPage_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("exitPage,StartTM");
-
-            var offsetArray = new OffsetArray(offset, "WinJS-exit", [{ top: "0px", left: "0px" }]);
-            var promise1 = _TransitionAnimation.executeAnimation(
-                outgoing,
-                offset && {
-                    keyframe: offsetArray.keyframe,
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 117,
-                    timing: "linear",
-                    from: "none",
-                    to: offsetArray.keyframe || translateCallback(offsetArray)
-                });
-
-            var promise2 = _TransitionAnimation.executeTransition(
-                outgoing,
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 117,
-                    timing: "linear",
-                    to: 0
-                });
-            return Promise.join([promise1, promise2])
-                .then(function () { writeAnimationProfilerMark("exitPage,StopTM"); });
-        },
-
-        crossFade: function (incoming, outgoing) {
-            /// <signature helpKeyword="WinJS.UI.Animation.crossFade">
-            /// <summary locid="WinJS.UI.Animation.crossFade">
-            /// Execute a crossFade animation.
-            /// </summary>
-            /// <param name="incoming" locid="WinJS.UI.Animation.crossFade_p:incoming">
-            /// Single incoming element or collection of incoming elements.
-            /// At the end of the animation, the opacity of the elements is 1.
-            /// </param>
-            /// <param name="outgoing" locid="WinJS.UI.Animation.crossFade_p:outgoing">
-            /// Single outgoing element or collection of outgoing elements.
-            /// At the end of the animation, the opacity of the elements is 0.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.crossFade_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("crossFade,StartTM");
-
-            var promise1 = _TransitionAnimation.executeTransition(
-                incoming,
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 167,
-                    timing: "linear",
-                    to: 1
-                });
-
-            var promise2 = _TransitionAnimation.executeTransition(
-                outgoing,
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 167,
-                    timing: "linear",
-                    to: 0
-                });
-            return Promise.join([promise1, promise2])
-                .then(function () { writeAnimationProfilerMark("crossFade,StopTM"); });
-        },
-
-        createPeekAnimation: function (element) {
-            /// <signature helpKeyword="WinJS.UI.Animation.createPeekAnimation">
-            /// <summary locid="WinJS.UI.Animation.createPeekAnimation">
-            /// Creates a peek animation.
-            /// After creating the PeekAnimation object,
-            /// modify the document to move the elements to their new positions,
-            /// then call the execute method on the PeekAnimation object.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Animation.createPeekAnimation_p:element">
-            /// Single element or collection of elements to be repositioned for peek.
-            /// </param>
-            /// <returns type="{ execute: Function }" locid="WinJS.UI.Animation.createPeekAnimation_returnValue">
-            /// PeekAnimation object whose execute method returns
-            /// a Promise that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            return layoutTransition(PeekAnimation, null, element);
-        },
-
-        updateBadge: function (incoming, offset) {
-            /// <signature helpKeyword="WinJS.UI.Animation.updateBadge">
-            /// <summary locid="WinJS.UI.Animation.updateBadge">
-            /// Execute an updateBadge animation.
-            /// </summary>
-            /// <param name="incoming" locid="WinJS.UI.Animation.updateBadge_p:incoming">
-            /// Single element or collection of elements representing the
-            /// incoming badge.
-            /// </param>
-            /// <param name="offset" locid="WinJS.UI.Animation.updateBadge_p:offset">
-            /// Optional offset object or collection of offset objects
-            /// array describing the starting point of the animation.
-            /// If the number of offset objects is less than the length of the
-            /// incoming parameter, then the last value is repeated for all
-            /// remaining elements.
-            /// If this parameter is omitted, then a default value is used.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.updateBadge_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("updateBadge,StartTM");
-
-            var offsetArray = new OffsetArray(offset, "WinJS-updateBadge", [{ top: "24px", left: "0px" }]);
-            return _TransitionAnimation.executeAnimation(
-                incoming,
-                [{
-                    keyframe: "WinJS-opacity-in",
-                    property: "opacity",
-                    delay: 0,
-                    duration: 367,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: 0,
-                    to: 1
-                },
-                {
-                    keyframe: offsetArray.keyframe,
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 1333,
-                    timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                    from: offsetArray.keyframe || translateCallback(offsetArray),
-                    to: "none"
-                }])
-                .then(function () { writeAnimationProfilerMark("updateBadge,StopTM"); });
-        },
-
-        turnstileForwardIn: function (incomingElements) {
-            /// <signature helpKeyword="WinJS.UI.Animation.turnstileForwardIn">
-            /// <summary locid="WinJS.UI.Animation.turnstileForwardIn">
-            /// Execute a turnstile forward in animation.
-            /// </summary>
-            /// <param name="incomingElements" locid="WinJS.UI.Animation.turnstileForwardIn_p:incomingElements">
-            /// Single element or collection of elements to animate.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.turnstileForwardIn_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("turnstileForwardIn,StartTM");
-
-            incomingElements = makeArray(incomingElements);
-            var origins = collectTurnstileTransformOrigins(incomingElements);
-            return animRotationTransform(
-                incomingElements,
-                origins,
-                [{
-                    property: transformNames.cssName,
-                    delay: staggerDelay(0, 50, 1, 1000),
-                    duration: 300,
-                    timing: "cubic-bezier(0.01,0.975,0.4775,0.9775)",
-                    from: "perspective(600px) rotateY(80deg)",
-                    to: "perspective(600px) rotateY(0deg)"
-                },
-                {
-                    property: "opacity",
-                    delay: staggerDelay(0, 50, 1, 1000),
-                    duration: 300,
-                    timing: "cubic-bezier(0, 2, 0, 2)",
-                    from: 0,
-                    to: 1,
-                }])
-                .then(function () { writeAnimationProfilerMark("turnstileForwardIn,StopTM"); });
-        },
-
-        turnstileForwardOut: function (outgoingElements) {
-            /// <signature helpKeyword="WinJS.UI.Animation.turnstileForwardOut">
-            /// <summary locid="WinJS.UI.Animation.turnstileForwardOut">
-            /// Execute a turnstile forward out animation.
-            /// </summary>
-            /// <param name="outgoingElements" locid="WinJS.UI.Animation.turnstileForwardOut_p:outgoingElements">
-            /// Single element or collection of elements to animate.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.turnstileForwardOut_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("turnstileForwardOut,StartTM");
-
-            outgoingElements = makeArray(outgoingElements);
-            var origins = collectTurnstileTransformOrigins(outgoingElements);
-            return animRotationTransform(
-                outgoingElements,
-                origins,
-                [{
-                    property: transformNames.cssName,
-                    delay: staggerDelay(0, 50, 1, 1000),
-                    duration: 128,
-                    timing: "cubic-bezier(0.4925,0.01,0.7675,-0.01)",
-                    from: "perspective(600px) rotateY(0deg)",
-                    to: "perspective(600px) rotateY(-50deg)",
-                },
-                {
-                    property: "opacity",
-                    delay: staggerDelay(0, 50, 1, 1000),
-                    duration: 128,
-                    timing: "cubic-bezier(1,-0.42,0.995,-0.425)",
-                    from: 1,
-                    to: 0,
-                }])
-                .then(function () { writeAnimationProfilerMark("turnstileForwardOut,StopTM"); });
-        },
-
-        turnstileBackwardIn: function (incomingElements) {
-            /// <signature helpKeyword="WinJS.UI.Animation.turnstileBackwardIn">
-            /// <summary locid="WinJS.UI.Animation.turnstileBackwardIn">
-            /// Execute a turnstile backwards in animation.
-            /// </summary>
-            /// <param name="incomingElements" locid="WinJS.UI.Animation.turnstileBackwardIn_p:incomingElements">
-            /// Single element or collection of elements to animate.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.turnstileBackwardIn_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("turnstileBackwardIn,StartTM");
-
-            incomingElements = makeArray(incomingElements);
-            var origins = collectTurnstileTransformOrigins(incomingElements);
-            return animRotationTransform(
-                incomingElements,
-                origins,
-                [{
-                    property: transformNames.cssName,
-                    delay: staggerDelay(0, 50, 1, 1000),
-                    duration: 300,
-                    timing: "cubic-bezier(0.01,0.975,0.4775,0.9775)",
-                    from: "perspective(600px) rotateY(-50deg)",
-                    to: "perspective(600px) rotateY(0deg)"
-                },
-                {
-                    property: "opacity",
-                    delay: staggerDelay(0, 50, 1, 1000),
-                    duration: 300,
-                    timing: "cubic-bezier(0, 2, 0, 2)",
-                    from: 0,
-                    to: 1,
-                }])
-                .then(function () { writeAnimationProfilerMark("turnstileBackwardIn,StopTM"); });
-        },
-
-        turnstileBackwardOut: function (outgoingElements) {
-            /// <signature helpKeyword="WinJS.UI.Animation.turnstileBackwardOut">
-            /// <summary locid="WinJS.UI.Animation.turnstileBackwardOut">
-            /// Execute a turnstile backward out animation.
-            /// </summary>
-            /// <param name="outgoingElements" locid="WinJS.UI.Animation.turnstileBackwardOut_p:outgoingElements">
-            /// Single element or collection of elements to animate.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.turnstileBackwardOut_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("turnstileBackwardOut,StartTM");
-
-            outgoingElements = makeArray(outgoingElements);
-            var origins = collectTurnstileTransformOrigins(outgoingElements);
-            return animRotationTransform(
-                outgoingElements,
-                origins,
-                [{
-                    property: transformNames.cssName,
-                    delay: staggerDelay(0, 50, 1, 1000),
-                    duration: 128,
-                    timing: "cubic-bezier(0.4925,0.01,0.7675,-0.01)",
-                    from: "perspective(800px) rotateY(0deg)",
-                    to: "perspective(800px) rotateY(80deg)",
-                },
-                {
-                    property: "opacity",
-                    delay: staggerDelay(0, 50, 1, 1000),
-                    duration: 128,
-                    timing: "cubic-bezier(1,-0.42,0.995,-0.425)",
-                    from: 1,
-                    to: 0,
-                }])
-                .then(function () { writeAnimationProfilerMark("turnstileBackwardOut,StopTM"); });
-        },
-
-        slideDown: function (outgoingElements) {
-            /// <signature helpKeyword="WinJS.UI.Animation.slideDown">
-            /// <summary locid="WinJS.UI.Animation.slideDown">
-            /// Execute a slide down animation.
-            /// </summary>
-            /// <param name="outgoingElements" locid="WinJS.UI.Animation.slideDown_p:outgoingElements">
-            /// Single element or collection of elements to animate sliding down.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.slideDown_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("slideDown,StartTM");
-
-            return animRotationTransform(
-                outgoingElements,
-                { ltr: "", rtl: "" },
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 250,
-                    timing: "cubic-bezier(0.3825,0.0025,0.8775,-0.1075)",
-                    from: "translate(0px, 0px)",
-                    to: "translate(0px, 200px)"
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 250,
-                    timing: "cubic-bezier(1,-0.42,0.995,-0.425)",
-                    from: 1,
-                    to: 0
-                }])
-                .then(function () { writeAnimationProfilerMark("slideDown,StopTM"); });
-        },
-
-        slideUp: function (incomingElements) {
-            /// <signature helpKeyword="WinJS.UI.Animation.slideUp">
-            /// <summary locid="WinJS.UI.Animation.slideUp">
-            /// Execute a slide up animation.
-            /// </summary>
-            /// <param name="incomingElements" locid="WinJS.UI.Animation.slideUp_p:incomingElements">
-            /// Single element or collection of elements to animate sliding up.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.slideUp_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("slideUp,StartTM");
-
-            return animRotationTransform(
-                incomingElements,
-                { ltr: "", rtl: "" },
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 350,
-                    timing: "cubic-bezier(0.17,0.79,0.215,1.0025)",
-                    from: "translate(0px, 200px)",
-                    to: "translate(0px, 0px)"
-                },
-                {
-                    property: "opacity",
-                    delay: staggerDelay(0, 34, 1, 1000),
-                    duration: 350,
-                    timing: "cubic-bezier(0, 2, 0, 2)",
-                    from: 0,
-                    to: 1,
-                }])
-                .then(function () { writeAnimationProfilerMark("slideUp,StopTM"); });
-        },
-
-        slideRightIn: function (page, firstIncomingElements, secondIncomingElements, thirdIncomingElements) {
-            /// <signature helpKeyword="WinJS.UI.Animation.slideRightIn">
-            /// <summary locid="WinJS.UI.Animation.slideRightIn">
-            /// Execute a slide in from left to right animation.
-            /// </summary>
-            /// <param name="page" locid="WinJS.UI.Animation.slideRightIn_p:page">
-            /// The page containing all elements to slide.
-            /// </param>
-            /// <param name="firstIncomingElements" locid="WinJS.UI.Animation.slideRightIn_p:firstIncomingElements">
-            /// First element or collection of elements to animate sliding in.
-            /// </param>
-            /// <param name="secondIncomingElements" locid="WinJS.UI.Animation.slideRightIn_p:secondIncomingElements">
-            /// Second element or collection of elements to animate sliding in, which will be offset slightly farther than the first.
-            /// </param>
-            /// <param name="thirdIncomingElements" locid="WinJS.UI.Animation.slideRightIn_p:thirdIncomingElements">
-            /// Third element or collection of elements to animate sliding in, which will be offset slightly farther than the second.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.slideRightIn_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("slideRightIn,StartTM");
-
-            return animStaggeredSlide("cubic-bezier(0.17,0.79,0.215,1.0025)", -_Global.innerWidth, 0, true, page, firstIncomingElements, secondIncomingElements, thirdIncomingElements)
-                .then(function () { writeAnimationProfilerMark("slideRightIn,StopTM"); });
-        },
-
-        slideRightOut: function (page, firstOutgoingElements, secondOutgoingElements, thirdOutgoingElements) {
-            /// <signature helpKeyword="WinJS.UI.Animation.slideRightOut">
-            /// <summary locid="WinJS.UI.Animation.slideRightOut">
-            /// Execute a slide out from left to right animation.
-            /// </summary>
-            /// <param name="page" locid="WinJS.UI.Animation.slideRightOut_p:page">
-            /// The page containing all elements to slide.
-            /// </param>
-            /// <param name="firstOutgoingElements" locid="WinJS.UI.Animation.slideRightOut_p:firstOutgoingElements">
-            /// First element or collection of elements to animate sliding out.
-            /// </param>
-            /// <param name="secondOutgoingElements" locid="WinJS.UI.Animation.slideRightOut_p:secondOutgoingElements">
-            /// Second element or collection of elements to animate sliding out, which will be offset slightly farther than the first.
-            /// </param>
-            /// <param name="thirdOutgoingElements" locid="WinJS.UI.Animation.slideRightOut_p:thirdOutgoingElements">
-            /// Third element or collection of elements to animate sliding out, which will be offset slightly farther than the second.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.slideRightOut_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("slideRightOut,StartTM");
-
-            return animStaggeredSlide("cubic-bezier(0.3825,0.0025,0.8775,-0.1075)", 0, _Global.innerWidth, false, page, firstOutgoingElements, secondOutgoingElements, thirdOutgoingElements)
-                .then(function () { writeAnimationProfilerMark("slideRightOut,StopTM"); });
-        },
-
-        slideLeftIn: function (page, firstIncomingElements, secondIncomingElements, thirdIncomingElements) {
-            /// <signature helpKeyword="WinJS.UI.Animation.slideLeftIn">
-            /// <summary locid="WinJS.UI.Animation.slideLeftIn">
-            /// Execute a slide in from right to left animation.
-            /// </summary>
-            /// <param name="page" locid="WinJS.UI.Animation.slideLeftIn_p:page">
-            /// The page containing all elements to slide.
-            /// </param>
-            /// <param name="firstIncomingElements" locid="WinJS.UI.Animation.slideLeftIn_p:firstIncomingElements">
-            /// First element or collection of elements to animate sliding in.
-            /// </param>
-            /// <param name="secondIncomingElements" locid="WinJS.UI.Animation.slideLeftIn_p:secondIncomingElements">
-            /// Second element or collection of elements to animate sliding in, which will be offset slightly farther than the first.
-            /// </param>
-            /// <param name="thirdIncomingElements" locid="WinJS.UI.Animation.slideLeftIn_p:thirdIncomingElements">
-            /// Third element or collection of elements to animate sliding in, which will be offset slightly farther than the second.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.slideLeftIn_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("slideLeftIn,StartTM");
-
-            return animStaggeredSlide("cubic-bezier(0.17,0.79,0.215,1.0025)", _Global.innerWidth, 0, true, page, firstIncomingElements, secondIncomingElements, thirdIncomingElements)
-                .then(function () { writeAnimationProfilerMark("slideLeftIn,StopTM"); });
-        },
-
-        slideLeftOut: function (page, firstOutgoingElements, secondOutgoingElements, thirdOutgoingElements) {
-            /// <signature helpKeyword="WinJS.UI.Animation.slideLeftOut">
-            /// <summary locid="WinJS.UI.Animation.slideLeftOut">
-            /// Execute a slide out from right to left animation.
-            /// </summary>
-            /// <param name="page" locid="WinJS.UI.Animation.slideLeftOut_p:page">
-            /// The page containing all elements to slide.
-            /// </param>
-            /// <param name="firstOutgoingElements" locid="WinJS.UI.Animation.slideLeftOut_p:firstOutgoingElements">
-            /// First element or collection of elements to animate sliding out.
-            /// </param>
-            /// <param name="secondOutgoingElements" locid="WinJS.UI.Animation.slideLeftOut_p:secondOutgoingElements">
-            /// Second element or collection of elements to animate sliding out, which will be offset slightly farther than the first.
-            /// </param>
-            /// <param name="thirdOutgoingElements" locid="WinJS.UI.Animation.slideLeftOut_p:thirdOutgoingElements">
-            /// Third element or collection of elements to animate sliding out, which will be offset slightly farther than the second.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.slideLeftOut_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("slideLeftOut,StartTM");
-
-            return animStaggeredSlide("cubic-bezier(0.3825,0.0025,0.8775,-0.1075)", 0, -_Global.innerWidth, false, page, firstOutgoingElements, secondOutgoingElements, thirdOutgoingElements)
-                .then(function () { writeAnimationProfilerMark("slideLeftOut,StopTM"); });
-        },
-
-        continuumForwardIn: function (incomingPage, incomingItemRoot, incomingItemContent) {
-            /// <signature helpKeyword="WinJS.UI.Animation.continuumForwardIn">
-            /// <summary locid="WinJS.UI.Animation.continuumForwardIn">
-            /// Execute a continuum animation, scaling up the incoming page while scaling, rotating, and translating the incoming item.
-            /// </summary>
-            /// <param name="incomingPage" locid="WinJS.UI.Animation.continuumForwardIn_p:incomingPage">
-            /// Single element to be scaled up that is the page root and does not contain the incoming item.
-            /// </param>
-            /// <param name="incomingItemRoot" locid="WinJS.UI.Animation.continuumForwardIn_p:incomingItemRoot">
-            /// Root of the item that will be translated as part of the continuum animation.
-            /// </param>
-            /// <param name="incomingItemContent" locid="WinJS.UI.Animation.continuumForwardIn_p:incomingItemContent">
-            /// Content of the item that will be scaled and rotated as part of the continuum animation.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.continuumForwardIn_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("continuumForwardIn,StartTM");
-
-            return Promise.join([
-                _TransitionAnimation.executeTransition(incomingPage,
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 350,
-                    timing: "cubic-bezier(0.33, 0.18, 0.11, 1)",
-                    from: "scale(0.5, 0.5)",
-                    to: "scale(1.0, 1.0)"
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 350,
-                    timing: "cubic-bezier(0, 2, 0, 2)",
-                    from: 0,
-                    to: 1,
-                }]),
-                _TransitionAnimation.executeTransition(incomingItemRoot,
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 350,
-                    timing: "cubic-bezier(0.24,1.15,0.11,1.1575)",
-                    from: "translate(0px, 225px)",
-                    to: "translate(0px, 0px)"
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 350,
-                    timing: "cubic-bezier(0, 2, 0, 2)",
-                    from: 0,
-                    to: 1,
-                }]),
-                animRotationTransform(incomingItemContent, { ltr: "0px 50%", rtl: "100% 50%" },
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 350,
-                    timing: "cubic-bezier(0,0.62,0.8225,0.9625)",
-                    from: "rotateX(80deg) scale(1.5, 1.5)",
-                    to: "rotateX(0deg) scale(1.0, 1.0)"
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 350,
-                    timing: "cubic-bezier(0, 2, 0, 2)",
-                    from: 0,
-                    to: 1,
-                }])
-            ])
-            .then(function () { writeAnimationProfilerMark("continuumForwardIn,StopTM"); });
-        },
-
-        continuumForwardOut: function (outgoingPage, outgoingItem) {
-            /// <signature helpKeyword="WinJS.UI.Animation.continuumForwardOut">
-            /// <summary locid="WinJS.UI.Animation.continuumForwardOut">
-            /// Execute a continuum animation, scaling down the outgoing page while scaling, rotating, and translating the outgoing item.
-            /// </summary>
-            /// <param name="outgoingPage" locid="WinJS.UI.Animation.continuumForwardOut_p:outgoingPage">
-            /// Single element to be scaled down that is the page root and contains the outgoing item.
-            /// </param>
-            /// <param name="outgoingItem" locid="WinJS.UI.Animation.continuumForwardOut_p:outgoingItem">
-            /// Single element to be scaled, rotated, and translated away from the outgoing page.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.continuumForwardOut_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("continuumForwardOut,StartTM");
-
-            return Promise.join([
-                _TransitionAnimation.executeTransition(outgoingPage,
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 120,
-                    timing: "cubic-bezier(0.3825,0.0025,0.8775,-0.1075)",
-                    from: "scale(1.0, 1.0)",
-                    to: "scale(1.1, 1.1)"
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 120,
-                    timing: "cubic-bezier(1,-0.42,0.995,-0.425)",
-                    from: 1,
-                    to: 0,
-                }]),
-                animRotationTransform(outgoingItem, { ltr: "0px 100%", rtl: "100% 100%" },
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 152,
-                    timing: "cubic-bezier(0.3825,0.0025,0.8775,-0.1075)",
-                    from: "rotateX(0deg) scale(1.0, 1.0) translate(0px, 0px)",
-                    to: "rotateX(80deg) scale(1.5, 1.5) translate(0px, 150px)"
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 152,
-                    timing: "cubic-bezier(1,-0.42,0.995,-0.425)",
-                    from: 1,
-                    to: 0,
-                }])
-            ])
-            .then(function () { writeAnimationProfilerMark("continuumForwardOut,StopTM"); });
-        },
-
-        continuumBackwardIn: function (incomingPage, incomingItem) {
-            /// <signature helpKeyword="WinJS.UI.Animation.continuumBackwardIn">
-            /// <summary locid="WinJS.UI.Animation.continuumBackwardIn">
-            /// Execute a continuum animation, scaling down the incoming page while scaling, rotating, and translating the incoming item.
-            /// </summary>
-            /// <param name="incomingPage" locid="WinJS.UI.Animation.continuumBackwardIn_p:incomingPage">
-            /// Single element to be scaled down that is the page root and contains the incoming item.
-            /// </param>
-            /// <param name="incomingItem" locid="WinJS.UI.Animation.continuumBackwardIn_p:incomingItem">
-            /// Single element to be scaled, rotated, and translated into its final position on the page.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.continuumBackwardIn_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("continuumBackwardIn,StartTM");
-
-            return Promise.join([
-                _TransitionAnimation.executeTransition(incomingPage,
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 200,
-                    timing: "cubic-bezier(0.33, 0.18, 0.11, 1)",
-                    from: "scale(1.25, 1.25)",
-                    to: "scale(1.0, 1.0)"
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 200,
-                    timing: "cubic-bezier(0, 2, 0, 2)",
-                    from: 0,
-                    to: 1,
-                }]),
-                animRotationTransform(incomingItem, { ltr: "0px 50%", rtl: "100% 50%" },
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 250,
-                    timing: "cubic-bezier(0.2975, 0.7325, 0.4725, 0.99)",
-                    from: "rotateX(80deg) translate(0px, -100px)",
-                    to: "rotateX(0deg) translate(0px, 0px)"
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 250,
-                    timing: "cubic-bezier(0, 2, 0, 2)",
-                    from: 0,
-                    to: 1,
-                }])
-            ])
-            .then(function () { writeAnimationProfilerMark("continuumBackwardIn,StopTM"); });
-        },
-
-        continuumBackwardOut: function (outgoingPage) {
-            /// <signature helpKeyword="WinJS.UI.Animation.continuumBackwardOut">
-            /// <summary locid="WinJS.UI.Animation.continuumBackwardOut">
-            /// Execute a continuum animation, scaling down the outgoing page while fading it out.
-            /// </summary>
-            /// <param name="outgoingPage" locid="WinJS.UI.Animation.continuumBackwardOut_p:outgoingPage">
-            /// Single element to be scaled down that is the page root.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.continuumBackwardOut_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("continuumBackwardOut,StartTM");
-
-            return _TransitionAnimation.executeTransition(outgoingPage,
-            [{
-                property: transformNames.cssName,
-                delay: 0,
-                duration: 167,
-                timing: "cubic-bezier(0.3825,0.0025,0.8775,-0.1075)",
-                from: "scale(1.0, 1.0)",
-                to: "scale(0.5, 0.5)"
-            },
-            {
-                property: "opacity",
-                delay: 0,
-                duration: 167,
-                timing: "cubic-bezier(1,-0.42,0.995,-0.425)",
-                from: 1,
-                to: 0,
-            }])
-            .then(function () { writeAnimationProfilerMark("continuumBackwardOut,StopTM"); });
-        },
-
-        drillInIncoming: function (incomingPage) {
-            /// <signature helpKeyword="WinJS.UI.Animation.drillInIncoming">
-            /// <summary locid="WinJS.UI.Animation.drillInIncoming">
-            /// Execute the incoming phase of the drill in animation, scaling up the incoming page while fading it in.
-            /// </summary>
-            /// <param name="incomingPage" locid="WinJS.UI.Animation.drillInIncoming_p:incomingPage">
-            /// Element to be scaled up and faded in.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.drillInIncoming_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("drillInIncoming,StartTM");
-
-            return _TransitionAnimation.executeTransition(
-                incomingPage,
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 500,
-                    timing: "cubic-bezier(0.1,0.9,0.2,1)",
-                    from: "scale(0.84)",
-                    to: "scale(1.0)"
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 500,
-                    timing: "cubic-bezier(0.1,0.9,0.2,1)",
-                    from: 0,
-                    to: 1,
-                }])
-                .then(function () { writeAnimationProfilerMark("drillInIncoming,StopTM"); });
-        },
-
-        drillInOutgoing: function (outgoingPage) {
-            /// <signature helpKeyword="WinJS.UI.Animation.drillInOutgoing">
-            /// <summary locid="WinJS.UI.Animation.drillInOutgoing">
-            /// Execute the outgoing phase of the drill in animation, scaling up the outgoing page while fading it out.
-            /// </summary>
-            /// <param name="outgoingPage" locid="WinJS.UI.Animation.drillInOutgoing_p:outgoingPage">
-            /// Element to be scaled up and faded out.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.drillInOutgoing_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("drillInOutgoing,StartTM");
-
-            return _TransitionAnimation.executeTransition(
-                outgoingPage,
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 233,
-                    timing: "cubic-bezier(0.1,0.9,0.2,1)",
-                    from: "scale(1.0)",
-                    to: "scale(1.29)"
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 233,
-                    timing: "cubic-bezier(0.1,0.9,0.2,1)",
-                    from: 1,
-                    to: 0,
-                }])
-                .then(function () { writeAnimationProfilerMark("drillInOutgoing,StopTM"); });
-        },
-
-        drillOutIncoming: function (incomingPage) {
-            /// <signature helpKeyword="WinJS.UI.Animation.drillOutIncoming">
-            /// <summary locid="WinJS.UI.Animation.drillOutIncoming">
-            /// Execute the incoming phase of the drill out animation, scaling down the incoming page while fading it in.
-            /// </summary>
-            /// <param name="incomingPage" locid="WinJS.UI.Animation.drillOutIncoming_p:incomingPage">
-            /// Element to be scaled up and faded in.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.drillOutIncoming_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("drillOutIncoming,StartTM");
-
-            return _TransitionAnimation.executeTransition(
-                incomingPage,
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 500,
-                    timing: "cubic-bezier(0.1,0.9,0.2,1)",
-                    from: "scale(1.29)",
-                    to: "scale(1.0)"
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 500,
-                    timing: "cubic-bezier(0.1,0.9,0.2,1)",
-                    from: 0,
-                    to: 1,
-                }])
-                .then(function () { writeAnimationProfilerMark("drillOutIncoming,StopTM"); });
-        },
-
-        drillOutOutgoing: function (outgoingPage) {
-            /// <signature helpKeyword="WinJS.UI.Animation.drillOutOutgoing">
-            /// <summary locid="WinJS.UI.Animation.drillOutOutgoing">
-            /// Execute the outgoing phase of the drill out animation, scaling down the outgoing page while fading it out.
-            /// </summary>
-            /// <param name="outgoingPage" locid="WinJS.UI.Animation.drillOutOutgoing_p:outgoingPage">
-            /// Element to be scaled down and faded out.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Animation.drillOutOutgoing_returnValue">
-            /// Promise object that completes when the animation is complete.
-            /// </returns>
-            /// </signature>
-            writeAnimationProfilerMark("drillOutOutgoing,StartTM");
-
-            return _TransitionAnimation.executeTransition(
-                outgoingPage,
-                [{
-                    property: transformNames.cssName,
-                    delay: 0,
-                    duration: 233,
-                    timing: "cubic-bezier(0.1,0.9,0.2,1)",
-                    from: "scale(1.0)",
-                    to: "scale(0.84)"
-                },
-                {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 233,
-                    timing: "cubic-bezier(0.1,0.9,0.2,1)",
-                    from: 1,
-                    to: 0,
-                }])
-                .then(function () { writeAnimationProfilerMark("drillOutOutgoing,StopTM"); });
-        },
-
-        createPageNavigationAnimations: function (currentPreferredAnimation, nextPreferredAnimation, movingBackwards) {
-            /// <signature helpKeyword="WinJS.UI.Animation.createPageNavigationAnimations" >
-            /// <summary locid="WinJS.UI.Animation.createPageNavigationAnimations">
-            /// Creates an exit and entrance animation to play for a page navigation given the current and incoming pages'
-            /// animation preferences and whether the pages are navigating forwards or backwards.
-            /// </summary>
-            /// <param name="currentPreferredAnimation" locid="WinJS.UI.Animation.createPageNavigationAnimations_p:currentPreferredAnimation">
-            /// A value from WinJS.UI.PageNavigationAnimation describing the animation the current page prefers to use.
-            /// </param>
-            /// <param name="nextPreferredAnimation" locid="WinJS.UI.Animation.createPageNavigationAnimations_p:nextPreferredAnimation">
-            /// A value from WinJS.UI.PageNavigationAnimation describing the animation the incoming page prefers to use.
-            /// </param>
-            /// <param name="movingBackwards" locid="WinJS.UI.Animation.createPageNavigationAnimations_p:movingBackwards">
-            /// Boolean value for whether the navigation is moving backwards.
-            /// </param>
-            /// <returns type="{ entrance: Function, exit: Function }" locid="WinJS.UI.Animation.createPageNavigationAnimations_returnValue">
-            /// Returns an object containing the exit and entrance animations to play based on the parameters given.
-            /// </returns>
-            /// </signature>
-            function emptyAnimationFunction() {
-                return Promise.wrap();
-            }
-
-            return {
-                exit: emptyAnimationFunction,
-                entrance: exports.enterPage
-            };
-        },
-
-        // Plays an animation which makes an element look like it is resizing in 1 dimension. Arguments:
-        // - elementClipper: The parent of *element*. It shouldn't have any margin, border, or padding and its
-        //   size should match element's size. Its purpose is to clip *element* during the animation to give
-        //   it the illusion that it is resizing.
-        // - element: The element that should look like it's resizing.
-        // - args: An object with the following properties (each is required unless noted otherwise):
-        //   - from: A number representing the old total width/height of the element.
-        //   - to: A number representing the new total width/height of the element.
-        //   - actualSize: A number representing the actual total width/height of the element (should be at least
-        //     as big as from and to). The element should be at *actualSize* when this function is called.
-        //     from/to/actualSize represent the width/height of *element*'s margin box (e.g. getTotalWidth).
-        //   - dimension: The dimension on which *element* is resizing. Either "width" or "height".
-        //   - anchorTrailingEdge (optional): During the resize animation, one edge will move and the other
-        //     edge will remain where it is. This flag specifies which edge is anchored (i.e. won't move).
-        //   - duration (optional): Number representing the duration of the animation in milliseconds.
-        //   - timing (optional): String representing the CSS timing function that controls the progress of the animation.
-        //
-        _resizeTransition: function Utilities_resizeTransition(elementClipper, element, args) {
-            if (args.to === args.from || !_TransitionAnimation.isAnimationEnabled()) {
-                return Promise.as();
-            } else {
-                var animationsToPlay = resizeTransition(elementClipper, element, args);
-                var animationPromises = [];
-                for (var i = 0, len = animationsToPlay.length; i < len; i++) {
-                    animationPromises.push(transformWithTransition(animationsToPlay[i].element, animationsToPlay[i].transition));
-                }
-                return Promise.join(animationPromises);
-            }
-        },
-
-        _commandingSurfaceOpenAnimation: function Utilities_commandingSurfaceOpenAnimation(args) {
-            if (!_TransitionAnimation.isAnimationEnabled()) {
-                return Promise.as();
-            }
-
-            var actionAreaClipper = args.actionAreaClipper,
-                actionArea = args.actionArea,
-                overflowAreaClipper = args.overflowAreaClipper,
-                overflowArea = args.overflowArea,
-                closedHeight = args.oldHeight,
-                openedHeight = args.newHeight,
-                overflowAreaHeight = args.overflowAreaHeight,
-                menuPositionedAbove = args.menuPositionedAbove;
-            var deltaHeight = openedHeight - closedHeight;
-            var actionAreaAnimations = [];
-            var transitionToUse = getResizeDefaultTransitions().defaultResizeGrowTransition;
-
-            // The commanding surface open animation is a combination of animations. We need to animate the actionArea and overflowArea
-            // elements expanding and appearing. The first animation we prepare is the animation on the actionArea. This animation changes depending
-            // on whether the overflow menu will appear above or below the commanding surface.
-            // When the menu is positioned above, we can do a simple translation to get the animation we want.
-            // When the menu is positioned below, we have to do a resize transition using the actionArea's clipper in order to animate the surface expanding.
-            // In either case, we don't want to play the animation immediately because the overflowArea's animation still needs to be set up,
-            // The animations that need to be played on the actionArea elements will be stored in actionAreaAnimations until after the overflowArea
-            // animations are prepared, so that we can begin every animation at once. We do this to avoid a small 1-2px gap appearing between the overflowArea
-            // and the actionArea that would appear were we to start these animations at separate times
-            if (menuPositionedAbove) {
-                actionArea.style[transformNames.scriptName] = "translateY(" + deltaHeight + "px)";
-                _ElementUtilities._getComputedStyle(actionArea).opacity;
-                var transition = _BaseUtils._merge(transitionToUse, { to: "translateY(0px)" });
-                actionAreaAnimations.push({ element: actionArea, transition: transition });
-            } else {
-                actionAreaAnimations = resizeTransition(actionAreaClipper, actionArea, {
-                    from: closedHeight,
-                    to: openedHeight,
-                    actualSize: openedHeight,
-                    dimension: "height",
-                    anchorTrailingEdge: false
-                });
-            }
-
-            // Now we set up the overflowArea animations. The overflowArea animation has two parts:
-            // The first animation is played on the overflowAreaClipper. This animation is a translation animation that we play that makes it look like the
-            // overflow menu is moving up along with the actionArea as it expands.
-            // The next animation is played on the overflowArea itself, which we animate up/down by the full size of the overflowArea. 
-            // When combined, it makes it look like the overflowArea is sliding in its content while it slides up with the actionArea.
-            // Since the overflowArea and its clipper are in their final positions when this animation function is called, we apply an opposite translation
-            // to move them both to where they would have been just before the surface opened, then animate them going to translateY(0).
-            overflowAreaClipper.style[transformNames.scriptName] = "translateY(" + (menuPositionedAbove ? deltaHeight : -deltaHeight) + "px)";
-            overflowArea.style[transformNames.scriptName] = "translateY(" + (menuPositionedAbove ? overflowAreaHeight : -overflowAreaHeight) + "px)";
-
-            // Resolve styles on the overflowArea and overflowAreaClipper to prepare them for animation
-            _ElementUtilities._getComputedStyle(overflowAreaClipper).opacity;
-            _ElementUtilities._getComputedStyle(overflowArea).opacity;
-
-            var animationPromises = [];
-            for (var i = 0, len = actionAreaAnimations.length; i < len; i++) {
-                animationPromises.push(transformWithTransition(actionAreaAnimations[i].element, actionAreaAnimations[i].transition));
-            }
-            var overflowAreaTransition = _BaseUtils._merge(transitionToUse, { to: "translateY(0px)" });
-            animationPromises.push(transformWithTransition(overflowAreaClipper, overflowAreaTransition));
-            animationPromises.push(transformWithTransition(overflowArea, overflowAreaTransition));
-            return Promise.join(animationPromises);
-        },
-
-        _commandingSurfaceCloseAnimation: function Utilities_commandingSurfaceCloseAnimation(args) {
-            if (!_TransitionAnimation.isAnimationEnabled()) {
-                return Promise.as();
-            }
-
-            var actionAreaClipper = args.actionAreaClipper,
-                actionArea = args.actionArea,
-                overflowAreaClipper = args.overflowAreaClipper,
-                overflowArea = args.overflowArea,
-                openedHeight = args.oldHeight,
-                closedHeight = args.newHeight,
-                overflowAreaHeight = args.overflowAreaHeight,
-                menuPositionedAbove = args.menuPositionedAbove;
-            var deltaHeight = closedHeight - openedHeight;
-            var actionAreaAnimations = [];
-            var transitionToUse = getResizeDefaultTransitions().defaultResizeShrinkTransition;
-            if (menuPositionedAbove) {
-                actionArea.style[transformNames.scriptName] = "translateY(0px)";
-                _ElementUtilities._getComputedStyle(actionArea).opacity;
-                var transition = _BaseUtils._merge(transitionToUse, { to: "translateY(" + -deltaHeight + "px)" });
-                actionAreaAnimations.push({ element: actionArea, transition: transition });
-            } else {
-                actionAreaAnimations = resizeTransition(actionAreaClipper, actionArea, {
-                    from: openedHeight,
-                    to: closedHeight,
-                    actualSize: openedHeight,
-                    dimension: "height",
-                    anchorTrailingEdge: false
-                });
-            }
-            // Set up
-            overflowAreaClipper.style[transformNames.scriptName] = "translateY(0px)";
-            overflowArea.style[transformNames.scriptName] = "translateY(0px)";
-
-            // Resolve styles on the overflowArea and overflowAreaClipper to prepare them for animation
-            _ElementUtilities._getComputedStyle(overflowAreaClipper).opacity;
-            _ElementUtilities._getComputedStyle(overflowArea).opacity;
-
-            // Now that everything's set up, we can kick off all the animations in unision
-            var animationPromises = [];
-            for (var i = 0, len = actionAreaAnimations.length; i < len; i++) {
-                animationPromises.push(transformWithTransition(actionAreaAnimations[i].element, actionAreaAnimations[i].transition));
-            }
-            var overflowAreaClipperTransition = _BaseUtils._merge(transitionToUse, { to: "translateY(" + (menuPositionedAbove ? -deltaHeight : deltaHeight) + "px)" });
-            var overflowAreaTransition = _BaseUtils._merge(transitionToUse, { to: "translateY(" + (menuPositionedAbove ? overflowAreaHeight : -overflowAreaHeight) + "px)" });
-            animationPromises.push(transformWithTransition(overflowAreaClipper, overflowAreaClipperTransition));
-            animationPromises.push(transformWithTransition(overflowArea, overflowAreaTransition));
-            return Promise.join(animationPromises);
-        }
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Binding/_BindingParser',[
-    'exports',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Log',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../ControlProcessor/_OptionsLexer',
-    '../ControlProcessor/_OptionsParser'
-    ], function bindingParserInit(exports, _Base, _BaseUtils, _ErrorFromName, _Log, _Resources, _WriteProfilerMark, _OptionsLexer, _OptionsParser) {
-    "use strict";
-
-
-    var strings = {
-        get invalidBinding() { return "Invalid binding:'{0}'. Expected to be '<destProp>:<sourceProp>;'. {1}"; },
-        get bindingInitializerNotFound() { return "Initializer not found:'{0}'"; },
-    };
-
-/*
-    See comment for data-win-options attribute grammar for context.
-
-    Syntactic grammar for the value of the data-win-bind attribute.
-
-        BindDeclarations:
-            BindDeclaration
-            BindDeclarations ; BindDeclaration
-
-        BindDeclaration:
-            DestinationPropertyName : SourcePropertyName
-            DestinationPropertyName : SourcePropertyName InitializerName
-
-        DestinationPropertyName:
-            IdentifierExpression
-
-        SourcePropertyName:
-            IdentifierExpression
-
-        InitializerName:
-            IdentifierExpression
-
-        Value:
-            NumberLiteral
-            StringLiteral
-
-        AccessExpression:
-            [ Value ]
-            . Identifier
-
-        AccessExpressions:
-            AccessExpression
-            AccessExpressions AccessExpression
-
-        IdentifierExpression:
-            Identifier
-            Identifier AccessExpressions
-
-*/
-    var imports = _Base.Namespace.defineWithParent(null, null, {
-        lexer: _Base.Namespace._lazy(function () {
-            return _OptionsLexer._optionsLexer;
-        }),
-        tokenType: _Base.Namespace._lazy(function () {
-            return _OptionsLexer._optionsLexer.tokenType;
-        }),
-    });
-
-    var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;
-
-    var local = _Base.Namespace.defineWithParent(null, null, {
-
-        BindingInterpreter: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(_OptionsParser.optionsParser._BaseInterpreter, function (tokens, originalSource, context) {
-                this._initialize(tokens, originalSource, context);
-            }, {
-                _error: function (message) {
-                    throw new _ErrorFromName("WinJS.Binding.ParseError", _Resources._formatString(strings.invalidBinding, this._originalSource, message));
-                },
-                _evaluateInitializerName: function () {
-                    if (this._current.type === imports.tokenType.identifier) {
-                        var initializer = this._evaluateIdentifierExpression();
-                        if (_Log.log && !initializer) {
-                            _Log.log(_Resources._formatString(strings.bindingInitializerNotFound, this._originalSource), "winjs binding", "error");
-                        }
-                        return requireSupportedForProcessing(initializer);
-                    }
-                    return;
-                },
-                _evaluateValue: function () {
-                    switch (this._current.type) {
-                        case imports.tokenType.stringLiteral:
-                        case imports.tokenType.numberLiteral:
-                            var value = this._current.value;
-                            this._read();
-                            return value;
-
-                        default:
-                            this._unexpectedToken(imports.tokenType.stringLiteral, imports.tokenType.numberLiteral);
-                            return;
-                    }
-                },
-                _readBindDeclarations: function () {
-                    var bindings = [];
-                    while (true) {
-                        switch (this._current.type) {
-                            case imports.tokenType.identifier:
-                            case imports.tokenType.thisKeyword:
-                                bindings.push(this._readBindDeclaration());
-                                break;
-
-                            case imports.tokenType.semicolon:
-                                this._read();
-                                break;
-
-                            case imports.tokenType.eof:
-                                return bindings;
-
-                            default:
-                                this._unexpectedToken(imports.tokenType.identifier, imports.tokenType.semicolon, imports.tokenType.eof);
-                                return;
-                        }
-                    }
-                },
-                _readBindDeclaration: function () {
-                    var dest = this._readDestinationPropertyName();
-                    this._read(imports.tokenType.colon);
-                    var src = this._readSourcePropertyName();
-                    var initializer = this._evaluateInitializerName();
-                    return {
-                        destination: dest,
-                        source: src,
-                        initializer: initializer,
-                    };
-                },
-                _readDestinationPropertyName: function () {
-                    return this._readIdentifierExpression();
-                },
-                _readSourcePropertyName: function () {
-                    return this._readIdentifierExpression();
-                },
-                run: function () {
-                    return this._readBindDeclarations();
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-        }),
-
-        BindingParser: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(local.BindingInterpreter, function (tokens, originalSource) {
-                this._initialize(tokens, originalSource, {});
-            }, {
-                _readInitializerName: function () {
-                    if (this._current.type === imports.tokenType.identifier) {
-                        return this._readIdentifierExpression();
-                    }
-                    return;
-                },
-                _readBindDeclaration: function () {
-                    var dest = this._readDestinationPropertyName();
-                    this._read(imports.tokenType.colon);
-                    var src = this._readSourcePropertyName();
-                    var initializer = this._readInitializerName();
-                    return {
-                        destination: dest,
-                        source: src,
-                        initializer: initializer,
-                    };
-                },
-            }, {
-                supportedForProcessing: false,
-            });
-        })
-
-    });
-
-    function parser(text, context) {
-        _WriteProfilerMark("WinJS.Binding:bindingParser,StartTM");
-        var tokens = imports.lexer(text);
-        var interpreter = new local.BindingInterpreter(tokens, text, context || {});
-        var res = interpreter.run();
-        _WriteProfilerMark("WinJS.Binding:bindingParser,StopTM");
-        return res;
-    }
-
-    function parser2(text) {
-        _WriteProfilerMark("WinJS.Binding:bindingParser,StartTM");
-        var tokens = imports.lexer(text);
-        var interpreter = new local.BindingParser(tokens, text);
-        var res = interpreter.run();
-        _WriteProfilerMark("WinJS.Binding:bindingParser,StopTM");
-        return res;
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Binding", {
-        _bindingParser: parser,
-        _bindingParser2: parser2,
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Binding/_DomWeakRefTable',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Scheduler'
-    ], function DOMWeakRefTableInit(exports, _Global, _WinRT, _Base, _BaseUtils, Scheduler) {
-    "use strict";
-
-    if (_WinRT.Windows.Foundation.Uri && _WinRT.msSetWeakWinRTProperty && _WinRT.msGetWeakWinRTProperty) {
-
-        var host = new _WinRT.Windows.Foundation.Uri("about://blank");
-
-        _Base.Namespace._moduleDefine(exports, "WinJS.Utilities", {
-
-            _createWeakRef: function (element, id) {
-                _WinRT.msSetWeakWinRTProperty(host, id, element);
-                return id;
-            },
-
-            _getWeakRefElement: function (id) {
-                return _WinRT.msGetWeakWinRTProperty(host, id);
-            }
-
-        });
-
-        return;
-
-    }
-
-    // Defaults
-    var SWEEP_PERIOD = 500;
-    var TIMEOUT = 1000;
-    var table = {};
-    var cleanupToken;
-    var noTimeoutUnderDebugger = true;
-    var fastLoadPath = false;
-
-    function cleanup() {
-        if (SWEEP_PERIOD === 0) {     // If we're using post
-            cleanupToken = 0;          // indicate that cleanup has run
-        }
-        var keys = Object.keys(table);
-        var time = Date.now() - TIMEOUT;
-        var i, len;
-        for (i = 0, len = keys.length; i < len; i++) {
-            var id = keys[i];
-            if (table[id].time < time) {
-                delete table[id];
-            }
-        }
-        unscheduleCleanupIfNeeded();
-    }
-
-    function scheduleCleanupIfNeeded() {
-        if ((_Global.Debug && _Global.Debug.debuggerEnabled && noTimeoutUnderDebugger) || cleanupToken) {
-            return;
-        }
-        if (SWEEP_PERIOD === 0) {
-            Scheduler.schedule(cleanup, Scheduler.Priority.idle, null, "WinJS.Utilities._DOMWeakRefTable.cleanup");
-            cleanupToken = 1;
-        } else {
-            cleanupToken = _Global.setInterval(cleanup, SWEEP_PERIOD);
-        }
-    }
-
-    function unscheduleCleanupIfNeeded() {
-        if (_Global.Debug && _Global.Debug.debuggerEnabled && noTimeoutUnderDebugger) {
-            return;
-        }
-        if (SWEEP_PERIOD === 0) {                           // if we're using post
-            if (!cleanupToken) {                            // and there isn't already one scheduled
-                if (Object.keys(table).length !== 0) {      // and there are items in the table
-                    Scheduler.schedule(     // schedule another call to cleanup
-                        cleanup,
-                        Scheduler.Priority.idle,
-                        null, "WinJS.Utilities._DOMWeakRefTable.cleanup"
-                    );
-                    cleanupToken = 1;                       // and protect against overscheduling
-                }
-            }
-        } else if (cleanupToken) {
-            if (Object.keys(table).length === 0) {
-                _Global.clearInterval(cleanupToken);
-                cleanupToken = 0;
-            }
-        }
-    }
-
-    function createWeakRef(element, id) {
-        table[id] = { element: element, time: Date.now() };
-        scheduleCleanupIfNeeded();
-        return id;
-    }
-
-    function getWeakRefElement(id) {
-        if (fastLoadPath) {
-            var entry = table[id];
-            if (entry) {
-                return entry.element;
-            } else {
-                return _Global.document.getElementById(id);
-            }
-        } else {
-            var element = _Global.document.getElementById(id);
-            if (element) {
-                delete table[id];
-                unscheduleCleanupIfNeeded();
-            } else {
-                var entry = table[id];
-                if (entry) {
-                    entry.time = Date.now();
-                    element = entry.element;
-                }
-            }
-            return element;
-        }
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Utilities",  {
-        _DOMWeakRefTable_noTimeoutUnderDebugger: {
-            get: function () {
-                return noTimeoutUnderDebugger;
-            },
-            set: function (value) {
-                noTimeoutUnderDebugger = value;
-            }
-        },
-        _DOMWeakRefTable_sweepPeriod: {
-            get: function () {
-                return SWEEP_PERIOD;
-            },
-            set: function (value) {
-                SWEEP_PERIOD = value;
-            }
-        },
-        _DOMWeakRefTable_timeout: {
-            get: function () {
-                return TIMEOUT;
-            },
-            set: function (value) {
-                TIMEOUT = value;
-            }
-        },
-        _DOMWeakRefTable_tableSize: { get: function () { return Object.keys(table).length; } },
-        _DOMWeakRefTable_fastLoadPath: {
-            get: function () {
-                return fastLoadPath;
-            },
-            set: function (value) {
-                fastLoadPath = value;
-            }
-        },
-        _createWeakRef: createWeakRef,
-        _getWeakRefElement: getWeakRefElement
-
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Binding/_Data',[
-    'exports',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Log',
-    '../Core/_Resources',
-    '../Promise',
-    '../Scheduler',
-    './_DomWeakRefTable'
-    ], function dataInit(exports, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Log, _Resources, Promise, Scheduler, _DomWeakRefTable) {
-    "use strict";
-
-
-    var strings = {
-        get exceptionFromBindingInitializer() { return "Exception thrown from binding initializer: {0}"; },
-        get propertyIsUndefined() { return "{0} is undefined"; },
-        get unsupportedDataTypeForBinding() { return "Unsupported data type"; },
-    };
-
-    var observableMixin = {
-        _listeners: null,
-        _pendingNotifications: null,
-        _notifyId: 0,
-
-        _getObservable: function () {
-            return this;
-        },
-
-        _cancel: function (name) {
-            var v = this._pendingNotifications;
-            var hit = false;
-            if (v) {
-                var k = Object.keys(v);
-                for (var i = k.length - 1; i >= 0; i--) {
-                    var entry = v[k[i]];
-                    if (entry.target === name) {
-                        if (entry.promise) {
-                            entry.promise.cancel();
-                            entry.promise = null;
-                        }
-                        delete v[k[i]];
-                        hit = true;
-                    }
-                }
-            }
-            return hit;
-        },
-
-        notify: function (name, newValue, oldValue) {
-            /// <signature helpKeyword="WinJS.Binding.observableMixin.notify">
-            /// <summary locid="WinJS.Binding.observableMixin.notify">
-            /// Notifies listeners that a property value was updated.
-            /// </summary>
-            /// <param name="name" type="String" locid="WinJS.Binding.observableMixin.notify_p:name">The name of the property that is being updated.</param>
-            /// <param name="newValue" type="Object" locid="WinJS.Binding.observableMixin.notify_p:newValue">The new value for the property.</param>
-            /// <param name="oldValue" type="Object" locid="WinJS.Binding.observableMixin.notify_p:oldValue">The old value for the property.</param>
-            /// <returns type="WinJS.Promise" locid="WinJS.Binding.observableMixin.notify_returnValue">A promise that is completed when the notifications are complete.</returns>
-            /// </signature>
-            var listeners = this._listeners && this._listeners[name];
-            if (listeners) {
-                var that = this;
-
-                // Handle the case where we are updating a value that is currently updating
-                //
-                that._cancel(name);
-
-                // Starting new work, we cache the work description and queue up to do the notifications
-                //
-                that._pendingNotifications = that._pendingNotifications || {};
-                var x = that._notifyId++;
-                var cap = that._pendingNotifications[x] = { target: name };
-
-                var cleanup = function () {
-                    delete that._pendingNotifications[x];
-                };
-
-                // Binding guarantees async notification, so we do timeout()
-                //
-                cap.promise = Scheduler.schedulePromiseNormal(null, "WinJS.Binding.observableMixin.notify").
-                    then(function () {
-                        // cap.promise is removed after canceled, so we use this as a signal
-                        // to indicate that we should abort early
-                        //
-                        for (var i = 0, l = listeners.length; i < l && cap.promise; i++) {
-                            try {
-                                listeners[i](newValue, oldValue);
-                            }
-                            catch (e) {
-                                _Log.log && _Log.log(_Resources._formatString(strings.exceptionFromBindingInitializer, e.toString()), "winjs binding", "error");
-                            }
-                        }
-                        cleanup();
-                        return newValue;
-                    });
-
-                return cap.promise;
-            }
-
-            return Promise.as();
-        },
-
-        bind: function (name, action) {
-            /// <signature helpKeyword="WinJS.Binding.observableMixin.bind">
-            /// <summary locid="WinJS.Binding.observableMixin.bind">
-            /// Links the specified action to the property specified in the name parameter.
-            /// This function is invoked when the value of the property may have changed.
-            /// It is not guaranteed that the action will be called only when a value has actually changed,
-            /// nor is it guaranteed that the action will be called for every value change. The implementation
-            /// of this function coalesces change notifications, such that multiple updates to a property
-            /// value may result in only a single call to the specified action.
-            /// </summary>
-            /// <param name="name" type="String" locid="WinJS.Binding.observableMixin.bind_p:name">
-            /// The name of the property to which to bind the action.
-            /// </param>
-            /// <param name="action" type="function" locid="WinJS.Binding.observableMixin.bind_p:action">
-            /// The function to invoke asynchronously when the property may have changed.
-            /// </param>
-            /// <returns type="Object" locid="WinJS.Binding.observableMixin.bind_returnValue">
-            /// This object is returned.
-            /// </returns>
-            /// </signature>
-
-            this._listeners = this._listeners || {};
-            var listeners = this._listeners[name] = this._listeners[name] || [];
-
-            // duplicate detection, multiple binds with the same action should have no effect
-            //
-            var found = false;
-            for (var i = 0, l = listeners.length; i < l; i++) {
-                if (listeners[i] === action) {
-                    found = true;
-                    break;
-                }
-            }
-
-            if (!found) {
-                listeners.push(action);
-
-                // out of band notification, we want to avoid a broadcast to all listeners
-                // so we can't just call notify.
-                //
-                action(unwrap(this[name]));
-            }
-            return this;
-        },
-
-        unbind: function (name, action) {
-            /// <signature helpKeyword="WinJS.Binding.observableMixin.unbind">
-            /// <summary locid="WinJS.Binding.observableMixin.unbind">
-            /// Removes one or more listeners from the notification list for a given property.
-            /// </summary>
-            /// <param name="name" type="String" optional="true" locid="WinJS.Binding.observableMixin.unbind_p:name">
-            /// The name of the property to unbind. If this parameter is omitted, all listeners
-            /// for all events are removed.
-            /// </param>
-            /// <param name="action" type="function" optional="true" locid="WinJS.Binding.observableMixin.unbind_p:action">
-            /// The function to remove from the listener list for the specified property. If this parameter is omitted, all listeners
-            /// are removed for the specific property.
-            /// </param>
-            /// <returns type="Object" locid="WinJS.Binding.observableMixin.unbind_returnValue">
-            /// This object is returned.
-            /// </returns>
-            /// </signature>
-
-            this._listeners = this._listeners || {};
-
-            if (name && action) {
-                // this assumes we rarely have more than one
-                // listener, so we optimize to not do a lot of
-                // array manipulation, although it means we
-                // may do some extra GC churn in the other cases...
-                //
-                var listeners = this._listeners[name];
-                if (listeners) {
-                    var nl;
-                    for (var i = 0, l = listeners.length; i < l; i++) {
-                        if (listeners[i] !== action) {
-                            (nl = nl || []).push(listeners[i]);
-                        }
-                    }
-                    this._listeners[name] = nl;
-                }
-
-                // we allow any pending notification sweep to complete,
-                // which means that "unbind" inside of a notification
-                // will not prevent that notification from occuring.
-                //
-            } else if (name) {
-                this._cancel(name);
-                delete this._listeners[name];
-            } else {
-                var that = this;
-                if (that._pendingNotifications) {
-                    var v = that._pendingNotifications;
-                    that._pendingNotifications = {};
-                    Object.keys(v).forEach(function (k) {
-                        var n = v[k];
-                        if (n.promise) { n.promise.cancel(); }
-                    });
-                }
-                this._listeners = {};
-            }
-            return this;
-        }
-    };
-
-    var dynamicObservableMixin = {
-        _backingData: null,
-
-        _initObservable: function (data) {
-            this._backingData = data || {};
-        },
-
-        getProperty: function (name) {
-            /// <signature helpKeyword="WinJS.Binding.dynamicObservableMixin.getProperty">
-            /// <summary locid="WinJS.Binding.dynamicObservableMixin.getProperty">
-            /// Gets a property value by name.
-            /// </summary>
-            /// <param name="name" type="String" locid="WinJS.Binding.dynamicObservableMixin.getProperty_p:name">
-            /// The name of property to get.
-            /// </param>
-            /// <returns type="Object" locid="WinJS.Binding.dynamicObservableMixin.getProperty_returnValue">
-            /// The value of the property as an observable object.
-            /// </returns>
-            /// </signature>
-            var data = this._backingData[name];
-            if (_Log.log && data === undefined) {
-                _Log.log(_Resources._formatString(strings.propertyIsUndefined, name), "winjs binding", "warn");
-            }
-            return as(data);
-        },
-
-        setProperty: function (name, value) {
-            /// <signature helpKeyword="WinJS.Binding.dynamicObservableMixin.setProperty">
-            /// <summary locid="WinJS.Binding.dynamicObservableMixin.setProperty">
-            /// Updates a property value and notifies any listeners.
-            /// </summary>
-            /// <param name="name" type="String" locid="WinJS.Binding.dynamicObservableMixin.setProperty_p:name">
-            /// The name of the property to update.
-            /// </param>
-            /// <param name="value" locid="WinJS.Binding.dynamicObservableMixin.setProperty_p:value">
-            /// The new value of the property.
-            /// </param>
-            /// <returns type="Object" locid="WinJS.Binding.dynamicObservableMixin.setProperty_returnValue">
-            /// This object is returned.
-            /// </returns>
-            /// </signature>
-
-            this.updateProperty(name, value);
-            return this;
-        },
-
-        addProperty: function (name, value) {
-            /// <signature helpKeyword="WinJS.Binding.dynamicObservableMixin.addProperty">
-            /// <summary locid="WinJS.Binding.dynamicObservableMixin.addProperty">
-            /// Adds a property with change notification to this object, including a ECMAScript5 property definition.
-            /// </summary>
-            /// <param name="name" type="String" locid="WinJS.Binding.dynamicObservableMixin.addProperty_p:name">
-            /// The name of the property to add.
-            /// </param>
-            /// <param name="value" locid="WinJS.Binding.dynamicObservableMixin.addProperty_p:value">
-            /// The value of the property.
-            /// </param>
-            /// <returns type="Object" locid="WinJS.Binding.dynamicObservableMixin.addProperty_returnValue">
-            /// This object is returned.
-            /// </returns>
-            /// </signature>
-
-            // we could walk Object.keys to more deterministically determine this,
-            // however in the normal case this avoids a bunch of string compares
-            //
-            if (!this[name]) {
-                Object.defineProperty(this,
-                    name, {
-                        get: function () { return this.getProperty(name); },
-                        set: function (value) { this.setProperty(name, value); },
-                        enumerable: true,
-                        configurable: true
-                    }
-                );
-            }
-            return this.setProperty(name, value);
-        },
-
-        updateProperty: function (name, value) {
-            /// <signature helpKeyword="WinJS.Binding.dynamicObservableMixin.updateProperty">
-            /// <summary locid="WinJS.Binding.dynamicObservableMixin.updateProperty">
-            /// Updates a property value and notifies any listeners.
-            /// </summary>
-            /// <param name="name" type="String" locid="WinJS.Binding.dynamicObservableMixin.updateProperty_p:name">
-            /// The name of the property to update.
-            /// </param>
-            /// <param name="value" locid="WinJS.Binding.dynamicObservableMixin.updateProperty_p:value">
-            /// The new value of the property.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.Binding.dynamicObservableMixin.updateProperty_returnValue">
-            /// A promise that completes when the notifications for
-            /// this property change have been processed. If multiple notifications are coalesced,
-            /// the promise may be canceled or the value of the promise may be updated.
-            /// The fulfilled value of the promise is the new value of the property for
-            /// which the notifications have been completed.
-            /// </returns>
-            /// </signature>
-
-            var oldValue = this._backingData[name];
-            var newValue = unwrap(value);
-            if (oldValue !== newValue) {
-                this._backingData[name] = newValue;
-
-                // This will complete when the listeners are notified, even
-                // if a new value is used. The only time this promise will fail
-                // (cancel) will be if we start notifying and then have to
-                // cancel in the middle of processing it. That's a pretty
-                // subtle contract.
-                //
-                // IE has a bug where readonly properties will not throw,
-                // even in strict mode, when set using a string accessor.
-                // To be consistent across browsers, only notify if the
-                // set succeeded.
-                if (this._backingData[name] === newValue) {
-                    return this.notify(name, newValue, oldValue);
-                }
-            }
-            return Promise.as();
-        },
-
-        removeProperty: function (name) {
-            /// <signature helpKeyword="WinJS.Binding.dynamicObservableMixin.removeProperty">
-            /// <summary locid="WinJS.Binding.dynamicObservableMixin.removeProperty">
-            /// Removes a property value.
-            /// </summary>
-            /// <param name="name" type="String" locid="WinJS.Binding.dynamicObservableMixin.removeProperty_p:name">
-            /// The name of the property to remove.
-            /// </param>
-            /// <returns type="Object" locid="WinJS.Binding.dynamicObservableMixin.removeProperty_returnValue">
-            /// This object is returned.
-            /// </returns>
-            /// </signature>
-
-            var oldValue = this._backingData[name];
-            var value; // capture "undefined"
-            // in strict mode these may throw
-            try {
-                delete this._backingData[name];
-            } catch (e) { }
-            try {
-                delete this[name];
-            } catch (e) { }
-            this.notify(name, value, oldValue);
-            return this;
-        }
-    };
-
-    // Merge "obsevable" into "dynamicObservable"
-    //
-    Object.keys(observableMixin).forEach(function (k) {
-        dynamicObservableMixin[k] = observableMixin[k];
-    });
-
-
-    var bind = function (observable, bindingDescriptor) {
-        /// <signature helpKeyword="WinJS.Binding.bind">
-        /// <summary locid="WinJS.Binding.bind">
-        /// Binds to one or more properties on the observable object or or on child values
-        /// of that object.
-        /// </summary>
-        /// <param name="observable" type="Object" locid="WinJS.Binding.bind_p:observable">
-        /// The object to bind to.
-        /// </param>
-        /// <param name="bindingDescriptor" type="Object" locid="WinJS.Binding.bind_p:bindingDescriptor">
-        /// An object literal containing the binding declarations. Binding declarations take the form:
-        /// { propertyName: (function | bindingDeclaration), ... }
-        ///
-        /// For example, binding to a nested member of an object is declared like this:
-        /// bind(someObject, { address: { street: function(v) { ... } } });
-        /// </param>
-        /// <returns type="Object" locid="WinJS.Binding.bind_returnValue">
-        /// An object that contains at least a "cancel" field, which is
-        /// a function that removes all bindings associated with this bind
-        /// request.
-        /// </returns>
-        /// </signature>
-        return bindImpl(observable, bindingDescriptor);
-    };
-    var bindRefId = 0;
-    var createBindRefId = function () {
-        return "bindHandler" + (bindRefId++);
-    };
-    var createProxy = function (func, bindStateRef) {
-        if (!_WinRT.msGetWeakWinRTProperty) {
-            return func;
-        }
-
-        var id = createBindRefId();
-        _DomWeakRefTable._getWeakRefElement(bindStateRef)[id] = func;
-        return function (n, o) {
-            var bindState = _DomWeakRefTable._getWeakRefElement(bindStateRef);
-            if (bindState) {
-                bindState[id](n, o);
-            }
-        };
-    };
-    var bindImpl = function (observable, bindingDescriptor, bindStateRef) {
-        observable = as(observable);
-        if (!observable) {
-            return { cancel: function () { }, empty: true };
-        }
-
-        var bindState;
-        if (!bindStateRef) {
-            bindStateRef = createBindRefId();
-            bindState = {};
-            _DomWeakRefTable._createWeakRef(bindState, bindStateRef);
-        }
-
-        var complexLast = {};
-        var simpleLast = null;
-
-        function cancelSimple() {
-            if (simpleLast) {
-                simpleLast.forEach(function (e) {
-                    e.source.unbind(e.prop, e.listener);
-                });
-            }
-            simpleLast = null;
-        }
-
-        function cancelComplex(k) {
-            if (complexLast[k]) {
-                complexLast[k].complexBind.cancel();
-                delete complexLast[k];
-            }
-        }
-
-        Object.keys(bindingDescriptor).forEach(function (k) {
-            var listener = bindingDescriptor[k];
-            if (listener instanceof Function) {
-                // Create a proxy for the listener which indirects weakly through the bind
-                // state, if this is the root object tack the bind state onto the listener
-                //
-                listener = createProxy(listener, bindStateRef);
-                listener.bindState = bindState;
-                simpleLast = simpleLast || [];
-                simpleLast.push({ source: observable, prop: k, listener: listener });
-                observable.bind(k, listener);
-            } else {
-                var propChanged = function (v) {
-                    cancelComplex(k);
-                    var complexBind = bindImpl(as(v), listener, bindStateRef);
-
-                    // In the case that we hit an "undefined" in the chain, we prop the change
-                    // notification to all listeners, basically saying that x.y.z where "y"
-                    // is undefined resolves to undefined.
-                    //
-                    if (complexBind.empty) {
-                        var recursiveNotify = function (root) {
-                            Object.keys(root).forEach(function (key) {
-                                var item = root[key];
-                                if (item instanceof Function) {
-                                    item(undefined, undefined);
-                                } else {
-                                    recursiveNotify(item);
-                                }
-                            });
-                        };
-                        recursiveNotify(listener);
-                    }
-                    complexLast[k] = { source: v, complexBind: complexBind };
-                };
-
-                // Create a proxy for the listener which indirects weakly through the bind
-                // state, if this is the root object tack the bind state onto the listener
-                //
-                propChanged = createProxy(propChanged, bindStateRef);
-                propChanged.bindState = bindState;
-                simpleLast = simpleLast || [];
-                simpleLast.push({ source: observable, prop: k, listener: propChanged });
-                observable.bind(k, propChanged);
-            }
-        });
-
-        return {
-            cancel: function () {
-                cancelSimple();
-                Object.keys(complexLast).forEach(function (k) { cancelComplex(k); });
-            }
-        };
-    };
-
-
-    var ObservableProxy = _Base.Class.mix(function (data) {
-        this._initObservable(data);
-        Object.defineProperties(this, expandProperties(data));
-    }, dynamicObservableMixin);
-
-    var expandProperties = function (shape) {
-        /// <signature helpKeyword="WinJS.Binding.expandProperties">
-        /// <summary locid="WinJS.Binding.expandProperties">
-        /// Wraps the specified object so that all its properties
-        /// are instrumented for binding. This is meant to be used in
-        /// conjunction with the binding mixin.
-        /// </summary>
-        /// <param name="shape" type="Object" locid="WinJS.Binding.expandProperties_p:shape">
-        /// The specification for the bindable object.
-        /// </param>
-        /// <returns type="Object" locid="WinJS.Binding.expandProperties_returnValue">
-        /// An object with a set of properties all of which are wired for binding.
-        /// </returns>
-        /// </signature>
-        var props = {};
-        function addToProps(k) {
-            props[k] = {
-                get: function () { return this.getProperty(k); },
-                set: function (value) { this.setProperty(k, value); },
-                enumerable: true,
-                configurable: true // enables delete
-            };
-        }
-        while (shape && shape !== Object.prototype) {
-            Object.keys(shape).forEach(addToProps);
-            shape = Object.getPrototypeOf(shape);
-        }
-        return props;
-    };
-
-    var define = function (data) {
-        /// <signature helpKeyword="WinJS.Binding.define">
-        /// <summary locid="WinJS.Binding.define">
-        /// Creates a new constructor function that supports observability with
-        /// the specified set of properties.
-        /// </summary>
-        /// <param name="data" type="Object" locid="WinJS.Binding.define_p:data">
-        /// The object to use as the pattern for defining the set of properties, for example:
-        /// var MyPointClass = define({x:0,y:0});
-        /// </param>
-        /// <returns type="Function" locid="WinJS.Binding.define_returnValue">
-        /// A constructor function with 1 optional argument that is the initial state of
-        /// the properties.
-        /// </returns>
-        /// </signature>
-
-        // Common unsupported types, we just coerce to be an empty record
-        //
-        if (!data || typeof (data) !== "object" || (data instanceof Date) || Array.isArray(data)) {
-            if (_BaseUtils.validation) {
-                throw new _ErrorFromName("WinJS.Binding.UnsupportedDataType", _Resources._formatString(strings.unsupportedDataTypeForBinding));
-            } else {
-                return;
-            }
-        }
-
-        return _Base.Class.mix(
-            function (init) {
-                /// <signature helpKeyword="WinJS.Binding.define.return">
-                /// <summary locid="WinJS.Binding.define.return">
-                /// Creates a new observable object.
-                /// </summary>
-                /// <param name="init" type="Object" locid="WinJS.Binding.define.return_p:init">
-                /// The initial values for the properties.
-                /// </param>
-                /// </signature>
-
-                this._initObservable(init || Object.create(data));
-            },
-            dynamicObservableMixin,
-            expandProperties(data)
-        );
-    };
-
-    var as = function (data) {
-        /// <signature helpKeyword="WinJS.Binding.as">
-        /// <summary locid="WinJS.Binding.as">
-        /// Returns an observable object. This may be an observable proxy for the specified object, an existing proxy, or
-        /// the specified object itself if it directly supports observability.
-        /// </summary>
-        /// <param name="data" type="Object" locid="WinJS.Binding.as_p:data">
-        /// Object to provide observability for.
-        /// </param>
-        /// <returns type="Object" locid="WinJS.Binding.as_returnValue">
-        /// The observable object.
-        /// </returns>
-        /// </signature>
-
-        if (!data) {
-            return data;
-        }
-
-        var type = typeof data;
-        if (type === "object"
-            && !(data instanceof Date)
-            && !(Array.isArray(data))) {
-                if (data._getObservable) {
-                    return data._getObservable();
-                }
-
-                var observable = new ObservableProxy(data);
-                observable.backingData = data;
-                Object.defineProperty(
-                data,
-                "_getObservable",
-                {
-                    value: function () { return observable; },
-                    enumerable: false,
-                    writable: false
-                }
-            );
-                return observable;
-            } else {
-            return data;
-        }
-    };
-
-    var unwrap = function (data) {
-        /// <signature helpKeyword="WinJS.Binding.unwrap">
-        /// <summary locid="WinJS.Binding.unwrap">
-        /// Returns the original (non-observable) object is returned if the specified object is an observable proxy, .
-        /// </summary>
-        /// <param name="data" type="Object" locid="WinJS.Binding.unwrap_p:data">
-        /// The object for which to retrieve the original value.
-        /// </param>
-        /// <returns type="Object" locid="WinJS.Binding.unwrap_returnValue">
-        /// If the specified object is an observable proxy, the original object is returned, otherwise the same object is returned.
-        /// </returns>
-        /// </signature>
-        if (data && data.backingData) {
-            return data.backingData;
-        } else {
-            return data;
-        }
-    };
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Binding", {
-        // must use long form because mixin has "get" and "set" as members, so the define
-        // method thinks it's a property
-        mixin: { value: dynamicObservableMixin, enumerable: true, writable: true, configurable: true },
-        dynamicObservableMixin: { value: dynamicObservableMixin, enumerable: true, writable: true, configurable: true },
-        observableMixin: { value: observableMixin, enumerable: true, writable: true, configurable: true },
-        expandProperties: expandProperties,
-        define: define,
-        as: as,
-        unwrap: unwrap,
-        bind: bind
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Binding/_Declarative',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Log',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../Promise',
-    '../Utilities/_ElementUtilities',
-    './_BindingParser',
-    './_Data',
-    './_DomWeakRefTable'
-    ], function declarativeInit(exports, _Global, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Log, _Resources, _WriteProfilerMark, Promise, _ElementUtilities, _BindingParser, _Data, _DomWeakRefTable) {
-    "use strict";
-
-    var uid = (Math.random() * 1000) >> 0;
-
-    // If we have proper weak references then we can move away from using the element's ID property
-    //
-    var optimizeBindingReferences = _WinRT.msSetWeakWinRTProperty && _WinRT.msGetWeakWinRTProperty;
-
-    var strings = {
-        get attributeBindingSingleProperty() { return "Attribute binding requires a single destination attribute name, often in the form \"this['aria-label']\" or \"width\"."; },
-        get cannotBindToThis() { return "Can't bind to 'this'."; },
-        get creatingNewProperty() { return "Creating new property {0}. Full path:{1}"; },
-        get duplicateBindingDetected() { return "Binding against element with id {0} failed because a duplicate id was detected."; },
-        get elementNotFound() { return "Element not found:{0}"; },
-        get errorInitializingBindings() { return "Error initializing bindings: {0}"; },
-        get propertyDoesNotExist() { return "{0} doesn't exist. Full path:{1}"; },
-        get idBindingNotSupported() { return "Declarative binding to ID field is not supported. Initializer: {0}"; },
-        get nestedDOMElementBindingNotSupported() { return "Binding through a property {0} of type HTMLElement is not supported, Full path:{1}."; }
-    };
-
-    var markSupportedForProcessing = _BaseUtils.markSupportedForProcessing;
-    var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;
-
-    function registerAutoDispose(bindable, callback) {
-        var d = bindable._autoDispose;
-        d && d.push(callback);
-    }
-    function autoDispose(bindable) {
-        bindable._autoDispose = (bindable._autoDispose || []).filter(function (callback) { return callback(); });
-    }
-
-    function checkBindingToken(element, bindingId) {
-        if (element) {
-            if (element.winBindingToken === bindingId) {
-                return element;
-            } else {
-                _Log.log && _Log.log(_Resources._formatString(strings.duplicateBindingDetected, element.id), "winjs binding", "error");
-            }
-        } else {
-            return element;
-        }
-    }
-
-    function setBindingToken(element) {
-        if (element.winBindingToken) {
-            return element.winBindingToken;
-        }
-
-        var bindingToken = "_win_bind" + (uid++);
-        Object.defineProperty(element, "winBindingToken", { configurable: false, writable: false, enumerable: false, value: bindingToken });
-        return bindingToken;
-    }
-
-    function initializerOneBinding(bind, ref, bindingId, source, e, pend, cacheEntry) {
-        var initializer = bind.initializer;
-        if (initializer) {
-            initializer = initializer.winControl || initializer["data-win-control"] || initializer;
-        }
-        if (initializer instanceof Function) {
-            var result = initializer(source, bind.source, e, bind.destination);
-
-            if (cacheEntry) {
-                if (result && result.cancel) {
-                    cacheEntry.bindings.push(function () { result.cancel(); });
-                } else {
-                    // notify the cache that we encountered an uncancellable thing
-                    //
-                    cacheEntry.nocache = true;
-                }
-            }
-            return result;
-        } else if (initializer && initializer.render) {
-            pend.count++;
-
-            // notify the cache that we encountered an uncancellable thing
-            //
-            if (cacheEntry) {
-                cacheEntry.nocache = true;
-            }
-
-            requireSupportedForProcessing(initializer.render).call(initializer, getValue(source, bind.source), e).
-                then(function () {
-                    pend.checkComplete();
-                });
-        }
-    }
-
-    function makeBinding(ref, bindingId, pend, bindable, bind, cacheEntry) {
-        var first = true;
-        var bindResult;
-        var canceled = false;
-
-        autoDispose(bindable);
-
-        var resolveWeakRef = function () {
-            if (canceled) { return; }
-
-            var found = checkBindingToken(_DomWeakRefTable._getWeakRefElement(ref), bindingId);
-            if (!found) {
-                _Log.log && _Log.log(_Resources._formatString(strings.elementNotFound, ref), "winjs binding", "info");
-                if (bindResult) {
-                    bindResult.cancel();
-                }
-            }
-            return found;
-        };
-        var bindingAction = function (v) {
-            var found = resolveWeakRef();
-            if (found) {
-                nestedSet(found, bind.destination, v);
-            }
-            if (first) {
-                pend.checkComplete();
-                first = false;
-            }
-        };
-        registerAutoDispose(bindable, resolveWeakRef);
-
-        bindResult = bindWorker(bindable, bind.source, bindingAction);
-        if (bindResult) {
-            var cancel = bindResult.cancel;
-            bindResult.cancel = function () {
-                canceled = true;
-                return cancel.call(bindResult);
-            };
-            if (cacheEntry) {
-                cacheEntry.bindings.push(function () { bindResult.cancel(); });
-            }
-        }
-
-        return bindResult;
-    }
-
-    function sourceOneBinding(bind, ref, bindingId, source, e, pend, cacheEntry) {
-        var bindable;
-        if (source !== _Global) {
-            source = _Data.as(source);
-        }
-        if (source._getObservable) {
-            bindable = source._getObservable();
-        }
-        if (bindable) {
-            pend.count++;
-            // declarative binding must use a weak ref to the target element
-            //
-            return makeBinding(ref, bindingId, pend, bindable, bind, cacheEntry);
-        } else {
-            nestedSet(e, bind.destination, getValue(source, bind.source));
-        }
-    }
-
-    function filterIdBinding(declBind, bindingStr) {
-        for (var bindIndex = declBind.length - 1; bindIndex >= 0; bindIndex--) {
-            var bind = declBind[bindIndex];
-            var dest = bind.destination;
-            if (dest.length === 1 && dest[0] === "id") {
-                if (_BaseUtils.validation) {
-                    throw new _ErrorFromName("WinJS.Binding.IdBindingNotSupported", _Resources._formatString(strings.idBindingNotSupported, bindingStr));
-                }
-                _Log.log && _Log.log(_Resources._formatString(strings.idBindingNotSupported, bindingStr), "winjs binding", "error");
-                declBind.splice(bindIndex, 1);
-            }
-        }
-        return declBind;
-    }
-
-    function calcBinding(bindingStr, bindingCache) {
-        if (bindingCache) {
-            var declBindCache = bindingCache.expressions[bindingStr];
-            var declBind;
-            if (!declBindCache) {
-                declBind = filterIdBinding(_BindingParser._bindingParser(bindingStr, _Global), bindingStr);
-                bindingCache.expressions[bindingStr] = declBind;
-            }
-            if (!declBind) {
-                declBind = declBindCache;
-            }
-            return declBind;
-        } else {
-            return filterIdBinding(_BindingParser._bindingParser(bindingStr, _Global), bindingStr);
-        }
-    }
-
-    function declarativeBindImpl(rootElement, dataContext, skipRoot, bindingCache, defaultInitializer, c) {
-        _WriteProfilerMark("WinJS.Binding:processAll,StartTM");
-
-        var pend = {
-            count: 0,
-            checkComplete: function checkComplete() {
-                this.count--;
-                if (this.count === 0) {
-                    _WriteProfilerMark("WinJS.Binding:processAll,StopTM");
-                    c();
-                }
-            }
-        };
-        var baseElement = (rootElement || _Global.document.body);
-        var selector = "[data-win-bind],[data-win-control]";
-        var elements = baseElement.querySelectorAll(selector);
-        var neg;
-        if (!skipRoot && (baseElement.getAttribute("data-win-bind") || baseElement.winControl)) {
-            neg = baseElement;
-        }
-
-        pend.count++;
-        var source = dataContext || _Global;
-
-        _DomWeakRefTable._DOMWeakRefTable_fastLoadPath = true;
-        try {
-            var baseElementData = _ElementUtilities.data(baseElement);
-            baseElementData.winBindings = baseElementData.winBindings || [];
-
-            for (var i = (neg ? -1 : 0), l = elements.length; i < l; i++) {
-                var element = i < 0 ? neg : elements[i];
-
-                // If we run into a declarative control container (e.g. Binding.Template) we don't process its
-                //  children, but we do give it an opportunity to process them later using this data context.
-                //
-                if (element.winControl && element.winControl.constructor && element.winControl.constructor.isDeclarativeControlContainer) {
-                    i += element.querySelectorAll(selector).length;
-
-                    var idcc = element.winControl.constructor.isDeclarativeControlContainer;
-                    if (typeof idcc === "function") {
-                        idcc = requireSupportedForProcessing(idcc);
-                        idcc(element.winControl, function (element) {
-                            return declarativeBind(element, dataContext, false, bindingCache, defaultInitializer);
-                        });
-                    }
-                }
-
-                // In order to catch controls above we may have elements which don't have bindings, skip them
-                //
-                if (!element.hasAttribute("data-win-bind")) {
-                    continue;
-                }
-
-                var original = element.getAttribute("data-win-bind");
-                var declBind = calcBinding(original, bindingCache);
-
-                if (!declBind.implemented) {
-                    for (var bindIndex = 0, bindLen = declBind.length; bindIndex < bindLen; bindIndex++) {
-                        var bind = declBind[bindIndex];
-                        bind.initializer = bind.initializer || defaultInitializer;
-                        if (bind.initializer) {
-                            bind.implementation = initializerOneBinding;
-                        } else {
-                            bind.implementation = sourceOneBinding;
-                        }
-                    }
-                    declBind.implemented = true;
-                }
-
-                pend.count++;
-
-                var bindingId = setBindingToken(element);
-                var ref = optimizeBindingReferences ? bindingId : element.id;
-
-                if (!ref) {
-                    // We use our own counter here, as the IE "uniqueId" is only
-                    // global to a document, which means that binding against
-                    // unparented DOM elements would get duplicate IDs.
-                    //
-                    // The elements may not be parented at this point, but they
-                    // will be parented by the time the binding action is fired.
-                    //
-                    element.id = ref = bindingId;
-                }
-
-                _DomWeakRefTable._createWeakRef(element, ref);
-                var elementData = _ElementUtilities.data(element);
-                elementData.winBindings = null;
-                var cacheEntry;
-                if (bindingCache && bindingCache.elements) {
-                    cacheEntry = bindingCache.elements[ref];
-                    if (!cacheEntry) {
-                        bindingCache.elements[ref] = cacheEntry = { bindings: [] };
-                    }
-                }
-
-                for (var bindIndex2 = 0, bindLen2 = declBind.length; bindIndex2 < bindLen2; bindIndex2++) {
-                    var bind2 = declBind[bindIndex2];
-                    var cancel2 = bind2.implementation(bind2, ref, bindingId, source, element, pend, cacheEntry);
-                    if (cancel2) {
-                        elementData.winBindings = elementData.winBindings || [];
-                        elementData.winBindings.push(cancel2);
-                        baseElementData.winBindings.push(cancel2);
-                    }
-                }
-                pend.count--;
-            }
-        }
-        finally {
-            _DomWeakRefTable._DOMWeakRefTable_fastLoadPath = false;
-        }
-        pend.checkComplete();
-    }
-
-    function declarativeBind(rootElement, dataContext, skipRoot, bindingCache, defaultInitializer) {
-        /// <signature helpKeyword="WinJS.Binding.declarativeBind">
-        /// <summary locid="WinJS.Binding.declarativeBind">
-        /// Binds values from the specified data context to elements that are descendants of the specified root element
-        /// and have declarative binding attributes (data-win-bind).
-        /// </summary>
-        /// <param name="rootElement" type="DOMElement" optional="true" locid="WinJS.Binding.declarativeBind_p:rootElement">
-        /// The element at which to start traversing to find elements to bind to. If this parameter is omitted, the entire document
-        /// is searched.
-        /// </param>
-        /// <param name="dataContext" type="Object" optional="true" locid="WinJS.Binding.declarativeBind_p:dataContext">
-        /// The object to use for default data binding.
-        /// </param>
-        /// <param name="skipRoot" type="Boolean" optional="true" locid="WinJS.Binding.declarativeBind_p:skipRoot">
-        /// If true, the elements to be bound skip the specified root element and include only the children.
-        /// </param>
-        /// <param name="bindingCache" optional="true" locid="WinJS.Binding.declarativeBind_p:bindingCache">
-        /// The cached binding data.
-        /// </param>
-        /// <param name="defaultInitializer" optional="true" locid="WinJS.Binding.declarativeBind_p:defaultInitializer">
-        /// The binding initializer to use in the case that one is not specified in a binding expression. If not
-        /// provided the behavior is the same as WinJS.Binding.defaultBind.
-        /// </param>
-        /// <returns type="WinJS.Promise" locid="WinJS.Binding.declarativeBind_returnValue">
-        /// A promise that completes when each item that contains binding declarations has
-        /// been processed and the update has started.
-        /// </returns>
-        /// </signature>
-
-        return new Promise(function (c, e, p) {
-            declarativeBindImpl(rootElement, dataContext, skipRoot, bindingCache, defaultInitializer, c, e, p);
-        }).then(null, function (e) {
-            _Log.log && _Log.log(_Resources._formatString(strings.errorInitializingBindings, e && e.message), "winjs binding", "error");
-            return Promise.wrapError(e);
-        });
-    }
-
-    function converter(convert) {
-        /// <signature helpKeyword="WinJS.Binding.converter">
-        /// <summary locid="WinJS.Binding.converter">
-        /// Creates a default binding initializer for binding between a source
-        /// property and a destination property with a provided converter function
-        /// that is executed on the value of the source property.
-        /// </summary>
-        /// <param name="convert" type="Function" locid="WinJS.Binding.converter_p:convert">
-        /// The conversion that operates over the result of the source property
-        /// to produce a value that is set to the destination property.
-        /// </param>
-        /// <returns type="Function" locid="WinJS.Binding.converter_returnValue">
-        /// The binding initializer.
-        /// </returns>
-        /// </signature>
-        var userConverter = function (source, sourceProperties, dest, destProperties, initialValue) {
-            var bindingId = setBindingToken(dest);
-            var ref = optimizeBindingReferences ? bindingId : dest.id;
-
-            if (!ref) {
-                dest.id = ref = bindingId;
-            }
-
-            _DomWeakRefTable._createWeakRef(dest, ref);
-
-            var bindable;
-            if (source !== _Global) {
-                source = _Data.as(source);
-            }
-            if (source._getObservable) {
-                bindable = source._getObservable();
-            }
-            if (bindable) {
-                var workerResult = bindWorker(_Data.as(source), sourceProperties, function (v) {
-                    var found = checkBindingToken(_DomWeakRefTable._getWeakRefElement(ref), bindingId);
-                    if (found) {
-                        nestedSet(found, destProperties, convert(requireSupportedForProcessing(v)));
-                    } else if (workerResult) {
-                        _Log.log && _Log.log(_Resources._formatString(strings.elementNotFound, ref), "winjs binding", "info");
-                        workerResult.cancel();
-                    }
-                });
-                return workerResult;
-            } else {
-                var value = getValue(source, sourceProperties);
-                if (value !== initialValue) {
-                    nestedSet(dest, destProperties, convert(value));
-                }
-            }
-        };
-        return markSupportedForProcessing(userConverter);
-    }
-
-    function getValue(obj, path) {
-        if (obj !== _Global) {
-            obj = requireSupportedForProcessing(obj);
-        }
-        if (path) {
-            for (var i = 0, len = path.length; i < len && (obj !== null && obj !== undefined) ; i++) {
-                obj = requireSupportedForProcessing(obj[path[i]]);
-            }
-        }
-        return obj;
-    }
-
-    function nestedSet(dest, destProperties, v) {
-        requireSupportedForProcessing(v);
-        dest = requireSupportedForProcessing(dest);
-        for (var i = 0, len = (destProperties.length - 1) ; i < len; i++) {
-            dest = requireSupportedForProcessing(dest[destProperties[i]]);
-            if (!dest) {
-                _Log.log && _Log.log(_Resources._formatString(strings.propertyDoesNotExist, destProperties[i], destProperties.join(".")), "winjs binding", "error");
-                return;
-            } else if (dest instanceof _Global.Node) {
-                _Log.log && _Log.log(_Resources._formatString(strings.nestedDOMElementBindingNotSupported, destProperties[i], destProperties.join(".")), "winjs binding", "error");
-                return;
-            }
-        }
-        if (destProperties.length === 0) {
-            _Log.log && _Log.log(strings.cannotBindToThis, "winjs binding", "error");
-            return;
-        }
-        var prop = destProperties[destProperties.length - 1];
-        if (_Log.log) {
-            if (dest[prop] === undefined) {
-                _Log.log(_Resources._formatString(strings.creatingNewProperty, prop, destProperties.join(".")), "winjs binding", "warn");
-            }
-        }
-        dest[prop] = v;
-    }
-
-    function attributeSet(dest, destProperties, v) {
-        dest = requireSupportedForProcessing(dest);
-        if (!destProperties || destProperties.length !== 1 || !destProperties[0]) {
-            _Log.log && _Log.log(strings.attributeBindingSingleProperty, "winjs binding", "error");
-            return;
-        }
-        dest.setAttribute(destProperties[0], v);
-    }
-
-    function setAttribute(source, sourceProperties, dest, destProperties, initialValue) {
-        /// <signature helpKeyword="WinJS.Binding.setAttribute">
-        /// <summary locid="WinJS.Binding.setAttribute">
-        /// Creates a one-way binding between the source object and
-        /// an attribute on the destination element.
-        /// </summary>
-        /// <param name="source" type="Object" locid="WinJS.Binding.setAttribute_p:source">
-        /// The source object.
-        /// </param>
-        /// <param name="sourceProperties" type="Array" locid="WinJS.Binding.setAttribute_p:sourceProperties">
-        /// The path on the source object to the source property.
-        /// </param>
-        /// <param name="dest" type="Object" locid="WinJS.Binding.setAttribute_p:dest">
-        /// The destination object (must be a DOM element).
-        /// </param>
-        /// <param name="destProperties" type="Array" locid="WinJS.Binding.setAttribute_p:destProperties">
-        /// The path on the destination object to the destination property, this must be a single name.
-        /// </param>
-        /// <param name="initialValue" optional="true" locid="WinJS.Binding.setAttribute_p:initialValue">
-        /// The known initial value of the target, if the source value is the same as this initial
-        /// value (using ===) then the target is not set the first time.
-        /// </param>
-        /// <returns type="{ cancel: Function }" locid="WinJS.Binding.setAttribute_returnValue">
-        /// An object with a cancel method that is used to coalesce bindings.
-        /// </returns>
-        /// </signature>
-
-        var bindingId = setBindingToken(dest);
-        var ref = optimizeBindingReferences ? bindingId : dest.id;
-
-        if (!ref) {
-            dest.id = ref = bindingId;
-        }
-
-        _DomWeakRefTable._createWeakRef(dest, ref);
-
-        var bindable;
-        if (source !== _Global) {
-            source = _Data.as(source);
-        }
-        if (source._getObservable) {
-            bindable = source._getObservable();
-        }
-        if (bindable) {
-            var counter = 0;
-            var workerResult = bindWorker(bindable, sourceProperties, function (v) {
-                if (++counter === 1) {
-                    if (v === initialValue) {
-                        return;
-                    }
-                }
-                var found = checkBindingToken(_DomWeakRefTable._getWeakRefElement(ref), bindingId);
-                if (found) {
-                    attributeSet(found, destProperties, requireSupportedForProcessing(v));
-                } else if (workerResult) {
-                    _Log.log && _Log.log(_Resources._formatString(strings.elementNotFound, ref), "winjs binding", "info");
-                    workerResult.cancel();
-                }
-            });
-            return workerResult;
-        } else {
-            var value = getValue(source, sourceProperties);
-            if (value !== initialValue) {
-                attributeSet(dest, destProperties, value);
-            }
-        }
-    }
-    function setAttributeOneTime(source, sourceProperties, dest, destProperties) {
-        /// <signature helpKeyword="WinJS.Binding.setAttributeOneTime">
-        /// <summary locid="WinJS.Binding.setAttributeOneTime">
-        /// Sets an attribute on the destination element to the value of the source property
-        /// </summary>
-        /// <param name="source" type="Object" locid="WinJS.Binding.setAttributeOneTime_p:source">
-        /// The source object.
-        /// </param>
-        /// <param name="sourceProperties" type="Array" locid="WinJS.Binding.setAttributeOneTime_p:sourceProperties">
-        /// The path on the source object to the source property.
-        /// </param>
-        /// <param name="dest" type="Object" locid="WinJS.Binding.setAttributeOneTime_p:dest">
-        /// The destination object (must be a DOM element).
-        /// </param>
-        /// <param name="destProperties" type="Array" locid="WinJS.Binding.setAttributeOneTime_p:destProperties">
-        /// The path on the destination object to the destination property, this must be a single name.
-        /// </param>
-        /// </signature>
-        return attributeSet(dest, destProperties, getValue(source, sourceProperties));
-    }
-
-    function addClassOneTime(source, sourceProperties, dest) {
-        /// <signature helpKeyword="WinJS.Binding.addClassOneTime">
-        /// <summary locid="WinJS.Binding.addClassOneTime">
-        /// Adds a class or Array list of classes on the destination element to the value of the source property
-        /// </summary>
-        /// <param name="source" type="Object" locid="WinJS.Binding.addClassOneTime:source">
-        /// The source object.
-        /// </param>
-        /// <param name="sourceProperties" type="Array" locid="WinJS.Binding.addClassOneTime:sourceProperties">
-        /// The path on the source object to the source property.
-        /// </param>
-        /// <param name="dest" type="Object" locid="WinJS.Binding.addClassOneTime:dest">
-        /// The destination object (must be a DOM element).
-        /// </param>
-        /// </signature>
-        dest = requireSupportedForProcessing(dest);
-        var value = getValue(source, sourceProperties);
-        if (Array.isArray(value)) {
-            value.forEach(function (className) {
-                _ElementUtilities.addClass(dest, className);
-            });
-        } else if (value) {
-            _ElementUtilities.addClass(dest, value);
-        }
-    }
-
-    var defaultBindImpl = converter(function defaultBind_passthrough(v) { return v; });
-
-    function defaultBind(source, sourceProperties, dest, destProperties, initialValue) {
-        /// <signature helpKeyword="WinJS.Binding.defaultBind">
-        /// <summary locid="WinJS.Binding.defaultBind">
-        /// Creates a one-way binding between the source object and
-        /// the destination object.
-        /// </summary>
-        /// <param name="source" type="Object" locid="WinJS.Binding.defaultBind_p:source">
-        /// The source object.
-        /// </param>
-        /// <param name="sourceProperties" type="Array" locid="WinJS.Binding.defaultBind_p:sourceProperties">
-        /// The path on the source object to the source property.
-        /// </param>
-        /// <param name="dest" type="Object" locid="WinJS.Binding.defaultBind_p:dest">
-        /// The destination object.
-        /// </param>
-        /// <param name="destProperties" type="Array" locid="WinJS.Binding.defaultBind_p:destProperties">
-        /// The path on the destination object to the destination property.
-        /// </param>
-        /// <param name="initialValue" optional="true" locid="WinJS.Binding.defaultBind_p:initialValue">
-        /// The known initial value of the target, if the source value is the same as this initial
-        /// value (using ===) then the target is not set the first time.
-        /// </param>
-        /// <returns type="{ cancel: Function }" locid="WinJS.Binding.defaultBind_returnValue">
-        /// An object with a cancel method that is used to coalesce bindings.
-        /// </returns>
-        /// </signature>
-
-        return defaultBindImpl(source, sourceProperties, dest, destProperties, initialValue);
-    }
-    function bindWorker(bindable, sourceProperties, func) {
-        if (sourceProperties.length > 1) {
-            var root = {};
-            var current = root;
-            for (var i = 0, l = sourceProperties.length - 1; i < l; i++) {
-                current = current[sourceProperties[i]] = {};
-            }
-            current[sourceProperties[sourceProperties.length - 1]] = func;
-
-            return _Data.bind(bindable, root, true);
-        } else if (sourceProperties.length === 1) {
-            bindable.bind(sourceProperties[0], func, true);
-            return {
-                cancel: function () {
-                    bindable.unbind(sourceProperties[0], func);
-                    this.cancel = noop;
-                }
-            };
-        } else {
-            // can't bind to object, so we just push it through
-            //
-            func(bindable);
-        }
-    }
-    function noop() { }
-    function oneTime(source, sourceProperties, dest, destProperties) {
-        /// <signature helpKeyword="WinJS.Binding.oneTime">
-        /// <summary locid="WinJS.Binding.oneTime">
-        /// Sets the destination property to the value of the source property.
-        /// </summary>
-        /// <param name="source" type="Object" locid="WinJS.Binding.oneTime_p:source">
-        /// The source object.
-        /// </param>
-        /// <param name="sourceProperties" type="Array" locid="WinJS.Binding.oneTime_p:sourceProperties">
-        /// The path on the source object to the source property.
-        /// </param>
-        /// <param name="dest" type="Object" locid="WinJS.Binding.oneTime_p:dest">
-        /// The destination object.
-        /// </param>
-        /// <param name="destProperties" type="Array" locid="WinJS.Binding.oneTime_p:destProperties">
-        /// The path on the destination object to the destination property.
-        /// </param>
-        /// <returns type="{ cancel: Function }" locid="WinJS.Binding.oneTime_returnValue">
-        /// An object with a cancel method that is used to coalesce bindings.
-        /// </returns>
-        /// </signature>
-        nestedSet(dest, destProperties, getValue(source, sourceProperties));
-        return { cancel: noop };
-    }
-
-    function initializer(customInitializer) {
-        /// <signature helpKeyword="WinJS.Binding.initializer">
-        /// <summary locid="WinJS.Binding.initializer">
-        /// Marks a custom initializer function as being compatible with declarative data binding.
-        /// </summary>
-        /// <param name="customInitializer" type="Function" locid="WinJS.Binding.initializer_p:customInitializer">
-        /// The custom initializer to be marked as compatible with declarative data binding.
-        /// </param>
-        /// <returns type="Function" locid="WinJS.Binding.initializer_returnValue">
-        /// The input customInitializer.
-        /// </returns>
-        /// </signature>
-        return markSupportedForProcessing(customInitializer);
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Binding", {
-        processAll: declarativeBind,
-        oneTime: initializer(oneTime),
-        defaultBind: initializer(defaultBind),
-        converter: converter,
-        initializer: initializer,
-        getValue: getValue,
-        setAttribute: initializer(setAttribute),
-        setAttributeOneTime: initializer(setAttributeOneTime),
-        addClassOneTime: initializer(addClassOneTime),
-    });
-
-});
-
-define('WinJS/Binding',[
-    './Binding/_BindingParser',
-    './Binding/_Data',
-    './Binding/_Declarative',
-    './Binding/_DomWeakRefTable'], function () {
-    //Wrapper module
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/BindingTemplate/_DataTemplateCompiler',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Log',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../Binding/_BindingParser',
-    '../Binding/_Declarative',
-    '../ControlProcessor',
-    '../ControlProcessor/_OptionsParser',
-    '../Fragments',
-    '../Promise',
-    '../_Signal',
-    '../Utilities/_Dispose',
-    '../Utilities/_SafeHtml',
-    '../Utilities/_ElementUtilities'
-    ], function templateCompilerInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Log, _Resources, _WriteProfilerMark, _BindingParser, _Declarative, ControlProcessor, _OptionsParser, Fragments, Promise, _Signal, _Dispose, _SafeHtml, _ElementUtilities) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-
-    var strings = {
-        get attributeBindingSingleProperty() { return "Attribute binding requires a single destination attribute name, often in the form \"this['aria-label']\" or \"width\"."; },
-        get cannotBindToThis() { return "Can't bind to 'this'."; },
-        get idBindingNotSupported() { return "Declarative binding to ID field is not supported. Initializer: {0}"; },
-    };
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Binding", {
-        _TemplateCompiler: _Base.Namespace._lazy(function () {
-
-            var cancelBlocker = Promise._cancelBlocker;
-
-            // Eagerly bind to stuff that will be needed by the compiler
-            //
-            var init_defaultBind = _Declarative.defaultBind;
-            var init_oneTime = _Declarative.oneTime;
-            var init_setAttribute = _Declarative.setAttribute;
-            var init_setAttributeOneTime = _Declarative.setAttributeOneTime;
-            var init_addClassOneTime = _Declarative.addClassOneTime;
-            var promise_as = Promise.as;
-            var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;
-            var insertAdjacentHTMLUnsafe = _SafeHtml.insertAdjacentHTMLUnsafe;
-            var utilities_data = _ElementUtilities.data;
-            var markDisposable = _Dispose.markDisposable;
-            var ui_processAll = ControlProcessor.processAll;
-            var binding_processAll = _Declarative.processAll;
-            var options_parser = _OptionsParser._optionsParser;
-            var CallExpression = _OptionsParser._CallExpression;
-            var IdentifierExpression = _OptionsParser._IdentifierExpression;
-            var binding_parser = _BindingParser._bindingParser2;
-            var scopedSelect = ControlProcessor.scopedSelect;
-            var writeProfilerMark = _WriteProfilerMark;
-
-            // Runtime helper functions
-            //
-            function disposeInstance(container, workPromise, renderCompletePromise) {
-                var bindings = _ElementUtilities.data(container).bindTokens;
-                if (bindings) {
-                    bindings.forEach(function (binding) {
-                        if (binding && binding.cancel) {
-                            binding.cancel();
-                        }
-                    });
-                }
-                if (workPromise) {
-                    workPromise.cancel();
-                }
-                if (renderCompletePromise) {
-                    renderCompletePromise.cancel();
-                }
-            }
-            function delayedBindingProcessing(data, defaultInitializer) {
-                return function (element) {
-                    return _Declarative.processAll(element, data, false, null, defaultInitializer);
-                };
-            }
-
-            function targetSecurityCheck(value) {
-                value = requireSupportedForProcessing(value);
-                return value instanceof _Global.Node ? null : value;
-            }
-
-            // Compiler formatting functions
-            //
-            var identifierRegEx = /^[A-Za-z]\w*$/;
-            var identifierCharacterRegEx = /[^A-Za-z\w$]/g;
-            var encodeHtmlRegEx = /[&<>'"]/g;
-            var encodeHtmlEscapeMap = {
-                "&": "&amp;",
-                "<": "&lt;",
-                ">": "&gt;",
-                "'": "&#39;",
-                '"': "&quot;"
-            };
-            var formatRegEx = /({{)|(}})|{(\w+)}|({)|(})/g;
-            var semiColonOnlyLineRegEx = /^\s*;\s*$/;
-            var capitalRegEx = /[A-Z]/g;
-
-            function format(string, parts) {
-                var multiline = string.indexOf("\n") !== -1;
-                var args = arguments;
-                //
-                // This allows you to format a string like: "hello{there}you{0} {{encased in curlies}}" and will
-                //  replace the holes {there} and {0} while turning the {{ and }} into single curlies.
-                //
-                // If the replacement is a number then it is inferred to be off of arguments, otherwise it is
-                //  a member on parts.
-                //
-                // If the replacement is a multiline string and the hole is indented then the entirety of the
-                //  replacement will have the same indentation as the hole.
-                //
-                var result = string.replace(formatRegEx, function (unused, left, right, part, illegalLeft, illegalRight, replacementIndex) {
-                    if (illegalLeft || illegalRight) {
-                        throw new _ErrorFromName(
-                            "Format:MalformedInputString",
-                            "Did you forget to escape a: " + (illegalLeft || illegalRight) + " at: " + replacementIndex);
-                    }
-                    if (left) { return "{"; }
-                    if (right) { return "}"; }
-                    var result;
-                    var index = +part;
-                    if (index === +index) {
-                        result = args[index + 1];
-                    } else {
-                        result = parts[part];
-                    }
-                    if (result === undefined) {
-                        throw new _ErrorFromName(
-                            "Format:MissingPart",
-                            "Missing part '" + part + "'"
-                        );
-                    }
-                    if (multiline) {
-                        var pos = replacementIndex;
-                        while (pos > 0 && string[--pos] === " ") { /* empty */ }
-                        if (pos >= 0 && string[pos] === "\n") {
-                            result = indent(replacementIndex - pos - 1, result);
-                        }
-                    }
-                    return result;
-                });
-                return result;
-            }
-            function indent(numberOfSpaces, multilineStringToBeIndented) {
-                var indent = "";
-                for (var i = 0; i < numberOfSpaces; i++) { indent += " "; }
-                return multilineStringToBeIndented.split("\n").map(function (line, index) { return index ? indent + line : line; }).join("\n");
-            }
-            function trim(s) {
-                return s.trim();
-            }
-            function statements(array) {
-                return array.join(";\n");
-            }
-            function declarationList(array) {
-                return array.join(", ") || "empty";
-            }
-            function identifierAccessExpression(parts) {
-                return parts.map(function (part) {
-                    // If this can be a member access optimize to that instead of a string lookup
-                    //
-                    if (part.match(identifierRegEx)) { return "." + part; }
-                    if (+part === part) { return format("[{0}]", part); }
-                    return format("[{0}]", literal(part));
-                }).join("");
-            }
-            function nullableFilteredIdentifierAccessExpression(initial, parts, temporary, filter) {
-                //
-                //  generates: "(t = initial) && filter(t = t.p0) && filter(t = t.p1) && t"
-                //
-                // There are a number of contexts in which we will be derefernceing developer provided
-                //  identifier access expressions, in those case we don't know whether or not the target
-                //  property exists or in fact if anything exists along the path.
-                //
-                // In order to provide 'correct' behavior we dereference conditionally on whether
-                //  we have a non-null value. This results in returning undefined unless the entire
-                //  path is defined.
-                //
-                // In these cases we also want to filter the result for security purposes.
-                //
-                var parts = parts.map(function (part) {
-                    // If this can be a member access optimize to that instead of a string lookup
-                    //
-                    if (part.match(identifierRegEx)) { return "." + part; }
-                    if (+part === part) { part = +part; }
-                    return brackets(literal(part));
-                }).map(function (part) {
-                    return format("{filter}({temp} = {temp}{part})", {
-                        filter: filter,
-                        temp: temporary,
-                        part: part
-                    });
-                });
-                parts.unshift(parens(assignment(temporary, initial)));
-                parts.push(temporary);
-                return parens(parts.join(" && "));
-            }
-            function literal(instance) {
-                return JSON.stringify(instance);
-            }
-            function newArray(N) {
-                return N ? "new Array(" + (+N) + ")" : "[]";
-            }
-            function assignment(target, source) {
-                return "" + target + " = " + source;
-            }
-            function parens(expression) {
-                return "(" + expression + ")";
-            }
-            function brackets(expression) {
-                return "[" + expression + "]";
-            }
-            function propertyName(name) {
-                if (name.match(identifierRegEx)) { return name; }
-                if (+name === name) { return +name; }
-                return literal(name);
-            }
-            function htmlEscape(str) {
-                str = "" + str;
-                return str.replace(encodeHtmlRegEx, function (m) {
-                    return encodeHtmlEscapeMap[m] || " ";
-                });
-            }
-            function createIdentifier(prefix, count, suffix) {
-                if (suffix) {
-                    return new String("" + prefix + count + "_" + suffix);
-                } else {
-                    return new String("" + prefix + count);
-                }
-            }
-            function multiline(str) {
-                return str.replace(/\\n/g, "\\n\\\n");
-            }
-
-            // Compiler helper functions
-            //
-            function keys(object) {
-                return Object.keys(object);
-            }
-            function values(object) {
-                return Object.keys(object).map(function (key) { return object[key]; });
-            }
-            function merge(a, b) {
-                return mergeAll([a, b]);
-            }
-            function mergeAll(list) {
-                var o = {};
-                for (var i = 0, len = list.length; i < len; i++) {
-                    var part = list[i];
-                    var keys = Object.keys(part);
-                    for (var j = 0, len2 = keys.length; j < len2; j++) {
-                        var key = keys[j];
-                        o[key] = part[key];
-                    }
-                }
-                return o;
-            }
-            function globalLookup(parts) {
-                return parts.reduce(
-                    function (current, name) {
-                        if (current) {
-                            return requireSupportedForProcessing(current[name]);
-                        }
-                        return null;
-                    },
-                    _Global
-                );
-            }
-            function visit(node, key, pre, post) {
-                var children = node.children;
-                if (children) {
-                    var keys = Object.keys(children);
-                    (key && pre) && pre(node, key, keys.length);
-                    for (var i = 0, len = keys.length; i < len; i++) {
-                        var childKey = keys[i];
-                        var child = children[childKey];
-                        visit(child, childKey, pre, post);
-                    }
-                    (key && post) && post(node, key, Object.keys(children).length);
-                } else {
-                    (key && pre) && pre(node, key, 0);
-                    (key && post) && post(node, key, 0);
-                }
-            }
-
-            // Compiler helper types
-            //
-            var TreeCSE = _Base.Class.define(function (compiler, name, kind, accessExpression, filter) {
-
-                var that = this;
-                this.compiler = compiler;
-                this.kind = kind;
-                this.base = new String(name);
-                this.tree = {
-                    children: {},
-                    parent: this.base,
-                    reference: function () { return that.base; }
-                };
-                this.accessExpression = accessExpression;
-                this.filter = filter || "";
-
-            }, {
-
-                createPathExpression: function (path, name) {
-
-                    if (path.length) {
-                        var that = this;
-                        var tail = path.reduce(
-                            function (node, part) {
-                                node.children = node.children || {};
-                                node.children[part] = node.children[part] || { parent: node };
-                                return node.children[part];
-                            },
-                            this.tree
-                        );
-                        tail.name = tail.name || that.compiler.defineInstance(
-                            that.kind,
-                            name || "",
-                            function () {
-                                return that.accessExpression(
-                                    /*l*/tail.parent.name ? tail.parent.name : tail.parent.reference(),
-                                    /*r*/path.slice(-1)[0],
-                                    /*root*/tail.parent.parent === that.base,
-                                    /*filter*/that.filter,
-                                    /*last*/true
-                                );
-                            }
-                        );
-                        return tail.name;
-                    } else {
-                        return this.base;
-                    }
-
-                },
-
-                lower: function () {
-
-                    var that = this;
-                    var aggregatedName = [];
-                    var reference = function (node, name, last) {
-                        return that.accessExpression(
-                            /*l*/node.parent.name ? node.parent.name : node.parent.reference(),
-                            /*r*/name,
-                            /*root*/node.parent.parent === that.base,
-                            /*filter*/that.filter,
-                            /*last*/last
-                        );
-                    };
-
-                    // Ensure that all shared internal nodes have names and that all nodes
-                    //  know who they reference
-                    //
-                    visit(this.tree, "",
-                        function pre(node, key, childCount) {
-                            aggregatedName.push(key);
-
-                            if (childCount > 1) {
-                                node.name = node.name || that.compiler.defineInstance(
-                                    that.kind,
-                                    aggregatedName.join("_"),
-                                    reference.bind(null, node, key, true)
-                                );
-                                node.reference = function () { return node.name; };
-                            } else if (childCount === 1) {
-                                node.reference = reference.bind(null, node, key);
-                            }
-                        },
-                        function post() {
-                            aggregatedName.pop();
-                        }
-                    );
-
-                },
-
-                deadNodeElimination: function () {
-
-                    // Kill all dead nodes from the tree
-                    //
-                    visit(this.tree, "", null, function post(node, key, childCount) {
-                        if (!node.name || node.name.dead) {
-                            if (childCount === 0) {
-                                if (node.parent && node.parent.children) {
-                                    delete node.parent.children[key];
-                                }
-                            }
-                        }
-                    });
-
-                },
-
-                definitions: function () {
-
-                    var nodes = [];
-
-                    // Gather the nodes in a depth first ordering, any node which has a name
-                    //  needs to have a definition generated
-                    //
-                    visit(this.tree, "", function pre(node) {
-                        if (node.name) {
-                            nodes.push(node);
-                        }
-                    });
-
-                    return nodes.map(function (n) { return n.name.definition(); });
-
-                },
-
-            });
-
-            var InstanceKind = {
-                "capture": "capture",
-                "temporary": "temporary",
-                "variable": "variable",
-                "data": "data",
-                "global": "global",
-            };
-            var InstanceKindPrefixes = {
-                "capture": "c",
-                "temporary": "t",
-                "variable": "iv",
-                "data": "d",
-                "global": "g",
-            };
-
-            var StaticKind = {
-                "imported": "import",
-                "variable": "variable",
-            };
-            var StaticKindPrefixes = {
-                "imported": "i",
-                "variable": "sv",
-            };
-
-            var BindingKind = {
-                "tree": "tree",
-                "text": "text",
-                "initializer": "initializer",
-                "template": "template",
-                "error": "error",
-            };
-
-            var TextBindingKind = {
-                "attribute": "attribute",
-                "booleanAttribute": "booleanAttribute",
-                "inlineStyle": "inlineStyle",
-                "textContent": "textContent",
-            };
-
-            // Constants
-            //
-            var IMPORTS_ARG_NAME = "imports";
-
-            var Stage = {
-                initial: 0,
-                analyze: 1,
-                optimze: 2,
-                lower: 3,
-                compile: 4,
-                link: 5,
-                done: 6,
-            };
-
-            // Compiler
-            //
-            var TemplateCompiler = _Base.Class.define(function (templateElement, options) {
-                this._stage = Stage.initial;
-                this._staticVariables = {};
-                this._staticVariablesCount = 0;
-                this._instanceVariables = {};
-                this._instanceVariablesCount = {};
-                this._debugBreak = options.debugBreakOnRender;
-                this._defaultInitializer = requireSupportedForProcessing(options.defaultInitializer || init_defaultBind);
-                this._optimizeTextBindings = !options.disableTextBindingOptimization;
-                this._templateElement = templateElement;
-                this._templateContent = _Global.document.createElement(templateElement.tagName);
-                this._extractChild = options.extractChild || false;
-                this._controls = null;
-                this._bindings = null;
-                this._bindTokens = null;
-                this._textBindingPrefix = null;
-                this._textBindingId = 0;
-                this._suffix = [];
-                this._htmlProcessors = [];
-                this._profilerMarkIdentifier = options.profilerMarkIdentifier;
-                this._captureCSE = new TreeCSE(this, "container", InstanceKind.capture, this.generateElementCaptureAccess.bind(this));
-                this._dataCSE = new TreeCSE(this, "data", InstanceKind.data, this.generateNormalAccess.bind(this), this.importFunctionSafe("dataSecurityCheck", requireSupportedForProcessing));
-                this._globalCSE = new TreeCSE(this, this.importFunctionSafe("global", _Global), InstanceKind.global, this.generateNormalAccess.bind(this), this.importFunctionSafe("globalSecurityCheck", requireSupportedForProcessing));
-
-                // Clone the template content and import it into its own HTML document for further processing
-                Fragments.renderCopy(this._templateElement, this._templateContent);
-
-                // If we are extracting the first child we only bother compiling the one child
-                if (this._extractChild) {
-                    while (this._templateContent.childElementCount > 1) {
-                        this._templateContent.removeChild(this._templateContent.lastElementChild);
-                    }
-                }
-            }, {
-
-                addClassOneTimeTextBinding: function (binding) {
-                    var that = this;
-                    var id = this.createTextBindingHole(binding.elementCapture.element.tagName, "class", ++this._textBindingId);
-                    binding.textBindingId = id;
-                    binding.kind = BindingKind.text;
-                    binding.elementCapture.element.classList.add(id);
-                    binding.elementCapture.refCount--;
-                    binding.definition = function () {
-                        return that.formatCode("{htmlEscape}({value})", {
-                            htmlEscape: that._staticVariables.htmlEscape,
-                            value: binding.value(),
-                        });
-                    };
-                },
-
-                addClassOneTimeTreeBinding: function (binding) {
-
-                    var that = this;
-                    binding.pathExpression = this.bindingExpression(binding);
-                    binding.value = function () {
-                        return binding.pathExpression;
-                    };
-                    binding.kind = BindingKind.tree;
-                    binding.definition = function () {
-                        return that.formatCode("{element}.classList.add({value})", {
-                            element: binding.elementCapture,
-                            value: binding.value(),
-                        });
-                    };
-
-                },
-
-                analyze: function () {
-
-                    if (this._stage > Stage.analyze) {
-                        throw "Illegal: once we have moved past analyze we cannot revist it";
-                    }
-                    this._stage = Stage.analyze;
-
-                    // find activatable and bound elements
-                    this._controls = this.gatherControls();
-                    this._bindings = this.gatherBindings();
-                    this._children = this.gatherChildren();
-
-                    // remove attributes which are no longer needed since we will inline bindings and controls
-                    this.cleanControlAndBindingAttributes();
-
-                    if (this.async) {
-                        this.createAsyncParts();
-                    }
-
-                    this.nullableIdentifierAccessTemporary = this.defineInstance(InstanceKind.temporary);
-
-                    // snapshot html
-                    var html = this._templateContent.innerHTML;
-                    this._html = function () { return multiline(literal(html)); };
-                    this._html.text = html;
-
-                },
-
-                bindingExpression: function (binding) {
-
-                    return this._dataCSE.createPathExpression(binding.source, binding.source.join("_"));
-
-                },
-
-                capture: function (element) {
-
-                    var capture = element._capture;
-                    if (capture) {
-                        capture.refCount++;
-                        return capture;
-                    }
-
-                    // Find the path to the captured element
-                    //
-                    var path = [element];
-                    var e = element.parentNode;
-                    var name = element.tagName;
-                    while (e !== this._templateContent) {
-                        name = e.tagName + "_" + name;
-                        path.unshift(e);
-                        e = e.parentNode;
-                    }
-                    // Identify which child each path member is so we can form an indexed lookup
-                    //
-                    for (var i = 0, len = path.length; i < len; i++) {
-                        var child = path[i];
-                        path[i] = Array.prototype.indexOf.call(e.children, child);
-                        e = child;
-                    }
-                    // Create the capture and put it on the
-                    //
-                    capture = this._captureCSE.createPathExpression(path, name.toLowerCase());
-                    capture.element = element;
-                    capture.element._capture = capture;
-                    capture.refCount = 1;
-                    return capture;
-
-                },
-
-                cleanControlAndBindingAttributes: function () {
-                    var selector = "[data-win-bind],[data-win-control]";
-                    var elements = this._templateContent.querySelectorAll(selector);
-                    for (var i = 0, len = elements.length; i < len; i++) {
-                        var element = elements[i];
-                        if (element.isDeclarativeControlContainer) {
-                            i += element.querySelectorAll("[data-win-bind],[data-win-control]").length;
-                        }
-                        element.removeAttribute("data-win-bind");
-                        element.removeAttribute("data-win-control");
-                        element.removeAttribute("data-win-options");
-                    }
-                },
-
-                compile: function (bodyTemplate, replacements, supportDelayBindings) {
-
-                    if (this._stage > Stage.compile) {
-                        throw "Illegal: once we have moved past compile we cannot revist it";
-                    }
-                    this._stage = Stage.compile;
-
-                    var that = this;
-
-                    this._returnedElement = this._extractChild ? "container.firstElementChild" : "container";
-
-                    var control_processing = this._controls.map(function (control) {
-                        var constructionFormatString;
-                        if (control.async) {
-                            constructionFormatString = "{target}.winControl = {target}.winControl || new {SafeConstructor}({target}, {options}, controlDone)";
-                        } else {
-                            constructionFormatString = "{target}.winControl = {target}.winControl || new {SafeConstructor}({target}, {options})";
-                        }
-                        var construction = that.formatCode(
-                            constructionFormatString,
-                            {
-                                target: control.elementCapture,
-                                SafeConstructor: control.SafeConstructor,
-                                options: that.generateOptionsLiteral(control.optionsParsed, control.elementCapture),
-                            }
-                        );
-                        if (control.isDeclarativeControlContainer && typeof control.isDeclarativeControlContainer.imported === "function") {
-                            var result = [construction];
-                            result.push(that.formatCode(
-                                "{isDeclarativeControlContainer}({target}.winControl, {delayedControlProcessing})",
-                                {
-                                    target: control.elementCapture,
-                                    isDeclarativeControlContainer: control.isDeclarativeControlContainer,
-                                    delayedControlProcessing: that._staticVariables.ui_processAll
-                                }
-                            ));
-                            result.push(that.formatCode(
-                                "{isDeclarativeControlContainer}({target}.winControl, {delayedBindingProcessing}(data, {templateDefaultInitializer}))",
-                                {
-                                    target: control.elementCapture,
-                                    isDeclarativeControlContainer: control.isDeclarativeControlContainer,
-                                    delayedBindingProcessing: that._staticVariables.delayedBindingProcessing,
-                                    templateDefaultInitializer: that._staticVariables.templateDefaultInitializer || literal(null),
-                                }
-                            ));
-                            return result.join(";\n");
-                        } else {
-                            return construction;
-                        }
-                    });
-
-                    var all_binding_processing = this._bindings.map(function (binding) {
-                        switch (binding.kind) {
-                            case BindingKind.template:
-                                return that.formatCode(
-                                    "({nestedTemplates}[{nestedTemplate}] = {template}.render({path}, {dest}))",
-                                    {
-                                        nestedTemplates: that._nestedTemplates,
-                                        nestedTemplate: literal(binding.nestedTemplate),
-                                        template: binding.template,
-                                        path: binding.pathExpression,
-                                        dest: binding.elementCapture,
-                                    }
-                                );
-
-                            case BindingKind.initializer:
-                                var formatString;
-                                if (binding.initialValue) {
-                                    formatString = "({bindTokens}[{bindToken}] = {initializer}(data, {sourceProperties}, {dest}, {destProperties}, {initialValue}))";
-                                } else {
-                                    formatString = "({bindTokens}[{bindToken}] = {initializer}(data, {sourceProperties}, {dest}, {destProperties}))";
-                                }
-                                return that.formatCode(
-                                    formatString,
-                                    {
-                                        bindTokens: that._bindTokens,
-                                        bindToken: literal(binding.bindToken),
-                                        initializer: binding.initializer,
-                                        sourceProperties: literal(binding.source),
-                                        destProperties: literal(binding.destination),
-                                        dest: binding.elementCapture,
-                                        initialValue: binding.initialValue,
-                                    }
-                                );
-
-                            case BindingKind.tree:
-                                return binding.definition();
-
-                            case BindingKind.text:
-                                // do nothing, text bindings are taken care of seperately
-                                break;
-
-                            case BindingKind.error:
-                                // do nothing, errors are reported and ignored
-                                break;
-
-                            default:
-                                throw "NYI";
-                        }
-                    });
-                    var binding_processing, delayed_binding_processing;
-                    if (supportDelayBindings) {
-                        binding_processing = all_binding_processing.filter(function (unused, index) {
-                            return !that._bindings[index].delayable;
-                        });
-                        delayed_binding_processing = all_binding_processing.filter(function (unused, index) {
-                            return that._bindings[index].delayable;
-                        });
-                    } else {
-                        binding_processing = all_binding_processing;
-                        delayed_binding_processing = [];
-                    }
-
-                    var instances = values(this._instanceVariables);
-
-                    var instanceDefinitions = instances
-                        .filter(function (instance) { return instance.kind === InstanceKind.variable; })
-                        .map(function (variable) { return variable.definition(); });
-
-                    var captures = this._captureCSE.definitions();
-                    var globals = this._globalCSE.definitions();
-                    var data = this._dataCSE.definitions();
-
-                    var set_msParentSelectorScope = this._children.map(function (child) {
-                        return that.formatCodeN("{0}.msParentSelectorScope = true", child);
-                    });
-                    var suffix = this._suffix.map(function (statement) {
-                        return statement();
-                    });
-
-                    var renderComplete = "";
-                    if (supportDelayBindings && delayed_binding_processing.length) {
-                        renderComplete = that.formatCode(
-                            renderItemImplRenderCompleteTemplate,
-                            {
-                                delayed_binding_processing: statements(delayed_binding_processing)
-                            }
-                        );
-                    }
-
-                    var result = that.formatCode(
-                        bodyTemplate,
-                        mergeAll([
-                            this._staticVariables,
-                            replacements || {},
-                            {
-                                profilerMarkIdentifierStart: literal("WinJS.Binding.Template:render" + this._profilerMarkIdentifier + ",StartTM"),
-                                profilerMarkIdentifierStop: literal("WinJS.Binding.Template:render" + this._profilerMarkIdentifier + ",StopTM"),
-                                html: this._html(),
-                                tagName: literal(this._templateElement.tagName),
-                                instance_variable_declarations: declarationList(instances),
-                                global_definitions: statements(globals),
-                                data_definitions: statements(data),
-                                instance_variable_definitions: statements(instanceDefinitions),
-                                capture_definitions: statements(captures),
-                                set_msParentSelectorScope: statements(set_msParentSelectorScope),
-                                debug_break: this.generateDebugBreak(),
-                                control_processing: statements(control_processing),
-                                control_counter: this._controlCounter,
-                                binding_processing: statements(binding_processing),
-                                renderComplete: renderComplete,
-                                suffix_statements: statements(suffix),
-                                nestedTemplates: this._nestedTemplates,
-                                returnedElement: this._returnedElement,
-                            },
-                        ])
-                    );
-
-                    return this.prettify(result);
-
-                },
-
-                createAsyncParts: function () {
-
-                    this._nestedTemplates = this._nestedTemplates || this.defineInstance(
-                        InstanceKind.variable,
-                        "nestedTemplates",
-                        function () { return newArray(0); }
-                    );
-
-                    this._controlCounter = this._controlCounter || this.defineInstance(
-                        InstanceKind.variable,
-                        "controlCounter",
-                        function () { return literal(1); }
-                    );
-
-                },
-
-                createTextBindingHole: function (tagName, attribute, id) {
-                    if (!this._textBindingPrefix) {
-                        var c = "";
-                        while (this._html.text.indexOf("textbinding" + c) !== -1) {
-                            c = c || 0;
-                            c++;
-                        }
-                        this._textBindingPrefix = "textbinding" + c;
-                        // NOTE: the form of this regex needs to be coordinated with any special cases which
-                        //  are introduced by the switch below.
-                        this._textBindingRegex = new RegExp("(#?" + this._textBindingPrefix + "_\\d+)");
-                    }
-
-                    // Sometimes text bindings need to be of a particular form to suppress warnings from
-                    //  the host, specifically there is a case with IMG/src attribute where if you assign
-                    //  a naked textbinding_X to it you get a warning in the console of an unresolved image
-                    //  instead we prefix it with a # which is enough to suppress that message.
-                    //
-                    var result = this._textBindingPrefix + "_" + id;
-                    if (tagName === "IMG" && attribute === "src") {
-                        result = "#" + result;
-                    }
-
-                    return result;
-                },
-
-                deadCodeElimination: function () {
-                    var that = this;
-
-                    // Eliminate all captured elements which are no longer in the tree, this can happen if
-                    //  these captured elements are children of a node which had a text binding to 'innerText'
-                    //  or 'textContent' as those kill the subtree.
-                    //
-                    Object.keys(this._instanceVariables).forEach(function (key) {
-                        var iv = that._instanceVariables[key];
-                        if (iv.kind === InstanceKind.capture) {
-                            if (!that._templateContent.contains(iv.element)) {
-                                iv.dead = true;
-                            }
-                            if (iv.refCount === 0) {
-                                iv.dead = true;
-                            }
-                            if (iv.dead) {
-                                // This dead instance variable returns a blank definition which will then get
-                                // cleaned up by prettify.
-                                iv.definition = function () { };
-                                iv.name = null;
-                                delete that._instanceVariables[key];
-                            }
-                        }
-                    });
-
-                    // Eliminate all control activations which target elements which are no longer in the tree
-                    //
-                    this._controls = this._controls.filter(function (c) { return !c.elementCapture.dead; });
-
-                    // Eliminate all bindings which target elements which are no longer in the tree
-                    //
-                    this._bindings = this._bindings.filter(function (b) { return !b.elementCapture.dead; });
-
-                    // Cleanup the capture CSE tree now that we know dead nodes are marked as such.
-                    //
-                    this._captureCSE.deadNodeElimination();
-
-                },
-
-                defineInstance: function (kind, name, definition) {
-
-                    if (this._stage >= Stage.compile) {
-                        throw "Illegal: define instance variable after compilation stage has started";
-                    }
-
-                    var variableCount = this._instanceVariablesCount[kind] || 0;
-                    var suffix = name ? name.replace(identifierCharacterRegEx, "_") : "";
-                    var identifier = createIdentifier(InstanceKindPrefixes[kind], variableCount, suffix);
-                    identifier.definition = function () { return assignment(identifier, definition()); };
-                    identifier.kind = kind;
-                    this._instanceVariables[identifier] = identifier;
-                    this._instanceVariablesCount[kind] = variableCount + 1;
-                    return identifier;
-
-                },
-
-                defineStatic: function (kind, name, definition) {
-
-                    if (this._stage >= Stage.link) {
-                        throw "Illegal: define static variable after link stage has started";
-                    }
-
-                    if (name) {
-                        var known = this._staticVariables[name];
-                        if (known) {
-                            return known;
-                        }
-                    }
-                    var suffix = name ? name.replace(identifierCharacterRegEx, "_") : "";
-                    var identifier = createIdentifier(StaticKindPrefixes[kind], this._staticVariablesCount, suffix);
-                    identifier.definition = function () { return assignment(identifier, definition()); };
-                    identifier.kind = kind;
-                    this._staticVariables[name || identifier] = identifier;
-                    this._staticVariablesCount++;
-                    return identifier;
-
-                },
-
-                done: function () {
-
-                    if (this._stage > Stage.done) {
-                        throw "Illegal: once we have moved past done we cannot revist it";
-                    }
-                    this._stage = Stage.done;
-
-                },
-
-                emitScopedSelect: function (selector, elementCapture) {
-                    return this.formatCode(
-                        "{scopedSelect}({selector}, {element})",
-                        {
-                            scopedSelect: this._staticVariables.scopedSelect,
-                            selector: literal(selector),
-                            element: elementCapture,
-                        }
-                    );
-                },
-
-                emitOptionsNode: function (node, parts, elementCapture) {
-
-                    var that = this;
-                    if (node) {
-                        switch (typeof node) {
-                            case "object":
-                                if (Array.isArray(node)) {
-                                    parts.push("[");
-                                    for (var i = 0, len = node.length; i < len; i++) {
-                                        this.emitOptionsNode(node[i], parts, elementCapture);
-                                        parts.push(",");
-                                    }
-                                    parts.push("]");
-                                } else if (node instanceof CallExpression) {
-                                    parts.push(node.target === "select" ? this.emitScopedSelect(node.arg0Value, elementCapture) : literal(null));
-                                } else if (node instanceof IdentifierExpression && node.parts[0] instanceof CallExpression) {
-                                    var call = node.parts[0];
-                                    parts.push(
-                                        nullableFilteredIdentifierAccessExpression(
-                                            call.target === "select" ? this.emitScopedSelect(call.arg0Value, elementCapture) : literal(null),
-                                            node.parts.slice(1),
-                                            this.nullableIdentifierAccessTemporary,
-                                            this.importFunctionSafe("requireSupportedForProcessing", requireSupportedForProcessing)
-                                        )
-                                    );
-                                } else if (node instanceof IdentifierExpression) {
-                                    parts.push(node.pathExpression);
-                                } else {
-                                    parts.push("{");
-                                    Object.keys(node).forEach(function (key) {
-
-                                        parts.push(propertyName(key));
-                                        parts.push(":");
-                                        that.emitOptionsNode(node[key], parts, elementCapture);
-                                        parts.push(",");
-
-                                    });
-                                    parts.push("}");
-                                }
-                                break;
-
-                            default:
-                                parts.push(literal(node));
-                                break;
-                        }
-                    } else {
-                        parts.push(literal(null));
-                    }
-
-                },
-
-                findGlobalIdentifierExpressions: function (obj, results) {
-
-                    results = results || [];
-                    var that = this;
-                    Object.keys(obj).forEach(function (key) {
-                        var prop = obj[key];
-                        if (typeof prop === "object") {
-                            if (prop instanceof IdentifierExpression) {
-                                if (!(prop.parts[0] instanceof CallExpression)) {
-                                    results.push(prop);
-                                }
-                            } else {
-                                that.findGlobalIdentifierExpressions(prop, results);
-                            }
-                        }
-                    });
-                    return results;
-
-                },
-
-                formatCodeN: function () {
-
-                    if (this._stage < Stage.compile) {
-                        throw "Illegal: format code at before compilation stage has started";
-                    }
-                    return format.apply(null, arguments);
-
-                },
-
-                formatCode: function (string, parts) {
-
-                    if (this._stage < Stage.compile) {
-                        throw "Illegal: format code at before compilation stage has started";
-                    }
-                    return format(string, parts);
-
-                },
-
-                gatherBindings: function () {
-
-                    var bindTokens = -1;
-                    var that = this;
-                    var nestedTemplates = -1;
-                    var bindings = [];
-                    var selector = "[data-win-bind],[data-win-control]";
-                    var elements = this._templateContent.querySelectorAll(selector);
-                    for (var i = 0, len = elements.length; i < len; i++) {
-                        var element = elements[i];
-
-                        // If we run into a declarative control container (e.g. Binding.Template) we don't
-                        //  bind its children, but we will give it an opportunity to process later using the
-                        //  same data context.
-                        if (element.isDeclarativeControlContainer) {
-                            i += element.querySelectorAll(selector).length;
-                        }
-
-                        // Since we had to look for controls as well as bindings in order to skip controls
-                        //  which are declarative control containers we have to check if this element is bound
-                        if (!element.hasAttribute("data-win-bind")) {
-                            continue;
-                        }
-
-                        var bindingText = element.getAttribute("data-win-bind");
-                        var elementBindings = binding_parser(bindingText, _Global);
-                        elementBindings.forEach(function (binding) {
-                            if (binding.initializer) {
-                                // If an initializer is specified it may be a nested template
-                                var initializerName = binding.initializer.join(".");
-                                var initializer = globalLookup(binding.initializer);
-                                if (initializer.render) {
-                                    requireSupportedForProcessing(initializer.render);
-                                    // We have already chceked this to be safe for import
-                                    binding.template = that.importFunctionSafe(initializerName, initializer);
-                                    binding.pathExpression = that.bindingExpression(binding);
-                                    binding.nestedTemplate = ++nestedTemplates;
-                                    binding.kind = BindingKind.template;
-                                } else if (initializer.winControl && initializer.winControl.render) {
-                                    requireSupportedForProcessing(initializer.winControl.render);
-                                    // We have already checked this to be safe to import
-                                    binding.template = that.importFunctionSafe(initializerName, initializer.winControl);
-                                    binding.pathExpression = that.bindingExpression(binding);
-                                    binding.nestedTemplate = ++nestedTemplates;
-                                    binding.kind = BindingKind.template;
-                                } else {
-                                    // Don't get the path expression here, we will do it if needed in optimize
-                                    binding.initializer = that.importFunction(initializerName, initializer);
-                                    binding.bindToken = ++bindTokens;
-                                    binding.kind = BindingKind.initializer;
-                                }
-                            } else {
-                                // Don't get the path expression here, we will do it if needed in optimize
-                                // We have already checked this to be safe to import
-                                binding.initializer = that.importFunctionSafe("templateDefaultInitializer", that._defaultInitializer);
-                                binding.bindToken = ++bindTokens;
-                                binding.kind = BindingKind.initializer;
-                            }
-                            binding.elementCapture = that.capture(element);
-                            binding.bindingText = bindingText;
-                        });
-                        bindings.push.apply(bindings, elementBindings);
-                    }
-
-                    var nestedTemplateCount = nestedTemplates + 1;
-                    if (nestedTemplateCount > 0) {
-                        this.async = true;
-                        this._nestedTemplates = this.defineInstance(
-                            InstanceKind.variable,
-                            "nestedTemplates",
-                            function () { return newArray(nestedTemplateCount); }
-                        );
-                    }
-
-                    var bindTokenCount = bindTokens + 1;
-                    if (bindTokenCount > 0) {
-                        this._bindTokens = this.defineInstance(
-                            InstanceKind.variable,
-                            "bindTokens",
-                            function () { return newArray(bindTokenCount); }
-                        );
-                        this._suffix.push(function () {
-                            // NOTE: returnedElement is a local in the template which is set to either be the container
-                            //       or in the extractChild: true case the first child.
-                            return that.formatCode(
-                                "{utilities_data}(returnedElement).bindTokens = {bindTokens}",
-                                {
-                                    utilities_data: that._staticVariables.utilities_data,
-                                    bindTokens: that._bindTokens,
-                                }
-                            );
-                        });
-                    }
-
-                    return bindings;
-
-                },
-
-                gatherChildren: function () {
-
-                    var that = this;
-                    return Array.prototype.map.call(this._templateContent.children, function (child) { return that.capture(child); });
-
-                },
-
-                gatherControls: function () {
-
-                    var that = this;
-                    var asyncCount = 0;
-                    var controls = [];
-                    var selector = "[data-win-control]";
-                    var elements = this._templateContent.querySelectorAll(selector);
-                    for (var i = 0, len = elements.length; i < len; i++) {
-                        var element = elements[i];
-                        var name = element.getAttribute("data-win-control");
-                        // Control constructors are checked along the entirety of their path to be supported
-                        //  for processing when they are bound
-                        var ControlConstructor = _BaseUtils._getMemberFiltered(name.trim(), _Global, requireSupportedForProcessing);
-                        if (!ControlConstructor) {
-                            continue;
-                        }
-
-                        var optionsText = element.getAttribute("data-win-options") || literal({});
-                        var async = ControlConstructor.length > 2;
-                        if (async) {
-                            asyncCount++;
-                            this.async = true;
-                        }
-
-                        var isDeclarativeControlContainer = ControlConstructor.isDeclarativeControlContainer;
-                        if (isDeclarativeControlContainer) {
-                            if (typeof isDeclarativeControlContainer === "function") {
-                                isDeclarativeControlContainer = this.importFunction(name + "_isDeclarativeControlContainer", isDeclarativeControlContainer);
-                            }
-
-                            element.isDeclarativeControlContainer = isDeclarativeControlContainer;
-                            i += element.querySelectorAll(selector).length;
-                        }
-
-                        var control = {
-                            elementCapture: this.capture(element),
-                            name: name,
-                            // We have already checked this for requireSupportedForProcessing
-                            SafeConstructor: this.importFunctionSafe(name, ControlConstructor),
-                            async: async,
-                            optionsText: literal(optionsText),
-                            optionsParsed: options_parser(optionsText),
-                            isDeclarativeControlContainer: isDeclarativeControlContainer,
-                        };
-                        controls.push(control);
-
-                        var globalReferences = this.findGlobalIdentifierExpressions(control.optionsParsed);
-                        globalReferences.forEach(function (identifierExpression) {
-                            identifierExpression.pathExpression = that.globalExpression(identifierExpression.parts);
-                        });
-                    }
-
-                    if (asyncCount > 0) {
-                        this._controlCounter = this.defineInstance(
-                            InstanceKind.variable,
-                            "controlCounter",
-                            // +1 because we call it once to start in case we have no async controls in the async template
-                            function () { return literal(asyncCount + 1); }
-                        );
-                    }
-
-                    return controls;
-
-                },
-
-                generateElementCaptureAccess: function (l, r, root) {
-
-                    if (root) {
-                        // Clean up the right hand side so we don't end up with "startIndex + 0"
-                        var right = ("" + r === "0" ? "" : " + " + r);
-
-                        return this.formatCodeN("{0}.children[startIndex{1}]", l, right);
-                    }
-                    return this.formatCodeN("{0}.children[{1}]", l, r);
-
-                },
-
-                generateNormalAccess: function (left, right, root, filter, last) {
-
-                    // The 'last' parameter indicates that this path access is the last part of a greater
-                    // access expression and therefore does not need to be further assigned to the temp.
-
-                    if (left.indexOf(this.nullableIdentifierAccessTemporary) >= 0) {
-                        // If the nullableIdentifierAccessTemporary is on the LHS then the
-                        // LHS is already an access expression and does not need to be null-checked again
-                        var formatString;
-                        if (last) {
-                            formatString = "{left} && {filter}({temp}{right})";
-                        } else {
-                            formatString = "{left} && ({temp} = {filter}({temp}{right}))";
-                        }
-                        return this.formatCode(formatString, {
-                            temp: this.nullableIdentifierAccessTemporary,
-                            left: left,
-                            right: identifierAccessExpression([right]),
-                            filter: filter
-                        });
-                    }
-                    var formatString;
-                    if (last) {
-                        formatString = "({temp} = {left}) && {filter}({temp}{right})";
-                    } else {
-                        formatString = "({temp} = {left}) && ({temp} = {filter}({temp}{right}))";
-                    }
-                    return this.formatCode(formatString, {
-                        temp: this.nullableIdentifierAccessTemporary,
-                        left: left,
-                        right: identifierAccessExpression([right]),
-                        filter: filter
-                    });
-
-                },
-
-                generateOptionsLiteral: function (optionsParsed, elementCapture) {
-
-                    var parts = [];
-                    this.emitOptionsNode(optionsParsed, parts, elementCapture);
-                    return parts.join(" ");
-
-                },
-
-                generateDebugBreak: function () {
-
-                    if (this._debugBreak) {
-                        var counter = this.defineStatic(
-                            StaticKind.variable,
-                            "debugCounter",
-                            function () { return literal(0); }
-                        );
-                        return this.formatCodeN("if (++{0} === 1) {{ debugger; }}", counter);
-                    }
-                    return "";
-
-                },
-
-                globalExpression: function (path) {
-
-                    return this._globalCSE.createPathExpression(path, path.join("_"));
-
-                },
-
-                importFunction: function (name, i) {
-
-                    // Used for functions which are gathered from user code (e.g. binding initializers and
-                    //  control constructors). For these functions we need to assert that they are safe for
-                    //  use in a declarative context, however since the values are known at compile time we
-                    //  can do that check once.
-                    //
-                    return this.importFunctionSafe(name, requireSupportedForProcessing(i));
-
-                },
-
-                importFunctionSafe: function (name, i) {
-
-                    // Used for functions and objects which are intrinsic to the template compiler and are safe
-                    //  for their intended usages and don't need to be marked requireSupportedForProcessing.
-                    //
-                    var that = this;
-                    var identifier = this.defineStatic(
-                        StaticKind.imported,
-                        name,
-                        function () { return that.formatCodeN("({0}{1})", IMPORTS_ARG_NAME, identifierAccessExpression([name])); }
-                    );
-                    if (identifier.imported && identifier.imported !== i) {
-                        throw "Duplicate import: '" + name + "'";
-                    }
-                    identifier.imported = i;
-                    return identifier;
-
-                },
-
-                importAll: function (imports) {
-                    Object.keys(imports).forEach(function (key) {
-                        requireSupportedForProcessing(imports[key]);
-                    });
-                    return this.importAllSafe(imports);
-                },
-
-                importAllSafe: function (imports) {
-
-                    var that = this;
-                    var result = Object.keys(imports).reduce(
-                        function (o, key) {
-                            o[key] = that.importFunctionSafe(key, imports[key]);
-                            return o;
-                        },
-                        {}
-                    );
-                    return result;
-
-                },
-
-                link: function (body) {
-
-                    if (this._stage > Stage.link) {
-                        throw "Illegal: once we have moved past link we cannot revist it";
-                    }
-                    this._stage = Stage.link;
-
-                    var that = this;
-
-                    // Gather the set of imported instances (functions mostly). All of these are runtime values which
-                    //  are already safety checked for things like requireSupportedForProcessing.
-                    //
-                    var imports = keys(this._staticVariables)
-                        .filter(function (key) { return that._staticVariables[key].kind === StaticKind.imported; })
-                        .reduce(
-                            function (o, key) {
-                                o[key] = that._staticVariables[key].imported;
-                                return o;
-                            },
-                            {}
-                        );
-
-                    var statics = values(this._staticVariables);
-
-                    return new Function(IMPORTS_ARG_NAME, // jshint ignore:line
-                        this.formatCode(
-                            linkerCodeTemplate,
-                            {
-                                static_variable_declarations: declarationList(statics),
-                                static_variable_definitions: statements(statics.map(function (s) { return s.definition(); })),
-                                body: body.trim(),
-                            }
-                        )
-                    )(imports);
-
-                },
-
-                lower: function () {
-
-                    if (this._stage > Stage.lower) {
-                        throw "Illegal: once we have moved past lower we cannot revist it";
-                    }
-                    this._stage = Stage.lower;
-
-                    this._captureCSE.lower();
-                    this._dataCSE.lower();
-                    this._globalCSE.lower();
-
-                },
-
-                markBindingAsError: function (binding) {
-                    if (binding) {
-                        binding.kind = BindingKind.error;
-                        this.markBindingAsError(binding.original);
-                    }
-                },
-
-                oneTimeTextBinding: function (binding) {
-
-                    var that = this;
-                    var result = this.oneTimeTextBindingAnalyze(binding);
-                    if (result) {
-                        var initialValue;
-                        if (binding.original) {
-                            initialValue = binding.original.initialValue;
-                        }
-                        var id = this.createTextBindingHole(binding.elementCapture.element.tagName, result.attribute, ++this._textBindingId);
-                        binding.textBindingId = id;
-                        binding.kind = BindingKind.text;
-                        binding.elementCapture.refCount--;
-                        binding.definition = function () {
-                            var formatString;
-                            if (initialValue) {
-                                formatString = "{htmlEscape}({initialValue})";
-                            } else {
-                                formatString = "{htmlEscape}({getter})";
-                            }
-                            return that.formatCode(
-                                formatString,
-                                {
-                                    htmlEscape: that._staticVariables.htmlEscape,
-                                    getter: binding.value(),
-                                    initialValue: initialValue,
-                                }
-                            );
-                        };
-
-                        switch (result.kind) {
-                            case TextBindingKind.attribute:
-                                binding.elementCapture.element.setAttribute(result.attribute, id);
-                                break;
-
-                            case TextBindingKind.booleanAttribute:
-                                // Boolean attributes work differently, the presence of the attribute in any
-                                //  form means true and its absence means false. This means that we need to
-                                //  add or remove the whole thing and make the definition of the binding
-                                //  expression at runtime add it back.
-                                //
-                                binding.elementCapture.element.setAttribute(result.attribute, id);
-
-                                // Wrap the definition in a ternary expression which yields either the attribute
-                                //  name or an empty string.
-                                //
-                                binding.definition = function () {
-                                    var formatString;
-                                    if (initialValue) {
-                                        formatString = "({initialValue} ? {attribute} : \"\")";
-                                    } else {
-                                        formatString = "({value} ? {attribute} : \"\")";
-                                    }
-                                    return that.formatCode(
-                                        formatString,
-                                        {
-                                            value: binding.value(),
-                                            attribute: literal(result.attribute),
-                                            initialValue: initialValue
-                                        }
-                                    );
-                                };
-
-                                // Arrange for the attribute in the HTML with the 'id' as a value to be wholy
-                                //  replaced by the ID.
-                                //
-                                this._htmlProcessors.push(function (html) {
-                                    return html.replace(new RegExp(result.attribute + "=\"" + id + "\"", "i"), id);
-                                });
-                                break;
-
-                            case TextBindingKind.textContent:
-                                binding.elementCapture.element.textContent = id;
-                                break;
-
-                            case TextBindingKind.inlineStyle:
-                                var element = binding.elementCapture.element;
-                                // Inline styles require a little finesseing, their form always needs to be
-                                //  legal CSS include in the value space. We could attempt to special case
-                                //  all CSS properties and produce something which is legal in their value
-                                //  space but instead we wholesale replace the inline CSS with a extension
-                                //  property temporarially in order to get valid HTML. Later we go replace
-                                //  that well-known hole with the original inline CSS text as well as any
-                                //  new properties we are setting as a result of data binding.
-                                //
-                                if (!element.msReplaceStyle) {
-                                    element.msReplaceStyle = element.getAttribute("style") || "";
-                                    // Ensure that there is always a trailing ';'
-                                    if (element.msReplaceStyle !== "" && element.msReplaceStyle[element.msReplaceStyle.length - 1] !== ";") {
-                                        element.msReplaceStyle = element.msReplaceStyle + ";";
-                                    }
-                                    element.setAttribute("style", "msReplaceStyle:'" + id + "'");
-                                    var temp = element.getAttribute("style");
-                                    this._htmlProcessors.push(function (html) {
-                                        return html.replace(temp, element.msReplaceStyle);
-                                    });
-                                }
-                                element.msReplaceStyle = element.msReplaceStyle + result.property + ":" + id + ";";
-                                break;
-
-                            default:
-                                throw "NYI";
-                        }
-                    }
-
-                },
-
-                oneTimeTextBindingAnalyze: function (binding) {
-                    var element = binding.elementCapture.element;
-                    var elementType = element.tagName;
-                    var targetProperty = binding.destination[0];
-
-                    // Properties which can only be optimized for a given element types
-                    //
-                    switch (elementType) {
-                        case "A":
-                            switch (targetProperty) {
-                                case "href":
-                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };
-                            }
-                            break;
-
-                        case "IMG":
-                            switch (targetProperty) {
-                                case "alt":
-                                case "src":
-                                case "width":
-                                case "height":
-                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };
-                            }
-                            break;
-
-                        case "SELECT":
-                            switch (targetProperty) {
-                                case "disabled":
-                                case "multiple":
-                                case "required":
-                                    return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
-
-                                case "size":
-                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };
-                            }
-                            break;
-
-                        case "OPTION":
-                            switch (targetProperty) {
-                                case "label":
-                                case "value":
-                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };
-
-                                case "disabled":
-                                case "selected":
-                                    return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
-                            }
-                            break;
-
-                        case "INPUT":
-                            switch (targetProperty) {
-                                case "checked":
-                                    switch (element.type) {
-                                        case "checkbox":
-                                        case "radio":
-                                            return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
-                                    }
-                                    break;
-
-                                case "disabled":
-                                    return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
-
-                                case "max":
-                                case "maxLength":
-                                case "min":
-                                case "step":
-                                case "value":
-                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };
-
-                                case "size":
-                                    switch (element.type) {
-                                        case "text":
-                                        case "search":
-                                        case "tel":
-                                        case "url":
-                                        case "email":
-                                        case "password":
-                                            return { kind: TextBindingKind.attribute, attribute: targetProperty };
-                                    }
-                                    break;
-
-                                case "readOnly":
-                                    switch (element.type) {
-                                        case "hidden":
-                                        case "range":
-                                        case "color":
-                                        case "checkbox":
-                                        case "radio":
-                                        case "file":
-                                        case "button":
-                                            // not supported:
-                                            break;
-
-                                        default:
-                                            return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
-                                    }
-                                    break;
-                            }
-                            break;
-
-                        case "BUTTON":
-                            switch (targetProperty) {
-                                case "disabled":
-                                    return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
-
-                                case "value":
-                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };
-                            }
-                            break;
-
-                        case "TEXTAREA":
-                            switch (targetProperty) {
-                                case "disabled":
-                                case "readOnly":
-                                case "required":
-                                    return { kind: TextBindingKind.booleanAttribute, attribute: targetProperty };
-
-                                case "cols":
-                                case "maxLength":
-                                case "placeholder":
-                                case "rows":
-                                case "wrap":
-                                    return { kind: TextBindingKind.attribute, attribute: targetProperty };
-                            }
-                            break;
-                    }
-
-                    // Properties which can be optimized for all element types
-                    //
-                    switch (targetProperty) {
-                        case "className":
-                            return { kind: TextBindingKind.attribute, attribute: "class" };
-
-                        case "dir":
-                        case "lang":
-                        case "name":
-                        case "title":
-                        case "tabIndex":
-                            return { kind: TextBindingKind.attribute, attribute: targetProperty };
-
-                        case "style":
-                            if (binding.destination.length > 1) {
-                                var targetCssProperty = binding.destination[1];
-                                if (targetCssProperty === "cssText") {
-                                    // We don't support optimizing the cssText property on styles
-                                    //
-                                    return;
-                                }
-                                // If this is a supported css property we will get a string (frequently empty)
-                                //  from the style object.
-                                //
-                                var supported = typeof element.style[targetCssProperty] === "string";
-                                if (supported) {
-                                    //  The mapping from css property name to JS property name is regular:
-                                    //  Chrome uses webkit as the JS property name prefix.
-                                    //  IE uses ms as the JS property name prefix.
-                                    //  Firefox uses Moz as the JS property name prefix.
-                                    //
-                                    //  To calculate the css property name we replace capital letters with
-                                    //  a dash followed by the lowercase version of that letter.
-                                    //
-                                    //  For Chrome and IE we have to add the leading dash manually since
-                                    //  the JS property name prefix is lowercase. For Firefox the replace
-                                    //  call will take care of this for us since their JS property name
-                                    //  prefix begins with a capital letter.
-                                    if (targetCssProperty[0] === "m" && targetCssProperty[1] === "s" ||
-                                            targetCssProperty.substring(0, 6) === "webkit") {
-                                        targetCssProperty = "-" + targetCssProperty;
-                                    }
-                                    targetCssProperty = targetCssProperty.replace(capitalRegEx, function (l) {
-                                        return "-" + l.toLowerCase();
-                                    });
-                                    return { kind: TextBindingKind.inlineStyle, property: targetCssProperty, attribute: "style" };
-                                }
-                            }
-                            break;
-
-                        case "innerText":
-                        case "textContent":
-                            return { kind: TextBindingKind.textContent, attribute: "textContent" };
-                    }
-                },
-
-                oneTimeTreeBinding: function (binding) {
-
-                    if (binding.destination.length === 1 && binding.destination[0] === "id") {
-                        if (_BaseUtils.validation) {
-                            throw new _ErrorFromName("WinJS.Binding.IdBindingNotSupported", _Resources._formatString(strings.idBindingNotSupported, binding.bindingText));
-                        }
-                        _Log.log && _Log.log(_Resources._formatString(strings.idBindingNotSupported, binding.bindingText), "winjs binding", "error");
-                        this.markBindingAsError(binding);
-                        return;
-                    }
-
-                    if (binding.destination.length === 0) {
-                        _Log.log && _Log.log(strings.cannotBindToThis, "winjs binding", "error");
-                        this.markBindingAsError(binding);
-                        return;
-                    }
-
-                    var that = this;
-                    var initialValue;
-                    binding.pathExpression = this.bindingExpression(binding);
-                    binding.value = function () {
-                        return binding.pathExpression;
-                    };
-                    if (binding.original) {
-                        initialValue = binding.pathExpression;
-                        binding.original.initialValue = initialValue;
-                    }
-                    binding.kind = BindingKind.tree;
-                    binding.definition = function () {
-                        var formatString;
-                        if (initialValue) {
-                            formatString = "({targetPath} || {{}}){prop} = {initialValue}";
-                        } else {
-                            formatString = "({targetPath} || {{}}){prop} = {sourcePath}";
-                        }
-                        return that.formatCode(
-                            formatString,
-                            {
-                                targetPath: nullableFilteredIdentifierAccessExpression(
-                                    binding.elementCapture,
-                                    binding.destination.slice(0, -1),
-                                    that.nullableIdentifierAccessTemporary,
-                                    that.importFunctionSafe("targetSecurityCheck", targetSecurityCheck)
-                                ),
-                                prop: identifierAccessExpression(binding.destination.slice(-1)),
-                                sourcePath: binding.value(),
-                                initialValue: initialValue,
-                            }
-                        );
-                    };
-
-                },
-
-                optimize: function () {
-
-                    if (this._stage > Stage.optimze) {
-                        throw "Illegal: once we have moved past link we cannot revist it";
-                    }
-                    this._stage = Stage.optimze;
-
-                    // Identify all bindings which can be turned into tree bindings, in some cases this consists
-                    //  of simply changing their type and providing a definition, in other cases it involves
-                    //  adding a new tree binding to complement the other binding
-                    //
-                    for (var i = 0; i < this._bindings.length; i++) {
-                        var binding = this._bindings[i];
-                        if (binding.template) {
-                            continue;
-                        }
-
-                        switch (binding.initializer.imported) {
-                            case init_defaultBind:
-                                // Add a new tree binding for one-time binding and mark the defaultBind as delayable
-                                var newBinding = merge(binding, {
-                                    kind: BindingKind.tree,
-                                    initializer: this.importFunctionSafe("init_oneTime", init_oneTime),
-                                    original: binding,
-                                });
-                                newBinding.elementCapture.refCount++;
-                                this.oneTimeTreeBinding(newBinding);
-                                this._bindings.splice(i, 0, newBinding);
-                                binding.delayable = true;
-                                i++;
-                                break;
-
-                            case init_setAttribute:
-                                // Add a new tree binding for one-time setAttribute and mark the setAttribute as delayable
-                                var newBinding = merge(binding, {
-                                    kind: BindingKind.tree,
-                                    initializer: this.importFunctionSafe("init_setAttributeOneTime", init_setAttributeOneTime),
-                                    original: binding,
-                                });
-                                newBinding.elementCapture.refCount++;
-                                this.setAttributeOneTimeTreeBinding(newBinding);
-                                this._bindings.splice(i, 0, newBinding);
-                                binding.delayable = true;
-                                i++;
-                                break;
-
-                            case init_oneTime:
-                                this.oneTimeTreeBinding(binding);
-                                break;
-
-                            case init_setAttributeOneTime:
-                                this.setAttributeOneTimeTreeBinding(binding);
-                                break;
-
-                            case init_addClassOneTime:
-                                this.addClassOneTimeTreeBinding(binding);
-                                break;
-
-                            default:
-                                if (binding.initializer) {
-                                    binding.delayable = !!binding.initializer.imported.delayable;
-                                }
-                                break;
-                        }
-                    }
-
-                    if (this._optimizeTextBindings) {
-
-                        // Identifiy all potential text bindings and generate text replacement expressions
-                        //
-                        var textBindings = {};
-                        for (var i = 0; i < this._bindings.length; i++) {
-                            var binding = this._bindings[i];
-                            if (binding.template) {
-                                continue;
-                            }
-                            if (binding.kind === BindingKind.error) {
-                                continue;
-                            }
-
-                            switch (binding.initializer.imported) {
-                                case init_oneTime:
-                                    this.oneTimeTextBinding(binding);
-                                    break;
-
-                                case init_setAttributeOneTime:
-                                    this.setAttributeOneTimeTextBinding(binding);
-                                    break;
-
-                                case init_addClassOneTime:
-                                    this.addClassOneTimeTextBinding(binding);
-                                    break;
-
-                                default:
-                                    break;
-                            }
-                            if (binding.textBindingId) {
-                                textBindings[binding.textBindingId] = binding;
-                            }
-                        }
-
-                        if (Object.keys(textBindings).length) {
-                            var newHtml = this._templateContent.innerHTML;
-
-                            // Perform any adjustments to the HTML that are needed for things like styles and
-                            //  boolean attributes
-                            //
-                            newHtml = this._htmlProcessors.reduce(
-                                function (html, replacer) {
-                                    return replacer(html);
-                                },
-                                newHtml
-                            );
-
-                            // All the even indexes are content and all the odds are replacements
-                            //
-                            // NOTE: this regular expression is
-                            var parts = newHtml.split(this._textBindingRegex);
-                            for (var i = 1; i < parts.length; i += 2) {
-                                var binding = textBindings[parts[i]];
-                                parts[i] = binding.definition;
-                            }
-
-                            // Generate the function which will code-gen the HTML replacements.
-                            //
-                            this._html = function () {
-                                var result = parts.map(function (p) {
-                                    // the strings are the literal parts of the HTML that came directly from the DOM
-                                    // the functions are the definitions for string replacements
-                                    return typeof p === "string" ? literal(p) : p();
-                                }).join(" + ");
-                                return multiline(result);
-                            };
-                        }
-
-                    }
-
-                },
-
-                prettify: function (result) {
-
-                    // remove all lines which contain nothing but a semi-colon
-                    var lines = result.split("\n");
-                    return lines.filter(function (line) { return !semiColonOnlyLineRegEx.test(line); }).join("\n");
-
-                },
-
-                setAttributeOneTimeTextBinding: function (binding) {
-
-                    var that = this;
-                    var attribute = binding.destination[0];
-                    var id = this.createTextBindingHole(binding.elementCapture.element.tagName, attribute, ++this._textBindingId);
-                    var initialValue;
-                    if (binding.original) {
-                        initialValue = binding.original.initialValue;
-                    }
-                    binding.textBindingId = id;
-                    binding.kind = BindingKind.text;
-                    binding.elementCapture.element.setAttribute(attribute, id);
-                    binding.elementCapture.refCount--;
-                    binding.definition = function () {
-                        var formatString;
-                        if (initialValue) {
-                            formatString = "{htmlEscape}({initialValue})";
-                        } else {
-                            formatString = "{htmlEscape}({value})";
-                        }
-                        return that.formatCode(
-                            formatString,
-                            {
-                                htmlEscape: that._staticVariables.htmlEscape,
-                                initialValue: initialValue,
-                                value: binding.value(),
-                            }
-                        );
-                    };
-
-                },
-
-                setAttributeOneTimeTreeBinding: function (binding) {
-
-                    if (binding.destination.length === 1 && binding.destination[0] === "id") {
-                        if (_BaseUtils.validation) {
-                            throw new _ErrorFromName("WinJS.Binding.IdBindingNotSupported", _Resources._formatString(strings.idBindingNotSupported, binding.bindingText));
-                        }
-                        _Log.log && _Log.log(_Resources._formatString(strings.idBindingNotSupported, binding.bindingText), "winjs binding", "error");
-                        this.markBindingAsError(binding);
-                        return;
-                    }
-
-                    if (binding.destination.length !== 1 || !binding.destination[0]) {
-                        _Log.log && _Log.log(strings.attributeBindingSingleProperty, "winjs binding", "error");
-                        this.markBindingAsError(binding);
-                        return;
-                    }
-
-                    var that = this;
-                    var initialValue;
-                    binding.pathExpression = this.bindingExpression(binding);
-                    binding.value = function () {
-                        return binding.pathExpression;
-                    };
-                    if (binding.original) {
-                        initialValue = this.defineInstance(InstanceKind.variable, "", binding.value);
-                        binding.original.initialValue = initialValue;
-                    }
-                    binding.kind = BindingKind.tree;
-                    binding.definition = function () {
-                        var formatString;
-                        if (initialValue) {
-                            formatString = "{element}.setAttribute({attribute}, \"\" + {initialValue})";
-                        } else {
-                            formatString = "{element}.setAttribute({attribute}, \"\" + {value})";
-                        }
-                        return that.formatCode(
-                            formatString,
-                            {
-                                element: binding.elementCapture,
-                                attribute: literal(binding.destination[0]),
-                                initialValue: initialValue,
-                                value: binding.value(),
-                            }
-                        );
-                    };
-
-                },
-
-            }, {
-                _TreeCSE: TreeCSE,
-
-                compile: function TemplateCompiler_compile(template, templateElement, options) {
-
-                    if (!(templateElement instanceof _Global.HTMLElement)) {
-                        throw "Illegal";
-                    }
-
-                    writeProfilerMark("WinJS.Binding.Template:compile" + options.profilerMarkIdentifier + ",StartTM");
-
-                    var compiler = new TemplateCompiler(templateElement, options);
-
-                    compiler.analyze();
-
-                    var importAliases = compiler.importAllSafe({
-                        Signal: _Signal,
-                        global: _Global,
-                        document: _Global.document,
-                        cancelBlocker: cancelBlocker,
-                        promise_as: promise_as,
-                        disposeInstance: disposeInstance,
-                        markDisposable: markDisposable,
-                        ui_processAll: ui_processAll,
-                        binding_processAll: binding_processAll,
-                        insertAdjacentHTMLUnsafe: insertAdjacentHTMLUnsafe,
-                        promise: Promise,
-                        utilities_data: utilities_data,
-                        requireSupportedForProcessing: requireSupportedForProcessing,
-                        htmlEscape: htmlEscape,
-                        scopedSelect: scopedSelect,
-                        delayedBindingProcessing: delayedBindingProcessing,
-                        writeProfilerMark: writeProfilerMark
-                    });
-
-                    compiler.optimize();
-
-                    compiler.deadCodeElimination();
-
-                    compiler.lower();
-
-                    var codeTemplate;
-                    var delayBindings;
-                    switch (options.target) {
-                        case "render":
-                            codeTemplate = compiler.async ? renderImplCodeAsyncTemplate : renderImplCodeTemplate;
-                            delayBindings = false;
-                            break;
-
-                        case "renderItem":
-                            codeTemplate = compiler.async ? renderItemImplCodeAsyncTemplate : renderItemImplCodeTemplate;
-                            delayBindings = true;
-                            break;
-                    }
-
-                    var body = compiler.compile(codeTemplate, importAliases, delayBindings);
-                    var render = compiler.link(body);
-
-                    compiler.done();
-
-                    writeProfilerMark("WinJS.Binding.Template:compile" + options.profilerMarkIdentifier + ",StopTM");
-
-                    return render;
-                }
-            });
-
-            //
-            // Templates
-            //
-
-            function trimLinesRight(string) {
-                // Replace all empty lines with just a newline
-                // Remove all trailing spaces
-                return string.replace(/^\s*$/gm, "").replace(/^(.*[^\s])( *)$/gm, function (unused, content) {
-                    return content;
-                });
-            }
-
-
-            var renderImplMainCodePrefixTemplate = trimLinesRight(
-"container.classList.add(\"win-template\");                                                              \n" +
-"var html = {html};                                                                                      \n" +
-"{insertAdjacentHTMLUnsafe}(container, \"beforeend\", html);                                             \n" +
-"returnedElement = {returnedElement};                                                                    \n" +
-"                                                                                                        \n" +
-"// Capture Definitions                                                                                  \n" +
-"{capture_definitions};                                                                                  \n" +
-"{set_msParentSelectorScope};                                                                            \n" +
-"                                                                                                        \n"
-);
-
-            var renderImplControlAndBindingProcessing = trimLinesRight(
-"// Control Processing                                                                                   \n" +
-"{control_processing};                                                                                   \n" +
-"                                                                                                        \n" +
-"// Binding Processing                                                                                   \n" +
-"{binding_processing};                                                                                   \n" +
-"                                                                                                        \n" +
-"var result = {promise_as}(returnedElement);                                                             \n"
-);
-
-            var renderImplAsyncControlAndBindingProcessing = trimLinesRight(
-"var controlSignal = new {Signal}();                                                                     \n" +
-"var controlDone = function () {{ if (--{control_counter} === 0) {{ controlSignal.complete(); }} }};     \n" +
-"controlDone();                                                                                          \n" +
-"                                                                                                        \n" +
-"// Control Processing                                                                                   \n" +
-"{control_processing};                                                                                   \n" +
-"                                                                                                        \n" +
-"var result = controlSignal.promise.then(function () {{                                                  \n" +
-"    // Binding Processing                                                                               \n" +
-"    {binding_processing};                                                                               \n" +
-"    return {promise}.join({nestedTemplates});                                                           \n" +
-"}}).then(function () {{                                                                                 \n" +
-"    return returnedElement;                                                                             \n" +
-"}}).then(null, function (e) {{                                                                          \n" +
-"    if (typeof e === \"object\" && e.name === \"Canceled\") {{ returnedElement.dispose(); }}            \n" +
-"    return {promise}.wrapError(e);                                                                      \n" +
-"}});                                                                                                    \n"
-);
-
-
-            var renderImplMainCodeSuffixTemplate = trimLinesRight(
-"{markDisposable}(returnedElement, function () {{ {disposeInstance}(returnedElement, result); }});       \n" +
-"{suffix_statements};                                                                                    \n"
-);
-
-            var renderImplCodeTemplate = trimLinesRight(
-"function render(data, container) {{                                                                     \n" +
-"    {debug_break}                                                                                       \n" +
-"    if (typeof data === \"object\" && typeof data.then === \"function\") {{                             \n" +
-"        // async data + a container falls back to interpreted path                                      \n" +
-"        if (container) {{                                                                               \n" +
-"            var result = this._renderInterpreted(data, container);                                      \n" +
-"            return result.element.then(function () {{ return result.renderComplete; }});                \n" +
-"        }}                                                                                              \n" +
-"        return {cancelBlocker}(data).then(function(data) {{ return render(data); }});                   \n" +
-"    }}                                                                                                  \n" +
-"                                                                                                        \n" +
-"    {writeProfilerMark}({profilerMarkIdentifierStart});                                                 \n" +
-"                                                                                                        \n" +
-"    // Declarations                                                                                     \n" +
-"    var {instance_variable_declarations};                                                               \n" +
-"    var returnedElement;                                                                                \n" +
-"                                                                                                        \n" +
-"    // Global Definitions                                                                               \n" +
-"    {global_definitions};                                                                               \n" +
-"                                                                                                        \n" +
-"    // Data Definitions                                                                                 \n" +
-"    data = (data === {global} ? data : {requireSupportedForProcessing}(data));                          \n" +
-"    {data_definitions};                                                                                 \n" +
-"                                                                                                        \n" +
-"    // Instance Variable Definitions                                                                    \n" +
-"    {instance_variable_definitions};                                                                    \n" +
-"                                                                                                        \n" +
-"    // HTML Processing                                                                                  \n" +
-"    container = container || {document}.createElement({tagName});                                       \n" +
-"    var startIndex = container.childElementCount;                                                       \n" +
-"    " + trim(indent(4, renderImplMainCodePrefixTemplate)) + "                                           \n" +
-"                                                                                                        \n" +
-"    " + trim(indent(4, renderImplControlAndBindingProcessing)) + "                                      \n" +
-"    " + trim(indent(4, renderImplMainCodeSuffixTemplate)) + "                                           \n" +
-"                                                                                                        \n" +
-"    {writeProfilerMark}({profilerMarkIdentifierStop});                                                  \n" +
-"                                                                                                        \n" +
-"    return result;                                                                                      \n" +
-"}}                                                                                                      \n"
-);
-
-            var renderImplCodeAsyncTemplate = trimLinesRight(
-"function render(data, container) {{                                                                     \n" +
-"    {debug_break}                                                                                       \n" +
-"    if (typeof data === \"object\" && typeof data.then === \"function\") {{                             \n" +
-"        // async data + a container falls back to interpreted path                                      \n" +
-"        if (container) {{                                                                               \n" +
-"            var result = this._renderInterpreted(data, container);                                      \n" +
-"            return result.element.then(function () {{ return result.renderComplete; }});                \n" +
-"        }}                                                                                              \n" +
-"        return {cancelBlocker}(data).then(function(data) {{ return render(data, container); }});        \n" +
-"    }}                                                                                                  \n" +
-"                                                                                                        \n" +
-"    {writeProfilerMark}({profilerMarkIdentifierStart});                                                 \n" +
-"                                                                                                        \n" +
-"    // Declarations                                                                                     \n" +
-"    var {instance_variable_declarations};                                                               \n" +
-"    var returnedElement;                                                                                \n" +
-"                                                                                                        \n" +
-"    // Global Definitions                                                                               \n" +
-"    {global_definitions};                                                                               \n" +
-"                                                                                                        \n" +
-"    // Data Definitions                                                                                 \n" +
-"    data = (data === {global} ? data : {requireSupportedForProcessing}(data));                          \n" +
-"    {data_definitions};                                                                                 \n" +
-"                                                                                                        \n" +
-"    // Instance Variable Definitions                                                                    \n" +
-"    {instance_variable_definitions};                                                                    \n" +
-"                                                                                                        \n" +
-"    // HTML Processing                                                                                  \n" +
-"    container = container || {document}.createElement({tagName});                                       \n" +
-"    var startIndex = container.childElementCount;                                                       \n" +
-"    " + trim(indent(4, renderImplMainCodePrefixTemplate)) + "                                           \n" +
-"                                                                                                        \n" +
-"    " + trim(indent(4, renderImplAsyncControlAndBindingProcessing)) + "                                 \n" +
-"    " + trim(indent(4, renderImplMainCodeSuffixTemplate)) + "                                           \n" +
-"                                                                                                        \n" +
-"    {writeProfilerMark}({profilerMarkIdentifierStop});                                                  \n" +
-"                                                                                                        \n" +
-"    return result;                                                                                      \n" +
-"}}                                                                                                      \n"
-);
-
-            var renderItemImplMainCodeSuffixTemplate = trimLinesRight(
-"{markDisposable}(returnedElement, function () {{ {disposeInstance}(returnedElement, result, renderComplete); }});\n" +
-"{suffix_statements};                                                                                    \n"
-);
-
-            var renderItemImplCodeTemplate = trimLinesRight(
-"function renderItem(itemPromise) {{                                                                     \n" +
-"    {debug_break}                                                                                       \n" +
-"    // Declarations                                                                                     \n" +
-"    var {instance_variable_declarations};                                                               \n" +
-"    var element, renderComplete, data, returnedElement;                                                 \n" +
-"                                                                                                        \n" +
-"    element = itemPromise.then(function renderItem(item) {{                                             \n" +
-"        if (typeof item.data === \"object\" && typeof item.data.then === \"function\") {{               \n" +
-"            return {cancelBlocker}(item.data).then(function (data) {{ return renderItem({{ data: data }}); }});\n" +
-"        }}                                                                                              \n" +
-"                                                                                                        \n" +
-"        {writeProfilerMark}({profilerMarkIdentifierStart});                                             \n" +
-"                                                                                                        \n" +
-"        // Global Definitions                                                                           \n" +
-"        {global_definitions};                                                                           \n" +
-"                                                                                                        \n" +
-"        // Data Definitions                                                                             \n" +
-"        data = item.data;                                                                               \n" +
-"        data = (data === {global} ? data : {requireSupportedForProcessing}(data));                      \n" +
-"        {data_definitions};                                                                             \n" +
-"                                                                                                        \n" +
-"        // Instance Variable Definitions                                                                \n" +
-"        {instance_variable_definitions};                                                                \n" +
-"                                                                                                        \n" +
-"        // HTML Processing                                                                              \n" +
-"        var container = {document}.createElement({tagName});                                            \n" +
-"        var startIndex = 0;                                                                             \n" +
-"        " + trim(indent(8, renderImplMainCodePrefixTemplate)) + "                                       \n" +
-"                                                                                                        \n" +
-"        " + trim(indent(8, renderImplControlAndBindingProcessing)) + "                                  \n" +
-"        " + trim(indent(8, renderItemImplMainCodeSuffixTemplate)) + "                                   \n" +
-"                                                                                                        \n" +
-"        {writeProfilerMark}({profilerMarkIdentifierStop});                                              \n" +
-"                                                                                                        \n" +
-"        return result;                                                                                  \n" +
-"    }});                                                                                                \n" +
-"    {renderComplete};                                                                                   \n" +
-"    return {{                                                                                           \n" +
-"        element: element,                                                                               \n" +
-"        renderComplete: renderComplete || element,                                                      \n" +
-"    }};                                                                                                 \n" +
-"}}                                                                                                      \n"
-);
-
-            var renderItemImplRenderCompleteTemplate = trimLinesRight(
-"renderComplete = element.then(function () {{                                                            \n" +
-"    return itemPromise;                                                                                 \n" +
-"}}).then(function (item) {{                                                                             \n" +
-"    return item.ready || item;                                                                          \n" +
-"}}).then(function (item) {{                                                                             \n" +
-"    {delayed_binding_processing};                                                                       \n" +
-"    return element;                                                                                     \n" +
-"}});                                                                                                    \n"
-);
-
-            var renderItemImplCodeAsyncTemplate = trimLinesRight(
-"function renderItem(itemPromise) {{                                                                     \n" +
-"    {debug_break}                                                                                       \n" +
-"    // Declarations                                                                                     \n" +
-"    var {instance_variable_declarations};                                                               \n" +
-"    var element, renderComplete, data, returnedElement;                                                 \n" +
-"                                                                                                        \n" +
-"    element = itemPromise.then(function renderItem(item) {{                                             \n" +
-"        if (typeof item.data === \"object\" && typeof item.data.then === \"function\") {{               \n" +
-"            return {cancelBlocker}(item.data).then(function (data) {{ return renderItem({{ data: data }}); }});\n" +
-"        }}                                                                                              \n" +
-"                                                                                                        \n" +
-"        {writeProfilerMark}({profilerMarkIdentifierStart});                                             \n" +
-"                                                                                                        \n" +
-"        // Global Definitions                                                                           \n" +
-"        {global_definitions};                                                                           \n" +
-"                                                                                                        \n" +
-"        // Data Definitions                                                                             \n" +
-"        data = item.data;                                                                               \n" +
-"        data = (data === {global} ? data : {requireSupportedForProcessing}(data));                      \n" +
-"        {data_definitions};                                                                             \n" +
-"                                                                                                        \n" +
-"        // Instance Variable Definitions                                                                \n" +
-"        {instance_variable_definitions};                                                                \n" +
-"                                                                                                        \n" +
-"        // HTML Processing                                                                              \n" +
-"        var container = {document}.createElement({tagName});                                            \n" +
-"        var startIndex = 0;                                                                             \n" +
-"        " + trim(indent(8, renderImplMainCodePrefixTemplate)) + "                                       \n" +
-"                                                                                                        \n" +
-"        " + trim(indent(8, renderImplAsyncControlAndBindingProcessing)) + "                             \n" +
-"        " + trim(indent(8, renderItemImplMainCodeSuffixTemplate)) + "                                   \n" +
-"                                                                                                        \n" +
-"        {writeProfilerMark}({profilerMarkIdentifierStop});                                              \n" +
-"                                                                                                        \n" +
-"        return result;                                                                                  \n" +
-"    }});                                                                                                \n" +
-"    {renderComplete};                                                                                   \n" +
-"    return {{                                                                                           \n" +
-"        element: element,                                                                               \n" +
-"        renderComplete: renderComplete || element,                                                      \n" +
-"    }};                                                                                                 \n" +
-"}}                                                                                                      \n"
-);
-
-            var linkerCodeTemplate = trimLinesRight(
-"\"use strict\";                                                                                         \n" +
-"                                                                                                        \n" +
-"// statics                                                                                              \n" +
-"var {static_variable_declarations};                                                                     \n" +
-"{static_variable_definitions};                                                                          \n" +
-"                                                                                                        \n" +
-"// generated template rendering function                                                                \n" +
-"return {body};                                                                                          \n"
-);
-
-            //
-            // End Templates
-            //
-
-            return TemplateCompiler;
-        })
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/BindingTemplate',[
-    'exports',
-    './Core/_Global',
-    './Core/_WinRT',
-    './Core/_Base',
-    './Core/_BaseUtils',
-    './Core/_Log',
-    './Core/_WriteProfilerMark',
-    './Binding/_Declarative',
-    './BindingTemplate/_DataTemplateCompiler',
-    './ControlProcessor',
-    './Fragments',
-    './Promise',
-    './Utilities/_Dispose',
-    './Utilities/_ElementUtilities'
-    ], function dataTemplateInit(exports, _Global, _WinRT, _Base, _BaseUtils, _Log, _WriteProfilerMark, _Declarative, _DataTemplateCompiler, ControlProcessor, Fragments, Promise, _Dispose, _ElementUtilities) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-
-    var cancelBlocker = Promise._cancelBlocker;
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Binding", {
-
-        /// <field>
-        /// <summary locid="WinJS.Binding.Template">
-        /// Provides a reusable declarative binding element.
-        /// </summary>
-        /// </field>
-        /// <name locid="WinJS.Binding.Template_name">Template</name>
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.Binding.Template"><div>Place content here</div></div>]]></htmlSnippet>
-        /// <icon src="base_winjs.ui.template.12x12.png" width="12" height="12" />
-        /// <icon src="base_winjs.ui.template.16x16.png" width="16" height="16" />
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        Template: _Base.Namespace._lazy(function () {
-            function interpretedRender(template, dataContext, container) {
-                _WriteProfilerMark("WinJS.Binding:templateRender" + template._profilerMarkIdentifier + ",StartTM");
-
-                if (++template._counter === 1 && (template.debugBreakOnRender || Template._debugBreakOnRender)) {
-                    debugger; // jshint ignore:line
-                }
-
-                var workPromise = Promise.wrap();
-                var d = container || _Global.document.createElement(template.element.tagName);
-
-                _ElementUtilities.addClass(d, "win-template");
-                _ElementUtilities.addClass(d, "win-loading");
-                var that = template;
-                function done() {
-                    _ElementUtilities.removeClass(d, "win-loading");
-                    _WriteProfilerMark("WinJS.Binding:templateRender" + template._profilerMarkIdentifier + ",StopTM");
-                    return extractedChild || d;
-                }
-                var initial = d.children.length;
-                var element;
-                var extractedChild;
-                var dispose = function () {
-                    var bindings = _ElementUtilities.data(d).winBindings;
-                    if (bindings) {
-                        bindings.forEach(function (item) {
-                            item.cancel();
-                        });
-                    }
-                    workPromise.cancel();
-                };
-                if (template.extractChild) {
-                    element = Fragments.renderCopy(that.href || that.element, _Global.document.createElement(that.element.tagName)).then(function (frag) {
-                        var child = frag.firstElementChild;
-                        extractedChild = child;
-                        _Dispose.markDisposable(child, dispose);
-                        d.appendChild(child);
-                        return child;
-                    });
-                } else {
-                    _Dispose.markDisposable(d, dispose);
-                    element = Fragments.renderCopy(that.href || that.element, d);
-                }
-                var renderComplete = element.
-                    then(function Template_renderImpl_renderComplete_then() {
-                        var work;
-                        // If no existing children, we can do the faster path of just calling
-                        // on the root element...
-                        //
-                        if (initial === 0) {
-                            work = function (f, a, b, c) { return f(extractedChild || d, a, b, c); };
-                        } else {
-                            // We only grab the newly added nodes (always at the end)
-                            // and in the common case of only adding a single new element
-                            // we avoid the "join" overhead
-                            //
-                            var all = d.children;
-                            if (all.length === initial + 1) {
-                                work = function (f, a, b, c) { return f(all[initial], a, b, c); };
-                            } else {
-                                // we have to capture the elements first, in case
-                                // doing the work affects the children order/content
-                                //
-                                var elements = [];
-                                for (var i = initial, l = all.length; i < l; i++) {
-                                    elements.push(all[i]);
-                                }
-                                work = function (f, a, b, c) {
-                                    var join = [];
-                                    elements.forEach(function (e) {
-                                        join.push(f(e, a, b, c));
-                                    });
-                                    return Promise.join(join);
-                                };
-                            }
-                        }
-
-                        var child = d.firstElementChild;
-                        while (child) {
-                            child.msParentSelectorScope = true;
-                            child = child.nextElementSibling;
-                        }
-
-                        // This allows "0" to mean no timeout (at all) and negative values
-                        // mean setImmediate (no setTimeout). Since Promise.timeout uses
-                        // zero to mean setImmediate, we have to coerce.
-                        //
-                        var timeout = that.processTimeout;
-                        function complete() {
-                            return work(ControlProcessor.processAll).
-                                then(function () { return cancelBlocker(dataContext); }).
-                                then(function Template_renderImpl_Binding_processAll(data) {
-                                    return work(_Declarative.processAll, data, !extractedChild && !initial, that.bindingCache);
-                                }).
-                                then(null, function (e) {
-                                    if (typeof e === "object" && e.name === "Canceled") {
-                                        (extractedChild || d).dispose();
-                                    }
-                                    return Promise.wrapError(e);
-                                });
-                        }
-                        if (timeout) {
-                            if (timeout < 0) { timeout = 0; }
-                            return Promise.timeout(timeout).then(function () {
-                                workPromise = complete();
-                                return workPromise;
-                            });
-                        } else {
-                            workPromise = complete();
-                            return workPromise;
-                        }
-                    }).then(done, function (err) { done(); return Promise.wrapError(err); });
-
-                return { element: element, renderComplete: renderComplete };
-            }
-
-            var Template = _Base.Class.define(function Template_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.Binding.Template.Template">
-                /// <summary locid="WinJS.Binding.Template.constructor">
-                /// Creates a template that provides a reusable declarative binding element.
-                /// </summary>
-                /// <param name="element" type="DOMElement" locid="WinJS.Binding.Template.constructor_p:element">
-                /// The DOM element to convert to a template.
-                /// </param>
-                /// <param name="options" type="{href:String}" optional="true" locid="WinJS.Binding.Template.constructor_p:options">
-                /// If this parameter is supplied, the template is loaded from the URI and
-                /// the content of the element parameter is ignored.
-                /// </param>
-                /// </signature>
-
-                this._element = element || _Global.document.createElement("div");
-                this._element.winControl = this;
-
-                this._profilerMarkIdentifier = _BaseUtils._getProfilerMarkIdentifier(this._element);
-                _WriteProfilerMark("WinJS.Binding:newTemplate" + this._profilerMarkIdentifier + ",StartTM");
-
-                var that = this;
-                this._element.renderItem = function (itemPromise, recycled) { return that._renderItemImpl(itemPromise, recycled); };
-
-                options = options || {};
-                this.href = options.href;
-                this.enableRecycling = !!options.enableRecycling;
-                this.processTimeout = options.processTimeout || 0;
-                this.bindingInitializer = options.bindingInitializer;
-                this.debugBreakOnRender = options.debugBreakOnRender;
-                this.disableOptimizedProcessing = options.disableOptimizedProcessing;
-                this.extractChild = options.extractChild;
-                this._counter = 0;
-
-                // This will eventually change name and reverse polarity, starting opt-in.
-                //
-                this._compile = !!options._compile;
-
-                if (!this.href) {
-                    this.element.style.display = "none";
-                }
-                this.bindingCache = { expressions: {} };
-
-                _WriteProfilerMark("WinJS.Binding:newTemplate" + this._profilerMarkIdentifier + ",StopTM");
-            }, {
-                _shouldCompile: {
-                    get: function () {
-                        // This is the temporary switch to opt-in to compilation, eventually replaced
-                        //  by default opt-in with an opt-out switch.
-                        //
-                        var shouldCompile = true;
-                        shouldCompile = shouldCompile && !Template._interpretAll;
-                        shouldCompile = shouldCompile && !this.disableOptimizedProcessing;
-
-                        if (shouldCompile) {
-                            shouldCompile = shouldCompile && this.processTimeout === 0;
-                            shouldCompile = shouldCompile && (!this.href || this.href instanceof _Global.HTMLElement);
-
-                            if (!shouldCompile) {
-                                _Log.log && _Log.log("Cannot compile templates which use processTimeout or href properties", "winjs binding", "warn");
-                            }
-                        }
-
-                        return shouldCompile;
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.Binding.Template.bindingInitializer" helpKeyword="WinJS.Binding.Template.bindingInitializer">
-                /// If specified this function is used as the default initializer for any data bindings which do not explicitly specify one. The
-                /// provided function must be marked as supported for processing.
-                /// </field>
-                bindingInitializer: {
-                    get: function () { return this._bindingInitializer; },
-                    set: function (value) {
-                        this._bindingInitializer = value;
-                        this._reset();
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.Binding.Template.debugBreakOnRender" helpKeyword="WinJS.Binding.Template.debugBreakOnRender">
-                /// Indicates whether a templates should break in the debugger on first render
-                /// </field>
-                debugBreakOnRender: {
-                    get: function () { return this._debugBreakOnRender; },
-                    set: function (value) {
-                        this._debugBreakOnRender = !!value;
-                        this._reset();
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.Binding.Template.disableOptimizedProcessing" helpKeyword="WinJS.Binding.Template.disableOptimizedProcessing">
-                /// Set this property to true to resotre classic template processing and data binding and disable template compilation.
-                /// </field>
-                disableOptimizedProcessing: {
-                    get: function () { return this._disableOptimizedProcessing; },
-                    set: function (value) {
-                        this._disableOptimizedProcessing = !!value;
-                        this._reset();
-                    }
-                },
-
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.Binding.Template.element" helpKeyword="WinJS.Binding.Template.element">
-                /// Gets the DOM element that is used as the template.
-                /// </field>
-                element: {
-                    get: function () { return this._element; },
-                },
-
-                /// <field type="Boolean" locid="WinJS.Binding.Template.extractChild" helpKeyword="WinJS.Binding.Template.extractChild">
-                /// Return the first element child of the template instead of a wrapper element hosting all the template content.
-                /// </field>
-                extractChild: {
-                    get: function () { return this._extractChild; },
-                    set: function (value) {
-                        this._extractChild = !!value;
-                        this._reset();
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.Binding.Template.processTimeout" helpKeyword="WinJS.Binding.Template.processTimeout">
-                /// Number of milliseconds to delay instantiating declarative controls. Zero (0) will result in no delay, any negative number
-                /// will result in a setImmediate delay, any positive number will be treated as the number of milliseconds.
-                /// </field>
-                processTimeout: {
-                    get: function () { return this._processTimeout || 0; },
-                    set: function (value) {
-                        this._processTimeout = value;
-                        this._reset();
-                    }
-                },
-
-                render: _BaseUtils.markSupportedForProcessing(function (dataContext, container) {
-                    /// <signature helpKeyword="WinJS.Binding.Template.render">
-                    /// <summary locid="WinJS.Binding.Template.render">
-                    /// Binds values from the specified data context to elements that are descendents of the specified root element
-                    /// and have the declarative binding attributes (data-win-bind).
-                    /// </summary>
-                    /// <param name="dataContext" type="Object" optional="true" locid="WinJS.Binding.Template.render_p:dataContext">
-                    /// The object to use for default data binding.
-                    /// </param>
-                    /// <param name="container" type="DOMElement" optional="true" locid="WinJS.Binding.Template.render_p:container">
-                    /// The element to which to add this rendered template. If this parameter is omitted, a new DIV is created.
-                    /// </param>
-                    /// <returns type="WinJS.Promise" locid="WinJS.Binding.Template.render_returnValue">
-                    /// A promise that is completed after binding has finished. The value is
-                    /// either the element specified in the container parameter or the created DIV.
-                    /// </returns>
-                    /// </signature>
-
-                    return this._renderImpl(dataContext, container);
-                }),
-
-                // Hook point for compiled template
-                //
-                _renderImpl: function (dataContext, container) {
-                    if (this._shouldCompile) {
-                        try {
-                            this._renderImpl = this._compileTemplate({ target: "render" });
-                            return this._renderImpl(dataContext, container);
-                        } catch (e) {
-                            return Promise.wrapError(e);
-                        }
-                    }
-
-                    var render = interpretedRender(this, dataContext, container);
-                    return render.element.then(function () { return render.renderComplete; });
-                },
-
-                _renderInterpreted: function (dataContext, container) {
-                    return interpretedRender(this, dataContext, container);
-                },
-
-                renderItem: function (item, recycled) {
-                    /// <signature helpKeyword="WinJS.Binding.Template.renderItem">
-                    /// <summary locid="WinJS.Binding.Template.renderItem">
-                    /// Renders an instance of this template bound to the data contained in item. If
-                    /// the recycled parameter is present, and enableRecycling is true, then the template attempts
-                    /// to reuse the DOM elements from the recycled parameter.
-                    /// </summary>
-                    /// <param name="item" type="Object" optional="false" locid="WinJS.Binding.Template.renderItem_p:item">
-                    /// The object that contains the data to bind to. Only item.data is required.
-                    /// </param>
-                    /// <param name="recycled" type="DOMElement" optional="true" locid="WinJS.Binding.Template.renderItem_p:recycled">
-                    /// A previously-generated template instance.
-                    /// </param>
-                    /// <returns type="DOMElement" locid="WinJS.Binding.Template.renderItem_returnValue">
-                    /// The DOM element.
-                    /// </returns>
-                    /// </signature>
-                    return this._renderItemImpl(item, recycled);
-                },
-
-                // Hook point for compiled template
-                //
-                _renderItemImpl: function (item, recycled) {
-                    if (this._shouldCompile) {
-                        try {
-                            this._renderItemImpl = this._compileTemplate({ target: "renderItem" });
-                            return this._renderItemImpl(item);
-                        } catch (e) {
-                            return {
-                                element: Promise.wrapError(e),
-                                renderComplete: Promise.wrapError(e),
-                            };
-                        }
-                    }
-
-                    var that = this;
-
-                    // we only enable element cache when we are trying
-                    // to recycle. Otherwise our element cache would
-                    // grow unbounded.
-                    //
-                    if (this.enableRecycling && !this.bindingCache.elements) {
-                        this.bindingCache.elements = {};
-                    }
-
-                    if (this.enableRecycling
-                        && recycled
-                        && recycled.msOriginalTemplate === this) {
-
-                        // If we are asked to recycle, we cleanup any old work no matter what
-                        //
-                        var cacheEntry = this.bindingCache.elements[recycled.id];
-                        var okToReuse = true;
-                        if (cacheEntry) {
-                            cacheEntry.bindings.forEach(function (v) { v(); });
-                            cacheEntry.bindings = [];
-                            okToReuse = !cacheEntry.nocache;
-                        }
-
-                        // If our cache indicates that we hit a non-cancelable thing, then we are
-                        // in an unknown state, so we actually can't recycle the tree. We have
-                        // cleaned up what we can, but at this point we need to reset and create
-                        // a new tree.
-                        //
-                        if (okToReuse) {
-                            // Element recycling requires that there be no other content in "recycled" other than this
-                            // templates' output.
-                            //
-                            return {
-                                element: recycled,
-                                renderComplete: item.then(function (item) {
-                                    return _Declarative.processAll(recycled, item.data, true, that.bindingCache);
-                                }),
-                            };
-                        }
-                    }
-
-                    var render = interpretedRender(this, item.then(function (item) { return item.data; }));
-                    render.element = render.element.then(function (e) { e.msOriginalTemplate = that; return e; });
-                    return render;
-                },
-
-                _compileTemplate: function (options) {
-
-                    var that = this;
-
-                    var result = _DataTemplateCompiler._TemplateCompiler.compile(this, this.href || this.element, {
-                        debugBreakOnRender: this.debugBreakOnRender || Template._debugBreakOnRender,
-                        defaultInitializer: this.bindingInitializer || options.defaultInitializer,
-                        disableTextBindingOptimization: options.disableTextBindingOptimization || false,
-                        target: options.target,
-                        extractChild: this.extractChild,
-                        profilerMarkIdentifier: this._profilerMarkIdentifier
-                    });
-
-                    var resetOnFragmentChange = options.resetOnFragmentChange || _WinRT.Windows.ApplicationModel.DesignMode.designModeEnabled;
-                    if (resetOnFragmentChange) {
-                        // For platforms that don't support MutationObserver the shim
-                        // currently will never fire. This is OK because only MutationObserver
-                        // can monitor DocFragments and this feature is only for
-                        // assisting authoring tools.
-                        var mo = new _ElementUtilities._MutationObserver(function () {
-                            that._reset();
-                            mo.disconnect();
-                        });
-                        mo.observe(_ElementUtilities.data(this.element).docFragment, {
-                            childList: true,
-                            attributes: true,
-                            characterData: true,
-                            subtree: true,
-                        });
-                    }
-
-                    return result;
-
-                },
-
-                _reset: function () {
-                    // Reset the template to being not compiled. In design mode this triggers on a mutation
-                    //  of the original document fragment.
-                    delete this._renderImpl;
-                    delete this._renderItemImpl;
-                },
-
-            }, {
-                isDeclarativeControlContainer: { value: true, writable: false, configurable: false },
-                render: {
-                    value: function (href, dataContext, container) {
-                        /// <signature helpKeyword="WinJS.Binding.Template.render.value">
-                        /// <summary locid="WinJS.Binding.Template.render.value">
-                        /// Renders a template based on a URI.
-                        /// </summary>
-                        /// <param name="href" type="String" locid="WinJS.Binding.Template.render.value_p:href">
-                        /// The URI from which to load the template.
-                        /// </param>
-                        /// <param name="dataContext" type="Object" optional="true" locid="WinJS.Binding.Template.render.value_p:dataContext">
-                        /// The object to use for default data binding.
-                        /// </param>
-                        /// <param name="container" type="DOMElement" optional="true" locid="WinJS.Binding.Template.render.value_p:container">
-                        /// The element to which to add this rendered template. If this parameter is omitted, a new DIV is created.
-                        /// </param>
-                        /// <returns type="WinJS.Promise" locid="WinJS.Binding.Template.render.value_returnValue">
-                        /// A promise that is completed after binding has finished. The value is
-                        /// either the object in the container parameter or the created DIV.
-                        /// </returns>
-                        /// </signature>
-                        return new Template(null, { href: href }).render(dataContext, container);
-                    }
-                }
-            });
-
-            return Template;
-        })
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// WinJS.Binding.ListDataSource
-//
-define('WinJS/BindingList/_BindingListDataSource',[
-    'exports',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_ErrorFromName',
-    '../Binding/_DomWeakRefTable',
-    '../Promise',
-    '../Scheduler',
-    '../Utilities/_UI'
-    ], function bindingListDataSourceInit(exports, _WinRT, _Base, _ErrorFromName, _DomWeakRefTable, Promise, Scheduler, _UI) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Binding", {
-        _BindingListDataSource: _Base.Namespace._lazy(function () {
-            var errors = {
-                get noLongerMeaningful() { return Promise.wrapError(new _ErrorFromName(_UI.EditError.noLongerMeaningful)); }
-            };
-
-            function findNextKey(list, index) {
-                var len = list.length;
-                while (index < len - 1) {
-                    var item = list.getItem(++index);
-                    if (item) {
-                        return item.key;
-                    }
-                }
-                return null;
-            }
-
-            function findPreviousKey(list, index) {
-                while (index > 0) {
-                    var item = list.getItem(--index);
-                    if (item) {
-                        return item.key;
-                    }
-                }
-                return null;
-            }
-
-            function subscribe(target, handlers) {
-                Object.keys(handlers).forEach(function (handler) {
-                    target.addEventListener(handler, handlers[handler]);
-                });
-            }
-
-            function unsubscribe(target, handlers) {
-                Object.keys(handlers).forEach(function (handler) {
-                    target.removeEventListener(handler, handlers[handler]);
-                });
-            }
-
-            var CompletePromise = Promise.wrap().constructor;
-
-            var NullWrappedItem = _Base.Class.derive(CompletePromise,
-                function () {
-                    this._value = null;
-                }, {
-                    release: function () { },
-                    retain: function () { return this; }
-                }, {
-                    supportedForProcessing: false,
-                }
-            );
-
-            var WrappedItem = _Base.Class.derive(CompletePromise,
-                function (listBinding, item) {
-                    this._value = item;
-                    this._listBinding = listBinding;
-                }, {
-                    handle: {
-                        get: function () { return this._value.key; }
-                    },
-                    index: {
-                        get: function () { return this._value.index; }
-                    },
-                    release: function () {
-                        this._listBinding._release(this._value, this._listBinding._list.indexOfKey(this._value.key));
-                    },
-                    retain: function () {
-                        this._listBinding._addRef(this._value, this._listBinding._list.indexOfKey(this._value.key));
-                        return this;
-                    }
-                }, {
-                    supportedForProcessing: false,
-                }
-            );
-
-            var AsyncWrappedItem = _Base.Class.derive(Promise,
-                function (listBinding, item, name) {
-                    var that = this;
-                    this._item = item;
-                    this._listBinding = listBinding;
-                    Promise.call(this, function (c) {
-                        Scheduler.schedule(function BindingList_async_item() {
-                            if (listBinding._released) {
-                                that.cancel();
-                                return;
-                            }
-                            c(item);
-                        }, Scheduler.Priority.normal, null, "WinJS.Binding.List." + name);
-                    });
-                }, {
-                    handle: {
-                        get: function () { return this._item.key; }
-                    },
-                    index: {
-                        get: function () { return this._item.index; }
-                    },
-                    release: function () {
-                        this._listBinding._release(this._item, this._listBinding._list.indexOfKey(this._item.key));
-                    },
-                    retain: function () {
-                        this._listBinding._addRef(this._item, this._listBinding._list.indexOfKey(this._item.key));
-                        return this;
-                    }
-                }, {
-                    supportedForProcessing: false,
-                }
-            );
-
-            function wrap(listBinding, item) {
-                return item ? new WrappedItem(listBinding, item) : new NullWrappedItem();
-            }
-
-            function wrapAsync(listBinding, item, name) {
-                return item ? new AsyncWrappedItem(listBinding, item, name) : new NullWrappedItem();
-            }
-
-            function cloneWithIndex(list, item, index) {
-                return item && list._annotateWithIndex(item, index);
-            }
-
-            var ListBinding = _Base.Class.define(function ListBinding_ctor(dataSource, list, notificationHandler, id) {
-                this._dataSource = dataSource;
-                this._list = list;
-                this._editsCount = 0;
-                this._notificationHandler = notificationHandler;
-                this._pos = -1;
-                this._retained = [];
-                this._retained.length = list.length;
-                this._retainedKeys = {};
-                this._affectedRange = null;
-                // When in WebContext, weakref utility functions don't work as desired so we capture this
-                // ListBinding object in the handler's closure. This causes the same leak as in 1.0.
-                var fallbackReference = null;
-                if (!_WinRT.msSetWeakWinRTProperty || !_WinRT.msGetWeakWinRTProperty) {
-                    fallbackReference = this;
-                }
-                if (notificationHandler) {
-                    var handleEvent = function (eventName, eventArg) {
-                        var lb = _DomWeakRefTable._getWeakRefElement(id) || fallbackReference;
-                        if (lb) {
-                            lb["_" + eventName](eventArg);
-                            return true;
-                        }
-                        return false;
-                    };
-
-                    this._handlers = {
-                        itemchanged: function handler(event) {
-                            if (!handleEvent("itemchanged", event)) {
-                                list.removeEventListener("itemchanged", handler);
-                            }
-                        },
-                        iteminserted: function handler(event) {
-                            if (!handleEvent("iteminserted", event)) {
-                                list.removeEventListener("iteminserted", handler);
-                            }
-                        },
-                        itemmoved: function handler(event) {
-                            if (!handleEvent("itemmoved", event)) {
-                                list.removeEventListener("itemmoved", handler);
-                            }
-                        },
-                        itemremoved: function handler(event) {
-                            if (!handleEvent("itemremoved", event)) {
-                                list.removeEventListener("itemremoved", handler);
-                            }
-                        },
-                        reload: function handler() {
-                            if (!handleEvent("reload")) {
-                                list.removeEventListener("reload", handler);
-                            }
-                        }
-                    };
-                    subscribe(this._list, this._handlers);
-                }
-            }, {
-                _itemchanged: function (event) {
-                    var key = event.detail.key;
-                    var index = event.detail.index;
-                    this._updateAffectedRange(index, "changed");
-                    var newItem = event.detail.newItem;
-                    var oldItem = this._retained[index];
-                    if (oldItem) {
-                        var handler = this._notificationHandler;
-                        if (oldItem.index !== index) {
-                            var oldIndex = oldItem.index;
-                            oldItem.index = index;
-                            if (handler && handler.indexChanged) {
-                                handler.indexChanged(newItem.key, index, oldIndex);
-                            }
-                        }
-                        newItem = cloneWithIndex(this._list, newItem, index);
-                        newItem._retainedCount = oldItem._retainedCount;
-                        this._retained[index] = newItem;
-                        this._retainedKeys[key] = newItem;
-
-                        this._beginEdits(this._list.length);
-                        if (handler && handler.changed) {
-                            handler.changed(
-                                newItem,
-                                oldItem
-                            );
-                        }
-                        this._endEdits();
-                    } else {
-                        // Item was not retained, but we still want to batch this change with the other edits to send the affectedRange notification.
-                        this._beginEdits(this._list.length);
-                        this._endEdits();
-                    }
-                },
-
-                _iteminserted: function (event) {
-                    var index = event.detail.index;
-                    this._updateAffectedRange(index, "inserted");
-                    this._beginEdits(this._list.length - 1);
-                    if (index <= this._pos) {
-                        this._pos = Math.min(this._pos + 1, this._list.length);
-                    }
-                    var retained = this._retained;
-                    // create a hole for this thing and then immediately make it undefined
-                    retained.splice(index, 0, 0);
-                    delete retained[index];
-                    if (this._shouldNotify(index) || this._list.length === 1) {
-                        var handler = this._notificationHandler;
-                        if (handler && handler.inserted) {
-                            handler.inserted(
-                                wrap(this, cloneWithIndex(this._list, this._list.getItem(index), index)),
-                                findPreviousKey(this._list, index),
-                                findNextKey(this._list, index)
-                            );
-                        }
-                    }
-                    this._endEdits();
-                },
-
-                _itemmoved: function (event) {
-                    var oldIndex = event.detail.oldIndex;
-                    var newIndex = event.detail.newIndex;
-                    this._updateAffectedRange(oldIndex, "moved");
-                    this._updateAffectedRange(newIndex, "moved");
-                    this._beginEdits(this._list.length);
-                    if (oldIndex < this._pos || newIndex <= this._pos) {
-                        if (newIndex > this._pos) {
-                            this._pos = Math.max(-1, this._pos - 1);
-                        } else if (oldIndex > this._pos) {
-                            this._pos = Math.min(this._pos + 1, this._list.length);
-                        }
-                    }
-                    var retained = this._retained;
-                    var item = retained.splice(oldIndex, 1)[0];
-                    retained.splice(newIndex, 0, item);
-                    if (!item) {
-                        delete retained[newIndex];
-                        item = cloneWithIndex(this._list, this._list.getItem(newIndex), newIndex);
-                    }
-                    item._moved = true;
-                    this._addRef(item, newIndex);
-                    this._endEdits();
-                },
-
-                _itemremoved: function (event) {
-                    var key = event.detail.key;
-                    var index = event.detail.index;
-                    this._updateAffectedRange(index, "removed");
-                    this._beginEdits(this._list.length + 1);
-                    if (index < this._pos) {
-                        this._pos = Math.max(-1, this._pos - 1);
-                    }
-                    var retained = this._retained;
-                    var retainedKeys = this._retainedKeys;
-                    var wasRetained = index in retained;
-                    retained.splice(index, 1);
-                    delete retainedKeys[key];
-                    var handler = this._notificationHandler;
-                    if (wasRetained && handler && handler.removed) {
-                        handler.removed(key, false);
-                    }
-                    this._endEdits();
-                },
-
-                _reload: function () {
-                    this._retained = [];
-                    this._retainedKeys = {};
-                    var handler = this._notificationHandler;
-                    if (handler && handler.reload) {
-                        handler.reload();
-                    }
-                },
-
-                _addRef: function (item, index) {
-                    if (index in this._retained) {
-                        this._retained[index]._retainedCount++;
-                    } else {
-                        this._retained[index] = item;
-                        this._retainedKeys[item.key] = item;
-                        item._retainedCount = 1;
-                    }
-                },
-                _release: function (item, index) {
-                    var retained = this._retained[index];
-                    if (retained) {
-                        if (retained._retainedCount === 1) {
-                            delete this._retained[index];
-                            delete this._retainedKeys[retained.key];
-                        } else {
-                            retained._retainedCount--;
-                        }
-                    }
-                },
-                _shouldNotify: function (index) {
-                    var retained = this._retained;
-                    return index in retained || index + 1 in retained || index - 1 in retained;
-                },
-
-                _updateAffectedRange: function ListBinding_updateAffectedRange(index, operation) {
-                    // Creates a range of affected indices [start, end).
-                    // Definition of _affectedRange.start: All items in the set of data with indices < _affectedRange.start have not been directly modified.
-                    // Definition of _affectedRange.end: All items in the set of data with indices >= _affectedRange.end have not been directly modified.
-
-                    if (!this._notificationHandler.affectedRange) {
-                        return;
-                    }
-
-                    //[newStart, newEnd)
-                    var newStart = index;
-                    var newEnd = (operation !== "removed") ?
-                        index + 1 : index;
-
-                    if (this._affectedRange) {
-                        switch (operation) {
-                            case "inserted":
-                                if (index <= this._affectedRange.end) {
-                                    ++this._affectedRange.end;
-                                }
-                                break;
-                            case "removed":
-                                if (index < this._affectedRange.end) {
-                                    --this._affectedRange.end;
-                                }
-                                break;
-                            case "moved":
-                            case "changed":
-                                break;
-                        }
-                        this._affectedRange.start = Math.min(this._affectedRange.start, newStart);
-                        this._affectedRange.end = Math.max(this._affectedRange.end, newEnd);
-                    } else {
-                        // Handle the initial state
-                        this._affectedRange = { start: newStart, end: newEnd };
-                    }
-                },
-
-                _notifyAffectedRange: function ListBinding_notifyAffectedRange() {
-                    if (this._affectedRange) {
-                        if (this._notificationHandler && this._notificationHandler.affectedRange) {
-                            this._notificationHandler.affectedRange(this._affectedRange);
-                        }
-                        // reset range
-                        this._affectedRange = null;
-                    }
-                },
-                _notifyCountChanged: function () {
-                    var oldCount = this._countAtBeginEdits;
-                    var newCount = this._list.length;
-                    if (oldCount !== newCount) {
-                        var handler = this._notificationHandler;
-                        if (handler && handler.countChanged) {
-                            handler.countChanged(newCount, oldCount);
-                        }
-                    }
-                },
-                _notifyIndicesChanged: function () {
-                    var retained = this._retained;
-                    for (var i = 0, len = retained.length; i < len; i++) {
-                        var item = retained[i];
-                        if (item && item.index !== i) {
-                            var newIndex = i;
-                            var oldIndex = item.index;
-                            item.index = newIndex;
-                            var handler = this._notificationHandler;
-                            if (handler && handler.indexChanged) {
-                                handler.indexChanged(item.key, newIndex, oldIndex);
-                            }
-                        }
-                    }
-                },
-                _notifyMoved: function () {
-                    var retained = this._retained;
-                    for (var i = 0, len = retained.length; i < len; i++) {
-                        var item = retained[i];
-                        if (item && item._moved) {
-                            item._moved = false;
-                            this._release(item, i);
-                            if (this._shouldNotify(i)) {
-                                var handler = this._notificationHandler;
-                                if (handler && handler.moved) {
-                                    handler.moved(
-                                        wrap(this, item),
-                                        findPreviousKey(this._list, i),
-                                        findNextKey(this._list, i)
-                                    );
-                                }
-                            }
-                        }
-                    }
-                },
-
-                _beginEdits: function (length, explicit) {
-                    this._editsCount++;
-                    var handler = this._notificationHandler;
-                    if (this._editsCount === 1 && handler) {
-                        if (!explicit) {
-                            // Batch all edits between now and the job running. This has the effect
-                            // of batching synchronous edits.
-                            //
-                            this._editsCount++;
-                            var that = this;
-                            Scheduler.schedule(function BindingList_async_batchedEdits() {
-                                that._endEdits();
-                            }, Scheduler.Priority.high, null, "WinJS.Binding.List._endEdits");
-                        }
-                        if (handler.beginNotifications) {
-                            handler.beginNotifications();
-                        }
-                        this._countAtBeginEdits = length;
-                    }
-                },
-                _endEdits: function () {
-                    this._editsCount--;
-                    var handler = this._notificationHandler;
-                    if (this._editsCount === 0 && handler) {
-                        this._notifyIndicesChanged();
-                        this._notifyMoved();
-                        this._notifyCountChanged();
-                        // It's important to notify the affectedRange after _notifyCountChanged since we expect developers
-                        // may take a dependancy on the count being up to date when they recieve the affected range.
-                        this._notifyAffectedRange();
-                        if (handler.endNotifications) {
-                            handler.endNotifications();
-                        }
-                    }
-                },
-
-                jumpToItem: function (item) {
-                    var index = this._list.indexOfKey(item.handle);
-                    if (index === -1) {
-                        return Promise.wrap(null);
-                    }
-                    this._pos = index;
-                    return this.current();
-                },
-                current: function () {
-                    return this.fromIndex(this._pos);
-                },
-                previous: function () {
-                    this._pos = Math.max(-1, this._pos - 1);
-                    return this._fromIndex(this._pos, true, "previous");
-                },
-                next: function () {
-                    this._pos = Math.min(this._pos + 1, this._list.length);
-                    return this._fromIndex(this._pos, true, "next");
-                },
-                releaseItem: function (item) {
-                    if (item.release) {
-                        item.release();
-                    } else {
-                        this._release(item, this._list.indexOfKey(item.key));
-                    }
-                },
-                release: function () {
-                    if (this._notificationHandler) {
-                        unsubscribe(this._list, this._handlers);
-                    }
-                    this._notificationHandler = null;
-                    this._dataSource._releaseBinding(this);
-                    this._released = true;
-                },
-                first: function () {
-                    return this.fromIndex(0);
-                },
-                last: function () {
-                    return this.fromIndex(this._list.length - 1);
-                },
-                fromKey: function (key) {
-                    var retainedKeys = this._retainedKeys;
-                    var item;
-                    if (key in retainedKeys) {
-                        item = retainedKeys[key];
-                    } else {
-                        item = cloneWithIndex(this._list, this._list.getItemFromKey(key), this._list.indexOfKey(key));
-                    }
-                    return wrap(this, item);
-                },
-                fromIndex: function (index) {
-                    return this._fromIndex(index, false, "fromIndex");
-                },
-                _fromIndex: function (index, async, name) {
-                    var retained = this._retained;
-                    var item;
-                    if (index in retained) {
-                        item = retained[index];
-                    } else {
-                        item = cloneWithIndex(this._list, this._list.getItem(index), index);
-                    }
-                    return async ? wrapAsync(this, item, name) : wrap(this, item);
-                },
-            }, {
-                supportedForProcessing: false,
-            });
-
-            function insertAtStart(unused, data) {
-                /*jshint validthis: true */
-                // List ignores the key because its key management is internal
-                this._list.unshift(data);
-                return this.itemFromIndex(0);
-            }
-            function insertBefore(unused, data, nextKey) {
-                /*jshint validthis: true */
-                // List ignores the key because its key management is internal
-                var index = this._list.indexOfKey(nextKey);
-                if (index === -1) {
-                    return errors.noLongerMeaningful;
-                }
-                this._list.splice(index, 0, data);
-                return this.itemFromIndex(index);
-            }
-            function insertAfter(unused, data, previousKey) {
-                /*jshint validthis: true */
-                // List ignores the key because its key management is internal
-                var index = this._list.indexOfKey(previousKey);
-                if (index === -1) {
-                    return errors.noLongerMeaningful;
-                }
-                index += 1;
-                this._list.splice(index, 0, data);
-                return this.itemFromIndex(index);
-            }
-            function insertAtEnd(unused, data) {
-                /*jshint validthis: true */
-                // List ignores the key because its key management is internal
-                this._list.push(data);
-                return this.itemFromIndex(this._list.length - 1);
-            }
-            function change(key, newData) {
-                /*jshint validthis: true */
-                var index = this._list.indexOfKey(key);
-                if (index === -1) {
-                    return errors.noLongerMeaningful;
-                }
-                this._list.setAt(index, newData);
-                return this.itemFromIndex(index);
-            }
-            function moveToStart(key) {
-                /*jshint validthis: true */
-                var sourceIndex = this._list.indexOfKey(key);
-                if (sourceIndex === -1) {
-                    return errors.noLongerMeaningful;
-                }
-                var targetIndex = 0;
-                this._list.move(sourceIndex, targetIndex);
-                return this.itemFromIndex(targetIndex);
-            }
-            function moveBefore(key, nextKey) {
-                /*jshint validthis: true */
-                var sourceIndex = this._list.indexOfKey(key);
-                var targetIndex = this._list.indexOfKey(nextKey);
-                if (sourceIndex === -1 || targetIndex === -1) {
-                    return errors.noLongerMeaningful;
-                }
-                targetIndex = sourceIndex < targetIndex ? targetIndex - 1 : targetIndex;
-                this._list.move(sourceIndex, targetIndex);
-                return this.itemFromIndex(targetIndex);
-            }
-            function moveAfter(key, previousKey) {
-                /*jshint validthis: true */
-                var sourceIndex = this._list.indexOfKey(key);
-                var targetIndex = this._list.indexOfKey(previousKey);
-                if (sourceIndex === -1 || targetIndex === -1) {
-                    return errors.noLongerMeaningful;
-                }
-                targetIndex = sourceIndex <= targetIndex ? targetIndex : targetIndex + 1;
-                this._list.move(sourceIndex, targetIndex);
-                return this.itemFromIndex(targetIndex);
-            }
-            function moveToEnd(key) {
-                /*jshint validthis: true */
-                var sourceIndex = this._list.indexOfKey(key);
-                if (sourceIndex === -1) {
-                    return errors.noLongerMeaningful;
-                }
-                var targetIndex = this._list.length - 1;
-                this._list.move(sourceIndex, targetIndex);
-                return this.itemFromIndex(targetIndex);
-            }
-            function remove(key) {
-                /*jshint validthis: true */
-                var index = this._list.indexOfKey(key);
-                if (index === -1) {
-                    return errors.noLongerMeaningful;
-                }
-                this._list.splice(index, 1);
-                return Promise.wrap();
-            }
-
-            var bindingId = 0;
-            var DataSource = _Base.Class.define(function DataSource_ctor(list) {
-                this._usingWeakRef = _WinRT.msSetWeakWinRTProperty && _WinRT.msGetWeakWinRTProperty;
-                this._bindings = {};
-                this._list = list;
-
-                if (list.unshift) {
-                    this.insertAtStart = insertAtStart;
-                }
-                if (list.push) {
-                    this.insertAtEnd = insertAtEnd;
-                }
-                if (list.setAt) {
-                    this.change = change;
-                }
-                if (list.splice) {
-                    this.insertAfter = insertAfter;
-                    this.insertBefore = insertBefore;
-                    this.remove = remove;
-                }
-                if (list.move) {
-                    this.moveAfter = moveAfter;
-                    this.moveBefore = moveBefore;
-                    this.moveToEnd = moveToEnd;
-                    this.moveToStart = moveToStart;
-                }
-            }, {
-                _releaseBinding: function (binding) {
-                    delete this._bindings[binding._id];
-                },
-
-                addEventListener: function () {
-                    // nop, we don't send statusChanged
-                },
-                removeEventListener: function () {
-                    // nop, we don't send statusChanged
-                },
-
-                createListBinding: function (notificationHandler) {
-                    var id = "ds_" + (++bindingId);
-                    var binding = new ListBinding(this, this._list, notificationHandler, id);
-                    binding._id = id;
-
-                    if (this._usingWeakRef) {
-                        _DomWeakRefTable._createWeakRef(binding, id);
-                        this._bindings[id] = id;
-                    } else {
-                        this._bindings[id] = binding;
-                    }
-
-                    return binding;
-                },
-
-                getCount: function () {
-                    return Promise.wrap(this._list.length);
-                },
-
-                itemFromKey: function (key) {
-                    // Clone with a dummy index
-                    var list = this._list,
-                        item = cloneWithIndex(list, list.getItemFromKey(key), -1);
-
-                    // Override the index property with a getter
-                    Object.defineProperty(item, "index", {
-                        get: function () {
-                            return list.indexOfKey(key);
-                        },
-                        enumerable: false,
-                        configurable: true
-                    });
-
-                    return Promise.wrap(item);
-                },
-                itemFromIndex: function (index) {
-                    return Promise.wrap(cloneWithIndex(this._list, this._list.getItem(index), index));
-                },
-
-                list: {
-                    get: function () { return this._list; }
-                },
-
-                beginEdits: function () {
-                    var length = this._list.length;
-                    this._forEachBinding(function (binding) {
-                        binding._beginEdits(length, true);
-                    });
-                },
-                endEdits: function () {
-                    this._forEachBinding(function (binding) {
-                        binding._endEdits();
-                    });
-                },
-                _forEachBinding: function (callback) {
-                    if (this._usingWeakRef) {
-                        var toBeDeleted = [];
-                        Object.keys(this._bindings).forEach(function (id) {
-                            var lb = _DomWeakRefTable._getWeakRefElement(id);
-                            if (lb) {
-                                callback(lb);
-                            } else {
-                                toBeDeleted.push(id);
-                            }
-                        });
-                        for (var i = 0, len = toBeDeleted.length; i < len; i++) {
-                            delete this._bindings[toBeDeleted[i]];
-                        }
-                    } else {
-                        var that = this;
-                        Object.keys(this._bindings).forEach(function (id) {
-                            callback(that._bindings[id]);
-                        });
-                    }
-                },
-
-                invalidateAll: function () {
-                    return Promise.wrap();
-                },
-
-                //
-                // insert* and change are not implemented as I don't understand how they are
-                //  used by the controls since it is hard to fathom how they would be able
-                //  to make up unique keys. Manual editing of the List is meant to go through
-                //  the list itself.
-                //
-                // move* are implemented only if the underlying list supports move(). The
-                //  GroupsListProjection for instance does not.
-                //
-                moveAfter: undefined,
-                moveBefore: undefined,
-                moveToEnd: undefined,
-                moveToStart: undefined
-
-            }, {
-                supportedForProcessing: false,
-            });
-            return DataSource;
-        })
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-
-// WinJS.Binding.List
-//
-define('WinJS/BindingList',[
-    'exports',
-    './Core/_Base',
-    './Core/_BaseUtils',
-    './Core/_ErrorFromName',
-    './Core/_Events',
-    './Core/_Resources',
-    './Binding/_Data',
-    './BindingList/_BindingListDataSource'
-    ], function listInit(exports, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _Data, _BindingListDataSource) {
-    "use strict";
-
-    var strings = {
-        get sparseArrayNotSupported() { return "Sparse arrays are not supported with proxy: true"; },
-        get illegalListLength() { return "List length must be assigned a finite positive number"; },
-    };
-
-    function copyargs(args) {
-        return Array.prototype.slice.call(args, 0);
-    }
-
-    function cloneItem(item) {
-        return {
-            handle: item.handle,
-            key: item.key,
-            data: item.data,
-            groupKey: item.groupKey,
-            groupSize: item.groupSize,
-            firstItemKey: item.firstItemKey,
-            firstItemIndexHint: item.firstItemIndexHint
-        };
-    }
-
-    function asNumber(n) {
-        return n === undefined ? undefined : +n;
-    }
-
-    var createEvent = _Events._createEventProperty;
-
-    var emptyOptions = {};
-
-    // We need a stable sort in order to implement SortedListProjection because we want to be able to
-    // perform insertions in a predictable location s.t. if we were to apply another sorted projection
-    // over the same list (now containing the inserted data) the resulting order would be the same.
-    //
-    function mergeSort(arr, sorter) {
-        var temp = new Array(arr.length);
-
-        function copyBack(start, end) {
-            for (; start < end; start++) {
-                arr[start] = temp[start];
-            }
-        }
-
-        function sort(start, end) {
-            if ((end - start) < 2) {
-                return;
-            }
-            var middle = Math.floor((end + start) / 2);
-            sort(start, middle);
-            sort(middle, end);
-            merge(start, middle, end);
-            copyBack(start, end);
-        }
-
-        function merge(start, middle, end) {
-            for (var left = start, right = middle, i = start; i < end; i++) {
-                if (left < middle && (right >= end || sorter(arr[left], arr[right]) <= 0)) {
-                    temp[i] = arr[left];
-                    left++;
-                } else {
-                    temp[i] = arr[right];
-                    right++;
-                }
-            }
-        }
-
-        sort(0, arr.length);
-
-        return arr;
-    }
-
-    // Private namespace used for local lazily init'd classes
-    var ns = _Base.Namespace.defineWithParent(null, null, {
-        ListBase: _Base.Namespace._lazy(function () {
-            var ListBase = _Base.Class.define(null, {
-                _annotateWithIndex: function (item, index) {
-                    var result = cloneItem(item);
-                    result.index = index;
-                    return result;
-                },
-
-                /// <field type="Function" locid="WinJS.Binding.ListBase.onitemchanged" helpKeyword="WinJS.Binding.ListBase.onitemchanged">
-                /// The value identified by the specified key has been replaced with a different value.
-                /// </field>
-                onitemchanged: createEvent("itemchanged"),
-
-                /// <field type="Function" locid="WinJS.Binding.ListBase.oniteminserted" helpKeyword="WinJS.Binding.ListBase.oniteminserted">
-                /// A new value has been inserted into the list.
-                /// </field>
-                oniteminserted: createEvent("iteminserted"),
-
-                /// <field type="Function" locid="WinJS.Binding.ListBase.onitemmoved" helpKeyword="WinJS.Binding.ListBase.onitemmoved">
-                /// The value identified by the specified key has been moved from one index in the list to another index.
-                /// </field>
-                onitemmoved: createEvent("itemmoved"),
-
-                /// <field type="Function" locid="WinJS.Binding.ListBase.onitemmutated" helpKeyword="WinJS.Binding.ListBase.onitemmutated">
-                /// The value identified by the specified key has been mutated.
-                /// </field>
-                onitemmutated: createEvent("itemmutated"),
-
-                /// <field type="Function" locid="WinJS.Binding.ListBase.onitemremoved" helpKeyword="WinJS.Binding.ListBase.onitemremoved">
-                /// The value identified by the specified key has been removed from the list.
-                /// </field>
-                onitemremoved: createEvent("itemremoved"),
-
-                /// <field type="Function" locid="WinJS.Binding.ListBase.onreload" helpKeyword="WinJS.Binding.ListBase.onreload">
-                /// The list has been refreshed. Any references to items in the list may be incorrect.
-                /// </field>
-                onreload: createEvent("reload"),
-
-                _notifyItemChanged: function (key, index, oldValue, newValue, oldItem, newItem) {
-                    if (this._listeners && this._listeners.itemchanged) {
-                        this.dispatchEvent("itemchanged", { key: key, index: index, oldValue: oldValue, newValue: newValue, oldItem: oldItem, newItem: newItem });
-                    }
-                },
-                _notifyItemInserted: function (key, index, value) {
-                    if (this._listeners && this._listeners.iteminserted) {
-                        this.dispatchEvent("iteminserted", { key: key, index: index, value: value });
-                    }
-                    var len = this.length;
-                    if (len !== this._lastNotifyLength) {
-                        this.notify("length", len, this._lastNotifyLength);
-                        this._lastNotifyLength = len;
-                    }
-                },
-                _notifyItemMoved: function (key, oldIndex, newIndex, value) {
-                    if (this._listeners && this._listeners.itemmoved) {
-                        this.dispatchEvent("itemmoved", { key: key, oldIndex: oldIndex, newIndex: newIndex, value: value });
-                    }
-                },
-                _notifyItemMutated: function (key, value, item) {
-                    if (this._listeners && this._listeners.itemmutated) {
-                        this.dispatchEvent("itemmutated", { key: key, value: value, item: item });
-                    }
-                },
-                _notifyItemRemoved: function (key, index, value, item) {
-                    if (this._listeners && this._listeners.itemremoved) {
-                        this.dispatchEvent("itemremoved", { key: key, index: index, value: value, item: item });
-                    }
-                    var len = this.length;
-                    if (len !== this._lastNotifyLength) {
-                        this.notify("length", len, this._lastNotifyLength);
-                        this._lastNotifyLength = len;
-                    }
-                },
-                _notifyReload: function () {
-                    if (this._listeners && this._listeners.reload) {
-                        this.dispatchEvent("reload");
-                    }
-                    if (len !== this._lastNotifyLength) {
-                        var len = this.length;
-                        this.notify("length", len, this._lastNotifyLength);
-                        this._lastNotifyLength = len;
-                    }
-                },
-
-                _normalizeIndex: function (index) {
-                    index = asNumber(index);
-                    return index < 0 ? this.length + index : index;
-                },
-
-                // ABSTRACT: length
-
-                // Notifications:
-                //
-                // ABSTRACT: notifyMutated: function (index)
-                _notifyMutatedFromKey: function (key) {
-                    var item = this.getItemFromKey(key);
-                    this._notifyItemMutated(key, item.data, item);
-                },
-                notifyReload: function () {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.notifyReload">
-                    /// <summary locid="WinJS.Binding.ListBase.notifyReload">
-                    /// Forces the list to send a reload notification to any listeners.
-                    /// </summary>
-                    /// </signature>
-                    this._notifyReload();
-                },
-
-                // NOTE: performance can be improved in a number of the projections by overriding getAt/_getArray/_getFromKey/_getKey
-                //
-                getAt: function (index) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.getAt">
-                    /// <summary locid="WinJS.Binding.ListBase.getAt">
-                    /// Gets the value at the specified index.
-                    /// </summary>
-                    /// <param name="index" type="Number" integer="true" locid="WinJS.Binding.ListBase.getAt_p:index">The index of the value to get.</param>
-                    /// <returns type="Object" mayBeNull="true" locid="WinJS.Binding.ListBase.getAt_returnValue">The value at the specified index.</returns>
-                    /// </signature>
-                    index = asNumber(index);
-                    var item = this.getItem(index);
-                    return item && item.data;
-                },
-                // returns [ data* ]
-                _getArray: function () {
-                    var results = new Array(this.length);
-                    for (var i = 0, len = this.length; i < len; i++) {
-                        var item = this.getItem(i);
-                        if (item) {
-                            results[i] = item.data;
-                        }
-                    }
-                    return results;
-                },
-                // returns data
-                _getFromKey: function (key) {
-                    var item = this.getItemFromKey(key);
-                    return item && item.data;
-                },
-                // ABSTRACT: getItem(index)
-                // ABSTRACT: getItemFromKey(key)
-                // returns string
-                _getKey: function (index) {
-                    index = asNumber(index);
-                    var item = this.getItem(index);
-                    return item && item.key;
-                },
-
-                // Normal list non-modifiying operations
-                //
-                concat: function () {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.concat">
-                    /// <summary locid="WinJS.Binding.ListBase.concat">
-                    /// Returns a new list consisting of a combination of two arrays.
-                    /// </summary>
-                    /// <parameter name="item" type="Object" optional="true" parameterArray="true">Additional items to add to the end of the list.</parameter>
-                    /// <returns type="Array" locid="WinJS.Binding.ListBase.concat_returnValue">An array containing the concatenation of the list and any other supplied items.</returns>
-                    /// </signature>
-                    var a = this._getArray();
-                    return a.concat.apply(a, arguments);
-                },
-                join: function (separator) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.join">
-                    /// <summary locid="WinJS.Binding.ListBase.join">
-                    /// Returns a string consisting of all the elements of a list separated by the specified separator string.
-                    /// </summary>
-                    /// <param name="separator" type="String" optional="true" locid="WinJS.Binding.ListBase.join_p:separator">A string used to separate the elements of a list. If this parameter is omitted, the list elements are separated with a comma.</param>
-                    /// <returns type="String" locid="WinJS.Binding.ListBase.join_returnValue">The elements of a list separated by the specified separator string.</returns>
-                    /// </signature>
-                    return this._getArray().join(separator || ",");
-                },
-                slice: function (begin, end) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.slice">
-                    /// <summary locid="WinJS.Binding.ListBase.slice">
-                    /// Extracts a section of a list and returns a new list.
-                    /// </summary>
-                    /// <param name="begin" type="Number" integer="true" locid="WinJS.Binding.ListBase.slice_p:begin">The index that specifies the beginning of the section.</param>
-                    /// <param name="end" type="Number" integer="true" optional="true" locid="WinJS.Binding.ListBase.slice_p:end">The index that specifies the end of the section.</param>
-                    /// <returns type="Array" locid="WinJS.Binding.ListBase.slice_returnValue">Returns a section of an array.</returns>
-                    /// </signature>
-                    return this._getArray().slice(begin, end);
-                },
-                indexOf: function (searchElement, fromIndex) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.indexOf">
-                    /// <summary locid="WinJS.Binding.ListBase.indexOf">
-                    /// Gets the index of the first occurrence of the specified value in a list.
-                    /// </summary>
-                    /// <param name="searchElement" type="Object" locid="WinJS.Binding.ListBase.indexOf_p:searchElement">The value to locate in the list.</param>
-                    /// <param name="fromIndex" type="Number" integer="true" optional="true" locid="WinJS.Binding.ListBase.indexOf_p:fromIndex">The index at which to begin the search. If fromIndex is omitted, the search starts at index 0.</param>
-                    /// <returns type="Number" integer="true" locid="WinJS.Binding.ListBase.indexOf_returnValue">Index of the first occurrence of a value in a list or -1 if not found.</returns>
-                    /// </signature>
-                    fromIndex = asNumber(fromIndex);
-                    fromIndex = Math.max(0, this._normalizeIndex(fromIndex) || 0);
-                    for (var i = fromIndex, len = this.length; i < len; i++) {
-                        var item = this.getItem(i);
-                        if (item && item.data === searchElement) {
-                            return i;
-                        }
-                    }
-                    return -1;
-                },
-                // ABSTRACT: indexOfKey(key)
-                lastIndexOf: function (searchElement, fromIndex) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.lastIndexOf">
-                    /// <summary locid="WinJS.Binding.ListBase.lastIndexOf">
-                    /// Gets the index of the last occurrence of the specified value in a list.
-                    /// </summary>
-                    /// <param name="searchElement" type="Object" locid="WinJS.Binding.ListBase.lastIndexOf_p:searchElement">The value to locate in the list.</param>
-                    /// <param name="fromIndex" type="Number" integer="true" optional="true" locid="WinJS.Binding.ListBase.lastIndexOf_p:fromIndex">The index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the list.</param>
-                    /// <returns type="Number" integer="true" locid="WinJS.Binding.ListBase.lastIndexOf_returnValue">The index of the last occurrence of a value in a list, or -1 if not found.</returns>
-                    /// </signature>
-                    fromIndex = asNumber(fromIndex);
-                    var length = this.length;
-                    fromIndex = Math.min(this._normalizeIndex(fromIndex !== undefined ? fromIndex : length), length - 1);
-                    var i;
-                    for (i = fromIndex; i >= 0; i--) {
-                        var item = this.getItem(i);
-                        if (item && item.data === searchElement) {
-                            return i;
-                        }
-                    }
-                    return -1;
-                },
-
-                //
-                // Normal list projection operations
-                //
-
-                every: function (callback, thisArg) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.every">
-                    /// <summary locid="WinJS.Binding.ListBase.every">
-                    /// Checks whether the specified callback function returns true for all elements in a list.
-                    /// </summary>
-                    /// <param name="callback" type="Function" locid="WinJS.Binding.ListBase.every_p:callback">A function that accepts up to three arguments. This function is called for each element in the list until it returns false or the end of the list is reached.</param>
-                    /// <param name="thisArg" type="Object" optional="true" locid="WinJS.Binding.ListBase.every_p:thisArg">An object to which the this keyword can refer in the callback function. If thisArg is omitted, undefined is used.</param>
-                    /// <returns type="Boolean" locid="WinJS.Binding.ListBase.every_returnValue">True if the callback returns true for all elements in the list.</returns>
-                    /// </signature>
-                    return this._getArray().every(callback, thisArg);
-                },
-                filter: function (callback, thisArg) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.filter">
-                    /// <summary locid="WinJS.Binding.ListBase.filter">
-                    /// Returns the elements of a list that meet the condition specified in a callback function.
-                    /// </summary>
-                    /// <param name="callback" type="Function" locid="WinJS.Binding.ListBase.filter_p:callback">A function that accepts up to three arguments. The function is called for each element in the list.</param>
-                    /// <param name="thisArg" type="Object" optional="true" locid="WinJS.Binding.ListBase.filter_p:thisArg">An object to which the this keyword can refer in the callback function. If thisArg is omitted, undefined is used.</param>
-                    /// <returns type="Array" locid="WinJS.Binding.ListBase.filter_returnValue">An array containing the elements that meet the condition specified in the callback function.</returns>
-                    /// </signature>
-                    return this._getArray().filter(callback, thisArg);
-                },
-                forEach: function (callback, thisArg) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.forEach">
-                    /// <summary locid="WinJS.Binding.ListBase.forEach">
-                    /// Calls the specified callback function for each element in a list.
-                    /// </summary>
-                    /// <param name="callback" type="Function" locid="WinJS.Binding.ListBase.forEach_p:callback">A function that accepts up to three arguments. The function is called for each element in the list.</param>
-                    /// <param name="thisArg" type="Object" optional="true" locid="WinJS.Binding.ListBase.forEach_p:thisArg">An object to which the this keyword can refer in the callback function. If thisArg is omitted, undefined is used.</param>
-                    /// </signature>
-                    this._getArray().forEach(callback, thisArg);
-                },
-                map: function (callback, thisArg) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.map">
-                    /// <summary locid="WinJS.Binding.ListBase.map">
-                    /// Calls the specified callback function on each element of a list, and returns an array that contains the results.
-                    /// </summary>
-                    /// <param name="callback" type="Function" locid="WinJS.Binding.ListBase.map_p:callback">A function that accepts up to three arguments. The function is called for each element in the list.</param>
-                    /// <param name="thisArg" type="Object" optional="true" locid="WinJS.Binding.ListBase.map_p:thisArg">An object to which the this keyword can refer in the callback function. If thisArg is omitted, undefined is used.</param>
-                    /// <returns type="Array" locid="WinJS.Binding.ListBase.map_returnValue">An array containing the result of calling the callback function on each element in the list.</returns>
-                    /// </signature>
-                    return this._getArray().map(callback, thisArg);
-                },
-                some: function (callback, thisArg) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.some">
-                    /// <summary locid="WinJS.Binding.ListBase.some">
-                    /// Checks whether the specified callback function returns true for any element of a list.
-                    /// </summary>
-                    /// <param name="callback" type="Function" locid="WinJS.Binding.ListBase.some_p:callback">A function that accepts up to three arguments. The function is called for each element in the list until it returns true, or until the end of the list.</param>
-                    /// <param name="thisArg" type="Object" optional="true" locid="WinJS.Binding.ListBase.some_p:thisArg">An object to which the this keyword can refer in the callback function. If thisArg is omitted, undefined is used.</param>
-                    /// <returns type="Boolean" locid="WinJS.Binding.ListBase.some_returnValue">True if callback returns true for any element in the list.</returns>
-                    /// </signature>
-                    return this._getArray().some(callback, thisArg);
-                },
-                reduce: function (callback, initialValue) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.reduce">
-                    /// <summary locid="WinJS.Binding.ListBase.reduce">
-                    /// Accumulates a single result by calling the specified callback function for all elements in a list. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
-                    /// </summary>
-                    /// <param name="callback" type="Function" locid="WinJS.Binding.ListBase.reduce_p:callback">A function that accepts up to four arguments. The function is called for each element in the list.</param>
-                    /// <param name="initialValue" type="Object" optional="true" locid="WinJS.Binding.ListBase.reduce_p:initialValue">If initialValue is specified, it is used as the value with which to start the accumulation. The first call to the function provides this value as an argument instead of a list value.</param>
-                    /// <returns type="Object" locid="WinJS.Binding.ListBase.reduce_returnValue">The return value from the last call to the callback function.</returns>
-                    /// </signature>
-                    if (arguments.length > 1) {
-                        return this._getArray().reduce(callback, initialValue);
-                    }
-                    return this._getArray().reduce(callback);
-                },
-                reduceRight: function (callback, initialValue) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.reduceRight">
-                    /// <summary locid="WinJS.Binding.ListBase.reduceRight">
-                    /// Accumulates a single result by calling the specified callback function for all elements in a list, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
-                    /// </summary>
-                    /// <param name="callback" type="Function" locid="WinJS.Binding.ListBase.reduceRight_p:callback">A function that accepts up to four arguments. The function is called for each element in the list.</param>
-                    /// <param name="initialValue" type="Object" optional="true" locid="WinJS.Binding.ListBase.reduceRight_p:initialValue">If initialValue is specified, it is used as the value with which to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of a list value.</param>
-                    /// <returns type="Object" locid="WinJS.Binding.ListBase.reduceRight_returnValue">The return value from last call to callback function.</returns>
-                    /// </signature>
-                    if (arguments.length > 1) {
-                        return this._getArray().reduceRight(callback, initialValue);
-                    }
-                    return this._getArray().reduceRight(callback);
-                },
-
-                //
-                // Live Projections - if you want the lifetime of the returned projections to
-                //  be shorter than that of the list object on which they are based you have
-                //  to remember to call .dispose() on them when done.
-                //
-
-                createFiltered: function (predicate) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.createFiltered">
-                    /// <summary locid="WinJS.Binding.ListBase.createFiltered">
-                    /// Creates a live filtered projection over this list. As the list changes, the filtered projection reacts to those changes and may also change.
-                    /// </summary>
-                    /// <param name="predicate" type="Function" locid="WinJS.Binding.ListBase.createFiltered_p:predicate">A function that accepts a single argument. The createFiltered function calls the callback with each element in the list. If the function returns true, that element will be included in the filtered list.</param>
-                    /// <returns type="WinJS.Binding.List" locid="WinJS.Binding.ListBase.createFiltered_returnValue">Filtered projection over the list.</returns>
-                    /// </signature>
-                    return new ns.FilteredListProjection(this, predicate);
-                },
-                createGrouped: function (groupKey, groupData, groupSorter) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.createGrouped">
-                    /// <summary locid="WinJS.Binding.ListBase.createGrouped">
-                    /// Creates a live grouped projection over this list. As the list changes, the grouped projection reacts to those changes and may also change. The grouped projection sorts all the elements of the list to be in group-contiguous order. The grouped projection also contains a .groups property which is a WinJS.Binding.List representing the groups that were found in the list.
-                    /// </summary>
-                    /// <param name="groupKey" type="Function" locid="WinJS.Binding.ListBase.createGrouped_p:groupKey">A function that accepts a single argument. The function is called with each element in the list, the function should return a string representing the group containing the element.</param>
-                    /// <param name="groupData" type="Function" locid="WinJS.Binding.ListBase.createGrouped_p:groupData">A function that accepts a single argument. The function is called on an element in the list for each group. It should return the value that should be set as the data of the .groups list element for this group.</param>
-                    /// <param name="groupSorter" type="Function" optional="true" locid="WinJS.Binding.ListBase.createGrouped_p:groupSorter">A function that accepts two arguments. The function is called with the key of groups found in the list. It must return one of the following numeric values: negative if the first argument is less than the second, zero if the two arguments are equivalent, positive if the first argument is greater than the second. If omitted, the groups are sorted in ascending, ASCII character order.</param>
-                    /// <returns type="WinJS.Binding.List" locid="WinJS.Binding.ListBase.createGrouped_returnValue">A grouped projection over the list.</returns>
-                    /// </signature>
-                    return new ns.GroupedSortedListProjection(this, groupKey, groupData, groupSorter);
-                },
-                createSorted: function (sorter) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBase.createSorted">
-                    /// <summary locid="WinJS.Binding.ListBase.createSorted">
-                    /// Creates a live sorted projection over this list. As the list changes, the sorted projection reacts to those changes and may also change.
-                    /// </summary>
-                    /// <param name="sorter" type="Function" locid="WinJS.Binding.ListBase.createSorted_p:sorter">A function that accepts two arguments. The function is called with elements in the list. It must return one of the following numeric values: negative if the first argument is less than the second, zero if the two arguments are equivalent, positive if the first argument is greater than the second.</param>
-                    /// <returns type="WinJS.Binding.List" locid="WinJS.Binding.ListBase.createSorted_returnValue">A sorted projection over the list.</returns>
-                    /// </signature>
-                    return new ns.SortedListProjection(this, sorter);
-                },
-
-                dataSource: {
-                    get: function () {
-                        return (this._dataSource = this._dataSource || new _BindingListDataSource._BindingListDataSource(this));
-                    }
-                },
-
-            }, {
-                supportedForProcessing: false,
-            });
-            _Base.Class.mix(ListBase, _Data.observableMixin);
-            _Base.Class.mix(ListBase, _Events.eventMixin);
-            return ListBase;
-        }),
-
-        ListBaseWithMutators: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(ns.ListBase, null, {
-                // ABSTRACT: setAt(index, value)
-
-                // Normal list modifying operations
-                //
-                // returns data from tail of list
-                pop: function () {
-                    /// <signature helpKeyword="WinJS.Binding.ListBaseWithMutators.pop">
-                    /// <summary locid="WinJS.Binding.ListBaseWithMutators.pop">
-                    /// Removes the last element from a list and returns it.
-                    /// </summary>
-                    /// <returns type="Object" locid="WinJS.Binding.ListBaseWithMutators.pop_returnValue">Last element from the list.</returns>
-                    /// </signature>
-                    return this.splice(-1, 1)[0];
-                },
-                push: function (value) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBaseWithMutators.push">
-                    /// <summary locid="WinJS.Binding.ListBaseWithMutators.push">
-                    /// Appends new element(s) to a list, and returns the new length of the list.
-                    /// </summary>
-                    /// <param name="value" type="Object" parameterArray="true" locid="WinJS.Binding.ListBaseWithMutators.push_p:value">The element to insert at the end of the list.</param>
-                    /// <returns type="Number" integer="true" locid="WinJS.Binding.ListBaseWithMutators.push_returnValue">The new length of the list.</returns>
-                    /// </signature>
-                    if (arguments.length === 1) {
-                        this.splice(this.length, 0, value);
-                        return this.length;
-                    } else {
-                        var args = copyargs(arguments);
-                        args.splice(0, 0, this.length, 0);
-                        this.splice.apply(this, args);
-                        return this.length;
-                    }
-                },
-                // returns data from head of list
-                shift: function () {
-                    /// <signature helpKeyword="WinJS.Binding.ListBaseWithMutators.shift">
-                    /// <summary locid="WinJS.Binding.ListBaseWithMutators.shift">
-                    /// Removes the first element from a list and returns it.
-                    /// </summary>
-                    /// <returns type="Object" locid="WinJS.Binding.ListBaseWithMutators.shift_returnValue">First element from the list.</returns>
-                    /// </signature>
-                    return this.splice(0, 1)[0];
-                },
-                unshift: function (value) {
-                    /// <signature helpKeyword="WinJS.Binding.ListBaseWithMutators.unshift">
-                    /// <summary locid="WinJS.Binding.ListBaseWithMutators.unshift">
-                    /// Appends new element(s) to a list, and returns the new length of the list.
-                    /// </summary>
-                    /// <param name="value" type="Object" parameterArray="true" locid="WinJS.Binding.ListBaseWithMutators.unshift_p:value">The element to insert at the start of the list.</param>
-                    /// <returns type="Number" integer="true" locid="WinJS.Binding.ListBaseWithMutators.unshift_returnValue">The new length of the list.</returns>
-                    /// </signature>
-                    if (arguments.length === 1) {
-                        this.splice(0, 0, value);
-                    } else {
-                        var args = copyargs(arguments);
-                        // Wow, this looks weird. Insert 0, 0 at the beginning of splice.
-                        args.splice(0, 0, 0, 0);
-                        this.splice.apply(this, args);
-                    }
-                    return this.length;
-                }
-
-                // ABSTRACT: splice(index, howMany, values...)
-                // ABSTRACT: _spliceFromKey(key, howMany, values...)
-            }, {
-                supportedForProcessing: false,
-            });
-        }),
-
-        ListProjection: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(ns.ListBaseWithMutators, null, {
-                _list: null,
-                _myListeners: null,
-
-                _addListListener: function (name, func) {
-                    var l = { name: name, handler: func.bind(this) };
-                    this._myListeners = this._myListeners || [];
-                    this._myListeners.push(l);
-                    this._list.addEventListener(name, l.handler);
-                },
-
-                // ABSTRACT: _listReload()
-
-                dispose: function () {
-                    /// <signature helpKeyword="WinJS.Binding.ListProjection.dispose">
-                    /// <summary locid="WinJS.Binding.ListProjection.dispose">
-                    /// Disconnects this WinJS.Binding.List projection from its underlying WinJS.Binding.List. This is important only if they have different lifetimes.
-                    /// </summary>
-                    /// </signature>
-                    var list = this._list;
-
-                    var listeners = this._myListeners;
-                    this._myListeners = [];
-
-                    for (var i = 0, len = listeners.length; i < len; i++) {
-                        var l = listeners[i];
-                        list.removeEventListener(l.name, l.handler);
-                    }
-
-                    // Set this to an empty list and tell everyone that they need to reload to avoid
-                    //  consumers null-refing on an empty list.
-                    this._list = new exports.List();
-                    this._listReload();
-                },
-
-                getItemFromKey: function (key) {
-                    /// <signature helpKeyword="WinJS.Binding.ListProjection.getItemFromKey">
-                    /// <summary locid="WinJS.Binding.ListProjection.getItemFromKey">
-                    /// Gets a key/data pair for the specified key.
-                    /// </summary>
-                    /// <param name="key" type="String" locid="WinJS.Binding.ListProjection.getItemFromKey_p:key">The key of the value to retrieve.</param>
-                    /// <returns type="Object" locid="WinJS.Binding.ListProjection.getItemFromKey_returnValue">An object with .key and .data properties.</returns>
-                    /// </signature>
-                    return this._list.getItemFromKey(key);
-                },
-
-                move: function (index, newIndex) {
-                    /// <signature helpKeyword="WinJS.Binding.ListProjection.move">
-                    /// <summary locid="WinJS.Binding.ListProjection.move">
-                    /// Moves the value at index to position newIndex.
-                    /// </summary>
-                    /// <param name="index" type="Number" integer="true" locid="WinJS.Binding.ListProjection.move_p:index">The original index of the value.</param>
-                    /// <param name="newIndex" type="Number" integer="true" locid="WinJS.Binding.ListProjection.move_p:newIndex">The index of the value after the move.</param>
-                    /// </signature>
-                    index = asNumber(index);
-                    newIndex = asNumber(newIndex);
-                    if (index === newIndex || index < 0 || newIndex < 0 || index >= this.length || newIndex >= this.length) {
-                        return;
-                    }
-                    index = this._list.indexOfKey(this._getKey(index));
-                    newIndex = this._list.indexOfKey(this._getKey(newIndex));
-                    this._list.move(index, newIndex);
-                },
-
-                _notifyMutatedFromKey: function (key) {
-                    this._list._notifyMutatedFromKey(key);
-                },
-
-                splice: function (index, howMany, item) {
-                    /// <signature helpKeyword="WinJS.Binding.ListProjection.splice">
-                    /// <summary locid="WinJS.Binding.ListProjection.splice">
-                    /// Removes elements from a list and, if necessary, inserts new elements in their place, returning the deleted elements.
-                    /// </summary>
-                    /// <param name="start" type="Number" integer="true" locid="WinJS.Binding.ListProjection.splice_p:start">The zero-based location in the list from which to start removing elements.</param>
-                    /// <param name="howMany" type="Number" integer="true" locid="WinJS.Binding.ListProjection.splice_p:howMany">The number of elements to remove.</param>
-                    /// <param name="item" type="Object" optional="true" parameterArray="true" locid="WinJS.Binding.ListProjection.splice_p:item">The elements to insert into the list in place of the deleted elements.</param>
-                    /// <returns type="Array" locid="WinJS.Binding.ListProjection.splice_returnValue">The deleted elements.</returns>
-                    /// </signature>
-                    index = asNumber(index);
-                    index = Math.max(0, this._normalizeIndex(index));
-                    var args = copyargs(arguments);
-                    if (index === this.length) {
-                        // In order to getAt the tail right we just push on to the end of the underlying list
-                        args[0] = this._list.length;
-                        return this._list.splice.apply(this._list, args);
-                    } else {
-                        args[0] = this._getKey(index);
-                        return this._spliceFromKey.apply(this, args);
-                    }
-                },
-
-                _setAtKey: function (key, value) {
-                    this._list._setAtKey(key, value);
-                },
-
-            }, {
-                supportedForProcessing: false,
-            });
-        }),
-
-        FilteredListProjection: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(ns.ListProjection, function (list, filter) {
-                this._list = list;
-                this._addListListener("itemchanged", this._listItemChanged);
-                this._addListListener("iteminserted", this._listItemInserted);
-                this._addListListener("itemmutated", this._listItemMutated);
-                this._addListListener("itemmoved", this._listItemMoved);
-                this._addListListener("itemremoved", this._listItemRemoved);
-                this._addListListener("reload", this._listReload);
-                this._filter = filter;
-                this._initFilteredKeys();
-            }, {
-                _filter: null,
-                _filteredKeys: null,
-                _initFilteredKeys: function () {
-                    var filter = this._filter;
-                    var list = this._list;
-                    var keys = [];
-                    for (var i = 0, len = list.length; i < len; i++) {
-                        var item = list.getItem(i);
-                        if (item && filter(item.data)) {
-                            keys.push(item.key);
-                        }
-                    }
-                    this._filteredKeys = keys;
-                },
-
-                _findInsertionPosition: function (key, index) {
-                    // find the spot to insert this by identifing the previous element in the list
-                    var filter = this._filter;
-                    var previousKey;
-                    while ((--index) >= 0) {
-                        var item = this._list.getItem(index);
-                        if (item && filter(item.data)) {
-                            previousKey = item.key;
-                            break;
-                        }
-                    }
-                    var filteredKeys = this._filteredKeys;
-                    var filteredIndex = previousKey ? (filteredKeys.indexOf(previousKey) + 1) : 0;
-                    return filteredIndex;
-                },
-
-                _listItemChanged: function (event) {
-                    var key = event.detail.key;
-                    var index = event.detail.index;
-                    var oldValue = event.detail.oldValue;
-                    var newValue = event.detail.newValue;
-                    var oldItem = event.detail.oldItem;
-                    var newItem = event.detail.newItem;
-                    var filter = this._filter;
-                    var oldInFilter = filter(oldValue);
-                    var newInFilter = filter(newValue);
-                    if (oldInFilter && newInFilter) {
-                        var filteredKeys = this._filteredKeys;
-                        var filteredIndex = filteredKeys.indexOf(key);
-                        this._notifyItemChanged(key, filteredIndex, oldValue, newValue, oldItem, newItem);
-                    } else if (oldInFilter && !newInFilter) {
-                        this._listItemRemoved({ detail: { key: key, index: index, value: oldValue, item: oldItem } });
-                    } else if (!oldInFilter && newInFilter) {
-                        this._listItemInserted({ detail: { key: key, index: index, value: newValue } });
-                    }
-                },
-                _listItemInserted: function (event) {
-                    var key = event.detail.key;
-                    var index = event.detail.index;
-                    var value = event.detail.value;
-                    var filter = this._filter;
-                    if (filter(value)) {
-                        var filteredIndex = this._findInsertionPosition(key, index);
-                        var filteredKeys = this._filteredKeys;
-                        filteredKeys.splice(filteredIndex, 0, key);
-                        this._notifyItemInserted(key, filteredIndex, value);
-                    }
-                },
-                _listItemMoved: function (event) {
-                    var key = event.detail.key;
-                    var newIndex = event.detail.newIndex;
-                    var value = event.detail.value;
-                    var filteredKeys = this._filteredKeys;
-                    var oldFilteredIndex = filteredKeys.indexOf(key);
-                    if (oldFilteredIndex !== -1) {
-                        filteredKeys.splice(oldFilteredIndex, 1);
-                        var newFilteredIndex = this._findInsertionPosition(key, newIndex);
-                        filteredKeys.splice(newFilteredIndex, 0, key);
-                        this._notifyItemMoved(key, oldFilteredIndex, newFilteredIndex, value);
-                    }
-                },
-                _listItemMutated: function (event) {
-                    var key = event.detail.key;
-                    var value = event.detail.value;
-                    var item = event.detail.item;
-                    var filter = this._filter;
-                    var filteredKeys = this._filteredKeys;
-                    var filteredIndex = filteredKeys.indexOf(key);
-                    var oldInFilter = filteredIndex !== -1;
-                    var newInFilter = filter(value);
-                    if (oldInFilter && newInFilter) {
-                        this._notifyItemMutated(key, value, item);
-                    } else if (oldInFilter && !newInFilter) {
-                        filteredKeys.splice(filteredIndex, 1);
-                        this._notifyItemRemoved(key, filteredIndex, value, item);
-                    } else if (!oldInFilter && newInFilter) {
-                        this._listItemInserted({ detail: { key: key, index: this._list.indexOfKey(key), value: value } });
-                    }
-                },
-                _listItemRemoved: function (event) {
-                    var key = event.detail.key;
-                    var value = event.detail.value;
-                    var item = event.detail.item;
-                    var filteredKeys = this._filteredKeys;
-                    var filteredIndex = filteredKeys.indexOf(key);
-                    if (filteredIndex !== -1) {
-                        filteredKeys.splice(filteredIndex, 1);
-                        this._notifyItemRemoved(key, filteredIndex, value, item);
-                    }
-                },
-                _listReload: function () {
-                    this._initFilteredKeys();
-                    this._notifyReload();
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.Binding.FilteredListProjection.length" helpKeyword="WinJS.Binding.FilteredListProjection.length">Returns an integer value one higher than the highest element defined in an list.</field>
-                length: {
-                    get: function () { return this._filteredKeys.length; },
-                    set: function (value) {
-                        if (typeof value === "number" && value >= 0) {
-                            var current = this.length;
-                            if (current > value) {
-                                this.splice(value, current - value);
-                            }
-                        } else {
-                            throw new _ErrorFromName("WinJS.Binding.List.IllegalLength", strings.illegalListLength);
-                        }
-                    }
-                },
-
-                getItem: function (index) {
-                    /// <signature helpKeyword="WinJS.Binding.FilteredListProjection.getItem">
-                    /// <summary locid="WinJS.Binding.FilteredListProjection.getItem">
-                    /// Returns a key/data pair for the specified index.
-                    /// </summary>
-                    /// <param name="index" type="Number" integer="true" locid="WinJS.Binding.FilteredListProjection.getItem_p:index">The index of the value to retrieve.</param>
-                    /// <returns type="Object" locid="WinJS.Binding.FilteredListProjection.getItem_returnValue">An object with .key and .data properties.</returns>
-                    /// </signature>
-                    index = asNumber(index);
-                    return this.getItemFromKey(this._filteredKeys[index]);
-                },
-
-                indexOfKey: function (key) {
-                    /// <signature helpKeyword="WinJS.Binding.FilteredListProjection.indexOfKey">
-                    /// <summary locid="WinJS.Binding.FilteredListProjection.indexOfKey">
-                    /// Returns the index of the first occurrence of a key in a list.
-                    /// </summary>
-                    /// <param name="key" type="String" locid="WinJS.Binding.FilteredListProjection.indexOfKey_p:key">The key to locate in the list.</param>
-                    /// <returns type="Number" integer="true" locid="WinJS.Binding.FilteredListProjection.indexOfKey_returnValue">The index of the first occurrence of a key in a list, or -1 if not found.</returns>
-                    /// </signature>
-                    return this._filteredKeys.indexOf(key);
-                },
-
-                notifyMutated: function (index) {
-                    /// <signature helpKeyword="WinJS.Binding.FilteredListProjection.notifyMutated">
-                    /// <summary locid="WinJS.Binding.FilteredListProjection.notifyMutated">
-                    /// Forces the list to send a itemmutated notification to any listeners for the value at the specified index.
-                    /// </summary>
-                    /// <param name="index" type="Number" integer="true" locid="WinJS.Binding.FilteredListProjection.notifyMutated_p:index">The index of the value that was mutated.</param>
-                    /// </signature>
-                    index = asNumber(index);
-                    return this._notifyMutatedFromKey(this._filteredKeys[index]);
-                },
-
-                setAt: function (index, value) {
-                    /// <signature helpKeyword="WinJS.Binding.FilteredListProjection.setAt">
-                    /// <summary locid="WinJS.Binding.FilteredListProjection.setAt">
-                    /// Replaces the value at the specified index with a new value.
-                    /// </summary>
-                    /// <param name="index" type="Number" integer="true" locid="WinJS.Binding.FilteredListProjection.setAt_p:index">The index of the value that was replaced.</param>
-                    /// <param name="newValue" type="Object" locid="WinJS.Binding.FilteredListProjection.setAt_p:newValue">The new value.</param>
-                    /// </signature>
-                    index = asNumber(index);
-                    this._setAtKey(this._filteredKeys[index], value);
-                },
-
-                // returns [ data* ] of removed items
-                _spliceFromKey: function (key, howMany) {
-                    // first add in all the new items if we have any, this should serve to push key to the right
-                    if (arguments.length > 2) {
-                        var args = copyargs(arguments);
-                        args[1] = 0; // howMany
-                        this._list._spliceFromKey.apply(this._list, args);
-                    }
-                    // now we can remove anything that needs to be removed, since they are not necessarially contiguous
-                    // in the underlying list we remove them one by one.
-                    var result = [];
-                    if (howMany) {
-                        var keysToRemove = [];
-                        var filteredKeys = this._filteredKeys;
-                        var filteredKeyIndex = filteredKeys.indexOf(key);
-                        for (var i = filteredKeyIndex, len = filteredKeys.length; i < len && (i - filteredKeyIndex) < howMany; i++) {
-                            var key = filteredKeys[i];
-                            keysToRemove.push(key);
-                        }
-                        var that = this;
-                        keysToRemove.forEach(function (key) {
-                            result.push(that._list._spliceFromKey(key, 1)[0]);
-                        });
-                    }
-                    return result;
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-        }),
-
-        SortedListProjection: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(ns.ListProjection, function (list, sortFunction) {
-                this._list = list;
-                this._addListListener("itemchanged", this._listItemChanged);
-                this._addListListener("iteminserted", this._listItemInserted);
-                this._addListListener("itemmoved", this._listItemMoved);
-                this._addListListener("itemmutated", this._listItemMutated);
-                this._addListListener("itemremoved", this._listItemRemoved);
-                this._addListListener("reload", this._listReload);
-                this._sortFunction = sortFunction;
-                this._initSortedKeys();
-            }, {
-                _sortFunction: null,
-                _sortedKeys: null,
-                _initSortedKeys: function () {
-                    var list = this._list;
-                    var keys = [];
-                    for (var i = 0, len = list.length; i < len; i++) {
-                        var item = list.getItem(i);
-                        if (item) {
-                            keys[i] = item.key;
-                        }
-                    }
-                    var sorter = this._sortFunction;
-                    var sorted = mergeSort(keys, function (l, r) {
-                        l = list.getItemFromKey(l).data;
-                        r = list.getItemFromKey(r).data;
-                        return sorter(l, r);
-                    });
-                    this._sortedKeys = sorted;
-                },
-
-                _findInsertionPos: function (key, index, value, startingMin, startingMax) {
-                    var sorter = this._sortFunction;
-                    var sortedKeys = this._sortedKeys;
-                    var min = Math.max(0, startingMin || -1);
-                    var max = Math.min(sortedKeys.length, startingMax || Number.MAX_VALUE);
-                    var mid = min;
-                    while (min <= max) {
-                        mid = ((min + max) / 2) >>> 0;
-                        var sortedKey = sortedKeys[mid];
-                        if (!sortedKey) {
-                            break;
-                        }
-                        var sortedItem = this.getItemFromKey(sortedKey);
-                        var r = sorter(sortedItem.data, value);
-                        if (r < 0) {
-                            min = mid + 1;
-                        } else if (r === 0) {
-                            return this._findStableInsertionPos(key, index, min, max, mid, value);
-                        } else {
-                            max = mid - 1;
-                        }
-                    }
-                    return min;
-                },
-                _findBeginningOfGroup: function (mid, sorter, list, sortedKeys, value) {
-                    // we made it to the beginning of the list without finding something
-                    // that sorts equal to this value, insert this key at the beginning of
-                    // this section of keys.
-                    var min = 0;
-                    var max = mid;
-                    while (min <= max) {
-                        mid = ((min + max) / 2) >>> 0;
-                        var sortedKey = sortedKeys[mid];
-                        var sortedItem = list.getItemFromKey(sortedKey);
-                        var r = sorter(sortedItem.data, value);
-                        if (r < 0) {
-                            min = mid + 1;
-                        } else {
-                            max = mid - 1;
-                        }
-                    }
-                    return min;
-                },
-                _findEndOfGroup: function (mid, sorter, list, sortedKeys, value) {
-                    // we made it ot the end of the list without finding something that sorts
-                    // equal to this value, insert this key at the end of this section of
-                    // keys.
-                    var min = mid;
-                    var max = sortedKeys.length;
-                    while (min <= max) {
-                        mid = ((min + max) / 2) >>> 0;
-                        var sortedKey = sortedKeys[mid];
-                        if (!sortedKey) {
-                            return sortedKeys.length;
-                        }
-                        var sortedItem = list.getItemFromKey(sortedKey);
-                        var r = sorter(sortedItem.data, value);
-                        if (r <= 0) {
-                            min = mid + 1;
-                        } else {
-                            max = mid - 1;
-                        }
-                    }
-                    return min;
-                },
-                _findStableInsertionPos: function (key, index, min, max, mid, value) {
-                    var list = this._list;
-                    var length = list.length;
-                    var sorter = this._sortFunction;
-                    var sortedKeys = this._sortedKeys;
-                    if (index < (length / 2)) {
-                        for (var i = index - 1; i >= 0; i--) {
-                            var item = list.getItem(i);
-                            if (sorter(item.data, value) === 0) {
-                                // we have found the next item to the left, insert this item to
-                                // the right of that.
-                                if ((length - min) > max) {
-                                    return sortedKeys.indexOf(item.key, min) + 1;
-                                } else {
-                                    return sortedKeys.lastIndexOf(item.key, max) + 1;
-                                }
-                            }
-                        }
-                        return this._findBeginningOfGroup(mid, sorter, list, sortedKeys, value);
-                    } else {
-                        for (var i = index + 1; i < length; i++) {
-                            var item = list.getItem(i);
-                            if (sorter(item.data, value) === 0) {
-                                // we have found the next item to the right, insert this item
-                                // to the left of that.
-                                if ((length - min) > max) {
-                                    return sortedKeys.indexOf(item.key, min);
-                                } else {
-                                    return sortedKeys.lastIndexOf(item.key, max);
-                                }
-                            }
-                        }
-                        return this._findEndOfGroup(mid, sorter, list, sortedKeys, value);
-                    }
-                },
-
-                _listItemChanged: function (event) {
-                    var key = event.detail.key;
-                    var newValue = event.detail.newValue;
-                    var oldValue = event.detail.oldValue;
-                    var sortFunction = this._sortFunction;
-                    if (sortFunction(oldValue, newValue) === 0) {
-                        var sortedIndex = this.indexOfKey(key);
-                        this._notifyItemChanged(key, sortedIndex, oldValue, newValue, event.detail.oldItem, event.detail.newItem);
-                    } else {
-                        this._listItemRemoved({ detail: { key: key, index: event.detail.index, value: event.detail.oldValue, item: event.detail.oldItem } });
-                        this._listItemInserted({ detail: { key: key, index: event.detail.index, value: event.detail.newValue } });
-                    }
-                },
-                _listItemInserted: function (event, knownMin, knownMax) {
-                    var key = event.detail.key;
-                    var index = event.detail.index;
-                    var value = event.detail.value;
-                    var sortedIndex = this._findInsertionPos(key, index, value, knownMin, knownMax);
-                    this._sortedKeys.splice(sortedIndex, 0, key);
-                    this._notifyItemInserted(key, sortedIndex, value);
-                },
-                _listItemMoved: function (event, knownMin, knownMax) {
-                    var key = event.detail.key;
-                    var newIndex = event.detail.newIndex;
-                    var value = event.detail.value;
-                    var sortedKeys = this._sortedKeys;
-                    var oldSortedIndex = sortedKeys.indexOf(key, knownMin);
-                    sortedKeys.splice(oldSortedIndex, 1);
-                    var newSortedIndex = this._findInsertionPos(key, newIndex, value, knownMin, knownMax);
-                    sortedKeys.splice(newSortedIndex, 0, key);
-                    if (newSortedIndex !== oldSortedIndex) {
-                        // The move in the underlying list resulted in a move in the sorted list
-                        //
-                        this._notifyItemMoved(key, oldSortedIndex, newSortedIndex, value);
-                    } else {
-                        // The move in the underlying list resulted in no change in the sorted list
-                        //
-                    }
-                },
-                _listItemMutated: function (event) {
-                    var key = event.detail.key;
-                    var value = event.detail.value;
-                    var item = event.detail.item;
-                    var index = this._list.indexOfKey(key);
-                    var sortedIndex = this._sortedKeys.indexOf(key);
-                    this._sortedKeys.splice(sortedIndex, 1);
-                    var targetIndex = this._findInsertionPos(key, index, value);
-                    this._sortedKeys.splice(sortedIndex, 0, key);
-                    if (sortedIndex === targetIndex) {
-                        this._notifyItemMutated(key, value, item);
-                        return;
-                    }
-                    this._listItemRemoved({ detail: { key: key, index: index, value: value, item: item } });
-                    this._listItemInserted({ detail: { key: key, index: index, value: value } });
-                },
-                _listItemRemoved: function (event, knownMin) {
-                    var key = event.detail.key;
-                    var value = event.detail.value;
-                    var item = event.detail.item;
-                    var sortedKeys = this._sortedKeys;
-                    var sortedIndex = sortedKeys.indexOf(key, knownMin);
-                    sortedKeys.splice(sortedIndex, 1);
-                    this._notifyItemRemoved(key, sortedIndex, value, item);
-                },
-                _listReload: function () {
-                    this._initSortedKeys();
-                    this._notifyReload();
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.Binding.SortedListProjection.length" helpKeyword="WinJS.Binding.SortedListProjection.length">Gets or sets the length of the list. Returns an integer value one higher than the highest element defined in a list.</field>
-                length: {
-                    get: function () { return this._sortedKeys.length; },
-                    set: function (value) {
-                        if (typeof value === "number" && value >= 0) {
-                            var current = this.length;
-                            if (current > value) {
-                                this.splice(value, current - value);
-                            }
-                        } else {
-                            throw new _ErrorFromName("WinJS.Binding.List.IllegalLength", strings.illegalListLength);
-                        }
-                    }
-                },
-
-                getItem: function (index) {
-                    /// <signature helpKeyword="WinJS.Binding.SortedListProjection.getItem">
-                    /// <summary locid="WinJS.Binding.SortedListProjection.getItem">
-                    /// Returns a key/data pair for the specified index.
-                    /// </summary>
-                    /// <param name="index" type="Number" integer="true" locid="WinJS.Binding.SortedListProjection.getItem_p:index">The index of the value to retrieve.</param>
-                    /// <returns type="Object" locid="WinJS.Binding.SortedListProjection.getItem_returnValue">An object with .key and .data properties.</returns>
-                    /// </signature>
-                    index = asNumber(index);
-                    return this.getItemFromKey(this._sortedKeys[index]);
-                },
-
-                indexOfKey: function (key) {
-                    /// <signature helpKeyword="WinJS.Binding.SortedListProjection.getItem">
-                    /// <summary locid="WinJS.Binding.SortedListProjection.getItem">
-                    /// Returns the index of the first occurrence of a key.
-                    /// </summary>
-                    /// <param name="key" type="String" locid="WinJS.Binding.SortedListProjection.indexOfKey_p:key">The key to locate in the list.</param>
-                    /// <returns type="Number" integer="true" locid="WinJS.Binding.SortedListProjection.indexOfKey_returnValue">The index of the first occurrence of a key in a list, or -1 if not found.</returns>
-                    /// </signature>
-                    return this._sortedKeys.indexOf(key);
-                },
-
-                notifyMutated: function (index) {
-                    /// <signature helpKeyword="WinJS.Binding.SortedListProjection.notifyMutated">
-                    /// <summary locid="WinJS.Binding.SortedListProjection.notifyMutated">
-                    /// Forces the list to send a itemmutated notification to any listeners for the value at the specified index.
-                    /// </summary>
-                    /// <param name="index" type="Number" integer="true" locid="WinJS.Binding.SortedListProjection.notifyMutated_p:index">The index of the value that was mutated.</param>
-                    /// </signature>
-                    index = asNumber(index);
-                    this._notifyMutatedFromKey(this._sortedKeys[index]);
-                },
-
-                setAt: function (index, value) {
-                    /// <signature helpKeyword="WinJS.Binding.SortedListProjection.setAt">
-                    /// <summary locid="WinJS.Binding.SortedListProjection.setAt">
-                    /// Replaces the value at the specified index with a new value.
-                    /// </summary>
-                    /// <param name="index" type="Number" integer="true" locid="WinJS.Binding.SortedListProjection.setAt_p:index">The index of the value that was replaced.</param>
-                    /// <param name="newValue" type="Object" locid="WinJS.Binding.SortedListProjection.setAt_p:newValue">The new value.</param>
-                    /// </signature>
-                    index = asNumber(index);
-                    this._setAtKey(this._sortedKeys[index], value);
-                },
-
-                // returns [ data* ] of removed items
-                _spliceFromKey: function (key, howMany) {
-                    // first add in all the new items if we have any, this should serve to push key to the right
-                    if (arguments.length > 2) {
-                        var args = copyargs(arguments);
-                        args[1] = 0; // howMany
-                        this._list._spliceFromKey.apply(this._list, args);
-                    }
-                    // now we can remove anything that needs to be removed, since they are not necessarially contiguous
-                    // in the underlying list we remove them one by one.
-                    var result = [];
-                    if (howMany) {
-                        var keysToRemove = [];
-                        var sortedKeys = this._sortedKeys;
-                        var sortedKeyIndex = sortedKeys.indexOf(key);
-                        for (var i = sortedKeyIndex, len = sortedKeys.length; i < len && (i - sortedKeyIndex) < howMany; i++) {
-                            keysToRemove.push(sortedKeys[i]);
-                        }
-                        var that = this;
-                        keysToRemove.forEach(function (key) {
-                            result.push(that._list._spliceFromKey(key, 1)[0]);
-                        });
-                    }
-                    return result;
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-        }),
-
-        // This projection sorts the underlying list by group key and within a group
-        //  respects the position of the item in the underlying list. It is built on top
-        //  of the SortedListProjection and has an intimate contract with
-        //  GroupsListProjection.
-        //
-        GroupedSortedListProjection: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(ns.SortedListProjection, function (list, groupKeyOf, groupDataOf, groupSorter) {
-                this._list = list;
-                this._addListListener("itemchanged", this._listGroupedItemChanged);
-                this._addListListener("iteminserted", this._listGroupedItemInserted);
-                this._addListListener("itemmoved", this._listGroupedItemMoved);
-                this._addListListener("itemmutated", this._listGroupedItemMutated);
-                this._addListListener("itemremoved", this._listGroupedItemRemoved);
-                this._addListListener("reload", this._listReload);
-                this._sortFunction = function (l, r) {
-                    l = groupKeyOf(l);
-                    r = groupKeyOf(r);
-                    if (groupSorter) {
-                        return groupSorter(l, r);
-                    } else {
-                        return l < r ? -1 : l === r ? 0 : 1;
-                    }
-                };
-                this._groupKeyOf = groupKeyOf;
-                this._groupDataOf = groupDataOf;
-                this._initSortedKeys();
-                this._initGroupedItems();
-            }, {
-                _groupKeyOf: null,
-                _groupDataOf: null,
-
-                _groupedItems: null,
-                _initGroupedItems: function () {
-                    var groupedItems = {};
-                    var list = this._list;
-                    var groupKeyOf = this._groupKeyOf;
-                    for (var i = 0, len = list.length; i < len; i++) {
-                        var item = cloneItem(list.getItem(i));
-                        item.groupKey = groupKeyOf(item.data);
-                        groupedItems[item.key] = item;
-                    }
-                    this._groupedItems = groupedItems;
-                },
-
-                _groupsProjection: null,
-
-                _listGroupedItemChanged: function (event) {
-                    var key = event.detail.key;
-                    var oldValue = event.detail.oldValue;
-                    var newValue = event.detail.newValue;
-                    var groupedItems = this._groupedItems;
-                    var oldGroupedItem = groupedItems[key];
-                    var newGroupedItem = cloneItem(oldGroupedItem);
-                    newGroupedItem.data = newValue;
-                    newGroupedItem.groupKey = this._groupKeyOf(newValue);
-                    groupedItems[key] = newGroupedItem;
-                    var index;
-                    if (oldGroupedItem.groupKey === newGroupedItem.groupKey) {
-                        index = this.indexOfKey(key);
-                        this._notifyItemChanged(key, index, oldValue, newValue, oldGroupedItem, newGroupedItem);
-                    } else {
-                        index = event.detail.index;
-                        this._listItemChanged({ detail: { key: key, index: index, oldValue: oldValue, newValue: newValue, oldItem: oldGroupedItem, newItem: newGroupedItem } });
-                    }
-                },
-                _listGroupedItemInserted: function (event) {
-                    var key = event.detail.key;
-                    var value = event.detail.value;
-                    var groupKey = this._groupKeyOf(value);
-                    this._groupedItems[key] = {
-                        handle: key,
-                        key: key,
-                        data: value,
-                        groupKey: groupKey
-                    };
-                    var groupMin, groupMax;
-                    if (this._groupsProjection) {
-                        var groupItem = this._groupsProjection._groupItems[groupKey];
-                        if (groupItem) {
-                            groupMin = groupItem.firstItemIndexHint;
-                            groupMax = groupMin + groupItem.groupSize;
-                        }
-                    }
-                    this._listItemInserted(event, groupMin, groupMax);
-                },
-                _listGroupedItemMoved: function (event) {
-                    var groupMin, groupMax;
-                    var groupKey = this._groupedItems[event.detail.key].groupKey;
-                    if (this._groupsProjection) {
-                        var groupItem = this._groupsProjection._groupItems[groupKey];
-                        groupMin = groupItem.firstItemIndexHint;
-                        groupMax = groupMin + groupItem.groupSize;
-                    }
-                    this._listItemMoved(event, groupMin, groupMax);
-                },
-                _listGroupedItemMutated: function (event) {
-                    var key = event.detail.key;
-                    var value = event.detail.value;
-                    var groupedItems = this._groupedItems;
-                    var oldGroupedItem = groupedItems[key];
-                    var groupKey = this._groupKeyOf(value);
-                    if (oldGroupedItem.groupKey === groupKey) {
-                        this._notifyItemMutated(key, value, oldGroupedItem);
-                    } else {
-                        var newGroupedItem = cloneItem(oldGroupedItem);
-                        newGroupedItem.groupKey = groupKey;
-                        groupedItems[key] = newGroupedItem;
-                        var index = this._list.indexOfKey(key);
-                        this._listItemRemoved({ detail: { key: key, index: index, value: value, item: oldGroupedItem } });
-                        this._listItemInserted({ detail: { key: key, index: index, value: value } });
-                    }
-                },
-                _listGroupedItemRemoved: function (event) {
-                    var key = event.detail.key;
-                    var index = event.detail.index;
-                    var value = event.detail.value;
-                    var groupedItems = this._groupedItems;
-                    var groupedItem = groupedItems[key];
-                    delete groupedItems[key];
-                    var groupMin, groupMax;
-                    if (this._groupsProjection) {
-                        var groupItem = this._groupsProjection._groupItems[groupedItem.groupKey];
-                        groupMin = groupItem.firstItemIndexHint;
-                        groupMax = groupMin + groupItem.groupSize;
-                    }
-                    this._listItemRemoved({ detail: { key: key, index: index, value: value, item: groupedItem } }, groupMin, groupMax);
-                },
-
-                // override _listReload
-                _listReload: function () {
-                    this._initGroupedItems();
-                    ns.SortedListProjection.prototype._listReload.call(this);
-                },
-
-                /// <field type="WinJS.Binding.List" locid="WinJS.Binding.GroupedSortedListProjection.groups" helpKeyword="WinJS.Binding.GroupedSortedListProjection.groups">Gets a WinJS.Binding.List, which is a projection of the groups that were identified in this list.</field>
-                groups: {
-                    get: function () {
-                        if (this._groupsProjection === null) {
-                            this._groupsProjection = new ns.GroupsListProjection(this, this._groupKeyOf, this._groupDataOf);
-                        }
-                        return this._groupsProjection;
-                    }
-                },
-
-                // We have to implement this because we keep our own set of items so that we can
-                //  tag them with groupKey.
-                //
-                getItemFromKey: function (key) {
-                    /// <signature helpKeyword="WinJS.Binding.GroupedSortedListProjection.getItemFromKey">
-                    /// <summary locid="WinJS.Binding.GroupedSortedListProjection.getItemFromKey">
-                    /// Gets a key/data pair for the specified item key.
-                    /// </summary>
-                    /// <param name="key" type="String" locid="WinJS.Binding.GroupedSortedListProjection.getItemFromKey_p:key">The key of the value to retrieve.</param>
-                    /// <returns type="Object" locid="WinJS.Binding.GroupedSortedListProjection.getItemFromKey_returnValue">An object with .key and .data properties.</returns>
-                    /// </signature>
-                    return this._groupedItems[key];
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-        }),
-
-        // This is really an implementation detail of GroupedSortedListProjection and takes a
-        // dependency on its internals and implementation details.
-        //
-        GroupsListProjection: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(ns.ListBase, function (list, groupKeyOf, groupDataOf) {
-                this._list = list;
-                this._addListListener("itemchanged", this._listItemChanged);
-                this._addListListener("iteminserted", this._listItemInserted);
-                this._addListListener("itemmoved", this._listItemMoved);
-                // itemmutated is handled by the GroupedSortedListProjection because if the item
-                //  changes groups it turns into a remove/insert.
-                this._addListListener("itemremoved", this._listItemRemoved);
-                this._addListListener("reload", this._listReload);
-                this._groupKeyOf = groupKeyOf;
-                this._groupDataOf = groupDataOf;
-                this._initGroupKeysAndItems();
-            }, {
-                _list: null,
-
-                _addListListener: function (name, func) {
-                    // interestingly, since GroupsListProjection has the same lifetime as the GroupedSortedListProjection
-                    // we don't have to worry about cleaning up the cycle here.
-                    this._list.addEventListener(name, func.bind(this));
-                },
-
-                _groupDataOf: null,
-                _groupKeyOf: null,
-                _groupOf: function (item) {
-                    return this.getItemFromKey(this._groupKeyOf(item.data));
-                },
-
-                _groupKeys: null,
-                _groupItems: null,
-                _initGroupKeysAndItems: function () {
-                    var groupDataOf = this._groupDataOf;
-                    var list = this._list;
-                    var groupItems = {};
-                    var groupKeys = [];
-                    var currentGroupKey = null;
-                    var currentGroupItem = null;
-                    var groupCount;
-                    for (var i = 0, len = list.length; i < len; i++) {
-                        var item = list.getItem(i);
-                        var groupKey = item.groupKey;
-                        if (groupKey !== currentGroupKey) {
-                            // new group
-                            if (currentGroupItem) {
-                                currentGroupItem.groupSize = groupCount;
-                            }
-                            groupCount = 1;
-                            currentGroupKey = groupKey;
-                            currentGroupItem = {
-                                handle: groupKey,
-                                key: groupKey,
-                                data: groupDataOf(item.data),
-                                firstItemKey: item.key,
-                                firstItemIndexHint: i
-                            };
-                            groupItems[groupKey] = currentGroupItem;
-                            groupKeys.push(groupKey);
-                        } else {
-                            // existing group
-                            groupCount++;
-                        }
-                    }
-                    if (currentGroupItem) {
-                        currentGroupItem.groupSize = groupCount;
-                    }
-                    this._groupKeys = groupKeys;
-                    this._groupItems = groupItems;
-                },
-
-                _listItemChanged: function (event) {
-                    // itemchanged is only interesting if the item that changed is the first item
-                    //  of a group at which point we need to regenerate the group item.
-                    //
-                    var key = event.detail.key;
-                    var index = event.detail.index;
-                    var newValue = event.detail.newValue;
-                    var list = this._list;
-                    var groupKey = list.getItemFromKey(key).groupKey;
-                    var groupItems = this._groupItems;
-                    var groupItem = groupItems[groupKey];
-                    if (groupItem.firstItemIndexHint === index) {
-                        var newGroupItem = cloneItem(groupItem);
-                        newGroupItem.data = this._groupDataOf(newValue);
-                        newGroupItem.firstItemKey = key;
-                        groupItems[groupKey] = newGroupItem;
-                        this._notifyItemChanged(groupKey, this._groupKeys.indexOf(groupKey), groupItem.data, newGroupItem.data, groupItem, newGroupItem);
-                    }
-                },
-                _listItemInserted: function (event) {
-                    // iteminserted is only interesting if this is a new group, or is the first
-                    //  item of the group at which point the group data is regenerated. It will
-                    //  however always result in a +1 to all the following firstItemIndexHints
-                    //
-                    var key = event.detail.key;
-                    var index = event.detail.index;
-                    var value = event.detail.value;
-                    var list = this._list;
-                    var groupKey = list.getItemFromKey(key).groupKey;
-                    var groupItems = this._groupItems;
-                    var groupKeys = this._groupKeys;
-                    var groupItem = groupItems[groupKey];
-                    var groupIndex;
-                    var oldGroupItem, newGroupItem;
-
-                    var i, len;
-                    if (!groupItem) {
-                        // we have a new group, add it
-                        for (i = 0, len = groupKeys.length; i < len; i++) {
-                            groupItem = groupItems[groupKeys[i]];
-                            if (groupItem.firstItemIndexHint >= index) {
-                                break;
-                            }
-                        }
-                        groupIndex = i;
-                        groupItem = {
-                            handle: groupKey,
-                            key: groupKey,
-                            data: this._groupDataOf(value),
-                            groupSize: 1,
-                            firstItemKey: key,
-                            firstItemIndexHint: index
-                        };
-                        groupKeys.splice(groupIndex, 0, groupKey);
-                        groupItems[groupKey] = groupItem;
-                        this._notifyItemInserted(groupKey, groupIndex, groupItem.data);
-                    } else {
-                        oldGroupItem = groupItem;
-                        newGroupItem = cloneItem(oldGroupItem);
-                        newGroupItem.groupSize++;
-                        if (oldGroupItem.firstItemIndexHint === index) {
-                            newGroupItem.groupData = this._groupDataOf(value);
-                            newGroupItem.firstItemKey = key;
-                            newGroupItem.firstItemIndexHint = index;
-                        }
-                        groupItems[groupKey] = newGroupItem;
-                        groupIndex = groupKeys.indexOf(groupKey);
-                        this._notifyItemChanged(groupKey, groupIndex, oldGroupItem.data, newGroupItem.data, oldGroupItem, newGroupItem);
-                    }
-                    // update the firstItemIndexHint on following groups
-                    for (i = groupIndex + 1, len = groupKeys.length; i < len; i++) {
-                        oldGroupItem = groupItems[groupKeys[i]];
-                        newGroupItem = cloneItem(oldGroupItem);
-                        newGroupItem.firstItemIndexHint++;
-                        groupItems[newGroupItem.key] = newGroupItem;
-                        this._notifyItemChanged(newGroupItem.key, i, oldGroupItem.data, newGroupItem.data, oldGroupItem, newGroupItem);
-                    }
-                },
-                _listItemMoved: function (event) {
-                    // itemmoved is not important to grouping unless the move resulted in a new
-                    //  first item in the group at which point we will regenerate the group data
-                    //
-                    var key = event.detail.key;
-                    var oldIndex = event.detail.oldIndex;
-                    var newIndex = event.detail.newIndex;
-                    var list = this._list;
-                    var groupKey = list.getItemFromKey(key).groupKey;
-                    var groupItems = this._groupItems;
-                    var groupItem = groupItems[groupKey];
-                    if (groupItem.firstItemIndexHint === newIndex ||
-                        groupItem.firstItemIndexHint === oldIndex) {
-                        // the first item of the group has changed, update it.
-                        var item = list.getItem(groupItem.firstItemIndexHint);
-                        var newGroupItem = cloneItem(groupItem);
-                        newGroupItem.data = this._groupDataOf(item.data);
-                        newGroupItem.firstItemKey = item.key;
-                        groupItems[groupKey] = newGroupItem;
-                        this._notifyItemChanged(groupKey, this._groupKeys.indexOf(groupKey), groupItem.data, newGroupItem.data, groupItem, newGroupItem);
-                    }
-                },
-                _listItemRemoved: function (event) {
-                    // itemremoved is only interesting if the group was of size 1 or was the
-                    //  first item of the group at which point the group data is regenerated.
-                    //  It will however always result in a -1 to all of the following
-                    //  firstItemIndexHints.
-                    //
-                    var index = event.detail.index;
-                    var item = event.detail.item;
-                    var groupItems = this._groupItems;
-                    var groupKeys = this._groupKeys;
-                    // since the value is no longer in the list we can't ask for its item and
-                    // get the group key from there.
-                    var groupKey = item.groupKey;
-                    var groupItem = groupItems[groupKey];
-                    var groupIndex = groupKeys.indexOf(groupKey);
-                    var oldGroupItem, newGroupItem;
-
-                    if (groupItem.groupSize === 1) {
-                        groupKeys.splice(groupIndex, 1);
-                        delete groupItems[groupKey];
-                        this._notifyItemRemoved(groupKey, groupIndex, groupItem.data, groupItem);
-                        // after removing the group we need to decrement the index because it is used
-                        // for modifying subsequent group firstItemIndexHint's
-                        groupIndex--;
-                    } else {
-                        oldGroupItem = groupItem;
-                        newGroupItem = cloneItem(oldGroupItem);
-                        newGroupItem.groupSize--;
-                        if (oldGroupItem.firstItemIndexHint === index) {
-                            // find the next group item, it will be at the same index as the old
-                            // first group item.
-                            var newFirstItem = this._list.getItem(index);
-                            newGroupItem.data = this._groupDataOf(newFirstItem.data);
-                            newGroupItem.firstItemKey = newFirstItem.key;
-                        }
-                        groupItems[groupKey] = newGroupItem;
-                        this._notifyItemChanged(groupKey, groupIndex, oldGroupItem.data, newGroupItem.data, oldGroupItem, newGroupItem);
-                    }
-                    for (var i = groupIndex + 1, len = groupKeys.length; i < len; i++) {
-                        oldGroupItem = groupItems[groupKeys[i]];
-                        newGroupItem = cloneItem(oldGroupItem);
-                        newGroupItem.firstItemIndexHint--;
-                        groupItems[newGroupItem.key] = newGroupItem;
-                        this._notifyItemChanged(newGroupItem.key, i, oldGroupItem.data, newGroupItem.data, oldGroupItem, newGroupItem);
-                    }
-                },
-                _listReload: function () {
-                    this._initGroupKeysAndItems();
-                    this._notifyReload();
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.Binding.GroupsListProjection.length" helpKeyword="WinJS.Binding.GroupsListProjection.length">Gets the length of the list. Returns an integer value one higher than the highest element defined in a list.</field>
-                length: {
-                    get: function () { return this._groupKeys.length; }
-                },
-
-                getItem: function (index) {
-                    /// <signature helpKeyword="WinJS.Binding.GroupsListProjection.getItem">
-                    /// <summary locid="WinJS.Binding.GroupsListProjection.getItem">
-                    /// Gets a key/data pair for the specified index .
-                    /// </summary>
-                    /// <param name="index" type="Number" integer="true" locid="WinJS.Binding.GroupsListProjection.getItem_p:index">The index of the value to retrieve.</param>
-                    /// <returns type="Object" locid="WinJS.Binding.GroupsListProjection.getItem_returnValue">An object with .key and .data properties.</returns>
-                    /// </signature>
-                    index = asNumber(index);
-                    return this._groupItems[this._groupKeys[index]];
-                },
-                getItemFromKey: function (key) {
-                    /// <signature helpKeyword="WinJS.Binding.GroupsListProjection.getItemFromKey">
-                    /// <summary locid="WinJS.Binding.GroupsListProjection.getItemFromKey">
-                    /// Gets a key/data pair for the specified key.
-                    /// </summary>
-                    /// <param name="key" type="String" locid="WinJS.Binding.GroupsListProjection.getItemFromKey_p:key">The key of the value to retrieve.</param>
-                    /// <returns type="Object" locid="WinJS.Binding.GroupsListProjection.getItemFromKey_returnValue">An object with .key and .data properties.</returns>
-                    /// </signature>
-                    return this._groupItems[key];
-                },
-
-                indexOfKey: function (key) {
-                    /// <signature helpKeyword="WinJS.Binding.GroupsListProjection.indexOfKey">
-                    /// <summary locid="WinJS.Binding.GroupsListProjection.indexOfKey">
-                    /// Returns the index of the first occurrence of a key in a list.
-                    /// </summary>
-                    /// <param name="key" type="String" locid="WinJS.Binding.GroupsListProjection.indexOfKey_p:key">The key to locate in the list.</param>
-                    /// <returns type="Number" integer="true" locid="WinJS.Binding.GroupsListProjection.indexOfKey_returnValue">The index of the first occurrence of a key in a list, or -1 if not found.</returns>
-                    /// </signature>
-                    return this._groupKeys.indexOf(key);
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-        }),
-    });
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Binding", {
-        List: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(ns.ListBaseWithMutators, function (list, options) {
-                /// <signature helpKeyword="WinJS.Binding.List.List">
-                /// <summary locid="WinJS.Binding.List.constructor">
-                /// Creates a WinJS.Binding.List object.
-                /// </summary>
-                /// <param name="list" type="Array" optional="true" locid="WinJS.Binding.List.constructor_p:list">The array containing the elements to initalize the list.</param>
-                /// <param name="options" type="Object" optional="true" locid="WinJS.Binding.List.constructor_p:options">If options.binding is true, the list will contain the result of calling WinJS.Binding.as() on the element values. If options.proxy is true, the list specified as the first parameter is used as the storage for the WinJS.Binding.List. This option should be used with care because uncoordinated edits to the data storage will result in errors.</param>
-                /// <returns type="WinJS.Binding.List" locid="WinJS.Binding.List.constructor_returnValue">The newly-constructed WinJS.Binding.List instance.</returns>
-                /// </signature>
-
-                this._currentKey = 0;
-                this._keys = null;
-                this._keyMap = {};
-
-                // options:
-                //  - binding: binding.as on items
-                //  - proxy: proxy over input data
-                //
-                options = options || emptyOptions;
-                this._proxy = options.proxy;
-                this._binding = options.binding;
-                if (this._proxy) {
-                    if (Object.keys(list).length !== list.length) {
-                        throw new _ErrorFromName("WinJS.Binding.List.NotSupported", strings.sparseArrayNotSupported);
-                    }
-                    this._data = list;
-                    this._currentKey = list.length;
-                } else if (list) {
-                    var keyDataMap = this._keyMap;
-                    var pos = 0, i = 0;
-                    for (var len = list.length; i < len; i++) {
-                        if (i in list) {
-                            var item = list[i];
-                            if (this._binding) {
-                                item = _Data.as(item);
-                            }
-                            var key = pos.toString();
-                            pos++;
-                            keyDataMap[key] = { handle: key, key: key, data: item };
-                        }
-                    }
-                    if (pos !== i) {
-                        this._initializeKeys();
-                    }
-                    this._currentKey = pos;
-                }
-            }, {
-                _currentKey: 0,
-
-                _keys: null,
-                _keyMap: null,
-
-                _modifyingData: 0,
-
-                _initializeKeys: function () {
-                    if (this._keys) {
-                        return;
-                    }
-
-                    var keys = [];
-                    if (this._data) {
-                        // If this list is a proxy over the data then we will have been lazily initializing
-                        // the entries in the list, however the 1:1 mapping between index and key is about
-                        // to go away so this is our last chance to pull the items out of the data.
-                        //
-                        var keyMap = this._keyMap;
-                        var data = this._data;
-                        for (var i = 0, len = data.length; i < len; i++) {
-                            if (i in data) {
-                                var key = i.toString();
-                                keys[i] = key;
-                                if (!(key in keyMap)) {
-                                    var item = data[i];
-                                    if (this._binding) {
-                                        item = _Data.as(item);
-                                    }
-                                    keyMap[key] = { handle: key, key: key, data: item };
-                                }
-                            }
-                        }
-                    } else {
-                        // In the case where List owns the data we will have created the keyMap at initialization
-                        // time and can use that to harvest all the keys into the _keys list.
-                        //
-                        Object.keys(this._keyMap).forEach(function (key) {
-                            keys[key >>> 0] = key;
-                        });
-                    }
-                    this._keys = keys;
-                },
-                _lazyPopulateEntry: function (index) {
-                    if (this._data && index in this._data) {
-                        var item = this._data[index];
-                        if (this._binding) {
-                            item = _Data.as(item);
-                        }
-                        var key = index.toString();
-                        var entry = { handle: key, key: key, data: item };
-                        this._keyMap[entry.key] = entry;
-                        return entry;
-                    }
-                },
-
-                _assignKey: function () {
-                    return (++this._currentKey).toString();
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.Binding.List.length" helpKeyword="WinJS.Binding.List.length">Gets or sets the length of the list, which is an integer value one higher than the highest element defined in the list.</field>
-                length: {
-                    get: function () {
-                        // If we are proxying use the underlying list's length
-                        // If we have already allocated keys use that length
-                        // If we haven't allocated keys then we can use _currentKey which was set at initialization time
-                        //  to be length of the input list.
-                        if (this._data) {
-                            return this._data.length;
-                        } else if (this._keys) {
-                            return this._keys.length;
-                        } else {
-                            return this._currentKey;
-                        }
-                    },
-                    set: function (value) {
-                        if (typeof value === "number" && value >= 0) {
-                            this._initializeKeys();
-                            var current = this.length;
-                            if (current > value) {
-                                this.splice(value, current - value);
-                            } else {
-                                // We don't support setting lengths to longer in order to have sparse behavior
-                                value = current;
-                            }
-                            if (this._data) {
-                                this._modifyingData++;
-                                try {
-                                    this._data.length = value;
-                                } finally {
-                                    this._modifyingData--;
-                                }
-                            }
-                            if (this._keys) {
-                                this._keys.length = value;
-                            }
-                        } else {
-                            throw new _ErrorFromName("WinJS.Binding.List.IllegalLength", strings.illegalListLength);
-                        }
-                    }
-                },
-
-                getItem: function (index) {
-                    /// <signature helpKeyword="WinJS.Binding.List.getItem">
-                    /// <summary locid="WinJS.Binding.List.getItem">
-                    /// Gets a key/data pair for the specified list index.
-                    /// </summary>
-                    /// <param name="index" type="Number" integer="true" locid="WinJS.Binding.List.getItem_p:index">The index of value to retrieve.</param>
-                    /// <returns type="Object" locid="WinJS.Binding.List.getItem_returnValue">An object with .key and .data properties.</returns>
-                    /// </signature>
-                    var entry;
-                    var key;
-                    index = asNumber(index);
-                    if (this._keys) {
-                        key = this._keys[index];
-                        entry = key && this._keyMap[key];
-                    } else {
-                        key = index.toString();
-                        entry = this._keyMap[key] || this._lazyPopulateEntry(index);
-                    }
-                    return entry;
-                },
-                getItemFromKey: function (key) {
-                    /// <signature helpKeyword="WinJS.Binding.List.getItemFromKey">
-                    /// <summary locid="WinJS.Binding.List.getItemFromKey">
-                    /// Gets a key/data pair for the list item key specified.
-                    /// </summary>
-                    /// <param name="key" type="String" locid="WinJS.Binding.List.getItemFromKey_p:key">The key of the value to retrieve.</param>
-                    /// <returns type="Object" locid="WinJS.Binding.List.getItemFromKey_returnValue">An object with .key and .data properties.</returns>
-                    /// </signature>
-                    var entry;
-                    // if we have a keys list we know to go through the keyMap, or if we are not
-                    // proxying through _data we also know to go through the keyMap.
-                    if (this._keys || !this._data) {
-                        entry = this._keyMap[key];
-                    } else {
-                        entry = this.getItem(key >>> 0);
-                    }
-                    return entry;
-                },
-
-                indexOfKey: function (key) {
-                    /// <signature helpKeyword="WinJS.Binding.List.indexOfKey">
-                    /// <summary locid="WinJS.Binding.List.indexOfKey">
-                    /// Gets the index of the first occurrence of a key in a list.
-                    /// </summary>
-                    /// <param name="key" type="String" locid="WinJS.Binding.List.indexOfKey_p:key">The key to locate in the list.</param>
-                    /// <returns type="Number" integer="true" locid="WinJS.Binding.List.indexOfKey_returnValue">The index of the first occurrence of a key in a list, or -1 if not found.</returns>
-                    /// </signature>
-                    var index = -1;
-                    if (this._keys) {
-                        index = this._keys.indexOf(key);
-                    } else {
-                        var t = key >>> 0;
-                        if (t < this._currentKey) {
-                            index = t;
-                        }
-                    }
-                    return index;
-                },
-
-                move: function (index, newIndex) {
-                    /// <signature helpKeyword="WinJS.Binding.List.move">
-                    /// <summary locid="WinJS.Binding.List.move">
-                    /// Moves the value at index to the specified position.
-                    /// </summary>
-                    /// <param name="index" type="Number" integer="true" locid="WinJS.Binding.List.move_p:index">The original index of the value.</param>
-                    /// <param name="newIndex" type="Number" integer="true" locid="WinJS.Binding.List.move_p:newIndex">The index of the value after the move.</param>
-                    /// </signature>
-                    index = asNumber(index);
-                    newIndex = asNumber(newIndex);
-                    this._initializeKeys();
-                    if (index === newIndex || index < 0 || newIndex < 0 || index >= this.length || newIndex >= this.length) {
-                        return;
-                    }
-                    if (this._data) {
-                        this._modifyingData++;
-                        try {
-                            var item = this._data.splice(index, 1)[0];
-                            this._data.splice(newIndex, 0, item);
-                        } finally {
-                            this._modifyingData--;
-                        }
-                    }
-                    var key = this._keys.splice(index, 1)[0];
-                    this._keys.splice(newIndex, 0, key);
-                    this._notifyItemMoved(key, index, newIndex, this.getItemFromKey(key).data);
-                },
-
-                notifyMutated: function (index) {
-                    /// <signature helpKeyword="WinJS.Binding.List.notifyMutated">
-                    /// <summary locid="WinJS.Binding.List.notifyMutated">
-                    /// Forces the list to send a itemmutated notification to any listeners for the value at the specified index.
-                    /// </summary>
-                    /// <param name="index" type="Number" integer="true" locid="WinJS.Binding.List.notifyMutated_p:index">The index of the value that was mutated.</param>
-                    /// </signature>
-                    index = asNumber(index);
-                    var key = this._keys ? this._keys[index] : index.toString();
-                    this._notifyMutatedFromKey(key);
-                },
-
-                setAt: function (index, newValue) {
-                    /// <signature helpKeyword="WinJS.Binding.List.setAt">
-                    /// <summary locid="WinJS.Binding.List.setAt">
-                    /// Replaces the value at the specified index with a new value.
-                    /// </summary>
-                    /// <param name="index" type="Number" integer="true" locid="WinJS.Binding.List.setAt_p:index">The index of the value that was replaced.</param>
-                    /// <param name="newValue" type="Object" locid="WinJS.Binding.List.setAt_p:newValue">The new value.</param>
-                    /// </signature>
-                    index = asNumber(index);
-                    this._initializeKeys();
-                    var length = this.length;
-                    if (index === length) {
-                        this.push(newValue);
-                    } else if (index < length) {
-                        if (this._data) {
-                            this._modifyingData++;
-                            try {
-                                this._data[index] = newValue;
-                            } finally {
-                                this._modifyingData--;
-                            }
-                        }
-                        if (this._binding) {
-                            newValue = _Data.as(newValue);
-                        }
-                        if (index in this._keys) {
-                            var key = this._keys[index];
-                            var oldEntry = this._keyMap[key];
-                            var newEntry = cloneItem(oldEntry);
-                            newEntry.data = newValue;
-                            this._keyMap[key] = newEntry;
-                            this._notifyItemChanged(key, index, oldEntry.data, newValue, oldEntry, newEntry);
-                        }
-                    }
-                },
-
-                _setAtKey: function (key, newValue) {
-                    this.setAt(this.indexOfKey(key), newValue);
-                },
-
-                // These are the traditional Array mutators, they don't result in projections. In particular
-                //  having both sort and sorted is a bit confusing. It may be the case that we want to eliminate
-                //  the various array helpers outside of the standard push/pop,shift/unshift,splice,get*,setAt
-                //  and then offer up the specific projections: filter, sorted, grouped. Anything else can be
-                //  obtained through _getArray().
-                //
-                reverse: function () {
-                    /// <signature helpKeyword="WinJS.Binding.List.reverse">
-                    /// <summary locid="WinJS.Binding.List.reverse">
-                    /// Returns a list with the elements reversed. This method reverses the elements of a list object in place. It does not create a new list object during execution.
-                    /// </summary>
-                    /// <returns type="WinJS.Binding.List" locid="WinJS.Binding.List.reverse_returnValue">The reversed list.</returns>
-                    /// </signature>
-                    this._initializeKeys();
-                    if (this._data) {
-                        this._modifyingData++;
-                        try {
-                            this._data.reverse();
-                        } finally {
-                            this._modifyingData--;
-                        }
-                    }
-                    this._keys.reverse();
-                    this._notifyReload();
-                    return this;
-                },
-                sort: function (sortFunction) {
-                    /// <signature helpKeyword="WinJS.Binding.List.sort">
-                    /// <summary locid="WinJS.Binding.List.sort">
-                    /// Returns a list with the elements sorted. This method sorts the elements of a list object in place. It does not create a new list object during execution.
-                    /// </summary>
-                    /// <param name="sortFunction" type="Function" locid="WinJS.Binding.List.sort_p:sortFunction">The function used to determine the order of the elements. If omitted, the elements are sorted in ascending, ASCII character order.</param>
-                    /// <returns type="WinJS.Binding.List" locid="WinJS.Binding.List.sort_returnValue">The sorted list.</returns>
-                    /// </signature>
-                    this._initializeKeys();
-                    if (this._data) {
-                        this._modifyingData++;
-                        try {
-                            this._data.sort(sortFunction);
-                        } finally {
-                            this._modifyingData--;
-                        }
-                    }
-                    var that = this;
-                    this._keys.sort(function (l, r) {
-                        l = that._keyMap[l];
-                        r = that._keyMap[r];
-                        if (sortFunction) {
-                            return sortFunction(l.data, r.data);
-                        }
-                        l = (l && l.data || "").toString();
-                        r = (l && r.data || "").toString();
-                        return l < r ? -1 : l === r ? 0 : 1;
-                    });
-                    this._notifyReload();
-                    return this;
-                },
-
-                pop: function () {
-                    /// <signature helpKeyword="WinJS.Binding.List.pop">
-                    /// <summary locid="WinJS.Binding.List.pop">
-                    /// Removes the last element from a list and returns it.
-                    /// </summary>
-                    /// <returns type="Object" locid="WinJS.Binding.List.pop_returnValue">Last element from the list.</returns>
-                    /// </signature>
-                    if (this.length === 0) {
-                        return;
-                    }
-                    this._initializeKeys();
-                    var key = this._keys.pop();
-                    var entry = this._keyMap[key];
-                    var data = entry && entry.data;
-                    if (this._data) {
-                        this._modifyingData++;
-                        try {
-                            this._data.pop();
-                        } finally {
-                            this._modifyingData--;
-                        }
-                    }
-                    delete this._keyMap[key];
-                    this._notifyItemRemoved(key, this._keys.length, data, entry);
-                    return data;
-                },
-
-                push: function () {
-                    /// <signature helpKeyword="WinJS.Binding.List.push">
-                    /// <summary locid="WinJS.Binding.List.push">
-                    /// Appends new element(s) to a list, and returns the new length of the list.
-                    /// </summary>
-                    /// <param name="value" type="Object" parameterArray="true" locid="WinJS.Binding.List.push_p:value">The element to insert at the end of the list.</param>
-                    /// <returns type="Number" integer="true" locid="WinJS.Binding.List.push_returnValue">The new length of the list.</returns>
-                    /// </signature>
-                    this._initializeKeys();
-                    var length = arguments.length;
-                    for (var i = 0; i < length; i++) {
-                        var item = arguments[i];
-                        if (this._binding) {
-                            item = _Data.as(item);
-                        }
-                        var key = this._assignKey();
-                        this._keys.push(key);
-                        if (this._data) {
-                            this._modifyingData++;
-                            try {
-                                this._data.push(arguments[i]);
-                            } finally {
-                                this._modifyingData--;
-                            }
-                        }
-                        this._keyMap[key] = { handle: key, key: key, data: item };
-                        this._notifyItemInserted(key, this._keys.length - 1, item);
-                    }
-                    return this.length;
-                },
-
-                shift: function () {
-                    /// <signature helpKeyword="WinJS.Binding.List.shift">
-                    /// <summary locid="WinJS.Binding.List.shift">
-                    /// Removes the first element from a list and returns it.
-                    /// </summary>
-                    /// <returns type="Object" locid="WinJS.Binding.List.shift_returnValue">First element from the list.</returns>
-                    /// </signature>
-                    if (this.length === 0) {
-                        return;
-                    }
-
-                    this._initializeKeys();
-                    var key = this._keys.shift();
-                    var entry = this._keyMap[key];
-                    var data = entry && entry.data;
-                    if (this._data) {
-                        this._modifyingData++;
-                        try {
-                            this._data.shift();
-                        } finally {
-                            this._modifyingData--;
-                        }
-                    }
-                    delete this._keyMap[key];
-                    this._notifyItemRemoved(key, 0, data, entry);
-                    return data;
-                },
-
-                unshift: function () {
-                    /// <signature helpKeyword="WinJS.Binding.List.unshift">
-                    /// <summary locid="WinJS.Binding.List.unshift">
-                    /// Appends new element(s) to a list, and returns the new length of the list.
-                    /// </summary>
-                    /// <param name="value" type="Object" parameterArray="true" locid="WinJS.Binding.List.unshift_p:value">The element to insert at the start of the list.</param>
-                    /// <returns type="Number" integer="true" locid="WinJS.Binding.List.unshift_returnValue">The new length of the list.</returns>
-                    /// </signature>
-                    this._initializeKeys();
-                    var length = arguments.length;
-                    for (var i = length - 1; i >= 0; i--) {
-                        var item = arguments[i];
-                        if (this._binding) {
-                            item = _Data.as(item);
-                        }
-                        var key = this._assignKey();
-                        this._keys.unshift(key);
-                        if (this._data) {
-                            this._modifyingData++;
-                            try {
-                                this._data.unshift(arguments[i]);
-                            } finally {
-                                this._modifyingData--;
-                            }
-                        }
-                        this._keyMap[key] = { handle: key, key: key, data: item };
-                        this._notifyItemInserted(key, 0, item);
-                    }
-                    return this.length;
-                },
-
-                splice: function (index, howMany, item) {
-                    /// <signature helpKeyword="WinJS.Binding.List.splice">
-                    /// <summary locid="WinJS.Binding.List.splice">
-                    /// Removes elements from a list and, if necessary, inserts new elements in their place, returning the deleted elements.
-                    /// </summary>
-                    /// <param name="start" type="Number" integer="true" locid="WinJS.Binding.List.splice_p:start">The zero-based location in the list from which to start removing elements.</param>
-                    /// <param name="howMany" type="Number" integer="true" locid="WinJS.Binding.List.splice_p:howMany">The number of elements to remove.</param>
-                    /// <param name="item" type="Object" optional="true" parameterArray="true" locid="WinJS.Binding.List.splice_p:item">The elements to insert into the list in place of the deleted elements.</param>
-                    /// <returns type="Array" locid="WinJS.Binding.List.splice_returnValue">The deleted elements.</returns>
-                    /// </signature>
-                    index = asNumber(index);
-                    this._initializeKeys();
-                    index = Math.max(0, this._normalizeIndex(index));
-                    howMany = Math.max(0, Math.min(howMany || 0, this.length - index));
-                    var result = [];
-                    while (howMany) {
-                        var key = this._keys[index];
-                        var entry = this._keyMap[key];
-                        var data = entry && entry.data;
-                        result.push(data);
-                        this._keys.splice(index, 1);
-                        if (this._data) {
-                            this._modifyingData++;
-                            try {
-                                this._data.splice(index, 1);
-                            } finally {
-                                this._modifyingData--;
-                            }
-                        }
-                        delete this._keyMap[key];
-                        this._notifyItemRemoved(key, index, data, entry);
-                        --howMany;
-                    }
-                    if (arguments.length > 2) {
-                        for (var i = 2, len = arguments.length; i < len; i++) {
-                            var additionalItem = arguments[i];
-                            if (this._binding) {
-                                additionalItem = _Data.as(additionalItem);
-                            }
-                            var pos = Math.min(index + i - 2, this.length);
-                            var newKey = this._assignKey();
-                            this._keys.splice(pos, 0, newKey);
-                            if (this._data) {
-                                this._modifyingData++;
-                                try {
-                                    this._data.splice(pos, 0, arguments[i]);
-                                } finally {
-                                    this._modifyingData--;
-                                }
-                            }
-                            this._keyMap[newKey] = { handle: newKey, key: newKey, data: additionalItem };
-                            this._notifyItemInserted(newKey, pos, additionalItem);
-                        }
-                    }
-                    return result;
-                },
-                // returns [ data* ] of removed items
-                _spliceFromKey: function (key) {
-                    this._initializeKeys();
-                    var args = copyargs(arguments);
-                    args[0] = this._keys.indexOf(key);
-                    return this.splice.apply(this, args);
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-        })
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Res',[
-    'exports',
-    './Core/_Global',
-    './Core/_Base',
-    './Core/_BaseUtils',
-    './Core/_ErrorFromName',
-    './Core/_Resources',
-    './ControlProcessor/_OptionsParser',
-    './Promise'
-    ], function resInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Resources, _OptionsParser, Promise) {
-    "use strict";
-
-    var readyComplete = false;
-
-    var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;
-
-    function processAllImpl(rootElement, count) {
-        rootElement = rootElement || _Global.document.body;
-
-        var count = count || 0;
-
-        if (count < 4) {
-            // Only 3 depth is supported in the innerHTML
-            if (count === 0) {
-                if (rootElement.getAttribute) {
-                    // Fragment-loaded root element isn't caught by querySelectorAll
-                    var rootElementNode = rootElement.getAttribute('data-win-res');
-                    if (rootElementNode) {
-                        var decls = _OptionsParser.optionsParser(rootElementNode);
-                        setMembers(rootElement, rootElement, decls, count);
-                    }
-                }
-            }
-
-            var selector = "[data-win-res],[data-win-control]";
-            var elements = rootElement.querySelectorAll(selector);
-            if (elements.length === 0) {
-                return Promise.as(rootElement);
-            }
-
-            for (var i = 0, len = elements.length; i < len; i++) {
-                var e = elements[i];
-
-                if (e.winControl && e.winControl.constructor && e.winControl.constructor.isDeclarativeControlContainer) {
-                    var idcc = e.winControl.constructor.isDeclarativeControlContainer;
-                    if (typeof idcc === "function") {
-                        idcc = requireSupportedForProcessing(idcc);
-                        idcc(e.winControl, processAll);
-
-                        // Skip all children of declarative control container
-                        i += e.querySelectorAll(selector).length;
-                    }
-                }
-
-                if (!e.hasAttribute("data-win-res")) {
-                    continue;
-                }
-                // Use optionsParser that accept string format
-                // {name="value", name2="value2"}
-                var decls = _OptionsParser.optionsParser(e.getAttribute('data-win-res'));
-                setMembers(e, e, decls, count);
-            }
-
-        } else if (_BaseUtils.validation) {
-            throw new _ErrorFromName("WinJS.Res.NestingExceeded", "NestingExceeded");
-        }
-
-        return Promise.as(rootElement);
-    }
-
-    function setAttributes(root, descriptor) {
-        var names = Object.keys(descriptor);
-
-        for (var k = 0, l = names.length ; k < l; k++) {
-            var name = names[k];
-            var value = descriptor[name];
-
-            var data = _Resources.getString(value);
-
-            if (!data || !data.empty) {
-                root.setAttribute(name, data.value);
-
-                if ((data.lang !== undefined) &&
-                    (root.lang !== undefined) &&
-                    (root.lang !== data.lang)) {
-
-                        root.lang = data.lang;
-                    }
-            } else if (_BaseUtils.validation) {
-                notFound(value);
-            }
-        }
-    }
-
-    function notFound(name) {
-        throw new _ErrorFromName("WinJS.Res.NotFound", _Resources._formatString("NotFound: {0}", name));
-    }
-
-    function setMembers(root, target, descriptor, count) {
-        var names = Object.keys(descriptor);
-        target = requireSupportedForProcessing(target);
-
-        for (var k = 0, l = names.length ; k < l; k++) {
-            var name = names[k];
-            var value = descriptor[name];
-
-            if (typeof value === "string") {
-                var data = _Resources.getString(value);
-
-                if (!data || !data.empty) {
-                    target[name] = data.value;
-
-                    if ((data.lang !== undefined) &&
-                        (root.lang !== undefined) &&
-                        (root.lang !== data.lang)) {
-                        // When lang property is different, we set the language with selected string's language
-                            root.lang = data.lang;
-                        }
-
-                    if (name === "innerHTML") {
-                        processAllImpl(target, count + 1);
-                    }
-                } else if (_BaseUtils.validation) {
-                    notFound(value);
-                }
-            } else if (root === target && name === "attributes") {
-                //Exposing setAttribute for attributes that don't have HTML properties, like aria, through a fake 'attributes' property
-                setAttributes(root, value);
-            } else {
-                setMembers(root, target[name], value, count);
-            }
-        }
-    }
-
-    function processAll(rootElement) {
-            /// <signature helpKeyword="WinJS.Resources.processAll">
-            /// <summary locid="WinJS.Resources.processAll">
-            /// Processes resources tag and replaces strings
-            /// with localized strings.
-            /// </summary>
-            /// <param name="rootElement" locid="WinJS.Resources.processAll_p:rootElement">
-            /// The DOM element at which to start processing. processAll processes the element and its child elements.
-            /// If you don't specify root element, processAll processes the entire document.
-            /// </param>
-            /// </signature>
-
-            if (!readyComplete) {
-                return _BaseUtils.ready().then(function () {
-                    readyComplete = true;
-                    return processAllImpl(rootElement);
-                });
-            } else {
-                try {
-                    return processAllImpl(rootElement);
-                }
-                catch (e) {
-                    return Promise.wrapError(e);
-                }
-            }
-        }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.Resources", {
-        processAll: processAll
-    });
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Pages/_BasePage',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_WriteProfilerMark',
-    '../Promise',
-    '../Utilities/_Control',
-    '../Utilities/_Dispose',
-    '../Utilities/_ElementUtilities'
-    ], function pagesInit(exports, _Global, _Base, _BaseUtils, _WriteProfilerMark, Promise, _Control, _Dispose, _ElementUtilities) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-
-    function abs(uri) {
-        var a = _Global.document.createElement("a");
-        a.href = uri;
-        return a.href;
-    }
-    var viewMap = {};
-
-    function selfhost(uri) {
-        return _Global.document.location.href.toLowerCase() === uri.toLowerCase();
-    }
-
-    var _mixin = {
-        dispose: function () {
-            /// <signature helpKeyword="WinJS.UI.Pages.dispose">
-            /// <summary locid="WinJS.UI.Pages.dispose">
-            /// Disposes this Page.
-            /// </summary>
-            /// </signature>
-            if (this._disposed) {
-                return;
-            }
-
-            this._disposed = true;
-            _Dispose.disposeSubTree(this.element);
-            this.element = null;
-        },
-        load: function (uri) {
-            /// <signature helpKeyword="WinJS.UI.Pages._mixin.load">
-            /// <summary locid="WinJS.UI.Pages._mixin.load">
-            /// Creates a copy of the DOM elements from the specified URI.  In order for this override
-            /// to be used, the page that contains the load override needs to be defined by calling
-            /// WinJS.UI.Pages.define() before WinJS.UI.Pages.render() is called.
-            /// </summary>
-            /// <param name="uri" locid="WinJS.UI.Pages._mixin.load_p:uri">
-            /// The URI from which to copy the DOM elements.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Pages._mixin.load_returnValue">
-            /// A promise whose fulfilled value is the set of unparented DOM elements, if asynchronous processing is necessary. If not, returns nothing.
-            /// </returns>
-            /// </signature>
-        },
-        init: function (element, options) {
-            /// <signature helpKeyword="WinJS.UI.Pages._mixin.init">
-            /// <summary locid="WinJS.UI.Pages._mixin.init">
-            /// Initializes the control before the content of the control is set.
-            /// Use the processed method for any initialization that should be done after the content
-            /// of the control has been set.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Pages._mixin.init_p:element">
-            /// The DOM element that will contain all the content for the page.
-            /// </param>
-            /// <param name="options" locid="WinJS.UI.Pages._mixin.init_p:options">
-            /// The options passed to the constructor of the page.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Pages._mixin.init_returnValue">
-            /// A promise that is fulfilled when initialization is complete, if asynchronous processing is necessary. If not, returns nothing.
-            /// </returns>
-            /// </signature>
-        },
-        process: function (element, options) {
-            /// <signature helpKeyword="WinJS.UI.Pages._mixin.process">
-            /// <summary locid="WinJS.UI.Pages._mixin.process">
-            /// Processes the unparented DOM elements returned by load.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Pages._mixin.process_p:element">
-            /// The DOM element that will contain all the content for the page.
-            /// </param>
-            /// <param name="options" locid="WinJS.UI.Pages._mixin.process_p:options">
-            /// The options that are to be passed to the constructor of the page.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Pages._mixin.process_returnValue">
-            /// A promise that is fulfilled when processing is complete.
-            /// </returns>
-            /// </signature>
-        },
-        processed: function (element, options) {
-            /// <signature helpKeyword="WinJS.UI.Pages._mixin.processed">
-            /// <summary locid="WinJS.UI.Pages._mixin.processed">
-            /// Initializes the control after the content of the control is set.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Pages._mixin.processed_p:element">
-            /// The DOM element that will contain all the content for the page.
-            /// </param>
-            /// <param name="options" locid="WinJS.UI.Pages._mixin.processed_p:options">
-            /// The options that are to be passed to the constructor of the page.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Pages._mixin.processed_returnValue">
-            /// A promise that is fulfilled when initialization is complete, if asynchronous processing is necessary. If not, returns nothing.
-            /// </returns>
-            /// </signature>
-        },
-        render: function (element, options, loadResult) {
-            /// <signature helpKeyword="WinJS.UI.Pages._mixin.render">
-            /// <summary locid="WinJS.UI.Pages._mixin.render">
-            /// Renders the control, typically by adding the elements specified in the loadResult parameter to the specified element.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Pages._mixin.render_p:element">
-            /// The DOM element that will contain all the content for the page.
-            /// </param>
-            /// <param name="options" locid="WinJS.UI.Pages._mixin.render_p:options">
-            /// The options passed into the constructor of the page.
-            /// </param>
-            /// <param name="loadResult" locid="WinJS.UI.Pages._mixin.render_p:loadResult">
-            /// The elements returned from the load method.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Pages._mixin.render_returnValue">
-            /// A promise that is fulfilled when rendering is complete, if asynchronous processing is necessary. If not, returns nothing.
-            /// </returns>
-            /// </signature>
-        },
-        ready: function (element, options) {
-            /// <signature helpKeyword="WinJS.UI.Pages._mixin.ready">
-            /// <summary locid="WinJS.UI.Pages._mixin.ready">
-            /// Called after all initialization and rendering is complete. At this
-            /// time the element is ready for use.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Pages._mixin.ready_p:element">
-            /// The DOM element that contains all the content for the page.
-            /// </param>
-            /// <param name="options" locid="WinJS.UI.Pages._mixin.ready_p:options">
-            /// The options passed into the constructor of the page
-            /// </param>
-            /// </signature>
-        },
-        error: function (err) {
-            /// <signature helpKeyword="WinJS.UI.Pages._mixin.error">
-            /// <summary locid="WinJS.UI.Pages._mixin.error">
-            /// Called if any error occurs during the processing of the page.
-            /// </summary>
-            /// <param name="err" locid="WinJS.UI.Pages._mixin.error_p:err">
-            /// The error that occurred.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Pages._mixin.error_returnValue">
-            /// Nothing if the error was handled, or an error promise if the error was not handled.
-            /// </returns>
-            /// </signature>
-            return Promise.wrapError(err);
-        }
-    };
-
-    function Pages_define(uri, members) {
-        /// <signature helpKeyword="WinJS.UI.Pages.define">
-        /// <summary locid="WinJS.UI.Pages.define">
-        /// Creates a new page control from the specified URI that contains the specified members.
-        /// Multiple calls to this method for the same URI are allowed, and all members will be
-        /// merged.
-        /// </summary>
-        /// <param name="uri" locid="WinJS.UI.Pages.define_p:uri">
-        /// The URI for the content that defines the page.
-        /// </param>
-        /// <param name="members" locid="WinJS.UI.Pages.define_p:members">
-        /// Additional members that the control will have.
-        /// </param>
-        /// <returns type="Function" locid="WinJS.UI.Pages.define_returnValue">
-        /// A constructor function that creates the page.
-        /// </returns>
-        /// </signature>
-
-        var base = get(uri);
-        uri = abs(uri);
-
-        if (!base) {
-            base = _Base.Class.define(
-                // This needs to follow the WinJS.UI.processAll "async constructor"
-                // pattern to interop nicely in the "Views.Control" use case.
-                //
-                function PageControl_ctor(element, options, complete, parentedPromise) {
-                    var that = this;
-                    this._disposed = false;
-                    this.element = element = element || _Global.document.createElement("div");
-                    _ElementUtilities.addClass(element, "win-disposable");
-                    element.msSourceLocation = uri;
-                    this.uri = uri;
-                    this.selfhost = selfhost(uri);
-                    element.winControl = this;
-                    _ElementUtilities.addClass(element, "pagecontrol");
-
-                    var profilerMarkIdentifier = " uri='" + uri + "'" + _BaseUtils._getProfilerMarkIdentifier(this.element);
-
-                    _WriteProfilerMark("WinJS.UI.Pages:createPage" + profilerMarkIdentifier + ",StartTM");
-
-                    var load = Promise.wrap().
-                        then(function Pages_load() { return that.load(uri); });
-
-                    var renderCalled = load.then(function Pages_init(loadResult) {
-                        return Promise.join({
-                            loadResult: loadResult,
-                            initResult: that.init(element, options)
-                        });
-                    }).then(function Pages_render(result) {
-                        return that.render(element, options, result.loadResult);
-                    });
-
-                    this.elementReady = renderCalled.then(function () { return element; });
-
-                    this.renderComplete = renderCalled.
-                        then(function Pages_process() {
-                            return that.process(element, options);
-                        }).then(function Pages_processed() {
-                            return that.processed(element, options);
-                        }).then(function () {
-                            return that;
-                        });
-
-                    var callComplete = function () {
-                        complete && complete(that);
-                        _WriteProfilerMark("WinJS.UI.Pages:createPage" + profilerMarkIdentifier + ",StopTM");
-                    };
-
-                    // promises guarantee order, so this will be called prior to ready path below
-                    //
-                    this.renderComplete.then(callComplete, callComplete);
-
-                    this.readyComplete = this.renderComplete.then(function () {
-                        return parentedPromise;
-                    }).then(function Pages_ready() {
-                        that.ready(element, options);
-                        return that;
-                    }).then(
-                        null,
-                        function Pages_error(err) {
-                            return that.error(err);
-                        }
-                    );
-                },
-                _mixin
-            );
-            base = _Base.Class.mix(base, _Control.DOMEventMixin);
-            viewMap[uri.toLowerCase()] = base;
-        }
-
-        // Lazily mix in the members, allowing for multiple definitions of "define" to augment
-        // the shared definition of the member.
-        //
-        if (members) {
-            base = _Base.Class.mix(base, members);
-        }
-
-        base.selfhost = selfhost(uri);
-
-        return base;
-    }
-
-    function get(uri) {
-        uri = abs(uri);
-        return viewMap[uri.toLowerCase()];
-    }
-
-    function remove(uri) {
-        uri = abs(uri);
-        delete viewMap[uri.toLowerCase()];
-    }
-
-    _Base.Namespace._moduleDefine(exports, null, {
-        abs: abs,
-        define: Pages_define,
-        get: get,
-        remove: remove,
-        viewMap: viewMap
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Pages',[
-    'exports',
-    './Core/_Global',
-    './Core/_Base',
-    './Core/_BaseUtils',
-    './ControlProcessor',
-    './Fragments',
-    './Pages/_BasePage',
-    './Promise',
-    ], function pagesInit(exports, _Global, _Base, _BaseUtils, ControlProcessor, Fragments, _BasePage, Promise) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-
-    var _mixin = {
-        load: function (uri) {
-            /// <signature helpKeyword="WinJS.UI.Pages._mixin.load">
-            /// <summary locid="WinJS.UI.Pages._mixin.load">
-            /// Creates a copy of the DOM elements from the specified URI.  In order for this override
-            /// to be used, the page that contains the load override needs to be defined by calling
-            /// WinJS.UI.Pages.define() before WinJS.UI.Pages.render() is called.
-            /// </summary>
-            /// <param name="uri" locid="WinJS.UI.Pages._mixin.load_p:uri">
-            /// The URI from which to copy the DOM elements.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Pages._mixin.load_returnValue">
-            /// A promise whose fulfilled value is the set of unparented DOM elements, if asynchronous processing is necessary. If not, returns nothing.
-            /// </returns>
-            /// </signature>
-            if (!this.selfhost) {
-                return Fragments.renderCopy(_BasePage.abs(uri));
-            }
-        },
-        process: function (element, options) {
-            /// <signature helpKeyword="WinJS.UI.Pages._mixin.process">
-            /// <summary locid="WinJS.UI.Pages._mixin.process">
-            /// Processes the unparented DOM elements returned by load.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Pages._mixin.process_p:element">
-            /// The DOM element that will contain all the content for the page.
-            /// </param>
-            /// <param name="options" locid="WinJS.UI.Pages._mixin.process_p:options">
-            /// The options that are to be passed to the constructor of the page.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Pages._mixin.process_returnValue">
-            /// A promise that is fulfilled when processing is complete.
-            /// </returns>
-            /// </signature>
-            return ControlProcessor.processAll(element);
-        },
-        render: function (element, options, loadResult) {
-            /// <signature helpKeyword="WinJS.UI.Pages._mixin.render">
-            /// <summary locid="WinJS.UI.Pages._mixin.render">
-            /// Renders the control, typically by adding the elements specified in the loadResult parameter to the specified element.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.Pages._mixin.render_p:element">
-            /// The DOM element that will contain all the content for the page.
-            /// </param>
-            /// <param name="options" locid="WinJS.UI.Pages._mixin.render_p:options">
-            /// The options passed into the constructor of the page.
-            /// </param>
-            /// <param name="loadResult" locid="WinJS.UI.Pages._mixin.render_p:loadResult">
-            /// The elements returned from the load method.
-            /// </param>
-            /// <returns type="WinJS.Promise" locid="WinJS.UI.Pages._mixin.render_returnValue">
-            /// A promise that is fulfilled when rendering is complete, if asynchronous processing is necessary. If not, returns nothing.
-            /// </returns>
-            /// </signature>
-            if (!this.selfhost) {
-                element.appendChild(loadResult);
-            }
-            return element;
-        }
-    };
-
-    function Pages_define(uri, members) {
-        /// <signature helpKeyword="WinJS.UI.Pages.define">
-        /// <summary locid="WinJS.UI.Pages.define">
-        /// Creates a new page control from the specified URI that contains the specified members.
-        /// Multiple calls to this method for the same URI are allowed, and all members will be
-        /// merged.
-        /// </summary>
-        /// <param name="uri" locid="WinJS.UI.Pages.define_p:uri">
-        /// The URI for the content that defines the page.
-        /// </param>
-        /// <param name="members" locid="WinJS.UI.Pages.define_p:members">
-        /// Additional members that the control will have.
-        /// </param>
-        /// <returns type="Function" locid="WinJS.UI.Pages.define_returnValue">
-        /// A constructor function that creates the page.
-        /// </returns>
-        /// </signature>
-
-        var Page = _BasePage.get(uri);
-
-        if (!Page) {
-            Page = _BasePage.define(uri, _mixin);
-        }
-
-        if (members) {
-            Page = _Base.Class.mix(Page, members);
-        }
-
-        if (Page.selfhost) {
-            _BaseUtils.ready(function () {
-                render(_BasePage.abs(uri), _Global.document.body);
-            }, true);
-        }
-
-        return Page;
-    }
-
-    function get(uri) {
-        /// <signature helpKeyword="WinJS.UI.Pages.get">
-        /// <summary locid="WinJS.UI.Pages.get">
-        /// Gets an already-defined page control for the specified URI, or creates a new one.
-        /// </summary>
-        /// <param name="uri" locid="WinJS.UI.Pages.get_p:uri">
-        /// The URI for the content that defines the page.
-        /// </param>
-        /// <returns type="Function" locid="WinJS.UI.Pages.get_returnValue">
-        /// A constructor function that creates the page.
-        /// </returns>
-        /// </signature>
-
-        var ctor = _BasePage.get(uri);
-        if (!ctor) {
-            ctor = Pages_define(uri);
-        }
-        return ctor;
-    }
-
-    function _remove(uri) {
-        Fragments.clearCache(_BasePage.abs(uri));
-        _BasePage.remove(uri);
-    }
-
-    function render(uri, element, options, parentedPromise) {
-        /// <signature helpKeyword="WinJS.UI.Pages.render">
-        /// <summary locid="WinJS.UI.Pages.render">
-        /// Creates a page control from the specified URI inside
-        /// the specified element with the specified options.
-        /// </summary>
-        /// <param name="uri" locid="WinJS.UI.Pages.render_p:uri">
-        /// The URI for the content that defines the page.
-        /// </param>
-        /// <param name="element" isOptional="true" locid="WinJS.UI.Pages.render_p:element">
-        /// The element to populate with the page.
-        /// </param>
-        /// <param name="options" isOptional="true" locid="WinJS.UI.Pages.render_p:options">
-        /// The options for configuring the page.
-        /// </param>
-        /// <param name="parentedPromise" isOptional="true" locid="WinJS.UI.Pages.render_p:parentedPromise">
-        /// A promise that is fulfilled when the specified element is parented to the final document.
-        /// </param>
-        /// <returns type="WinJS.Promise" locid="WinJS.UI.Pages.render_returnValue">
-        /// A promise that is fulfilled when the page is done rendering
-        /// </returns>
-        /// </signature>
-        var Ctor = get(uri);
-        var control = new Ctor(element, options, null, parentedPromise);
-        return control.renderComplete.then(null, function (err) {
-            return Promise.wrapError({
-                error: err,
-                page: control
-            });
-        });
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI.Pages", {
-        define: Pages_define,
-        get: get,
-        _remove: _remove,
-        render: render,
-        _viewMap: _BasePage.viewMap
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/HtmlControl',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Pages'
-    ], function htmlControlInit(exports, _Global, _Base, Pages) {
-    "use strict";
-
-    // not supported in WebWorker
-    if (!_Global.document) {
-        return;
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.HtmlControl">
-        /// Enables you to include an HTML page dynamically.
-        /// </summary>
-        /// </field>
-        /// <name locid="WinJS.UI.HtmlControl_name">HtmlControl</name>
-        /// <icon src="base_winjs.ui.htmlcontrol.12x12.png" width="12" height="12" />
-        /// <icon src="base_winjs.ui.htmlcontrol.16x16.png" width="16" height="16" />
-        /// <htmlSnippet><![CDATA[<div data-win-control="WinJS.UI.HtmlControl" data-win-options="{ uri: 'somePage.html' }"></div>]]></htmlSnippet>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        HtmlControl: _Base.Class.define(function HtmlControl_ctor(element, options, complete) {
-            /// <signature helpKeyword="WinJS.UI.HtmlControl.HtmlControl">
-            /// <summary locid="WinJS.UI.HtmlControl.constructor">
-            /// Initializes a new instance of HtmlControl to define a new page control.
-            /// </summary>
-            /// <param name="element" locid="WinJS.UI.HtmlControl.constructor_p:element">
-            /// The element that hosts the HtmlControl.
-            /// </param>
-            /// <param name="options" locid="WinJS.UI.HtmlControl.constructor_p:options">
-            /// The options for configuring the page. The uri option is required in order to specify the source
-            /// document for the content of the page.
-            /// </param>
-            /// </signature>
-            Pages.render(options.uri, element, options).
-                then(complete, function () { complete(); });
-        })
-    });
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('base',[
-    'WinJS/Core/_WinJS',
-    'WinJS/Core',
-    'WinJS/Promise',
-    'WinJS/_Signal',
-    'WinJS/Scheduler',
-    'WinJS/Utilities',
-    'WinJS/XYFocus',
-    'WinJS/Fragments',
-    'WinJS/Application',
-    'WinJS/Navigation',
-    'WinJS/Animations',
-    'WinJS/Binding',
-    'WinJS/BindingTemplate',
-    'WinJS/BindingList',
-    'WinJS/Res',
-    'WinJS/Pages',
-    'WinJS/ControlProcessor',
-    'WinJS/Controls/HtmlControl',
-    ], function (_WinJS) {
-    "use strict";
-
-    _WinJS.Namespace.define("WinJS.Utilities", {
-        _require: require,
-        _define: define
-    });
-
-    return _WinJS;
-});
-
-        require(['WinJS/Core/_WinJS', 'base'], function (_WinJS) {
-            // WinJS always publishes itself to global
-            globalObject.WinJS = _WinJS;
-            if (typeof module !== 'undefined') {
-                // This is a CommonJS context so publish to exports
-                module.exports = _WinJS;
-            }
-        });
-        return globalObject.WinJS;
-    }));
-}());
-
diff --git a/node_modules/winjs/js/base.min.js b/node_modules/winjs/js/base.min.js
deleted file mode 100644
index 8fa8175..0000000
--- a/node_modules/winjs/js/base.min.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/*! Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. */
-!function(){var globalObject="undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:{};!function(a){"function"==typeof define&&define.amd?define([],a):(globalObject.msWriteProfilerMark&&msWriteProfilerMark("WinJS.4.4 4.4.2.winjs.2017.3.14 base.js,StartTM"),"object"==typeof exports&&"string"!=typeof exports.nodeName?a():a(globalObject.WinJS),globalObject.msWriteProfilerMark&&msWriteProfilerMark("WinJS.4.4 4.4.2.winjs.2017.3.14 base.js,StopTM"))}(function(WinJS){var require,define;return function(){"use strict";function a(a,b){a=a||"";var c=a.split("/");return c.pop(),b.map(function(a){if("."===a[0]){var b=a.split("/"),d=c.slice(0);return b.forEach(function(a){".."===a?d.pop():"."!==a&&d.push(a)}),d.join("/")}return a})}function b(b,e,f){return b.map(function(b){if("exports"===b)return f;if("require"===b)return function(b,c){require(a(e,b),c)};var g=d[b];if(!g)throw new Error("Undefined dependency: "+b);return g.resolved||(g.resolved=c(g.dependencies,g.factory,b,g.exports),"undefined"==typeof g.resolved&&(g.resolved=g.exports)),g.resolved})}function c(a,c,d,e){var f=b(a,d,e);return c&&c.apply?c.apply(null,f):c}var d={};define=function(b,c,e){Array.isArray(c)||(e=c,c=[]);var f={dependencies:a(b,c),factory:e};-1!==c.indexOf("exports")&&(f.exports={}),d[b]=f},require=function(a,b){Array.isArray(a)||(a=[a]),c(a,b)}}(),define("amd",function(){}),define("WinJS/Core/_WinJS",{}),define("WinJS/Core/_Global",[],function(){"use strict";var a="undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:{};return a}),define("WinJS/Core/_BaseCoreUtils",["./_Global"],function(a){"use strict";function b(a){return a.supportedForProcessing=!0,a}var c=!!a.Windows;return{hasWinRT:c,markSupportedForProcessing:b,_setImmediate:a.setImmediate?a.setImmediate.bind(a):function(b){a.setTimeout(b,0)}}}),define("WinJS/Core/_WriteProfilerMark",["./_Global"],function(a){"use strict";return a.msWriteProfilerMark||function(){}}),define("WinJS/Core/_Base",["./_WinJS","./_Global","./_BaseCoreUtils","./_WriteProfilerMark"],function(a,b,c,d){"use strict";function e(a,b,c){var d,e,f,g=Object.keys(b),h=Array.isArray(a);for(e=0,f=g.length;f>e;e++){var i=g[e],j=95!==i.charCodeAt(0),k=b[i];!k||"object"!=typeof k||void 0===k.value&&"function"!=typeof k.get&&"function"!=typeof k.set?j?h?a.forEach(function(a){a[i]=k}):a[i]=k:(d=d||{},d[i]={value:k,enumerable:j,configurable:!0,writable:!0}):(void 0===k.enumerable&&(k.enumerable=j),c&&k.setName&&"function"==typeof k.setName&&k.setName(c+"."+i),d=d||{},d[i]=k)}d&&(h?a.forEach(function(a){Object.defineProperties(a,d)}):Object.defineProperties(a,d))}return function(){function c(c,d){var e=c||{};if(d){var f=d.split(".");e===b&&"WinJS"===f[0]&&(e=a,f.splice(0,1));for(var g=0,h=f.length;h>g;g++){var i=f[g];e[i]||Object.defineProperty(e,i,{value:{},writable:!1,enumerable:!0,configurable:!0}),e=e[i]}}return e}function f(a,b,d){var f=c(a,b);return d&&e(f,d,b||"<ANONYMOUS>"),f}function g(a,c){return f(b,a,c)}function h(a){var b,c,e=k.uninitialized;return{setName:function(a){b=a},get:function(){switch(e){case k.initialized:return c;case k.uninitialized:e=k.working;try{d("WinJS.Namespace._lazy:"+b+",StartTM"),c=a()}finally{d("WinJS.Namespace._lazy:"+b+",StopTM"),e=k.uninitialized}return a=null,e=k.initialized,c;case k.working:throw"Illegal: reentrancy on initialization";default:throw"Illegal"}},set:function(a){switch(e){case k.working:throw"Illegal: reentrancy on initialization";default:e=k.initialized,c=a}},enumerable:!0,configurable:!0}}function i(a,d,f){var g=[a],h=null;return d&&(h=c(b,d),g.push(h)),e(g,f,d||"<ANONYMOUS>"),h}var j=a;j.Namespace||(j.Namespace=Object.create(Object.prototype));var k={uninitialized:1,working:2,initialized:3};Object.defineProperties(j.Namespace,{defineWithParent:{value:f,writable:!0,enumerable:!0,configurable:!0},define:{value:g,writable:!0,enumerable:!0,configurable:!0},_lazy:{value:h,writable:!0,enumerable:!0,configurable:!0},_moduleDefine:{value:i,writable:!0,enumerable:!0,configurable:!0}})}(),function(){function b(a,b,d){return a=a||function(){},c.markSupportedForProcessing(a),b&&e(a.prototype,b),d&&e(a,d),a}function d(a,d,f,g){if(a){d=d||function(){};var h=a.prototype;return d.prototype=Object.create(h),c.markSupportedForProcessing(d),Object.defineProperty(d.prototype,"constructor",{value:d,writable:!0,configurable:!0,enumerable:!0}),f&&e(d.prototype,f),g&&e(d,g),d}return b(d,f,g)}function f(a){a=a||function(){};var b,c;for(b=1,c=arguments.length;c>b;b++)e(a.prototype,arguments[b]);return a}a.Namespace.define("WinJS.Class",{define:b,derive:d,mix:f})}(),{Namespace:a.Namespace,Class:a.Class}}),define("WinJS/Core/_ErrorFromName",["./_Base"],function(a){"use strict";var b=a.Class.derive(Error,function(a,b){this.name=a,this.message=b||a},{},{supportedForProcessing:!1});return a.Namespace.define("WinJS",{ErrorFromName:b}),b}),define("WinJS/Core/_WinRT",["exports","./_Global","./_Base"],function(a,b,c){"use strict";a.msGetWeakWinRTProperty=b.msGetWeakWinRTProperty,a.msSetWeakWinRTProperty=b.msSetWeakWinRTProperty;var d=["Windows.ApplicationModel.DesignMode.designModeEnabled","Windows.ApplicationModel.Resources.Core.ResourceContext","Windows.ApplicationModel.Resources.Core.ResourceManager","Windows.ApplicationModel.Search.SearchQueryLinguisticDetails","Windows.Data.Text.SemanticTextQuery","Windows.Foundation.Collections.CollectionChange","Windows.Foundation.Diagnostics","Windows.Foundation.Uri","Windows.Globalization.ApplicationLanguages","Windows.Globalization.Calendar","Windows.Globalization.DateTimeFormatting","Windows.Globalization.Language","Windows.Phone.UI.Input.HardwareButtons","Windows.Storage.ApplicationData","Windows.Storage.CreationCollisionOption","Windows.Storage.BulkAccess.FileInformationFactory","Windows.Storage.FileIO","Windows.Storage.FileProperties.ThumbnailType","Windows.Storage.FileProperties.ThumbnailMode","Windows.Storage.FileProperties.ThumbnailOptions","Windows.Storage.KnownFolders","Windows.Storage.Search.FolderDepth","Windows.Storage.Search.IndexerOption","Windows.Storage.Streams.RandomAccessStreamReference","Windows.UI.ApplicationSettings.SettingsEdgeLocation","Windows.UI.ApplicationSettings.SettingsCommand","Windows.UI.ApplicationSettings.SettingsPane","Windows.UI.Core.AnimationMetrics","Windows.UI.Core.SystemNavigationManager","Windows.UI.Input.EdgeGesture","Windows.UI.Input.EdgeGestureKind","Windows.UI.Input.PointerPoint","Windows.UI.ViewManagement.HandPreference","Windows.UI.ViewManagement.InputPane","Windows.UI.ViewManagement.UIColorType","Windows.UI.ViewManagement.UISettings","Windows.UI.WebUI.Core.WebUICommandBar","Windows.UI.WebUI.Core.WebUICommandBarBitmapIcon","Windows.UI.WebUI.Core.WebUICommandBarClosedDisplayMode","Windows.UI.WebUI.Core.WebUICommandBarIconButton","Windows.UI.WebUI.Core.WebUICommandBarSymbolIcon","Windows.UI.WebUI.WebUIApplication"],e=!1;try{b.Windows.UI.ViewManagement.InputPane.getForCurrentView(),e=!0}catch(f){}d.forEach(function(d){var f=d.split("."),g={};g[f[f.length-1]]={get:function(){return e?f.reduce(function(a,b){return a?a[b]:null},b):null}},c.Namespace.defineWithParent(a,f.slice(0,-1).join("."),g)})}),define("WinJS/Core/_Events",["exports","./_Base"],function(a,b){"use strict";function c(a){var b="_on"+a+"state";return{get:function(){var a=this[b];return a&&a.userHandler},set:function(c){var d=this[b];c?(d||(d={wrapper:function(a){return d.userHandler(a)},userHandler:c},Object.defineProperty(this,b,{value:d,enumerable:!1,writable:!0,configurable:!0}),this.addEventListener(a,d.wrapper,!1)),d.userHandler=c):d&&(this.removeEventListener(a,d.wrapper,!1),this[b]=null)},enumerable:!0}}function d(){for(var a={},b=0,d=arguments.length;d>b;b++){var e=arguments[b];a["on"+e]=c(e)}return a}var e=b.Class.define(function(a,b,c){this.detail=b,this.target=c,this.timeStamp=Date.now(),this.type=a},{bubbles:{value:!1,writable:!1},cancelable:{value:!1,writable:!1},currentTarget:{get:function(){return this.target}},defaultPrevented:{get:function(){return this._preventDefaultCalled}},trusted:{value:!1,writable:!1},eventPhase:{value:0,writable:!1},target:null,timeStamp:null,type:null,preventDefault:function(){this._preventDefaultCalled=!0},stopImmediatePropagation:function(){this._stopImmediatePropagationCalled=!0},stopPropagation:function(){}},{supportedForProcessing:!1}),f={_listeners:null,addEventListener:function(a,b,c){c=c||!1,this._listeners=this._listeners||{};for(var d=this._listeners[a]=this._listeners[a]||[],e=0,f=d.length;f>e;e++){var g=d[e];if(g.useCapture===c&&g.listener===b)return}d.push({listener:b,useCapture:c})},dispatchEvent:function(a,b){var c=this._listeners&&this._listeners[a];if(c){var d=new e(a,b,this);c=c.slice(0,c.length);for(var f=0,g=c.length;g>f&&!d._stopImmediatePropagationCalled;f++)c[f].listener(d);return d.defaultPrevented||!1}return!1},removeEventListener:function(a,b,c){c=c||!1;var d=this._listeners&&this._listeners[a];if(d)for(var e=0,f=d.length;f>e;e++){var g=d[e];if(g.listener===b&&g.useCapture===c){d.splice(e,1),0===d.length&&delete this._listeners[a];break}}}};b.Namespace._moduleDefine(a,"WinJS.Utilities",{_createEventProperty:c,createEventProperties:d,eventMixin:f})}),define("require-json",{load:function(a){throw new Error("Dynamic load not allowed: "+a)}}),define("require-json!strings/en-us/Microsoft.WinJS.resjson",{"tv/scrollViewerPageDown":"Page Down","tv/scrollViewerPageUp":"Page Up","ui/appBarAriaLabel":"App Bar","ui/appBarCommandAriaLabel":"App Bar Item","ui/appBarOverflowButtonAriaLabel":"View more","ui/autoSuggestBoxAriaLabel":"Autosuggestbox","ui/autoSuggestBoxAriaLabelInputNoPlaceHolder":"Autosuggestbox, enter to submit query, esc to clear text","ui/autoSuggestBoxAriaLabelInputPlaceHolder":"Autosuggestbox, {0}, enter to submit query, esc to clear text","ui/autoSuggestBoxAriaLabelQuery":"Suggestion: {0}","_ui/autoSuggestBoxAriaLabelQuery.comment":"Suggestion: query text (example: Suggestion: contoso)","ui/autoSuggestBoxAriaLabelSeparator":"Separator: {0}","_ui/autoSuggestBoxAriaLabelSeparator.comment":"Separator: separator text (example: Separator: People or Separator: Apps)","ui/autoSuggestBoxAriaLabelResult":"Result: {0}, {1}","_ui/autoSuggestBoxAriaLabelResult.comment":"Result: text, detailed text (example: Result: contoso, www.contoso.com)","ui/averageRating":"Average Rating","ui/backbuttonarialabel":"Back","ui/chapterSkipBackMediaCommandDisplayText":"Chapter back","ui/chapterSkipForwardMediaCommandDisplayText":"Chapter forward","ui/clearYourRating":"Clear your rating","ui/closedCaptionsLabelNone":"Off","ui/closedCaptionsMediaCommandDisplayText":"Closed captioning","ui/closeOverlay":"Close","ui/commandingSurfaceAriaLabel":"CommandingSurface","ui/commandingSurfaceOverflowButtonAriaLabel":"View more","ui/datePicker":"Date Picker","ui/fastForwardMediaCommandDisplayText":"Fast forward","ui/fastForwardFeedbackDisplayText":" {0}X","ui/fastForwardFeedbackSlowMotionDisplayText":"0.5X","ui/flipViewPanningContainerAriaLabel":"Scrolling Container","ui/flyoutAriaLabel":"Flyout","ui/goToFullScreenButtonLabel":"Go full screen","ui/goToLiveMediaCommandDisplayText":"LIVE","ui/hubViewportAriaLabel":"Scrolling Container","ui/listViewViewportAriaLabel":"Scrolling Container","ui/mediaErrorAborted":"Playback was interrupted. Please try again.","ui/mediaErrorNetwork":"There was a network connection error.","ui/mediaErrorDecode":"The content could not be decoded","ui/mediaErrorSourceNotSupported":"This content type is not supported.","ui/mediaErrorUnknown":"There was an unknown error.","ui/mediaPlayerAudioTracksButtonLabel":"Audio tracks","ui/mediaPlayerCastButtonLabel":"Cast","ui/mediaPlayerChapterSkipBackButtonLabel":"Previous","ui/mediaPlayerChapterSkipForwardButtonLabel":"Next","ui/mediaPlayerClosedCaptionsButtonLabel":"Closed captions","ui/mediaPlayerFastForwardButtonLabel":"Fast forward","ui/mediaPlayerFullscreenButtonLabel":"Fullscreen","ui/mediaPlayerLiveButtonLabel":"LIVE","ui/mediaPlayerNextTrackButtonLabel":"Next","ui/mediaPlayerOverlayActiveOptionIndicator":"(On)","ui/mediaPlayerPauseButtonLabel":"Pause","ui/mediaPlayerPlayButtonLabel":"Play","ui/mediaPlayerPlayFromBeginningButtonLabel":"Replay","ui/mediaPlayerPlayRateButtonLabel":"Playback rate","ui/mediaPlayerPreviousTrackButtonLabel":"Previous","ui/mediaPlayerRewindButtonLabel":"Rewind","ui/mediaPlayerStopButtonLabel":"Stop","ui/mediaPlayerTimeSkipBackButtonLabel":"8 second replay","ui/mediaPlayerTimeSkipForwardButtonLabel":"30 second skip","ui/mediaPlayerToggleSnapButtonLabel":"Snap","ui/mediaPlayerVolumeButtonLabel":"Volume","ui/mediaPlayerZoomButtonLabel":"Zoom","ui/menuCommandAriaLabel":"Menu Item","ui/menuAriaLabel":"Menu","ui/navBarContainerViewportAriaLabel":"Scrolling Container","ui/nextTrackMediaCommandDisplayText":"Next track","ui/off":"Off","ui/on":"On","ui/pauseMediaCommandDisplayText":"Pause","ui/playFromBeginningMediaCommandDisplayText":"Play again","ui/playbackRateHalfSpeedLabel":"0.5x","ui/playbackRateNormalSpeedLabel":"Normal","ui/playbackRateOneAndHalfSpeedLabel":"1.5x","ui/playbackRateDoubleSpeedLabel":"2x","ui/playMediaCommandDisplayText":"Play","ui/pivotAriaLabel":"Pivot","ui/pivotViewportAriaLabel":"Scrolling Container","ui/replayMediaCommandDisplayText":"Play again","ui/rewindMediaCommandDisplayText":"Rewind","ui/rewindFeedbackDisplayText":" {0}X","ui/rewindFeedbackSlowMotionDisplayText":"0.5X","ui/searchBoxAriaLabel":"Searchbox","ui/searchBoxAriaLabelInputNoPlaceHolder":"Searchbox, enter to submit query, esc to clear text","ui/searchBoxAriaLabelInputPlaceHolder":"Searchbox, {0}, enter to submit query, esc to clear text","ui/searchBoxAriaLabelButton":"Click to submit query","ui/seeMore":"See more","ui/selectAMPM":"Select A.M P.M","ui/selectDay":"Select Day","ui/selectHour":"Select Hour","ui/selectMinute":"Select Minute","ui/selectMonth":"Select Month","ui/selectYear":"Select Year","ui/settingsFlyoutAriaLabel":"Settings Flyout","ui/stopMediaCommandDisplayText":"Stop","ui/tentativeRating":"Tentative Rating","ui/timePicker":"Time Picker","ui/timeSeparator":":","ui/timeSkipBackMediaCommandDisplayText":"Skip back","ui/timeSkipForwardMediaCommandDisplayText":"Skip forward","ui/toolbarAriaLabel":"ToolBar","ui/toolbarOverflowButtonAriaLabel":"View more","ui/unrated":"Unrated","ui/userRating":"User Rating","ui/zoomMediaCommandDisplayText":"Zoom","ui/appBarIcons/previous":"","_ui/appBarIcons/previous.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/next":"","_ui/appBarIcons/next.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/play":"","_ui/appBarIcons/play.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/pause":"","_ui/appBarIcons/pause.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/edit":"","_ui/appBarIcons/edit.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/save":"","_ui/appBarIcons/save.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/clear":"","_ui/appBarIcons/clear.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/delete":"","_ui/appBarIcons/delete.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/remove":"","_ui/appBarIcons/remove.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/add":"","_ui/appBarIcons/add.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/cancel":"","_ui/appBarIcons/cancel.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/accept":"","_ui/appBarIcons/accept.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/more":"","_ui/appBarIcons/more.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/redo":"","_ui/appBarIcons/redo.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/undo":"","_ui/appBarIcons/undo.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/home":"","_ui/appBarIcons/home.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/up":"","_ui/appBarIcons/up.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/forward":"","_ui/appBarIcons/forward.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/right":"","_ui/appBarIcons/right.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/back":"","_ui/appBarIcons/back.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/left":"","_ui/appBarIcons/left.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/favorite":"","_ui/appBarIcons/favorite.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/camera":"","_ui/appBarIcons/camera.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/settings":"","_ui/appBarIcons/settings.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/video":"","_ui/appBarIcons/video.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/sync":"","_ui/appBarIcons/sync.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/download":"","_ui/appBarIcons/download.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/mail":"","_ui/appBarIcons/mail.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/find":"","_ui/appBarIcons/find.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/help":"","_ui/appBarIcons/help.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/upload":"","_ui/appBarIcons/upload.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/emoji":"","_ui/appBarIcons/emoji.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/twopage":"","_ui/appBarIcons/twopage.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/leavechat":"","_ui/appBarIcons/leavechat.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/mailforward":"","_ui/appBarIcons/mailforward.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/clock":"","_ui/appBarIcons/clock.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/send":"","_ui/appBarIcons/send.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/crop":"","_ui/appBarIcons/crop.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/rotatecamera":"","_ui/appBarIcons/rotatecamera.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/people":"","_ui/appBarIcons/people.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/closepane":"","_ui/appBarIcons/closepane.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/openpane":"","_ui/appBarIcons/openpane.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/world":"","_ui/appBarIcons/world.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/flag":"","_ui/appBarIcons/flag.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/previewlink":"","_ui/appBarIcons/previewlink.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/globe":"","_ui/appBarIcons/globe.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/trim":"","_ui/appBarIcons/trim.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/attachcamera":"","_ui/appBarIcons/attachcamera.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/zoomin":"","_ui/appBarIcons/zoomin.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/bookmarks":"","_ui/appBarIcons/bookmarks.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/document":"","_ui/appBarIcons/document.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/protecteddocument":"","_ui/appBarIcons/protecteddocument.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/page":"","_ui/appBarIcons/page.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/bullets":"","_ui/appBarIcons/bullets.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/comment":"","_ui/appBarIcons/comment.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/mail2":"","_ui/appBarIcons/mail2.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/contactinfo":"","_ui/appBarIcons/contactinfo.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/hangup":"","_ui/appBarIcons/hangup.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/viewall":"","_ui/appBarIcons/viewall.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/mappin":"","_ui/appBarIcons/mappin.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/phone":"","_ui/appBarIcons/phone.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/videochat":"","_ui/appBarIcons/videochat.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/switch":"","_ui/appBarIcons/switch.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/contact":"","_ui/appBarIcons/contact.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/rename":"","_ui/appBarIcons/rename.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/pin":"","_ui/appBarIcons/pin.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/musicinfo":"","_ui/appBarIcons/musicinfo.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/go":"","_ui/appBarIcons/go.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/keyboard":"","_ui/appBarIcons/keyboard.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/dockleft":"","_ui/appBarIcons/dockleft.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/dockright":"","_ui/appBarIcons/dockright.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/dockbottom":"","_ui/appBarIcons/dockbottom.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/remote":"","_ui/appBarIcons/remote.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/refresh":"","_ui/appBarIcons/refresh.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/rotate":"","_ui/appBarIcons/rotate.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/shuffle":"","_ui/appBarIcons/shuffle.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/list":"","_ui/appBarIcons/list.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/shop":"","_ui/appBarIcons/shop.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/selectall":"","_ui/appBarIcons/selectall.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/orientation":"","_ui/appBarIcons/orientation.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/import":"","_ui/appBarIcons/import.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/importall":"","_ui/appBarIcons/importall.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/browsephotos":"","_ui/appBarIcons/browsephotos.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/webcam":"","_ui/appBarIcons/webcam.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/pictures":"","_ui/appBarIcons/pictures.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/savelocal":"","_ui/appBarIcons/savelocal.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/caption":"","_ui/appBarIcons/caption.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/stop":"","_ui/appBarIcons/stop.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/showresults":"","_ui/appBarIcons/showresults.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/volume":"","_ui/appBarIcons/volume.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/repair":"","_ui/appBarIcons/repair.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/message":"","_ui/appBarIcons/message.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/page2":"","_ui/appBarIcons/page2.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/calendarday":"","_ui/appBarIcons/calendarday.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/calendarweek":"","_ui/appBarIcons/calendarweek.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/calendar":"","_ui/appBarIcons/calendar.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/characters":"","_ui/appBarIcons/characters.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/mailreplyall":"","_ui/appBarIcons/mailreplyall.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/read":"","_ui/appBarIcons/read.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/link":"","_ui/appBarIcons/link.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/accounts":"","_ui/appBarIcons/accounts.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/showbcc":"","_ui/appBarIcons/showbcc.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/hidebcc":"","_ui/appBarIcons/hidebcc.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/cut":"","_ui/appBarIcons/cut.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/attach":"","_ui/appBarIcons/attach.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/paste":"","_ui/appBarIcons/paste.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/filter":"","_ui/appBarIcons/filter.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/copy":"","_ui/appBarIcons/copy.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/emoji2":"","_ui/appBarIcons/emoji2.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/important":"","_ui/appBarIcons/important.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/mailreply":"","_ui/appBarIcons/mailreply.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/slideshow":"","_ui/appBarIcons/slideshow.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/sort":"","_ui/appBarIcons/sort.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/manage":"","_ui/appBarIcons/manage.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/allapps":"","_ui/appBarIcons/allapps.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/disconnectdrive":"","_ui/appBarIcons/disconnectdrive.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/mapdrive":"","_ui/appBarIcons/mapdrive.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/newwindow":"","_ui/appBarIcons/newwindow.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/openwith":"","_ui/appBarIcons/openwith.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/contactpresence":"","_ui/appBarIcons/contactpresence.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/priority":"","_ui/appBarIcons/priority.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/uploadskydrive":"","_ui/appBarIcons/uploadskydrive.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/gototoday":"","_ui/appBarIcons/gototoday.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/font":"","_ui/appBarIcons/font.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/fontcolor":"","_ui/appBarIcons/fontcolor.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/contact2":"","_ui/appBarIcons/contact2.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/folder":"","_ui/appBarIcons/folder.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/audio":"","_ui/appBarIcons/audio.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/placeholder":"","_ui/appBarIcons/placeholder.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/view":"","_ui/appBarIcons/view.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/setlockscreen":"","_ui/appBarIcons/setlockscreen.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/settile":"","_ui/appBarIcons/settile.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/cc":"","_ui/appBarIcons/cc.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/stopslideshow":"","_ui/appBarIcons/stopslideshow.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/permissions":"","_ui/appBarIcons/permissions.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/highlight":"","_ui/appBarIcons/highlight.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/disableupdates":"","_ui/appBarIcons/disableupdates.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/unfavorite":"","_ui/appBarIcons/unfavorite.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/unpin":"","_ui/appBarIcons/unpin.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/openlocal":"","_ui/appBarIcons/openlocal.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/mute":"","_ui/appBarIcons/mute.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/italic":"","_ui/appBarIcons/italic.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/underline":"","_ui/appBarIcons/underline.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/bold":"","_ui/appBarIcons/bold.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/movetofolder":"","_ui/appBarIcons/movetofolder.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/likedislike":"","_ui/appBarIcons/likedislike.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/dislike":"","_ui/appBarIcons/dislike.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/like":"","_ui/appBarIcons/like.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/alignright":"","_ui/appBarIcons/alignright.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/aligncenter":"","_ui/appBarIcons/aligncenter.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/alignleft":"","_ui/appBarIcons/alignleft.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/zoom":"","_ui/appBarIcons/zoom.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/zoomout":"","_ui/appBarIcons/zoomout.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/openfile":"","_ui/appBarIcons/openfile.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/otheruser":"","_ui/appBarIcons/otheruser.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/admin":"","_ui/appBarIcons/admin.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/street":"","_ui/appBarIcons/street.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/map":"","_ui/appBarIcons/map.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/clearselection":"","_ui/appBarIcons/clearselection.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/fontdecrease":"","_ui/appBarIcons/fontdecrease.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/fontincrease":"","_ui/appBarIcons/fontincrease.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/fontsize":"","_ui/appBarIcons/fontsize.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/cellphone":"","_ui/appBarIcons/cellphone.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/print":"","_ui/appBarIcons/print.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/share":"","_ui/appBarIcons/share.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/reshare":"","_ui/appBarIcons/reshare.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/tag":"","_ui/appBarIcons/tag.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/repeatone":"","_ui/appBarIcons/repeatone.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/repeatall":"","_ui/appBarIcons/repeatall.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/outlinestar":"","_ui/appBarIcons/outlinestar.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/solidstar":"","_ui/appBarIcons/solidstar.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/calculator":"","_ui/appBarIcons/calculator.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/directions":"","_ui/appBarIcons/directions.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/target":"","_ui/appBarIcons/target.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/library":"","_ui/appBarIcons/library.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/phonebook":"","_ui/appBarIcons/phonebook.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/memo":"","_ui/appBarIcons/memo.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/microphone":"","_ui/appBarIcons/microphone.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/postupdate":"","_ui/appBarIcons/postupdate.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/backtowindow":"","_ui/appBarIcons/backtowindow.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/fullscreen":"","_ui/appBarIcons/fullscreen.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/newfolder":"","_ui/appBarIcons/newfolder.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/calendarreply":"","_ui/appBarIcons/calendarreply.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/unsyncfolder":"","_ui/appBarIcons/unsyncfolder.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/reporthacked":"","_ui/appBarIcons/reporthacked.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/syncfolder":"","_ui/appBarIcons/syncfolder.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/blockcontact":"","_ui/appBarIcons/blockcontact.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/switchapps":"","_ui/appBarIcons/switchapps.comment":"{Locked=qps-ploc,qps-plocm}",
-"ui/appBarIcons/addfriend":"","_ui/appBarIcons/addfriend.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/touchpointer":"","_ui/appBarIcons/touchpointer.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/gotostart":"","_ui/appBarIcons/gotostart.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/zerobars":"","_ui/appBarIcons/zerobars.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/onebar":"","_ui/appBarIcons/onebar.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/twobars":"","_ui/appBarIcons/twobars.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/threebars":"","_ui/appBarIcons/threebars.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/fourbars":"","_ui/appBarIcons/fourbars.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/scan":"","_ui/appBarIcons/scan.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/preview":"","_ui/appBarIcons/preview.comment":"{Locked=qps-ploc,qps-plocm}","ui/appBarIcons/hamburger":"","_ui/appBarIcons/hamburger.comment":"{Locked=qps-ploc,qps-plocm}"}),define("WinJS/Core/_Resources",["exports","./_Global","./_WinRT","./_Base","./_Events","require-json!strings/en-us/Microsoft.WinJS.resjson"],function(a,b,c,d,e,f){"use strict";function g(a){var b=s("ms-resource:///Microsoft.WinJS/"+a);return b.empty&&(b=h(a)),b}function h(a){var b=f[a];return"string"==typeof b&&(b={value:b}),b||{value:a,empty:!0}}function i(a){var b=arguments;return b.length>1&&(a=a.replace(/({{)|(}})|{(\d+)}|({)|(})/g,function(a,c,d,e,f,g){if(f||g)throw i(q.malformedFormatStringInput,f||g);return c&&"{"||d&&"}"||b[(0|e)+1]})),a}var j,k,l=!1,m="contextchanged",n=d.Class.mix(d.Class.define(null,{},{supportedForProcessing:!1}),e.eventMixin),o=new n,p=e._createEventProperty,q={get malformedFormatStringInput(){return"Malformed, did you mean to escape your '{0}'?"}};d.Namespace.define("WinJS.Resources",{_getWinJSString:g}),d.Namespace._moduleDefine(a,"WinJS.Resources",{addEventListener:function(b,d,e){if(c.Windows.ApplicationModel.Resources.Core.ResourceManager&&!l&&b===m)try{var f=a._getResourceContext();f?f.qualifierValues.addEventListener("mapchanged",function(b){a.dispatchEvent(m,{qualifier:b.key,changed:b.target[b.key]})},!1):c.Windows.ApplicationModel.Resources.Core.ResourceManager.current.defaultContext.qualifierValues.addEventListener("mapchanged",function(b){a.dispatchEvent(m,{qualifier:b.key,changed:b.target[b.key]})},!1),l=!0}catch(g){}o.addEventListener(b,d,e)},removeEventListener:o.removeEventListener.bind(o),dispatchEvent:o.dispatchEvent.bind(o),_formatString:i,_getStringWinRT:function(b){if(!j){var d=c.Windows.ApplicationModel.Resources.Core.ResourceManager.current.mainResourceMap;try{j=d.getSubtree("Resources")}catch(e){}j||(j=d)}var f,g,h;try{var i=a._getResourceContext();h=i?j.getValue(b,i):j.getValue(b),h&&(f=h.valueAsString,void 0===f&&(f=h.toString()))}catch(e){}if(!f)return a._getStringJS(b);try{g=h.getQualifierValue("Language")}catch(e){return{value:f}}return{value:f,lang:g}},_getStringJS:function(a){var c=b.strings&&b.strings[a];return"string"==typeof c&&(c={value:c}),c||{value:a,empty:!0}},_getResourceContext:function(){if(b.document&&"undefined"==typeof k){var a=c.Windows.ApplicationModel.Resources.Core.ResourceContext;k=a.getForCurrentView?a.getForCurrentView():null}return k},oncontextchanged:p(m)});var r=c.Windows.ApplicationModel.Resources.Core.ResourceManager?a._getStringWinRT:a._getStringJS,s=function(a){return r(a)};d.Namespace._moduleDefine(a,null,{_formatString:i,_getWinJSString:g}),d.Namespace._moduleDefine(a,"WinJS.Resources",{getString:{get:function(){return s},set:function(a){s=a}}})}),define("WinJS/Core/_Trace",["./_Global"],function(a){"use strict";function b(a){return a}return{_traceAsyncOperationStarting:a.Debug&&a.Debug.msTraceAsyncOperationStarting&&a.Debug.msTraceAsyncOperationStarting.bind(a.Debug)||b,_traceAsyncOperationCompleted:a.Debug&&a.Debug.msTraceAsyncOperationCompleted&&a.Debug.msTraceAsyncOperationCompleted.bind(a.Debug)||b,_traceAsyncCallbackStarting:a.Debug&&a.Debug.msTraceAsyncCallbackStarting&&a.Debug.msTraceAsyncCallbackStarting.bind(a.Debug)||b,_traceAsyncCallbackCompleted:a.Debug&&a.Debug.msTraceAsyncCallbackCompleted&&a.Debug.msTraceAsyncCallbackCompleted.bind(a.Debug)||b}}),define("WinJS/Promise/_StateMachine",["../Core/_Global","../Core/_BaseCoreUtils","../Core/_Base","../Core/_ErrorFromName","../Core/_Events","../Core/_Trace"],function(a,b,c,d,e,f){"use strict";function g(){}function h(a,b){var c;c=b&&"object"==typeof b&&"function"==typeof b.then?I:M,a._value=b,a._setState(c)}function i(a,b,c,d,e,f){return{exception:a,error:b,promise:c,handler:f,id:d,parent:e}}function j(a,b,c,d){var e=c._isException,f=c._errorId;return i(e?b:null,e?null:b,a,f,c,d)}function k(a,b,c){var d=c._isException,e=c._errorId;return u(a,e,d),i(d?b:null,d?null:b,a,e,c)}function l(a,b){var c=++Q;return u(a,c),i(null,b,a,c)}function m(a,b){var c=++Q;return u(a,c,!0),i(b,null,a,c)}function n(a,b,c,d){var e=f._traceAsyncOperationStarting("WinJS.Promise.done");t(a,{c:b,e:c,p:d,asyncOpID:e})}function o(a,b,c,d){a._value=b,r(a,b,c,d),a._setState(O)}function p(b,c){var d=b._value,e=b._listeners;if(e){b._listeners=null;var g,h;for(g=0,h=Array.isArray(e)?e.length:1;h>g;g++){var i=1===h?e:e[g],j=i.c,k=i.promise;if(f._traceAsyncOperationCompleted(i.asyncOpID,a.Debug&&a.Debug.MS_ASYNC_OP_STATUS_SUCCESS),k){f._traceAsyncCallbackStarting(i.asyncOpID);try{k._setCompleteValue(j?j(d):d)}catch(l){k._setExceptionValue(l)}finally{f._traceAsyncCallbackCompleted()}k._state!==I&&k._listeners&&c.push(k)}else W.prototype.done.call(b,j)}}}function q(b,c){var d=b._value,e=b._listeners;if(e){b._listeners=null;var g,h;for(g=0,h=Array.isArray(e)?e.length:1;h>g;g++){var i=1===h?e:e[g],k=i.e,l=i.promise,m=a.Debug&&(d&&d.name===D?a.Debug.MS_ASYNC_OP_STATUS_CANCELED:a.Debug.MS_ASYNC_OP_STATUS_ERROR);if(f._traceAsyncOperationCompleted(i.asyncOpID,m),l){var n=!1;try{k?(f._traceAsyncCallbackStarting(i.asyncOpID),n=!0,k.handlesOnError||r(l,d,j,b,k),l._setCompleteValue(k(d))):l._setChainedErrorValue(d,b)}catch(o){l._setExceptionValue(o)}finally{n&&f._traceAsyncCallbackCompleted()}l._state!==I&&l._listeners&&c.push(l)}else U.prototype.done.call(b,null,k)}}}function r(a,b,c,d,e){if(B._listeners[C]){if(b instanceof Error&&b.message===D)return;B.dispatchEvent(C,c(a,b,d,e))}}function s(a,b){var c=a._listeners;if(c){var d,e;for(d=0,e=Array.isArray(c)?c.length:1;e>d;d++){var f=1===e?c:c[d],g=f.p;if(g)try{g(b)}catch(h){}f.c||f.e||!f.promise||f.promise._progress(b)}}}function t(a,b){var c=a._listeners;c?(c=Array.isArray(c)?c:[c],c.push(b)):c=b,a._listeners=c}function u(a,b,c){a._isException=c||!1,a._errorId=b}function v(a,b,c,d){a._value=b,r(a,b,c,d),a._setState(P)}function w(a,b){var c;c=b&&"object"==typeof b&&"function"==typeof b.then?I:N,a._value=b,a._setState(c)}function x(a,b,c,d){var e=new T(a),g=f._traceAsyncOperationStarting("WinJS.Promise.then");return t(a,{promise:e,c:b,e:c,p:d,asyncOpID:g}),e}function y(c){var d;return new X(function(e){c?d=a.setTimeout(e,c):b._setImmediate(e)},function(){d&&a.clearTimeout(d)})}function z(a,b){var c=function(){b.cancel()},d=function(){a.cancel()};return a.then(c),b.then(d,d),b}a.Debug&&(a.Debug.setNonUserCodeExceptions=!0);var A=c.Class.mix(c.Class.define(null,{},{supportedForProcessing:!1}),e.eventMixin),B=new A;B._listeners={};var C="error",D="Canceled",E=!1,F={promise:1,thenPromise:2,errorPromise:4,exceptionPromise:8,completePromise:16};F.all=F.promise|F.thenPromise|F.errorPromise|F.exceptionPromise|F.completePromise;var G,H,I,J,K,L,M,N,O,P,Q=1;G={name:"created",enter:function(a){a._setState(H)},cancel:g,done:g,then:g,_completed:g,_error:g,_notify:g,_progress:g,_setCompleteValue:g,_setErrorValue:g},H={name:"working",enter:g,cancel:function(a){a._setState(K)},done:n,then:x,_completed:h,_error:o,_notify:g,_progress:s,_setCompleteValue:w,_setErrorValue:v},I={name:"waiting",enter:function(a){var b=a._value;if(b instanceof T&&b._state!==P&&b._state!==N)t(b,{promise:a});else{var c=function(d){b._errorId?a._chainedError(d,b):(r(a,d,j,b,c),a._error(d))};c.handlesOnError=!0,b.then(a._completed.bind(a),c,a._progress.bind(a))}},cancel:function(a){a._setState(J)},done:n,then:x,_completed:h,_error:o,_notify:g,_progress:s,_setCompleteValue:w,_setErrorValue:v},J={name:"waiting_canceled",enter:function(a){a._setState(L);var b=a._value;b.cancel&&b.cancel()},cancel:g,done:n,then:x,_completed:h,_error:o,_notify:g,_progress:s,_setCompleteValue:w,_setErrorValue:v},K={name:"canceled",enter:function(a){a._setState(L),a._cancelAction()},cancel:g,done:n,then:x,_completed:h,_error:o,_notify:g,_progress:s,_setCompleteValue:w,_setErrorValue:v},L={name:"canceling",enter:function(a){var b=new Error(D);b.name=b.message,a._value=b,a._setState(O)},cancel:g,done:g,then:g,_completed:g,_error:g,_notify:g,_progress:g,_setCompleteValue:g,_setErrorValue:g},M={name:"complete_notify",enter:function(a){if(a.done=W.prototype.done,a.then=W.prototype.then,a._listeners)for(var b,c=[a];c.length;)b=c.shift(),b._state._notify(b,c);a._setState(N)},cancel:g,done:null,then:null,_completed:g,_error:g,_notify:p,_progress:g,_setCompleteValue:g,_setErrorValue:g},N={name:"success",enter:function(a){a.done=W.prototype.done,a.then=W.prototype.then,a._cleanupAction()},cancel:g,done:null,then:null,_completed:g,_error:g,_notify:p,_progress:g,_setCompleteValue:g,_setErrorValue:g},O={name:"error_notify",enter:function(a){if(a.done=U.prototype.done,a.then=U.prototype.then,a._listeners)for(var b,c=[a];c.length;)b=c.shift(),b._state._notify(b,c);a._setState(P)},cancel:g,done:null,then:null,_completed:g,_error:g,_notify:q,_progress:g,_setCompleteValue:g,_setErrorValue:g},P={name:"error",enter:function(a){a.done=U.prototype.done,a.then=U.prototype.then,a._cleanupAction()},cancel:g,done:null,then:null,_completed:g,_error:g,_notify:q,_progress:g,_setCompleteValue:g,_setErrorValue:g};var R,S=c.Class.define(null,{_listeners:null,_nextState:null,_state:null,_value:null,cancel:function(){this._state.cancel(this),this._run()},done:function(a,b,c){this._state.done(this,a,b,c)},then:function(a,b,c){return this._state.then(this,a,b,c)},_chainedError:function(a,b){var c=this._state._error(this,a,k,b);return this._run(),c},_completed:function(a){var b=this._state._completed(this,a);return this._run(),b},_error:function(a){var b=this._state._error(this,a,l);return this._run(),b},_progress:function(a){this._state._progress(this,a)},_setState:function(a){this._nextState=a},_setCompleteValue:function(a){this._state._setCompleteValue(this,a),this._run()},_setChainedErrorValue:function(a,b){var c=this._state._setErrorValue(this,a,k,b);return this._run(),c},_setExceptionValue:function(a){var b=this._state._setErrorValue(this,a,m);return this._run(),b},_run:function(){for(;this._nextState;)this._state=this._nextState,this._nextState=null,this._state.enter(this)}},{supportedForProcessing:!1}),T=c.Class.derive(S,function(a){E&&(E===!0||E&F.thenPromise)&&(this._stack=X._getStack()),this._creator=a,this._setState(G),this._run()},{_creator:null,_cancelAction:function(){this._creator&&this._creator.cancel()},_cleanupAction:function(){this._creator=null}},{supportedForProcessing:!1}),U=c.Class.define(function(a){E&&(E===!0||E&F.errorPromise)&&(this._stack=X._getStack()),this._value=a,r(this,a,l)},{cancel:function(){},done:function(a,b){var c=this._value;if(b)try{b.handlesOnError||r(null,c,j,this,b);var d=b(c);return void(d&&"object"==typeof d&&"function"==typeof d.done&&d.done())}catch(e){c=e}c instanceof Error&&c.message===D||X._doneHandler(c)},then:function(a,b){if(!b)return this;var c,d=this._value;try{b.handlesOnError||r(null,d,j,this,b),c=new W(b(d))}catch(e){c=e===d?this:new V(e)}return c}},{supportedForProcessing:!1}),V=c.Class.derive(U,function(a){E&&(E===!0||E&F.exceptionPromise)&&(this._stack=X._getStack()),this._value=a,r(this,a,m)},{},{supportedForProcessing:!1}),W=c.Class.define(function(a){if(E&&(E===!0||E&F.completePromise)&&(this._stack=X._getStack()),a&&"object"==typeof a&&"function"==typeof a.then){var b=new T(null);return b._setCompleteValue(a),b}this._value=a},{cancel:function(){},done:function(a){if(a)try{var b=a(this._value);b&&"object"==typeof b&&"function"==typeof b.done&&b.done()}catch(c){X._doneHandler(c)}},then:function(a){try{var b=a?a(this._value):this._value;return b===this._value?this:new W(b)}catch(c){return new V(c)}}},{supportedForProcessing:!1}),X=c.Class.derive(S,function(a,b){E&&(E===!0||E&F.promise)&&(this._stack=X._getStack()),this._oncancel=b,this._setState(G),this._run();try{var c=this._completed.bind(this),d=this._error.bind(this),e=this._progress.bind(this);a(c,d,e)}catch(f){this._setExceptionValue(f)}},{_oncancel:null,_cancelAction:function(){if(this._oncancel)try{this._oncancel()}catch(a){}},_cleanupAction:function(){this._oncancel=null}},{addEventListener:function(a,b,c){B.addEventListener(a,b,c)},any:function(a){return new X(function(b,c){var d=Object.keys(a);0===d.length&&b();var e=0;d.forEach(function(f){X.as(a[f]).then(function(){b({key:f,value:a[f]})},function(g){return g instanceof Error&&g.name===D?void(++e===d.length&&b(X.cancel)):void c({key:f,value:a[f]})})})},function(){var b=Object.keys(a);b.forEach(function(b){var c=X.as(a[b]);"function"==typeof c.cancel&&c.cancel()})})},as:function(a){return a&&"object"==typeof a&&"function"==typeof a.then?a:new W(a)},cancel:{get:function(){return R=R||new U(new d(D))}},dispatchEvent:function(a,b){return B.dispatchEvent(a,b)},is:function(a){return a&&"object"==typeof a&&"function"==typeof a.then},join:function(a){return new X(function(b,c,d){var e=Object.keys(a),f=Array.isArray(a)?[]:{},g=Array.isArray(a)?[]:{},h=0,i=e.length,j=function(a){if(0===--i){var h=Object.keys(f).length;if(0===h)b(g);else{var j=0;e.forEach(function(a){var b=f[a];b instanceof Error&&b.name===D&&j++}),j===h?b(X.cancel):c(f)}}else d({Key:a,Done:!0})};return e.forEach(function(b){var c=a[b];void 0===c?h++:X.then(c,function(a){g[b]=a,j(b)},function(a){f[b]=a,j(b)})}),i-=h,0===i?void b(g):void 0},function(){Object.keys(a).forEach(function(b){var c=X.as(a[b]);"function"==typeof c.cancel&&c.cancel()})})},removeEventListener:function(a,b,c){B.removeEventListener(a,b,c)},supportedForProcessing:!1,then:function(a,b,c,d){return X.as(a).then(b,c,d)},thenEach:function(a,b,c,d){var e=Array.isArray(a)?[]:{};return Object.keys(a).forEach(function(f){e[f]=X.as(a[f]).then(b,c,d)}),X.join(e)},timeout:function(a,b){var c=y(a);return b?z(c,b):c},wrap:function(a){return new W(a)},wrapError:function(a){return new U(a)},_veryExpensiveTagWithStack:{get:function(){return E},set:function(a){E=a}},_veryExpensiveTagWithStack_tag:F,_getStack:function(){if(a.Debug&&a.Debug.debuggerEnabled)try{throw new Error}catch(b){return b.stack}},_cancelBlocker:function(a,b){if(!X.is(a))return X.wrap(a);var c,d,e=new X(function(a,b){c=a,d=b},function(){c=null,d=null,b&&b()});return a.then(function(a){c&&c(a)},function(a){d&&d(a)}),e}});return Object.defineProperties(X,e.createEventProperties(C)),X._doneHandler=function(a){b._setImmediate(function(){throw a})},{PromiseStateMachine:S,Promise:X,state_created:G}}),define("WinJS/Promise",["./Core/_Base","./Promise/_StateMachine"],function(a,b){"use strict";return a.Namespace.define("WinJS",{Promise:b.Promise}),b.Promise}),define("WinJS/Core/_Log",["exports","./_Global","./_Base"],function(a,b,c){"use strict";function d(a,b,c){var d=a;return"function"==typeof d&&(d=d()),(c&&h.test(c)?"":c?c+": ":"")+(b?b.replace(g,":")+": ":"")+d}function e(c,d,e){var f=a.formatLog(c,d,e);b.console&&b.console[e&&h.test(e)?e:"log"](f)}function f(a){return a.replace(/[-[\]{}()*+?.,\\^$|#]/g,"\\$&")}var g=/\s+/g,h=/^(error|warn|info|log)$/,i=null;c.Namespace._moduleDefine(a,"WinJS.Utilities",{startLog:function(b){b=b||{},"string"==typeof b&&(b={tags:b});var c=b.type&&new RegExp("^("+f(b.type).replace(g," ").split(" ").join("|")+")$"),d=b.excludeTags&&new RegExp("(^|\\s)("+f(b.excludeTags).replace(g," ").split(" ").join("|")+")(\\s|$)","i"),h=b.tags&&new RegExp("(^|\\s)("+f(b.tags).replace(g," ").split(" ").join("|")+")(\\s|$)","i"),i=b.action||e;if(!(c||d||h||a.log))return void(a.log=i);var j=function(a,b,e){c&&!c.test(e)||d&&d.test(b)||h&&!h.test(b)||i(a,b,e),j.next&&j.next(a,b,e)};j.next=a.log,a.log=j},stopLog:function(){a.log=null},formatLog:d}),c.Namespace._moduleDefine(a,"WinJS",{log:{get:function(){return i},set:function(a){i=a}}})}),define("WinJS/Scheduler",["exports","./Core/_Global","./Core/_Base","./Core/_ErrorFromName","./Core/_Log","./Core/_Resources","./Core/_Trace","./Core/_WriteProfilerMark","./Promise"],function(a,b,c,d,e,f,g,h,i){"use strict";function j(a){var b={},c="_prev"+a,d="_next"+a;return b["_remove"+a]=function(){var a=this[c],b=this[d];b&&(b[c]=a),a&&(a[d]=b),this[c]=null,this[d]=null},b["_insert"+a+"Before"]=function(a){var b=this[c];return b&&(b[d]=a),a[d]=this,a[c]=b,this[c]=a,a},b["_insert"+a+"After"]=function(a){var b=this[d];return this[d]=a,a[d]=b,a[c]=this,b&&(b[c]=a),a},b}function k(a,b,c){return void 0!==c?"("+a+";"+b+";"+c+")":void 0!==b?"("+a+";"+b+")":void 0!==a?"("+a+")":""}function l(a,b,c,d){h("WinJS.Scheduler:"+a+k(c,d)+","+b)}function m(a,b,c,d,e){var f=a.name||void 0!==d||void 0!==e;h("WinJS.Scheduler:"+b+":"+a.id+(f?k(a.name,d,e):"")+","+c)}function n(){return!1}function o(a){throw"Illegal call by job("+a.id+") in state: "+this.name}function p(a){return function(b,c,d){b._setState(a,c,d)}}function q(a,b){a._setPriority(b)}function r(a,b){function c(a,b){e.log&&e.log(b+": MARKER: "+a.name,"winjs scheduler","log")}function d(a,b){e.log&&e.log(b+": JOB("+a.id+"): state: "+(a._state?a._state.name:"")+(a.name?", name: "+a.name:""),"winjs scheduler","log")}e.log&&e.log("highWaterMark: "+Ba,"winjs scheduler","log");var f=0,g=b?va[va.length-1]:va[0],h=g;do h instanceof ma&&c(h,f),h instanceof S&&d(h,f),f++,h=b?h["_prev"+a]:h["_next"+a];while(h)}function s(){function a(a,c){b+="    "+(c?"*":" ")+"id: "+a.id+", priority: "+I(a.priority).name+(a.name?", name: "+a.name:"")+"\n"}var b="";b+="Jobs:\n";var c=I(Ba),d=0;for(xa&&(a(xa,!0),d++);c.priority>=ua.min;)c instanceof S&&(a(c,!1),d++),c=c._nextJob;0===d&&(b+="     None\n"),b+="Drain requests:\n";for(var e=0,f=za.length;f>e;e++)b+="    "+(0===e?"*":" ")+"priority: "+I(za[e].priority).name+", name: "+za[e].name+"\n";return 0===za.length&&(b+="     None\n"),b}function t(){var a=va[0];do{if(a instanceof S)return!1;a=a._nextJob}while(a);return!0}function u(){return 0===za.length?null:za[0].priority}function v(a){l("drain","StartTM",a.name,I(a.priority).name)}function w(a,b){b&&l("drain-canceled","info",a.name,I(a.priority).name),l("drain","StopTM",a.name,I(a.priority).name)}function x(a,b,c){za.push({priority:a,complete:b,name:c}),1===za.length&&(v(za[0]),a>Ba&&(Ba=a,pa=!0))}function y(a,b){var c,d=za.length;for(c=0;d>c;c++)if(za[c].complete===a){0===c&&(w(za[0],b),za[1]&&v(za[1])),za.splice(c,1);break}}function z(){var a=za.shift();a&&(w(a),za[0]&&v(za[0]),a.complete())}function A(){var a=!1;if(za.length)for(var b=u();+b===b&&b>Ba;)oa=b,z(),a=!0,b=u();return a}function B(a){return a>=ua.aboveNormal+1?Ea.HIGH:a>=ua.belowNormal?Ea.NORMAL:Ea.IDLE}function C(a,b){return Fa[a]>=Fa[b]}function D(a,b){return Fa[a]>Fa[b]}function E(a){switch(a){case Ea.HIGH:return!1;case Ea.NORMAL:return Ea.isTaskScheduledAtPriorityOrHigher(Ea.HIGH);case Ea.IDLE:return Ea.isTaskScheduledAtPriorityOrHigher(Ea.NORMAL)}}function F(a,b){var c=I(b);c.priority>Ba&&(Ba=c.priority,pa=!0),c._insertJobAfter(a)}function G(a,b){var c=I(b);c.priority>Ba&&(Ba=c.priority,pa=!0),c._nextMarker._insertJobBefore(a)}function H(a){return a=0|a,a=Math.max(a,sa),a=Math.min(a,ta)}function I(a){return a=H(a),va[-1*(a-ta)]}function J(a){na=!0,l("timeslice","StartTM");var b,c,d,e=!0,f=!1,g=!1;pa=!1;try{for(var h=Ga(),i=h+Aa,j=function(){return f=!1,pa?!0:E(B(Ba))?!0:za.length?!1:Ga()>i?(f=!0,!0):!1};Ba>=ua.min&&!j()&&!g;){b=!1,c=I(Ba)._nextJob;do{if(oa=c.priority,c instanceof S)d!==c.priority&&(+d===d&&l("priority","StopTM",I(d).name),l("priority","StartTM",I(c.priority).name),d=c.priority),b=!0,e=!1,xa=c,m(xa,"job-running","StartTM",I(oa).name),c._execute(j),m(xa,"job-running","StopTM",I(oa).name),xa=null,e=!0;else{var k=B(Ba);Ba=c.priority,b=A();var n=B(Ba);!D(k,n)||ya&&!Ea.isTaskScheduledAtPriorityOrHigher(n)||(g=!0)}c=c._nextJob}while(c&&!b&&!g&&!E(B(Ba)));pa=!1}}finally{xa=null,e||(m(c,"job-error","info"),m(c,"job-running","StopTM",I(oa).name),c.cancel()),+d===d&&l("priority","StopTM",I(d).name);for(var o=!1;Ba>=ua.min&&!o;){b=!1,c=I(Ba)._nextJob;do c instanceof S?o=!0:(Ba=c.priority,b=A()),c=c._nextJob;while(c&&!b&&!o)}var p;p=e?f?"timeslice exhausted":Ba<ua.min?"jobs exhausted":g?"reached WWA priority boundary":"WWA host work":"job error",a&&(wa=null),na=!1,Ba>=ua.min&&K(),l("yielding","info",p),l("timeslice","StopTM")}}function K(a){+a!==a&&(a=Ba);var b=B(a);if(!na&&(!wa||ya&&!C(wa,b))){var c=++Ha,d=function(){c>Ia&&(Ia=Ha,J(!0))};Ea.execAsyncAtPriority(d,b),wa=b}}function L(a,b){var c=ra++;void 0===b&&(b="Drain Request "+c),a=+a===a?a:ua.min,a=H(a);var d,e=new i(function(c){d=c,x(a,d,b)},function(){y(d,!0)});return na||K(),e}function M(a){return Ea.execAtPriority(a,Ea.HIGH)}function N(){return new V}function O(a,b,c,d){b=b||ua.normal,c=c||null;var e=++qa,f=g._traceAsyncOperationStarting("WinJS.Utilities.Scheduler.schedule: "+e+k(d));return d=d||"",new S(e,a,b,c,d,f)}function P(){if(na)return oa;switch(Ea.getCurrentPriority()){case Ea.HIGH:return ua.high;case Ea.NORMAL:return ua.normal;case Ea.IDLE:return ua.idle}}function Q(a){return function(b,c){var d;return new i(function(e){d=O(function(){e(b)},a,null,c)},function(){d.cancel()})}}c.Namespace.define("WinJS.Utilities",{_linkedListMixin:j});var R={get jobInfoIsNoLongerValid(){return"The job info object can only be used while the job is running"}},S=c.Class.define(function(a,b,c,d,e,f){this._id=a,this._work=b,this._context=d,this._name=e,this._asyncOpID=f,this._setPriority(c),this._setState(X),m(this,"job-scheduled","info")},{completed:{get:function(){return!!this._state.completed}},id:{get:function(){return this._id}},name:{get:function(){return this._name},set:function(a){this._name=a}},owner:{get:function(){return this._owner},set:function(a){this._owner&&this._owner._remove(this),this._owner=a,this._owner&&this._owner._add(this)}},priority:{get:function(){return this._priority},set:function(a){a=H(a),this._state.setPriority(this,a)}},cancel:function(){this._state.cancel(this)},pause:function(){this._state.pause(this)},resume:function(){this._state.resume(this)},_execute:function(a){this._state.execute(this,a)},_executeDone:function(a){return this._state.executeDone(this,a)},_blockedDone:function(a){return this._state.blockedDone(this,a)},_setPriority:function(a){+this._priority===this._priority&&this._priority!==a&&m(this,"job-priority-changed","info",I(this._priority).name,I(a).name),this._priority=a},_setState:function(a,b,c){this._state&&e.log&&e.log("Transitioning job ("+this.id+") from: "+this._state.name+" to: "+a.name,"winjs scheduler","log"),this._state=a,this._state.enter(this,b,c)}});c.Class.mix(S,j("Job"));var T={complete:1,"continue":2,block:3},U=c.Class.define(function(a,b){this._job=b,this._result=null,this._yieldPolicy=T.complete,this._shouldYield=a},{job:{get:function(){return this._throwIfDisabled(),this._job}},shouldYield:{get:function(){return this._throwIfDisabled(),this._shouldYield()}},setPromise:function(a){this._throwIfDisabled(),this._result=a,this._yieldPolicy=T.block},setWork:function(a){this._throwIfDisabled(),this._result=a,this._yieldPolicy=T["continue"]},_disablePublicApi:function(){this._publicApiDisabled=!0},_throwIfDisabled:function(){if(this._publicApiDisabled)throw new d("WinJS.Utilities.Scheduler.JobInfoIsNoLongerValid",R.jobInfoIsNoLongerValid)}}),V=c.Class.define(function(){this._jobs={}},{cancelAll:function(){var a=this._jobs,b=Object.keys(a);this._jobs={};for(var c=0,d=b.length;d>c;c++)a[b[c]].cancel()},_add:function(a){this._jobs[a.id]=a},_remove:function(a){delete this._jobs[a.id]}}),W=c.Class.define(function(a){this.name=a,this.enter=o,this.execute=o,this.executeDone=o,this.blockedDone=o,this.cancel=o,this.pause=o,this.resume=o,this.setPriority=o}),X=new W("created"),Y=new W("scheduled"),Z=new W("paused"),$=new W("canceled"),_=new W("running"),aa=new W("running_paused"),ba=new W("running_resumed"),ca=new W("running_canceled"),da=new W("running_canceled_blocked"),ea=new W("cooperative_yield"),fa=new W("cooperative_yield_paused"),ga=new W("blocked"),ha=new W("blocked_waiting"),ia=new W("blocked_paused"),ja=new W("blocked_paused_waiting"),ka=new W("blocked_canceled"),la=new W("complete");X.enter=function(a){G(a,a.priority),a._setState(Y)},Y.enter=function(){K()},Y.execute=p(_),Y.cancel=p($),Y.pause=p(Z),Y.resume=n,Y.setPriority=function(a,b){a.priority!==b&&(a._setPriority(b),a.pause(),a.resume())},Z.enter=function(a){m(a,"job-paused","info"),a._removeJob()},Z.cancel=p($),Z.pause=n,Z.resume=function(a){m(a,"job-resumed","info"),G(a,a.priority),a._setState(Y)},Z.setPriority=q,$.enter=function(a){m(a,"job-canceled","info"),g._traceAsyncOperationCompleted(a._asyncOpID,b.Debug&&b.Debug.MS_ASYNC_OP_STATUS_CANCELED),a._removeJob(),a._work=null,a._context=null,a.owner=null},$.cancel=n,$.pause=n,$.resume=n,$.setPriority=n,_.enter=function(a,b){a._removeJob();var c=a.priority,d=a._work,e=a._context;a._work=null,a._context=null;var f=new U(b,a);g._traceAsyncCallbackStarting(a._asyncOpID);try{Ea.execAtPriority(function(){d.call(e,f)},B(c))}finally{g._traceAsyncCallbackCompleted(),f._disablePublicApi()}a._context=e;var h=a._executeDone(f._yieldPolicy);a._setState(h,f._result,c)},_.executeDone=function(a,b){switch(b){case T.complete:return la;case T["continue"]:return ea;case T.block:return ga}},_.cancel=function(a){pa=!0,a._setState(ca)},_.pause=function(a){pa=!0,a._setState(aa)},_.resume=n,_.setPriority=q,aa.enter=n,aa.executeDone=function(a,b){switch(b){case T.complete:return la;case T["continue"]:return fa;case T.block:return ia}},aa.cancel=p(ca),aa.pause=n,aa.resume=p(ba),aa.setPriority=q,ba.enter=n,ba.executeDone=function(a,b){switch(b){case T.complete:return la;case T["continue"]:return ea;case T.block:return ga}},ba.cancel=p(ca),ba.pause=p(aa),ba.resume=n,ba.setPriority=q,ca.enter=n,ca.executeDone=function(a,b){switch(b){case T.complete:case T["continue"]:return $;case T.block:return da}},ca.cancel=n,ca.pause=n,ca.resume=n,ca.setPriority=n,da.enter=function(a,b){b.cancel(),a._setState($)},ea.enter=function(a,b,c){m(a,"job-yielded","info"),c===a.priority?F(a,a.priority):G(a,a.priority),a._work=b,a._setState(Y)},fa.enter=function(a,b){m(a,"job-yielded","info"),a._work=b,a._setState(Z)},ga.enter=function(a,b,c){m(a,"job-blocked","StartTM"),a._work=b,a._setState(ha),b.done(function(b){m(a,"job-blocked","StopTM");var d=a._blockedDone(b);a._setState(d,b,c)},function(b){return b&&"Canceled"===b.name||m(a,"job-error","info"),m(a,"job-blocked","StopTM"),a._setState($),i.wrapError(b)})},ha.enter=n,ha.blockedDone=function(a,b){return"function"==typeof b?ea:la},ha.cancel=p(ka),ha.pause=p(ja),ha.resume=n,ha.setPriority=q,ia.enter=function(a,b,c){m(a,"job-blocked","StartTM"),a._work=b,a._setState(ja),b.done(function(b){m(a,"job-blocked","StopTM");var d=a._blockedDone(b);a._setState(d,b,c)},function(b){return b&&"Canceled"===b.name||m(a,"job-error","info"),m(a,"job-blocked","StopTM"),a._setState($),i.wrapError(b)})},ja.enter=n,ja.blockedDone=function(a,b){return"function"==typeof b?fa:la},ja.cancel=p(ka),ja.pause=n,ja.resume=p(ha),ja.setPriority=q,ka.enter=function(a){a._work.cancel(),a._work=null},ka.blockedDone=function(){return $},ka.cancel=n,ka.pause=n,ka.resume=n,ka.setPriority=n,la.completed=!0,la.enter=function(a){g._traceAsyncOperationCompleted(a._asyncOpID,b.Debug&&b.Debug.MS_ASYNC_OP_STATUS_SUCCESS),a._work=null,a._context=null,a.owner=null,m(a,"job-completed","info")},la.cancel=n,la.pause=n,la.resume=n,la.setPriority=n;var ma=c.Class.define(function(a,b){this.priority=a,this.name=b},{});c.Class.mix(ma,j("Job"),j("Marker"));var na,oa,pa,qa=0,ra=0,sa=-15,ta=15,ua={max:15,high:13,aboveNormal:9,normal:0,belowNormal:-9,idle:-13,min:-15},va=[new ma(15,"max"),new ma(14,"14"),new ma(13,"high"),new ma(12,"12"),new ma(11,"11"),new ma(10,"10"),new ma(9,"aboveNormal"),new ma(8,"8"),new ma(7,"7"),new ma(6,"6"),new ma(5,"5"),new ma(4,"4"),new ma(3,"3"),new ma(2,"2"),new ma(1,"1"),new ma(0,"normal"),new ma(-1,"-1"),new ma(-2,"-2"),new ma(-3,"-3"),new ma(-4,"-4"),new ma(-5,"-5"),new ma(-6,"-6"),new ma(-7,"-7"),new ma(-8,"-8"),new ma(-9,"belowNormal"),new ma(-10,"-10"),new ma(-11,"-11"),new ma(-12,"-12"),new ma(-13,"idle"),new ma(-14,"-14"),new ma(-15,"min"),new ma(-16,"<TAIL>")],wa=null,xa=null,ya=!(!b.MSApp||!b.MSApp.execAtPriority),za=[],Aa=30,Ba=ua.min;va.reduce(function(a,b){return a&&(a._insertJobAfter(b),a._insertMarkerAfter(b)),b});var Ca=b.setImmediate?b.setImmediate.bind(b):function(a){b.setTimeout(a,16)},Da={execAsyncAtPriority:function(a,c){c===Ea.HIGH&&b.setTimeout(a,0),Ca(a)},execAtPriority:function(a){return a()},getCurrentPriority:function(){return Da.NORMAL},isTaskScheduledAtPriorityOrHigher:function(){return!1},HIGH:"high",NORMAL:"normal",IDLE:"idle"},Ea=ya?b.MSApp:Da,Fa={};Fa[Ea.IDLE]=1,Fa[Ea.NORMAL]=2,Fa[Ea.HIGH]=3;var Ga=b.performance&&b.performance.now&&b.performance.now.bind(b.performance)||Date.now.bind(Date),Ha=0,Ia=0;c.Namespace._moduleDefine(a,"WinJS.Utilities.Scheduler",{Priority:ua,schedule:O,createOwnerToken:N,execHigh:M,requestDrain:L,currentPriority:{get:P},schedulePromiseHigh:Q(ua.high),schedulePromiseAboveNormal:Q(ua.aboveNormal),schedulePromiseNormal:Q(ua.normal),schedulePromiseBelowNormal:Q(ua.belowNormal),schedulePromiseIdle:Q(ua.idle),retrieveState:s,_JobNode:S,_JobInfo:U,_OwnerToken:V,_dumpList:r,_isEmpty:{get:t},_usingWwaScheduler:{get:function(){return ya},set:function(a){ya=a,Ea=ya?b.MSApp:Da}},_MSApp:{get:function(){return Ea},set:function(a){Ea=a}},_TIME_SLICE:Aa})}),define("WinJS/Core/_BaseUtils",["exports","./_Global","./_Base","./_BaseCoreUtils","./_ErrorFromName","./_Resources","./_Trace","../Promise","../Scheduler"],function(a,b,c,d,e,f,g,h,i){"use strict";function j(a){return a}function k(a,b,c){return a.split(".").reduce(function(a,b){return a?c(a[b]):null},b)}function l(a,c){return a?k(a,c||b,j):null}function m(a){return a.length>0&&0!==a.indexOf("-moz")&&"-"===a.charAt(0)&&(a=a.slice(1)),a.replace(/\-[a-z]/g,function(a){return a[1].toUpperCase()})}function n(a,b){return""===a?b:a+b.charAt(0).toUpperCase()+b.slice(1)}function o(a,b){return(""!==a?"-"+a.toLowerCase()+"-":"")+b}function p(){if(!b.document)return{};for(var a={},c=b.document.documentElement.style,d=["","webkit","ms","Moz"],e=["animation","transition","transform","animation-name","animation-duration","animation-delay","animation-timing-function","animation-iteration-count","animation-direction","animation-fill-mode","grid-column","grid-columns","grid-column-span","grid-row","grid-rows","grid-row-span","transform-origin","transition-property","transition-duration","transition-delay","transition-timing-function","scroll-snap-points-x","scroll-snap-points-y","scroll-chaining","scroll-limit","scroll-limit-x-max","scroll-limit-x-min","scroll-limit-y-max","scroll-limit-y-min","scroll-snap-type","scroll-snap-x","scroll-snap-y","touch-action","overflow-style","user-select"],f={},g=0,h=e.length;h>g;g++)for(var i=e[g],j=m(i),k=0,l=d.length;l>k;k++){var p=d[k],q=n(p,j);if(q in c){var r=o(p,i);a[i]={cssName:r,scriptName:q},f[i]=p;break}}return a.animationPrefix=o(f.animation,""),a.keyframes=o(f.animation,"keyframes"),a}function q(){for(var a={},c=["","WebKit"],d=[{eventObject:"TransitionEvent",events:["transitionStart","transitionEnd"]},{eventObject:"AnimationEvent",events:["animationStart","animationEnd"]}],e=0,f=d.length;f>e;e++){for(var g=d[e],h="",i=0,j=c.length;j>i;i++){var k=c[i];if(k+g.eventObject in b){h=k.toLowerCase();break}}for(var i=0,l=g.events.length;l>i;i++){var m=g.events[i];a[m]=n(h,m),""===h&&(a[m]=a[m].toLowerCase())}}return a.manipulationStateChanged="MSManipulationEvent"in b?"ManipulationEvent":null,
-a}function r(a,b){function c(){return h.timeout(a).then(function(){d=null})}var d=null,e=null,f=null,g=null;return function(){e?(f=this,g=[].slice.call(arguments,0)):d?(f=this,g=[].slice.call(arguments,0),e=d.then(function(){var a=f;f=null;var h=g;g=null,d=c(),e=null,b.apply(a,h)})):(d=c(),b.apply(this,arguments))}}var s,t={get notSupportedForProcessing(){return"Value is not supported within a declarative processing context, if you want it to be supported mark it using WinJS.Utilities.markSupportedForProcessing. The value was: '{0}'"}},u=0,v={},w=!1,x=b.navigator.platform,y="iPhone"===x||"iPad"===x||"iPod"===x;c.Namespace._moduleDefine(a,"WinJS.Utilities",{_setHasWinRT:{value:function(a){d.hasWinRT=a},configurable:!1,writable:!1,enumerable:!1},hasWinRT:{get:function(){return d.hasWinRT},configurable:!1,enumerable:!0},_setIsiOS:{value:function(a){y=a},configurable:!1,writable:!1,enumerable:!1},_isiOS:{get:function(){return y},configurable:!1,enumerable:!0},_getMemberFiltered:k,getMember:l,_browserStyleEquivalents:p(),_browserEventEquivalents:q(),_getCamelCasedName:m,ready:function z(a,c){return new h(function(d,e){function f(){if(a)try{a(),d()}catch(b){e(b)}else d()}var g=z._testReadyState;g||(g=b.document?b.document.readyState:"complete"),"complete"===g||b.document&&null!==b.document.body?c?i.schedule(function(){f()},i.Priority.normal,null,"WinJS.Utilities.ready"):f():b.addEventListener("DOMContentLoaded",f,!1)})},strictProcessing:{get:function(){return!0},configurable:!1,enumerable:!0},markSupportedForProcessing:{value:d.markSupportedForProcessing,configurable:!1,writable:!1,enumerable:!0},requireSupportedForProcessing:{value:function(a){var c=!0;switch(c=c&&a!==b,c=c&&a!==b.location,c=c&&!(a instanceof b.HTMLIFrameElement),c=c&&!("function"==typeof a&&!a.supportedForProcessing),b.frames.length){case 0:break;case 1:c=c&&a!==b.frames[0];break;default:for(var d=0,g=b.frames.length;c&&g>d;d++)c=c&&a!==b.frames[d]}if(c)return a;throw new e("WinJS.Utilities.requireSupportedForProcessing",f._formatString(t.notSupportedForProcessing,a))},configurable:!1,writable:!1,enumerable:!0},_setImmediate:d._setImmediate,_requestAnimationFrame:b.requestAnimationFrame?b.requestAnimationFrame.bind(b):function(a){var c=++u;return v[c]=a,s=s||b.setTimeout(function(){var a=v,b=Date.now();v={},s=null,Object.keys(a).forEach(function(c){a[c](b)})},16),c},_cancelAnimationFrame:b.cancelAnimationFrame?b.cancelAnimationFrame.bind(b):function(a){delete v[a]},_yieldForEvents:b.setImmediate?b.setImmediate.bind(b):function(a){b.setTimeout(a,0)},_yieldForDomModification:b.setImmediate?b.setImmediate.bind(b):function(a){b.setTimeout(a,0)},_throttledFunction:r,_shallowCopy:function(a){return this._mergeAll([a])},_merge:function(a,b){return this._mergeAll([a,b])},_mergeAll:function(a){var b={};return a.forEach(function(a){Object.keys(a).forEach(function(c){b[c]=a[c]})}),b},_getProfilerMarkIdentifier:function(a){var b="";return a.id&&(b+=" id='"+a.id+"'"),a.className&&(b+=" class='"+a.className+"'"),b},_now:function(){return b.performance&&b.performance.now&&b.performance.now()||Date.now()},_traceAsyncOperationStarting:g._traceAsyncOperationStarting,_traceAsyncOperationCompleted:g._traceAsyncOperationCompleted,_traceAsyncCallbackStarting:g._traceAsyncCallbackStarting,_traceAsyncCallbackCompleted:g._traceAsyncCallbackCompleted,_version:"4.4.2"}),c.Namespace._moduleDefine(a,"WinJS",{validation:{get:function(){return w},set:function(a){w=a}}}),c.Namespace.define("WinJS",{strictProcessing:{value:function(){},configurable:!1,writable:!1,enumerable:!1}})}),define("WinJS/Core",["./Core/_Base","./Core/_BaseCoreUtils","./Core/_BaseUtils","./Core/_ErrorFromName","./Core/_Events","./Core/_Global","./Core/_Log","./Core/_Resources","./Core/_Trace","./Core/_WinRT","./Core/_WriteProfilerMark"],function(){}),define("WinJS/_Signal",["./Core/_Base","./Promise/_StateMachine"],function(a,b){"use strict";var c=a.Class.derive(b.PromiseStateMachine,function(a){this._oncancel=a,this._setState(b.state_created),this._run()},{_cancelAction:function(){this._oncancel&&this._oncancel()},_cleanupAction:function(){this._oncancel=null}},{supportedForProcessing:!1}),d=a.Class.define(function(a){this._promise=new c(a)},{promise:{get:function(){return this._promise}},cancel:function(){this._promise.cancel()},complete:function(a){this._promise._completed(a)},error:function(a){this._promise._error(a)},progress:function(a){this._promise._progress(a)}},{supportedForProcessing:!1});return a.Namespace.define("WinJS",{_Signal:d}),d}),define("WinJS/Utilities/_Control",["exports","../Core/_Global","../Core/_Base"],function(a,b,c){"use strict";function d(a,b){e(a,b)}function e(a,b,c){if("object"==typeof b)for(var d=Object.keys(b),e=0,f=d.length;f>e;e++){var g=d[e],h=b[g];if(g.length>2){var i=g[0],j=g[1];if(!("o"!==i&&"O"!==i||"n"!==j&&"N"!==j)&&"function"==typeof h&&a.addEventListener){a.addEventListener(g.substr(2),h);continue}}c||(a[g]=h)}}b.document&&c.Namespace._moduleDefine(a,"WinJS.UI",{DOMEventMixin:c.Namespace._lazy(function(){return{_domElement:null,addEventListener:function(a,b,c){(this.element||this._domElement).addEventListener(a,b,c||!1)},dispatchEvent:function(a,c){var d=b.document.createEvent("Event");return d.initEvent(a,!1,!1),d.detail=c,"object"==typeof c&&Object.keys(c).forEach(function(a){d[a]=c[a]}),(this.element||this._domElement).dispatchEvent(d)},removeEventListener:function(a,b,c){(this.element||this._domElement).removeEventListener(a,b,c||!1)}}}),setOptions:d,_setOptions:e})}),define("WinJS/Utilities/_ElementUtilities",["exports","../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_WinRT","../Promise","../Scheduler"],function(a,b,c,d,e,f,g){"use strict";function h(){return R||(R={},Object.keys(b.CSS2Properties.prototype).forEach(function(a){R[a]=""})),R}function i(a,c){return b.getComputedStyle(a,c)||h()}function j(a){for(var b=a.length,c=b-1;c>=0;c--)a[c]||(a.splice(c,1),b--);return b}function k(a){var b=a.className||"";return"string"==typeof b?b:b.baseVal||""}function l(a,b){var c=a.className||"";return"string"==typeof c?a.className=b:a.className.baseVal=b,a}function m(a,b){if(a.classList){if(b.indexOf(" ")<0)a.classList.add(b);else{var c=b.split(" ");j(c);for(var d=0,e=c.length;e>d;d++)a.classList.add(c[d])}return a}var f,g=k(a),h=g.split(" "),i=j(h);if(b.indexOf(" ")>=0){var c=b.split(" ");j(c);for(var d=0;i>d;d++){var m=c.indexOf(h[d]);m>=0&&c.splice(m,1)}c.length>0&&(f=c.join(" "))}else{for(var n=!1,d=0;i>d;d++)if(h[d]===b){n=!0;break}n||(f=b)}return f&&(i>0&&h[0].length>0?l(a,g+" "+f):l(a,f)),a}function n(a,b){if(a.classList){if(0===a.classList.length)return a;var c=b.split(" ");j(c);for(var d=0,e=c.length;e>d;d++)a.classList.remove(c[d]);return a}var c,f,g=k(a);if(b.indexOf(" ")>=0)c=b.split(" "),f=j(c);else{if(g.indexOf(b)<0)return a;c=[b],f=1}for(var h,i=g.split(" "),m=j(i),d=m-1;d>=0;d--)c.indexOf(i[d])>=0&&(i.splice(d,1),h=!0);return h&&l(a,i.join(" ")),a}function o(a,b){if(a.classList)return a.classList.toggle(b),a;for(var c=k(a),d=c.trim().split(" "),e=d.length,f=!1,g=0;e>g;g++)d[g]===b&&(f=!0);return f?l(a,d.reduce(function(a,c){return c===b?a:a&&a.length>0?a+" "+c:c},"")):e>0&&d[0].length>0?l(a,c+" "+b):l(a,c+b),a}function p(a,b,c){a.getAttribute(b)!==""+c&&a.setAttribute(b,c)}function q(a,b,c,d){var e=Math.max(b,Math.min(c,+a));return 0===e?0:e||Math.max(b,Math.min(c,d))}function r(a,b){if(!S.test(b)&&T.test(b)){var c=a.style.left;return a.style.left=b,b=a.style.pixelLeft,a.style.left=c,b}return Math.round(parseFloat(b))||0}function s(a,b){return r(a,i(a,null)[b])}function t(a){return parseFloat(a)||0}function u(a,b){return t(i(a,null)[b])}function v(a){var b=i(a);return{top:t(b.marginTop),right:t(b.marginRight),bottom:t(b.marginBottom),left:t(b.marginLeft)}}function w(a,b,c,d,e){var f=b.toLowerCase();a._eventsMap||(a._eventsMap={}),a._eventsMap[f]||(a._eventsMap[f]=[]),a._eventsMap[f].push({listener:c,useCapture:d,data:e})}function x(a,b,c,d){var e=b.toLowerCase(),f=a._eventsMap&&a._eventsMap[e];if(f)for(var g=f.length-1;g>=0;g--){var h=f[g];if(h.listener===c&&!!d==!!h.useCapture)return f.splice(g,1),h}return null}function y(a,b){var c=b.toLowerCase();return a._eventsMap&&a._eventsMap[c]&&a._eventsMap[c].slice(0)||[]}function z(a,b,c){for(;a;){for(var d=y(a,b),e=0,f=d.length;f>e;e++)d[e].listener.call(a,c);a=a.parentNode}}function A(a){return(a.relatedTarget&&"IFRAME"===a.relatedTarget.tagName||a.target&&"IFRAME"===a.target.tagName)&&(a.relatedTarget=null),a}function B(a,b,c,d){if(d)throw"This custom WinJS event only supports bubbling";w(a,b,c,d)}function C(a,b){var c=b.changedTouches,d=null;if(!c)return d;for(var e=0,f=c.length;f>e;e++){var g=c[e],h=new Z(b,{pointerType:W.MSPOINTER_TYPE_TOUCH,pointerId:g.identifier,isPrimary:0===e,screenX:g.screenX,screenY:g.screenY,clientX:g.clientX,clientY:g.clientY,pageX:g.pageX,pageY:g.pageY,radiusX:g.radiusX,radiusY:g.radiusY,rotationAngle:g.rotationAngle,force:g.force,_currentTouch:g}),i=a(h);d=d||i}return d}function D(a,b){return b.pointerType=W.MSPOINTER_TYPE_MOUSE,b.pointerId=-1,b.isPrimary=!0,a(b)}function E(a,b){return a(b)}function F(a,c,d,e){var f,g,h,i,j=c.toLowerCase(),k=$[j];b.MSPointerEvent?(h=function(a){return a._normalizedType=j,i=!0,E(d,a)},a.addEventListener(k.mspointer,h,e)):(k.mouse&&(f=function(a){return a._normalizedType=j,i?void(i=!1):D(d,a)},a.addEventListener(k.mouse,f,e)),k.touch&&(g=function(a){return a._normalizedType=j,i=!0,C(d,a)},a.addEventListener(k.touch,g,e))),w(a,c,d,e,{mouseWrapper:f,touchWrapper:g,mspointerWrapper:h})}function G(a,b,c,d){var e=b.toLowerCase(),f=x(a,b,c,d);if(f){var g=$[e];f.data.mouseWrapper&&a.removeEventListener(g.mouse,f.data.mouseWrapper,d),f.data.touchWrapper&&a.removeEventListener(g.touch,f.data.touchWrapper,d),f.data.mspointerWrapper&&a.removeEventListener(g.mspointer,f.data.mspointerWrapper,d)}}function H(){var a=b.document.createElement("div");a.style.direction="rtl",a.innerHTML="<div style='width: 100px; height: 100px; overflow: scroll; visibility:hidden'><div style='width: 10000px; height: 100px;'></div></div>",b.document.body.appendChild(a);var c=a.firstChild;c.scrollLeft>0&&(ha=!0),c.scrollLeft+=100,0===c.scrollLeft&&(ia=!0),b.document.body.removeChild(a),ga=!0}function I(a){var b=i(a),c=a.scrollLeft;return"rtl"===b.direction&&(ga||H(),ha&&(c=a.scrollWidth-a.clientWidth-c),c=Math.abs(c)),{scrollLeft:c,scrollTop:a.scrollTop}}function J(a,b,c){if(void 0!==b){var d=i(a);"rtl"===d.direction&&(ga||H(),ia?b=-b:ha&&(b=a.scrollWidth-a.clientWidth-b)),a.scrollLeft=b}void 0!==c&&(a.scrollTop=c)}function K(a){return I(a)}function L(a,b){b=b||{},J(a,b.scrollLeft,b.scrollTop)}function M(a){return a.uniqueID||a._uniqueID||(a._uniqueID="element__"+ ++la),a.uniqueID||a._uniqueID}function N(a){a.id||(a.id=M(a))}function O(a){var c=b.document.documentElement,d=K(c);return{left:a.clientX+("rtl"===b.document.body.dir?-d.scrollLeft:d.scrollLeft),top:a.clientY+c.scrollTop}}function P(a,b){for(var c=[],d=0,e=b.length;e>d;d++){var f=a.querySelector("."+b[d]);f&&c.push(f)}return c}if(b.document){var Q=167,R=null,S=/^-?\d+\.?\d*(px)?$/i,T=/^-?\d+/i,U=b.MSGestureEvent||{MSGESTURE_FLAG_BEGIN:1,MSGESTURE_FLAG_CANCEL:4,MSGESTURE_FLAG_END:2,MSGESTURE_FLAG_INERTIA:8,MSGESTURE_FLAG_NONE:0},V=b.MSManipulationEvent||{MS_MANIPULATION_STATE_ACTIVE:1,MS_MANIPULATION_STATE_CANCELLED:6,MS_MANIPULATION_STATE_COMMITTED:7,MS_MANIPULATION_STATE_DRAGGING:5,MS_MANIPULATION_STATE_INERTIA:2,MS_MANIPULATION_STATE_PRESELECT:3,MS_MANIPULATION_STATE_SELECTING:4,MS_MANIPULATION_STATE_STOPPED:0},W=b.MSPointerEvent||{MSPOINTER_TYPE_TOUCH:"touch",MSPOINTER_TYPE_PEN:"pen",MSPOINTER_TYPE_MOUSE:"mouse"},X="onfocusin"in b.document.documentElement,Y=null;b.addEventListener(X?"focusout":"blur",function(a){if(a.target===b){var c=Y;c&&z(c,"focusout",A({type:"focusout",target:c,relatedTarget:null})),Y=null}}),b.document.documentElement.addEventListener(X?"focusin":"focus",function(a){var b=Y;Y=a.target,b&&z(b,"focusout",A({type:"focusout",target:b,relatedTarget:Y})),Y&&z(Y,"focusin",A({type:"focusin",target:Y,relatedTarget:b}))},!0);var Z=function(a,b){b=b||{},this.__eventObject=a;var c=this;Object.keys(b).forEach(function(a){Object.defineProperty(c,a,{value:b[a]})})};["altKey","AT_TARGET","bubbles","BUBBLING_PHASE","button","buttons","cancelable","cancelBubble","CAPTURING_PHASE","clientX","clientY","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","getModifierState","height","hwTimestamp","initEvent","initMouseEvent","initPointerEvent","initUIEvent","isPrimary","isTrusted","layerX","layerY","metaKey","offsetX","offsetY","pageX","pageY","pointerId","pointerType","pressure","preventDefault","relatedTarget","rotation","screenX","screenY","shiftKey","srcElement","stopImmediatePropagation","stopPropagation","target","tiltX","tiltY","timeStamp","toElement","type","view","which","width","x","y","_normalizedType","_fakedBySemanticZoom"].forEach(function(a){Object.defineProperty(Z.prototype,a,{get:function(){var b=this.__eventObject[a];return"function"==typeof b?b.bind(this.__eventObject):b},configurable:!0})});var $={pointerdown:{touch:"touchstart",mspointer:"MSPointerDown",mouse:"mousedown"},pointerup:{touch:"touchend",mspointer:"MSPointerUp",mouse:"mouseup"},pointermove:{touch:"touchmove",mspointer:"MSPointerMove",mouse:"mousemove"},pointerenter:{touch:"touchenter",mspointer:"MSPointerEnter",mouse:"mouseenter"},pointerover:{touch:null,mspointer:"MSPointerOver",mouse:"mouseover"},pointerout:{touch:"touchleave",mspointer:"MSPointerOut",mouse:"mouseout"},pointercancel:{touch:"touchcancel",mspointer:"MSPointerCancel",mouse:null}},_={focusout:{register:B,unregister:x},focusin:{register:B,unregister:x}};if(!b.PointerEvent){var aa={register:F,unregister:G};_.pointerdown=aa,_.pointerup=aa,_.pointermove=aa,_.pointerenter=aa,_.pointerover=aa,_.pointerout=aa,_.pointercancel=aa}var ba=c.Class.define(function(a){this._callback=a,this._toDispose=[],this._attributeFilter=[],this._scheduled=!1,this._pendingChanges=[],this._observerCount=0,this._handleCallback=this._handleCallback.bind(this),this._targetElements=[]},{observe:function(a,b){-1===this._targetElements.indexOf(a)&&this._targetElements.push(a),this._observerCount++,b.attributes&&this._addRemovableListener(a,"DOMAttrModified",this._handleCallback),b.attributeFilter&&(this._attributeFilter=b.attributeFilter)},disconnect:function(){this._observerCount=0,this._targetElements=[],this._toDispose.forEach(function(a){a()})},_addRemovableListener:function(a,b,c){a.addEventListener(b,c),this._toDispose.push(function(){a.removeEventListener(b,c)})},_handleCallback:function(a){a.stopPropagation();var b=a.attrName;if((!this._attributeFilter.length||-1!==this._attributeFilter.indexOf(b))&&-1!==this._targetElements.indexOf(a.target)){var c=b.indexOf("aria")>=0;"tabindex"===b&&(b="tabIndex"),this._pendingChanges.push({type:"attributes",target:a.target,attributeName:b}),1!==this._observerCount||c?this._scheduled===!1&&(this._scheduled=!0,d._setImmediate(this._dispatchEvent.bind(this))):this._dispatchEvent()}},_dispatchEvent:function(){try{this._callback(this._pendingChanges)}finally{this._pendingChanges=[],this._scheduled=!1}}},{_isShim:!0}),ca=b.MutationObserver||ba,da=null,ea=c.Class.define(function(){b.addEventListener("resize",this._handleResize.bind(this))},{subscribe:function(a,b){a.addEventListener(this._resizeEvent,b),m(a,this._resizeClass)},unsubscribe:function(a,b){n(a,this._resizeClass),a.removeEventListener(this._resizeEvent,b)},_handleResize:function(){for(var a=b.document.querySelectorAll("."+this._resizeClass),c=a.length,d=0;c>d;d++){var e=b.document.createEvent("Event");e.initEvent(this._resizeEvent,!1,!0),a[d].dispatchEvent(e)}},_resizeClass:{get:function(){return"win-element-resize"}},_resizeEvent:{get:function(){return"WinJSElementResize"}}}),fa=c.Class.define(function(a,b,c){c=c||{},this.registerThruWinJSCustomEvents=!!c.registerThruWinJSCustomEvents,this.objectName=a,this.object=b,this.capture={},this.bubble={}},{addEventListener:function(b,c,d,e){c=c.toLowerCase();var f=this._getHandlers(e),g=f[c];g||(g=this._getListener(c,e),g.refCount=0,f[c]=g,this.registerThruWinJSCustomEvents?a._addEventListener(this.object,c,g,e):this.object.addEventListener(c,g,e)),g.refCount++,b.addEventListener(this._getEventName(c,e),d),m(b,this._getClassName(c,e))},removeEventListener:function(b,c,d,e){c=c.toLowerCase();var f=this._getHandlers(e),g=f[c];g&&(g.refCount--,0===g.refCount&&(this.registerThruWinJSCustomEvents?a._removeEventListener(this.object,c,g,e):this.object.removeEventListener(c,g,e),delete f[c])),n(b,this._getClassName(c,e)),b.removeEventListener(this._getEventName(c,e),d)},_getHandlers:function(a){return a?this.capture:this.bubble},_getClassName:function(a,b){var c=b?"capture":"bubble";return"win-"+this.objectName.toLowerCase()+"-event-"+a+c},_getEventName:function(a,b){var c=b?"capture":"bubble";return"WinJS"+this.objectName+"Event-"+a+c},_getListener:function(a,c){var d=function(d){for(var e=b.document.querySelectorAll("."+this._getClassName(a,c)),f=e.length,g=!1,h=0;f>h;h++){var i=b.document.createEvent("Event");i.initEvent(this._getEventName(a,c),!1,!0),i.detail={originalEvent:d};var j=e[h].dispatchEvent(i);g=g||!j}return g};return d.bind(this)}}),ga=!1,ha=!1,ia=!1,ja=b.navigator.msManipulationViewsEnabled||b.navigator.userAgent.indexOf("MSAppHost")>=0,ka=!(!b.MSPointerEvent&&!b.TouchEvent),la=0,ma=".win-selectionborder, .win-selectionbackground, .win-selectioncheckmark, .win-selectioncheckmarkbackground",na="_msDataKey";c.Namespace._moduleDefine(a,"WinJS.Utilities",{_dataKey:na,_supportsSnapPoints:{get:function(){return ja}},_supportsTouchDetection:{get:function(){return ka}},_uniqueID:M,_ensureId:N,_clamp:q,_getCursorPos:O,_getElementsByClasses:P,_createGestureRecognizer:function(){if(b.MSGesture)return new b.MSGesture;var a=function(){};return{addEventListener:a,removeEventListener:a,addPointer:a,stop:a}},_MSGestureEvent:U,_MSManipulationEvent:V,_elementsFromPoint:function(a,c){if(b.document.msElementsFromPoint)return b.document.msElementsFromPoint(a,c);var d=b.document.elementFromPoint(a,c);return d?[d]:null},_matchesSelector:function(a,b){var c=a.matches||a.msMatchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector;return c.call(a,b)},_selectionPartsSelector:ma,_isSelectionRendered:function(a){return a.querySelectorAll(ma).length>0},_addEventListener:function(a,b,c,e){var f=b&&b.toLowerCase(),g=_[f],h=d._browserEventEquivalents[b];g?g.register(a,b,c,e):h?a.addEventListener(h,c,e):a.addEventListener(b,c,e)},_removeEventListener:function(a,b,c,e){var f=b&&b.toLowerCase(),g=_[f],h=d._browserEventEquivalents[b];g?g.unregister(a,b,c,e):h?a.removeEventListener(h,c,e):a.removeEventListener(b,c,e)},_initEventImpl:function(a,c,d){d=d.toLowerCase();var e=$[d];if(e)switch(a.toLowerCase()){case"pointer":b.PointerEvent||(arguments[2]=e.mspointer);break;default:arguments[2]=e[a.toLowerCase()]}c["init"+a+"Event"].apply(c,Array.prototype.slice.call(arguments,2))},_initMouseEvent:function(a){this._initEventImpl.apply(this,["Mouse",a].concat(Array.prototype.slice.call(arguments,1)))},_initPointerEvent:function(a){this._initEventImpl.apply(this,["Pointer",a].concat(Array.prototype.slice.call(arguments,1)))},_PointerEventProxy:Z,_bubbleEvent:z,_setPointerCapture:function(a,b){a.setPointerCapture&&a.setPointerCapture(b)},_releasePointerCapture:function(a,b){a.releasePointerCapture&&a.releasePointerCapture(b)},_MSPointerEvent:W,_getComputedStyle:i,_zoomToDuration:Q,_zoomTo:function(a,b){this._supportsSnapPoints&&a.msZoomTo?a.msZoomTo(b):g.schedule(function(){var c=I(a),e="number"==typeof a._zoomToDestX?a._zoomToDestX:c.scrollLeft,f="number"==typeof a._zoomToDestY?a._zoomToDestY:c.scrollTop,g=i(a),h=a.scrollWidth-parseInt(g.width,10)-parseInt(g.paddingLeft,10)-parseInt(g.paddingRight,10),j=a.scrollHeight-parseInt(g.height,10)-parseInt(g.paddingTop,10)-parseInt(g.paddingBottom,10);"number"!=typeof b.contentX&&(b.contentX=e),"number"!=typeof b.contentY&&(b.contentY=f);var k=q(b.contentX,0,h),l=q(b.contentY,0,j);if(k!==e||l!==f){a._zoomToId=a._zoomToId||0,a._zoomToId++,a._zoomToDestX=k,a._zoomToDestY=l;var m=a._zoomToId,n=d._now(),o=(a._zoomToDestX-c.scrollLeft)/Q,p=(a._zoomToDestY-c.scrollTop)/Q,r=function(){var b=d._now()-n;a._zoomToId===m&&(b>Q?(J(a,a._zoomToDestX,a._zoomToDestY),a._zoomToDestX=null,a._zoomToDestY=null):(J(a,c.scrollLeft+b*o,c.scrollTop+b*p),d._requestAnimationFrame(r)))};d._requestAnimationFrame(r)}},g.Priority.high,null,"WinJS.Utilities._zoomTo")},_setActive:function(a,c){var d=!0;try{if(b.HTMLElement&&b.HTMLElement.prototype.setActive)a.setActive();else{var e,f;c&&(e=c.scrollLeft,f=c.scrollTop),a.focus(),c&&(c.scrollLeft=e,c.scrollTop=f)}}catch(g){d=!1}return d},_MutationObserver:ca,_resizeNotifier:{get:function(){return da||(da=new ea),da}},_GenericListener:fa,_globalListener:new fa("Global",b,{registerThruWinJSCustomEvents:!0}),_documentElementListener:new fa("DocumentElement",b.document.documentElement,{registerThruWinJSCustomEvents:!0}),_inputPaneListener:e.Windows.UI.ViewManagement.InputPane?new fa("InputPane",e.Windows.UI.ViewManagement.InputPane.getForCurrentView()):{addEventListener:function(){},removeEventListener:function(){}},_addInsertedNotifier:function(c){var e=b.document.createElement("div");return e.style[d._browserStyleEquivalents["animation-name"].scriptName]="WinJS-node-inserted",e.style[d._browserStyleEquivalents["animation-duration"].scriptName]="0.01s",e.style.position="absolute",c.appendChild(e),a._addEventListener(e,"animationStart",function(a){if("WinJS-node-inserted"===a.animationName){var a=b.document.createEvent("Event");a.initEvent("WinJSNodeInserted",!1,!0),c.dispatchEvent(a)}},!1),e},_inDom:function(c){return new f(function(d){if(b.document.body.contains(c))d();else{var e=function(){c.removeEventListener("WinJSNodeInserted",e,!1),d()};a._addInsertedNotifier(c),c.addEventListener("WinJSNodeInserted",e,!1)}})},_setFlexStyle:function(a,b){var c=a.style;"undefined"!=typeof b.grow&&(c.msFlexPositive=b.grow,c.webkitFlexGrow=b.grow,c.flexGrow=b.grow),"undefined"!=typeof b.shrink&&(c.msFlexNegative=b.shrink,c.webkitFlexShrink=b.shrink,c.flexShrink=b.shrink),"undefined"!=typeof b.basis&&(c.msFlexPreferredSize=b.basis,c.webkitFlexBasis=b.basis,c.flexBasis=b.basis)},Key:{backspace:8,tab:9,enter:13,shift:16,ctrl:17,alt:18,pause:19,capsLock:20,escape:27,space:32,pageUp:33,pageDown:34,end:35,home:36,leftArrow:37,upArrow:38,rightArrow:39,downArrow:40,insert:45,deleteKey:46,num0:48,num1:49,num2:50,num3:51,num4:52,num5:53,num6:54,num7:55,num8:56,num9:57,a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,leftWindows:91,rightWindows:92,menu:93,numPad0:96,numPad1:97,numPad2:98,numPad3:99,numPad4:100,numPad5:101,numPad6:102,numPad7:103,numPad8:104,numPad9:105,multiply:106,add:107,subtract:109,decimalPoint:110,divide:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,NavigationView:136,NavigationMenu:137,NavigationUp:138,NavigationDown:139,NavigationLeft:140,NavigationRight:141,NavigationAccept:142,NavigationCancel:143,numLock:144,scrollLock:145,browserBack:166,browserForward:167,semicolon:186,equal:187,comma:188,dash:189,period:190,forwardSlash:191,graveAccent:192,GamepadA:195,GamepadB:196,GamepadX:197,GamepadY:198,GamepadRightShoulder:199,GamepadLeftShoulder:200,GamepadLeftTrigger:201,GamepadRightTrigger:202,GamepadDPadUp:203,GamepadDPadDown:204,GamepadDPadLeft:205,GamepadDPadRight:206,GamepadMenu:207,GamepadView:208,GamepadLeftThumbstick:209,GamepadRightThumbstick:210,GamepadLeftThumbstickUp:211,GamepadLeftThumbstickDown:212,GamepadLeftThumbstickRight:213,GamepadLeftThumbstickLeft:214,GamepadRightThumbstickUp:215,GamepadRightThumbstickDown:216,GamepadRightThumbstickRight:217,GamepadRightThumbstickLeft:218,openBracket:219,backSlash:220,closeBracket:221,singleQuote:222,IME:229},data:function(a){return a[na]||(a[na]={}),a[na]},hasClass:function(a,b){if(a.classList)return a.classList.contains(b);for(var c=k(a),d=c.trim().split(" "),e=d.length,f=0;e>f;f++)if(d[f]===b)return!0;return!1},addClass:m,removeClass:n,toggleClass:o,_setAttribute:p,getRelativeLeft:function(b,c){if(!b)return 0;var d=a._getPositionRelativeTo(b,null),e=a._getPositionRelativeTo(c,null);return d.left-e.left},getRelativeTop:function(b,c){if(!b)return 0;var d=a._getPositionRelativeTo(b,null),e=a._getPositionRelativeTo(c,null);return d.top-e.top},getScrollPosition:K,setScrollPosition:L,empty:function(a){if(a.childNodes&&a.childNodes.length>0)for(var b=a.childNodes.length-1;b>=0;b--)a.removeChild(a.childNodes.item(b));return a},_isDOMElement:function(a){return a&&"object"==typeof a&&"string"==typeof a.tagName},getContentWidth:function(a){var b=s(a,"borderLeftWidth")+s(a,"borderRightWidth"),c=s(a,"paddingLeft")+s(a,"paddingRight");return a.offsetWidth-b-c},_getPreciseContentWidth:function(a){var b=u(a,"borderLeftWidth")+u(a,"borderRightWidth"),c=u(a,"paddingLeft")+u(a,"paddingRight");return a.offsetWidth-b-c},getTotalWidth:function(a){var b=s(a,"marginLeft")+s(a,"marginRight");return a.offsetWidth+b},_getPreciseTotalWidth:function(a){var b=u(a,"marginLeft")+u(a,"marginRight");return a.offsetWidth+b},getContentHeight:function(a){var b=s(a,"borderTopWidth")+s(a,"borderBottomWidth"),c=s(a,"paddingTop")+s(a,"paddingBottom");return a.offsetHeight-b-c},_getPreciseContentHeight:function(a){var b=u(a,"borderTopWidth")+u(a,"borderBottomWidth"),c=u(a,"paddingTop")+u(a,"paddingBottom");return a.offsetHeight-b-c},getTotalHeight:function(a){var b=s(a,"marginTop")+s(a,"marginBottom");return a.offsetHeight+b},_getPreciseTotalHeight:function(a){var b=u(a,"marginTop")+u(a,"marginBottom");return a.offsetHeight+b},getPosition:function(b){return a._getPositionRelativeTo(b,null)},getTabIndex:function(a){var b=/BUTTON|COMMAND|MENUITEM|OBJECT|SELECT|TEXTAREA/;if(a.disabled)return-1;var c=a.getAttribute("tabindex");if(null===c||void 0===c){var d=a.tagName;return b.test(d)||a.href&&("A"===d||"AREA"===d||"LINK"===d)||"INPUT"===d&&"hidden"!==a.type||"TH"===d&&a.sorted?0:-1}return parseInt(c,10)},convertToPixels:r,_convertToPrecisePixels:t,_getPreciseMargins:v,eventWithinElement:function(a,b){var c=b.relatedTarget;return c&&c!==a?a.contains(c):!1},_deprecated:function(a){b.console&&b.console.warn(a)},_syncRenderer:function(a,c){if(c=c||"div","function"==typeof a)return function(b,c){return c?(c.appendChild(a(b)),c):a(b)};var d;return"function"==typeof a.render?d=a:a.winControl&&"function"==typeof a.winControl.render&&(d=a.winControl),function(a,e){var f=e||b.document.createElement(c);if(d.render(a,f),e)return e;var g=f.firstElementChild;if(g&&f.dispose){var h=g.dispose;g.dispose=function(){g.dispose=h,f.appendChild(g),f.dispose()}}return g}},_getPositionRelativeTo:function(a,c){for(var d=a,e=a.offsetParent,f=a.offsetTop,g=a.offsetLeft;(a=a.parentNode)&&a!==c&&a!==b.document.body&&a!==b.document.documentElement;){f-=a.scrollTop;var h=i(a,null).direction;g-="rtl"!==h?a.scrollLeft:-I(a).scrollLeft,a===e&&(f+=a.offsetTop,g+=a.offsetLeft,e=a.offsetParent)}return{left:g,top:f,width:d.offsetWidth,height:d.offsetHeight}},_getHighAndLowTabIndices:function(a){for(var b=a.getElementsByTagName("*"),c=0,d=0,e=!1,f=0,g=b.length;g>f;f++){var h=b[f].getAttribute("tabIndex");if(null!==h&&void 0!==h){var i=parseInt(h,10);i>0&&(c>i||0===c)&&(c=i),e||(0===i?(e=!0,d=0):i>d&&(d=i))}}return{highest:d,lowest:c}},_getLowestTabIndexInList:function(a){for(var b,c=0,d=0;d<a.length;d++)b=parseInt(a[d].getAttribute("tabIndex"),10),b>0&&(c>b||!c)&&(c=b);return c},_getHighestTabIndexInList:function(a){for(var b,c=0,d=0;d<a.length;d++){if(b=parseInt(a[d].getAttribute("tabIndex"),10),0===b)return b;b>c&&(c=b)}return c},_hasCursorKeysBehaviors:function(a){return"SELECT"===a.tagName||"TEXTAREA"===a.tagName?!0:"INPUT"===a.tagName?""===a.type||"date"===a.type||"datetime"===a.type||"datetime-local"===a.type||"email"===a.type||"month"===a.type||"number"===a.type||"password"===a.type||"range"===a.type||"search"===a.type||"tel"===a.type||"text"===a.type||"time"===a.type||"url"===a.type||"week"===a.type:!1},_reparentChildren:function(a,b){for(var c=a.firstChild;c;){var d=c.nextSibling;b.appendChild(c),c=d}},_maintainFocus:function(c){var d=b.document.activeElement;c(),a._trySetActiveOnAnyElement(d)},_trySetActiveOnAnyElement:function(b,c){return a._tryFocusOnAnyElement(b,!0,c)},_tryFocusOnAnyElement:function(c,d,e){var f=b.document.activeElement;return c===f?!0:(d?a._setActive(c,e):c.focus(),f!==b.document.activeElement)},_trySetActive:function(a,b){return this._tryFocus(a,!0,b)},_tryFocus:function(c,d,e){var f=b.document.activeElement;if(c===f)return!0;var g=a.getTabIndex(c)>=0;return g?(d?a._setActive(c,e):c.focus(),f!==b.document.activeElement):!1},_setActiveFirstFocusableElement:function(a,b){return this._focusFirstFocusableElement(a,!0,b)},_focusFirstFocusableElement:function(a,b,c){for(var d,e=a.getElementsByTagName("*"),f=this._getLowestTabIndexInList(e),g=0;f;){for(d=0;d<e.length;d++)if(e[d].tabIndex===f){if(this._tryFocus(e[d],b,c))return!0}else f<e[d].tabIndex&&(e[d].tabIndex<g||0===g)&&(g=e[d].tabIndex);f=g,g=0}for(d=0;d<e.length;d++)if(this._tryFocus(e[d],b,c))return!0;return!1},_setActiveLastFocusableElement:function(a,b){return this._focusLastFocusableElement(a,!0,b)},_focusLastFocusableElement:function(a,b,c){var d,e=a.getElementsByTagName("*"),f=this._getHighestTabIndexInList(e),g=0;if(0===f){for(d=e.length-1;d>=0;d--)if(e[d].tabIndex===f){if(this._tryFocus(e[d],b,c))return!0}else g<e[d].tabIndex&&(g=e[d].tabIndex);f=g,g=0}for(;f;){for(d=e.length-1;d>=0;d--)if(e[d].tabIndex===f){if(this._tryFocus(e[d],b,c))return!0}else g<e[d].tabIndex&&e[d].tabIndex<f&&(g=e[d].tabIndex);f=g,g=0}for(d=e.length-2;d>0;d--)if(this._tryFocus(e[d],b,c))return!0;return!1}})}}),define("WinJS/Utilities/_Dispose",["exports","../Core/_Base","../Core/_WriteProfilerMark","./_ElementUtilities"],function(a,b,c,d){"use strict";function e(a,b){var c=!1;d.addClass(a,"win-disposable");var e=a.winControl||a;e.dispose=function(){c||(c=!0,f(a),b&&b())}}function f(a){if(a){c("WinJS.Utilities.disposeSubTree,StartTM");for(var b=a.querySelectorAll(".win-disposable"),d=0,e=b.length;e>d;){var f=b[d];f.winControl&&f.winControl.dispose&&f.winControl.dispose(),f.dispose&&f.dispose(),d+=f.querySelectorAll(".win-disposable").length+1}c("WinJS.Utilities.disposeSubTree,StopTM")}}function g(a){if(a){var b=!1;a.winControl&&a.winControl.dispose&&(a.winControl.dispose(),b=!0),a.dispose&&(a.dispose(),b=!0),b||f(a)}}b.Namespace._moduleDefine(a,"WinJS.Utilities",{markDisposable:e,disposeSubTree:f,_disposeElement:g})}),define("WinJS/ControlProcessor/_OptionsLexer",["exports","../Core/_Base"],function optionsLexerInit(exports,_Base){"use strict";_Base.Namespace._moduleDefine(exports,"WinJS.UI",{_optionsLexer:_Base.Namespace._lazy(function(){function reservedWord(a){return{type:tokenType.reservedWord,value:a,length:a.length,keyword:!0}}function reservedWordLookup(a){switch(a.charCodeAt(0)){case 98:switch(a){case"break":return reservedWord(a)}break;case 99:switch(a){case"case":case"catch":case"class":case"const":case"continue":return reservedWord(a)}break;case 100:switch(a){case"debugger":case"default":case"delete":case"do":return reservedWord(a)}break;case 101:switch(a){case"else":case"enum":case"export":case"extends":return reservedWord(a)}break;case 102:switch(a){case"false":return tokens.falseLiteral;case"finally":case"for":case"function":return reservedWord(a)}break;case 105:switch(a){case"if":case"import":case"in":case"instanceof":return reservedWord(a)}break;case 110:switch(a){case"null":return tokens.nullLiteral;case"new":return reservedWord(a)}break;case 114:switch(a){case"return":return reservedWord(a)}break;case 115:switch(a){case"super":case"switch":return reservedWord(a)}break;case 116:switch(a){case"true":return tokens.trueLiteral;case"this":return tokens.thisKeyword;case"throw":case"try":case"typeof":
-return reservedWord(a)}break;case 118:switch(a){case"var":case"void":return reservedWord(a)}break;case 119:switch(a){case"while":case"with":return reservedWord(a)}}}var tokenType={leftBrace:1,rightBrace:2,leftBracket:3,rightBracket:4,separator:5,colon:6,semicolon:7,comma:8,dot:9,nullLiteral:10,trueLiteral:11,falseLiteral:12,numberLiteral:13,stringLiteral:14,identifier:15,reservedWord:16,thisKeyword:17,leftParentheses:18,rightParentheses:19,eof:20,error:21},tokens={leftBrace:{type:tokenType.leftBrace,length:1},rightBrace:{type:tokenType.rightBrace,length:1},leftBracket:{type:tokenType.leftBracket,length:1},rightBracket:{type:tokenType.rightBracket,length:1},colon:{type:tokenType.colon,length:1},semicolon:{type:tokenType.semicolon,length:1},comma:{type:tokenType.comma,length:1},dot:{type:tokenType.dot,length:1},nullLiteral:{type:tokenType.nullLiteral,length:4,value:null,keyword:!0},trueLiteral:{type:tokenType.trueLiteral,length:4,value:!0,keyword:!0},falseLiteral:{type:tokenType.falseLiteral,length:5,value:!1,keyword:!0},thisKeyword:{type:tokenType.thisKeyword,length:4,value:"this",keyword:!0},leftParentheses:{type:tokenType.leftParentheses,length:1},rightParentheses:{type:tokenType.rightParentheses,length:1},eof:{type:tokenType.eof,length:0}},lexer=function(){function isIdentifierStartCharacter(a,b,c,d){switch(a){case a>=97&&122>=a&&a:case a>=65&&90>=a&&a:case 36:case 95:return!0;case isWhitespace(a)&&a:case isLineTerminator(a)&&a:return!1;case a>127&&a:return!0;case 92:return!!(d>c+4&&117===b.charCodeAt(c)&&isHexDigit(b.charCodeAt(c+1))&&isHexDigit(b.charCodeAt(c+2))&&isHexDigit(b.charCodeAt(c+3))&&isHexDigit(b.charCodeAt(c+4)));default:return!1}}function readIdentifierPart(a,b,c){for(var d=!1;c>b;){var e=a.charCodeAt(b);switch(e){case e>=97&&122>=e&&e:case e>=65&&90>=e&&e:case 36:case 95:break;case isWhitespace(e)&&e:case isLineTerminator(e)&&e:return d?-b:b;case e>127&&e:break;case e>=48&&57>=e&&e:break;case 92:if(c>b+5&&117===a.charCodeAt(b+1)&&isHexDigit(a.charCodeAt(b+2))&&isHexDigit(a.charCodeAt(b+3))&&isHexDigit(a.charCodeAt(b+4))&&isHexDigit(a.charCodeAt(b+5))){b+=5,d=!0;break}return d?-b:b;default:return d?-b:b}b++}return d?-b:b}function readIdentifierToken(a,b,c){var d=b;b=readIdentifierPart(a,b,c);var e=!1;0>b&&(b=-b,e=!0);var f=a.substr(d,b-d);e&&(f=""+JSON.parse('"'+f+'"'));var g=reservedWordLookup(f);return g?g:{type:tokenType.identifier,length:b-d,value:f}}function isHexDigit(a){switch(a){case a>=48&&57>=a&&a:case a>=97&&102>=a&&a:case a>=65&&70>=a&&a:return!0;default:return!1}}function readHexIntegerLiteral(a,b,c){for(;c>b&&isHexDigit(a.charCodeAt(b));)b++;return b}function isDecimalDigit(a){switch(a){case a>=48&&57>=a&&a:return!0;default:return!1}}function readDecimalDigits(a,b,c){for(;c>b&&isDecimalDigit(a.charCodeAt(b));)b++;return b}function readDecimalLiteral(a,b,c){if(b=readDecimalDigits(a,b,c),c>b&&46===a.charCodeAt(b)&&c>b+1&&isDecimalDigit(a.charCodeAt(b+1))&&(b=readDecimalDigits(a,b+2,c)),c>b){var d=a.charCodeAt(b);if(101===d||69===d){var e=b+1;c>e&&(d=a.charCodeAt(e),43!==d&&45!==d||e++,b=readDecimalDigits(a,e,c))}}return b}function readDecimalLiteralToken(a,b,c,d){var c=readDecimalLiteral(a,c,d),e=c-b;return{type:tokenType.numberLiteral,length:e,value:+a.substr(b,e)}}function isLineTerminator(a){switch(a){case 10:case 13:case 8232:case 8233:return!0;default:return!1}}function readStringLiteralToken(text,offset,limit){var startOffset=offset,quoteCharCode=text.charCodeAt(offset),hasEscape=!1;for(offset++;limit>offset&&!isLineTerminator(text.charCodeAt(offset));){if(limit>offset+1&&92===text.charCodeAt(offset))switch(hasEscape=!0,text.charCodeAt(offset+1)){case quoteCharCode:case 92:case 10:case 8232:case 8233:offset+=2;continue;case 13:offset+=limit>offset+2&&10===text.charCodeAt(offset+2)?3:2;continue}if(offset++,text.charCodeAt(offset-1)===quoteCharCode)break}var length=offset-startOffset;hasEscape=hasEscape||1===length||text.charCodeAt(offset-1)!==quoteCharCode;var stringValue;return stringValue=hasEscape?eval(text.substr(startOffset,length)):text.substr(startOffset+1,length-2),{type:tokenType.stringLiteral,length:length,value:stringValue}}function isWhitespace(a){switch(a){case 9:case 11:case 12:case 32:case 160:case 65279:return!0;case 5760>a&&a:return!1;case 5760:case 6158:case a>=8192&&8202>=a&&a:case 8239:case 8287:case 12288:return!0;default:return!1}}function readWhitespace(a,b,c){for(;c>b;){var d=a.charCodeAt(b);switch(d){case 9:case 11:case 12:case 32:case 160:case 65279:break;case 5760>d&&d:return b;case 5760:case 6158:case d>=8192&&8202>=d&&d:case 8239:case 8287:case 12288:break;default:return b}b++}return b}function lex(a,b,c,d){for(;d>c;){var e,f=c,g=b.charCodeAt(c++);switch(g){case isWhitespace(g)&&g:case isLineTerminator(g)&&g:c=readWhitespace(b,c,d),e={type:tokenType.separator,length:c-f};continue;case 34:case 39:e=readStringLiteralToken(b,c-1,d);break;case 40:e=tokens.leftParentheses;break;case 41:e=tokens.rightParentheses;break;case 43:case 45:if(d>c){var h=b.charCodeAt(c);if(46===h){var i=c+1;if(d>i&&isDecimalDigit(b.charCodeAt(i))){e=readDecimalLiteralToken(b,f,i,d);break}}else if(isDecimalDigit(h)){e=readDecimalLiteralToken(b,f,c,d);break}}e={type:tokenType.error,length:c-f,value:b.substring(f,c)};break;case 44:e=tokens.comma;break;case 46:e=tokens.dot,d>c&&isDecimalDigit(b.charCodeAt(c))&&(e=readDecimalLiteralToken(b,f,c,d));break;case 48:var j=d>c?b.charCodeAt(c):0;if(120===j||88===j){var k=readHexIntegerLiteral(b,c+1,d);e={type:tokenType.numberLiteral,length:k-f,value:+b.substr(f,k-f)}}else e=readDecimalLiteralToken(b,f,c,d);break;case g>=49&&57>=g&&g:e=readDecimalLiteralToken(b,f,c,d);break;case 58:e=tokens.colon;break;case 59:e=tokens.semicolon;break;case 91:e=tokens.leftBracket;break;case 93:e=tokens.rightBracket;break;case 123:e=tokens.leftBrace;break;case 125:e=tokens.rightBrace;break;default:if(isIdentifierStartCharacter(g,b,c,d)){e=readIdentifierToken(b,c-1,d);break}e={type:tokenType.error,length:c-f,value:b.substring(f,c)}}c+=e.length-1,a.push(e)}}return function(a){var b=[];return lex(b,a,0,a.length),b.push(tokens.eof),b}}();return lexer.tokenType=tokenType,lexer})})}),define("WinJS/ControlProcessor/_OptionsParser",["exports","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Resources","./_OptionsLexer"],function(a,b,c,d,e,f){"use strict";function g(){throw"Illegal"}function h(a){for(var b=Object.keys(j.tokenType),c=0,d=b.length;d>c;c++)if(a===j.tokenType[b[c]])return b[c];return"<unknown>"}var i={get invalidOptionsRecord(){return"Invalid options record: '{0}', expected to be in the format of an object literal. {1}"},get unexpectedTokenExpectedToken(){return"Unexpected token: {0}, expected token: {1}, at offset {2}"},get unexpectedTokenExpectedTokens(){return"Unexpected token: {0}, expected one of: {1}, at offset {2}"},get unexpectedTokenGeneric(){return"Unexpected token: {0}, at offset {1}"}},j=b.Namespace.defineWithParent(null,null,{lexer:b.Namespace._lazy(function(){return f._optionsLexer}),tokenType:b.Namespace._lazy(function(){return f._optionsLexer.tokenType})}),k=c.requireSupportedForProcessing,l=b.Namespace.defineWithParent(null,null,{BaseInterpreter:b.Namespace._lazy(function(){return b.Class.define(null,{_error:function(a){throw new d("WinJS.UI.ParseError",a)},_currentOffset:function(){for(var a=this._pos,b=0,c=0;a>c;c++)b+=this._tokens[c].length;return b},_evaluateAccessExpression:function(a){switch(this._current.type){case j.tokenType.dot:switch(this._read(),this._current.type){case j.tokenType.identifier:case this._current.keyword&&this._current.type:var b=this._current.value;return this._read(),a[b];default:this._unexpectedToken(j.tokenType.identifier,j.tokenType.reservedWord)}return;case j.tokenType.leftBracket:this._read();var c=this._evaluateValue();return this._read(j.tokenType.rightBracket),a[c]}},_evaluateAccessExpressions:function(a){for(;;)switch(this._current.type){case j.tokenType.dot:case j.tokenType.leftBracket:a=this._evaluateAccessExpression(a);break;default:return a}},_evaluateIdentifier:function(a,b){var c=this._readIdentifier();return b=a?b[c]:this._context[c]},_evaluateIdentifierExpression:function(){var a=this._evaluateIdentifier(!1);switch(this._current.type){case j.tokenType.dot:case j.tokenType.leftBracket:return this._evaluateAccessExpressions(a);default:return a}},_initialize:function(a,b,c,d){this._originalSource=b,this._tokens=a,this._context=c,this._functionContext=d,this._pos=0,this._current=this._tokens[0]},_read:function(a){a&&this._current.type!==a&&this._unexpectedToken(a),this._current!==j.tokenType.eof&&(this._current=this._tokens[++this._pos])},_peek:function(a){return a&&this._current.type!==a?void 0:this._current!==j.tokenType.eof?this._tokens[this._pos+1]:void 0},_readAccessExpression:function(a){switch(this._current.type){case j.tokenType.dot:switch(this._read(),this._current.type){case j.tokenType.identifier:case this._current.keyword&&this._current.type:a.push(this._current.value),this._read();break;default:this._unexpectedToken(j.tokenType.identifier,j.tokenType.reservedWord)}return;case j.tokenType.leftBracket:return this._read(),a.push(this._evaluateValue()),void this._read(j.tokenType.rightBracket)}},_readAccessExpressions:function(a){for(;;)switch(this._current.type){case j.tokenType.dot:case j.tokenType.leftBracket:this._readAccessExpression(a);break;default:return}},_readIdentifier:function(){var a=this._current.value;return this._read(j.tokenType.identifier),a},_readIdentifierExpression:function(){var a=[];switch(this._peek(j.tokenType.thisKeyword)&&0===a.length?this._read():a.push(this._readIdentifier()),this._current.type){case j.tokenType.dot:case j.tokenType.leftBracket:this._readAccessExpressions(a)}return a},_unexpectedToken:function(a){var b=this._current.type===j.tokenType.error?"'"+this._current.value+"'":h(this._current.type);if(a)if(1===arguments.length)a=h(a),this._error(e._formatString(i.unexpectedTokenExpectedToken,b,a,this._currentOffset()));else{for(var c=[],d=0,f=arguments.length;f>d;d++)c.push(h(arguments[d]));a=c.join(", "),this._error(e._formatString(i.unexpectedTokenExpectedTokens,b,a,this._currentOffset()))}else this._error(e._formatString(i.unexpectedTokenGeneric,b,this._currentOffset()))}},{supportedForProcessing:!1})}),OptionsInterpreter:b.Namespace._lazy(function(){return b.Class.derive(l.BaseInterpreter,function(a,b,c,d){this._initialize(a,b,c,d)},{_error:function(a){throw new d("WinJS.UI.ParseError",e._formatString(i.invalidOptionsRecord,this._originalSource,a))},_evaluateArrayLiteral:function(){var a=[];return this._read(j.tokenType.leftBracket),this._readArrayElements(a),this._read(j.tokenType.rightBracket),a},_evaluateObjectLiteral:function(){var a={};return this._read(j.tokenType.leftBrace),this._readObjectProperties(a),this._tryReadComma(),this._read(j.tokenType.rightBrace),a},_evaluateOptionsLiteral:function(){var a=this._evaluateValue();return this._current.type!==j.tokenType.eof&&this._unexpectedToken(j.tokenType.eof),a},_peekValue:function(){switch(this._current.type){case j.tokenType.falseLiteral:case j.tokenType.nullLiteral:case j.tokenType.stringLiteral:case j.tokenType.trueLiteral:case j.tokenType.numberLiteral:case j.tokenType.leftBrace:case j.tokenType.leftBracket:case j.tokenType.identifier:return!0;default:return!1}},_evaluateValue:function(){switch(this._current.type){case j.tokenType.falseLiteral:case j.tokenType.nullLiteral:case j.tokenType.stringLiteral:case j.tokenType.trueLiteral:case j.tokenType.numberLiteral:var a=this._current.value;return this._read(),a;case j.tokenType.leftBrace:return this._evaluateObjectLiteral();case j.tokenType.leftBracket:return this._evaluateArrayLiteral();case j.tokenType.identifier:return k(this._peek(j.tokenType.identifier).type===j.tokenType.leftParentheses?this._evaluateObjectQueryExpression():this._evaluateIdentifierExpression());default:this._unexpectedToken(j.tokenType.falseLiteral,j.tokenType.nullLiteral,j.tokenType.stringLiteral,j.tokenType.trueLiteral,j.tokenType.numberLiteral,j.tokenType.leftBrace,j.tokenType.leftBracket,j.tokenType.identifier)}},_tryReadElement:function(a){return this._peekValue()?(a.push(this._evaluateValue()),!0):!1},_tryReadComma:function(){return this._peek(j.tokenType.comma)?(this._read(),!0):!1},_tryReadElision:function(a){for(var b=!1;this._tryReadComma();)a.push(void 0),b=!0;return b},_readArrayElements:function(a){for(;!this._peek(j.tokenType.rightBracket);){var b=this._tryReadElision(a),c=this._tryReadElement(a),d=this._peek(j.tokenType.comma);if(!c||!d){if(c||b)break;this._unexpectedToken(j.tokenType.falseLiteral,j.tokenType.nullLiteral,j.tokenType.stringLiteral,j.tokenType.trueLiteral,j.tokenType.numberLiteral,j.tokenType.leftBrace,j.tokenType.leftBracket,j.tokenType.identifier);break}this._read()}},_readObjectProperties:function(a){for(;!this._peek(j.tokenType.rightBrace);){var b=this._tryReadObjectProperty(a),c=this._peek(j.tokenType.comma);if(!b||!c){if(b)break;this._unexpectedToken(j.tokenType.numberLiteral,j.tokenType.stringLiteral,j.tokenType.identifier);break}this._read()}},_tryReadObjectProperty:function(a){switch(this._current.type){case j.tokenType.numberLiteral:case j.tokenType.stringLiteral:case j.tokenType.identifier:case this._current.keyword&&this._current.type:var b=this._current.value;return this._read(),this._read(j.tokenType.colon),a[b]=this._evaluateValue(),!0;default:return!1}},_failReadObjectProperty:function(){this._unexpectedToken(j.tokenType.numberLiteral,j.tokenType.stringLiteral,j.tokenType.identifier,j.tokenType.reservedWord)},_evaluateObjectQueryExpression:function(){var a=this._current.value;this._read(j.tokenType.identifier),this._read(j.tokenType.leftParentheses);var b=this._current.value;this._read(j.tokenType.stringLiteral),this._read(j.tokenType.rightParentheses);var c=k(this._functionContext[a])(b);switch(this._current.type){case j.tokenType.dot:case j.tokenType.leftBracket:return this._evaluateAccessExpressions(c);default:return c}},run:function(){return this._evaluateOptionsLiteral()}},{supportedForProcessing:!1})}),OptionsParser:b.Namespace._lazy(function(){return b.Class.derive(l.OptionsInterpreter,function(a,b){this._initialize(a,b)},{_evaluateAccessExpression:g,_evaluateAccessExpressions:g,_evaluateIdentifier:g,_evaluateIdentifierExpression:g,_evaluateObjectQueryExpression:g,_evaluateValue:function(){switch(this._current.type){case j.tokenType.falseLiteral:case j.tokenType.nullLiteral:case j.tokenType.stringLiteral:case j.tokenType.trueLiteral:case j.tokenType.numberLiteral:var a=this._current.value;return this._read(),a;case j.tokenType.leftBrace:return this._evaluateObjectLiteral();case j.tokenType.leftBracket:return this._evaluateArrayLiteral();case j.tokenType.identifier:return this._peek(j.tokenType.identifier).type===j.tokenType.leftParentheses?this._readObjectQueryExpression():this._readIdentifierExpression();default:this._unexpectedToken(j.tokenType.falseLiteral,j.tokenType.nullLiteral,j.tokenType.stringLiteral,j.tokenType.trueLiteral,j.tokenType.numberLiteral,j.tokenType.leftBrace,j.tokenType.leftBracket,j.tokenType.identifier)}},_readIdentifierExpression:function(){var a=l.BaseInterpreter.prototype._readIdentifierExpression.call(this);return new p(a)},_readObjectQueryExpression:function(){var a=this._current.value;this._read(j.tokenType.identifier),this._read(j.tokenType.leftParentheses);var b=this._current.value;this._read(j.tokenType.stringLiteral),this._read(j.tokenType.rightParentheses);var c=new o(a,b);switch(this._current.type){case j.tokenType.dot:case j.tokenType.leftBracket:var d=[c];return this._readAccessExpressions(d),new p(d);default:return c}}},{supportedForProcessing:!1})})}),m=function(a,b,c){var d=j.lexer(a),e=new l.OptionsInterpreter(d,a,b||{},c||{});return e.run()};Object.defineProperty(m,"_BaseInterpreter",{get:function(){return l.BaseInterpreter}});var n=function(a){var b=j.lexer(a),c=new l.OptionsParser(b,a);return c.run()},o=b.Class.define(function(a,b){this.target=a,this.arg0Value=b});o.supportedForProcessing=!1;var p=b.Class.define(function(a){this.parts=a});p.supportedForProcessing=!1,b.Namespace._moduleDefine(a,"WinJS.UI",{optionsParser:m,_optionsParser:n,_CallExpression:o,_IdentifierExpression:p})}),define("WinJS/ControlProcessor",["exports","./Core/_Global","./Core/_Base","./Core/_BaseUtils","./Core/_Log","./Core/_Resources","./Core/_WriteProfilerMark","./ControlProcessor/_OptionsParser","./Promise","./Utilities/_ElementUtilities"],function(a,b,c,d,e,f,g,h,i,j){"use strict";function k(a){var c=function(c){for(var d,e=a;e;){if(e.msParentSelectorScope){var f=e.parentNode;if(f&&(d=j._matchesSelector(f,c)?f:f.querySelector(c)))break}e=e.parentNode}return d||b.document.querySelector(c)};return s(c)}function l(a,c){return new i(function(d,g){try{var i,j=a.getAttribute("data-win-options");j&&(i=h.optionsParser(j,b,{select:k(a)}));var l,m=1;c.length>2&&m++;var n=function(){m--,0===m&&(a.winControl=a.winControl||l,d(l))};l=new c(a,i,n),n()}catch(o){e.log&&e.log(f._formatString(r.errorActivatingControl,o&&o.message),"winjs controls","error"),g(o)}})}function m(a,c){return new i(function(d,e){g("WinJS.UI:processAll,StartTM"),a=a||b.document.body;var f=0,h="[data-win-control]",i=a.querySelectorAll(h),j=[];!c&&n(a)&&j.push(a);for(var k=0,m=i.length;m>k;k++)j.push(i[k]);if(0===j.length)return g("WinJS.UI:processAll,StopTM"),void d(a);for(var o=function(){f-=1,0>f&&(g("WinJS.UI:processAll,StopTM"),d(a))},q=new Array(j.length),k=0,m=j.length;m>k;k++){var r,s=j[k],u=s.winControl;u?r=u.constructor:q[k]=r=n(s),r&&r.isDeclarativeControlContainer&&(k+=s.querySelectorAll(h).length)}g("WinJS.UI:processAllActivateControls,StartTM");for(var k=0,m=j.length;m>k;k++){var v=q[k],s=j[k];if(v&&!s.winControl&&(f++,l(s,v).then(o,function(a){g("WinJS.UI:processAll,StopTM"),e(a)}),v.isDeclarativeControlContainer&&"function"==typeof v.isDeclarativeControlContainer)){var w=t(v.isDeclarativeControlContainer);w(s.winControl,p)}}g("WinJS.UI:processAllActivateControls,StopTM"),o()})}function n(a){if(a.getAttribute){var c=a.getAttribute("data-win-control");if(c)return d._getMemberFiltered(c.trim(),b,t)}}function o(a,b){return k(b)(a)}function p(a,b){return u?m(a,b):d.ready().then(function(){return u=!0,m(a,b)})}function q(a){if(a&&a.winControl)return i.as(a.winControl);var b=n(a);return b?l(a,b):i.as()}if(b.document){var r={get errorActivatingControl(){return"Error activating control: {0}"}},s=d.markSupportedForProcessing,t=d.requireSupportedForProcessing,u=!1;c.Namespace._moduleDefine(a,"WinJS.UI",{scopedSelect:o,processAll:p,process:q})}}),define("WinJS/Utilities/_ElementListUtilities",["exports","../Core/_Global","../Core/_Base","../ControlProcessor","../Promise","../Utilities/_Control","../Utilities/_ElementUtilities"],function(a,b,c,d,e,f,g){"use strict";b.document&&c.Namespace._moduleDefine(a,"WinJS.Utilities",{QueryCollection:c.Class.derive(Array,function(a){a&&this.include(a)},{forEach:function(a,b){return Array.prototype.forEach.apply(this,[a,b]),this},get:function(a){return this[a]},setAttribute:function(a,b){return this.forEach(function(c){c.setAttribute(a,b)}),this},getAttribute:function(a){return this.length>0?this[0].getAttribute(a):void 0},addClass:function(a){return this.forEach(function(b){g.addClass(b,a)}),this},hasClass:function(a){return this.length>0?g.hasClass(this[0],a):!1},removeClass:function(a){return this.forEach(function(b){g.removeClass(b,a)}),this},toggleClass:function(a){return this.forEach(function(b){g.toggleClass(b,a)}),this},listen:function(a,b,c){return this.forEach(function(d){d.addEventListener(a,b,c)}),this},removeEventListener:function(a,b,c){return this.forEach(function(d){d.removeEventListener(a,b,c)}),this},setStyle:function(a,b){return this.forEach(function(c){c.style[a]=b}),this},clearStyle:function(a){return this.forEach(function(b){b.style[a]=""}),this},query:function(b){var c=new a.QueryCollection;return this.forEach(function(a){c.include(a.querySelectorAll(b))}),c},include:function(a){if("number"==typeof a.length)for(var b=0;b<a.length;b++)this.push(a[b]);else a.DOCUMENT_FRAGMENT_NODE&&a.nodeType===a.DOCUMENT_FRAGMENT_NODE?this.include(a.childNodes):this.push(a)},control:function(a,b){return a&&"function"==typeof a?this.forEach(function(c){c.winControl=new a(c,b)}):(b=a,this.forEach(function(a){d.process(a).done(function(a){a&&f.setOptions(a,b)})})),this},template:function(b,c,d){b instanceof a.QueryCollection&&(b=b[0]);var f=b.winControl;null!==c&&void 0!==c&&c.forEach||(c=[c]),d=d||function(){};var g=this,h=[];return c.forEach(function(a){g.forEach(function(b){h.push(f.render(a,b))})}),d(e.join(h)),this}},{supportedForProcessing:!1}),query:function(c,d){return new a.QueryCollection((d||b.document).querySelectorAll(c))},id:function(c){var d=b.document.getElementById(c);return new a.QueryCollection(d?[d]:[])},children:function(b){return new a.QueryCollection(b.children)}})}),define("WinJS/Utilities/_Hoverable",["exports","../Core/_Global"],function(a,b){"use strict";if(b.document&&(b.document.documentElement.classList.add("win-hoverable"),a.isHoverable=!0,!b.MSPointerEvent)){var c=function(){b.document.removeEventListener("touchstart",c),b.document.documentElement.classList.remove("win-hoverable"),a.isHoverable=!1};b.document.addEventListener("touchstart",c)}}),define("WinJS/Utilities/_ParallelWorkQueue",["exports","../Core/_Base","../Promise","../Scheduler"],function(a,b,c,d){"use strict";b.Namespace._moduleDefine(a,"WinJS.UI",{_ParallelWorkQueue:b.Namespace._lazy(function(){return b.Class.define(function(a){function b(){j--,k||d.schedule(e,d.Priority.normal,null,"WinJS._ParallelWorkQueue.runNext")}function e(){for(k++;a>j;j++){var c,d;do c=i.shift(),d=c&&h[c];while(c&&!d);if(!d)break;delete h[c];try{d().then(b,b)}catch(e){b()}}k--}function f(a,b,d){var f,j="w"+g++;return new c(function(c,g,k){var l=function(){return f=a().then(c,g,k)};l.data=b,h[j]=l,d?i.unshift(j):i.push(j),e()},function(){delete h[j],f&&f.cancel()})}var g=0,h={},i=[];a=a||3;var j=0,k=0;this.sort=function(a){i.sort(function(b,c){return b=h[b],c=h[c],void 0===b&&void 0===c?0:void 0===b?1:void 0===c?-1:a(b.data,c.data)})},this.queue=f},{},{supportedForProcessing:!1})})})}),define("WinJS/Utilities/_VersionManager",["exports","../Core/_Base","../_Signal"],function(a,b,c){"use strict";b.Namespace._moduleDefine(a,"WinJS.UI",{_VersionManager:b.Namespace._lazy(function(){return b.Class.define(function(){this._unlocked=new c,this._unlocked.complete()},{_cancelCount:0,_notificationCount:0,_updateCount:0,_version:0,locked:{get:function(){return 0!==this._notificationCount||0!==this._updateCount}},noOutstandingNotifications:{get:function(){return 0===this._notificationCount}},version:{get:function(){return this._version}},unlocked:{get:function(){return this._unlocked.promise}},_dispose:function(){this._unlocked&&(this._unlocked.cancel(),this._unlocked=null)},beginUpdating:function(){this._checkLocked(),this._updateCount++},endUpdating:function(){this._updateCount--,this._checkUnlocked()},beginNotifications:function(){this._checkLocked(),this._notificationCount++},endNotifications:function(){this._notificationCount--,this._checkUnlocked()},_checkLocked:function(){this.locked||(this._dispose(),this._unlocked=new c)},_checkUnlocked:function(){this.locked||this._unlocked.complete()},receivedNotification:function(){if(this._version++,this._cancel){var a=this._cancel;this._cancel=null,a.forEach(function(a){a&&a.cancel()})}},cancelOnNotification:function(a){return this._cancel||(this._cancel=[],this._cancelCount=0),this._cancel[this._cancelCount++]=a,this._cancelCount-1},clearCancelOnNotification:function(a){this._cancel&&delete this._cancel[a]}},{supportedForProcessing:!1})})})}),define("WinJS/Utilities/_ItemsManager",["exports","../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Resources","../Core/_WriteProfilerMark","../Promise","../_Signal","../Scheduler","../Utilities/_ElementUtilities","./_ParallelWorkQueue","./_VersionManager"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){"use strict";function n(a){return t(function(b,c){return b.then(function(b){return b?a(b,c):null})})}function o(a,b){var c=!1,d=!1;return a.isOnScreen().then(function(a){c=a}),b.isOnScreen().then(function(a){d=a}),(c?0:1)-(d?0:1)}function p(a){if(!/^blob:/i.test(a)&&(B[a]=!0,C.push(a),C.length>E)){var b=C;B={},C=[];for(var c=0,d=b.length-1;d>=0&&D>c;d--){var e=b[d];B[e]||(B[e]=!0,c++)}}}function q(a,c,d){var e=A++;return w=w||new l._ParallelWorkQueue(6),w.queue(function(){return new h(function(d,f){j.schedule(function(e){c||(c=b.document.createElement("img"));var g=B[a];g?(p(a),c.src=a,d(c)):e.setPromise(new h(function(e){var g=b.document.createElement("img"),h=function(){g.removeEventListener("load",i,!1),g.removeEventListener("error",j,!1),c.src=a;var b=new Date;b-y>z&&(y=b,w.sort(o))},i=function(){e(k)},j=function(){e(l)},k=function(){p(a),h(),d(c)},l=function(){h(),f(c)};g.addEventListener("load",i,!1),g.addEventListener("error",j,!1),g.src=a}))},j.Priority.normal,null,"WinJS.UI._ImageLoader._image"+e)})},d)}function r(a){return B[a]}function s(){return b.document.createElement("div")}var t=d.markSupportedForProcessing,u=k._uniqueID,v=n(function(a){if(k._isDOMElement(a.data))return a.data;var c=a.data;void 0===c?c="undefined":null===c?c="null":"object"==typeof c&&(c=JSON.stringify(c));var d=b.document.createElement("span");return d.textContent=c.toString(),d});c.Namespace._moduleDefine(a,"WinJS.UI",{_normalizeRendererReturn:function(a){if(a){if("object"==typeof a&&a.element){var b=h.as(a.element);return b.then(function(b){return{element:b,renderComplete:h.as(a.renderComplete)}})}var b=h.as(a);return b.then(function(a){return{element:a,renderComplete:h.as()}})}return{element:null,renderComplete:h.as()}},simpleItemRenderer:n,_trivialHtmlRenderer:v});var w,x={get listDataSourceIsInvalid(){return"Invalid argument: dataSource must be an object."},get itemRendererIsInvalid(){return"Invalid argument: itemRenderer must be a function."},get itemIsInvalid(){return"Invalid argument: item must be a DOM element that was returned by the Items Manager, and has not been replaced or released."}},y=new Date,z=64,A=0,B={},C=[],D=250,E=1e3;c.Namespace._moduleDefine(a,"WinJS.UI",{_seenUrl:p,_getSeenUrls:function(){return B},_getSeenUrlsMRU:function(){return C},_seenUrlsMaxSize:D,_seenUrlsMRUMaxSize:E}),c.Namespace._moduleDefine(a,"WinJS.UI",{_createItemsManager:c.Namespace._lazy(function(){var b=c.Class.define(function(a){this._itemsManager=a},{beginNotifications:function(){this._itemsManager._versionManager.beginNotifications(),this._itemsManager._beginNotifications()},inserted:function(a,b,c){this._itemsManager._versionManager.receivedNotification(),this._itemsManager._inserted(a,b,c)},changed:function(a,b){this._itemsManager._versionManager.receivedNotification(),this._itemsManager._changed(a,b)},moved:function(a,b,c){this._itemsManager._versionManager.receivedNotification(),this._itemsManager._moved(a,b,c)},removed:function(a,b){this._itemsManager._versionManager.receivedNotification(),this._itemsManager._removed(a,b)},countChanged:function(a,b){this._itemsManager._versionManager.receivedNotification(),this._itemsManager._countChanged(a,b)},indexChanged:function(a,b,c){this._itemsManager._versionManager.receivedNotification(),this._itemsManager._indexChanged(a,b,c)},affectedRange:function(a){this._itemsManager._versionManager.receivedNotification(),this._itemsManager._affectedRange(a)},endNotifications:function(){this._itemsManager._versionManager.endNotifications(),this._itemsManager._endNotifications()},reload:function(){this._itemsManager._versionManager.receivedNotification(),this._itemsManager._reload()}},{supportedForProcessing:!1}),d=c.Class.define(function(a,c,d,f){if(!a)throw new e("WinJS.UI.ItemsManager.ListDataSourceIsInvalid",x.listDataSourceIsInvalid);if(!c)throw new e("WinJS.UI.ItemsManager.ItemRendererIsInvalid",x.itemRendererIsInvalid);this.$pipeline_callbacksMap={},this._listDataSource=a,this.dataSource=this._listDataSource,this._elementNotificationHandler=d,this._listBinding=this._listDataSource.createListBinding(new b(this)),f&&(f.ownerElement&&(this._ownerElement=f.ownerElement),this._profilerId=f.profilerId,this._versionManager=f.versionManager||new m._VersionManager),this._indexInView=f&&f.indexInView,this._itemRenderer=c,this._viewCallsReady=f&&f.viewCallsReady,this._elementMap={},this._handleMap={},this._jobOwner=j.createOwnerToken(),this._notificationsSent=!1,this._listBinding.last&&(this.lastItem=function(){return this._elementForItem(this._listBinding.last())})},{_itemFromItemPromise:function(a){return this._waitForElement(this._elementForItem(a))},_itemFromItemPromiseThrottled:function(a){return this._waitForElement(this._elementForItem(a,!0))},_itemAtIndex:function(a){var b=this._itemPromiseAtIndex(a);this._itemFromItemPromise(b).then(null,function(a){return b.cancel(),h.wrapError(a)})},_itemPromiseAtIndex:function(a){return this._listBinding.fromIndex(a)},_waitForElement:function(a){var b=this;return new h(function(c){if(a)if(b.isPlaceholder(a)){var d=u(a),e=b.$pipeline_callbacksMap[d];e?e.push(c):b.$pipeline_callbacksMap[d]=[c]}else c(a);else c(a)})},_updateElement:function(a,b){var c=u(b),d=this.$pipeline_callbacksMap[c];d&&(delete this.$pipeline_callbacksMap[c],d.forEach(function(b){b(a)}))},_firstItem:function(){return this._waitForElement(this._elementForItem(this._listBinding.first()))},_lastItem:function(){return this._waitForElement(this._elementForItem(this._listBinding.last()))},_previousItem:function(a){return this._listBinding.jumpToItem(this._itemFromElement(a)),this._waitForElement(this._elementForItem(this._listBinding.previous()))},_nextItem:function(a){return this._listBinding.jumpToItem(this._itemFromElement(a)),this._waitForElement(this._elementForItem(this._listBinding.next()))},_itemFromPromise:function(a){return this._waitForElement(this._elementForItem(a))},isPlaceholder:function(a){return!!this._recordFromElement(a).elementIsPlaceholder},itemObject:function(a){return this._itemFromElement(a)},release:function(){this._listBinding.release(),this._elementNotificationHandler=null,this._listBinding=null,this._jobOwner.cancelAll(),this._released=!0},releaseItemPromise:function(a){var b=a.handle,c=this._handleMap[b];c?this._releaseRecord(c):a.cancel()},releaseItem:function(a){var b=this._elementMap[u(a)];this._releaseRecord(b)},_releaseRecord:function(a){a&&(a.renderPromise&&a.renderPromise.cancel(),a.itemPromise&&a.itemPromise.cancel(),a.imagePromises&&a.imagePromises.forEach(function(a){a.cancel()}),a.itemReadyPromise&&a.itemReadyPromise.cancel(),a.renderComplete&&a.renderComplete.cancel(),this._removeEntryFromElementMap(a.element),this._removeEntryFromHandleMap(a.itemPromise.handle,a),a.item&&this._listBinding.releaseItem(a.item))},refresh:function(){return this._listDataSource.invalidateAll()},_handlerToNotifyCaresAboutItemAvailable:function(){return!(!this._elementNotificationHandler||!this._elementNotificationHandler.itemAvailable)},_handlerToNotify:function(){return this._notificationsSent||(this._notificationsSent=!0,this._elementNotificationHandler&&this._elementNotificationHandler.beginNotifications&&this._elementNotificationHandler.beginNotifications()),this._elementNotificationHandler},_defineIndexProperty:function(a,b,c){c.indexObserved=!1,Object.defineProperty(a,"index",{get:function(){return c.indexObserved=!0,b.index}})},_renderPlaceholder:function(a){var b={},c=s(b);return a.elementIsPlaceholder=!0,c},_renderItem:function(b,c,d){function e(){b.then(function(a){f._writeProfilerMark(m+",StartTM"),k.complete(a),f._writeProfilerMark(m+",StopTM")})}var f=this,g=f._indexInView||function(){return!0},k=new i,l=new i,m="_renderItem("+c.item.index+"):itemPromise",n=!0,o=!1;b.then(function(a){o=!0,n&&k.complete(a)}),n=!1;var p=k.promise.then(function(a){if(a){var b=Object.create(a);return f._defineIndexProperty(b,a,c),b.ready=l.promise,
-b.isOnScreen=function(){return h.wrap(g(a.index))},b.loadImage=function(a,d){var e=q(a,d,b);return c.imagePromises?c.imagePromises.push(e):c.imagePromises=[e],e},b.isImageCached=r,b}return h.cancel});o||(d?(c.stage0=b,c.startStage1=function(){c.startStage1=null,e()}):e()),p.handle=b.handle,c.itemPromise=p,c.itemReadyPromise=l.promise,c.readyComplete=!1;var s="_renderItem("+c.item.index+(o?"):syncItemPromise":"):placeholder"),t="_renderItem("+c.item.index+"):itemReady";this._writeProfilerMark(s+",StartTM");var u=h.as(f._itemRenderer(p,c.element)).then(a._normalizeRendererReturn).then(function(a){return f._released?h.cancel:(p.then(function(a){if(c.pendingReady=function(){c.pendingReady&&(c.pendingReady=null,c.readyComplete=!0,f._writeProfilerMark(t+",StartTM"),l.complete(a),f._writeProfilerMark(t+",StopTM"))},!f._viewCallsReady){var b=j.schedule(c.pendingReady,j.Priority.normal,c,"WinJS.UI._ItemsManager._pendingReady");b.owner=f._jobOwner}}),a)});return this._writeProfilerMark(s+",StopTM"),u},_replaceElement:function(a,b){this._removeEntryFromElementMap(a.element),a.element=b,this._addEntryToElementMap(b,a)},_changeElement:function(a,b,c){a.renderPromise=null;var d=a.element,e=a.item;a.newItem&&(a.item=a.newItem,a.newItem=null),this._replaceElement(a,b),a.item&&a.elementIsPlaceholder&&!c?(a.elementDelayed=null,a.elementIsPlaceholder=!1,this._updateElement(a.element,d),this._handlerToNotifyCaresAboutItemAvailable()&&this._handlerToNotify().itemAvailable(a.element,d)):this._handlerToNotify().changed(b,d,e)},_elementForItem:function(a,b){var c,d=a.handle,e=this._recordFromHandle(d,!0);if(!d)return null;if(e)c=e.element;else{e={item:a,itemPromise:a},this._addEntryToHandleMap(d,e);var f=this,g=!1,h=!1,i=f._renderItem(a,e,b).then(function(b){var d=b.element;e.renderComplete=b.renderComplete,a.then(function(a){e.item=a,a||(g=!0,c=null)}),h=!0,e.renderPromise=null,d&&(c?f._presentElements(e,d):c=d)});g||(h||(e.renderPromise=i),c||(c=this._renderPlaceholder(e)),e.element=c,this._addEntryToElementMap(c,e),a.retain())}return c},_addEntryToElementMap:function(a,b){this._elementMap[u(a)]=b},_removeEntryFromElementMap:function(a){delete this._elementMap[u(a)]},_recordFromElement:function(a){var b=this._elementMap[u(a)];if(!b)throw this._writeProfilerMark("_recordFromElement:ItemIsInvalidError,info"),new e("WinJS.UI.ItemsManager.ItemIsInvalid",x.itemIsInvalid);return b},_addEntryToHandleMap:function(a,b){this._handleMap[a]=b},_removeEntryFromHandleMap:function(a){delete this._handleMap[a]},_handleInHandleMap:function(a){return!!this._handleMap[a]},_recordFromHandle:function(a,b){var c=this._handleMap[a];if(!c&&!b)throw new e("WinJS.UI.ItemsManager.ItemIsInvalid",x.itemIsInvalid);return c},_foreachRecord:function(a){var b=this._handleMap;for(var c in b){var d=b[c];a(d)}},_itemFromElement:function(a){return this._recordFromElement(a).item},_elementFromHandle:function(a){if(a){var b=this._recordFromHandle(a,!0);if(b&&b.element)return b.element}return null},_inserted:function(a,b,c){this._handlerToNotify().inserted(a,b,c)},_changed:function(a,b){if(this._handleInHandleMap(b.handle)){var c=this._recordFromHandle(b.handle);c.renderPromise&&c.renderPromise.cancel(),c.itemPromise&&c.itemPromise.cancel(),c.imagePromises&&c.imagePromises.forEach(function(a){a.cancel()}),c.itemReadyPromise&&c.itemReadyPromise.cancel(),c.renderComplete&&c.renderComplete.cancel(),c.newItem=a;var d=this,e=h.as(a);e.handle=c.itemPromise.handle,c.renderPromise=this._renderItem(e,c).then(function(a){c.renderComplete=a.renderComplete,d._changeElement(c,a.element,!1),d._presentElements(c)})}},_moved:function(a,b,c){var d=this._elementFromHandle(a.handle),e=this._elementFromHandle(b),f=this._elementFromHandle(c);this._handlerToNotify().moved(d,e,f,a),this._presentAllElements()},_removed:function(a,b){if(this._handleInHandleMap(a)){var c=this._elementFromHandle(a);this._handlerToNotify().removed(c,b,a),this.releaseItem(c),this._presentAllElements()}else this._handlerToNotify().removed(null,b,a)},_countChanged:function(a,b){this._elementNotificationHandler&&this._elementNotificationHandler.countChanged&&this._handlerToNotify().countChanged(a,b)},_indexChanged:function(a,b,c){var d;if(this._handleInHandleMap(a)){var e=this._recordFromHandle(a);if(e.indexObserved)if(e.elementIsPlaceholder)this._changeElement(e,this._renderPlaceholder(e),!0);else if(e.item.index!==b){e.renderPromise&&e.renderPromise.cancel(),e.renderComplete&&e.renderComplete.cancel();var f=e.newItem||e.item;f.index=b;var g=h.as(f);g.handle=e.itemPromise.handle;var i=this;e.renderPromise=this._renderItem(g,e).then(function(a){e.renderComplete=a.renderComplete,i._changeElement(e,a.element,!1),i._presentElements(e)})}d=e.element}this._elementNotificationHandler&&this._elementNotificationHandler.indexChanged&&this._handlerToNotify().indexChanged(d,b,c)},_affectedRange:function(a){this._elementNotificationHandler&&this._elementNotificationHandler.updateAffectedRange&&this._handlerToNotify().updateAffectedRange(a)},_beginNotifications:function(){this._externalBegin=!0,this._handlerToNotify()},_endNotifications:function(){this._notificationsSent&&(this._notificationsSent=!1,this._externalBegin=!1,this._elementNotificationHandler&&this._elementNotificationHandler.endNotifications&&this._elementNotificationHandler.endNotifications())},_reload:function(){this._elementNotificationHandler&&this._elementNotificationHandler.reload&&this._elementNotificationHandler.reload()},_postEndNotifications:function(){if(this._notificationsSent&&!this._externalBegin&&!this._endNotificationsPosted){this._endNotificationsPosted=!0;var a=this;j.schedule(function(){a._endNotificationsPosted=!1,a._endNotifications()},j.Priority.high,null,"WinJS.UI._ItemsManager._postEndNotifications")}},_presentElement:function(a){var b=a.element;this._replaceElement(a,a.elementDelayed),a.elementDelayed=null,a.elementIsPlaceholder=!1,this._updateElement(a.element,b),this._handlerToNotifyCaresAboutItemAvailable()&&this._handlerToNotify().itemAvailable(a.element,b)},_presentElements:function(a,b){b&&(a.elementDelayed=b),this._listBinding.jumpToItem(a.item),a.elementDelayed&&this._presentElement(a),this._postEndNotifications()},_presentAllElements:function(){var a=this;this._foreachRecord(function(b){b.elementDelayed&&a._presentElement(b)})},_writeProfilerMark:function(a){var b="WinJS.UI._ItemsManager:"+(this._profilerId?this._profilerId+":":":")+a;g(b)}},{supportedForProcessing:!1});return function(a,b,c,e){return new d(a,b,c,e)}})})}),define("WinJS/Utilities/_TabContainer",["exports","../Core/_Global","../Core/_Base","../Core/_BaseUtils","./_ElementUtilities"],function(a,b,c,d,e){"use strict";function f(a,c,d,e){var f=b.document.createEvent("UIEvent");return f.initUIEvent(c,!1,!!e,b,d?1:0),!a.dispatchEvent(f)}function g(a){var c=e._getComputedStyle(a);if("none"===c.display||"hidden"===c.visibility)return b.NodeFilter.FILTER_REJECT;if(a._tabContainer)return b.NodeFilter.FILTER_ACCEPT;if(a.parentNode&&a.parentNode._tabContainer){var d=a.parentNode._tabContainer.childFocus;return d&&a.contains(d)?j(a)>=0?b.NodeFilter.FILTER_ACCEPT:b.NodeFilter.FILTER_SKIP:b.NodeFilter.FILTER_REJECT}var f=j(a);return f>=0?b.NodeFilter.FILTER_ACCEPT:b.NodeFilter.FILTER_SKIP}function h(a){function b(){if(a.currentNode._tabContainer)e=e.concat(h(a));else if(j(a.currentNode)>=0&&e.push(a.currentNode),a.firstChild()){do b();while(a.nextSibling());a.parentNode()}}var c=a.currentNode,d=c._tabContainer.childFocus,e=[];return d?(a.currentNode=d,b(),a.currentNode=c,e):[]}function i(a,c){function d(){var a=b.document.createElement("DIV");return a.tabIndex=c?c:0,a.setAttribute("aria-hidden",!0),a}var e=a.parentNode,g=d();e.insertBefore(g,a);var h=d();e.insertBefore(h,a.nextSibling),g.addEventListener("focus",function(){f(a,"onTabEnter",!0)},!0),h.addEventListener("focus",function(){f(a,"onTabEnter",!1)},!0),this._catcherBegin=g,this._catcherEnd=h;var i=1;this.addRef=function(){i++},this.release=function(){return 0===--i&&(g.parentElement&&e.removeChild(g),h.parentElement&&e.removeChild(h)),i},this.updateTabIndex=function(a){g.tabIndex=a,h.tabIndex=a}}if(b.document){var j=e.getTabIndex,k={attach:function(a,b){return a["win-trackTabHelperObject"]?a["win-trackTabHelperObject"].addRef():a["win-trackTabHelperObject"]=new i(a,b),a["win-trackTabHelperObject"]},detach:function(a){a["win-trackTabHelperObject"].release()||delete a["win-trackTabHelperObject"]}};c.Namespace._moduleDefine(a,"WinJS.UI",{TrackTabBehavior:k,TabContainer:c.Class.define(function(a){this._element=a,this._tabIndex=0,a._tabContainer=this,null===a.getAttribute("tabindex")&&(a.tabIndex=-1);var b=this;a.addEventListener("onTabEnter",function(c){var d=f(b._element,"onTabEntered",c.detail,!0);d||(b.childFocus?b.childFocus.focus():a.focus())}),a.addEventListener("keydown",function(a){var c=a.target;if(a.keyCode===e.Key.tab){var g=!a.shiftKey,h=b._hasMoreElementsInTabOrder(c,g);if(!h){var i=f(b._element,"onTabExiting",g,!0);if(i)return a.stopPropagation(),void a.preventDefault();for(var j=b._element.querySelectorAll("a[href],area[href],button,command,input,link,menuitem,object,select,textarea,th[sorted],[tabindex]"),k=j.length,l=[],m=0;k>m;m++){var n=j[m];l.push(n.tabIndex),n.tabIndex=-1}b._elementTabHelper[g?"_catcherEnd":"_catcherBegin"].tabIndex=-1;var o=function(){c.removeEventListener("blur",o,!1);for(var a=0;k>a;a++)-1!==l[a]&&(j[a].tabIndex=l[a]);b._elementTabHelper._catcherBegin.tabIndex=b._tabIndex,b._elementTabHelper._catcherEnd.tabIndex=b._tabIndex};c.addEventListener("blur",o,!1),d._yieldForEvents(function(){f(b._element,"onTabExit",g)})}}}),this._elementTabHelper=k.attach(a,this._tabIndex),this._elementTabHelper._catcherBegin.tabIndex=0,this._elementTabHelper._catcherEnd.tabIndex=0},{dispose:function(){k.detach(this._element,this._tabIndex)},childFocus:{set:function(a){a!==this._focusElement&&(a&&a.parentNode?this._focusElement=a:this._focusElement=null)},get:function(){return this._focusElement}},tabIndex:{set:function(a){this._tabIndex=a,this._elementTabHelper.updateTabIndex(a)},get:function(){return this._tabIndex}},_element:null,_skipper:function(a){a.stopPropagation(),a.preventDefault()},_hasMoreElementsInTabOrder:function(a,c){if(!this.childFocus)return!1;for(var d=b.document.createTreeWalker(this._element,b.NodeFilter.SHOW_ELEMENT,g,!1),e=h(d),f=0;f<e.length;f++)if(e[f]===a)return c?f<e.length-1:f>0;return!1},_focusElement:null},{supportedForProcessing:!1})})}}),define("WinJS/Utilities/_KeyboardBehavior",["exports","../Core/_Global","../Core/_Base","./_Control","./_ElementUtilities","./_TabContainer"],function(a,b,c,d,e,f){"use strict";if(b.document){var g={touch:"touch",pen:"pen",mouse:"mouse",keyboard:"keyboard"},h=g.mouse,i={2:g.touch,3:g.pen,4:g.mouse,touch:g.touch,pen:g.pen,mouse:g.mouse};e._addEventListener(b,"pointerdown",function(a){h=i[a.pointerType]||g.mouse},!0),b.addEventListener("keydown",function(){h=g.keyboard},!0),c.Namespace._moduleDefine(a,"WinJS.UI",{_keyboardSeenLast:{get:function(){return h===g.keyboard},set:function(a){h=a?g.keyboard:g.mouse}},_lastInputType:{get:function(){return h},set:function(a){g[a]&&(h=a)}},_InputTypes:g,_WinKeyboard:function(b){e._addEventListener(b,"pointerdown",function(a){e.removeClass(a.target,"win-keyboard")},!0),b.addEventListener("keydown",function(a){e.addClass(a.target,"win-keyboard")},!0),e._addEventListener(b,"focusin",function(b){a._keyboardSeenLast&&e.addClass(b.target,"win-keyboard")},!1),e._addEventListener(b,"focusout",function(a){e.removeClass(a.target,"win-keyboard")},!1)},_KeyboardBehavior:c.Namespace._lazy(function(){var a=e.Key,g=c.Class.define(function(a,c){a=a||b.document.createElement("DIV"),c=c||{},a._keyboardBehavior=this,this._element=a,this._fixedDirection=g.FixedDirection.width,this._fixedSize=1,this._currentIndex=0,d.setOptions(this,c),this._tabContainer=new f.TabContainer(this.scroller||this._element),this._tabContainer.tabIndex=0,this._element.children.length>0&&(this._tabContainer.childFocus=this._getFocusInto(this._element.children[0])),this._element.addEventListener("keydown",this._keyDownHandler.bind(this)),e._addEventListener(this._element,"pointerdown",this._MSPointerDownHandler.bind(this))},{element:{get:function(){return this._element}},fixedDirection:{get:function(){return this._fixedDirection},set:function(a){this._fixedDirection=a}},fixedSize:{get:function(){return this._fixedSize},set:function(a){+a===a&&(a=Math.max(1,a),this._fixedSize=a)}},currentIndex:{get:function(){return this._element.children.length>0?this._currentIndex:-1},set:function(a){if(+a===a){var b=this._element.children.length;a=Math.max(0,Math.min(b-1,a)),this._currentIndex=a,this._tabContainer.childFocus=this._getFocusInto(this._element.children[a])}}},getAdjacent:{get:function(){return this._getAdjacent},set:function(a){this._getAdjacent=a}},scroller:{get:function(){return this._scroller},set:function(a){this._scroller=a}},_keyDownHandler:function(b){if(!b.altKey){if(e._matchesSelector(b.target,".win-interactive, .win-interactive *"))return;var c=this.currentIndex,d=this._element.children.length-1,f="rtl"===e._getComputedStyle(this._element).direction,h=f?a.rightArrow:a.leftArrow,i=f?a.leftArrow:a.rightArrow,j=this.getAdjacent&&this.getAdjacent(c,b.keyCode);if(+j===j)c=j;else{var k=c%this.fixedSize;b.keyCode===h?this.fixedDirection===g.FixedDirection.width?0!==k&&c--:c>=this.fixedSize&&(c-=this.fixedSize):b.keyCode===i?this.fixedDirection===g.FixedDirection.width?k!==this.fixedSize-1&&c++:c+this.fixedSize-k<=d&&(c+=this.fixedSize):b.keyCode===a.upArrow?this.fixedDirection===g.FixedDirection.height?0!==k&&c--:c>=this.fixedSize&&(c-=this.fixedSize):b.keyCode===a.downArrow?this.fixedDirection===g.FixedDirection.height?k!==this.fixedSize-1&&c++:c+this.fixedSize-k<=d&&(c+=this.fixedSize):b.keyCode===a.home?c=0:b.keyCode===a.end&&(c=this._element.children.length-1)}c=Math.max(0,Math.min(this._element.children.length-1,c)),c!==this.currentIndex&&(this._focus(c,b.keyCode),b.keyCode!==h&&b.keyCode!==i&&b.keyCode!==a.upArrow&&b.keyCode!==a.downArrow||b.stopPropagation(),b.preventDefault())}},_getFocusInto:function(a,b){return a&&a.winControl&&a.winControl._getFocusInto?a.winControl._getFocusInto(b):a},_focus:function(a,b){a=+a===a?a:this.currentIndex;var c=this._element.children[a];c&&(c=this._getFocusInto(c,b),this.currentIndex=a,e._setActive(c,this.scroller))},_MSPointerDownHandler:function(a){var b=a.target;if(b!==this.element){for(;b.parentNode!==this.element;)b=b.parentNode;for(var c=-1;b;)c++,b=b.previousElementSibling;this.currentIndex=c}}},{FixedDirection:{height:"height",width:"width"}});return g})})}}),define("WinJS/Utilities/_SafeHtml",["exports","../Core/_WinJS","../Core/_Global","../Core/_Base","../Core/_ErrorFromName","../Core/_Resources"],function(a,b,c,d,e,f){"use strict";var g,h,i,j,k,l,m={get nonStaticHTML(){return"Unable to add dynamic content. A script attempted to inject dynamic content, or elements previously modified dynamically, that might be unsafe. For example, using the innerHTML property or the document.write method to add a script element will generate this exception. If the content is safe and from a trusted source, use a method to explicitly manipulate elements and attributes, such as createElement, or use setInnerHTMLUnsafe (or other unsafe method)."}};g=h=function(a,b){a.innerHTML=b},i=j=function(a,b){a.outerHTML=b},k=l=function(a,b,c){a.insertAdjacentHTML(b,c)};var n=c.MSApp;if(n&&n.execUnsafeLocalFunction)h=function(a,c){n.execUnsafeLocalFunction(function(){try{b._execUnsafe=!0,a.innerHTML=c}finally{b._execUnsafe=!1}})},j=function(a,c){n.execUnsafeLocalFunction(function(){try{b._execUnsafe=!0,a.outerHTML=c}finally{b._execUnsafe=!1}})},l=function(a,c,d){n.execUnsafeLocalFunction(function(){try{b._execUnsafe=!0,a.insertAdjacentHTML(c,d)}finally{b._execUnsafe=!1}})};else if(c.msIsStaticHTML){var o=function(a){if(!c.msIsStaticHTML(a))throw new e("WinJS.Utitilies.NonStaticHTML",m.nonStaticHTML)};g=function(a,b){o(b),a.innerHTML=b},i=function(a,b){o(b),a.outerHTML=b},k=function(a,b,c){o(c),a.insertAdjacentHTML(b,c)}}d.Namespace._moduleDefine(a,"WinJS.Utilities",{setInnerHTML:g,setInnerHTMLUnsafe:h,setOuterHTML:i,setOuterHTMLUnsafe:j,insertAdjacentHTML:k,insertAdjacentHTMLUnsafe:l})}),define("WinJS/Utilities/_Select",["exports","../Core/_Base","./_SafeHtml"],function(a,b,c){"use strict";b.Namespace._moduleDefine(a,"WinJS.UI",{_Select:b.Namespace._lazy(function(){function a(a){return a.replace(h,function(a){return i[a]||""})}function d(a){return a.replace(j,"")}function e(a){return this[a]}function f(){return this.length}function g(a){return a.getValue||(a.getValue=e),a.getLength||(a.getLength=f),a}var h=/[&<>'"]/g,i={"&":"&amp;","<":"&lt;",">":"&gt;","'":"&#39;",'"':"&quot;"},j=/[\u200e\u200f]/g;return b.Class.define(function(a,b){this._dataSource=g(b.dataSource),this._index=b.index||0,this._domElement=a,this._domElement.tabIndex=0,b.disabled&&this.setDisabled(b.disabled);var c=this;this._domElement.addEventListener("change",function(){c._index=c._domElement.selectedIndex},!1),this._createSelectElement()},{_index:0,_dataSource:null,dataSource:{get:function(){return this._dataSource},set:function(a){this._dataSource=g(a),this._domElement&&this._createSelectElement()}},setDisabled:function(a){a?this._domElement.setAttribute("disabled","disabled"):this._domElement.removeAttribute("disabled")},_createSelectElement:function(){for(var b=this._dataSource.getLength(),e="",f=0;b>f;f++){var g=""+this._dataSource.getValue(f),h=a(g),i=d(h);e+="<option value='"+i+"'>"+h+"</option>"}c.setInnerHTMLUnsafe(this._domElement,e),this._domElement.selectedIndex=this._index},index:{get:function(){return Math.max(0,Math.min(this._index,this._dataSource.getLength()-1))},set:function(a){if(this._index!==a){this._index=a;var b=this._domElement;b&&b.selectedIndex!==a&&(b.selectedIndex=a)}}},value:{get:function(){return this._dataSource.getValue(this.index)}}})})})}),define("WinJS/Utilities/_Telemetry",["exports"],function(a){"use strict";a.send=function(a,b){}}),define("WinJS/Utilities/_UI",["exports","../Core/_BaseCoreUtils","../Core/_Base"],function(a,b,c){"use strict";c.Namespace._moduleDefine(a,"WinJS.UI",{eventHandler:function(a){return b.markSupportedForProcessing(a)},Orientation:{horizontal:"horizontal",vertical:"vertical"},CountResult:{unknown:"unknown"},CountError:{noResponse:"noResponse"},DataSourceStatus:{ready:"ready",waiting:"waiting",failure:"failure"},FetchError:{noResponse:"noResponse",doesNotExist:"doesNotExist"},EditError:{noResponse:"noResponse",canceled:"canceled",notPermitted:"notPermitted",noLongerMeaningful:"noLongerMeaningful"},ObjectType:{item:"item",groupHeader:"groupHeader",header:"header",footer:"footer"},SelectionMode:{none:"none",single:"single",multi:"multi"},TapBehavior:{directSelect:"directSelect",toggleSelect:"toggleSelect",invokeOnly:"invokeOnly",none:"none"},SwipeBehavior:{select:"select",none:"none"},GroupHeaderTapBehavior:{invoke:"invoke",none:"none"}})}),define("WinJS/Utilities/_Xhr",["../Core/_Global","../Core/_Base","../Promise","../Scheduler"],function(a,b,c,d){"use strict";function e(a,b,c){d.schedule(function(){a(b)},c,null,"WinJS.xhr")}function f(){}function g(b){var g;return new c(function(c,i,j){var k=d.currentPriority;g=new a.XMLHttpRequest;var l=!1,m=h.exec(b.url.toLowerCase());m?"file"===m[1]&&(l=!0):"file:"===a.location.protocol&&(l=!0),g.onreadystatechange=function(){return g._canceled?void(g.onreadystatechange=f):void(4===g.readyState?(g.status>=200&&g.status<300||l&&0===g.status?e(c,g,k):e(i,g,k),g.onreadystatechange=f):e(j,g,k))},g.open(b.type||"GET",b.url,!0,b.user,b.password),g.responseType=b.responseType||"",Object.keys(b.headers||{}).forEach(function(a){g.setRequestHeader(a,b.headers[a])}),b.customRequestInitializer&&b.customRequestInitializer(g),void 0===b.data?g.send():g.send(b.data)},function(){g.onreadystatechange=f,g._canceled=!0,g.abort()})}var h=/^(\w+)\:\/\//;return b.Namespace.define("WinJS",{xhr:g}),g}),define("WinJS/Utilities",["./Utilities/_Control","./Utilities/_Dispose","./Utilities/_ElementListUtilities","./Utilities/_ElementUtilities","./Utilities/_Hoverable","./Utilities/_ItemsManager","./Utilities/_KeyboardBehavior","./Utilities/_ParallelWorkQueue","./Utilities/_SafeHtml","./Utilities/_Select","./Utilities/_TabContainer","./Utilities/_Telemetry","./Utilities/_UI","./Utilities/_VersionManager","./Utilities/_Xhr"],function(){}),define("WinJS/XYFocus",["require","exports","./Core/_Global","./Core/_Base","./Core/_BaseUtils","./Utilities/_ElementUtilities","./Core/_Events","./ControlProcessor/_OptionsParser"],function(a,b,c,d,e,f,g,h){"use strict";function i(a,b){var c=l(a,b);return c?c.target:null}function j(a,b){var d=i(a,b);if(d){var e=c.document.activeElement;if(o(d,-1))return K.dispatchEvent(B.focusChanged,{previousFocusElement:e,keyCode:-1}),d}return null}function k(a,d,e,g){function h(a,b){var c=m();a===A.left||a===A.right?(c.top=Math.max(b.targetRect.top,b.referenceRect.top,G?G.top:Number.MIN_VALUE),c.bottom=Math.min(b.targetRect.bottom,b.referenceRect.bottom,G?G.bottom:Number.MAX_VALUE),c.bottom<=c.top&&(c.top=b.targetRect.top,c.bottom=b.targetRect.bottom),c.height=c.bottom-c.top,c.width=Number.MAX_VALUE,c.left=Number.MIN_VALUE,c.right=Number.MAX_VALUE):(c.left=Math.max(b.targetRect.left,b.referenceRect.left,G?G.left:Number.MIN_VALUE),c.right=Math.min(b.targetRect.right,b.referenceRect.right,G?G.right:Number.MAX_VALUE),c.right<=c.left&&(c.left=b.targetRect.left,c.right=b.targetRect.right),c.width=c.right-c.left,c.height=Number.MAX_VALUE,c.top=Number.MIN_VALUE,c.bottom=Number.MAX_VALUE),G=c}if(e||c.document.activeElement!==E)G=null,E=null,F=null;else if(E&&F){var i=n(E.getBoundingClientRect());i.left===F.left&&i.top===F.top||(G=null,E=null,F=null)}var j=c.document.activeElement,k=l(a,{focusRoot:b.focusRoot,historyRect:G,referenceElement:E,referenceRect:e});if(k&&o(k.target,d)){if(h(a,k),E=k.target,F=k.targetRect,f.hasClass(k.target,y.toggleMode)&&f.removeClass(k.target,y.toggleModeActive),"IFRAME"===k.target.tagName){var p=k.target;if(I.isXYFocusEnabled(p)){var q=n({left:k.referenceRect.left-k.targetRect.left,top:k.referenceRect.top-k.targetRect.top,width:k.referenceRect.width,height:k.referenceRect.height}),r={};r[z.messageDataProperty]={type:z.dFocusEnter,direction:a,referenceRect:q},p.contentWindow.postMessage(r,"*")}}return K.dispatchEvent(B.focusChanged,{previousFocusElement:j,keyCode:d}),!0}if(!g&&top!==window){var q=e;q||(q=c.document.activeElement?n(c.document.activeElement.getBoundingClientRect()):m());var r={};return r[z.messageDataProperty]={type:z.dFocusExit,direction:a,referenceRect:q},c.parent.postMessage(r,"*"),!0}return!1}function l(a,d){function e(a,b,c,d){if(a>=d||c>=b)return 0;var e=Math.min(b,d)-Math.max(a,c),f=Math.min(d-c,b-a);return 0===f?0:e/f}function f(a,b,c,d,f){var g,h,i=0,j=0,k=0;switch(a){case A.left:if(f.left>=d.left)break;g=e(d.top,d.bottom,f.top,f.bottom),h=d.left-f.right,g>0?k=e(c.top,c.bottom,f.top,f.bottom):j=d.bottom<=f.top?f.top-d.bottom:d.top-f.bottom;break;case A.right:if(f.right<=d.right)break;g=e(d.top,d.bottom,f.top,f.bottom),h=f.left-d.right,g>0?k=e(c.top,c.bottom,f.top,f.bottom):j=d.bottom<=f.top?f.top-d.bottom:d.top-f.bottom;break;case A.up:if(f.top>=d.top)break;g=e(d.left,d.right,f.left,f.right),h=d.top-f.bottom,g>0?k=e(c.left,c.right,f.left,f.right):j=d.right<=f.left?f.left-d.right:d.left-f.right;break;case A.down:if(f.bottom<=d.bottom)break;g=e(d.left,d.right,f.left,f.right),h=f.top-d.bottom,g>0?k=e(c.left,c.right,f.left,f.right):j=d.right<=f.left?f.left-d.right:d.left-f.right}return h>=0&&(h=b-h,j=b-j,h>=0&&j>=0&&(h+=h*g,i=h*D.primaryAxisDistanceWeight+j*D.secondaryAxisDistanceWeight+k*D.percentInHistoryShadowWeight)),i}function g(a,b){var d,e;return(!a&&!b||a&&!a.parentNode)&&c.document.activeElement!==c.document.body&&(a=c.document.activeElement),a?(d=a,e=n(d.getBoundingClientRect())):e=b?n(b):m(),{element:d,rect:e}}d=d||{},d.focusRoot=d.focusRoot||b.focusRoot||c.document.body,d.historyRect=d.historyRect||m();var i=Math.max(c.screen.availHeight,c.screen.availWidth),j=g(d.referenceElement,d.referenceRect);if(j.element){var k=j.element.getAttribute(x.focusOverride)||j.element.getAttribute(x.focusOverrideLegacy);if(k){var l=h.optionsParser(k),o=l[a]||l[a[0].toUpperCase()+a.substr(1)];if(o){for(var q,s=j.element;!q&&s;)q=s.querySelector(o),s=s.parentElement;if(q)return q===c.document.activeElement?null:{target:q,targetRect:n(q.getBoundingClientRect()),referenceRect:j.rect,usedOverride:!0}}}}for(var t={element:null,rect:null,score:0},u=d.focusRoot.querySelectorAll("*"),v=0,w=u.length;w>v;v++){var y=u[v];if(j.element!==y&&p(y)&&!r(y)){var z=n(y.getBoundingClientRect());if(0!==z.width&&0!==z.height){var B=f(a,i,d.historyRect,j.rect,z);B>t.score&&(t.element=y,t.rect=z,t.score=B)}}}return t.element?{target:t.element,targetRect:t.rect,referenceRect:j.rect,usedOverride:!1}:null}function m(){return{top:-1,bottom:-1,right:-1,left:-1,height:0,width:0}}function n(a){return{top:Math.floor(a.top),bottom:Math.floor(a.top+a.height),right:Math.floor(a.left+a.width),left:Math.floor(a.left),height:Math.floor(a.height),width:Math.floor(a.width)}}function o(a,b){var d=K.dispatchEvent(B.focusChanging,{nextFocusElement:a,keyCode:b});return d||a.focus(),c.document.activeElement===a}function p(a){var b=a.tagName;if(!a.hasAttribute("tabindex")&&-1===C.indexOf(b)&&!f.hasClass(a,y.focusable))return!1;if("IFRAME"===b&&!I.isXYFocusEnabled(a))return!1;if("DIV"===b&&a.winControl&&a.winControl.disabled)return!1;var c=f._getComputedStyle(a);return"-1"!==a.getAttribute("tabIndex")&&"none"!==c.display&&"hidden"!==c.visibility&&!a.disabled}function q(a){for(var b=a.parentElement;b&&!s(b);)b=b.parentElement;return b}function r(a){var b=q(a);return b&&!f.hasClass(b,y.toggleModeActive)}function s(a){if(f.hasClass(c.document.body,y.xboxPlatform))return!1;if(f.hasClass(a,y.toggleMode))return!0;if("INPUT"===a.tagName){var b=a.type.toLowerCase();if("date"===b||"datetime"===b||"datetime-local"===b||"email"===b||"month"===b||"number"===b||"password"===b||"range"===b||"search"===b||"tel"===b||"text"===b||"time"===b||"url"===b||"week"===b)return!0}else if("TEXTAREA"===a.tagName)return!0;return!1}function t(a){var b=!1,c=!1,d=!1;a&&(b=f._matchesSelector(a,"."+y.suspended+", ."+y.suspended+" *"),c=s(a),d=f.hasClass(a,y.toggleModeActive));var e=H.RestState;return b?e=H.SuspendedState:c&&(e=d?H.ToggleModeActiveState:H.ToggleModeRestState),e}function u(a){if(!a.defaultPrevented){var c=t(document.activeElement),d="";if(-1!==b.keyCodeMap.up.indexOf(a.keyCode)?d="up":-1!==b.keyCodeMap.down.indexOf(a.keyCode)?d="down":-1!==b.keyCodeMap.left.indexOf(a.keyCode)?d="left":-1!==b.keyCodeMap.right.indexOf(a.keyCode)&&(d="right"),d){var e=c.xyFocus(d,a.keyCode);e&&a.preventDefault()}}}function v(a){if(!a.defaultPrevented){var c=document.activeElement,d=!1,e=t(document.activeElement);-1!==b.keyCodeMap.accept.indexOf(a.keyCode)?d=e.accept(c):-1!==b.keyCodeMap.cancel.indexOf(a.keyCode)&&(d=e.cancel(c)),d&&a.preventDefault()}}var w=f.Key,x={focusOverride:"data-win-xyfocus",focusOverrideLegacy:"data-win-focus"},y={focusable:"win-focusable",suspended:"win-xyfocus-suspended",toggleMode:"win-xyfocus-togglemode",toggleModeActive:"win-xyfocus-togglemode-active",xboxPlatform:"win-xbox"},z={messageDataProperty:"msWinJSXYFocusControlMessage",register:"register",unregister:"unregister",dFocusEnter:"dFocusEnter",dFocusExit:"dFocusExit"},A={left:"left",right:"right",up:"up",down:"down"},B={focusChanging:"focuschanging",focusChanged:"focuschanged"},C=["A","BUTTON","IFRAME","INPUT","SELECT","TEXTAREA"],D={primaryAxisDistanceWeight:30,secondaryAxisDistanceWeight:20,percentInHistoryShadowWeight:1e5};b.keyCodeMap={left:[],right:[],up:[],down:[],accept:[],cancel:[]},b.focusRoot,b.findNextFocusElement=i,b.moveFocus=j;var E,F,G,H;!function(a){function b(a){return a&&a.click&&a.click(),!1}function c(){for(var a=[],b=0;b<arguments.length;b++)a[b-0]=arguments[b];return!1}var d=function(){function a(){}return a.accept=b,a.cancel=c,a.xyFocus=k,a}();a.RestState=d;var e=function(){function a(){}return a.accept=c,a.cancel=c,a.xyFocus=c,a}();a.SuspendedState=e;var g=function(){function a(){}return a.accept=function(a){return f.addClass(a,y.toggleModeActive),!0},a.cancel=c,a.xyFocus=k,a}();a.ToggleModeRestState=g;var h=function(){function a(){}return a.cancel=function(a){return a&&f.removeClass(a,y.toggleModeActive),!0},a.accept=b,a.xyFocus=c,a}();a.ToggleModeActiveState=h}(H||(H={}));var I;if(function(a){function b(){return h(function(){return!1}),i.length}function d(a){var b=c.document.querySelectorAll("IFRAME"),d=Array.prototype.filter.call(b,function(b){return b.contentWindow===a});return d.length?d[0]:null}function e(a){var b=!1;return h(function(c){c===a&&(b=!0)}),b}function f(a){i.push(a)}function g(a){var b=-1;h(function(c,d){c===a&&(b=d)}),-1!==b&&i.splice(b,1)}function h(a){for(var b=i.length-1;b>=0;b--)try{var c=i[b];c.contentWindow?a(c,b):i.splice(b,1)}catch(d){i.splice(b,1)}}var i=[];a.count=b,a.getIFrameFromWindow=d,a.isXYFocusEnabled=e,a.registerIFrame=f,a.unregisterIFrame=g}(I||(I={})),c.document){b.keyCodeMap.left.push(w.GamepadLeftThumbstickLeft,w.GamepadDPadLeft,w.NavigationLeft),b.keyCodeMap.right.push(w.GamepadLeftThumbstickRight,w.GamepadDPadRight,w.NavigationRight),b.keyCodeMap.up.push(w.GamepadLeftThumbstickUp,w.GamepadDPadUp,w.NavigationUp),b.keyCodeMap.down.push(w.GamepadLeftThumbstickDown,w.GamepadDPadDown,w.NavigationDown),b.keyCodeMap.accept.push(w.GamepadA,w.NavigationAccept),b.keyCodeMap.cancel.push(w.GamepadB,w.NavigationCancel),c.addEventListener("message",function(a){var b=null;try{if(b=a.source,!b)return}catch(a){return}if(a.data&&a.data[z.messageDataProperty]){var d=a.data[z.messageDataProperty];switch(d.type){case z.register:var e=I.getIFrameFromWindow(b);e&&I.registerIFrame(e);break;case z.unregister:var e=I.getIFrameFromWindow(b);e&&I.unregisterIFrame(e);break;case z.dFocusEnter:var f=k(d.direction,-1,d.referenceRect,!0);f||(p(c.document.body)?c.document.body.focus():k(d.direction,-1));break;case z.dFocusExit:var e=I.getIFrameFromWindow(b);if(c.document.activeElement!==e)break;var g=d.referenceRect,h=e.getBoundingClientRect();g.left+=h.left,g.top+=h.top,"number"==typeof g.right&&(g.right+=h.left),"number"==typeof g.bottom&&(g.bottom+=h.top),k(d.direction,-1,g)}}}),e.ready().then(function(){if(f.hasWinRT&&c.Windows&&c.Windows.Xbox&&f.addClass(c.document.body,y.xboxPlatform),c.document.addEventListener("keydown",v,!0),c.document.addEventListener("keydown",u),c.top!==c.window){var a={};a[z.messageDataProperty]={type:z.register,version:1},c.parent.postMessage(a,"*")}});var J={focusRoot:{get:function(){return b.focusRoot},set:function(a){b.focusRoot=a}},findNextFocusElement:i,keyCodeMap:b.keyCodeMap,moveFocus:j,onfocuschanged:g._createEventProperty(B.focusChanged),onfocuschanging:g._createEventProperty(B.focusChanging),_xyFocus:k,_iframeHelper:I};J=e._merge(J,g.eventMixin),J._listeners={};var K=J;d.Namespace.define("WinJS.UI.XYFocus",J)}}),define("WinJS/Fragments",["exports","./Core/_Global","./Core/_WinRT","./Core/_Base","./Core/_BaseUtils","./Core/_ErrorFromName","./Core/_Resources","./Core/_WriteProfilerMark","./Promise","./Utilities/_ElementUtilities","./Utilities/_SafeHtml","./Utilities/_Xhr"],function(a,b,c,d,e,f,g,h,i,j,k,l){"use strict";function m(a,c,d,e){var f=a.src,g=!f;if(g&&(f=c+"script["+d+"]"),f=f.toLowerCase(),!(f in D)){var h=null;D[f]=!0;var j=b.document.createElement("script");if(a.language&&j.setAttribute("language","javascript"),j.setAttribute("type",a.type),j.setAttribute("async","false"),a.id&&j.setAttribute("id",a.id),g){var k=a.text;h=e.then(function(){j.text=k}).then(null,function(){})}else h=new i(function(b){j.onload=j.onerror=function(){b()},j.setAttribute("src",a.src)});return C.appendChild(j),{promise:h,inline:g}}}function n(a,b,c){var d=(b+"script["+c+"]").toLowerCase();d in E||(E[d]=!0,C.appendChild(a.cloneNode(!0)))}function o(a){
-var b=a.href.toLowerCase();if(!(b in F)){F[b]=!0;var c=a.cloneNode(!1);c.href=a.href,C.appendChild(c)}}function p(a,c){if("string"==typeof a)return r(a,c);var d={docfrag:j.data(a).docFragment};if(!d.docfrag){for(var e=b.document.createDocumentFragment();a.childNodes.length>0;)e.appendChild(a.childNodes[0]);d.docfrag=j.data(a).docFragment=e,a.setAttribute("data-win-hasfragment","")}return c&&y(a),i.as(d)}function q(a,b){return z(a,b).then(function(){return a.document?s(b,a):a}).then(function(){return a.document&&delete a.document,a})}function r(a,b){var c=a.toLowerCase(),d=H[c];if(d)return b&&delete H[c],d.promise?d.promise:i.as(d);d={},b||(H[c]=d);var e=d.promise=q(d,a);return d.promise.then(function(){delete d.promise}),e}function s(a,c){var d=c.document,e=d.body,f=[];B(d.querySelectorAll('link[rel="stylesheet"], link[type="text/css"]'),o),B(d.getElementsByTagName("style"),function(b,c){n(b,a,c)});var g=i.as();B(d.getElementsByTagName("script"),function(b,c){var d=m(b,a,c,g);d&&(d.inline||(g=d.promise),f.push(d.promise))}),B(e.getElementsByTagName("img"),function(a){a.src=a.src}),B(e.getElementsByTagName("a"),function(a){if(""!==a.href){var b=a.getAttribute("href");b&&"#"!==b[0]&&(a.href=a.href)}});for(var h=e.getElementsByTagName("script");h.length>0;){var j=h[0];j.parentNode.removeChild(j)}return i.join(f).then(function(){for(var a=b.document.createDocumentFragment(),e=b.document.importNode(d.body,!0);e.childNodes.length>0;)a.appendChild(e.childNodes[0]);return c.docfrag=a,c})}function t(){G||(G=!0,B(C.querySelectorAll("script"),function(a){D[a.src.toLowerCase()]=!0}),B(C.querySelectorAll('link[rel="stylesheet"], link[type="text/css"]'),function(a){F[a.href.toLowerCase()]=!0}))}function u(a,b){return v(a,b,!0)}function v(a,c,d){var f=(a instanceof b.HTMLElement?e._getProfilerMarkIdentifier(a):" href='"+a+"'")+"["+ ++I+"]";return J("WinJS.UI.Fragments:render"+f+",StartTM"),t(),p(a,!d).then(function(a){var b=a.docfrag;d&&(b=b.cloneNode(!0));for(var e=b.firstChild;e;)1===e.nodeType&&(e.msParentSelectorScope=!0),e=e.nextSibling;var g;return c?(c.appendChild(b),g=c):g=b,J("WinJS.UI.Fragments:render"+f+",StopTM"),g})}function w(a,b){return v(a,b,!1)}function x(a){return t(),p(a).then(function(a){return a.docfrag})}function y(a){a?"string"==typeof a?delete H[a.toLowerCase()]:(delete j.data(a).docFragment,a.removeAttribute("data-win-hasfragment")):H={}}function z(a,c){var d=b.document.implementation.createHTMLDocument("frag"),e=d.createElement("base");d.head.appendChild(e);var f=d.createElement("a");return d.body.appendChild(f),e.href=b.document.location.href,f.setAttribute("href",c),e.href=f.href,a.document=d,K(c).then(function(a){k.setInnerHTMLUnsafe(d.documentElement,a),d.head.appendChild(e)})}function A(a){return l({url:a}).then(function(a){return a.responseText})}if(b.document){var B=function(a,b){for(var c=0,d=a.length;d>c;c++)b(a[c],c)},C=b.document.head||b.document.getElementsByTagName("head")[0],D={},E={},F={},G=!1,H={},I=1,J=h,K=A;d.Namespace._moduleDefine(a,"WinJS.UI.Fragments",{renderCopy:u,render:w,cache:x,clearCache:y,_cacheStore:{get:function(){return H}},_getFragmentContents:{get:function(){return K},set:function(a){K=a}},_writeProfilerMark:{get:function(){return J},set:function(a){J=a}}})}}),define("WinJS/Application/_State",["exports","../Core/_Global","../Core/_WinRT","../Core/_Base","../Core/_BaseUtils","../Promise"],function(a,b,c,d,e,f){"use strict";function g(){var b,e,f,g=d.Class.define(function(a){this.folder=a,this._path=a.path,a.tryGetItemAsync&&(this._tryGetItemAsync=a.tryGetItemAsync.bind(a))},{_tryGetItemAsync:function(a){return this.folder.getFileAsync(a).then(null,function(){return!1})},exists:function(a){return this._tryGetItemAsync(a).then(function(a){return!!a})},remove:function(a){return this._tryGetItemAsync(a).then(function(a){return a?a.deleteAsync():!1}).then(null,function(){return!1})},writeText:function(a,b){var d=c.Windows.Storage,e=this;return e.folder.createFileAsync(a,d.CreationCollisionOption.openIfExists).then(function(a){return d.FileIO.writeTextAsync(a,b)})},readText:function(a,b){var d=c.Windows.Storage;return this._tryGetItemAsync(a).then(function(a){return a?d.FileIO.readTextAsync(a):b}).then(null,function(){return b})}},{supportedForProcessing:!1});d.Namespace._moduleDefine(a,"WinJS.Application",{local:{get:function(){return b||(b=new g(c.Windows.Storage.ApplicationData.current.localFolder)),b}},temp:{get:function(){return e||(e=new g(c.Windows.Storage.ApplicationData.current.temporaryFolder)),e}},roaming:{get:function(){return f||(f=new g(c.Windows.Storage.ApplicationData.current.roamingFolder)),f}}})}function h(){var b=d.Class.define(function(){this.storage={}},{exists:function(a){return f.as(void 0!==this.storage[a])},remove:function(a){return delete this.storage[a],f.as()},writeText:function(a,b){return this.storage[a]=b,f.as(b.length)},readText:function(a,b){var c=this.storage[a];return f.as("string"==typeof c?c:b)}},{supportedForProcessing:!1});d.Namespace._moduleDefine(a,"WinJS.Application",{local:new b,temp:new b,roaming:new b})}c.Windows.Storage.FileIO&&c.Windows.Storage.ApplicationData&&c.Windows.Storage.CreationCollisionOption?g():h();var i={};d.Namespace._moduleDefine(a,"WinJS.Application",{sessionState:{get:function(){return i},set:function(a){i=a}},_loadState:function(b){return 3===b.previousExecutionState?a.local.readText("_sessionState.json","{}").then(function(b){var c=JSON.parse(b);c&&Object.keys(c).length>0&&(a._sessionStateLoaded=!0),a.sessionState=c}).then(null,function(){a.sessionState={}}):f.as()},_oncheckpoint:function(c,d){if(!(b.MSApp&&b.MSApp.getViewOpener&&b.MSApp.getViewOpener())){var e=a.sessionState;if(e&&Object.keys(e).length>0||a._sessionStateLoaded){var f;try{f=JSON.stringify(e)}catch(g){f="",d.queueEvent({type:"error",detail:g})}c.setPromise(a.local.writeText("_sessionState.json",f).then(null,function(a){d.queueEvent({type:"error",detail:a})}))}}}})}),define("WinJS/Navigation",["exports","./Core/_Base","./Core/_Events","./Core/_WriteProfilerMark","./Promise"],function(a,b,c,d,e){"use strict";var f="navigated",g="navigating",h="beforenavigate",i=b.Class.mix(b.Class.define(null,{},{supportedForProcessing:!1}),c.eventMixin),j=new i,k={backStack:[],current:{location:"",initialPlaceholder:!0},forwardStack:[]},l=c._createEventProperty,m=function(a){return d("WinJS.Navigation:navigation,StartTM"),e.as().then(function(){var b=e.as(),c=j.dispatchEvent(h,{setPromise:function(a){b=b.then(function(){return a})},location:a.location,state:a.state});return b.then(function(a){return c||a})})},n=function(a){return e.as().then(function(){var b=e.as();return j.dispatchEvent(g,{setPromise:function(a){b=b.then(function(){return a})},location:k.current.location,state:k.current.state,delta:a}),b})},o=function(a,b){d("WinJS.Navigation:navigation,StopTM");var c=e.as(),g={value:a,location:k.current.location,state:k.current.state,setPromise:function(a){c=c.then(function(){return a})}};return!a&&b&&(g.error=b),j.dispatchEvent(f,g),c},p=function(a,b,c,d){return a=Math.min(a,b.length),a>0?m(b[b.length-a]).then(function(e){if(e)return!1;for(c.push(k.current);a-1>0;)a--,c.push(b.pop());return k.current=b.pop(),n(d).then(o,function(a){throw o(void 0,a||!0),a}).then(function(){return!0})}):e.wrap(!1)};b.Namespace._moduleDefine(a,"WinJS.Navigation",{canGoForward:{get:function(){return k.forwardStack.length>0}},canGoBack:{get:function(){return k.backStack.length>0}},location:{get:function(){return k.current.location}},state:{get:function(){return k.current.state},set:function(a){k.current.state=a}},history:{get:function(){return k},set:function(a){k=a,k.backStack=k.backStack||[],k.forwardStack=k.forwardStack||[],k.current=k.current||{location:"",initialPlaceholder:!0},k.current.location=k.current.location||""}},forward:function(a){return a=a||1,p(a,k.forwardStack,k.backStack,a)},back:function(a){return a=a||1,p(a,k.backStack,k.forwardStack,-a)},navigate:function(a,b){var c={location:a,state:b};return m(c).then(function(a){return a?!1:(k.current.initialPlaceholder||k.backStack.push(k.current),k.forwardStack=[],k.current=c,n().then(o,function(a){throw o(void 0,a||!0),a}).then(function(){return!0}))})},addEventListener:function(a,b,c){j.addEventListener(a,b,c)},removeEventListener:function(a,b,c){j.removeEventListener(a,b,c)},onnavigated:l(f),onnavigating:l(g),onbeforenavigate:l(h)})}),define("WinJS/Application",["exports","./Core/_Global","./Core/_WinRT","./Core/_Base","./Core/_Events","./Core/_Log","./Core/_WriteProfilerMark","./Application/_State","./Navigation","./Promise","./_Signal","./Scheduler","./Utilities/_ElementUtilities"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){"use strict";function n(a){var c;try{var d=[];c=JSON.stringify(a,function(a,c){return c===b?"[window]":c instanceof b.HTMLElement?"[HTMLElement]":"function"==typeof c?"[function]":"object"==typeof c?null===c?c:-1===d.indexOf(c)?(d.push(c),c):"[circular]":c})}catch(e){c=JSON.stringify("[object]")}return c}function o(c){if(f.log&&f.log(n(c),"winjs","error"),b.document&&a._terminateApp){var d=c.detail,e=d&&(d.number||d.exception&&(d.exception.number||d.exception.code)||d.error&&d.error.number||d.errorCode||0),g={description:n(d),stack:d&&(d.stack||d.exception&&(d.exception.stack||d.exception.message)||d.error&&d.error.stack||null),errorNumber:e,number:e};a._terminateApp(g,c)}}function p(a,c){b.MSApp&&b.MSApp.terminateApp(a)}function q(a){var b="def"+ma++;return{deferral:la[b]=a.getDeferral(),id:b}}function r(a,b){b&&(a=la[b],delete la[b]),a&&a.complete()}function s(){la&&(Object.keys(la).forEach(function(a){la[a].complete()}),la={})}function t(a){function b(b){return g("WinJS.Application:Event_"+a.type+",StopTM"),a._deferral&&r(a._deferral,a._deferralID),b}g("WinJS.Application:Event_"+a.type+",StartTM");var c=j.as();a.setPromise=function(a){c=c.then(function(){return a})},a._stoppedImmediatePropagation=!1,a.stopImmediatePropagation=function(){a._stoppedImmediatePropagation=!0},a.detail=a.detail||{},"object"==typeof a.detail&&(a.detail.setPromise=a.setPromise);try{if(ja._listeners){var d=!1;if(h=ja._listeners[a.type])for(var e=0,f=h.length;f>e&&!a._stoppedImmediatePropagation;e++)d=h[e].listener(a)||d}var h=pa[a.type];h&&h.forEach(function(b){b(a,d)})}catch(i){a.type===V?o(a):y({type:V,detail:i})}return c.then(b,function(a){return a=b(a),a&&"Canceled"===a.name?void 0:j.wrapError(a)})}function u(){return da||(da=new k,da.promise.done(function(){da=null},function(){da=null})),da}function v(a){function b(a){y({type:V,detail:a})}return 0===a.length?u().promise:t(a.shift()).then(null,b)}function w(a){function b(){return w}var c=a.job._queue;0===c.length&&ba.length>0&&(c=a.job._queue=z()),a.setPromise(v(c).then(b,b))}function x(){function a(){d=!0}for(var b,c=[],d=!0;d;)0===c.length&&ba.length>0&&(c=z()),d=!1,b=v(c),b.done(a,a);ca=l.schedule(function(a){function c(){return w}a.setPromise(b.then(c,c))},l.Priority.high,null,"WinJS.Application._pumpEventQueue"),ca._queue=c}function y(a){g("WinJS.Application:Event_"+a.type+" queued,Info"),ba.push(a),ea&&da&&da.complete(w)}function z(){var a=ba;return ba=[],a}function A(a){var b=q(a.activatedOperation);h._loadState(a).then(function(){y({type:S,detail:a,_deferral:b.deferral,_deferralID:b.id})})}function B(a){var b=q(a.suspendingOperation);y({type:Q,_deferral:b.deferral,_deferralID:b.id})}function C(){if(y({type:T}),!b.document||!c.Windows.UI.WebUI.WebUIApplication){var a={arguments:"",kind:"Windows.Launch",previousExecutionState:0};h._loadState(a).then(function(){y({type:S,detail:a})})}}function D(){s(),y({type:R})}function E(b){var c={};for(var d in b)c[d]=b[d];var e,f=!0,g=a._terminateApp;try{a._terminateApp=function(a,b){f=!1,e=a,g!==p&&g(a,b)},t({type:V,detail:{error:c,errorLine:b.lineno,errorCharacter:b.colno,errorUrl:b.filename,errorMessage:b.message}})}finally{a._terminateApp=g}return f}function F(a){var b=a.detail,c=b.id;if(b.parent)return void(b.handler&&P&&delete P[c]);if(b.exception instanceof Error){var d={stack:b.exception.stack,message:b.exception.message};b.exception=d}var e=!P;P=P||[],P[c]=b,e&&l.schedule(function(){var a=P;P=null,a.forEach(function(a){y({type:V,detail:a})})},l.Priority.high,null,"WinJS.Application._queuePromiseErrors")}function G(a){var b={e:a,applicationcommands:void 0};ja.dispatchEvent(W,b)}function H(a){var b={type:X};Object.defineProperty(b,"_winRTBackPressedEvent",{value:a,enumerable:!1}),t(b)}function I(){t({type:Y})}function J(a){t({type:$,kind:a.kind})}function K(a){t({type:_,kind:a.kind})}function L(a){t({type:aa,kind:a.kind})}function M(){var a=c.Windows.UI.Core.SystemNavigationManager;return ha&&a?a.getForCurrentView():null}function N(){if(!fa){if(fa=!0,b.addEventListener("beforeunload",D,!1),b.document){if(b.addEventListener("error",E,!1),c.Windows.UI.WebUI.WebUIApplication){var a=c.Windows.UI.WebUI.WebUIApplication;a.addEventListener("activated",A,!1),a.addEventListener("suspending",B,!1)}if(c.Windows.UI.ApplicationSettings.SettingsPane){var d=c.Windows.UI.ApplicationSettings.SettingsPane.getForCurrentView();d.addEventListener("commandsrequested",G)}var e=M();if(e?e.addEventListener("backrequested",H):c.Windows.Phone.UI.Input.HardwareButtons&&c.Windows.Phone.UI.Input.HardwareButtons.addEventListener("backpressed",H),c.Windows.UI.Input.EdgeGesture){var f=c.Windows.UI.Input.EdgeGesture.getForCurrentView();f.addEventListener("starting",J),f.addEventListener("completed",K),f.addEventListener("canceled",L)}}j.addEventListener("error",F)}}function O(){if(fa){if(fa=!1,b.removeEventListener("beforeunload",D,!1),b.document){if(c.Windows.UI.WebUI.WebUIApplication){b.removeEventListener("error",E,!1);var a=c.Windows.UI.WebUI.WebUIApplication;a.removeEventListener("activated",A,!1),a.removeEventListener("suspending",B,!1)}if(c.Windows.UI.ApplicationSettings.SettingsPane){var d=c.Windows.UI.ApplicationSettings.SettingsPane.getForCurrentView();d.removeEventListener("commandsrequested",G)}var e=M();if(e?e.removeEventListener("backrequested",H):c.Windows.Phone.UI.Input.HardwareButtons&&c.Windows.Phone.UI.Input.HardwareButtons.removeEventListener("backpressed",H),c.Windows.UI.Input.EdgeGesture){var f=c.Windows.UI.Input.EdgeGesture.getForCurrentView();f.removeEventListener("starting",J),f.removeEventListener("completed",K),f.removeEventListener("canceled",L)}}j.removeEventListener("error",F)}}b.Debug&&(b.Debug.setNonUserCodeExceptions=!0);var P,Q="checkpoint",R="unload",S="activated",T="loaded",U="ready",V="error",W="settings",X="backclick",Y="beforerequestingfocusonkeyboardinput",Z="requestingfocusonkeyboardinput",$="edgystarting",_="edgycompleted",aa="edgycanceled",ba=[],ca=null,da=null,ea=!1,fa=!1,ga=b.Symbol,ha=!!ga&&"symbol"==typeof ga.iterator,ia=d.Class.mix(d.Class.define(null,{},{supportedForProcessing:!1}),e.eventMixin),ja=new ia,ka=e._createEventProperty,la={},ma=0,na={_registered:!1,updateRegistration:function(){var a=ja._listeners&&ja._listeners[Z]||[];!na._registered&&a.length>0&&(na._updateKeydownCaptureListeners(b.top,!0),na._registered=!0),na._registered&&0===a.length&&(na._updateKeydownCaptureListeners(b.top,!1),na._registered=!1)},_keydownCaptureHandler:function(a){na._registered&&na._shouldKeyTriggerTypeToSearch(a)&&I()},_frameLoadCaptureHandler:function(a){na._registered&&na._updateKeydownCaptureListeners(a.target.contentWindow,!0)},_updateKeydownCaptureListeners:function(a,b){if(a){try{b?a.document.addEventListener("keydown",na._keydownCaptureHandler,!0):a.document.removeEventListener("keydown",na._keydownCaptureHandler,!0)}catch(c){}if(a.frames)for(var d=0,e=a.frames.length;e>d;d++){var f=a.frames[d];na._updateKeydownCaptureListeners(f,b);try{b?f.frameElement&&f.frameElement.addEventListener("load",na._frameLoadCaptureHandler,!0):f.frameElement&&f.frameElement.removeEventListener("load",na._frameLoadCaptureHandler,!0)}catch(c){}}}},_shouldKeyTriggerTypeToSearch:function(a){var b=!1;if(!a.metaKey&&(!a.ctrlKey&&!a.altKey||a.getModifierState&&a.getModifierState("AltGraph")))switch(a.keyCode){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 65:case 66:case 67:case 68:case 69:case 70:case 71:case 72:case 73:case 74:case 75:case 76:case 77:case 78:case 79:case 80:case 81:case 82:case 83:case 84:case 85:case 86:case 87:case 88:case 89:case 90:case 96:case 97:case 98:case 99:case 100:case 101:case 102:case 103:case 104:case 105:case 106:case 107:case 108:case 109:case 110:case 111:case 186:case 187:case 188:case 189:case 190:case 191:case 192:case 219:case 220:case 221:case 222:case 223:case 226:case 229:case 231:b=!0}return b}},oa=p,pa={activated:[function(){y({type:U})}],checkpoint:[function(b){h._oncheckpoint(b,a)}],error:[function(a,b){b||o(a)}],backclick:[function(a,b){b?a._winRTBackPressedEvent.handled=!0:i.canGoBack&&(i.back(),a._winRTBackPressedEvent.handled=!0)}],beforerequestingfocusonkeyboardinput:[function(a,b){b||t({type:Z})}]};b.document&&b.document.addEventListener("DOMContentLoaded",C,!1);var qa=d.Namespace._moduleDefine(a,"WinJS.Application",{stop:function(){qa.onactivated=null,qa.oncheckpoint=null,qa.onerror=null,qa.onloaded=null,qa.onready=null,qa.onsettings=null,qa.onunload=null,qa.onbackclick=null,ja=new ia,h.sessionState={},ea=!1,z(),ca&&ca.cancel(),ca=null,da=null,O(),na.updateRegistration(),s()},addEventListener:function(a,b,c){ja.addEventListener(a,b,c),a===Z&&na.updateRegistration()},removeEventListener:function(a,b,c){ja.removeEventListener(a,b,c),a===Z&&na.updateRegistration()},checkpoint:function(){y({type:Q})},start:function(){N(),ea=!0,x()},queueEvent:y,_dispatchEvent:t,_terminateApp:{get:function(){return oa},set:function(a){oa=a}},_applicationListener:d.Namespace._lazy(function(){return new m._GenericListener("Application",qa)}),oncheckpoint:ka(Q),onunload:ka(R),onactivated:ka(S),onloaded:ka(T),onready:ka(U),onsettings:ka(W),onerror:ka(V),onbackclick:ka(X)})}),define("WinJS/Animations/_Constants",["exports","../Core/_Base"],function(a,b){"use strict";b.Namespace._moduleDefine(a,"WinJS.UI",{PageNavigationAnimation:{turnstile:"turnstile",slide:"slide",enterPage:"enterPage",continuum:"continuum"}})}),define("WinJS/Animations/_TransitionAnimation",["exports","../Core/_Global","../Core/_WinRT","../Core/_Base","../Core/_BaseUtils","../Promise","../Scheduler","../Utilities/_ElementUtilities"],function(a,b,c,d,e,f,g,h){"use strict";function i(a){return Array.isArray(a)||a instanceof b.NodeList||a instanceof b.HTMLCollection?a:a?[a]:[]}function j(){return++B,"WinJSUIAnimation"+B}function k(a){return"WinJSUIAnimation"===a.substring(0,16)}function l(a){h._getComputedStyle(a,null).opacity}function m(b,c){return function(d){var e={};for(var f in d){var g=d[f];"function"==typeof g&&(g=g(b,c)),e[f]=g}return e.exactTiming||(e.delay+=a._libraryDelay),e}}function n(a,b){var c=a+"|"+b,d=C[c];d&&d(D)}function o(a,b,c){C[a+"|"+b]=c}function p(a,b){delete C[a+"|"+b]}function q(a,b,c,d,e){var f=e.styleCaches[b]||new F(b,e,c);f.cref+=d.length,d.forEach(function(a){n(b,a.property)}),(e.isTransition||d.some(function(a){return f.removed[a[e.nameField]]}))&&(l(a),f.removed={});var g=d.map(function(a){return a[e.nameField]+" "+e.props.map(function(b){return(b[1]?a[b[1]]:"")+b[2]}).join(" ")}).join(", "),h=d.map(function(a){return a[e.nameField]}).join(", ");return""!==f.names&&(g=f.names+", "+g,h=f.names+", "+h),c[e.shorthandProp]=g,f.names=h,f}function r(a,b){b?a():g.schedule(function(){a()},g.Priority.normal,null,"WinJS.UI._Animation._completeAnimationPromise")}function s(a,c,d,g,i){if(d.length>0){var j=a.style,k=h._uniqueID(a);if(y||(y=b.document.createElement("DIV").style),d=d.map(m(c,a)),d.forEach(function(a){var b=e._getCamelCasedName(a.property);a.hasOwnProperty("from")&&(j[b]=a.from),y[b]=a.to,a.to=y[b],a.propertyScriptName=b}),i){var l=q(a,k,j,d,G),n=a.disabled?b.document:a;d.forEach(function(c){var d;g.push(new f(function(f){d=function(d){g&&(n.removeEventListener(e._browserEventEquivalents.transitionEnd,g,!1),p(k,c.property),l.removeName(j,c.propertyScriptName,d?a:null,c.skipStylesReset),b.clearTimeout(i),g=null),r(f,d===E)};var g=function(b){b.target===a&&b.propertyName===c.property&&d()};o(k,c.property,d),n.addEventListener(e._browserEventEquivalents.transitionEnd,g,!1);var h=0;j[c.propertyScriptName]!==c.to&&(j[c.propertyScriptName]=c.to,h=50);var i=b.setTimeout(function(){i=b.setTimeout(d,c.delay+c.duration)},h)},function(){d(E)}))})}else d.forEach(function(a){j[a.propertyScriptName]=a.to})}}function t(a,c,d,g,i){if(i&&d.length>0){var k=a.style,l=h._uniqueID(a);d=d.map(m(c,a));var n,s=a.disabled?b.document:a;d.forEach(function(a){if(a.keyframe)a.keyframe=A.animationPrefix+a.keyframe;else{n||(n=b.document.createElement("STYLE"),b.document.documentElement.appendChild(n)),a.keyframe=j();var c="@"+A.keyframes+" "+a.keyframe+" { from {"+a.property+":"+a.from+";} to {"+a.property+":"+a.to+";}}";n.sheet.insertRule(c,0)}});var t=q(a,l,k,d,H),u=[],v=[];d.forEach(function(c){var d;v.push(new f(function(f){d=function(a){g&&(s.removeEventListener(e._browserEventEquivalents.animationEnd,g,!1),b.clearTimeout(h),g=null),r(f,a===E)};var g=function(b){b.target===a&&b.animationName===c.keyframe&&d()};o(l,c.property,d),u.push({id:l,property:c.property,style:k,keyframe:c.keyframe});var h=b.setTimeout(function(){h=b.setTimeout(d,c.delay+c.duration)},50);s.addEventListener(e._browserEventEquivalents.animationEnd,g,!1)},function(){d(E)}))}),n&&b.setTimeout(function(){var a=n.parentElement;a&&a.removeChild(n)},50);var w=function(){for(var a=0;a<u.length;a++){var b=u[a];p(b.id,b.property),t.removeName(b.style,b.keyframe)}};g.push(f.join(v).then(w,w))}}function u(){z||(z=c.Windows.UI.ViewManagement.UISettings?new c.Windows.UI.ViewManagement.UISettings:{animationsEnabled:!0})}function v(b,c,d){try{for(var e=a.isAnimationEnabled(),h=i(b),j=i(c),k=[],l=0;l<h.length;l++)if(Array.isArray(h[l]))for(var m=0;m<h[l].length;m++)d(h[l][m],l,j,k,e);else d(h[l],l,j,k,e);return k.length?f.join(k):g.schedulePromiseNormal(null,"WinJS.UI._Animation._completeActionPromise").then(null,function(){})}catch(n){return f.wrapError(n)}}function w(a){return Array.isArray(a)?a.map(function(a){return w(a)}):a?(a.delay=K(a.delay),a.duration=K(a.duration),a):void 0}function x(a){return 1===L?a:w(a)}if(b.document){var y,z,A=e._browserStyleEquivalents,B=0,C=[],D=1,E=2,F=d.Class.define(function(a,b,c){this.cref=0,this.id=a,this.desc=b,this.removed={},this.prevStyles=b.props.map(function(a){return c[a[0]]}),this.prevNames=this.names=c[b.nameProp],b.styleCaches[a]=this},{destroy:function(a,b){var c=this.desc;delete c.styleCaches[this.id],b||(""===this.prevNames&&this.prevStyles.every(function(a){return""===a})?a[c.shorthandProp]="":(c.props.forEach(function(b,c){a[b[0]]=this.prevStyles[c]},this),a[c.nameProp]=this.prevNames))},removeName:function(a,b,c,d){var e=this.names,f=e.split(", "),g=f.lastIndexOf(b);g>=0&&(f.splice(g,1),this.names=e=f.join(", "),""===e&&this.desc.isTransition&&(e="none")),--this.cref?(a[this.desc.nameProp]=e,k(b)||(this.removed[b]=!0)):(c&&"none"===e&&(a[this.desc.nameProp]=e,l(c)),this.destroy(a,d))}}),G={shorthandProp:A.transition.scriptName,nameProp:A["transition-property"].scriptName,nameField:"property",props:[[A["transition-duration"].scriptName,"duration","ms"],[A["transition-timing-function"].scriptName,"timing",""],[A["transition-delay"].scriptName,"delay","ms"]],isTransition:!0,styleCaches:[]},H={shorthandProp:A.animation.scriptName,nameProp:A["animation-name"].scriptName,nameField:"keyframe",props:[[A["animation-duration"].scriptName,"duration","ms"],[A["animation-timing-function"].scriptName,"timing",""],[A["animation-delay"].scriptName,"delay","ms"],[A["animation-iteration-count"].scriptName,"","1"],[A["animation-direction"].scriptName,"","normal"],[A["animation-fill-mode"].scriptName,"","both"]],isTransition:!1,styleCaches:[]},I=0,J=function(){return u(),I+z.animationsEnabled>0},K=function(a){return a*L},L=1,M=0;d.Namespace._moduleDefine(a,"WinJS.UI",{disableAnimations:function(){I--},enableAnimations:function(){I++},isAnimationEnabled:{get:function(){return J},set:function(a){J=a}},_libraryDelay:{get:function(){return M},set:function(a){M=a}},executeAnimation:function(a,b){return v(a,x(b),t)},executeTransition:function(a,b){return v(a,x(b),s)},_animationTimeAdjustment:{get:function(){return K},set:function(a){K=a}}}),d.Namespace._moduleDefine(a,"WinJS.Utilities",{_fastAnimations:{get:function(){return.05===L},set:function(a){L=a?.05:1}},_slowAnimations:{get:function(){return 3===L},set:function(a){L=a?3:1}},_animationFactor:{get:function(){return L},set:function(a){L=a}}})}}),define("WinJS/Animations",["exports","./Core/_Global","./Core/_Base","./Core/_BaseUtils","./Core/_WriteProfilerMark","./Utilities/_ElementUtilities","./Animations/_Constants","./Animations/_TransitionAnimation","./Promise"],function(a,b,c,d,e,f,g,h,i){"use strict";function j(a,b,c){return a.keyframe?a.keyframe:!c||a.left!==b.left||a.top!==b.top||a.rtlflip&&!b.rtlflip?null:a.rtlflip?l(c):c}function k(a,b){return b&&a.rtlflip?l(b):b}function l(a){var b=a+"-rtl";return function(c,d){return"ltr"===f._getComputedStyle(d).direction?a:b}}function m(a){return Array.isArray(a)||a instanceof b.NodeList||a instanceof b.HTMLCollection?a:a?[a]:[]}function n(a){for(var b=[],c=0;c<a.length;c++){var d={top:a[c].offsetTop,left:a[c].offsetLeft},e=f._getComputedStyle(a[c],null)[D.scriptName].split(",");6===e.length&&(d.left+=parseFloat(e[4]),d.top+=parseFloat(e[5])),b.push(d)}return b}function o(a,b,c,d){return function(e){for(var f=a,g=0;e>g;g++)b*=c,f+=b;return d&&(f=Math.min(f,d)),f}}function p(a,b){for(var c=0;c<b.length;c++)b[c].top-=a[c].offsetTop,b[c].left-=a[c].offsetLeft}function q(a,b,c){p(a,b);for(var d=0;d<a.length;d++)0===b[d].top&&0===b[d].left||(a[d].style[D.scriptName]="translate("+b[d].left+"px, "+b[d].top+"px)");return h.executeTransition(a,c)}function r(a,b,c,d,e,f,g,i){function j(a,b,c){if(a){var d={left:b+"px",top:"0px"},e={left:c+"px",top:"0px"};if(+a.length===a.length)for(var f=0,g=a.length;g>f;f++)k.push(a[f]),l.push(d),m.push(e);else k.push(a),l.push(d),m.push(e)}}var k=[],l=[],m=[],n=200,o=0!==b?0>b?-n:n:0,p=0!==c?0>c?-n:n:0;return j(e,b,c),j(f,o,p),j(g,2*o,2*p),j(i,3*o,3*p),l=new F(l),m=new F(m),h.executeTransition(k,[{property:D.cssName,delay:0,duration:350,timing:a,from:u(l),to:u(m)},{property:"opacity",delay:0,duration:350,timing:d?"steps(1, start)":"steps(1, end)",from:d?0:1,to:d?1:0}])}function s(a,b,c){function e(){t(a)}a=m(a),b=m(b);for(var g=0,i=a.length;i>g;g++){var j="rtl"===f._getComputedStyle(a[g]).direction;a[g].style[d._browserStyleEquivalents["transform-origin"].scriptName]=b[Math.min(b.length-1,g)][j?"rtl":"ltr"]}return h.executeTransition(a,c).then(e,e)}function t(a){for(var b=0,c=a.length;c>b;b++)a[b].style[d._browserStyleEquivalents["transform-origin"].scriptName]="",a[b].style[D.scriptName]="",a[b].style.opacity=""}function u(a,b){return b=b||"",function(c,d){var e=a.getOffset(c),g=e.left;return e.rtlflip&&"rtl"===f._getComputedStyle(d).direction&&(g=g.toString(),g="-"===g.charAt(0)?g.substring(1):"-"+g),b+"translate("+g+", "+e.top+")"}}function v(a,b){return b=b||"",function(c){var d=a[c];return"translate("+d.left+"px, "+d.top+"px) "+b}}function w(a,b){return function(c){var d=a[c];return 0===d.left&&0===d.top?b:null}}function x(a,b,c,d){var e=m(b),f=m(c),g=n(f);return new a(e,f,g,d)}function y(a){for(var c=[],d=0,e=a.length;e>d;d++){var f=a[d].getBoundingClientRect(),g=-(40+f.left),h=40+(b.innerWidth-f.right),i=b.innerHeight/2-f.top;c.push({ltr:g+"px "+i+"px",rtl:h+"px "+i+"px"})}return c}function z(a){e("WinJS.UI.Animation:"+a)}function A(a,c){var e=c.duration*h._animationFactor,f=d._browserStyleEquivalents.transition.scriptName;a.style[f]=e+"ms "+D.cssName+" "+c.timing,a.style[D.scriptName]=c.to;var g;return new i(function(c){var h=function(b){b.target===a&&b.propertyName===D.cssName&&g()},i=!1;g=function(){i||(b.clearTimeout(j),a.removeEventListener(d._browserEventEquivalents.transitionEnd,h),a.style[f]="",i=!0),c()};var j=b.setTimeout(function(){j=b.setTimeout(g,e)},50);a.addEventListener(d._browserEventEquivalents.transitionEnd,h)},function(){g()})}function B(){return{defaultResizeGrowTransition:{duration:350,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)"},defaultResizeShrinkTransition:{duration:120,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)"}}}function C(a,b,c){var e=B()[c.to>c.from?"defaultResizeGrowTransition":"defaultResizeShrinkTransition"];c=d._merge(c,{duration:void 0===c.duration?e.duration:c.duration,timing:void 0===c.timing?e.timing:c.timing});var g=c.actualSize-c.from,h=c.actualSize-c.to;c.anchorTrailingEdge||(g=-g,h=-h);var i="width"===c.dimension?"translateX":"translateY",j={duration:c.duration,timing:c.timing};a.style[D.scriptName]=i+"("+g+"px)",b.style[D.scriptName]=i+"("+-g+"px)",f._getComputedStyle(a).opacity,f._getComputedStyle(b).opacity;var k=d._merge(j,{to:i+"("+h+"px)"}),l=d._merge(j,{to:i+"("+-h+"px)"});return[{element:a,transition:k},{element:b,transition:l}]}var D=d._browserStyleEquivalents.transform,E=[{top:"0px",left:"11px",rtlflip:!0}],F=c.Class.define(function(a,b,c){c=c||E,Array.isArray(a)&&a.length>0?(this.offsetArray=a,1===a.length&&(this.keyframe=j(a[0],c[0],b))):a&&a.hasOwnProperty("top")&&a.hasOwnProperty("left")?(this.offsetArray=[a],this.keyframe=j(a,c[0],b)):(this.offsetArray=c,this.keyframe=k(c[0],b))},{getOffset:function(a){return a>=this.offsetArray.length&&(a=this.offsetArray.length-1),this.offsetArray[a]}},{supportedForProcessing:!1}),G=c.Class.define(function(a,b,c){this.revealedArray=a,this.affectedArray=b,this.offsetArray=c},{execute:function(){z("expandAnimation,StartTM");var a=h.executeAnimation(this.revealedArray,{keyframe:"WinJS-opacity-in",property:"opacity",delay:this.affectedArray.length>0?200:0,duration:167,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:0,to:1}),b=q(this.affectedArray,this.offsetArray,{property:D.cssName,delay:0,duration:367,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""});return i.join([a,b]).then(function(){z("expandAnimation,StopTM")})}},{supportedForProcessing:!1}),H=c.Class.define(function(a,b,c){this.hiddenArray=a,this.affectedArray=b,this.offsetArray=c},{execute:function(){z("collapseAnimation,StartTM");var a=h.executeAnimation(this.hiddenArray,{keyframe:"WinJS-opacity-out",property:"opacity",delay:0,duration:167,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:1,to:0}),b=q(this.affectedArray,this.offsetArray,{property:D.cssName,delay:this.hiddenArray.length>0?167:0,duration:367,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""});return i.join([a,b]).then(function(){z("collapseAnimation,StopTM")})}},{supportedForProcessing:!1}),I=c.Class.define(function(a,b,c){this.elementArray=b,this.offsetArray=c},{execute:function(){return z("repositionAnimation,StartTM"),q(this.elementArray,this.offsetArray,{property:D.cssName,delay:o(0,33,1,250),duration:367,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""}).then(function(){z("repositionAnimation,StopTM")})}},{supportedForProcessing:!1}),J=c.Class.define(function(a,b,c){this.addedArray=a,this.affectedArray=b,this.offsetArray=c},{execute:function(){z("addToListAnimation,StartTM");var a=this.affectedArray.length>0?240:0,b=h.executeAnimation(this.addedArray,[{keyframe:"WinJS-scale-up",property:D.cssName,delay:a,duration:120,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:"scale(0.85)",to:"none"},{keyframe:"WinJS-opacity-in",property:"opacity",delay:a,duration:120,timing:"linear",from:0,to:1}]),c=q(this.affectedArray,this.offsetArray,{property:D.cssName,delay:0,duration:400,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""});return i.join([b,c]).then(function(){z("addToListAnimation,StopTM")})}},{supportedForProcessing:!1}),K=c.Class.define(function(a,b,c){this.deletedArray=a,this.remainingArray=b,this.offsetArray=c},{execute:function(){z("deleteFromListAnimation,StartTM");var a=h.executeAnimation(this.deletedArray,[{keyframe:"WinJS-scale-down",property:D.cssName,delay:0,duration:120,timing:"cubic-bezier(0.11, 0.5, 0.24, .96)",from:"none",to:"scale(0.85)"},{keyframe:"WinJS-opacity-out",
-property:"opacity",delay:0,duration:120,timing:"linear",from:1,to:0}]),b=q(this.remainingArray,this.offsetArray,{property:D.cssName,delay:this.deletedArray.length>0?60:0,duration:400,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""});return i.join([a,b]).then(function(){z("deleteFromListAnimation,StopTM")})}},{supportedForProcessing:!1}),L=c.Class.define(function(a,b,c,d){this.addedArray=a,this.affectedArray=b,this.offsetArray=c;var e=m(d);this.deletedArray=e,this.deletedOffsetArray=n(e)},{execute:function(){z("_updateListAnimation,StartTM"),p(this.deletedArray,this.deletedOffsetArray);var a=0,b=h.executeAnimation(this.deletedArray,[{keyframe:w(this.deletedOffsetArray,"WinJS-scale-down"),property:D.cssName,delay:0,duration:120,timing:"cubic-bezier(0.11, 0.5, 0.24, .96)",from:v(this.deletedOffsetArray),to:v(this.deletedOffsetArray,"scale(0.85)")},{keyframe:"WinJS-opacity-out",property:"opacity",delay:0,duration:120,timing:"linear",from:1,to:0}]);this.deletedArray.length>0&&(a+=60);var c=q(this.affectedArray,this.offsetArray,{property:D.cssName,delay:a,duration:400,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""});this.affectedArray.length>0?a+=240:a&&(a+=60);var d=h.executeAnimation(this.addedArray,[{keyframe:"WinJS-scale-up",property:D.cssName,delay:a,duration:120,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:"scale(0.85)",to:"none"},{keyframe:"WinJS-opacity-in",property:"opacity",delay:a,duration:120,timing:"linear",from:0,to:1}]);return i.join([b,c,d]).then(function(){z("_updateListAnimation,StopTM")})}},{supportedForProcessing:!1}),M=c.Class.define(function(a,b,c){this.addedArray=a,this.affectedArray=b,this.offsetArray=c},{execute:function(){z("addToSearchListAnimation,StartTM");var a=h.executeAnimation(this.addedArray,{keyframe:"WinJS-opacity-in",property:"opacity",delay:this.affectedArray.length>0?240:0,duration:117,timing:"linear",from:0,to:1}),b=q(this.affectedArray,this.offsetArray,{property:D.cssName,delay:0,duration:400,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""});return i.join([a,b]).then(function(){z("addToSearchListAnimation,StopTM")})}},{supportedForProcessing:!1}),N=c.Class.define(function(a,b,c){this.deletedArray=a,this.remainingArray=b,this.offsetArray=c},{execute:function(){z("deleteFromSearchListAnimation,StartTM");var a=h.executeAnimation(this.deletedArray,{keyframe:"WinJS-opacity-out",property:"opacity",delay:0,duration:93,timing:"linear",from:1,to:0}),b=q(this.remainingArray,this.offsetArray,{property:D.cssName,delay:this.deletedArray.length>0?60:0,duration:400,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""});return i.join([a,b]).then(function(){z("deleteFromSearchListAnimation,StopTM")})}},{supportedForProcessing:!1}),O=c.Class.define(function(a,b,c){this.elementArray=b,this.offsetArray=c},{execute:function(){return z("peekAnimation,StartTM"),q(this.elementArray,this.offsetArray,{property:D.cssName,delay:0,duration:2e3,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""}).then(function(){z("peekAnimation,StopTM")})}},{supportedForProcessing:!1});c.Namespace._moduleDefine(a,"WinJS.UI.Animation",{createExpandAnimation:function(a,b){return x(G,a,b)},createCollapseAnimation:function(a,b){return x(H,a,b)},createRepositionAnimation:function(a){return x(I,null,a)},fadeIn:function(a){return z("fadeIn,StartTM"),h.executeTransition(a,{property:"opacity",delay:0,duration:250,timing:"linear",from:0,to:1}).then(function(){z("fadeIn,StopTM")})},fadeOut:function(a){return z("fadeOut,StartTM"),h.executeTransition(a,{property:"opacity",delay:0,duration:167,timing:"linear",to:0}).then(function(){z("fadeOut,StopTM")})},createAddToListAnimation:function(a,b){return x(J,a,b)},createDeleteFromListAnimation:function(a,b){return x(K,a,b)},_createUpdateListAnimation:function(a,b,c){return x(L,a,c,b)},createAddToSearchListAnimation:function(a,b){return x(M,a,b)},createDeleteFromSearchListAnimation:function(a,b){return x(N,a,b)},showEdgeUI:function(a,b,c){z("showEdgeUI,StartTM");var d=c&&"transition"===c.mechanism,e=new F(b,"WinJS-showEdgeUI",[{top:"-70px",left:"0px"}]);return h[d?"executeTransition":"executeAnimation"](a,{keyframe:e.keyframe,property:D.cssName,delay:0,duration:367,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:d?u(e):e.keyframe||u(e),to:"none"}).then(function(){z("showEdgeUI,StopTM")})},showPanel:function(a,b){z("showPanel,StartTM");var c=new F(b,"WinJS-showPanel",[{top:"0px",left:"364px",rtlflip:!0}]);return h.executeAnimation(a,{keyframe:c.keyframe,property:D.cssName,delay:0,duration:550,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:c.keyframe||u(c),to:"none"}).then(function(){z("showPanel,StopTM")})},hideEdgeUI:function(a,b,c){z("hideEdgeUI,StartTM");var d=c&&"transition"===c.mechanism,e=new F(b,"WinJS-hideEdgeUI",[{top:"-70px",left:"0px"}]);return h[d?"executeTransition":"executeAnimation"](a,{keyframe:e.keyframe,property:D.cssName,delay:0,duration:367,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:"none",to:d?u(e):e.keyframe||u(e)}).then(function(){z("hideEdgeUI,StopTM")})},hidePanel:function(a,b){z("hidePanel,StartTM");var c=new F(b,"WinJS-hidePanel",[{top:"0px",left:"364px",rtlflip:!0}]);return h.executeAnimation(a,{keyframe:c.keyframe,property:D.cssName,delay:0,duration:550,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:"none",to:c.keyframe||u(c)}).then(function(){z("hidePanel,StopTM")})},showPopup:function(a,b){z("showPopup,StartTM");var c=new F(b,"WinJS-showPopup",[{top:"50px",left:"0px"}]);return h.executeAnimation(a,[{keyframe:"WinJS-opacity-in",property:"opacity",delay:83,duration:83,timing:"linear",from:0,to:1},{keyframe:c.keyframe,property:D.cssName,delay:0,duration:367,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:c.keyframe||u(c),to:"none"}]).then(function(){z("showPopup,StopTM")})},hidePopup:function(a){return z("hidePopup,StartTM"),h.executeAnimation(a,{keyframe:"WinJS-opacity-out",property:"opacity",delay:0,duration:83,timing:"linear",from:1,to:0}).then(function(){z("hidePopup,StopTM")})},pointerDown:function(a){return z("pointerDown,StartTM"),h.executeTransition(a,{property:D.cssName,delay:0,duration:167,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:"scale(0.975, 0.975)"}).then(function(){z("pointerDown,StopTM")})},pointerUp:function(a){return z("pointerUp,StartTM"),h.executeTransition(a,{property:D.cssName,delay:0,duration:167,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""}).then(function(){z("pointerUp,StopTM")})},dragSourceStart:function(a,b){z("dragSourceStart,StartTM");var c=h.executeTransition(a,[{property:D.cssName,delay:0,duration:240,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:"scale(1.05)"},{property:"opacity",delay:0,duration:240,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:.65}]),d=h.executeTransition(b,{property:D.cssName,delay:0,duration:240,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:"scale(0.95)"});return i.join([c,d]).then(function(){z("dragSourceStart,StopTM")})},dragSourceEnd:function(a,b,c){z("dragSourceEnd,StartTM");var d=new F(b,"WinJS-dragSourceEnd"),e=h.executeTransition(a,[{property:D.cssName,delay:0,duration:500,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""},{property:"opacity",delay:0,duration:500,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:1}]),f=h.executeAnimation(a,{keyframe:d.keyframe,property:D.cssName,delay:0,duration:500,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:d.keyframe||u(d,"scale(1.05) "),to:"none"}),g=h.executeTransition(c,{property:D.cssName,delay:0,duration:500,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""});return i.join([e,f,g]).then(function(){z("dragSourceEnd,StopTM")})},enterContent:function(a,b,c){z("enterContent,StartTM");var d,e=new F(b,"WinJS-enterContent",[{top:"28px",left:"0px",rtlflip:!1}]);if(c&&"transition"===c.mechanism)d=h.executeTransition(a,[{property:D.cssName,delay:0,duration:550,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:u(e),to:"none"},{property:"opacity",delay:0,duration:170,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:0,to:1}]);else{var f=h.executeAnimation(a,{keyframe:e.keyframe,property:D.cssName,delay:0,duration:550,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:e.keyframe||u(e),to:"none"}),g=h.executeTransition(a,{property:"opacity",delay:0,duration:170,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:0,to:1});d=i.join([f,g])}return d.then(function(){z("enterContent,StopTM")})},exitContent:function(a,b){z("exitContent,StartTM");var c=new F(b,"WinJS-exit",[{top:"0px",left:"0px"}]),d=h.executeAnimation(a,b&&{keyframe:c.keyframe,property:D.cssName,delay:0,duration:117,timing:"linear",from:"none",to:c.keyframe||u(c)}),e=h.executeTransition(a,{property:"opacity",delay:0,duration:117,timing:"linear",to:0});return i.join([d,e]).then(function(){z("exitContent,StopTM")})},dragBetweenEnter:function(a,b){z("dragBetweenEnter,StartTM");var c=new F(b,null,[{top:"-40px",left:"0px"},{top:"40px",left:"0px"}]);return h.executeTransition(a,{property:D.cssName,delay:0,duration:200,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:u(c,"scale(0.95) ")}).then(function(){z("dragBetweenEnter,StopTM")})},dragBetweenLeave:function(a){return z("dragBetweenLeave,StartTM"),h.executeTransition(a,{property:D.cssName,delay:0,duration:200,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:"scale(0.95)"}).then(function(){z("dragBetweenLeave,StopTM")})},swipeSelect:function(a,b){z("swipeSelect,StartTM");var c=h.executeTransition(a,{property:D.cssName,delay:0,duration:300,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""}),d=h.executeAnimation(b,{keyframe:"WinJS-opacity-in",property:"opacity",delay:0,duration:300,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:0,to:1});return i.join([c,d]).then(function(){z("swipeSelect,StopTM")})},swipeDeselect:function(a,b){z("swipeDeselect,StartTM");var c=h.executeTransition(a,{property:D.cssName,delay:0,duration:300,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""}),d=h.executeAnimation(b,{keyframe:"WinJS-opacity-out",property:"opacity",delay:0,duration:300,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:1,to:0});return i.join([c,d]).then(function(){z("swipeDeselect,StopTM")})},swipeReveal:function(a,b){z("swipeReveal,StartTM");var c=new F(b,null,[{top:"25px",left:"0px"}]);return h.executeTransition(a,{property:D.cssName,delay:0,duration:300,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:u(c)}).then(function(){z("swipeReveal,StopTM")})},enterPage:function(a,b){z("enterPage,StartTM");var c=new F(b,"WinJS-enterPage",[{top:"28px",left:"0px",rtlflip:!1}]),d=h.executeAnimation(a,{keyframe:c.keyframe,property:D.cssName,delay:o(0,83,1,333),duration:1e3,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:c.keyframe||u(c),to:"none"}),e=h.executeTransition(a,{property:"opacity",delay:o(0,83,1,333),duration:170,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:0,to:1});return i.join([d,e]).then(function(){z("enterPage,StopTM")})},exitPage:function(a,b){z("exitPage,StartTM");var c=new F(b,"WinJS-exit",[{top:"0px",left:"0px"}]),d=h.executeAnimation(a,b&&{keyframe:c.keyframe,property:D.cssName,delay:0,duration:117,timing:"linear",from:"none",to:c.keyframe||u(c)}),e=h.executeTransition(a,{property:"opacity",delay:0,duration:117,timing:"linear",to:0});return i.join([d,e]).then(function(){z("exitPage,StopTM")})},crossFade:function(a,b){z("crossFade,StartTM");var c=h.executeTransition(a,{property:"opacity",delay:0,duration:167,timing:"linear",to:1}),d=h.executeTransition(b,{property:"opacity",delay:0,duration:167,timing:"linear",to:0});return i.join([c,d]).then(function(){z("crossFade,StopTM")})},createPeekAnimation:function(a){return x(O,null,a)},updateBadge:function(a,b){z("updateBadge,StartTM");var c=new F(b,"WinJS-updateBadge",[{top:"24px",left:"0px"}]);return h.executeAnimation(a,[{keyframe:"WinJS-opacity-in",property:"opacity",delay:0,duration:367,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:0,to:1},{keyframe:c.keyframe,property:D.cssName,delay:0,duration:1333,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",from:c.keyframe||u(c),to:"none"}]).then(function(){z("updateBadge,StopTM")})},turnstileForwardIn:function(a){z("turnstileForwardIn,StartTM"),a=m(a);var b=y(a);return s(a,b,[{property:D.cssName,delay:o(0,50,1,1e3),duration:300,timing:"cubic-bezier(0.01,0.975,0.4775,0.9775)",from:"perspective(600px) rotateY(80deg)",to:"perspective(600px) rotateY(0deg)"},{property:"opacity",delay:o(0,50,1,1e3),duration:300,timing:"cubic-bezier(0, 2, 0, 2)",from:0,to:1}]).then(function(){z("turnstileForwardIn,StopTM")})},turnstileForwardOut:function(a){z("turnstileForwardOut,StartTM"),a=m(a);var b=y(a);return s(a,b,[{property:D.cssName,delay:o(0,50,1,1e3),duration:128,timing:"cubic-bezier(0.4925,0.01,0.7675,-0.01)",from:"perspective(600px) rotateY(0deg)",to:"perspective(600px) rotateY(-50deg)"},{property:"opacity",delay:o(0,50,1,1e3),duration:128,timing:"cubic-bezier(1,-0.42,0.995,-0.425)",from:1,to:0}]).then(function(){z("turnstileForwardOut,StopTM")})},turnstileBackwardIn:function(a){z("turnstileBackwardIn,StartTM"),a=m(a);var b=y(a);return s(a,b,[{property:D.cssName,delay:o(0,50,1,1e3),duration:300,timing:"cubic-bezier(0.01,0.975,0.4775,0.9775)",from:"perspective(600px) rotateY(-50deg)",to:"perspective(600px) rotateY(0deg)"},{property:"opacity",delay:o(0,50,1,1e3),duration:300,timing:"cubic-bezier(0, 2, 0, 2)",from:0,to:1}]).then(function(){z("turnstileBackwardIn,StopTM")})},turnstileBackwardOut:function(a){z("turnstileBackwardOut,StartTM"),a=m(a);var b=y(a);return s(a,b,[{property:D.cssName,delay:o(0,50,1,1e3),duration:128,timing:"cubic-bezier(0.4925,0.01,0.7675,-0.01)",from:"perspective(800px) rotateY(0deg)",to:"perspective(800px) rotateY(80deg)"},{property:"opacity",delay:o(0,50,1,1e3),duration:128,timing:"cubic-bezier(1,-0.42,0.995,-0.425)",from:1,to:0}]).then(function(){z("turnstileBackwardOut,StopTM")})},slideDown:function(a){return z("slideDown,StartTM"),s(a,{ltr:"",rtl:""},[{property:D.cssName,delay:0,duration:250,timing:"cubic-bezier(0.3825,0.0025,0.8775,-0.1075)",from:"translate(0px, 0px)",to:"translate(0px, 200px)"},{property:"opacity",delay:0,duration:250,timing:"cubic-bezier(1,-0.42,0.995,-0.425)",from:1,to:0}]).then(function(){z("slideDown,StopTM")})},slideUp:function(a){return z("slideUp,StartTM"),s(a,{ltr:"",rtl:""},[{property:D.cssName,delay:0,duration:350,timing:"cubic-bezier(0.17,0.79,0.215,1.0025)",from:"translate(0px, 200px)",to:"translate(0px, 0px)"},{property:"opacity",delay:o(0,34,1,1e3),duration:350,timing:"cubic-bezier(0, 2, 0, 2)",from:0,to:1}]).then(function(){z("slideUp,StopTM")})},slideRightIn:function(a,c,d,e){return z("slideRightIn,StartTM"),r("cubic-bezier(0.17,0.79,0.215,1.0025)",-b.innerWidth,0,!0,a,c,d,e).then(function(){z("slideRightIn,StopTM")})},slideRightOut:function(a,c,d,e){return z("slideRightOut,StartTM"),r("cubic-bezier(0.3825,0.0025,0.8775,-0.1075)",0,b.innerWidth,!1,a,c,d,e).then(function(){z("slideRightOut,StopTM")})},slideLeftIn:function(a,c,d,e){return z("slideLeftIn,StartTM"),r("cubic-bezier(0.17,0.79,0.215,1.0025)",b.innerWidth,0,!0,a,c,d,e).then(function(){z("slideLeftIn,StopTM")})},slideLeftOut:function(a,c,d,e){return z("slideLeftOut,StartTM"),r("cubic-bezier(0.3825,0.0025,0.8775,-0.1075)",0,-b.innerWidth,!1,a,c,d,e).then(function(){z("slideLeftOut,StopTM")})},continuumForwardIn:function(a,b,c){return z("continuumForwardIn,StartTM"),i.join([h.executeTransition(a,[{property:D.cssName,delay:0,duration:350,timing:"cubic-bezier(0.33, 0.18, 0.11, 1)",from:"scale(0.5, 0.5)",to:"scale(1.0, 1.0)"},{property:"opacity",delay:0,duration:350,timing:"cubic-bezier(0, 2, 0, 2)",from:0,to:1}]),h.executeTransition(b,[{property:D.cssName,delay:0,duration:350,timing:"cubic-bezier(0.24,1.15,0.11,1.1575)",from:"translate(0px, 225px)",to:"translate(0px, 0px)"},{property:"opacity",delay:0,duration:350,timing:"cubic-bezier(0, 2, 0, 2)",from:0,to:1}]),s(c,{ltr:"0px 50%",rtl:"100% 50%"},[{property:D.cssName,delay:0,duration:350,timing:"cubic-bezier(0,0.62,0.8225,0.9625)",from:"rotateX(80deg) scale(1.5, 1.5)",to:"rotateX(0deg) scale(1.0, 1.0)"},{property:"opacity",delay:0,duration:350,timing:"cubic-bezier(0, 2, 0, 2)",from:0,to:1}])]).then(function(){z("continuumForwardIn,StopTM")})},continuumForwardOut:function(a,b){return z("continuumForwardOut,StartTM"),i.join([h.executeTransition(a,[{property:D.cssName,delay:0,duration:120,timing:"cubic-bezier(0.3825,0.0025,0.8775,-0.1075)",from:"scale(1.0, 1.0)",to:"scale(1.1, 1.1)"},{property:"opacity",delay:0,duration:120,timing:"cubic-bezier(1,-0.42,0.995,-0.425)",from:1,to:0}]),s(b,{ltr:"0px 100%",rtl:"100% 100%"},[{property:D.cssName,delay:0,duration:152,timing:"cubic-bezier(0.3825,0.0025,0.8775,-0.1075)",from:"rotateX(0deg) scale(1.0, 1.0) translate(0px, 0px)",to:"rotateX(80deg) scale(1.5, 1.5) translate(0px, 150px)"},{property:"opacity",delay:0,duration:152,timing:"cubic-bezier(1,-0.42,0.995,-0.425)",from:1,to:0}])]).then(function(){z("continuumForwardOut,StopTM")})},continuumBackwardIn:function(a,b){return z("continuumBackwardIn,StartTM"),i.join([h.executeTransition(a,[{property:D.cssName,delay:0,duration:200,timing:"cubic-bezier(0.33, 0.18, 0.11, 1)",from:"scale(1.25, 1.25)",to:"scale(1.0, 1.0)"},{property:"opacity",delay:0,duration:200,timing:"cubic-bezier(0, 2, 0, 2)",from:0,to:1}]),s(b,{ltr:"0px 50%",rtl:"100% 50%"},[{property:D.cssName,delay:0,duration:250,timing:"cubic-bezier(0.2975, 0.7325, 0.4725, 0.99)",from:"rotateX(80deg) translate(0px, -100px)",to:"rotateX(0deg) translate(0px, 0px)"},{property:"opacity",delay:0,duration:250,timing:"cubic-bezier(0, 2, 0, 2)",from:0,to:1}])]).then(function(){z("continuumBackwardIn,StopTM")})},continuumBackwardOut:function(a){return z("continuumBackwardOut,StartTM"),h.executeTransition(a,[{property:D.cssName,delay:0,duration:167,timing:"cubic-bezier(0.3825,0.0025,0.8775,-0.1075)",from:"scale(1.0, 1.0)",to:"scale(0.5, 0.5)"},{property:"opacity",delay:0,duration:167,timing:"cubic-bezier(1,-0.42,0.995,-0.425)",from:1,to:0}]).then(function(){z("continuumBackwardOut,StopTM")})},drillInIncoming:function(a){return z("drillInIncoming,StartTM"),h.executeTransition(a,[{property:D.cssName,delay:0,duration:500,timing:"cubic-bezier(0.1,0.9,0.2,1)",from:"scale(0.84)",to:"scale(1.0)"},{property:"opacity",delay:0,duration:500,timing:"cubic-bezier(0.1,0.9,0.2,1)",from:0,to:1}]).then(function(){z("drillInIncoming,StopTM")})},drillInOutgoing:function(a){return z("drillInOutgoing,StartTM"),h.executeTransition(a,[{property:D.cssName,delay:0,duration:233,timing:"cubic-bezier(0.1,0.9,0.2,1)",from:"scale(1.0)",to:"scale(1.29)"},{property:"opacity",delay:0,duration:233,timing:"cubic-bezier(0.1,0.9,0.2,1)",from:1,to:0}]).then(function(){z("drillInOutgoing,StopTM")})},drillOutIncoming:function(a){return z("drillOutIncoming,StartTM"),h.executeTransition(a,[{property:D.cssName,delay:0,duration:500,timing:"cubic-bezier(0.1,0.9,0.2,1)",from:"scale(1.29)",to:"scale(1.0)"},{property:"opacity",delay:0,duration:500,timing:"cubic-bezier(0.1,0.9,0.2,1)",from:0,to:1}]).then(function(){z("drillOutIncoming,StopTM")})},drillOutOutgoing:function(a){return z("drillOutOutgoing,StartTM"),h.executeTransition(a,[{property:D.cssName,delay:0,duration:233,timing:"cubic-bezier(0.1,0.9,0.2,1)",from:"scale(1.0)",to:"scale(0.84)"},{property:"opacity",delay:0,duration:233,timing:"cubic-bezier(0.1,0.9,0.2,1)",from:1,to:0}]).then(function(){z("drillOutOutgoing,StopTM")})},createPageNavigationAnimations:function(b,c,d){function e(){return i.wrap()}return{exit:e,entrance:a.enterPage}},_resizeTransition:function(a,b,c){if(c.to!==c.from&&h.isAnimationEnabled()){for(var d=C(a,b,c),e=[],f=0,g=d.length;g>f;f++)e.push(A(d[f].element,d[f].transition));return i.join(e)}return i.as()},_commandingSurfaceOpenAnimation:function(a){if(!h.isAnimationEnabled())return i.as();var b=a.actionAreaClipper,c=a.actionArea,e=a.overflowAreaClipper,g=a.overflowArea,j=a.oldHeight,k=a.newHeight,l=a.overflowAreaHeight,m=a.menuPositionedAbove,n=k-j,o=[],p=B().defaultResizeGrowTransition;if(m){c.style[D.scriptName]="translateY("+n+"px)",f._getComputedStyle(c).opacity;var q=d._merge(p,{to:"translateY(0px)"});o.push({element:c,transition:q})}else o=C(b,c,{from:j,to:k,actualSize:k,dimension:"height",anchorTrailingEdge:!1});e.style[D.scriptName]="translateY("+(m?n:-n)+"px)",g.style[D.scriptName]="translateY("+(m?l:-l)+"px)",f._getComputedStyle(e).opacity,f._getComputedStyle(g).opacity;for(var r=[],s=0,t=o.length;t>s;s++)r.push(A(o[s].element,o[s].transition));var u=d._merge(p,{to:"translateY(0px)"});return r.push(A(e,u)),r.push(A(g,u)),i.join(r)},_commandingSurfaceCloseAnimation:function(a){if(!h.isAnimationEnabled())return i.as();var b=a.actionAreaClipper,c=a.actionArea,e=a.overflowAreaClipper,g=a.overflowArea,j=a.oldHeight,k=a.newHeight,l=a.overflowAreaHeight,m=a.menuPositionedAbove,n=k-j,o=[],p=B().defaultResizeShrinkTransition;if(m){c.style[D.scriptName]="translateY(0px)",f._getComputedStyle(c).opacity;var q=d._merge(p,{to:"translateY("+-n+"px)"});o.push({element:c,transition:q})}else o=C(b,c,{from:j,to:k,actualSize:j,dimension:"height",anchorTrailingEdge:!1});e.style[D.scriptName]="translateY(0px)",g.style[D.scriptName]="translateY(0px)",f._getComputedStyle(e).opacity,f._getComputedStyle(g).opacity;for(var r=[],s=0,t=o.length;t>s;s++)r.push(A(o[s].element,o[s].transition));var u=d._merge(p,{to:"translateY("+(m?-n:n)+"px)"}),v=d._merge(p,{to:"translateY("+(m?l:-l)+"px)"});return r.push(A(e,u)),r.push(A(g,v)),i.join(r)}})}),define("WinJS/Binding/_BindingParser",["exports","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Log","../Core/_Resources","../Core/_WriteProfilerMark","../ControlProcessor/_OptionsLexer","../ControlProcessor/_OptionsParser"],function(a,b,c,d,e,f,g,h,i){"use strict";function j(a,b){g("WinJS.Binding:bindingParser,StartTM");var c=m.lexer(a),d=new o.BindingInterpreter(c,a,b||{}),e=d.run();return g("WinJS.Binding:bindingParser,StopTM"),e}function k(a){g("WinJS.Binding:bindingParser,StartTM");var b=m.lexer(a),c=new o.BindingParser(b,a),d=c.run();return g("WinJS.Binding:bindingParser,StopTM"),d}var l={get invalidBinding(){return"Invalid binding:'{0}'. Expected to be '<destProp>:<sourceProp>;'. {1}"},get bindingInitializerNotFound(){return"Initializer not found:'{0}'"}},m=b.Namespace.defineWithParent(null,null,{lexer:b.Namespace._lazy(function(){return h._optionsLexer}),tokenType:b.Namespace._lazy(function(){return h._optionsLexer.tokenType})}),n=c.requireSupportedForProcessing,o=b.Namespace.defineWithParent(null,null,{BindingInterpreter:b.Namespace._lazy(function(){return b.Class.derive(i.optionsParser._BaseInterpreter,function(a,b,c){this._initialize(a,b,c)},{_error:function(a){throw new d("WinJS.Binding.ParseError",f._formatString(l.invalidBinding,this._originalSource,a))},_evaluateInitializerName:function(){if(this._current.type===m.tokenType.identifier){var a=this._evaluateIdentifierExpression();return e.log&&!a&&e.log(f._formatString(l.bindingInitializerNotFound,this._originalSource),"winjs binding","error"),n(a)}},_evaluateValue:function(){switch(this._current.type){case m.tokenType.stringLiteral:case m.tokenType.numberLiteral:var a=this._current.value;return this._read(),a;default:return void this._unexpectedToken(m.tokenType.stringLiteral,m.tokenType.numberLiteral)}},_readBindDeclarations:function(){for(var a=[];;)switch(this._current.type){case m.tokenType.identifier:case m.tokenType.thisKeyword:a.push(this._readBindDeclaration());break;case m.tokenType.semicolon:this._read();break;case m.tokenType.eof:return a;default:return void this._unexpectedToken(m.tokenType.identifier,m.tokenType.semicolon,m.tokenType.eof)}},_readBindDeclaration:function(){var a=this._readDestinationPropertyName();this._read(m.tokenType.colon);var b=this._readSourcePropertyName(),c=this._evaluateInitializerName();return{destination:a,source:b,initializer:c}},_readDestinationPropertyName:function(){return this._readIdentifierExpression()},_readSourcePropertyName:function(){return this._readIdentifierExpression()},run:function(){return this._readBindDeclarations()}},{supportedForProcessing:!1})}),BindingParser:b.Namespace._lazy(function(){return b.Class.derive(o.BindingInterpreter,function(a,b){this._initialize(a,b,{})},{_readInitializerName:function(){return this._current.type===m.tokenType.identifier?this._readIdentifierExpression():void 0},_readBindDeclaration:function(){var a=this._readDestinationPropertyName();this._read(m.tokenType.colon);var b=this._readSourcePropertyName(),c=this._readInitializerName();return{destination:a,source:b,initializer:c}}},{supportedForProcessing:!1})})});b.Namespace._moduleDefine(a,"WinJS.Binding",{_bindingParser:j,_bindingParser2:k})}),define("WinJS/Binding/_DomWeakRefTable",["exports","../Core/_Global","../Core/_WinRT","../Core/_Base","../Core/_BaseUtils","../Scheduler"],function(a,b,c,d,e,f){"use strict";function g(){0===n&&(m=0);var a,b,c=Object.keys(p),d=Date.now()-o;for(a=0,b=c.length;b>a;a++){var e=c[a];p[e].time<d&&delete p[e]}i()}function h(){b.Debug&&b.Debug.debuggerEnabled&&q||m||(0===n?(f.schedule(g,f.Priority.idle,null,"WinJS.Utilities._DOMWeakRefTable.cleanup"),m=1):m=b.setInterval(g,n))}function i(){b.Debug&&b.Debug.debuggerEnabled&&q||(0===n?m||0!==Object.keys(p).length&&(f.schedule(g,f.Priority.idle,null,"WinJS.Utilities._DOMWeakRefTable.cleanup"),m=1):m&&0===Object.keys(p).length&&(b.clearInterval(m),m=0))}function j(a,b){return p[b]={element:a,time:Date.now()},h(),b}function k(a){if(r){var c=p[a];return c?c.element:b.document.getElementById(a)}var d=b.document.getElementById(a);if(d)delete p[a],i();else{var c=p[a];c&&(c.time=Date.now(),d=c.element)}return d}if(c.Windows.Foundation.Uri&&c.msSetWeakWinRTProperty&&c.msGetWeakWinRTProperty){var l=new c.Windows.Foundation.Uri("about://blank");return void d.Namespace._moduleDefine(a,"WinJS.Utilities",{_createWeakRef:function(a,b){return c.msSetWeakWinRTProperty(l,b,a),b},_getWeakRefElement:function(a){return c.msGetWeakWinRTProperty(l,a)}})}var m,n=500,o=1e3,p={},q=!0,r=!1;d.Namespace._moduleDefine(a,"WinJS.Utilities",{_DOMWeakRefTable_noTimeoutUnderDebugger:{get:function(){return q},set:function(a){q=a}},_DOMWeakRefTable_sweepPeriod:{get:function(){return n},set:function(a){n=a}},_DOMWeakRefTable_timeout:{get:function(){return o},set:function(a){o=a}},_DOMWeakRefTable_tableSize:{get:function(){return Object.keys(p).length}},_DOMWeakRefTable_fastLoadPath:{get:function(){return r},set:function(a){r=a}},_createWeakRef:j,_getWeakRefElement:k})}),define("WinJS/Binding/_Data",["exports","../Core/_WinRT","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Log","../Core/_Resources","../Promise","../Scheduler","./_DomWeakRefTable"],function(a,b,c,d,e,f,g,h,i,j){"use strict";var k={get exceptionFromBindingInitializer(){return"Exception thrown from binding initializer: {0}"},get propertyIsUndefined(){return"{0} is undefined"},get unsupportedDataTypeForBinding(){return"Unsupported data type"}},l={_listeners:null,_pendingNotifications:null,_notifyId:0,_getObservable:function(){return this},_cancel:function(a){var b=this._pendingNotifications,c=!1;if(b)for(var d=Object.keys(b),e=d.length-1;e>=0;e--){var f=b[d[e]];f.target===a&&(f.promise&&(f.promise.cancel(),f.promise=null),delete b[d[e]],c=!0)}return c},notify:function(a,b,c){var d=this._listeners&&this._listeners[a];if(d){var e=this;e._cancel(a),e._pendingNotifications=e._pendingNotifications||{};var j=e._notifyId++,l=e._pendingNotifications[j]={target:a},m=function(){delete e._pendingNotifications[j]};return l.promise=i.schedulePromiseNormal(null,"WinJS.Binding.observableMixin.notify").then(function(){for(var a=0,e=d.length;e>a&&l.promise;a++)try{d[a](b,c)}catch(h){f.log&&f.log(g._formatString(k.exceptionFromBindingInitializer,h.toString()),"winjs binding","error")}return m(),b}),l.promise}return h.as()},bind:function(a,b){this._listeners=this._listeners||{};for(var c=this._listeners[a]=this._listeners[a]||[],d=!1,e=0,f=c.length;f>e;e++)if(c[e]===b){d=!0;break}return d||(c.push(b),b(w(this[a]))),this},unbind:function(a,b){if(this._listeners=this._listeners||{},a&&b){var c=this._listeners[a];if(c){for(var d,e=0,f=c.length;f>e;e++)c[e]!==b&&(d=d||[]).push(c[e]);this._listeners[a]=d}}else if(a)this._cancel(a),delete this._listeners[a];else{var g=this;if(g._pendingNotifications){var h=g._pendingNotifications;g._pendingNotifications={},Object.keys(h).forEach(function(a){var b=h[a];b.promise&&b.promise.cancel()})}this._listeners={}}return this}},m={_backingData:null,_initObservable:function(a){this._backingData=a||{}},getProperty:function(a){var b=this._backingData[a];return f.log&&void 0===b&&f.log(g._formatString(k.propertyIsUndefined,a),"winjs binding","warn"),v(b)},setProperty:function(a,b){return this.updateProperty(a,b),this},addProperty:function(a,b){return this[a]||Object.defineProperty(this,a,{get:function(){return this.getProperty(a)},set:function(b){this.setProperty(a,b)},enumerable:!0,configurable:!0}),this.setProperty(a,b)},updateProperty:function(a,b){var c=this._backingData[a],d=w(b);return c!==d&&(this._backingData[a]=d,this._backingData[a]===d)?this.notify(a,d,c):h.as()},removeProperty:function(a){var b,c=this._backingData[a];try{delete this._backingData[a]}catch(d){}try{delete this[a]}catch(d){}return this.notify(a,b,c),this}};Object.keys(l).forEach(function(a){m[a]=l[a]});var n=function(a,b){return r(a,b)},o=0,p=function(){return"bindHandler"+o++},q=function(a,c){if(!b.msGetWeakWinRTProperty)return a;var d=p();return j._getWeakRefElement(c)[d]=a,function(a,b){var e=j._getWeakRefElement(c);e&&e[d](a,b)}},r=function(a,b,c){function d(){h&&h.forEach(function(a){a.source.unbind(a.prop,a.listener)}),h=null}function e(a){g[a]&&(g[a].complexBind.cancel(),delete g[a])}if(a=v(a),!a)return{cancel:function(){},empty:!0};var f;c||(c=p(),f={},j._createWeakRef(f,c));var g={},h=null;return Object.keys(b).forEach(function(d){var i=b[d];if(i instanceof Function)i=q(i,c),i.bindState=f,h=h||[],h.push({source:a,prop:d,listener:i}),a.bind(d,i);else{var j=function(a){e(d);var b=r(v(a),i,c);if(b.empty){var f=function(a){Object.keys(a).forEach(function(b){var c=a[b];c instanceof Function?c(void 0,void 0):f(c)})};f(i)}g[d]={source:a,complexBind:b}};j=q(j,c),j.bindState=f,h=h||[],h.push({source:a,prop:d,listener:j}),a.bind(d,j)}}),{cancel:function(){d(),Object.keys(g).forEach(function(a){e(a)})}}},s=c.Class.mix(function(a){this._initObservable(a),Object.defineProperties(this,t(a))},m),t=function(a){function b(a){c[a]={get:function(){return this.getProperty(a)},set:function(b){this.setProperty(a,b)},enumerable:!0,configurable:!0}}for(var c={};a&&a!==Object.prototype;)Object.keys(a).forEach(b),a=Object.getPrototypeOf(a);return c},u=function(a){if(!(!a||"object"!=typeof a||a instanceof Date||Array.isArray(a)))return c.Class.mix(function(b){this._initObservable(b||Object.create(a))},m,t(a));if(d.validation)throw new e("WinJS.Binding.UnsupportedDataType",g._formatString(k.unsupportedDataTypeForBinding))},v=function(a){if(!a)return a;var b=typeof a;if("object"!==b||a instanceof Date||Array.isArray(a))return a;if(a._getObservable)return a._getObservable();var c=new s(a);return c.backingData=a,Object.defineProperty(a,"_getObservable",{value:function(){return c},enumerable:!1,writable:!1}),c},w=function(a){return a&&a.backingData?a.backingData:a};c.Namespace._moduleDefine(a,"WinJS.Binding",{mixin:{value:m,enumerable:!0,writable:!0,configurable:!0},dynamicObservableMixin:{value:m,enumerable:!0,writable:!0,configurable:!0},observableMixin:{value:l,enumerable:!0,writable:!0,configurable:!0},expandProperties:t,define:u,as:v,unwrap:w,bind:n})}),define("WinJS/Binding/_Declarative",["exports","../Core/_Global","../Core/_WinRT","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Log","../Core/_Resources","../Core/_WriteProfilerMark","../Promise","../Utilities/_ElementUtilities","./_BindingParser","./_Data","./_DomWeakRefTable"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){"use strict";function o(a,b){var c=a._autoDispose;c&&c.push(b)}function p(a){a._autoDispose=(a._autoDispose||[]).filter(function(a){return a()})}function q(a,b){return a?a.winBindingToken===b?a:void(g.log&&g.log(h._formatString(N.duplicateBindingDetected,a.id),"winjs binding","error")):a}function r(a){if(a.winBindingToken)return a.winBindingToken;
-var b="_win_bind"+L++;return Object.defineProperty(a,"winBindingToken",{configurable:!1,writable:!1,enumerable:!1,value:b}),b}function s(a,b,c,d,e,f,g){var h=a.initializer;if(h&&(h=h.winControl||h["data-win-control"]||h),h instanceof Function){var i=h(d,a.source,e,a.destination);return g&&(i&&i.cancel?g.bindings.push(function(){i.cancel()}):g.nocache=!0),i}h&&h.render&&(f.count++,g&&(g.nocache=!0),P(h.render).call(h,A(d,a.source),e).then(function(){f.checkComplete()}))}function t(a,b,c,d,e,f){var i,j=!0,k=!1;p(d);var l=function(){if(!k){var c=q(n._getWeakRefElement(a),b);return c||(g.log&&g.log(h._formatString(N.elementNotFound,a),"winjs binding","info"),i&&i.cancel()),c}},m=function(a){var b=l();b&&B(b,e.destination,a),j&&(c.checkComplete(),j=!1)};if(o(d,l),i=H(d,e.source,m)){var r=i.cancel;i.cancel=function(){return k=!0,r.call(i)},f&&f.bindings.push(function(){i.cancel()})}return i}function u(a,c,d,e,f,g,h){var i;return e!==b&&(e=m.as(e)),e._getObservable&&(i=e._getObservable()),i?(g.count++,t(c,d,g,i,a,h)):void B(f,a.destination,A(e,a.source))}function v(a,b){for(var c=a.length-1;c>=0;c--){var d=a[c],i=d.destination;if(1===i.length&&"id"===i[0]){if(e.validation)throw new f("WinJS.Binding.IdBindingNotSupported",h._formatString(N.idBindingNotSupported,b));g.log&&g.log(h._formatString(N.idBindingNotSupported,b),"winjs binding","error"),a.splice(c,1)}}return a}function w(a,c){if(c){var d,e=c.expressions[a];return e||(d=v(l._bindingParser(a,b),a),c.expressions[a]=d),d||(d=e),d}return v(l._bindingParser(a,b),a)}function x(a,c,d,e,f,g){i("WinJS.Binding:processAll,StartTM");var h,j={count:0,checkComplete:function(){this.count--,0===this.count&&(i("WinJS.Binding:processAll,StopTM"),g())}},l=a||b.document.body,m="[data-win-bind],[data-win-control]",o=l.querySelectorAll(m);d||!l.getAttribute("data-win-bind")&&!l.winControl||(h=l),j.count++;var p=c||b;n._DOMWeakRefTable_fastLoadPath=!0;try{var q=k.data(l);q.winBindings=q.winBindings||[];for(var t=h?-1:0,v=o.length;v>t;t++){var x=0>t?h:o[t];if(x.winControl&&x.winControl.constructor&&x.winControl.constructor.isDeclarativeControlContainer){t+=x.querySelectorAll(m).length;var z=x.winControl.constructor.isDeclarativeControlContainer;"function"==typeof z&&(z=P(z))(x.winControl,function(a){return y(a,c,!1,e,f)})}if(x.hasAttribute("data-win-bind")){var A=x.getAttribute("data-win-bind"),B=w(A,e);if(!B.implemented){for(var C=0,D=B.length;D>C;C++){var E=B[C];E.initializer=E.initializer||f,E.initializer?E.implementation=s:E.implementation=u}B.implemented=!0}j.count++;var F=r(x),G=M?F:x.id;G||(x.id=G=F),n._createWeakRef(x,G);var H=k.data(x);H.winBindings=null;var I;e&&e.elements&&(I=e.elements[G],I||(e.elements[G]=I={bindings:[]}));for(var J=0,K=B.length;K>J;J++){var L=B[J],N=L.implementation(L,G,F,p,x,j,I);N&&(H.winBindings=H.winBindings||[],H.winBindings.push(N),q.winBindings.push(N))}j.count--}}}finally{n._DOMWeakRefTable_fastLoadPath=!1}j.checkComplete()}function y(a,b,c,d,e){return new j(function(f,g,h){x(a,b,c,d,e,f,g,h)}).then(null,function(a){return g.log&&g.log(h._formatString(N.errorInitializingBindings,a&&a.message),"winjs binding","error"),j.wrapError(a)})}function z(a){var c=function(c,d,e,f,i){var j=r(e),k=M?j:e.id;k||(e.id=k=j),n._createWeakRef(e,k);var l;if(c!==b&&(c=m.as(c)),c._getObservable&&(l=c._getObservable()),l){var o=H(m.as(c),d,function(b){var c=q(n._getWeakRefElement(k),j);c?B(c,f,a(P(b))):o&&(g.log&&g.log(h._formatString(N.elementNotFound,k),"winjs binding","info"),o.cancel())});return o}var p=A(c,d);p!==i&&B(e,f,a(p))};return O(c)}function A(a,c){if(a!==b&&(a=P(a)),c)for(var d=0,e=c.length;e>d&&null!==a&&void 0!==a;d++)a=P(a[c[d]]);return a}function B(a,c,d){P(d),a=P(a);for(var e=0,f=c.length-1;f>e;e++){if(a=P(a[c[e]]),!a)return void(g.log&&g.log(h._formatString(N.propertyDoesNotExist,c[e],c.join(".")),"winjs binding","error"));if(a instanceof b.Node)return void(g.log&&g.log(h._formatString(N.nestedDOMElementBindingNotSupported,c[e],c.join(".")),"winjs binding","error"))}if(0===c.length)return void(g.log&&g.log(N.cannotBindToThis,"winjs binding","error"));var i=c[c.length-1];g.log&&void 0===a[i]&&g.log(h._formatString(N.creatingNewProperty,i,c.join(".")),"winjs binding","warn"),a[i]=d}function C(a,b,c){return a=P(a),b&&1===b.length&&b[0]?void a.setAttribute(b[0],c):void(g.log&&g.log(N.attributeBindingSingleProperty,"winjs binding","error"))}function D(a,c,d,e,f){var i=r(d),j=M?i:d.id;j||(d.id=j=i),n._createWeakRef(d,j);var k;if(a!==b&&(a=m.as(a)),a._getObservable&&(k=a._getObservable()),k){var l=0,o=H(k,c,function(a){if(1!==++l||a!==f){var b=q(n._getWeakRefElement(j),i);b?C(b,e,P(a)):o&&(g.log&&g.log(h._formatString(N.elementNotFound,j),"winjs binding","info"),o.cancel())}});return o}var p=A(a,c);p!==f&&C(d,e,p)}function E(a,b,c,d){return C(c,d,A(a,b))}function F(a,b,c){c=P(c);var d=A(a,b);Array.isArray(d)?d.forEach(function(a){k.addClass(c,a)}):d&&k.addClass(c,d)}function G(a,b,c,d,e){return Q(a,b,c,d,e)}function H(a,b,c){if(b.length>1){for(var d={},e=d,f=0,g=b.length-1;g>f;f++)e=e[b[f]]={};return e[b[b.length-1]]=c,m.bind(a,d,!0)}return 1===b.length?(a.bind(b[0],c,!0),{cancel:function(){a.unbind(b[0],c),this.cancel=I}}):void c(a)}function I(){}function J(a,b,c,d){return B(c,d,A(a,b)),{cancel:I}}function K(a){return O(a)}var L=1e3*Math.random()>>0,M=c.msSetWeakWinRTProperty&&c.msGetWeakWinRTProperty,N={get attributeBindingSingleProperty(){return'Attribute binding requires a single destination attribute name, often in the form "this[\'aria-label\']" or "width".'},get cannotBindToThis(){return"Can't bind to 'this'."},get creatingNewProperty(){return"Creating new property {0}. Full path:{1}"},get duplicateBindingDetected(){return"Binding against element with id {0} failed because a duplicate id was detected."},get elementNotFound(){return"Element not found:{0}"},get errorInitializingBindings(){return"Error initializing bindings: {0}"},get propertyDoesNotExist(){return"{0} doesn't exist. Full path:{1}"},get idBindingNotSupported(){return"Declarative binding to ID field is not supported. Initializer: {0}"},get nestedDOMElementBindingNotSupported(){return"Binding through a property {0} of type HTMLElement is not supported, Full path:{1}."}},O=e.markSupportedForProcessing,P=e.requireSupportedForProcessing,Q=z(function(a){return a});d.Namespace._moduleDefine(a,"WinJS.Binding",{processAll:y,oneTime:K(J),defaultBind:K(G),converter:z,initializer:K,getValue:A,setAttribute:K(D),setAttributeOneTime:K(E),addClassOneTime:K(F)})}),define("WinJS/Binding",["./Binding/_BindingParser","./Binding/_Data","./Binding/_Declarative","./Binding/_DomWeakRefTable"],function(){}),define("WinJS/BindingTemplate/_DataTemplateCompiler",["exports","../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Log","../Core/_Resources","../Core/_WriteProfilerMark","../Binding/_BindingParser","../Binding/_Declarative","../ControlProcessor","../ControlProcessor/_OptionsParser","../Fragments","../Promise","../_Signal","../Utilities/_Dispose","../Utilities/_SafeHtml","../Utilities/_ElementUtilities"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){"use strict";if(b.document){var s={get attributeBindingSingleProperty(){return'Attribute binding requires a single destination attribute name, often in the form "this[\'aria-label\']" or "width".'},get cannotBindToThis(){return"Can't bind to 'this'."},get idBindingNotSupported(){return"Declarative binding to ID field is not supported. Initializer: {0}"}};c.Namespace._moduleDefine(a,"WinJS.Binding",{_TemplateCompiler:c.Namespace._lazy(function(){function a(a,b,c){var d=r.data(a).bindTokens;d&&d.forEach(function(a){a&&a.cancel&&a.cancel()}),b&&b.cancel(),c&&c.cancel()}function t(a,b){return function(c){return j.processAll(c,a,!1,null,b)}}function u(a){return a=Z(a),a instanceof b.Node?null:a}function v(a,b){var c=-1!==a.indexOf("\n"),d=arguments,f=a.replace(na,function(f,g,h,i,j,k,l){if(j||k)throw new e("Format:MalformedInputString","Did you forget to escape a: "+(j||k)+" at: "+l);if(g)return"{";if(h)return"}";var m,n=+i;if(m=n===+n?d[n+1]:b[i],void 0===m)throw new e("Format:MissingPart","Missing part '"+i+"'");if(c){for(var o=l;o>0&&" "===a[--o];);o>=0&&"\n"===a[o]&&(m=w(l-o-1,m))}return m});return f}function w(a,b){for(var c="",d=0;a>d;d++)c+=" ";return b.split("\n").map(function(a,b){return b?c+a:a}).join("\n")}function x(a){return a.trim()}function y(a){return a.join(";\n")}function z(a){return a.join(", ")||"empty"}function A(a){return a.map(function(a){return a.match(ja)?"."+a:+a===a?v("[{0}]",a):v("[{0}]",C(a))}).join("")}function B(a,b,c,d){var b=b.map(function(a){return a.match(ja)?"."+a:(+a===a&&(a=+a),G(C(a)))}).map(function(a){return v("{filter}({temp} = {temp}{part})",{filter:d,temp:c,part:a})});return b.unshift(F(E(c,a))),b.push(c),F(b.join(" && "))}function C(a){return JSON.stringify(a)}function D(a){return a?"new Array("+ +a+")":"[]"}function E(a,b){return""+a+" = "+b}function F(a){return"("+a+")"}function G(a){return"["+a+"]"}function H(a){return a.match(ja)?a:+a===a?+a:C(a)}function I(a){return a=""+a,a.replace(la,function(a){return ma[a]||" "})}function J(a,b,c){return c?new String(""+a+b+"_"+c):new String(""+a+b)}function K(a){return a.replace(/\\n/g,"\\n\\\n")}function L(a){return Object.keys(a)}function M(a){return Object.keys(a).map(function(b){return a[b]})}function N(a,b){return O([a,b])}function O(a){for(var b={},c=0,d=a.length;d>c;c++)for(var e=a[c],f=Object.keys(e),g=0,h=f.length;h>g;g++){var i=f[g];b[i]=e[i]}return b}function P(a){return a.reduce(function(a,b){return a?Z(a[b]):null},b)}function Q(a,b,c,d){var e=a.children;if(e){var f=Object.keys(e);b&&c&&c(a,b,f.length);for(var g=0,h=f.length;h>g;g++){var i=f[g],j=e[i];Q(j,i,c,d)}b&&d&&d(a,b,Object.keys(e).length)}else b&&c&&c(a,b,0),b&&d&&d(a,b,0)}function R(a){return a.replace(/^\s*$/gm,"").replace(/^(.*[^\s])( *)$/gm,function(a,b){return b})}var S=n._cancelBlocker,T=j.defaultBind,U=j.oneTime,V=j.setAttribute,W=j.setAttributeOneTime,X=j.addClassOneTime,Y=n.as,Z=d.requireSupportedForProcessing,$=q.insertAdjacentHTMLUnsafe,_=r.data,aa=p.markDisposable,ba=k.processAll,ca=j.processAll,da=l._optionsParser,ea=l._CallExpression,fa=l._IdentifierExpression,ga=i._bindingParser2,ha=k.scopedSelect,ia=h,ja=/^[A-Za-z]\w*$/,ka=/[^A-Za-z\w$]/g,la=/[&<>'"]/g,ma={"&":"&amp;","<":"&lt;",">":"&gt;","'":"&#39;",'"':"&quot;"},na=/({{)|(}})|{(\w+)}|({)|(})/g,oa=/^\s*;\s*$/,pa=/[A-Z]/g,qa=c.Class.define(function(a,b,c,d,e){var f=this;this.compiler=a,this.kind=c,this.base=new String(b),this.tree={children:{},parent:this.base,reference:function(){return f.base}},this.accessExpression=d,this.filter=e||""},{createPathExpression:function(a,b){if(a.length){var c=this,d=a.reduce(function(a,b){return a.children=a.children||{},a.children[b]=a.children[b]||{parent:a},a.children[b]},this.tree);return d.name=d.name||c.compiler.defineInstance(c.kind,b||"",function(){return c.accessExpression(d.parent.name?d.parent.name:d.parent.reference(),a.slice(-1)[0],d.parent.parent===c.base,c.filter,!0)}),d.name}return this.base},lower:function(){var a=this,b=[],c=function(b,c,d){return a.accessExpression(b.parent.name?b.parent.name:b.parent.reference(),c,b.parent.parent===a.base,a.filter,d)};Q(this.tree,"",function(d,e,f){b.push(e),f>1?(d.name=d.name||a.compiler.defineInstance(a.kind,b.join("_"),c.bind(null,d,e,!0)),d.reference=function(){return d.name}):1===f&&(d.reference=c.bind(null,d,e))},function(){b.pop()})},deadNodeElimination:function(){Q(this.tree,"",null,function(a,b,c){a.name&&!a.name.dead||0===c&&a.parent&&a.parent.children&&delete a.parent.children[b]})},definitions:function(){var a=[];return Q(this.tree,"",function(b){b.name&&a.push(b)}),a.map(function(a){return a.name.definition()})}}),ra={capture:"capture",temporary:"temporary",variable:"variable",data:"data",global:"global"},sa={capture:"c",temporary:"t",variable:"iv",data:"d",global:"g"},ta={imported:"import",variable:"variable"},ua={imported:"i",variable:"sv"},va={tree:"tree",text:"text",initializer:"initializer",template:"template",error:"error"},wa={attribute:"attribute",booleanAttribute:"booleanAttribute",inlineStyle:"inlineStyle",textContent:"textContent"},xa="imports",ya={initial:0,analyze:1,optimze:2,lower:3,compile:4,link:5,done:6},za=c.Class.define(function(a,c){if(this._stage=ya.initial,this._staticVariables={},this._staticVariablesCount=0,this._instanceVariables={},this._instanceVariablesCount={},this._debugBreak=c.debugBreakOnRender,this._defaultInitializer=Z(c.defaultInitializer||T),this._optimizeTextBindings=!c.disableTextBindingOptimization,this._templateElement=a,this._templateContent=b.document.createElement(a.tagName),this._extractChild=c.extractChild||!1,this._controls=null,this._bindings=null,this._bindTokens=null,this._textBindingPrefix=null,this._textBindingId=0,this._suffix=[],this._htmlProcessors=[],this._profilerMarkIdentifier=c.profilerMarkIdentifier,this._captureCSE=new qa(this,"container",ra.capture,this.generateElementCaptureAccess.bind(this)),this._dataCSE=new qa(this,"data",ra.data,this.generateNormalAccess.bind(this),this.importFunctionSafe("dataSecurityCheck",Z)),this._globalCSE=new qa(this,this.importFunctionSafe("global",b),ra.global,this.generateNormalAccess.bind(this),this.importFunctionSafe("globalSecurityCheck",Z)),m.renderCopy(this._templateElement,this._templateContent),this._extractChild)for(;this._templateContent.childElementCount>1;)this._templateContent.removeChild(this._templateContent.lastElementChild)},{addClassOneTimeTextBinding:function(a){var b=this,c=this.createTextBindingHole(a.elementCapture.element.tagName,"class",++this._textBindingId);a.textBindingId=c,a.kind=va.text,a.elementCapture.element.classList.add(c),a.elementCapture.refCount--,a.definition=function(){return b.formatCode("{htmlEscape}({value})",{htmlEscape:b._staticVariables.htmlEscape,value:a.value()})}},addClassOneTimeTreeBinding:function(a){var b=this;a.pathExpression=this.bindingExpression(a),a.value=function(){return a.pathExpression},a.kind=va.tree,a.definition=function(){return b.formatCode("{element}.classList.add({value})",{element:a.elementCapture,value:a.value()})}},analyze:function(){if(this._stage>ya.analyze)throw"Illegal: once we have moved past analyze we cannot revist it";this._stage=ya.analyze,this._controls=this.gatherControls(),this._bindings=this.gatherBindings(),this._children=this.gatherChildren(),this.cleanControlAndBindingAttributes(),this.async&&this.createAsyncParts(),this.nullableIdentifierAccessTemporary=this.defineInstance(ra.temporary);var a=this._templateContent.innerHTML;this._html=function(){return K(C(a))},this._html.text=a},bindingExpression:function(a){return this._dataCSE.createPathExpression(a.source,a.source.join("_"))},capture:function(a){var b=a._capture;if(b)return b.refCount++,b;for(var c=[a],d=a.parentNode,e=a.tagName;d!==this._templateContent;)e=d.tagName+"_"+e,c.unshift(d),d=d.parentNode;for(var f=0,g=c.length;g>f;f++){var h=c[f];c[f]=Array.prototype.indexOf.call(d.children,h),d=h}return b=this._captureCSE.createPathExpression(c,e.toLowerCase()),b.element=a,b.element._capture=b,b.refCount=1,b},cleanControlAndBindingAttributes:function(){for(var a="[data-win-bind],[data-win-control]",b=this._templateContent.querySelectorAll(a),c=0,d=b.length;d>c;c++){var e=b[c];e.isDeclarativeControlContainer&&(c+=e.querySelectorAll("[data-win-bind],[data-win-control]").length),e.removeAttribute("data-win-bind"),e.removeAttribute("data-win-control"),e.removeAttribute("data-win-options")}},compile:function(a,b,c){if(this._stage>ya.compile)throw"Illegal: once we have moved past compile we cannot revist it";this._stage=ya.compile;var d=this;this._returnedElement=this._extractChild?"container.firstElementChild":"container";var e,f,g=this._controls.map(function(a){var b;b=a.async?"{target}.winControl = {target}.winControl || new {SafeConstructor}({target}, {options}, controlDone)":"{target}.winControl = {target}.winControl || new {SafeConstructor}({target}, {options})";var c=d.formatCode(b,{target:a.elementCapture,SafeConstructor:a.SafeConstructor,options:d.generateOptionsLiteral(a.optionsParsed,a.elementCapture)});if(a.isDeclarativeControlContainer&&"function"==typeof a.isDeclarativeControlContainer.imported){var e=[c];return e.push(d.formatCode("{isDeclarativeControlContainer}({target}.winControl, {delayedControlProcessing})",{target:a.elementCapture,isDeclarativeControlContainer:a.isDeclarativeControlContainer,delayedControlProcessing:d._staticVariables.ui_processAll})),e.push(d.formatCode("{isDeclarativeControlContainer}({target}.winControl, {delayedBindingProcessing}(data, {templateDefaultInitializer}))",{target:a.elementCapture,isDeclarativeControlContainer:a.isDeclarativeControlContainer,delayedBindingProcessing:d._staticVariables.delayedBindingProcessing,templateDefaultInitializer:d._staticVariables.templateDefaultInitializer||C(null)})),e.join(";\n")}return c}),h=this._bindings.map(function(a){switch(a.kind){case va.template:return d.formatCode("({nestedTemplates}[{nestedTemplate}] = {template}.render({path}, {dest}))",{nestedTemplates:d._nestedTemplates,nestedTemplate:C(a.nestedTemplate),template:a.template,path:a.pathExpression,dest:a.elementCapture});case va.initializer:var b;return b=a.initialValue?"({bindTokens}[{bindToken}] = {initializer}(data, {sourceProperties}, {dest}, {destProperties}, {initialValue}))":"({bindTokens}[{bindToken}] = {initializer}(data, {sourceProperties}, {dest}, {destProperties}))",d.formatCode(b,{bindTokens:d._bindTokens,bindToken:C(a.bindToken),initializer:a.initializer,sourceProperties:C(a.source),destProperties:C(a.destination),dest:a.elementCapture,initialValue:a.initialValue});case va.tree:return a.definition();case va.text:break;case va.error:break;default:throw"NYI"}});c?(e=h.filter(function(a,b){return!d._bindings[b].delayable}),f=h.filter(function(a,b){return d._bindings[b].delayable})):(e=h,f=[]);var i=M(this._instanceVariables),j=i.filter(function(a){return a.kind===ra.variable}).map(function(a){return a.definition()}),k=this._captureCSE.definitions(),l=this._globalCSE.definitions(),m=this._dataCSE.definitions(),n=this._children.map(function(a){return d.formatCodeN("{0}.msParentSelectorScope = true",a)}),o=this._suffix.map(function(a){return a()}),p="";c&&f.length&&(p=d.formatCode(Ia,{delayed_binding_processing:y(f)}));var q=d.formatCode(a,O([this._staticVariables,b||{},{profilerMarkIdentifierStart:C("WinJS.Binding.Template:render"+this._profilerMarkIdentifier+",StartTM"),profilerMarkIdentifierStop:C("WinJS.Binding.Template:render"+this._profilerMarkIdentifier+",StopTM"),html:this._html(),tagName:C(this._templateElement.tagName),instance_variable_declarations:z(i),global_definitions:y(l),data_definitions:y(m),instance_variable_definitions:y(j),capture_definitions:y(k),set_msParentSelectorScope:y(n),debug_break:this.generateDebugBreak(),control_processing:y(g),control_counter:this._controlCounter,binding_processing:y(e),renderComplete:p,suffix_statements:y(o),nestedTemplates:this._nestedTemplates,returnedElement:this._returnedElement}]));return this.prettify(q)},createAsyncParts:function(){this._nestedTemplates=this._nestedTemplates||this.defineInstance(ra.variable,"nestedTemplates",function(){return D(0)}),this._controlCounter=this._controlCounter||this.defineInstance(ra.variable,"controlCounter",function(){return C(1)})},createTextBindingHole:function(a,b,c){if(!this._textBindingPrefix){for(var d="";-1!==this._html.text.indexOf("textbinding"+d);)d=d||0,d++;this._textBindingPrefix="textbinding"+d,this._textBindingRegex=new RegExp("(#?"+this._textBindingPrefix+"_\\d+)")}var e=this._textBindingPrefix+"_"+c;return"IMG"===a&&"src"===b&&(e="#"+e),e},deadCodeElimination:function(){var a=this;Object.keys(this._instanceVariables).forEach(function(b){var c=a._instanceVariables[b];c.kind===ra.capture&&(a._templateContent.contains(c.element)||(c.dead=!0),0===c.refCount&&(c.dead=!0),c.dead&&(c.definition=function(){},c.name=null,delete a._instanceVariables[b]))}),this._controls=this._controls.filter(function(a){return!a.elementCapture.dead}),this._bindings=this._bindings.filter(function(a){return!a.elementCapture.dead}),this._captureCSE.deadNodeElimination()},defineInstance:function(a,b,c){if(this._stage>=ya.compile)throw"Illegal: define instance variable after compilation stage has started";var d=this._instanceVariablesCount[a]||0,e=b?b.replace(ka,"_"):"",f=J(sa[a],d,e);return f.definition=function(){return E(f,c())},f.kind=a,this._instanceVariables[f]=f,this._instanceVariablesCount[a]=d+1,f},defineStatic:function(a,b,c){if(this._stage>=ya.link)throw"Illegal: define static variable after link stage has started";if(b){var d=this._staticVariables[b];if(d)return d}var e=b?b.replace(ka,"_"):"",f=J(ua[a],this._staticVariablesCount,e);return f.definition=function(){return E(f,c())},f.kind=a,this._staticVariables[b||f]=f,this._staticVariablesCount++,f},done:function(){if(this._stage>ya.done)throw"Illegal: once we have moved past done we cannot revist it";this._stage=ya.done},emitScopedSelect:function(a,b){return this.formatCode("{scopedSelect}({selector}, {element})",{scopedSelect:this._staticVariables.scopedSelect,selector:C(a),element:b})},emitOptionsNode:function(a,b,c){var d=this;if(a)switch(typeof a){case"object":if(Array.isArray(a)){b.push("[");for(var e=0,f=a.length;f>e;e++)this.emitOptionsNode(a[e],b,c),b.push(",");b.push("]")}else if(a instanceof ea)b.push("select"===a.target?this.emitScopedSelect(a.arg0Value,c):C(null));else if(a instanceof fa&&a.parts[0]instanceof ea){var g=a.parts[0];b.push(B("select"===g.target?this.emitScopedSelect(g.arg0Value,c):C(null),a.parts.slice(1),this.nullableIdentifierAccessTemporary,this.importFunctionSafe("requireSupportedForProcessing",Z)))}else a instanceof fa?b.push(a.pathExpression):(b.push("{"),Object.keys(a).forEach(function(e){b.push(H(e)),b.push(":"),d.emitOptionsNode(a[e],b,c),b.push(",")}),b.push("}"));break;default:b.push(C(a))}else b.push(C(null))},findGlobalIdentifierExpressions:function(a,b){b=b||[];var c=this;return Object.keys(a).forEach(function(d){var e=a[d];"object"==typeof e&&(e instanceof fa?e.parts[0]instanceof ea||b.push(e):c.findGlobalIdentifierExpressions(e,b))}),b},formatCodeN:function(){if(this._stage<ya.compile)throw"Illegal: format code at before compilation stage has started";return v.apply(null,arguments)},formatCode:function(a,b){if(this._stage<ya.compile)throw"Illegal: format code at before compilation stage has started";return v(a,b)},gatherBindings:function(){for(var a=-1,c=this,d=-1,e=[],f="[data-win-bind],[data-win-control]",g=this._templateContent.querySelectorAll(f),h=0,i=g.length;i>h;h++){var j=g[h];if(j.isDeclarativeControlContainer&&(h+=j.querySelectorAll(f).length),j.hasAttribute("data-win-bind")){var k=j.getAttribute("data-win-bind"),l=ga(k,b);l.forEach(function(b){if(b.initializer){var e=b.initializer.join("."),f=P(b.initializer);f.render?(Z(f.render),b.template=c.importFunctionSafe(e,f),b.pathExpression=c.bindingExpression(b),b.nestedTemplate=++d,b.kind=va.template):f.winControl&&f.winControl.render?(Z(f.winControl.render),b.template=c.importFunctionSafe(e,f.winControl),b.pathExpression=c.bindingExpression(b),b.nestedTemplate=++d,b.kind=va.template):(b.initializer=c.importFunction(e,f),b.bindToken=++a,b.kind=va.initializer)}else b.initializer=c.importFunctionSafe("templateDefaultInitializer",c._defaultInitializer),b.bindToken=++a,b.kind=va.initializer;b.elementCapture=c.capture(j),b.bindingText=k}),e.push.apply(e,l)}}var m=d+1;m>0&&(this.async=!0,this._nestedTemplates=this.defineInstance(ra.variable,"nestedTemplates",function(){return D(m)}));var n=a+1;return n>0&&(this._bindTokens=this.defineInstance(ra.variable,"bindTokens",function(){return D(n)}),this._suffix.push(function(){return c.formatCode("{utilities_data}(returnedElement).bindTokens = {bindTokens}",{utilities_data:c._staticVariables.utilities_data,bindTokens:c._bindTokens})})),e},gatherChildren:function(){var a=this;return Array.prototype.map.call(this._templateContent.children,function(b){return a.capture(b)})},gatherControls:function(){for(var a=this,c=0,e=[],f="[data-win-control]",g=this._templateContent.querySelectorAll(f),h=0,i=g.length;i>h;h++){var j=g[h],k=j.getAttribute("data-win-control"),l=d._getMemberFiltered(k.trim(),b,Z);if(l){var m=j.getAttribute("data-win-options")||C({}),n=l.length>2;n&&(c++,this.async=!0);var o=l.isDeclarativeControlContainer;o&&("function"==typeof o&&(o=this.importFunction(k+"_isDeclarativeControlContainer",o)),j.isDeclarativeControlContainer=o,h+=j.querySelectorAll(f).length);var p={elementCapture:this.capture(j),name:k,SafeConstructor:this.importFunctionSafe(k,l),async:n,optionsText:C(m),optionsParsed:da(m),isDeclarativeControlContainer:o};e.push(p);var q=this.findGlobalIdentifierExpressions(p.optionsParsed);q.forEach(function(b){b.pathExpression=a.globalExpression(b.parts)})}}return c>0&&(this._controlCounter=this.defineInstance(ra.variable,"controlCounter",function(){return C(c+1)})),e},generateElementCaptureAccess:function(a,b,c){if(c){var d=""+b=="0"?"":" + "+b;return this.formatCodeN("{0}.children[startIndex{1}]",a,d)}return this.formatCodeN("{0}.children[{1}]",a,b)},generateNormalAccess:function(a,b,c,d,e){if(a.indexOf(this.nullableIdentifierAccessTemporary)>=0){var f;return f=e?"{left} && {filter}({temp}{right})":"{left} && ({temp} = {filter}({temp}{right}))",this.formatCode(f,{temp:this.nullableIdentifierAccessTemporary,left:a,right:A([b]),filter:d})}var f;return f=e?"({temp} = {left}) && {filter}({temp}{right})":"({temp} = {left}) && ({temp} = {filter}({temp}{right}))",this.formatCode(f,{temp:this.nullableIdentifierAccessTemporary,left:a,right:A([b]),filter:d})},generateOptionsLiteral:function(a,b){var c=[];return this.emitOptionsNode(a,c,b),c.join(" ")},generateDebugBreak:function(){if(this._debugBreak){var a=this.defineStatic(ta.variable,"debugCounter",function(){return C(0)});return this.formatCodeN("if (++{0} === 1) {{ debugger; }}",a)}return""},globalExpression:function(a){return this._globalCSE.createPathExpression(a,a.join("_"))},importFunction:function(a,b){return this.importFunctionSafe(a,Z(b))},importFunctionSafe:function(a,b){var c=this,d=this.defineStatic(ta.imported,a,function(){return c.formatCodeN("({0}{1})",xa,A([a]))});if(d.imported&&d.imported!==b)throw"Duplicate import: '"+a+"'";return d.imported=b,d},importAll:function(a){return Object.keys(a).forEach(function(b){Z(a[b])}),this.importAllSafe(a)},importAllSafe:function(a){var b=this,c=Object.keys(a).reduce(function(c,d){return c[d]=b.importFunctionSafe(d,a[d]),c},{});return c},link:function(a){if(this._stage>ya.link)throw"Illegal: once we have moved past link we cannot revist it";this._stage=ya.link;var b=this,c=L(this._staticVariables).filter(function(a){return b._staticVariables[a].kind===ta.imported}).reduce(function(a,c){return a[c]=b._staticVariables[c].imported,a},{}),d=M(this._staticVariables);return new Function(xa,this.formatCode(Ka,{static_variable_declarations:z(d),static_variable_definitions:y(d.map(function(a){return a.definition()})),body:a.trim()}))(c)},lower:function(){if(this._stage>ya.lower)throw"Illegal: once we have moved past lower we cannot revist it";this._stage=ya.lower,this._captureCSE.lower(),this._dataCSE.lower(),this._globalCSE.lower()},markBindingAsError:function(a){a&&(a.kind=va.error,this.markBindingAsError(a.original))},oneTimeTextBinding:function(a){var b=this,c=this.oneTimeTextBindingAnalyze(a);if(c){var d;a.original&&(d=a.original.initialValue);var e=this.createTextBindingHole(a.elementCapture.element.tagName,c.attribute,++this._textBindingId);switch(a.textBindingId=e,a.kind=va.text,a.elementCapture.refCount--,a.definition=function(){var c;return c=d?"{htmlEscape}({initialValue})":"{htmlEscape}({getter})",b.formatCode(c,{htmlEscape:b._staticVariables.htmlEscape,getter:a.value(),initialValue:d})},c.kind){case wa.attribute:a.elementCapture.element.setAttribute(c.attribute,e);break;case wa.booleanAttribute:a.elementCapture.element.setAttribute(c.attribute,e),a.definition=function(){var e;return e=d?'({initialValue} ? {attribute} : "")':'({value} ? {attribute} : "")',b.formatCode(e,{value:a.value(),attribute:C(c.attribute),initialValue:d})},this._htmlProcessors.push(function(a){return a.replace(new RegExp(c.attribute+'="'+e+'"',"i"),e)});break;case wa.textContent:a.elementCapture.element.textContent=e;break;case wa.inlineStyle:var f=a.elementCapture.element;if(!f.msReplaceStyle){f.msReplaceStyle=f.getAttribute("style")||"",""!==f.msReplaceStyle&&";"!==f.msReplaceStyle[f.msReplaceStyle.length-1]&&(f.msReplaceStyle=f.msReplaceStyle+";"),f.setAttribute("style","msReplaceStyle:'"+e+"'");var g=f.getAttribute("style");this._htmlProcessors.push(function(a){return a.replace(g,f.msReplaceStyle)})}f.msReplaceStyle=f.msReplaceStyle+c.property+":"+e+";";break;default:throw"NYI"}}},oneTimeTextBindingAnalyze:function(a){var b=a.elementCapture.element,c=b.tagName,d=a.destination[0];switch(c){case"A":switch(d){case"href":return{kind:wa.attribute,attribute:d}}break;case"IMG":switch(d){case"alt":case"src":case"width":case"height":return{kind:wa.attribute,attribute:d}}break;case"SELECT":switch(d){case"disabled":case"multiple":case"required":return{kind:wa.booleanAttribute,attribute:d};case"size":return{kind:wa.attribute,attribute:d}}break;case"OPTION":switch(d){case"label":case"value":return{kind:wa.attribute,attribute:d};case"disabled":case"selected":return{kind:wa.booleanAttribute,attribute:d}}break;case"INPUT":switch(d){case"checked":switch(b.type){case"checkbox":case"radio":return{kind:wa.booleanAttribute,attribute:d}}break;case"disabled":return{kind:wa.booleanAttribute,attribute:d};case"max":case"maxLength":case"min":case"step":case"value":return{kind:wa.attribute,attribute:d};case"size":switch(b.type){case"text":case"search":case"tel":case"url":case"email":case"password":return{kind:wa.attribute,attribute:d}}break;case"readOnly":switch(b.type){case"hidden":case"range":case"color":case"checkbox":case"radio":case"file":case"button":break;default:return{kind:wa.booleanAttribute,attribute:d}}}break;case"BUTTON":switch(d){case"disabled":return{kind:wa.booleanAttribute,attribute:d};case"value":return{kind:wa.attribute,attribute:d}}break;case"TEXTAREA":switch(d){case"disabled":case"readOnly":case"required":return{kind:wa.booleanAttribute,attribute:d};case"cols":case"maxLength":case"placeholder":case"rows":case"wrap":return{kind:wa.attribute,attribute:d}}}switch(d){case"className":return{kind:wa.attribute,attribute:"class"};case"dir":case"lang":case"name":case"title":case"tabIndex":return{kind:wa.attribute,attribute:d};case"style":if(a.destination.length>1){var e=a.destination[1];if("cssText"===e)return;var f="string"==typeof b.style[e];if(f)return("m"===e[0]&&"s"===e[1]||"webkit"===e.substring(0,6))&&(e="-"+e),e=e.replace(pa,function(a){return"-"+a.toLowerCase()}),{kind:wa.inlineStyle,property:e,attribute:"style"}}break;case"innerText":case"textContent":return{kind:wa.textContent,attribute:"textContent"}}},oneTimeTreeBinding:function(a){if(1===a.destination.length&&"id"===a.destination[0]){if(d.validation)throw new e("WinJS.Binding.IdBindingNotSupported",g._formatString(s.idBindingNotSupported,a.bindingText));return f.log&&f.log(g._formatString(s.idBindingNotSupported,a.bindingText),"winjs binding","error"),void this.markBindingAsError(a)}if(0===a.destination.length)return f.log&&f.log(s.cannotBindToThis,"winjs binding","error"),void this.markBindingAsError(a);var b,c=this;a.pathExpression=this.bindingExpression(a),a.value=function(){return a.pathExpression},a.original&&(b=a.pathExpression,a.original.initialValue=b),a.kind=va.tree,a.definition=function(){var d;return d=b?"({targetPath} || {{}}){prop} = {initialValue}":"({targetPath} || {{}}){prop} = {sourcePath}",c.formatCode(d,{targetPath:B(a.elementCapture,a.destination.slice(0,-1),c.nullableIdentifierAccessTemporary,c.importFunctionSafe("targetSecurityCheck",u)),prop:A(a.destination.slice(-1)),sourcePath:a.value(),
-initialValue:b})}},optimize:function(){if(this._stage>ya.optimze)throw"Illegal: once we have moved past link we cannot revist it";this._stage=ya.optimze;for(var a=0;a<this._bindings.length;a++){var b=this._bindings[a];if(!b.template)switch(b.initializer.imported){case T:var c=N(b,{kind:va.tree,initializer:this.importFunctionSafe("init_oneTime",U),original:b});c.elementCapture.refCount++,this.oneTimeTreeBinding(c),this._bindings.splice(a,0,c),b.delayable=!0,a++;break;case V:var c=N(b,{kind:va.tree,initializer:this.importFunctionSafe("init_setAttributeOneTime",W),original:b});c.elementCapture.refCount++,this.setAttributeOneTimeTreeBinding(c),this._bindings.splice(a,0,c),b.delayable=!0,a++;break;case U:this.oneTimeTreeBinding(b);break;case W:this.setAttributeOneTimeTreeBinding(b);break;case X:this.addClassOneTimeTreeBinding(b);break;default:b.initializer&&(b.delayable=!!b.initializer.imported.delayable)}}if(this._optimizeTextBindings){for(var d={},a=0;a<this._bindings.length;a++){var b=this._bindings[a];if(!b.template&&b.kind!==va.error){switch(b.initializer.imported){case U:this.oneTimeTextBinding(b);break;case W:this.setAttributeOneTimeTextBinding(b);break;case X:this.addClassOneTimeTextBinding(b)}b.textBindingId&&(d[b.textBindingId]=b)}}if(Object.keys(d).length){var e=this._templateContent.innerHTML;e=this._htmlProcessors.reduce(function(a,b){return b(a)},e);for(var f=e.split(this._textBindingRegex),a=1;a<f.length;a+=2){var b=d[f[a]];f[a]=b.definition}this._html=function(){var a=f.map(function(a){return"string"==typeof a?C(a):a()}).join(" + ");return K(a)}}}},prettify:function(a){var b=a.split("\n");return b.filter(function(a){return!oa.test(a)}).join("\n")},setAttributeOneTimeTextBinding:function(a){var b,c=this,d=a.destination[0],e=this.createTextBindingHole(a.elementCapture.element.tagName,d,++this._textBindingId);a.original&&(b=a.original.initialValue),a.textBindingId=e,a.kind=va.text,a.elementCapture.element.setAttribute(d,e),a.elementCapture.refCount--,a.definition=function(){var d;return d=b?"{htmlEscape}({initialValue})":"{htmlEscape}({value})",c.formatCode(d,{htmlEscape:c._staticVariables.htmlEscape,initialValue:b,value:a.value()})}},setAttributeOneTimeTreeBinding:function(a){if(1===a.destination.length&&"id"===a.destination[0]){if(d.validation)throw new e("WinJS.Binding.IdBindingNotSupported",g._formatString(s.idBindingNotSupported,a.bindingText));return f.log&&f.log(g._formatString(s.idBindingNotSupported,a.bindingText),"winjs binding","error"),void this.markBindingAsError(a)}if(1!==a.destination.length||!a.destination[0])return f.log&&f.log(s.attributeBindingSingleProperty,"winjs binding","error"),void this.markBindingAsError(a);var b,c=this;a.pathExpression=this.bindingExpression(a),a.value=function(){return a.pathExpression},a.original&&(b=this.defineInstance(ra.variable,"",a.value),a.original.initialValue=b),a.kind=va.tree,a.definition=function(){var d;return d=b?'{element}.setAttribute({attribute}, "" + {initialValue})':'{element}.setAttribute({attribute}, "" + {value})',c.formatCode(d,{element:a.elementCapture,attribute:C(a.destination[0]),initialValue:b,value:a.value()})}}},{_TreeCSE:qa,compile:function(c,d,e){if(!(d instanceof b.HTMLElement))throw"Illegal";ia("WinJS.Binding.Template:compile"+e.profilerMarkIdentifier+",StartTM");var f=new za(d,e);f.analyze();var g=f.importAllSafe({Signal:o,global:b,document:b.document,cancelBlocker:S,promise_as:Y,disposeInstance:a,markDisposable:aa,ui_processAll:ba,binding_processAll:ca,insertAdjacentHTMLUnsafe:$,promise:n,utilities_data:_,requireSupportedForProcessing:Z,htmlEscape:I,scopedSelect:ha,delayedBindingProcessing:t,writeProfilerMark:ia});f.optimize(),f.deadCodeElimination(),f.lower();var h,i;switch(e.target){case"render":h=f.async?Fa:Ea,i=!1;break;case"renderItem":h=f.async?Ja:Ha,i=!0}var j=f.compile(h,g,i),k=f.link(j);return f.done(),ia("WinJS.Binding.Template:compile"+e.profilerMarkIdentifier+",StopTM"),k}}),Aa=R('container.classList.add("win-template");                                                              \nvar html = {html};                                                                                      \n{insertAdjacentHTMLUnsafe}(container, "beforeend", html);                                             \nreturnedElement = {returnedElement};                                                                    \n                                                                                                        \n// Capture Definitions                                                                                  \n{capture_definitions};                                                                                  \n{set_msParentSelectorScope};                                                                            \n                                                                                                        \n'),Ba=R("// Control Processing                                                                                   \n{control_processing};                                                                                   \n                                                                                                        \n// Binding Processing                                                                                   \n{binding_processing};                                                                                   \n                                                                                                        \nvar result = {promise_as}(returnedElement);                                                             \n"),Ca=R('var controlSignal = new {Signal}();                                                                     \nvar controlDone = function () {{ if (--{control_counter} === 0) {{ controlSignal.complete(); }} }};     \ncontrolDone();                                                                                          \n                                                                                                        \n// Control Processing                                                                                   \n{control_processing};                                                                                   \n                                                                                                        \nvar result = controlSignal.promise.then(function () {{                                                  \n    // Binding Processing                                                                               \n    {binding_processing};                                                                               \n    return {promise}.join({nestedTemplates});                                                           \n}}).then(function () {{                                                                                 \n    return returnedElement;                                                                             \n}}).then(null, function (e) {{                                                                          \n    if (typeof e === "object" && e.name === "Canceled") {{ returnedElement.dispose(); }}            \n    return {promise}.wrapError(e);                                                                      \n}});                                                                                                    \n'),Da=R("{markDisposable}(returnedElement, function () {{ {disposeInstance}(returnedElement, result); }});       \n{suffix_statements};                                                                                    \n"),Ea=R('function render(data, container) {{                                                                     \n    {debug_break}                                                                                       \n    if (typeof data === "object" && typeof data.then === "function") {{                             \n        // async data + a container falls back to interpreted path                                      \n        if (container) {{                                                                               \n            var result = this._renderInterpreted(data, container);                                      \n            return result.element.then(function () {{ return result.renderComplete; }});                \n        }}                                                                                              \n        return {cancelBlocker}(data).then(function(data) {{ return render(data); }});                   \n    }}                                                                                                  \n                                                                                                        \n    {writeProfilerMark}({profilerMarkIdentifierStart});                                                 \n                                                                                                        \n    // Declarations                                                                                     \n    var {instance_variable_declarations};                                                               \n    var returnedElement;                                                                                \n                                                                                                        \n    // Global Definitions                                                                               \n    {global_definitions};                                                                               \n                                                                                                        \n    // Data Definitions                                                                                 \n    data = (data === {global} ? data : {requireSupportedForProcessing}(data));                          \n    {data_definitions};                                                                                 \n                                                                                                        \n    // Instance Variable Definitions                                                                    \n    {instance_variable_definitions};                                                                    \n                                                                                                        \n    // HTML Processing                                                                                  \n    container = container || {document}.createElement({tagName});                                       \n    var startIndex = container.childElementCount;                                                       \n    '+x(w(4,Aa))+"                                           \n                                                                                                        \n    "+x(w(4,Ba))+"                                      \n    "+x(w(4,Da))+"                                           \n                                                                                                        \n    {writeProfilerMark}({profilerMarkIdentifierStop});                                                  \n                                                                                                        \n    return result;                                                                                      \n}}                                                                                                      \n"),Fa=R('function render(data, container) {{                                                                     \n    {debug_break}                                                                                       \n    if (typeof data === "object" && typeof data.then === "function") {{                             \n        // async data + a container falls back to interpreted path                                      \n        if (container) {{                                                                               \n            var result = this._renderInterpreted(data, container);                                      \n            return result.element.then(function () {{ return result.renderComplete; }});                \n        }}                                                                                              \n        return {cancelBlocker}(data).then(function(data) {{ return render(data, container); }});        \n    }}                                                                                                  \n                                                                                                        \n    {writeProfilerMark}({profilerMarkIdentifierStart});                                                 \n                                                                                                        \n    // Declarations                                                                                     \n    var {instance_variable_declarations};                                                               \n    var returnedElement;                                                                                \n                                                                                                        \n    // Global Definitions                                                                               \n    {global_definitions};                                                                               \n                                                                                                        \n    // Data Definitions                                                                                 \n    data = (data === {global} ? data : {requireSupportedForProcessing}(data));                          \n    {data_definitions};                                                                                 \n                                                                                                        \n    // Instance Variable Definitions                                                                    \n    {instance_variable_definitions};                                                                    \n                                                                                                        \n    // HTML Processing                                                                                  \n    container = container || {document}.createElement({tagName});                                       \n    var startIndex = container.childElementCount;                                                       \n    '+x(w(4,Aa))+"                                           \n                                                                                                        \n    "+x(w(4,Ca))+"                                 \n    "+x(w(4,Da))+"                                           \n                                                                                                        \n    {writeProfilerMark}({profilerMarkIdentifierStop});                                                  \n                                                                                                        \n    return result;                                                                                      \n}}                                                                                                      \n"),Ga=R("{markDisposable}(returnedElement, function () {{ {disposeInstance}(returnedElement, result, renderComplete); }});\n{suffix_statements};                                                                                    \n"),Ha=R('function renderItem(itemPromise) {{                                                                     \n    {debug_break}                                                                                       \n    // Declarations                                                                                     \n    var {instance_variable_declarations};                                                               \n    var element, renderComplete, data, returnedElement;                                                 \n                                                                                                        \n    element = itemPromise.then(function renderItem(item) {{                                             \n        if (typeof item.data === "object" && typeof item.data.then === "function") {{               \n            return {cancelBlocker}(item.data).then(function (data) {{ return renderItem({{ data: data }}); }});\n        }}                                                                                              \n                                                                                                        \n        {writeProfilerMark}({profilerMarkIdentifierStart});                                             \n                                                                                                        \n        // Global Definitions                                                                           \n        {global_definitions};                                                                           \n                                                                                                        \n        // Data Definitions                                                                             \n        data = item.data;                                                                               \n        data = (data === {global} ? data : {requireSupportedForProcessing}(data));                      \n        {data_definitions};                                                                             \n                                                                                                        \n        // Instance Variable Definitions                                                                \n        {instance_variable_definitions};                                                                \n                                                                                                        \n        // HTML Processing                                                                              \n        var container = {document}.createElement({tagName});                                            \n        var startIndex = 0;                                                                             \n        '+x(w(8,Aa))+"                                       \n                                                                                                        \n        "+x(w(8,Ba))+"                                  \n        "+x(w(8,Ga))+"                                   \n                                                                                                        \n        {writeProfilerMark}({profilerMarkIdentifierStop});                                              \n                                                                                                        \n        return result;                                                                                  \n    }});                                                                                                \n    {renderComplete};                                                                                   \n    return {{                                                                                           \n        element: element,                                                                               \n        renderComplete: renderComplete || element,                                                      \n    }};                                                                                                 \n}}                                                                                                      \n"),Ia=R("renderComplete = element.then(function () {{                                                            \n    return itemPromise;                                                                                 \n}}).then(function (item) {{                                                                             \n    return item.ready || item;                                                                          \n}}).then(function (item) {{                                                                             \n    {delayed_binding_processing};                                                                       \n    return element;                                                                                     \n}});                                                                                                    \n"),Ja=R('function renderItem(itemPromise) {{                                                                     \n    {debug_break}                                                                                       \n    // Declarations                                                                                     \n    var {instance_variable_declarations};                                                               \n    var element, renderComplete, data, returnedElement;                                                 \n                                                                                                        \n    element = itemPromise.then(function renderItem(item) {{                                             \n        if (typeof item.data === "object" && typeof item.data.then === "function") {{               \n            return {cancelBlocker}(item.data).then(function (data) {{ return renderItem({{ data: data }}); }});\n        }}                                                                                              \n                                                                                                        \n        {writeProfilerMark}({profilerMarkIdentifierStart});                                             \n                                                                                                        \n        // Global Definitions                                                                           \n        {global_definitions};                                                                           \n                                                                                                        \n        // Data Definitions                                                                             \n        data = item.data;                                                                               \n        data = (data === {global} ? data : {requireSupportedForProcessing}(data));                      \n        {data_definitions};                                                                             \n                                                                                                        \n        // Instance Variable Definitions                                                                \n        {instance_variable_definitions};                                                                \n                                                                                                        \n        // HTML Processing                                                                              \n        var container = {document}.createElement({tagName});                                            \n        var startIndex = 0;                                                                             \n        '+x(w(8,Aa))+"                                       \n                                                                                                        \n        "+x(w(8,Ca))+"                             \n        "+x(w(8,Ga))+"                                   \n                                                                                                        \n        {writeProfilerMark}({profilerMarkIdentifierStop});                                              \n                                                                                                        \n        return result;                                                                                  \n    }});                                                                                                \n    {renderComplete};                                                                                   \n    return {{                                                                                           \n        element: element,                                                                               \n        renderComplete: renderComplete || element,                                                      \n    }};                                                                                                 \n}}                                                                                                      \n"),Ka=R('"use strict";                                                                                         \n                                                                                                        \n// statics                                                                                              \nvar {static_variable_declarations};                                                                     \n{static_variable_definitions};                                                                          \n                                                                                                        \n// generated template rendering function                                                                \nreturn {body};                                                                                          \n');return za})})}}),define("WinJS/BindingTemplate",["exports","./Core/_Global","./Core/_WinRT","./Core/_Base","./Core/_BaseUtils","./Core/_Log","./Core/_WriteProfilerMark","./Binding/_Declarative","./BindingTemplate/_DataTemplateCompiler","./ControlProcessor","./Fragments","./Promise","./Utilities/_Dispose","./Utilities/_ElementUtilities"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){"use strict";if(b.document){var o=l._cancelBlocker;d.Namespace._moduleDefine(a,"WinJS.Binding",{Template:d.Namespace._lazy(function(){function a(a,c,d){function e(){return n.removeClass(i,"win-loading"),g("WinJS.Binding:templateRender"+a._profilerMarkIdentifier+",StopTM"),r||i}g("WinJS.Binding:templateRender"+a._profilerMarkIdentifier+",StartTM"),1===++a._counter&&(a.debugBreakOnRender||p._debugBreakOnRender);var f=l.wrap(),i=d||b.document.createElement(a.element.tagName);n.addClass(i,"win-template"),n.addClass(i,"win-loading");var q,r,s=a,t=i.children.length,u=function(){var a=n.data(i).winBindings;a&&a.forEach(function(a){a.cancel()}),f.cancel()};a.extractChild?q=k.renderCopy(s.href||s.element,b.document.createElement(s.element.tagName)).then(function(a){var b=a.firstElementChild;return r=b,m.markDisposable(b,u),i.appendChild(b),b}):(m.markDisposable(i,u),q=k.renderCopy(s.href||s.element,i));var v=q.then(function(){function a(){return b(j.processAll).then(function(){return o(c)}).then(function(a){return b(h.processAll,a,!r&&!t,s.bindingCache)}).then(null,function(a){return"object"==typeof a&&"Canceled"===a.name&&(r||i).dispose(),l.wrapError(a)})}var b;if(0===t)b=function(a,b,c,d){return a(r||i,b,c,d)};else{var d=i.children;if(d.length===t+1)b=function(a,b,c,e){return a(d[t],b,c,e)};else{for(var e=[],g=t,k=d.length;k>g;g++)e.push(d[g]);b=function(a,b,c,d){var f=[];return e.forEach(function(e){f.push(a(e,b,c,d))}),l.join(f)}}}for(var m=i.firstElementChild;m;)m.msParentSelectorScope=!0,m=m.nextElementSibling;var n=s.processTimeout;return n?(0>n&&(n=0),l.timeout(n).then(function(){return f=a()})):f=a()}).then(e,function(a){return e(),l.wrapError(a)});return{element:q,renderComplete:v}}var p=d.Class.define(function(a,c){this._element=a||b.document.createElement("div"),this._element.winControl=this,this._profilerMarkIdentifier=e._getProfilerMarkIdentifier(this._element),g("WinJS.Binding:newTemplate"+this._profilerMarkIdentifier+",StartTM");var d=this;this._element.renderItem=function(a,b){return d._renderItemImpl(a,b)},c=c||{},this.href=c.href,this.enableRecycling=!!c.enableRecycling,this.processTimeout=c.processTimeout||0,this.bindingInitializer=c.bindingInitializer,this.debugBreakOnRender=c.debugBreakOnRender,this.disableOptimizedProcessing=c.disableOptimizedProcessing,this.extractChild=c.extractChild,this._counter=0,this._compile=!!c._compile,this.href||(this.element.style.display="none"),this.bindingCache={expressions:{}},g("WinJS.Binding:newTemplate"+this._profilerMarkIdentifier+",StopTM")},{_shouldCompile:{get:function(){var a=!0;return a=a&&!p._interpretAll,a=a&&!this.disableOptimizedProcessing,a&&(a=a&&0===this.processTimeout,a=a&&(!this.href||this.href instanceof b.HTMLElement),a||f.log&&f.log("Cannot compile templates which use processTimeout or href properties","winjs binding","warn")),a}},bindingInitializer:{get:function(){return this._bindingInitializer},set:function(a){this._bindingInitializer=a,this._reset()}},debugBreakOnRender:{get:function(){return this._debugBreakOnRender},set:function(a){this._debugBreakOnRender=!!a,this._reset()}},disableOptimizedProcessing:{get:function(){return this._disableOptimizedProcessing},set:function(a){this._disableOptimizedProcessing=!!a,this._reset()}},element:{get:function(){return this._element}},extractChild:{get:function(){return this._extractChild},set:function(a){this._extractChild=!!a,this._reset()}},processTimeout:{get:function(){return this._processTimeout||0},set:function(a){this._processTimeout=a,this._reset()}},render:e.markSupportedForProcessing(function(a,b){return this._renderImpl(a,b)}),_renderImpl:function(b,c){if(this._shouldCompile)try{return this._renderImpl=this._compileTemplate({target:"render"}),this._renderImpl(b,c)}catch(d){return l.wrapError(d)}var e=a(this,b,c);return e.element.then(function(){return e.renderComplete})},_renderInterpreted:function(b,c){return a(this,b,c)},renderItem:function(a,b){return this._renderItemImpl(a,b)},_renderItemImpl:function(b,c){if(this._shouldCompile)try{return this._renderItemImpl=this._compileTemplate({target:"renderItem"}),this._renderItemImpl(b)}catch(d){return{element:l.wrapError(d),renderComplete:l.wrapError(d)}}var e=this;if(this.enableRecycling&&!this.bindingCache.elements&&(this.bindingCache.elements={}),this.enableRecycling&&c&&c.msOriginalTemplate===this){var f=this.bindingCache.elements[c.id],g=!0;if(f&&(f.bindings.forEach(function(a){a()}),f.bindings=[],g=!f.nocache),g)return{element:c,renderComplete:b.then(function(a){return h.processAll(c,a.data,!0,e.bindingCache)})}}var i=a(this,b.then(function(a){return a.data}));return i.element=i.element.then(function(a){return a.msOriginalTemplate=e,a}),i},_compileTemplate:function(a){var b=this,d=i._TemplateCompiler.compile(this,this.href||this.element,{debugBreakOnRender:this.debugBreakOnRender||p._debugBreakOnRender,defaultInitializer:this.bindingInitializer||a.defaultInitializer,disableTextBindingOptimization:a.disableTextBindingOptimization||!1,target:a.target,extractChild:this.extractChild,profilerMarkIdentifier:this._profilerMarkIdentifier}),e=a.resetOnFragmentChange||c.Windows.ApplicationModel.DesignMode.designModeEnabled;if(e){var f=new n._MutationObserver(function(){b._reset(),f.disconnect()});f.observe(n.data(this.element).docFragment,{childList:!0,attributes:!0,characterData:!0,subtree:!0
-})}return d},_reset:function(){delete this._renderImpl,delete this._renderItemImpl}},{isDeclarativeControlContainer:{value:!0,writable:!1,configurable:!1},render:{value:function(a,b,c){return new p(null,{href:a}).render(b,c)}}});return p})})}}),define("WinJS/BindingList/_BindingListDataSource",["exports","../Core/_WinRT","../Core/_Base","../Core/_ErrorFromName","../Binding/_DomWeakRefTable","../Promise","../Scheduler","../Utilities/_UI"],function(a,b,c,d,e,f,g,h){"use strict";c.Namespace._moduleDefine(a,"WinJS.Binding",{_BindingListDataSource:c.Namespace._lazy(function(){function a(a,b){for(var c=a.length;c-1>b;){var d=a.getItem(++b);if(d)return d.key}return null}function i(a,b){for(;b>0;){var c=a.getItem(--b);if(c)return c.key}return null}function j(a,b){Object.keys(b).forEach(function(c){a.addEventListener(c,b[c])})}function k(a,b){Object.keys(b).forEach(function(c){a.removeEventListener(c,b[c])})}function l(a,b){return b?new B(a,b):new A}function m(a,b,c){return b?new C(a,b,c):new A}function n(a,b,c){return b&&a._annotateWithIndex(b,c)}function o(a,b){return this._list.unshift(b),this.itemFromIndex(0)}function p(a,b,c){var d=this._list.indexOfKey(c);return-1===d?y.noLongerMeaningful:(this._list.splice(d,0,b),this.itemFromIndex(d))}function q(a,b,c){var d=this._list.indexOfKey(c);return-1===d?y.noLongerMeaningful:(d+=1,this._list.splice(d,0,b),this.itemFromIndex(d))}function r(a,b){return this._list.push(b),this.itemFromIndex(this._list.length-1)}function s(a,b){var c=this._list.indexOfKey(a);return-1===c?y.noLongerMeaningful:(this._list.setAt(c,b),this.itemFromIndex(c))}function t(a){var b=this._list.indexOfKey(a);if(-1===b)return y.noLongerMeaningful;var c=0;return this._list.move(b,c),this.itemFromIndex(c)}function u(a,b){var c=this._list.indexOfKey(a),d=this._list.indexOfKey(b);return-1===c||-1===d?y.noLongerMeaningful:(d=d>c?d-1:d,this._list.move(c,d),this.itemFromIndex(d))}function v(a,b){var c=this._list.indexOfKey(a),d=this._list.indexOfKey(b);return-1===c||-1===d?y.noLongerMeaningful:(d=d>=c?d:d+1,this._list.move(c,d),this.itemFromIndex(d))}function w(a){var b=this._list.indexOfKey(a);if(-1===b)return y.noLongerMeaningful;var c=this._list.length-1;return this._list.move(b,c),this.itemFromIndex(c)}function x(a){var b=this._list.indexOfKey(a);return-1===b?y.noLongerMeaningful:(this._list.splice(b,1),f.wrap())}var y={get noLongerMeaningful(){return f.wrapError(new d(h.EditError.noLongerMeaningful))}},z=f.wrap().constructor,A=c.Class.derive(z,function(){this._value=null},{release:function(){},retain:function(){return this}},{supportedForProcessing:!1}),B=c.Class.derive(z,function(a,b){this._value=b,this._listBinding=a},{handle:{get:function(){return this._value.key}},index:{get:function(){return this._value.index}},release:function(){this._listBinding._release(this._value,this._listBinding._list.indexOfKey(this._value.key))},retain:function(){return this._listBinding._addRef(this._value,this._listBinding._list.indexOfKey(this._value.key)),this}},{supportedForProcessing:!1}),C=c.Class.derive(f,function(a,b,c){var d=this;this._item=b,this._listBinding=a,f.call(this,function(e){g.schedule(function(){return a._released?void d.cancel():void e(b)},g.Priority.normal,null,"WinJS.Binding.List."+c)})},{handle:{get:function(){return this._item.key}},index:{get:function(){return this._item.index}},release:function(){this._listBinding._release(this._item,this._listBinding._list.indexOfKey(this._item.key))},retain:function(){return this._listBinding._addRef(this._item,this._listBinding._list.indexOfKey(this._item.key)),this}},{supportedForProcessing:!1}),D=c.Class.define(function(a,c,d,f){this._dataSource=a,this._list=c,this._editsCount=0,this._notificationHandler=d,this._pos=-1,this._retained=[],this._retained.length=c.length,this._retainedKeys={},this._affectedRange=null;var g=null;if(b.msSetWeakWinRTProperty&&b.msGetWeakWinRTProperty||(g=this),d){var h=function(a,b){var c=e._getWeakRefElement(f)||g;return c?(c["_"+a](b),!0):!1};this._handlers={itemchanged:function i(a){h("itemchanged",a)||c.removeEventListener("itemchanged",i)},iteminserted:function k(a){h("iteminserted",a)||c.removeEventListener("iteminserted",k)},itemmoved:function l(a){h("itemmoved",a)||c.removeEventListener("itemmoved",l)},itemremoved:function m(a){h("itemremoved",a)||c.removeEventListener("itemremoved",m)},reload:function n(){h("reload")||c.removeEventListener("reload",n)}},j(this._list,this._handlers)}},{_itemchanged:function(a){var b=a.detail.key,c=a.detail.index;this._updateAffectedRange(c,"changed");var d=a.detail.newItem,e=this._retained[c];if(e){var f=this._notificationHandler;if(e.index!==c){var g=e.index;e.index=c,f&&f.indexChanged&&f.indexChanged(d.key,c,g)}d=n(this._list,d,c),d._retainedCount=e._retainedCount,this._retained[c]=d,this._retainedKeys[b]=d,this._beginEdits(this._list.length),f&&f.changed&&f.changed(d,e),this._endEdits()}else this._beginEdits(this._list.length),this._endEdits()},_iteminserted:function(b){var c=b.detail.index;this._updateAffectedRange(c,"inserted"),this._beginEdits(this._list.length-1),c<=this._pos&&(this._pos=Math.min(this._pos+1,this._list.length));var d=this._retained;if(d.splice(c,0,0),delete d[c],this._shouldNotify(c)||1===this._list.length){var e=this._notificationHandler;e&&e.inserted&&e.inserted(l(this,n(this._list,this._list.getItem(c),c)),i(this._list,c),a(this._list,c))}this._endEdits()},_itemmoved:function(a){var b=a.detail.oldIndex,c=a.detail.newIndex;this._updateAffectedRange(b,"moved"),this._updateAffectedRange(c,"moved"),this._beginEdits(this._list.length),(b<this._pos||c<=this._pos)&&(c>this._pos?this._pos=Math.max(-1,this._pos-1):b>this._pos&&(this._pos=Math.min(this._pos+1,this._list.length)));var d=this._retained,e=d.splice(b,1)[0];d.splice(c,0,e),e||(delete d[c],e=n(this._list,this._list.getItem(c),c)),e._moved=!0,this._addRef(e,c),this._endEdits()},_itemremoved:function(a){var b=a.detail.key,c=a.detail.index;this._updateAffectedRange(c,"removed"),this._beginEdits(this._list.length+1),c<this._pos&&(this._pos=Math.max(-1,this._pos-1));var d=this._retained,e=this._retainedKeys,f=c in d;d.splice(c,1),delete e[b];var g=this._notificationHandler;f&&g&&g.removed&&g.removed(b,!1),this._endEdits()},_reload:function(){this._retained=[],this._retainedKeys={};var a=this._notificationHandler;a&&a.reload&&a.reload()},_addRef:function(a,b){b in this._retained?this._retained[b]._retainedCount++:(this._retained[b]=a,this._retainedKeys[a.key]=a,a._retainedCount=1)},_release:function(a,b){var c=this._retained[b];c&&(1===c._retainedCount?(delete this._retained[b],delete this._retainedKeys[c.key]):c._retainedCount--)},_shouldNotify:function(a){var b=this._retained;return a in b||a+1 in b||a-1 in b},_updateAffectedRange:function(a,b){if(this._notificationHandler.affectedRange){var c=a,d="removed"!==b?a+1:a;if(this._affectedRange){switch(b){case"inserted":a<=this._affectedRange.end&&++this._affectedRange.end;break;case"removed":a<this._affectedRange.end&&--this._affectedRange.end;break;case"moved":case"changed":}this._affectedRange.start=Math.min(this._affectedRange.start,c),this._affectedRange.end=Math.max(this._affectedRange.end,d)}else this._affectedRange={start:c,end:d}}},_notifyAffectedRange:function(){this._affectedRange&&(this._notificationHandler&&this._notificationHandler.affectedRange&&this._notificationHandler.affectedRange(this._affectedRange),this._affectedRange=null)},_notifyCountChanged:function(){var a=this._countAtBeginEdits,b=this._list.length;if(a!==b){var c=this._notificationHandler;c&&c.countChanged&&c.countChanged(b,a)}},_notifyIndicesChanged:function(){for(var a=this._retained,b=0,c=a.length;c>b;b++){var d=a[b];if(d&&d.index!==b){var e=b,f=d.index;d.index=e;var g=this._notificationHandler;g&&g.indexChanged&&g.indexChanged(d.key,e,f)}}},_notifyMoved:function(){for(var b=this._retained,c=0,d=b.length;d>c;c++){var e=b[c];if(e&&e._moved&&(e._moved=!1,this._release(e,c),this._shouldNotify(c))){var f=this._notificationHandler;f&&f.moved&&f.moved(l(this,e),i(this._list,c),a(this._list,c))}}},_beginEdits:function(a,b){this._editsCount++;var c=this._notificationHandler;if(1===this._editsCount&&c){if(!b){this._editsCount++;var d=this;g.schedule(function(){d._endEdits()},g.Priority.high,null,"WinJS.Binding.List._endEdits")}c.beginNotifications&&c.beginNotifications(),this._countAtBeginEdits=a}},_endEdits:function(){this._editsCount--;var a=this._notificationHandler;0===this._editsCount&&a&&(this._notifyIndicesChanged(),this._notifyMoved(),this._notifyCountChanged(),this._notifyAffectedRange(),a.endNotifications&&a.endNotifications())},jumpToItem:function(a){var b=this._list.indexOfKey(a.handle);return-1===b?f.wrap(null):(this._pos=b,this.current())},current:function(){return this.fromIndex(this._pos)},previous:function(){return this._pos=Math.max(-1,this._pos-1),this._fromIndex(this._pos,!0,"previous")},next:function(){return this._pos=Math.min(this._pos+1,this._list.length),this._fromIndex(this._pos,!0,"next")},releaseItem:function(a){a.release?a.release():this._release(a,this._list.indexOfKey(a.key))},release:function(){this._notificationHandler&&k(this._list,this._handlers),this._notificationHandler=null,this._dataSource._releaseBinding(this),this._released=!0},first:function(){return this.fromIndex(0)},last:function(){return this.fromIndex(this._list.length-1)},fromKey:function(a){var b,c=this._retainedKeys;return b=a in c?c[a]:n(this._list,this._list.getItemFromKey(a),this._list.indexOfKey(a)),l(this,b)},fromIndex:function(a){return this._fromIndex(a,!1,"fromIndex")},_fromIndex:function(a,b,c){var d,e=this._retained;return d=a in e?e[a]:n(this._list,this._list.getItem(a),a),b?m(this,d,c):l(this,d)}},{supportedForProcessing:!1}),E=0,F=c.Class.define(function(a){this._usingWeakRef=b.msSetWeakWinRTProperty&&b.msGetWeakWinRTProperty,this._bindings={},this._list=a,a.unshift&&(this.insertAtStart=o),a.push&&(this.insertAtEnd=r),a.setAt&&(this.change=s),a.splice&&(this.insertAfter=q,this.insertBefore=p,this.remove=x),a.move&&(this.moveAfter=v,this.moveBefore=u,this.moveToEnd=w,this.moveToStart=t)},{_releaseBinding:function(a){delete this._bindings[a._id]},addEventListener:function(){},removeEventListener:function(){},createListBinding:function(a){var b="ds_"+ ++E,c=new D(this,this._list,a,b);return c._id=b,this._usingWeakRef?(e._createWeakRef(c,b),this._bindings[b]=b):this._bindings[b]=c,c},getCount:function(){return f.wrap(this._list.length)},itemFromKey:function(a){var b=this._list,c=n(b,b.getItemFromKey(a),-1);return Object.defineProperty(c,"index",{get:function(){return b.indexOfKey(a)},enumerable:!1,configurable:!0}),f.wrap(c)},itemFromIndex:function(a){return f.wrap(n(this._list,this._list.getItem(a),a))},list:{get:function(){return this._list}},beginEdits:function(){var a=this._list.length;this._forEachBinding(function(b){b._beginEdits(a,!0)})},endEdits:function(){this._forEachBinding(function(a){a._endEdits()})},_forEachBinding:function(a){if(this._usingWeakRef){var b=[];Object.keys(this._bindings).forEach(function(c){var d=e._getWeakRefElement(c);d?a(d):b.push(c)});for(var c=0,d=b.length;d>c;c++)delete this._bindings[b[c]]}else{var f=this;Object.keys(this._bindings).forEach(function(b){a(f._bindings[b])})}},invalidateAll:function(){return f.wrap()},moveAfter:void 0,moveBefore:void 0,moveToEnd:void 0,moveToStart:void 0},{supportedForProcessing:!1});return F})})}),define("WinJS/BindingList",["exports","./Core/_Base","./Core/_BaseUtils","./Core/_ErrorFromName","./Core/_Events","./Core/_Resources","./Binding/_Data","./BindingList/_BindingListDataSource"],function(a,b,c,d,e,f,g,h){"use strict";function i(a){return Array.prototype.slice.call(a,0)}function j(a){return{handle:a.handle,key:a.key,data:a.data,groupKey:a.groupKey,groupSize:a.groupSize,firstItemKey:a.firstItemKey,firstItemIndexHint:a.firstItemIndexHint}}function k(a){return void 0===a?void 0:+a}function l(a,b){function c(b,c){for(;c>b;b++)a[b]=f[b]}function d(a,b){if(!(2>b-a)){var f=Math.floor((b+a)/2);d(a,f),d(f,b),e(a,f,b),c(a,b)}}function e(c,d,e){for(var g=c,h=d,i=c;e>i;i++)d>g&&(h>=e||b(a[g],a[h])<=0)?(f[i]=a[g],g++):(f[i]=a[h],h++)}var f=new Array(a.length);return d(0,a.length),a}var m={get sparseArrayNotSupported(){return"Sparse arrays are not supported with proxy: true"},get illegalListLength(){return"List length must be assigned a finite positive number"}},n=e._createEventProperty,o={},p=b.Namespace.defineWithParent(null,null,{ListBase:b.Namespace._lazy(function(){var a=b.Class.define(null,{_annotateWithIndex:function(a,b){var c=j(a);return c.index=b,c},onitemchanged:n("itemchanged"),oniteminserted:n("iteminserted"),onitemmoved:n("itemmoved"),onitemmutated:n("itemmutated"),onitemremoved:n("itemremoved"),onreload:n("reload"),_notifyItemChanged:function(a,b,c,d,e,f){this._listeners&&this._listeners.itemchanged&&this.dispatchEvent("itemchanged",{key:a,index:b,oldValue:c,newValue:d,oldItem:e,newItem:f})},_notifyItemInserted:function(a,b,c){this._listeners&&this._listeners.iteminserted&&this.dispatchEvent("iteminserted",{key:a,index:b,value:c});var d=this.length;d!==this._lastNotifyLength&&(this.notify("length",d,this._lastNotifyLength),this._lastNotifyLength=d)},_notifyItemMoved:function(a,b,c,d){this._listeners&&this._listeners.itemmoved&&this.dispatchEvent("itemmoved",{key:a,oldIndex:b,newIndex:c,value:d})},_notifyItemMutated:function(a,b,c){this._listeners&&this._listeners.itemmutated&&this.dispatchEvent("itemmutated",{key:a,value:b,item:c})},_notifyItemRemoved:function(a,b,c,d){this._listeners&&this._listeners.itemremoved&&this.dispatchEvent("itemremoved",{key:a,index:b,value:c,item:d});var e=this.length;e!==this._lastNotifyLength&&(this.notify("length",e,this._lastNotifyLength),this._lastNotifyLength=e)},_notifyReload:function(){if(this._listeners&&this._listeners.reload&&this.dispatchEvent("reload"),a!==this._lastNotifyLength){var a=this.length;this.notify("length",a,this._lastNotifyLength),this._lastNotifyLength=a}},_normalizeIndex:function(a){return a=k(a),0>a?this.length+a:a},_notifyMutatedFromKey:function(a){var b=this.getItemFromKey(a);this._notifyItemMutated(a,b.data,b)},notifyReload:function(){this._notifyReload()},getAt:function(a){a=k(a);var b=this.getItem(a);return b&&b.data},_getArray:function(){for(var a=new Array(this.length),b=0,c=this.length;c>b;b++){var d=this.getItem(b);d&&(a[b]=d.data)}return a},_getFromKey:function(a){var b=this.getItemFromKey(a);return b&&b.data},_getKey:function(a){a=k(a);var b=this.getItem(a);return b&&b.key},concat:function(){var a=this._getArray();return a.concat.apply(a,arguments)},join:function(a){return this._getArray().join(a||",")},slice:function(a,b){return this._getArray().slice(a,b)},indexOf:function(a,b){b=k(b),b=Math.max(0,this._normalizeIndex(b)||0);for(var c=b,d=this.length;d>c;c++){var e=this.getItem(c);if(e&&e.data===a)return c}return-1},lastIndexOf:function(a,b){b=k(b);var c=this.length;b=Math.min(this._normalizeIndex(void 0!==b?b:c),c-1);var d;for(d=b;d>=0;d--){var e=this.getItem(d);if(e&&e.data===a)return d}return-1},every:function(a,b){return this._getArray().every(a,b)},filter:function(a,b){return this._getArray().filter(a,b)},forEach:function(a,b){this._getArray().forEach(a,b)},map:function(a,b){return this._getArray().map(a,b)},some:function(a,b){return this._getArray().some(a,b)},reduce:function(a,b){return arguments.length>1?this._getArray().reduce(a,b):this._getArray().reduce(a)},reduceRight:function(a,b){return arguments.length>1?this._getArray().reduceRight(a,b):this._getArray().reduceRight(a)},createFiltered:function(a){return new p.FilteredListProjection(this,a)},createGrouped:function(a,b,c){return new p.GroupedSortedListProjection(this,a,b,c)},createSorted:function(a){return new p.SortedListProjection(this,a)},dataSource:{get:function(){return this._dataSource=this._dataSource||new h._BindingListDataSource(this)}}},{supportedForProcessing:!1});return b.Class.mix(a,g.observableMixin),b.Class.mix(a,e.eventMixin),a}),ListBaseWithMutators:b.Namespace._lazy(function(){return b.Class.derive(p.ListBase,null,{pop:function(){return this.splice(-1,1)[0]},push:function(a){if(1===arguments.length)return this.splice(this.length,0,a),this.length;var b=i(arguments);return b.splice(0,0,this.length,0),this.splice.apply(this,b),this.length},shift:function(){return this.splice(0,1)[0]},unshift:function(a){if(1===arguments.length)this.splice(0,0,a);else{var b=i(arguments);b.splice(0,0,0,0),this.splice.apply(this,b)}return this.length}},{supportedForProcessing:!1})}),ListProjection:b.Namespace._lazy(function(){return b.Class.derive(p.ListBaseWithMutators,null,{_list:null,_myListeners:null,_addListListener:function(a,b){var c={name:a,handler:b.bind(this)};this._myListeners=this._myListeners||[],this._myListeners.push(c),this._list.addEventListener(a,c.handler)},dispose:function(){var b=this._list,c=this._myListeners;this._myListeners=[];for(var d=0,e=c.length;e>d;d++){var f=c[d];b.removeEventListener(f.name,f.handler)}this._list=new a.List,this._listReload()},getItemFromKey:function(a){return this._list.getItemFromKey(a)},move:function(a,b){a=k(a),b=k(b),a===b||0>a||0>b||a>=this.length||b>=this.length||(a=this._list.indexOfKey(this._getKey(a)),b=this._list.indexOfKey(this._getKey(b)),this._list.move(a,b))},_notifyMutatedFromKey:function(a){this._list._notifyMutatedFromKey(a)},splice:function(a,b,c){a=k(a),a=Math.max(0,this._normalizeIndex(a));var d=i(arguments);return a===this.length?(d[0]=this._list.length,this._list.splice.apply(this._list,d)):(d[0]=this._getKey(a),this._spliceFromKey.apply(this,d))},_setAtKey:function(a,b){this._list._setAtKey(a,b)}},{supportedForProcessing:!1})}),FilteredListProjection:b.Namespace._lazy(function(){return b.Class.derive(p.ListProjection,function(a,b){this._list=a,this._addListListener("itemchanged",this._listItemChanged),this._addListListener("iteminserted",this._listItemInserted),this._addListListener("itemmutated",this._listItemMutated),this._addListListener("itemmoved",this._listItemMoved),this._addListListener("itemremoved",this._listItemRemoved),this._addListListener("reload",this._listReload),this._filter=b,this._initFilteredKeys()},{_filter:null,_filteredKeys:null,_initFilteredKeys:function(){for(var a=this._filter,b=this._list,c=[],d=0,e=b.length;e>d;d++){var f=b.getItem(d);f&&a(f.data)&&c.push(f.key)}this._filteredKeys=c},_findInsertionPosition:function(a,b){for(var c,d=this._filter;--b>=0;){var e=this._list.getItem(b);if(e&&d(e.data)){c=e.key;break}}var f=this._filteredKeys,g=c?f.indexOf(c)+1:0;return g},_listItemChanged:function(a){var b=a.detail.key,c=a.detail.index,d=a.detail.oldValue,e=a.detail.newValue,f=a.detail.oldItem,g=a.detail.newItem,h=this._filter,i=h(d),j=h(e);if(i&&j){var k=this._filteredKeys,l=k.indexOf(b);this._notifyItemChanged(b,l,d,e,f,g)}else i&&!j?this._listItemRemoved({detail:{key:b,index:c,value:d,item:f}}):!i&&j&&this._listItemInserted({detail:{key:b,index:c,value:e}})},_listItemInserted:function(a){var b=a.detail.key,c=a.detail.index,d=a.detail.value,e=this._filter;if(e(d)){var f=this._findInsertionPosition(b,c),g=this._filteredKeys;g.splice(f,0,b),this._notifyItemInserted(b,f,d)}},_listItemMoved:function(a){var b=a.detail.key,c=a.detail.newIndex,d=a.detail.value,e=this._filteredKeys,f=e.indexOf(b);if(-1!==f){e.splice(f,1);var g=this._findInsertionPosition(b,c);e.splice(g,0,b),this._notifyItemMoved(b,f,g,d)}},_listItemMutated:function(a){var b=a.detail.key,c=a.detail.value,d=a.detail.item,e=this._filter,f=this._filteredKeys,g=f.indexOf(b),h=-1!==g,i=e(c);h&&i?this._notifyItemMutated(b,c,d):h&&!i?(f.splice(g,1),this._notifyItemRemoved(b,g,c,d)):!h&&i&&this._listItemInserted({detail:{key:b,index:this._list.indexOfKey(b),value:c}})},_listItemRemoved:function(a){var b=a.detail.key,c=a.detail.value,d=a.detail.item,e=this._filteredKeys,f=e.indexOf(b);-1!==f&&(e.splice(f,1),this._notifyItemRemoved(b,f,c,d))},_listReload:function(){this._initFilteredKeys(),this._notifyReload()},length:{get:function(){return this._filteredKeys.length},set:function(a){if(!("number"==typeof a&&a>=0))throw new d("WinJS.Binding.List.IllegalLength",m.illegalListLength);var b=this.length;b>a&&this.splice(a,b-a)}},getItem:function(a){return a=k(a),this.getItemFromKey(this._filteredKeys[a])},indexOfKey:function(a){return this._filteredKeys.indexOf(a)},notifyMutated:function(a){return a=k(a),this._notifyMutatedFromKey(this._filteredKeys[a])},setAt:function(a,b){a=k(a),this._setAtKey(this._filteredKeys[a],b)},_spliceFromKey:function(a,b){if(arguments.length>2){var c=i(arguments);c[1]=0,this._list._spliceFromKey.apply(this._list,c)}var d=[];if(b){for(var e=[],f=this._filteredKeys,g=f.indexOf(a),h=g,j=f.length;j>h&&b>h-g;h++){var a=f[h];e.push(a)}var k=this;e.forEach(function(a){d.push(k._list._spliceFromKey(a,1)[0])})}return d}},{supportedForProcessing:!1})}),SortedListProjection:b.Namespace._lazy(function(){return b.Class.derive(p.ListProjection,function(a,b){this._list=a,this._addListListener("itemchanged",this._listItemChanged),this._addListListener("iteminserted",this._listItemInserted),this._addListListener("itemmoved",this._listItemMoved),this._addListListener("itemmutated",this._listItemMutated),this._addListListener("itemremoved",this._listItemRemoved),this._addListListener("reload",this._listReload),this._sortFunction=b,this._initSortedKeys()},{_sortFunction:null,_sortedKeys:null,_initSortedKeys:function(){for(var a=this._list,b=[],c=0,d=a.length;d>c;c++){var e=a.getItem(c);e&&(b[c]=e.key)}var f=this._sortFunction,g=l(b,function(b,c){return b=a.getItemFromKey(b).data,c=a.getItemFromKey(c).data,f(b,c)});this._sortedKeys=g},_findInsertionPos:function(a,b,c,d,e){for(var f=this._sortFunction,g=this._sortedKeys,h=Math.max(0,d||-1),i=Math.min(g.length,e||Number.MAX_VALUE),j=h;i>=h;){j=(h+i)/2>>>0;var k=g[j];if(!k)break;var l=this.getItemFromKey(k),m=f(l.data,c);if(0>m)h=j+1;else{if(0===m)return this._findStableInsertionPos(a,b,h,i,j,c);i=j-1}}return h},_findBeginningOfGroup:function(a,b,c,d,e){for(var f=0,g=a;g>=f;){a=(f+g)/2>>>0;var h=d[a],i=c.getItemFromKey(h),j=b(i.data,e);0>j?f=a+1:g=a-1}return f},_findEndOfGroup:function(a,b,c,d,e){for(var f=a,g=d.length;g>=f;){a=(f+g)/2>>>0;var h=d[a];if(!h)return d.length;var i=c.getItemFromKey(h),j=b(i.data,e);0>=j?f=a+1:g=a-1}return f},_findStableInsertionPos:function(a,b,c,d,e,f){var g=this._list,h=g.length,i=this._sortFunction,j=this._sortedKeys;if(h/2>b){for(var k=b-1;k>=0;k--){var l=g.getItem(k);if(0===i(l.data,f))return h-c>d?j.indexOf(l.key,c)+1:j.lastIndexOf(l.key,d)+1}return this._findBeginningOfGroup(e,i,g,j,f)}for(var k=b+1;h>k;k++){var l=g.getItem(k);if(0===i(l.data,f))return h-c>d?j.indexOf(l.key,c):j.lastIndexOf(l.key,d)}return this._findEndOfGroup(e,i,g,j,f)},_listItemChanged:function(a){var b=a.detail.key,c=a.detail.newValue,d=a.detail.oldValue,e=this._sortFunction;if(0===e(d,c)){var f=this.indexOfKey(b);this._notifyItemChanged(b,f,d,c,a.detail.oldItem,a.detail.newItem)}else this._listItemRemoved({detail:{key:b,index:a.detail.index,value:a.detail.oldValue,item:a.detail.oldItem}}),this._listItemInserted({detail:{key:b,index:a.detail.index,value:a.detail.newValue}})},_listItemInserted:function(a,b,c){var d=a.detail.key,e=a.detail.index,f=a.detail.value,g=this._findInsertionPos(d,e,f,b,c);this._sortedKeys.splice(g,0,d),this._notifyItemInserted(d,g,f)},_listItemMoved:function(a,b,c){var d=a.detail.key,e=a.detail.newIndex,f=a.detail.value,g=this._sortedKeys,h=g.indexOf(d,b);g.splice(h,1);var i=this._findInsertionPos(d,e,f,b,c);g.splice(i,0,d),i!==h&&this._notifyItemMoved(d,h,i,f)},_listItemMutated:function(a){var b=a.detail.key,c=a.detail.value,d=a.detail.item,e=this._list.indexOfKey(b),f=this._sortedKeys.indexOf(b);this._sortedKeys.splice(f,1);var g=this._findInsertionPos(b,e,c);return this._sortedKeys.splice(f,0,b),f===g?void this._notifyItemMutated(b,c,d):(this._listItemRemoved({detail:{key:b,index:e,value:c,item:d}}),void this._listItemInserted({detail:{key:b,index:e,value:c}}))},_listItemRemoved:function(a,b){var c=a.detail.key,d=a.detail.value,e=a.detail.item,f=this._sortedKeys,g=f.indexOf(c,b);f.splice(g,1),this._notifyItemRemoved(c,g,d,e)},_listReload:function(){this._initSortedKeys(),this._notifyReload()},length:{get:function(){return this._sortedKeys.length},set:function(a){if(!("number"==typeof a&&a>=0))throw new d("WinJS.Binding.List.IllegalLength",m.illegalListLength);var b=this.length;b>a&&this.splice(a,b-a)}},getItem:function(a){return a=k(a),this.getItemFromKey(this._sortedKeys[a])},indexOfKey:function(a){return this._sortedKeys.indexOf(a)},notifyMutated:function(a){a=k(a),this._notifyMutatedFromKey(this._sortedKeys[a])},setAt:function(a,b){a=k(a),this._setAtKey(this._sortedKeys[a],b)},_spliceFromKey:function(a,b){if(arguments.length>2){var c=i(arguments);c[1]=0,this._list._spliceFromKey.apply(this._list,c)}var d=[];if(b){for(var e=[],f=this._sortedKeys,g=f.indexOf(a),h=g,j=f.length;j>h&&b>h-g;h++)e.push(f[h]);var k=this;e.forEach(function(a){d.push(k._list._spliceFromKey(a,1)[0])})}return d}},{supportedForProcessing:!1})}),GroupedSortedListProjection:b.Namespace._lazy(function(){return b.Class.derive(p.SortedListProjection,function(a,b,c,d){this._list=a,this._addListListener("itemchanged",this._listGroupedItemChanged),this._addListListener("iteminserted",this._listGroupedItemInserted),this._addListListener("itemmoved",this._listGroupedItemMoved),this._addListListener("itemmutated",this._listGroupedItemMutated),this._addListListener("itemremoved",this._listGroupedItemRemoved),this._addListListener("reload",this._listReload),this._sortFunction=function(a,c){return a=b(a),c=b(c),d?d(a,c):c>a?-1:a===c?0:1},this._groupKeyOf=b,this._groupDataOf=c,this._initSortedKeys(),this._initGroupedItems()},{_groupKeyOf:null,_groupDataOf:null,_groupedItems:null,_initGroupedItems:function(){for(var a={},b=this._list,c=this._groupKeyOf,d=0,e=b.length;e>d;d++){var f=j(b.getItem(d));f.groupKey=c(f.data),a[f.key]=f}this._groupedItems=a},_groupsProjection:null,_listGroupedItemChanged:function(a){var b=a.detail.key,c=a.detail.oldValue,d=a.detail.newValue,e=this._groupedItems,f=e[b],g=j(f);g.data=d,g.groupKey=this._groupKeyOf(d),e[b]=g;var h;f.groupKey===g.groupKey?(h=this.indexOfKey(b),this._notifyItemChanged(b,h,c,d,f,g)):(h=a.detail.index,this._listItemChanged({detail:{key:b,index:h,oldValue:c,newValue:d,oldItem:f,newItem:g}}))},_listGroupedItemInserted:function(a){var b=a.detail.key,c=a.detail.value,d=this._groupKeyOf(c);this._groupedItems[b]={handle:b,key:b,data:c,groupKey:d};var e,f;if(this._groupsProjection){var g=this._groupsProjection._groupItems[d];g&&(e=g.firstItemIndexHint,f=e+g.groupSize)}this._listItemInserted(a,e,f)},_listGroupedItemMoved:function(a){var b,c,d=this._groupedItems[a.detail.key].groupKey;if(this._groupsProjection){var e=this._groupsProjection._groupItems[d];b=e.firstItemIndexHint,c=b+e.groupSize}this._listItemMoved(a,b,c)},_listGroupedItemMutated:function(a){var b=a.detail.key,c=a.detail.value,d=this._groupedItems,e=d[b],f=this._groupKeyOf(c);if(e.groupKey===f)this._notifyItemMutated(b,c,e);else{var g=j(e);g.groupKey=f,d[b]=g;var h=this._list.indexOfKey(b);this._listItemRemoved({detail:{key:b,index:h,value:c,item:e}}),this._listItemInserted({detail:{key:b,index:h,value:c}})}},_listGroupedItemRemoved:function(a){var b=a.detail.key,c=a.detail.index,d=a.detail.value,e=this._groupedItems,f=e[b];delete e[b];var g,h;if(this._groupsProjection){var i=this._groupsProjection._groupItems[f.groupKey];g=i.firstItemIndexHint,h=g+i.groupSize}this._listItemRemoved({detail:{key:b,index:c,value:d,item:f}},g,h)},_listReload:function(){this._initGroupedItems(),p.SortedListProjection.prototype._listReload.call(this)},groups:{get:function(){return null===this._groupsProjection&&(this._groupsProjection=new p.GroupsListProjection(this,this._groupKeyOf,this._groupDataOf)),this._groupsProjection}},getItemFromKey:function(a){return this._groupedItems[a]}},{supportedForProcessing:!1})}),GroupsListProjection:b.Namespace._lazy(function(){return b.Class.derive(p.ListBase,function(a,b,c){this._list=a,this._addListListener("itemchanged",this._listItemChanged),this._addListListener("iteminserted",this._listItemInserted),this._addListListener("itemmoved",this._listItemMoved),this._addListListener("itemremoved",this._listItemRemoved),this._addListListener("reload",this._listReload),this._groupKeyOf=b,this._groupDataOf=c,this._initGroupKeysAndItems()},{_list:null,_addListListener:function(a,b){this._list.addEventListener(a,b.bind(this))},_groupDataOf:null,_groupKeyOf:null,_groupOf:function(a){return this.getItemFromKey(this._groupKeyOf(a.data))},_groupKeys:null,_groupItems:null,_initGroupKeysAndItems:function(){for(var a,b=this._groupDataOf,c=this._list,d={},e=[],f=null,g=null,h=0,i=c.length;i>h;h++){var j=c.getItem(h),k=j.groupKey;k!==f?(g&&(g.groupSize=a),a=1,f=k,g={handle:k,key:k,data:b(j.data),firstItemKey:j.key,firstItemIndexHint:h},d[k]=g,e.push(k)):a++}g&&(g.groupSize=a),this._groupKeys=e,this._groupItems=d},_listItemChanged:function(a){var b=a.detail.key,c=a.detail.index,d=a.detail.newValue,e=this._list,f=e.getItemFromKey(b).groupKey,g=this._groupItems,h=g[f];if(h.firstItemIndexHint===c){var i=j(h);i.data=this._groupDataOf(d),i.firstItemKey=b,g[f]=i,this._notifyItemChanged(f,this._groupKeys.indexOf(f),h.data,i.data,h,i)}},_listItemInserted:function(a){var b,c,d,e,f,g=a.detail.key,h=a.detail.index,i=a.detail.value,k=this._list,l=k.getItemFromKey(g).groupKey,m=this._groupItems,n=this._groupKeys,o=m[l];if(o)c=o,d=j(c),d.groupSize++,c.firstItemIndexHint===h&&(d.groupData=this._groupDataOf(i),d.firstItemKey=g,d.firstItemIndexHint=h),m[l]=d,b=n.indexOf(l),this._notifyItemChanged(l,b,c.data,d.data,c,d);else{for(e=0,f=n.length;f>e&&(o=m[n[e]],!(o.firstItemIndexHint>=h));e++);b=e,o={handle:l,key:l,data:this._groupDataOf(i),groupSize:1,firstItemKey:g,firstItemIndexHint:h},n.splice(b,0,l),m[l]=o,this._notifyItemInserted(l,b,o.data)}for(e=b+1,f=n.length;f>e;e++)c=m[n[e]],d=j(c),d.firstItemIndexHint++,m[d.key]=d,this._notifyItemChanged(d.key,e,c.data,d.data,c,d)},_listItemMoved:function(a){var b=a.detail.key,c=a.detail.oldIndex,d=a.detail.newIndex,e=this._list,f=e.getItemFromKey(b).groupKey,g=this._groupItems,h=g[f];if(h.firstItemIndexHint===d||h.firstItemIndexHint===c){var i=e.getItem(h.firstItemIndexHint),k=j(h);k.data=this._groupDataOf(i.data),k.firstItemKey=i.key,g[f]=k,this._notifyItemChanged(f,this._groupKeys.indexOf(f),h.data,k.data,h,k)}},_listItemRemoved:function(a){var b,c,d=a.detail.index,e=a.detail.item,f=this._groupItems,g=this._groupKeys,h=e.groupKey,i=f[h],k=g.indexOf(h);if(1===i.groupSize)g.splice(k,1),delete f[h],this._notifyItemRemoved(h,k,i.data,i),k--;else{if(b=i,c=j(b),c.groupSize--,b.firstItemIndexHint===d){var l=this._list.getItem(d);c.data=this._groupDataOf(l.data),c.firstItemKey=l.key}f[h]=c,this._notifyItemChanged(h,k,b.data,c.data,b,c)}for(var m=k+1,n=g.length;n>m;m++)b=f[g[m]],c=j(b),c.firstItemIndexHint--,f[c.key]=c,this._notifyItemChanged(c.key,m,b.data,c.data,b,c)},_listReload:function(){this._initGroupKeysAndItems(),this._notifyReload()},length:{get:function(){return this._groupKeys.length}},getItem:function(a){return a=k(a),this._groupItems[this._groupKeys[a]]},getItemFromKey:function(a){return this._groupItems[a]},indexOfKey:function(a){return this._groupKeys.indexOf(a)}},{supportedForProcessing:!1})})});b.Namespace._moduleDefine(a,"WinJS.Binding",{List:b.Namespace._lazy(function(){return b.Class.derive(p.ListBaseWithMutators,function(a,b){if(this._currentKey=0,this._keys=null,this._keyMap={},b=b||o,this._proxy=b.proxy,this._binding=b.binding,this._proxy){if(Object.keys(a).length!==a.length)throw new d("WinJS.Binding.List.NotSupported",m.sparseArrayNotSupported);this._data=a,this._currentKey=a.length}else if(a){for(var c=this._keyMap,e=0,f=0,h=a.length;h>f;f++)if(f in a){var i=a[f];this._binding&&(i=g.as(i));var j=e.toString();e++,c[j]={handle:j,key:j,data:i}}e!==f&&this._initializeKeys(),this._currentKey=e}},{_currentKey:0,_keys:null,_keyMap:null,
-_modifyingData:0,_initializeKeys:function(){if(!this._keys){var a=[];if(this._data){for(var b=this._keyMap,c=this._data,d=0,e=c.length;e>d;d++)if(d in c){var f=d.toString();if(a[d]=f,!(f in b)){var h=c[d];this._binding&&(h=g.as(h)),b[f]={handle:f,key:f,data:h}}}}else Object.keys(this._keyMap).forEach(function(b){a[b>>>0]=b});this._keys=a}},_lazyPopulateEntry:function(a){if(this._data&&a in this._data){var b=this._data[a];this._binding&&(b=g.as(b));var c=a.toString(),d={handle:c,key:c,data:b};return this._keyMap[d.key]=d,d}},_assignKey:function(){return(++this._currentKey).toString()},length:{get:function(){return this._data?this._data.length:this._keys?this._keys.length:this._currentKey},set:function(a){if(!("number"==typeof a&&a>=0))throw new d("WinJS.Binding.List.IllegalLength",m.illegalListLength);this._initializeKeys();var b=this.length;if(b>a?this.splice(a,b-a):a=b,this._data){this._modifyingData++;try{this._data.length=a}finally{this._modifyingData--}}this._keys&&(this._keys.length=a)}},getItem:function(a){var b,c;return a=k(a),this._keys?(c=this._keys[a],b=c&&this._keyMap[c]):(c=a.toString(),b=this._keyMap[c]||this._lazyPopulateEntry(a)),b},getItemFromKey:function(a){var b;return b=this._keys||!this._data?this._keyMap[a]:this.getItem(a>>>0)},indexOfKey:function(a){var b=-1;if(this._keys)b=this._keys.indexOf(a);else{var c=a>>>0;c<this._currentKey&&(b=c)}return b},move:function(a,b){if(a=k(a),b=k(b),this._initializeKeys(),!(a===b||0>a||0>b||a>=this.length||b>=this.length)){if(this._data){this._modifyingData++;try{var c=this._data.splice(a,1)[0];this._data.splice(b,0,c)}finally{this._modifyingData--}}var d=this._keys.splice(a,1)[0];this._keys.splice(b,0,d),this._notifyItemMoved(d,a,b,this.getItemFromKey(d).data)}},notifyMutated:function(a){a=k(a);var b=this._keys?this._keys[a]:a.toString();this._notifyMutatedFromKey(b)},setAt:function(a,b){a=k(a),this._initializeKeys();var c=this.length;if(a===c)this.push(b);else if(c>a){if(this._data){this._modifyingData++;try{this._data[a]=b}finally{this._modifyingData--}}if(this._binding&&(b=g.as(b)),a in this._keys){var d=this._keys[a],e=this._keyMap[d],f=j(e);f.data=b,this._keyMap[d]=f,this._notifyItemChanged(d,a,e.data,b,e,f)}}},_setAtKey:function(a,b){this.setAt(this.indexOfKey(a),b)},reverse:function(){if(this._initializeKeys(),this._data){this._modifyingData++;try{this._data.reverse()}finally{this._modifyingData--}}return this._keys.reverse(),this._notifyReload(),this},sort:function(a){if(this._initializeKeys(),this._data){this._modifyingData++;try{this._data.sort(a)}finally{this._modifyingData--}}var b=this;return this._keys.sort(function(c,d){return c=b._keyMap[c],d=b._keyMap[d],a?a(c.data,d.data):(c=(c&&c.data||"").toString(),d=(c&&d.data||"").toString(),d>c?-1:c===d?0:1)}),this._notifyReload(),this},pop:function(){if(0!==this.length){this._initializeKeys();var a=this._keys.pop(),b=this._keyMap[a],c=b&&b.data;if(this._data){this._modifyingData++;try{this._data.pop()}finally{this._modifyingData--}}return delete this._keyMap[a],this._notifyItemRemoved(a,this._keys.length,c,b),c}},push:function(){this._initializeKeys();for(var a=arguments.length,b=0;a>b;b++){var c=arguments[b];this._binding&&(c=g.as(c));var d=this._assignKey();if(this._keys.push(d),this._data){this._modifyingData++;try{this._data.push(arguments[b])}finally{this._modifyingData--}}this._keyMap[d]={handle:d,key:d,data:c},this._notifyItemInserted(d,this._keys.length-1,c)}return this.length},shift:function(){if(0!==this.length){this._initializeKeys();var a=this._keys.shift(),b=this._keyMap[a],c=b&&b.data;if(this._data){this._modifyingData++;try{this._data.shift()}finally{this._modifyingData--}}return delete this._keyMap[a],this._notifyItemRemoved(a,0,c,b),c}},unshift:function(){this._initializeKeys();for(var a=arguments.length,b=a-1;b>=0;b--){var c=arguments[b];this._binding&&(c=g.as(c));var d=this._assignKey();if(this._keys.unshift(d),this._data){this._modifyingData++;try{this._data.unshift(arguments[b])}finally{this._modifyingData--}}this._keyMap[d]={handle:d,key:d,data:c},this._notifyItemInserted(d,0,c)}return this.length},splice:function(a,b,c){a=k(a),this._initializeKeys(),a=Math.max(0,this._normalizeIndex(a)),b=Math.max(0,Math.min(b||0,this.length-a));for(var d=[];b;){var e=this._keys[a],f=this._keyMap[e],h=f&&f.data;if(d.push(h),this._keys.splice(a,1),this._data){this._modifyingData++;try{this._data.splice(a,1)}finally{this._modifyingData--}}delete this._keyMap[e],this._notifyItemRemoved(e,a,h,f),--b}if(arguments.length>2)for(var i=2,j=arguments.length;j>i;i++){var l=arguments[i];this._binding&&(l=g.as(l));var m=Math.min(a+i-2,this.length),n=this._assignKey();if(this._keys.splice(m,0,n),this._data){this._modifyingData++;try{this._data.splice(m,0,arguments[i])}finally{this._modifyingData--}}this._keyMap[n]={handle:n,key:n,data:l},this._notifyItemInserted(n,m,l)}return d},_spliceFromKey:function(a){this._initializeKeys();var b=i(arguments);return b[0]=this._keys.indexOf(a),this.splice.apply(this,b)}},{supportedForProcessing:!1})})})}),define("WinJS/Res",["exports","./Core/_Global","./Core/_Base","./Core/_BaseUtils","./Core/_ErrorFromName","./Core/_Resources","./ControlProcessor/_OptionsParser","./Promise"],function(a,b,c,d,e,f,g,h){"use strict";function i(a,c){a=a||b.document.body;var c=c||0;if(4>c){if(0===c&&a.getAttribute){var f=a.getAttribute("data-win-res");if(f){var i=g.optionsParser(f);l(a,a,i,c)}}var j="[data-win-res],[data-win-control]",k=a.querySelectorAll(j);if(0===k.length)return h.as(a);for(var n=0,p=k.length;p>n;n++){var q=k[n];if(q.winControl&&q.winControl.constructor&&q.winControl.constructor.isDeclarativeControlContainer){var r=q.winControl.constructor.isDeclarativeControlContainer;"function"==typeof r&&(r=o(r),r(q.winControl,m),n+=q.querySelectorAll(j).length)}if(q.hasAttribute("data-win-res")){var i=g.optionsParser(q.getAttribute("data-win-res"));l(q,q,i,c)}}}else if(d.validation)throw new e("WinJS.Res.NestingExceeded","NestingExceeded");return h.as(a)}function j(a,b){for(var c=Object.keys(b),e=0,g=c.length;g>e;e++){var h=c[e],i=b[h],j=f.getString(i);j&&j.empty?d.validation&&k(i):(a.setAttribute(h,j.value),void 0!==j.lang&&void 0!==a.lang&&a.lang!==j.lang&&(a.lang=j.lang))}}function k(a){throw new e("WinJS.Res.NotFound",f._formatString("NotFound: {0}",a))}function l(a,b,c,e){var g=Object.keys(c);b=o(b);for(var h=0,m=g.length;m>h;h++){var n=g[h],p=c[n];if("string"==typeof p){var q=f.getString(p);q&&q.empty?d.validation&&k(p):(b[n]=q.value,void 0!==q.lang&&void 0!==a.lang&&a.lang!==q.lang&&(a.lang=q.lang),"innerHTML"===n&&i(b,e+1))}else a===b&&"attributes"===n?j(a,p):l(a,b[n],p,e)}}function m(a){if(!n)return d.ready().then(function(){return n=!0,i(a)});try{return i(a)}catch(b){return h.wrapError(b)}}var n=!1,o=d.requireSupportedForProcessing;c.Namespace._moduleDefine(a,"WinJS.Resources",{processAll:m})}),define("WinJS/Pages/_BasePage",["exports","../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_WriteProfilerMark","../Promise","../Utilities/_Control","../Utilities/_Dispose","../Utilities/_ElementUtilities"],function(a,b,c,d,e,f,g,h,i){"use strict";function j(a){var c=b.document.createElement("a");return c.href=a,c.href}function k(a){return b.document.location.href.toLowerCase()===a.toLowerCase()}function l(a,h){var l=m(a);return a=j(a),l||(l=c.Class.define(function(c,g,h,j){var l=this;this._disposed=!1,this.element=c=c||b.document.createElement("div"),i.addClass(c,"win-disposable"),c.msSourceLocation=a,this.uri=a,this.selfhost=k(a),c.winControl=this,i.addClass(c,"pagecontrol");var m=" uri='"+a+"'"+d._getProfilerMarkIdentifier(this.element);e("WinJS.UI.Pages:createPage"+m+",StartTM");var n=f.wrap().then(function(){return l.load(a)}),o=n.then(function(a){return f.join({loadResult:a,initResult:l.init(c,g)})}).then(function(a){return l.render(c,g,a.loadResult)});this.elementReady=o.then(function(){return c}),this.renderComplete=o.then(function(){return l.process(c,g)}).then(function(){return l.processed(c,g)}).then(function(){return l});var p=function(){h&&h(l),e("WinJS.UI.Pages:createPage"+m+",StopTM")};this.renderComplete.then(p,p),this.readyComplete=this.renderComplete.then(function(){return j}).then(function(){return l.ready(c,g),l}).then(null,function(a){return l.error(a)})},p),l=c.Class.mix(l,g.DOMEventMixin),o[a.toLowerCase()]=l),h&&(l=c.Class.mix(l,h)),l.selfhost=k(a),l}function m(a){return a=j(a),o[a.toLowerCase()]}function n(a){a=j(a),delete o[a.toLowerCase()]}if(b.document){var o={},p={dispose:function(){this._disposed||(this._disposed=!0,h.disposeSubTree(this.element),this.element=null)},load:function(a){},init:function(a,b){},process:function(a,b){},processed:function(a,b){},render:function(a,b,c){},ready:function(a,b){},error:function(a){return f.wrapError(a)}};c.Namespace._moduleDefine(a,null,{abs:j,define:l,get:m,remove:n,viewMap:o})}}),define("WinJS/Pages",["exports","./Core/_Global","./Core/_Base","./Core/_BaseUtils","./ControlProcessor","./Fragments","./Pages/_BasePage","./Promise"],function(a,b,c,d,e,f,g,h){"use strict";function i(a,e){var f=g.get(a);return f||(f=g.define(a,m)),e&&(f=c.Class.mix(f,e)),f.selfhost&&d.ready(function(){l(g.abs(a),b.document.body)},!0),f}function j(a){var b=g.get(a);return b||(b=i(a)),b}function k(a){f.clearCache(g.abs(a)),g.remove(a)}function l(a,b,c,d){var e=j(a),f=new e(b,c,null,d);return f.renderComplete.then(null,function(a){return h.wrapError({error:a,page:f})})}if(b.document){var m={load:function(a){return this.selfhost?void 0:f.renderCopy(g.abs(a))},process:function(a,b){return e.processAll(a)},render:function(a,b,c){return this.selfhost||a.appendChild(c),a}};c.Namespace._moduleDefine(a,"WinJS.UI.Pages",{define:i,get:j,_remove:k,render:l,_viewMap:g.viewMap})}}),define("WinJS/Controls/HtmlControl",["exports","../Core/_Global","../Core/_Base","../Pages"],function(a,b,c,d){"use strict";b.document&&c.Namespace._moduleDefine(a,"WinJS.UI",{HtmlControl:c.Class.define(function(a,b,c){d.render(b.uri,a,b).then(c,function(){c()})})})}),define("base",["WinJS/Core/_WinJS","WinJS/Core","WinJS/Promise","WinJS/_Signal","WinJS/Scheduler","WinJS/Utilities","WinJS/XYFocus","WinJS/Fragments","WinJS/Application","WinJS/Navigation","WinJS/Animations","WinJS/Binding","WinJS/BindingTemplate","WinJS/BindingList","WinJS/Res","WinJS/Pages","WinJS/ControlProcessor","WinJS/Controls/HtmlControl"],function(a){"use strict";return a.Namespace.define("WinJS.Utilities",{_require:require,_define:define}),a}),require(["WinJS/Core/_WinJS","base"],function(a){globalObject.WinJS=a,"undefined"!=typeof module&&(module.exports=a)}),globalObject.WinJS})}();
-//# sourceMappingURL=base.min.js.map
\ No newline at end of file
diff --git a/node_modules/winjs/js/base.min.js.map b/node_modules/winjs/js/base.min.js.map
deleted file mode 100644
index 9a9f3f5..0000000
--- a/node_modules/winjs/js/base.min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["base.js"],"names":["globalObject","window","self","global","factory","define","amd","msWriteProfilerMark","exports","nodeName","WinJS","require","normalize","id","dependencies","parent","split","pop","map","dep","parts","current","slice","forEach","part","push","join","resolve","depName","defined","Error","resolved","load","deps","apply","Array","isArray","mod","indexOf","_Global","markSupportedForProcessing","func","supportedForProcessing","hasWinRT","Windows","_setImmediate","setImmediate","bind","handler","setTimeout","_WinJS","_BaseCoreUtils","_WriteProfilerMark","initializeProperties","target","members","prefix","properties","i","len","keys","Object","length","key","enumerable","charCodeAt","member","undefined","value","get","set","configurable","writable","setName","defineProperties","createNamespace","parentNamespace","name","currentNamespace","namespaceFragments","splice","namespaceName","defineProperty","defineWithParent","lazy","f","result","state","LazyStates","uninitialized","initialized","working","moduleDefine","publicNS","_rootNamespace","Namespace","create","prototype","_lazy","_moduleDefine","constructor","instanceMembers","staticMembers","derive","baseClass","basePrototype","mix","arguments","Class","_Base","ErrorFromName","message","this","msGetWeakWinRTProperty","msSetWeakWinRTProperty","APIs","isCoreWindowAvailable","UI","ViewManagement","InputPane","getForCurrentView","e","api","leaf","reduce","createEventProperty","eventPropStateName","userHandler","wrapper","evt","addEventListener","removeEventListener","createEventProperties","props","EventMixinEvent","type","detail","timeStamp","Date","now","bubbles","cancelable","currentTarget","defaultPrevented","_preventDefaultCalled","trusted","eventPhase","preventDefault","stopImmediatePropagation","_stopImmediatePropagationCalled","stopPropagation","eventMixin","_listeners","listener","useCapture","eventListeners","l","dispatchEvent","details","listeners","eventValue","_createEventProperty","tv/scrollViewerPageDown","tv/scrollViewerPageUp","ui/appBarAriaLabel","ui/appBarCommandAriaLabel","ui/appBarOverflowButtonAriaLabel","ui/autoSuggestBoxAriaLabel","ui/autoSuggestBoxAriaLabelInputNoPlaceHolder","ui/autoSuggestBoxAriaLabelInputPlaceHolder","ui/autoSuggestBoxAriaLabelQuery","_ui/autoSuggestBoxAriaLabelQuery.comment","ui/autoSuggestBoxAriaLabelSeparator","_ui/autoSuggestBoxAriaLabelSeparator.comment","ui/autoSuggestBoxAriaLabelResult","_ui/autoSuggestBoxAriaLabelResult.comment","ui/averageRating","ui/backbuttonarialabel","ui/chapterSkipBackMediaCommandDisplayText","ui/chapterSkipForwardMediaCommandDisplayText","ui/clearYourRating","ui/closedCaptionsLabelNone","ui/closedCaptionsMediaCommandDisplayText","ui/closeOverlay","ui/commandingSurfaceAriaLabel","ui/commandingSurfaceOverflowButtonAriaLabel","ui/datePicker","ui/fastForwardMediaCommandDisplayText","ui/fastForwardFeedbackDisplayText","ui/fastForwardFeedbackSlowMotionDisplayText","ui/flipViewPanningContainerAriaLabel","ui/flyoutAriaLabel","ui/goToFullScreenButtonLabel","ui/goToLiveMediaCommandDisplayText","ui/hubViewportAriaLabel","ui/listViewViewportAriaLabel","ui/mediaErrorAborted","ui/mediaErrorNetwork","ui/mediaErrorDecode","ui/mediaErrorSourceNotSupported","ui/mediaErrorUnknown","ui/mediaPlayerAudioTracksButtonLabel","ui/mediaPlayerCastButtonLabel","ui/mediaPlayerChapterSkipBackButtonLabel","ui/mediaPlayerChapterSkipForwardButtonLabel","ui/mediaPlayerClosedCaptionsButtonLabel","ui/mediaPlayerFastForwardButtonLabel","ui/mediaPlayerFullscreenButtonLabel","ui/mediaPlayerLiveButtonLabel","ui/mediaPlayerNextTrackButtonLabel","ui/mediaPlayerOverlayActiveOptionIndicator","ui/mediaPlayerPauseButtonLabel","ui/mediaPlayerPlayButtonLabel","ui/mediaPlayerPlayFromBeginningButtonLabel","ui/mediaPlayerPlayRateButtonLabel","ui/mediaPlayerPreviousTrackButtonLabel","ui/mediaPlayerRewindButtonLabel","ui/mediaPlayerStopButtonLabel","ui/mediaPlayerTimeSkipBackButtonLabel","ui/mediaPlayerTimeSkipForwardButtonLabel","ui/mediaPlayerToggleSnapButtonLabel","ui/mediaPlayerVolumeButtonLabel","ui/mediaPlayerZoomButtonLabel","ui/menuCommandAriaLabel","ui/menuAriaLabel","ui/navBarContainerViewportAriaLabel","ui/nextTrackMediaCommandDisplayText","ui/off","ui/on","ui/pauseMediaCommandDisplayText","ui/playFromBeginningMediaCommandDisplayText","ui/playbackRateHalfSpeedLabel","ui/playbackRateNormalSpeedLabel","ui/playbackRateOneAndHalfSpeedLabel","ui/playbackRateDoubleSpeedLabel","ui/playMediaCommandDisplayText","ui/pivotAriaLabel","ui/pivotViewportAriaLabel","ui/replayMediaCommandDisplayText","ui/rewindMediaCommandDisplayText","ui/rewindFeedbackDisplayText","ui/rewindFeedbackSlowMotionDisplayText","ui/searchBoxAriaLabel","ui/searchBoxAriaLabelInputNoPlaceHolder","ui/searchBoxAriaLabelInputPlaceHolder","ui/searchBoxAriaLabelButton","ui/seeMore","ui/selectAMPM","ui/selectDay","ui/selectHour","ui/selectMinute","ui/selectMonth","ui/selectYear","ui/settingsFlyoutAriaLabel","ui/stopMediaCommandDisplayText","ui/tentativeRating","ui/timePicker","ui/timeSeparator","ui/timeSkipBackMediaCommandDisplayText","ui/timeSkipForwardMediaCommandDisplayText","ui/toolbarAriaLabel","ui/toolbarOverflowButtonAriaLabel","ui/unrated","ui/userRating","ui/zoomMediaCommandDisplayText","ui/appBarIcons/previous","_ui/appBarIcons/previous.comment","ui/appBarIcons/next","_ui/appBarIcons/next.comment","ui/appBarIcons/play","_ui/appBarIcons/play.comment","ui/appBarIcons/pause","_ui/appBarIcons/pause.comment","ui/appBarIcons/edit","_ui/appBarIcons/edit.comment","ui/appBarIcons/save","_ui/appBarIcons/save.comment","ui/appBarIcons/clear","_ui/appBarIcons/clear.comment","ui/appBarIcons/delete","_ui/appBarIcons/delete.comment","ui/appBarIcons/remove","_ui/appBarIcons/remove.comment","ui/appBarIcons/add","_ui/appBarIcons/add.comment","ui/appBarIcons/cancel","_ui/appBarIcons/cancel.comment","ui/appBarIcons/accept","_ui/appBarIcons/accept.comment","ui/appBarIcons/more","_ui/appBarIcons/more.comment","ui/appBarIcons/redo","_ui/appBarIcons/redo.comment","ui/appBarIcons/undo","_ui/appBarIcons/undo.comment","ui/appBarIcons/home","_ui/appBarIcons/home.comment","ui/appBarIcons/up","_ui/appBarIcons/up.comment","ui/appBarIcons/forward","_ui/appBarIcons/forward.comment","ui/appBarIcons/right","_ui/appBarIcons/right.comment","ui/appBarIcons/back","_ui/appBarIcons/back.comment","ui/appBarIcons/left","_ui/appBarIcons/left.comment","ui/appBarIcons/favorite","_ui/appBarIcons/favorite.comment","ui/appBarIcons/camera","_ui/appBarIcons/camera.comment","ui/appBarIcons/settings","_ui/appBarIcons/settings.comment","ui/appBarIcons/video","_ui/appBarIcons/video.comment","ui/appBarIcons/sync","_ui/appBarIcons/sync.comment","ui/appBarIcons/download","_ui/appBarIcons/download.comment","ui/appBarIcons/mail","_ui/appBarIcons/mail.comment","ui/appBarIcons/find","_ui/appBarIcons/find.comment","ui/appBarIcons/help","_ui/appBarIcons/help.comment","ui/appBarIcons/upload","_ui/appBarIcons/upload.comment","ui/appBarIcons/emoji","_ui/appBarIcons/emoji.comment","ui/appBarIcons/twopage","_ui/appBarIcons/twopage.comment","ui/appBarIcons/leavechat","_ui/appBarIcons/leavechat.comment","ui/appBarIcons/mailforward","_ui/appBarIcons/mailforward.comment","ui/appBarIcons/clock","_ui/appBarIcons/clock.comment","ui/appBarIcons/send","_ui/appBarIcons/send.comment","ui/appBarIcons/crop","_ui/appBarIcons/crop.comment","ui/appBarIcons/rotatecamera","_ui/appBarIcons/rotatecamera.comment","ui/appBarIcons/people","_ui/appBarIcons/people.comment","ui/appBarIcons/closepane","_ui/appBarIcons/closepane.comment","ui/appBarIcons/openpane","_ui/appBarIcons/openpane.comment","ui/appBarIcons/world","_ui/appBarIcons/world.comment","ui/appBarIcons/flag","_ui/appBarIcons/flag.comment","ui/appBarIcons/previewlink","_ui/appBarIcons/previewlink.comment","ui/appBarIcons/globe","_ui/appBarIcons/globe.comment","ui/appBarIcons/trim","_ui/appBarIcons/trim.comment","ui/appBarIcons/attachcamera","_ui/appBarIcons/attachcamera.comment","ui/appBarIcons/zoomin","_ui/appBarIcons/zoomin.comment","ui/appBarIcons/bookmarks","_ui/appBarIcons/bookmarks.comment","ui/appBarIcons/document","_ui/appBarIcons/document.comment","ui/appBarIcons/protecteddocument","_ui/appBarIcons/protecteddocument.comment","ui/appBarIcons/page","_ui/appBarIcons/page.comment","ui/appBarIcons/bullets","_ui/appBarIcons/bullets.comment","ui/appBarIcons/comment","_ui/appBarIcons/comment.comment","ui/appBarIcons/mail2","_ui/appBarIcons/mail2.comment","ui/appBarIcons/contactinfo","_ui/appBarIcons/contactinfo.comment","ui/appBarIcons/hangup","_ui/appBarIcons/hangup.comment","ui/appBarIcons/viewall","_ui/appBarIcons/viewall.comment","ui/appBarIcons/mappin","_ui/appBarIcons/mappin.comment","ui/appBarIcons/phone","_ui/appBarIcons/phone.comment","ui/appBarIcons/videochat","_ui/appBarIcons/videochat.comment","ui/appBarIcons/switch","_ui/appBarIcons/switch.comment","ui/appBarIcons/contact","_ui/appBarIcons/contact.comment","ui/appBarIcons/rename","_ui/appBarIcons/rename.comment","ui/appBarIcons/pin","_ui/appBarIcons/pin.comment","ui/appBarIcons/musicinfo","_ui/appBarIcons/musicinfo.comment","ui/appBarIcons/go","_ui/appBarIcons/go.comment","ui/appBarIcons/keyboard","_ui/appBarIcons/keyboard.comment","ui/appBarIcons/dockleft","_ui/appBarIcons/dockleft.comment","ui/appBarIcons/dockright","_ui/appBarIcons/dockright.comment","ui/appBarIcons/dockbottom","_ui/appBarIcons/dockbottom.comment","ui/appBarIcons/remote","_ui/appBarIcons/remote.comment","ui/appBarIcons/refresh","_ui/appBarIcons/refresh.comment","ui/appBarIcons/rotate","_ui/appBarIcons/rotate.comment","ui/appBarIcons/shuffle","_ui/appBarIcons/shuffle.comment","ui/appBarIcons/list","_ui/appBarIcons/list.comment","ui/appBarIcons/shop","_ui/appBarIcons/shop.comment","ui/appBarIcons/selectall","_ui/appBarIcons/selectall.comment","ui/appBarIcons/orientation","_ui/appBarIcons/orientation.comment","ui/appBarIcons/import","_ui/appBarIcons/import.comment","ui/appBarIcons/importall","_ui/appBarIcons/importall.comment","ui/appBarIcons/browsephotos","_ui/appBarIcons/browsephotos.comment","ui/appBarIcons/webcam","_ui/appBarIcons/webcam.comment","ui/appBarIcons/pictures","_ui/appBarIcons/pictures.comment","ui/appBarIcons/savelocal","_ui/appBarIcons/savelocal.comment","ui/appBarIcons/caption","_ui/appBarIcons/caption.comment","ui/appBarIcons/stop","_ui/appBarIcons/stop.comment","ui/appBarIcons/showresults","_ui/appBarIcons/showresults.comment","ui/appBarIcons/volume","_ui/appBarIcons/volume.comment","ui/appBarIcons/repair","_ui/appBarIcons/repair.comment","ui/appBarIcons/message","_ui/appBarIcons/message.comment","ui/appBarIcons/page2","_ui/appBarIcons/page2.comment","ui/appBarIcons/calendarday","_ui/appBarIcons/calendarday.comment","ui/appBarIcons/calendarweek","_ui/appBarIcons/calendarweek.comment","ui/appBarIcons/calendar","_ui/appBarIcons/calendar.comment","ui/appBarIcons/characters","_ui/appBarIcons/characters.comment","ui/appBarIcons/mailreplyall","_ui/appBarIcons/mailreplyall.comment","ui/appBarIcons/read","_ui/appBarIcons/read.comment","ui/appBarIcons/link","_ui/appBarIcons/link.comment","ui/appBarIcons/accounts","_ui/appBarIcons/accounts.comment","ui/appBarIcons/showbcc","_ui/appBarIcons/showbcc.comment","ui/appBarIcons/hidebcc","_ui/appBarIcons/hidebcc.comment","ui/appBarIcons/cut","_ui/appBarIcons/cut.comment","ui/appBarIcons/attach","_ui/appBarIcons/attach.comment","ui/appBarIcons/paste","_ui/appBarIcons/paste.comment","ui/appBarIcons/filter","_ui/appBarIcons/filter.comment","ui/appBarIcons/copy","_ui/appBarIcons/copy.comment","ui/appBarIcons/emoji2","_ui/appBarIcons/emoji2.comment","ui/appBarIcons/important","_ui/appBarIcons/important.comment","ui/appBarIcons/mailreply","_ui/appBarIcons/mailreply.comment","ui/appBarIcons/slideshow","_ui/appBarIcons/slideshow.comment","ui/appBarIcons/sort","_ui/appBarIcons/sort.comment","ui/appBarIcons/manage","_ui/appBarIcons/manage.comment","ui/appBarIcons/allapps","_ui/appBarIcons/allapps.comment","ui/appBarIcons/disconnectdrive","_ui/appBarIcons/disconnectdrive.comment","ui/appBarIcons/mapdrive","_ui/appBarIcons/mapdrive.comment","ui/appBarIcons/newwindow","_ui/appBarIcons/newwindow.comment","ui/appBarIcons/openwith","_ui/appBarIcons/openwith.comment","ui/appBarIcons/contactpresence","_ui/appBarIcons/contactpresence.comment","ui/appBarIcons/priority","_ui/appBarIcons/priority.comment","ui/appBarIcons/uploadskydrive","_ui/appBarIcons/uploadskydrive.comment","ui/appBarIcons/gototoday","_ui/appBarIcons/gototoday.comment","ui/appBarIcons/font","_ui/appBarIcons/font.comment","ui/appBarIcons/fontcolor","_ui/appBarIcons/fontcolor.comment","ui/appBarIcons/contact2","_ui/appBarIcons/contact2.comment","ui/appBarIcons/folder","_ui/appBarIcons/folder.comment","ui/appBarIcons/audio","_ui/appBarIcons/audio.comment","ui/appBarIcons/placeholder","_ui/appBarIcons/placeholder.comment","ui/appBarIcons/view","_ui/appBarIcons/view.comment","ui/appBarIcons/setlockscreen","_ui/appBarIcons/setlockscreen.comment","ui/appBarIcons/settile","_ui/appBarIcons/settile.comment","ui/appBarIcons/cc","_ui/appBarIcons/cc.comment","ui/appBarIcons/stopslideshow","_ui/appBarIcons/stopslideshow.comment","ui/appBarIcons/permissions","_ui/appBarIcons/permissions.comment","ui/appBarIcons/highlight","_ui/appBarIcons/highlight.comment","ui/appBarIcons/disableupdates","_ui/appBarIcons/disableupdates.comment","ui/appBarIcons/unfavorite","_ui/appBarIcons/unfavorite.comment","ui/appBarIcons/unpin","_ui/appBarIcons/unpin.comment","ui/appBarIcons/openlocal","_ui/appBarIcons/openlocal.comment","ui/appBarIcons/mute","_ui/appBarIcons/mute.comment","ui/appBarIcons/italic","_ui/appBarIcons/italic.comment","ui/appBarIcons/underline","_ui/appBarIcons/underline.comment","ui/appBarIcons/bold","_ui/appBarIcons/bold.comment","ui/appBarIcons/movetofolder","_ui/appBarIcons/movetofolder.comment","ui/appBarIcons/likedislike","_ui/appBarIcons/likedislike.comment","ui/appBarIcons/dislike","_ui/appBarIcons/dislike.comment","ui/appBarIcons/like","_ui/appBarIcons/like.comment","ui/appBarIcons/alignright","_ui/appBarIcons/alignright.comment","ui/appBarIcons/aligncenter","_ui/appBarIcons/aligncenter.comment","ui/appBarIcons/alignleft","_ui/appBarIcons/alignleft.comment","ui/appBarIcons/zoom","_ui/appBarIcons/zoom.comment","ui/appBarIcons/zoomout","_ui/appBarIcons/zoomout.comment","ui/appBarIcons/openfile","_ui/appBarIcons/openfile.comment","ui/appBarIcons/otheruser","_ui/appBarIcons/otheruser.comment","ui/appBarIcons/admin","_ui/appBarIcons/admin.comment","ui/appBarIcons/street","_ui/appBarIcons/street.comment","ui/appBarIcons/map","_ui/appBarIcons/map.comment","ui/appBarIcons/clearselection","_ui/appBarIcons/clearselection.comment","ui/appBarIcons/fontdecrease","_ui/appBarIcons/fontdecrease.comment","ui/appBarIcons/fontincrease","_ui/appBarIcons/fontincrease.comment","ui/appBarIcons/fontsize","_ui/appBarIcons/fontsize.comment","ui/appBarIcons/cellphone","_ui/appBarIcons/cellphone.comment","ui/appBarIcons/print","_ui/appBarIcons/print.comment","ui/appBarIcons/share","_ui/appBarIcons/share.comment","ui/appBarIcons/reshare","_ui/appBarIcons/reshare.comment","ui/appBarIcons/tag","_ui/appBarIcons/tag.comment","ui/appBarIcons/repeatone","_ui/appBarIcons/repeatone.comment","ui/appBarIcons/repeatall","_ui/appBarIcons/repeatall.comment","ui/appBarIcons/outlinestar","_ui/appBarIcons/outlinestar.comment","ui/appBarIcons/solidstar","_ui/appBarIcons/solidstar.comment","ui/appBarIcons/calculator","_ui/appBarIcons/calculator.comment","ui/appBarIcons/directions","_ui/appBarIcons/directions.comment","ui/appBarIcons/target","_ui/appBarIcons/target.comment","ui/appBarIcons/library","_ui/appBarIcons/library.comment","ui/appBarIcons/phonebook","_ui/appBarIcons/phonebook.comment","ui/appBarIcons/memo","_ui/appBarIcons/memo.comment","ui/appBarIcons/microphone","_ui/appBarIcons/microphone.comment","ui/appBarIcons/postupdate","_ui/appBarIcons/postupdate.comment","ui/appBarIcons/backtowindow","_ui/appBarIcons/backtowindow.comment","ui/appBarIcons/fullscreen","_ui/appBarIcons/fullscreen.comment","ui/appBarIcons/newfolder","_ui/appBarIcons/newfolder.comment","ui/appBarIcons/calendarreply","_ui/appBarIcons/calendarreply.comment","ui/appBarIcons/unsyncfolder","_ui/appBarIcons/unsyncfolder.comment","ui/appBarIcons/reporthacked","_ui/appBarIcons/reporthacked.comment","ui/appBarIcons/syncfolder","_ui/appBarIcons/syncfolder.comment","ui/appBarIcons/blockcontact","_ui/appBarIcons/blockcontact.comment","ui/appBarIcons/switchapps","_ui/appBarIcons/switchapps.comment","ui/appBarIcons/addfriend","_ui/appBarIcons/addfriend.comment","ui/appBarIcons/touchpointer","_ui/appBarIcons/touchpointer.comment","ui/appBarIcons/gotostart","_ui/appBarIcons/gotostart.comment","ui/appBarIcons/zerobars","_ui/appBarIcons/zerobars.comment","ui/appBarIcons/onebar","_ui/appBarIcons/onebar.comment","ui/appBarIcons/twobars","_ui/appBarIcons/twobars.comment","ui/appBarIcons/threebars","_ui/appBarIcons/threebars.comment","ui/appBarIcons/fourbars","_ui/appBarIcons/fourbars.comment","ui/appBarIcons/scan","_ui/appBarIcons/scan.comment","ui/appBarIcons/preview","_ui/appBarIcons/preview.comment","ui/appBarIcons/hamburger","_ui/appBarIcons/hamburger.comment","_WinRT","_Events","defaultStrings","_getWinJSString","getString","empty","_getStringBuiltIn","resourceId","str","formatString","string","args","replace","unused","left","right","index","illegalLeft","illegalRight","strings","malformedFormatStringInput","resourceMap","resourceContext","mrtEventHook","contextChangedET","ListenerType","createEvent","ApplicationModel","Resources","Core","ResourceManager","resContext","_getResourceContext","qualifierValues","qualifier","changed","defaultContext","_formatString","_getStringWinRT","mainResourceMap","getSubtree","stringValue","langValue","resCandidate","getValue","valueAsString","toString","_getStringJS","getQualifierValue","lang","document","context","ResourceContext","oncontextchanged","getStringImpl","nop","v","_traceAsyncOperationStarting","Debug","msTraceAsyncOperationStarting","_traceAsyncOperationCompleted","msTraceAsyncOperationCompleted","_traceAsyncCallbackStarting","msTraceAsyncCallbackStarting","_traceAsyncCallbackCompleted","msTraceAsyncCallbackCompleted","_ErrorFromName","_Trace","_","completed","promise","targetState","then","state_waiting","state_success_notify","_value","_setState","createErrorDetails","exception","error","detailsForHandledError","errorValue","_isException","errorId","_errorId","detailsForChainedError","setErrorInfo","detailsForError","error_number","detailsForException","exceptionValue","done","onComplete","onError","onProgress","asyncOpID","pushListener","c","p","onerrorDetails","callonerror","state_error_notify","notifySuccess","queue","MS_ASYNC_OP_STATUS_SUCCESS","_setCompleteValue","ex","_setExceptionValue","_state","CompletePromise","call","notifyError","errorID","canceledName","MS_ASYNC_OP_STATUS_CANCELED","MS_ASYNC_OP_STATUS_ERROR","asyncCallbackStarted","handlesOnError","_setChainedErrorValue","ErrorPromise","onerrorDetailsGenerator","promiseEventListeners","errorET","progress","_progress","isException","setErrorValue","state_error","setCompleteValue","state_success","ThenPromise","timeout","timeoutMS","Promise","clearTimeout","timeoutWithPromise","cancelPromise","cancel","cancelTimeout","setNonUserCodeExceptions","tagWithStack","tag","thenPromise","errorPromise","exceptionPromise","completePromise","all","state_created","state_working","state_waiting_canceled","state_canceled","state_canceling","enter","_completed","_error","_notify","_setErrorValue","waitedUpon","_chainedError","_cancelAction","shift","_cleanupAction","staticCanceledPromise","PromiseStateMachine","_nextState","_run","creator","_stack","_getStack","_creator","_doneHandler","ExceptionPromise","newValue","init","oncancel","_oncancel","complete","eventType","capture","any","values","canceled","as","is","errors","results","undefineds","pending","argDone","errorCount","canceledCount","Key","Done","thenEach","time","to","wrap","wrapError","_veryExpensiveTagWithStack","_veryExpensiveTagWithStack_tag","debuggerEnabled","stack","_cancelBlocker","input","output","_StateMachine","format","m","typeR","test","spaceR","defAction","formatLog","console","escape","s","WinJSLog","startLog","options","tags","el","RegExp","not","excludeTags","has","action","log","next","stopLog","_Log","_Resources","linkedListMixin","mixin","PREV","NEXT","prev","node","profilerMarkArgs","arg0","arg1","arg2","schedulerProfilerMark","operation","markerType","jobProfilerMark","job","argProvided","illegal","setState","changePriority","priority","_setPriority","dumpList","reverse","dumpMarker","marker","pos","dumpJob","highWaterMark","head","priorities","MarkerNode","JobNode","retrieveState","logJob","isRunning","markerFromPriority","jobCount","runningJob","Priority","min","_nextJob","drainQueue","isEmpty","currentDrainPriority","drainStarting","drainStopping","addDrainListener","immediateYield","removeDrainListener","notifyCurrentDrainListener","notifyDrainListeners","notifiedSomebody","drainPriority","pumpingPriority","toWwaPriority","winjsPriority","aboveNormal","MSApp","HIGH","belowNormal","NORMAL","IDLE","isEqualOrHigherWwaPriority","priority1","priority2","wwaPriorityToInt","isHigherWwaPriority","wwaTaskScheduledAtPriorityHigherThan","wwaPriority","isTaskScheduledAtPriorityOrHigher","addJobAtHeadOfPriority","_insertJobAfter","addJobAtTailOfPriority","_nextMarker","_insertJobBefore","clampPriority","Math","max","MIN_PRIORITY","MAX_PRIORITY","run","scheduled","pumping","didWork","lastLoggedPriority","ranJobSuccessfully","timesliceExhausted","yieldForPriorityBoundary","start","end","TIME_SLICE","shouldYield","_execute","wwaPrevHighWaterMark","wwaHighWaterMark","usingWwaScheduler","foundAJob","reasonForYielding","scheduledWwaPriority","startRunning","priorityWwa","scheduledVersion","runner","executedVersion","execAsyncAtPriority","requestDrain","globalDrainId","execHigh","callback","execAtPriority","createOwnerToken","OwnerToken","schedule","work","thisArg","normal","jobId","globalJobId","getCurrentPriority","high","idle","makeSchedulePromise","promiseValue","jobName","_linkedListMixin","jobInfoIsNoLongerValid","_id","_work","_context","_name","_asyncOpID","owner","_owner","_remove","_add","_priority","setPriority","pause","resume","execute","_executeDone","executeDone","_blockedDone","blockedDone","YieldPolicy","continue","block","JobInfo","_job","_result","_yieldPolicy","_shouldYield","_throwIfDisabled","setPromise","setWork","_disablePublicApi","_publicApiDisabled","_jobs","cancelAll","jobs","jobIds","State","state_scheduled","state_paused","state_running","state_running_paused","state_running_resumed","state_running_canceled","state_running_canceled_blocked","state_cooperative_yield","state_cooperative_yield_paused","state_blocked","state_blocked_waiting","state_blocked_paused","state_blocked_paused_waiting","state_blocked_canceled","state_complete","_removeJob","jobInfo","yieldPolicy","initialPriority","newWork","_insertMarkerAfter","scheduleWithHost","MSAppStubs","performance","currentPriority","schedulePromiseHigh","schedulePromiseAboveNormal","schedulePromiseNormal","schedulePromiseBelowNormal","schedulePromiseIdle","_JobNode","_JobInfo","_OwnerToken","_dumpList","_isEmpty","_usingWwaScheduler","_MSApp","_TIME_SLICE","Scheduler","getMemberFiltered","root","filter","getMember","getCamelCasedName","styleName","charAt","x","toUpperCase","addPrefixToCamelCasedName","addPrefixToCSSName","toLowerCase","getBrowserStyleEquivalents","equivalents","docStyle","documentElement","style","stylePrefixesToTest","styles","prefixesUsedOnStyles","originalName","styleToTest","j","prefixLen","cssName","scriptName","animationPrefix","keyframes","getBrowserEventEquivalents","animationEventPrefixes","animationEvents","eventObject","events","eventToTest","chosenPrefix","eventsLen","eventName","throttledFunction","delay","fn","makeThrottlePromise","throttlePromise","pendingCallPromise","nextContext","nextArgs","requestAnimationWorker","notSupportedForProcessing","requestAnimationId","requestAnimationHandlers","validation","platform","navigator","isiOS","_setHasWinRT","_setIsiOS","_isiOS","_getMemberFiltered","_browserStyleEquivalents","_browserEventEquivalents","_getCamelCasedName","ready","async","err","readyState","_testReadyState","body","strictProcessing","requireSupportedForProcessing","location","HTMLIFrameElement","frames","_requestAnimationFrame","requestAnimationFrame","handle","toProcess","_cancelAnimationFrame","cancelAnimationFrame","_yieldForEvents","_yieldForDomModification","_throttledFunction","_shallowCopy","a","_mergeAll","_merge","b","list","o","k","_getProfilerMarkIdentifier","element","profilerMarkIdentifier","className","_now","_version","SignalPromise","Signal","_promise","_Signal","setOptions","control","_setOptions","eventsOnly","ch1","ch2","substr","DOMEventMixin","_domElement","eventProperties","initEvent","_BaseUtils","getDefaultComputedStyle","defaultComputedStyle","CSS2Properties","cssProperty","_getComputedStyle","pseudoElement","getComputedStyle","removeEmpties","arr","getClassName","baseVal","setClassName","addClass","classList","add","namesToAdd","toAdd","names","found","saw","removeClass","namesToRemove","remove","namesToRemoveLen","original","removed","namesLen","toggleClass","toggle","trim","r","setAttribute","attribute","getAttribute","_clamp","lowerBound","upperBound","defaultValue","n","convertToPixels","_pixelsRE","_numberRE","previousValue","pixelLeft","round","parseFloat","getDimension","property","_convertToPrecisePixels","_getPreciseDimension","_getPreciseMargins","top","marginTop","marginRight","bottom","marginBottom","marginLeft","addListenerToEventMap","data","eventNameLowercase","_eventsMap","removeListenerFromEventMap","mappedEvents","mapping","lookupListeners","bubbleEvent","handlers","parentNode","prepareFocusEvent","relatedTarget","tagName","registerBubbleListener","touchEventTranslator","changedTouches","retVal","touchObject","pointerEventObject","PointerEventProxy","pointerType","_MSPointerEvent","MSPOINTER_TYPE_TOUCH","pointerId","identifier","isPrimary","screenX","screenY","clientX","clientY","pageX","pageY","radiusX","radiusY","rotationAngle","force","_currentTouch","newRetVal","mouseEventTranslator","MSPOINTER_TYPE_MOUSE","mspointerEventTranslator","registerPointerEvent","mouseWrapper","touchWrapper","mspointerWrapper","touchHandled","translations","eventTranslations","MSPointerEvent","_normalizedType","mspointer","mouse","touch","unregisterPointerEvent","determineRTLEnvironment","createElement","direction","innerHTML","appendChild","elementScroller","firstChild","scrollLeft","usingWebkitScrollCoordinates","usingFirefoxScrollCoordinates","removeChild","determinedRTLEnvironment","getAdjustedScrollPosition","computedStyle","scrollWidth","clientWidth","abs","scrollTop","setAdjustedScrollPosition","getScrollPosition","setScrollPosition","position","uniqueID","_uniqueID","uniqueElementIDCounter","ensureId","_getCursorPos","docElement","docScrollPos","dir","_getElementsByClasses","classes","querySelector","_zoomToDuration","_MSGestureEvent","MSGestureEvent","MSGESTURE_FLAG_BEGIN","MSGESTURE_FLAG_CANCEL","MSGESTURE_FLAG_END","MSGESTURE_FLAG_INERTIA","MSGESTURE_FLAG_NONE","_MSManipulationEvent","MSManipulationEvent","MS_MANIPULATION_STATE_ACTIVE","MS_MANIPULATION_STATE_CANCELLED","MS_MANIPULATION_STATE_COMMITTED","MS_MANIPULATION_STATE_DRAGGING","MS_MANIPULATION_STATE_INERTIA","MS_MANIPULATION_STATE_PRESELECT","MS_MANIPULATION_STATE_SELECTING","MS_MANIPULATION_STATE_STOPPED","MSPOINTER_TYPE_PEN","nativeSupportForFocusIn","activeElement","previousActiveElement","overrideProperties","__eventObject","that","propertyName","pointerdown","pointerup","pointermove","pointerenter","pointerover","pointerout","pointercancel","customEvents","focusout","register","unregister","focusin","PointerEvent","pointerEventEntry","MutationObserverShim","_callback","_toDispose","_attributeFilter","_scheduled","_pendingChanges","_observerCount","_handleCallback","_targetElements","observe","configuration","attributes","_addRemovableListener","attributeFilter","disconnect","disposeFunc","event","attrName","isAriaMutation","attributeName","_dispatchEvent","_isShim","_MutationObserver","MutationObserver","_resizeNotifier","ResizeNotifier","_handleResize","subscribe","_resizeEvent","_resizeClass","unsubscribe","resizables","querySelectorAll","GenericListener","objectName","object","registerThruWinJSCustomEvents","bubble","_getHandlers","_getListener","refCount","_addEventListener","_getEventName","_getClassName","_removeEventListener","captureSuffix","ev","targets","handled","originalEvent","doDefault","supportsSnapPoints","msManipulationViewsEnabled","userAgent","supportsTouchDetection","TouchEvent","_selectionPartsSelector","_dataKey","_supportsSnapPoints","_supportsTouchDetection","_ensureId","_createGestureRecognizer","MSGesture","doNothing","addPointer","stop","_elementsFromPoint","y","msElementsFromPoint","elementFromPoint","_matchesSelector","selectorString","matchesSelector","matches","msMatchesSelector","mozMatchesSelector","webkitMatchesSelector","_isSelectionRendered","itemBox","eventNameLower","entry","equivalentEvent","_initEventImpl","initType","_initMouseEvent","concat","_initPointerEvent","_PointerEventProxy","_bubbleEvent","_setPointerCapture","setPointerCapture","_releasePointerCapture","releasePointerCapture","_zoomTo","msZoomTo","initialPos","effectiveScrollLeft","_zoomToDestX","effectiveScrollTop","_zoomToDestY","cs","scrollLimitX","parseInt","width","paddingLeft","paddingRight","scrollLimitY","scrollHeight","height","paddingTop","paddingBottom","contentX","contentY","zoomToDestX","zoomToDestY","_zoomToId","thisZoomToId","xFactor","yFactor","update","t","_setActive","scroller","success","HTMLElement","setActive","focus","_GenericListener","_globalListener","_documentElementListener","_inputPaneListener","_addInsertedNotifier","hiddenElement","animationName","_inDom","contains","nodeInsertedHandler","_setFlexStyle","flexParams","styleObject","grow","msFlexPositive","webkitFlexGrow","flexGrow","shrink","msFlexNegative","webkitFlexShrink","flexShrink","basis","msFlexPreferredSize","webkitFlexBasis","flexBasis","backspace","tab","ctrl","alt","capsLock","space","pageUp","pageDown","home","leftArrow","upArrow","rightArrow","downArrow","insert","deleteKey","num0","num1","num2","num3","num4","num5","num6","num7","num8","num9","d","g","h","q","u","w","z","leftWindows","rightWindows","menu","numPad0","numPad1","numPad2","numPad3","numPad4","numPad5","numPad6","numPad7","numPad8","numPad9","multiply","subtract","decimalPoint","divide","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","NavigationView","NavigationMenu","NavigationUp","NavigationDown","NavigationLeft","NavigationRight","NavigationAccept","NavigationCancel","numLock","scrollLock","browserBack","browserForward","semicolon","equal","comma","dash","period","forwardSlash","graveAccent","GamepadA","GamepadB","GamepadX","GamepadY","GamepadRightShoulder","GamepadLeftShoulder","GamepadLeftTrigger","GamepadRightTrigger","GamepadDPadUp","GamepadDPadDown","GamepadDPadLeft","GamepadDPadRight","GamepadMenu","GamepadView","GamepadLeftThumbstick","GamepadRightThumbstick","GamepadLeftThumbstickUp","GamepadLeftThumbstickDown","GamepadLeftThumbstickRight","GamepadLeftThumbstickLeft","GamepadRightThumbstickUp","GamepadRightThumbstickDown","GamepadRightThumbstickRight","GamepadRightThumbstickLeft","openBracket","backSlash","closeBracket","singleQuote","IME","hasClass","_setAttribute","getRelativeLeft","elementPosition","_getPositionRelativeTo","parentPosition","getRelativeTop","childNodes","item","_isDOMElement","getContentWidth","border","padding","offsetWidth","_getPreciseContentWidth","getTotalWidth","margin","_getPreciseTotalWidth","getContentHeight","offsetHeight","_getPreciseContentHeight","getTotalHeight","_getPreciseTotalHeight","getPosition","getTabIndex","tabbableElementsRE","disabled","tabIndex","href","sorted","eventWithinElement","related","_deprecated","warn","_syncRenderer","renderer","container","template","render","winControl","host","firstElementChild","dispose","ancestor","fromElement","offsetParent","offsetTop","offsetLeft","_getHighAndLowTabIndices","descendants","getElementsByTagName","lowestTabIndex","highestTabIndex","foundTabIndex0","tabIndexStr","highest","lowest","_getLowestTabIndexInList","elements","elmTabIndex","_getHighestTabIndexInList","_hasCursorKeysBehaviors","_reparentChildren","originalParent","destinationParent","child","sibling","nextSibling","_maintainFocus","focusedElement","_trySetActiveOnAnyElement","_tryFocusOnAnyElement","useSetActive","_trySetActive","elem","_tryFocus","simpleLogicForValidTabStop","_setActiveFirstFocusableElement","rootEl","_focusFirstFocusableElement","_elms","_lowestTabIndex","_nextLowestTabIndex","_setActiveLastFocusableElement","_focusLastFocusableElement","_highestTabIndex","_nextHighestTabIndex","_ElementUtilities","markDisposable","disposeImpl","disposed","disposable","disposeSubTree","query","_disposeElement","optionsLexerInit","_optionsLexer","reservedWord","word","tokenType","keyword","reservedWordLookup","tokens","falseLiteral","nullLiteral","trueLiteral","thisKeyword","leftBrace","rightBrace","leftBracket","rightBracket","separator","colon","dot","numberLiteral","stringLiteral","leftParentheses","rightParentheses","eof","lexer","isIdentifierStartCharacter","code","text","offset","limit","isWhitespace","isLineTerminator","isHexDigit","readIdentifierPart","hasEscape","readIdentifierToken","startOffset","JSON","parse","wordToken","readHexIntegerLiteral","isDecimalDigit","readDecimalDigits","readDecimalLiteral","tempOffset","readDecimalLiteralToken","readStringLiteralToken","quoteCharCode","eval","readWhitespace","lex","token","afterSign","signOffset","substring","hexOffset","_OptionsLexer","tokenTypeName","imports","invalidOptionsRecord","unexpectedTokenExpectedToken","unexpectedTokenExpectedTokens","unexpectedTokenGeneric","local","BaseInterpreter","_currentOffset","_pos","_tokens","_evaluateAccessExpression","_current","_read","_unexpectedToken","_evaluateValue","_evaluateAccessExpressions","_evaluateIdentifier","nested","_readIdentifier","_evaluateIdentifierExpression","_initialize","originalSource","functionContext","_originalSource","_functionContext","expected","_peek","_readAccessExpression","_readAccessExpressions","_readIdentifierExpression","unexpected","OptionsInterpreter","_evaluateArrayLiteral","_readArrayElements","_evaluateObjectLiteral","_readObjectProperties","_tryReadComma","_evaluateOptionsLiteral","_peekValue","_evaluateObjectQueryExpression","_tryReadElement","_tryReadElision","elision","_tryReadObjectProperty","_failReadObjectProperty","functionName","queryExpression","OptionsParser","_readObjectQueryExpression","IdentifierExpression","queryExpressionLiteral","CallExpression","parser","interpreter","parser2","arg0Value","optionsParser","_optionsParser","_CallExpression","_IdentifierExpression","_OptionsParser","createSelect","selector","selected","msParentSelectorScope","scope","activate","Handler","optionsAttribute","select","ctl","count","checkComplete","errorActivatingControl","processAllImpl","rootElement","skipRootElement","allElements","getControlHandler","checkAllComplete","controls","instance","isDeclarativeControlContainer","idcc","processAll","evaluator","scopedSelect","skipRoot","processedAllCalled","process","ControlProcessor","_Control","QueryCollection","items","include","callbackFn","listen","setStyle","clearStyle","newCollection","DOCUMENT_FRAGMENT_NODE","nodeType","Ctor","templateElement","renderDonePromiseCallback","donePromises","datum","getElementById","children","isHoverable","touchStartHandler","_ParallelWorkQueue","maxRunning","runNext","running","processing","nextWork","workQueue","workItems","first","workPromise","workIndex","unshift","sort","_VersionManager","_unlocked","_cancelCount","_notificationCount","_updateCount","locked","noOutstandingNotifications","version","unlocked","_dispose","beginUpdating","_checkLocked","endUpdating","_checkUnlocked","beginNotifications","endNotifications","receivedNotification","_cancel","cancelOnNotification","clearCancelOnNotification","simpleItemRenderer","itemPromise","compareImageLoadPriority","aon","bon","isOnScreen","seenUrl","srcUrl","seenUrls","seenUrlsMRU","SEEN_URLS_MRU_MAXSIZE","mru","SEEN_URLS_MAXSIZE","url","loadImage","image","imageId","nextImageLoaderId","imageLoader","seen","src","imageLoadComplete","tempImage","cleanup","loadComplete","loadError","currentDate","lastSort","minDurationBetweenImageSort","jobComplete","jobError","isImageCached","defaultRenderer","trivialHtmlRenderer","stringify","textContent","_normalizeRendererReturn","elementPromise","renderComplete","_trivialHtmlRenderer","listDataSourceIsInvalid","itemRendererIsInvalid","itemIsInvalid","_seenUrl","_getSeenUrls","_getSeenUrlsMRU","_seenUrlsMaxSize","_seenUrlsMRUMaxSize","_createItemsManager","ListNotificationHandler","itemsManager","_itemsManager","_versionManager","_beginNotifications","inserted","previousHandle","nextHandle","_inserted","newItem","oldItem","_changed","moved","_moved","mirage","_removed","countChanged","newCount","oldCount","_countChanged","indexChanged","newIndex","oldIndex","_indexChanged","affectedRange","range","_affectedRange","_endNotifications","reload","_reload","ItemsManager","listDataSource","itemRenderer","elementNotificationHandler","$pipeline_callbacksMap","_listDataSource","dataSource","_elementNotificationHandler","_listBinding","createListBinding","ownerElement","_ownerElement","_profilerId","profilerId","versionManager","_indexInView","indexInView","_itemRenderer","_viewCallsReady","viewCallsReady","_elementMap","_handleMap","_jobOwner","_notificationsSent","last","lastItem","_elementForItem","_itemFromItemPromise","_waitForElement","_itemFromItemPromiseThrottled","_itemAtIndex","_itemPromiseAtIndex","fromIndex","possiblePlaceholder","isPlaceholder","placeholderID","callbacks","_updateElement","newElement","oldElement","_firstItem","_lastItem","_previousItem","jumpToItem","_itemFromElement","previous","_nextItem","_itemFromPromise","_recordFromElement","elementIsPlaceholder","itemObject","release","_released","releaseItemPromise","record","_releaseRecord","releaseItem","renderPromise","imagePromises","itemReadyPromise","_removeEntryFromElementMap","_removeEntryFromHandleMap","refresh","invalidateAll","_handlerToNotifyCaresAboutItemAvailable","itemAvailable","_handlerToNotify","_defineIndexProperty","itemForRenderer","indexObserved","_renderPlaceholder","elementPlaceholder","_renderItem","callerThrottlesStage1","queueAsyncStage1","_writeProfilerMark","perfItemPromiseId","stage1Signal","readySignal","stage0RunningSync","stage0Ran","itemForRendererPromise","loadImagePromise","stage0","startStage1","readyComplete","perfRendererWorkId","perfItemReadyId","rendererPromise","pendingReady","_replaceElement","elementNew","_addEntryToElementMap","_changeElement","elementNewIsPlaceholder","elementOld","itemOld","elementDelayed","_recordFromHandle","_addEntryToHandleMap","synchronous","_presentElements","retain","_handleInHandleMap","ignoreFailure","_foreachRecord","records","_elementFromHandle","newItemPromise","_presentAllElements","itemToRender","updateAffectedRange","_externalBegin","_postEndNotifications","_endNotificationsPosted","_presentElement","fireEvent","forward","initUIEvent","tabbableElementsNodeFilter","nodeStyle","display","visibility","NodeFilter","FILTER_REJECT","_tabContainer","FILTER_ACCEPT","managedTarget","childFocus","FILTER_SKIP","scrapeTabManagedSubtree","walker","scrapeSubtree","currentNode","elementsFound","tabManagedElement","TabHelperObject","createCatcher","fragment","catcherBegin","insertBefore","catcherEnd","_catcherBegin","_catcherEnd","addRef","parentElement","updateTabIndex","TrackTabBehavior","attach","detach","TabContainer","_element","_tabIndex","skipDefaultBehavior","targetElement","keyCode","forwardTab","shiftKey","canKeepTabbing","_hasMoreElementsInTabOrder","skipTabExitHandling","allTabbableElements","originalTabIndices","_elementTabHelper","restoreTabIndicesOnBlur","_focusElement","_skipper","currentFocus","movingForwards","createTreeWalker","SHOW_ELEMENT","tabStops","_TabContainer","InputTypes","pen","keyboard","_lastInputType","pointerTypeToInputType",2,3,4,"_keyboardSeenLast","_InputTypes","_WinKeyboard","_KeyboardBehavior","_keyboardBehavior","_fixedDirection","FixedDirection","_fixedSize","_currentIndex","_getFocusInto","_keyDownHandler","_MSPointerDownHandler","fixedDirection","fixedSize","currentIndex","getAdjacent","_getAdjacent","_scroller","altKey","maxIndex","rtl","leftStr","rightStr","targetIndex","modFixedSize","_focus","elementToFocus","srcElement","previousElementSibling","setInnerHTML","setInnerHTMLUnsafe","setOuterHTML","setOuterHTMLUnsafe","insertAdjacentHTML","insertAdjacentHTMLUnsafe","nonStaticHTML","outerHTML","msApp","execUnsafeLocalFunction","_execUnsafe","msIsStaticHTML","check","_SafeHtml","_Select","encodeHtml","encodeHtmlRegEx","encodeHtmlEscapeMap","stripDirectionMarker","stringDirectionRegEx","stockGetValue","stockGetLength","fixDataSource","getLength","&","<",">","'","\"","_dataSource","_index","setDisabled","selectedIndex","_createSelectElement","removeAttribute","dataSourceLength","escaped","stripped","send","params","eventHandler","Orientation","horizontal","vertical","CountResult","unknown","CountError","noResponse","DataSourceStatus","waiting","failure","FetchError","doesNotExist","EditError","notPermitted","noLongerMeaningful","ObjectType","groupHeader","header","footer","SelectionMode","none","single","multi","TapBehavior","directSelect","toggleSelect","invokeOnly","SwipeBehavior","GroupHeaderTapBehavior","invoke","arg","noop","xhr","req","XMLHttpRequest","isLocalRequest","schemeMatch","schemeRegex","exec","protocol","onreadystatechange","_canceled","status","open","user","password","responseType","headers","setRequestHeader","customRequestInitializer","abort","findNextFocusElement","_findNextFocusElementInternal","moveFocus","previousFocusElement","_trySetFocus","eventSrc","EventNames","focusChanged","_xyFocus","referenceRect","dontExit","updateHistoryRect","newHistoryRect","_defaultRect","DirectionNames","targetRect","_historyRect","Number","MIN_VALUE","MAX_VALUE","_lastTarget","_cachedLastTargetRect","lastTargetRect","_toIRect","getBoundingClientRect","focusRoot","historyRect","referenceElement","ClassNames","toggleMode","toggleModeActive","targetIframe","IFrameHelper","isXYFocusEnabled","refRect","CrossDomainMessageConstants","messageDataProperty","dFocusEnter","contentWindow","postMessage","dFocusExit","calculatePercentInShadow","minReferenceCoord","maxReferenceCoord","minPotentialCoord","maxPotentialCoord","pixelOverlap","shortEdge","calculateScore","maxDistance","potentialRect","percentInShadow","primaryAxisDistance","score","secondaryAxisDistance","percentInHistoryShadow","up","down","ScoringConstants","primaryAxisDistanceWeight","secondaryAxisDistanceWeight","percentInHistoryShadowWeight","getReferenceObject","refElement","rect","screen","availHeight","availWidth","refObj","manualOverrideOptions","AttributeNames","focusOverride","focusOverrideLegacy","parsedOptions","usedOverride","bestPotential","potentialElement","_isFocusable","_isInInactiveToggleModeContainer","floor","focusChanging","nextFocusElement","elementTagName","hasAttribute","FocusableTagNames","focusable","_findParentToggleModeContainer","toggleModeRoot","_isToggleMode","xboxPlatform","inputType","_getStateHandler","suspended","stateHandler","KeyHandlerStates","RestState","SuspendedState","ToggleModeActiveState","ToggleModeRestState","_handleKeyEvent","keyCodeMap","shouldPreventDefault","xyFocus","_handleCaptureKeyEvent","accept","Keys","_clickElement","click","_nop","_i","_safeForEach","iframes","getIFrameFromWindow","win","iframe","ifr","registerIFrame","unregisterIFrame","sourceWindow","source","focused","iframeRect","toPublish","onfocuschanged","onfocuschanging","_iframeHelper","_Xhr","addScript","scriptTag","fragmentHref","lastNonInlineScriptPromise","inline","scripts","language","onload","onerror","addStyle","styleTag","cloneNode","addLink","links","getStateRecord","removeFromCache","loadFromCache","docfrag","docFragment","createDocumentFragment","clearCache","createEntry","populateDocument","processDocument","fragmentId","cacheStore","cd","sp","localScripts","imported","importNode","initialize","renderCopy","renderImpl","copy","uniqueId","writeProfilerMark","frag","cache","htmlDoc","implementation","createHTMLDocument","base","anchor","getFragmentContents","getFragmentContentsXHR","responseText","arrayLikeValue","_cacheStore","_getFragmentContents","initWithWinRT","temp","roaming","IOHelper","folder","_path","path","tryGetItemAsync","_tryGetItemAsync","fileName","getFileAsync","exists","fileItem","deleteAsync","writeText","sto","Storage","createFileAsync","CreationCollisionOption","openIfExists","FileIO","writeTextAsync","readText","def","readTextAsync","ApplicationData","localFolder","temporaryFolder","roamingFolder","initWithStub","InMemoryHelper","storage","sessionState","_loadState","previousExecutionState","_sessionStateLoaded","_oncheckpoint","Application","getViewOpener","stateString","queueEvent","navigatedEventName","navigatingEventName","beforenavigateEventName","history","backStack","initialPlaceholder","forwardStack","raiseBeforeNavigate","proposed","waitForPromise","raiseNavigating","delta","raiseNavigated","go","distance","fromStack","toStack","canGoForward","canGoBack","back","navigate","initialState","onnavigated","onnavigating","onbeforenavigate","_State","Navigation","safeSerialize","obj","seenObjects","fatalErrorHandler","_terminateApp","number","errorCode","terminateData","description","errorNumber","defaultTerminateAppHandler","terminateApp","captureDeferral","pendingDeferralID","deferral","pendingDeferrals","getDeferral","completeDeferral","deferralID","cleanupAllPendingDeferrals","eventRecord","_deferral","_deferralID","_stoppedImmediatePropagation","builtInListeners","createEventQueuedSignal","eventQueuedSignal","drainOneEvent","drainError","drainNext","_queue","eventQueue","copyAndClearQueue","startEventQueue","markSync","sync","eventQueueJob","activatedHandler","activatedOperation","activatedET","suspendingHandler","suspendingOperation","checkpointET","domContentLoadedHandler","loadedET","WebUI","WebUIApplication","activatedArgs","kind","beforeUnloadHandler","unloadET","errorHandler","flattenedError","errorLine","lineno","errorCharacter","colno","errorUrl","filename","errorMessage","promiseErrorHandler","outstandingPromiseErrors","shouldScheduleErrors","commandsRequested","applicationcommands","settingsET","hardwareButtonBackPressed","winRTBackPressedEvent","backClickET","requestingFocusOnKeyboardInput","beforeRequestingFocusOnKeyboardInputET","edgyStarting","edgyStartingET","edgyCompleted","edgyCompletedET","edgyCanceled","edgyCanceledET","getNavManager","manager","SystemNavigationManager","isModern","registered","wui","ApplicationSettings","SettingsPane","settingsPane","navManager","Phone","Input","HardwareButtons","EdgeGesture","edgy","readyET","requestingFocusOnKeyboardInputET","Symbol","iterator","TypeToSearch","_registered","updateRegistration","ls","_updateKeydownCaptureListeners","_keydownCaptureHandler","_shouldKeyTriggerTypeToSearch","_frameLoadCaptureHandler","childWin","frameElement","shouldTrigger","metaKey","ctrlKey","getModifierState","terminateAppHandler","activated","checkpoint","backclick","_winRTBackPressedEvent","beforerequestingfocusonkeyboardinput","onactivated","oncheckpoint","onloaded","onready","onsettings","onunload","onbackclick","_applicationListener","PageNavigationAnimation","turnstile","slide","enterPage","continuum","makeArray","NodeList","HTMLCollection","getUniqueKeyframeName","keyframeCounter","isUniqueKeyframeName","resolveStyles","opacity","copyWithEvaluation","iElem","newObj","exactTiming","_libraryDelay","stopExistingAction","prop","finish","activeActions","reason_interrupted","registerAction","unregisterAction","setTemporaryStyles","actions","desc","styleCache","styleCaches","StyleCache","cref","isTransition","some","nameField","newShorthand","newNames","shorthandProp","executeElementTransition","transitions","promises","animate","uniformizeStyle","transition","scriptNameOfProperty","hasOwnProperty","from","propertyScriptName","elementTransitionProperties","reason","onTransitionEnd","removeName","skipStylesReset","timeoutId","reason_canceled","duration","executeElementAnimation","anims","styleElem","anim","keyframe","browserStyleEquivalents","kf","sheet","insertRule","elementAnimationProperties","animationsToCleanUp","animationPromises","onAnimationEnd","cleanupAnimations","initAnimations","animationSettings","UISettings","animationsEnabled","applyAction","execAction","isAnimationEnabled","elems","adjustAnimationTime","animation","animationTimeAdjustment","animationAdjustment","animationFactor","prevStyles","prevNames","nameProp","destroy","every","nameValue","lastIndexOf","enableCount","libraryDelay","disableAnimations","enableAnimations","executeAnimation","executeTransition","_animationTimeAdjustment","_fastAnimations","_slowAnimations","_animationFactor","_Constants","_TransitionAnimation","checkKeyframe","defOffset","rtlflip","keyframeCallback","chooseKeyframe","keyframeRtl","collectOffsetArray","elemArray","offsetArray","matrix","transformNames","staggerDelay","initialDelay","extraDelay","delayFactor","delayCap","ret","makeOffsetsRelative","animTranslate2DTransform","animStaggeredSlide","curve","fadeIn","page","second","third","prepareSlide","endOffset","elementArray","startOffsetArray","endOffsetArray","horizontalOffset","OffsetArray","timing","translateCallback","animRotationTransform","origins","clearAnimRotationTransform","getOffset","translateCallbackAnimate","suffix","keyframeCallbackAnimate","layoutTransition","LayoutTransition","affected","extra","targetArray","affectedArray","collectTurnstileTransformOrigins","itemBoundingBox","offsetLeftLTR","offsetLeftRTL","innerWidth","totalOffsetY","innerHeight","ltr","writeAnimationProfilerMark","transformWithTransition","transitionProperty","didFinish","getResizeDefaultTransitions","defaultResizeGrowTransition","defaultResizeShrinkTransition","resizeTransition","elementClipper","defaultTransition","actualSize","anchorTrailingEdge","translate","dimension","clipperTransition","elementTransition","defaultOffset","ExpandAnimation","revealedArray","promise1","promise2","CollapseAnimation","hiddenArray","RepositionAnimation","AddToListAnimation","addedArray","DeleteFromListAnimation","deletedArray","remainingArray","_UpdateListAnimation","deleted","deletedOffsetArray","promise3","AddToSearchListAnimation","DeleteFromSearchListAnimation","PeekAnimation","createExpandAnimation","revealed","createCollapseAnimation","hidden","createRepositionAnimation","shown","fadeOut","createAddToListAnimation","added","createDeleteFromListAnimation","remaining","_createUpdateListAnimation","createAddToSearchListAnimation","createDeleteFromSearchListAnimation","showEdgeUI","mechanism","showPanel","hideEdgeUI","hidePanel","showPopup","hidePopup","pointerDown","pointerUp","dragSourceStart","dragSource","dragSourceEnd","enterContent","incoming","animationPromise","exitContent","outgoing","dragBetweenEnter","dragBetweenLeave","swipeSelect","selection","swipeDeselect","deselected","swipeReveal","exitPage","crossFade","createPeekAnimation","updateBadge","turnstileForwardIn","incomingElements","turnstileForwardOut","outgoingElements","turnstileBackwardIn","turnstileBackwardOut","slideDown","slideUp","slideRightIn","firstIncomingElements","secondIncomingElements","thirdIncomingElements","slideRightOut","firstOutgoingElements","secondOutgoingElements","thirdOutgoingElements","slideLeftIn","slideLeftOut","continuumForwardIn","incomingPage","incomingItemRoot","incomingItemContent","continuumForwardOut","outgoingPage","outgoingItem","continuumBackwardIn","incomingItem","continuumBackwardOut","drillInIncoming","drillInOutgoing","drillOutIncoming","drillOutOutgoing","createPageNavigationAnimations","currentPreferredAnimation","nextPreferredAnimation","movingBackwards","emptyAnimationFunction","exit","entrance","_resizeTransition","animationsToPlay","_commandingSurfaceOpenAnimation","actionAreaClipper","actionArea","overflowAreaClipper","overflowArea","closedHeight","oldHeight","openedHeight","newHeight","overflowAreaHeight","menuPositionedAbove","deltaHeight","actionAreaAnimations","transitionToUse","overflowAreaTransition","_commandingSurfaceCloseAnimation","overflowAreaClipperTransition","BindingInterpreter","res","BindingParser","invalidBinding","bindingInitializerNotFound","_BaseInterpreter","_evaluateInitializerName","initializer","_readBindDeclarations","bindings","_readBindDeclaration","dest","_readDestinationPropertyName","_readSourcePropertyName","destination","_readInitializerName","_bindingParser","_bindingParser2","SWEEP_PERIOD","cleanupToken","table","TIMEOUT","unscheduleCleanupIfNeeded","scheduleCleanupIfNeeded","noTimeoutUnderDebugger","setInterval","clearInterval","createWeakRef","getWeakRefElement","fastLoadPath","Foundation","Uri","_createWeakRef","_getWeakRefElement","_DOMWeakRefTable_noTimeoutUnderDebugger","_DOMWeakRefTable_sweepPeriod","_DOMWeakRefTable_timeout","_DOMWeakRefTable_tableSize","_DOMWeakRefTable_fastLoadPath","_DomWeakRefTable","exceptionFromBindingInitializer","propertyIsUndefined","unsupportedDataTypeForBinding","observableMixin","_pendingNotifications","_notifyId","_getObservable","hit","notify","oldValue","cap","unwrap","unbind","nl","dynamicObservableMixin","_backingData","_initObservable","getProperty","setProperty","updateProperty","addProperty","removeProperty","observable","bindingDescriptor","bindImpl","bindRefId","createBindRefId","createProxy","bindStateRef","bindState","cancelSimple","simpleLast","cancelComplex","complexLast","complexBind","Function","propChanged","recursiveNotify","ObservableProxy","expandProperties","shape","addToProps","getPrototypeOf","backingData","_BindingParser","_Data","registerAutoDispose","bindable","_autoDispose","autoDispose","checkBindingToken","bindingId","winBindingToken","duplicateBindingDetected","setBindingToken","bindingToken","uid","initializerOneBinding","ref","pend","cacheEntry","nocache","makeBinding","bindResult","resolveWeakRef","elementNotFound","bindingAction","nestedSet","bindWorker","sourceOneBinding","filterIdBinding","declBind","bindingStr","bindIndex","idBindingNotSupported","calcBinding","bindingCache","declBindCache","expressions","declarativeBindImpl","dataContext","defaultInitializer","neg","baseElement","baseElementData","winBindings","declarativeBind","implemented","bindLen","optimizeBindingReferences","elementData","bindIndex2","bindLen2","bind2","cancel2","errorInitializingBindings","converter","convert","userConverter","sourceProperties","destProperties","initialValue","workerResult","propertyDoesNotExist","Node","nestedDOMElementBindingNotSupported","cannotBindToThis","creatingNewProperty","attributeSet","attributeBindingSingleProperty","counter","setAttributeOneTime","addClassOneTime","defaultBind","defaultBindImpl","oneTime","customInitializer","random","_Declarative","Fragments","_Dispose","_TemplateCompiler","disposeInstance","renderCompletePromise","bindTokens","binding","delayedBindingProcessing","targetSecurityCheck","multiline","formatRegEx","replacementIndex","indent","numberOfSpaces","multilineStringToBeIndented","line","statements","array","declarationList","identifierAccessExpression","match","identifierRegEx","literal","nullableFilteredIdentifierAccessExpression","initial","temporary","brackets","parens","assignment","newArray","N","expression","htmlEscape","createIdentifier","String","merge","mergeAll","len2","globalLookup","visit","pre","post","childKey","trimLinesRight","content","cancelBlocker","init_defaultBind","init_oneTime","init_setAttribute","init_setAttributeOneTime","init_addClassOneTime","promise_as","utilities_data","ui_processAll","binding_processAll","options_parser","binding_parser","identifierCharacterRegEx","semiColonOnlyLineRegEx","capitalRegEx","TreeCSE","compiler","accessExpression","tree","reference","createPathExpression","tail","defineInstance","lower","aggregatedName","childCount","deadNodeElimination","dead","definitions","nodes","definition","InstanceKind","variable","InstanceKindPrefixes","StaticKind","StaticKindPrefixes","BindingKind","TextBindingKind","booleanAttribute","inlineStyle","IMPORTS_ARG_NAME","Stage","analyze","optimze","compile","link","TemplateCompiler","_stage","_staticVariables","_staticVariablesCount","_instanceVariables","_instanceVariablesCount","_debugBreak","debugBreakOnRender","_defaultInitializer","_optimizeTextBindings","disableTextBindingOptimization","_templateElement","_templateContent","_extractChild","extractChild","_controls","_bindings","_bindTokens","_textBindingPrefix","_textBindingId","_suffix","_htmlProcessors","_profilerMarkIdentifier","_captureCSE","generateElementCaptureAccess","_dataCSE","generateNormalAccess","importFunctionSafe","_globalCSE","childElementCount","lastElementChild","addClassOneTimeTextBinding","createTextBindingHole","elementCapture","textBindingId","formatCode","addClassOneTimeTreeBinding","pathExpression","bindingExpression","gatherControls","gatherBindings","_children","gatherChildren","cleanControlAndBindingAttributes","createAsyncParts","nullableIdentifierAccessTemporary","html","_html","_capture","bodyTemplate","replacements","supportDelayBindings","_returnedElement","binding_processing","delayed_binding_processing","control_processing","constructionFormatString","construction","SafeConstructor","generateOptionsLiteral","optionsParsed","delayedControlProcessing","templateDefaultInitializer","all_binding_processing","nestedTemplates","_nestedTemplates","nestedTemplate","bindToken","delayable","instances","instanceDefinitions","captures","globals","set_msParentSelectorScope","formatCodeN","statement","renderItemImplRenderCompleteTemplate","profilerMarkIdentifierStart","profilerMarkIdentifierStop","instance_variable_declarations","global_definitions","data_definitions","instance_variable_definitions","capture_definitions","debug_break","generateDebugBreak","control_counter","_controlCounter","suffix_statements","returnedElement","prettify","_textBindingRegex","deadCodeElimination","iv","variableCount","defineStatic","known","emitScopedSelect","emitOptionsNode","findGlobalIdentifierExpressions","bindingText","elementBindings","initializerName","importFunction","nestedTemplateCount","bindTokenCount","asyncCount","ControlConstructor","optionsText","globalReferences","identifierExpression","globalExpression","importAll","importAllSafe","statics","linkerCodeTemplate","static_variable_declarations","static_variable_definitions","markBindingAsError","oneTimeTextBinding","oneTimeTextBindingAnalyze","getter","msReplaceStyle","elementType","targetProperty","targetCssProperty","supported","oneTimeTreeBinding","targetPath","sourcePath","optimize","newBinding","setAttributeOneTimeTreeBinding","textBindings","setAttributeOneTimeTextBinding","newHtml","replacer","lines","_TreeCSE","importAliases","codeTemplate","delayBindings","renderImplCodeAsyncTemplate","renderImplCodeTemplate","renderItemImplCodeAsyncTemplate","renderItemImplCodeTemplate","renderImplMainCodePrefixTemplate","renderImplControlAndBindingProcessing","renderImplAsyncControlAndBindingProcessing","renderImplMainCodeSuffixTemplate","renderItemImplMainCodeSuffixTemplate","_DataTemplateCompiler","Template","interpretedRender","extractedChild","_counter","_debugBreakOnRender","nextElementSibling","processTimeout","renderItem","recycled","_renderItemImpl","enableRecycling","bindingInitializer","disableOptimizedProcessing","_compile","_shouldCompile","shouldCompile","_interpretAll","_bindingInitializer","_reset","_disableOptimizedProcessing","_processTimeout","_renderImpl","_compileTemplate","_renderInterpreted","msOriginalTemplate","okToReuse","resetOnFragmentChange","DesignMode","designModeEnabled","mo","childList","characterData","subtree","_UI","_BindingListDataSource","findNextKey","getItem","findPreviousKey","listBinding","WrappedItem","NullWrappedItem","wrapAsync","AsyncWrappedItem","cloneWithIndex","_annotateWithIndex","insertAtStart","_list","itemFromIndex","nextKey","indexOfKey","insertAfter","previousKey","insertAtEnd","change","newData","setAt","moveToStart","sourceIndex","move","moveBefore","moveAfter","moveToEnd","_release","_addRef","_item","ListBinding","notificationHandler","_editsCount","_notificationHandler","_retained","_retainedKeys","fallbackReference","handleEvent","eventArg","lb","_handlers","itemchanged","iteminserted","itemmoved","itemremoved","_itemchanged","_updateAffectedRange","_retainedCount","_beginEdits","_endEdits","_iteminserted","retained","_shouldNotify","_itemmoved","_itemremoved","retainedKeys","wasRetained","newStart","newEnd","_notifyAffectedRange","_notifyCountChanged","_countAtBeginEdits","_notifyIndicesChanged","_notifyMoved","explicit","_fromIndex","_releaseBinding","fromKey","getItemFromKey","DataSource","_usingWeakRef","getCount","itemFromKey","beginEdits","_forEachBinding","endEdits","toBeDeleted","copyargs","cloneItem","groupKey","groupSize","firstItemKey","firstItemIndexHint","asNumber","mergeSort","sorter","copyBack","middle","sparseArrayNotSupported","illegalListLength","emptyOptions","ns","ListBase","onitemchanged","oniteminserted","onitemmoved","onitemmutated","onitemremoved","onreload","_notifyItemChanged","_notifyItemInserted","_lastNotifyLength","_notifyItemMoved","_notifyItemMutated","itemmutated","_notifyItemRemoved","_notifyReload","_normalizeIndex","_notifyMutatedFromKey","notifyReload","getAt","_getArray","_getFromKey","_getKey","begin","searchElement","reduceRight","createFiltered","predicate","FilteredListProjection","createGrouped","groupData","groupSorter","GroupedSortedListProjection","createSorted","SortedListProjection","ListBaseWithMutators","ListProjection","_myListeners","_addListListener","List","_listReload","howMany","_spliceFromKey","_setAtKey","_listItemChanged","_listItemInserted","_listItemMutated","_listItemMoved","_listItemRemoved","_filter","_initFilteredKeys","_filteredKeys","_findInsertionPosition","filteredKeys","filteredIndex","oldInFilter","newInFilter","oldFilteredIndex","newFilteredIndex","notifyMutated","keysToRemove","filteredKeyIndex","sortFunction","_sortFunction","_initSortedKeys","_sortedKeys","_findInsertionPos","startingMin","startingMax","sortedKeys","mid","sortedKey","sortedItem","_findStableInsertionPos","_findBeginningOfGroup","_findEndOfGroup","sortedIndex","knownMin","knownMax","oldSortedIndex","newSortedIndex","sortedKeyIndex","groupKeyOf","groupDataOf","_listGroupedItemChanged","_listGroupedItemInserted","_listGroupedItemMoved","_listGroupedItemMutated","_listGroupedItemRemoved","_groupKeyOf","_groupDataOf","_initGroupedItems","_groupedItems","groupedItems","_groupsProjection","oldGroupedItem","newGroupedItem","groupMin","groupMax","groupItem","_groupItems","groupedItem","groups","GroupsListProjection","_initGroupKeysAndItems","_groupOf","_groupKeys","groupCount","groupItems","groupKeys","currentGroupKey","currentGroupItem","newGroupItem","groupIndex","oldGroupItem","newFirstItem","_currentKey","_keys","_keyMap","_proxy","proxy","_binding","_data","keyDataMap","_initializeKeys","_modifyingData","keyMap","_lazyPopulateEntry","_assignKey","oldEntry","newEntry","additionalItem","newKey","rootElementNode","decls","setMembers","setAttributes","descriptor","notFound","uri","selfhost","Pages_define","parentedPromise","_disposed","msSourceLocation","renderCalled","loadResult","initResult","elementReady","processed","callComplete","_mixin","viewMap","_BasePage","Page","ctor","_viewMap","Pages","HtmlControl","_require","_define","module"],"mappings":"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","file":"base.min.js"}
\ No newline at end of file
diff --git a/node_modules/winjs/js/en-US/ui.strings.js b/node_modules/winjs/js/en-US/ui.strings.js
deleted file mode 100644
index 5d88759..0000000
--- a/node_modules/winjs/js/en-US/ui.strings.js
+++ /dev/null
@@ -1,529 +0,0 @@
-/*!
-  Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-  Build: 4.4.2.winjs.2017.3.14
-  Version: WinJS.4.4
-*/
-
-(function () {
-    var globalObject =
-        typeof window !== 'undefined' ? window :
-        typeof self !== 'undefined' ? self :
-        typeof global !== 'undefined' ? global :
-        {};
-    globalObject.strings = globalObject.strings || {};
-
-    function addStrings(keyPrefix,  strings) {
-        Object.keys(strings).forEach(function (key) {
-            globalObject.strings[keyPrefix + key] = strings[key];
-        });
-    }
-    addStrings("ms-resource:///Microsoft.WinJS/",
-{
-    "tv/scrollViewerPageDown": "Page Down",
-    "tv/scrollViewerPageUp": "Page Up",
-    "ui/appBarAriaLabel": "App Bar",
-    "ui/appBarCommandAriaLabel": "App Bar Item",
-    "ui/appBarOverflowButtonAriaLabel": "View more",
-    "ui/autoSuggestBoxAriaLabel": "Autosuggestbox",
-    "ui/autoSuggestBoxAriaLabelInputNoPlaceHolder": "Autosuggestbox, enter to submit query, esc to clear text",
-    "ui/autoSuggestBoxAriaLabelInputPlaceHolder": "Autosuggestbox, {0}, enter to submit query, esc to clear text",
-    "ui/autoSuggestBoxAriaLabelQuery": "Suggestion: {0}",
-    "_ui/autoSuggestBoxAriaLabelQuery.comment": "Suggestion: query text (example: Suggestion: contoso)",
-    "ui/autoSuggestBoxAriaLabelSeparator": "Separator: {0}",
-    "_ui/autoSuggestBoxAriaLabelSeparator.comment": "Separator: separator text (example: Separator: People or Separator: Apps)",
-    "ui/autoSuggestBoxAriaLabelResult": "Result: {0}, {1}",
-    "_ui/autoSuggestBoxAriaLabelResult.comment": "Result: text, detailed text (example: Result: contoso, www.contoso.com)",
-    "ui/averageRating": "Average Rating",
-    "ui/backbuttonarialabel": "Back",
-    "ui/chapterSkipBackMediaCommandDisplayText": "Chapter back",
-    "ui/chapterSkipForwardMediaCommandDisplayText": "Chapter forward",
-    "ui/clearYourRating": "Clear your rating",
-    "ui/closedCaptionsLabelNone": "Off",
-    "ui/closedCaptionsMediaCommandDisplayText": "Closed captioning",
-    "ui/closeOverlay": "Close",
-    "ui/commandingSurfaceAriaLabel": "CommandingSurface",
-    "ui/commandingSurfaceOverflowButtonAriaLabel": "View more",
-    "ui/datePicker": "Date Picker",
-    "ui/fastForwardMediaCommandDisplayText": "Fast forward",
-    "ui/fastForwardFeedbackDisplayText": " {0}X",
-    "ui/fastForwardFeedbackSlowMotionDisplayText": "0.5X",
-    "ui/flipViewPanningContainerAriaLabel": "Scrolling Container",
-    "ui/flyoutAriaLabel": "Flyout",
-    "ui/goToFullScreenButtonLabel": "Go full screen",
-    "ui/goToLiveMediaCommandDisplayText": "LIVE",
-    "ui/hubViewportAriaLabel": "Scrolling Container",
-    "ui/listViewViewportAriaLabel": "Scrolling Container",
-    "ui/mediaErrorAborted": "Playback was interrupted. Please try again.",
-    "ui/mediaErrorNetwork": "There was a network connection error.",
-    "ui/mediaErrorDecode": "The content could not be decoded",
-    "ui/mediaErrorSourceNotSupported": "This content type is not supported.",
-    "ui/mediaErrorUnknown": "There was an unknown error.",
-    "ui/mediaPlayerAudioTracksButtonLabel": "Audio tracks",
-    "ui/mediaPlayerCastButtonLabel": "Cast",
-    "ui/mediaPlayerChapterSkipBackButtonLabel": "Previous",
-    "ui/mediaPlayerChapterSkipForwardButtonLabel": "Next",
-    "ui/mediaPlayerClosedCaptionsButtonLabel": "Closed captions",
-    "ui/mediaPlayerFastForwardButtonLabel": "Fast forward",
-    "ui/mediaPlayerFullscreenButtonLabel": "Fullscreen",
-    "ui/mediaPlayerLiveButtonLabel": "LIVE",
-    "ui/mediaPlayerNextTrackButtonLabel": "Next",
-    "ui/mediaPlayerOverlayActiveOptionIndicator": "(On)",
-    "ui/mediaPlayerPauseButtonLabel": "Pause",
-    "ui/mediaPlayerPlayButtonLabel": "Play",
-    "ui/mediaPlayerPlayFromBeginningButtonLabel": "Replay",
-    "ui/mediaPlayerPlayRateButtonLabel": "Playback rate",
-    "ui/mediaPlayerPreviousTrackButtonLabel": "Previous",
-    "ui/mediaPlayerRewindButtonLabel": "Rewind",
-    "ui/mediaPlayerStopButtonLabel": "Stop",
-    "ui/mediaPlayerTimeSkipBackButtonLabel": "8 second replay",   
-    "ui/mediaPlayerTimeSkipForwardButtonLabel": "30 second skip",
-    "ui/mediaPlayerToggleSnapButtonLabel": "Snap",
-    "ui/mediaPlayerVolumeButtonLabel": "Volume",
-    "ui/mediaPlayerZoomButtonLabel": "Zoom",
-    "ui/menuCommandAriaLabel": "Menu Item",
-    "ui/menuAriaLabel": "Menu",
-    "ui/navBarContainerViewportAriaLabel": "Scrolling Container",
-    "ui/nextTrackMediaCommandDisplayText": "Next track",
-    "ui/off": "Off",
-    "ui/on": "On",
-    "ui/pauseMediaCommandDisplayText": "Pause",
-    "ui/playFromBeginningMediaCommandDisplayText": "Play again",
-    "ui/playbackRateHalfSpeedLabel": "0.5x",
-    "ui/playbackRateNormalSpeedLabel": "Normal",
-    "ui/playbackRateOneAndHalfSpeedLabel": "1.5x",
-    "ui/playbackRateDoubleSpeedLabel": "2x",
-    "ui/playMediaCommandDisplayText": "Play",
-    "ui/pivotAriaLabel": "Pivot",
-    "ui/pivotViewportAriaLabel": "Scrolling Container",
-    "ui/replayMediaCommandDisplayText": "Play again",
-    "ui/rewindMediaCommandDisplayText": "Rewind",
-    "ui/rewindFeedbackDisplayText": " {0}X",
-    "ui/rewindFeedbackSlowMotionDisplayText": "0.5X",
-    "ui/searchBoxAriaLabel": "Searchbox",
-    "ui/searchBoxAriaLabelInputNoPlaceHolder": "Searchbox, enter to submit query, esc to clear text",
-    "ui/searchBoxAriaLabelInputPlaceHolder": "Searchbox, {0}, enter to submit query, esc to clear text",
-    "ui/searchBoxAriaLabelButton": "Click to submit query",
-    "ui/seeMore":  "See more",
-    "ui/selectAMPM": "Select A.M P.M",
-    "ui/selectDay": "Select Day",
-    "ui/selectHour": "Select Hour",
-    "ui/selectMinute": "Select Minute",
-    "ui/selectMonth": "Select Month",
-    "ui/selectYear": "Select Year",
-    "ui/settingsFlyoutAriaLabel": "Settings Flyout",
-    "ui/stopMediaCommandDisplayText": "Stop",
-    "ui/tentativeRating": "Tentative Rating",
-    "ui/timePicker": "Time Picker",
-    "ui/timeSeparator": ":",
-    "ui/timeSkipBackMediaCommandDisplayText": "Skip back",
-    "ui/timeSkipForwardMediaCommandDisplayText": "Skip forward",
-    "ui/toolbarAriaLabel": "ToolBar",
-    "ui/toolbarOverflowButtonAriaLabel": "View more",
-    "ui/unrated": "Unrated",
-    "ui/userRating": "User Rating",
-    "ui/zoomMediaCommandDisplayText": "Zoom",
-    // AppBar Icons follow, the format of the ui.js and ui.resjson differ for
-    // the AppBarIcon namespace.  The remainder of the file therefore differs.
-    // Code point comments are the icon glyphs in the 'Segoe UI Symbol' font.
-    "ui/appBarIcons/previous":                            "\uE100", // group:Media
-    "_ui/appBarIcons/previous.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/next":                                "\uE101", // group:Media
-    "_ui/appBarIcons/next.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/play":                                "\uE102", // group:Media
-    "_ui/appBarIcons/play.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/pause":                               "\uE103", // group:Media
-    "_ui/appBarIcons/pause.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/edit":                                "\uE104", // group:File
-    "_ui/appBarIcons/edit.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/save":                                "\uE105", // group:File
-    "_ui/appBarIcons/save.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/clear":                               "\uE106", // group:File
-    "_ui/appBarIcons/clear.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/delete":                              "\uE107", // group:File
-    "_ui/appBarIcons/delete.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/remove":                              "\uE108", // group:File
-    "_ui/appBarIcons/remove.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/add":                                 "\uE109", // group:File
-    "_ui/appBarIcons/add.comment":                        "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/cancel":                              "\uE10A", // group:Editing
-    "_ui/appBarIcons/cancel.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/accept":                              "\uE10B", // group:General
-    "_ui/appBarIcons/accept.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/more":                                "\uE10C", // group:General
-    "_ui/appBarIcons/more.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/redo":                                "\uE10D", // group:Editing
-    "_ui/appBarIcons/redo.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/undo":                                "\uE10E", // group:Editing
-    "_ui/appBarIcons/undo.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/home":                                "\uE10F", // group:General
-    "_ui/appBarIcons/home.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/up":                                  "\uE110", // group:General
-    "_ui/appBarIcons/up.comment":                         "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/forward":                             "\uE111", // group:General
-    "_ui/appBarIcons/forward.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/right":                               "\uE111", // group:General
-    "_ui/appBarIcons/right.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/back":                                "\uE112", // group:General
-    "_ui/appBarIcons/back.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/left":                                "\uE112", // group:General
-    "_ui/appBarIcons/left.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/favorite":                            "\uE113", // group:Media
-    "_ui/appBarIcons/favorite.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/camera":                              "\uE114", // group:System
-    "_ui/appBarIcons/camera.comment":                     "{Locked=qps-ploc,qps-plocm}",    
-    "ui/appBarIcons/settings":                            "\uE115", // group:System
-    "_ui/appBarIcons/settings.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/video":                               "\uE116", // group:Media
-    "_ui/appBarIcons/video.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/sync":                                "\uE117", // group:Media
-    "_ui/appBarIcons/sync.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/download":                            "\uE118", // group:Media
-    "_ui/appBarIcons/download.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mail":                                "\uE119", // group:Mail and calendar
-    "_ui/appBarIcons/mail.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/find":                                "\uE11A", // group:Data
-    "_ui/appBarIcons/find.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/help":                                "\uE11B", // group:General
-    "_ui/appBarIcons/help.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/upload":                              "\uE11C", // group:Media
-    "_ui/appBarIcons/upload.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/emoji":                               "\uE11D", // group:Communications
-    "_ui/appBarIcons/emoji.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/twopage":                             "\uE11E", // group:Layout
-    "_ui/appBarIcons/twopage.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/leavechat":                           "\uE11F", // group:Communications
-    "_ui/appBarIcons/leavechat.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mailforward":                         "\uE120", // group:Mail and calendar
-    "_ui/appBarIcons/mailforward.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/clock":                               "\uE121", // group:General
-    "_ui/appBarIcons/clock.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/send":                                "\uE122", // group:Mail and calendar
-    "_ui/appBarIcons/send.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/crop":                                "\uE123", // group:Editing
-    "_ui/appBarIcons/crop.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/rotatecamera":                        "\uE124", // group:System
-    "_ui/appBarIcons/rotatecamera.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/people":                              "\uE125", // group:Communications
-    "_ui/appBarIcons/people.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/closepane":                           "\uE126", // group:Layout
-    "_ui/appBarIcons/closepane.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/openpane":                            "\uE127", // group:Layout
-    "_ui/appBarIcons/openpane.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/world":                               "\uE128", // group:General
-    "_ui/appBarIcons/world.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/flag":                                "\uE129", // group:Mail and calendar
-    "_ui/appBarIcons/flag.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/previewlink":                         "\uE12A", // group:General
-    "_ui/appBarIcons/previewlink.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/globe":                               "\uE12B", // group:Communications
-    "_ui/appBarIcons/globe.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/trim":                                "\uE12C", // group:Editing
-    "_ui/appBarIcons/trim.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/attachcamera":                        "\uE12D", // group:System
-    "_ui/appBarIcons/attachcamera.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/zoomin":                              "\uE12E", // group:Layout
-    "_ui/appBarIcons/zoomin.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/bookmarks":                           "\uE12F", // group:Editing
-    "_ui/appBarIcons/bookmarks.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/document":                            "\uE130", // group:File
-    "_ui/appBarIcons/document.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/protecteddocument":                   "\uE131", // group:File
-    "_ui/appBarIcons/protecteddocument.comment":          "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/page":                                "\uE132", // group:Layout
-    "_ui/appBarIcons/page.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/bullets":                             "\uE133", // group:Editing
-    "_ui/appBarIcons/bullets.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/comment":                             "\uE134", // group:Communications
-    "_ui/appBarIcons/comment.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mail2":                               "\uE135", // group:Mail and calendar
-    "_ui/appBarIcons/mail2.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/contactinfo":                         "\uE136", // group:Communications
-    "_ui/appBarIcons/contactinfo.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/hangup":                              "\uE137", // group:Communications
-    "_ui/appBarIcons/hangup.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/viewall":                             "\uE138", // group:Data
-    "_ui/appBarIcons/viewall.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mappin":                              "\uE139", // group:General
-    "_ui/appBarIcons/mappin.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/phone":                               "\uE13A", // group:Communications
-    "_ui/appBarIcons/phone.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/videochat":                           "\uE13B", // group:Communications
-    "_ui/appBarIcons/videochat.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/switch":                              "\uE13C", // group:Communications
-    "_ui/appBarIcons/switch.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/contact":                             "\uE13D", // group:Communications
-    "_ui/appBarIcons/contact.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/rename":                              "\uE13E", // group:File
-    "_ui/appBarIcons/rename.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/pin":                                 "\uE141", // group:System
-    "_ui/appBarIcons/pin.comment":                        "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/musicinfo":                           "\uE142", // group:Media
-    "_ui/appBarIcons/musicinfo.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/go":                                  "\uE143", // group:General
-    "_ui/appBarIcons/go.comment":                         "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/keyboard":                            "\uE144", // group:System
-    "_ui/appBarIcons/keyboard.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/dockleft":                            "\uE145", // group:Layout
-    "_ui/appBarIcons/dockleft.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/dockright":                           "\uE146", // group:Layout
-    "_ui/appBarIcons/dockright.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/dockbottom":                          "\uE147", // group:Layout
-    "_ui/appBarIcons/dockbottom.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/remote":                              "\uE148", // group:System
-    "_ui/appBarIcons/remote.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/refresh":                             "\uE149", // group:Data
-    "_ui/appBarIcons/refresh.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/rotate":                              "\uE14A", // group:Layout
-    "_ui/appBarIcons/rotate.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/shuffle":                             "\uE14B", // group:Media
-    "_ui/appBarIcons/shuffle.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/list":                                "\uE14C", // group:Editing
-    "_ui/appBarIcons/list.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/shop":                                "\uE14D", // group:General
-    "_ui/appBarIcons/shop.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/selectall":                           "\uE14E", // group:Data
-    "_ui/appBarIcons/selectall.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/orientation":                         "\uE14F", // group:Layout
-    "_ui/appBarIcons/orientation.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/import":                              "\uE150", // group:Data
-    "_ui/appBarIcons/import.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/importall":                           "\uE151", // group:Data
-    "_ui/appBarIcons/importall.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/browsephotos":                        "\uE155", // group:Media
-    "_ui/appBarIcons/browsephotos.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/webcam":                              "\uE156", // group:System
-    "_ui/appBarIcons/webcam.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/pictures":                            "\uE158", // group:Media
-    "_ui/appBarIcons/pictures.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/savelocal":                           "\uE159", // group:File
-    "_ui/appBarIcons/savelocal.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/caption":                             "\uE15A", // group:Media
-    "_ui/appBarIcons/caption.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/stop":                                "\uE15B", // group:Media
-    "_ui/appBarIcons/stop.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/showresults":                         "\uE15C", // group:Data
-    "_ui/appBarIcons/showresults.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/volume":                              "\uE15D", // group:Media
-    "_ui/appBarIcons/volume.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/repair":                              "\uE15E", // group:System
-    "_ui/appBarIcons/repair.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/message":                             "\uE15F", // group:Communications
-    "_ui/appBarIcons/message.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/page2":                               "\uE160", // group:Layout
-    "_ui/appBarIcons/page2.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/calendarday":                         "\uE161", // group:Mail and calendar
-    "_ui/appBarIcons/calendarday.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/calendarweek":                        "\uE162", // group:Mail and calendar
-    "_ui/appBarIcons/calendarweek.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/calendar":                            "\uE163", // group:Mail and calendar
-    "_ui/appBarIcons/calendar.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/characters":                          "\uE164", // group:Editing
-    "_ui/appBarIcons/characters.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mailreplyall":                        "\uE165", // group:Mail and calendar
-    "_ui/appBarIcons/mailreplyall.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/read":                                "\uE166", // group:Mail and calendar
-    "_ui/appBarIcons/read.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/link":                                "\uE167", // group:Communications
-    "_ui/appBarIcons/link.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/accounts":                            "\uE168", // group:Communications
-    "_ui/appBarIcons/accounts.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/showbcc":                             "\uE169", // group:Mail and calendar
-    "_ui/appBarIcons/showbcc.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/hidebcc":                             "\uE16A", // group:Mail and calendar
-    "_ui/appBarIcons/hidebcc.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/cut":                                 "\uE16B", // group:Editing
-    "_ui/appBarIcons/cut.comment":                        "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/attach":                              "\uE16C", // group:Mail and calendar
-    "_ui/appBarIcons/attach.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/paste":                               "\uE16D", // group:Editing
-    "_ui/appBarIcons/paste.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/filter":                              "\uE16E", // group:Data
-    "_ui/appBarIcons/filter.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/copy":                                "\uE16F", // group:Editing
-    "_ui/appBarIcons/copy.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/emoji2":                              "\uE170", // group:Mail and calendar
-    "_ui/appBarIcons/emoji2.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/important":                           "\uE171", // group:Mail and calendar
-    "_ui/appBarIcons/important.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mailreply":                           "\uE172", // group:Mail and calendar
-    "_ui/appBarIcons/mailreply.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/slideshow":                           "\uE173", // group:Media
-    "_ui/appBarIcons/slideshow.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/sort":                                "\uE174", // group:Data
-    "_ui/appBarIcons/sort.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/manage":                              "\uE178", // group:System
-    "_ui/appBarIcons/manage.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/allapps":                             "\uE179", // group:System
-    "_ui/appBarIcons/allapps.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/disconnectdrive":                     "\uE17A", // group:System
-    "_ui/appBarIcons/disconnectdrive.comment":            "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mapdrive":                            "\uE17B", // group:System
-    "_ui/appBarIcons/mapdrive.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/newwindow":                           "\uE17C", // group:System
-    "_ui/appBarIcons/newwindow.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/openwith":                            "\uE17D", // group:System
-    "_ui/appBarIcons/openwith.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/contactpresence":                     "\uE181", // group:Communications
-    "_ui/appBarIcons/contactpresence.comment":            "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/priority":                            "\uE182", // group:Mail and calendar
-    "_ui/appBarIcons/priority.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/uploadskydrive":                      "\uE183", // group:File
-    "_ui/appBarIcons/uploadskydrive.comment":             "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/gototoday":                           "\uE184", // group:Mail and calendar
-    "_ui/appBarIcons/gototoday.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/font":                                "\uE185", // group:Editing
-    "_ui/appBarIcons/font.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/fontcolor":                           "\uE186", // group:Editing
-    "_ui/appBarIcons/fontcolor.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/contact2":                            "\uE187", // group:Communications
-    "_ui/appBarIcons/contact2.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/folder":                              "\uE188", // group:File
-    "_ui/appBarIcons/folder.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/audio":                               "\uE189", // group:Media
-    "_ui/appBarIcons/audio.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/placeholder":                         "\uE18A", // group:General
-    "_ui/appBarIcons/placeholder.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/view":                                "\uE18B", // group:Layout
-    "_ui/appBarIcons/view.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/setlockscreen":                       "\uE18C", // group:System
-    "_ui/appBarIcons/setlockscreen.comment":              "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/settile":                             "\uE18D", // group:System
-    "_ui/appBarIcons/settile.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/cc":                                  "\uE190", // group:Media
-    "_ui/appBarIcons/cc.comment":                         "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/stopslideshow":                       "\uE191", // group:Media
-    "_ui/appBarIcons/stopslideshow.comment":              "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/permissions":                         "\uE192", // group:System
-    "_ui/appBarIcons/permissions.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/highlight":                           "\uE193", // group:Editing
-    "_ui/appBarIcons/highlight.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/disableupdates":                      "\uE194", // group:System
-    "_ui/appBarIcons/disableupdates.comment":             "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/unfavorite":                          "\uE195", // group:Media
-    "_ui/appBarIcons/unfavorite.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/unpin":                               "\uE196", // group:System
-    "_ui/appBarIcons/unpin.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/openlocal":                           "\uE197", // group:File
-    "_ui/appBarIcons/openlocal.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/mute":                                "\uE198", // group:Media
-    "_ui/appBarIcons/mute.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/italic":                              "\uE199", // group:Editing
-    "_ui/appBarIcons/italic.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/underline":                           "\uE19A", // group:Editing
-    "_ui/appBarIcons/underline.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/bold":                                "\uE19B", // group:Editing
-    "_ui/appBarIcons/bold.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/movetofolder":                        "\uE19C", // group:File
-    "_ui/appBarIcons/movetofolder.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/likedislike":                         "\uE19D", // group:Data
-    "_ui/appBarIcons/likedislike.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/dislike":                             "\uE19E", // group:Data
-    "_ui/appBarIcons/dislike.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/like":                                "\uE19F", // group:Data
-    "_ui/appBarIcons/like.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/alignright":                          "\uE1A0", // group:Editing
-    "_ui/appBarIcons/alignright.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/aligncenter":                         "\uE1A1", // group:Editing
-    "_ui/appBarIcons/aligncenter.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/alignleft":                           "\uE1A2", // group:Editing
-    "_ui/appBarIcons/alignleft.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/zoom":                                "\uE1A3", // group:Layout
-    "_ui/appBarIcons/zoom.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/zoomout":                             "\uE1A4", // group:Layout
-    "_ui/appBarIcons/zoomout.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/openfile":                            "\uE1A5", // group:File
-    "_ui/appBarIcons/openfile.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/otheruser":                           "\uE1A6", // group:System
-    "_ui/appBarIcons/otheruser.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/admin":                               "\uE1A7", // group:System
-    "_ui/appBarIcons/admin.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/street":                              "\uE1C3", // group:General
-    "_ui/appBarIcons/street.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/map":                                 "\uE1C4", // group:General
-    "_ui/appBarIcons/map.comment":                        "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/clearselection":                      "\uE1C5", // group:Data
-    "_ui/appBarIcons/clearselection.comment":             "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/fontdecrease":                        "\uE1C6", // group:Editing
-    "_ui/appBarIcons/fontdecrease.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/fontincrease":                        "\uE1C7", // group:Editing
-    "_ui/appBarIcons/fontincrease.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/fontsize":                            "\uE1C8", // group:Editing
-    "_ui/appBarIcons/fontsize.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/cellphone":                           "\uE1C9", // group:Communications
-    "_ui/appBarIcons/cellphone.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/print":                               "\uE749", // group:Communications
-    "_ui/appBarIcons/print.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/share":                               "\uE72D", // group:Communications
-    "_ui/appBarIcons/share.comment":                      "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/reshare":                             "\uE1CA", // group:Communications
-    "_ui/appBarIcons/reshare.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/tag":                                 "\uE1CB", // group:Data
-    "_ui/appBarIcons/tag.comment":                        "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/repeatone":                           "\uE1CC", // group:Media
-    "_ui/appBarIcons/repeatone.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/repeatall":                           "\uE1CD", // group:Media
-    "_ui/appBarIcons/repeatall.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/outlinestar":                         "\uE1CE", // group:Data
-    "_ui/appBarIcons/outlinestar.comment":                "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/solidstar":                           "\uE1CF", // group:Data
-    "_ui/appBarIcons/solidstar.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/calculator":                          "\uE1D0", // group:General
-    "_ui/appBarIcons/calculator.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/directions":                          "\uE1D1", // group:General
-    "_ui/appBarIcons/directions.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/target":                              "\uE1D2", // group:General
-    "_ui/appBarIcons/target.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/library":                             "\uE1D3", // group:Media
-    "_ui/appBarIcons/library.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/phonebook":                           "\uE1D4", // group:Communications
-    "_ui/appBarIcons/phonebook.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/memo":                                "\uE1D5", // group:Communications
-    "_ui/appBarIcons/memo.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/microphone":                          "\uE1D6", // group:System
-    "_ui/appBarIcons/microphone.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/postupdate":                          "\uE1D7", // group:Communications
-    "_ui/appBarIcons/postupdate.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/backtowindow":                        "\uE1D8", // group:Layout
-    "_ui/appBarIcons/backtowindow.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/fullscreen":                          "\uE1D9", // group:Layout
-    "_ui/appBarIcons/fullscreen.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/newfolder":                           "\uE1DA", // group:File
-    "_ui/appBarIcons/newfolder.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/calendarreply":                       "\uE1DB", // group:Mail and calendar
-    "_ui/appBarIcons/calendarreply.comment":              "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/unsyncfolder":                        "\uE1DD", // group:File
-    "_ui/appBarIcons/unsyncfolder.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/reporthacked":                        "\uE1DE", // group:Communications
-    "_ui/appBarIcons/reporthacked.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/syncfolder":                          "\uE1DF", // group:File
-    "_ui/appBarIcons/syncfolder.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/blockcontact":                        "\uE1E0", // group:Communications
-    "_ui/appBarIcons/blockcontact.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/switchapps":                          "\uE1E1", // group:System
-    "_ui/appBarIcons/switchapps.comment":                 "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/addfriend":                           "\uE1E2", // group:Communications
-    "_ui/appBarIcons/addfriend.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/touchpointer":                        "\uE1E3", // group:System
-    "_ui/appBarIcons/touchpointer.comment":               "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/gotostart":                           "\uE1E4", // group:System
-    "_ui/appBarIcons/gotostart.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/zerobars":                            "\uE1E5", // group:System
-    "_ui/appBarIcons/zerobars.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/onebar":                              "\uE1E6", // group:System
-    "_ui/appBarIcons/onebar.comment":                     "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/twobars":                             "\uE1E7", // group:System
-    "_ui/appBarIcons/twobars.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/threebars":                           "\uE1E8", // group:System
-    "_ui/appBarIcons/threebars.comment":                  "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/fourbars":                            "\uE1E9", // group:System
-    "_ui/appBarIcons/fourbars.comment":                   "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/scan":                                "\uE294", // group:General
-    "_ui/appBarIcons/scan.comment":                       "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/preview":                             "\uE295", // group:General
-    "_ui/appBarIcons/preview.comment":                    "{Locked=qps-ploc,qps-plocm}",
-    "ui/appBarIcons/hamburger":                           "\uE700", // group:General
-    "_ui/appBarIcons/hamburger.comment":                  "{Locked=qps-ploc,qps-plocm}"
-}
-
-);
-}());
\ No newline at end of file
diff --git a/node_modules/winjs/js/ui.js b/node_modules/winjs/js/ui.js
deleted file mode 100644
index 6af438b..0000000
--- a/node_modules/winjs/js/ui.js
+++ /dev/null
@@ -1,55956 +0,0 @@
-
-/*! Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. */
-(function () {
-
-    var globalObject = 
-        typeof window !== 'undefined' ? window :
-        typeof self !== 'undefined' ? self :
-        typeof global !== 'undefined' ? global :
-        {};
-    (function (factory) {
-        if (typeof define === 'function' && define.amd) {
-            // amd
-            define(["./base"], factory);
-        } else {
-            globalObject.msWriteProfilerMark && msWriteProfilerMark('WinJS.4.4 4.4.2.winjs.2017.3.14 ui.js,StartTM');
-            if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
-                // CommonJS
-                factory(require("./base"));
-            } else {
-                // No module system
-                factory(globalObject.WinJS);
-            }
-            globalObject.msWriteProfilerMark && msWriteProfilerMark('WinJS.4.4 4.4.2.winjs.2017.3.14 ui.js,StopTM');
-        }
-    }(function (WinJS) {
-
-
-var require = WinJS.Utilities._require;
-var define = WinJS.Utilities._define;
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// Virtualized Data Source
-define('WinJS/VirtualizedDataSource/_VirtualizedDataSourceImpl',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Events',
-    '../Core/_Log',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../Promise',
-    '../Scheduler',
-    '../_Signal',
-    '../Utilities/_UI'
-    ], function listDataSourceInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, Promise, Scheduler, _Signal, _UI) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-
-        VirtualizedDataSource: _Base.Namespace._lazy(function () {
-            var MAX_BEGINREFRESH_COUNT = 100;
-            var uniqueID = 1;
-
-            var DataSourceStatus = _UI.DataSourceStatus,
-            CountResult = _UI.CountResult,
-            FetchError = _UI.FetchError,
-            EditError = _UI.EditError;
-
-            // Private statics
-
-            var strings = {
-                get listDataAdapterIsInvalid() { return "Invalid argument: listDataAdapter must be an object or an array."; },
-                get indexIsInvalid() { return "Invalid argument: index must be a non-negative integer."; },
-                get keyIsInvalid() { return "Invalid argument: key must be a string."; },
-                get invalidItemReturned() { return "Error: data adapter returned item that is not an object."; },
-                get invalidKeyReturned() { return "Error: data adapter returned item with undefined or null key."; },
-                get invalidIndexReturned() { return "Error: data adapter should return undefined, null or a non-negative integer for the index."; },
-                get invalidCountReturned() { return "Error: data adapter should return undefined, null, CountResult.unknown, or a non-negative integer for the count."; },
-                get invalidRequestedCountReturned() { return "Error: data adapter should return CountResult.unknown, CountResult.failure, or a non-negative integer for the count."; },
-                get refreshCycleIdentified() { return "refresh cycle found, likely data inconsistency"; },
-            };
-
-            var statusChangedEvent = "statuschanged";
-
-            function _baseDataSourceConstructor(listDataAdapter, options) {
-                /// <signature helpKeyword="WinJS.UI.VirtualizedDataSource._baseDataSourceConstructor">
-                /// <summary locid="WinJS.UI.VirtualizedDataSource._baseDataSourceConstructor">
-                /// Initializes the VirtualizedDataSource base class of a custom data source.
-                /// </summary>
-                /// <param name="listDataAdapter" type="IListDataAdapter" locid="WinJS.UI.VirtualizedDataSource._baseDataSourceConstructor_p:itemIndex">
-                /// An object that implements IListDataAdapter and supplies data to the VirtualizedDataSource.
-                /// </param>
-                /// <param name="options" optional="true" type="Object" locid="WinJS.UI.VirtualizedDataSource._baseDataSourceConstructor_p:options">
-                /// An object that contains properties that specify additonal options for the VirtualizedDataSource:
-                ///
-                /// cacheSize
-                /// A Number that specifies minimum number of unrequested items to cache in case they are requested.
-                ///
-                /// The options parameter is optional.
-                /// </param>
-                /// </signature>
-
-                // Private members
-
-                /*jshint validthis: true */
-
-                var listDataNotificationHandler,
-                    cacheSize,
-                    status,
-                    statusPending,
-                    statusChangePosted,
-                    bindingMap,
-                    nextListBindingID,
-                    nextHandle,
-                    nextListenerID,
-                    getCountPromise,
-                    resultsProcessed,
-                    beginEditsCalled,
-                    editsInProgress,
-                    firstEditInProgress,
-                    editQueue,
-                    editsQueued,
-                    synchronousEdit,
-                    waitForRefresh,
-                    dataNotificationsInProgress,
-                    countDelta,
-                    indexUpdateDeferred,
-                    nextTempKey,
-                    currentRefreshID,
-                    fetchesPosted,
-                    nextFetchID,
-                    fetchesInProgress,
-                    fetchCompleteCallbacks,
-                    startMarker,
-                    endMarker,
-                    knownCount,
-                    slotsStart,
-                    slotListEnd,
-                    slotsEnd,
-                    handleMap,
-                    keyMap,
-                    indexMap,
-                    releasedSlots,
-                    lastSlotReleased,
-                    reduceReleasedSlotCountPosted,
-                    refreshRequested,
-                    refreshInProgress,
-                    refreshSignal,
-                    refreshFetchesInProgress,
-                    refreshItemsFetched,
-                    refreshCount,
-                    refreshStart,
-                    refreshEnd,
-                    keyFetchIDs,
-                    refreshKeyMap,
-                    refreshIndexMap,
-                    deletedKeys,
-                    synchronousProgress,
-                    reentrantContinue,
-                    synchronousRefresh,
-                    reentrantRefresh;
-
-                var beginRefreshCount = 0,
-                    refreshHistory = new Array(100),
-                    refreshHistoryPos = -1;
-
-                var itemsFromKey,
-                    itemsFromIndex,
-                    itemsFromStart,
-                    itemsFromEnd,
-                    itemsFromDescription;
-
-                if (listDataAdapter.itemsFromKey) {
-                    itemsFromKey = function (fetchID, key, countBefore, countAfter, hints) {
-                        var perfID = "fetchItemsFromKey id=" + fetchID + " key=" + key + " countBefore=" + countBefore + " countAfter=" + countAfter;
-                        profilerMarkStart(perfID);
-                        refreshHistory[++refreshHistoryPos % refreshHistory.length] = { kind: "itemsFromKey", key: key, countBefore: countBefore, countAfter: countAfter };
-                        var result = listDataAdapter.itemsFromKey(key, countBefore, countAfter, hints);
-                        profilerMarkEnd(perfID);
-                        return result;
-                    };
-                }
-                if (listDataAdapter.itemsFromIndex) {
-                    itemsFromIndex = function (fetchID, index, countBefore, countAfter) {
-                        var perfID = "fetchItemsFromIndex id=" + fetchID + " index=" + index + " countBefore=" + countBefore + " countAfter=" + countAfter;
-                        profilerMarkStart(perfID);
-                        refreshHistory[++refreshHistoryPos % refreshHistory.length] = { kind: "itemsFromIndex", index: index, countBefore: countBefore, countAfter: countAfter };
-                        var result = listDataAdapter.itemsFromIndex(index, countBefore, countAfter);
-                        profilerMarkEnd(perfID);
-                        return result;
-                    };
-                }
-                if (listDataAdapter.itemsFromStart) {
-                    itemsFromStart = function (fetchID, count) {
-                        var perfID = "fetchItemsFromStart id=" + fetchID + " count=" + count;
-                        profilerMarkStart(perfID);
-                        refreshHistory[++refreshHistoryPos % refreshHistory.length] = { kind: "itemsFromStart", count: count };
-                        var result = listDataAdapter.itemsFromStart(count);
-                        profilerMarkEnd(perfID);
-                        return result;
-                    };
-                }
-                if (listDataAdapter.itemsFromEnd) {
-                    itemsFromEnd = function (fetchID, count) {
-                        var perfID = "fetchItemsFromEnd id=" + fetchID + " count=" + count;
-                        profilerMarkStart(perfID);
-                        refreshHistory[++refreshHistoryPos % refreshHistory.length] = { kind: "itemsFromEnd", count: count };
-                        var result = listDataAdapter.itemsFromEnd(count);
-                        profilerMarkEnd(perfID);
-                        return result;
-                    };
-                }
-                if (listDataAdapter.itemsFromDescription) {
-                    itemsFromDescription = function (fetchID, description, countBefore, countAfter) {
-                        var perfID = "fetchItemsFromDescription id=" + fetchID + " desc=" + description + " countBefore=" + countBefore + " countAfter=" + countAfter;
-                        profilerMarkStart(perfID);
-                        refreshHistory[++refreshHistoryPos % refreshHistory.length] = { kind: "itemsFromDescription", description: description, countBefore: countBefore, countAfter: countAfter };
-                        var result = listDataAdapter.itemsFromDescription(description, countBefore, countAfter);
-                        profilerMarkEnd(perfID);
-                        return result;
-                    };
-                }
-
-                var dataSourceID = ++uniqueID;
-
-                function profilerMarkStart(text) {
-                    var message = "WinJS.UI.VirtualizedDataSource:" + dataSourceID + ":" + text + ",StartTM";
-                    _WriteProfilerMark(message);
-                    _Log.log && _Log.log(message, "winjs vds", "perf");
-                }
-                function profilerMarkEnd(text) {
-                    var message = "WinJS.UI.VirtualizedDataSource:" + dataSourceID + ":" + text + ",StopTM";
-                    _WriteProfilerMark(message);
-                    _Log.log && _Log.log(message, "winjs vds", "perf");
-                }
-
-                function isNonNegativeNumber(n) {
-                    return (typeof n === "number") && n >= 0;
-                }
-
-                function isNonNegativeInteger(n) {
-                    return isNonNegativeNumber(n) && n === Math.floor(n);
-                }
-
-                function validateIndexReturned(index) {
-                    // Ensure that index is always undefined or a non-negative integer
-                    if (index === null) {
-                        index = undefined;
-                    } else if (index !== undefined && !isNonNegativeInteger(index)) {
-                        throw new _ErrorFromName("WinJS.UI.ListDataSource.InvalidIndexReturned", strings.invalidIndexReturned);
-                    }
-
-                    return index;
-                }
-
-                function validateCountReturned(count) {
-                    // Ensure that count is always undefined or a non-negative integer
-                    if (count === null) {
-                        count = undefined;
-                    } else if (count !== undefined && !isNonNegativeInteger(count) && count !== CountResult.unknown) {
-                        throw new _ErrorFromName("WinJS.UI.ListDataSource.InvalidCountReturned", strings.invalidCountReturned);
-                    }
-
-                    return count;
-                }
-
-                // Slot List
-
-                function createSlot() {
-                    var handle = (nextHandle++).toString(),
-                        slotNew = {
-                            handle: handle,
-                            item: null,
-                            itemNew: null,
-                            fetchListeners: null,
-                            cursorCount: 0,
-                            bindingMap: null
-                        };
-
-                    // Deliberately not initialized:
-                    //   - directFetchListeners
-
-                    handleMap[handle] = slotNew;
-
-                    return slotNew;
-                }
-
-                function createPrimarySlot() {
-                    return createSlot();
-                }
-
-                function insertSlot(slot, slotNext) {
-                    slot.prev = slotNext.prev;
-                    slot.next = slotNext;
-
-                    slot.prev.next = slot;
-                    slotNext.prev = slot;
-                }
-
-                function removeSlot(slot) {
-                    if (slot.lastInSequence) {
-                        delete slot.lastInSequence;
-                        slot.prev.lastInSequence = true;
-                    }
-                    if (slot.firstInSequence) {
-                        delete slot.firstInSequence;
-                        slot.next.firstInSequence = true;
-                    }
-                    slot.prev.next = slot.next;
-                    slot.next.prev = slot.prev;
-                }
-
-                function sequenceStart(slot) {
-                    while (!slot.firstInSequence) {
-                        slot = slot.prev;
-                    }
-
-                    return slot;
-                }
-
-                function sequenceEnd(slot) {
-                    while (!slot.lastInSequence) {
-                        slot = slot.next;
-                    }
-
-                    return slot;
-                }
-
-                // Does a little careful surgery to the slot sequence from slotFirst to slotLast before slotNext
-                function moveSequenceBefore(slotNext, slotFirst, slotLast) {
-                    slotFirst.prev.next = slotLast.next;
-                    slotLast.next.prev = slotFirst.prev;
-
-                    slotFirst.prev = slotNext.prev;
-                    slotLast.next = slotNext;
-
-                    slotFirst.prev.next = slotFirst;
-                    slotNext.prev = slotLast;
-
-                    return true;
-                }
-
-                // Does a little careful surgery to the slot sequence from slotFirst to slotLast after slotPrev
-                function moveSequenceAfter(slotPrev, slotFirst, slotLast) {
-                    slotFirst.prev.next = slotLast.next;
-                    slotLast.next.prev = slotFirst.prev;
-
-                    slotFirst.prev = slotPrev;
-                    slotLast.next = slotPrev.next;
-
-                    slotPrev.next = slotFirst;
-                    slotLast.next.prev = slotLast;
-
-                    return true;
-                }
-
-                function mergeSequences(slotPrev) {
-                    delete slotPrev.lastInSequence;
-                    delete slotPrev.next.firstInSequence;
-                }
-
-                function splitSequence(slotPrev) {
-                    var slotNext = slotPrev.next;
-
-                    slotPrev.lastInSequence = true;
-                    slotNext.firstInSequence = true;
-
-                    if (slotNext === slotListEnd) {
-                        // Clear slotListEnd's index, as that's now unknown
-                        changeSlotIndex(slotListEnd, undefined);
-                    }
-                }
-
-                // Inserts a slot in the middle of a sequence or between sequences.  If the latter, mergeWithPrev and mergeWithNext
-                // parameters specify whether to merge the slot with the previous sequence, or next, or neither.
-                function insertAndMergeSlot(slot, slotNext, mergeWithPrev, mergeWithNext) {
-                    insertSlot(slot, slotNext);
-
-                    var slotPrev = slot.prev;
-
-                    if (slotPrev.lastInSequence) {
-                        if (mergeWithPrev) {
-                            delete slotPrev.lastInSequence;
-                        } else {
-                            slot.firstInSequence = true;
-                        }
-
-                        if (mergeWithNext) {
-                            delete slotNext.firstInSequence;
-                        } else {
-                            slot.lastInSequence = true;
-                        }
-                    }
-                }
-
-                // Keys and Indices
-
-                function setSlotKey(slot, key) {
-                    slot.key = key;
-
-                    // Add the slot to the keyMap, so it is possible to quickly find the slot given its key
-                    keyMap[slot.key] = slot;
-                }
-
-                function setSlotIndex(slot, index, indexMapForSlot) {
-                    // Tolerate NaN, so clients can pass (undefined - 1) or (undefined + 1)
-                    if (+index === index) {
-                        slot.index = index;
-
-                        // Add the slot to the indexMap, so it is possible to quickly find the slot given its index
-                        indexMapForSlot[index] = slot;
-
-                        if (!indexUpdateDeferred) {
-                            // See if any sequences should be merged
-                            if (slot.firstInSequence && slot.prev && slot.prev.index === index - 1) {
-                                mergeSequences(slot.prev);
-                            }
-                            if (slot.lastInSequence && slot.next && slot.next.index === index + 1) {
-                                mergeSequences(slot);
-                            }
-                        }
-                    }
-                }
-
-                // Creates a new slot and adds it to the slot list before slotNext
-                function createAndAddSlot(slotNext, indexMapForSlot) {
-                    var slotNew = (indexMapForSlot === indexMap ? createPrimarySlot() : createSlot());
-
-                    insertSlot(slotNew, slotNext);
-
-                    return slotNew;
-                }
-
-                function createSlotSequence(slotNext, index, indexMapForSlot) {
-                    var slotNew = createAndAddSlot(slotNext, indexMapForSlot);
-
-                    slotNew.firstInSequence = true;
-                    slotNew.lastInSequence = true;
-
-                    setSlotIndex(slotNew, index, indexMapForSlot);
-
-                    return slotNew;
-                }
-
-                function createPrimarySlotSequence(slotNext, index) {
-                    return createSlotSequence(slotNext, index, indexMap);
-                }
-
-                function addSlotBefore(slotNext, indexMapForSlot) {
-                    var slotNew = createAndAddSlot(slotNext, indexMapForSlot);
-                    delete slotNext.firstInSequence;
-
-                    // See if we've bumped into the previous sequence
-                    if (slotNew.prev.index === slotNew.index - 1) {
-                        delete slotNew.prev.lastInSequence;
-                    } else {
-                        slotNew.firstInSequence = true;
-                    }
-
-                    setSlotIndex(slotNew, slotNext.index - 1, indexMapForSlot);
-
-                    return slotNew;
-                }
-
-                function addSlotAfter(slotPrev, indexMapForSlot) {
-                    var slotNew = createAndAddSlot(slotPrev.next, indexMapForSlot);
-                    delete slotPrev.lastInSequence;
-
-                    // See if we've bumped into the next sequence
-                    if (slotNew.next.index === slotNew.index + 1) {
-                        delete slotNew.next.firstInSequence;
-                    } else {
-                        slotNew.lastInSequence = true;
-                    }
-
-                    setSlotIndex(slotNew, slotPrev.index + 1, indexMapForSlot);
-
-                    return slotNew;
-                }
-
-                function reinsertSlot(slot, slotNext, mergeWithPrev, mergeWithNext) {
-                    insertAndMergeSlot(slot, slotNext, mergeWithPrev, mergeWithNext);
-                    keyMap[slot.key] = slot;
-                    if (slot.index !== undefined) {
-                        indexMap[slot.index] = slot;
-                    }
-                }
-
-                function removeSlotPermanently(slot) {
-                    removeSlot(slot);
-
-                    if (slot.key) {
-                        delete keyMap[slot.key];
-                    }
-                    if (slot.index !== undefined && indexMap[slot.index] === slot) {
-                        delete indexMap[slot.index];
-                    }
-
-                    var bindingMap = slot.bindingMap;
-                    for (var listBindingID in bindingMap) {
-                        var handle = bindingMap[listBindingID].handle;
-                        if (handle && handleMap[handle] === slot) {
-                            delete handleMap[handle];
-                        }
-                    }
-
-                    // Invalidating the slot's handle marks it as deleted
-                    if (handleMap[slot.handle] === slot) {
-                        delete handleMap[slot.handle];
-                    }
-                }
-
-                function slotPermanentlyRemoved(slot) {
-                    return !handleMap[slot.handle];
-                }
-
-                function successorFromIndex(index, indexMapForSlot, listStart, listEnd, skipPreviousIndex) {
-                    // Try the previous index
-                    var slotNext = (skipPreviousIndex ? null : indexMapForSlot[index - 1]);
-                    if (slotNext && (slotNext.next !== listEnd || listEnd.firstInSequence)) {
-                        // We want the successor
-                        slotNext = slotNext.next;
-                    } else {
-                        // Try the next index
-                        slotNext = indexMapForSlot[index + 1];
-                        if (!slotNext) {
-                            // Resort to a linear search
-                            slotNext = listStart.next;
-                            var lastSequenceStart;
-                            while (true) {
-                                if (slotNext.firstInSequence) {
-                                    lastSequenceStart = slotNext;
-                                }
-
-                                if (!(index >= slotNext.index) || slotNext === listEnd) {
-                                    break;
-                                }
-
-                                slotNext = slotNext.next;
-                            }
-
-                            if (slotNext === listEnd && !listEnd.firstInSequence) {
-                                // Return the last insertion point between sequences, or undefined if none
-                                slotNext = (lastSequenceStart && lastSequenceStart.index === undefined ? lastSequenceStart : undefined);
-                            }
-                        }
-                    }
-
-                    return slotNext;
-                }
-
-                // Slot Items
-
-                function isPlaceholder(slot) {
-                    return !slot.item && !slot.itemNew && slot !== slotListEnd;
-                }
-
-                function defineHandleProperty(item, handle) {
-                    Object.defineProperty(item, "handle", {
-                        value: handle,
-                        writable: false,
-                        enumerable: false,
-                        configurable: true
-                    });
-                }
-
-                function defineCommonItemProperties(item, slot, handle) {
-                    defineHandleProperty(item, handle);
-
-                    Object.defineProperty(item, "index", {
-                        get: function () {
-                            while (slot.slotMergedWith) {
-                                slot = slot.slotMergedWith;
-                            }
-
-                            return slot.index;
-                        },
-                        enumerable: false,
-                        configurable: true
-                    });
-                }
-
-                function validateData(data) {
-                    if (data === undefined) {
-                        return data;
-                    } else {
-                        // Convert the data object to JSON to enforce the constraints we want.  For example, we don't want
-                        // functions, arrays with extra properties, DOM objects, cyclic or acyclic graphs, or undefined values.
-                        var dataValidated = JSON.stringify(data);
-
-                        if (dataValidated === undefined) {
-                            throw new _ErrorFromName("WinJS.UI.ListDataSource.ObjectIsNotValidJson", strings.objectIsNotValidJson);
-                        }
-
-                        return dataValidated;
-                    }
-                }
-
-                function itemSignature(item) {
-                    return (
-                        listDataAdapter.itemSignature ?
-                            listDataAdapter.itemSignature(item.data) :
-                            validateData(item.data)
-                    );
-                }
-
-                function prepareSlotItem(slot) {
-                    var item = slot.itemNew;
-                    slot.itemNew = null;
-
-                    if (item) {
-                        item = Object.create(item);
-                        defineCommonItemProperties(item, slot, slot.handle);
-
-                        if (!listDataAdapter.compareByIdentity) {
-                            // Store the item signature or a stringified copy of the data for comparison later
-                            slot.signature = itemSignature(item);
-                        }
-                    }
-
-                    slot.item = item;
-
-                    delete slot.indexRequested;
-                    delete slot.keyRequested;
-                }
-
-                // Slot Caching
-
-                function slotRetained(slot) {
-                    return slot.bindingMap || slot.cursorCount > 0;
-                }
-
-                function slotRequested(slot) {
-                    return slotRetained(slot) || slot.fetchListeners || slot.directFetchListeners;
-                }
-
-                function slotLive(slot) {
-                    return slotRequested(slot) || (!slot.firstInSequence && slotRetained(slot.prev)) || (!slot.lastInSequence && slotRetained(slot.next)) ||
-                        (!itemsFromIndex && (
-                            (!slot.firstInSequence && slot.prev !== slotsStart && !(slot.prev.item || slot.prev.itemNew)) |
-                            (!slot.lastInSequence && slot.next !== slotListEnd && !(slot.next.item || slot.next.itemNew))
-                        ));
-                }
-
-                function deleteUnnecessarySlot(slot) {
-                    splitSequence(slot);
-                    removeSlotPermanently(slot);
-                }
-
-                function reduceReleasedSlotCount() {
-                    // Must not release slots while edits are queued, as undo queue might refer to them
-                    if (!editsQueued) {
-                        // If lastSlotReleased is no longer valid, use the end of the list instead
-                        if (!lastSlotReleased || slotPermanentlyRemoved(lastSlotReleased)) {
-                            lastSlotReleased = slotListEnd.prev;
-                        }
-
-                        // Now use the simple heuristic of walking outwards in both directions from lastSlotReleased until the
-                        // desired cache size is reached, then removing everything else.
-                        var slotPrev = lastSlotReleased.prev,
-                            slotNext = lastSlotReleased.next,
-                            releasedSlotsFound = 0;
-
-                        var considerDeletingSlot = function (slotToDelete) {
-                            if (slotToDelete !== slotListEnd && !slotLive(slotToDelete)) {
-                                if (releasedSlotsFound <= cacheSize) {
-                                    releasedSlotsFound++;
-                                } else {
-                                    deleteUnnecessarySlot(slotToDelete);
-                                }
-                            }
-                        };
-
-                        while (slotPrev || slotNext) {
-                            if (slotPrev) {
-                                var slotPrevToDelete = slotPrev;
-                                slotPrev = slotPrevToDelete.prev;
-                                if (slotPrevToDelete !== slotsStart) {
-                                    considerDeletingSlot(slotPrevToDelete);
-                                }
-                            }
-                            if (slotNext) {
-                                var slotNextToDelete = slotNext;
-                                slotNext = slotNextToDelete.next;
-                                if (slotNextToDelete !== slotsEnd) {
-                                    considerDeletingSlot(slotNextToDelete);
-                                }
-                            }
-                        }
-
-                        // Reset the count to zero, so this method is only called periodically
-                        releasedSlots = 0;
-                    }
-                }
-
-                function releaseSlotIfUnrequested(slot) {
-                    if (!slotRequested(slot)) {
-
-                        releasedSlots++;
-
-                        // Must not release slots while edits are queued, as undo queue might refer to them.  If a refresh is in
-                        // progress, retain all slots, just in case the user re-requests some of them before the refresh completes.
-                        if (!editsQueued && !refreshInProgress) {
-                            // Track which slot was released most recently
-                            lastSlotReleased = slot;
-
-                            // See if the number of released slots has exceeded the cache size.  In practice there will be more
-                            // live slots than retained slots, so this is just a heuristic to periodically shrink the cache.
-                            if (releasedSlots > cacheSize && !reduceReleasedSlotCountPosted) {
-                                reduceReleasedSlotCountPosted = true;
-                                Scheduler.schedule(function VDS_async_releaseSlotIfUnrequested() {
-                                    reduceReleasedSlotCountPosted = false;
-                                    reduceReleasedSlotCount();
-                                }, Scheduler.Priority.idle, null, "WinJS.UI.VirtualizedDataSource.releaseSlotIfUnrequested");
-                            }
-                        }
-                    }
-                }
-
-                // Notifications
-
-                function forEachBindingRecord(callback) {
-                    for (var listBindingID in bindingMap) {
-                        callback(bindingMap[listBindingID]);
-                    }
-                }
-
-                function forEachBindingRecordOfSlot(slot, callback) {
-                    for (var listBindingID in slot.bindingMap) {
-                        callback(slot.bindingMap[listBindingID].bindingRecord, listBindingID);
-                    }
-                }
-
-                function handlerToNotify(bindingRecord) {
-                    if (!bindingRecord.notificationsSent) {
-                        bindingRecord.notificationsSent = true;
-
-                        if (bindingRecord.notificationHandler.beginNotifications) {
-                            bindingRecord.notificationHandler.beginNotifications();
-                        }
-                    }
-                    return bindingRecord.notificationHandler;
-                }
-
-                function finishNotifications() {
-                    if (!editsInProgress && !dataNotificationsInProgress) {
-                        forEachBindingRecord(function (bindingRecord) {
-                            if (bindingRecord.notificationsSent) {
-                                bindingRecord.notificationsSent = false;
-
-                                if (bindingRecord.notificationHandler.endNotifications) {
-                                    bindingRecord.notificationHandler.endNotifications();
-                                }
-                            }
-                        });
-                    }
-                }
-
-                function handleForBinding(slot, listBindingID) {
-                    var bindingMap = slot.bindingMap;
-                    if (bindingMap) {
-                        var slotBinding = bindingMap[listBindingID];
-                        if (slotBinding) {
-                            var handle = slotBinding.handle;
-                            if (handle) {
-                                return handle;
-                            }
-                        }
-                    }
-                    return slot.handle;
-                }
-
-                function itemForBinding(item, handle) {
-                    if (item && item.handle !== handle) {
-                        item = Object.create(item);
-                        defineHandleProperty(item, handle);
-                    }
-                    return item;
-                }
-
-                function changeCount(count) {
-                    var oldCount = knownCount;
-                    knownCount = count;
-
-                    forEachBindingRecord(function (bindingRecord) {
-                        if (bindingRecord.notificationHandler && bindingRecord.notificationHandler.countChanged) {
-                            handlerToNotify(bindingRecord).countChanged(knownCount, oldCount);
-                        }
-                    });
-                }
-
-                function sendIndexChangedNotifications(slot, indexOld) {
-                    forEachBindingRecordOfSlot(slot, function (bindingRecord, listBindingID) {
-                        if (bindingRecord.notificationHandler.indexChanged) {
-                            handlerToNotify(bindingRecord).indexChanged(handleForBinding(slot, listBindingID), slot.index, indexOld);
-                        }
-                    });
-                }
-
-                function changeSlotIndex(slot, index) {
-                    var indexOld = slot.index;
-
-                    if (indexOld !== undefined && indexMap[indexOld] === slot) {
-                        // Remove the slot's old index from the indexMap
-                        delete indexMap[indexOld];
-                    }
-
-                    // Tolerate NaN, so clients can pass (undefined - 1) or (undefined + 1)
-                    if (+index === index) {
-                        setSlotIndex(slot, index, indexMap);
-                    } else if (+indexOld === indexOld) {
-                        delete slot.index;
-                    } else {
-                        // If neither the new index or the old index is defined then there was no index changed.
-                        return;
-                    }
-
-                    sendIndexChangedNotifications(slot, indexOld);
-                }
-
-                function insertionNotificationRecipients(slot, slotPrev, slotNext, mergeWithPrev, mergeWithNext) {
-                    var bindingMapRecipients = {};
-
-                    // Start with the intersection of the bindings for the two adjacent slots
-                    if ((mergeWithPrev || !slotPrev.lastInSequence) && (mergeWithNext || !slotNext.firstInSequence)) {
-                        if (slotPrev === slotsStart) {
-                            if (slotNext === slotListEnd) {
-                                // Special case: if the list was empty, broadcast the insertion to all ListBindings with
-                                // notification handlers.
-                                for (var listBindingID in bindingMap) {
-                                    bindingMapRecipients[listBindingID] = bindingMap[listBindingID];
-                                }
-                            } else {
-                                // Include every binding on the next slot
-                                for (var listBindingID in slotNext.bindingMap) {
-                                    bindingMapRecipients[listBindingID] = bindingMap[listBindingID];
-                                }
-                            }
-                        } else if (slotNext === slotListEnd || slotNext.bindingMap) {
-                            for (var listBindingID in slotPrev.bindingMap) {
-                                if (slotNext === slotListEnd || slotNext.bindingMap[listBindingID]) {
-                                    bindingMapRecipients[listBindingID] = bindingMap[listBindingID];
-                                }
-                            }
-                        }
-                    }
-
-                    // Use the union of that result with the bindings for the slot being inserted
-                    for (var listBindingID in slot.bindingMap) {
-                        bindingMapRecipients[listBindingID] = bindingMap[listBindingID];
-                    }
-
-                    return bindingMapRecipients;
-                }
-
-                function sendInsertedNotification(slot) {
-                    var slotPrev = slot.prev,
-                        slotNext = slot.next,
-                        bindingMapRecipients = insertionNotificationRecipients(slot, slotPrev, slotNext),
-                        listBindingID;
-
-                    for (listBindingID in bindingMapRecipients) {
-                        var bindingRecord = bindingMapRecipients[listBindingID];
-                        if (bindingRecord.notificationHandler) {
-                            handlerToNotify(bindingRecord).inserted(bindingRecord.itemPromiseFromKnownSlot(slot),
-                                slotPrev.lastInSequence || slotPrev === slotsStart ? null : handleForBinding(slotPrev, listBindingID),
-                                slotNext.firstInSequence || slotNext === slotListEnd ? null : handleForBinding(slotNext, listBindingID)
-                            );
-                        }
-                    }
-                }
-
-                function changeSlot(slot) {
-                    var itemOld = slot.item;
-                    prepareSlotItem(slot);
-
-                    forEachBindingRecordOfSlot(slot, function (bindingRecord, listBindingID) {
-                        var handle = handleForBinding(slot, listBindingID);
-                        handlerToNotify(bindingRecord).changed(itemForBinding(slot.item, handle), itemForBinding(itemOld, handle));
-                    });
-                }
-
-                function moveSlot(slot, slotMoveBefore, mergeWithPrev, mergeWithNext, skipNotifications) {
-                    var slotMoveAfter = slotMoveBefore.prev,
-                        listBindingID;
-
-                    // If the slot is being moved before or after itself, adjust slotMoveAfter or slotMoveBefore accordingly. If
-                    // nothing is going to change in the slot list, don't send a notification.
-                    if (slotMoveBefore === slot) {
-                        if (!slot.firstInSequence || !mergeWithPrev) {
-                            return;
-                        }
-                        slotMoveBefore = slot.next;
-                    } else if (slotMoveAfter === slot) {
-                        if (!slot.lastInSequence || !mergeWithNext) {
-                            return;
-                        }
-                        slotMoveAfter = slot.prev;
-                    }
-
-                    if (!skipNotifications) {
-                        // Determine which bindings to notify
-
-                        var bindingMapRecipients = insertionNotificationRecipients(slot, slotMoveAfter, slotMoveBefore, mergeWithPrev, mergeWithNext);
-
-                        // Send the notification before the move
-                        for (listBindingID in bindingMapRecipients) {
-                            var bindingRecord = bindingMapRecipients[listBindingID];
-                            handlerToNotify(bindingRecord).moved(bindingRecord.itemPromiseFromKnownSlot(slot),
-                                ((slotMoveAfter.lastInSequence || slotMoveAfter === slot.prev) && !mergeWithPrev) || slotMoveAfter === slotsStart ? null : handleForBinding(slotMoveAfter, listBindingID),
-                                ((slotMoveBefore.firstInSequence || slotMoveBefore === slot.next) && !mergeWithNext) || slotMoveBefore === slotListEnd ? null : handleForBinding(slotMoveBefore, listBindingID)
-                            );
-                        }
-
-                        // If a ListBinding cursor is at the slot that's moving, adjust the cursor
-                        forEachBindingRecord(function (bindingRecord) {
-                            bindingRecord.adjustCurrentSlot(slot);
-                        });
-                    }
-
-                    removeSlot(slot);
-                    insertAndMergeSlot(slot, slotMoveBefore, mergeWithPrev, mergeWithNext);
-                }
-
-                function deleteSlot(slot, mirage) {
-                    completeFetchPromises(slot, true);
-
-                    forEachBindingRecordOfSlot(slot, function (bindingRecord, listBindingID) {
-                        handlerToNotify(bindingRecord).removed(handleForBinding(slot, listBindingID), mirage);
-                    });
-
-                    // If a ListBinding cursor is at the slot that's being removed, adjust the cursor
-                    forEachBindingRecord(function (bindingRecord) {
-                        bindingRecord.adjustCurrentSlot(slot);
-                    });
-
-                    removeSlotPermanently(slot);
-                }
-
-                function deleteMirageSequence(slot) {
-                    // Remove the slots in order
-
-                    while (!slot.firstInSequence) {
-                        slot = slot.prev;
-                    }
-
-                    var last;
-                    do {
-                        last = slot.lastInSequence;
-
-                        var slotNext = slot.next;
-                        deleteSlot(slot, true);
-                        slot = slotNext;
-                    } while (!last);
-                }
-
-                // Deferred Index Updates
-
-                // Returns the index of the slot taking into account any outstanding index updates
-                function adjustedIndex(slot) {
-                    var undefinedIndex;
-
-                    if (!slot) {
-                        return undefinedIndex;
-                    }
-
-                    var delta = 0;
-                    while (!slot.firstInSequence) {
-                        delta++;
-                        slot = slot.prev;
-                    }
-
-                    return (
-                        typeof slot.indexNew === "number" ?
-                            slot.indexNew + delta :
-                        typeof slot.index === "number" ?
-                            slot.index + delta :
-                            undefinedIndex
-                    );
-                }
-
-                // Updates the new index of the first slot in each sequence after the given slot
-                function updateNewIndicesAfterSlot(slot, indexDelta) {
-                    // Adjust all the indexNews after this slot
-                    for (slot = slot.next; slot; slot = slot.next) {
-                        if (slot.firstInSequence) {
-                            var indexNew = (slot.indexNew !== undefined ? slot.indexNew : slot.index);
-                            if (indexNew !== undefined) {
-                                slot.indexNew = indexNew + indexDelta;
-                            }
-                        }
-                    }
-
-                    // Adjust the overall count
-                    countDelta += indexDelta;
-
-                    indexUpdateDeferred = true;
-
-                    // Increment currentRefreshID so any outstanding fetches don't cause trouble.  If a refresh is in progress,
-                    // restart it (which will also increment currentRefreshID).
-                    if (refreshInProgress) {
-                        beginRefresh();
-                    } else {
-                        currentRefreshID++;
-                    }
-                }
-
-                // Updates the new index of the given slot if necessary, and all subsequent new indices
-                function updateNewIndices(slot, indexDelta) {
-                    // If this slot is at the start of a sequence, transfer the indexNew
-                    if (slot.firstInSequence) {
-                        var indexNew;
-
-                        if (indexDelta < 0) {
-                            // The given slot is about to be removed
-                            indexNew = slot.indexNew;
-                            if (indexNew !== undefined) {
-                                delete slot.indexNew;
-                            } else {
-                                indexNew = slot.index;
-                            }
-
-                            if (!slot.lastInSequence) {
-                                // Update the next slot now
-                                slot = slot.next;
-                                if (indexNew !== undefined) {
-                                    slot.indexNew = indexNew;
-                                }
-                            }
-                        } else {
-                            // The given slot was just inserted
-                            if (!slot.lastInSequence) {
-                                var slotNext = slot.next;
-
-                                indexNew = slotNext.indexNew;
-                                if (indexNew !== undefined) {
-                                    delete slotNext.indexNew;
-                                } else {
-                                    indexNew = slotNext.index;
-                                }
-
-                                if (indexNew !== undefined) {
-                                    slot.indexNew = indexNew;
-                                }
-                            }
-                        }
-                    }
-
-                    updateNewIndicesAfterSlot(slot, indexDelta);
-                }
-
-                // Updates the new index of the first slot in each sequence after the given new index
-                function updateNewIndicesFromIndex(index, indexDelta) {
-                    for (var slot = slotsStart; slot !== slotListEnd; slot = slot.next) {
-                        var indexNew = slot.indexNew;
-
-                        if (indexNew !== undefined && index <= indexNew) {
-                            updateNewIndicesAfterSlot(slot, indexDelta);
-                            break;
-                        }
-                    }
-                }
-
-                // Adjust the indices of all slots to be consistent with any indexNew properties, and strip off the indexNews
-                function updateIndices() {
-                    var slot,
-                        slotFirstInSequence,
-                        indexNew;
-
-                    for (slot = slotsStart; ; slot = slot.next) {
-                        if (slot.firstInSequence) {
-                            slotFirstInSequence = slot;
-                            if (slot.indexNew !== undefined) {
-                                indexNew = slot.indexNew;
-                                delete slot.indexNew;
-                                if (isNaN(indexNew)) {
-                                    break;
-                                }
-                            } else {
-                                indexNew = slot.index;
-                            }
-
-                            // See if this sequence should be merged with the previous one
-                            if (slot !== slotsStart && slot.prev.index === indexNew - 1) {
-                                mergeSequences(slot.prev);
-                            }
-                        }
-
-                        if (slot.lastInSequence) {
-                            var index = indexNew;
-                            for (var slotUpdate = slotFirstInSequence; slotUpdate !== slot.next; slotUpdate = slotUpdate.next) {
-                                if (index !== slotUpdate.index) {
-                                    changeSlotIndex(slotUpdate, index);
-                                }
-                                if (+index === index) {
-                                    index++;
-                                }
-                            }
-                        }
-
-                        if (slot === slotListEnd) {
-                            break;
-                        }
-                    }
-
-                    // Clear any indices on slots that were moved adjacent to slots without indices
-                    for (; slot !== slotsEnd; slot = slot.next) {
-                        if (slot.index !== undefined && slot !== slotListEnd) {
-                            changeSlotIndex(slot, undefined);
-                        }
-                    }
-
-                    indexUpdateDeferred = false;
-
-                    if (countDelta && +knownCount === knownCount) {
-                        if (getCountPromise) {
-                            getCountPromise.reset();
-                        } else {
-                            changeCount(knownCount + countDelta);
-                        }
-
-                        countDelta = 0;
-                    }
-                }
-
-                // Fetch Promises
-
-                function createFetchPromise(slot, listenersProperty, listenerID, listBindingID, onComplete) {
-                    if (slot.item) {
-                        return new Promise(function (complete) {
-                            if (onComplete) {
-                                onComplete(complete, slot.item);
-                            } else {
-                                complete(slot.item);
-                            }
-                        });
-                    } else {
-                        var listener = {
-                            listBindingID: listBindingID,
-                            retained: false
-                        };
-
-                        if (!slot[listenersProperty]) {
-                            slot[listenersProperty] = {};
-                        }
-                        slot[listenersProperty][listenerID] = listener;
-
-                        listener.promise = new Promise(function (complete, error) {
-                            listener.complete = (onComplete ? function (item) {
-                                onComplete(complete, item);
-                            } : complete);
-                            listener.error = error;
-                        }, function () {
-                            // By now the slot might have been merged with another
-
-                            while (slot.slotMergedWith) {
-                                slot = slot.slotMergedWith;
-                            }
-
-                            var fetchListeners = slot[listenersProperty];
-                            if (fetchListeners) {
-                                delete fetchListeners[listenerID];
-
-                                // See if there are any other listeners
-                                if (Object.keys(fetchListeners).length > 0) {
-                                    return;
-                                }
-                                delete slot[listenersProperty];
-                            }
-                            releaseSlotIfUnrequested(slot);
-                        });
-
-                        return listener.promise;
-                    }
-                }
-
-                function completePromises(item, listeners) {
-                    for (var listenerID in listeners) {
-                        listeners[listenerID].complete(item);
-                    }
-                }
-
-                function completeFetchPromises(slot, completeSynchronously) {
-                    var fetchListeners = slot.fetchListeners,
-                        directFetchListeners = slot.directFetchListeners;
-
-                    if (fetchListeners || directFetchListeners) {
-                        prepareSlotItem(slot);
-
-                        // By default, complete asynchronously to minimize reentrancy
-
-                        var item = slot.item;
-
-                        var completeOrQueuePromises = function (listeners) {
-                            if (completeSynchronously) {
-                                completePromises(item, listeners);
-                            } else {
-                                fetchCompleteCallbacks.push(function () {
-                                    completePromises(item, listeners);
-                                });
-                            }
-                        };
-
-                        if (directFetchListeners) {
-                            slot.directFetchListeners = null;
-                            completeOrQueuePromises(directFetchListeners);
-                        }
-
-                        if (fetchListeners) {
-                            slot.fetchListeners = null;
-                            completeOrQueuePromises(fetchListeners);
-                        }
-
-                        releaseSlotIfUnrequested(slot);
-                    }
-                }
-
-                function callFetchCompleteCallbacks() {
-                    var callbacks = fetchCompleteCallbacks;
-
-                    // Clear fetchCompleteCallbacks first to avoid reentrancy problems
-                    fetchCompleteCallbacks = [];
-
-                    for (var i = 0, len = callbacks.length; i < len; i++) {
-                        callbacks[i]();
-                    }
-                }
-
-                function returnDirectFetchError(slot, error) {
-                    var directFetchListeners = slot.directFetchListeners;
-                    if (directFetchListeners) {
-                        slot.directFetchListeners = null;
-
-                        for (var listenerID in directFetchListeners) {
-                            directFetchListeners[listenerID].error(error);
-                        }
-
-                        releaseSlotIfUnrequested(slot);
-                    }
-                }
-
-                // Item Requests
-
-                function requestSlot(slot) {
-                    // Ensure that there's a slot on either side of each requested item
-                    if (slot.firstInSequence) {
-                        addSlotBefore(slot, indexMap);
-                    }
-                    if (slot.lastInSequence) {
-                        addSlotAfter(slot, indexMap);
-                    }
-
-                    // If the item has already been fetched, prepare it now to be returned to the client
-                    if (slot.itemNew) {
-                        prepareSlotItem(slot);
-                    }
-
-                    // Start a new fetch if necessary
-                    postFetch();
-
-                    return slot;
-                }
-
-                function requestSlotBefore(slotNext) {
-                    // First, see if the previous slot already exists
-                    if (!slotNext.firstInSequence) {
-                        var slotPrev = slotNext.prev;
-
-                        // Next, see if the item is known to not exist
-                        return (slotPrev === slotsStart ? null : requestSlot(slotPrev));
-                    }
-
-                    return requestSlot(addSlotBefore(slotNext, indexMap));
-                }
-
-                function requestSlotAfter(slotPrev) {
-                    // First, see if the next slot already exists
-                    if (!slotPrev.lastInSequence) {
-                        var slotNext = slotPrev.next;
-
-                        // Next, see if the item is known to not exist
-                        return (slotNext === slotListEnd ? null : requestSlot(slotNext));
-                    }
-
-                    return requestSlot(addSlotAfter(slotPrev, indexMap));
-                }
-
-                function itemDirectlyFromSlot(slot) {
-                    // Return a complete promise for a non-existent slot
-                    return (
-                        slot ?
-                            createFetchPromise(slot, "directFetchListeners", (nextListenerID++).toString()) :
-                            Promise.wrap(null)
-                    );
-                }
-
-                function validateKey(key) {
-                    if (typeof key !== "string" || !key) {
-                        throw new _ErrorFromName("WinJS.UI.ListDataSource.KeyIsInvalid", strings.keyIsInvalid);
-                    }
-                }
-
-                function createSlotForKey(key) {
-                    var slot = createPrimarySlotSequence(slotsEnd);
-
-                    setSlotKey(slot, key);
-                    slot.keyRequested = true;
-
-                    return slot;
-                }
-
-                function slotFromKey(key, hints) {
-                    validateKey(key);
-
-                    var slot = keyMap[key];
-
-                    if (!slot) {
-                        slot = createSlotForKey(key);
-                        slot.hints = hints;
-                    }
-
-                    return requestSlot(slot);
-                }
-
-                function slotFromIndex(index) {
-                    if (typeof index !== "number" || index < 0) {
-                        throw new _ErrorFromName("WinJS.UI.ListDataSource.IndexIsInvalid", strings.indexIsInvalid);
-                    }
-
-                    if (slotListEnd.index <= index) {
-                        return null;
-                    }
-
-                    var slot = indexMap[index];
-
-                    if (!slot) {
-                        var slotNext = successorFromIndex(index, indexMap, slotsStart, slotListEnd);
-
-                        if (!slotNext) {
-                            // The complete list has been observed, and this index isn't a part of it; a refresh may be necessary
-                            return null;
-                        }
-
-                        if (slotNext === slotListEnd && index >= slotListEnd) {
-                            // Clear slotListEnd's index, as that's now unknown
-                            changeSlotIndex(slotListEnd, undefined);
-                        }
-
-                        // Create a new slot and start a request for it
-                        if (slotNext.prev.index === index - 1) {
-                            slot = addSlotAfter(slotNext.prev, indexMap);
-                        } else if (slotNext.index === index + 1) {
-                            slot = addSlotBefore(slotNext, indexMap);
-                        } else {
-                            slot = createPrimarySlotSequence(slotNext, index);
-                        }
-                    }
-
-                    if (!slot.item) {
-                        slot.indexRequested = true;
-                    }
-
-                    return requestSlot(slot);
-                }
-
-                function slotFromDescription(description) {
-                    // Create a new slot and start a request for it
-                    var slot = createPrimarySlotSequence(slotsEnd);
-
-                    slot.description = description;
-
-                    return requestSlot(slot);
-                }
-
-                // Status
-                var that = this;
-                function setStatus(statusNew) {
-                    statusPending = statusNew;
-                    if (status !== statusPending) {
-                        var dispatch = function () {
-                            statusChangePosted = false;
-
-                            if (status !== statusPending) {
-                                status = statusPending;
-                                that.dispatchEvent(statusChangedEvent, status);
-                            }
-                        };
-                        if (statusPending === DataSourceStatus.failure) {
-                            dispatch();
-                        } else if (!statusChangePosted) {
-                            statusChangePosted = true;
-
-                            // Delay the event to filter out rapid changes
-                            _Global.setTimeout(dispatch, 40);
-                        }
-                    }
-                }
-
-                // Slot Fetching
-
-                function slotFetchInProgress(slot) {
-                    var fetchID = slot.fetchID;
-                    return fetchID && fetchesInProgress[fetchID];
-                }
-
-                function setFetchID(slot, fetchID) {
-                    slot.fetchID = fetchID;
-                }
-
-                function newFetchID() {
-                    var fetchID = nextFetchID;
-                    nextFetchID++;
-
-                    fetchesInProgress[fetchID] = true;
-
-                    return fetchID;
-                }
-
-                function setFetchIDs(slot, countBefore, countAfter) {
-                    var fetchID = newFetchID();
-                    setFetchID(slot, fetchID);
-
-                    var slotBefore = slot;
-                    while (!slotBefore.firstInSequence && countBefore > 0) {
-                        slotBefore = slotBefore.prev;
-                        countBefore--;
-                        setFetchID(slotBefore, fetchID);
-                    }
-
-                    var slotAfter = slot;
-                    while (!slotAfter.lastInSequence && countAfter > 0) {
-                        slotAfter = slotAfter.next;
-                        countAfter--;
-                        setFetchID(slotAfter, fetchID);
-                    }
-
-                    return fetchID;
-                }
-
-                // Adds markers on behalf of the data adapter if their presence can be deduced
-                function addMarkers(fetchResult) {
-                    var items = fetchResult.items,
-                        offset = fetchResult.offset,
-                        totalCount = fetchResult.totalCount,
-                        absoluteIndex = fetchResult.absoluteIndex,
-                        atStart = fetchResult.atStart,
-                        atEnd = fetchResult.atEnd;
-
-                    if (isNonNegativeNumber(absoluteIndex)) {
-                        if (isNonNegativeNumber(totalCount)) {
-                            var itemsLength = items.length;
-                            if (absoluteIndex - offset + itemsLength === totalCount) {
-                                atEnd = true;
-                            }
-                        }
-
-                        if (offset === absoluteIndex) {
-                            atStart = true;
-                        }
-                    }
-
-                    if (atStart) {
-                        items.unshift(startMarker);
-                        fetchResult.offset++;
-                    }
-
-                    if (atEnd) {
-                        items.push(endMarker);
-                    }
-                }
-
-                function resultsValid(slot, refreshID, fetchID) {
-                    // This fetch has completed, whatever it has returned
-                    delete fetchesInProgress[fetchID];
-
-                    if (refreshID !== currentRefreshID || slotPermanentlyRemoved(slot)) {
-                        // This information is out of date, or the slot has since been discarded
-
-                        postFetch();
-                        return false;
-                    }
-
-                    return true;
-                }
-
-                function fetchItems(slot, fetchID, promiseItems, index) {
-                    var refreshID = currentRefreshID;
-                    promiseItems.then(function (fetchResult) {
-                        if (fetchResult.items && fetchResult.items.length) {
-                            var perfID = "itemsFetched id=" + fetchID + " count=" + fetchResult.items.length;
-                            profilerMarkStart(perfID);
-                            if (resultsValid(slot, refreshID, fetchID)) {
-                                if (+index === index) {
-                                    fetchResult.absoluteIndex = index;
-                                }
-                                addMarkers(fetchResult);
-                                processResults(slot, fetchResult.items, fetchResult.offset, fetchResult.totalCount, fetchResult.absoluteIndex);
-                            }
-                            profilerMarkEnd(perfID);
-                        } else {
-                            return Promise.wrapError(new _ErrorFromName(FetchError.doesNotExist));
-                        }
-                    }).then(null, function (error) {
-                        if (resultsValid(slot, refreshID, fetchID)) {
-                            processErrorResult(slot, error);
-                        }
-                    });
-                }
-
-                function fetchItemsForIndex(indexRequested, slot, fetchID, promiseItems) {
-                    var refreshID = currentRefreshID;
-                    promiseItems.then(function (fetchResult) {
-                        if (fetchResult.items && fetchResult.items.length) {
-                            var perfID = "itemsFetched id=" + fetchID + " count=" + fetchResult.items.length;
-                            profilerMarkStart(perfID);
-                            if (resultsValid(slot, refreshID, fetchID)) {
-                                fetchResult.absoluteIndex = indexRequested;
-                                addMarkers(fetchResult);
-                                processResultsForIndex(indexRequested, slot, fetchResult.items, fetchResult.offset, fetchResult.totalCount, fetchResult.absoluteIndex);
-                            }
-                            profilerMarkEnd(perfID);
-                        } else {
-                            return Promise.wrapError(new _ErrorFromName(FetchError.doesNotExist));
-                        }
-                    }).then(null, function () {
-                        if (resultsValid(slot, refreshID, fetchID)) {
-                            processErrorResultForIndex(indexRequested, slot, refreshID);
-                        }
-                    });
-                }
-
-                function fetchItemsFromStart(slot, count) {
-                    var fetchID = setFetchIDs(slot, 0, count - 1);
-                    if (itemsFromStart) {
-                        fetchItems(slot, fetchID, itemsFromStart(fetchID, count), 0);
-                    } else {
-                        fetchItems(slot, fetchID, itemsFromIndex(fetchID, 0, 0, count - 1), 0);
-                    }
-                }
-
-                function fetchItemsFromEnd(slot, count) {
-                    var fetchID = setFetchIDs(slot, count - 1, 0);
-                    fetchItems(slot, fetchID, itemsFromEnd(fetchID, count));
-                }
-
-                function fetchItemsFromKey(slot, countBefore, countAfter) {
-                    var fetchID = setFetchIDs(slot, countBefore, countAfter);
-                    fetchItems(slot, fetchID, itemsFromKey(fetchID, slot.key, countBefore, countAfter, slot.hints));
-                }
-
-                function fetchItemsFromIndex(slot, countBefore, countAfter) {
-                    var index = slot.index;
-
-                    // Don't ask for items with negative indices
-                    if (countBefore > index) {
-                        countBefore = index;
-                    }
-
-                    if (itemsFromIndex) {
-                        var fetchID = setFetchIDs(slot, countBefore, countAfter);
-                        fetchItems(slot, fetchID, itemsFromIndex(fetchID, index, countBefore, countAfter), index);
-                    } else {
-                        // If the slot key is known, we just need to request the surrounding items
-                        if (slot.key) {
-                            fetchItemsFromKey(slot, countBefore, countAfter);
-                        } else {
-                            // Search for the slot with the closest index that has a known key (using the start of the list as a
-                            // last resort).
-                            var slotClosest = slotsStart,
-                                closestDelta = index + 1,
-                                slotSearch,
-                                delta;
-
-                            // First search backwards
-                            for (slotSearch = slot.prev; slotSearch !== slotsStart; slotSearch = slotSearch.prev) {
-                                if (slotSearch.index !== undefined && slotSearch.key) {
-                                    delta = index - slotSearch.index;
-                                    if (closestDelta > delta) {
-                                        closestDelta = delta;
-                                        slotClosest = slotSearch;
-                                    }
-                                    break;
-                                }
-                            }
-
-                            // Then search forwards
-                            for (slotSearch = slot.next; slotSearch !== slotListEnd; slotSearch = slotSearch.next) {
-                                if (slotSearch.index !== undefined && slotSearch.key) {
-                                    delta = slotSearch.index - index;
-                                    if (closestDelta > delta) {
-                                        closestDelta = delta;
-                                        slotClosest = slotSearch;
-                                    }
-                                    break;
-                                }
-                            }
-
-                            if (slotClosest === slotsStart) {
-                                var fetchID = setFetchIDs(slot, 0, index + 1);
-                                fetchItemsForIndex(0, slot, fetchID, itemsFromStart(fetchID, index + 1));
-                            } else {
-                                var fetchBefore = Math.max(slotClosest.index - index, 0);
-                                var fetchAfter = Math.max(index - slotClosest.index, 0);
-                                var fetchID = setFetchIDs(slotClosest, fetchBefore, fetchAfter);
-                                fetchItemsForIndex(slotClosest.index, slot, fetchID, itemsFromKey(fetchID,
-                                    slotClosest.key,
-                                    fetchBefore,
-                                    fetchAfter,
-                                    slot.hints
-                                ));
-                            }
-                        }
-                    }
-                }
-
-                function fetchItemsFromDescription(slot, countBefore, countAfter) {
-                    var fetchID = setFetchIDs(slot, countBefore, countAfter);
-                    fetchItems(slot, fetchID, itemsFromDescription(fetchID, slot.description, countBefore, countAfter));
-                }
-
-                function fetchItemsForAllSlots() {
-                    if (!refreshInProgress) {
-                        var slotFirstPlaceholder,
-                            placeholderCount,
-                            fetchInProgress = false,
-                            fetchesInProgress = false,
-                            slotRequestedByKey,
-                            requestedKeyOffset,
-                            slotRequestedByDescription,
-                            requestedDescriptionOffset,
-                            slotRequestedByIndex,
-                            requestedIndexOffset;
-
-                        for (var slot = slotsStart.next; slot !== slotsEnd;) {
-                            var slotNext = slot.next;
-
-                            if (slot !== slotListEnd && isPlaceholder(slot)) {
-                                fetchesInProgress = true;
-
-                                if (!slotFirstPlaceholder) {
-                                    slotFirstPlaceholder = slot;
-                                    placeholderCount = 1;
-                                } else {
-                                    placeholderCount++;
-                                }
-
-                                if (slotFetchInProgress(slot)) {
-                                    fetchInProgress = true;
-                                }
-
-                                if (slot.keyRequested && !slotRequestedByKey) {
-                                    slotRequestedByKey = slot;
-                                    requestedKeyOffset = placeholderCount - 1;
-                                }
-
-                                if (slot.description !== undefined && !slotRequestedByDescription) {
-                                    slotRequestedByDescription = slot;
-                                    requestedDescriptionOffset = placeholderCount - 1;
-                                }
-
-                                if (slot.indexRequested && !slotRequestedByIndex) {
-                                    slotRequestedByIndex = slot;
-                                    requestedIndexOffset = placeholderCount - 1;
-                                }
-
-                                if (slot.lastInSequence || slotNext === slotsEnd || !isPlaceholder(slotNext)) {
-                                    if (fetchInProgress) {
-                                        fetchInProgress = false;
-                                    } else {
-                                        resultsProcessed = false;
-
-                                        // Start a new fetch for this placeholder sequence
-
-                                        // Prefer fetches in terms of a known item
-                                        if (!slotFirstPlaceholder.firstInSequence && slotFirstPlaceholder.prev.key && itemsFromKey) {
-                                            fetchItemsFromKey(slotFirstPlaceholder.prev, 0, placeholderCount);
-                                        } else if (!slot.lastInSequence && slotNext.key && itemsFromKey) {
-                                            fetchItemsFromKey(slotNext, placeholderCount, 0);
-                                        } else if (slotFirstPlaceholder.prev === slotsStart && !slotFirstPlaceholder.firstInSequence && (itemsFromStart || itemsFromIndex)) {
-                                            fetchItemsFromStart(slotFirstPlaceholder, placeholderCount);
-                                        } else if (slotNext === slotListEnd && !slot.lastInSequence && itemsFromEnd) {
-                                            fetchItemsFromEnd(slot, placeholderCount);
-                                        } else if (slotRequestedByKey) {
-                                            fetchItemsFromKey(slotRequestedByKey, requestedKeyOffset, placeholderCount - 1 - requestedKeyOffset);
-                                        } else if (slotRequestedByDescription) {
-                                            fetchItemsFromDescription(slotRequestedByDescription, requestedDescriptionOffset, placeholderCount - 1 - requestedDescriptionOffset);
-                                        } else if (slotRequestedByIndex) {
-                                            fetchItemsFromIndex(slotRequestedByIndex, requestedIndexOffset, placeholderCount - 1 - requestedIndexOffset);
-                                        } else if (typeof slotFirstPlaceholder.index === "number") {
-                                            fetchItemsFromIndex(slotFirstPlaceholder, placeholderCount - 1, 0);
-                                        } else {
-                                            // There is no way to fetch anything in this sequence
-                                            deleteMirageSequence(slotFirstPlaceholder);
-                                        }
-
-                                        if (resultsProcessed) {
-                                            // A re-entrant fetch might have altered the slots list - start again
-                                            postFetch();
-                                            return;
-                                        }
-
-                                        if (refreshInProgress) {
-                                            // A re-entrant fetch might also have caused a refresh
-                                            return;
-                                        }
-                                    }
-
-                                    slotFirstPlaceholder = slotRequestedByIndex = slotRequestedByKey = null;
-                                }
-                            }
-
-                            slot = slotNext;
-                        }
-
-                        setStatus(fetchesInProgress ? DataSourceStatus.waiting : DataSourceStatus.ready);
-                    }
-                }
-
-                function postFetch() {
-                    if (!fetchesPosted) {
-                        fetchesPosted = true;
-                        Scheduler.schedule(function VDS_async_postFetch() {
-                            fetchesPosted = false;
-                            fetchItemsForAllSlots();
-
-                            // A mirage sequence might have been removed
-                            finishNotifications();
-                        }, Scheduler.Priority.max, null, "WinJS.UI.ListDataSource._fetch");
-                    }
-                }
-
-                // Fetch Result Processing
-
-                function itemChanged(slot) {
-                    var itemNew = slot.itemNew;
-
-                    if (!itemNew) {
-                        return false;
-                    }
-
-                    var item = slot.item;
-
-                    for (var property in item) {
-                        switch (property) {
-                            case "data":
-                                // This is handled below
-                                break;
-
-                            default:
-                                if (item[property] !== itemNew[property]) {
-                                    return true;
-                                }
-                                break;
-                        }
-                    }
-
-                    return (
-                        listDataAdapter.compareByIdentity ?
-                            item.data !== itemNew.data :
-                            slot.signature !== itemSignature(itemNew)
-                    );
-                }
-
-                function changeSlotIfNecessary(slot) {
-                    if (!slotRequested(slot)) {
-                        // There's no need for any notifications, just delete the old item
-                        slot.item = null;
-                    } else if (itemChanged(slot)) {
-                        changeSlot(slot);
-                    } else {
-                        slot.itemNew = null;
-                    }
-                }
-
-                function updateSlotItem(slot) {
-                    if (slot.item) {
-                        changeSlotIfNecessary(slot);
-                    } else {
-                        completeFetchPromises(slot);
-                    }
-                }
-
-                function updateSlot(slot, item) {
-                    if (!slot.key) {
-                        setSlotKey(slot, item.key);
-                    }
-                    slot.itemNew = item;
-
-                    updateSlotItem(slot);
-                }
-
-                function sendMirageNotifications(slot, slotToDiscard, listBindingIDsToDelete) {
-                    var bindingMap = slotToDiscard.bindingMap;
-                    if (bindingMap) {
-                        for (var listBindingID in listBindingIDsToDelete) {
-                            if (bindingMap[listBindingID]) {
-                                var fetchListeners = slotToDiscard.fetchListeners;
-                                for (var listenerID in fetchListeners) {
-                                    var listener = fetchListeners[listenerID];
-
-                                    if (listener.listBindingID === listBindingID && listener.retained) {
-                                        delete fetchListeners[listenerID];
-                                        listener.complete(null);
-                                    }
-                                }
-
-                                var bindingRecord = bindingMap[listBindingID].bindingRecord;
-                                handlerToNotify(bindingRecord).removed(handleForBinding(slotToDiscard, listBindingID), true, handleForBinding(slot, listBindingID));
-
-                                // A re-entrant call to release from the removed handler might have cleared slotToDiscard.bindingMap
-                                if (slotToDiscard.bindingMap) {
-                                    delete slotToDiscard.bindingMap[listBindingID];
-                                }
-                            }
-                        }
-                    }
-                }
-
-                function mergeSlots(slot, slotToDiscard) {
-                    // This shouldn't be called on a slot that has a pending change notification
-                    // Only one of the two slots should have a key
-                    // If slotToDiscard is about to acquire an index, send the notifications now; in rare cases, multiple
-                    // indexChanged notifications will be sent for a given item during a refresh, but that's fine.
-                    if (slot.index !== slotToDiscard.index) {
-                        // If slotToDiscard has a defined index, that should have been transferred already
-                        var indexOld = slotToDiscard.index;
-                        slotToDiscard.index = slot.index;
-                        sendIndexChangedNotifications(slotToDiscard, indexOld);
-                    }
-
-                    slotToDiscard.slotMergedWith = slot;
-
-                    // Transfer the slotBindings from slotToDiscard to slot
-                    var bindingMap = slotToDiscard.bindingMap;
-                    for (var listBindingID in bindingMap) {
-                        if (!slot.bindingMap) {
-                            slot.bindingMap = {};
-                        }
-
-                        var slotBinding = bindingMap[listBindingID];
-
-                        if (!slotBinding.handle) {
-                            slotBinding.handle = slotToDiscard.handle;
-                        }
-                        handleMap[slotBinding.handle] = slot;
-
-                        slot.bindingMap[listBindingID] = slotBinding;
-                    }
-
-                    // Update any ListBinding cursors pointing to slotToDiscard
-                    forEachBindingRecord(function (bindingRecord) {
-                        bindingRecord.adjustCurrentSlot(slotToDiscard, slot);
-                    });
-
-                    // See if the item needs to be transferred from slotToDiscard to slot
-                    var item = slotToDiscard.itemNew || slotToDiscard.item;
-                    if (item) {
-                        item = Object.create(item);
-                        defineCommonItemProperties(item, slot, slot.handle);
-                        updateSlot(slot, item);
-                    }
-
-                    // Transfer the fetch listeners from slotToDiscard to slot, or complete them if item is known
-                    if (slot.item) {
-                        if (slotToDiscard.directFetchListeners) {
-                            fetchCompleteCallbacks.push(function () {
-                                completePromises(slot.item, slotToDiscard.directFetchListeners);
-                            });
-                        }
-                        if (slotToDiscard.fetchListeners) {
-                            fetchCompleteCallbacks.push(function () {
-                                completePromises(slot.item, slotToDiscard.fetchListeners);
-                            });
-                        }
-                    } else {
-                        var listenerID;
-
-                        for (listenerID in slotToDiscard.directFetchListeners) {
-                            if (!slot.directFetchListeners) {
-                                slot.directFetchListeners = {};
-                            }
-                            slot.directFetchListeners[listenerID] = slotToDiscard.directFetchListeners[listenerID];
-                        }
-
-                        for (listenerID in slotToDiscard.fetchListeners) {
-                            if (!slot.fetchListeners) {
-                                slot.fetchListeners = {};
-                            }
-                            slot.fetchListeners[listenerID] = slotToDiscard.fetchListeners[listenerID];
-                        }
-                    }
-
-                    // This might be the first time this slot's item can be prepared
-                    if (slot.itemNew) {
-                        completeFetchPromises(slot);
-                    }
-
-                    // Give slotToDiscard an unused handle so it appears to be permanently removed
-                    slotToDiscard.handle = (nextHandle++).toString();
-
-                    splitSequence(slotToDiscard);
-                    removeSlotPermanently(slotToDiscard);
-                }
-
-                function mergeSlotsAndItem(slot, slotToDiscard, item) {
-                    if (slotToDiscard && slotToDiscard.key) {
-                        if (!item) {
-                            item = slotToDiscard.itemNew || slotToDiscard.item;
-                        }
-
-                        // Free up the key for the promoted slot
-                        delete slotToDiscard.key;
-                        delete keyMap[item.key];
-
-                        slotToDiscard.itemNew = null;
-                        slotToDiscard.item = null;
-                    }
-
-                    if (item) {
-                        updateSlot(slot, item);
-                    }
-
-                    if (slotToDiscard) {
-                        mergeSlots(slot, slotToDiscard);
-                    }
-                }
-
-                function slotFromResult(result) {
-                    if (typeof result !== "object") {
-                        throw new _ErrorFromName("WinJS.UI.ListDataSource.InvalidItemReturned", strings.invalidItemReturned);
-                    } else if (result === startMarker) {
-                        return slotsStart;
-                    } else if (result === endMarker) {
-                        return slotListEnd;
-                    } else if (!result.key) {
-                        throw new _ErrorFromName("WinJS.UI.ListDataSource.InvalidKeyReturned", strings.invalidKeyReturned);
-                    } else {
-                        if (_BaseUtils.validation) {
-                            validateKey(result.key);
-                        }
-                        return keyMap[result.key];
-                    }
-                }
-
-                function matchSlot(slot, result) {
-                    // First see if there is an existing slot that needs to be merged
-                    var slotExisting = slotFromResult(result);
-                    if (slotExisting === slot) {
-                        slotExisting = null;
-                    }
-
-                    if (slotExisting) {
-                        sendMirageNotifications(slot, slotExisting, slot.bindingMap);
-                    }
-
-                    mergeSlotsAndItem(slot, slotExisting, result);
-                }
-
-                function promoteSlot(slot, item, index, insertionPoint) {
-                    if (item && slot.key && slot.key !== item.key) {
-                        // A contradiction has been found
-                        beginRefresh();
-                        return false;
-                    }
-
-                    // The slot with the key "wins"; slots without bindings can be merged without any change in observable behavior
-
-                    var slotWithIndex = indexMap[index];
-                    if (slotWithIndex) {
-                        if (slotWithIndex === slot) {
-                            slotWithIndex = null;
-                        } else if (slotWithIndex.key && (slot.key || (item && slotWithIndex.key !== item.key))) {
-                            // A contradiction has been found
-                            beginRefresh();
-                            return false;
-                        } else if (!slot.key && slotWithIndex.bindingMap) {
-                            return false;
-                        }
-                    }
-
-                    var slotWithKey;
-                    if (item) {
-                        slotWithKey = keyMap[item.key];
-
-                        if (slotWithKey === slot) {
-                            slotWithKey = null;
-                        } else if (slotWithKey && slotWithKey.bindingMap) {
-                            return false;
-                        }
-                    }
-
-                    if (slotWithIndex) {
-                        sendMirageNotifications(slot, slotWithIndex, slot.bindingMap);
-
-                        // Transfer the index to the promoted slot
-                        delete indexMap[index];
-                        changeSlotIndex(slot, index);
-
-                        // See if this sequence should be merged with its neighbors
-                        if (slot.prev.index === index - 1) {
-                            mergeSequences(slot.prev);
-                        }
-                        if (slot.next.index === index + 1) {
-                            mergeSequences(slot);
-                        }
-
-                        insertionPoint.slotNext = slotWithIndex.slotNext;
-
-                        if (!item) {
-                            item = slotWithIndex.itemNew || slotWithIndex.item;
-                            if (item) {
-                                slotWithKey = keyMap[item.key];
-                            }
-                        }
-                    } else {
-                        changeSlotIndex(slot, index);
-                    }
-
-                    if (slotWithKey && slotWithIndex !== slotWithKey) {
-                        sendMirageNotifications(slot, slotWithKey, slot.bindingMap);
-                    }
-
-                    mergeSlotsAndItem(slot, slotWithKey, item);
-
-                    // Do this after mergeSlotsAndItem, since its call to updateSlot might send changed notifications, and those
-                    // wouldn't make sense to clients that never saw the old item.
-                    if (slotWithIndex && slotWithIndex !== slotWithKey) {
-                        mergeSlots(slot, slotWithIndex);
-                    }
-
-                    return true;
-                }
-
-                function mergeAdjacentSlot(slotExisting, slot, listBindingIDsToDelete) {
-                    if (slot.key && slotExisting.key && slot.key !== slotExisting.key) {
-                        // A contradiction has been found
-                        beginRefresh();
-                        return false;
-                    }
-
-                    for (var listBindingID in slotExisting.bindingMap) {
-                        listBindingIDsToDelete[listBindingID] = true;
-                    }
-
-                    sendMirageNotifications(slotExisting, slot, listBindingIDsToDelete);
-                    mergeSlotsAndItem(slotExisting, slot);
-
-                    return true;
-                }
-
-                function mergeSlotsBefore(slot, slotExisting) {
-                    var listBindingIDsToDelete = {};
-
-                    while (slot) {
-                        var slotPrev = (slot.firstInSequence ? null : slot.prev);
-
-                        if (!slotExisting.firstInSequence && slotExisting.prev === slotsStart) {
-                            deleteSlot(slot, true);
-                        } else {
-                            if (slotExisting.firstInSequence) {
-                                slotExisting = addSlotBefore(slotExisting, indexMap);
-                            } else {
-                                slotExisting = slotExisting.prev;
-                            }
-
-                            if (!mergeAdjacentSlot(slotExisting, slot, listBindingIDsToDelete)) {
-                                return;
-                            }
-                        }
-
-                        slot = slotPrev;
-                    }
-                }
-
-                function mergeSlotsAfter(slot, slotExisting) {
-                    var listBindingIDsToDelete = {};
-
-                    while (slot) {
-                        var slotNext = (slot.lastInSequence ? null : slot.next);
-
-                        if (!slotExisting.lastInSequence && slotExisting.next === slotListEnd) {
-                            deleteSlot(slot, true);
-                        } else {
-                            if (slotExisting.lastInSequence) {
-                                slotExisting = addSlotAfter(slotExisting, indexMap);
-                            } else {
-                                slotExisting = slotExisting.next;
-                            }
-
-                            if (!mergeAdjacentSlot(slotExisting, slot, listBindingIDsToDelete)) {
-                                return;
-                            }
-                        }
-
-                        slot = slotNext;
-                    }
-                }
-
-                function mergeSequencePairs(sequencePairsToMerge) {
-                    for (var i = 0; i < sequencePairsToMerge.length; i++) {
-                        var sequencePairToMerge = sequencePairsToMerge[i];
-                        mergeSlotsBefore(sequencePairToMerge.slotBeforeSequence, sequencePairToMerge.slotFirstInSequence);
-                        mergeSlotsAfter(sequencePairToMerge.slotAfterSequence, sequencePairToMerge.slotLastInSequence);
-                    }
-                }
-
-                // Removes any placeholders with indices that exceed the given upper bound on the count
-                function removeMirageIndices(countMax, indexFirstKnown) {
-                    var placeholdersAtEnd = 0;
-
-                    function removePlaceholdersAfterSlot(slotRemoveAfter) {
-                        for (var slot2 = slotListEnd.prev; !(slot2.index < countMax) && slot2 !== slotRemoveAfter;) {
-                            var slotPrev2 = slot2.prev;
-                            if (slot2.index !== undefined) {
-                                deleteSlot(slot2, true);
-                            }
-                            slot2 = slotPrev2;
-                        }
-
-                        placeholdersAtEnd = 0;
-                    }
-
-                    for (var slot = slotListEnd.prev; !(slot.index < countMax) || placeholdersAtEnd > 0;) {
-                        var slotPrev = slot.prev;
-
-                        if (slot === slotsStart) {
-                            removePlaceholdersAfterSlot(slotsStart);
-                            break;
-                        } else if (slot.key) {
-                            if (slot.index >= countMax) {
-                                beginRefresh();
-                                return false;
-                            } else if (slot.index >= indexFirstKnown) {
-                                removePlaceholdersAfterSlot(slot);
-                            } else {
-                                if (itemsFromKey) {
-                                    fetchItemsFromKey(slot, 0, placeholdersAtEnd);
-                                } else {
-                                    fetchItemsFromIndex(slot, 0, placeholdersAtEnd);
-                                }
-
-                                // Wait until the fetch has completed before doing anything
-                                return false;
-                            }
-                        } else if (slot.indexRequested || slot.firstInSequence) {
-                            removePlaceholdersAfterSlot(slotPrev);
-                        } else {
-                            placeholdersAtEnd++;
-                        }
-
-                        slot = slotPrev;
-                    }
-
-                    return true;
-                }
-
-                // Merges the results of a fetch into the slot list data structure, and determines if any notifications need to be
-                // synthesized.
-                function processResults(slot, results, offset, count, index) {
-                    var perfId = "WinJS.UI.ListDataSource.processResults";
-                    profilerMarkStart(perfId);
-
-                    index = validateIndexReturned(index);
-                    count = validateCountReturned(count);
-
-                    // If there are edits queued, we need to wait until the slots get back in sync with the data
-                    if (editsQueued) {
-                        profilerMarkEnd(perfId);
-                        return;
-                    }
-
-                    if (indexUpdateDeferred) {
-                        updateIndices();
-                    }
-
-                    // If the count has changed, and the end of the list has been reached, that's a contradiction
-                    if ((isNonNegativeNumber(count) || count === CountResult.unknown) && count !== knownCount && !slotListEnd.firstInSequence) {
-                        beginRefresh();
-                        profilerMarkEnd(perfId);
-                        return;
-                    }
-
-                    resultsProcessed = true;
-
-                    (function () {
-                        var i,
-                            j,
-                            resultsCount = results.length,
-                            slotExisting,
-                            slotBefore;
-
-                        // If an index wasn't passed in, see if the indices of these items can be determined
-                        if (typeof index !== "number") {
-                            for (i = 0; i < resultsCount; i++) {
-                                slotExisting = slotFromResult(results[i]);
-                                if (slotExisting && slotExisting.index !== undefined) {
-                                    index = slotExisting.index + offset - i;
-                                    break;
-                                }
-                            }
-                        }
-
-                        // See if these results include the end of the list
-                        if (typeof index === "number" && results[resultsCount - 1] === endMarker) {
-                            // If the count wasn't known, it is now
-                            count = index - offset + resultsCount - 1;
-                        } else if (isNonNegativeNumber(count) && (index === undefined || index === null)) {
-                            // If the index wasn't known, it is now
-                            index = count - (resultsCount - 1) + offset;
-                        }
-
-                        // If the count is known, remove any mirage placeholders at the end
-                        if (isNonNegativeNumber(count) && !removeMirageIndices(count, index - offset)) {
-                            // "Forget" the count - a subsequent fetch or refresh will update the count and list end
-                            count = undefined;
-                        }
-
-                        // Find any existing slots that correspond to the results, and check for contradictions
-                        var offsetMap = new Array(resultsCount);
-                        for (i = 0; i < resultsCount; i++) {
-                            var slotBestMatch = null;
-
-                            slotExisting = slotFromResult(results[i]);
-
-                            if (slotExisting) {
-                                // See if this item is currently adjacent to a different item, or has a different index
-                                if ((i > 0 && !slotExisting.firstInSequence && slotExisting.prev.key && slotExisting.prev.key !== results[i - 1].key) ||
-                                        (typeof index === "number" && slotExisting.index !== undefined && slotExisting.index !== index - offset + i)) {
-                                    // A contradiction has been found, so we can't proceed further
-                                    beginRefresh();
-                                    return;
-                                }
-
-                                if (slotExisting === slotsStart || slotExisting === slotListEnd || slotExisting.bindingMap) {
-                                    // First choice is a slot with the given key and at least one binding (or an end of the list)
-                                    slotBestMatch = slotExisting;
-                                }
-                            }
-
-                            if (typeof index === "number") {
-                                slotExisting = indexMap[index - offset + i];
-
-                                if (slotExisting) {
-                                    if (slotExisting.key && slotExisting.key !== results[i].key) {
-                                        // A contradiction has been found, so we can't proceed further
-                                        beginRefresh();
-                                        return;
-                                    }
-
-                                    if (!slotBestMatch && slotExisting.bindingMap) {
-                                        // Second choice is a slot with the given index and at least one binding
-                                        slotBestMatch = slotExisting;
-                                    }
-                                }
-                            }
-
-                            if (i === offset) {
-                                if ((slot.key && slot.key !== results[i].key) || (typeof slot.index === "number" && typeof index === "number" && slot.index !== index)) {
-                                    // A contradiction has been found, so we can't proceed further
-                                    beginRefresh();
-                                    return;
-                                }
-
-                                if (!slotBestMatch) {
-                                    // Third choice is the slot that was passed in
-                                    slotBestMatch = slot;
-                                }
-                            }
-
-                            offsetMap[i] = slotBestMatch;
-                        }
-
-                        // Update items with known indices (and at least one binding) first, as they will not be merged with
-                        // anything.
-                        for (i = 0; i < resultsCount; i++) {
-                            slotExisting = offsetMap[i];
-                            if (slotExisting && slotExisting.index !== undefined && slotExisting !== slotsStart && slotExisting !== slotListEnd) {
-                                matchSlot(slotExisting, results[i]);
-                            }
-                        }
-
-                        var sequencePairsToMerge = [];
-
-                        // Now process the sequences without indices
-                        var firstSequence = true;
-                        var slotBeforeSequence;
-                        var slotAfterSequence;
-                        for (i = 0; i < resultsCount; i++) {
-                            slotExisting = offsetMap[i];
-                            if (slotExisting && slotExisting !== slotListEnd) {
-                                var iLast = i;
-
-                                if (slotExisting.index === undefined) {
-                                    var insertionPoint = {};
-
-                                    promoteSlot(slotExisting, results[i], index - offset + i, insertionPoint);
-
-                                    // Find the extents of the sequence of slots that we can use
-                                    var slotFirstInSequence = slotExisting,
-                                        slotLastInSequence = slotExisting,
-                                        result;
-
-                                    for (j = i - 1; !slotFirstInSequence.firstInSequence; j--) {
-                                        // Keep going until we hit the start marker or a slot that we can't use or promote (it's ok
-                                        // if j leaves the results range).
-
-                                        result = results[j];
-                                        if (result === startMarker) {
-                                            break;
-                                        }
-
-                                        // Avoid assigning negative indices to slots
-                                        var index2 = index - offset + j;
-                                        if (index2 < 0) {
-                                            break;
-                                        }
-
-                                        if (promoteSlot(slotFirstInSequence.prev, result, index2, insertionPoint)) {
-                                            slotFirstInSequence = slotFirstInSequence.prev;
-                                            if (j >= 0) {
-                                                offsetMap[j] = slotFirstInSequence;
-                                            }
-                                        } else {
-                                            break;
-                                        }
-                                    }
-
-                                    for (j = i + 1; !slotLastInSequence.lastInSequence; j++) {
-                                        // Keep going until we hit the end marker or a slot that we can't use or promote (it's ok
-                                        // if j leaves the results range).
-
-                                        // If slotListEnd is in this sequence, it should not be separated from any predecessor
-                                        // slots, but they may need to be promoted.
-                                        result = results[j];
-                                        if ((result === endMarker || j === count) && slotLastInSequence.next !== slotListEnd) {
-                                            break;
-                                        }
-
-                                        if (slotLastInSequence.next === slotListEnd || promoteSlot(slotLastInSequence.next, result, index - offset + j, insertionPoint)) {
-                                            slotLastInSequence = slotLastInSequence.next;
-                                            if (j < resultsCount) {
-                                                offsetMap[j] = slotLastInSequence;
-                                            }
-
-                                            iLast = j;
-
-                                            if (slotLastInSequence === slotListEnd) {
-                                                break;
-                                            }
-                                        } else {
-                                            break;
-                                        }
-                                    }
-
-                                    slotBeforeSequence = (slotFirstInSequence.firstInSequence ? null : slotFirstInSequence.prev);
-                                    slotAfterSequence = (slotLastInSequence.lastInSequence ? null : slotLastInSequence.next);
-
-                                    if (slotBeforeSequence) {
-                                        splitSequence(slotBeforeSequence);
-                                    }
-                                    if (slotAfterSequence) {
-                                        splitSequence(slotLastInSequence);
-                                    }
-
-                                    // Move the sequence if necessary
-                                    if (typeof index === "number") {
-                                        if (slotLastInSequence === slotListEnd) {
-                                            // Instead of moving the list end, move the sequence before out of the way
-                                            if (slotBeforeSequence) {
-                                                moveSequenceAfter(slotListEnd, sequenceStart(slotBeforeSequence), slotBeforeSequence);
-                                            }
-                                        } else {
-                                            var slotInsertBefore = insertionPoint.slotNext;
-                                            if (!slotInsertBefore) {
-                                                slotInsertBefore = successorFromIndex(slotLastInSequence.index, indexMap, slotsStart, slotListEnd, true);
-                                            }
-                                            moveSequenceBefore(slotInsertBefore, slotFirstInSequence, slotLastInSequence);
-                                        }
-                                        if (slotFirstInSequence.prev.index === slotFirstInSequence.index - 1) {
-                                            mergeSequences(slotFirstInSequence.prev);
-                                        }
-                                        if (slotLastInSequence.next.index === slotLastInSequence.index + 1) {
-                                            mergeSequences(slotLastInSequence);
-                                        }
-                                    } else if (!firstSequence) {
-                                        slotBefore = offsetMap[i - 1];
-
-                                        if (slotBefore) {
-                                            if (slotFirstInSequence.prev !== slotBefore) {
-                                                if (slotLastInSequence === slotListEnd) {
-                                                    // Instead of moving the list end, move the sequence before out of the way and
-                                                    // the predecessor sequence into place.
-                                                    if (slotBeforeSequence) {
-                                                        moveSequenceAfter(slotListEnd, sequenceStart(slotBeforeSequence), slotBeforeSequence);
-                                                    }
-                                                    moveSequenceBefore(slotFirstInSequence, sequenceStart(slotBefore), slotBefore);
-                                                } else {
-                                                    moveSequenceAfter(slotBefore, slotFirstInSequence, slotLastInSequence);
-                                                }
-                                            }
-                                            mergeSequences(slotBefore);
-                                        }
-                                    }
-                                    firstSequence = false;
-
-                                    if (refreshRequested) {
-                                        return;
-                                    }
-
-                                    sequencePairsToMerge.push({
-                                        slotBeforeSequence: slotBeforeSequence,
-                                        slotFirstInSequence: slotFirstInSequence,
-                                        slotLastInSequence: slotLastInSequence,
-                                        slotAfterSequence: slotAfterSequence
-                                    });
-                                }
-
-                                // See if the fetched slot needs to be merged
-                                if (i === offset && slotExisting !== slot && !slotPermanentlyRemoved(slot)) {
-                                    slotBeforeSequence = (slot.firstInSequence ? null : slot.prev);
-                                    slotAfterSequence = (slot.lastInSequence ? null : slot.next);
-
-                                    sendMirageNotifications(slotExisting, slot, slotExisting.bindingMap);
-                                    mergeSlots(slotExisting, slot);
-
-                                    sequencePairsToMerge.push({
-                                        slotBeforeSequence: slotBeforeSequence,
-                                        slotFirstInSequence: slotExisting,
-                                        slotLastInSequence: slotExisting,
-                                        slotAfterSequence: slotAfterSequence
-                                    });
-                                }
-
-                                // Skip past all the other items in the sequence we just processed
-                                i = iLast;
-                            }
-                        }
-
-                        // If the count is known, set the index of the list end (wait until now because promoteSlot can sometimes
-                        // delete it; do this before mergeSequencePairs so the list end can have slots inserted immediately before
-                        // it).
-                        if (isNonNegativeNumber(count) && slotListEnd.index !== count) {
-                            changeSlotIndex(slotListEnd, count);
-                        }
-
-                        // Now that all the sequences have been moved, merge any colliding slots
-                        mergeSequencePairs(sequencePairsToMerge);
-
-                        // Match or cache any leftover items
-                        for (i = 0; i < resultsCount; i++) {
-                            // Find the first matched item
-                            slotExisting = offsetMap[i];
-                            if (slotExisting) {
-                                for (j = i - 1; j >= 0; j--) {
-                                    var slotAfter = offsetMap[j + 1];
-                                    matchSlot(offsetMap[j] = (slotAfter.firstInSequence ? addSlotBefore(offsetMap[j + 1], indexMap) : slotAfter.prev), results[j]);
-                                }
-                                for (j = i + 1; j < resultsCount; j++) {
-                                    slotBefore = offsetMap[j - 1];
-                                    slotExisting = offsetMap[j];
-                                    if (!slotExisting) {
-                                        matchSlot(offsetMap[j] = (slotBefore.lastInSequence ? addSlotAfter(slotBefore, indexMap) : slotBefore.next), results[j]);
-                                    } else if (slotExisting.firstInSequence) {
-                                        // Adding the cached items may result in some sequences merging
-                                        if (slotExisting.prev !== slotBefore) {
-                                            moveSequenceAfter(slotBefore, slotExisting, sequenceEnd(slotExisting));
-                                        }
-                                        mergeSequences(slotBefore);
-                                    }
-                                }
-                                break;
-                            }
-                        }
-
-                        // The description is no longer required
-                        delete slot.description;
-                    })();
-
-                    if (!refreshRequested) {
-                        // If the count changed, but that's the only thing, just send the notification
-                        if (count !== undefined && count !== knownCount) {
-                            changeCount(count);
-                        }
-
-                        // See if there are more requests we can now fulfill
-                        postFetch();
-                    }
-
-                    finishNotifications();
-
-                    // Finally complete any promises for newly obtained items
-                    callFetchCompleteCallbacks();
-                    profilerMarkEnd(perfId);
-                }
-
-                function processErrorResult(slot, error) {
-                    switch (error.name) {
-                        case FetchError.noResponse:
-                            setStatus(DataSourceStatus.failure);
-                            returnDirectFetchError(slot, error);
-                            break;
-
-                        case FetchError.doesNotExist:
-                            // Don't return an error, just complete with null (when the slot is deleted)
-
-                            if (slot.indexRequested) {
-                                // We now have an upper bound on the count
-                                removeMirageIndices(slot.index);
-                            } else if (slot.keyRequested || slot.description) {
-                                // This item, and any items in the same sequence, count as mirages, since they might never have
-                                // existed.
-                                deleteMirageSequence(slot);
-                            }
-
-                            finishNotifications();
-
-                            // It's likely that the client requested this item because something has changed since the client's
-                            // latest observations of the data.  Begin a refresh just in case.
-                            beginRefresh();
-                            break;
-                    }
-                }
-
-                function processResultsForIndex(indexRequested, slot, results, offset, count, index) {
-                    index = validateIndexReturned(index);
-                    count = validateCountReturned(count);
-
-                    var indexFirst = indexRequested - offset;
-
-                    var resultsCount = results.length;
-                    if (slot.index >= indexFirst && slot.index < indexFirst + resultsCount) {
-                        // The item is in this batch of results - process them all
-                        processResults(slot, results, slot.index - indexFirst, count, slot.index);
-                    } else if ((offset === resultsCount - 1 && indexRequested < slot.index) || (isNonNegativeNumber(count) && count <= slot.index)) {
-                        // The requested index does not exist
-                        processErrorResult(slot, new _ErrorFromName(FetchError.doesNotExist));
-                    } else {
-                        // We didn't get all the results we requested - pick up where they left off
-                        if (slot.index < indexFirst) {
-                            var fetchID = setFetchIDs(slot, 0, indexFirst - slot.index);
-                            fetchItemsForIndex(indexFirst, slot, fetchID, itemsFromKey(
-                                fetchID,
-                                results[0].key,
-                                indexFirst - slot.index,
-                                0
-                            ));
-                        } else {
-                            var indexLast = indexFirst + resultsCount - 1;
-                            var fetchID = setFetchIDs(slot, slot.index - indexLast, 0);
-                            fetchItemsForIndex(indexLast, slot, fetchID, itemsFromKey(
-                                fetchID,
-                                results[resultsCount - 1].key,
-                                0,
-                                slot.index - indexLast
-                            ));
-                        }
-                    }
-                }
-
-                function processErrorResultForIndex(indexRequested, slot, error) {
-                    // If the request was for an index other than the initial one, and the result was doesNotExist, this doesn't
-                    switch (error.name) {
-                        case FetchError.doesNotExist:
-                            if (indexRequested === slotsStart.index) {
-                                // The request was for the start of the list, so the item must not exist, and we now have an upper
-                                // bound of zero for the count.
-                                removeMirageIndices(0);
-
-                                processErrorResult(slot, error);
-
-                                // No need to check return value of removeMirageIndices, since processErrorResult is going to start
-                                // a refresh anyway.
-                            } else {
-                                // Something has changed, but this index might still exist, so request a refresh
-                                beginRefresh();
-                            }
-                            break;
-
-                        default:
-                            processErrorResult(slot, error);
-                            break;
-                    }
-                }
-
-                // Refresh
-
-                function identifyRefreshCycle() {
-                    // find refresh cycles, find the first beginRefresh in the refreshHistory and see whether it
-                    // matches the next beginRefresh, if so then move the data source into an error state and stop
-                    // refreshing.
-                    var start = 0;
-                    for (; start < refreshHistory.length; start++) {
-                        if (refreshHistory[start].kind === "beginRefresh") {
-                            break;
-                        }
-                    }
-                    var end = start;
-                    for (; end < refreshHistory.length; end++) {
-                        if (refreshHistory[end].kind === "beginRefresh") {
-                            break;
-                        }
-                    }
-                    if (end > start && (end + (end - start) < refreshHistory.length)) {
-                        var match = true;
-                        var length = end - start;
-                        for (var i = 0; i < length; i++) {
-                            if (refreshHistory[start + i].kind !== refreshHistory[end + i].kind) {
-                                match = false;
-                                break;
-                            }
-                        }
-                        if (match) {
-                            if (_Log.log) {
-                                _Log.log(strings.refreshCycleIdentified, "winjs vds", "error");
-                                for (var i = start; i < end; i++) {
-                                    _Log.log("" + (i - start) + ": " + JSON.stringify(refreshHistory[i]), "winjs vds", "error");
-                                }
-                            }
-                        }
-                        return match;
-                    }
-                }
-
-                function resetRefreshState() {
-                    if (++beginRefreshCount > MAX_BEGINREFRESH_COUNT) {
-                        if (identifyRefreshCycle()) {
-                            setStatus(DataSourceStatus.failure);
-                            return;
-                        }
-                    }
-                    refreshHistory[++refreshHistoryPos % refreshHistory.length] = { kind: "beginRefresh" };
-
-                    // Give the start sentinel an index so we can always use predecessor + 1
-                    refreshStart = {
-                        firstInSequence: true,
-                        lastInSequence: true,
-                        index: -1
-                    };
-                    refreshEnd = {
-                        firstInSequence: true,
-                        lastInSequence: true
-                    };
-                    refreshStart.next = refreshEnd;
-                    refreshEnd.prev = refreshStart;
-
-                    refreshItemsFetched = false;
-                    refreshCount = undefined;
-                    keyFetchIDs = {};
-                    refreshKeyMap = {};
-                    refreshIndexMap = {};
-                    refreshIndexMap[-1] = refreshStart;
-                    deletedKeys = {};
-                }
-
-                function beginRefresh() {
-                    if (refreshRequested) {
-                        // There's already a refresh that has yet to start
-                        return;
-                    }
-
-                    refreshRequested = true;
-
-                    setStatus(DataSourceStatus.waiting);
-
-                    if (waitForRefresh) {
-                        waitForRefresh = false;
-
-                        // The edit queue has been paused until the next refresh - resume it now
-                        applyNextEdit();
-                        return;
-                    }
-
-                    if (editsQueued) {
-                        // The refresh will be started once the edit queue empties out
-                        return;
-                    }
-
-                    var refreshID = ++currentRefreshID;
-                    refreshInProgress = true;
-                    refreshFetchesInProgress = 0;
-
-                    // Batch calls to beginRefresh
-                    Scheduler.schedule(function VDS_async_beginRefresh() {
-                        if (currentRefreshID !== refreshID) {
-                            return;
-                        }
-
-                        refreshRequested = false;
-
-                        resetRefreshState();
-
-                        // Remove all slots that aren't live, so we don't waste time fetching them
-                        for (var slot = slotsStart.next; slot !== slotsEnd;) {
-                            var slotNext = slot.next;
-
-                            if (!slotLive(slot) && slot !== slotListEnd) {
-                                deleteUnnecessarySlot(slot);
-                            }
-
-                            slot = slotNext;
-                        }
-
-                        startRefreshFetches();
-                    }, Scheduler.Priority.high, null, "WinJS.VirtualizedDataSource.beginRefresh");
-                }
-
-                function requestRefresh() {
-                    refreshSignal = refreshSignal || new _Signal();
-
-                    beginRefresh();
-
-                    return refreshSignal.promise;
-                }
-
-                function resultsValidForRefresh(refreshID, fetchID) {
-                    // This fetch has completed, whatever it has returned
-                    delete fetchesInProgress[fetchID];
-
-                    if (refreshID !== currentRefreshID) {
-                        // This information is out of date.  Ignore it.
-                        return false;
-                    }
-
-                    refreshFetchesInProgress--;
-
-                    return true;
-                }
-
-                function fetchItemsForRefresh(key, fromStart, fetchID, promiseItems, index) {
-                    var refreshID = currentRefreshID;
-
-                    refreshFetchesInProgress++;
-
-                    promiseItems.then(function (fetchResult) {
-                        if (fetchResult.items && fetchResult.items.length) {
-                            var perfID = "itemsFetched id=" + fetchID + " count=" + fetchResult.items.length;
-                            profilerMarkStart(perfID);
-                            if (resultsValidForRefresh(refreshID, fetchID)) {
-                                addMarkers(fetchResult);
-                                processRefreshResults(key, fetchResult.items, fetchResult.offset, fetchResult.totalCount, (typeof index === "number" ? index : fetchResult.absoluteIndex));
-                            }
-                            profilerMarkEnd(perfID);
-                        } else {
-                            return Promise.wrapError(new _ErrorFromName(FetchError.doesNotExist));
-                        }
-                    }).then(null, function (error) {
-                        if (resultsValidForRefresh(refreshID, fetchID)) {
-                            processRefreshErrorResult(key, fromStart, error);
-                        }
-                    });
-                }
-
-                function refreshRange(slot, fetchID, countBefore, countAfter) {
-                    if (itemsFromKey) {
-                        // Keys are the preferred identifiers when the item might have moved
-                        fetchItemsForRefresh(slot.key, false, fetchID, itemsFromKey(fetchID, slot.key, countBefore, countAfter, slot.hints));
-                    } else {
-                        // Request additional items to try to locate items that have moved
-                        var searchDelta = 10,
-                            index = slot.index;
-
-                        if (refreshIndexMap[index] && refreshIndexMap[index].firstInSequence) {
-                            // Ensure at least one element is observed before this one
-                            fetchItemsForRefresh(slot.key, false, fetchID, itemsFromIndex(fetchID, index - 1, Math.min(countBefore + searchDelta, index) - 1, countAfter + 1 + searchDelta), index - 1);
-                        } else if (refreshIndexMap[index] && refreshIndexMap[index].lastInSequence) {
-                            // Ask for the next index we need directly
-                            fetchItemsForRefresh(slot.key, false, fetchID, itemsFromIndex(fetchID, index + 1, Math.min(countBefore + searchDelta, index) + 1, countAfter - 1 + searchDelta), index + 1);
-                        } else {
-                            fetchItemsForRefresh(slot.key, false, fetchID, itemsFromIndex(fetchID, index, Math.min(countBefore + searchDelta, index), countAfter + searchDelta), index);
-                        }
-                    }
-                }
-
-                function refreshFirstItem(fetchID) {
-                    if (itemsFromStart) {
-                        fetchItemsForRefresh(null, true, fetchID, itemsFromStart(fetchID, 1), 0);
-                    } else if (itemsFromIndex) {
-                        fetchItemsForRefresh(null, true, fetchID, itemsFromIndex(fetchID, 0, 0, 0), 0);
-                    }
-                }
-
-                function keyFetchInProgress(key) {
-                    return fetchesInProgress[keyFetchIDs[key]];
-                }
-
-                function refreshRanges(slotFirst, allRanges) {
-                    // Fetch a few extra items each time, to catch insertions without requiring an extra fetch
-                    var refreshFetchExtra = 3;
-
-                    var refreshID = currentRefreshID;
-
-                    var slotFetchFirst,
-                        slotRefreshFirst,
-                        fetchCount = 0,
-                        fetchID;
-
-                    // Walk through the slot list looking for keys we haven't fetched or attempted to fetch yet.  Rely on the
-                    // heuristic that items that were close together before the refresh are likely to remain so after, so batched
-                    // fetches will locate most of the previously fetched items.
-                    for (var slot = slotFirst; slot !== slotsEnd; slot = slot.next) {
-                        if (!slotFetchFirst && slot.key && !deletedKeys[slot.key] && !keyFetchInProgress(slot.key)) {
-                            var slotRefresh = refreshKeyMap[slot.key];
-
-                            // Keep attempting to fetch an item until at least one item on either side of it has been observed, so
-                            // we can determine its position relative to others.
-                            if (!slotRefresh || slotRefresh.firstInSequence || slotRefresh.lastInSequence) {
-                                slotFetchFirst = slot;
-                                slotRefreshFirst = slotRefresh;
-                                fetchID = newFetchID();
-                            }
-                        }
-
-                        if (!slotFetchFirst) {
-                            // Also attempt to fetch placeholders for requests for specific keys, just in case those items no
-                            // longer exist.
-                            if (slot.key && isPlaceholder(slot) && !deletedKeys[slot.key]) {
-                                // Fulfill each "itemFromKey" request
-                                if (!refreshKeyMap[slot.key]) {
-                                    // Fetch at least one item before and after, just to verify item's position in list
-                                    fetchID = newFetchID();
-                                    fetchItemsForRefresh(slot.key, false, fetchID, itemsFromKey(fetchID, slot.key, 1, 1, slot.hints));
-                                }
-                            }
-                        } else {
-                            var keyAlreadyFetched = keyFetchInProgress(slot.key);
-
-                            if (!deletedKeys[slot.key] && !refreshKeyMap[slot.key] && !keyAlreadyFetched) {
-                                if (slot.key) {
-                                    keyFetchIDs[slot.key] = fetchID;
-                                }
-                                fetchCount++;
-                            }
-
-                            if (slot.lastInSequence || slot.next === slotListEnd || keyAlreadyFetched) {
-                                refreshRange(slotFetchFirst, fetchID, (!slotRefreshFirst || slotRefreshFirst.firstInSequence ? refreshFetchExtra : 0), fetchCount - 1 + refreshFetchExtra);
-
-                                if (!allRanges) {
-                                    break;
-                                }
-
-                                slotFetchFirst = null;
-                                fetchCount = 0;
-                            }
-                        }
-                    }
-
-                    if (refreshFetchesInProgress === 0 && !refreshItemsFetched && currentRefreshID === refreshID) {
-                        // If nothing was successfully fetched, try fetching the first item, to detect an empty list
-                        refreshFirstItem(newFetchID());
-                    }
-
-                }
-
-                function startRefreshFetches() {
-                    var refreshID = currentRefreshID;
-
-                    do {
-                        synchronousProgress = false;
-                        reentrantContinue = true;
-                        refreshRanges(slotsStart.next, true);
-                        reentrantContinue = false;
-                    } while (refreshFetchesInProgress === 0 && synchronousProgress && currentRefreshID === refreshID && refreshInProgress);
-
-                    if (refreshFetchesInProgress === 0 && currentRefreshID === refreshID) {
-                        concludeRefresh();
-                    }
-                }
-
-                function continueRefresh(key) {
-                    var refreshID = currentRefreshID;
-
-                    // If the key is absent, then the attempt to fetch the first item just completed, and there is nothing else to
-                    // fetch.
-                    if (key) {
-                        var slotContinue = keyMap[key];
-                        if (!slotContinue) {
-                            // In a rare case, the slot might have been deleted; just start scanning from the beginning again
-                            slotContinue = slotsStart.next;
-                        }
-
-                        do {
-                            synchronousRefresh = false;
-                            reentrantRefresh = true;
-                            refreshRanges(slotContinue, false);
-                            reentrantRefresh = false;
-                        } while (synchronousRefresh && currentRefreshID === refreshID && refreshInProgress);
-                    }
-
-                    if (reentrantContinue) {
-                        synchronousProgress = true;
-                    } else {
-                        if (refreshFetchesInProgress === 0 && currentRefreshID === refreshID) {
-                            // Walk through the entire list one more time, in case any edits were made during the refresh
-                            startRefreshFetches();
-                        }
-                    }
-                }
-
-                function slotRefreshFromResult(result) {
-                    if (typeof result !== "object" || !result) {
-                        throw new _ErrorFromName("WinJS.UI.ListDataSource.InvalidItemReturned", strings.invalidItemReturned);
-                    } else if (result === startMarker) {
-                        return refreshStart;
-                    } else if (result === endMarker) {
-                        return refreshEnd;
-                    } else if (!result.key) {
-                        throw new _ErrorFromName("WinJS.UI.ListDataSource.InvalidKeyReturned", strings.invalidKeyReturned);
-                    } else {
-                        return refreshKeyMap[result.key];
-                    }
-                }
-
-                function processRefreshSlotIndex(slot, expectedIndex) {
-                    while (slot.index === undefined) {
-                        setSlotIndex(slot, expectedIndex, refreshIndexMap);
-
-                        if (slot.firstInSequence) {
-                            return true;
-                        }
-
-                        slot = slot.prev;
-                        expectedIndex--;
-                    }
-
-                    if (slot.index !== expectedIndex) {
-                        // Something has changed since the refresh began; start again
-                        beginRefresh();
-                        return false;
-                    }
-
-                    return true;
-                }
-
-                function setRefreshSlotResult(slotRefresh, result) {
-                    slotRefresh.key = result.key;
-                    refreshKeyMap[slotRefresh.key] = slotRefresh;
-
-                    slotRefresh.item = result;
-                }
-
-                // Returns the slot after the last insertion point between sequences
-                function lastRefreshInsertionPoint() {
-                    var slotNext = refreshEnd;
-                    while (!slotNext.firstInSequence) {
-                        slotNext = slotNext.prev;
-
-                        if (slotNext === refreshStart) {
-                            return null;
-                        }
-                    }
-
-                    return slotNext;
-                }
-
-                function processRefreshResults(key, results, offset, count, index) {
-                    index = validateIndexReturned(index);
-                    count = validateCountReturned(count);
-
-                    var keyPresent = false;
-
-                    refreshItemsFetched = true;
-
-                    var indexFirst = index - offset,
-                        result = results[0];
-
-                    if (result.key === key) {
-                        keyPresent = true;
-                    }
-
-                    var slot = slotRefreshFromResult(result);
-                    if (!slot) {
-                        if (refreshIndexMap[indexFirst]) {
-                            // Something has changed since the refresh began; start again
-                            beginRefresh();
-                            return;
-                        }
-
-                        // See if these results should be appended to an existing sequence
-                        var slotPrev;
-                        if (index !== undefined && (slotPrev = refreshIndexMap[indexFirst - 1])) {
-                            if (!slotPrev.lastInSequence) {
-                                // Something has changed since the refresh began; start again
-                                beginRefresh();
-                                return;
-                            }
-                            slot = addSlotAfter(slotPrev, refreshIndexMap);
-                        } else {
-                            // Create a new sequence
-                            var slotSuccessor = (
-                                +indexFirst === indexFirst ?
-                                    successorFromIndex(indexFirst, refreshIndexMap, refreshStart, refreshEnd) :
-                                    lastRefreshInsertionPoint(refreshStart, refreshEnd)
-                            );
-
-                            if (!slotSuccessor) {
-                                // Something has changed since the refresh began; start again
-                                beginRefresh();
-                                return;
-                            }
-
-                            slot = createSlotSequence(slotSuccessor, indexFirst, refreshIndexMap);
-                        }
-
-                        setRefreshSlotResult(slot, results[0]);
-                    } else {
-                        if (+indexFirst === indexFirst) {
-                            if (!processRefreshSlotIndex(slot, indexFirst)) {
-                                return;
-                            }
-                        }
-                    }
-
-                    var resultsCount = results.length;
-                    for (var i = 1; i < resultsCount; i++) {
-                        result = results[i];
-
-                        if (result.key === key) {
-                            keyPresent = true;
-                        }
-
-                        var slotNext = slotRefreshFromResult(result);
-
-                        if (!slotNext) {
-                            if (!slot.lastInSequence) {
-                                // Something has changed since the refresh began; start again
-                                beginRefresh();
-                                return;
-                            }
-                            slotNext = addSlotAfter(slot, refreshIndexMap);
-                            setRefreshSlotResult(slotNext, result);
-                        } else {
-                            if (slot.index !== undefined && !processRefreshSlotIndex(slotNext, slot.index + 1)) {
-                                return;
-                            }
-
-                            // If the slots aren't adjacent, see if it's possible to reorder sequences to make them so
-                            if (slotNext !== slot.next) {
-                                if (!slot.lastInSequence || !slotNext.firstInSequence) {
-                                    // Something has changed since the refresh began; start again
-                                    beginRefresh();
-                                    return;
-                                }
-
-                                var slotLast = sequenceEnd(slotNext);
-                                if (slotLast !== refreshEnd) {
-                                    moveSequenceAfter(slot, slotNext, slotLast);
-                                } else {
-                                    var slotFirst = sequenceStart(slot);
-                                    if (slotFirst !== refreshStart) {
-                                        moveSequenceBefore(slotNext, slotFirst, slot);
-                                    } else {
-                                        // Something has changed since the refresh began; start again
-                                        beginRefresh();
-                                        return;
-                                    }
-                                }
-
-                                mergeSequences(slot);
-                            } else if (slot.lastInSequence) {
-                                mergeSequences(slot);
-                            }
-                        }
-
-                        slot = slotNext;
-                    }
-
-                    if (!keyPresent) {
-                        deletedKeys[key] = true;
-                    }
-
-                    // If the count wasn't provided, see if it can be determined from the end of the list.
-                    if (!isNonNegativeNumber(count) && !refreshEnd.firstInSequence) {
-                        var indexLast = refreshEnd.prev.index;
-                        if (indexLast !== undefined) {
-                            count = indexLast + 1;
-                        }
-                    }
-
-                    if (isNonNegativeNumber(count) || count === CountResult.unknown) {
-                        if (isNonNegativeNumber(refreshCount)) {
-                            if (count !== refreshCount) {
-                                // Something has changed since the refresh began; start again
-                                beginRefresh();
-                                return;
-                            }
-                        } else {
-                            refreshCount = count;
-                        }
-
-                        if (isNonNegativeNumber(refreshCount) && !refreshIndexMap[refreshCount]) {
-                            setSlotIndex(refreshEnd, refreshCount, refreshIndexMap);
-                        }
-                    }
-
-                    if (reentrantRefresh) {
-                        synchronousRefresh = true;
-                    } else {
-                        continueRefresh(key);
-                    }
-                }
-
-                function processRefreshErrorResult(key, fromStart, error) {
-                    switch (error.name) {
-                        case FetchError.noResponse:
-                            setStatus(DataSourceStatus.failure);
-                            break;
-
-                        case FetchError.doesNotExist:
-                            if (fromStart) {
-                                // The attempt to fetch the first item failed, so the list must be empty
-                                setSlotIndex(refreshEnd, 0, refreshIndexMap);
-                                refreshCount = 0;
-
-                                concludeRefresh();
-                            } else {
-                                deletedKeys[key] = true;
-
-                                if (reentrantRefresh) {
-                                    synchronousRefresh = true;
-                                } else {
-                                    continueRefresh(key);
-                                }
-                            }
-                            break;
-                    }
-                }
-
-                function slotFromSlotRefresh(slotRefresh) {
-                    if (slotRefresh === refreshStart) {
-                        return slotsStart;
-                    } else if (slotRefresh === refreshEnd) {
-                        return slotListEnd;
-                    } else {
-                        return keyMap[slotRefresh.key];
-                    }
-                }
-
-                function slotRefreshFromSlot(slot) {
-                    if (slot === slotsStart) {
-                        return refreshStart;
-                    } else if (slot === slotListEnd) {
-                        return refreshEnd;
-                    } else {
-                        return refreshKeyMap[slot.key];
-                    }
-                }
-
-                function mergeSequencesForRefresh(slotPrev) {
-                    mergeSequences(slotPrev);
-
-                    // Mark the merge point, so we can distinguish insertions from unrequested items
-                    slotPrev.next.mergedForRefresh = true;
-                }
-
-                function copyRefreshSlotData(slotRefresh, slot) {
-                    setSlotKey(slot, slotRefresh.key);
-                    slot.itemNew = slotRefresh.item;
-                }
-
-                function addNewSlotFromRefresh(slotRefresh, slotNext, insertAfter) {
-                    var slotNew = createPrimarySlot();
-
-                    copyRefreshSlotData(slotRefresh, slotNew);
-                    insertAndMergeSlot(slotNew, slotNext, insertAfter, !insertAfter);
-
-                    var index = slotRefresh.index;
-                    if (+index !== index) {
-                        index = (insertAfter ? slotNew.prev.index + 1 : slotNext.next.index - 1);
-                    }
-
-                    setSlotIndex(slotNew, index, indexMap);
-
-                    return slotNew;
-                }
-
-                function matchSlotForRefresh(slotExisting, slot, slotRefresh) {
-                    if (slotExisting) {
-                        sendMirageNotifications(slotExisting, slot, slotExisting.bindingMap);
-                        mergeSlotsAndItem(slotExisting, slot, slotRefresh.item);
-                    } else {
-                        copyRefreshSlotData(slotRefresh, slot);
-
-                        // If the index was requested, complete the promises now, as the index might be about to change
-                        if (slot.indexRequested) {
-                            updateSlotItem(slot);
-                        }
-                    }
-                }
-
-                function updateSlotForRefresh(slotExisting, slot, slotRefresh) {
-                    if (!slot.key) {
-                        if (slotExisting) {
-                            // Record the relationship between the slot to discard and its neighbors
-                            slotRefresh.mergeWithPrev = !slot.firstInSequence;
-                            slotRefresh.mergeWithNext = !slot.lastInSequence;
-                        } else {
-                            slotRefresh.stationary = true;
-                        }
-                        matchSlotForRefresh(slotExisting, slot, slotRefresh);
-                        return true;
-                    } else {
-                        return false;
-                    }
-                }
-
-                function indexForRefresh(slot) {
-                    var indexNew;
-
-                    if (slot.indexRequested) {
-                        indexNew = slot.index;
-                    } else {
-                        var slotRefresh = slotRefreshFromSlot(slot);
-                        if (slotRefresh) {
-                            indexNew = slotRefresh.index;
-                        }
-                    }
-
-                    return indexNew;
-                }
-
-                function concludeRefresh() {
-                    beginRefreshCount = 0;
-                    refreshHistory = new Array(100);
-                    refreshHistoryPos = -1;
-
-                    indexUpdateDeferred = true;
-
-                    keyFetchIDs = {};
-
-                    var i,
-                        j,
-                        slot,
-                        slotPrev,
-                        slotNext,
-                        slotBefore,
-                        slotAfter,
-                        slotRefresh,
-                        slotExisting,
-                        slotFirstInSequence,
-                        sequenceCountOld,
-                        sequencesOld = [],
-                        sequenceOld,
-                        sequenceOldPrev,
-                        sequenceOldBestMatch,
-                        sequenceCountNew,
-                        sequencesNew = [],
-                        sequenceNew,
-                        index,
-                        offset;
-
-                    // Assign a sequence number to each refresh slot
-                    sequenceCountNew = 0;
-                    for (slotRefresh = refreshStart; slotRefresh; slotRefresh = slotRefresh.next) {
-                        slotRefresh.sequenceNumber = sequenceCountNew;
-
-                        if (slotRefresh.firstInSequence) {
-                            slotFirstInSequence = slotRefresh;
-                        }
-
-                        if (slotRefresh.lastInSequence) {
-                            sequencesNew[sequenceCountNew] = {
-                                first: slotFirstInSequence,
-                                last: slotRefresh,
-                                matchingItems: 0
-                            };
-                            sequenceCountNew++;
-                        }
-                    }
-
-                    // Remove unnecessary information from main slot list, and update the items
-                    lastSlotReleased = null;
-                    releasedSlots = 0;
-                    for (slot = slotsStart.next; slot !== slotsEnd;) {
-                        slotRefresh = refreshKeyMap[slot.key];
-                        slotNext = slot.next;
-
-                        if (slot !== slotListEnd) {
-                            if (!slotLive(slot)) {
-                                // Some more items might have been released since the refresh started.  Strip them away from the
-                                // main slot list, as they'll just get in the way from now on.  Since we're discarding these, but
-                                // don't know if they're actually going away, split the sequence as our starting assumption must be
-                                // that the items on either side are in separate sequences.
-                                deleteUnnecessarySlot(slot);
-                            } else if (slot.key && !slotRefresh) {
-                                // Remove items that have been deleted (or moved far away) and send removed notifications
-                                deleteSlot(slot, false);
-                            } else if (refreshCount === 0 || (slot.indexRequested && slot.index >= refreshCount)) {
-                                // Remove items that can't exist in the list and send mirage removed notifications
-                                deleteSlot(slot, true);
-                            } else if (slot.item || slot.keyRequested) {
-                                // Store the new item; this value will be compared with that stored in slot.item later
-                                slot.itemNew = slotRefresh.item;
-                            } else {
-                                // Clear keys and items that have never been observed by client
-                                if (slot.key) {
-                                    if (!slot.keyRequested) {
-                                        delete keyMap[slot.key];
-                                        delete slot.key;
-                                    }
-                                    slot.itemNew = null;
-                                }
-                            }
-                        }
-
-                        slot = slotNext;
-                    }
-
-                    // Placeholders generated by itemsAtIndex should not move.  Match these to items now if possible, or merge them
-                    // with existing items if necessary.
-                    for (slot = slotsStart.next; slot !== slotListEnd;) {
-                        slotNext = slot.next;
-
-                        if (slot.indexRequested) {
-                            slotRefresh = refreshIndexMap[slot.index];
-                            if (slotRefresh) {
-                                matchSlotForRefresh(slotFromSlotRefresh(slotRefresh), slot, slotRefresh);
-                            }
-                        }
-
-                        slot = slotNext;
-                    }
-
-                    // Match old sequences to new sequences
-                    var bestMatch,
-                        bestMatchCount,
-                        previousBestMatch = 0,
-                        newSequenceCounts = [],
-                        slotIndexRequested,
-                        sequenceIndexEnd,
-                        sequenceOldEnd;
-
-                    sequenceCountOld = 0;
-                    for (slot = slotsStart; slot !== slotsEnd; slot = slot.next) {
-                        if (slot.firstInSequence) {
-                            slotFirstInSequence = slot;
-                            slotIndexRequested = null;
-                            for (i = 0; i < sequenceCountNew; i++) {
-                                newSequenceCounts[i] = 0;
-                            }
-                        }
-
-                        if (slot.indexRequested) {
-                            slotIndexRequested = slot;
-                        }
-
-                        slotRefresh = slotRefreshFromSlot(slot);
-                        if (slotRefresh) {
-                            newSequenceCounts[slotRefresh.sequenceNumber]++;
-                        }
-
-                        if (slot.lastInSequence) {
-                            // Determine which new sequence is the best match for this old one.  Use a simple greedy algorithm to
-                            // ensure the relative ordering of matched sequences is the same; out-of-order sequences will require
-                            // move notifications.
-                            bestMatchCount = 0;
-                            for (i = previousBestMatch; i < sequenceCountNew; i++) {
-                                if (bestMatchCount < newSequenceCounts[i]) {
-                                    bestMatchCount = newSequenceCounts[i];
-                                    bestMatch = i;
-                                }
-                            }
-
-                            sequenceOld = {
-                                first: slotFirstInSequence,
-                                last: slot,
-                                sequenceNew: (bestMatchCount > 0 ? sequencesNew[bestMatch] : undefined),
-                                matchingItems: bestMatchCount
-                            };
-
-                            if (slotIndexRequested) {
-                                sequenceOld.indexRequested = true;
-                                sequenceOld.stationarySlot = slotIndexRequested;
-                            }
-
-                            sequencesOld[sequenceCountOld] = sequenceOld;
-
-                            if (slot === slotListEnd) {
-                                sequenceIndexEnd = sequenceCountOld;
-                                sequenceOldEnd = sequenceOld;
-                            }
-
-                            sequenceCountOld++;
-
-                            if (sequencesNew[bestMatch].first.index !== undefined) {
-                                previousBestMatch = bestMatch;
-                            }
-                        }
-                    }
-
-                    // Special case: split the old start into a separate sequence if the new start isn't its best match
-                    if (sequencesOld[0].sequenceNew !== sequencesNew[0]) {
-                        splitSequence(slotsStart);
-                        sequencesOld[0].first = slotsStart.next;
-                        sequencesOld.unshift({
-                            first: slotsStart,
-                            last: slotsStart,
-                            sequenceNew: sequencesNew[0],
-                            matchingItems: 1
-                        });
-                        sequenceIndexEnd++;
-                        sequenceCountOld++;
-                    }
-
-                    var listEndObserved = !slotListEnd.firstInSequence;
-
-                    // Special case: split the old end into a separate sequence if the new end isn't its best match
-                    if (sequenceOldEnd.sequenceNew !== sequencesNew[sequenceCountNew - 1]) {
-                        splitSequence(slotListEnd.prev);
-                        sequenceOldEnd.last = slotListEnd.prev;
-                        sequenceIndexEnd++;
-                        sequencesOld.splice(sequenceIndexEnd, 0, {
-                            first: slotListEnd,
-                            last: slotListEnd,
-                            sequenceNew: sequencesNew[sequenceCountNew - 1],
-                            matchingItems: 1
-                        });
-                        sequenceCountOld++;
-                        sequenceOldEnd = sequencesOld[sequenceIndexEnd];
-                    }
-
-                    // Map new sequences to old sequences
-                    for (i = 0; i < sequenceCountOld; i++) {
-                        sequenceNew = sequencesOld[i].sequenceNew;
-                        if (sequenceNew && sequenceNew.matchingItems < sequencesOld[i].matchingItems) {
-                            sequenceNew.matchingItems = sequencesOld[i].matchingItems;
-                            sequenceNew.sequenceOld = sequencesOld[i];
-                        }
-                    }
-
-                    // The old end must always be the best match for the new end (if the new end is also the new start, they will
-                    // be merged below).
-                    sequencesNew[sequenceCountNew - 1].sequenceOld = sequenceOldEnd;
-                    sequenceOldEnd.stationarySlot = slotListEnd;
-
-                    // The old start must always be the best match for the new start
-                    sequencesNew[0].sequenceOld = sequencesOld[0];
-                    sequencesOld[0].stationarySlot = slotsStart;
-
-                    // Merge additional indexed old sequences when possible
-
-                    // First do a forward pass
-                    for (i = 0; i <= sequenceIndexEnd; i++) {
-                        sequenceOld = sequencesOld[i];
-
-                        if (sequenceOld.sequenceNew && (sequenceOldBestMatch = sequenceOld.sequenceNew.sequenceOld) === sequenceOldPrev && sequenceOldPrev.last !== slotListEnd) {
-                            mergeSequencesForRefresh(sequenceOldBestMatch.last);
-                            sequenceOldBestMatch.last = sequenceOld.last;
-                            delete sequencesOld[i];
-                        } else {
-                            sequenceOldPrev = sequenceOld;
-                        }
-                    }
-
-                    // Now do a reverse pass
-                    sequenceOldPrev = null;
-                    for (i = sequenceIndexEnd; i >= 0; i--) {
-                        sequenceOld = sequencesOld[i];
-                        // From this point onwards, some members of sequencesOld may be undefined
-                        if (sequenceOld) {
-                            if (sequenceOld.sequenceNew && (sequenceOldBestMatch = sequenceOld.sequenceNew.sequenceOld) === sequenceOldPrev && sequenceOld.last !== slotListEnd) {
-                                mergeSequencesForRefresh(sequenceOld.last);
-                                sequenceOldBestMatch.first = sequenceOld.first;
-                                delete sequencesOld[i];
-                            } else {
-                                sequenceOldPrev = sequenceOld;
-                            }
-                        }
-                    }
-
-                    // Since we may have forced the list end into a separate sequence, the mergedForRefresh flag may be incorrect
-                    if (listEndObserved) {
-                        delete slotListEnd.mergedForRefresh;
-                    }
-
-                    var sequencePairsToMerge = [];
-
-                    // Find unchanged sequences without indices that can be merged with existing sequences without move
-                    // notifications.
-                    for (i = sequenceIndexEnd + 1; i < sequenceCountOld; i++) {
-                        sequenceOld = sequencesOld[i];
-                        if (sequenceOld && (!sequenceOld.sequenceNew || sequenceOld.sequenceNew.sequenceOld !== sequenceOld)) {
-                            // If the order of the known items in the sequence is unchanged, then the sequence probably has not
-                            // moved, but we now know where it belongs relative to at least one other sequence.
-                            var orderPreserved = true,
-                                slotRefreshFirst = null,
-                                slotRefreshLast = null,
-                                sequenceLength = 0;
-                            slotRefresh = slotRefreshFromSlot(sequenceOld.first);
-                            if (slotRefresh) {
-                                slotRefreshFirst = slotRefreshLast = slotRefresh;
-                                sequenceLength = 1;
-                            }
-                            for (slot = sequenceOld.first; slot !== sequenceOld.last; slot = slot.next) {
-                                var slotRefreshNext = slotRefreshFromSlot(slot.next);
-
-                                if (slotRefresh && slotRefreshNext && (slotRefresh.lastInSequence || slotRefresh.next !== slotRefreshNext)) {
-                                    orderPreserved = false;
-                                    break;
-                                }
-
-                                if (slotRefresh && !slotRefreshFirst) {
-                                    slotRefreshFirst = slotRefreshLast = slotRefresh;
-                                }
-
-                                if (slotRefreshNext && slotRefreshFirst) {
-                                    slotRefreshLast = slotRefreshNext;
-                                    sequenceLength++;
-                                }
-
-                                slotRefresh = slotRefreshNext;
-                            }
-
-                            // If the stationary sequence has indices, verify that there is enough space for this sequence - if
-                            // not, then something somewhere has moved after all.
-                            if (orderPreserved && slotRefreshFirst && slotRefreshFirst.index !== undefined) {
-                                var indexBefore;
-                                if (!slotRefreshFirst.firstInSequence) {
-                                    slotBefore = slotFromSlotRefresh(slotRefreshFirst.prev);
-                                    if (slotBefore) {
-                                        indexBefore = slotBefore.index;
-                                    }
-                                }
-
-                                var indexAfter;
-                                if (!slotRefreshLast.lastInSequence) {
-                                    slotAfter = slotFromSlotRefresh(slotRefreshLast.next);
-                                    if (slotAfter) {
-                                        indexAfter = slotAfter.index;
-                                    }
-                                }
-
-                                if ((!slotAfter || slotAfter.lastInSequence || slotAfter.mergedForRefresh) &&
-                                        (indexBefore === undefined || indexAfter === undefined || indexAfter - indexBefore - 1 >= sequenceLength)) {
-                                    sequenceOld.locationJustDetermined = true;
-
-                                    // Mark the individual refresh slots as not requiring move notifications
-                                    for (slotRefresh = slotRefreshFirst; ; slotRefresh = slotRefresh.next) {
-                                        slotRefresh.locationJustDetermined = true;
-
-                                        if (slotRefresh === slotRefreshLast) {
-                                            break;
-                                        }
-                                    }
-
-                                    // Store any adjacent placeholders so they can be merged once the moves and insertions have
-                                    // been processed.
-                                    var slotFirstInSequence = slotFromSlotRefresh(slotRefreshFirst),
-                                        slotLastInSequence = slotFromSlotRefresh(slotRefreshLast);
-                                    sequencePairsToMerge.push({
-                                        slotBeforeSequence: (slotFirstInSequence.firstInSequence ? null : slotFirstInSequence.prev),
-                                        slotFirstInSequence: slotFirstInSequence,
-                                        slotLastInSequence: slotLastInSequence,
-                                        slotAfterSequence: (slotLastInSequence.lastInSequence ? null : slotLastInSequence.next)
-                                    });
-                                }
-                            }
-                        }
-                    }
-
-                    // Remove placeholders in old sequences that don't map to new sequences (and don't contain requests for a
-                    // specific index or key), as they no longer have meaning.
-                    for (i = 0; i < sequenceCountOld; i++) {
-                        sequenceOld = sequencesOld[i];
-                        if (sequenceOld && !sequenceOld.indexRequested && !sequenceOld.locationJustDetermined && (!sequenceOld.sequenceNew || sequenceOld.sequenceNew.sequenceOld !== sequenceOld)) {
-                            sequenceOld.sequenceNew = null;
-
-                            slot = sequenceOld.first;
-
-                            var sequenceEndReached;
-                            do {
-                                sequenceEndReached = (slot === sequenceOld.last);
-
-                                slotNext = slot.next;
-
-                                if (slot !== slotsStart && slot !== slotListEnd && slot !== slotsEnd && !slot.item && !slot.keyRequested) {
-                                    deleteSlot(slot, true);
-                                    if (sequenceOld.first === slot) {
-                                        if (sequenceOld.last === slot) {
-                                            delete sequencesOld[i];
-                                            break;
-                                        } else {
-                                            sequenceOld.first = slot.next;
-                                        }
-                                    } else if (sequenceOld.last === slot) {
-                                        sequenceOld.last = slot.prev;
-                                    }
-                                }
-
-                                slot = slotNext;
-                            } while (!sequenceEndReached);
-                        }
-                    }
-
-                    // Locate boundaries of new items in new sequences
-                    for (i = 0; i < sequenceCountNew; i++) {
-                        sequenceNew = sequencesNew[i];
-                        for (slotRefresh = sequenceNew.first; !slotFromSlotRefresh(slotRefresh) && !slotRefresh.lastInSequence; slotRefresh = slotRefresh.next) {
-                            /*@empty*/
-                        }
-                        if (slotRefresh.lastInSequence && !slotFromSlotRefresh(slotRefresh)) {
-                            sequenceNew.firstInner = sequenceNew.lastInner = null;
-                        } else {
-                            sequenceNew.firstInner = slotRefresh;
-                            for (slotRefresh = sequenceNew.last; !slotFromSlotRefresh(slotRefresh) ; slotRefresh = slotRefresh.prev) {
-                                /*@empty*/
-                            }
-                            sequenceNew.lastInner = slotRefresh;
-                        }
-                    }
-
-                    // Determine which items to move
-                    for (i = 0; i < sequenceCountNew; i++) {
-                        sequenceNew = sequencesNew[i];
-                        if (sequenceNew && sequenceNew.firstInner) {
-                            sequenceOld = sequenceNew.sequenceOld;
-                            if (sequenceOld) {
-                                // Number the slots in each new sequence with their offset in the corresponding old sequence (or
-                                // undefined if in a different old sequence).
-                                var ordinal = 0;
-                                for (slot = sequenceOld.first; true; slot = slot.next, ordinal++) {
-                                    slotRefresh = slotRefreshFromSlot(slot);
-                                    if (slotRefresh && slotRefresh.sequenceNumber === sequenceNew.firstInner.sequenceNumber) {
-                                        slotRefresh.ordinal = ordinal;
-                                    }
-
-                                    if (slot.lastInSequence) {
-                                        break;
-                                    }
-                                }
-
-                                // Determine longest subsequence of items that are in the same order before and after
-                                var piles = [];
-                                for (slotRefresh = sequenceNew.firstInner; true; slotRefresh = slotRefresh.next) {
-                                    ordinal = slotRefresh.ordinal;
-                                    if (ordinal !== undefined) {
-                                        var searchFirst = 0,
-                                            searchLast = piles.length - 1;
-                                        while (searchFirst <= searchLast) {
-                                            var searchMidpoint = Math.floor(0.5 * (searchFirst + searchLast));
-                                            if (piles[searchMidpoint].ordinal < ordinal) {
-                                                searchFirst = searchMidpoint + 1;
-                                            } else {
-                                                searchLast = searchMidpoint - 1;
-                                            }
-                                        }
-                                        piles[searchFirst] = slotRefresh;
-                                        if (searchFirst > 0) {
-                                            slotRefresh.predecessor = piles[searchFirst - 1];
-                                        }
-                                    }
-
-                                    if (slotRefresh === sequenceNew.lastInner) {
-                                        break;
-                                    }
-                                }
-
-                                // The items in the longest ordered subsequence don't move; everything else does
-                                var stationaryItems = [],
-                                    stationaryItemCount = piles.length;
-                                slotRefresh = piles[stationaryItemCount - 1];
-                                for (j = stationaryItemCount; j--;) {
-                                    slotRefresh.stationary = true;
-                                    stationaryItems[j] = slotRefresh;
-                                    slotRefresh = slotRefresh.predecessor;
-                                }
-                                sequenceOld.stationarySlot = slotFromSlotRefresh(stationaryItems[0]);
-
-                                // Try to match new items before the first stationary item to placeholders
-                                slotRefresh = stationaryItems[0];
-                                slot = slotFromSlotRefresh(slotRefresh);
-                                slotPrev = slot.prev;
-                                var sequenceBoundaryReached = slot.firstInSequence;
-                                while (!slotRefresh.firstInSequence) {
-                                    slotRefresh = slotRefresh.prev;
-                                    slotExisting = slotFromSlotRefresh(slotRefresh);
-                                    if (!slotExisting || slotRefresh.locationJustDetermined) {
-                                        // Find the next placeholder walking backwards
-                                        while (!sequenceBoundaryReached && slotPrev !== slotsStart) {
-                                            slot = slotPrev;
-                                            slotPrev = slot.prev;
-                                            sequenceBoundaryReached = slot.firstInSequence;
-
-                                            if (updateSlotForRefresh(slotExisting, slot, slotRefresh)) {
-                                                break;
-                                            }
-                                        }
-                                    }
-                                }
-
-                                // Try to match new items between stationary items to placeholders
-                                for (j = 0; j < stationaryItemCount - 1; j++) {
-                                    slotRefresh = stationaryItems[j];
-                                    slot = slotFromSlotRefresh(slotRefresh);
-                                    var slotRefreshStop = stationaryItems[j + 1],
-                                        slotRefreshMergePoint = null,
-                                        slotStop = slotFromSlotRefresh(slotRefreshStop),
-                                        slotExisting;
-                                    // Find all the new items
-                                    slotNext = slot.next;
-                                    for (slotRefresh = slotRefresh.next; slotRefresh !== slotRefreshStop && !slotRefreshMergePoint && slot !== slotStop; slotRefresh = slotRefresh.next) {
-                                        slotExisting = slotFromSlotRefresh(slotRefresh);
-                                        if (!slotExisting || slotRefresh.locationJustDetermined) {
-                                            // Find the next placeholder
-                                            while (slotNext !== slotStop) {
-                                                // If a merge point is reached, match the remainder of the placeholders by walking backwards
-                                                if (slotNext.mergedForRefresh) {
-                                                    slotRefreshMergePoint = slotRefresh.prev;
-                                                    break;
-                                                }
-
-                                                slot = slotNext;
-                                                slotNext = slot.next;
-
-                                                if (updateSlotForRefresh(slotExisting, slot, slotRefresh)) {
-                                                    break;
-                                                }
-                                            }
-                                        }
-                                    }
-
-                                    // Walk backwards to the first merge point if necessary
-                                    if (slotRefreshMergePoint) {
-                                        slotPrev = slotStop.prev;
-                                        for (slotRefresh = slotRefreshStop.prev; slotRefresh !== slotRefreshMergePoint && slotStop !== slot; slotRefresh = slotRefresh.prev) {
-                                            slotExisting = slotFromSlotRefresh(slotRefresh);
-                                            if (!slotExisting || slotRefresh.locationJustDetermined) {
-                                                // Find the next placeholder walking backwards
-                                                while (slotPrev !== slot) {
-                                                    slotStop = slotPrev;
-                                                    slotPrev = slotStop.prev;
-
-                                                    if (updateSlotForRefresh(slotExisting, slotStop, slotRefresh)) {
-                                                        break;
-                                                    }
-                                                }
-                                            }
-                                        }
-                                    }
-
-                                    // Delete remaining placeholders, sending notifications
-                                    while (slotNext !== slotStop) {
-                                        slot = slotNext;
-                                        slotNext = slot.next;
-
-                                        if (slot !== slotsStart && isPlaceholder(slot) && !slot.keyRequested) {
-                                            // This might occur due to two sequences - requested by different clients - being
-                                            // merged.  However, since only sequences with indices are merged, if this placehholder
-                                            // is no longer necessary, it means an item actually was removed, so this doesn't count
-                                            // as a mirage.
-                                            deleteSlot(slot);
-                                        }
-                                    }
-                                }
-
-                                // Try to match new items after the last stationary item to placeholders
-                                slotRefresh = stationaryItems[stationaryItemCount - 1];
-                                slot = slotFromSlotRefresh(slotRefresh);
-                                slotNext = slot.next;
-                                sequenceBoundaryReached = slot.lastInSequence;
-                                while (!slotRefresh.lastInSequence) {
-                                    slotRefresh = slotRefresh.next;
-                                    slotExisting = slotFromSlotRefresh(slotRefresh);
-                                    if (!slotExisting || slotRefresh.locationJustDetermined) {
-                                        // Find the next placeholder
-                                        while (!sequenceBoundaryReached && slotNext !== slotListEnd) {
-                                            slot = slotNext;
-                                            slotNext = slot.next;
-                                            sequenceBoundaryReached = slot.lastInSequence;
-
-                                            if (updateSlotForRefresh(slotExisting, slot, slotRefresh)) {
-                                                break;
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-
-                    // Move items and send notifications
-                    for (i = 0; i < sequenceCountNew; i++) {
-                        sequenceNew = sequencesNew[i];
-
-                        if (sequenceNew.firstInner) {
-                            slotPrev = null;
-                            for (slotRefresh = sequenceNew.firstInner; true; slotRefresh = slotRefresh.next) {
-                                slot = slotFromSlotRefresh(slotRefresh);
-                                if (slot) {
-                                    if (!slotRefresh.stationary) {
-                                        var slotMoveBefore,
-                                            mergeWithPrev = false,
-                                            mergeWithNext = false;
-                                        if (slotPrev) {
-                                            slotMoveBefore = slotPrev.next;
-                                            mergeWithPrev = true;
-                                        } else {
-                                            // The first item will be inserted before the first stationary item, so find that now
-                                            var slotRefreshStationary;
-                                            for (slotRefreshStationary = sequenceNew.firstInner; !slotRefreshStationary.stationary && slotRefreshStationary !== sequenceNew.lastInner; slotRefreshStationary = slotRefreshStationary.next) {
-                                                /*@empty*/
-                                            }
-
-                                            if (!slotRefreshStationary.stationary) {
-                                                // There are no stationary items, as all the items are moving from another old
-                                                // sequence.
-
-                                                index = slotRefresh.index;
-
-                                                // Find the best place to insert the new sequence
-                                                if (index === 0) {
-                                                    // Index 0 is a special case
-                                                    slotMoveBefore = slotsStart.next;
-                                                    mergeWithPrev = true;
-                                                } else if (index === undefined) {
-                                                    slotMoveBefore = slotsEnd;
-                                                } else {
-                                                    // Use a linear search; unlike successorFromIndex, prefer the last insertion
-                                                    // point between sequences over the precise index
-                                                    slotMoveBefore = slotsStart.next;
-                                                    var lastSequenceStart = null;
-                                                    while (true) {
-                                                        if (slotMoveBefore.firstInSequence) {
-                                                            lastSequenceStart = slotMoveBefore;
-                                                        }
-
-                                                        if ((index < slotMoveBefore.index && lastSequenceStart) || slotMoveBefore === slotListEnd) {
-                                                            break;
-                                                        }
-
-                                                        slotMoveBefore = slotMoveBefore.next;
-                                                    }
-
-                                                    if (!slotMoveBefore.firstInSequence && lastSequenceStart) {
-                                                        slotMoveBefore = lastSequenceStart;
-                                                    }
-                                                }
-                                            } else {
-                                                slotMoveBefore = slotFromSlotRefresh(slotRefreshStationary);
-                                                mergeWithNext = true;
-                                            }
-                                        }
-
-                                        // Preserve merge boundaries
-                                        if (slot.mergedForRefresh) {
-                                            delete slot.mergedForRefresh;
-                                            if (!slot.lastInSequence) {
-                                                slot.next.mergedForRefresh = true;
-                                            }
-                                        }
-
-                                        mergeWithPrev = mergeWithPrev || slotRefresh.mergeWithPrev;
-                                        mergeWithNext = mergeWithNext || slotRefresh.mergeWithNext;
-
-                                        var skipNotifications = slotRefresh.locationJustDetermined;
-
-                                        moveSlot(slot, slotMoveBefore, mergeWithPrev, mergeWithNext, skipNotifications);
-
-                                        if (skipNotifications && mergeWithNext) {
-                                            // Since this item was moved without a notification, this is an implicit merge of
-                                            // sequences.  Mark the item's successor as mergedForRefresh.
-                                            slotMoveBefore.mergedForRefresh = true;
-                                        }
-                                    }
-
-                                    slotPrev = slot;
-                                }
-
-                                if (slotRefresh === sequenceNew.lastInner) {
-                                    break;
-                                }
-                            }
-                        }
-                    }
-
-                    // Insert new items (with new indices) and send notifications
-                    for (i = 0; i < sequenceCountNew; i++) {
-                        sequenceNew = sequencesNew[i];
-
-                        if (sequenceNew.firstInner) {
-                            slotPrev = null;
-                            for (slotRefresh = sequenceNew.firstInner; true; slotRefresh = slotRefresh.next) {
-                                slot = slotFromSlotRefresh(slotRefresh);
-                                if (!slot) {
-                                    var slotInsertBefore;
-                                    if (slotPrev) {
-                                        slotInsertBefore = slotPrev.next;
-                                    } else {
-                                        // The first item will be inserted *before* the first old item, so find that now
-                                        var slotRefreshOld;
-                                        for (slotRefreshOld = sequenceNew.firstInner; !slotFromSlotRefresh(slotRefreshOld) ; slotRefreshOld = slotRefreshOld.next) {
-                                            /*@empty*/
-                                        }
-                                        slotInsertBefore = slotFromSlotRefresh(slotRefreshOld);
-                                    }
-
-                                    // Create a new slot for the item
-                                    slot = addNewSlotFromRefresh(slotRefresh, slotInsertBefore, !!slotPrev);
-
-                                    var slotRefreshNext = slotRefreshFromSlot(slotInsertBefore);
-
-                                    if (!slotInsertBefore.mergedForRefresh && (!slotRefreshNext || !slotRefreshNext.locationJustDetermined)) {
-                                        prepareSlotItem(slot);
-
-                                        // Send the notification after the insertion
-                                        sendInsertedNotification(slot);
-                                    }
-                                }
-                                slotPrev = slot;
-
-                                if (slotRefresh === sequenceNew.lastInner) {
-                                    break;
-                                }
-                            }
-                        }
-                    }
-
-                    // Rebuild the indexMap from scratch, so it is possible to detect colliding indices
-                    indexMap = [];
-
-                    // Send indexChanged and changed notifications
-                    var indexFirst = -1;
-                    for (slot = slotsStart, offset = 0; slot !== slotsEnd; offset++) {
-                        var slotNext = slot.next;
-
-                        if (slot.firstInSequence) {
-                            slotFirstInSequence = slot;
-                            offset = 0;
-                        }
-
-                        if (indexFirst === undefined) {
-                            var indexNew = indexForRefresh(slot);
-                            if (indexNew !== undefined) {
-                                indexFirst = indexNew - offset;
-                            }
-                        }
-
-                        // See if the next slot would cause a contradiction, in which case split the sequences
-                        if (indexFirst !== undefined && !slot.lastInSequence) {
-                            var indexNewNext = indexForRefresh(slot.next);
-                            if (indexNewNext !== undefined && indexNewNext !== indexFirst + offset + 1) {
-                                splitSequence(slot);
-
-                                // 'Move' the items in-place individually, so move notifications are sent.  In rare cases, this
-                                // will result in multiple move notifications being sent for a given item, but that's fine.
-                                var first = true;
-                                for (var slotMove = slot.next, lastInSequence = false; !lastInSequence && slotMove !== slotListEnd;) {
-                                    var slotMoveNext = slotMove.next;
-
-                                    lastInSequence = slotMove.lastInSequence;
-
-                                    moveSlot(slotMove, slotMoveNext, !first, false);
-
-                                    first = false;
-                                    slotMove = slotMoveNext;
-                                }
-                            }
-                        }
-
-                        if (slot.lastInSequence) {
-                            index = indexFirst;
-                            for (var slotUpdate = slotFirstInSequence; slotUpdate !== slotNext;) {
-                                var slotUpdateNext = slotUpdate.next;
-
-                                if (index >= refreshCount && slotUpdate !== slotListEnd) {
-                                    deleteSlot(slotUpdate, true);
-                                } else {
-                                    var slotWithIndex = indexMap[index];
-
-                                    if (index !== slotUpdate.index) {
-                                        delete indexMap[index];
-                                        changeSlotIndex(slotUpdate, index);
-                                    } else if (+index === index && indexMap[index] !== slotUpdate) {
-                                        indexMap[index] = slotUpdate;
-                                    }
-
-                                    if (slotUpdate.itemNew) {
-                                        updateSlotItem(slotUpdate);
-                                    }
-
-                                    if (slotWithIndex) {
-                                        // Two slots' indices have collided - merge them
-                                        if (slotUpdate.key) {
-                                            sendMirageNotifications(slotUpdate, slotWithIndex, slotUpdate.bindingMap);
-                                            mergeSlots(slotUpdate, slotWithIndex);
-                                            if (+index === index) {
-                                                indexMap[index] = slotUpdate;
-                                            }
-                                        } else {
-                                            sendMirageNotifications(slotWithIndex, slotUpdate, slotWithIndex.bindingMap);
-                                            mergeSlots(slotWithIndex, slotUpdate);
-                                            if (+index === index) {
-                                                indexMap[index] = slotWithIndex;
-                                            }
-                                        }
-                                    }
-
-                                    if (+index === index) {
-                                        index++;
-                                    }
-                                }
-
-                                slotUpdate = slotUpdateNext;
-                            }
-
-                            indexFirst = undefined;
-                        }
-
-                        slot = slotNext;
-                    }
-
-                    // See if any sequences need to be moved and/or merged
-                    var indexMax = -2,
-                        listEndReached;
-
-                    for (slot = slotsStart, offset = 0; slot !== slotsEnd; offset++) {
-                        var slotNext = slot.next;
-
-                        if (slot.firstInSequence) {
-                            slotFirstInSequence = slot;
-                            offset = 0;
-                        }
-
-                        // Clean up during this pass
-                        delete slot.mergedForRefresh;
-
-                        if (slot.lastInSequence) {
-                            // Move sequence if necessary
-                            if (slotFirstInSequence.index === undefined) {
-                                slotBefore = slotFirstInSequence.prev;
-                                var slotRefreshBefore;
-                                if (slotBefore && (slotRefreshBefore = slotRefreshFromSlot(slotBefore)) && !slotRefreshBefore.lastInSequence &&
-                                        (slotRefresh = slotRefreshFromSlot(slot)) && slotRefresh.prev === slotRefreshBefore) {
-                                    moveSequenceAfter(slotBefore, slotFirstInSequence, slot);
-                                    mergeSequences(slotBefore);
-                                } else if (slot !== slotListEnd && !listEndReached) {
-                                    moveSequenceBefore(slotsEnd, slotFirstInSequence, slot);
-                                }
-                            } else {
-                                if (indexMax < slot.index && !listEndReached) {
-                                    indexMax = slot.index;
-                                } else {
-                                    // Find the correct insertion point
-                                    for (slotAfter = slotsStart.next; slotAfter.index < slot.index; slotAfter = slotAfter.next) {
-                                        /*@empty*/
-                                    }
-
-                                    // Move the items individually, so move notifications are sent
-                                    for (var slotMove = slotFirstInSequence; slotMove !== slotNext;) {
-                                        var slotMoveNext = slotMove.next;
-                                        slotRefresh = slotRefreshFromSlot(slotMove);
-                                        moveSlot(slotMove, slotAfter, slotAfter.prev.index === slotMove.index - 1, slotAfter.index === slotMove.index + 1, slotRefresh && slotRefresh.locationJustDetermined);
-                                        slotMove = slotMoveNext;
-                                    }
-                                }
-
-                                // Store slotBefore here since the sequence might have just been moved
-                                slotBefore = slotFirstInSequence.prev;
-
-                                // See if this sequence should be merged with the previous one
-                                if (slotBefore && slotBefore.index === slotFirstInSequence.index - 1) {
-                                    mergeSequences(slotBefore);
-                                }
-                            }
-                        }
-
-                        if (slot === slotListEnd) {
-                            listEndReached = true;
-                        }
-
-                        slot = slotNext;
-                    }
-
-                    indexUpdateDeferred = false;
-
-                    // Now that all the sequences have been moved, merge any colliding slots
-                    mergeSequencePairs(sequencePairsToMerge);
-
-                    // Send countChanged notification
-                    if (refreshCount !== undefined && refreshCount !== knownCount) {
-                        changeCount(refreshCount);
-                    }
-
-                    finishNotifications();
-
-                    // Before discarding the refresh slot list, see if any fetch requests can be completed by pretending each range
-                    // of refresh slots is an incoming array of results.
-                    var fetchResults = [];
-                    for (i = 0; i < sequenceCountNew; i++) {
-                        sequenceNew = sequencesNew[i];
-
-                        var results = [];
-
-                        slot = null;
-                        offset = 0;
-
-                        var slotOffset;
-
-                        for (slotRefresh = sequenceNew.first; true; slotRefresh = slotRefresh.next, offset++) {
-                            if (slotRefresh === refreshStart) {
-                                results.push(startMarker);
-                            } else if (slotRefresh === refreshEnd) {
-                                results.push(endMarker);
-                            } else {
-                                results.push(slotRefresh.item);
-
-                                if (!slot) {
-                                    slot = slotFromSlotRefresh(slotRefresh);
-                                    slotOffset = offset;
-                                }
-                            }
-
-                            if (slotRefresh.lastInSequence) {
-                                break;
-                            }
-                        }
-
-                        if (slot) {
-                            fetchResults.push({
-                                slot: slot,
-                                results: results,
-                                offset: slotOffset
-                            });
-                        }
-                    }
-
-                    resetRefreshState();
-                    refreshInProgress = false;
-
-                    // Complete any promises for newly obtained items
-                    callFetchCompleteCallbacks();
-
-                    // Now process the 'extra' results from the refresh list
-                    for (i = 0; i < fetchResults.length; i++) {
-                        var fetchResult = fetchResults[i];
-                        processResults(fetchResult.slot, fetchResult.results, fetchResult.offset, knownCount, fetchResult.slot.index);
-                    }
-
-                    if (refreshSignal) {
-                        var signal = refreshSignal;
-
-                        refreshSignal = null;
-
-                        signal.complete();
-                    }
-
-                    // Finally, kick-start fetches for any remaining placeholders
-                    postFetch();
-                }
-
-                // Edit Queue
-
-                // Queues an edit and immediately "optimistically" apply it to the slots list, sending re-entrant notifications
-                function queueEdit(applyEdit, editType, complete, error, keyUpdate, updateSlots, undo) {
-                    var editQueueTail = editQueue.prev,
-                        edit = {
-                            prev: editQueueTail,
-                            next: editQueue,
-                            applyEdit: applyEdit,
-                            editType: editType,
-                            complete: complete,
-                            error: error,
-                            keyUpdate: keyUpdate
-                        };
-                    editQueueTail.next = edit;
-                    editQueue.prev = edit;
-                    editsQueued = true;
-
-                    // If there's a refresh in progress, abandon it, but request that a new one be started once the edits complete
-                    if (refreshRequested || refreshInProgress) {
-                        currentRefreshID++;
-                        refreshInProgress = false;
-                        refreshRequested = true;
-                    }
-
-                    if (editQueue.next === edit) {
-                        // Attempt the edit immediately, in case it completes synchronously
-                        applyNextEdit();
-                    }
-
-                    // If the edit succeeded or is still pending, apply it to the slots (in the latter case, "optimistically")
-                    if (!edit.failed) {
-                        updateSlots();
-
-                        // Supply the undo function now
-                        edit.undo = undo;
-                    }
-
-                    if (!editsInProgress) {
-                        completeEdits();
-                    }
-                }
-
-                function dequeueEdit() {
-                    firstEditInProgress = false;
-
-                    var editNext = editQueue.next.next;
-
-                    editQueue.next = editNext;
-                    editNext.prev = editQueue;
-                }
-
-                // Undo all queued edits, starting with the most recent
-                function discardEditQueue() {
-                    while (editQueue.prev !== editQueue) {
-                        var editLast = editQueue.prev;
-
-                        if (editLast.error) {
-                            editLast.error(new _ErrorFromName(EditError.canceled));
-                        }
-
-                        // Edits that haven't been applied to the slots yet don't need to be undone
-                        if (editLast.undo && !refreshRequested) {
-                            editLast.undo();
-                        }
-
-                        editQueue.prev = editLast.prev;
-                    }
-                    editQueue.next = editQueue;
-
-                    editsInProgress = false;
-
-                    completeEdits();
-                }
-
-                var EditType = {
-                    insert: "insert",
-                    change: "change",
-                    move: "move",
-                    remove: "remove"
-                };
-
-                function attemptEdit(edit) {
-                    if (firstEditInProgress) {
-                        return;
-                    }
-
-                    var reentrant = true;
-
-                    function continueEdits() {
-                        if (!waitForRefresh) {
-                            if (reentrant) {
-                                synchronousEdit = true;
-                            } else {
-                                applyNextEdit();
-                            }
-                        }
-                    }
-
-                    var keyUpdate = edit.keyUpdate;
-
-                    function onEditComplete(item) {
-                        if (item) {
-                            var slot;
-                            if (keyUpdate && keyUpdate.key !== item.key) {
-                                var keyNew = item.key;
-                                if (!edit.undo) {
-                                    // If the edit is in the process of being queued, we can use the correct key when we update the
-                                    // slots, so there's no need for a later update.
-                                    keyUpdate.key = keyNew;
-                                } else {
-                                    slot = keyUpdate.slot;
-                                    if (slot) {
-                                        var keyOld = slot.key;
-                                        if (keyOld) {
-                                            delete keyMap[keyOld];
-                                        }
-                                        setSlotKey(slot, keyNew);
-                                        slot.itemNew = item;
-                                        if (slot.item) {
-                                            changeSlot(slot);
-                                            finishNotifications();
-                                        } else {
-                                            completeFetchPromises(slot);
-                                        }
-                                    }
-                                }
-                            } else if (edit.editType === EditType.change) {
-                                slot.itemNew = item;
-
-                                if (!reentrant) {
-                                    changeSlotIfNecessary(slot);
-                                }
-                            }
-                        }
-
-                        dequeueEdit();
-
-                        if (edit.complete) {
-                            edit.complete(item);
-                        }
-
-                        continueEdits();
-                    }
-
-                    function onEditError(error) {
-                        switch (error.Name) {
-                            case EditError.noResponse:
-                                // Report the failure to the client, but do not dequeue the edit
-                                setStatus(DataSourceStatus.failure);
-                                waitForRefresh = true;
-
-                                firstEditInProgress = false;
-
-                                // Don't report the error, as the edit will be attempted again on the next refresh
-                                return;
-
-                            case EditError.notPermitted:
-                                break;
-
-                            case EditError.noLongerMeaningful:
-                                // Something has changed, so request a refresh
-                                beginRefresh();
-                                break;
-
-                            default:
-                                break;
-                        }
-
-                        // Discard all remaining edits, rather than try to determine which subsequent ones depend on this one
-                        edit.failed = true;
-                        dequeueEdit();
-
-                        discardEditQueue();
-
-                        if (edit.error) {
-                            edit.error(error);
-                        }
-
-                        continueEdits();
-                    }
-
-                    if (listDataAdapter.beginEdits && !beginEditsCalled) {
-                        beginEditsCalled = true;
-                        listDataAdapter.beginEdits();
-                    }
-
-                    // Call the applyEdit function for the given edit, passing in our own wrapper of the error handler that the
-                    // client passed in.
-                    firstEditInProgress = true;
-                    edit.applyEdit().then(onEditComplete, onEditError);
-                    reentrant = false;
-                }
-
-                function applyNextEdit() {
-                    // See if there are any outstanding edits, and try to process as many as possible synchronously
-                    while (editQueue.next !== editQueue) {
-                        synchronousEdit = false;
-                        attemptEdit(editQueue.next);
-                        if (!synchronousEdit) {
-                            return;
-                        }
-                    }
-
-                    // The queue emptied out synchronously (or was empty to begin with)
-                    concludeEdits();
-                }
-
-                function completeEdits() {
-                    updateIndices();
-
-                    finishNotifications();
-
-                    callFetchCompleteCallbacks();
-
-                    if (editQueue.next === editQueue) {
-                        concludeEdits();
-                    }
-                }
-
-                // Once the edit queue has emptied, update state appropriately and resume normal operation
-                function concludeEdits() {
-                    editsQueued = false;
-
-                    if (listDataAdapter.endEdits && beginEditsCalled && !editsInProgress) {
-                        beginEditsCalled = false;
-                        listDataAdapter.endEdits();
-                    }
-
-                    // See if there's a refresh that needs to begin
-                    if (refreshRequested) {
-                        refreshRequested = false;
-                        beginRefresh();
-                    } else {
-                        // Otherwise, see if anything needs to be fetched
-                        postFetch();
-                    }
-                }
-
-                // Editing Operations
-
-                function getSlotForEdit(key) {
-                    validateKey(key);
-
-                    return keyMap[key] || createSlotForKey(key);
-                }
-
-                function insertNewSlot(key, itemNew, slotInsertBefore, mergeWithPrev, mergeWithNext) {
-                    // Create a new slot, but don't worry about its index, as indices will be updated during endEdits
-                    var slot = createPrimarySlot();
-
-                    insertAndMergeSlot(slot, slotInsertBefore, mergeWithPrev, mergeWithNext);
-                    if (key) {
-                        setSlotKey(slot, key);
-                    }
-                    slot.itemNew = itemNew;
-
-                    updateNewIndices(slot, 1);
-
-                    // If this isn't part of a batch of changes, set the slot index now so renderers can see it
-                    if (!editsInProgress && !dataNotificationsInProgress) {
-                        if (!slot.firstInSequence && typeof slot.prev.index === "number") {
-                            setSlotIndex(slot, slot.prev.index + 1, indexMap);
-                        } else if (!slot.lastInSequence && typeof slot.next.index === "number") {
-                            setSlotIndex(slot, slot.next.index - 1, indexMap);
-                        }
-                    }
-
-                    prepareSlotItem(slot);
-
-                    // Send the notification after the insertion
-                    sendInsertedNotification(slot);
-
-                    return slot;
-                }
-
-                function insertItem(key, data, slotInsertBefore, append, applyEdit) {
-                    var keyUpdate = { key: key };
-
-                    return new Promise(function (complete, error) {
-                        queueEdit(
-                            applyEdit, EditType.insert, complete, error, keyUpdate,
-
-                            // updateSlots
-                            function () {
-                                if (slotInsertBefore) {
-                                    var itemNew = {
-                                        key: keyUpdate.key,
-                                        data: data
-                                    };
-
-                                    keyUpdate.slot = insertNewSlot(keyUpdate.key, itemNew, slotInsertBefore, append, !append);
-                                }
-                            },
-
-                            // undo
-                            function () {
-                                var slot = keyUpdate.slot;
-
-                                if (slot) {
-                                    updateNewIndices(slot, -1);
-                                    deleteSlot(slot, false);
-                                }
-                            }
-                        );
-                    });
-                }
-
-                function moveItem(slot, slotMoveBefore, append, applyEdit) {
-                    return new Promise(function (complete, error) {
-                        var mergeAdjacent,
-                            slotNext,
-                            firstInSequence,
-                            lastInSequence;
-
-                        queueEdit(
-                            applyEdit, EditType.move, complete, error,
-
-                            // keyUpdate
-                            null,
-
-                            // updateSlots
-                            function () {
-                                slotNext = slot.next;
-                                firstInSequence = slot.firstInSequence;
-                                lastInSequence = slot.lastInSequence;
-
-                                var slotPrev = slot.prev;
-
-                                mergeAdjacent = (typeof slot.index !== "number" && (firstInSequence || !slotPrev.item) && (lastInSequence || !slotNext.item));
-
-                                updateNewIndices(slot, -1);
-                                moveSlot(slot, slotMoveBefore, append, !append);
-                                updateNewIndices(slot, 1);
-
-                                if (mergeAdjacent) {
-                                    splitSequence(slotPrev);
-
-                                    if (!firstInSequence) {
-                                        mergeSlotsBefore(slotPrev, slot);
-                                    }
-                                    if (!lastInSequence) {
-                                        mergeSlotsAfter(slotNext, slot);
-                                    }
-                                }
-                            },
-
-                            // undo
-                            function () {
-                                if (!mergeAdjacent) {
-                                    updateNewIndices(slot, -1);
-                                    moveSlot(slot, slotNext, !firstInSequence, !lastInSequence);
-                                    updateNewIndices(slot, 1);
-                                } else {
-                                    beginRefresh();
-                                }
-                            }
-                        );
-                    });
-                }
-
-                function ListDataNotificationHandler() {
-                    /// <signature helpKeyword="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler">
-                    /// <summary locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler">
-                    /// An implementation of IListDataNotificationHandler that is passed to the
-                    /// IListDataAdapter.setNotificationHandler method.
-                    /// </summary>
-                    /// </signature>
-
-                    this.invalidateAll = function () {
-                        /// <signature helpKeyword="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.invalidateAll">
-                        /// <summary locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.invalidateAll">
-                        /// Notifies the VirtualizedDataSource that some data has changed, without specifying which data. It might
-                        /// be impractical for some data sources to call this method for any or all changes, so this call is optional.
-                        /// But if a given data adapter never calls it, the application should periodically call
-                        /// invalidateAll on the VirtualizedDataSource to refresh the data.
-                        /// </summary>
-                        /// <returns type="Promise" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.invalidateAll_returnValue">
-                        /// A Promise that completes when the data has been completely refreshed and all change notifications have
-                        /// been sent.
-                        /// </returns>
-                        /// </signature>
-
-                        if (knownCount === 0) {
-                            this.reload();
-                            return Promise.wrap();
-                        }
-
-                        return requestRefresh();
-                    };
-
-                    this.reload = function () {
-                        /// <signature helpKeyword="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.reload">
-                        /// <summary locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.reload">
-                        /// Notifies the list data source that the list data has changed so much that it is better
-                        /// to reload the data from scratch.
-                        /// </summary>
-                        /// </signature>
-
-                        // Cancel all promises
-
-                        if (getCountPromise) {
-                            getCountPromise.cancel();
-                        }
-
-                        if (refreshSignal) {
-                            refreshSignal.cancel();
-                        }
-
-                        for (var slot = slotsStart.next; slot !== slotsEnd; slot = slot.next) {
-                            var fetchListeners = slot.fetchListeners;
-                            for (var listenerID in fetchListeners) {
-                                fetchListeners[listenerID].promise.cancel();
-                            }
-                            var directFetchListeners = slot.directFetchListeners;
-                            for (var listenerID in directFetchListeners) {
-                                directFetchListeners[listenerID].promise.cancel();
-                            }
-                        }
-
-                        resetState();
-
-                        forEachBindingRecord(function (bindingRecord) {
-                            if (bindingRecord.notificationHandler) {
-                                bindingRecord.notificationHandler.reload();
-                            }
-                        });
-                    };
-
-                    this.beginNotifications = function () {
-                        /// <signature helpKeyword="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.beginNotifications">
-                        /// <summary locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.beginNotifications">
-                        /// Indicates the start of a notification batch.
-                        /// Call it before a sequence of other notification calls to minimize the number of countChanged and
-                        /// indexChanged notifications sent to the client of the VirtualizedDataSource. You must pair it with a call
-                        /// to endNotifications, and pairs can't be nested.
-                        /// </summary>
-                        /// </signature>
-
-                        dataNotificationsInProgress = true;
-                    };
-
-                    function completeNotification() {
-                        if (!dataNotificationsInProgress) {
-                            updateIndices();
-                            finishNotifications();
-
-                            callFetchCompleteCallbacks();
-                        }
-                    }
-
-                    this.inserted = function (newItem, previousKey, nextKey, index) {
-                        /// <signature helpKeyword="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted">
-                        /// <summary locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted">
-                        /// Raises a notification that an item was inserted.
-                        /// </summary>
-                        /// <param name="newItem" type="Object" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted_p:newItem">
-                        /// The inserted item. It must have a key and a data property (it must implement the IItem interface).
-                        /// </param>
-                        /// <param name="previousKey" mayBeNull="true" type="String" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted_p:previousKey">
-                        /// The key of the item before the insertion point, or null if the item was inserted at the start of the
-                        /// list.  It can be null if you specified nextKey.
-                        /// </param>
-                        /// <param name="nextKey" mayBeNull="true" type="String" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted_p:nextKey">
-                        /// The key of the item after the insertion point, or null if the item was inserted at the end of the list.
-                        /// It can be null if you specified previousKey.
-                        /// </param>
-                        /// <param name="index" optional="true" type="Number" integer="true" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.inserted_p:index">
-                        /// The index of the inserted item.
-                        /// </param>
-                        /// </signature>
-
-                        if (editsQueued) {
-                            // We can't change the slots out from under any queued edits
-                            beginRefresh();
-                        } else {
-                            var key = newItem.key,
-                                slotPrev = keyMap[previousKey],
-                                slotNext = keyMap[nextKey];
-
-                            var havePreviousKey = typeof previousKey === "string",
-                                haveNextKey = typeof nextKey === "string";
-
-                            // Only one of previousKey, nextKey needs to be passed in
-                            //
-                            if (havePreviousKey) {
-                                if (slotNext && !slotNext.firstInSequence) {
-                                    slotPrev = slotNext.prev;
-                                }
-                            } else if (haveNextKey) {
-                                if (slotPrev && !slotPrev.lastInSequence) {
-                                    slotNext = slotPrev.next;
-                                }
-                            }
-
-                            // If the VDS believes the list is empty but the data adapter believes the item has
-                            // a adjacent item start a refresh.
-                            //
-                            if ((havePreviousKey || haveNextKey) && !(slotPrev || slotNext) && (slotsStart.next === slotListEnd)) {
-                                beginRefresh();
-                                return;
-                            }
-
-                            // If this key is known, something has changed, start a refresh.
-                            //
-                            if (keyMap[key]) {
-                                beginRefresh();
-                                return;
-                            }
-
-                            // If the slots aren't adjacent or are thought to be distinct sequences by the
-                            //  VDS something has changed so start a refresh.
-                            //
-                            if (slotPrev && slotNext) {
-                                if (slotPrev.next !== slotNext || slotPrev.lastInSequence || slotNext.firstInSequence) {
-                                    beginRefresh();
-                                    return;
-                                }
-                            }
-
-                            // If one of the adjacent keys or indicies has only just been requested - rare,
-                            //  and easier to deal with in a refresh.
-                            //
-                            if ((slotPrev && (slotPrev.keyRequested || slotPrev.indexRequested)) ||
-                                (slotNext && (slotNext.keyRequested || slotNext.indexRequested))) {
-                                beginRefresh();
-                                return;
-                            }
-
-                            if (slotPrev || slotNext) {
-                                insertNewSlot(key, newItem, (slotNext ? slotNext : slotPrev.next), !!slotPrev, !!slotNext);
-                            } else if (slotsStart.next === slotListEnd) {
-                                insertNewSlot(key, newItem, slotsStart.next, true, true);
-                            } else if (index !== undefined) {
-                                updateNewIndicesFromIndex(index, 1);
-                            } else {
-                                // We could not find a previous or next slot and an index was not provided, start a refresh
-                                //
-                                beginRefresh();
-                                return;
-                            }
-
-                            completeNotification();
-                        }
-                    };
-
-                    this.changed = function (item) {
-                        /// <signature helpKeyword="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.changed">
-                        /// <summary locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.changed">
-                        /// Raises a notification that an item changed.
-                        /// </summary>
-                        /// <param name="item" type="Object" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.changed_p:item">
-                        /// An IItem that represents the item that changed.
-                        /// </param>
-                        /// </signature>
-
-                        if (editsQueued) {
-                            // We can't change the slots out from under any queued edits
-                            beginRefresh();
-                        } else {
-                            var key = item.key,
-                                slot = keyMap[key];
-
-                            if (slot) {
-                                if (slot.keyRequested) {
-                                    // The key has only just been requested - rare, and easier to deal with in a refresh
-                                    beginRefresh();
-                                } else {
-                                    slot.itemNew = item;
-
-                                    if (slot.item) {
-                                        changeSlot(slot);
-
-                                        completeNotification();
-                                    }
-                                }
-                            }
-                        }
-                    };
-
-                    this.moved = function (item, previousKey, nextKey, oldIndex, newIndex) {
-                        /// <signature helpKeyword="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved">
-                        /// <summary locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved">
-                        /// Raises a notfication that an item was moved.
-                        /// </summary>
-                        /// <param name="item" type="Object" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved_p:item">
-                        /// The item that was moved.
-                        /// </param>
-                        /// <param name="previousKey" mayBeNull="true" type="String" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved_p:previousKey">
-                        /// The key of the item before the insertion point, or null if the item was moved to the beginning of the list.
-                        /// It can be null if you specified nextKey.
-                        /// </param>
-                        /// <param name="nextKey" mayBeNull="true" type="String" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved_p:nextKey">
-                        /// The key of the item after the insertion point, or null if the item was moved to the end of the list.
-                        /// It can be null if you specified previousKey.
-                        /// </param>
-                        /// <param name="oldIndex" optional="true" type="Number" integer="true" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved_p:oldIndex">
-                        /// The index of the item before it was moved.
-                        /// </param>
-                        /// <param name="newIndex" optional="true" type="Number" integer="true" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.moved_p:newIndex">
-                        /// The index of the item after it was moved.
-                        /// </param>
-                        /// </signature>
-
-                        if (editsQueued) {
-                            // We can't change the slots out from under any queued edits
-                            beginRefresh();
-                        } else {
-                            var key = item.key,
-                                slot = keyMap[key],
-                                slotPrev = keyMap[previousKey],
-                                slotNext = keyMap[nextKey];
-
-                            if ((slot && slot.keyRequested) || (slotPrev && slotPrev.keyRequested) || (slotNext && slotNext.keyRequested)) {
-                                // One of the keys has only just been requested - rare, and easier to deal with in a refresh
-                                beginRefresh();
-                            } else if (slot) {
-                                if (slotPrev && slotNext && (slotPrev.next !== slotNext || slotPrev.lastInSequence || slotNext.firstInSequence)) {
-                                    // Something has changed, start a refresh
-                                    beginRefresh();
-                                } else if (!slotPrev && !slotNext) {
-                                    // If we can't tell where the item moved to, treat this like a removal
-                                    updateNewIndices(slot, -1);
-                                    deleteSlot(slot, false);
-
-                                    if (oldIndex !== undefined) {
-                                        if (oldIndex < newIndex) {
-                                            newIndex--;
-                                        }
-
-                                        updateNewIndicesFromIndex(newIndex, 1);
-                                    }
-
-                                    completeNotification();
-                                } else {
-                                    updateNewIndices(slot, -1);
-                                    moveSlot(slot, (slotNext ? slotNext : slotPrev.next), !!slotPrev, !!slotNext);
-                                    updateNewIndices(slot, 1);
-
-                                    completeNotification();
-                                }
-                            } else if (slotPrev || slotNext) {
-                                // If previousKey or nextKey is known, but key isn't, treat this like an insertion.
-
-                                if (oldIndex !== undefined) {
-                                    updateNewIndicesFromIndex(oldIndex, -1);
-
-                                    if (oldIndex < newIndex) {
-                                        newIndex--;
-                                    }
-                                }
-
-                                this.inserted(item, previousKey, nextKey, newIndex);
-                            } else if (oldIndex !== undefined) {
-                                updateNewIndicesFromIndex(oldIndex, -1);
-
-                                if (oldIndex < newIndex) {
-                                    newIndex--;
-                                }
-
-                                updateNewIndicesFromIndex(newIndex, 1);
-
-                                completeNotification();
-                            }
-                        }
-                    };
-
-                    this.removed = function (key, index) {
-                        /// <signature helpKeyword="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.removed">
-                        /// <summary locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.removed">
-                        /// Raises a notification that an item was removed.
-                        /// </summary>
-                        /// <param name="key" mayBeNull="true" type="String" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.removed_p:key">
-                        /// The key of the item that was removed.
-                        /// </param>
-                        /// <param name="index" optional="true" type="Number" integer="true" locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.removed_p:index">
-                        /// The index of the item that was removed.
-                        /// </param>
-                        /// </signature>
-
-                        if (editsQueued) {
-                            // We can't change the slots out from under any queued edits
-                            beginRefresh();
-                        } else {
-                            var slot;
-
-                            if (typeof key === "string") {
-                                slot = keyMap[key];
-                            } else {
-                                slot = indexMap[index];
-                            }
-
-                            if (slot) {
-                                if (slot.keyRequested) {
-                                    // The key has only just been requested - rare, and easier to deal with in a refresh
-                                    beginRefresh();
-                                } else {
-                                    updateNewIndices(slot, -1);
-                                    deleteSlot(slot, false);
-
-                                    completeNotification();
-                                }
-                            } else if (index !== undefined) {
-                                updateNewIndicesFromIndex(index, -1);
-                                completeNotification();
-                            }
-                        }
-                    };
-
-                    this.endNotifications = function () {
-                        /// <signature helpKeyword="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.endNotifications">
-                        /// <summary locid="WinJS.UI.VirtualizedDataSource.ListDataNotificationHandler.endNotifications">
-                        /// Concludes a sequence of notifications that began with a call to beginNotifications.
-                        /// </summary>
-                        /// </signature>
-
-                        dataNotificationsInProgress = false;
-                        completeNotification();
-                    };
-
-                } // ListDataNotificationHandler
-
-                function resetState() {
-                    setStatus(DataSourceStatus.ready);
-
-                    // Track count promises
-                    getCountPromise = null;
-
-                    // Track whether listDataAdapter.endEdits needs to be called
-                    beginEditsCalled = false;
-
-                    // Track whether finishNotifications should be called after each edit
-                    editsInProgress = false;
-
-                    // Track whether the first queued edit should be attempted
-                    firstEditInProgress = false;
-
-                    // Queue of edis that have yet to be completed
-                    editQueue = {};
-                    editQueue.next = editQueue;
-                    editQueue.prev = editQueue;
-
-                    // Track whether there are currently edits queued
-                    editsQueued = false;
-
-                    // If an edit has returned noResponse, the edit queue will be reapplied when the next refresh is requested
-                    waitForRefresh = false;
-
-                    // Change to count while multiple edits are taking place
-                    countDelta = 0;
-
-                    // True while the indices are temporarily in a bad state due to multiple edits
-                    indexUpdateDeferred = false;
-
-                    // Next temporary key to use
-                    nextTempKey = 0;
-
-                    // Set of fetches for which results have not yet arrived
-                    fetchesInProgress = {};
-
-                    // Queue of complete callbacks for fetches
-                    fetchCompleteCallbacks = [];
-
-                    // Tracks the count returned explicitly or implicitly by the data adapter
-                    knownCount = CountResult.unknown;
-
-                    // Sentinel objects for list of slots
-                    // Give the start sentinel an index so we can always use predecessor + 1.
-                    slotsStart = {
-                        firstInSequence: true,
-                        lastInSequence: true,
-                        index: -1
-                    };
-                    slotListEnd = {
-                        firstInSequence: true,
-                        lastInSequence: true
-                    };
-                    slotsEnd = {
-                        firstInSequence: true,
-                        lastInSequence: true
-                    };
-                    slotsStart.next = slotListEnd;
-                    slotListEnd.prev = slotsStart;
-                    slotListEnd.next = slotsEnd;
-                    slotsEnd.prev = slotListEnd;
-
-                    // Map of request IDs to slots
-                    handleMap = {};
-
-                    // Map of keys to slots
-                    keyMap = {};
-
-                    // Map of indices to slots
-                    indexMap = {};
-                    indexMap[-1] = slotsStart;
-
-                    // Count of slots that have been released but not deleted
-                    releasedSlots = 0;
-
-                    lastSlotReleased = null;
-
-                    // At most one call to reduce the number of refresh slots should be posted at any given time
-                    reduceReleasedSlotCountPosted = false;
-
-                    // Multiple refresh requests are coalesced
-                    refreshRequested = false;
-
-                    // Requests do not cause fetches while a refresh is in progress
-                    refreshInProgress = false;
-
-                    // Refresh requests yield the same promise until a refresh completes
-                    refreshSignal = null;
-                }
-
-                // Construction
-
-                // Process creation parameters
-                if (!listDataAdapter) {
-                    throw new _ErrorFromName("WinJS.UI.ListDataSource.ListDataAdapterIsInvalid", strings.listDataAdapterIsInvalid);
-                }
-
-                // Minimum number of released slots to retain
-                cacheSize = (listDataAdapter.compareByIdentity ? 0 : 200);
-
-                if (options) {
-                    if (typeof options.cacheSize === "number") {
-                        cacheSize = options.cacheSize;
-                    }
-                }
-
-                // Cached listDataNotificationHandler initially undefined
-                if (listDataAdapter.setNotificationHandler) {
-                    listDataNotificationHandler = new ListDataNotificationHandler();
-
-                    listDataAdapter.setNotificationHandler(listDataNotificationHandler);
-                }
-
-                // Current status
-                status = DataSourceStatus.ready;
-
-                // Track whether a change to the status has been posted already
-                statusChangePosted = false;
-
-                // Map of bindingIDs to binding records
-                bindingMap = {};
-
-                // ID to assign to the next ListBinding, incremented each time one is created
-                nextListBindingID = 0;
-
-                // ID assigned to a slot, incremented each time one is created - start with 1 so "if (handle)" tests are valid
-                nextHandle = 1;
-
-                // ID assigned to a fetch listener, incremented each time one is created
-                nextListenerID = 0;
-
-                // ID of the refresh in progress, incremented each time a new refresh is started
-                currentRefreshID = 0;
-
-                // Track whether fetchItemsForAllSlots has been posted already
-                fetchesPosted = false;
-
-                // ID of a fetch, incremented each time a new fetch is initiated - start with 1 so "if (fetchID)" tests are valid
-                nextFetchID = 1;
-
-                // Sentinel objects for results arrays
-                startMarker = {};
-                endMarker = {};
-
-                resetState();
-
-                // Public methods
-
-                this.createListBinding = function (notificationHandler) {
-                    /// <signature helpKeyword="WinJS.UI.IListDataSource.createListBinding">
-                    /// <summary locid="WinJS.UI.IListDataSource.createListBinding">
-                    /// Creates an IListBinding object that allows a client to read from the list and receive notifications for
-                    /// changes that affect those portions of the list that the client already read.
-                    /// </summary>
-                    /// <param name="notificationHandler" optional="true" locid="WinJS.UI.IListDataSource.createListBinding_p:notificationHandler">
-                    /// An object that implements the IListNotificationHandler interface.  If you omit this parameter,
-                    /// change notifications won't be available.
-                    /// </param>
-                    /// <returns type="IListBinding" locid="WinJS.UI.IListDataSource.createListBinding_returnValue">
-                    /// An object that implements the IListBinding interface.
-                    /// </returns>
-                    /// </signature>
-
-                    var listBindingID = (nextListBindingID++).toString(),
-                        slotCurrent = null,
-                        released = false;
-
-                    function retainSlotForCursor(slot) {
-                        if (slot) {
-                            slot.cursorCount++;
-                        }
-                    }
-
-                    function releaseSlotForCursor(slot) {
-                        if (slot) {
-                            if (--slot.cursorCount === 0) {
-                                releaseSlotIfUnrequested(slot);
-                            }
-                        }
-                    }
-
-                    function moveCursor(slot) {
-                        // Retain the new slot first just in case it's the same slot
-                        retainSlotForCursor(slot);
-                        releaseSlotForCursor(slotCurrent);
-                        slotCurrent = slot;
-                    }
-
-                    function adjustCurrentSlot(slot, slotNew) {
-                        if (slot === slotCurrent) {
-                            if (!slotNew) {
-                                slotNew = (
-                                    !slotCurrent || slotCurrent.lastInSequence || slotCurrent.next === slotListEnd ?
-                                        null :
-                                        slotCurrent.next
-                                );
-                            }
-                            moveCursor(slotNew);
-                        }
-                    }
-
-                    function releaseSlotFromListBinding(slot) {
-                        var bindingMap = slot.bindingMap,
-                            bindingHandle = bindingMap[listBindingID].handle;
-
-                        delete slot.bindingMap[listBindingID];
-
-                        // See if there are any listBindings left in the map
-                        var releaseBindingMap = true,
-                            releaseHandle = true;
-                        for (var listBindingID2 in bindingMap) {
-                            releaseBindingMap = false;
-                            if (bindingHandle && bindingMap[listBindingID2].handle === bindingHandle) {
-                                releaseHandle = false;
-                                break;
-                            }
-                        }
-
-                        if (bindingHandle && releaseHandle) {
-                            delete handleMap[bindingHandle];
-                        }
-                        if (releaseBindingMap) {
-                            slot.bindingMap = null;
-                            releaseSlotIfUnrequested(slot);
-                        }
-                    }
-
-                    function retainItem(slot, listenerID) {
-                        if (!slot.bindingMap) {
-                            slot.bindingMap = {};
-                        }
-
-                        var slotBinding = slot.bindingMap[listBindingID];
-                        if (slotBinding) {
-                            slotBinding.count++;
-                        } else {
-                            slot.bindingMap[listBindingID] = {
-                                bindingRecord: bindingMap[listBindingID],
-                                count: 1
-                            };
-                        }
-
-                        if (slot.fetchListeners) {
-                            var listener = slot.fetchListeners[listenerID];
-                            if (listener) {
-                                listener.retained = true;
-                            }
-                        }
-                    }
-
-                    function releaseItem(handle) {
-                        var slot = handleMap[handle];
-
-                        if (slot) {
-                            var slotBinding = slot.bindingMap[listBindingID];
-                            if (--slotBinding.count === 0) {
-                                var fetchListeners = slot.fetchListeners;
-                                for (var listenerID in fetchListeners) {
-                                    var listener = fetchListeners[listenerID];
-                                    if (listener.listBindingID === listBindingID) {
-                                        listener.retained = false;
-                                    }
-                                }
-
-                                releaseSlotFromListBinding(slot);
-                            }
-                        }
-                    }
-
-                    function itemPromiseFromKnownSlot(slot) {
-                        var handle = handleForBinding(slot, listBindingID),
-                            listenerID = (nextListenerID++).toString();
-
-                        var itemPromise = createFetchPromise(slot, "fetchListeners", listenerID, listBindingID,
-                            function (complete, item) {
-                                complete(itemForBinding(item, handle));
-                            }
-                        );
-
-                        defineCommonItemProperties(itemPromise, slot, handle);
-
-                        // Only implement retain and release methods if a notification handler has been supplied
-                        if (notificationHandler) {
-                            itemPromise.retain = function () {
-                                listBinding._retainItem(slot, listenerID);
-                                return itemPromise;
-                            };
-
-                            itemPromise.release = function () {
-                                listBinding._releaseItem(handle);
-                            };
-                        }
-
-                        return itemPromise;
-                    }
-
-                    bindingMap[listBindingID] = {
-                        notificationHandler: notificationHandler,
-                        notificationsSent: false,
-                        adjustCurrentSlot: adjustCurrentSlot,
-                        itemPromiseFromKnownSlot: itemPromiseFromKnownSlot,
-                    };
-
-                    function itemPromiseFromSlot(slot) {
-                        var itemPromise;
-
-                        if (!released && slot) {
-                            itemPromise = itemPromiseFromKnownSlot(slot);
-                        } else {
-                            // Return a complete promise for a non-existent slot
-                            if (released) {
-                                itemPromise = new Promise(function () { });
-                                itemPromise.cancel();
-                            } else {
-                                itemPromise = Promise.wrap(null);
-                            }
-                            defineHandleProperty(itemPromise, null);
-                            // Only implement retain and release methods if a notification handler has been supplied
-                            if (notificationHandler) {
-                                itemPromise.retain = function () { return itemPromise; };
-                                itemPromise.release = function () { };
-                            }
-                        }
-
-                        moveCursor(slot);
-
-                        return itemPromise;
-                    }
-
-                    /// <signature helpKeyword="WinJS.UI.IListBinding">
-                    /// <summary locid="WinJS.UI.IListBinding">
-                    /// An interface that enables a client to read from the list and receive notifications for changes that affect
-                    /// those portions of the list that the client already read.  IListBinding can also enumerate through lists
-                    /// that can change at any time.
-                    /// </summary>
-                    /// </signature>
-                    var listBinding = {
-                        _retainItem: function (slot, listenerID) {
-                            retainItem(slot, listenerID);
-                        },
-
-                        _releaseItem: function (handle) {
-                            releaseItem(handle);
-                        },
-
-                        jumpToItem: function (item) {
-                            /// <signature helpKeyword="WinJS.UI.IListBinding.jumpToItem">
-                            /// <summary locid="WinJS.UI.IListBinding.jumpToItem">
-                            /// Makes the specified item the current item.
-                            /// </summary>
-                            /// <param name="item" type="Object" locid="WinJS.UI.IListBinding.jumpToItem_p:item">
-                            /// The IItem or IItemPromise to make the current item.
-                            /// </param>
-                            /// <returns type="IItemPromise" locid="WinJS.UI.IListBinding.jumpToItem_returnValue">
-                            /// An object that implements the IItemPromise interface and serves as a promise for the specified item.  If
-                            /// the specified item is not in the list, the promise completes with a value of null.
-                            /// </returns>
-                            /// </signature>
-
-                            return itemPromiseFromSlot(item ? handleMap[item.handle] : null);
-                        },
-
-                        current: function () {
-                            /// <signature helpKeyword="WinJS.UI.IListBinding.current">
-                            /// <summary locid="WinJS.UI.IListBinding.current">
-                            /// Retrieves the current item.
-                            /// </summary>
-                            /// <returns type="IItemPromise" locid="WinJS.UI.IListBinding.current_returnValue">
-                            /// An object that implements the IItemPromise interface and serves as a promise for the current item.
-                            /// If the cursor has moved past the start or end of the list, the promise completes with a value
-                            /// of null.  If the current item has been deleted or moved, the promise returns an error.
-                            /// </returns>
-                            /// </signature>
-
-                            return itemPromiseFromSlot(slotCurrent);
-                        },
-
-                        previous: function () {
-                            /// <signature helpKeyword="WinJS.UI.IListBinding.previous">
-                            /// <summary locid="WinJS.UI.IListBinding.previous">
-                            /// Retrieves the item before the current item and makes it the current item.
-                            /// </summary>
-                            /// <returns type="IItemPromise" locid="WinJS.UI.IListBinding.previous_returnValue">
-                            /// An object that implements the IItemPromise interface and serves as a promise for the previous item.
-                            /// If the cursor moves past the start of the list, the promise completes with a value of null.
-                            /// </returns>
-                            /// </signature>
-
-                            return itemPromiseFromSlot(slotCurrent ? requestSlotBefore(slotCurrent) : null);
-                        },
-
-                        next: function () {
-                            /// <signature helpKeyword="WinJS.UI.IListBinding.next">
-                            /// <summary locid="WinJS.UI.IListBinding.next">
-                            /// Retrieves the item after the current item and makes it the current item.
-                            /// </summary>
-                            /// <returns type="IItemPromise" locid="WinJS.UI.IListBinding.next_returnValue">
-                            /// An object that implements the IItemPromise interface and serves as a promise for the next item.  If
-                            /// the cursor moves past the end of the list, the promise completes with a value of null.
-                            /// </returns>
-                            /// </signature>
-
-                            return itemPromiseFromSlot(slotCurrent ? requestSlotAfter(slotCurrent) : null);
-                        },
-
-                        releaseItem: function (item) {
-                            /// <signature helpKeyword="WinJS.UI.IListBinding.releaseItem">
-                            /// <summary locid="WinJS.UI.IListBinding.releaseItem">
-                            /// Creates a request to stop change notfications for the specified item. The item is released only when the
-                            /// number of release calls matches the number of IItemPromise.retain calls. The number of release calls cannot
-                            /// exceed the number of retain calls. This method is present only if you passed an IListNotificationHandler
-                            /// to IListDataSource.createListBinding when it created this IListBinding.
-                            /// </summary>
-                            /// <param name="item" type="Object" locid="WinJS.UI.IListBinding.releaseItem_p:item">
-                            /// The IItem or IItemPromise to release.
-                            /// </param>
-                            /// </signature>
-
-                            this._releaseItem(item.handle);
-                        },
-
-                        release: function () {
-                            /// <signature helpKeyword="WinJS.UI.IListBinding.release">
-                            /// <summary locid="WinJS.UI.IListBinding.release">
-                            /// Releases resources, stops notifications, and cancels outstanding promises
-                            /// for all tracked items that this IListBinding returned.
-                            /// </summary>
-                            /// </signature>
-
-                            released = true;
-
-                            releaseSlotForCursor(slotCurrent);
-                            slotCurrent = null;
-
-                            for (var slot = slotsStart.next; slot !== slotsEnd;) {
-                                var slotNext = slot.next;
-
-                                var fetchListeners = slot.fetchListeners;
-                                for (var listenerID in fetchListeners) {
-                                    var listener = fetchListeners[listenerID];
-                                    if (listener.listBindingID === listBindingID) {
-                                        listener.promise.cancel();
-                                        delete fetchListeners[listenerID];
-                                    }
-                                }
-
-                                if (slot.bindingMap && slot.bindingMap[listBindingID]) {
-                                    releaseSlotFromListBinding(slot);
-                                }
-
-                                slot = slotNext;
-                            }
-
-                            delete bindingMap[listBindingID];
-                        }
-                    };
-
-                    // Only implement each navigation method if the data adapter implements certain methods
-
-                    if (itemsFromStart || itemsFromIndex) {
-                        listBinding.first = function () {
-                            /// <signature helpKeyword="WinJS.UI.IListBinding.first">
-                            /// <summary locid="WinJS.UI.IListBinding.first">
-                            /// Retrieves the first item in the list and makes it the current item.
-                            /// </summary>
-                            /// <returns type="IItemPromise" locid="WinJS.UI.IListBinding.first_returnValue">
-                            /// An IItemPromise that serves as a promise for the requested item.
-                            /// If the list is empty, the Promise completes with a value of null.
-                            /// </returns>
-                            /// </signature>
-
-                            return itemPromiseFromSlot(requestSlotAfter(slotsStart));
-                        };
-                    }
-
-                    if (itemsFromEnd) {
-                        listBinding.last = function () {
-                            /// <signature helpKeyword="WinJS.UI.IListBinding.last">
-                            /// <summary locid="WinJS.UI.IListBinding.last">
-                            /// Retrieves the last item in the list and makes it the current item.
-                            /// </summary>
-                            /// <returns type="IItemPromise" locid="WinJS.UI.IListBinding.last_returnValue">
-                            /// An IItemPromise that serves as a promise for the requested item.
-                            /// If the list is empty, the Promise completes with a value of null.
-                            /// </returns>
-                            /// </signature>
-
-                            return itemPromiseFromSlot(requestSlotBefore(slotListEnd));
-                        };
-                    }
-
-                    if (itemsFromKey) {
-                        listBinding.fromKey = function (key, hints) {
-                            /// <signature helpKeyword="WinJS.UI.IListBinding.fromKey">
-                            /// <summary locid="WinJS.UI.IListBinding.fromKey">
-                            /// Retrieves the item with the specified key and makes it the current item.
-                            /// </summary>
-                            /// <param name="key" type="String" locid="WinJS.UI.IListBinding.fromKey_p:key">
-                            /// The key of the requested item. It must be a non-empty string.
-                            /// </param>
-                            /// <param name="hints" locid="WinJS.UI.IListBinding.fromKey_p:hints">
-                            /// Domain-specific hints to the IListDataAdapter
-                            /// about the location of the item to improve retrieval time.
-                            /// </param>
-                            /// <returns type="IItemPromise" locid="WinJS.UI.IListBinding.fromKey_returnValue">
-                            /// An IItemPromise that serves as a promise for the requested item.
-                            /// If the list doesn't contain an item with the specified key, the Promise completes with a value of null.
-                            /// </returns>
-                            /// </signature>
-
-                            return itemPromiseFromSlot(slotFromKey(key, hints));
-                        };
-                    }
-
-                    if (itemsFromIndex || (itemsFromStart && itemsFromKey)) {
-                        listBinding.fromIndex = function (index) {
-                            /// <signature helpKeyword="WinJS.UI.IListBinding.fromIndex">
-                            /// <summary locid="WinJS.UI.IListBinding.fromIndex">
-                            /// Retrieves the item with the specified index and makes it the current item.
-                            /// </summary>
-                            /// <param name="index" type="Nunmber" integer="true" locid="WinJS.UI.IListBinding.fromIndex_p:index">
-                            /// A value greater than or equal to 0 that is the index of the item to retrieve.
-                            /// </param>
-                            /// <returns type="IItemPromise" locid="WinJS.UI.IListBinding.fromIndex_returnValue">
-                            /// An IItemPromise that serves as a promise for the requested item.
-                            /// If the list doesn't contain an item with the specified index, the IItemPromise completes with a value of null.
-                            /// </returns>
-                            /// </signature>
-
-                            return itemPromiseFromSlot(slotFromIndex(index));
-                        };
-                    }
-
-                    if (itemsFromDescription) {
-                        listBinding.fromDescription = function (description) {
-                            /// <signature helpKeyword="WinJS.UI.IListBinding.fromDescription">
-                            /// <summary locid="WinJS.UI.IListBinding.fromDescription">
-                            /// Retrieves the item with the specified description and makes it the current item.
-                            /// </summary>
-                            /// <param name="description" locid="WinJS.UI.IListDataSource.fromDescription_p:description">
-                            /// The domain-specific description of the requested item, to be interpreted by the list data adapter.
-                            /// </param>
-                            /// <returns type="Promise" locid="WinJS.UI.IListDataSource.fromDescription_returnValue">
-                            /// A Promise for the requested item. If the list doesn't contain an item with the specified description,
-                            /// the IItemPromise completes with a value of null.
-                            /// </returns>
-                            /// </signature>
-
-                            return itemPromiseFromSlot(slotFromDescription(description));
-                        };
-                    }
-
-                    return listBinding;
-                };
-
-                this.invalidateAll = function () {
-                    /// <signature helpKeyword="WinJS.UI.IListDataSource.invalidateAll">
-                    /// <summary locid="WinJS.UI.IListDataSource.invalidateAll">
-                    /// Makes the data source refresh its cached items by re-requesting them from the data adapter.
-                    /// The data source generates notifications if the data has changed.
-                    /// </summary>
-                    /// <returns type="Promise" locid="WinJS.UI.IListDataSource.invalidateAll_returnValue">
-                    /// A Promise that completes when the data has been completely refreshed and all change notifications have been
-                    /// sent.
-                    /// </returns>
-                    /// </signature>
-
-                    return requestRefresh();
-                };
-
-                // Create a helper which issues new promises for the result of the input promise
-                //  but have their cancelations ref-counted so that any given consumer canceling
-                //  their promise doesn't result in the incoming promise being canceled unless
-                //  all consumers are no longer interested in the result.
-                //
-                var countedCancelation = function (incomingPromise, dataSource) {
-                    var signal = new _Signal();
-                    incomingPromise.then(
-                        function (v) { signal.complete(v); },
-                        function (e) { signal.error(e); }
-                    );
-                    var resultPromise = signal.promise.then(null, function (e) {
-                        if (e.name === "WinJS.UI.VirtualizedDataSource.resetCount") {
-                            getCountPromise = null;
-                            return incomingPromise = dataSource.getCount();
-                        }
-                        return Promise.wrapError(e);
-                    });
-                    var count = 0;
-                    var currentGetCountPromise = {
-                        get: function () {
-                            count++;
-                            return new Promise(
-                                function (c, e) { resultPromise.then(c, e); },
-                                function () {
-                                    if (--count === 0) {
-                                        // when the count reaches zero cancel the incoming promise
-                                        signal.promise.cancel();
-                                        incomingPromise.cancel();
-                                        if (currentGetCountPromise === getCountPromise) {
-                                            getCountPromise = null;
-                                        }
-                                    }
-                                }
-                            );
-                        },
-                        reset: function () {
-                            signal.error(new _ErrorFromName("WinJS.UI.VirtualizedDataSource.resetCount"));
-                        },
-                        cancel: function () {
-                            // if explicitly asked to cancel the incoming promise
-                            signal.promise.cancel();
-                            incomingPromise.cancel();
-                            if (currentGetCountPromise === getCountPromise) {
-                                getCountPromise = null;
-                            }
-                        }
-                    };
-                    return currentGetCountPromise;
-                };
-
-                this.getCount = function () {
-                    /// <signature helpKeyword="WinJS.UI.IListDataSource.getCount">
-                    /// <summary locid="WinJS.UI.IListDataSource.getCount">
-                    /// Retrieves the number of items in the data source.
-                    /// </summary>
-                    /// </signature>
-
-                    if (listDataAdapter.getCount) {
-                        // Always do a fetch, even if there is a cached result
-                        //
-                        var that = this;
-                        return Promise.wrap().then(function () {
-                            if (editsInProgress || editsQueued) {
-                                return knownCount;
-                            }
-
-                            var requestPromise;
-
-                            if (!getCountPromise) {
-
-                                var relatedGetCountPromise;
-
-                                // Make a request for the count
-                                //
-                                requestPromise = listDataAdapter.getCount();
-                                var synchronous;
-                                requestPromise.then(
-                                    function () {
-                                        if (getCountPromise === relatedGetCountPromise) {
-                                            getCountPromise = null;
-                                        }
-                                        synchronous = true;
-                                    },
-                                    function () {
-                                        if (getCountPromise === relatedGetCountPromise) {
-                                            getCountPromise = null;
-                                        }
-                                        synchronous = true;
-                                    }
-                                );
-
-                                // Every time we make a new request for the count we can consider the
-                                //  countDelta to be invalidated
-                                //
-                                countDelta = 0;
-
-                                // Wrap the result in a cancelation counter which will block cancelation
-                                //  of the outstanding promise unless all consumers cancel.
-                                //
-                                if (!synchronous) {
-                                    relatedGetCountPromise = getCountPromise = countedCancelation(requestPromise, that);
-                                }
-                            }
-
-                            return getCountPromise ? getCountPromise.get() : requestPromise;
-
-                        }).then(function (count) {
-                            if (!isNonNegativeInteger(count) && count !== undefined) {
-                                throw new _ErrorFromName("WinJS.UI.ListDataSource.InvalidRequestedCountReturned", strings.invalidRequestedCountReturned);
-                            }
-
-                            if (count !== knownCount) {
-                                if (knownCount === CountResult.unknown) {
-                                    knownCount = count;
-                                } else {
-                                    changeCount(count);
-                                    finishNotifications();
-                                }
-                            }
-
-                            if (count === 0) {
-                                if (slotsStart.next !== slotListEnd || slotListEnd.next !== slotsEnd) {
-                                    // A contradiction has been found
-                                    beginRefresh();
-                                } else if (slotsStart.lastInSequence) {
-                                    // Now we know the list is empty
-                                    mergeSequences(slotsStart);
-                                    slotListEnd.index = 0;
-                                }
-                            }
-
-                            return count;
-                        }).then(null, function (error) {
-                            if (error.name === _UI.CountError.noResponse) {
-                                // Report the failure, but still report last known count
-                                setStatus(DataSourceStatus.failure);
-                                return knownCount;
-                            }
-                            return Promise.wrapError(error);
-                        });
-                    } else {
-                        // If the data adapter doesn't support the count method, return the VirtualizedDataSource's
-                        //  reckoning of the count.
-                        return Promise.wrap(knownCount);
-                    }
-                };
-
-                if (itemsFromKey) {
-                    this.itemFromKey = function (key, hints) {
-                        /// <signature helpKeyword="WinJS.UI.IListDataSource.itemFromKey">
-                        /// <summary locid="WinJS.UI.IListDataSource.itemFromKey">
-                        /// Retrieves the item with the specified key.
-                        /// </summary>
-                        /// <param name="key" type="String" locid="WinJS.UI.IListDataSource.itemFromKey_p:key">
-                        /// The key of the requested item. It must be a non-empty string.
-                        /// </param>
-                        /// <param name="hints" locid="WinJS.UI.IListDataSource.itemFromKey_p:hints">
-                        /// Domain-specific hints to IListDataAdapter about the location of the item
-                        /// to improve the retrieval time.
-                        /// </param>
-                        /// <returns type="Promise" locid="WinJS.UI.IListDataSource.itemFromKey_returnValue">
-                        /// A Promise for the requested item. If the list doesn't contain an item with the specified key,
-                        /// the Promise completes with a value of null.
-                        /// </returns>
-                        /// </signature>
-
-                        return itemDirectlyFromSlot(slotFromKey(key, hints));
-                    };
-                }
-
-                if (itemsFromIndex || (itemsFromStart && itemsFromKey)) {
-                    this.itemFromIndex = function (index) {
-                        /// <signature helpKeyword="WinJS.UI.IListDataSource.itemFromIndex">
-                        /// <summary locid="WinJS.UI.IListDataSource.itemFromIndex">
-                        /// Retrieves the item at the specified index.
-                        /// </summary>
-                        /// <param name="index" type="Number" integer="true" locid="WinJS.UI.IListDataSource.itemFromIndex_p:index">
-                        /// A value greater than or equal to zero that is the index of the requested item.
-                        /// </param>
-                        /// <returns type="Promise" locid="WinJS.UI.IListDataSource.itemFromIndex_returnValue">
-                        /// A Promise for the requested item. If the list doesn't contain an item with the specified index,
-                        /// the Promise completes with a value of null.
-                        /// </returns>
-                        /// </signature>
-
-                        return itemDirectlyFromSlot(slotFromIndex(index));
-                    };
-                }
-
-                if (itemsFromDescription) {
-                    this.itemFromDescription = function (description) {
-                        /// <signature helpKeyword="WinJS.UI.IListDataSource.itemFromDescription">
-                        /// <summary locid="WinJS.UI.IListDataSource.itemFromDescription">
-                        /// Retrieves the item with the specified description.
-                        /// </summary>
-                        /// <param name="description" locid="WinJS.UI.IListDataSource.itemFromDescription_p:description">
-                        /// Domain-specific info that describes the item to retrieve, to be interpreted by the IListDataAdapter,
-                        /// </param>
-                        /// <returns type="Promise" locid="WinJS.UI.IListDataSource.itemFromDescription_returnValue">
-                        /// A Promise for the requested item. If the list doesn't contain an item with the specified description,
-                        /// the Promise completes with a value of null.
-                        /// </returns>
-                        /// </signature>
-
-                        return itemDirectlyFromSlot(slotFromDescription(description));
-                    };
-                }
-
-                this.beginEdits = function () {
-                    /// <signature helpKeyword="WinJS.UI.IListDataSource.beginEdits">
-                    /// <summary locid="WinJS.UI.IListDataSource.beginEdits">
-                    /// Notifies the data source that a sequence of edits is about to begin.  The data source calls
-                    /// IListNotificationHandler.beginNotifications and endNotifications each one time for a sequence of edits.
-                    /// </summary>
-                    /// </signature>
-
-                    editsInProgress = true;
-                };
-
-                // Only implement each editing method if the data adapter implements the corresponding ListDataAdapter method
-
-                if (listDataAdapter.insertAtStart) {
-                    this.insertAtStart = function (key, data) {
-                        /// <signature helpKeyword="WinJS.UI.IListDataSource.insertAtStart">
-                        /// <summary locid="WinJS.UI.IListDataSource.insertAtStart">
-                        /// Adds an item to the beginning of the data source.
-                        /// </summary>
-                        /// <param name="key" mayBeNull="true" type="String" locid="WinJS.UI.IListDataSource.insertAtStart_p:key">
-                        /// The key of the item to insert, if known; otherwise, null.
-                        /// </param>
-                        /// <param name="data" locid="WinJS.UI.IListDataSource.insertAtStart_p:data">
-                        /// The data for the item to add.
-                        /// </param>
-                        /// <returns type="Promise" locid="WinJS.UI.IListDataSource.insertAtStart_returnValue">
-                        /// A Promise that contains the IItem that was added or an EditError if an error occurred.
-                        /// </returns>
-                        /// </signature>
-
-                        // Add item to start of list, only notify if the first item was requested
-                        return insertItem(
-                            key, data,
-
-                            // slotInsertBefore, append
-                            (slotsStart.lastInSequence ? null : slotsStart.next), true,
-
-                            // applyEdit
-                            function () {
-                                return listDataAdapter.insertAtStart(key, data);
-                            }
-                        );
-                    };
-                }
-
-                if (listDataAdapter.insertBefore) {
-                    this.insertBefore = function (key, data, nextKey) {
-                        /// <signature helpKeyword="WinJS.UI.IListDataSource.insertBefore">
-                        /// <summary locid="WinJS.UI.IListDataSource.insertBefore">
-                        /// Inserts an item before another item.
-                        /// </summary>
-                        /// <param name="key" mayBeNull="true" type="String" locid="WinJS.UI.IListDataSource.insertBefore_p:key">
-                        /// The key of the item to insert, if known; otherwise, null.
-                        /// </param>
-                        /// <param name="data" locid="WinJS.UI.IListDataSource.insertBefore_p:data">
-                        /// The data for the item to insert.
-                        /// </param>
-                        /// <param name="nextKey" type="String" locid="WinJS.UI.IListDataSource.insertBefore_p:nextKey">
-                        /// The key of an item in the data source. The new data is inserted before this item.
-                        /// </param>
-                        /// <returns type="Promise" locid="WinJS.UI.IListDataSource.insertBefore_returnValue">
-                        /// A Promise that contains the IItem that was added or an EditError if an error occurred.
-                        /// </returns>
-                        /// </signature>
-
-                        var slotNext = getSlotForEdit(nextKey);
-
-                        // Add item before given item and send notification
-                        return insertItem(
-                            key, data,
-
-                            // slotInsertBefore, append
-                            slotNext, false,
-
-                            // applyEdit
-                            function () {
-                                return listDataAdapter.insertBefore(key, data, nextKey, adjustedIndex(slotNext));
-                            }
-                        );
-                    };
-                }
-
-                if (listDataAdapter.insertAfter) {
-                    this.insertAfter = function (key, data, previousKey) {
-                        /// <signature helpKeyword="WinJS.UI.IListDataSource.insertAfter">
-                        /// <summary locid="WinJS.UI.IListDataSource.insertAfter">
-                        /// Inserts an item after another item.
-                        /// </summary>
-                        /// <param name="key" mayBeNull="true" type="String" locid="WinJS.UI.IListDataSource.insertAfter_p:key">
-                        /// The key of the item to insert, if known; otherwise, null.
-                        /// </param>
-                        /// <param name="data" locid="WinJS.UI.IListDataSource.insertAfter_p:data">
-                        /// The data for the item to insert.
-                        /// </param>
-                        /// <param name="previousKey" type="String" locid="WinJS.UI.IListDataSource.insertAfter_p:previousKey">
-                        /// The key for an item in the data source. The new item is added after this item.
-                        /// </param>
-                        /// <returns type="Promise" locid="WinJS.UI.IListDataSource.insertAfter_returnValue">
-                        /// A Promise that contains the IItem that was added or an EditError if an error occurred.
-                        /// </returns>
-                        /// </signature>
-
-                        var slotPrev = getSlotForEdit(previousKey);
-
-                        // Add item after given item and send notification
-                        return insertItem(
-                            key, data,
-
-                            // slotInsertBefore, append
-                            (slotPrev ? slotPrev.next : null), true,
-
-                            // applyEdit
-                            function () {
-                                return listDataAdapter.insertAfter(key, data, previousKey, adjustedIndex(slotPrev));
-                            }
-                        );
-                    };
-                }
-
-                if (listDataAdapter.insertAtEnd) {
-                    this.insertAtEnd = function (key, data) {
-                        /// <signature helpKeyword="WinJS.UI.IListDataSource.insertAtEnd">
-                        /// <summary locid="WinJS.UI.IListDataSource.insertAtEnd">
-                        /// Adds an item to the end of the data source.
-                        /// </summary>
-                        /// <param name="key" mayBeNull="true" type="String" locid="WinJS.UI.IListDataSource.insertAtEnd_p:key">
-                        /// The key of the item to insert, if known; otherwise, null.
-                        /// </param>
-                        /// <param name="data" locid="WinJS.UI.IListDataSource.insertAtEnd_data">
-                        /// The data for the item to insert.
-                        /// </param>
-                        /// <returns type="Promise" locid="WinJS.UI.IListDataSource.insertAtEnd_returnValue">
-                        /// A Promise that contains the IItem that was added or an EditError if an error occurred.
-                        /// </returns>
-                        /// </signature>
-
-                        // Add item to end of list, only notify if the last item was requested
-                        return insertItem(
-                            key, data,
-
-                            // slotInsertBefore, append
-                            (slotListEnd.firstInSequence ? null : slotListEnd), false,
-
-                            // applyEdit
-                            function () {
-                                return listDataAdapter.insertAtEnd(key, data);
-                            }
-                        );
-                    };
-                }
-
-                if (listDataAdapter.change) {
-                    this.change = function (key, newData) {
-                        /// <signature helpKeyword="WinJS.UI.IListDataSource.change">
-                        /// <summary locid="WinJS.UI.IListDataSource.change">
-                        /// Overwrites the data of the specified item.
-                        /// </summary>
-                        /// <param name="key" type="String" locid="WinJS.UI.IListDataSource.change_p:key">
-                        /// The key for the item to replace.
-                        /// </param>
-                        /// <param name="newData" type="Object" locid="WinJS.UI.IListDataSource.change_p:newData">
-                        /// The new data for the item.
-                        /// </param>
-                        /// <returns type="Promise" locid="WinJS.UI.IListDataSource.change_returnValue">
-                        /// A Promise that contains the IItem that was updated or an EditError if an error occurred.
-                        /// </returns>
-                        /// </signature>
-
-                        var slot = getSlotForEdit(key);
-
-                        return new Promise(function (complete, error) {
-                            var itemOld;
-
-                            queueEdit(
-                                // applyEdit
-                                function () {
-                                    return listDataAdapter.change(key, newData, adjustedIndex(slot));
-                                },
-
-                                EditType.change, complete, error,
-
-                                // keyUpdate
-                                null,
-
-                                // updateSlots
-                                function () {
-                                    itemOld = slot.item;
-
-                                    slot.itemNew = {
-                                        key: key,
-                                        data: newData
-                                    };
-
-                                    if (itemOld) {
-                                        changeSlot(slot);
-                                    } else {
-                                        completeFetchPromises(slot);
-                                    }
-                                },
-
-                                // undo
-                                function () {
-                                    if (itemOld) {
-                                        slot.itemNew = itemOld;
-                                        changeSlot(slot);
-                                    } else {
-                                        beginRefresh();
-                                    }
-                                }
-                            );
-                        });
-                    };
-                }
-
-                if (listDataAdapter.moveToStart) {
-                    this.moveToStart = function (key) {
-                        /// <signature helpKeyword="WinJS.UI.IListDataSource.moveToStart">
-                        /// <summary locid="WinJS.UI.IListDataSource.moveToStart">
-                        /// Moves the specified item to the beginning of the data source.
-                        /// </summary>
-                        /// <param name="key" type="String" locid="WinJS.UI.IListDataSource.moveToStart_p:key">
-                        /// The key of the item to move.
-                        /// </param>
-                        /// <returns type="Promise" locid="WinJS.UI.IListDataSource.moveToStart_returnValue">
-                        /// A Promise that contains the IItem that was moved or an EditError if an error occurred.
-                        /// </returns>
-                        /// </signature>
-
-                        var slot = getSlotForEdit(key);
-
-                        return moveItem(
-                            slot,
-
-                            // slotMoveBefore, append
-                            slotsStart.next, true,
-
-                            // applyEdit
-                            function () {
-                                return listDataAdapter.moveToStart(key, adjustedIndex(slot));
-                            }
-                        );
-                    };
-                }
-
-                if (listDataAdapter.moveBefore) {
-                    this.moveBefore = function (key, nextKey) {
-                        /// <signature helpKeyword="WinJS.UI.IListDataSource.moveBefore">
-                        /// <summary locid="WinJS.UI.IListDataSource.moveBefore">
-                        /// Moves the specified item before another item.
-                        /// </summary>
-                        /// <param name="key" type="String" locid="WinJS.UI.IListDataSource.moveBefore_p:key">
-                        /// The key of the item to move.
-                        /// </param>
-                        /// <param name="nextKey" type="String" locid="WinJS.UI.IListDataSource.moveBefore_p:nextKey">
-                        /// The key of another item in the data source. The item specified by the key parameter
-                        /// is moved to a position immediately before this item.
-                        /// </param>
-                        /// <returns type="Promise" locid="WinJS.UI.IListDataSource.moveBefore_returnValue">
-                        /// A Promise that contains the IItem that was moved or an EditError if an error occurred.
-                        /// </returns>
-                        /// </signature>
-
-                        var slot = getSlotForEdit(key),
-                            slotNext = getSlotForEdit(nextKey);
-
-                        return moveItem(
-                            slot,
-
-                            // slotMoveBefore, append
-                            slotNext, false,
-
-                            // applyEdit
-                            function () {
-                                return listDataAdapter.moveBefore(key, nextKey, adjustedIndex(slot), adjustedIndex(slotNext));
-                            }
-                        );
-                    };
-                }
-
-                if (listDataAdapter.moveAfter) {
-                    this.moveAfter = function (key, previousKey) {
-                        /// <signature helpKeyword="WinJS.UI.IListDataSource.moveAfter">
-                        /// <summary locid="WinJS.UI.IListDataSource.moveAfter">
-                        /// Moves an item after another item.
-                        /// </summary>
-                        /// <param name="key" type="String" locid="WinJS.UI.IListDataSource.moveAfter_p:key">
-                        /// The key of the item to move.
-                        /// </param>
-                        /// <param name="previousKey" type="String" locid="WinJS.UI.IListDataSource.moveAfter_p:previousKey">
-                        /// The key of another item in the data source. The item specified by the key parameter will
-                        /// is moved to a position immediately after this item.
-                        /// </param>
-                        /// <returns type="Promise" locid="WinJS.UI.IListDataSource.moveAfter_returnValue">
-                        /// A Promise that contains the IItem that was moved or an EditError if an error occurred.
-                        /// </returns>
-                        /// </signature>
-
-                        var slot = getSlotForEdit(key),
-                            slotPrev = getSlotForEdit(previousKey);
-
-                        return moveItem(
-                            slot,
-
-                            // slotMoveBefore, append
-                            slotPrev.next, true,
-
-                            // applyEdit
-                            function () {
-                                return listDataAdapter.moveAfter(key, previousKey, adjustedIndex(slot), adjustedIndex(slotPrev));
-                            }
-                        );
-                    };
-                }
-
-                if (listDataAdapter.moveToEnd) {
-                    this.moveToEnd = function (key) {
-                        /// <signature helpKeyword="WinJS.UI.IListDataSource.moveToEnd">
-                        /// <summary locid="WinJS.UI.IListDataSource.moveToEnd">
-                        /// Moves an item to the end of the data source.
-                        /// </summary>
-                        /// <param name="key" type="String" locid="WinJS.UI.IListDataSource.moveToEnd_p:key">
-                        /// The key of the item to move.
-                        /// </param>
-                        /// <returns type="Promise" locid="WinJS.UI.IListDataSource.moveToEnd_returnValue">
-                        /// A Promise that contains the IItem that was moved or an EditError if an error occurred.
-                        /// </returns>
-                        /// </signature>
-
-                        var slot = getSlotForEdit(key);
-
-                        return moveItem(
-                            slot,
-
-                            // slotMoveBefore, append
-                            slotListEnd, false,
-
-                            // applyEdit
-                            function () {
-                                return listDataAdapter.moveToEnd(key, adjustedIndex(slot));
-                            }
-                        );
-                    };
-                }
-
-                if (listDataAdapter.remove) {
-                    this.remove = function (key) {
-                        /// <signature helpKeyword="WinJS.UI.IListDataSource.remove">
-                        /// <summary locid="WinJS.UI.IListDataSource.remove">
-                        /// Removes an item from the data source.
-                        /// </summary>
-                        /// <param name="key" type="String" locid="WinJS.UI.IListDataSource.remove_p:key">
-                        /// The key of the item to remove.
-                        /// </param>
-                        /// <returns type="Promise" locid="WinJS.UI.IListDataSource.remove_returnValue">
-                        /// A Promise that contains nothing if the operation was successful or an EditError if an error occurred.
-                        /// </returns>
-                        /// </signature>
-
-                        validateKey(key);
-
-                        var slot = keyMap[key];
-
-                        return new Promise(function (complete, error) {
-                            var slotNext,
-                                firstInSequence,
-                                lastInSequence;
-
-                            queueEdit(
-                                // applyEdit
-                                function () {
-                                    return listDataAdapter.remove(key, adjustedIndex(slot));
-                                },
-
-                                EditType.remove, complete, error,
-
-                                // keyUpdate
-                                null,
-
-                                // updateSlots
-                                function () {
-                                    if (slot) {
-                                        slotNext = slot.next;
-                                        firstInSequence = slot.firstInSequence;
-                                        lastInSequence = slot.lastInSequence;
-
-                                        updateNewIndices(slot, -1);
-                                        deleteSlot(slot, false);
-                                    }
-                                },
-
-                                // undo
-                                function () {
-                                    if (slot) {
-                                        reinsertSlot(slot, slotNext, !firstInSequence, !lastInSequence);
-                                        updateNewIndices(slot, 1);
-                                        sendInsertedNotification(slot);
-                                    }
-                                }
-                            );
-                        });
-                    };
-                }
-
-                this.endEdits = function () {
-                    /// <signature helpKeyword="WinJS.UI.IListDataSource.endEdits">
-                    /// <summary locid="WinJS.UI.IListDataSource.endEdits">
-                    /// Notifies the data source that a sequence of edits has ended.  The data source will call
-                    /// IListNotificationHandler.beginNotifications and endNotifications once each for a sequence of edits.
-                    /// </summary>
-                    /// </signature>
-
-                    editsInProgress = false;
-                    completeEdits();
-                };
-
-            } // _baseDataSourceConstructor
-
-            var VDS = _Base.Class.define(function () {
-                /// <signature helpKeyword="WinJS.UI.VirtualizedDataSource">
-                /// <summary locid="WinJS.UI.VirtualizedDataSource">
-                /// Use as a base class when defining a custom data source. Do not instantiate directly.
-                /// </summary>
-                /// <event name="statuschanged" locid="WinJS.UI.VirtualizedDataSource_e:statuschanged">
-                /// Raised when the status of the VirtualizedDataSource changes between ready, waiting, and failure states.
-                /// </event>
-                /// </signature>
-            }, {
-                _baseDataSourceConstructor: _baseDataSourceConstructor,
-                _isVirtualizedDataSource: true
-            }, { // Static Members
-                supportedForProcessing: false
-            });
-            _Base.Class.mix(VDS, _Events.eventMixin);
-            return VDS;
-        })
-
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// Group Data Source
-
-define('WinJS/VirtualizedDataSource/_GroupDataSource',[
-    'exports',
-    '../Core/_Base',
-    '../Core/_ErrorFromName',
-    '../Promise',
-    '../Scheduler',
-    '../Utilities/_UI',
-    './_VirtualizedDataSourceImpl'
-    ], function groupDataSourceInit(exports, _Base, _ErrorFromName, Promise, Scheduler, _UI, VirtualizedDataSource) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-
-        _GroupDataSource: _Base.Namespace._lazy(function () {
-
-            // Private statics
-
-            function errorDoesNotExist() {
-                return new _ErrorFromName(_UI.FetchError.doesNotExist);
-            }
-
-            var batchSizeDefault = 101;
-
-            function groupReady(group) {
-                return group && group.firstReached && group.lastReached;
-            }
-
-            var ListNotificationHandler = _Base.Class.define(function ListNotificationHandler_ctor(groupDataAdapter) {
-                // Constructor
-
-                this._groupDataAdapter = groupDataAdapter;
-            }, {
-                // Public methods
-
-                beginNotifications: function () {
-                },
-
-                // itemAvailable: not implemented
-
-                inserted: function (itemPromise, previousHandle, nextHandle) {
-                    this._groupDataAdapter._inserted(itemPromise, previousHandle, nextHandle);
-                },
-
-                changed: function (newItem, oldItem) {
-                    this._groupDataAdapter._changed(newItem, oldItem);
-                },
-
-                moved: function (itemPromise, previousHandle, nextHandle) {
-                    this._groupDataAdapter._moved(itemPromise, previousHandle, nextHandle);
-                },
-
-                removed: function (handle, mirage) {
-                    this._groupDataAdapter._removed(handle, mirage);
-                },
-
-                countChanged: function (newCount, oldCount) {
-                    if (newCount === 0 && oldCount !== 0) {
-                        this._groupDataAdapter.invalidateGroups();
-                    }
-                },
-
-                indexChanged: function (handle, newIndex, oldIndex) {
-                    this._groupDataAdapter._indexChanged(handle, newIndex, oldIndex);
-                },
-
-                endNotifications: function () {
-                    this._groupDataAdapter._endNotifications();
-                },
-
-                reload: function () {
-                    this._groupDataAdapter._reload();
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-
-            var GroupDataAdapter = _Base.Class.define(function GroupDataAdapater_ctor(listDataSource, groupKey, groupData, options) {
-                // Constructor
-
-                this._listBinding = listDataSource.createListBinding(new ListNotificationHandler(this));
-
-                this._groupKey = groupKey;
-                this._groupData = groupData;
-
-                // _initializeState clears the count, so call this before processing the groupCountEstimate option
-                this._initializeState();
-
-                this._batchSize = batchSizeDefault;
-                this._count = null;
-
-                if (options) {
-                    if (typeof options.groupCountEstimate === "number") {
-                        this._count = (options.groupCountEstimate < 0 ? null : Math.max(options.groupCountEstimate, 1));
-                    }
-                    if (typeof options.batchSize === "number") {
-                        this._batchSize = options.batchSize + 1;
-                    }
-                }
-
-                if (this._listBinding.last) {
-                    this.itemsFromEnd = function (count) {
-                        var that = this;
-                        return this._fetchItems(
-                            // getGroup
-                            function () {
-                                return that._lastGroup;
-                            },
-
-                            // mayExist
-                            function (failed) {
-                                if (failed) {
-                                    return false;
-                                }
-                                var count = that._count;
-                                if (+count !== count) {
-                                    return true;
-                                }
-                                if (count > 0) {
-                                    return true;
-                                }
-                            },
-
-                            // fetchInitialBatch
-                            function () {
-                                that._fetchBatch(that._listBinding.last(), that._batchSize - 1, 0);
-                            },
-
-                            count - 1, 0
-                        );
-                    };
-                }
-            }, {
-                // Public members
-
-                setNotificationHandler: function (notificationHandler) {
-                    this._listDataNotificationHandler = notificationHandler;
-                },
-
-                // The ListDataSource should always compare these items by identity; in rare cases, it will do some unnecessary
-                // rerendering, but at least fetching will not stringify items we already know to be valid and that we know
-                // have not changed.
-                compareByIdentity: true,
-
-                // itemsFromStart: not implemented
-
-                // itemsFromEnd: implemented in constructor
-
-                itemsFromKey: function (key, countBefore, countAfter, hints) {
-                    var that = this;
-                    return this._fetchItems(
-                        // getGroup
-                        function () {
-                            return that._keyMap[key];
-                        },
-
-                        // mayExist
-                        function () {
-                            var lastGroup = that._lastGroup;
-                            if (!lastGroup) {
-                                return true;
-                            }
-                            if (+lastGroup.index !== lastGroup.index) {
-                                return true;
-                            }
-                        },
-
-                        // fetchInitialBatch
-                        function () {
-                            hints = hints || {};
-                            var itemPromise = (
-                                typeof hints.groupMemberKey === "string" && that._listBinding.fromKey ?
-                                    that._listBinding.fromKey(hints.groupMemberKey) :
-                                typeof hints.groupMemberIndex === "number" && that._listBinding.fromIndex ?
-                                    that._listBinding.fromIndex(hints.groupMemberIndex) :
-                                hints.groupMemberDescription !== undefined && that._listBinding.fromDescription ?
-                                    that._listBinding.fromDescription(hints.groupMemberDescription) :
-                                    that._listBinding.first()
-                            );
-
-                            var fetchBefore = Math.floor(0.5 * (that._batchSize - 1));
-                            that._fetchBatch(itemPromise, fetchBefore, that._batchSize - 1 - fetchBefore);
-                        },
-
-                        countBefore, countAfter
-                    );
-                },
-
-                itemsFromIndex: function (index, countBefore, countAfter) {
-                    var that = this;
-                    return this._fetchItems(
-                        // getGroup
-                        function () {
-                            return that._indexMap[index];
-                        },
-
-                        // mayExist
-                        function () {
-                            var lastGroup = that._lastGroup;
-                            if (!lastGroup) {
-                                return true;
-                            }
-                            if (+lastGroup.index !== lastGroup.index) {
-                                return true;
-                            }
-                            if (index <= lastGroup.index) {
-                                return true;
-                            }
-                        },
-
-                        // fetchInitialBatch
-                        function () {
-                            that._fetchNextIndex();
-                        },
-
-                        countBefore, countAfter
-                    );
-                },
-
-                // itemsFromDescription: not implemented
-
-                getCount: function () {
-                    if (this._lastGroup && typeof this._lastGroup.index === "number") {
-                        return Promise.wrap(this._count);
-                    } else {
-                        // Even if there's a current estimate for _count, consider this call to be a request to determine the true
-                        // count.
-
-                        var that = this;
-                        var countPromise = new Promise(function (complete) {
-                            var fetch = {
-                                initialBatch: function () {
-                                    that._fetchNextIndex();
-                                },
-                                getGroup: function () { return null; },
-                                countBefore: 0,
-                                countAfter: 0,
-                                complete: function (failed) {
-                                    if (failed) {
-                                        that._count = 0;
-                                    }
-
-                                    var count = that._count;
-                                    if (typeof count === "number") {
-                                        complete(count);
-                                        return true;
-                                    } else {
-                                        return false;
-                                    }
-                                }
-                            };
-
-                            that._fetchQueue.push(fetch);
-
-                            if (!that._itemBatch) {
-                                that._continueFetch(fetch);
-                            }
-                        });
-
-                        return (typeof this._count === "number" ? Promise.wrap(this._count) : countPromise);
-                    }
-                },
-
-                invalidateGroups: function () {
-                    this._beginRefresh();
-                    this._initializeState();
-                },
-
-                // Editing methods not implemented
-
-                // Private members
-
-                _initializeState: function () {
-                    this._count = null;
-                    this._indexMax = null;
-
-                    this._keyMap = {};
-                    this._indexMap = {};
-                    this._lastGroup = null;
-                    this._handleMap = {};
-
-                    this._fetchQueue = [];
-
-                    this._itemBatch = null;
-                    this._itemsToFetch = 0;
-
-                    this._indicesChanged = false;
-                },
-
-                _releaseItem: function (item) {
-                    delete this._handleMap[item.handle];
-                    this._listBinding.releaseItem(item);
-                },
-
-                _processBatch: function () {
-                    var previousItem = null,
-                        previousGroup = null,
-                        firstItemInGroup = null,
-                        itemsSinceStart = 0,
-                        failed = true;
-                    for (var i = 0; i < this._batchSize; i++) {
-                        var item = this._itemBatch[i],
-                            groupKey = (item ? this._groupKey(item) : null);
-
-                        if (item) {
-                            failed = false;
-                        }
-
-                        if (previousGroup && groupKey !== null && groupKey === previousGroup.key) {
-                            // This item is in the same group as the last item.  The only thing to do is advance the group's
-                            // lastItem if this is definitely the last item that has been processed for the group.
-                            itemsSinceStart++;
-                            if (previousGroup.lastItem === previousItem) {
-                                if (previousGroup.lastItem.handle !== previousGroup.firstItem.handle) {
-                                    this._releaseItem(previousGroup.lastItem);
-                                }
-                                previousGroup.lastItem = item;
-                                this._handleMap[item.handle] = previousGroup;
-
-                                previousGroup.size++;
-                            } else if (previousGroup.firstItem === item) {
-                                if (previousGroup.firstItem.handle !== previousGroup.lastItem.handle) {
-                                    this._releaseItem(previousGroup.firstItem);
-                                }
-                                previousGroup.firstItem = firstItemInGroup;
-                                this._handleMap[firstItemInGroup.handle] = previousGroup;
-
-                                previousGroup.size += itemsSinceStart;
-                            }
-                        } else {
-                            var index = null;
-
-                            if (previousGroup) {
-                                previousGroup.lastReached = true;
-
-                                if (typeof previousGroup.index === "number") {
-                                    index = previousGroup.index + 1;
-                                }
-                            }
-
-                            if (item) {
-                                // See if the current group has already been processed
-                                var group = this._keyMap[groupKey];
-
-                                if (!group) {
-                                    group = {
-                                        key: groupKey,
-                                        data: this._groupData(item),
-                                        firstItem: item,
-                                        lastItem: item,
-                                        size: 1
-                                    };
-                                    this._keyMap[group.key] = group;
-                                    this._handleMap[item.handle] = group;
-                                }
-
-                                if (i > 0) {
-                                    group.firstReached = true;
-
-                                    if (!previousGroup) {
-                                        index = 0;
-                                    }
-                                }
-
-                                if (typeof group.index !== "number" && typeof index === "number") {
-                                    // Set the indices of as many groups as possible
-                                    for (var group2 = group; group2; group2 = this._nextGroup(group2)) {
-                                        group2.index = index;
-                                        this._indexMap[index] = group2;
-
-                                        index++;
-                                    }
-
-                                    this._indexMax = index;
-                                    if (typeof this._count === "number" && !this._lastGroup && this._count <= this._indexMax) {
-                                        this._count = this._indexMax + 1;
-                                    }
-                                }
-
-                                firstItemInGroup = item;
-                                itemsSinceStart = 0;
-
-                                previousGroup = group;
-                            } else {
-                                if (previousGroup) {
-                                    this._lastGroup = previousGroup;
-
-                                    if (typeof previousGroup.index === "number") {
-                                        this._count = (previousGroup.index + 1);
-                                    }
-
-                                    // Force a client refresh (which should be fast) to ensure that a countChanged notification is
-                                    // sent.
-                                    this._listDataNotificationHandler.invalidateAll();
-
-                                    previousGroup = null;
-                                }
-                            }
-                        }
-
-                        previousItem = item;
-                    }
-
-                    // See how many fetches have now completed
-                    var fetch;
-                    for (fetch = this._fetchQueue[0]; fetch && fetch.complete(failed) ; fetch = this._fetchQueue[0]) {
-                        this._fetchQueue.splice(0, 1);
-                    }
-
-                    // Continue work on the next fetch, if any
-                    if (fetch) {
-                        var that = this;
-                        // Avoid reentering _processBatch
-                        Scheduler.schedule(function GroupDataSource_async_processBatch() {
-                            that._continueFetch(fetch);
-                        }, Scheduler.Priority.normal, null, "WinJS.UI._GroupDataSource._continueFetch");
-                    } else {
-                        this._itemBatch = null;
-                    }
-                },
-
-                _processPromise: function (itemPromise, batchIndex) {
-                    itemPromise.retain();
-
-                    this._itemBatch[batchIndex] = itemPromise;
-
-                    var that = this;
-                    itemPromise.then(function (item) {
-                        that._itemBatch[batchIndex] = item;
-                        if (--that._itemsToFetch === 0) {
-                            that._processBatch();
-                        }
-                    });
-                },
-
-                _fetchBatch: function (itemPromise, countBefore) {
-                    this._itemBatch = new Array(this._batchSize);
-                    this._itemsToFetch = this._batchSize;
-
-                    this._processPromise(itemPromise, countBefore);
-
-                    var batchIndex;
-
-                    this._listBinding.jumpToItem(itemPromise);
-                    for (batchIndex = countBefore - 1; batchIndex >= 0; batchIndex--) {
-                        this._processPromise(this._listBinding.previous(), batchIndex);
-                    }
-
-                    this._listBinding.jumpToItem(itemPromise);
-                    for (batchIndex = countBefore + 1; batchIndex < this._batchSize; batchIndex++) {
-                        this._processPromise(this._listBinding.next(), batchIndex);
-                    }
-                },
-
-                _fetchAdjacent: function (item, after) {
-                    // Batches overlap by one so group boundaries always fall within at least one batch
-                    this._fetchBatch(
-                        (this._listBinding.fromKey ? this._listBinding.fromKey(item.key) : this._listBinding.fromIndex(item.index)),
-                        (after ? 0 : this._batchSize - 1),
-                        (after ? this._batchSize - 1 : 0)
-                    );
-                },
-
-                _fetchNextIndex: function () {
-                    var groupHighestIndex = this._indexMap[this._indexMax - 1];
-                    if (groupHighestIndex) {
-                        // We've already fetched some of the first items, so continue where we left off
-                        this._fetchAdjacent(groupHighestIndex.lastItem, true);
-                    } else {
-                        // Fetch one non-existent item before the list so _processBatch knows the start was reached
-                        this._fetchBatch(this._listBinding.first(), 1, this._batchSize - 2);
-                    }
-                },
-
-                _continueFetch: function (fetch) {
-                    if (fetch.initialBatch) {
-                        fetch.initialBatch();
-                        fetch.initialBatch = null;
-                    } else {
-                        var group = fetch.getGroup();
-                        if (group) {
-                            var groupPrev,
-                                groupNext;
-
-                            if (!group.firstReached) {
-                                this._fetchAdjacent(group.firstItem, false);
-                            } else if (!group.lastReached) {
-                                this._fetchAdjacent(group.lastItem, true);
-                            } else if (fetch.countBefore > 0 && group.index !== 0 && !groupReady(groupPrev = this._previousGroup(group))) {
-                                this._fetchAdjacent((groupPrev && groupPrev.lastReached ? groupPrev.firstItem : group.firstItem), false);
-                            } else {
-                                groupNext = this._nextGroup(group);
-                                this._fetchAdjacent((groupNext && groupNext.firstReached ? groupNext.lastItem : group.lastItem), true);
-                            }
-                        } else {
-                            // Assume we're searching for a key, index or the count by brute force
-                            this._fetchNextIndex();
-                        }
-                    }
-                },
-
-                _fetchComplete: function (group, countBefore, countAfter, firstRequest, complete) {
-                    if (groupReady(group)) {
-                        // Check if the minimal requirements for the request are met
-                        var groupPrev = this._previousGroup(group);
-                        if (firstRequest || groupReady(groupPrev) || group.index === 0 || countBefore === 0) {
-                            var groupNext = this._nextGroup(group);
-                            if (firstRequest || groupReady(groupNext) || this._lastGroup === group || countAfter === 0) {
-                                // Time to return the fetch results
-
-                                // Find the first available group to return (don't return more than asked for)
-                                var countAvailableBefore = 0,
-                                    groupFirst = group;
-                                while (countAvailableBefore < countBefore) {
-                                    groupPrev = this._previousGroup(groupFirst);
-
-                                    if (!groupReady(groupPrev)) {
-                                        break;
-                                    }
-
-                                    groupFirst = groupPrev;
-                                    countAvailableBefore++;
-                                }
-
-                                // Find the last available group to return
-                                var countAvailableAfter = 0,
-                                    groupLast = group;
-                                while (countAvailableAfter < countAfter) {
-                                    groupNext = this._nextGroup(groupLast);
-
-                                    if (!groupReady(groupNext)) {
-                                        break;
-                                    }
-
-                                    groupLast = groupNext;
-                                    countAvailableAfter++;
-                                }
-
-                                // Now create the items to return
-                                var len = countAvailableBefore + 1 + countAvailableAfter,
-                                    items = new Array(len);
-
-                                for (var i = 0; i < len; i++) {
-                                    var item = {
-                                        key: groupFirst.key,
-                                        data: groupFirst.data,
-                                        firstItemKey: groupFirst.firstItem.key,
-                                        groupSize: groupFirst.size
-                                    };
-
-                                    var firstItemIndex = groupFirst.firstItem.index;
-                                    if (typeof firstItemIndex === "number") {
-                                        item.firstItemIndexHint = firstItemIndex;
-                                    }
-
-                                    items[i] = item;
-
-                                    groupFirst = this._nextGroup(groupFirst);
-                                }
-
-                                var result = {
-                                    items: items,
-                                    offset: countAvailableBefore
-                                };
-
-                                result.totalCount = (
-                                    typeof this._count === "number" ?
-                                        this._count :
-                                        _UI.CountResult.unknown
-                                );
-
-                                if (typeof group.index === "number") {
-                                    result.absoluteIndex = group.index;
-                                }
-
-                                if (groupLast === this._lastGroup) {
-                                    result.atEnd = true;
-                                }
-
-                                complete(result);
-                                return true;
-                            }
-                        }
-                    }
-
-                    return false;
-                },
-
-                _fetchItems: function (getGroup, mayExist, fetchInitialBatch, countBefore, countAfter) {
-                    var that = this;
-                    return new Promise(function (complete, error) {
-                        var group = getGroup(),
-                            firstRequest = !group,
-                            failureCount = 0;
-
-                        function fetchComplete(failed) {
-                            var group2 = getGroup();
-
-                            if (group2) {
-                                return that._fetchComplete(group2, countBefore, countAfter, firstRequest, complete, error);
-                            } else if (firstRequest && !mayExist(failed)) {
-                                error(errorDoesNotExist());
-                                return true;
-                            } else if (failureCount > 2) {
-                                error(errorDoesNotExist());
-                                return true;
-                            } else {
-                                // only consider consecutive failures
-                                if (failed) {
-                                    failureCount++;
-                                } else {
-                                    failureCount = 0;
-                                }
-                                // _continueFetch will switch to a brute force search
-                                return false;
-                            }
-                        }
-
-                        if (!fetchComplete()) {
-                            var fetch = {
-                                initialBatch: firstRequest ? fetchInitialBatch : null,
-                                getGroup: getGroup,
-                                countBefore: countBefore,
-                                countAfter: countAfter,
-                                complete: fetchComplete
-                            };
-
-                            that._fetchQueue.push(fetch);
-
-                            if (!that._itemBatch) {
-                                that._continueFetch(fetch);
-                            }
-                        }
-                    });
-                },
-
-                _previousGroup: function (group) {
-                    if (group && group.firstReached) {
-                        this._listBinding.jumpToItem(group.firstItem);
-
-                        return this._handleMap[this._listBinding.previous().handle];
-                    } else {
-                        return null;
-                    }
-                },
-
-                _nextGroup: function (group) {
-                    if (group && group.lastReached) {
-                        this._listBinding.jumpToItem(group.lastItem);
-
-                        return this._handleMap[this._listBinding.next().handle];
-                    } else {
-                        return null;
-                    }
-                },
-
-                _invalidateIndices: function (group) {
-                    this._count = null;
-                    this._lastGroup = null;
-
-                    if (typeof group.index === "number") {
-                        this._indexMax = (group.index > 0 ? group.index : null);
-                    }
-
-                    // Delete the indices of this and all subsequent groups
-                    for (var group2 = group; group2 && typeof group2.index === "number"; group2 = this._nextGroup(group2)) {
-                        delete this._indexMap[group2.index];
-                        group2.index = null;
-                    }
-                },
-
-                _releaseGroup: function (group) {
-                    this._invalidateIndices(group);
-
-                    delete this._keyMap[group.key];
-
-                    if (this._lastGroup === group) {
-                        this._lastGroup = null;
-                    }
-
-                    if (group.firstItem !== group.lastItem) {
-                        this._releaseItem(group.firstItem);
-                    }
-                    this._releaseItem(group.lastItem);
-                },
-
-                _beginRefresh: function () {
-                    // Abandon all current fetches
-
-                    this._fetchQueue = [];
-
-                    if (this._itemBatch) {
-                        for (var i = 0; i < this._batchSize; i++) {
-                            var item = this._itemBatch[i];
-                            if (item) {
-                                if (item.cancel) {
-                                    item.cancel();
-                                }
-                                this._listBinding.releaseItem(item);
-                            }
-                        }
-
-                        this._itemBatch = null;
-                    }
-
-                    this._itemsToFetch = 0;
-
-                    this._listDataNotificationHandler.invalidateAll();
-                },
-
-                _processInsertion: function (item, previousHandle, nextHandle) {
-                    var groupPrev = this._handleMap[previousHandle],
-                        groupNext = this._handleMap[nextHandle],
-                        groupKey = null;
-
-                    if (groupPrev) {
-                        // If an item in a different group from groupPrev is being inserted after it, no need to discard groupPrev
-                        if (!groupPrev.lastReached || previousHandle !== groupPrev.lastItem.handle || (groupKey = this._groupKey(item)) === groupPrev.key) {
-                            this._releaseGroup(groupPrev);
-                        } else if (this._lastGroup === groupPrev) {
-                            this._lastGroup = null;
-                            this._count = null;
-                        }
-                        this._beginRefresh();
-                    }
-
-                    if (groupNext && groupNext !== groupPrev) {
-                        this._invalidateIndices(groupNext);
-
-                        // If an item in a different group from groupNext is being inserted before it, no need to discard groupNext
-                        if (!groupNext.firstReached || nextHandle !== groupNext.firstItem.handle || (groupKey !== null ? groupKey : this._groupKey(item)) === groupNext.key) {
-                            this._releaseGroup(groupNext);
-                        }
-                        this._beginRefresh();
-                    }
-                },
-
-                _processRemoval: function (handle) {
-                    var group = this._handleMap[handle];
-
-                    if (group && (handle === group.firstItem.handle || handle === group.lastItem.handle)) {
-                        this._releaseGroup(group);
-                        this._beginRefresh();
-                    } else if (this._itemBatch) {
-                        for (var i = 0; i < this._batchSize; i++) {
-                            var item = this._itemBatch[i];
-                            if (item && item.handle === handle) {
-                                this._beginRefresh();
-                                break;
-                            }
-                        }
-                    }
-                },
-
-                _inserted: function (itemPromise, previousHandle, nextHandle) {
-                    var that = this;
-                    itemPromise.then(function (item) {
-                        that._processInsertion(item, previousHandle, nextHandle);
-                    });
-                },
-
-                _changed: function (newItem, oldItem) {
-                    // A change to the first item could affect the group item
-                    var group = this._handleMap[newItem.handle];
-                    if (group && newItem.handle === group.firstItem.handle) {
-                        this._releaseGroup(group);
-                        this._beginRefresh();
-                    }
-
-                    // If the item is now in a different group, treat this as a move
-                    if (this._groupKey(newItem) !== this._groupKey(oldItem)) {
-                        this._listBinding.jumpToItem(newItem);
-                        var previousHandle = this._listBinding.previous().handle;
-                        this._listBinding.jumpToItem(newItem);
-                        var nextHandle = this._listBinding.next().handle;
-
-                        this._processRemoval(newItem.handle);
-                        this._processInsertion(newItem, previousHandle, nextHandle);
-                    }
-                },
-
-                _moved: function (itemPromise, previousHandle, nextHandle) {
-                    this._processRemoval(itemPromise.handle);
-
-                    var that = this;
-                    itemPromise.then(function (item) {
-                        that._processInsertion(item, previousHandle, nextHandle);
-                    });
-                },
-
-                _removed: function (handle, mirage) {
-                    // Mirage removals will just result in null items, which can be ignored
-                    if (!mirage) {
-                        this._processRemoval(handle);
-                    }
-                },
-
-                _indexChanged: function (handle, newIndex, oldIndex) {
-                    if (typeof oldIndex === "number") {
-                        this._indicesChanged = true;
-                    }
-                },
-
-                _endNotifications: function () {
-                    if (this._indicesChanged) {
-                        this._indicesChanged = false;
-
-                        // Update the group sizes
-                        for (var key in this._keyMap) {
-                            var group = this._keyMap[key];
-
-                            if (group.firstReached && group.lastReached) {
-                                var newSize = group.lastItem.index + 1 - group.firstItem.index;
-                                if (!isNaN(newSize)) {
-                                    group.size = newSize;
-                                }
-                            }
-                        }
-
-                        // Invalidate the client, since some firstItemIndexHint properties have probably changed
-                        this._beginRefresh();
-                    }
-                },
-
-                _reload: function () {
-                    this._initializeState();
-                    this._listDataNotificationHandler.reload();
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-
-            return _Base.Class.derive(VirtualizedDataSource.VirtualizedDataSource, function (listDataSource, groupKey, groupData, options) {
-                var groupDataAdapter = new GroupDataAdapter(listDataSource, groupKey, groupData, options);
-
-                this._baseDataSourceConstructor(groupDataAdapter);
-
-                this.extensions = {
-                    invalidateGroups: function () {
-                        groupDataAdapter.invalidateGroups();
-                    }
-                };
-            }, {
-                /* empty */
-            }, {
-                supportedForProcessing: false,
-            });
-        })
-
-    });
-
-});
-
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// Grouped Item Data Source
-
-define('WinJS/VirtualizedDataSource/_GroupedItemDataSource',[
-    '../Core/_Base',
-    './_GroupDataSource'
-    ], function groupedItemDataSourceInit(_Base, _GroupDataSource) {
-    "use strict";
-
-    _Base.Namespace.define("WinJS.UI", {
-
-        computeDataSourceGroups: function (listDataSource, groupKey, groupData, options) {
-            /// <signature helpKeyword="WinJS.UI.computeDataSourceGroups">
-            /// <summary locid="WinJS.UI.computeDataSourceGroups">
-            /// Returns a data source that adds group information to the items of another data source.  The "groups" property
-            /// of this data source evaluates to yet another data source that enumerates the groups themselves.
-            /// </summary>
-            /// <param name="listDataSource" type="VirtualizedDataSource" locid="WinJS.UI.computeDataSourceGroups_p:listDataSource">
-            /// The data source for the individual items to group.
-            /// </param>
-            /// <param name="groupKey" type="Function" locid="WinJS.UI.computeDataSourceGroups_p:groupKey">
-            /// A callback function that takes an item in the list as an argument. The function is called
-            /// for each item in the list and returns the group key for the item as a string.
-            /// </param>
-            /// <param name="groupData" type="Function" locid="WinJS.UI.computeDataSourceGroups_p:groupData">
-            /// A callback function that takes an item in the IListDataSource as an argument.
-            /// The function is called on one item in each group and returns
-            /// an object that represents the header of that group.
-            /// </param>
-            /// <param name="options" type="Object" locid="WinJS.UI.computeDataSourceGroups_p:options">
-            /// An object that can contain properties that specify additional options:
-            ///
-            /// groupCountEstimate:
-            /// A Number value that is the initial estimate for the number of groups. If you specify -1,
-            /// this function returns no result is until the actual number of groups
-            /// has been determined.
-            ///
-            /// batchSize:
-            /// A Number greater than 0 that specifies the number of items to fetch during each processing pass when
-            /// searching for groups. (In addition to the number specified, one item from the previous batch
-            /// is always included.)
-            /// </param>
-            /// <returns type="IListDataSource" locid="WinJS.UI.computeDataSourceGroups_returnValue">
-            /// An IListDataSource that contains the items in the original data source and provides additional
-            /// group info in a "groups" property. The "groups" property returns another
-            /// IListDataSource that enumerates the different groups in the list.
-            /// </returns>
-            /// </signature>
-
-            var groupedItemDataSource = Object.create(listDataSource);
-
-            function createGroupedItem(item) {
-                if (item) {
-                    var groupedItem = Object.create(item);
-
-                    groupedItem.groupKey = groupKey(item);
-
-                    if (groupData) {
-                        groupedItem.groupData = groupData(item);
-                    }
-
-                    return groupedItem;
-                } else {
-                    return null;
-                }
-            }
-
-            function createGroupedItemPromise(itemPromise) {
-                var groupedItemPromise = Object.create(itemPromise);
-
-                groupedItemPromise.then = function (onComplete, onError, onCancel) {
-                    return itemPromise.then(function (item) {
-                        return onComplete(createGroupedItem(item));
-                    }, onError, onCancel);
-                };
-
-                return groupedItemPromise;
-            }
-
-            groupedItemDataSource.createListBinding = function (notificationHandler) {
-                var groupedNotificationHandler;
-
-                if (notificationHandler) {
-                    groupedNotificationHandler = Object.create(notificationHandler);
-
-                    groupedNotificationHandler.inserted = function (itemPromise, previousHandle, nextHandle) {
-                        return notificationHandler.inserted(createGroupedItemPromise(itemPromise), previousHandle, nextHandle);
-                    };
-
-                    groupedNotificationHandler.changed = function (newItem, oldItem) {
-                        return notificationHandler.changed(createGroupedItem(newItem), createGroupedItem(oldItem));
-                    };
-
-                    groupedNotificationHandler.moved = function (itemPromise, previousHandle, nextHandle) {
-                        return notificationHandler.moved(createGroupedItemPromise(itemPromise), previousHandle, nextHandle);
-                    };
-                } else {
-                    groupedNotificationHandler = null;
-                }
-
-                var listBinding = listDataSource.createListBinding(groupedNotificationHandler),
-                    groupedItemListBinding = Object.create(listBinding);
-
-                var listBindingMethods = [
-                    "first",
-                    "last",
-                    "fromDescription",
-                    "jumpToItem",
-                    "current"
-                ];
-
-                for (var i = 0, len = listBindingMethods.length; i < len; i++) {
-                    (function (listBindingMethod) {
-                        if (listBinding[listBindingMethod]) {
-                            groupedItemListBinding[listBindingMethod] = function () {
-                                return createGroupedItemPromise(listBinding[listBindingMethod].apply(listBinding, arguments));
-                            };
-                        }
-                    })(listBindingMethods[i]);
-                }
-
-                // The following methods should be fast
-
-                if (listBinding.fromKey) {
-                    groupedItemListBinding.fromKey = function (key) {
-                        return createGroupedItemPromise(listBinding.fromKey(key));
-                    };
-                }
-
-                if (listBinding.fromIndex) {
-                    groupedItemListBinding.fromIndex = function (index) {
-                        return createGroupedItemPromise(listBinding.fromIndex(index));
-                    };
-                }
-
-                groupedItemListBinding.prev = function () {
-                    return createGroupedItemPromise(listBinding.prev());
-                };
-
-                groupedItemListBinding.next = function () {
-                    return createGroupedItemPromise(listBinding.next());
-                };
-
-                return groupedItemListBinding;
-            };
-
-            var listDataSourceMethods = [
-                "itemFromKey",
-                "itemFromIndex",
-                "itemFromDescription",
-                "insertAtStart",
-                "insertBefore",
-                "insertAfter",
-                "insertAtEnd",
-                "change",
-                "moveToStart",
-                "moveBefore",
-                "moveAfter",
-                "moveToEnd"
-                // remove does not return an itemPromise
-            ];
-
-            for (var i = 0, len = listDataSourceMethods.length; i < len; i++) {
-                (function (listDataSourceMethod) {
-                    if (listDataSource[listDataSourceMethod]) {
-                        groupedItemDataSource[listDataSourceMethod] = function () {
-                            return createGroupedItemPromise(listDataSource[listDataSourceMethod].apply(listDataSource, arguments));
-                        };
-                    }
-                })(listDataSourceMethods[i]);
-            }
-
-            ["addEventListener", "removeEventListener", "dispatchEvent"].forEach(function (methodName) {
-                if (listDataSource[methodName]) {
-                    groupedItemDataSource[methodName] = function () {
-                        return listDataSource[methodName].apply(listDataSource, arguments);
-                    };
-                }
-            });
-
-            var groupDataSource = null;
-
-            Object.defineProperty(groupedItemDataSource, "groups", {
-                get: function () {
-                    if (!groupDataSource) {
-                        groupDataSource = new _GroupDataSource._GroupDataSource(listDataSource, groupKey, groupData, options);
-                    }
-                    return groupDataSource;
-                },
-                enumerable: true,
-                configurable: true
-            });
-
-            return groupedItemDataSource;
-        }
-
-    });
-
-});
-
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// Storage Item Data Source
-
-define('WinJS/VirtualizedDataSource/_StorageDataSource',[
-    'exports',
-    '../Core/_WinRT',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_ErrorFromName',
-    '../Core/_WriteProfilerMark',
-    '../Animations',
-    '../Promise',
-    '../Utilities/_UI',
-    './_VirtualizedDataSourceImpl'
-    ], function storageDataSourceInit(exports, _WinRT, _Global, _Base, _ErrorFromName, _WriteProfilerMark, Animations, Promise, _UI, VirtualizedDataSource) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        StorageDataSource: _Base.Namespace._lazy(function () {
-            var StorageDataAdapter = _Base.Class.define(function StorageDataAdapter_ctor(query, options) {
-                // Constructor
-                _WriteProfilerMark("WinJS.UI.StorageDataSource:constructor,StartTM");
-
-                var mode = _WinRT.Windows.Storage.FileProperties.ThumbnailMode.singleItem,
-                    size = 256,
-                    flags = _WinRT.Windows.Storage.FileProperties.ThumbnailOptions.useCurrentScale,
-                    delayLoad = true,
-                    library;
-
-                if (query === "Pictures") {
-                    mode = _WinRT.Windows.Storage.FileProperties.ThumbnailMode.picturesView;
-                    library = _WinRT.Windows.Storage.KnownFolders.picturesLibrary;
-                    size = 190;
-                } else if (query === "Music") {
-                    mode = _WinRT.Windows.Storage.FileProperties.ThumbnailMode.musicView;
-                    library = _WinRT.Windows.Storage.KnownFolders.musicLibrary;
-                    size = 256;
-                } else if (query === "Documents") {
-                    mode = _WinRT.Windows.Storage.FileProperties.ThumbnailMode.documentsView;
-                    library = _WinRT.Windows.Storage.KnownFolders.documentsLibrary;
-                    size = 40;
-                } else if (query === "Videos") {
-                    mode = _WinRT.Windows.Storage.FileProperties.ThumbnailMode.videosView;
-                    library = _WinRT.Windows.Storage.KnownFolders.videosLibrary;
-                    size = 190;
-                }
-
-                if (!library) {
-                    this._query = query;
-                } else {
-                    var queryOptions = new _WinRT.Windows.Storage.Search.QueryOptions();
-                    queryOptions.folderDepth = _WinRT.Windows.Storage.Search.FolderDepth.deep;
-                    queryOptions.indexerOption = _WinRT.Windows.Storage.Search.IndexerOption.useIndexerWhenAvailable;
-                    this._query = library.createFileQueryWithOptions(queryOptions);
-                }
-
-                if (options) {
-                    if (typeof options.mode === "number") {
-                        mode = options.mode;
-                    }
-                    if (typeof options.requestedThumbnailSize === "number") {
-                        size = Math.max(1, Math.min(options.requestedThumbnailSize, 1024));
-                    } else {
-                        switch (mode) {
-                            case _WinRT.Windows.Storage.FileProperties.ThumbnailMode.picturesView:
-                            case _WinRT.Windows.Storage.FileProperties.ThumbnailMode.videosView:
-                                size = 190;
-                                break;
-                            case _WinRT.Windows.Storage.FileProperties.ThumbnailMode.documentsView:
-                            case _WinRT.Windows.Storage.FileProperties.ThumbnailMode.listView:
-                                size = 40;
-                                break;
-                            case _WinRT.Windows.Storage.FileProperties.ThumbnailMode.musicView:
-                            case _WinRT.Windows.Storage.FileProperties.ThumbnailMode.singleItem:
-                                size = 256;
-                                break;
-                        }
-                    }
-                    if (typeof options.thumbnailOptions === "number") {
-                        flags = options.thumbnailOptions;
-                    }
-                    if (typeof options.waitForFileLoad === "boolean") {
-                        delayLoad = !options.waitForFileLoad;
-                    }
-                }
-
-                this._loader = new _WinRT.Windows.Storage.BulkAccess.FileInformationFactory(this._query, mode, size, flags, delayLoad);
-                this.compareByIdentity = false;
-                this.firstDataRequest = true;
-                _WriteProfilerMark("WinJS.UI.StorageDataSource:constructor,StopTM");
-            }, {
-                // Public members
-
-                setNotificationHandler: function (notificationHandler) {
-                    this._notificationHandler = notificationHandler;
-                    this._query.addEventListener("contentschanged", function () {
-                        notificationHandler.invalidateAll();
-                    });
-                    this._query.addEventListener("optionschanged", function () {
-                        notificationHandler.invalidateAll();
-                    });
-                },
-
-                itemsFromEnd: function (count) {
-                    var that = this;
-                    _WriteProfilerMark("WinJS.UI.StorageDataSource:itemsFromEnd,info");
-                    return this.getCount().then(function (totalCount) {
-                        if (totalCount === 0) {
-                            return Promise.wrapError(new _ErrorFromName(_UI.FetchError.doesNotExist));
-                        }
-                        // Intentionally passing countAfter = 1 to go one over the end so that itemsFromIndex will
-                        // report the vector size since its known.
-                        return that.itemsFromIndex(totalCount - 1, Math.min(totalCount - 1, count - 1), 1);
-                    });
-                },
-
-                itemsFromIndex: function (index, countBefore, countAfter) {
-                    // don't allow more than 64 items to be retrieved at once
-                    if (countBefore + countAfter > 64) {
-                        countBefore = Math.min(countBefore, 32);
-                        countAfter = 64 - (countBefore + 1);
-                    }
-
-                    var first = (index - countBefore),
-                        count = (countBefore + 1 + countAfter);
-                    var that = this;
-                    // Fetch a minimum of 32 items on the first request for smoothness. Otherwise
-                    // listview displays 2 items first and then the rest of the page.
-                    if (that.firstDataRequest) {
-                        that.firstDataRequest = false;
-                        count = Math.max(count, 32);
-                    }
-                    function listener(ev) {
-                        that._notificationHandler.changed(that._item(ev.target));
-                    }
-
-                    var perfId = "WinJS.UI.StorageDataSource:itemsFromIndex(" + first + "-" + (first + count - 1) + ")";
-                    _WriteProfilerMark(perfId + ",StartTM");
-                    return this._loader.getItemsAsync(first, count).then(function (itemsVector) {
-                        var vectorSize = itemsVector.size;
-                        if (vectorSize <= countBefore) {
-                            return Promise.wrapError(new _ErrorFromName(_UI.FetchError.doesNotExist));
-                        }
-                        var items = new Array(vectorSize);
-                        var localItemsVector = new Array(vectorSize);
-                        itemsVector.getMany(0, localItemsVector);
-                        for (var i = 0; i < vectorSize; i++) {
-                            items[i] = that._item(localItemsVector[i]);
-                            localItemsVector[i].addEventListener("propertiesupdated", listener);
-                        }
-                        var result = {
-                            items: items,
-                            offset: countBefore,
-                            absoluteIndex: index
-                        };
-                        // set the totalCount only when we know it (when we retrieived fewer items than were asked for)
-                        if (vectorSize < count) {
-                            result.totalCount = first + vectorSize;
-                        }
-                        _WriteProfilerMark(perfId + ",StopTM");
-                        return result;
-                    });
-                },
-
-                itemsFromDescription: function (description, countBefore, countAfter) {
-                    var that = this;
-                    _WriteProfilerMark("WinJS.UI.StorageDataSource:itemsFromDescription,info");
-                    return this._query.findStartIndexAsync(description).then(function (index) {
-                        return that.itemsFromIndex(index, countBefore, countAfter);
-                    });
-                },
-
-                getCount: function () {
-                    _WriteProfilerMark("WinJS.UI.StorageDataSource:getCount,info");
-                    return this._query.getItemCountAsync();
-                },
-
-                itemSignature: function (item) {
-                    return item.folderRelativeId;
-                },
-
-                // compareByIdentity: set in constructor
-                // itemsFromStart: not implemented
-                // itemsFromKey: not implemented
-                // insertAtStart: not implemented
-                // insertBefore: not implemented
-                // insertAfter: not implemented
-                // insertAtEnd: not implemented
-                // change: not implemented
-                // moveToStart: not implemented
-                // moveBefore: not implemented
-                // moveAfter: not implemented
-                // moveToEnd: not implemented
-                // remove: not implemented
-
-                // Private members
-
-                _item: function (item) {
-                    return {
-                        key: item.path || item.folderRelativeId,
-                        data: item
-                    };
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-
-            return _Base.Class.derive(VirtualizedDataSource.VirtualizedDataSource, function (query, options) {
-                /// <signature helpKeyword="WinJS.UI.StorageDataSource">
-                /// <summary locid="WinJS.UI.StorageDataSource">
-                /// Creates a data source that enumerates an IStorageQueryResultBase.
-                /// </summary>
-                /// <param name="query" type="Windows.Storage.Search.IStorageQueryResultBase" locid="WinJS.UI.StorageDataSource_p:query">
-                /// The object to enumerate. It must support IStorageQueryResultBase.
-                /// </param>
-                /// <param name="options" mayBeNull="true" optional="true" type="Object" locid="WinJS.UI.StorageDataSource_p:options">
-                /// An object that specifies options for the data source. This parameter is optional. It can contain these properties:
-                ///
-                /// mode:
-                /// A Windows.Storage.FileProperties.ThumbnailMode - a value that specifies whether to request
-                /// thumbnails and the type of thumbnails to request.
-                ///
-                /// requestedThumbnailSize:
-                /// A Number that specifies the size of the thumbnails.
-                ///
-                /// thumbnailOptions:
-                /// A Windows.Storage.FileProperties.ThumbnailOptions value that specifies additional options for the thumbnails.
-                ///
-                /// waitForFileLoad:
-                /// If you set this to true, the data source returns items only after it loads their properties and thumbnails.
-                ///
-                /// </param>
-                /// </signature>
-                this._baseDataSourceConstructor(new StorageDataAdapter(query, options));
-            }, {
-                /* empty */
-            }, {
-                loadThumbnail: function (item, image) {
-                    /// <signature>
-                    /// <summary locid="WinJS.UI.StorageDataSource.loadThumbnail">
-                    /// Returns a promise for an image element that completes when the full quality thumbnail of the provided item is drawn to the
-                    /// image element.
-                    /// </summary>
-                    /// <param name="item" type="ITemplateItem" locid="WinJS.UI.StorageDataSource.loadThumbnail_p:item">
-                    /// The item to retrieve a thumbnail for.
-                    /// </param>
-                    /// <param name="image" type="Object" domElement="true" optional="true" locid="WinJS.UI.StorageDataSource.loadThumbnail_p:image">
-                    /// The image element to use. If not provided, a new image element is created.
-                    /// </param>
-                    /// </signature>
-                    var thumbnailUpdateHandler,
-                        thumbnailPromise,
-                        shouldRespondToThumbnailUpdate = false;
-
-                    return new Promise(function (complete) {
-                        // Load a thumbnail if it exists. The promise completes when a full quality thumbnail is visible.
-                        var tagSupplied = (image ? true : false);
-                        var processThumbnail = function (thumbnail) {
-                            if (thumbnail) {
-                                var url = _Global.URL.createObjectURL(thumbnail, {oneTimeOnly: true});
-
-                                // If this is the first version of the thumbnail we're loading, fade it in.
-                                if (!thumbnailPromise) {
-                                    thumbnailPromise = item.loadImage(url, image).then(function (image) {
-                                        // Wrapping the fadeIn call in a promise for the image returned by loadImage allows us to
-                                        // pipe the result of loadImage to further chained promises.  This is necessary because the
-                                        // image element provided to loadThumbnail is optional, and loadImage will create an image
-                                        // element if none is provided.
-                                        return item.isOnScreen().then(function (visible) {
-                                            var imagePromise;
-                                            if (visible && tagSupplied) {
-                                                imagePromise = Animations.fadeIn(image).then(function () {
-                                                    return image;
-                                                });
-                                            } else {
-                                                image.style.opacity = 1;
-                                                imagePromise = Promise.wrap(image);
-                                            }
-                                            return imagePromise;
-                                        });
-                                    });
-                                } else { // Otherwise, replace the existing version without animation.
-                                    thumbnailPromise = thumbnailPromise.then(function (image) {
-                                        return item.loadImage(url, image);
-                                    });
-                                }
-
-                                // If we have the full resolution thumbnail, we can cancel further updates and complete the promise
-                                // when current work is complete.
-                                if ((thumbnail.type !== _WinRT.Windows.Storage.FileProperties.ThumbnailType.icon) && !thumbnail.returnedSmallerCachedSize) {
-                                    _WriteProfilerMark("WinJS.UI.StorageDataSource:loadThumbnail complete,info");
-                                    item.data.removeEventListener("thumbnailupdated", thumbnailUpdateHandler);
-                                    shouldRespondToThumbnailUpdate = false;
-                                    thumbnailPromise = thumbnailPromise.then(function (image) {
-                                        thumbnailUpdateHandler = null;
-                                        thumbnailPromise = null;
-                                        complete(image);
-                                    });
-                                }
-                            }
-                        };
-
-                        thumbnailUpdateHandler = function (e) {
-                            // Ensure that a zombie update handler does not get invoked.
-                            if (shouldRespondToThumbnailUpdate) {
-                                processThumbnail(e.target.thumbnail);
-                            }
-                        };
-                        item.data.addEventListener("thumbnailupdated", thumbnailUpdateHandler);
-                        shouldRespondToThumbnailUpdate = true;
-
-                        // If we already have a thumbnail we should render it now.
-                        processThumbnail(item.data.thumbnail);
-                    }, function () {
-                        item.data.removeEventListener("thumbnailupdated", thumbnailUpdateHandler);
-                        shouldRespondToThumbnailUpdate = false;
-                        thumbnailUpdateHandler = null;
-                        if (thumbnailPromise) {
-                            thumbnailPromise.cancel();
-                            thumbnailPromise = null;
-                        }
-                    });
-                },
-
-                supportedForProcessing: false,
-            });
-        })
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/VirtualizedDataSource',[
-    './VirtualizedDataSource/_VirtualizedDataSourceImpl',
-    './VirtualizedDataSource/_GroupDataSource',
-    './VirtualizedDataSource/_GroupedItemDataSource',
-    './VirtualizedDataSource/_StorageDataSource'
-     ], function () {
-
-    //wrapper module
-});
-define('WinJS/Vui',["require", "exports", "./Core/_Global", "./Utilities/_ElementUtilities"], function (require, exports, _Global, _ElementUtilities) {
-    var Properties = {
-        vuiData: "_winVuiData"
-    };
-    var ClassNames = {
-        active: "win-vui-active",
-        disambiguation: "win-vui-disambiguation",
-    };
-    var EventNames = {
-        ListeningModeStateChanged: "ListeningStateChanged"
-    };
-    var ListeningModeStates = {
-        active: "active",
-        disambiguation: "disambiguation",
-        inactive: "inactive",
-    };
-    function _handleListeningModeStateChanged(e) {
-        if (e.defaultPrevented) {
-            return;
-        }
-        var target = e.target;
-        var transitionHandler = Handlers[target.tagName];
-        if (!transitionHandler) {
-            return;
-        }
-        switch (e.state) {
-            case ListeningModeStates.active:
-                if (target[Properties.vuiData] || _ElementUtilities.hasClass(target, ClassNames.active)) {
-                    _ElementUtilities.removeClass(target, ClassNames.disambiguation);
-                    transitionHandler.reactivate(target, e.label);
-                }
-                else {
-                    _ElementUtilities.addClass(target, ClassNames.active);
-                    transitionHandler.activate(target, e.label);
-                }
-                break;
-            case ListeningModeStates.disambiguation:
-                _ElementUtilities.addClass(target, ClassNames.active);
-                _ElementUtilities.addClass(target, ClassNames.disambiguation);
-                transitionHandler.disambiguate(target, e.label);
-                break;
-            case ListeningModeStates.inactive:
-                _ElementUtilities.removeClass(target, ClassNames.active);
-                _ElementUtilities.removeClass(target, ClassNames.disambiguation);
-                transitionHandler.deactivate(target);
-                break;
-        }
-    }
-    var Handlers;
-    (function (Handlers) {
-        Handlers.BUTTON = {
-            activate: function (element, label) {
-                var vuiData = {
-                    nodes: [],
-                    width: element.style.width,
-                    height: element.style.height
-                };
-                // Freeze button size
-                var cs = _ElementUtilities._getComputedStyle(element);
-                element.style.width = cs.width;
-                element.style.height = cs.height;
-                while (element.childNodes.length) {
-                    vuiData.nodes.push(element.removeChild(element.childNodes[0]));
-                }
-                element[Properties.vuiData] = vuiData;
-                element.textContent = label;
-            },
-            disambiguate: function (element, label) {
-                element.textContent = label;
-            },
-            reactivate: function (element, label) {
-                element.textContent = label;
-            },
-            deactivate: function (element) {
-                element.innerHTML = "";
-                var vuiData = element[Properties.vuiData];
-                element.style.width = vuiData.width;
-                element.style.height = vuiData.height;
-                vuiData.nodes.forEach(function (node) { return element.appendChild(node); });
-                delete element[Properties.vuiData];
-            }
-        };
-    })(Handlers || (Handlers = {}));
-    if (_Global.document) {
-        _Global.document.addEventListener(EventNames.ListeningModeStateChanged, _handleListeningModeStateChanged);
-    }
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/_Accents',["require", "exports", "./Core/_Global", "./Core/_WinRT", "./Core/_Base", "./Core/_BaseUtils", './Utilities/_ElementUtilities'], function (require, exports, _Global, _WinRT, _Base, _BaseUtils, _ElementUtilities) {
-    var Constants = {
-        accentStyleId: "WinJSAccentsStyle",
-        themeDetectionTag: "winjs-themedetection-tag",
-        hoverSelector: "html.win-hoverable",
-        lightThemeSelector: ".win-ui-light",
-        darkThemeSelector: ".win-ui-dark"
-    };
-    var CSSSelectorTokens = [".", "#", ":"];
-    var UISettings = null;
-    var colors = [];
-    var isDarkTheme = false;
-    var rules = [];
-    var writeRulesTOHandle = -1;
-    // Public APIs
-    //
-    // Enum values align with the colors array indices
-    (function (ColorTypes) {
-        ColorTypes[ColorTypes["accent"] = 0] = "accent";
-        ColorTypes[ColorTypes["listSelectRest"] = 1] = "listSelectRest";
-        ColorTypes[ColorTypes["listSelectHover"] = 2] = "listSelectHover";
-        ColorTypes[ColorTypes["listSelectPress"] = 3] = "listSelectPress";
-        ColorTypes[ColorTypes["_listSelectRestInverse"] = 4] = "_listSelectRestInverse";
-        ColorTypes[ColorTypes["_listSelectHoverInverse"] = 5] = "_listSelectHoverInverse";
-        ColorTypes[ColorTypes["_listSelectPressInverse"] = 6] = "_listSelectPressInverse";
-    })(exports.ColorTypes || (exports.ColorTypes = {}));
-    var ColorTypes = exports.ColorTypes;
-    function createAccentRule(selector, props) {
-        rules.push({ selector: selector, props: props });
-        scheduleWriteRules();
-    }
-    exports.createAccentRule = createAccentRule;
-    // Private helpers
-    //
-    function scheduleWriteRules() {
-        if (rules.length === 0 || writeRulesTOHandle !== -1) {
-            return;
-        }
-        writeRulesTOHandle = _BaseUtils._setImmediate(function () {
-            writeRulesTOHandle = -1;
-            cleanup();
-            var inverseThemeSelector = isDarkTheme ? Constants.lightThemeSelector : Constants.darkThemeSelector;
-            var inverseThemeHoverSelector = Constants.hoverSelector + " " + inverseThemeSelector;
-            var style = _Global.document.createElement("style");
-            style.id = Constants.accentStyleId;
-            style.textContent = rules.map(function (rule) {
-                // example rule: { selector: "  .foo,   html.win-hoverable   .bar:hover ,  div:hover  ", props: [{ name: "color", value: 0 }, { name: "background-color", value: 1 } }
-                var body = "  " + rule.props.map(function (prop) { return prop.name + ": " + colors[prop.value] + ";"; }).join("\n  ");
-                // body = color: *accent*; background-color: *listSelectHover*
-                var selectorSplit = rule.selector.split(",").map(function (str) { return sanitizeSpaces(str); }); // [".foo", ".bar:hover", "div"]
-                var selector = selectorSplit.join(",\n"); // ".foo, html.win-hoverable .bar:hover, div:hover"
-                var css = selector + " {\n" + body + "\n}";
-                // css = .foo, html.win-hoverable .bar:hover, div:hover { *body* }
-                // Inverse Theme Selectors
-                var isThemedColor = rule.props.some(function (prop) { return prop.value !== 0 /* accent */; });
-                if (isThemedColor) {
-                    var inverseBody = "  " + rule.props.map(function (prop) { return prop.name + ": " + colors[(prop.value ? (prop.value + 3) : prop.value)] + ";"; }).join("\n  ");
-                    // inverseBody = "color: *accent*; background-color: *listSelectHoverInverse"
-                    var themedSelectors = [];
-                    selectorSplit.forEach(function (sel) {
-                        if (sel.indexOf(Constants.hoverSelector) !== -1 && sel.indexOf(inverseThemeHoverSelector) === -1) {
-                            themedSelectors.push(sel.replace(Constants.hoverSelector, inverseThemeHoverSelector));
-                            var selWithoutHover = sel.replace(Constants.hoverSelector, "").trim();
-                            if (CSSSelectorTokens.indexOf(selWithoutHover[0]) !== -1) {
-                                themedSelectors.push(sel.replace(Constants.hoverSelector + " ", inverseThemeHoverSelector));
-                            }
-                        }
-                        else {
-                            themedSelectors.push(inverseThemeSelector + " " + sel);
-                            if (CSSSelectorTokens.indexOf(sel[0]) !== -1) {
-                                themedSelectors.push(inverseThemeSelector + sel);
-                            }
-                        }
-                        css += "\n" + themedSelectors.join(",\n") + " {\n" + inverseBody + "\n}";
-                    });
-                }
-                return css;
-            }).join("\n");
-            _Global.document.head.appendChild(style);
-        });
-    }
-    function handleColorsChanged() {
-        var UIColorType = _WinRT.Windows.UI.ViewManagement.UIColorType;
-        var uiColor = UISettings.getColorValue(_WinRT.Windows.UI.ViewManagement.UIColorType.accent);
-        var accent = colorToString(uiColor, 1);
-        if (colors[0] === accent) {
-            return;
-        }
-        // Establish colors
-        // The order of the colors align with the ColorTypes enum values
-        colors.length = 0;
-        colors.push(accent, colorToString(uiColor, (isDarkTheme ? 0.6 : 0.4)), colorToString(uiColor, (isDarkTheme ? 0.8 : 0.6)), colorToString(uiColor, (isDarkTheme ? 0.9 : 0.7)), colorToString(uiColor, (isDarkTheme ? 0.4 : 0.6)), colorToString(uiColor, (isDarkTheme ? 0.6 : 0.8)), colorToString(uiColor, (isDarkTheme ? 0.7 : 0.9)));
-        scheduleWriteRules();
-    }
-    function colorToString(color, alpha) {
-        return "rgba(" + color.r + "," + color.g + "," + color.b + "," + alpha + ")";
-    }
-    function sanitizeSpaces(str) {
-        return str.replace(/  /g, " ").replace(/  /g, " ").trim();
-    }
-    function cleanup() {
-        var style = _Global.document.head.querySelector("#" + Constants.accentStyleId);
-        style && style.parentNode.removeChild(style);
-    }
-    function _reset() {
-        rules.length = 0;
-        cleanup();
-    }
-    // Module initialization
-    //
-    // Figure out color theme
-    var tag = _Global.document.createElement(Constants.themeDetectionTag);
-    _Global.document.head.appendChild(tag);
-    var cs = _ElementUtilities._getComputedStyle(tag);
-    isDarkTheme = cs.opacity === "0";
-    tag.parentElement.removeChild(tag);
-    try {
-        UISettings = new _WinRT.Windows.UI.ViewManagement.UISettings();
-        UISettings.addEventListener("colorvalueschanged", handleColorsChanged);
-        handleColorsChanged();
-    }
-    catch (e) {
-        // No WinRT - use hardcoded blue accent color
-        // The order of the colors align with the ColorTypes enum values
-        colors.push("rgb(0, 120, 215)", "rgba(0, 120, 215, " + (isDarkTheme ? "0.6" : "0.4") + ")", "rgba(0, 120, 215, " + (isDarkTheme ? "0.8" : "0.6") + ")", "rgba(0, 120, 215, " + (isDarkTheme ? "0.9" : "0.7") + ")", "rgba(0, 120, 215, " + (isDarkTheme ? "0.4" : "0.6") + ")", "rgba(0, 120, 215, " + (isDarkTheme ? "0.6" : "0.8") + ")", "rgba(0, 120, 215, " + (isDarkTheme ? "0.7" : "0.9") + ")");
-    }
-    // Publish to WinJS namespace
-    var toPublish = {
-        ColorTypes: ColorTypes,
-        createAccentRule: createAccentRule,
-        // Exposed for tests    
-        _colors: colors,
-        _reset: _reset,
-        _isDarkTheme: isDarkTheme
-    };
-    _Base.Namespace.define("WinJS.UI._Accents", toPublish);
-});
-
-define('require-style',{load: function(id){throw new Error("Dynamic load not allowed: " + id);}});
-
-define('require-style!less/styles-intrinsic',[],function(){});
-
-define('require-style!less/colors-intrinsic',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/IntrinsicControls',[
-    '../Utilities/_Hoverable',
-    '../_Accents',
-    'require-style!less/styles-intrinsic',
-    'require-style!less/colors-intrinsic'
-], function (_Hoverable, _Accents) {
-    "use strict";
-
-    // Shared color rule 
-    _Accents.createAccentRule(
-        ".win-link,\
-         .win-progress-bar,\
-         .win-progress-ring,\
-         .win-ring",
-        [{ name: "color", value: _Accents.ColorTypes.accent }]);
-
-    // Shared background-color rule
-    _Accents.createAccentRule(
-        "::selection,\
-         .win-button.win-button-primary,\
-         .win-dropdown option:checked,\
-         select[multiple].win-dropdown option:checked",
-        [{ name: "background-color", value: _Accents.ColorTypes.accent }]);
-
-    // Shared border-color rule
-    _Accents.createAccentRule(
-        ".win-textbox:focus,\
-         .win-textarea:focus,\
-         .win-textbox:focus:hover,\
-         .win-textarea:focus:hover",
-        [{ name: "border-color", value: _Accents.ColorTypes.accent }]);
-
-    // Edge-specific color rule
-    _Accents.createAccentRule(
-        ".win-textbox::-ms-clear:hover:not(:active),\
-         .win-textbox::-ms-reveal:hover:not(:active)",
-        [{ name: "color", value: _Accents.ColorTypes.accent }]);
-
-    // Edge-specific background-color rule
-    _Accents.createAccentRule(
-        ".win-checkbox:checked::-ms-check,\
-         .win-textbox::-ms-clear:active,\
-         .win-textbox::-ms-reveal:active",
-        [{ name: "background-color", value: _Accents.ColorTypes.accent }]);
-
-    // Webkit-specific background-color rule
-    _Accents.createAccentRule(
-        ".win-progress-bar::-webkit-progress-value,\
-         .win-progress-ring::-webkit-progress-value,\
-         .win-ring::-webkit-progress-value",
-        [{ name: "background-color", value: _Accents.ColorTypes.accent }]);
-
-    // Mozilla-specific background-color rule
-    _Accents.createAccentRule(
-        ".win-progress-bar:not(:indeterminate)::-moz-progress-bar,\
-         .win-progress-ring:not(:indeterminate)::-moz-progress-bar,\
-         .win-ring:not(:indeterminate)::-moz-progress-bar",
-        [{ name: "background-color", value: _Accents.ColorTypes.accent }]);
-
-    // Edge-specific border-color rule
-    _Accents.createAccentRule(
-        ".win-checkbox:indeterminate::-ms-check,\
-         .win-checkbox:hover:indeterminate::-ms-check,\
-         .win-radio:checked::-ms-check",
-        [{ name: "border-color", value: _Accents.ColorTypes.accent }]);
-
-
-    // Note the use of background instead of background-color
-    // FF slider styling doesn't work with background-color
-    // so using background for everything here for consistency
-
-    // Edge-specific background rule
-    _Accents.createAccentRule(
-        ".win-slider::-ms-thumb,\
-         .win-slider::-ms-fill-lower", /* Fill-Lower only supported in IE */
-        [{ name: "background", value: _Accents.ColorTypes.accent }]);
-
-    // Webkit-specific background rule
-    _Accents.createAccentRule(
-        ".win-slider::-webkit-slider-thumb",
-        [{ name: "background", value: _Accents.ColorTypes.accent }]);
-
-    // Mozilla-specific background rule
-    _Accents.createAccentRule(
-        ".win-slider::-moz-range-thumb",
-        [{ name: "background", value: _Accents.ColorTypes.accent }]);
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <reference path="../../Core.d.ts" />
-define('WinJS/Controls/ElementResizeInstrument/_ElementResizeInstrument',["require", "exports", "../../Core/_BaseUtils", '../../Core/_Base', '../../Core/_Global', '../../Core/_Log', "../../Core/_ErrorFromName", "../../Core/_Events", '../../Promise', '../../Utilities/_ElementUtilities'], function (require, exports, _BaseUtils, _Base, _Global, _Log, _ErrorFromName, _Events, Promise, _ElementUtilities) {
-    "use strict";
-    // We will style the _ElementResizeInstrument element to have the same height and width as it's nearest positioned ancestor.
-    var styleText = 'display: block;' + 'position:absolute;' + 'top: 0;' + 'left: 0;' + 'height: 100%;' + 'width: 100%;' + 'overflow: hidden;' + 'pointer-events: none;' + 'z-index: -1;';
-    var className = "win-resizeinstrument";
-    var objData = "about:blank";
-    var eventNames = {
-        /**
-         * Fires when the _ElementResizeInstrument has detected a size change in the monitored ancestor element.
-        **/
-        resize: "resize",
-        /**
-         * Fires when the internal <object> element has finished loading and we have added our own "resize" listener to its contentWindow.
-         * Used by unit tests.
-        **/
-        _ready: "_ready",
-    };
-    // Name of the <object> contentWindow event we listen to.
-    var contentWindowResizeEvent = "resize";
-    // Determine if the browser environment is IE or Edge.
-    // "msHightContrastAdjust" is availble in IE10+
-    var isMS = ("msHighContrastAdjust" in document.documentElement.style);
-    /**
-     * Creates a hidden <object> instrumentation element that is used to automatically generate and handle "resize" events whenever the nearest
-     * positioned ancestor element has its size changed. Add the instrumented element to the DOM of the element you want to generate-and-handle
-     * "resize" events for. The computed style.position of the ancestor element must be positioned and therefore may not be "static".
-    **/
-    var _ElementResizeInstrument = (function () {
-        function _ElementResizeInstrument() {
-            var _this = this;
-            this._disposed = false;
-            this._elementLoaded = false;
-            this._running = false;
-            this._objectWindowResizeHandlerBound = this._objectWindowResizeHandler.bind(this);
-            var objEl = _Global.document.createElement("OBJECT");
-            objEl.setAttribute('style', styleText);
-            if (isMS) {
-                // <object> element shows an outline visual that can't be styled away in MS browsers.
-                // Using visibility hidden everywhere will stop some browsers from sending resize events, 
-                // but we can use is in MS browsers to achieve the visual we want without losing resize events.
-                objEl.style.visibility = "hidden";
-            }
-            else {
-                // Some browsers like iOS and Safari will never load the <object> element's content window
-                // if the <object> element is in the DOM before its data property was set. 
-                // IE and Edge on the other hand are the exact opposite and won't ever load unless you append the 
-                // element to the DOM before the data property was set.  We expect a later call to addedToDom() will 
-                // set the data property after the element is in the DOM for IE and Edge.
-                objEl.data = objData;
-            }
-            objEl.type = 'text/html';
-            objEl['winControl'] = this;
-            _ElementUtilities.addClass(objEl, className);
-            _ElementUtilities.addClass(objEl, "win-disposable");
-            this._element = objEl;
-            this._elementLoadPromise = new Promise(function (c) {
-                objEl.onload = function () {
-                    if (!_this._disposed) {
-                        _this._elementLoaded = true;
-                        _this._objWindow.addEventListener(contentWindowResizeEvent, _this._objectWindowResizeHandlerBound);
-                        c();
-                    }
-                };
-            });
-        }
-        Object.defineProperty(_ElementResizeInstrument.prototype, "element", {
-            get: function () {
-                return this._element;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(_ElementResizeInstrument.prototype, "_objWindow", {
-            // Getter for the <object>'s contentWindow.
-            get: function () {
-                // Property may be undefined if the element hasn't loaded yet.
-                // Property may be undefined in Safari if the element has been removed from the DOM.
-                // https://bugs.webkit.org/show_bug.cgi?id=149251
-                // Return the contentWindow if it exists, else null.
-                // If the <object> element hasn't loaded yet, some browsers will throw an exception if you try to read the contentDocument property.
-                return this._elementLoaded && this._element.contentDocument && this._element.contentDocument.defaultView || null;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        _ElementResizeInstrument.prototype.addedToDom = function () {
-            var _this = this;
-            // _ElementResizeInstrument should block on firing any events until the Object element has loaded and the _ElementResizeInstrument addedToDom() API has been called.
-            // The former is required in order to allow us to get a handle to hook the resize event of the <object> element's content window.
-            // The latter is for cross browser consistency. Some browsers will load the <object> element sync or async as soon as its added to the DOM. 
-            // Other browsers will not load the element until it is added to the DOM and the data property has been set on the <object>. If the element
-            // hasn't already loaded when addedToDom is called, we can set the data property to kickstart the loading process. The function is only expected to be called once.
-            if (!this._disposed) {
-                var objEl = this.element;
-                if (!_Global.document.body.contains(objEl)) {
-                    throw new _ErrorFromName("WinJS.UI._ElementResizeInstrument", "ElementResizeInstrument initialization failed");
-                }
-                else {
-                    if (_Log.log && _ElementUtilities._getComputedStyle(objEl.parentElement).position === "static") {
-                        // Notify if the parentElement is not positioned. It is expected that the _ElementResizeInstrument will 
-                        // be an immediate child of the element it wants to monitor for size changes.
-                        _Log.log("_ElementResizeInstrument can only detect size changes that are made to it's nearest positioned ancestor. " + "Its parent element is not currently positioned.");
-                    }
-                    if (!this._elementLoaded && isMS) {
-                        // If we're in the DOM and the element hasn't loaded yet, some browsers require setting the data property first, 
-                        // in order to trigger the <object> load event. We MUST only do this after the element has been added to the DOM, 
-                        // otherwise IE10, IE11 & Edge will NEVER fire the load event no matter what else is done to the <object> element 
-                        // or its properties.
-                        objEl.data = "about:blank";
-                    }
-                    this._elementLoadPromise.then(function () {
-                        // Once the element has loaded and addedToDom has been called, we can fire our private "_ready" event.
-                        _this._running = true;
-                        _this.dispatchEvent(eventNames._ready, null);
-                        // The _ElementResizeInstrument uses an <object> element and its contentWindow to detect resize events in whichever element the 
-                        // _ElementResizeInstrument is appended to. Some browsers will fire an async "resize" event for the <object> element automatically when 
-                        // it gets added to the DOM, others won't. In both cases it is up to the _ElementResizeHandler to make sure that exactly one async "resize" 
-                        // is always fired in all browsers. 
-                        // If we don't see a resize event from the <object> contentWindow within 50ms, assume this environment won't fire one and dispatch our own.
-                        var initialResizeTimeout = Promise.timeout(50);
-                        var handleInitialResize = function () {
-                            _this.removeEventListener(eventNames.resize, handleInitialResize);
-                            initialResizeTimeout.cancel();
-                        };
-                        _this.addEventListener(eventNames.resize, handleInitialResize);
-                        initialResizeTimeout.then(function () {
-                            _this._objectWindowResizeHandler();
-                        });
-                    });
-                }
-            }
-        };
-        _ElementResizeInstrument.prototype.dispose = function () {
-            if (!this._disposed) {
-                this._disposed = true;
-                // Cancel loading state
-                this._elementLoadPromise.cancel();
-                // Unhook loaded state
-                if (this._objWindow) {
-                    // If we had already loaded and can still get a reference to the contentWindow,
-                    // unhook our listener from the <object>'s contentWindow to reduce any future noise.
-                    this._objWindow.removeEventListener.call(this._objWindow, contentWindowResizeEvent, this._objectWindowResizeHandlerBound);
-                }
-                // Turn off running state
-                this._running = false;
-            }
-        };
-        /**
-         * Adds an event listener to the control.
-         * @param type The type (name) of the event.
-         * @param listener The listener to invoke when the event gets raised.
-         * @param useCapture If true, initiates capture, otherwise false.
-        **/
-        _ElementResizeInstrument.prototype.addEventListener = function (type, listener, useCapture) {
-            // Implementation will be provided by _Events.eventMixin
-        };
-        /**
-         * Raises an event of the specified type and with the specified additional properties.
-         * @param type The type (name) of the event.
-         * @param eventProperties The set of additional properties to be attached to the event object when the event is raised.
-         * @returns true if preventDefault was called on the event.
-        **/
-        _ElementResizeInstrument.prototype.dispatchEvent = function (type, eventProperties) {
-            // Implementation will be provided by _Events.eventMixin
-            return false;
-        };
-        /**
-         * Removes an event listener from the control.
-         * @param type The type (name) of the event.
-         * @param listener The listener to remove.
-         * @param useCapture true if capture is to be initiated, otherwise false.
-        **/
-        _ElementResizeInstrument.prototype.removeEventListener = function (type, listener, useCapture) {
-            // Implementation will be provided by _Events.eventMixin
-        };
-        _ElementResizeInstrument.prototype._objectWindowResizeHandler = function () {
-            var _this = this;
-            if (this._running) {
-                this._batchResizeEvents(function () {
-                    _this._fireResizeEvent();
-                });
-            }
-        };
-        _ElementResizeInstrument.prototype._batchResizeEvents = function (handleResizeFn) {
-            // Use requestAnimationFrame to batch consecutive resize events.
-            if (this._pendingResizeAnimationFrameId) {
-                _BaseUtils._cancelAnimationFrame(this._pendingResizeAnimationFrameId);
-            }
-            this._pendingResizeAnimationFrameId = _BaseUtils._requestAnimationFrame(function () {
-                handleResizeFn();
-            });
-        };
-        _ElementResizeInstrument.prototype._fireResizeEvent = function () {
-            if (!this._disposed) {
-                this.dispatchEvent(eventNames.resize, null);
-            }
-        };
-        _ElementResizeInstrument.EventNames = eventNames;
-        return _ElementResizeInstrument;
-    })();
-    exports._ElementResizeInstrument = _ElementResizeInstrument;
-    // addEventListener, removeEventListener, dispatchEvent
-    _Base.Class.mix(_ElementResizeInstrument, _Events.eventMixin);
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <reference path="../../../../typings/require.d.ts" />
-define('WinJS/Controls/ElementResizeInstrument',["require", "exports"], function (require, exports) {
-    var module = null;
-    function getModule() {
-        if (!module) {
-            require(["./ElementResizeInstrument/_ElementResizeInstrument"], function (m) {
-                module = m;
-            });
-        }
-        return module._ElementResizeInstrument;
-    }
-    var publicMembers = Object.create({}, {
-        _ElementResizeInstrument: {
-            get: function () {
-                return getModule();
-            }
-        }
-    });
-    return publicMembers;
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ItemContainer/_Constants',[
-    'exports',
-    '../../Core/_Base'
-    ], function constantsInit(exports, _Base) {
-    "use strict";
-
-    var members = {};
-    members._listViewClass = "win-listview";
-    members._viewportClass = "win-viewport";
-    members._rtlListViewClass = "win-rtl";
-    members._horizontalClass = "win-horizontal";
-    members._verticalClass = "win-vertical";
-    members._scrollableClass = "win-surface";
-    members._itemsContainerClass = "win-itemscontainer";
-    members._listHeaderContainerClass = "win-headercontainer";
-    members._listFooterContainerClass = "win-footercontainer";
-    members._padderClass = "win-itemscontainer-padder";
-    members._proxyClass = "_win-proxy";
-    members._itemClass = "win-item";
-    members._itemBoxClass = "win-itembox";
-    members._itemsBlockClass = "win-itemsblock";
-    members._containerClass = "win-container";
-    members._containerEvenClass = "win-container-even";
-    members._containerOddClass = "win-container-odd";
-    members._backdropClass = "win-backdrop";
-    members._footprintClass = "win-footprint";
-    members._groupsClass = "win-groups";
-    members._selectedClass = "win-selected";
-    members._selectionBorderClass = "win-selectionborder";
-    members._selectionBackgroundClass = "win-selectionbackground";
-    members._selectionCheckmarkClass = "win-selectioncheckmark";
-    members._selectionCheckmarkBackgroundClass = "win-selectioncheckmarkbackground";
-    members._pressedClass = "win-pressed";
-    members._headerClass = "win-groupheader";
-    members._headerContainerClass = "win-groupheadercontainer";
-    members._groupLeaderClass = "win-groupleader";
-    members._progressClass = "win-progress";
-    members._revealedClass = "win-revealed";
-    members._itemFocusClass = "win-focused";
-    members._itemFocusOutlineClass = "win-focusedoutline";
-    members._zoomingXClass = "win-zooming-x";
-    members._zoomingYClass = "win-zooming-y";
-    members._listLayoutClass = "win-listlayout";
-    members._gridLayoutClass = "win-gridlayout";
-    members._headerPositionTopClass = "win-headerpositiontop";
-    members._headerPositionLeftClass = "win-headerpositionleft";
-    members._structuralNodesClass = "win-structuralnodes";
-    members._singleItemsBlockClass = "win-single-itemsblock";
-    members._uniformGridLayoutClass = "win-uniformgridlayout";
-    members._uniformListLayoutClass = "win-uniformlistlayout";
-    members._cellSpanningGridLayoutClass = "win-cellspanninggridlayout";
-    members._laidOutClass = "win-laidout";
-    members._nonDraggableClass = "win-nondraggable";
-    members._nonSelectableClass = "win-nonselectable";
-    members._dragOverClass = "win-dragover";
-    members._dragSourceClass = "win-dragsource";
-    members._clipClass = "win-clip";
-    members._selectionModeClass = "win-selectionmode";
-    members._noCSSGrid = "win-nocssgrid";
-    members._hidingSelectionMode = "win-hidingselectionmode";
-    members._hidingSelectionModeAnimationTimeout = 250;
-
-    members._INVALID_INDEX = -1;
-    members._UNINITIALIZED = -1;
-
-    members._LEFT_MSPOINTER_BUTTON = 0;
-    members._RIGHT_MSPOINTER_BUTTON = 2;
-
-    members._TAP_END_THRESHOLD = 10;
-
-    members._DEFAULT_PAGES_TO_LOAD = 5;
-    members._DEFAULT_PAGE_LOAD_THRESHOLD = 2;
-
-    members._MIN_AUTOSCROLL_RATE = 150;
-    members._MAX_AUTOSCROLL_RATE = 1500;
-    members._AUTOSCROLL_THRESHOLD = 100;
-    members._AUTOSCROLL_DELAY = 50;
-
-    members._DEFERRED_ACTION = 250;
-    members._DEFERRED_SCROLL_END = 250;
-
-    members._SELECTION_CHECKMARK = "\uE081";
-
-    members._LISTVIEW_PROGRESS_DELAY = 2000;
-
-    var ScrollToPriority = {
-        uninitialized: 0,
-        low: 1,             // used by layoutSite.invalidateLayout, forceLayout, _processReload, _update and _onElementResize - operations that preserve the scroll position
-        medium: 2,          // used by dataSource change, layout change and etc - operations that reset the scroll position to 0
-        high: 3             // used by indexOfFirstVisible, ensureVisible, scrollPosition - operations in which the developer explicitly sets the scroll position
-    };
-
-    var ViewChange = {
-        rebuild: 0,
-        remeasure: 1,
-        relayout: 2,
-        realize: 3
-    };
-
-    members._ScrollToPriority = ScrollToPriority;
-    members._ViewChange = ViewChange;
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", members);
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ItemContainer/_ItemEventsHandler',[
-    'exports',
-    '../../Core/_Global',
-    '../../Core/_WinRT',
-    '../../Core/_Base',
-    '../../Core/_BaseUtils',
-    '../../Core/_WriteProfilerMark',
-    '../../Animations',
-    '../../Animations/_TransitionAnimation',
-    '../../Promise',
-    '../../Utilities/_ElementUtilities',
-    '../../Utilities/_UI',
-    './_Constants'
-], function itemEventsHandlerInit(exports, _Global, _WinRT, _Base, _BaseUtils, _WriteProfilerMark, Animations, _TransitionAnimation, Promise, _ElementUtilities, _UI, _Constants) {
-    "use strict";
-
-    var transformNames = _BaseUtils._browserStyleEquivalents["transform"];
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        // Expose these to the unit tests
-        _ItemEventsHandler: _Base.Namespace._lazy(function () {
-            var PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || "touch";
-
-            function createNodeWithClass(className, skipAriaHidden) {
-                var element = _Global.document.createElement("div");
-                element.className = className;
-                if (!skipAriaHidden) {
-                    element.setAttribute("aria-hidden", true);
-                }
-                return element;
-            }
-
-            var ItemEventsHandler = _Base.Class.define(function ItemEventsHandler_ctor(site) {
-                this._site = site;
-
-                this._work = [];
-                this._animations = {};
-            }, {
-                dispose: function () {
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._disposed = true;
-                    _ElementUtilities._removeEventListener(_Global, "pointerup", this._resetPointerDownStateBound);
-                    _ElementUtilities._removeEventListener(_Global, "pointercancel", this._resetPointerDownStateBound);
-                },
-
-                onPointerDown: function ItemEventsHandler_onPointerDown(eventObject) {
-                    _WriteProfilerMark("WinJS.UI._ItemEventsHandler:MSPointerDown,StartTM");
-                    var site = this._site,
-                        touchInput = (eventObject.pointerType === PT_TOUCH),
-                        leftButton,
-                        rightButton;
-                    site.pressedElement = eventObject.target;
-                    if (_WinRT.Windows.UI.Input.PointerPoint) {
-                        // xButton is true when you've x-clicked with a mouse or pen. Otherwise it is false.
-                        var currentPoint = this._getCurrentPoint(eventObject);
-                        var pointProps = currentPoint.properties;
-                        if (!(touchInput || pointProps.isInverted || pointProps.isEraser || pointProps.isMiddleButtonPressed)) {
-                            rightButton = pointProps.isRightButtonPressed;
-                            leftButton = !rightButton && pointProps.isLeftButtonPressed;
-                        } else {
-                            leftButton = rightButton = false;
-                        }
-                    } else {
-                        // xButton is true when you've x-clicked with a mouse. Otherwise it is false.
-                        leftButton = (eventObject.button === _Constants._LEFT_MSPOINTER_BUTTON);
-                        rightButton = (eventObject.button === _Constants._RIGHT_MSPOINTER_BUTTON);
-                    }
-
-                    this._DragStartBound = this._DragStartBound || this.onDragStart.bind(this);
-                    this._PointerEnterBound = this._PointerEnterBound || this.onPointerEnter.bind(this);
-                    this._PointerLeaveBound = this._PointerLeaveBound || this.onPointerLeave.bind(this);
-
-                    var isInteractive = this._isInteractive(eventObject.target),
-                        currentPressedIndex = site.indexForItemElement(eventObject.target),
-                        currentPressedHeaderIndex = site.indexForHeaderElement(eventObject.target),
-                        mustSetCapture = !isInteractive && currentPressedIndex !== _Constants._INVALID_INDEX;
-
-                    if ((touchInput || leftButton) && this._site.pressedEntity.index === _Constants._INVALID_INDEX && !isInteractive) {
-                        if (currentPressedHeaderIndex === _Constants._INVALID_INDEX) {
-                            this._site.pressedEntity = { type: _UI.ObjectType.item, index: currentPressedIndex };
-                        } else {
-                            this._site.pressedEntity = { type: _UI.ObjectType.groupHeader, index: currentPressedHeaderIndex };
-                        }
-
-                        if (this._site.pressedEntity.index !== _Constants._INVALID_INDEX) {
-                            this._site.pressedPosition = _ElementUtilities._getCursorPos(eventObject);
-
-                            var allowed = site.verifySelectionAllowed(this._site.pressedEntity);
-                            this._canSelect = allowed.canSelect;
-                            this._canTapSelect = allowed.canTapSelect;
-
-                            if (this._site.pressedEntity.type === _UI.ObjectType.item) {
-                                this._site.pressedItemBox = site.itemBoxAtIndex(this._site.pressedEntity.index);
-                                this._site.pressedContainer = site.containerAtIndex(this._site.pressedEntity.index);
-                                this._site.animatedElement = this._site.pressedContainer;
-                                this._site.pressedHeader = null;
-                                this._togglePressed(true, eventObject);
-                                this._site.pressedContainer.addEventListener('dragstart', this._DragStartBound);
-                                if (!touchInput) {
-                                    // This only works for non touch input because on touch input we set capture which immediately fires the MSPointerOut.
-                                    _ElementUtilities._addEventListener(this._site.pressedContainer, 'pointerenter', this._PointerEnterBound, false);
-                                    _ElementUtilities._addEventListener(this._site.pressedContainer, 'pointerleave', this._PointerLeaveBound, false);
-                                }
-                            } else {
-                                this._site.pressedHeader = this._site.headerFromElement(eventObject.target);
-                                // Interactions with the headers on phone show an animation
-                                if (_BaseUtils.isPhone) {
-                                    this._site.animatedElement = this._site.pressedHeader;
-                                    this._togglePressed(true, eventObject);
-                                } else {
-                                    this._site.pressedItemBox = null;
-                                    this._site.pressedContainer = null;
-                                    this._site.animatedElement = null;
-                                }
-                            }
-
-                            if (!this._resetPointerDownStateBound) {
-                                this._resetPointerDownStateBound = this._resetPointerDownStateForPointerId.bind(this);
-                            }
-
-                            if (!touchInput) {
-                                _ElementUtilities._addEventListener(_Global, "pointerup", this._resetPointerDownStateBound, false);
-                                _ElementUtilities._addEventListener(_Global, "pointercancel", this._resetPointerDownStateBound, false);
-                            }
-
-                            this._pointerId = eventObject.pointerId;
-                            this._pointerRightButton = rightButton;
-                        }
-                    }
-
-                    if (mustSetCapture) {
-                        if (touchInput) {
-                            try {
-                                // Move pointer capture to avoid hover visual on second finger
-                                _ElementUtilities._setPointerCapture(site.canvasProxy, eventObject.pointerId);
-                            } catch (e) {
-                                _WriteProfilerMark("WinJS.UI._ItemEventsHandler:MSPointerDown,StopTM");
-                                return;
-                            }
-                        }
-                    }
-
-                    // Once the shift selection pivot is set, it remains the same until the user
-                    // performs a left- or right-click without holding the shift key down.
-                    if (this._site.pressedEntity.type === _UI.ObjectType.item &&
-                            this._selectionAllowed() && this._multiSelection() &&       // Multi selection enabled
-                            this._site.pressedEntity.index !== _Constants._INVALID_INDEX &&    // A valid item was clicked
-                            site.selection._getFocused().index !== _Constants._INVALID_INDEX && site.selection._pivot === _Constants._INVALID_INDEX) {
-                        site.selection._pivot = site.selection._getFocused().index;
-                    }
-
-                    _WriteProfilerMark("WinJS.UI._ItemEventsHandler:MSPointerDown,StopTM");
-                },
-
-                onPointerEnter: function ItemEventsHandler_onPointerEnter(eventObject) {
-                    if (this._site.pressedContainer && this._pointerId === eventObject.pointerId) {
-                        this._togglePressed(true, eventObject);
-                    }
-                },
-
-                onPointerLeave: function ItemEventsHandler_onPointerLeave(eventObject) {
-                    if (this._site.pressedContainer && this._pointerId === eventObject.pointerId) {
-                        this._togglePressed(false, eventObject);
-                    }
-                },
-
-                onDragStart: function ItemEventsHandler_onDragStart() {
-                    this._resetPressedContainer();
-                },
-
-                _resetPressedContainer: function ItemEventsHandler_resetPressedContainer() {
-                    if ((this._site.pressedContainer || this._site.pressedHeader) && this._site.animatedElement) {
-                        this._togglePressed(false);
-                        if (this._site.pressedContainer) {
-                            this._site.pressedContainer.style[transformNames.scriptName] = "";
-                            this._site.pressedContainer.removeEventListener('dragstart', this._DragStartBound);
-                            _ElementUtilities._removeEventListener(this._site.pressedContainer, 'pointerenter', this._PointerEnterBound, false);
-                            _ElementUtilities._removeEventListener(this._site.pressedContainer, 'pointerleave', this._PointerLeaveBound, false);
-                        }
-                    }
-                },
-
-                onClick: function ItemEventsHandler_onClick(eventObject) {
-                    if (!this._skipClick) {
-                        // Handle the UIA invoke action on an item. this._skipClick is false which tells us that we received a click
-                        // event without an associated MSPointerUp event. This means that the click event was triggered thru UIA
-                        // rather than thru the GUI.
-                        var entity = { type: _UI.ObjectType.item, index: this._site.indexForItemElement(eventObject.target) };
-                        if (entity.index === _Constants._INVALID_INDEX) {
-                            entity.index = this._site.indexForHeaderElement(eventObject.target);
-                            if (entity.index !== _Constants._INVALID_INDEX) {
-                                entity.type = _UI.ObjectType.groupHeader;
-                            }
-                        }
-
-                        if (entity.index !== _Constants._INVALID_INDEX &&
-                            (_ElementUtilities.hasClass(eventObject.target, this._site.accessibleItemClass) || _ElementUtilities.hasClass(eventObject.target, _Constants._headerClass))) {
-                            var allowed = this._site.verifySelectionAllowed(entity);
-                            if (allowed.canTapSelect) {
-                                this.handleTap(entity);
-                            }
-                            this._site.fireInvokeEvent(entity, eventObject.target);
-                        }
-                    }
-                },
-
-                onPointerUp: function ItemEventsHandler_onPointerUp(eventObject) {
-                    _WriteProfilerMark("WinJS.UI._ItemEventsHandler:MSPointerUp,StartTM");
-
-                    var site = this._site;
-                    this._skipClick = true;
-                    var that = this;
-                    _BaseUtils._yieldForEvents(function () {
-                        that._skipClick = false;
-                    });
-
-                    try {
-                        // Release the pointer capture to allow in air touch pointers to be reused for multiple interactions
-                        _ElementUtilities._releasePointerCapture(site.canvasProxy, eventObject.pointerId);
-                    } catch (e) {
-                        // This can throw if SeZo had capture or if the pointer was not already captured
-                    }
-
-                    var touchInput = (eventObject.pointerType === PT_TOUCH),
-                        releasedElement = this._releasedElement(eventObject),
-                        releasedIndex = site.indexForItemElement(releasedElement),
-                        releasedHeaderIndex = releasedElement && _ElementUtilities.hasClass(releasedElement, _Constants._headerContainerClass) ? site.indexForHeaderElement(site.pressedHeader) : site.indexForHeaderElement(releasedElement);
-
-                    if (this._pointerId === eventObject.pointerId) {
-                        var releasedEntity;
-                        if (releasedHeaderIndex === _Constants._INVALID_INDEX) {
-                            releasedEntity = { type: _UI.ObjectType.item, index: releasedIndex };
-                        } else {
-                            releasedEntity = { type: _UI.ObjectType.groupHeader, index: releasedHeaderIndex };
-                        }
-
-                        this._resetPressedContainer();
-
-                        if (this._site.pressedEntity.type === _UI.ObjectType.item && releasedEntity.type === _UI.ObjectType.item &&
-                                this._site.pressedContainer && this._site.pressedEntity.index === releasedEntity.index) {
-
-                            if (!eventObject.shiftKey) {
-                                // Reset the shift selection pivot when the user clicks w/o pressing shift
-                                site.selection._pivot = _Constants._INVALID_INDEX;
-                            }
-
-                            if (eventObject.shiftKey) {
-                                // Shift selection should work when shift or shift+ctrl are depressed for both left- and right-click
-                                if (this._selectionAllowed() && this._multiSelection() && site.selection._pivot !== _Constants._INVALID_INDEX) {
-                                    var firstIndex = Math.min(this._site.pressedEntity.index, site.selection._pivot),
-                                        lastIndex = Math.max(this._site.pressedEntity.index, site.selection._pivot),
-                                        additive = (this._pointerRightButton || eventObject.ctrlKey || site.tapBehavior === _UI.TapBehavior.toggleSelect);
-                                    site.selectRange(firstIndex, lastIndex, additive);
-                                }
-                            } else if (eventObject.ctrlKey) {
-                                this.toggleSelectionIfAllowed(this._site.pressedEntity.index);
-                            }
-                        }
-
-                        if (this._site.pressedHeader || this._site.pressedContainer) {
-                            var upPosition = _ElementUtilities._getCursorPos(eventObject);
-                            var isTap = Math.abs(upPosition.left - this._site.pressedPosition.left) <= _Constants._TAP_END_THRESHOLD &&
-                                Math.abs(upPosition.top - this._site.pressedPosition.top) <= _Constants._TAP_END_THRESHOLD;
-
-                            // We do not care whether or not the pressed and released indices are equivalent when the user is using touch. The only time they won't be is if the user
-                            // tapped the edge of an item and the pressed animation shrank the item such that the user's finger was no longer over it. In this case, the item should
-                            // be considered tapped.
-                            // However, if the user is using touch then we must perform an extra check. Sometimes we receive MSPointerUp events when the user intended to pan.
-                            // This extra check ensures that these intended pans aren't treated as taps.
-                            if (!this._pointerRightButton && !eventObject.ctrlKey && !eventObject.shiftKey &&
-                                    ((touchInput && isTap) ||
-                                    (!touchInput && this._site.pressedEntity.index === releasedEntity.index && this._site.pressedEntity.type === releasedEntity.type))) {
-                                if (releasedEntity.type === _UI.ObjectType.groupHeader) {
-                                    this._site.pressedHeader = site.headerAtIndex(releasedEntity.index);
-                                    this._site.pressedItemBox = null;
-                                    this._site.pressedContainer = null;
-                                } else {
-                                    this._site.pressedItemBox = site.itemBoxAtIndex(releasedEntity.index);
-                                    this._site.pressedContainer = site.containerAtIndex(releasedEntity.index);
-                                    this._site.pressedHeader = null;
-                                }
-
-                                if (this._canTapSelect) {
-                                    this.handleTap(this._site.pressedEntity);
-                                }
-                                this._site.fireInvokeEvent(this._site.pressedEntity, this._site.pressedItemBox || this._site.pressedHeader);
-                            }
-                        }
-
-                        if (this._site.pressedEntity.index !== _Constants._INVALID_INDEX) {
-                            site.changeFocus(this._site.pressedEntity, true, false, true);
-                        }
-
-                        this.resetPointerDownState();
-                    }
-
-                    _WriteProfilerMark("WinJS.UI._ItemEventsHandler:MSPointerUp,StopTM");
-                },
-
-                onPointerCancel: function ItemEventsHandler_onPointerCancel(eventObject) {
-                    if (this._pointerId === eventObject.pointerId) {
-                        _WriteProfilerMark("WinJS.UI._ItemEventsHandler:MSPointerCancel,info");
-                        this.resetPointerDownState();
-                    }
-                },
-
-                onLostPointerCapture: function ItemEventsHandler_onLostPointerCapture(eventObject) {
-                    if (this._pointerId === eventObject.pointerId) {
-                        _WriteProfilerMark("WinJS.UI._ItemEventsHandler:MSLostPointerCapture,info");
-                        this.resetPointerDownState();
-                    }
-                },
-
-                // In order for the control to play nicely with other UI controls such as the app bar, it calls preventDefault on
-                // contextmenu events. It does this only when selection is enabled, the event occurred on or within an item, and
-                // the event did not occur on an interactive element.
-                onContextMenu: function ItemEventsHandler_onContextMenu(eventObject) {
-                    if (this._shouldSuppressContextMenu(eventObject.target)) {
-                        eventObject.preventDefault();
-                    }
-                },
-
-                onMSHoldVisual: function ItemEventsHandler_onMSHoldVisual(eventObject) {
-                    if (this._shouldSuppressContextMenu(eventObject.target)) {
-                        eventObject.preventDefault();
-                    }
-                },
-
-                onDataChanged: function ItemEventsHandler_onDataChanged() {
-                    this.resetPointerDownState();
-                },
-
-                toggleSelectionIfAllowed: function ItemEventsHandler_toggleSelectionIfAllowed(itemIndex) {
-                    if (this._selectionAllowed(itemIndex)) {
-                        this._toggleItemSelection(itemIndex);
-                    }
-                },
-
-                handleTap: function ItemEventsHandler_handleTap(entity) {
-                    if (entity.type === _UI.ObjectType.groupHeader) {
-                        return;
-                    }
-
-                    var site = this._site,
-                        selection = site.selection;
-
-                    if (this._selectionAllowed(entity.index) && this._selectOnTap()) {
-                        if (site.tapBehavior === _UI.TapBehavior.toggleSelect) {
-                            this._toggleItemSelection(entity.index);
-                        } else {
-                            // site.tapBehavior === _UI.TapBehavior.directSelect so ensure only itemIndex is selected
-                            if (site.selectionMode === _UI.SelectionMode.multi || !selection._isIncluded(entity.index)) {
-                                selection.set(entity.index);
-                            }
-                        }
-                    }
-                },
-
-                // In single selection mode, in addition to itemIndex's selection state being toggled,
-                // all other items will become deselected
-                _toggleItemSelection: function ItemEventsHandler_toggleItemSelection(itemIndex) {
-                    var site = this._site,
-                        selection = site.selection,
-                        selected = selection._isIncluded(itemIndex);
-
-                    if (site.selectionMode === _UI.SelectionMode.single) {
-                        if (!selected) {
-                            selection.set(itemIndex);
-                        } else {
-                            selection.clear();
-                        }
-                    } else {
-                        if (!selected) {
-                            selection.add(itemIndex);
-                        } else {
-                            selection.remove(itemIndex);
-                        }
-                    }
-                },
-
-                _getCurrentPoint: function ItemEventsHandler_getCurrentPoint(eventObject) {
-                    return _WinRT.Windows.UI.Input.PointerPoint.getCurrentPoint(eventObject.pointerId);
-                },
-
-                _containedInElementWithClass: function ItemEventsHandler_containedInElementWithClass(element, className) {
-                    if (element.parentNode) {
-                        var matches = element.parentNode.querySelectorAll("." + className + ", ." + className + " *");
-                        for (var i = 0, len = matches.length; i < len; i++) {
-                            if (matches[i] === element) {
-                                return true;
-                            }
-                        }
-                    }
-                    return false;
-                },
-
-                _isSelected: function ItemEventsHandler_isSelected(index) {
-                    return this._site.selection._isIncluded(index);
-                },
-
-                _isInteractive: function ItemEventsHandler_isInteractive(element) {
-                    return this._containedInElementWithClass(element, "win-interactive");
-                },
-
-                _shouldSuppressContextMenu: function ItemEventsHandler_shouldSuppressContextMenu(element) {
-                    var containerElement = this._site.containerFromElement(element);
-
-                    return (this._selectionAllowed() && containerElement && !this._isInteractive(element));
-                },
-
-                _togglePressed: function ItemEventsHandler_togglePressed(add, eventObject) {
-                    var isHeader = this._site.pressedEntity.type === _UI.ObjectType.groupHeader;
-
-                    if (!isHeader && _ElementUtilities.hasClass(this._site.pressedItemBox, _Constants._nonSelectableClass)) {
-                        return;
-                    }
-
-                    if (!this._staticMode(isHeader)) {
-                        if (add) {
-                            _ElementUtilities.addClass(this._site.animatedElement, _Constants._pressedClass);
-                        } else {
-                            _ElementUtilities.removeClass(this._site.animatedElement, _Constants._pressedClass);
-                        }
-                    }
-                },
-
-                _resetPointerDownStateForPointerId: function ItemEventsHandler_resetPointerDownState(eventObject) {
-                    if (this._pointerId === eventObject.pointerId) {
-                        this.resetPointerDownState();
-                    }
-                },
-
-                resetPointerDownState: function ItemEventsHandler_resetPointerDownState() {
-                    this._site.pressedElement = null;
-                    _ElementUtilities._removeEventListener(_Global, "pointerup", this._resetPointerDownStateBound);
-                    _ElementUtilities._removeEventListener(_Global, "pointercancel", this._resetPointerDownStateBound);
-
-                    this._resetPressedContainer();
-
-                    this._site.pressedContainer = null;
-                    this._site.animatedElement = null;
-                    this._site.pressedHeader = null;
-                    this._site.pressedItemBox = null;
-
-                    this._site.pressedEntity = { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX };
-                    this._pointerId = null;
-                },
-
-                _releasedElement: function ItemEventsHandler_releasedElement(eventObject) {
-                    return _Global.document.elementFromPoint(eventObject.clientX, eventObject.clientY);
-                },
-
-                _applyUIInBatches: function ItemEventsHandler_applyUIInBatches(work) {
-                    var that = this;
-                    this._work.push(work);
-
-                    if (!this._paintedThisFrame) {
-                        applyUI();
-                    }
-
-                    function applyUI() {
-                        if (that._work.length > 0) {
-                            that._flushUIBatches();
-                            that._paintedThisFrame = _BaseUtils._requestAnimationFrame(applyUI.bind(that));
-                        } else {
-                            that._paintedThisFrame = null;
-                        }
-                    }
-                },
-
-                _flushUIBatches: function ItemEventsHandler_flushUIBatches() {
-                    if (this._work.length > 0) {
-                        var workItems = this._work;
-                        this._work = [];
-
-                        for (var i = 0; i < workItems.length; i++) {
-                            workItems[i]();
-                        }
-                    }
-                },
-
-                _selectionAllowed: function ItemEventsHandler_selectionAllowed(itemIndex) {
-                    var item = (itemIndex !== undefined ? this._site.itemAtIndex(itemIndex) : null),
-                        itemSelectable = !(item && _ElementUtilities.hasClass(item, _Constants._nonSelectableClass));
-                    return itemSelectable && this._site.selectionMode !== _UI.SelectionMode.none;
-                },
-
-                _multiSelection: function ItemEventsHandler_multiSelection() {
-                    return this._site.selectionMode === _UI.SelectionMode.multi;
-                },
-
-                _selectOnTap: function ItemEventsHandler_selectOnTap() {
-                    return this._site.tapBehavior === _UI.TapBehavior.toggleSelect || this._site.tapBehavior === _UI.TapBehavior.directSelect;
-                },
-
-                _staticMode: function ItemEventsHandler_staticMode(isHeader) {
-                    if (isHeader) {
-                        return this._site.headerTapBehavior === _UI.GroupHeaderTapBehavior.none;
-                    } else {
-                        return this._site.tapBehavior === _UI.TapBehavior.none && this._site.selectionMode === _UI.SelectionMode.none;
-                    }
-                },
-            }, {
-                // Avoids unnecessary UIA selection events by only updating aria-selected if it has changed
-                setAriaSelected: function ItemEventsHandler_setAriaSelected(itemElement, isSelected) {
-                    var ariaSelected = (itemElement.getAttribute("aria-selected") === "true");
-
-                    if (isSelected !== ariaSelected) {
-                        itemElement.setAttribute("aria-selected", isSelected);
-                    }
-                },
-
-                renderSelection: function ItemEventsHandler_renderSelection(itemBox, element, selected, aria, container) {
-                    if (!ItemEventsHandler._selectionTemplate) {
-                        ItemEventsHandler._selectionTemplate = [];
-                        ItemEventsHandler._selectionTemplate.push(createNodeWithClass(_Constants._selectionBackgroundClass));
-                        ItemEventsHandler._selectionTemplate.push(createNodeWithClass(_Constants._selectionBorderClass));
-                        ItemEventsHandler._selectionTemplate.push(createNodeWithClass(_Constants._selectionCheckmarkBackgroundClass));
-                        var checkmark = createNodeWithClass(_Constants._selectionCheckmarkClass);
-                        checkmark.textContent = _Constants._SELECTION_CHECKMARK;
-                        ItemEventsHandler._selectionTemplate.push(checkmark);
-                    }
-
-                    // Update the selection rendering if necessary
-                    if (selected !== _ElementUtilities._isSelectionRendered(itemBox)) {
-                        if (selected) {
-                            itemBox.insertBefore(ItemEventsHandler._selectionTemplate[0].cloneNode(true), itemBox.firstElementChild);
-
-                            for (var i = 1, len = ItemEventsHandler._selectionTemplate.length; i < len; i++) {
-                                itemBox.appendChild(ItemEventsHandler._selectionTemplate[i].cloneNode(true));
-                            }
-                        } else {
-                            var nodes = itemBox.querySelectorAll(_ElementUtilities._selectionPartsSelector);
-                            for (var i = 0, len = nodes.length; i < len; i++) {
-                                itemBox.removeChild(nodes[i]);
-                            }
-                        }
-
-                        _ElementUtilities[selected ? "addClass" : "removeClass"](itemBox, _Constants._selectedClass);
-                        if (container) {
-                            _ElementUtilities[selected ? "addClass" : "removeClass"](container, _Constants._selectedClass);
-                        }
-                    }
-
-                    // To allow itemPropertyChange to work properly, aria needs to be updated after the selection visuals are added to the itemBox
-                    if (aria) {
-                        ItemEventsHandler.setAriaSelected(element, selected);
-                    }
-                },
-            });
-
-            return ItemEventsHandler;
-        })
-
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ListView/_SelectionManager',[
-    'exports',
-    '../../Core/_Global',
-    '../../Core/_Base',
-    '../../Promise',
-    '../../_Signal',
-    '../../Utilities/_UI',
-    '../ItemContainer/_Constants'
-    ], function selectionManagerInit(exports, _Global, _Base, Promise, _Signal, _UI, _Constants) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _ItemSet: _Base.Namespace._lazy(function () {
-            var _ItemSet = _Base.Class.define(function _ItemSet_ctor(listView, ranges, count) {
-                this._listView = listView;
-                this._ranges = ranges;
-                this._itemsCount = count;
-            });
-            _ItemSet.prototype = {
-                getRanges: function () {
-                    var ranges = [];
-                    for (var i = 0, len = this._ranges.length; i < len; i++) {
-                        var range = this._ranges[i];
-                        ranges.push({
-                            firstIndex: range.firstIndex,
-                            lastIndex: range.lastIndex,
-                            firstKey: range.firstKey,
-                            lastKey: range.lastKey
-                        });
-                    }
-                    return ranges;
-                },
-
-                getItems: function () {
-                    return exports.getItemsFromRanges(this._listView._itemsManager.dataSource, this._ranges);
-                },
-
-                isEverything: function () {
-                    return this.count() === this._itemsCount;
-                },
-
-                count: function () {
-                    var count = 0;
-                    for (var i = 0, len = this._ranges.length; i < len; i++) {
-                        var range = this._ranges[i];
-                        count += range.lastIndex - range.firstIndex + 1;
-                    }
-                    return count;
-                },
-
-                getIndices: function () {
-                    var indices = [];
-                    for (var i = 0, len = this._ranges.length; i < len; i++) {
-                        var range = this._ranges[i];
-                        for (var n = range.firstIndex; n <= range.lastIndex; n++) {
-                            indices.push(n);
-                        }
-                    }
-                    return indices;
-                }
-            };
-            return _ItemSet;
-        }),
-
-        getItemsFromRanges: function (dataSource, ranges) {
-            var listBinding = dataSource.createListBinding(),
-                promises = [];
-
-            function getIndices() {
-                var indices = [];
-                for (var i = 0, len = ranges.length; i < len; i++) {
-                    var range = ranges[i];
-                    for (var j = range.firstIndex; j <= range.lastIndex; j++) {
-                        indices.push(j);
-                    }
-                }
-                return Promise.wrap(indices);
-            }
-
-            return getIndices().then(function (indices) {
-                for (var i = 0; i < indices.length; i++) {
-                    promises.push(listBinding.fromIndex(indices[i]));
-                }
-
-                return Promise.join(promises).then(function (items) {
-                    listBinding.release();
-                    return items;
-                });
-            });
-        },
-
-        _Selection: _Base.Namespace._lazy(function () {
-            function isEverythingRange(ranges) {
-                return ranges && ranges.firstIndex === 0 && ranges.lastIndex === Number.MAX_VALUE;
-            }
-
-            return _Base.Class.derive(exports._ItemSet, function (listView, indexesAndRanges) {
-                this._listView = listView;
-                this._itemsCount = -1;
-                this._ranges = [];
-                if (indexesAndRanges) {
-                    this.set(indexesAndRanges);
-                }
-            }, {
-                clear: function () {
-                    /// <signature helpKeyword="WinJS.UI._Selection.prototype.clear">
-                    /// <summary locid="WinJS.UI._Selection.prototype.clear">
-                    /// Clears the selection.
-                    /// </summary>
-                    /// <returns type="Promise" locid="WinJS.UI._Selection.prototype.clear_returnValue">
-                    /// A Promise that is fulfilled when the clear operation completes.
-                    /// </returns>
-                    /// </signature>
-
-                    this._releaseRanges(this._ranges);
-                    this._ranges = [];
-                    return Promise.wrap();
-                },
-
-                set: function (items) {
-                    /// <signature helpKeyword="WinJS.UI._Selection.prototype.set">
-                    /// <summary locid="WinJS.UI._Selection.prototype.set">
-                    /// Clears the current selection and replaces it with the specified items.
-                    /// </summary>
-                    /// <param name="items" locid="WinJS.UI._Selection.prototype.set_items">
-                    /// The indexes or keys of the items that make up the selection.
-                    /// You can provide different types of objects for the items parameter:
-                    /// you can specify an index, a key, or a range of indexes.
-                    /// It can also be an array that contains one or more of these objects.
-                    /// </param>
-                    /// <returns type="Promise" locid="WinJS.UI._Selection.prototype.set_returnValue">
-                    /// A Promise that is fulfilled when the operation completes.
-                    /// </returns>
-                    /// </signature>
-
-                    // A range with lastIndex set to Number.MAX_VALUE used to mean selectAll. Passing such range to set was equivalent to selectAll. This code preserves this behavior.
-                    if (!isEverythingRange(items)) {
-                        this._releaseRanges(this._ranges);
-                        this._ranges = [];
-
-                        var that = this;
-                        return this._execute("_set", items).then(function () {
-                            that._ranges.sort(function (left, right) {
-                                return left.firstIndex - right.firstIndex;
-                            });
-                            return that._ensureKeys();
-                        }).then(function () {
-                            return that._ensureCount();
-                        });
-                    } else {
-                        return this.selectAll();
-                    }
-                },
-
-                add: function (items) {
-                    /// <signature helpKeyword="WinJS.UI._Selection.prototype.add">
-                    /// <summary locid="WinJS.UI._Selection.prototype.add">
-                    /// Adds one or more items to the selection.
-                    /// </summary>
-                    /// <param name="items" locid="WinJS.UI._Selection.prototype.add_items">
-                    /// The indexes or keys of the items to add.
-                    /// You can provide different types of objects for the items parameter:
-                    /// you can specify an index, a key, or a range of indexes.
-                    /// It can also be an array that contains one or more of these objects.
-                    /// </param>
-                    /// <returns type="Promise" locid="WinJS.UI._Selection.prototype.add_returnValue">
-                    /// A Promise that is fulfilled when the operation completes.
-                    /// </returns>
-                    /// </signature>
-
-                    if (!isEverythingRange(items)) {
-                        var that = this;
-                        return this._execute("_add", items).then(function () {
-                            return that._ensureKeys();
-                        }).then(function () {
-                            return that._ensureCount();
-                        });
-                    } else {
-                        return this.selectAll();
-                    }
-                },
-
-                remove: function (items) {
-                    /// <signature helpKeyword="WinJS.UI._Selection.prototype.remove">
-                    /// <summary locid="WinJS.UI._Selection.prototype.remove">
-                    /// Removes the specified items from the selection.
-                    /// </summary>
-                    /// <param name="items" locid="WinJS.UI._Selection.prototype.remove_items">
-                    /// The indexes or keys of the items to remove. You can provide different types of objects for the items parameter:
-                    /// you can specify an index, a key, or a range of indexes.
-                    /// It can also be an array that contains one or more of these objects.
-                    /// </param>
-                    /// <returns type="Promise" locid="WinJS.UI._Selection.prototype.remove_returnValue">
-                    /// A Promise that is fulfilled when the operation completes.
-                    /// </returns>
-                    /// </signature>
-
-                    var that = this;
-                    return this._execute("_remove", items).then(function () {
-                        return that._ensureKeys();
-                    });
-                },
-
-                selectAll: function () {
-                    /// <signature helpKeyword="WinJS.UI._Selection.prototype.selectAll">
-                    /// <summary locid="WinJS.UI._Selection.prototype.selectAll">
-                    /// Adds all the items in the ListView to the selection.
-                    /// </summary>
-                    /// <returns type="Promise" locid="WinJS.UI._Selection.prototype.selectAll_returnValue">
-                    /// A Promise that is fulfilled when the operation completes.
-                    /// </returns>
-                    /// </signature>
-
-                    var that = this;
-                    return that._ensureCount().then(function () {
-                        if (that._itemsCount) {
-                            var range = {
-                                firstIndex: 0,
-                                lastIndex: that._itemsCount - 1,
-                            };
-                            that._retainRange(range);
-                            that._releaseRanges(that._ranges);
-                            that._ranges = [range];
-                            return that._ensureKeys();
-                        }
-                    });
-                },
-
-                _execute: function (operation, items) {
-                    var that = this,
-                        keysSupported = !!that._getListBinding().fromKey,
-                        array = Array.isArray(items) ? items : [items],
-                        promises = [Promise.wrap()];
-
-                    function toRange(type, first, last) {
-                        var retVal = {};
-                        retVal["first" + type] = first;
-                        retVal["last" + type] = last;
-                        return retVal;
-                    }
-
-                    function handleKeys(range) {
-                        var binding = that._getListBinding();
-
-                        var promise = Promise.join([binding.fromKey(range.firstKey), binding.fromKey(range.lastKey)]).then(function (items) {
-                            if (items[0] && items[1]) {
-                                range.firstIndex = items[0].index;
-                                range.lastIndex = items[1].index;
-                                that[operation](range);
-                            }
-                            return range;
-                        });
-                        promises.push(promise);
-                    }
-
-                    for (var i = 0, len = array.length; i < len; i++) {
-                        var item = array[i];
-                        if (typeof item === "number") {
-                            this[operation](toRange("Index", item, item));
-                        } else if (item) {
-                            if (keysSupported && item.key !== undefined) {
-                                handleKeys(toRange("Key", item.key, item.key));
-                            } else if (keysSupported && item.firstKey !== undefined && item.lastKey !== undefined) {
-                                handleKeys(toRange("Key", item.firstKey, item.lastKey));
-                            } else if (item.index !== undefined && typeof item.index === "number") {
-                                this[operation](toRange("Index", item.index, item.index));
-                            } else if (item.firstIndex !== undefined && item.lastIndex !== undefined &&
-                                    typeof item.firstIndex === "number" && typeof item.lastIndex === "number") {
-                                this[operation](toRange("Index", item.firstIndex, item.lastIndex));
-                            }
-                        }
-                    }
-
-                    return Promise.join(promises);
-                },
-
-                _set: function (range) {
-                    this._retainRange(range);
-                    this._ranges.push(range);
-                },
-
-                _add: function (newRange) {
-                    var that = this,
-                        prev = null,
-                        range,
-                        inserted;
-
-                    var merge = function (left, right) {
-                        if (right.lastIndex > left.lastIndex) {
-                            left.lastIndex = right.lastIndex;
-                            left.lastKey = right.lastKey;
-                            if (left.lastPromise) {
-                                left.lastPromise.release();
-                            }
-                            left.lastPromise = that._getListBinding().fromIndex(left.lastIndex).retain();
-                        }
-                    };
-                    var mergeWithPrev;
-                    for (var i = 0, len = this._ranges.length; i < len; i++) {
-                        range = this._ranges[i];
-                        if (newRange.firstIndex < range.firstIndex) {
-                            mergeWithPrev = prev && newRange.firstIndex < (prev.lastIndex + 1);
-                            if (mergeWithPrev) {
-                                inserted = i - 1;
-                                merge(prev, newRange);
-                            } else {
-                                this._insertRange(i, newRange);
-                                inserted = i;
-                            }
-                            break;
-                        } else if (newRange.firstIndex === range.firstIndex) {
-                            merge(range, newRange);
-                            inserted = i;
-                            break;
-                        }
-                        prev = range;
-                    }
-
-                    if (inserted === undefined) {
-                        var last = this._ranges.length ? this._ranges[this._ranges.length - 1] : null,
-                            mergeWithLast = last && newRange.firstIndex < (last.lastIndex + 1);
-                        if (mergeWithLast) {
-                            merge(last, newRange);
-                        } else {
-                            this._retainRange(newRange);
-                            this._ranges.push(newRange);
-                        }
-                    } else {
-                        prev = null;
-                        for (i = inserted + 1, len = this._ranges.length; i < len; i++) {
-                            range = this._ranges[i];
-                            if (newRange.lastIndex < range.firstIndex) {
-                                mergeWithPrev = prev && prev.lastIndex > newRange.lastIndex;
-                                if (mergeWithPrev) {
-                                    merge(this._ranges[inserted], prev);
-                                }
-                                this._removeRanges(inserted + 1, i - inserted - 1);
-                                break;
-                            } else if (newRange.lastIndex === range.firstIndex) {
-                                merge(this._ranges[inserted], range);
-                                this._removeRanges(inserted + 1, i - inserted);
-                                break;
-                            }
-                            prev = range;
-                        }
-                        if (i >= len) {
-                            merge(this._ranges[inserted], this._ranges[len - 1]);
-                            this._removeRanges(inserted + 1, len - inserted - 1);
-                        }
-                    }
-                },
-
-                _remove: function (toRemove) {
-                    var that = this;
-
-                    function retainPromise(index) {
-                        return that._getListBinding().fromIndex(index).retain();
-                    }
-
-                    // This method is called when a range needs to be unselected.  It is inspecting every range in the current selection comparing
-                    // it to the range which is being unselected and it is building an array of new selected ranges
-                    var ranges = [];
-                    for (var i = 0, len = this._ranges.length; i < len; i++) {
-                        var range = this._ranges[i];
-                        if (range.lastIndex < toRemove.firstIndex || range.firstIndex > toRemove.lastIndex) {
-                            // No overlap with the unselected range
-                            ranges.push(range);
-                        } else if (range.firstIndex < toRemove.firstIndex && range.lastIndex >= toRemove.firstIndex && range.lastIndex <= toRemove.lastIndex) {
-                            // The end of this range is being unselected
-                            ranges.push({
-                                firstIndex: range.firstIndex,
-                                firstKey: range.firstKey,
-                                firstPromise: range.firstPromise,
-                                lastIndex: toRemove.firstIndex - 1,
-                                lastPromise: retainPromise(toRemove.firstIndex - 1)
-                            });
-                            range.lastPromise.release();
-                        } else if (range.lastIndex > toRemove.lastIndex && range.firstIndex >= toRemove.firstIndex && range.firstIndex <= toRemove.lastIndex) {
-                            // The beginning of this range is being unselected
-                            ranges.push({
-                                firstIndex: toRemove.lastIndex + 1,
-                                firstPromise: retainPromise(toRemove.lastIndex + 1),
-                                lastIndex: range.lastIndex,
-                                lastKey: range.lastKey,
-                                lastPromise: range.lastPromise
-                            });
-                            range.firstPromise.release();
-                        } else if (range.firstIndex < toRemove.firstIndex && range.lastIndex > toRemove.lastIndex) {
-                            // The middle part of this range is being unselected
-                            ranges.push({
-                                firstIndex: range.firstIndex,
-                                firstKey: range.firstKey,
-                                firstPromise: range.firstPromise,
-                                lastIndex: toRemove.firstIndex - 1,
-                                lastPromise: retainPromise(toRemove.firstIndex - 1),
-                            });
-                            ranges.push({
-                                firstIndex: toRemove.lastIndex + 1,
-                                firstPromise: retainPromise(toRemove.lastIndex + 1),
-                                lastIndex: range.lastIndex,
-                                lastKey: range.lastKey,
-                                lastPromise: range.lastPromise
-                            });
-                        } else {
-                            // The whole range is being unselected
-                            range.firstPromise.release();
-                            range.lastPromise.release();
-                        }
-                    }
-                    this._ranges = ranges;
-                },
-
-                _ensureKeys: function () {
-                    var promises = [Promise.wrap()];
-                    var that = this;
-
-                    var ensureKey = function (which, range) {
-                        var keyProperty = which + "Key";
-
-                        if (!range[keyProperty]) {
-                            var promise = range[which + "Promise"];
-                            promise.then(function (item) {
-                                if (item) {
-                                    range[keyProperty] = item.key;
-                                }
-                            });
-                            return promise;
-                        } else {
-                            return Promise.wrap();
-                        }
-                    };
-
-                    for (var i = 0, len = this._ranges.length; i < len; i++) {
-                        var range = this._ranges[i];
-                        promises.push(ensureKey("first", range));
-                        promises.push(ensureKey("last", range));
-                    }
-
-                    Promise.join(promises).then(function () {
-                        that._ranges = that._ranges.filter(function (range) {
-                            return range.firstKey && range.lastKey;
-                        });
-                    });
-                    return Promise.join(promises);
-                },
-
-                _mergeRanges: function (target, source) {
-                    target.lastIndex = source.lastIndex;
-                    target.lastKey = source.lastKey;
-                },
-
-                _isIncluded: function (index) {
-                    if (this.isEverything()) {
-                        return true;
-                    } else {
-                        for (var i = 0, len = this._ranges.length; i < len; i++) {
-                            var range = this._ranges[i];
-                            if (range.firstIndex <= index && index <= range.lastIndex) {
-                                return true;
-                            }
-                        }
-                        return false;
-                    }
-                },
-
-                _ensureCount: function () {
-                    var that = this;
-                    return this._listView._itemsCount().then(function (count) {
-                        that._itemsCount = count;
-                    });
-                },
-
-                _insertRange: function (index, newRange) {
-                    this._retainRange(newRange);
-                    this._ranges.splice(index, 0, newRange);
-                },
-
-                _removeRanges: function (index, howMany) {
-                    for (var i = 0; i < howMany; i++) {
-                        this._releaseRange(this._ranges[index + i]);
-                    }
-                    this._ranges.splice(index, howMany);
-                },
-
-                _retainRange: function (range) {
-                    if (!range.firstPromise) {
-                        range.firstPromise = this._getListBinding().fromIndex(range.firstIndex).retain();
-                    }
-                    if (!range.lastPromise) {
-                        range.lastPromise = this._getListBinding().fromIndex(range.lastIndex).retain();
-                    }
-                },
-
-                _retainRanges: function () {
-                    for (var i = 0, len = this._ranges.length; i < len; i++) {
-                        this._retainRange(this._ranges[i]);
-                    }
-                },
-
-                _releaseRange: function (range) {
-                    range.firstPromise.release();
-                    range.lastPromise.release();
-                },
-
-                _releaseRanges: function (ranges) {
-                    for (var i = 0, len = ranges.length; i < len; ++i) {
-                        this._releaseRange(ranges[i]);
-                    }
-                },
-
-                _getListBinding: function () {
-                    return this._listView._itemsManager._listBinding;
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-        }),
-
-        // This component is responsible for holding selection state
-        _SelectionManager: _Base.Namespace._lazy(function () {
-            var _SelectionManager = function (listView) {
-                this._listView = listView;
-                this._selected = new exports._Selection(this._listView);
-                // Don't rename this member. Some apps reference it.
-                this._pivot = _Constants._INVALID_INDEX;
-                this._focused = { type: _UI.ObjectType.item, index: 0 };
-                this._pendingChange = Promise.wrap();
-            };
-            _SelectionManager.prototype = {
-                count: function () {
-                    /// <signature helpKeyword="WinJS.UI._SelectionManager.prototype.count">
-                    /// <summary locid="WinJS.UI._SelectionManager.prototype.count">
-                    /// Returns the number of items in the selection.
-                    /// </summary>
-                    /// <returns type="Number" locid="WinJS.UI._SelectionManager.prototype.count_returnValue">
-                    /// The number of items in the selection.
-                    /// </returns>
-                    /// </signature>
-                    return this._selected.count();
-                },
-
-                getIndices: function () {
-                    /// <signature helpKeyword="WinJS.UI._SelectionManager.prototype.getIndices">
-                    /// <summary locid="WinJS.UI._SelectionManager.prototype.getIndices">
-                    /// Returns a list of the indexes for the items in the selection.
-                    /// </summary>
-                    /// <returns type="Array" locid="WinJS.UI._SelectionManager.prototype.getIndices_returnValue">
-                    /// The list of indexes for the items in the selection as an array of Number objects.
-                    /// </returns>
-                    /// </signature>
-                    return this._selected.getIndices();
-                },
-
-                getItems: function () {
-                    /// <signature helpKeyword="WinJS.UI._SelectionManager.prototype.getItems">
-                    /// <summary locid="WinJS.UI._SelectionManager.prototype.getItems">
-                    /// Returns an array that contains the items in the selection.
-                    /// </summary>
-                    /// <returns type="Promise" locid="WinJS.UI._SelectionManager.prototype.getItems_returnValue">
-                    /// A Promise that contains an array of the requested IItem objects.
-                    /// </returns>
-                    /// </signature>
-
-                    return this._selected.getItems();
-                },
-
-                getRanges: function () {
-                    /// <signature helpKeyword="WinJS.UI._SelectionManager.prototype.getRanges">
-                    /// <summary locid="WinJS.UI._SelectionManager.prototype.getRanges">
-                    /// Gets an array of the index ranges for the selected items.
-                    /// </summary>
-                    /// <returns type="Array" locid="WinJS.UI._SelectionManager.prototype.getRanges_returnValue">
-                    /// An array that contains an ISelectionRange object for each index range in the selection.
-                    /// </returns>
-                    /// </signature>
-                    return this._selected.getRanges();
-                },
-
-                isEverything: function () {
-                    /// <signature helpKeyword="WinJS.UI._SelectionManager.prototype.isEverything">
-                    /// <summary locid="WinJS.UI._SelectionManager.prototype.isEverything">
-                    /// Returns a value that indicates whether the selection contains every item in the data source.
-                    /// </summary>
-                    /// <returns type="Boolean" locid="WinJS.UI._SelectionManager.prototype.isEverything_returnValue">
-                    /// true if the selection contains every item in the data source; otherwise, false.
-                    /// </returns>
-                    /// </signature>
-                    return this._selected.isEverything();
-                },
-
-                set: function (items) {
-                    /// <signature helpKeyword="WinJS.UI._SelectionManager.prototype.set">
-                    /// <summary locid="WinJS.UI._SelectionManager.prototype.set">
-                    /// Clears the current selection and replaces it with the specified items.
-                    /// </summary>
-                    /// <param name="items" locid="WinJS.UI._SelectionManager.prototype.set_items">
-                    /// The indexes or keys of the items that make up the selection.
-                    /// You can provide different types of objects for the items parameter:
-                    /// you can specify an index, a key, or a range of indexes.
-                    /// It can also be an array that contains one or more of these objects.
-                    /// </param>
-                    /// <returns type="Promise" locid="WinJS.UI._SelectionManager.prototype.set_returnValue">
-                    /// A Promise that is fulfilled when the operation completes.
-                    /// </returns>
-                    /// </signature>
-                    var that = this,
-                        signal = new _Signal();
-                    return this._synchronize(signal).then(function () {
-                        var newSelection = new exports._Selection(that._listView);
-                        return newSelection.set(items).then(
-                            function () {
-                                that._set(newSelection);
-                                signal.complete();
-                            },
-                            function (error) {
-                                newSelection.clear();
-                                signal.complete();
-                                return Promise.wrapError(error);
-                            }
-                        );
-                    });
-                },
-
-                clear: function () {
-                    /// <signature helpKeyword="WinJS.UI._SelectionManager.prototype.clear">
-                    /// <summary locid="WinJS.UI._SelectionManager.prototype.clear">
-                    /// Clears the selection.
-                    /// </summary>
-                    /// <returns type="Promise" locid="WinJS.UI._SelectionManager.prototype.clear_returnValue">
-                    /// A Promise that is fulfilled when the clear operation completes.
-                    /// </returns>
-                    /// </signature>
-
-                    var that = this,
-                        signal = new _Signal();
-                    return this._synchronize(signal).then(function () {
-                        var newSelection = new exports._Selection(that._listView);
-                        return newSelection.clear().then(
-                            function () {
-                                that._set(newSelection);
-                                signal.complete();
-                            },
-                            function (error) {
-                                newSelection.clear();
-                                signal.complete();
-                                return Promise.wrapError(error);
-                            }
-                        );
-                    });
-                },
-
-                add: function (items) {
-                    /// <signature helpKeyword="WinJS.UI._SelectionManager.prototype.add">
-                    /// <summary locid="WinJS.UI._SelectionManager.prototype.add">
-                    /// Adds one or more items to the selection.
-                    /// </summary>
-                    /// <param name="items" locid="WinJS.UI._SelectionManager.prototype.add_items">
-                    /// The indexes or keys of the items to add.
-                    /// You can provide different types of objects for the items parameter:
-                    /// you can specify an index, a key, or a range of indexes.
-                    /// It can also be an array that contains one or more of these objects.
-                    /// </param>
-                    /// <returns type="Promise" locid="WinJS.UI._SelectionManager.prototype.add_returnValue">
-                    /// A Promise that is fulfilled when the operation completes.
-                    /// </returns>
-                    /// </signature>
-                    var that = this,
-                        signal = new _Signal();
-                    return this._synchronize(signal).then(function () {
-                        var newSelection = that._cloneSelection();
-                        return newSelection.add(items).then(
-                            function () {
-                                that._set(newSelection);
-                                signal.complete();
-                            },
-                            function (error) {
-                                newSelection.clear();
-                                signal.complete();
-                                return Promise.wrapError(error);
-                            }
-                        );
-                    });
-                },
-
-                remove: function (items) {
-                    /// <signature helpKeyword="WinJS.UI._SelectionManager.prototype.remove">
-                    /// <summary locid="WinJS.UI._SelectionManager.prototype.remove">
-                    /// Removes the specified items from the selection.
-                    /// </summary>
-                    /// <param name="items" locid="WinJS.UI._SelectionManager.prototype.remove_items">
-                    /// The indexes or keys of the items to remove. You can provide different types of objects for the items parameter:
-                    /// you can specify an index, a key, or a range of indexes.
-                    /// It can also be an array that contains one or more of these objects.
-                    /// </param>
-                    /// <returns type="Promise" locid="WinJS.UI._SelectionManager.prototype.remove_returnValue">
-                    /// A Promise that is fulfilled when the operation completes.
-                    /// </returns>
-                    /// </signature>
-                    var that = this,
-                        signal = new _Signal();
-                    return this._synchronize(signal).then(function () {
-                        var newSelection = that._cloneSelection();
-                        return newSelection.remove(items).then(
-                            function () {
-                                that._set(newSelection);
-                                signal.complete();
-                            },
-                            function (error) {
-                                newSelection.clear();
-                                signal.complete();
-                                return Promise.wrapError(error);
-                            }
-                        );
-                    });
-                },
-
-                selectAll: function () {
-                    /// <signature helpKeyword="WinJS.UI._SelectionManager.prototype.selectAll">
-                    /// <summary locid="WinJS.UI._SelectionManager.prototype.selectAll">
-                    /// Adds all the items in the ListView to the selection.
-                    /// </summary>
-                    /// <returns type="Promise" locid="WinJS.UI._SelectionManager.prototype.selectAll_returnValue">
-                    /// A Promise that is fulfilled when the operation completes.
-                    /// </returns>
-                    /// </signature>
-                    var that = this,
-                        signal = new _Signal();
-                    return this._synchronize(signal).then(function () {
-                        var newSelection = new exports._Selection(that._listView);
-                        return newSelection.selectAll().then(
-                            function () {
-                                that._set(newSelection);
-                                signal.complete();
-                            },
-                            function (error) {
-                                newSelection.clear();
-                                signal.complete();
-                                return Promise.wrapError(error);
-                            }
-                        );
-                    });
-                },
-
-                _synchronize: function (signal) {
-                    var that = this;
-                    return this._listView._versionManager.unlocked.then(function () {
-                        var currentPendingChange = that._pendingChange;
-                        that._pendingChange = Promise.join([currentPendingChange, signal.promise]).then(function () { });
-                        return currentPendingChange;
-                    });
-                },
-
-                _reset: function () {
-                    this._pivot = _Constants._INVALID_INDEX;
-                    this._setFocused({ type: _UI.ObjectType.item, index: 0 }, this._keyboardFocused());
-                    this._pendingChange.cancel();
-                    this._pendingChange = Promise.wrap();
-                    this._selected.clear();
-                    this._selected = new exports._Selection(this._listView);
-                },
-
-                _dispose: function () {
-                    this._selected.clear();
-                    this._selected = null;
-                    this._listView = null;
-                },
-
-                _set: function (newSelection) {
-                    var that = this;
-                    return this._fireSelectionChanging(newSelection).then(function (approved) {
-                        if (approved) {
-                            that._selected.clear();
-                            that._selected = newSelection;
-                            that._listView._updateSelection();
-                            that._fireSelectionChanged();
-                        } else {
-                            newSelection.clear();
-                        }
-                        return approved;
-                    });
-                },
-
-                _fireSelectionChanging: function (newSelection) {
-                    var eventObject = _Global.document.createEvent("CustomEvent"),
-                        newSelectionUpdated = Promise.wrap();
-
-                    eventObject.initCustomEvent("selectionchanging", true, true, {
-                        newSelection: newSelection,
-                        preventTapBehavior: function () {
-                        },
-                        setPromise: function (promise) {
-                            /// <signature helpKeyword="WinJS.UI.SelectionManager.selectionchanging.setPromise">
-                            /// <summary locid="WinJS.UI.SelectionManager.selectionchanging.setPromise">
-                            /// Used to inform the ListView that asynchronous work is being performed, and that this
-                            /// event handler should not be considered complete until the promise completes.
-                            /// </summary>
-                            /// <param name="promise" type="WinJS.Promise" locid="WinJS.UI.SelectionManager.selectionchanging.setPromise_p:promise">
-                            /// The promise to wait for.
-                            /// </param>
-                            /// </signature>
-
-                            newSelectionUpdated = promise;
-                        }
-                    });
-
-                    var approved = this._listView._element.dispatchEvent(eventObject);
-                    return newSelectionUpdated.then(function () {
-                        return approved;
-                    });
-                },
-
-                _fireSelectionChanged: function () {
-                    var eventObject = _Global.document.createEvent("CustomEvent");
-                    eventObject.initCustomEvent("selectionchanged", true, false, null);
-                    this._listView._element.dispatchEvent(eventObject);
-                },
-
-                _getFocused: function () {
-                    return { type: this._focused.type, index: this._focused.index };
-                },
-
-                _setFocused: function (entity, keyboardFocused) {
-                    this._focused = { type: entity.type, index: entity.index };
-                    this._focusedByKeyboard = keyboardFocused;
-                },
-
-                _keyboardFocused: function () {
-                    return this._focusedByKeyboard;
-                },
-
-                _updateCount: function (count) {
-                    this._selected._itemsCount = count;
-                },
-
-                _isIncluded: function (index) {
-                    return this._selected._isIncluded(index);
-                },
-
-                _cloneSelection: function () {
-                    var newSelection = new exports._Selection(this._listView);
-                    newSelection._ranges = this._selected.getRanges();
-                    newSelection._itemsCount = this._selected._itemsCount;
-                    newSelection._retainRanges();
-                    return newSelection;
-                }
-            };
-            _SelectionManager.supportedForProcessing = false;
-            return _SelectionManager;
-        })
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ListView/_BrowseMode',[
-    'exports',
-    '../../Core/_Global',
-    '../../Core/_Base',
-    '../../Core/_BaseUtils',
-    '../../Animations',
-    '../../Promise',
-    '../../Utilities/_ElementUtilities',
-    '../../Utilities/_UI',
-    '../ItemContainer/_Constants',
-    '../ItemContainer/_ItemEventsHandler',
-    './_SelectionManager'
-], function browseModeInit(exports, _Global, _Base, _BaseUtils, Animations, Promise, _ElementUtilities, _UI, _Constants, _ItemEventsHandler, _SelectionManager) {
-    "use strict";
-
-    var transformName = _BaseUtils._browserStyleEquivalents["transform"].scriptName;
-    // This component is responsible for handling input in Browse Mode.
-    // When the user clicks on an item in this mode itemInvoked event is fired.
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-
-        _SelectionMode: _Base.Namespace._lazy(function () {
-
-            function clampToRange(first, last, x) {
-                return Math.max(first, Math.min(last, x));
-            }
-
-            function dispatchKeyboardNavigating(element, oldEntity, newEntity) {
-                var navigationEvent = _Global.document.createEvent("CustomEvent");
-                navigationEvent.initCustomEvent("keyboardnavigating", true, true, {
-                    oldFocus: oldEntity.index,
-                    oldFocusType: oldEntity.type,
-                    newFocus: newEntity.index,
-                    newFocusType: newEntity.type
-                });
-                return element.dispatchEvent(navigationEvent);
-            }
-
-            var _SelectionMode = _Base.Class.define(function _SelectionMode_ctor(modeSite) {
-                this.inboundFocusHandled = false;
-                this._pressedContainer = null;
-                this._pressedItemBox = null;
-                this._pressedHeader = null;
-                this._pressedEntity = { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX };
-                this._pressedPosition = null;
-
-                this.initialize(modeSite);
-            }, {
-                _dispose: function () {
-                    if (this._itemEventsHandler) {
-                        this._itemEventsHandler.dispose();
-                    }
-                    if (this._setNewFocusItemOffsetPromise) {
-                        this._setNewFocusItemOffsetPromise.cancel();
-                    }
-                },
-
-                initialize: function (modeSite) {
-                    this.site = modeSite;
-
-                    this._keyboardNavigationHandlers = {};
-                    this._keyboardAcceleratorHandlers = {};
-
-                    var site = this.site,
-                        that = this;
-                    this._itemEventsHandler = new _ItemEventsHandler._ItemEventsHandler(Object.create({
-                        containerFromElement: function (element) {
-                            return site._view.items.containerFrom(element);
-                        },
-                        indexForItemElement: function (element) {
-                            return site._view.items.index(element);
-                        },
-                        indexForHeaderElement: function (element) {
-                            return site._groups.index(element);
-                        },
-                        itemBoxAtIndex: function (index) {
-                            return site._view.items.itemBoxAt(index);
-                        },
-                        itemAtIndex: function (index) {
-                            return site._view.items.itemAt(index);
-                        },
-                        headerAtIndex: function (index) {
-                            return site._groups.group(index).header;
-                        },
-                        headerFromElement: function (element) {
-                            return site._groups.headerFrom(element);
-                        },
-                        containerAtIndex: function (index) {
-                            return site._view.items.containerAt(index);
-                        },
-                        isZombie: function () {
-                            return site._isZombie();
-                        },
-                        getItemPosition: function (entity) {
-                            return site._getItemPosition(entity);
-                        },
-                        rtl: function () {
-                            return site._rtl();
-                        },
-                        fireInvokeEvent: function (entity, itemElement) {
-                            return that._fireInvokeEvent(entity, itemElement);
-                        },
-                        verifySelectionAllowed: function (index) {
-                            return that._verifySelectionAllowed(index);
-                        },
-                        changeFocus: function (newFocus, skipSelection, ctrlKeyDown, skipEnsureVisible, keyboardFocused) {
-                            return site._changeFocus(newFocus, skipSelection, ctrlKeyDown, skipEnsureVisible, keyboardFocused);
-                        },
-                        selectRange: function (firstIndex, lastIndex, additive) {
-                            return that._selectRange(firstIndex, lastIndex, additive);
-                        }
-                    }, {
-                        pressedEntity: {
-                            enumerable: true,
-                            get: function () {
-                                return that._pressedEntity;
-                            },
-                            set: function (value) {
-                                that._pressedEntity = value;
-                            }
-                        },
-                        pressedContainerScaleTransform: {
-                            enumerable: true,
-                            get: function () {
-                                return that._pressedContainerScaleTransform;
-                            },
-                            set: function (value) {
-                                that._pressedContainerScaleTransform = value;
-                            }
-                        },
-                        pressedContainer: {
-                            enumerable: true,
-                            get: function () {
-                                return that._pressedContainer;
-                            },
-                            set: function (value) {
-                                that._pressedContainer = value;
-                            }
-                        },
-
-                        pressedItemBox: {
-                            enumerable: true,
-                            get: function () {
-                                return that._pressedItemBox;
-                            },
-                            set: function (value) {
-                                that._pressedItemBox = value;
-                            }
-                        },
-
-                        pressedHeader: {
-                            enumerable: true,
-                            get: function () {
-                                return that._pressedHeader;
-                            },
-                            set: function (value) {
-                                return that._pressedHeader = value;
-                            }
-                        },
-
-                        pressedPosition: {
-                            enumerable: true,
-                            get: function () {
-                                return that._pressedPosition;
-                            },
-                            set: function (value) {
-                                that._pressedPosition = value;
-                            }
-                        },
-
-                        pressedElement: {
-                            enumerable: true,
-                            set: function (value) {
-                                that._pressedElement = value;
-                            }
-                        },
-                        eventHandlerRoot: {
-                            enumerable: true,
-                            get: function () {
-                                return site._viewport;
-                            }
-                        },
-                        selectionMode: {
-                            enumerable: true,
-                            get: function () {
-                                return site._selectionMode;
-                            }
-                        },
-                        accessibleItemClass: {
-                            enumerable: true,
-                            get: function () {
-                                // CSS class of the element with the aria role
-                                return _Constants._itemClass;
-                            }
-                        },
-                        canvasProxy: {
-                            enumerable: true,
-                            get: function () {
-                                return site._canvasProxy;
-                            }
-                        },
-                        tapBehavior: {
-                            enumerable: true,
-                            get: function () {
-                                return site._tap;
-                            }
-                        },
-                        headerTapBehavior: {
-                            enumerable: true,
-                            get: function () {
-                                return site._groupHeaderTap;
-                            }
-                        },
-                        draggable: {
-                            enumerable: true,
-                            get: function () {
-                                return site.itemsDraggable || site.itemsReorderable;
-                            }
-                        },
-                        selection: {
-                            enumerable: true,
-                            get: function () {
-                                return site._selection;
-                            }
-                        },
-                        customFootprintParent: {
-                            enumerable: true,
-                            get: function () {
-                                return null;
-                            }
-                        }
-                    }));
-
-                    function createArrowHandler(direction, clampToBounds) {
-                        var handler = function (oldFocus) {
-                            return modeSite._view.getAdjacent(oldFocus, direction);
-                        };
-                        handler.clampToBounds = clampToBounds;
-                        return handler;
-                    }
-
-                    var Key = _ElementUtilities.Key;
-                    this._keyboardNavigationHandlers[Key.upArrow] = createArrowHandler(Key.upArrow);
-                    this._keyboardNavigationHandlers[Key.downArrow] = createArrowHandler(Key.downArrow);
-                    this._keyboardNavigationHandlers[Key.leftArrow] = createArrowHandler(Key.leftArrow);
-                    this._keyboardNavigationHandlers[Key.rightArrow] = createArrowHandler(Key.rightArrow);
-                    this._keyboardNavigationHandlers[Key.pageUp] = createArrowHandler(Key.pageUp, true);
-                    this._keyboardNavigationHandlers[Key.pageDown] = createArrowHandler(Key.pageDown, true);
-                    this._keyboardNavigationHandlers[Key.home] = function (oldFocus) {
-                        if (that.site._header && (oldFocus.type === _UI.ObjectType.groupHeader || oldFocus.type === _UI.ObjectType.footer)) {
-                            return Promise.wrap({ type: _UI.ObjectType.header, index: 0 });
-                        }
-
-
-                        return Promise.wrap({ type: (oldFocus.type !== _UI.ObjectType.footer ? oldFocus.type : _UI.ObjectType.groupHeader), index: 0 });
-                    };
-                    this._keyboardNavigationHandlers[Key.end] = function (oldFocus) {
-                        if (that.site._footer && (oldFocus.type === _UI.ObjectType.groupHeader || oldFocus.type === _UI.ObjectType.header)) {
-                            return Promise.wrap({ type: _UI.ObjectType.footer, index: 0 });
-                        } else if (oldFocus.type === _UI.ObjectType.groupHeader || oldFocus.type === _UI.ObjectType.header) {
-                            return Promise.wrap({ type: _UI.ObjectType.groupHeader, index: site._groups.length() - 1 });
-                        } else {
-                            // Get the index of the last container
-                            var lastIndex = that.site._view.lastItemIndex();
-                            if (lastIndex >= 0) {
-                                return Promise.wrap({ type: oldFocus.type, index: lastIndex });
-                            } else {
-                                return Promise.cancel;
-                            }
-                        }
-                    };
-
-                    this._keyboardAcceleratorHandlers[Key.a] = function () {
-                        if (that.site._multiSelection()) {
-                            that._selectAll();
-                        }
-                    };
-                },
-
-                staticMode: function SelectionMode_staticMode() {
-                    return this.site._tap === _UI.TapBehavior.none && this.site._selectionMode === _UI.SelectionMode.none;
-                },
-
-                itemUnrealized: function SelectionMode_itemUnrealized(index, itemBox) {
-                    if (this._pressedEntity.type === _UI.ObjectType.groupHeader) {
-                        return;
-                    }
-
-                    if (this._pressedEntity.index === index) {
-                        this._resetPointerDownState();
-                    }
-
-                    if (this._itemBeingDragged(index)) {
-                        for (var i = this._draggedItemBoxes.length - 1; i >= 0; i--) {
-                            if (this._draggedItemBoxes[i] === itemBox) {
-                                _ElementUtilities.removeClass(itemBox, _Constants._dragSourceClass);
-                                this._draggedItemBoxes.splice(i, 1);
-                            }
-                        }
-                    }
-                },
-
-                _fireInvokeEvent: function SelectionMode_fireInvokeEvent(entity, itemElement) {
-                    if (!itemElement) {
-                        return;
-                    }
-
-                    var that = this;
-                    function fireInvokeEventImpl(dataSource, isHeader) {
-                        var listBinding = dataSource.createListBinding(),
-                             promise = listBinding.fromIndex(entity.index),
-                             eventName = isHeader ? "groupheaderinvoked" : "iteminvoked";
-
-                        promise.done(function () {
-                            listBinding.release();
-                        });
-
-                        var eventObject = _Global.document.createEvent("CustomEvent");
-                        eventObject.initCustomEvent(eventName, true, true, isHeader ? {
-                            groupHeaderPromise: promise,
-                            groupHeaderIndex: entity.index
-                        } : {
-                            itemPromise: promise,
-                            itemIndex: entity.index
-                        });
-
-                        // If preventDefault was not called, call the default action on the site
-                        if (itemElement.dispatchEvent(eventObject)) {
-                            that.site._defaultInvoke(entity);
-                        }
-                    }
-
-                    if (entity.type === _UI.ObjectType.groupHeader) {
-                        if (this.site._groupHeaderTap === _UI.GroupHeaderTapBehavior.invoke &&
-                            entity.index !== _Constants._INVALID_INDEX) {
-                            fireInvokeEventImpl(this.site.groupDataSource, true);
-                        }
-                    } else {
-                        // We don't want to raise an iteminvoked event when the ListView's tapBehavior is none, or if it's in selection mode.
-                        if (this.site._tap !== _UI.TapBehavior.none && entity.index !== _Constants._INVALID_INDEX && !(this.site._isInSelectionMode())) {
-                            fireInvokeEventImpl(this.site.itemDataSource, false);
-                        }
-                    }
-                },
-
-                _verifySelectionAllowed: function SelectionMode_verifySelectionAllowed(entity) {
-                    if (entity.type === _UI.ObjectType.groupHeader) {
-                        return {
-                            canSelect: false,
-                            canTapSelect: false
-                        };
-                    }
-
-                    var itemIndex = entity.index;
-                    var site = this.site;
-                    var item = this.site._view.items.itemAt(itemIndex);
-                    if (site._selectionAllowed() && site._selectOnTap() && !(item && _ElementUtilities.hasClass(item, _Constants._nonSelectableClass))) {
-                        var selected = site._selection._isIncluded(itemIndex),
-                            single = !site._multiSelection(),
-                            newSelection = site._selection._cloneSelection();
-
-                        if (selected) {
-                            if (single) {
-                                newSelection.clear();
-                            } else {
-                                newSelection.remove(itemIndex);
-                            }
-                        } else {
-                            if (single) {
-                                newSelection.set(itemIndex);
-                            } else {
-                                newSelection.add(itemIndex);
-                            }
-                        }
-
-                        var eventObject = _Global.document.createEvent("CustomEvent"),
-                            newSelectionUpdated = Promise.wrap(),
-                            completed = false,
-                            preventTap = false,
-                            included;
-
-                        eventObject.initCustomEvent("selectionchanging", true, true, {
-                            newSelection: newSelection,
-                            preventTapBehavior: function () {
-                                preventTap = true;
-                            },
-                            setPromise: function (promise) {
-                                /// <signature helpKeyword="WinJS.UI.BrowseMode.selectionchanging.setPromise">
-                                /// <summary locid="WinJS.UI.BrowseMode.selectionchanging.setPromise">
-                                /// Used to inform the ListView that asynchronous work is being performed, and that this
-                                /// event handler should not be considered complete until the promise completes.
-                                /// </summary>
-                                /// <param name="promise" type="WinJS.Promise" locid="WinJS.UI.BrowseMode.selectionchanging.setPromise_p:promise">
-                                /// The promise to wait for.
-                                /// </param>
-                                /// </signature>
-
-                                newSelectionUpdated = promise;
-                            }
-                        });
-
-                        var defaultBehavior = site._element.dispatchEvent(eventObject);
-
-                        newSelectionUpdated.then(function () {
-                            completed = true;
-                            included = newSelection._isIncluded(itemIndex);
-                            newSelection.clear();
-                        });
-
-                        var canSelect = defaultBehavior && completed && (selected || included);
-
-                        return {
-                            canSelect: canSelect,
-                            canTapSelect: canSelect && !preventTap
-                        };
-                    } else {
-                        return {
-                            canSelect: false,
-                            canTapSelect: false
-                        };
-                    }
-                },
-
-                _containedInElementWithClass: function SelectionMode_containedInElementWithClass(element, className) {
-                    if (element.parentNode) {
-                        var matches = element.parentNode.querySelectorAll("." + className + ", ." + className + " *");
-                        for (var i = 0, len = matches.length; i < len; i++) {
-                            if (matches[i] === element) {
-                                return true;
-                            }
-                        }
-                    }
-                    return false;
-                },
-
-                _isDraggable: function SelectionMode_isDraggable(element) {
-                    return (!this._containedInElementWithClass(element, _Constants._nonDraggableClass));
-                },
-
-                _isInteractive: function SelectionMode_isInteractive(element) {
-                    return this._containedInElementWithClass(element, "win-interactive");
-                },
-
-                _resetPointerDownState: function SelectionMode_resetPointerDownState() {
-                    this._itemEventsHandler.resetPointerDownState();
-                },
-
-                onPointerDown: function SelectionMode_onPointerDown(eventObject) {
-                    this._itemEventsHandler.onPointerDown(eventObject);
-                },
-
-                onclick: function SelectionMode_onclick(eventObject) {
-                    this._itemEventsHandler.onClick(eventObject);
-                },
-
-                onPointerUp: function SelectionMode_onPointerUp(eventObject) {
-                    this._itemEventsHandler.onPointerUp(eventObject);
-                },
-
-                onPointerCancel: function SelectionMode_onPointerCancel(eventObject) {
-                    this._itemEventsHandler.onPointerCancel(eventObject);
-                },
-
-                onLostPointerCapture: function SelectionMode_onLostPointerCapture(eventObject) {
-                    this._itemEventsHandler.onLostPointerCapture(eventObject);
-                },
-
-                onContextMenu: function SelectionMode_onContextMenu(eventObject) {
-                    this._itemEventsHandler.onContextMenu(eventObject);
-                },
-
-                onMSHoldVisual: function SelectionMode_onMSHoldVisual(eventObject) {
-                    this._itemEventsHandler.onMSHoldVisual(eventObject);
-                },
-
-                onDataChanged: function SelectionMode_onDataChanged(eventObject) {
-                    this._itemEventsHandler.onDataChanged(eventObject);
-                },
-
-                _removeTransform: function SelectionMode_removeTransform(element, transform) {
-                    if (transform && element.style[transformName].indexOf(transform) !== -1) {
-                        element.style[transformName] = element.style[transformName].replace(transform, "");
-                    }
-                },
-
-                _selectAll: function SelectionMode_selectAll() {
-                    var unselectableRealizedItems = [];
-                    this.site._view.items.each(function (index, item) {
-                        if (item && _ElementUtilities.hasClass(item, _Constants._nonSelectableClass)) {
-                            unselectableRealizedItems.push(index);
-                        }
-                    });
-
-                    this.site._selection.selectAll();
-                    if (unselectableRealizedItems.length > 0) {
-                        this.site._selection.remove(unselectableRealizedItems);
-                    }
-                },
-
-                _selectRange: function SelectionMode_selectRange(firstIndex, lastIndex, additive) {
-                    var ranges = [];
-                    var currentStartRange = -1;
-                    for (var i = firstIndex; i <= lastIndex; i++) {
-                        var item = this.site._view.items.itemAt(i);
-                        if (item && _ElementUtilities.hasClass(item, _Constants._nonSelectableClass)) {
-                            if (currentStartRange !== -1) {
-                                ranges.push({
-                                    firstIndex: currentStartRange,
-                                    lastIndex: i - 1
-                                });
-                                currentStartRange = -1;
-                            }
-                        } else if (currentStartRange === -1) {
-                            currentStartRange = i;
-                        }
-                    }
-                    if (currentStartRange !== -1) {
-                        ranges.push({
-                            firstIndex: currentStartRange,
-                            lastIndex: lastIndex
-                        });
-                    }
-                    if (ranges.length > 0) {
-                        this.site._selection[additive ? "add" : "set"](ranges);
-                    }
-                },
-
-                onDragStart: function SelectionMode_onDragStart(eventObject) {
-                    this._pressedEntity = { type: _UI.ObjectType.item, index: this.site._view.items.index(eventObject.target) };
-                    this.site._selection._pivot = _Constants._INVALID_INDEX;
-                    // Drag shouldn't be initiated when the user holds down the mouse on a win-interactive element and moves.
-                    // The problem is that the dragstart event's srcElement+target will both be an itembox (which has draggable=true), so we can't check for win-interactive in the dragstart event handler.
-                    // The itemEventsHandler sets our _pressedElement field on MSPointerDown, so we use that instead when checking for interactive.
-                    if (this._pressedEntity.index !== _Constants._INVALID_INDEX &&
-                            (this.site.itemsDraggable || this.site.itemsReorderable) &&
-                            !this.site._view.animating &&
-                            this._isDraggable(eventObject.target) &&
-                            (!this._pressedElement || !this._isInteractive(this._pressedElement))) {
-                        this._dragging = true;
-                        this._dragDataTransfer = eventObject.dataTransfer;
-                        this._pressedPosition = _ElementUtilities._getCursorPos(eventObject);
-                        this._dragInfo = null;
-                        this._lastEnteredElement = eventObject.target;
-
-                        if (this.site._selection._isIncluded(this._pressedEntity.index)) {
-                            this._dragInfo = this.site.selection;
-                        } else {
-                            this._draggingUnselectedItem = true;
-                            this._dragInfo = new _SelectionManager._Selection(this.site, [{ firstIndex: this._pressedEntity.index, lastIndex: this._pressedEntity.index }]);
-                        }
-
-                        var dropTarget = this.site.itemsReorderable;
-                        var event = _Global.document.createEvent("CustomEvent");
-                        event.initCustomEvent("itemdragstart", true, false, {
-                            dataTransfer: eventObject.dataTransfer,
-                            dragInfo: this._dragInfo
-                        });
-
-                        // Firefox requires setData to be called on the dataTransfer object in order for DnD to continue.
-                        // Firefox also has an issue rendering the item's itemBox+element, so we need to use setDragImage, using the item's container, to get it to render.
-                        eventObject.dataTransfer.setData("text", "");
-                        if (eventObject.dataTransfer.setDragImage) {
-                            var pressedItemData = this.site._view.items.itemDataAt(this._pressedEntity.index);
-                            if (pressedItemData && pressedItemData.container) {
-                                var rect = pressedItemData.container.getBoundingClientRect();
-                                eventObject.dataTransfer.setDragImage(pressedItemData.container, eventObject.clientX - rect.left, eventObject.clientY - rect.top);
-                            }
-                        }
-                        this.site.element.dispatchEvent(event);
-                        if (this.site.itemsDraggable && !this.site.itemsReorderable) {
-                            if (!this._firedDragEnter) {
-                                if (this._fireDragEnterEvent(eventObject.dataTransfer)) {
-                                    dropTarget = true;
-                                    this._dragUnderstood = true;
-                                }
-                            }
-                        }
-
-                        if (dropTarget) {
-                            this._addedDragOverClass = true;
-                            _ElementUtilities.addClass(this.site._element, _Constants._dragOverClass);
-                        }
-
-                        this._draggedItemBoxes = [];
-
-                        var that = this;
-                        // A dragged element can be removed from the DOM by a number of actions - datasource removes/changes, being scrolled outside of the realized range, etc.
-                        // The dragend event is fired on the original source element of the drag. If that element isn't in the DOM, though, the dragend event will only be fired on the element
-                        // itself and not bubble up through the ListView's tree to the _viewport element where all the other drag event handlers are.
-                        // The dragend event handler has to be added to the event's srcElement so that we always receive the event, even when the source element is unrealized.
-                        var sourceElement = eventObject.target;
-                        sourceElement.addEventListener("dragend", function itemDragEnd(eventObject) {
-                            sourceElement.removeEventListener("dragend", itemDragEnd);
-                            that.onDragEnd(eventObject);
-                        });
-                        // We delay setting the opacity of the dragged items so that IE has time to create a thumbnail before me make them invisible
-                        _BaseUtils._yieldForDomModification(function () {
-                            if (that._dragging) {
-                                var indicesSelected = that._dragInfo.getIndices();
-                                for (var i = 0, len = indicesSelected.length; i < len; i++) {
-                                    var itemData = that.site._view.items.itemDataAt(indicesSelected[i]);
-                                    if (itemData && itemData.itemBox) {
-                                        that._addDragSourceClass(itemData.itemBox);
-                                    }
-                                }
-                            }
-                        });
-                    } else {
-                        eventObject.preventDefault();
-                    }
-                },
-
-                onDragEnter: function (eventObject) {
-                    var eventHandled = this._dragUnderstood;
-                    this._lastEnteredElement = eventObject.target;
-                    if (this._exitEventTimer) {
-                        _Global.clearTimeout(this._exitEventTimer);
-                        this._exitEventTimer = 0;
-                    }
-
-                    if (!this._firedDragEnter) {
-                        if (this._fireDragEnterEvent(eventObject.dataTransfer)) {
-                            eventHandled = true;
-                        }
-                    }
-
-                    if (eventHandled || (this._dragging && this.site.itemsReorderable)) {
-                        eventObject.preventDefault();
-                        this._dragUnderstood = true;
-                        if (!this._addedDragOverClass) {
-                            this._addedDragOverClass = true;
-                            _ElementUtilities.addClass(this.site._element, _Constants._dragOverClass);
-                        }
-                    }
-                    this._pointerLeftRegion = false;
-                },
-
-                onDragLeave: function (eventObject) {
-                    if (eventObject.target === this._lastEnteredElement) {
-                        this._pointerLeftRegion = true;
-                        this._handleExitEvent();
-                    }
-                },
-
-                fireDragUpdateEvent: function () {
-                    var event = _Global.document.createEvent("CustomEvent");
-                    event.initCustomEvent("itemdragchanged", true, false, {
-                        dataTransfer: this._dragDataTransfer,
-                        dragInfo: this._dragInfo
-                    });
-                    this.site.element.dispatchEvent(event);
-                },
-
-                _fireDragEnterEvent: function (dataTransfer) {
-                    var event = _Global.document.createEvent("CustomEvent");
-                    event.initCustomEvent("itemdragenter", true, true, {
-                        dataTransfer: dataTransfer
-                    });
-                    // The end developer must tell a ListView when a drag can be understood by calling preventDefault() on the event we fire
-                    var dropTarget = (!this.site.element.dispatchEvent(event));
-                    this._firedDragEnter = true;
-                    return dropTarget;
-                },
-
-                _fireDragBetweenEvent: function (index, insertAfterIndex, dataTransfer) {
-                    var event = _Global.document.createEvent("CustomEvent");
-                    event.initCustomEvent("itemdragbetween", true, true, {
-                        index: index,
-                        insertAfterIndex: insertAfterIndex,
-                        dataTransfer: dataTransfer
-                    });
-                    return this.site.element.dispatchEvent(event);
-                },
-
-                _fireDropEvent: function (index, insertAfterIndex, dataTransfer) {
-                    var event = _Global.document.createEvent("CustomEvent");
-                    event.initCustomEvent("itemdragdrop", true, true, {
-                        index: index,
-                        insertAfterIndex: insertAfterIndex,
-                        dataTransfer: dataTransfer
-                    });
-                    return this.site.element.dispatchEvent(event);
-                },
-
-                _handleExitEvent: function () {
-                    if (this._exitEventTimer) {
-                        _Global.clearTimeout(this._exitEventTimer);
-                        this._exitEventTimer = 0;
-                    }
-                    var that = this;
-                    this._exitEventTimer = _Global.setTimeout(function () {
-                        if (that.site._disposed) { return; }
-
-                        if (that._pointerLeftRegion) {
-                            that.site._layout.dragLeave && that.site._layout.dragLeave();
-                            that._pointerLeftRegion = false;
-                            that._dragUnderstood = false;
-                            that._lastEnteredElement = null;
-                            that._lastInsertPoint = null;
-                            that._dragBetweenDisabled = false;
-                            if (that._firedDragEnter) {
-                                var event = _Global.document.createEvent("CustomEvent");
-                                event.initCustomEvent("itemdragleave", true, false, {
-                                });
-                                that.site.element.dispatchEvent(event);
-                                that._firedDragEnter = false;
-                            }
-                            if (that._addedDragOverClass) {
-                                that._addedDragOverClass = false;
-                                _ElementUtilities.removeClass(that.site._element, _Constants._dragOverClass);
-                            }
-                            that._exitEventTimer = 0;
-                            that._stopAutoScroll();
-                        }
-                    }, 40);
-                },
-
-                _getEventPositionInElementSpace: function (element, eventObject) {
-                    var elementRect = { left: 0, top: 0 };
-                    try {
-                        elementRect = element.getBoundingClientRect();
-                    }
-                    catch (err) { }
-
-                    var computedStyle = _ElementUtilities._getComputedStyle(element, null),
-                        paddingLeft = parseInt(computedStyle["paddingLeft"]),
-                        paddingTop = parseInt(computedStyle["paddingTop"]),
-                        borderLeft = parseInt(computedStyle["borderLeftWidth"]),
-                        borderTop = parseInt(computedStyle["borderTopWidth"]),
-                        clientX = eventObject.clientX,
-                        clientY = eventObject.clientY;
-
-                    var position = {
-                        x: +clientX === clientX ? (clientX - elementRect.left - paddingLeft - borderLeft) : 0,
-                        y: +clientY === clientY ? (clientY - elementRect.top - paddingTop - borderTop) : 0
-                    };
-
-                    if (this.site._rtl()) {
-                        position.x = (elementRect.right - elementRect.left) - position.x;
-                    }
-
-                    return position;
-                },
-
-                _getPositionInCanvasSpace: function (eventObject) {
-                    var scrollLeft = this.site._horizontal() ? this.site.scrollPosition : 0,
-                        scrollTop = this.site._horizontal() ? 0 : this.site.scrollPosition,
-                        position = this._getEventPositionInElementSpace(this.site.element, eventObject);
-
-                    return {
-                        x: position.x + scrollLeft,
-                        y: position.y + scrollTop
-                    };
-                },
-
-                _itemBeingDragged: function (itemIndex) {
-                    if (!this._dragging) {
-                        return false;
-                    }
-
-                    return ((this._draggingUnselectedItem && this._dragInfo._isIncluded(itemIndex)) || (!this._draggingUnselectedItem && this.site._isSelected(itemIndex)));
-                },
-
-                _addDragSourceClass: function (itemBox) {
-                    this._draggedItemBoxes.push(itemBox);
-                    _ElementUtilities.addClass(itemBox, _Constants._dragSourceClass);
-                    if (itemBox.parentNode) {
-                        _ElementUtilities.addClass(itemBox.parentNode, _Constants._footprintClass);
-                    }
-                },
-
-                renderDragSourceOnRealizedItem: function (itemIndex, itemBox) {
-                    if (this._itemBeingDragged(itemIndex)) {
-                        this._addDragSourceClass(itemBox);
-                    }
-                },
-
-                onDragOver: function (eventObject) {
-                    if (!this._dragUnderstood) {
-                        return;
-                    }
-                    this._pointerLeftRegion = false;
-                    eventObject.preventDefault();
-
-                    var cursorPositionInCanvas = this._getPositionInCanvasSpace(eventObject),
-                        cursorPositionInRoot = this._getEventPositionInElementSpace(this.site.element, eventObject);
-                    this._checkAutoScroll(cursorPositionInRoot.x, cursorPositionInRoot.y);
-                    if (this.site._layout.hitTest) {
-                        if (this._autoScrollFrame) {
-                            if (this._lastInsertPoint) {
-                                this.site._layout.dragLeave();
-                                this._lastInsertPoint = null;
-                            }
-                        } else {
-                            var insertPoint = this.site._view.hitTest(cursorPositionInCanvas.x, cursorPositionInCanvas.y);
-                            insertPoint.insertAfterIndex = clampToRange(-1, this.site._cachedCount - 1, insertPoint.insertAfterIndex);
-                            if (!this._lastInsertPoint || this._lastInsertPoint.insertAfterIndex !== insertPoint.insertAfterIndex || this._lastInsertPoint.index !== insertPoint.index) {
-                                this._dragBetweenDisabled = !this._fireDragBetweenEvent(insertPoint.index, insertPoint.insertAfterIndex, eventObject.dataTransfer);
-                                if (!this._dragBetweenDisabled) {
-                                    this.site._layout.dragOver(cursorPositionInCanvas.x, cursorPositionInCanvas.y, this._dragInfo);
-                                } else {
-                                    this.site._layout.dragLeave();
-                                }
-                            }
-                            this._lastInsertPoint = insertPoint;
-                        }
-                    }
-                },
-
-                _clearDragProperties: function () {
-                    if (this._addedDragOverClass) {
-                        this._addedDragOverClass = false;
-                        _ElementUtilities.removeClass(this.site._element, _Constants._dragOverClass);
-                    }
-                    if (this._draggedItemBoxes) {
-                        for (var i = 0, len = this._draggedItemBoxes.length; i < len; i++) {
-                            _ElementUtilities.removeClass(this._draggedItemBoxes[i], _Constants._dragSourceClass);
-                            if (this._draggedItemBoxes[i].parentNode) {
-                                _ElementUtilities.removeClass(this._draggedItemBoxes[i].parentNode, _Constants._footprintClass);
-                            }
-                        }
-                        this._draggedItemBoxes = [];
-                    }
-                    this.site._layout.dragLeave();
-                    this._dragging = false;
-                    this._dragInfo = null;
-                    this._draggingUnselectedItem = false;
-                    this._dragDataTransfer = null;
-                    this._lastInsertPoint = null;
-                    this._resetPointerDownState();
-                    this._lastEnteredElement = null;
-                    this._dragBetweenDisabled = false;
-                    this._firedDragEnter = false;
-                    this._dragUnderstood = false;
-                    this._stopAutoScroll();
-                },
-
-                onDragEnd: function () {
-                    var event = _Global.document.createEvent("CustomEvent");
-                    event.initCustomEvent("itemdragend", true, false, {});
-                    this.site.element.dispatchEvent(event);
-                    this._clearDragProperties();
-                },
-
-                _findFirstAvailableInsertPoint: function (selectedItems, startIndex, searchForwards) {
-                    var indicesSelected = selectedItems.getIndices(),
-                        dropIndexInSelection = -1,
-                        count = this.site._cachedCount,
-                        selectionCount = indicesSelected.length,
-                        startIndexInSelection = -1,
-                        dropIndex = startIndex;
-                    for (var i = 0; i < selectionCount; i++) {
-                        if (indicesSelected[i] === dropIndex) {
-                            dropIndexInSelection = i;
-                            startIndexInSelection = i;
-                            break;
-                        }
-                    }
-
-                    while (dropIndexInSelection >= 0 && dropIndex >= 0) {
-                        if (searchForwards) {
-                            dropIndex++;
-                            if (dropIndexInSelection < selectionCount && indicesSelected[dropIndexInSelection + 1] === dropIndex && dropIndex < count) {
-                                dropIndexInSelection++;
-                            } else if (dropIndex >= count) {
-                                // If we hit the end of the list when looking for a new location ahead of our start index, it means everything from the starting point
-                                // to the end is selected, so no valid index can be located to move the items. We need to start searching again, moving backwards
-                                // from the starting location, to find the first available insert location to move the selected items.
-                                searchForwards = false;
-                                dropIndex = startIndex;
-                                dropIndexInSelection = startIndexInSelection;
-                            } else {
-                                dropIndexInSelection = -1;
-                            }
-                        } else {
-                            dropIndex--;
-                            if (dropIndexInSelection > 0 && indicesSelected[dropIndexInSelection - 1] === dropIndex) {
-                                dropIndexInSelection--;
-                            } else {
-                                dropIndexInSelection = -1;
-                            }
-                        }
-                    }
-
-                    return dropIndex;
-                },
-
-                _reorderItems: function (dropIndex, reorderedItems, reorderingUnselectedItem, useMoveBefore, ensureVisibleAtEnd) {
-                    var site = this.site;
-                    var updateSelection = function updatedSelectionOnDrop(items) {
-                        // Update selection if the items were selected. If there is a range with length > 0 a move operation
-                        // on the first or last item removes the range.
-                        if (!reorderingUnselectedItem) {
-                            site._selection.set({ firstKey: items[0].key, lastKey: items[items.length - 1].key });
-                        } else {
-                            site._selection.remove({ key: items[0].key });
-                        }
-                        if (ensureVisibleAtEnd) {
-                            site.ensureVisible(site._selection._getFocused());
-                        }
-                    };
-                    reorderedItems.getItems().then(function (items) {
-                        var ds = site.itemDataSource;
-                        if (dropIndex === -1) {
-                            ds.beginEdits();
-                            for (var i = items.length - 1; i >= 0; i--) {
-                                ds.moveToStart(items[i].key);
-                            }
-                            ds.endEdits();
-                            updateSelection(items);
-                        } else {
-                            var listBinding = ds.createListBinding();
-                            listBinding.fromIndex(dropIndex).then(function (item) {
-                                listBinding.release();
-                                ds.beginEdits();
-                                if (useMoveBefore) {
-                                    for (var i = 0, len = items.length; i < len; i++) {
-                                        ds.moveBefore(items[i].key, item.key);
-                                    }
-                                } else {
-                                    for (var i = items.length - 1; i >= 0; i--) {
-                                        ds.moveAfter(items[i].key, item.key);
-                                    }
-                                }
-                                ds.endEdits();
-                                updateSelection(items);
-                            });
-                        }
-                    });
-                },
-
-                onDrop: function SelectionMode_onDrop(eventObject) {
-                    // If the listview or the handler of the drop event we fire triggers a reorder, the dragged items can end up having different container nodes than what they started with.
-                    // Because of that, we need to remove the footprint class from the item boxes' containers before we do any processing of the drop event.
-                    if (this._draggedItemBoxes) {
-                        for (var i = 0, len = this._draggedItemBoxes.length; i < len; i++) {
-                            if (this._draggedItemBoxes[i].parentNode) {
-                                _ElementUtilities.removeClass(this._draggedItemBoxes[i].parentNode, _Constants._footprintClass);
-                            }
-                        }
-                    }
-                    if (!this._dragBetweenDisabled) {
-                        var cursorPosition = this._getPositionInCanvasSpace(eventObject);
-                        var dropLocation = this.site._view.hitTest(cursorPosition.x, cursorPosition.y),
-                            dropIndex = clampToRange(-1, this.site._cachedCount - 1, dropLocation.insertAfterIndex),
-                            allowDrop = true;
-                        // We don't fire dragBetween events during autoscroll, so if a user drops during autoscroll, we need to get up to date information
-                        // on the drop location, and fire dragBetween before the insert so that the developer can prevent the drop if they choose.
-                        if (!this._lastInsertPoint || this._lastInsertPoint.insertAfterIndex !== dropIndex || this._lastInsertPoint.index !== dropLocation.index) {
-                            allowDrop = this._fireDragBetweenEvent(dropLocation.index, dropIndex, eventObject.dataTransfer);
-                        }
-                        if (allowDrop) {
-                            this._lastInsertPoint = null;
-                            this.site._layout.dragLeave();
-                            if (this._fireDropEvent(dropLocation.index, dropIndex, eventObject.dataTransfer) && this._dragging && this.site.itemsReorderable) {
-                                if (this._dragInfo.isEverything() || this.site._groupsEnabled()) {
-                                    return;
-                                }
-
-                                dropIndex = this._findFirstAvailableInsertPoint(this._dragInfo, dropIndex, false);
-                                this._reorderItems(dropIndex, this._dragInfo, this._draggingUnselectedItem);
-                            }
-                        }
-                    }
-                    this._clearDragProperties();
-                    eventObject.preventDefault();
-                },
-
-                _checkAutoScroll: function (x, y) {
-                    var viewportSize = this.site._getViewportLength(),
-                        horizontal = this.site._horizontal(),
-                        cursorPositionInViewport = (horizontal ? x : y),
-                        canvasSize = this.site._viewport[horizontal ? "scrollWidth" : "scrollHeight"],
-                        scrollPosition = Math.floor(this.site.scrollPosition),
-                        travelRate = 0;
-
-                    if (cursorPositionInViewport < _Constants._AUTOSCROLL_THRESHOLD) {
-                        travelRate = cursorPositionInViewport - _Constants._AUTOSCROLL_THRESHOLD;
-                    } else if (cursorPositionInViewport > (viewportSize - _Constants._AUTOSCROLL_THRESHOLD)) {
-                        travelRate = (cursorPositionInViewport - (viewportSize - _Constants._AUTOSCROLL_THRESHOLD));
-                    }
-                    travelRate = Math.round((travelRate / _Constants._AUTOSCROLL_THRESHOLD) * (_Constants._MAX_AUTOSCROLL_RATE - _Constants._MIN_AUTOSCROLL_RATE));
-
-                    // If we're at the edge of the content, we don't need to keep scrolling. We'll set travelRate to 0 to stop the autoscroll timer.
-                    if ((scrollPosition === 0 && travelRate < 0) || (scrollPosition >= (canvasSize - viewportSize) && travelRate > 0)) {
-                        travelRate = 0;
-                    }
-                    if (travelRate === 0) {
-                        if (this._autoScrollDelay) {
-                            _Global.clearTimeout(this._autoScrollDelay);
-                            this._autoScrollDelay = 0;
-                        }
-                    } else {
-                        if (!this._autoScrollDelay && !this._autoScrollFrame) {
-                            var that = this;
-                            this._autoScrollDelay = _Global.setTimeout(function () {
-                                if (that._autoScrollRate) {
-                                    that._lastDragTimeout = _BaseUtils._now();
-                                    var nextFrame = function () {
-                                        if ((!that._autoScrollRate && that._autoScrollFrame) || that.site._disposed) {
-                                            that._stopAutoScroll();
-                                        } else {
-                                            // Timeout callbacks aren't reliably timed, so extra math is needed to figure out how far the scroll position should move since the last callback
-                                            var currentTime = _BaseUtils._now();
-                                            var delta = that._autoScrollRate * ((currentTime - that._lastDragTimeout) / 1000);
-                                            delta = (delta < 0 ? Math.min(-1, delta) : Math.max(1, delta));
-                                            var newScrollPos = {};
-                                            newScrollPos[that.site._scrollProperty] = that.site._viewportScrollPosition + delta;
-                                            _ElementUtilities.setScrollPosition(that.site._viewport, newScrollPos);
-                                            that._lastDragTimeout = currentTime;
-                                            that._autoScrollFrame = _BaseUtils._requestAnimationFrame(nextFrame);
-                                        }
-                                    };
-                                    that._autoScrollFrame = _BaseUtils._requestAnimationFrame(nextFrame);
-                                }
-                            }, _Constants._AUTOSCROLL_DELAY);
-                        }
-                    }
-                    this._autoScrollRate = travelRate;
-                },
-
-                _stopAutoScroll: function () {
-                    if (this._autoScrollDelay) {
-                        _Global.clearTimeout(this._autoScrollDelay);
-                        this._autoScrollDelay = 0;
-                    }
-                    this._autoScrollRate = 0;
-                    this._autoScrollFrame = 0;
-                },
-
-                onKeyDown: function SelectionMode_onKeyDown(eventObject) {
-                    var that = this,
-                        site = this.site,
-                        view = site._view,
-                        oldEntity = site._selection._getFocused(),
-                        handled = true,
-                        ctrlKeyDown = eventObject.ctrlKey;
-
-                    function setNewFocus(newEntity, skipSelection, clampToBounds) {
-                        function setNewFocusImpl(maxIndex) {
-                            var moveView = true,
-                                invalidIndex = false;
-                            // Since getKeyboardNavigatedItem is purely geometry oriented, it can return us out of bounds numbers, so this check is necessary
-                            if (clampToBounds) {
-                                newEntity.index = Math.max(0, Math.min(maxIndex, newEntity.index));
-                            } else if (newEntity.index < 0 || newEntity.index > maxIndex) {
-                                invalidIndex = true;
-                            }
-                            if (!invalidIndex && (oldEntity.index !== newEntity.index || oldEntity.type !== newEntity.type)) {
-                                var changeFocus = dispatchKeyboardNavigating(site._element, oldEntity, newEntity);
-                                if (changeFocus) {
-                                    moveView = false;
-
-                                    // If the oldEntity is completely off-screen then we mimic the desktop
-                                    // behavior. This is consistent with navbar keyboarding.
-                                    if (that._setNewFocusItemOffsetPromise) {
-                                        that._setNewFocusItemOffsetPromise.cancel();
-                                    }
-                                    site._batchViewUpdates(_Constants._ViewChange.realize, _Constants._ScrollToPriority.high, function () {
-                                        that._setNewFocusItemOffsetPromise = site._getItemOffset(oldEntity, true).then(function (range) {
-                                            range = site._convertFromCanvasCoordinates(range);
-                                            var oldItemOffscreen = range.end <= site.scrollPosition || range.begin >= site.scrollPosition + site._getViewportLength() - 1;
-                                            that._setNewFocusItemOffsetPromise = site._getItemOffset(newEntity).then(function (range) {
-                                                that._setNewFocusItemOffsetPromise = null;
-                                                var retVal = {
-                                                    position: site.scrollPosition,
-                                                    direction: "right"
-                                                };
-                                                if (oldItemOffscreen) {
-                                                    // oldEntity is completely off-screen
-                                                    site._selection._setFocused(newEntity, true);
-                                                    range = site._convertFromCanvasCoordinates(range);
-                                                    if (newEntity.index > oldEntity.index) {
-                                                        retVal.direction = "right";
-                                                        retVal.position = range.end - site._getViewportLength();
-                                                    } else {
-                                                        retVal.direction = "left";
-                                                        retVal.position = range.begin;
-                                                    }
-                                                }
-                                                site._changeFocus(newEntity, skipSelection, ctrlKeyDown, oldItemOffscreen, true);
-                                                if (!oldItemOffscreen) {
-                                                    return Promise.cancel;
-                                                } else {
-                                                    return retVal;
-                                                }
-                                            }, function (error) {
-                                                site._changeFocus(newEntity, skipSelection, ctrlKeyDown, true, true);
-                                                return Promise.wrapError(error);
-                                            });
-                                            return that._setNewFocusItemOffsetPromise;
-                                        }, function (error) {
-                                            site._changeFocus(newEntity, skipSelection, ctrlKeyDown, true, true);
-                                            return Promise.wrapError(error);
-                                        });
-                                        return that._setNewFocusItemOffsetPromise;
-                                    }, true);
-                                }
-                            }
-                            // When a key is pressed, we want to make sure the current focus is in view. If the keypress is changing to a new valid index,
-                            // _changeFocus will handle moving the viewport for us. If the focus isn't moving, though, we need to put the view back on
-                            // the current item ourselves and call setFocused(oldFocus, true) to make sure that the listview knows the focused item was
-                            // focused via keyboard and renders the rectangle appropriately.
-                            if (moveView) {
-                                site._selection._setFocused(oldEntity, true);
-                                site.ensureVisible(oldEntity);
-                            }
-                            if (invalidIndex) {
-                                return { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX };
-                            } else {
-                                return newEntity;
-                            }
-                        }
-
-                        // We need to get the final item in the view so that we don't try setting focus out of bounds.
-                        if (newEntity.type === _UI.ObjectType.item) {
-                            return Promise.wrap(view.lastItemIndex()).then(setNewFocusImpl);
-                        } else if (newEntity.type === _UI.ObjectType.groupHeader) {
-                            return Promise.wrap(site._groups.length() - 1).then(setNewFocusImpl);
-                        } else {
-                            return Promise.wrap(0).then(setNewFocusImpl);
-                        }
-                    }
-
-                    var Key = _ElementUtilities.Key,
-                        keyCode = eventObject.keyCode,
-                        rtl = site._rtl();
-
-                    if (!this._isInteractive(eventObject.target)) {
-                        if (eventObject.ctrlKey && !eventObject.altKey && !eventObject.shiftKey && this._keyboardAcceleratorHandlers[keyCode]) {
-                            this._keyboardAcceleratorHandlers[keyCode]();
-                        }
-                        if (site.itemsReorderable && (!eventObject.ctrlKey && eventObject.altKey && eventObject.shiftKey && oldEntity.type === _UI.ObjectType.item) &&
-                            (keyCode === Key.leftArrow || keyCode === Key.rightArrow || keyCode === Key.upArrow || keyCode === Key.downArrow)) {
-                            var selection = site._selection,
-                                focusedIndex = oldEntity.index,
-                                movingUnselectedItem = false,
-                                processReorder = true;
-                            if (!selection.isEverything()) {
-                                if (!selection._isIncluded(focusedIndex)) {
-                                    var item = site._view.items.itemAt(focusedIndex);
-                                    // Selected items should never be marked as non draggable, so we only need to check for nonDraggableClass when trying to reorder an unselected item.
-                                    if (item && _ElementUtilities.hasClass(item, _Constants._nonDraggableClass)) {
-                                        processReorder = false;
-                                    } else {
-                                        movingUnselectedItem = true;
-                                        selection = new _SelectionManager._Selection(this.site, [{ firstIndex: focusedIndex, lastIndex: focusedIndex }]);
-                                    }
-                                }
-                                if (processReorder) {
-                                    var dropIndex = focusedIndex;
-                                    if (keyCode === Key.rightArrow) {
-                                        dropIndex += (rtl ? -1 : 1);
-                                    } else if (keyCode === Key.leftArrow) {
-                                        dropIndex += (rtl ? 1 : -1);
-                                    } else if (keyCode === Key.upArrow) {
-                                        dropIndex--;
-                                    } else {
-                                        dropIndex++;
-                                    }
-                                    // If the dropIndex is larger than the original index, we're trying to move items forward, so the search for the first unselected item to insert after should move forward.
-                                    var movingAhead = (dropIndex > focusedIndex),
-                                        searchForward = movingAhead;
-                                    if (movingAhead && dropIndex >= this.site._cachedCount) {
-                                        // If we're at the end of the list and trying to move items forward, dropIndex should be >= cachedCount.
-                                        // That doesn't mean we don't have to do any reordering, though. A selection could be broken down into
-                                        // a few blocks. We need to make the selection contiguous after this reorder, so we've got to search backwards
-                                        // to find the first unselected item, then move everything in the selection after it.
-                                        searchForward = false;
-                                        dropIndex = this.site._cachedCount - 1;
-                                    }
-                                    dropIndex = this._findFirstAvailableInsertPoint(selection, dropIndex, searchForward);
-                                    dropIndex = Math.min(Math.max(-1, dropIndex), this.site._cachedCount - 1);
-                                    var reportedInsertAfterIndex = dropIndex - (movingAhead || dropIndex === -1 ? 0 : 1),
-                                        reportedIndex = dropIndex,
-                                        groupsEnabled = this.site._groupsEnabled();
-
-                                    if (groupsEnabled) {
-                                        // The indices we picked for the index/insertAfterIndex to report in our events is always correct in an ungrouped list,
-                                        // and mostly correct in a grouped list. The only problem occurs when you move an item (or items) ahead into a new group,
-                                        // or back into a previous group, such that the items should be the first/last in the group. Take this list as an example:
-                                        // [Group A] [a] [b] [c] [Group B] [d] [e]
-                                        // When [d] is focused, right/down arrow reports index: 4, insertAfterIndex: 4, which is right -- it means move [d] after [e].
-                                        // Similarily, when [c] is focused and left/up is pressed, we report index: 1, insertAfterIndex: 0 -- move [c] to after [a].
-                                        // Take note that index does not tell us where focus is / what item is being moved.
-                                        // Like mouse/touch DnD, index tells us what the dragBetween slots would be were we to animate a dragBetween.
-                                        // The problem cases are moving backwards into a previous group, or forward into the next group.
-                                        // If [c] were focused and the user pressed right/down, we would report index: 3, insertAfterIndex: 3. In other words, move [c] after [d].
-                                        // That's not right at all - [c] needs to become the first element of [Group B]. When we're moving ahead, then, and our dropIndex
-                                        // is the first index of a new group, we adjust insertAfterIndex to be dropIndex - 1. Now we'll report index:3, insertAfterIndex: 2, which means
-                                        // [c] is now the first element of [Group B], rather than the last element of [Group A]. This is exactly the same as what we would report when
-                                        // the user mouse/touch drags [c] right before [d].
-                                        // Similarily, when [d] is focused and we press left/up, without the logic below we would report index: 2, insertAfterIndex: 1, so we'd try to move
-                                        // [d] ahead of [b]. Again, [d] first needs the opportunity to become the last element in [Group A], so we adjust the insertAfterIndex up by 1.
-                                        // We then will report index:2, insertAfterIndex:2, meaning insert [d] in [Group A] after [c], which again mimics the mouse/touch API.
-                                        var groups = this.site._groups,
-                                            groupIndex = (dropIndex > -1 ? groups.groupFromItem(dropIndex) : 0);
-                                        if (movingAhead) {
-                                            if (groups.group(groupIndex).startIndex === dropIndex) {
-                                                reportedInsertAfterIndex--;
-                                            }
-                                        } else if (groupIndex < (groups.length() - 1) && dropIndex === (groups.group(groupIndex + 1).startIndex - 1)) {
-                                            reportedInsertAfterIndex++;
-                                        }
-                                    }
-
-                                    if (this._fireDragBetweenEvent(reportedIndex, reportedInsertAfterIndex, null) && this._fireDropEvent(reportedIndex, reportedInsertAfterIndex, null)) {
-                                        if (groupsEnabled) {
-                                            return;
-                                        }
-
-                                        this._reorderItems(dropIndex, selection, movingUnselectedItem, !movingAhead, true);
-                                    }
-                                }
-                            }
-                        } else if (!eventObject.altKey) {
-                            if (this._keyboardNavigationHandlers[keyCode]) {
-                                this._keyboardNavigationHandlers[keyCode](oldEntity).then(function (newEntity) {
-                                    if (newEntity.index !== oldEntity.index || newEntity.type !== oldEntity.type) {
-                                        var clampToBounds = that._keyboardNavigationHandlers[keyCode].clampToBounds;
-                                        if (newEntity.type !== _UI.ObjectType.groupHeader && eventObject.shiftKey && site._selectionAllowed() && site._multiSelection()) {
-                                            // Shift selection should work when shift or shift+ctrl are depressed
-                                            if (site._selection._pivot === _Constants._INVALID_INDEX) {
-                                                site._selection._pivot = oldEntity.index;
-                                            }
-                                            setNewFocus(newEntity, true, clampToBounds).then(function (newEntity) {
-                                                if (newEntity.index !== _Constants._INVALID_INDEX) {
-                                                    var firstIndex = Math.min(newEntity.index, site._selection._pivot),
-                                                        lastIndex = Math.max(newEntity.index, site._selection._pivot),
-                                                        additive = (eventObject.ctrlKey || site._tap === _UI.TapBehavior.toggleSelect);
-                                                    that._selectRange(firstIndex, lastIndex, additive);
-                                                }
-                                            });
-                                        } else {
-                                            site._selection._pivot = _Constants._INVALID_INDEX;
-                                            setNewFocus(newEntity, false, clampToBounds);
-                                        }
-                                    } else {
-                                        handled = false;
-                                    }
-
-                                });
-                            } else if (!eventObject.ctrlKey && keyCode === Key.enter) {
-                                var element = oldEntity.type === _UI.ObjectType.groupHeader ? site._groups.group(oldEntity.index).header : site._view.items.itemBoxAt(oldEntity.index);
-                                if (element) {
-                                    if (oldEntity.type === _UI.ObjectType.groupHeader) {
-                                        this._pressedHeader = element;
-                                        this._pressedItemBox = null;
-                                        this._pressedContainer = null;
-                                    } else {
-                                        this._pressedItemBox = element;
-                                        this._pressedContainer = site._view.items.containerAt(oldEntity.index);
-                                        this._pressedHeader = null;
-                                    }
-
-                                    var allowed = this._verifySelectionAllowed(oldEntity);
-                                    if (allowed.canTapSelect) {
-                                        this._itemEventsHandler.handleTap(oldEntity);
-                                    }
-                                    this._fireInvokeEvent(oldEntity, element);
-                                }
-                            } else if (oldEntity.type !== _UI.ObjectType.groupHeader && ((eventObject.ctrlKey && keyCode === Key.enter) || keyCode === Key.space)) {
-                                this._itemEventsHandler.toggleSelectionIfAllowed(oldEntity.index);
-                                site._changeFocus(oldEntity, true, ctrlKeyDown, false, true);
-                            } else if (keyCode === Key.escape && site._selection.count() > 0) {
-                                site._selection._pivot = _Constants._INVALID_INDEX;
-                                site._selection.clear();
-                            } else {
-                                handled = false;
-                            }
-                        } else {
-                            handled = false;
-                        }
-
-                        this._keyDownHandled = handled;
-                        if (handled) {
-                            eventObject.stopPropagation();
-                            eventObject.preventDefault();
-                        }
-                    }
-
-                    if (keyCode === Key.tab) {
-                        this.site._keyboardFocusInbound = true;
-                    }
-                },
-
-                onKeyUp: function (eventObject) {
-                    if (this._keyDownHandled) {
-                        eventObject.stopPropagation();
-                        eventObject.preventDefault();
-                    }
-                },
-
-                onTabEntered: function (eventObject) {
-                    if (this.site._groups.length() === 0 && !this.site._hasHeaderOrFooter) {
-                        return;
-                    }
-
-                    var site = this.site,
-                        focused = site._selection._getFocused(),
-                        forward = eventObject.detail;
-
-                    // We establish whether focus is incoming on the ListView by checking keyboard focus and the srcElement.
-                    // If the ListView did not have keyboard focus, then it is definitely incoming since keyboard focus is cleared
-                    // on blur which works for 99% of all scenarios. When the ListView is the only tabbable element on the page,
-                    // then tabbing out of the ListView will make focus wrap around and focus the ListView again. The blur event is
-                    // handled after TabEnter, so the keyboard focus flag is not yet cleared. Therefore, we examine the srcElement and see
-                    // if it is the _viewport since it is the first tabbable element in the ListView DOM tree.
-                    var inboundFocus = !site._hasKeyboardFocus || eventObject.target === site._viewport;
-                    if (inboundFocus) {
-                        this.inboundFocusHandled = true;
-
-                        // We tabbed into the ListView
-                        focused.index = (focused.index === _Constants._INVALID_INDEX ? 0 : focused.index);
-                        if (forward || !(this.site._supportsGroupHeaderKeyboarding || this.site._hasHeaderOrFooter)) {
-                            // We tabbed into the ListView from before the ListView, so focus should go to items
-                            var entity = { type: _UI.ObjectType.item };
-                            if (focused.type === _UI.ObjectType.groupHeader) {
-                                entity.index = site._groupFocusCache.getIndexForGroup(focused.index);
-                                if (dispatchKeyboardNavigating(site._element, focused, entity)) {
-                                    site._changeFocus(entity, true, false, false, true);
-                                } else {
-                                    site._changeFocus(focused, true, false, false, true);
-                                }
-                            } else {
-                                entity.index = (focused.type !== _UI.ObjectType.item ? site._groupFocusCache.getLastFocusedItemIndex() : focused.index);
-                                site._changeFocus(entity, true, false, false, true);
-                            }
-                            eventObject.preventDefault();
-                        } else {
-                            // We tabbed into the ListView from after the ListView, focus should go to headers
-                            var entity = { type: _UI.ObjectType.groupHeader };
-                            if (this.site._hasHeaderOrFooter) {
-                                if (this.site._lastFocusedElementInGroupTrack.type === _UI.ObjectType.groupHeader && this.site._supportsGroupHeaderKeyboarding) {
-                                    entity.index = site._groups.groupFromItem(focused.index);
-                                    if (dispatchKeyboardNavigating(site._element, focused, entity)) {
-                                        site._changeFocus(entity, true, false, false, true);
-                                    } else {
-                                        site._changeFocus(focused, true, false, false, true);
-                                    }
-                                } else {
-                                    entity.type = this.site._lastFocusedElementInGroupTrack.type;
-                                    entity.index = 0;
-                                    site._changeFocus(entity, true, false, false, true);
-                                }
-                            } else if (focused.type !== _UI.ObjectType.groupHeader && this.site._supportsGroupHeaderKeyboarding) {
-                                entity.index = site._groups.groupFromItem(focused.index);
-                                if (dispatchKeyboardNavigating(site._element, focused, entity)) {
-                                    site._changeFocus(entity, true, false, false, true);
-                                } else {
-                                    site._changeFocus(focused, true, false, false, true);
-                                }
-                            } else {
-                                entity.index = focused.index;
-                                site._changeFocus(entity, true, false, false, true);
-                            }
-                            eventObject.preventDefault();
-                        }
-                    }
-                },
-
-                onTabExiting: function (eventObject) {
-                    if (!this.site._hasHeaderOrFooter && (!this.site._supportsGroupHeaderKeyboarding || this.site._groups.length() === 0)) {
-                        return;
-                    }
-
-                    var site = this.site,
-                        focused = site._selection._getFocused(),
-                        forward = eventObject.detail;
-
-                    if (forward) {
-                        var entity = null;
-                        if (focused.type === _UI.ObjectType.item) {
-                            // Tabbing and we were focusing an item, go to headers.
-                            // If we last saw focus in the header track on the layout header/footer, we'll move focus back to there first. Otherwise, we'll let the group header take it.
-                            var lastType = this.site._lastFocusedElementInGroupTrack.type;
-                            if (lastType === _UI.ObjectType.header || lastType === _UI.ObjectType.footer || !this.site._supportsGroupHeaderKeyboarding) {
-                                var entity = { type: (lastType === _UI.ObjectType.item ? _UI.ObjectType.header : lastType), index: 0 };
-                            } else {
-                                var entity = { type: _UI.ObjectType.groupHeader, index: site._groups.groupFromItem(focused.index) };
-                            }
-
-                        }
-
-                        if (entity && dispatchKeyboardNavigating(site._element, focused, entity)) {
-                            site._changeFocus(entity, true, false, false, true);
-                            eventObject.preventDefault();
-                        }
-                    } else if (!forward && focused.type !== _UI.ObjectType.item) {
-                        // Shift tabbing and we were focusing a header, go to items
-                        var targetIndex = 0;
-                        if (focused.type === _UI.ObjectType.groupHeader) {
-                            targetIndex = site._groupFocusCache.getIndexForGroup(focused.index);
-                        } else {
-                            targetIndex = (focused.type === _UI.ObjectType.header ? 0 : site._view.lastItemIndex());
-                        }
-                        var entity = { type: _UI.ObjectType.item, index: targetIndex };
-                        if (dispatchKeyboardNavigating(site._element, focused, entity)) {
-                            site._changeFocus(entity, true, false, false, true);
-                            eventObject.preventDefault();
-                        }
-                    }
-                }
-            });
-            return _SelectionMode;
-        })
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ListView/_ErrorMessages',[
-        'exports',
-        '../../Core/_Base',
-        '../../Core/_Resources'
-    ], function errorMessagesInit(exports, _Base, _Resources) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, null, {
-
-        modeIsInvalid: {
-            get: function () { return "Invalid argument: mode must be one of following values: 'none', 'single' or 'multi'."; }
-        },
-
-        loadingBehaviorIsDeprecated: {
-            get: function () { return "Invalid configuration: loadingBehavior is deprecated. The control will default this property to 'randomAccess'. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior."; }
-        },
-
-        pagesToLoadIsDeprecated: {
-            get: function () { return "Invalid configuration: pagesToLoad is deprecated. The control will not use this property. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior."; }
-        },
-
-        pagesToLoadThresholdIsDeprecated: {
-            get: function () { return "Invalid configuration: pagesToLoadThreshold is deprecated.  The control will not use this property. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior."; }
-        },
-
-        automaticallyLoadPagesIsDeprecated: {
-            get: function () { return "Invalid configuration: automaticallyLoadPages is deprecated. The control will default this property to false. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior."; }
-        },
-
-        invalidTemplate: {
-            get: function () { return "Invalid template: Templates must be created before being passed to the ListView, and must contain a valid tree of elements."; }
-        },
-
-        loadMorePagesIsDeprecated: {
-            get: function () { return "loadMorePages is deprecated. Invoking this function will not have any effect. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior."; }
-        },
-
-        disableBackdropIsDeprecated: {
-            get: function () { return "Invalid configuration: disableBackdrop is deprecated. Style: .win-listview .win-container.win-backdrop { background-color:transparent; } instead."; }
-        },
-
-        backdropColorIsDeprecated: {
-            get: function () { return "Invalid configuration: backdropColor is deprecated. Style: .win-listview .win-container.win-backdrop { rgba(155,155,155,0.23); } instead."; }
-        },
-
-        itemInfoIsDeprecated: {
-            get: function () { return "GridLayout.itemInfo may be altered or unavailable in future versions. Instead, use CellSpanningLayout."; }
-        },
-
-        groupInfoIsDeprecated: {
-            get: function () { return "GridLayout.groupInfo may be altered or unavailable in future versions. Instead, use CellSpanningLayout."; }
-        },
-
-        resetItemIsDeprecated: {
-            get: function () { return "resetItem may be altered or unavailable in future versions. Instead, mark the element as disposable using WinJS.Utilities.markDisposable."; }
-        },
-
-        resetGroupHeaderIsDeprecated: {
-            get: function () { return "resetGroupHeader may be altered or unavailable in future versions. Instead, mark the header element as disposable using WinJS.Utilities.markDisposable."; }
-        },
-
-        maxRowsIsDeprecated: {
-            get: function () { return "GridLayout.maxRows may be altered or unavailable in future versions. Instead, use the maximumRowsOrColumns property."; }
-        },
-        swipeOrientationDeprecated: {
-            get: function () { return "Invalid configuration: swipeOrientation is deprecated. The control will default this property to 'none'"; }
-        },
-        swipeBehaviorDeprecated: {
-            get: function () { return "Invalid configuration: swipeBehavior is deprecated. The control will default this property to 'none'"; }
-        }
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ListView/_GroupFocusCache',[
-    'exports',
-    '../../Core/_Base'
-    ], function GroupFocusCacheInit(exports, _Base) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _GroupFocusCache: _Base.Namespace._lazy(function () {
-            return _Base.Class.define(function GroupFocusCache_ctor(listView) {
-                this._listView = listView;
-                this.clear();
-            }, {
-                // We store indices as strings in the cache so index=0 does not evaluate to false as
-                // when we check for the existance of an index in the cache. The index is converted
-                // back into a number when calling getIndexForGroup
-
-                updateCache: function (groupKey, itemKey, itemIndex) {
-                    this._lastFocusedItemKey = itemKey;
-                    this._lastFocusedItemIndex = itemIndex;
-                    itemIndex = "" + itemIndex;
-                    this._itemToIndex[itemKey] = itemIndex;
-                    this._groupToItem[groupKey] = itemKey;
-                },
-
-                deleteItem: function (itemKey) {
-                    if (itemKey === this._lastFocusedItemKey) {
-                        this._lastFocusedItemKey = null;
-                        this._lastFocusedItemIndex = 0;
-                    }
-
-                    if (!this._itemToIndex[itemKey]) {
-                        return;
-                    }
-
-                    var that = this;
-                    var keys = Object.keys(this._groupToItem);
-                    for (var i = 0, len = keys.length; i < len; i++) {
-                        var key = keys[i];
-                        if (that._groupToItem[key] === itemKey) {
-                            that.deleteGroup(key);
-                            break;
-                        }
-                    }
-                },
-
-                deleteGroup: function (groupKey) {
-                    var itemKey = this._groupToItem[groupKey];
-                    if (itemKey) {
-                        delete this._itemToIndex[itemKey];
-                    }
-                    delete this._groupToItem[groupKey];
-                },
-
-                updateItemIndex: function (itemKey, itemIndex) {
-                    if (itemKey === this._lastFocusedItemKey) {
-                        this._lastFocusedItemIndex = itemIndex;
-                    }
-
-                    if (!this._itemToIndex[itemKey]) {
-                        return;
-                    }
-                    this._itemToIndex[itemKey] = "" + itemIndex;
-                },
-
-                getIndexForGroup: function (groupIndex) {
-                    var groupKey = this._listView._groups.group(groupIndex).key;
-
-                    var itemKey = this._groupToItem[groupKey];
-                    if (itemKey && this._itemToIndex[itemKey]) {
-                        return +this._itemToIndex[itemKey];
-                    } else {
-                        return this._listView._groups.fromKey(groupKey).group.startIndex;
-                    }
-                },
-
-                clear: function () {
-                    this._groupToItem = {};
-                    this._itemToIndex = {};
-                    this._lastFocusedItemIndex = 0;
-                    this._lastFocusedItemKey = null;
-                },
-
-                getLastFocusedItemIndex: function () {
-                    return this._lastFocusedItemIndex;
-                }
-            });
-        }),
-
-        _UnsupportedGroupFocusCache: _Base.Namespace._lazy(function () {
-            return _Base.Class.define(null, {
-                updateCache: function (groupKey, itemKey, itemIndex) {
-                    this._lastFocusedItemKey = itemKey;
-                    this._lastFocusedItemIndex = itemIndex;
-                },
-
-                deleteItem: function (itemKey) {
-                    if (itemKey === this._lastFocusedItemKey) {
-                        this._lastFocusedItemKey = null;
-                        this._lastFocusedItemIndex = 0;
-                    }
-                },
-
-                deleteGroup: function () {
-                },
-
-                updateItemIndex: function (itemKey, itemIndex) {
-                    if (itemKey === this._lastFocusedItemKey) {
-                        this._lastFocusedItemIndex = itemIndex;
-                    }
-                },
-
-                getIndexForGroup: function () {
-                    return 0;
-                },
-
-                clear: function () {
-                    this._lastFocusedItemIndex = 0;
-                    this._lastFocusedItemKey = null;
-                },
-
-                getLastFocusedItemIndex: function () {
-                    return this._lastFocusedItemIndex;
-                }
-            });
-        })
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ListView/_GroupsContainer',[
-    'exports',
-    '../../Core/_Base',
-    '../../Promise',
-    '../../Utilities/_Dispose',
-    '../../Utilities/_ElementUtilities',
-    '../../Utilities/_ItemsManager',
-    '../../Utilities/_UI',
-    '../ItemContainer/_Constants'
-    ], function groupsContainerInit(exports, _Base, Promise, _Dispose, _ElementUtilities, _ItemsManager, _UI, _Constants) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _GroupsContainerBase: _Base.Namespace._lazy(function () {
-            return _Base.Class.define(function () {
-            }, {
-                index: function (element) {
-                    var header = this.headerFrom(element);
-                    if (header) {
-                        for (var i = 0, len = this.groups.length; i < len; i++) {
-                            if (header === this.groups[i].header) {
-                                return i;
-                            }
-                        }
-                    }
-                    return _Constants._INVALID_INDEX;
-                },
-
-                headerFrom: function (element) {
-                    while (element && !_ElementUtilities.hasClass(element, _Constants._headerClass)) {
-                        element = element.parentNode;
-                    }
-                    return element;
-                },
-
-                requestHeader: function GroupsContainerBase_requestHeader(index) {
-                    this._waitingHeaderRequests = this._waitingHeaderRequests || {};
-                    if (!this._waitingHeaderRequests[index]) {
-                        this._waitingHeaderRequests[index] = [];
-                    }
-
-                    var that = this;
-                    return new Promise(function (complete) {
-                        var group = that.groups[index];
-                        if (group && group.header) {
-                            complete(group.header);
-                        } else {
-                            that._waitingHeaderRequests[index].push(complete);
-                        }
-                    });
-                },
-
-                notify: function GroupsContainerBase_notify(index, header) {
-                    if (this._waitingHeaderRequests && this._waitingHeaderRequests[index]) {
-                        var requests = this._waitingHeaderRequests[index];
-                        for (var i = 0, len = requests.length; i < len; i++) {
-                            requests[i](header);
-                        }
-
-                        this._waitingHeaderRequests[index] = [];
-                    }
-                },
-
-                groupFromImpl: function GroupsContainerBase_groupFromImpl(fromGroup, toGroup, comp) {
-                    if (toGroup < fromGroup) {
-                        return null;
-                    }
-
-                    var center = fromGroup + Math.floor((toGroup - fromGroup) / 2),
-                        centerGroup = this.groups[center];
-
-                    if (comp(centerGroup, center)) {
-                        return this.groupFromImpl(fromGroup, center - 1, comp);
-                    } else if (center < toGroup && !comp(this.groups[center + 1], center + 1)) {
-                        return this.groupFromImpl(center + 1, toGroup, comp);
-                    } else {
-                        return center;
-                    }
-                },
-
-                groupFrom: function GroupsContainerBase_groupFrom(comp) {
-                    if (this.groups.length > 0) {
-                        var lastGroupIndex = this.groups.length - 1,
-                            lastGroup = this.groups[lastGroupIndex];
-
-                        if (!comp(lastGroup, lastGroupIndex)) {
-                            return lastGroupIndex;
-                        } else {
-                            return this.groupFromImpl(0, this.groups.length - 1, comp);
-                        }
-                    } else {
-                        return null;
-                    }
-                },
-
-                groupFromItem: function GroupsContainerBase_groupFromItem(itemIndex) {
-                    return this.groupFrom(function (group) {
-                        return itemIndex < group.startIndex;
-                    });
-                },
-
-                groupFromOffset: function GroupsContainerBase_groupFromOffset(offset) {
-                    return this.groupFrom(function (group) {
-                        return offset < group.offset;
-                    });
-                },
-
-                group: function GroupsContainerBase_getGroup(index) {
-                    return this.groups[index];
-                },
-
-                length: function GroupsContainerBase_length() {
-                    return this.groups.length;
-                },
-
-                cleanUp: function GroupsContainerBase_cleanUp() {
-                    if (this.listBinding) {
-                        for (var i = 0, len = this.groups.length; i < len; i++) {
-                            var group = this.groups[i];
-                            if (group.userData) {
-                                this.listBinding.releaseItem(group.userData);
-                            }
-                        }
-                        this.listBinding.release();
-                    }
-                },
-
-                _dispose: function GroupsContainerBase_dispose() {
-                    this.cleanUp();
-                },
-
-                synchronizeGroups: function GroupsContainerBase_synchronizeGroups() {
-                    var that = this;
-
-                    this.pendingChanges = [];
-                    this.ignoreChanges = true;
-                    return this.groupDataSource.invalidateAll().then(function () {
-                        return Promise.join(that.pendingChanges);
-                    }).then(function () {
-                        if (that._listView._ifZombieDispose()) {
-                            return Promise.cancel;
-                        }
-                    }).then(
-                        function () {
-                            that.ignoreChanges = false;
-                        },
-                        function (error) {
-                            that.ignoreChanges = false;
-                            return Promise.wrapError(error);
-                        }
-                    );
-                },
-
-                fromKey: function GroupsContainerBase_fromKey(key) {
-                    for (var i = 0, len = this.groups.length; i < len; i++) {
-                        var group = this.groups[i];
-                        if (group.key === key) {
-                            return {
-                                group: group,
-                                index: i
-                            };
-                        }
-                    }
-                    return null;
-                },
-
-                fromHandle: function GroupsContainerBase_fromHandle(handle) {
-                    for (var i = 0, len = this.groups.length; i < len; i++) {
-                        var group = this.groups[i];
-                        if (group.handle === handle) {
-                            return {
-                                group: group,
-                                index: i
-                            };
-                        }
-                    }
-                    return null;
-                }
-            });
-        }),
-
-        _UnvirtualizedGroupsContainer: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(exports._GroupsContainerBase, function (listView, groupDataSource) {
-                this._listView = listView;
-                this.groupDataSource = groupDataSource;
-                this.groups = [];
-                this.pendingChanges = [];
-                this.dirty = true;
-
-                var that = this,
-                notificationHandler = {
-                    beginNotifications: function GroupsContainer_beginNotifications() {
-                        that._listView._versionManager.beginNotifications();
-                    },
-
-                    endNotifications: function GroupsContainer_endNotifications() {
-                        that._listView._versionManager.endNotifications();
-
-                        if (that._listView._ifZombieDispose()) { return; }
-
-                        if (!that.ignoreChanges && that._listView._groupsChanged) {
-                            that._listView._scheduleUpdate();
-                        }
-                    },
-
-                    indexChanged: function GroupsContainer_indexChanged() {
-                        that._listView._versionManager.receivedNotification();
-
-                        if (that._listView._ifZombieDispose()) { return; }
-
-                        this.scheduleUpdate();
-                    },
-
-                    itemAvailable: function GroupsContainer_itemAvailable() {
-                    },
-
-                    countChanged: function GroupsContainer_countChanged(newCount) {
-                        that._listView._versionManager.receivedNotification();
-
-                        that._listView._writeProfilerMark("groupCountChanged(" + newCount + "),info");
-
-                        if (that._listView._ifZombieDispose()) { return; }
-
-                        this.scheduleUpdate();
-                    },
-
-                    changed: function GroupsContainer_changed(newItem) {
-                        that._listView._versionManager.receivedNotification();
-
-                        if (that._listView._ifZombieDispose()) { return; }
-
-                        var groupEntry = that.fromKey(newItem.key);
-                        if (groupEntry) {
-                            that._listView._writeProfilerMark("groupChanged(" + groupEntry.index + "),info");
-
-                            groupEntry.group.userData = newItem;
-                            groupEntry.group.startIndex = newItem.firstItemIndexHint;
-                            this.markToRemove(groupEntry.group);
-                        }
-
-                        this.scheduleUpdate();
-                    },
-
-                    removed: function GroupsContainer_removed(itemHandle) {
-                        that._listView._versionManager.receivedNotification();
-                        that._listView._groupRemoved(itemHandle);
-
-                        if (that._listView._ifZombieDispose()) { return; }
-
-                        var groupEntry = that.fromHandle(itemHandle);
-                        if (groupEntry) {
-                            that._listView._writeProfilerMark("groupRemoved(" + groupEntry.index + "),info");
-
-                            that.groups.splice(groupEntry.index, 1);
-                            var index = that.groups.indexOf(groupEntry.group, groupEntry.index);
-
-                            if (index > -1) {
-                                that.groups.splice(index, 1);
-                            }
-
-                            this.markToRemove(groupEntry.group);
-                        }
-
-                        this.scheduleUpdate();
-                    },
-
-                    inserted: function GroupsContainer_inserted(itemPromise, previousHandle, nextHandle) {
-                        that._listView._versionManager.receivedNotification();
-
-                        if (that._listView._ifZombieDispose()) { return; }
-
-                        that._listView._writeProfilerMark("groupInserted,info");
-
-                        var notificationHandler = this;
-                        itemPromise.retain().then(function (item) {
-
-                            var index;
-                            if (!previousHandle && !nextHandle && !that.groups.length) {
-                                index = 0;
-                            } else {
-                                index = notificationHandler.findIndex(previousHandle, nextHandle);
-                            }
-                            if (index !== -1) {
-                                var newGroup = {
-                                    key: item.key,
-                                    startIndex: item.firstItemIndexHint,
-                                    userData: item,
-                                    handle: itemPromise.handle
-                                };
-
-                                that.groups.splice(index, 0, newGroup);
-                            }
-                            notificationHandler.scheduleUpdate();
-                        });
-                        that.pendingChanges.push(itemPromise);
-                    },
-
-                    moved: function GroupsContainer_moved(itemPromise, previousHandle, nextHandle) {
-                        that._listView._versionManager.receivedNotification();
-
-                        if (that._listView._ifZombieDispose()) { return; }
-
-                        that._listView._writeProfilerMark("groupMoved,info");
-
-                        var notificationHandler = this;
-                        itemPromise.then(function (item) {
-                            var newIndex = notificationHandler.findIndex(previousHandle, nextHandle),
-                                groupEntry = that.fromKey(item.key);
-
-                            if (groupEntry) {
-                                that.groups.splice(groupEntry.index, 1);
-
-                                if (newIndex !== -1) {
-                                    if (groupEntry.index < newIndex) {
-                                        newIndex--;
-                                    }
-
-                                    groupEntry.group.key = item.key;
-                                    groupEntry.group.userData = item;
-                                    groupEntry.group.startIndex = item.firstItemIndexHint;
-                                    that.groups.splice(newIndex, 0, groupEntry.group);
-                                }
-
-                            } else if (newIndex !== -1) {
-                                var newGroup = {
-                                    key: item.key,
-                                    startIndex: item.firstItemIndexHint,
-                                    userData: item,
-                                    handle: itemPromise.handle
-                                };
-                                that.groups.splice(newIndex, 0, newGroup);
-                                itemPromise.retain();
-                            }
-
-                            notificationHandler.scheduleUpdate();
-                        });
-                        that.pendingChanges.push(itemPromise);
-                    },
-
-                    reload: function GroupsContainer_reload() {
-                        that._listView._versionManager.receivedNotification();
-
-                        if (that._listView._ifZombieDispose()) {
-                            return;
-                        }
-
-                        that._listView._processReload();
-                    },
-
-                    markToRemove: function GroupsContainer_markToRemove(group) {
-                        if (group.header) {
-                            var header = group.header;
-                            group.header = null;
-                            group.left = -1;
-                            group.width = -1;
-                            group.decorator = null;
-                            group.tabIndex = -1;
-                            header.tabIndex = -1;
-
-                            that._listView._groupsToRemove[_ElementUtilities._uniqueID(header)] = { group: group, header: header };
-                        }
-                    },
-
-                    scheduleUpdate: function GroupsContainer_scheduleUpdate() {
-                        that.dirty = true;
-                        if (!that.ignoreChanges) {
-                            that._listView._groupsChanged = true;
-                        }
-                    },
-
-                    findIndex: function GroupsContainer_findIndex(previousHandle, nextHandle) {
-                        var index = -1,
-                            groupEntry;
-
-                        if (previousHandle) {
-                            groupEntry = that.fromHandle(previousHandle);
-                            if (groupEntry) {
-                                index = groupEntry.index + 1;
-                            }
-                        }
-
-                        if (index === -1 && nextHandle) {
-                            groupEntry = that.fromHandle(nextHandle);
-                            if (groupEntry) {
-                                index = groupEntry.index;
-                            }
-                        }
-
-                        return index;
-                    },
-
-                    removeElements: function GroupsContainer_removeElements(group) {
-                        if (group.header) {
-                            var parentNode = group.header.parentNode;
-                            if (parentNode) {
-                                _Dispose.disposeSubTree(group.header);
-                                parentNode.removeChild(group.header);
-                            }
-                            group.header = null;
-                            group.left = -1;
-                            group.width = -1;
-                        }
-                    }
-                };
-
-                this.listBinding = this.groupDataSource.createListBinding(notificationHandler);
-            }, {
-                initialize: function UnvirtualizedGroupsContainer_initialize() {
-                    if (this.initializePromise) {
-                        this.initializePromise.cancel();
-                    }
-
-                    this._listView._writeProfilerMark("GroupsContainer_initialize,StartTM");
-
-                    var that = this;
-                    this.initializePromise = this.groupDataSource.getCount().then(function (count) {
-                        var promises = [];
-                        for (var i = 0; i < count; i++) {
-                            promises.push(that.listBinding.fromIndex(i).retain());
-                        }
-                        return Promise.join(promises);
-                    }).then(
-                        function (groups) {
-                            that.groups = [];
-
-                            for (var i = 0, len = groups.length; i < len; i++) {
-                                var group = groups[i];
-
-                                that.groups.push({
-                                    key: group.key,
-                                    startIndex: group.firstItemIndexHint,
-                                    handle: group.handle,
-                                    userData: group,
-                                });
-                            }
-                            that._listView._writeProfilerMark("GroupsContainer_initialize groups(" + groups.length + "),info");
-                            that._listView._writeProfilerMark("GroupsContainer_initialize,StopTM");
-                        },
-                        function (error) {
-                            that._listView._writeProfilerMark("GroupsContainer_initialize,StopTM");
-                            return Promise.wrapError(error);
-                        });
-                    return this.initializePromise;
-                },
-
-                renderGroup: function UnvirtualizedGroupsContainer_renderGroup(index) {
-                    if (this._listView.groupHeaderTemplate) {
-                        var group = this.groups[index];
-                        return Promise.wrap(this._listView._groupHeaderRenderer(Promise.wrap(group.userData))).then(_ItemsManager._normalizeRendererReturn);
-                    } else {
-                        return Promise.wrap(null);
-                    }
-                },
-
-                setDomElement: function UnvirtualizedGroupsContainer_setDomElement(index, headerElement) {
-                    this.groups[index].header = headerElement;
-                    this.notify(index, headerElement);
-                },
-
-                removeElements: function UnvirtualizedGroupsContainer_removeElements() {
-                    var elements = this._listView._groupsToRemove || {},
-                        keys = Object.keys(elements),
-                        focusedItemPurged = false;
-
-                    var focused = this._listView._selection._getFocused();
-                    for (var i = 0, len = keys.length; i < len; i++) {
-                        var group = elements[keys[i]],
-                            header = group.header,
-                            groupData = group.group;
-
-                        if (!focusedItemPurged && focused.type === _UI.ObjectType.groupHeader && groupData.userData.index === focused.index) {
-                            this._listView._unsetFocusOnItem();
-                            focusedItemPurged = true;
-                        }
-
-                        if (header) {
-                            var parentNode = header.parentNode;
-                            if (parentNode) {
-                                _Dispose._disposeElement(header);
-                                parentNode.removeChild(header);
-                            }
-                        }
-                    }
-
-                    if (focusedItemPurged) {
-                        this._listView._setFocusOnItem(focused);
-                    }
-
-                    this._listView._groupsToRemove = {};
-                },
-
-                resetGroups: function UnvirtualizedGroupsContainer_resetGroups() {
-                    var groups = this.groups.slice(0);
-
-                    for (var i = 0, len = groups.length; i < len; i++) {
-                        var group = groups[i];
-
-                        if (this.listBinding && group.userData) {
-                            this.listBinding.releaseItem(group.userData);
-                        }
-                    }
-
-                    // Set the lengths to zero to clear the arrays, rather than setting = [], which re-instantiates
-                    this.groups.length = 0;
-                    this.dirty = true;
-                }
-            });
-        }),
-
-        _NoGroups: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(exports._GroupsContainerBase, function (listView) {
-                this._listView = listView;
-                this.groups = [{ startIndex: 0 }];
-                this.dirty = true;
-            }, {
-                synchronizeGroups: function () {
-                    return Promise.wrap();
-                },
-
-                addItem: function () {
-                    return Promise.wrap(this.groups[0]);
-                },
-
-                resetGroups: function () {
-                    this.groups = [{ startIndex: 0 }];
-                    delete this.pinnedItem;
-                    delete this.pinnedOffset;
-                    this.dirty = true;
-                },
-
-                renderGroup: function () {
-                    return Promise.wrap(null);
-                },
-
-                ensureFirstGroup: function () {
-                    return Promise.wrap(this.groups[0]);
-                },
-
-                groupOf: function () {
-                    return Promise.wrap(this.groups[0]);
-                },
-
-                removeElements: function () {
-                }
-            });
-        })
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ListView/_Helpers',[
-    'exports',
-    '../../Core/_Base',
-    '../ItemContainer/_Constants'
-], function helpersInit(exports, _Base, _Constants) {
-    "use strict";
-
-    function nodeListToArray(nodeList) {
-        return Array.prototype.slice.call(nodeList);
-    }
-
-    function repeat(strings, count) {
-        // Continously concatenate a string or set of strings
-        // until the specified number of concatenations are made.
-        // e.g.
-        //  repeat("a", 3) ==> "aaa"
-        //  repeat(["a", "b"], 0) ==> ""
-        //  repeat(["a", "b", "c"], 2) ==> "ab"
-        //  repeat(["a", "b", "c"], 7) ==> "abcabca"
-        if (typeof strings === "string") {
-            return repeat([strings], count);
-        }
-        var result = new Array(Math.floor(count / strings.length) + 1).join(strings.join(""));
-        result += strings.slice(0, count % strings.length).join("");
-        return result;
-    }
-
-    function stripedContainers(count, nextItemIndex) {
-        var containersMarkup,
-            evenStripe = _Constants._containerEvenClass,
-            oddStripe = _Constants._containerOddClass,
-            stripes = nextItemIndex % 2 === 0 ? [evenStripe, oddStripe] : [oddStripe, evenStripe];
-
-        var pairOfContainers = [
-                "<div class='win-container " + stripes[0] + " win-backdrop'></div>",
-                "<div class='win-container " + stripes[1] + " win-backdrop'></div>"
-        ];
-
-        containersMarkup = repeat(pairOfContainers, count);
-        return containersMarkup;
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _nodeListToArray: nodeListToArray,
-        _repeat: repeat,
-        _stripedContainers: stripedContainers
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ListView/_ItemsContainer',[
-    'exports',
-    '../../Core/_Base',
-    '../../Promise',
-    '../../Utilities/_ElementUtilities',
-    '../ItemContainer/_Constants'
-    ], function itemsContainerInit(exports, _Base, Promise, _ElementUtilities, _Constants) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _ItemsContainer: _Base.Namespace._lazy(function () {
-
-            var _ItemsContainer = function (site) {
-                this.site = site;
-                this._itemData = {};
-                this.waitingItemRequests = {};
-            };
-            _ItemsContainer.prototype = {
-                requestItem: function ItemsContainer_requestItem(itemIndex) {
-                    if (!this.waitingItemRequests[itemIndex]) {
-                        this.waitingItemRequests[itemIndex] = [];
-                    }
-
-                    var that = this;
-                    var promise = new Promise(function (complete) {
-                        var itemData = that._itemData[itemIndex];
-                        if (itemData && !itemData.detached && itemData.element) {
-                            complete(itemData.element);
-                        } else {
-                            that.waitingItemRequests[itemIndex].push(complete);
-                        }
-                    });
-
-                    return promise;
-                },
-
-                removeItem: function (index) {
-                    delete this._itemData[index];
-                },
-
-                removeItems: function ItemsContainer_removeItems() {
-                    this._itemData = {};
-                    this.waitingItemRequests = {};
-                },
-
-                setItemAt: function ItemsContainer_setItemAt(itemIndex, itemData) {
-                    this._itemData[itemIndex] = itemData;
-                    if (!itemData.detached) {
-                        this.notify(itemIndex, itemData);
-                    }
-                },
-
-                notify: function ItemsContainer_notify(itemIndex, itemData) {
-                    if (this.waitingItemRequests[itemIndex]) {
-                        var requests = this.waitingItemRequests[itemIndex];
-                        for (var i = 0; i < requests.length; i++) {
-                            requests[i](itemData.element);
-                        }
-
-                        this.waitingItemRequests[itemIndex] = [];
-                    }
-                },
-
-                elementAvailable: function ItemsContainer_elementAvailable(itemIndex) {
-                    var itemData = this._itemData[itemIndex];
-                    itemData.detached = false;
-                    this.notify(itemIndex, itemData);
-                },
-
-                itemAt: function ItemsContainer_itemAt(itemIndex) {
-                    var itemData = this._itemData[itemIndex];
-                    return itemData ? itemData.element : null;
-                },
-
-                itemDataAt: function ItemsContainer_itemDataAt(itemIndex) {
-                    return this._itemData[itemIndex];
-                },
-
-                containerAt: function ItemsContainer_containerAt(itemIndex) {
-                    var itemData = this._itemData[itemIndex];
-                    return itemData ? itemData.container : null;
-                },
-
-                itemBoxAt: function ItemsContainer_itemBoxAt(itemIndex) {
-                    var itemData = this._itemData[itemIndex];
-                    return itemData ? itemData.itemBox : null;
-                },
-
-                itemBoxFrom: function ItemsContainer_containerFrom(element) {
-                    while (element && !_ElementUtilities.hasClass(element, _Constants._itemBoxClass)) {
-                        element = element.parentNode;
-                    }
-
-                    return element;
-                },
-
-                containerFrom: function ItemsContainer_containerFrom(element) {
-                    while (element && !_ElementUtilities.hasClass(element, _Constants._containerClass)) {
-                        element = element.parentNode;
-                    }
-
-                    return element;
-                },
-
-                index: function ItemsContainer_index(element) {
-                    var item = this.containerFrom(element);
-                    if (item) {
-                        for (var index in this._itemData) {
-                            if (this._itemData[index].container === item) {
-                                return parseInt(index, 10);
-                            }
-                        }
-                    }
-
-                    return _Constants._INVALID_INDEX;
-                },
-
-                each: function ItemsContainer_each(callback) {
-                    for (var index in this._itemData) {
-                        if (this._itemData.hasOwnProperty(index)) {
-                            var itemData = this._itemData[index];
-                            callback(parseInt(index, 10), itemData.element, itemData);
-                        }
-                    }
-                },
-
-                eachIndex: function ItemsContainer_each(callback) {
-                    for (var index in this._itemData) {
-                        if (callback(parseInt(index, 10))) {
-                            break;
-                        }
-                    }
-                },
-
-                count: function ItemsContainer_count() {
-                    return Object.keys(this._itemData).length;
-                }
-            };
-            return _ItemsContainer;
-        })
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ListView/_Layouts',[
-    'exports',
-    '../../Core/_Global',
-    '../../Core/_Base',
-    '../../Core/_BaseUtils',
-    '../../Core/_ErrorFromName',
-    '../../Core/_Resources',
-    '../../Core/_WriteProfilerMark',
-    '../../Animations/_TransitionAnimation',
-    '../../Promise',
-    '../../Scheduler',
-    '../../_Signal',
-    '../../Utilities/_Dispose',
-    '../../Utilities/_ElementUtilities',
-    '../../Utilities/_SafeHtml',
-    '../../Utilities/_UI',
-    '../ItemContainer/_Constants',
-    './_ErrorMessages'
-], function layouts2Init(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Resources, _WriteProfilerMark, _TransitionAnimation, Promise, Scheduler, _Signal, _Dispose, _ElementUtilities, _SafeHtml, _UI, _Constants, _ErrorMessages) {
-    "use strict";
-
-    var Key = _ElementUtilities.Key,
-        uniqueID = _ElementUtilities._uniqueID;
-
-    var strings = {
-        get itemInfoIsInvalid() { return "Invalid argument: An itemInfo function must be provided which returns an object with numeric width and height properties."; },
-        get groupInfoResultIsInvalid() { return "Invalid result: groupInfo result for cell spanning groups must include the following numeric properties: cellWidth and cellHeight."; }
-    };
-
-    //
-    // Helpers for dynamic CSS rules
-    //
-    // Rule deletions are delayed until the next rule insertion. This helps the
-    // scenario where a ListView changes layouts. By doing the rule manipulations
-    // in a single synchronous block, IE will do 1 layout pass instead of 2.
-    //
-
-    // Dynamic CSS rules will be added to this style element
-    var layoutStyleElem = _Global.document.createElement("style");
-    _Global.document.head.appendChild(layoutStyleElem);
-
-    var nextCssClassId = 0,
-        staleClassNames = [];
-
-    // The prefix for the class name should not contain dashes
-    function uniqueCssClassName(prefix) {
-        return "_win-dynamic-" + prefix + "-" + (nextCssClassId++);
-    }
-
-    var browserStyleEquivalents = _BaseUtils._browserStyleEquivalents;
-    var transformNames = browserStyleEquivalents["transform"];
-    var transitionScriptName = _BaseUtils._browserStyleEquivalents["transition"].scriptName;
-    var dragBetweenTransition = transformNames.cssName + " cubic-bezier(0.1, 0.9, 0.2, 1) 167ms";
-    var dragBetweenDistance = 12;
-
-    // Removes the dynamic CSS rules corresponding to the classes in staleClassNames
-    // from the DOM.
-    function flushDynamicCssRules() {
-        var rules = layoutStyleElem.sheet.cssRules,
-            classCount = staleClassNames.length,
-            i,
-            j,
-            ruleSuffix;
-
-        for (i = 0; i < classCount; i++) {
-            ruleSuffix = "." + staleClassNames[i] + " ";
-            for (j = rules.length - 1; j >= 0; j--) {
-                if (rules[j].selectorText.indexOf(ruleSuffix) !== -1) {
-                    layoutStyleElem.sheet.deleteRule(j);
-                }
-            }
-        }
-        staleClassNames = [];
-    }
-
-    // Creates a dynamic CSS rule and adds it to the DOM. uniqueToken is a class name
-    // which uniquely identifies a set of related rules. These rules may be removed
-    // using deleteDynamicCssRule. uniqueToken should be created using uniqueCssClassName.
-    function addDynamicCssRule(uniqueToken, site, selector, body) {
-        flushDynamicCssRules();
-        var rule = "." + _Constants._listViewClass + " ." + uniqueToken + " " + selector + " { " +
-             body +
-        "}";
-        var perfId = "_addDynamicCssRule:" + uniqueToken + ",info";
-        if (site) {
-            site._writeProfilerMark(perfId);
-        } else {
-            _WriteProfilerMark("WinJS.UI.ListView:Layout" + perfId);
-        }
-        layoutStyleElem.sheet.insertRule(rule, 0);
-    }
-
-    // Marks the CSS rules corresponding to uniqueToken for deletion. The rules
-    // should have been added by addDynamicCssRule.
-    function deleteDynamicCssRule(uniqueToken) {
-        staleClassNames.push(uniqueToken);
-    }
-
-    //
-    // Helpers shared by all layouts
-    //
-
-    // Clamps x to the range first <= x <= last
-    function clampToRange(first, last, x) {
-        return Math.max(first, Math.min(last, x));
-    }
-
-    function getDimension(element, property) {
-        return _ElementUtilities.convertToPixels(element, _ElementUtilities._getComputedStyle(element, null)[property]);
-    }
-
-    // Returns the sum of the margin, border, and padding for the side of the
-    // element specified by side. side can be "Left", "Right", "Top", or "Bottom".
-    function getOuter(side, element) {
-        return getDimension(element, "margin" + side) +
-            getDimension(element, "border" + side + "Width") +
-            getDimension(element, "padding" + side);
-    }
-
-    // Returns the total height of element excluding its content height
-    function getOuterHeight(element) {
-        return getOuter("Top", element) + getOuter("Bottom", element);
-    }
-
-    // Returns the total width of element excluding its content width
-    function getOuterWidth(element) {
-        return getOuter("Left", element) + getOuter("Right", element);
-    }
-
-    function forEachContainer(itemsContainer, callback) {
-        if (itemsContainer.items) {
-            for (var i = 0, len = itemsContainer.items.length; i < len; i++) {
-                callback(itemsContainer.items[i], i);
-            }
-        } else {
-            for (var b = 0, index = 0; b < itemsContainer.itemsBlocks.length; b++) {
-                var block = itemsContainer.itemsBlocks[b];
-                for (var i = 0, len = block.items.length; i < len; i++) {
-                    callback(block.items[i], index++);
-                }
-            }
-        }
-    }
-
-    function containerFromIndex(itemsContainer, index) {
-        if (index < 0) {
-            return null;
-        }
-        if (itemsContainer.items) {
-            return (index < itemsContainer.items.length ? itemsContainer.items[index] : null);
-        } else {
-            var blockSize = itemsContainer.itemsBlocks[0].items.length,
-                blockIndex = Math.floor(index / blockSize),
-                offset = index % blockSize;
-            return (blockIndex < itemsContainer.itemsBlocks.length && offset < itemsContainer.itemsBlocks[blockIndex].items.length ? itemsContainer.itemsBlocks[blockIndex].items[offset] : null);
-        }
-    }
-
-    function getItemsContainerTree(itemsContainer, tree) {
-        var itemsContainerTree;
-        for (var i = 0, treeLength = tree.length; i < treeLength; i++) {
-            if (tree[i].itemsContainer.element === itemsContainer) {
-                itemsContainerTree = tree[i].itemsContainer;
-                break;
-            }
-        }
-        return itemsContainerTree;
-    }
-
-    function getItemsContainerLength(itemsContainer) {
-        var blocksCount,
-            itemsCount;
-        if (itemsContainer.itemsBlocks) {
-            blocksCount = itemsContainer.itemsBlocks.length;
-            if (blocksCount > 0) {
-                itemsCount = (itemsContainer.itemsBlocks[0].items.length * (blocksCount - 1)) + itemsContainer.itemsBlocks[blocksCount - 1].items.length;
-            } else {
-                itemsCount = 0;
-            }
-        } else {
-            itemsCount = itemsContainer.items.length;
-        }
-        return itemsCount;
-    }
-
-    var environmentDetails = null;
-    // getEnvironmentSupportInformation does one-time checks on several browser-specific environment details (both to check the existence of styles,
-    // and also to see if some environments have layout bugs the ListView needs to work around).
-    function getEnvironmentSupportInformation(site) {
-        if (!environmentDetails) {
-            var surface = _Global.document.createElement("div");
-            surface.style.width = "500px";
-            surface.style.visibility = "hidden";
-
-            // Set up the DOM
-            var flexRoot = _Global.document.createElement("div");
-            flexRoot.style.cssText += "width: 500px; height: 200px; display: -webkit-flex; display: flex";
-            _SafeHtml.setInnerHTMLUnsafe(flexRoot,
-                "<div style='height: 100%; display: -webkit-flex; display: flex; flex-flow: column wrap; align-content: flex-start; -webkit-flex-flow: column wrap; -webkit-align-content: flex-start'>" +
-                    "<div style='width: 100px; height: 100px'></div>" +
-                    "<div style='width: 100px; height: 100px'></div>" +
-                    "<div style='width: 100px; height: 100px'></div>" +
-                "</div>");
-            surface.appendChild(flexRoot);
-
-            // Read from the DOM and detect the bugs
-            site.viewport.insertBefore(surface, site.viewport.firstChild);
-            var canMeasure = surface.offsetWidth > 0,
-                expectedWidth = 200;
-            if (canMeasure) {
-                // If we can't measure now (e.g. ListView is display:none), leave environmentDetails as null
-                // so that we do the detection later when the app calls recalculateItemPosition/forceLayout.
-
-                environmentDetails = {
-                    supportsCSSGrid: !!("-ms-grid-row" in _Global.document.documentElement.style),
-                    // Detects Chrome flex issue 345433: Incorrect sizing for nested flexboxes
-                    // https://code.google.com/p/chromium/issues/detail?id=345433
-                    // With nested flexboxes, the inner flexbox's width is proportional to the number of elements intead
-                    // of the number of columns.
-                    nestedFlexTooLarge: flexRoot.firstElementChild.offsetWidth > expectedWidth,
-
-                    // Detects Firefox issue 995020
-                    // https://bugzilla.mozilla.org/show_bug.cgi?id=995020
-                    // The three squares we're adding to the nested flexbox should increase the size of the nestedFlex to be 200 pixels wide. This is the case in IE but
-                    // currently not in Firefox. In Firefox, the third square will move to the next column, but the container's width won't update for it.
-                    nestedFlexTooSmall: flexRoot.firstElementChild.offsetWidth < expectedWidth
-                };
-            }
-
-            // Signal ListView's own measurement operation.
-            // ListView always needs an opportunity to measure, even if layout cannot.
-            site.readyToMeasure();
-
-            // Clean up the DOM
-            site.viewport.removeChild(surface);
-        }
-
-        return environmentDetails;
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        Layout: _Base.Class.define(function Layout_ctor() {
-            /// <signature helpKeyword="WinJS.UI.Layout">
-            /// <summary locid="WinJS.UI.Layout.constructor">
-            /// Creates a new Layout object.
-            /// </summary>
-            /// <param name="options" type="Object" locid="WinJS.UI.Layout.constructor_p:options">
-            /// The set of options to be applied initially to the new Layout object.
-            /// </param>
-            /// <returns type="WinJS.UI.Layout" locid="WinJS.UI.Layout.constructor_returnValue">
-            /// The new Layout object.
-            /// </returns>
-            /// </signature>
-        }),
-
-        _LayoutCommon: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(exports.Layout, null, {
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.HeaderPosition" locid="WinJS.UI._LayoutCommon.groupHeaderPosition" helpKeyword="WinJS.UI._LayoutCommon.groupHeaderPosition">
-                /// Gets or sets the position of group headers relative to their items.
-                /// The default value is "top".
-                /// </field>
-                groupHeaderPosition: {
-                    enumerable: true,
-                    get: function () {
-                        return this._groupHeaderPosition;
-                    },
-                    set: function (position) {
-                        this._groupHeaderPosition = position;
-                        this._invalidateLayout();
-                    }
-                },
-
-                // Implementation of part of ILayout interface
-
-                initialize: function _LayoutCommon_initialize(site, groupsEnabled) {
-                    site._writeProfilerMark("Layout:initialize,info");
-                    if (!this._inListMode) {
-                        _ElementUtilities.addClass(site.surface, _Constants._gridLayoutClass);
-                    }
-
-                    if (this._backdropColorClassName) {
-                        _ElementUtilities.addClass(site.surface, this._backdropColorClassName);
-                    }
-                    if (this._disableBackdropClassName) {
-                        _ElementUtilities.addClass(site.surface, this._disableBackdropClassName);
-                    }
-                    this._groups = [];
-                    this._groupMap = {};
-                    this._oldGroupHeaderPosition = null;
-                    this._usingStructuralNodes = false;
-
-                    this._site = site;
-                    this._groupsEnabled = groupsEnabled;
-                    this._resetAnimationCaches(true);
-                },
-
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.Orientation" locid="WinJS.UI._LayoutCommon.orientation" helpKeyword="WinJS.UI._LayoutCommon.orientation">
-                /// Gets or sets the orientation for the layout.
-                /// The default value is "horizontal".
-                /// </field>
-                orientation: {
-                    enumerable: true,
-                    get: function () {
-                        return this._orientation;
-                    },
-                    set: function (orientation) {
-                        this._orientation = orientation;
-                        this._horizontal = (orientation === "horizontal");
-                        this._invalidateLayout();
-                    }
-                },
-
-                uninitialize: function _LayoutCommon_uninitialize() {
-                    var perfId = "Layout:uninitialize,info";
-                    function cleanGroups(groups) {
-                        var len = groups.length,
-                            i;
-                        for (i = 0; i < len; i++) {
-                            groups[i].cleanUp(true);
-                        }
-                    }
-
-                    this._elementsToMeasure = {};
-
-                    if (this._site) {
-                        this._site._writeProfilerMark(perfId);
-                        _ElementUtilities.removeClass(this._site.surface, _Constants._gridLayoutClass);
-                        _ElementUtilities.removeClass(this._site.surface, _Constants._headerPositionTopClass);
-                        _ElementUtilities.removeClass(this._site.surface, _Constants._headerPositionLeftClass);
-                        _ElementUtilities.removeClass(this._site.surface, _Constants._structuralNodesClass);
-                        _ElementUtilities.removeClass(this._site.surface, _Constants._singleItemsBlockClass);
-                        _ElementUtilities.removeClass(this._site.surface, _Constants._noCSSGrid);
-                        this._site.surface.style.cssText = "";
-                        if (this._groups) {
-                            cleanGroups(this._groups);
-                            this._groups = null;
-                            this._groupMap = null;
-                        }
-                        if (this._layoutPromise) {
-                            this._layoutPromise.cancel();
-                            this._layoutPromise = null;
-                        }
-                        this._resetMeasurements();
-                        this._oldGroupHeaderPosition = null;
-                        this._usingStructuralNodes = false;
-                        this._envInfo = null;
-                        // The properties given to us by the app (_groupInfo, _itemInfo,
-                        // _groupHeaderPosition) are not cleaned up so that the values are
-                        // remembered if the layout is reused.
-
-                        if (this._backdropColorClassName) {
-                            _ElementUtilities.removeClass(this._site.surface, this._backdropColorClassName);
-                            deleteDynamicCssRule(this._backdropColorClassName);
-                            this._backdropColorClassName = null;
-                        }
-                        if (this._disableBackdropClassName) {
-                            _ElementUtilities.removeClass(this._site.surface, this._disableBackdropClassName);
-                            deleteDynamicCssRule(this._disableBackdropClassName);
-                            this._disableBackdropClassName = null;
-                        }
-
-                        this._site = null;
-                        this._groupsEnabled = null;
-                        if (this._animationsRunning) {
-                            this._animationsRunning.cancel();
-                        }
-                        this._animatingItemsBlocks = {};
-                    } else {
-                        _WriteProfilerMark("WinJS.UI.ListView:" + perfId);
-                    }
-                },
-
-                numberOfItemsPerItemsBlock: {
-                    get: function _LayoutCommon_getNumberOfItemsPerItemsBlock() {
-                        function allGroupsAreUniform() {
-                            var groupCount = that._site.groupCount,
-                                i;
-
-                            for (i = 0; i < groupCount; i++) {
-                                if (that._isCellSpanning(i)) {
-                                    return false;
-                                }
-                            }
-
-                            return true;
-                        }
-
-                        var that = this;
-                        return that._measureItem(0).then(function () {
-                            if (that._sizes.viewportContentSize !== that._getViewportCrossSize()) {
-                                that._viewportSizeChanged(that._getViewportCrossSize());
-                            }
-
-                            if (!allGroupsAreUniform()) {
-                                that._usingStructuralNodes = false;
-                                return null;
-                            } else if (that._envInfo.nestedFlexTooLarge || that._envInfo.nestedFlexTooSmall) {
-                                // Store all items in a single itemsblock
-                                that._usingStructuralNodes = true;
-                                return Number.MAX_VALUE;
-                            } else {
-                                that._usingStructuralNodes = exports._LayoutCommon._barsPerItemsBlock > 0;
-                                return exports._LayoutCommon._barsPerItemsBlock * that._itemsPerBar;
-                            }
-                        });
-                    }
-                },
-
-                layout: function _LayoutCommon_layout(tree, changedRange, modifiedItems, modifiedGroups) {
-                    // changedRange implies that the minimum amount of work the layout needs to do is as follows:
-                    // - It needs to lay out group shells (header containers and items containers) from
-                    //   firstChangedGroup thru lastGroup.
-                    // - It needs to ask firstChangedGroup thru lastChangedGroup to lay out their
-                    //   contents (i.e. win-containers).
-                    // - For each group included in the changedRange, it needs to lay out its
-                    //   contents (i.e. win-containers) from firstChangedItem thru lastItem.
-
-                    var that = this;
-                    var site = that._site,
-                        layoutPerfId = "Layout.layout",
-                        realizedRangePerfId = layoutPerfId + ":realizedRange",
-                        realizedRangePromise;
-
-                    that._site._writeProfilerMark(layoutPerfId + ",StartTM");
-                    that._site._writeProfilerMark(realizedRangePerfId + ",StartTM");
-
-                    // Receives an items container's tree and returns a normalized copy.
-                    // This allows us to hold on to a snapshot of the tree without
-                    // worrying that items may have been unexpectedly inserted/
-                    // removed/moved. The returned tree always appears as though
-                    // structural nodes are disabled.
-                    function copyItemsContainerTree(itemsContainer) {
-                        function copyItems(itemsContainer) {
-                            if (that._usingStructuralNodes) {
-                                var items = [];
-                                itemsContainer.itemsBlocks.forEach(function (itemsBlock) {
-                                    items = items.concat(itemsBlock.items.slice(0));
-                                });
-                                return items;
-                            } else {
-                                return itemsContainer.items.slice(0);
-                            }
-                        }
-
-                        return {
-                            element: itemsContainer.element,
-                            items: copyItems(itemsContainer)
-                        };
-                    }
-
-                    // Updates the GridLayout's internal state to reflect the current tree.
-                    // Similarly tells each group to update its internal state via prepareLayout.
-                    // After this function runs, the ILayout functions will return results that
-                    // are appropriate for the current tree.
-                    function updateGroups() {
-                        function createGroup(groupInfo, itemsContainer) {
-                            var GroupType = (groupInfo.enableCellSpanning ?
-                                Groups.CellSpanningGroup :
-                                Groups.UniformGroup);
-                            return new GroupType(that, itemsContainer);
-                        }
-
-                        var oldRealizedItemRange = (that._groups.length > 0 ?
-                                that._getRealizationRange() :
-                                null),
-                            newGroups = [],
-                            prepared = [],
-                            cleanUpDom = {},
-                            newGroupMap = {},
-                            currentIndex = 0,
-                            len = tree.length,
-                            i;
-
-                        for (i = 0; i < len; i++) {
-                            var oldChangedRealizedRangeInGroup = null,
-                                groupInfo = that._getGroupInfo(i),
-                                groupKey = that._site.groupFromIndex(i).key,
-                                oldGroup = that._groupMap[groupKey],
-                                wasCellSpanning = oldGroup instanceof Groups.CellSpanningGroup,
-                                isCellSpanning = groupInfo.enableCellSpanning;
-
-                            if (oldGroup) {
-                                if (wasCellSpanning !== isCellSpanning) {
-                                    // The group has changed types so DOM needs to be cleaned up
-                                    cleanUpDom[groupKey] = true;
-                                } else {
-                                    // Compute the range of changed items that is within the group's realized range
-                                    var firstChangedIndexInGroup = Math.max(0, changedRange.firstIndex - oldGroup.startIndex),
-                                        oldRealizedItemRangeInGroup = that._rangeForGroup(oldGroup, oldRealizedItemRange);
-                                    if (oldRealizedItemRangeInGroup && firstChangedIndexInGroup <= oldRealizedItemRangeInGroup.lastIndex) {
-                                        // The old changed realized range is non-empty
-                                        oldChangedRealizedRangeInGroup = {
-                                            firstIndex: Math.max(firstChangedIndexInGroup, oldRealizedItemRangeInGroup.firstIndex),
-                                            lastIndex: oldRealizedItemRangeInGroup.lastIndex
-                                        };
-                                    }
-                                }
-                            }
-                            var group = createGroup(groupInfo, tree[i].itemsContainer.element);
-                            var prepareLayoutPromise;
-                            if (group.prepareLayoutWithCopyOfTree) {
-                                prepareLayoutPromise = group.prepareLayoutWithCopyOfTree(copyItemsContainerTree(tree[i].itemsContainer), oldChangedRealizedRangeInGroup, oldGroup, {
-                                    groupInfo: groupInfo,
-                                    startIndex: currentIndex,
-                                });
-                            } else {
-                                prepareLayoutPromise = group.prepareLayout(getItemsContainerLength(tree[i].itemsContainer), oldChangedRealizedRangeInGroup, oldGroup, {
-                                    groupInfo: groupInfo,
-                                    startIndex: currentIndex,
-                                });
-                            }
-                            prepared.push(prepareLayoutPromise);
-
-                            currentIndex += group.count;
-
-                            newGroups.push(group);
-                            newGroupMap[groupKey] = group;
-                        }
-
-                        return Promise.join(prepared).then(function () {
-                            var currentOffset = 0;
-                            for (var i = 0, len = newGroups.length; i < len; i++) {
-                                var group = newGroups[i];
-                                group.offset = currentOffset;
-                                currentOffset += that._getGroupSize(group);
-                            }
-
-                            // Clean up deleted groups
-                            Object.keys(that._groupMap).forEach(function (deletedKey) {
-                                var skipDomCleanUp = !cleanUpDom[deletedKey];
-                                that._groupMap[deletedKey].cleanUp(skipDomCleanUp);
-                            });
-
-                            that._groups = newGroups;
-                            that._groupMap = newGroupMap;
-                        });
-                    }
-
-                    // When doRealizedRange is true, this function is synchronous and has no return value.
-                    // When doRealizedRange is false, this function is asynchronous and returns a promise.
-                    function layoutGroupContent(groupIndex, realizedItemRange, doRealizedRange) {
-                        var group = that._groups[groupIndex],
-                            firstChangedIndexInGroup = Math.max(0, changedRange.firstIndex - group.startIndex),
-                            realizedItemRangeInGroup = that._rangeForGroup(group, realizedItemRange),
-                            beforeRealizedRange;
-
-                        if (doRealizedRange) {
-                            group.layoutRealizedRange(firstChangedIndexInGroup, realizedItemRangeInGroup);
-                        } else {
-                            if (!realizedItemRangeInGroup) {
-                                beforeRealizedRange = (group.startIndex + group.count - 1 < realizedItemRange.firstIndex);
-                            }
-
-                            return group.layoutUnrealizedRange(firstChangedIndexInGroup, realizedItemRangeInGroup, beforeRealizedRange);
-                        }
-                    }
-
-                    // Synchronously lays out:
-                    // - Realized and unrealized group shells (header containers and items containers).
-                    //   This is needed so that each realized group will be positioned at the correct offset.
-                    // - Realized items.
-                    function layoutRealizedRange() {
-                        if (that._groups.length === 0) {
-                            return;
-                        }
-
-                        var realizedItemRange = that._getRealizationRange(),
-                            len = tree.length,
-                            i,
-                            firstChangedGroup = site.groupIndexFromItemIndex(changedRange.firstIndex);
-
-                        for (i = firstChangedGroup; i < len; i++) {
-                            layoutGroupContent(i, realizedItemRange, true);
-                            that._layoutGroup(i);
-                        }
-                    }
-
-                    // Asynchronously lays out the unrealized items
-                    function layoutUnrealizedRange() {
-                        if (that._groups.length === 0) {
-                            return Promise.wrap();
-                        }
-
-                        var realizedItemRange = that._getRealizationRange(),
-                            // Last group before the realized range which contains 1 or more unrealized items
-                            lastGroupBefore = site.groupIndexFromItemIndex(realizedItemRange.firstIndex - 1),
-                            // First group after the realized range which contains 1 or more unrealized items
-                            firstGroupAfter = site.groupIndexFromItemIndex(realizedItemRange.lastIndex + 1),
-                            firstChangedGroup = site.groupIndexFromItemIndex(changedRange.firstIndex),
-                            layoutPromises = [],
-                            groupCount = that._groups.length;
-
-                        var stop = false;
-                        var before = lastGroupBefore;
-                        var after = Math.max(firstChangedGroup, firstGroupAfter);
-                        after = Math.max(before + 1, after);
-                        while (!stop) {
-                            stop = true;
-                            if (before >= firstChangedGroup) {
-                                layoutPromises.push(layoutGroupContent(before, realizedItemRange, false));
-                                stop = false;
-                                before--;
-                            }
-                            if (after < groupCount) {
-                                layoutPromises.push(layoutGroupContent(after, realizedItemRange, false));
-                                stop = false;
-                                after++;
-                            }
-                        }
-
-                        return Promise.join(layoutPromises);
-                    }
-
-                    realizedRangePromise = that._measureItem(0).then(function () {
-                        _ElementUtilities[(that._usingStructuralNodes) ? "addClass" : "removeClass"]
-                            (that._site.surface, _Constants._structuralNodesClass);
-                        _ElementUtilities[(that._envInfo.nestedFlexTooLarge || that._envInfo.nestedFlexTooSmall) ? "addClass" : "removeClass"]
-                            (that._site.surface, _Constants._singleItemsBlockClass);
-
-                        if (that._sizes.viewportContentSize !== that._getViewportCrossSize()) {
-                            that._viewportSizeChanged(that._getViewportCrossSize());
-                        }
-
-                        // Move deleted elements to their original positions before calling updateGroups can be slow.
-                        that._cacheRemovedElements(modifiedItems, that._cachedItemRecords, that._cachedInsertedItemRecords, that._cachedRemovedItems, false);
-                        that._cacheRemovedElements(modifiedGroups, that._cachedHeaderRecords, that._cachedInsertedHeaderRecords, that._cachedRemovedHeaders, true);
-
-                        return updateGroups();
-                    }).then(function () {
-                        that._syncDomWithGroupHeaderPosition(tree);
-                        var surfaceLength = 0;
-                        if (that._groups.length > 0) {
-                            var lastGroup = that._groups[that._groups.length - 1];
-                            surfaceLength = lastGroup.offset + that._getGroupSize(lastGroup);
-                        }
-
-                        // Explicitly set the surface width/height. This maintains backwards
-                        // compatibility with the original layouts by allowing the items
-                        // to be shifted through surface margins.
-                        if (that._horizontal) {
-                            if (that._groupsEnabled && that._groupHeaderPosition === HeaderPosition.left) {
-                                site.surface.style.cssText +=
-                                    ";height:" + that._sizes.surfaceContentSize +
-                                    "px;-ms-grid-columns: (" + that._sizes.headerContainerWidth + "px auto)[" + tree.length + "]";
-                            } else {
-                                site.surface.style.height = that._sizes.surfaceContentSize + "px";
-                            }
-                            if (that._envInfo.nestedFlexTooLarge || that._envInfo.nestedFlexTooSmall) {
-                                site.surface.style.width = surfaceLength + "px";
-                            }
-                        } else {
-                            if (that._groupsEnabled && that._groupHeaderPosition === HeaderPosition.top) {
-                                site.surface.style.cssText +=
-                                    ";width:" + that._sizes.surfaceContentSize +
-                                    "px;-ms-grid-rows: (" + that._sizes.headerContainerHeight + "px auto)[" + tree.length + "]";
-                            } else {
-                                site.surface.style.width = that._sizes.surfaceContentSize + "px";
-                            }
-                            if (that._envInfo.nestedFlexTooLarge || that._envInfo.nestedFlexTooSmall) {
-                                site.surface.style.height = surfaceLength + "px";
-                            }
-                        }
-
-                        layoutRealizedRange();
-
-                        that._layoutAnimations(modifiedItems, modifiedGroups);
-
-                        that._site._writeProfilerMark(realizedRangePerfId + ":complete,info");
-                        that._site._writeProfilerMark(realizedRangePerfId + ",StopTM");
-                    }, function (error) {
-                        that._site._writeProfilerMark(realizedRangePerfId + ":canceled,info");
-                        that._site._writeProfilerMark(realizedRangePerfId + ",StopTM");
-                        return Promise.wrapError(error);
-                    });
-
-                    that._layoutPromise = realizedRangePromise.then(function () {
-                        return layoutUnrealizedRange().then(function () {
-                            that._site._writeProfilerMark(layoutPerfId + ":complete,info");
-                            that._site._writeProfilerMark(layoutPerfId + ",StopTM");
-                        }, function (error) {
-                            that._site._writeProfilerMark(layoutPerfId + ":canceled,info");
-                            that._site._writeProfilerMark(layoutPerfId + ",StopTM");
-                            return Promise.wrapError(error);
-                        });
-                    });
-
-                    return {
-                        realizedRangeComplete: realizedRangePromise,
-                        layoutComplete: that._layoutPromise
-                    };
-                },
-
-                itemsFromRange: function _LayoutCommon_itemsFromRange(firstPixel, lastPixel) {
-                    if (this._rangeContainsItems(firstPixel, lastPixel)) {
-                        return {
-                            firstIndex: this._firstItemFromRange(firstPixel),
-                            lastIndex: this._lastItemFromRange(lastPixel)
-                        };
-                    } else {
-                        return {
-                            firstIndex: 0,
-                            lastIndex: -1
-                        };
-                    }
-
-                },
-
-                getAdjacent: function _LayoutCommon_getAdjacent(currentItem, pressedKey) {
-                    var that = this,
-                        groupIndex = that._site.groupIndexFromItemIndex(currentItem.index),
-                        group = that._groups[groupIndex],
-                        adjustedKey = that._adjustedKeyForOrientationAndBars(that._adjustedKeyForRTL(pressedKey), group instanceof Groups.CellSpanningGroup);
-
-                    if (!currentItem.type) {
-                        currentItem.type = _UI.ObjectType.item;
-                    }
-                    if (currentItem.type !== _UI.ObjectType.item && (pressedKey === Key.pageUp || pressedKey === Key.pageDown)) {
-                        // We treat page up and page down keys as if an item had focus
-                        var itemIndex = 0;
-                        if (currentItem.type === _UI.ObjectType.groupHeader) {
-                            itemIndex = that._groups[currentItem.index].startIndex;
-                        } else {
-                            itemIndex = (currentItem.type === _UI.ObjectType.header ? 0 : that._groups[that._groups.length - 1].count - 1);
-                        }
-                        currentItem = { type: _UI.ObjectType.item, index: itemIndex };
-                    }else if (currentItem.type === _UI.ObjectType.header && adjustedKey === Key.rightArrow) {
-                        return { type: (that._groupsEnabled ? _UI.ObjectType.groupHeader : _UI.ObjectType.footer), index: 0 };
-                    } else if (currentItem.type === _UI.ObjectType.footer && adjustedKey === Key.leftArrow) {
-                        return { type: (that._groupsEnabled ? _UI.ObjectType.groupHeader : _UI.ObjectType.header), index: 0 };
-                    } else if (currentItem.type === _UI.ObjectType.groupHeader) {
-                        if (adjustedKey === Key.leftArrow) {
-                            var desiredIndex = currentItem.index - 1;
-                            desiredIndex = (that._site.header ? desiredIndex : Math.max(0, desiredIndex));
-                            return {
-                                type: (desiredIndex > -1 ? _UI.ObjectType.groupHeader : _UI.ObjectType.header),
-                                index: (desiredIndex > -1 ? desiredIndex : 0)
-                            };
-                        } else if (adjustedKey === Key.rightArrow) {
-                            var desiredIndex = currentItem.index + 1;
-                            desiredIndex = (that._site.header ? desiredIndex : Math.min(that._groups.length - 1, currentItem.index + 1));
-                            return {
-                                type: (desiredIndex >= that._groups.length ? _UI.ObjectType.header : _UI.ObjectType.groupHeader),
-                                index: (desiredIndex >= that._groups.length ? 0 : desiredIndex)
-                            };
-                        }
-                        return currentItem;
-                    }
-
-                    function handleArrowKeys() {
-                        var currentItemInGroup = {
-                            type: currentItem.type,
-                            index: currentItem.index - group.startIndex
-                        },
-                            newItem = group.getAdjacent(currentItemInGroup, adjustedKey);
-
-                        if (newItem === "boundary") {
-                            var prevGroup = that._groups[groupIndex - 1],
-                                nextGroup = that._groups[groupIndex + 1],
-                                lastGroupIndex = that._groups.length - 1;
-
-                            if (adjustedKey === Key.leftArrow) {
-                                if (groupIndex === 0) {
-                                    // We're at the beginning of the first group so stay put
-                                    return currentItem;
-                                } else if (prevGroup instanceof Groups.UniformGroup && group instanceof Groups.UniformGroup) {
-                                    // Moving between uniform groups so maintain the row/column if possible
-                                    var coordinates = that._indexToCoordinate(currentItemInGroup.index);
-                                    var currentSlot = (that._horizontal ? coordinates.row : coordinates.column),
-                                        indexOfLastBar = Math.floor((prevGroup.count - 1) / that._itemsPerBar),
-                                        startOfLastBar = indexOfLastBar * that._itemsPerBar; // first cell of last bar
-                                    return {
-                                        type: _UI.ObjectType.item,
-                                        index: prevGroup.startIndex + Math.min(prevGroup.count - 1, startOfLastBar + currentSlot)
-                                    };
-                                } else {
-                                    // Moving to or from a cell spanning group so go to the last item
-                                    return { type: _UI.ObjectType.item, index: group.startIndex - 1 };
-                                }
-                            } else if (adjustedKey === Key.rightArrow) {
-                                if (groupIndex === lastGroupIndex) {
-                                    // We're at the end of the last group so stay put
-                                    return currentItem;
-                                } else if (group instanceof Groups.UniformGroup && nextGroup instanceof Groups.UniformGroup) {
-                                    // Moving between uniform groups so maintain the row/column if possible
-                                    var coordinates = that._indexToCoordinate(currentItemInGroup.index),
-                                        currentSlot = (that._horizontal ? coordinates.row : coordinates.column);
-                                    return {
-                                        type: _UI.ObjectType.item,
-                                        index: nextGroup.startIndex + Math.min(nextGroup.count - 1, currentSlot)
-                                    };
-                                } else {
-                                    // Moving to or from a cell spanning group so go to the first item
-                                    return { type: _UI.ObjectType.item, index: nextGroup.startIndex };
-                                }
-                            } else {
-                                return currentItem;
-                            }
-                        } else {
-                            newItem.index += group.startIndex;
-                            return newItem;
-                        }
-                    }
-
-                    switch (that._adjustedKeyForRTL(pressedKey)) {
-                        case Key.upArrow:
-                        case Key.leftArrow:
-                        case Key.downArrow:
-                        case Key.rightArrow:
-                            return handleArrowKeys();
-                        default:
-                            return exports._LayoutCommon.prototype._getAdjacentForPageKeys.call(that, currentItem, pressedKey);
-                    }
-                },
-
-                hitTest: function _LayoutCommon_hitTest(x, y) {
-                    var sizes = this._sizes,
-                        result;
-
-                    // Make the coordinates relative to grid layout's content box
-                    x -= sizes.layoutOriginX;
-                    y -= sizes.layoutOriginY;
-
-                    var groupIndex = this._groupFromOffset(this._horizontal ? x : y),
-                        group = this._groups[groupIndex];
-
-                    // Make the coordinates relative to the margin box of the group's items container
-                    if (this._horizontal) {
-                        x -= group.offset;
-                    } else {
-                        y -= group.offset;
-                    }
-                    if (this._groupsEnabled) {
-                        if (this._groupHeaderPosition === HeaderPosition.left) {
-                            x -= sizes.headerContainerWidth;
-                        } else {
-                            // Headers above
-                            y -= sizes.headerContainerHeight;
-                        }
-                    }
-
-                    result = group.hitTest(x, y);
-                    result.index += group.startIndex;
-                    result.insertAfterIndex += group.startIndex;
-                    return result;
-                },
-
-                // Animation cycle:
-                //
-                // Edits
-                //  ---     UpdateTree        Realize
-                // |   |      ---               /\/\
-                // |   |     |   |             |    |
-                // ------------------------------------------------------- Time
-                //      |   |     |   |   |   |      |   |
-                //       ---      |   |    ---        ---/\/\/\/\/\/\/\/\/
-                //     setupAni   |   | layoutAni    endAni  (animations)
-                //                 ---/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
-                //                layout    (outside realized range)
-                //
-                //
-                // When there is a modification to the DataSource, the first thing that happens is setupAnimations is
-                // called with the current tree. This allows us to cache the locations of the existing items.
-                //
-                // The next 3 steps have to be completely synchronous otherwise users will see intermediate states and
-                // items will blink or jump between locations.
-                //
-                // ListView modifies the DOM tree. A container is added/removed from the group's itemsContainer for each
-                // item added/removed to the group. The existing itemBoxes are shuffled between the different containers.
-                // The itemBoxes for the removed items will be removed from the containers completely. Since the DOM tree
-                // has been modified we have to apply a transform to position the itemBoxes at their original location. We
-                // compare the new locations with the cached locations to figure out how far to translate the itemBoxes.
-                // Also the removed items need to be placed back in the DOM without affecting layout (by using position
-                // absolute) so that they also do not jump or blink.
-                //
-                // We only tranform and add back removed items for items which were on screen or are now on screen.
-                //
-                // Now the ListView can realize other items asynchronously. The items to realize are items which have been
-                // inserted into the DataSource or items which are in the realization range because a removal has occurred
-                // or the user has scroll slightly.
-                //
-                // During the realization pass the user may scroll. If they scroll to a range outside of the realization
-                // range the items will just appear in the correct location without any animations. If they scroll to a
-                // location within the old realization range we still have the items and they will animate correctly.
-                //
-                // During the realization pass another data source edit can occur. A realization pass is unable to run when
-                // the tree and layout are out of sync. Otherwise it may try to request item at index X and get item at
-                // index X + 1. This means that if another data source edit occurs before endAnimations is called we
-                // restart the whole animation cycle. To group the animations between the two edits we do not reset the
-                // caches of item box locations. We could add to it if there were items outside of the range however they
-                // will only play half of the animation and will probably look just as ugly as not playing the animation at
-                // all. This means setupAnimations will just be a no op in this scenario.
-                //
-                // This also shows that batching data source edits and only changing the data source when in loadingstate
-                // "complete" is still a large performance win.
-                //
-                // Once the realization pass has finished ListView calls executeAnimations. This is where the layout
-                // effectively fades out the removed items (and then removes them from the dom), moves the itemBoxes back
-                // to translate(0,0), and fades in the inserted itemBoxes. ListView waits for the executeAnimations promise
-                // to complete before allowing more data source edits to trigger another animation cycle.
-                //
-                // If a resize occurs during the animation cycle the animations will be canceled and items will jump to
-                // their final positions.
-
-                setupAnimations: function _LayoutCommon_setupAnimations() {
-                    // This function is called after a data source change so that we can cache the locations
-                    // of the realized items.
-
-                    if (this._groups.length === 0) {
-                        // No animations if we haven't measured before
-                        this._resetAnimationCaches();
-                        return;
-                    }
-
-                    if (Object.keys(this._cachedItemRecords).length) {
-                        // Ignore the second call.
-                        return;
-                    }
-
-                    this._site._writeProfilerMark("Animation:setupAnimations,StartTM");
-
-                    var realizationRange = this._getRealizationRange();
-
-                    var tree = this._site.tree;
-                    var itemIndex = 0;
-                    var horizontal = (this.orientation === "horizontal");
-                    for (var i = 0, treeLength = tree.length; i < treeLength; i++) {
-                        var groupBundle = tree[i];
-                        var groupHasAtleastOneItemRealized = false;
-                        var group = this._groups[i];
-                        var groupIsCellSpanning = group instanceof Groups.CellSpanningGroup;
-                        var groupOffset = (group ? group.offset : 0);
-
-                        forEachContainer(groupBundle.itemsContainer, function (container, j) {
-                            // Don't try to cache something outside of the realization range.
-                            if (realizationRange.firstIndex <= itemIndex && realizationRange.lastIndex >= itemIndex) {
-                                groupHasAtleastOneItemRealized = true;
-
-                                if (!this._cachedItemRecords[itemIndex]) {
-                                    var itemPosition = this._getItemPositionForAnimations(itemIndex, i, j);
-                                    var row = itemPosition.row;
-                                    var column = itemPosition.column;
-                                    var left = itemPosition.left;
-                                    var top = itemPosition.top;
-
-                                    // Setting both old and new variables now in case layoutAnimations is called multiple times.
-                                    this._cachedItemRecords[itemIndex] = {
-                                        oldRow: row,
-                                        oldColumn: column,
-                                        oldLeft: left,
-                                        oldTop: top,
-                                        width: itemPosition.width,
-                                        height: itemPosition.height,
-                                        element: container,
-                                        inCellSpanningGroup: groupIsCellSpanning
-                                    };
-                                }
-                            }
-                            itemIndex++;
-                        }.bind(this));
-
-                        if (groupHasAtleastOneItemRealized) {
-                            var groupIndex = i;
-                            if (!this._cachedHeaderRecords[groupIndex]) {
-                                var headerPosition = this._getHeaderPositionForAnimations(groupIndex);
-                                this._cachedHeaderRecords[groupIndex] = {
-                                    oldLeft: headerPosition.left,
-                                    oldTop: headerPosition.top,
-                                    width: headerPosition.width,
-                                    height: headerPosition.height,
-                                    element: groupBundle.header,
-                                };
-                            }
-                            if (!this._cachedGroupRecords[uniqueID(groupBundle.itemsContainer.element)]) {
-                                this._cachedGroupRecords[uniqueID(groupBundle.itemsContainer.element)] = {
-                                    oldLeft: horizontal ? groupOffset : 0,
-                                    left: horizontal ? groupOffset : 0,
-                                    oldTop: horizontal ? 0 : groupOffset,
-                                    top: horizontal ? 0 : groupOffset,
-                                    element: groupBundle.itemsContainer.element,
-                                };
-                            }
-                        }
-                    }
-
-                    this._site._writeProfilerMark("Animation:setupAnimations,StopTM");
-                },
-
-                _layoutAnimations: function _LayoutCommon_layoutAnimations(modifiedItems, modifiedGroups) {
-                    // This function is called after the DOM tree has been modified to match the data source.
-                    // In this function we update the cached records and apply transforms to hide the modifications
-                    // from the user. We will remove the transforms via animations in execute animation.
-
-                    if (!Object.keys(this._cachedItemRecords).length &&
-                        !Object.keys(this._cachedGroupRecords).length &&
-                        !Object.keys(this._cachedHeaderRecords).length) {
-                        return;
-                    }
-
-                    this._site._writeProfilerMark("Animation:layoutAnimation,StartTM");
-
-                    this._updateAnimationCache(modifiedItems, modifiedGroups);
-
-                    var realizationRange = this._getRealizationRange();
-
-                    var tree = this._site.tree;
-                    var itemIndex = 0;
-                    var horizontal = (this.orientation === "horizontal");
-                    for (var i = 0, treeLength = tree.length; i < treeLength; i++) {
-                        var groupBundle = tree[i];
-                        var group = this._groups[i];
-                        var groupIsCellSpanning = group instanceof Groups.CellSpanningGroup;
-                        var groupOffset = (group ? group.offset : 0);
-                        var groupMovementX = 0;
-                        var groupMovementY = 0;
-
-                        var cachedGroupRecord = this._cachedGroupRecords[uniqueID(groupBundle.itemsContainer.element)];
-                        if (cachedGroupRecord) {
-                            if (horizontal) {
-                                groupMovementX = cachedGroupRecord.oldLeft - groupOffset;
-                            } else {
-                                groupMovementY = cachedGroupRecord.oldTop - groupOffset;
-                            }
-                        }
-
-
-                        forEachContainer(groupBundle.itemsContainer, function (container, j) {
-                            // Don't try to cache something outside of the realization range.
-                            if (realizationRange.firstIndex <= itemIndex && realizationRange.lastIndex >= itemIndex) {
-                                var cachedItemRecord = this._cachedItemRecords[itemIndex];
-                                if (cachedItemRecord) {
-                                    var itemPosition = this._getItemPositionForAnimations(itemIndex, i, j);
-                                    var row = itemPosition.row;
-                                    var column = itemPosition.column;
-                                    var left = itemPosition.left;
-                                    var top = itemPosition.top;
-
-                                    cachedItemRecord.inCellSpanningGroup = cachedItemRecord.inCellSpanningGroup || groupIsCellSpanning;
-
-                                    // If the item has moved we need to update the cache and apply a transform to make it
-                                    // appear like it has not moved yet.
-                                    if (cachedItemRecord.oldRow !== row ||
-                                        cachedItemRecord.oldColumn !== column ||
-                                        cachedItemRecord.oldTop !== top ||
-                                        cachedItemRecord.oldLeft !== left) {
-
-                                        cachedItemRecord.row = row;
-                                        cachedItemRecord.column = column;
-                                        cachedItemRecord.left = left;
-                                        cachedItemRecord.top = top;
-
-                                        var xOffset = cachedItemRecord.oldLeft - cachedItemRecord.left - groupMovementX;
-                                        var yOffset = cachedItemRecord.oldTop - cachedItemRecord.top - groupMovementY;
-                                        xOffset = (this._site.rtl ? -1 : 1) * xOffset;
-
-                                        cachedItemRecord.xOffset = xOffset;
-                                        cachedItemRecord.yOffset = yOffset;
-                                        if (xOffset !== 0 || yOffset !== 0) {
-                                            var element = cachedItemRecord.element;
-                                            cachedItemRecord.needsToResetTransform = true;
-                                            element.style[transitionScriptName] = "";
-                                            element.style[transformNames.scriptName] = "translate(" + xOffset + "px," + yOffset + "px)";
-                                        }
-
-                                        var itemsBlock = container.parentNode;
-                                        if (_ElementUtilities.hasClass(itemsBlock, _Constants._itemsBlockClass)) {
-                                            this._animatingItemsBlocks[uniqueID(itemsBlock)] = itemsBlock;
-                                        }
-                                    }
-
-                                } else {
-                                    // Treat items that came from outside of the realization range into the realization range
-                                    // as a "Move" which means fade it in.
-                                    this._cachedInsertedItemRecords[itemIndex] = container;
-                                    container.style[transitionScriptName] = "";
-                                    container.style.opacity = 0;
-                                }
-                            }
-
-                            itemIndex++;
-                        }.bind(this));
-
-                        var groupIndex = i;
-                        var cachedHeader = this._cachedHeaderRecords[groupIndex];
-                        if (cachedHeader) {
-                            var headerPosition = this._getHeaderPositionForAnimations(groupIndex);
-                            // Note: If a group changes width we allow the header to immediately grow/shrink instead of
-                            // animating it. However if the header is removed we stick the header to the last known size.
-                            cachedHeader.height = headerPosition.height;
-                            cachedHeader.width = headerPosition.width;
-                            if (cachedHeader.oldLeft !== headerPosition.left ||
-                                cachedHeader.oldTop !== headerPosition.top) {
-
-                                cachedHeader.left = headerPosition.left;
-                                cachedHeader.top = headerPosition.top;
-
-                                var xOffset = cachedHeader.oldLeft - cachedHeader.left;
-                                var yOffset = cachedHeader.oldTop - cachedHeader.top;
-                                xOffset = (this._site.rtl ? -1 : 1) * xOffset;
-                                if (xOffset !== 0 || yOffset !== 0) {
-                                    cachedHeader.needsToResetTransform = true;
-                                    var headerContainer = cachedHeader.element;
-                                    headerContainer.style[transitionScriptName] = "";
-                                    headerContainer.style[transformNames.scriptName] = "translate(" + xOffset + "px," + yOffset + "px)";
-                                }
-                            }
-                        }
-
-                        if (cachedGroupRecord) {
-                            if ((horizontal && cachedGroupRecord.left !== groupOffset) ||
-                                (!horizontal && cachedGroupRecord.top !== groupOffset)) {
-                                var element = cachedGroupRecord.element;
-                                if (groupMovementX === 0 && groupMovementY === 0) {
-                                    if (cachedGroupRecord.needsToResetTransform) {
-                                        cachedGroupRecord.needsToResetTransform = false;
-                                        element.style[transformNames.scriptName] = "";
-                                    }
-                                } else {
-                                    var groupOffsetX = (this._site.rtl ? -1 : 1) * groupMovementX,
-                                        groupOffsetY = groupMovementY;
-                                    cachedGroupRecord.needsToResetTransform = true;
-                                    element.style[transitionScriptName] = "";
-                                    element.style[transformNames.scriptName] = "translate(" + groupOffsetX + "px, " + groupOffsetY + "px)";
-                                }
-                            }
-                        }
-                    }
-
-                    if (this._inListMode || this._itemsPerBar === 1) {
-                        var itemsBlockKeys = Object.keys(this._animatingItemsBlocks);
-                        for (var b = 0, blockKeys = itemsBlockKeys.length; b < blockKeys; b++) {
-                            this._animatingItemsBlocks[itemsBlockKeys[b]].style.overflow = 'visible';
-                        }
-                    }
-
-                    this._site._writeProfilerMark("Animation:layoutAnimation,StopTM");
-                },
-
-                executeAnimations: function _LayoutCommon_executeAnimations() {
-                    // This function is called when we should perform an animation to reveal the true location of the items.
-                    // We fade out removed items, fade in added items, and move items which need to be shifted. If they moved
-                    // across columns we do a reflow animation.
-
-                    var animationSignal = new _Signal();
-
-                    // Only animate the items on screen.
-                    this._filterInsertedElements();
-                    this._filterMovedElements();
-                    this._filterRemovedElements();
-
-                    if (this._insertedElements.length === 0 && this._removedElements.length === 0 && this._itemMoveRecords.length === 0 && this._moveRecords.length === 0) {
-                        // Nothing to animate.
-                        this._resetAnimationCaches(true);
-                        animationSignal.complete();
-                        return animationSignal.promise;
-                    }
-                    this._animationsRunning = animationSignal.promise;
-
-                    var slowAnimations = exports.Layout._debugAnimations || exports.Layout._slowAnimations;
-                    var site = this._site;
-                    var insertedElements = this._insertedElements;
-                    var removedElements = this._removedElements;
-                    var itemMoveRecords = this._itemMoveRecords;
-                    var moveRecords = this._moveRecords;
-
-                    var removeDelay = 0;
-                    var moveDelay = 0;
-                    var addDelay = 0;
-
-                    var currentAnimationPromise = null;
-                    var pendingTransitionPromises = [];
-
-                    var hasMultisizeMove = false;
-                    var hasReflow = false;
-                    var minOffset = 0;
-                    var maxOffset = 0;
-                    var itemContainersToExpand = {};
-                    var upOutDist = 0;
-                    var downOutDist = 0;
-                    var upInDist = 0;
-                    var downInDist = 0;
-                    var reflowItemRecords = [];
-                    var horizontal = (this.orientation === "horizontal");
-                    var oldReflowLayoutProperty = horizontal ? "oldColumn" : "oldRow",
-                        reflowLayoutProperty = horizontal ? "column" : "row",
-                        oldReflowLayoutPosition = horizontal ? "oldTop" : "oldLeft",
-                        reflowLayoutPosition = horizontal ? "top" : "left";
-
-                    var animatingItemsBlocks = this._animatingItemsBlocks;
-
-                    for (var i = 0, len = itemMoveRecords.length; i < len; i++) {
-                        var cachedItemRecord = itemMoveRecords[i];
-                        if (cachedItemRecord.inCellSpanningGroup) {
-                            hasMultisizeMove = true;
-                            break;
-                        }
-                    }
-
-                    var that = this;
-
-                    function startAnimations() {
-                        removePhase();
-                        if (hasMultisizeMove) {
-                            cellSpanningFadeOutMove();
-                        } else {
-                            if (that._itemsPerBar > 1) {
-                                var maxDistance = that._itemsPerBar * that._sizes.containerCrossSize + that._getHeaderSizeContentAdjustment() +
-                                    that._sizes.containerMargins[horizontal ? "top" : (site.rtl ? "right" : "left")] +
-                                    (horizontal ? that._sizes.layoutOriginY : that._sizes.layoutOriginX);
-                                for (var i = 0, len = itemMoveRecords.length; i < len; i++) {
-                                    var cachedItemRecord = itemMoveRecords[i];
-                                    if (cachedItemRecord[oldReflowLayoutProperty] > cachedItemRecord[reflowLayoutProperty]) {
-                                        upOutDist = Math.max(upOutDist, cachedItemRecord[oldReflowLayoutPosition] + cachedItemRecord[horizontal ? "height" : "width"]);
-                                        upInDist = Math.max(upInDist, maxDistance - cachedItemRecord[reflowLayoutPosition]);
-                                        hasReflow = true;
-                                        reflowItemRecords.push(cachedItemRecord);
-                                    } else if (cachedItemRecord[oldReflowLayoutProperty] < cachedItemRecord[reflowLayoutProperty]) {
-                                        downOutDist = Math.max(downOutDist, maxDistance - cachedItemRecord[oldReflowLayoutPosition]);
-                                        downInDist = Math.max(downInDist, cachedItemRecord[reflowLayoutPosition] + cachedItemRecord[horizontal ? "height" : "width"]);
-                                        reflowItemRecords.push(cachedItemRecord);
-                                        hasReflow = true;
-                                    }
-                                }
-                            }
-
-                            if (site.rtl && !horizontal) {
-                                upOutDist *= -1;
-                                upInDist *= -1;
-                                downOutDist *= -1;
-                                downInDist *= -1;
-                            }
-
-                            if (hasReflow) {
-                                reflowPhase(that._itemsPerBar);
-                            } else {
-                                directMovePhase();
-                            }
-                        }
-                    }
-
-                    if (exports.Layout._debugAnimations) {
-                        _BaseUtils._requestAnimationFrame(function () {
-                            startAnimations();
-                        });
-                    } else {
-                        startAnimations();
-                    }
-
-                    function waitForNextPhase(nextPhaseCallback) {
-                        currentAnimationPromise = Promise.join(pendingTransitionPromises);
-                        currentAnimationPromise.done(function () {
-                            pendingTransitionPromises = [];
-                            // The success is called even if the animations are canceled due to the WinJS.UI.executeTransition
-                            // API. To deal with that we check the animationSignal variable. If it is null the animations were
-                            // canceled so we shouldn't continue.
-                            if (animationSignal) {
-                                if (exports.Layout._debugAnimations) {
-                                    _BaseUtils._requestAnimationFrame(function () {
-                                        nextPhaseCallback();
-                                    });
-                                } else {
-                                    nextPhaseCallback();
-                                }
-                            }
-                        });
-                    }
-
-                    function removePhase() {
-                        if (removedElements.length) {
-                            site._writeProfilerMark("Animation:setupRemoveAnimation,StartTM");
-
-                            moveDelay += 60;
-                            addDelay += 60;
-
-                            var removeDuration = 120;
-                            if (slowAnimations) {
-                                removeDuration *= 10;
-                            }
-
-                            pendingTransitionPromises.push(_TransitionAnimation.executeTransition(removedElements,
-                            [{
-                                property: "opacity",
-                                delay: removeDelay,
-                                duration: removeDuration,
-                                timing: "linear",
-                                to: 0,
-                                skipStylesReset: true
-                            }]));
-
-                            site._writeProfilerMark("Animation:setupRemoveAnimation,StopTM");
-                        }
-                    }
-
-                    function cellSpanningFadeOutMove() {
-                        site._writeProfilerMark("Animation:cellSpanningFadeOutMove,StartTM");
-
-                        // For multisize items which move we fade out and then fade in (opacity 1->0->1)
-                        var moveElements = [];
-                        for (var i = 0, len = itemMoveRecords.length; i < len; i++) {
-                            var cachedItemRecord = itemMoveRecords[i];
-                            var container = cachedItemRecord.element;
-                            moveElements.push(container);
-                        }
-                        // Including groups and headers.
-                        for (var i = 0, len = moveRecords.length; i < len; i++) {
-                            var cachedItemRecord = moveRecords[i];
-                            var container = cachedItemRecord.element;
-                            moveElements.push(container);
-                        }
-
-                        var fadeOutDuration = 120;
-                        if (slowAnimations) {
-                            fadeOutDuration *= 10;
-                        }
-
-                        pendingTransitionPromises.push(_TransitionAnimation.executeTransition(moveElements,
-                        {
-                            property: "opacity",
-                            delay: removeDelay,
-                            duration: fadeOutDuration,
-                            timing: "linear",
-                            to: 0
-                        }));
-
-                        waitForNextPhase(cellSpanningFadeInMove);
-                        site._writeProfilerMark("Animation:cellSpanningFadeOutMove,StopTM");
-                    }
-
-                    function cellSpanningFadeInMove() {
-                        site._writeProfilerMark("Animation:cellSpanningFadeInMove,StartTM");
-
-                        addDelay = 0;
-
-                        var moveElements = [];
-                        // Move them to their final location.
-                        for (var i = 0, len = itemMoveRecords.length; i < len; i++) {
-                            var cachedItemRecord = itemMoveRecords[i];
-                            var container = cachedItemRecord.element;
-                            container.style[transformNames.scriptName] = "";
-                            moveElements.push(container);
-                        }
-                        // Including groups and headers.
-                        for (var i = 0, len = moveRecords.length; i < len; i++) {
-                            var cachedItemRecord = moveRecords[i];
-                            var container = cachedItemRecord.element;
-                            container.style[transformNames.scriptName] = "";
-                            moveElements.push(container);
-                        }
-
-                        var fadeInDuration = 120;
-                        if (slowAnimations) {
-                            fadeInDuration *= 10;
-                        }
-
-                        // For multisize items which move we fade out and then fade in (opacity 1->0->1)
-                        pendingTransitionPromises.push(_TransitionAnimation.executeTransition(moveElements,
-                        {
-                            property: "opacity",
-                            delay: addDelay,
-                            duration: fadeInDuration,
-                            timing: "linear",
-                            to: 1
-                        }));
-
-                        site._writeProfilerMark("Animation:cellSpanningFadeInMove,StopTM");
-
-                        addPhase();
-                    }
-
-                    function reflowPhase(itemsPerBar) {
-                        site._writeProfilerMark("Animation:setupReflowAnimation,StartTM");
-
-                        var itemContainersLastBarIndices = {};
-                        for (var i = 0, len = reflowItemRecords.length; i < len; i++) {
-                            var reflowItemRecord = reflowItemRecords[i];
-                            var xOffset = reflowItemRecord.xOffset;
-                            var yOffset = reflowItemRecord.yOffset;
-                            if (reflowItemRecord[oldReflowLayoutProperty] > reflowItemRecord[reflowLayoutProperty]) {
-                                if (horizontal) {
-                                    yOffset -= upOutDist;
-                                } else {
-                                    xOffset -= upOutDist;
-                                }
-                            } else if (reflowItemRecord[oldReflowLayoutProperty] < reflowItemRecord[reflowLayoutProperty]) {
-                                if (horizontal) {
-                                    yOffset += downOutDist;
-                                } else {
-                                    xOffset += downOutDist;
-                                }
-                            }
-
-                            var container = reflowItemRecord.element;
-
-                            minOffset = Math.min(minOffset, horizontal ? xOffset : yOffset);
-                            maxOffset = Math.max(maxOffset, horizontal ? xOffset : yOffset);
-                            var itemsContainer = container.parentNode;
-                            if (!_ElementUtilities.hasClass(itemsContainer, "win-itemscontainer")) {
-                                itemsContainer = itemsContainer.parentNode;
-                            }
-
-                            // The itemscontainer element is always overflow:hidden for two reasons:
-                            // 1) Better panning performance
-                            // 2) When there is margin betweeen the itemscontainer and the surface elements, items that
-                            //    reflow should not be visible while they travel long distances or overlap with headers.
-                            // This introduces an issue when updateTree makes the itemscontainer smaller, but we need its size
-                            // to remain the same size during the execution of the animation to avoid having some of the animated
-                            // items being clipped. This is only an issue when items from the last column (in horizontal mode) or row
-                            // (in vertical mode) of the group will reflow. Therefore, we change the padding so that the contents are larger,
-                            // and then use margin to reverse the size change. We don't do this expansion when it is unnecessary because the
-                            // layout/formatting caused by these style changes has significant cost when the group has thousands of items.
-                            var lastBarIndex = itemContainersLastBarIndices[uniqueID(itemsContainer)];
-                            if (!lastBarIndex) {
-                                var count = getItemsContainerLength(getItemsContainerTree(itemsContainer, site.tree));
-                                itemContainersLastBarIndices[uniqueID(itemsContainer)] = lastBarIndex = Math.ceil(count / itemsPerBar) - 1;
-                            }
-                            if (reflowItemRecords[i][horizontal ? "column" : "row"] === lastBarIndex) {
-                                itemContainersToExpand[uniqueID(itemsContainer)] = itemsContainer;
-                            }
-
-                            var reflowDuration = 80;
-                            if (slowAnimations) {
-                                reflowDuration *= 10;
-                            }
-
-                            pendingTransitionPromises.push(_TransitionAnimation.executeTransition(container,
-                            {
-                                property: transformNames.cssName,
-                                delay: moveDelay,
-                                duration: reflowDuration,
-                                timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                                to: "translate(" + xOffset + "px," + yOffset + "px)"
-                            }));
-                        }
-
-                        var itemContainerKeys = Object.keys(itemContainersToExpand);
-                        for (var i = 0, len = itemContainerKeys.length; i < len; i++) {
-                            var itemContainer = itemContainersToExpand[itemContainerKeys[i]];
-                            if (site.rtl && horizontal) {
-                                itemContainer.style.paddingLeft = (-1 * minOffset) + 'px';
-                                itemContainer.style.marginLeft = minOffset + 'px';
-                            } else {
-                                itemContainer.style[horizontal ? "paddingRight" : "paddingBottom"] = maxOffset + 'px';
-                                itemContainer.style[horizontal ? "marginRight" : "marginBottom"] = '-' + maxOffset + 'px';
-                            }
-                        }
-                        var itemsBlockKeys = Object.keys(animatingItemsBlocks);
-                        for (var i = 0, len = itemsBlockKeys.length; i < len; i++) {
-                            animatingItemsBlocks[itemsBlockKeys[i]].classList.add(_Constants._clipClass);
-                        }
-
-                        waitForNextPhase(afterReflowPhase);
-
-                        site._writeProfilerMark("Animation:setupReflowAnimation,StopTM");
-                    }
-
-                    function cleanupItemsContainers() {
-                        // Reset the styles used to obtain overflow-y: hidden overflow-x: visible.
-                        var itemContainerKeys = Object.keys(itemContainersToExpand);
-                        for (var i = 0, len = itemContainerKeys.length; i < len; i++) {
-                            var itemContainer = itemContainersToExpand[itemContainerKeys[i]];
-                            if (site.rtl && horizontal) {
-                                itemContainer.style.paddingLeft = '';
-                                itemContainer.style.marginLeft = '';
-                            } else {
-                                itemContainer.style[horizontal ? "paddingRight" : "paddingBottom"] = '';
-                                itemContainer.style[horizontal ? "marginRight" : "marginBottom"] = '';
-                            }
-                        }
-                        itemContainersToExpand = {};
-
-                        var itemsBlockKeys = Object.keys(animatingItemsBlocks);
-                        for (var i = 0, len = itemsBlockKeys.length; i < len; i++) {
-                            var itemsBlock = animatingItemsBlocks[itemsBlockKeys[i]];
-                            itemsBlock.style.overflow = '';
-                            itemsBlock.classList.remove(_Constants._clipClass);
-                        }
-                    }
-
-                    function afterReflowPhase() {
-                        site._writeProfilerMark("Animation:prepareReflowedItems,StartTM");
-
-                        // Position the items at the edge ready to slide in.
-                        for (var i = 0, len = reflowItemRecords.length; i < len; i++) {
-                            var reflowItemRecord = reflowItemRecords[i];
-                            var xOffset = 0,
-                                yOffset = 0;
-                            if (reflowItemRecord[oldReflowLayoutProperty] > reflowItemRecord[reflowLayoutProperty]) {
-                                if (horizontal) {
-                                    yOffset = upInDist;
-                                } else {
-                                    xOffset = upInDist;
-                                }
-                            } else if (reflowItemRecord[oldReflowLayoutProperty] < reflowItemRecord[reflowLayoutProperty]) {
-                                if (horizontal) {
-                                    yOffset = -1 * downInDist;
-                                } else {
-                                    xOffset = -1 * downInDist;
-                                }
-                            }
-                            reflowItemRecord.element.style[transitionScriptName] = "";
-                            reflowItemRecord.element.style[transformNames.scriptName] = "translate(" + xOffset + "px," + yOffset + "px)";
-                        }
-
-                        site._writeProfilerMark("Animation:prepareReflowedItems,StopTM");
-
-                        if (exports.Layout._debugAnimations) {
-                            _BaseUtils._requestAnimationFrame(function () {
-                                directMovePhase(true);
-                            });
-                        } else {
-                            directMovePhase(true);
-                        }
-                    }
-
-                    function directMovePhase(fastMode) {
-                        // For groups and items which move we transition them from transform: translate(Xpx,Ypx) to translate(0px,0px).
-                        var duration = 200;
-                        if (fastMode) {
-                            duration = 150;
-                            moveDelay = 0;
-                            addDelay = 0;
-                        }
-
-                        if (slowAnimations) {
-                            duration *= 10;
-                        }
-
-                        if (itemMoveRecords.length > 0 || moveRecords.length > 0) {
-                            site._writeProfilerMark("Animation:setupMoveAnimation,StartTM");
-
-                            var moveElements = [];
-                            for (var i = 0, len = moveRecords.length; i < len; i++) {
-                                var container = moveRecords[i].element;
-                                moveElements.push(container);
-                            }
-                            for (var i = 0, len = itemMoveRecords.length; i < len; i++) {
-                                var container = itemMoveRecords[i].element;
-                                moveElements.push(container);
-                            }
-                            pendingTransitionPromises.push(_TransitionAnimation.executeTransition(moveElements,
-                            {
-                                property: transformNames.cssName,
-                                delay: moveDelay,
-                                duration: duration,
-                                timing: "cubic-bezier(0.1, 0.9, 0.2, 1)",
-                                to: ""
-                            }));
-
-                            addDelay += 80;
-
-                            site._writeProfilerMark("Animation:setupMoveAnimation,StopTM");
-                        }
-
-                        addPhase();
-                    }
-
-                    function addPhase() {
-                        if (insertedElements.length > 0) {
-                            site._writeProfilerMark("Animation:setupInsertAnimation,StartTM");
-
-                            var addDuration = 120;
-                            if (slowAnimations) {
-                                addDuration *= 10;
-                            }
-
-                            pendingTransitionPromises.push(_TransitionAnimation.executeTransition(insertedElements,
-                            [{
-                                property: "opacity",
-                                delay: addDelay,
-                                duration: addDuration,
-                                timing: "linear",
-                                to: 1
-                            }]));
-
-                            site._writeProfilerMark("Animation:setupInsertAnimation,StopTM");
-                        }
-
-                        waitForNextPhase(completePhase);
-                    }
-                    function completePhase() {
-                        site._writeProfilerMark("Animation:cleanupAnimations,StartTM");
-
-                        cleanupItemsContainers();
-
-                        for (var i = 0, len = removedElements.length; i < len; i++) {
-                            var container = removedElements[i];
-                            if (container.parentNode) {
-                                _Dispose._disposeElement(container);
-                                container.parentNode.removeChild(container);
-                            }
-                        }
-
-                        site._writeProfilerMark("Animation:cleanupAnimations,StopTM");
-
-                        that._animationsRunning = null;
-                        animationSignal.complete();
-                    }
-                    this._resetAnimationCaches(true);
-
-                    // The PVL animation library completes sucessfully even if you cancel an animation.
-                    // If the animation promise passed to layout is canceled we should cancel the PVL animations and
-                    // set a marker for them to be ignored.
-                    animationSignal.promise.then(null, function () {
-                        // Since it was canceled make sure we still clean up the styles.
-                        cleanupItemsContainers();
-                        for (var i = 0, len = moveRecords.length; i < len; i++) {
-                            var container = moveRecords[i].element;
-                            container.style[transformNames.scriptName] = '';
-                            container.style.opacity = 1;
-                        }
-                        for (var i = 0, len = itemMoveRecords.length; i < len; i++) {
-                            var container = itemMoveRecords[i].element;
-                            container.style[transformNames.scriptName] = '';
-                            container.style.opacity = 1;
-                        }
-                        for (var i = 0, len = insertedElements.length; i < len; i++) {
-                            insertedElements[i].style.opacity = 1;
-                        }
-                        for (var i = 0, len = removedElements.length; i < len; i++) {
-                            var container = removedElements[i];
-                            if (container.parentNode) {
-                                _Dispose._disposeElement(container);
-                                container.parentNode.removeChild(container);
-                            }
-                        }
-
-                        this._animationsRunning = null;
-                        animationSignal = null;
-                        currentAnimationPromise && currentAnimationPromise.cancel();
-
-                    }.bind(this));
-
-                    return animationSignal.promise;
-                },
-
-                dragOver: function _LayoutCommon_dragOver(x, y, dragInfo) {
-                    // The coordinates passed to dragOver should be in ListView's viewport space. 0,0 should be the top left corner of the viewport's padding.
-                    var indicesAffected = this.hitTest(x, y),
-                        groupAffected = (this._groups ? this._site.groupIndexFromItemIndex(indicesAffected.index) : 0),
-                        itemsContainer = this._site.tree[groupAffected].itemsContainer,
-                        itemsCount = getItemsContainerLength(itemsContainer),
-                        indexOffset = (this._groups ? this._groups[groupAffected].startIndex : 0),
-                        visibleRange = this._getVisibleRange();
-
-                    indicesAffected.index -= indexOffset;
-                    indicesAffected.insertAfterIndex -= indexOffset;
-                    visibleRange.firstIndex = Math.max(visibleRange.firstIndex - indexOffset - 1, 0);
-                    visibleRange.lastIndex = Math.min(visibleRange.lastIndex - indexOffset + 1, itemsCount);
-                    var indexAfter = Math.max(Math.min(itemsCount - 1, indicesAffected.insertAfterIndex), -1),
-                        indexBefore = Math.min(indexAfter + 1, itemsCount);
-
-                    if (dragInfo) {
-                        for (var i = indexAfter; i >= visibleRange.firstIndex; i--) {
-                            if (!dragInfo._isIncluded(i + indexOffset)) {
-                                indexAfter = i;
-                                break;
-                            } else if (i === visibleRange.firstIndex) {
-                                indexAfter = -1;
-                            }
-                        }
-
-                        for (var i = indexBefore; i < visibleRange.lastIndex; i++) {
-                            if (!dragInfo._isIncluded(i + indexOffset)) {
-                                indexBefore = i;
-                                break;
-                            } else if (i === (visibleRange.lastIndex - 1)) {
-                                indexBefore = itemsCount;
-                            }
-                        }
-                    }
-
-                    var elementBefore = containerFromIndex(itemsContainer, indexBefore),
-                        elementAfter = containerFromIndex(itemsContainer, indexAfter);
-
-                    if (this._animatedDragItems) {
-                        for (var i = 0, len = this._animatedDragItems.length; i < len; i++) {
-                            var item = this._animatedDragItems[i];
-                            if (item) {
-                                item.style[transitionScriptName] = this._site.animationsDisabled ? "" : dragBetweenTransition;
-                                item.style[transformNames.scriptName] = "";
-                            }
-                        }
-                    }
-                    this._animatedDragItems = [];
-                    var horizontal = this.orientation === "horizontal",
-                        inListMode = this._inListMode || this._itemsPerBar === 1;
-                    if (this._groups && this._groups[groupAffected] instanceof Groups.CellSpanningGroup) {
-                        inListMode = this._groups[groupAffected]._slotsPerColumn === 1;
-                    }
-                    var horizontalTransform = 0,
-                        verticalTransform = 0;
-                    // In general, items should slide in the direction perpendicular to the layout's orientation.
-                    // In a horizontal layout, items are laid out top to bottom, left to right. For any two neighboring items in this layout, we want to move the first item up and the second down
-                    // to denote that any inserted item would go between those two.
-                    // Similarily, vertical layout should have the first item move left and the second move right.
-                    // List layout is a special case. A horizontal list layout can only lay things out left to right, so it should slide the two items left and right like a vertical grid.
-                    // A vertical list can only lay things out top to bottom, so it should slide items up and down like a horizontal grid.
-                    // In other words: Apply horizontal transformations if we're a vertical grid or horizontal list, otherwise use vertical transformations.
-                    if ((!horizontal && !inListMode) || (horizontal && inListMode)) {
-                        horizontalTransform = this._site.rtl ? -dragBetweenDistance : dragBetweenDistance;
-                    } else {
-                        verticalTransform = dragBetweenDistance;
-                    }
-                    if (elementBefore) {
-                        elementBefore.style[transitionScriptName] = this._site.animationsDisabled ? "" : dragBetweenTransition;
-                        elementBefore.style[transformNames.scriptName] = "translate(" + horizontalTransform + "px, " + verticalTransform + "px)";
-                        this._animatedDragItems.push(elementBefore);
-                    }
-                    if (elementAfter) {
-                        elementAfter.style[transitionScriptName] = this._site.animationsDisabled ? "" : dragBetweenTransition;
-                        elementAfter.style[transformNames.scriptName] = "translate(" + (-horizontalTransform) + "px, -" + verticalTransform + "px)";
-                        this._animatedDragItems.push(elementAfter);
-                    }
-                },
-
-                dragLeave: function _LayoutCommon_dragLeave() {
-                    if (this._animatedDragItems) {
-                        for (var i = 0, len = this._animatedDragItems.length; i < len; i++) {
-                            this._animatedDragItems[i].style[transitionScriptName] = this._site.animationsDisabled ? "" : dragBetweenTransition;
-                            this._animatedDragItems[i].style[transformNames.scriptName] = "";
-                        }
-                    }
-                    this._animatedDragItems = [];
-                },
-
-                // Private methods
-
-                _setMaxRowsOrColumns: function _LayoutCommon_setMaxRowsOrColumns(value) {
-                    if (value === this._maxRowsOrColumns || this._inListMode) {
-                        return;
-                    }
-
-                    // If container size is unavailable then we do not need to compute itemsPerBar
-                    // as it will be computed along with the container size.
-                    if (this._sizes && this._sizes.containerSizeLoaded) {
-                        this._itemsPerBar = Math.floor(this._sizes.maxItemsContainerContentSize / this._sizes.containerCrossSize);
-                        if (value) {
-                            this._itemsPerBar = Math.min(this._itemsPerBar, value);
-                        }
-                        this._itemsPerBar = Math.max(1, this._itemsPerBar);
-                    }
-                    this._maxRowsOrColumns = value;
-
-                    this._invalidateLayout();
-                },
-
-                _getItemPosition: function _LayoutCommon_getItemPosition(itemIndex) {
-                    if (this._groupsEnabled) {
-                        var groupIndex = Math.min(this._groups.length - 1, this._site.groupIndexFromItemIndex(itemIndex)),
-                            group = this._groups[groupIndex],
-                            itemOfGroupIndex = itemIndex - group.startIndex;
-                        return this._getItemPositionForAnimations(itemIndex, groupIndex, itemOfGroupIndex);
-                    } else {
-                        return this._getItemPositionForAnimations(itemIndex, 0, itemIndex);
-                    }
-                },
-
-                _getRealizationRange: function _LayoutCommon_getRealizationRange() {
-                    var realizedRange = this._site.realizedRange;
-                    return {
-                        firstIndex: this._firstItemFromRange(realizedRange.firstPixel),
-                        lastIndex: this._lastItemFromRange(realizedRange.lastPixel)
-                    };
-                },
-
-                _getVisibleRange: function _LayoutCommon_getVisibleRange() {
-                    var visibleRange = this._site.visibleRange;
-                    return {
-                        firstIndex: this._firstItemFromRange(visibleRange.firstPixel),
-                        lastIndex: this._lastItemFromRange(visibleRange.lastPixel)
-                    };
-                },
-
-                _resetAnimationCaches: function _LayoutCommon_resetAnimationCaches(skipReset) {
-                    if (!skipReset) {
-                        // Caches with move transforms:
-                        this._resetStylesForRecords(this._cachedGroupRecords);
-                        this._resetStylesForRecords(this._cachedItemRecords);
-                        this._resetStylesForRecords(this._cachedHeaderRecords);
-
-                        // Caches with insert transforms:
-                        this._resetStylesForInsertedRecords(this._cachedInsertedItemRecords);
-                        this._resetStylesForInsertedRecords(this._cachedInsertedHeaderRecords);
-
-                        // Caches with insert transforms:
-                        this._resetStylesForRemovedRecords(this._cachedRemovedItems);
-                        this._resetStylesForRemovedRecords(this._cachedRemovedHeaders);
-
-                        var itemsBlockKeys = Object.keys(this._animatingItemsBlocks);
-                        for (var i = 0, len = itemsBlockKeys.length; i < len; i++) {
-                            var itemsBlock = this._animatingItemsBlocks[itemsBlockKeys[i]];
-                            itemsBlock.style.overflow = '';
-                            itemsBlock.classList.remove(_Constants._clipClass);
-                        }
-                    }
-
-                    this._cachedGroupRecords = {};
-                    this._cachedItemRecords = {};
-                    this._cachedHeaderRecords = {};
-
-                    this._cachedInsertedItemRecords = {};
-                    this._cachedInsertedHeaderRecords = {};
-
-                    this._cachedRemovedItems = [];
-                    this._cachedRemovedHeaders = [];
-
-                    this._animatingItemsBlocks = {};
-                },
-
-                _cacheRemovedElements: function _LayoutCommon_cacheRemovedElements(modifiedElements, cachedRecords, cachedInsertedRecords, removedElements, areHeaders) {
-                    var leftStr = "left";
-                    if (this._site.rtl) {
-                        leftStr = "right";
-                    }
-                    // Offset between the container's content box and its margin box
-                    var outerX, outerY;
-                    if (areHeaders) {
-                        outerX = this._sizes.headerContainerOuterX;
-                        outerY = this._sizes.headerContainerOuterY;
-                    } else {
-                        outerX = this._sizes.containerMargins[leftStr];
-                        outerY = this._sizes.containerMargins.top;
-                    }
-
-                    // Cache the removed boxes and place them back in the DOM with position absolute
-                    // so that they do not appear like they have moved.
-                    for (var i = 0, len = modifiedElements.length; i < len; i++) {
-                        var modifiedElementLookup = modifiedElements[i];
-                        if (modifiedElementLookup.newIndex === -1) {
-                            var container = modifiedElementLookup.element;
-                            var cachedItemRecord = cachedRecords[modifiedElementLookup.oldIndex];
-                            if (cachedItemRecord) {
-                                cachedItemRecord.element = container;
-                                // This item can no longer be a moved item.
-                                delete cachedRecords[modifiedElementLookup.oldIndex];
-                                container.style.position = "absolute";
-                                container.style[transitionScriptName] = "";
-                                container.style.top = cachedItemRecord.oldTop - outerY + "px";
-                                container.style[leftStr] = cachedItemRecord.oldLeft - outerX + "px";
-                                container.style.width = cachedItemRecord.width + "px";
-                                container.style.height = cachedItemRecord.height + "px";
-                                container.style[transformNames.scriptName] = "";
-                                this._site.surface.appendChild(container);
-                                removedElements.push(cachedItemRecord);
-                            }
-                            if (cachedInsertedRecords[modifiedElementLookup.oldIndex]) {
-                                delete cachedInsertedRecords[modifiedElementLookup.oldIndex];
-                            }
-                        }
-                    }
-                },
-                _cacheInsertedElements: function _LayoutCommon_cacheInsertedItems(modifiedElements, cachedInsertedRecords, cachedRecords) {
-                    var newCachedInsertedRecords = {};
-
-                    for (var i = 0, len = modifiedElements.length; i < len; i++) {
-                        var modifiedElementLookup = modifiedElements[i];
-                        var wasInserted = cachedInsertedRecords[modifiedElementLookup.oldIndex];
-                        if (wasInserted) {
-                            delete cachedInsertedRecords[modifiedElementLookup.oldIndex];
-                        }
-
-                        if (wasInserted || modifiedElementLookup.oldIndex === -1 || modifiedElementLookup.moved) {
-                            var cachedRecord = cachedRecords[modifiedElementLookup.newIndex];
-                            if (cachedRecord) {
-                                delete cachedRecords[modifiedElementLookup.newIndex];
-                            }
-
-                            var modifiedElement = modifiedElementLookup.element;
-                            newCachedInsertedRecords[modifiedElementLookup.newIndex] = modifiedElement;
-                            modifiedElement.style[transitionScriptName] = "";
-                            modifiedElement.style[transformNames.scriptName] = "";
-                            modifiedElement.style.opacity = 0;
-                        }
-                    }
-
-                    var keys = Object.keys(cachedInsertedRecords);
-                    for (var i = 0, len = keys.length; i < len; i++) {
-                        newCachedInsertedRecords[keys[i]] = cachedInsertedRecords[keys[i]];
-                    }
-
-                    return newCachedInsertedRecords;
-                },
-                _resetStylesForRecords: function _LayoutCommon_resetStylesForRecords(recordsHash) {
-                    var recordKeys = Object.keys(recordsHash);
-                    for (var i = 0, len = recordKeys.length; i < len; i++) {
-                        var record = recordsHash[recordKeys[i]];
-                        if (record.needsToResetTransform) {
-                            record.element.style[transformNames.scriptName] = "";
-                            record.needsToResetTransform = false;
-                        }
-                    }
-                },
-                _resetStylesForInsertedRecords: function _LayoutCommon_resetStylesForInsertedRecords(insertedRecords) {
-                    var insertedRecordKeys = Object.keys(insertedRecords);
-                    for (var i = 0, len = insertedRecordKeys.length; i < len; i++) {
-                        var insertedElement = insertedRecords[insertedRecordKeys[i]];
-                        insertedElement.style.opacity = 1;
-                    }
-                },
-                _resetStylesForRemovedRecords: function _LayoutCommon_resetStylesForRemovedRecords(removedElements) {
-                    for (var i = 0, len = removedElements.length; i < len; i++) {
-                        var container = removedElements[i].element;
-                        if (container.parentNode) {
-                            _Dispose._disposeElement(container);
-                            container.parentNode.removeChild(container);
-                        }
-                    }
-                },
-                _updateAnimationCache: function _LayoutCommon_updateAnimationCache(modifiedItems, modifiedGroups) {
-                    // ItemBoxes can change containers so we have to start them back without transforms
-                    // and then update them again. ItemsContainers don't need to do this.
-                    this._resetStylesForRecords(this._cachedItemRecords);
-                    this._resetStylesForRecords(this._cachedHeaderRecords);
-                    // Go through all the inserted records and reset their insert transforms.
-                    this._resetStylesForInsertedRecords(this._cachedInsertedItemRecords);
-                    this._resetStylesForInsertedRecords(this._cachedInsertedHeaderRecords);
-
-                    var existingContainers = {};
-                    var realizationRange = this._getRealizationRange();
-                    var tree = this._site.tree;
-                    for (var i = 0, itemIndex = 0, treeLength = tree.length; i < treeLength; i++) {
-                        forEachContainer(tree[i].itemsContainer, function (container) {
-                            if (realizationRange.firstIndex <= itemIndex && realizationRange.lastIndex >= itemIndex) {
-                                existingContainers[uniqueID(container)] = true;
-                            }
-                            itemIndex++;
-                        });
-                    }
-
-                    // Update the indicies before the insert since insert needs the new containers.
-                    function updateIndicies(modifiedElements, cachedRecords) {
-                        var updatedCachedRecords = {};
-
-                        for (var i = 0, len = modifiedElements.length; i < len; i++) {
-                            var modifiedElementLookup = modifiedElements[i];
-                            var cachedRecord = cachedRecords[modifiedElementLookup.oldIndex];
-                            if (cachedRecord) {
-                                updatedCachedRecords[modifiedElementLookup.newIndex] = cachedRecord;
-                                cachedRecord.element = modifiedElementLookup.element;
-                                delete cachedRecords[modifiedElementLookup.oldIndex];
-                            }
-                        }
-                        var cachedRecordKeys = Object.keys(cachedRecords);
-                        for (var i = 0, len = cachedRecordKeys.length; i < len; i++) {
-                            var key = cachedRecordKeys[i],
-                                record = cachedRecords[key];
-                            // We need to filter out containers which were removed from the DOM. If container's item
-                            // wasn't realized container can be removed without adding record to modifiedItems.
-                            if (!record.element || existingContainers[uniqueID(record.element)]) {
-                                updatedCachedRecords[key] = record;
-                            }
-                        }
-                        return updatedCachedRecords;
-                    }
-
-                    this._cachedItemRecords = updateIndicies(modifiedItems, this._cachedItemRecords);
-                    this._cachedHeaderRecords = updateIndicies(modifiedGroups, this._cachedHeaderRecords);
-
-                    this._cachedInsertedItemRecords = this._cacheInsertedElements(modifiedItems, this._cachedInsertedItemRecords, this._cachedItemRecords);
-                    this._cachedInsertedHeaderRecords = this._cacheInsertedElements(modifiedGroups, this._cachedInsertedHeaderRecords, this._cachedHeaderRecords);
-                },
-                _filterRemovedElements: function _LayoutCommon_filterRemovedElements() {
-                    this._removedElements = [];
-
-                    if (this._site.animationsDisabled) {
-                        this._resetStylesForRemovedRecords(this._cachedRemovedItems);
-                        this._resetStylesForRemovedRecords(this._cachedRemovedHeaders);
-                        return;
-                    }
-
-                    var that = this;
-                    var oldLeftStr = this.orientation === "horizontal" ? "oldLeft" : "oldTop";
-                    var widthStr = this.orientation === "horizontal" ? "width" : "height";
-
-                    var visibleFirstPixel = this._site.scrollbarPos;
-                    var visibleLastPixel = visibleFirstPixel + this._site.viewportSize[widthStr] - 1;
-
-                    function filterRemovedElements(removedRecordArray, removedElementsArray) {
-                        for (var i = 0, len = removedRecordArray.length; i < len; i++) {
-                            var removedItem = removedRecordArray[i];
-                            var container = removedItem.element;
-                            if (removedItem[oldLeftStr] + removedItem[widthStr] - 1 < visibleFirstPixel || removedItem[oldLeftStr] > visibleLastPixel || !that._site.viewport.contains(container)) {
-                                if (container.parentNode) {
-                                    _Dispose._disposeElement(container);
-                                    container.parentNode.removeChild(container);
-                                }
-                            } else {
-                                removedElementsArray.push(container);
-                            }
-                        }
-                    }
-
-                    filterRemovedElements(this._cachedRemovedItems, this._removedElements);
-                    filterRemovedElements(this._cachedRemovedHeaders, this._removedElements);
-                },
-
-                _filterInsertedElements: function _LayoutCommon_filterInsertedElements() {
-                    this._insertedElements = [];
-                    if (this._site.animationsDisabled) {
-                        this._resetStylesForInsertedRecords(this._cachedInsertedItemRecords);
-                        this._resetStylesForInsertedRecords(this._cachedInsertedHeaderRecords);
-                        return;
-                    }
-
-                    var that = this;
-                    var visibleRange = this._getVisibleRange();
-
-                    function filterInsertedElements(cachedInsertedRecords, insertedElementsArray) {
-                        var recordKeys = Object.keys(cachedInsertedRecords);
-                        for (var i = 0, len = recordKeys.length; i < len; i++) {
-                            var itemIndex = recordKeys[i];
-                            var insertedRecord = cachedInsertedRecords[itemIndex];
-                            if (itemIndex < visibleRange.firstIndex || itemIndex > visibleRange.lastIndex || that._site.viewport.contains(insertedRecord.element)) {
-                                insertedRecord.style.opacity = 1;
-                            } else {
-                                insertedElementsArray.push(insertedRecord);
-                            }
-                        }
-                    }
-
-                    filterInsertedElements(this._cachedInsertedItemRecords, this._insertedElements);
-                    filterInsertedElements(this._cachedInsertedHeaderRecords, this._insertedElements);
-                },
-
-                _filterMovedElements: function _LayoutCommon_filterMovedElements() {
-                    var that = this;
-
-                    // This filters all the items and groups down which could have moved to just the items on screen.
-                    // The items which are not going to animate are immediately shown in their correct final location.
-                    var oldLeftStr = this.orientation === "horizontal" ? "oldLeft" : "oldTop";
-                    var leftStr = this.orientation === "horizontal" ? "left" : "top";
-                    var widthStr = this.orientation === "horizontal" ? "width" : "height";
-
-                    var realizationRange = this._getRealizationRange();
-                    var visibleFirstPixel = this._site.scrollbarPos;
-                    var visibleLastPixel = visibleFirstPixel + this._site.viewportSize[widthStr] - 1;
-
-                    // ItemMove can reflow across column or fade in/out due to multisize.
-                    this._itemMoveRecords = [];
-                    this._moveRecords = [];
-
-                    if (!this._site.animationsDisabled) {
-                        var tree = this._site.tree;
-                        var itemIndex = 0;
-                        for (var i = 0, treeLength = tree.length; i < treeLength; i++) {
-                            var groupBundle = tree[i];
-                            var groupHasItemToAnimate = false;
-
-                            forEachContainer(groupBundle.itemsContainer, function () {
-                                if (realizationRange.firstIndex <= itemIndex && realizationRange.lastIndex >= itemIndex) {
-                                    var cachedItemRecord = this._cachedItemRecords[itemIndex];
-                                    if (cachedItemRecord) {
-                                        var shouldAnimate = ((cachedItemRecord[oldLeftStr] + cachedItemRecord[widthStr] - 1 >= visibleFirstPixel && cachedItemRecord[oldLeftStr] <= visibleLastPixel) ||
-                                                            (cachedItemRecord[leftStr] + cachedItemRecord[widthStr] - 1 >= visibleFirstPixel && cachedItemRecord[leftStr] <= visibleLastPixel)) &&
-                                                            that._site.viewport.contains(cachedItemRecord.element);
-                                        if (shouldAnimate) {
-                                            groupHasItemToAnimate = true;
-                                            if (cachedItemRecord.needsToResetTransform) {
-                                                this._itemMoveRecords.push(cachedItemRecord);
-                                                delete this._cachedItemRecords[itemIndex];
-                                            }
-                                        }
-                                    }
-                                }
-                                itemIndex++;
-                            }.bind(this));
-
-                            var groupIndex = i;
-                            var cachedHeaderRecord = this._cachedHeaderRecords[groupIndex];
-                            if (cachedHeaderRecord) {
-                                if (groupHasItemToAnimate && cachedHeaderRecord.needsToResetTransform) {
-                                    this._moveRecords.push(cachedHeaderRecord);
-                                    delete this._cachedHeaderRecords[groupIndex];
-                                }
-                            }
-
-                            var cachedGroupRecord = this._cachedGroupRecords[uniqueID(groupBundle.itemsContainer.element)];
-                            if (cachedGroupRecord) {
-                                if (groupHasItemToAnimate && cachedGroupRecord.needsToResetTransform) {
-                                    this._moveRecords.push(cachedGroupRecord);
-                                    delete this._cachedGroupRecords[uniqueID(groupBundle.itemsContainer.element)];
-                                }
-                            }
-                        }
-                    }
-
-                    // Reset transform for groups and items that were never on screen.
-                    this._resetStylesForRecords(this._cachedGroupRecords);
-                    this._resetStylesForRecords(this._cachedItemRecords);
-                    this._resetStylesForRecords(this._cachedHeaderRecords);
-                },
-
-                _getItemPositionForAnimations: function _LayoutCommon_getItemPositionForAnimations(itemIndex, groupIndex, itemOfGroupIndex) {
-                    // Top/Left are used to know if the item has moved and also used to position the item if removed.
-                    // Row/Column are used to know if a reflow animation should occur
-                    // Height/Width are used when positioning a removed item without impacting layout.
-                    // The returned rectangle refers to the win-container's border/padding/content box. Coordinates
-                    // are relative to the viewport.
-                    var group = this._groups[groupIndex];
-                    var itemPosition = group.getItemPositionForAnimations(itemOfGroupIndex);
-                    var groupOffset = (this._groups[groupIndex] ? this._groups[groupIndex].offset : 0);
-                    var headerWidth = (this._groupsEnabled && this._groupHeaderPosition === HeaderPosition.left ? this._sizes.headerContainerWidth : 0);
-                    var headerHeight = (this._groupsEnabled && this._groupHeaderPosition === HeaderPosition.top ? this._sizes.headerContainerHeight : 0);
-
-                    itemPosition.left += this._sizes.layoutOriginX + headerWidth + this._sizes.itemsContainerOuterX;
-                    itemPosition.top += this._sizes.layoutOriginY + headerHeight + this._sizes.itemsContainerOuterY;
-                    itemPosition[this._horizontal ? "left" : "top"] += groupOffset;
-                    return itemPosition;
-                },
-
-                _getHeaderPositionForAnimations: function (groupIndex) {
-                    // Top/Left are used to know if the item has moved.
-                    // Height/Width are used when positioning a removed item without impacting layout.
-                    // The returned rectangle refers to the header container's content box. Coordinates
-                    // are relative to the viewport.
-
-                    var headerPosition;
-
-                    if (this._groupsEnabled) {
-                        var width = this._sizes.headerContainerWidth - this._sizes.headerContainerOuterWidth,
-                            height = this._sizes.headerContainerHeight - this._sizes.headerContainerOuterHeight;
-                        if (this._groupHeaderPosition === HeaderPosition.left && !this._horizontal) {
-                            height = this._groups[groupIndex].getItemsContainerSize() - this._sizes.headerContainerOuterHeight;
-                        } else if (this._groupHeaderPosition === HeaderPosition.top && this._horizontal) {
-                            width = this._groups[groupIndex].getItemsContainerSize() - this._sizes.headerContainerOuterWidth;
-                        }
-
-                        var offsetX = this._horizontal ? this._groups[groupIndex].offset : 0,
-                            offsetY = this._horizontal ? 0 : this._groups[groupIndex].offset;
-                        headerPosition = {
-                            top: this._sizes.layoutOriginY + offsetY + this._sizes.headerContainerOuterY,
-                            left: this._sizes.layoutOriginX + offsetX + this._sizes.headerContainerOuterX,
-                            height: height,
-                            width: width
-                        };
-                    } else {
-                        headerPosition = {
-                            top: 0,
-                            left: 0,
-                            height: 0,
-                            width: 0
-                        };
-                    }
-                    return headerPosition;
-                },
-
-                _rangeContainsItems: function _LayoutCommon_rangeContainsItems(firstPixel, lastPixel) {
-                    if (this._groups.length === 0) {
-                        return false;
-                    } else {
-                        var lastGroup = this._groups[this._groups.length - 1],
-                            lastPixelOfLayout = this._sizes.layoutOrigin + lastGroup.offset + this._getGroupSize(lastGroup) - 1;
-
-                        return lastPixel >= 0 && firstPixel <= lastPixelOfLayout;
-                    }
-                },
-
-                _itemFromOffset: function _LayoutCommon_itemFromOffset(offset, options) {
-                    // supported options are:
-                    // - wholeItem: when set to true the fully visible item is returned
-                    // - last: if 1 the last item is returned. if 0 the first
-                    var that = this;
-                    if (this._groups.length === 0) {
-                        return 0;
-                    }
-
-                    function assignItemMargins(offset) {
-                        if (!options.wholeItem) {
-                            // This makes it such that if a container's margin is on screen but all of its
-                            // content is off screen then we'll treat the container as being off screen.
-                            var marginPropLast = (that._horizontal ? (that._site.rtl ? "right" : "left") : "top"),
-                                marginPropFirst = (that._horizontal ? (that._site.rtl ? "left" : "right") : "bottom");
-                            if (options.last) {
-                                // When looking for the *last* item, treat all container margins
-                                // as belonging to the container *before* the margin.
-                                return offset - that._sizes.containerMargins[marginPropLast];
-                            } else {
-                                // When looking for the *first* item, treat all container margins
-                                // as belonging to the container *after* the margin.
-                                return offset + that._sizes.containerMargins[marginPropFirst];
-                            }
-                        }
-                        return offset;
-                    }
-
-                    // Assign the headers and margins to the appropriate groups.
-                    function assignGroupMarginsAndHeaders(offset) {
-                        if (options.last) {
-                            // When looking for the *last* group, the *trailing* header and margin belong to the group.
-                            return offset - that._getHeaderSizeGroupAdjustment() - that._sizes.itemsContainerOuterStart;
-                        } else {
-                            // When looking for the *first* group, the *leading* header and margin belong to the group.
-                            // No need to make any adjustments to offset because the correct header and margin
-                            // already belong to the group.
-                            return offset;
-                        }
-                    }
-
-                    options = options || {};
-
-                    // Make offset relative to layout's content box
-                    offset -= this._sizes.layoutOrigin;
-
-                    offset = assignItemMargins(offset);
-
-                    var groupIndex = this._groupFromOffset(assignGroupMarginsAndHeaders(offset)),
-                        group = this._groups[groupIndex];
-
-                    // Make offset relative to the margin box of the group's items container
-                    offset -= group.offset;
-                    offset -= this._getHeaderSizeGroupAdjustment();
-
-                    return group.startIndex + group.itemFromOffset(offset, options);
-                },
-
-                _firstItemFromRange: function _LayoutCommon_firstItemFromRange(firstPixel, options) {
-                    // supported options are:
-                    // - wholeItem: when set to true the first fully visible item is returned
-                    options = options || {};
-                    options.last = 0;
-                    return this._itemFromOffset(firstPixel, options);
-                },
-
-                _lastItemFromRange: function _LayoutCommon_lastItemFromRange(lastPixel, options) {
-                    // supported options are:
-                    // - wholeItem: when set to true the last fully visible item is returned
-                    options = options || {};
-                    options.last = 1;
-                    return this._itemFromOffset(lastPixel, options);
-                },
-
-                _adjustedKeyForRTL: function _LayoutCommon_adjustedKeyForRTL(key) {
-                    if (this._site.rtl) {
-                        if (key === Key.leftArrow) {
-                            key = Key.rightArrow;
-                        } else if (key === Key.rightArrow) {
-                            key = Key.leftArrow;
-                        }
-                    }
-                    return key;
-                },
-
-                _adjustedKeyForOrientationAndBars: function _LayoutCommon_adjustedKeyForOrientationAndBars(key, cellSpanningGroup) {
-                    var newKey = key;
-
-                    // Don't support cell spanning
-                    if (cellSpanningGroup) {
-                        return key;
-                    }
-                    // First, convert the key into a virtual form based off of horizontal layouts.
-                    // In a horizontal layout, left/right keys switch between columns (AKA "bars"), and
-                    // up/down keys switch between rows (AKA "slots").
-                    // In vertical mode, we want up/down to switch between rows (AKA "bars" when vertical),
-                    // and left/right to switch between columns (AKA "slots" when vertical).
-                    // The first step is to convert keypresses in vertical so that up/down always correspond to moving between slots,
-                    // and left/right moving between bars.
-                    if (!this._horizontal) {
-                        switch (newKey) {
-                            case Key.leftArrow:
-                                newKey = Key.upArrow;
-                                break;
-                            case Key.rightArrow:
-                                newKey = Key.downArrow;
-                                break;
-                            case Key.upArrow:
-                                newKey = Key.leftArrow;
-                                break;
-                            case Key.downArrow:
-                                newKey = Key.rightArrow;
-                                break;
-                        }
-                    }
-
-                    // Next, if we only have one item per bar, we'll make the change-slots-key the same as the change-bars-key
-                    if (this._itemsPerBar === 1) {
-                        if (newKey === Key.upArrow) {
-                            newKey = Key.leftArrow;
-                        } else if (newKey === Key.downArrow) {
-                            newKey = Key.rightArrow;
-                        }
-                    }
-
-                    return newKey;
-                },
-
-                _getAdjacentForPageKeys: function _LayoutCommon_getAdjacentForPageKeys(currentItem, pressedKey) {
-                    var containerMargins = this._sizes.containerMargins,
-                        marginSum = (this.orientation === "horizontal" ?
-                            containerMargins.left + containerMargins.right :
-                            containerMargins.top + containerMargins.bottom);
-
-                    var viewportLength = this._site.viewportSize[this.orientation === "horizontal" ? "width" : "height"],
-                        firstPixel = this._site.scrollbarPos,
-                        lastPixel = firstPixel + viewportLength - 1 - containerMargins[(this.orientation === "horizontal" ? "right" : "bottom")],
-                        newFocus;
-
-                    // Handles page up by attempting to choose the first fully visible item
-                    // on the current page. If that item already has focus, chooses the
-                    // first item on the previous page. Page down is handled similarly.
-
-                    var firstIndex = this._firstItemFromRange(firstPixel, { wholeItem: true }),
-                        lastIndex = this._lastItemFromRange(lastPixel, { wholeItem: false }),
-                        currentItemPosition = this._getItemPosition(currentItem.index);
-
-
-                    var offscreen = false;
-                    if (currentItem.index < firstIndex || currentItem.index > lastIndex) {
-                        offscreen = true;
-                        if (this.orientation === "horizontal") {
-                            firstPixel = currentItemPosition.left - marginSum;
-                        } else {
-                            firstPixel = currentItemPosition.top - marginSum;
-                        }
-                        lastPixel = firstPixel + viewportLength - 1;
-                        firstIndex = this._firstItemFromRange(firstPixel, { wholeItem: true });
-                        lastIndex = this._lastItemFromRange(lastPixel, { wholeItem: false });
-                    }
-
-                    if (pressedKey === Key.pageUp) {
-                        if (!offscreen && firstIndex !== currentItem.index) {
-                            return { type: _UI.ObjectType.item, index: firstIndex };
-                        }
-                        var end;
-                        if (this.orientation === "horizontal") {
-                            end = currentItemPosition.left + currentItemPosition.width + marginSum + containerMargins.left;
-                        } else {
-                            end = currentItemPosition.top + currentItemPosition.height + marginSum + containerMargins.bottom;
-                        }
-                        var firstIndexOnPrevPage = this._firstItemFromRange(end - viewportLength, { wholeItem: true });
-                        if (currentItem.index === firstIndexOnPrevPage) {
-                            // The current item is so big that it spanned from the previous page, so we want to at least
-                            // move to the previous item.
-                            newFocus = Math.max(0, currentItem.index - this._itemsPerBar);
-                        } else {
-                            newFocus = firstIndexOnPrevPage;
-                        }
-                    } else {
-                        if (!offscreen && lastIndex !== currentItem.index) {
-                            return { type: _UI.ObjectType.item, index: lastIndex };
-                        }
-                        // We need to subtract twice the marginSum from the item's starting position because we need to
-                        // consider that ensureVisible will scroll the viewport to include the new items margin as well
-                        // which may push the current item just off screen.
-                        var start;
-                        if (this.orientation === "horizontal") {
-                            start = currentItemPosition.left - marginSum - containerMargins.right;
-                        } else {
-                            start = currentItemPosition.top - marginSum - containerMargins.bottom;
-                        }
-                        var lastIndexOnNextPage = Math.max(0, this._lastItemFromRange(start + viewportLength - 1, { wholeItem: true }));
-                        if (currentItem.index === lastIndexOnNextPage) {
-                            // The current item is so big that it spans across the next page, so we want to at least
-                            // move to the next item. It is also ok to blindly increment this index w/o bound checking
-                            // since the browse mode clamps the bounds for page keys. This way we do not have to
-                            // asynchronoulsy request the count here.
-                            newFocus = currentItem.index + this._itemsPerBar;
-                        } else {
-                            newFocus = lastIndexOnNextPage;
-                        }
-                    }
-
-                    return { type: _UI.ObjectType.item, index: newFocus };
-                },
-
-                _isCellSpanning: function _LayoutCommon_isCellSpanning(groupIndex) {
-                    var group = this._site.groupFromIndex(groupIndex),
-                        groupInfo = this._groupInfo;
-
-                    if (groupInfo) {
-                        return !!(typeof groupInfo === "function" ? groupInfo(group) : groupInfo).enableCellSpanning;
-                    } else {
-                        return false;
-                    }
-                },
-
-                // Can only be called after measuring has been completed
-                _getGroupInfo: function _LayoutCommon_getGroupInfo(groupIndex) {
-                    var group = this._site.groupFromIndex(groupIndex),
-                        groupInfo = this._groupInfo,
-                        margins = this._sizes.containerMargins,
-                        adjustedInfo = { enableCellSpanning: false };
-
-                    groupInfo = (typeof groupInfo === "function" ? groupInfo(group) : groupInfo);
-                    if (groupInfo) {
-                        if (groupInfo.enableCellSpanning && (+groupInfo.cellWidth !== groupInfo.cellWidth || +groupInfo.cellHeight !== groupInfo.cellHeight)) {
-                            throw new _ErrorFromName("WinJS.UI.GridLayout.GroupInfoResultIsInvalid", strings.groupInfoResultIsInvalid);
-                        }
-                        adjustedInfo = {
-                            enableCellSpanning: !!groupInfo.enableCellSpanning,
-                            cellWidth: groupInfo.cellWidth + margins.left + margins.right,
-                            cellHeight: groupInfo.cellHeight + margins.top + margins.bottom
-                        };
-                    }
-
-                    return adjustedInfo;
-                },
-
-                // itemIndex is optional
-                _getItemInfo: function _LayoutCommon_getItemInfo(itemIndex) {
-                    var result;
-                    if (!this._itemInfo || typeof this._itemInfo !== "function") {
-                        if (this._useDefaultItemInfo) {
-                            result = this._defaultItemInfo(itemIndex);
-                        } else {
-                            throw new _ErrorFromName("WinJS.UI.GridLayout.ItemInfoIsInvalid", strings.itemInfoIsInvalid);
-                        }
-                    } else {
-                        result = this._itemInfo(itemIndex);
-                    }
-                    return Promise.as(result).then(function (size) {
-                        if (!size || +size.width !== size.width || +size.height !== size.height) {
-                            throw new _ErrorFromName("WinJS.UI.GridLayout.ItemInfoIsInvalid", strings.itemInfoIsInvalid);
-                        }
-                        return size;
-                    });
-                },
-
-                _defaultItemInfo: function _LayoutCommon_defaultItemInfo(itemIndex) {
-                    var that = this;
-                    return this._site.renderItem(this._site.itemFromIndex(itemIndex)).then(function (element) {
-                        that._elementsToMeasure[itemIndex] = {
-                            element: element
-                        };
-                        return that._measureElements();
-                    }).then(
-                        function () {
-                            var entry = that._elementsToMeasure[itemIndex],
-                                size = {
-                                    width: entry.width,
-                                    height: entry.height
-                                };
-
-                            delete that._elementsToMeasure[itemIndex];
-                            return size;
-                        },
-                        function (error) {
-                            delete that._elementsToMeasure[itemIndex];
-                            return Promise.wrapError(error);
-                        }
-                    );
-                },
-
-                _getGroupSize: function _LayoutCommon_getGroupSize(group) {
-                    var headerContainerMinSize = 0;
-
-                    if (this._groupsEnabled) {
-                        if (this._horizontal && this._groupHeaderPosition === HeaderPosition.top) {
-                            headerContainerMinSize = this._sizes.headerContainerMinWidth;
-                        } else if (!this._horizontal && this._groupHeaderPosition === HeaderPosition.left) {
-                            headerContainerMinSize = this._sizes.headerContainerMinHeight;
-                        }
-                    }
-                    return Math.max(headerContainerMinSize, group.getItemsContainerSize() + this._getHeaderSizeGroupAdjustment());
-                },
-
-                // offset should be relative to the grid layout's content box
-                _groupFromOffset: function _LayoutCommon_groupFromOffset(offset) {
-                    return offset < this._groups[0].offset ?
-                        0 :
-                        this._groupFrom(function (group) {
-                            return offset < group.offset;
-                        });
-                },
-
-                _groupFromImpl: function _LayoutCommon_groupFromImpl(fromGroup, toGroup, comp) {
-                    if (toGroup < fromGroup) {
-                        return null;
-                    }
-
-                    var center = fromGroup + Math.floor((toGroup - fromGroup) / 2),
-                        centerGroup = this._groups[center];
-
-                    if (comp(centerGroup, center)) {
-                        return this._groupFromImpl(fromGroup, center - 1, comp);
-                    } else if (center < toGroup && !comp(this._groups[center + 1], center + 1)) {
-                        return this._groupFromImpl(center + 1, toGroup, comp);
-                    } else {
-                        return center;
-                    }
-                },
-
-                _groupFrom: function _LayoutCommon_groupFrom(comp) {
-                    if (this._groups.length > 0) {
-                        var lastGroupIndex = this._groups.length - 1,
-                            lastGroup = this._groups[lastGroupIndex];
-
-                        if (!comp(lastGroup, lastGroupIndex)) {
-                            return lastGroupIndex;
-                        } else {
-                            return this._groupFromImpl(0, this._groups.length - 1, comp);
-                        }
-                    } else {
-                        return null;
-                    }
-                },
-
-                _invalidateLayout: function _LayoutCommon_invalidateLayout() {
-                    if (this._site) {
-                        this._site.invalidateLayout();
-                    }
-                },
-
-                _resetMeasurements: function _LayoutCommon_resetMeasurements() {
-                    if (this._measuringPromise) {
-                        this._measuringPromise.cancel();
-                        this._measuringPromise = null;
-                    }
-                    if (this._containerSizeClassName) {
-                        _ElementUtilities.removeClass(this._site.surface, this._containerSizeClassName);
-                        deleteDynamicCssRule(this._containerSizeClassName);
-                        this._containerSizeClassName = null;
-                    }
-                    this._sizes = null;
-                    this._resetAnimationCaches();
-                },
-
-                _measureElements: function _LayoutCommon_measureElements() {
-                    // batching measurements to minimalize number of layout passes
-                    if (!this._measuringElements) {
-                        var that = this;
-                        // Schedule a job so that:
-                        //  1. Calls to _measureElements are batched.
-                        //  2. that._measuringElements is set before the promise handler is executed
-                        //     (that._measuringElements is used within the handler).
-                        that._measuringElements = Scheduler.schedulePromiseHigh(null, "WinJS.UI.GridLayout._measuringElements").then(
-                            function measure() {
-                                that._site._writeProfilerMark("_measureElements,StartTM");
-
-                                var surface = that._createMeasuringSurface(),
-                                    itemsContainer = _Global.document.createElement("div"),
-                                    site = that._site,
-                                    measuringElements = that._measuringElements,
-                                    elementsToMeasure = that._elementsToMeasure,
-                                    stopMeasuring = false;
-
-                                itemsContainer.className = _Constants._itemsContainerClass + " " + _Constants._laidOutClass;
-                                // This code is executed by CellSpanningGroups where styling is configured for –ms-grid. Let's satisfy these assumptions
-                                itemsContainer.style.cssText +=
-                                        ";display: -ms-grid" +
-                                        ";-ms-grid-column: 1" +
-                                        ";-ms-grid-row: 1";
-
-                                var keys = Object.keys(elementsToMeasure),
-                                    len,
-                                    i;
-
-                                for (i = 0, len = keys.length; i < len; i++) {
-                                    var element = elementsToMeasure[keys[i]].element;
-                                    element.style["-ms-grid-column"] = i + 1;
-                                    element.style["-ms-grid-row"] = i + 1;
-                                    itemsContainer.appendChild(element);
-                                }
-
-                                surface.appendChild(itemsContainer);
-                                site.viewport.insertBefore(surface, site.viewport.firstChild);
-
-                                // Reading from the DOM may cause the app's resize handler to
-                                // be run synchronously which may invalidate this measuring
-                                // operation. When this happens, stop measuring.
-                                measuringElements.then(null, function () {
-                                    stopMeasuring = true;
-                                });
-
-                                for (i = 0, len = keys.length; i < len && !stopMeasuring; i++) {
-                                    var entry = elementsToMeasure[keys[i]],
-                                        item = entry.element.querySelector("." + _Constants._itemClass);
-
-                                    entry.width = _ElementUtilities.getTotalWidth(item);
-                                    entry.height = _ElementUtilities.getTotalHeight(item);
-
-                                }
-
-                                if (surface.parentNode) {
-                                    surface.parentNode.removeChild(surface);
-                                }
-                                if (measuringElements === that._measuringElements) {
-                                    that._measuringElements = null;
-                                }
-
-                                site._writeProfilerMark("_measureElements,StopTM");
-                            },
-                            function (error) {
-                                that._measuringElements = null;
-                                return Promise.wrapError(error);
-                            }
-                        );
-                    }
-                    return this._measuringElements;
-                },
-
-                _ensureEnvInfo: function _LayoutCommon_ensureEnvInfo() {
-                    if (!this._envInfo) {
-                        this._envInfo = getEnvironmentSupportInformation(this._site);
-                        if (this._envInfo && !this._envInfo.supportsCSSGrid) {
-                            _ElementUtilities.addClass(this._site.surface, _Constants._noCSSGrid);
-                        }
-                    }
-                    return !!this._envInfo;
-                },
-
-                _createMeasuringSurface: function _LayoutCommon_createMeasuringSurface() {
-                    var surface = _Global.document.createElement("div");
-
-                    surface.style.cssText =
-                        "visibility: hidden" +
-                        ";-ms-grid-columns: auto" +
-                        ";-ms-grid-rows: auto" +
-                        ";-ms-flex-align: start" +
-                        ";-webkit-align-items: flex-start" +
-                        ";align-items: flex-start";
-                    surface.className = _Constants._scrollableClass + " " + (this._inListMode ? _Constants._listLayoutClass : _Constants._gridLayoutClass);
-                    if (!this._envInfo.supportsCSSGrid) {
-                        _ElementUtilities.addClass(surface, _Constants._noCSSGrid);
-                    }
-                    if (this._groupsEnabled) {
-                        if (this._groupHeaderPosition === HeaderPosition.top) {
-                            _ElementUtilities.addClass(surface, _Constants._headerPositionTopClass);
-                        } else {
-                            _ElementUtilities.addClass(surface, _Constants._headerPositionLeftClass);
-                        }
-                    }
-
-                    return surface;
-                },
-
-                // Assumes that the size of the item at the specified index is representative
-                // of the size of all items, measures it, and stores the measurements in
-                // this._sizes. If necessary, also:
-                // - Creates a CSS rule to give the containers a height and width
-                // - Stores the name associated with the rule in this._containerSizeClassName
-                // - Adds the class name associated with the rule to the surface
-                _measureItem: function _LayoutCommon_measureItem(index) {
-                    var that = this;
-                    var perfId = "Layout:measureItem";
-                    var site = that._site;
-                    var measuringPromise = that._measuringPromise;
-
-                    // itemPromise is optional. It is provided when taking a second attempt at measuring.
-                    function measureItemImpl(index, itemPromise) {
-                        var secondTry = !!itemPromise,
-                            elementPromises = {},
-                            itemPromise,
-                            left = site.rtl ? "right" : "left";
-
-                        return site.itemCount.then(function (count) {
-                            if (!count || (that._groupsEnabled && !site.groupCount)) {
-                                return Promise.cancel;
-                            }
-
-                            itemPromise = itemPromise || site.itemFromIndex(index);
-                            elementPromises.container = site.renderItem(itemPromise);
-                            if (that._groupsEnabled) {
-                                elementPromises.headerContainer = site.renderHeader(that._site.groupFromIndex(site.groupIndexFromItemIndex(index)));
-                            }
-
-                            return Promise.join(elementPromises);
-                        }).then(function (elements) {
-
-                            // Reading from the DOM is tricky because each read may trigger a resize handler which
-                            // may invalidate this layout object. To make it easier to minimize bugs in this edge case:
-                            //  1. All DOM reads for _LayoutCommon_measureItem should be contained within this function.
-                            //  2. This function should remain as simple as possible. Stick to DOM reads, avoid putting
-                            //     logic in here, and cache all needed instance variables at the top of the function.
-                            //
-                            // Returns null if the measuring operation was invalidated while reading from the DOM.
-                            // Otherwise, returns an object containing the measurements.
-                            function readMeasurementsFromDOM() {
-                                var horizontal = that._horizontal;
-                                var groupsEnabled = that._groupsEnabled;
-                                var stopMeasuring = false;
-
-                                // Reading from the DOM may cause the app's resize handler to
-                                // be run synchronously which may invalidate this measuring
-                                // operation. When this happens, stop measuring.
-                                measuringPromise.then(null, function () {
-                                    stopMeasuring = true;
-                                });
-
-                                var firstElementOnSurfaceMargins = getMargins(firstElementOnSurface);
-                                var firstElementOnSurfaceOffsetX = site.rtl ?
-                                    (site.viewport.offsetWidth - (firstElementOnSurface.offsetLeft + firstElementOnSurface.offsetWidth)) :
-                                    firstElementOnSurface.offsetLeft;
-                                var firstElementOnSurfaceOffsetY = firstElementOnSurface.offsetTop;
-                                var sizes = {
-                                    // These will be set by _viewportSizeChanged
-                                    viewportContentSize: 0,
-                                    surfaceContentSize: 0,
-                                    maxItemsContainerContentSize: 0,
-
-                                    surfaceOuterHeight: getOuterHeight(surface),
-                                    surfaceOuterWidth: getOuterWidth(surface),
-
-                                    // Origin of the grid layout's content in viewport coordinates
-                                    layoutOriginX: firstElementOnSurfaceOffsetX - firstElementOnSurfaceMargins[left],
-                                    layoutOriginY: firstElementOnSurfaceOffsetY - firstElementOnSurfaceMargins.top,
-                                    itemsContainerOuterHeight: getOuterHeight(itemsContainer),
-                                    itemsContainerOuterWidth: getOuterWidth(itemsContainer),
-                                    // Amount of space between the items container's margin and its content
-                                    itemsContainerOuterX: getOuter(site.rtl ? "Right" : "Left", itemsContainer),
-                                    itemsContainerOuterY: getOuter("Top", itemsContainer),
-                                    itemsContainerMargins: getMargins(itemsContainer),
-
-                                    itemBoxOuterHeight: getOuterHeight(itemBox),
-                                    itemBoxOuterWidth: getOuterWidth(itemBox),
-                                    containerOuterHeight: getOuterHeight(elements.container),
-                                    containerOuterWidth: getOuterWidth(elements.container),
-                                    emptyContainerContentHeight: _ElementUtilities.getContentHeight(emptyContainer),
-                                    emptyContainerContentWidth: _ElementUtilities.getContentWidth(emptyContainer),
-
-                                    containerMargins: getMargins(elements.container),
-                                    // containerWidth/Height are computed when a uniform group is detected
-                                    containerWidth: 0,
-                                    containerHeight: 0,
-                                    // true when both containerWidth and containerHeight have been measured
-                                    containerSizeLoaded: false
-                                };
-
-                                if (site.header) {
-                                    sizes[(horizontal ? "layoutOriginX" : "layoutOriginY")] += _ElementUtilities[(horizontal ? "getTotalWidth" : "getTotalHeight")](site.header);
-                                }
-
-                                if (groupsEnabled) {
-                                    // Amount of space between the header container's margin and its content
-                                    sizes.headerContainerOuterX = getOuter(site.rtl ? "Right" : "Left", elements.headerContainer),
-                                    sizes.headerContainerOuterY = getOuter("Top", elements.headerContainer),
-
-                                    sizes.headerContainerOuterWidth = getOuterWidth(elements.headerContainer);
-                                    sizes.headerContainerOuterHeight = getOuterHeight(elements.headerContainer);
-                                    sizes.headerContainerWidth = _ElementUtilities.getTotalWidth(elements.headerContainer);
-                                    sizes.headerContainerHeight = _ElementUtilities.getTotalHeight(elements.headerContainer);
-                                    sizes.headerContainerMinWidth = getDimension(elements.headerContainer, "minWidth") + sizes.headerContainerOuterWidth;
-                                    sizes.headerContainerMinHeight = getDimension(elements.headerContainer, "minHeight") + sizes.headerContainerOuterHeight;
-                                }
-
-                                var measurements = {
-                                    // Measurements which are needed after measureItem has returned.
-                                    sizes: sizes,
-
-                                    // Measurements which are only needed within measureItem.
-                                    viewportContentWidth: _ElementUtilities.getContentWidth(site.viewport),
-                                    viewportContentHeight: _ElementUtilities.getContentHeight(site.viewport),
-                                    containerContentWidth: _ElementUtilities.getContentWidth(elements.container),
-                                    containerContentHeight: _ElementUtilities.getContentHeight(elements.container),
-                                    containerWidth: _ElementUtilities.getTotalWidth(elements.container),
-                                    containerHeight: _ElementUtilities.getTotalHeight(elements.container)
-                                };
-                                measurements.viewportCrossSize = measurements[horizontal ? "viewportContentHeight" : "viewportContentWidth"];
-
-                                site.readyToMeasure();
-
-                                return stopMeasuring ? null : measurements;
-                            }
-
-                            function cleanUp() {
-                                if (surface.parentNode) {
-                                    surface.parentNode.removeChild(surface);
-                                }
-                            }
-
-                            var surface = that._createMeasuringSurface(),
-                                itemsContainer = _Global.document.createElement("div"),
-                                emptyContainer = _Global.document.createElement("div"),
-                                itemBox = elements.container.querySelector("." + _Constants._itemBoxClass),
-                                groupIndex = site.groupIndexFromItemIndex(index);
-
-                            emptyContainer.className = _Constants._containerClass;
-                            itemsContainer.className = _Constants._itemsContainerClass + " " + _Constants._laidOutClass;
-                            // Use display=inline-block so that the width sizes to content when not in list mode.
-                            // When in grid mode, put items container and header container in different rows and columns so that the size of the items container does not affect the size of the header container and vice versa.
-                            // Use the same for list mode when headers are inline with item containers.
-                            // When headers are to the left of a vertical list, or above a horizontal list, put the rows/columns they would be in when laid out normally
-                            // into the CSS text for measuring. We have to do this because list item containers should take up 100% of the space left over in the surface
-                            // once the group's header is laid out.
-                            var itemsContainerRow = 1,
-                                itemsContainerColumn = 1,
-                                headerContainerRow = 2,
-                                headerContainerColumn = 2,
-                                firstElementOnSurface = itemsContainer,
-                                addHeaderFirst = false;
-                            if (that._inListMode && that._groupsEnabled) {
-                                if (that._horizontal && that._groupHeaderPosition === HeaderPosition.top) {
-                                    itemsContainerRow = 2;
-                                    headerContainerColumn = 1;
-                                    headerContainerRow = 1;
-                                    firstElementOnSurface = elements.headerContainer;
-                                    addHeaderFirst = true;
-                                } else if (!that._horizontal && that._groupHeaderPosition === HeaderPosition.left) {
-                                    itemsContainerColumn = 2;
-                                    headerContainerColumn = 1;
-                                    headerContainerRow = 1;
-                                    firstElementOnSurface = elements.headerContainer;
-                                    addHeaderFirst = true;
-                                }
-                            }
-                            // ListMode needs to use display block to proprerly measure items in vertical mode, and display flex to properly measure items in horizontal mode
-                            itemsContainer.style.cssText +=
-                                    ";display: " + (that._inListMode ? ((that._horizontal ? "flex" : "block") + "; overflow: hidden") : "inline-block") +
-                                     ";vertical-align:top" +
-                                    ";-ms-grid-column: " + itemsContainerColumn +
-                                    ";-ms-grid-row: " + itemsContainerRow;
-                            if (!that._inListMode) {
-                                elements.container.style.display = "inline-block";
-                            }
-                            if (that._groupsEnabled) {
-                                elements.headerContainer.style.cssText +=
-                                    ";display: inline-block" +
-                                    ";-ms-grid-column: " + headerContainerColumn +
-                                    ";-ms-grid-row: " + headerContainerRow;
-                                _ElementUtilities.addClass(elements.headerContainer, _Constants._laidOutClass + " " + _Constants._groupLeaderClass);
-                                if ((that._groupHeaderPosition === HeaderPosition.top && that._horizontal) ||
-                                    (that._groupHeaderPosition === HeaderPosition.left && !that._horizontal)) {
-                                    _ElementUtilities.addClass(itemsContainer, _Constants._groupLeaderClass);
-                                }
-                            }
-                            if (addHeaderFirst) {
-                                surface.appendChild(elements.headerContainer);
-                            }
-
-                            itemsContainer.appendChild(elements.container);
-                            itemsContainer.appendChild(emptyContainer);
-
-                            surface.appendChild(itemsContainer);
-                            if (!addHeaderFirst && that._groupsEnabled) {
-                                surface.appendChild(elements.headerContainer);
-                            }
-                            site.viewport.insertBefore(surface, site.viewport.firstChild);
-
-                            var measurements = readMeasurementsFromDOM();
-
-                            if (!measurements) {
-                                // While reading from the DOM, the measuring operation was invalidated. Bail out.
-                                cleanUp();
-                                return Promise.cancel;
-                            } else if ((that._horizontal && measurements.viewportContentHeight === 0) || (!that._horizontal && measurements.viewportContentWidth === 0)) {
-                                // ListView is invisible so we can't measure. Return a canceled promise.
-                                cleanUp();
-                                return Promise.cancel;
-                            } else if (!secondTry && !that._isCellSpanning(groupIndex) &&
-                                    (measurements.containerContentWidth === 0 || measurements.containerContentHeight === 0)) {
-                                // win-container has no size. For backwards compatibility, wait for the item promise and then try measuring again.
-                                cleanUp();
-                                return itemPromise.then(function () {
-                                    return measureItemImpl(index, itemPromise);
-                                });
-                            } else {
-                                var sizes = that._sizes = measurements.sizes;
-
-                                // Wrappers for orientation-specific properties.
-                                // Sizes prefaced with "cross" refer to the sizes orthogonal to the current layout orientation. Sizes without a preface are in the orientation's direction.
-                                Object.defineProperties(sizes, {
-                                    surfaceOuterCrossSize: {
-                                        get: function () {
-                                            return (that._horizontal ? sizes.surfaceOuterHeight : sizes.surfaceOuterWidth);
-                                        },
-                                        enumerable: true
-                                    },
-                                    layoutOrigin: {
-                                        get: function () {
-                                            return (that._horizontal ? sizes.layoutOriginX : sizes.layoutOriginY);
-                                        },
-                                        enumerable: true
-                                    },
-                                    itemsContainerOuterSize: {
-                                        get: function () {
-                                            return (that._horizontal ? sizes.itemsContainerOuterWidth : sizes.itemsContainerOuterHeight);
-                                        },
-                                        enumerable: true
-                                    },
-                                    itemsContainerOuterCrossSize: {
-                                        get: function () {
-                                            return (that._horizontal ? sizes.itemsContainerOuterHeight : sizes.itemsContainerOuterWidth);
-                                        },
-                                        enumerable: true
-                                    },
-                                    itemsContainerOuterStart: {
-                                        get: function () {
-                                            return (that._horizontal ? sizes.itemsContainerOuterX : sizes.itemsContainerOuterY);
-                                        },
-                                        enumerable: true
-                                    },
-                                    itemsContainerOuterCrossStart: {
-                                        get: function () {
-                                            return (that._horizontal ? sizes.itemsContainerOuterY : sizes.itemsContainerOuterX);
-                                        },
-                                        enumerable: true
-                                    },
-                                    containerCrossSize: {
-                                        get: function () {
-                                            return (that._horizontal ? sizes.containerHeight : sizes.containerWidth);
-                                        },
-                                        enumerable: true
-                                    },
-                                    containerSize: {
-                                        get: function () {
-                                            return (that._horizontal ? sizes.containerWidth : sizes.containerHeight);
-                                        },
-                                        enumerable: true
-                                    },
-                                });
-
-                                // If the measured group is uniform, measure the container height
-                                // and width now. Otherwise, compute them thru itemInfo on demand (via _ensureContainerSize).
-                                if (!that._isCellSpanning(groupIndex)) {
-                                    if (that._inListMode) {
-                                        var itemsContainerContentSize = measurements.viewportCrossSize - sizes.surfaceOuterCrossSize - that._getHeaderSizeContentAdjustment() - sizes.itemsContainerOuterCrossSize;
-                                        if (that._horizontal) {
-                                            sizes.containerHeight = itemsContainerContentSize;
-                                            sizes.containerWidth = measurements.containerWidth;
-                                        } else {
-                                            sizes.containerHeight = measurements.containerHeight;
-                                            sizes.containerWidth = itemsContainerContentSize;
-                                        }
-                                    } else {
-                                        sizes.containerWidth = measurements.containerWidth;
-                                        sizes.containerHeight = measurements.containerHeight;
-                                    }
-                                    sizes.containerSizeLoaded = true;
-                                }
-
-                                that._createContainerStyleRule();
-                                that._viewportSizeChanged(measurements.viewportCrossSize);
-
-                                cleanUp();
-                            }
-                        });
-                    }
-
-                    if (!measuringPromise) {
-                        site._writeProfilerMark(perfId + ",StartTM");
-                        // Use a signal to guarantee that measuringPromise is set before the promise
-                        // handler is executed (measuringPromise is referenced within measureItemImpl).
-                        var promiseStoredSignal = new _Signal();
-                        that._measuringPromise = measuringPromise = promiseStoredSignal.promise.then(function () {
-                            if (that._ensureEnvInfo()) {
-                                return measureItemImpl(index);
-                            } else {
-                                // Couldn't get envInfo. ListView is invisible. Bail out.
-                                return Promise.cancel;
-                            }
-                        }).then(function () {
-                            site._writeProfilerMark(perfId + ":complete,info");
-                            site._writeProfilerMark(perfId + ",StopTM");
-                        }, function (error) {
-                            // The purpose of the measuring promise is so that we only
-                            // measure once. If measuring fails, clear the promise because
-                            // we still need to measure.
-                            that._measuringPromise = null;
-
-                            site._writeProfilerMark(perfId + ":canceled,info");
-                            site._writeProfilerMark(perfId + ",StopTM");
-
-                            return Promise.wrapError(error);
-                        });
-                        promiseStoredSignal.complete();
-                    }
-                    return measuringPromise;
-                },
-
-                _getHeaderSizeGroupAdjustment: function () {
-                    if (this._groupsEnabled) {
-                        if (this._horizontal && this._groupHeaderPosition === HeaderPosition.left) {
-                            return this._sizes.headerContainerWidth;
-                        } else if (!this._horizontal && this._groupHeaderPosition === HeaderPosition.top) {
-                            return this._sizes.headerContainerHeight;
-                        }
-                    }
-
-                    return 0;
-                },
-                _getHeaderSizeContentAdjustment: function () {
-                    if (this._groupsEnabled) {
-                        if (this._horizontal && this._groupHeaderPosition === HeaderPosition.top) {
-                            return this._sizes.headerContainerHeight;
-                        } else if (!this._horizontal && this._groupHeaderPosition === HeaderPosition.left) {
-                            return this._sizes.headerContainerWidth;
-                        }
-                    }
-
-                    return 0;
-                },
-
-                // Horizontal layouts lay items out top to bottom, left to right, whereas vertical layouts lay items out left to right, top to bottom.
-                // The viewport size is the size layouts use to determine how many items can be placed in one bar, so it should be cross to the
-                // orientation.
-                _getViewportCrossSize: function () {
-                    return this._site.viewportSize[this._horizontal ? "height" : "width"];
-                },
-
-                // viewportContentSize is the new viewport size
-                _viewportSizeChanged: function _LayoutCommon_viewportSizeChanged(viewportContentSize) {
-                    var sizes = this._sizes;
-
-                    sizes.viewportContentSize = viewportContentSize;
-                    sizes.surfaceContentSize = viewportContentSize - sizes.surfaceOuterCrossSize;
-                    sizes.maxItemsContainerContentSize = sizes.surfaceContentSize - sizes.itemsContainerOuterCrossSize - this._getHeaderSizeContentAdjustment();
-
-                    // This calculation is for uniform layouts
-                    if (sizes.containerSizeLoaded && !this._inListMode) {
-                        this._itemsPerBar = Math.floor(sizes.maxItemsContainerContentSize / sizes.containerCrossSize);
-                        if (this.maximumRowsOrColumns) {
-                            this._itemsPerBar = Math.min(this._itemsPerBar, this.maximumRowsOrColumns);
-                        }
-                        this._itemsPerBar = Math.max(1, this._itemsPerBar);
-                    } else {
-                        if (this._inListMode) {
-                            sizes[this._horizontal ? "containerHeight" : "containerWidth"] = sizes.maxItemsContainerContentSize;
-                        }
-                        this._itemsPerBar = 1;
-                    }
-
-                    // Ignore animations if height changed
-                    this._resetAnimationCaches();
-                },
-
-                _createContainerStyleRule: function _LayoutCommon_createContainerStyleRule() {
-                    // Adding CSS rules is expensive. Add a rule to provide a
-                    // height and width for containers if the app hasn't provided one.
-                    var sizes = this._sizes;
-                    if (!this._containerSizeClassName && sizes.containerSizeLoaded && (sizes.emptyContainerContentHeight === 0 || sizes.emptyContainerContentWidth === 0)) {
-                        var width = sizes.containerWidth - sizes.containerOuterWidth + "px",
-                            height = sizes.containerHeight - sizes.containerOuterHeight + "px";
-                        if (this._inListMode) {
-                            if (this._horizontal) {
-                                height = "calc(100% - " + (sizes.containerMargins.top + sizes.containerMargins.bottom) + "px)";
-                            } else {
-                                width = "auto";
-                            }
-                        }
-
-                        if (!this._containerSizeClassName) {
-                            this._containerSizeClassName = uniqueCssClassName("containersize");
-                            _ElementUtilities.addClass(this._site.surface, this._containerSizeClassName);
-                        }
-                        var ruleSelector = "." + _Constants._containerClass,
-                            ruleBody = "width:" + width + ";height:" + height + ";";
-                        addDynamicCssRule(this._containerSizeClassName, this._site, ruleSelector, ruleBody);
-                    }
-                },
-
-                // Computes container width and height if they haven't been computed yet. This
-                // should happen when the first uniform group is created.
-                _ensureContainerSize: function _LayoutCommon_ensureContainerSize(group) {
-                    var sizes = this._sizes;
-                    if (!sizes.containerSizeLoaded && !this._ensuringContainerSize) {
-                        var promise;
-                        if ((!this._itemInfo || typeof this._itemInfo !== "function") && this._useDefaultItemInfo) {
-                            var margins = sizes.containerMargins;
-                            promise = Promise.wrap({
-                                width: group.groupInfo.cellWidth - margins.left - margins.right,
-                                height: group.groupInfo.cellHeight - margins.top - margins.bottom
-                            });
-
-                        } else {
-                            promise = this._getItemInfo();
-                        }
-
-                        var that = this;
-                        this._ensuringContainerSize = promise.then(function (itemSize) {
-                            sizes.containerSizeLoaded = true;
-                            sizes.containerWidth = itemSize.width + sizes.itemBoxOuterWidth + sizes.containerOuterWidth;
-                            sizes.containerHeight = itemSize.height + sizes.itemBoxOuterHeight + sizes.containerOuterHeight;
-                            if (!that._inListMode) {
-                                that._itemsPerBar = Math.floor(sizes.maxItemsContainerContentSize / sizes.containerCrossSize);
-                                if (that.maximumRowsOrColumns) {
-                                    that._itemsPerBar = Math.min(that._itemsPerBar, that.maximumRowsOrColumns);
-                                }
-                                that._itemsPerBar = Math.max(1, that._itemsPerBar);
-                            } else {
-                                that._itemsPerBar = 1;
-                            }
-                            that._createContainerStyleRule();
-                        });
-
-                        promise.done(
-                            function () {
-                                that._ensuringContainerSize = null;
-                            },
-                            function () {
-                                that._ensuringContainerSize = null;
-                            }
-                        );
-
-                        return promise;
-                    } else {
-                        return this._ensuringContainerSize ? this._ensuringContainerSize : Promise.wrap();
-                    }
-                },
-
-                _indexToCoordinate: function _LayoutCommon_indexToCoordinate(index, itemsPerBar) {
-                    itemsPerBar = itemsPerBar || this._itemsPerBar;
-                    var bar = Math.floor(index / itemsPerBar);
-                    if (this._horizontal) {
-                        return {
-                            column: bar,
-                            row: index - bar * itemsPerBar
-                        };
-                    } else {
-                        return {
-                            row: bar,
-                            column: index - bar * itemsPerBar
-                        };
-                    }
-                },
-
-                // Empty ranges are represented by null. Non-empty ranges are represented by
-                // an object with 2 properties: firstIndex and lastIndex.
-                _rangeForGroup: function _LayoutCommon_rangeForGroup(group, range) {
-                    var first = group.startIndex,
-                        last = first + group.count - 1;
-
-                    if (!range || range.firstIndex > last || range.lastIndex < first) {
-                        // There isn't any overlap between range and the group's indices
-                        return null;
-                    } else {
-                        return {
-                            firstIndex: Math.max(0, range.firstIndex - first),
-                            lastIndex: Math.min(group.count - 1, range.lastIndex - first)
-                        };
-                    }
-                },
-
-                _syncDomWithGroupHeaderPosition: function _LayoutCommon_syncDomWithGroupHeaderPosition(tree) {
-                    if (this._groupsEnabled && this._oldGroupHeaderPosition !== this._groupHeaderPosition) {
-                        // this._oldGroupHeaderPosition may refer to top, left, or null. It will be null
-                        // the first time this function is called which means that no styles have to be
-                        // removed.
-
-                        var len = tree.length,
-                            i;
-                        // Remove styles associated with old group header position
-                        if (this._oldGroupHeaderPosition === HeaderPosition.top) {
-                            _ElementUtilities.removeClass(this._site.surface, _Constants._headerPositionTopClass);
-                            // maxWidth must be cleared because it is used with headers in the top position but not the left position.
-                            // The _groupLeaderClass must be removed from the itemsContainer element because the associated styles
-                            // should only be applied to it when headers are in the top position.
-                            if (this._horizontal) {
-                                for (i = 0; i < len; i++) {
-                                    tree[i].header.style.maxWidth = "";
-                                    _ElementUtilities.removeClass(tree[i].itemsContainer.element, _Constants._groupLeaderClass);
-                                }
-                            } else {
-                                this._site.surface.style.msGridRows = "";
-                            }
-                        } else if (this._oldGroupHeaderPosition === HeaderPosition.left) {
-                            _ElementUtilities.removeClass(this._site.surface, _Constants._headerPositionLeftClass);
-                            // msGridColumns is cleared for a similar reason as maxWidth
-                            if (!this._horizontal) {
-                                for (i = 0; i < len; i++) {
-                                    tree[i].header.style.maxHeight = "";
-                                    _ElementUtilities.removeClass(tree[i].itemsContainer.element, _Constants._groupLeaderClass);
-                                }
-                            }
-                            this._site.surface.style.msGridColumns = "";
-                        }
-
-                        // Add styles associated with new group header position
-                        if (this._groupHeaderPosition === HeaderPosition.top) {
-                            _ElementUtilities.addClass(this._site.surface, _Constants._headerPositionTopClass);
-                            if (this._horizontal) {
-                                for (i = 0; i < len; i++) {
-                                    _ElementUtilities.addClass(tree[i].itemsContainer.element, _Constants._groupLeaderClass);
-                                }
-                            }
-                        } else {
-                            _ElementUtilities.addClass(this._site.surface, _Constants._headerPositionLeftClass);
-                            if (!this._horizontal) {
-                                for (i = 0; i < len; i++) {
-                                    _ElementUtilities.addClass(tree[i].itemsContainer.element, _Constants._groupLeaderClass);
-                                }
-                            }
-                        }
-
-                        this._oldGroupHeaderPosition = this._groupHeaderPosition;
-                    }
-                },
-
-                _layoutGroup: function _LayoutCommon_layoutGroup(index) {
-                    var group = this._groups[index],
-                        groupBundle = this._site.tree[index],
-                        headerContainer = groupBundle.header,
-                        itemsContainer = groupBundle.itemsContainer.element,
-                        sizes = this._sizes,
-                        groupCrossSize = group.getItemsContainerCrossSize();
-
-                    if (this._groupsEnabled) {
-                        if (this._horizontal) {
-                            if (this._groupHeaderPosition === HeaderPosition.top) {
-                                // Horizontal with headers above
-                                //
-                                var headerContainerMinContentWidth = sizes.headerContainerMinWidth - sizes.headerContainerOuterWidth,
-                                    itemsContainerContentWidth = group.getItemsContainerSize() - sizes.headerContainerOuterWidth;
-                                headerContainer.style.maxWidth = Math.max(headerContainerMinContentWidth, itemsContainerContentWidth) + "px";
-                                if (this._envInfo.supportsCSSGrid) {
-                                    headerContainer.style.msGridColumn = index + 1;
-                                    itemsContainer.style.msGridColumn = index + 1;
-                                } else {
-                                    headerContainer.style.height = (sizes.headerContainerHeight - sizes.headerContainerOuterHeight) + "px";
-                                    itemsContainer.style.height = (groupCrossSize - sizes.itemsContainerOuterHeight) + "px";
-                                    // If the itemsContainer is too small, the next group's header runs the risk of appearing below the current group's items.
-                                    // We need to add a margin to the bottom of the itemsContainer to prevent that from happening.
-                                    itemsContainer.style.marginBottom = sizes.itemsContainerMargins.bottom + (sizes.maxItemsContainerContentSize - groupCrossSize + sizes.itemsContainerOuterHeight) + "px";
-                                }
-                                // itemsContainers only get the _groupLeaderClass when header position is top.
-                                _ElementUtilities.addClass(itemsContainer, _Constants._groupLeaderClass);
-                            } else {
-                                // Horizontal with headers on the left
-                                //
-                                if (this._envInfo.supportsCSSGrid) {
-                                    headerContainer.style.msGridColumn = index * 2 + 1;
-                                    itemsContainer.style.msGridColumn = index * 2 + 2;
-                                } else {
-                                    headerContainer.style.width = sizes.headerContainerWidth - sizes.headerContainerOuterWidth + "px";
-                                    headerContainer.style.height = (groupCrossSize - sizes.headerContainerOuterHeight) + "px";
-                                    itemsContainer.style.height = (groupCrossSize - sizes.itemsContainerOuterHeight) + "px";
-                                }
-                            }
-                        } else {
-                            if (this._groupHeaderPosition === HeaderPosition.left) {
-                                // Vertical with headers on the left
-                                //
-                                var headerContainerMinContentHeight = sizes.headerContainerMinHeight - sizes.headerContainerOuterHeight,
-                                    itemsContainerContentHeight = group.getItemsContainerSize() - sizes.headerContainerOuterHeight;
-                                headerContainer.style.maxHeight = Math.max(headerContainerMinContentHeight, itemsContainerContentHeight) + "px";
-                                if (this._envInfo.supportsCSSGrid) {
-                                    headerContainer.style.msGridRow = index + 1;
-                                    itemsContainer.style.msGridRow = index + 1;
-                                } else {
-                                    headerContainer.style.width = (sizes.headerContainerWidth - sizes.headerContainerOuterWidth) + "px";
-                                    itemsContainer.style.width = (groupCrossSize - sizes.itemsContainerOuterWidth) + "px";
-                                    // If the itemsContainer is too small, the next group's header runs the risk of appearing to the side of the current group's items.
-                                    // We need to add a margin to the right of the itemsContainer to prevent that from happening (or the left margin, in RTL).
-                                    itemsContainer.style["margin" + (this._site.rtl ? "Left" : "Right")] = (sizes.itemsContainerMargins[(this._site.rtl ? "left" : "right")] +
-                                        (sizes.maxItemsContainerContentSize - groupCrossSize + sizes.itemsContainerOuterWidth)) + "px";
-                                }
-                                // itemsContainers only get the _groupLeaderClass when header position is left.
-                                _ElementUtilities.addClass(itemsContainer, _Constants._groupLeaderClass);
-                            } else {
-                                // Vertical with headers above
-                                //
-                                headerContainer.style.msGridRow = index * 2 + 1;
-                                // It's important to explicitly set the container height in vertical list mode with headers above, since we use flow layout.
-                                // When the header's content is taken from the DOM, the headerContainer will shrink unless it has a height set.
-                                if (this._inListMode) {
-                                    headerContainer.style.height = (sizes.headerContainerHeight - sizes.headerContainerOuterHeight) + "px";
-                                } else {
-                                    if (this._envInfo.supportsCSSGrid) {
-                                        itemsContainer.style.msGridRow = index * 2 + 2;
-                                    } else {
-                                        headerContainer.style.height = sizes.headerContainerHeight - sizes.headerContainerOuterHeight + "px";
-                                        headerContainer.style.width = (groupCrossSize - sizes.headerContainerOuterWidth) + "px";
-                                        itemsContainer.style.width = (groupCrossSize - sizes.itemsContainerOuterWidth) + "px";
-                                    }
-                                }
-                            }
-
-                        }
-                        // Header containers always get the _groupLeaderClass.
-                        _ElementUtilities.addClass(headerContainer, _Constants._laidOutClass + " " + _Constants._groupLeaderClass);
-                    }
-                    _ElementUtilities.addClass(itemsContainer, _Constants._laidOutClass);
-                }
-            }, {
-                // The maximum number of rows or columns of win-containers to put into each items block.
-                // A row/column cannot be split across multiple items blocks. win-containers
-                // are grouped into items blocks in order to mitigate the costs of the platform doing
-                // a layout in response to insertions and removals of win-containers.
-                _barsPerItemsBlock: 4
-            });
-        }),
-
-        //
-        // Layouts
-        //
-
-        _LegacyLayout: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(exports._LayoutCommon, null, {
-                /// <field type="Boolean" locid="WinJS.UI._LegacyLayout.disableBackdrop" helpKeyword="WinJS.UI._LegacyLayout.disableBackdrop">
-                /// Gets or sets a value that indicates whether the layout should disable the backdrop feature
-                /// which avoids blank areas while panning in a virtualized list.
-                /// <deprecated type="deprecate">
-                /// disableBackdrop is deprecated. Style: .win-listview .win-container.win-backdrop { background-color:transparent; } instead.
-                /// </deprecated>
-                /// </field>
-                disableBackdrop: {
-                    get: function _LegacyLayout_disableBackdrop_get() {
-                        return this._backdropDisabled || false;
-                    },
-                    set: function _LegacyLayout_disableBackdrop_set(value) {
-                        _ElementUtilities._deprecated(_ErrorMessages.disableBackdropIsDeprecated);
-                        value = !!value;
-                        if (this._backdropDisabled !== value) {
-                            this._backdropDisabled = value;
-                            if (this._disableBackdropClassName) {
-                                deleteDynamicCssRule(this._disableBackdropClassName);
-                                this._site && _ElementUtilities.removeClass(this._site.surface, this._disableBackdropClassName);
-                                this._disableBackdropClassName = null;
-                            }
-                            this._disableBackdropClassName = uniqueCssClassName("disablebackdrop");
-                            this._site && _ElementUtilities.addClass(this._site.surface, this._disableBackdropClassName);
-                            if (value) {
-                                var ruleSelector = ".win-container.win-backdrop",
-                                    ruleBody = "background-color:transparent;";
-                                addDynamicCssRule(this._disableBackdropClassName, this._site, ruleSelector, ruleBody);
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI._LegacyLayout.backdropColor" helpKeyword="WinJS.UI._LegacyLayout.backdropColor">
-                /// Gets or sets the fill color for the default pattern used for the backdrops.
-                /// The default value is "rgba(155,155,155,0.23)".
-                /// <deprecated type="deprecate">
-                /// backdropColor is deprecated. Style: .win-listview .win-container.win-backdrop { rgba(155,155,155,0.23); } instead.
-                /// </deprecated>
-                /// </field>
-                backdropColor: {
-                    get: function _LegacyLayout_backdropColor_get() {
-                        return this._backdropColor || "rgba(155,155,155,0.23)";
-                    },
-                    set: function _LegacyLayout_backdropColor_set(value) {
-                        _ElementUtilities._deprecated(_ErrorMessages.backdropColorIsDeprecated);
-                        if (value && this._backdropColor !== value) {
-                            this._backdropColor = value;
-                            if (this._backdropColorClassName) {
-                                deleteDynamicCssRule(this._backdropColorClassName);
-                                this._site && _ElementUtilities.removeClass(this._site.surface, this._backdropColorClassName);
-                                this._backdropColorClassName = null;
-                            }
-                            this._backdropColorClassName = uniqueCssClassName("backdropcolor");
-                            this._site && _ElementUtilities.addClass(this._site.surface, this._backdropColorClassName);
-                            var ruleSelector = ".win-container.win-backdrop",
-                                ruleBody = "background-color:" + value + ";";
-                            addDynamicCssRule(this._backdropColorClassName, this._site, ruleSelector, ruleBody);
-                        }
-                    }
-                }
-            });
-        }),
-
-        GridLayout: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(exports._LegacyLayout, function (options) {
-                /// <signature helpKeyword="WinJS.UI.GridLayout">
-                /// <summary locid="WinJS.UI.GridLayout">
-                /// Creates a new GridLayout.
-                /// </summary>
-                /// <param name="options" type="Object" locid="WinJS.UI.GridLayout_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control. Each property of the options
-                /// object corresponds to one of the control's properties or events.
-                /// </param>
-                /// <returns type="WinJS.UI.GridLayout" locid="WinJS.UI.GridLayout_returnValue">
-                /// The new GridLayout.
-                /// </returns>
-                /// </signature>
-                options = options || {};
-                // Executing setters to display compatibility warning
-                this.itemInfo = options.itemInfo;
-                this.groupInfo = options.groupInfo;
-                this._maxRowsOrColumns = 0;
-                this._useDefaultItemInfo = true;
-                this._elementsToMeasure = {};
-                this._groupHeaderPosition = options.groupHeaderPosition || HeaderPosition.top;
-                this.orientation = options.orientation || "horizontal";
-
-                if (options.maxRows) {
-                    this.maxRows = +options.maxRows;
-                }
-                if (options.maximumRowsOrColumns) {
-                    this.maximumRowsOrColumns = +options.maximumRowsOrColumns;
-                }
-            }, {
-
-                // Public
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.GridLayout.maximumRowsOrColumns" helpKeyword="WinJS.UI.GridLayout.maximumRowsOrColumns">
-                /// Gets the maximum number of rows or columns, depending on the orientation, that should present before it introduces wrapping to the layout.
-                /// A value of 0 indicates that there is no maximum. The default value is 0.
-                /// </field>
-                maximumRowsOrColumns: {
-                    get: function () {
-                        return this._maxRowsOrColumns;
-                    },
-                    set: function (value) {
-                        this._setMaxRowsOrColumns(value);
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.GridLayout.maxRows" helpKeyword="WinJS.UI.GridLayout.maxRows">
-                /// Gets or sets the maximum number of rows displayed by the ListView.
-                /// <deprecated type="deprecate">
-                /// WinJS.UI.GridLayout.maxRows may be altered or unavailable after the Windows Library for JavaScript 2.0. Instead, use the maximumRowsOrColumns property.
-                /// </deprecated>
-                /// </field>
-                maxRows: {
-                    get: function () {
-                        return this.maximumRowsOrColumns;
-                    },
-                    set: function (maxRows) {
-                        _ElementUtilities._deprecated(_ErrorMessages.maxRowsIsDeprecated);
-                        this.maximumRowsOrColumns = maxRows;
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.GridLayout.itemInfo" helpKeyword="WinJS.UI.GridLayout.itemInfo">
-                /// Determines the size of the item and whether
-                /// the item should be placed in a new column.
-                /// <deprecated type="deprecate">
-                /// GridLayout.itemInfo may be altered or unavailable in future versions. Instead, use CellSpanningLayout.
-                /// </deprecated>
-                /// </field>
-                itemInfo: {
-                    enumerable: true,
-                    get: function () {
-                        return this._itemInfo;
-                    },
-                    set: function (itemInfo) {
-                        itemInfo && _ElementUtilities._deprecated(_ErrorMessages.itemInfoIsDeprecated);
-                        this._itemInfo = itemInfo;
-                        this._invalidateLayout();
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.GridLayout.groupInfo" helpKeyword="WinJS.UI.GridLayout.groupInfo">
-                /// Indicates whether a group has cell spanning items and specifies the dimensions of the cell.
-                /// <deprecated type="deprecate">
-                /// GridLayout.groupInfo may be altered or unavailable in future versions. Instead, use CellSpanningLayout.
-                /// </deprecated>
-                /// </field>
-                groupInfo: {
-                    enumerable: true,
-                    get: function () {
-                        return this._groupInfo;
-                    },
-                    set: function (groupInfo) {
-                        groupInfo && _ElementUtilities._deprecated(_ErrorMessages.groupInfoIsDeprecated);
-                        this._groupInfo = groupInfo;
-                        this._invalidateLayout();
-                    }
-                }
-            });
-        })
-    });
-
-    var Groups = _Base.Namespace.defineWithParent(null, null, {
-
-        UniformGroupBase: _Base.Namespace._lazy(function () {
-            return _Base.Class.define(null, {
-                cleanUp: function UniformGroupBase_cleanUp() {
-                },
-
-                itemFromOffset: function UniformGroupBase_itemFromOffset(offset, options) {
-                    // supported options are:
-                    // - wholeItem: when set to true the fully visible item is returned
-                    // - last: if 1 the last item is returned. if 0 the first
-                    options = options || {};
-
-                    var sizes = this._layout._sizes;
-
-                    // Make offset relative to the items container's content box
-                    offset -= sizes.itemsContainerOuterStart;
-
-                    if (options.wholeItem) {
-                        offset += (options.last ? -1 : 1) * (sizes.containerSize - 1);
-                    }
-                    var lastIndexOfGroup = this.count - 1,
-                        lastBar = Math.floor(lastIndexOfGroup / this._layout._itemsPerBar),
-                        bar = clampToRange(0, lastBar, Math.floor(offset / sizes.containerSize)),
-                        index = (bar + options.last) * this._layout._itemsPerBar - options.last;
-                    return clampToRange(0, this.count - 1, index);
-                },
-
-                hitTest: function UniformGroupBase_hitTest(x, y) {
-                    var horizontal = this._layout._horizontal,
-                        itemsPerBar = this._layout._itemsPerBar,
-                        useListSemantics = this._layout._inListMode || itemsPerBar === 1,
-                        directionalLocation = horizontal ? x : y,
-                        crossLocation = horizontal ? y : x,
-                        sizes = this._layout._sizes;
-
-                    directionalLocation -= sizes.itemsContainerOuterStart;
-                    crossLocation -= sizes.itemsContainerOuterCrossStart;
-
-                    var bar = Math.floor(directionalLocation / sizes.containerSize);
-                    var slotInBar = clampToRange(0, itemsPerBar - 1, Math.floor(crossLocation / sizes.containerCrossSize));
-                    var index = Math.max(-1, bar * itemsPerBar + slotInBar);
-
-                    // insertAfterIndex is determined by which half of the target element the mouse cursor is currently in.
-                    // The trouble is that we can cut the element in half horizontally or cut it in half vertically.
-                    // Which one we choose depends on the order that elements are laid out in the grid.
-                    // A horizontal grid with multiple rows per column will lay items out starting from top to bottom, and move left to right.
-                    // A vertical list is just a horizontal grid with an infinite number of rows per column, so it follows the same order.
-                    // In both of these cases, each item is cut in half horizontally, since for any item n, n-1 should be above it and n+1 below (ignoring column changes).
-                    // A vertical grid lays items out left to right, top to bottom, and a horizontal list left to right (with infinite items per row).
-                    // In this case for item n, n-1 is on the left and n+1 on the right, so we cut the item in half vertically.
-                    var insertAfterSlot;
-                    if ((!horizontal && useListSemantics) ||
-                        (horizontal && !useListSemantics)) {
-                        insertAfterSlot = (y - sizes.containerHeight / 2) / sizes.containerHeight;
-                    } else {
-                        insertAfterSlot = (x - sizes.containerWidth / 2) / sizes.containerWidth;
-                    }
-                    if (useListSemantics) {
-                        insertAfterSlot = Math.floor(insertAfterSlot);
-                        return {
-                            index: index,
-                            insertAfterIndex: (insertAfterSlot >= 0 && index >= 0 ? insertAfterSlot : -1)
-                        };
-                    }
-                    insertAfterSlot = clampToRange(-1, itemsPerBar - 1, insertAfterSlot);
-                    var insertAfterIndex;
-                    if (insertAfterSlot < 0) {
-                        insertAfterIndex = bar * itemsPerBar - 1;
-                    } else {
-                        insertAfterIndex = bar * itemsPerBar + Math.floor(insertAfterSlot);
-                    }
-
-                    return {
-                        index: clampToRange(-1, this.count - 1, index),
-                        insertAfterIndex: clampToRange(-1, this.count - 1, insertAfterIndex)
-                    };
-                },
-
-                getAdjacent: function UniformGroupBase_getAdjacent(currentItem, pressedKey) {
-                    var index = currentItem.index,
-                        currentBar = Math.floor(index / this._layout._itemsPerBar),
-                        currentSlot = index % this._layout._itemsPerBar,
-                        newFocus;
-
-                    switch (pressedKey) {
-                        case Key.upArrow:
-                            newFocus = (currentSlot === 0 ? "boundary" : index - 1);
-                            break;
-                        case Key.downArrow:
-                            var isLastIndexOfGroup = (index === this.count - 1),
-                                inLastSlot = (this._layout._itemsPerBar > 1 && currentSlot === this._layout._itemsPerBar - 1);
-                            newFocus = (isLastIndexOfGroup || inLastSlot ? "boundary" : index + 1);
-                            break;
-                        case Key.leftArrow:
-                            newFocus = (currentBar === 0 && this._layout._itemsPerBar > 1 ? "boundary" : index - this._layout._itemsPerBar);
-                            break;
-                        case Key.rightArrow:
-                            var lastIndexOfGroup = this.count - 1,
-                                lastBar = Math.floor(lastIndexOfGroup / this._layout._itemsPerBar);
-                            newFocus = (currentBar === lastBar ? "boundary" : Math.min(index + this._layout._itemsPerBar, this.count - 1));
-                            break;
-                    }
-                    return (newFocus === "boundary" ? newFocus : { type: _UI.ObjectType.item, index: newFocus });
-                },
-
-                getItemsContainerSize: function UniformGroupBase_getItemsContainerSize() {
-                    var sizes = this._layout._sizes,
-                        barCount = Math.ceil(this.count / this._layout._itemsPerBar);
-                    return barCount * sizes.containerSize + sizes.itemsContainerOuterSize;
-                },
-
-                getItemsContainerCrossSize: function UniformGroupBase_getItemsContainerCrossSize() {
-                    var sizes = this._layout._sizes;
-                    return this._layout._itemsPerBar * sizes.containerCrossSize + sizes.itemsContainerOuterCrossSize;
-                },
-
-                getItemPositionForAnimations: function UniformGroupBase_getItemPositionForAnimations(itemIndex) {
-                    // Top/Left are used to know if the item has moved and also used to position the item if removed.
-                    // Row/Column are used to know if a reflow animation should occur
-                    // Height/Width are used when positioning a removed item without impacting layout.
-                    // The returned rectangle refers to the win-container's border/padding/content box. Coordinates
-                    // are relative to group's items container.
-
-                    var sizes = this._layout._sizes;
-                    var leftStr = this._layout._site.rtl ? "right" : "left";
-                    var containerMargins = this._layout._sizes.containerMargins;
-                    var coordinates = this._layout._indexToCoordinate(itemIndex);
-                    var itemPosition = {
-                        row: coordinates.row,
-                        column: coordinates.column,
-                        top: containerMargins.top + coordinates.row * sizes.containerHeight,
-                        left: containerMargins[leftStr] + coordinates.column * sizes.containerWidth,
-                        height: sizes.containerHeight - sizes.containerMargins.top - sizes.containerMargins.bottom,
-                        width: sizes.containerWidth - sizes.containerMargins.left - sizes.containerMargins.right
-                    };
-                    return itemPosition;
-                }
-            });
-        }),
-
-        //
-        // Groups for GridLayout
-        //
-        // Each group implements a 3 function layout interface. The interface is used
-        // whenever GridLayout has to do a layout. The interface consists of:
-        // - prepareLayout/prepareLayoutWithCopyOfTree: Called 1st. Group should update all of its internal
-        //   layout state. It should not modify the DOM. Group should implement either prepareLayout or
-        //   prepareLayoutWithCopyOfTree. The former is preferable because the latter is expensive as calling
-        //   it requires copying the group's tree. Implementing prepareLayoutWithCopyOfTree is necessary when
-        //   the group is manually laying out items and is laying out unrealized items asynchronously
-        //   (e.g. CellSpanningGroup). This requires a copy of the tree from the previous layout pass.
-        // - layoutRealizedRange: Called 2nd. Group should update the DOM so that
-        //   the realized range reflects the internal layout state computed during
-        //   prepareLayout.
-        // - layoutUnrealizedRange: Called 3rd. Group should update the DOM for the items
-        //   outside of the realized range. This function returns a promise so
-        //   it can do its work asynchronously. When the promise completes, layout will
-        //   be done.
-        //
-        // The motivation for this interface is perceived performance. If groups had just 1
-        // layout function, all items would have to be laid out before any animations could
-        // begin. With this interface, animations can begin playing after
-        // layoutRealizedRange is called.
-        //
-        // Each group also implements a cleanUp function which is called when the group is
-        // no longer needed so that it can clean up the DOM and its resources. After cleanUp
-        // is called, the group object cannnot be reused.
-        //
-
-        UniformGroup: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(Groups.UniformGroupBase, function UniformGroup_ctor(layout, itemsContainer) {
-                this._layout = layout;
-                this._itemsContainer = itemsContainer;
-                _ElementUtilities.addClass(this._itemsContainer, layout._inListMode ? _Constants._uniformListLayoutClass : _Constants._uniformGridLayoutClass);
-            }, {
-                cleanUp: function UniformGroup_cleanUp(skipDomCleanUp) {
-                    if (!skipDomCleanUp) {
-                        _ElementUtilities.removeClass(this._itemsContainer, _Constants._uniformGridLayoutClass);
-                        _ElementUtilities.removeClass(this._itemsContainer, _Constants._uniformListLayoutClass);
-                        this._itemsContainer.style.height = this._itemsContainer.style.width = "";
-                    }
-                    this._itemsContainer = null;
-                    this._layout = null;
-                    this.groupInfo = null;
-                    this.startIndex = null;
-                    this.offset = null;
-                    this.count = null;
-                },
-
-                prepareLayout: function UniformGroup_prepareLayout(itemsCount, oldChangedRealizedRange, oldState, updatedProperties) {
-                    this.groupInfo = updatedProperties.groupInfo;
-                    this.startIndex = updatedProperties.startIndex;
-                    this.count = itemsCount;
-                    return this._layout._ensureContainerSize(this);
-                },
-
-                layoutRealizedRange: function UniformGroup_layoutRealizedRange() {
-                    // Explicitly set the items container size. This is required so that the
-                    // surface, which is a grid, will have its width sized to content.
-                    var sizes = this._layout._sizes;
-                    this._itemsContainer.style[this._layout._horizontal ? "width" : "height"] = this.getItemsContainerSize() - sizes.itemsContainerOuterSize + "px";
-                    this._itemsContainer.style[this._layout._horizontal ? "height" : "width"] = (this._layout._inListMode ? sizes.maxItemsContainerContentSize + "px" :
-                                                                                                 this._layout._itemsPerBar * sizes.containerCrossSize + "px");
-                },
-
-                layoutUnrealizedRange: function UniformGroup_layoutUnrealizedRange() {
-                    return Promise.wrap();
-                }
-            });
-        }),
-
-        UniformFlowGroup: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(Groups.UniformGroupBase, function UniformFlowGroup_ctor(layout, tree) {
-                this._layout = layout;
-                this._itemsContainer = tree.element;
-                _ElementUtilities.addClass(this._itemsContainer, layout._inListMode ? _Constants._uniformListLayoutClass : _Constants._uniformGridLayoutClass);
-            }, {
-                cleanUp: function UniformFlowGroup_cleanUp(skipDomCleanUp) {
-                    if (!skipDomCleanUp) {
-                        _ElementUtilities.removeClass(this._itemsContainer, _Constants._uniformListLayoutClass);
-                        _ElementUtilities.removeClass(this._itemsContainer, _Constants._uniformGridLayoutClass);
-                        this._itemsContainer.style.height = "";
-                    }
-                },
-                layout: function UniformFlowGroup_layout() {
-                    this._layout._site._writeProfilerMark("Layout:_UniformFlowGroup:setItemsContainerHeight,info");
-                    this._itemsContainer.style.height = this.count * this._layout._sizes.containerHeight + "px";
-                }
-            });
-        }),
-
-        CellSpanningGroup: _Base.Namespace._lazy(function () {
-            return _Base.Class.define(function CellSpanningGroup_ctor(layout, itemsContainer) {
-                this._layout = layout;
-                this._itemsContainer = itemsContainer;
-                _ElementUtilities.addClass(this._itemsContainer, _Constants._cellSpanningGridLayoutClass);
-
-                this.resetMap();
-            }, {
-                cleanUp: function CellSpanningGroup_cleanUp(skipDomCleanUp) {
-                    if (!skipDomCleanUp) {
-                        this._cleanContainers();
-                        _ElementUtilities.removeClass(this._itemsContainer, _Constants._cellSpanningGridLayoutClass);
-                        this._itemsContainer.style.cssText = "";
-                    }
-                    this._itemsContainer = null;
-
-                    if (this._layoutPromise) {
-                        this._layoutPromise.cancel();
-                        this._layoutPromise = null;
-                    }
-                    this.resetMap();
-                    this._slotsPerColumn = null;
-                    this._offScreenSlotsPerColumn = null;
-                    this._items = null;
-                    this._layout = null;
-                    this._containersToHide = null;
-                    this.groupInfo = null;
-                    this.startIndex = null;
-                    this.offset = null;
-                    this.count = null;
-                },
-
-                prepareLayoutWithCopyOfTree: function CellSpanningGroup_prepareLayoutWithCopyOfTree(tree, oldChangedRealizedRange, oldState, updatedProperties) {
-                    var that = this;
-                    var i;
-
-                    // Remember the items in the old realized item range that changed.
-                    // During layoutRealizedRange, they either need to be relaid out or hidden.
-                    this._containersToHide = {};
-                    if (oldChangedRealizedRange) {
-                        for (i = oldChangedRealizedRange.firstIndex; i <= oldChangedRealizedRange.lastIndex; i++) {
-                            this._containersToHide[uniqueID(oldState._items[i])] = oldState._items[i];
-                        }
-                    }
-
-                    // Update public properties
-                    this.groupInfo = updatedProperties.groupInfo;
-                    this.startIndex = updatedProperties.startIndex;
-                    this.count = tree.items.length;
-
-                    this._items = tree.items;
-                    this._slotsPerColumn = Math.floor(this._layout._sizes.maxItemsContainerContentSize / this.groupInfo.cellHeight);
-                    if (this._layout.maximumRowsOrColumns) {
-                        this._slotsPerColumn = Math.min(this._slotsPerColumn, this._layout.maximumRowsOrColumns);
-                    }
-                    this._slotsPerColumn = Math.max(this._slotsPerColumn, 1);
-
-                    this.resetMap();
-                    var itemInfoPromises = new Array(this.count);
-                    for (i = 0; i < this.count; i++) {
-                        itemInfoPromises[i] = this._layout._getItemInfo(this.startIndex + i);
-                    }
-                    return Promise.join(itemInfoPromises).then(function (itemInfos) {
-                        itemInfos.forEach(function (itemInfo, index) {
-                            that.addItemToMap(index, itemInfo);
-                        });
-                    });
-                },
-
-                layoutRealizedRange: function CellSpanningGroup_layoutRealizedRange(firstChangedIndex, realizedRange) {
-                    // Lay out the changed items within the realized range
-                    if (realizedRange) {
-                        var firstChangedRealizedIndex = Math.max(firstChangedIndex, realizedRange.firstIndex),
-                            i;
-                        for (i = firstChangedRealizedIndex; i <= realizedRange.lastIndex; i++) {
-                            this._layoutItem(i);
-                            delete this._containersToHide[uniqueID(this._items[i])];
-                        }
-                    }
-
-                    // Hide the old containers that are in the realized range but weren't relaid out
-                    Object.keys(this._containersToHide).forEach(function (id) {
-                        _ElementUtilities.removeClass(this._containersToHide[id], _Constants._laidOutClass);
-                    }.bind(this));
-                    this._containersToHide = {};
-
-                    // Explicitly set the items container height. This is required so that the
-                    // surface, which is a grid, will have its width sized to content.
-                    this._itemsContainer.style.cssText +=
-                        ";width:" + (this.getItemsContainerSize() - this._layout._sizes.itemsContainerOuterSize) +
-                        "px;height:" + this._layout._sizes.maxItemsContainerContentSize +
-                        "px;-ms-grid-columns: (" + this.groupInfo.cellWidth + "px)[" + this.getColumnCount() +
-                        "];-ms-grid-rows: (" + this.groupInfo.cellHeight + "px)[" + (this._slotsPerColumn + this._offScreenSlotsPerColumn) + "]";
-                },
-
-                layoutUnrealizedRange: function CellSpanningGroup_layoutUnrealizedRange(firstChangedIndex, realizedRange, beforeRealizedRange) {
-                    var that = this;
-                    var layoutJob;
-
-                    that._layoutPromise = new Promise(function (complete) {
-                        function completeLayout() {
-                            layoutJob = null;
-                            complete();
-                        }
-
-                        function schedule(fn) {
-                            return Scheduler.schedule(fn, Scheduler.Priority.normal, null,
-                                "WinJS.UI.GridLayout.CellSpanningGroup.LayoutUnrealizedRange");
-                        }
-
-                        // These loops are built to lay out the items that are closest to
-                        // the realized range first.
-
-                        if (realizedRange) {
-                            var stop = false;
-                            // For laying out the changed items that are before the realized range
-                            var before = realizedRange.firstIndex - 1;
-                            // For laying out the changed items that are after the realized range
-                            var after = Math.max(firstChangedIndex, realizedRange.lastIndex + 1);
-                            after = Math.max(before + 1, after);
-
-                            // Alternate between laying out items before and after the realized range
-                            layoutJob = schedule(function unrealizedRangeWork(info) {
-                                while (!stop) {
-                                    if (info.shouldYield) {
-                                        info.setWork(unrealizedRangeWork);
-                                        return;
-                                    }
-
-                                    stop = true;
-
-                                    if (before >= firstChangedIndex) {
-                                        that._layoutItem(before);
-                                        before--;
-                                        stop = false;
-                                    }
-                                    if (after < that.count) {
-                                        that._layoutItem(after);
-                                        after++;
-                                        stop = false;
-                                    }
-                                }
-                                completeLayout();
-                            });
-                        } else if (beforeRealizedRange) {
-                            // The items we are laying out come before the realized range.
-                            // so lay them out in descending order.
-                            var i = that.count - 1;
-                            layoutJob = schedule(function beforeRealizedRangeWork(info) {
-                                for (; i >= firstChangedIndex; i--) {
-                                    if (info.shouldYield) {
-                                        info.setWork(beforeRealizedRangeWork);
-                                        return;
-                                    }
-                                    that._layoutItem(i);
-                                }
-                                completeLayout();
-                            });
-                        } else {
-                            // The items we are laying out come after the realized range
-                            // so lay them out in ascending order.
-                            var i = firstChangedIndex;
-                            layoutJob = schedule(function afterRealizedRangeWork(info) {
-                                for (; i < that.count; i++) {
-                                    if (info.shouldYield) {
-                                        info.setWork(afterRealizedRangeWork);
-                                        return;
-                                    }
-                                    that._layoutItem(i);
-                                }
-                                completeLayout();
-                            });
-                        }
-                    }, function () {
-                        // Cancellation handler for that._layoutPromise
-                        layoutJob && layoutJob.cancel();
-                        layoutJob = null;
-                    });
-
-                    return that._layoutPromise;
-                },
-
-                itemFromOffset: function CellSpanningGroup_itemFromOffset(offset, options) {
-                    // supported options are:
-                    // - wholeItem: when set to true the fully visible item is returned
-                    // - last: if 1 the last item is returned. if 0 the first
-                    options = options || {};
-
-                    var sizes = this._layout._sizes,
-                        margins = sizes.containerMargins;
-
-                    // Make offset relative to the items container's content box
-                    offset -= sizes.itemsContainerOuterX;
-
-                    offset -= ((options.last ? 1 : -1) * margins[options.last ? "left" : "right"]);
-
-                    var value = this.indexFromOffset(offset, options.wholeItem, options.last).item;
-                    return clampToRange(0, this.count - 1, value);
-                },
-
-                getAdjacent: function CellSpanningGroup_getAdjacent(currentItem, pressedKey) {
-                    var index,
-                        originalIndex;
-
-                    index = originalIndex = currentItem.index;
-
-                    var newIndex, inMap, inMapIndex;
-                    if (this.lastAdjacent === index) {
-                        inMapIndex = this.lastInMapIndex;
-                    } else {
-                        inMapIndex = this.findItem(index);
-                    }
-
-                    do {
-                        var column = Math.floor(inMapIndex / this._slotsPerColumn),
-                            row = inMapIndex - column * this._slotsPerColumn,
-                            lastColumn = Math.floor((this.occupancyMap.length - 1) / this._slotsPerColumn);
-
-                        switch (pressedKey) {
-                            case Key.upArrow:
-                                if (row > 0) {
-                                    inMapIndex--;
-                                } else {
-                                    return { type: _UI.ObjectType.item, index: originalIndex };
-                                }
-                                break;
-                            case Key.downArrow:
-                                if (row + 1 < this._slotsPerColumn) {
-                                    inMapIndex++;
-                                } else {
-                                    return { type: _UI.ObjectType.item, index: originalIndex };
-                                }
-                                break;
-                            case Key.leftArrow:
-                                inMapIndex = (column > 0 ? inMapIndex - this._slotsPerColumn : -1);
-                                break;
-                            case Key.rightArrow:
-                                inMapIndex = (column < lastColumn ? inMapIndex + this._slotsPerColumn : this.occupancyMap.length);
-                                break;
-                        }
-
-                        inMap = inMapIndex >= 0 && inMapIndex < this.occupancyMap.length;
-                        if (inMap) {
-                            newIndex = this.occupancyMap[inMapIndex] ? this.occupancyMap[inMapIndex].index : undefined;
-                        }
-
-                    } while (inMap && (index === newIndex || newIndex === undefined));
-
-                    this.lastAdjacent = newIndex;
-                    this.lastInMapIndex = inMapIndex;
-
-                    return (inMap ? { type: _UI.ObjectType.item, index: newIndex } : "boundary");
-                },
-
-                hitTest: function CellSpanningGroup_hitTest(x, y) {
-                    var sizes = this._layout._sizes,
-                        itemIndex = 0;
-
-                    // Make the coordinates relative to the items container's content box
-                    x -= sizes.itemsContainerOuterX;
-                    y -= sizes.itemsContainerOuterY;
-
-                    if (this.occupancyMap.length > 0) {
-                        var result = this.indexFromOffset(x, false, 0);
-
-                        var counter = Math.min(this._slotsPerColumn - 1, Math.floor(y / this.groupInfo.cellHeight)),
-                            curr = result.index,
-                            lastValidIndex = curr;
-                        while (counter-- > 0) {
-                            curr++;
-                            if (this.occupancyMap[curr]) {
-                                lastValidIndex = curr;
-                            }
-                        }
-                        if (!this.occupancyMap[lastValidIndex]) {
-                            lastValidIndex--;
-                        }
-                        itemIndex = this.occupancyMap[lastValidIndex].index;
-                    }
-
-                    var itemSize = this.getItemSize(itemIndex),
-                        itemLeft = itemSize.column * this.groupInfo.cellWidth,
-                        itemTop = itemSize.row * this.groupInfo.cellHeight,
-                        useListSemantics = this._slotsPerColumn === 1,
-                        insertAfterIndex = itemIndex;
-
-                    if ((useListSemantics && (x < (itemLeft + itemSize.contentWidth / 2))) ||
-                        (!useListSemantics && (y < (itemTop + itemSize.contentHeight / 2)))) {
-                        insertAfterIndex--;
-                    }
-
-                    return {
-                        type: _UI.ObjectType.item,
-                        index: clampToRange(0, this.count - 1, itemIndex),
-                        insertAfterIndex: clampToRange(-1, this.count - 1, insertAfterIndex)
-                    };
-                },
-
-                getItemsContainerSize: function CellSpanningGroup_getItemsContainerSize() {
-                    var sizes = this._layout._sizes;
-                    return this.getColumnCount() * this.groupInfo.cellWidth + sizes.itemsContainerOuterSize;
-                },
-
-                getItemsContainerCrossSize: function CellSpanningGroup_getItemsContainerCrossSize() {
-                    var sizes = this._layout._sizes;
-                    return sizes.maxItemsContainerContentSize + sizes.itemsContainerOuterCrossSize;
-                },
-
-                getItemPositionForAnimations: function CellSpanningGroup_getItemPositionForAnimations(itemIndex) {
-                    // Top/Left are used to know if the item has moved and also used to position the item if removed.
-                    // Row/Column are used to know if a reflow animation should occur
-                    // Height/Width are used when positioning a removed item without impacting layout.
-                    // The returned rectangle refers to the win-container's border/padding/content box. Coordinates
-                    // are relative to group's items container.
-
-                    var leftStr = this._layout._site.rtl ? "right" : "left";
-                    var containerMargins = this._layout._sizes.containerMargins;
-                    var coordinates = this.getItemSize(itemIndex);
-                    var groupInfo = this.groupInfo;
-                    var itemPosition = {
-                        row: coordinates.row,
-                        column: coordinates.column,
-                        top: containerMargins.top + coordinates.row * groupInfo.cellHeight,
-                        left: containerMargins[leftStr] + coordinates.column * groupInfo.cellWidth,
-                        height: coordinates.contentHeight,
-                        width: coordinates.contentWidth
-                    };
-
-                    return itemPosition;
-                },
-
-                _layoutItem: function CellSpanningGroup_layoutItem(index) {
-                    var entry = this.getItemSize(index);
-                    this._items[index].style.cssText +=
-                        ";-ms-grid-row:" + (entry.row + 1) +
-                        ";-ms-grid-column:" + (entry.column + 1) +
-                        ";-ms-grid-row-span:" + entry.rows +
-                        ";-ms-grid-column-span:" + entry.columns +
-                        ";height:" + entry.contentHeight +
-                        "px;width:" + entry.contentWidth + "px";
-                    _ElementUtilities.addClass(this._items[index], _Constants._laidOutClass);
-
-                    return this._items[index];
-                },
-
-                _cleanContainers: function CellSpanningGroup_cleanContainers() {
-                    var items = this._items,
-                        len = items.length,
-                        i;
-                    for (i = 0; i < len; i++) {
-                        items[i].style.cssText = "";
-                        _ElementUtilities.removeClass(items[i], _Constants._laidOutClass);
-                    }
-                },
-
-                // Occupancy map
-
-                getColumnCount: function CellSpanningGroup_getColumnCount() {
-                    return Math.ceil(this.occupancyMap.length / this._slotsPerColumn);
-                },
-
-                getOccupancyMapItemCount: function CellSpanningGroup_getOccupancyMapItemCount() {
-                    var index = -1;
-
-                    // Use forEach as the map may be sparse
-                    this.occupancyMap.forEach(function (item) {
-                        if (item.index > index) {
-                            index = item.index;
-                        }
-                    });
-
-                    return index + 1;
-                },
-
-                coordinateToIndex: function CellSpanningGroup_coordinateToIndex(c, r) {
-                    return c * this._slotsPerColumn + r;
-                },
-
-                markSlotAsFull: function CellSpanningGroup_markSlotAsFull(index, itemEntry) {
-                    var coordinates = this._layout._indexToCoordinate(index, this._slotsPerColumn),
-                        toRow = coordinates.row + itemEntry.rows;
-                    for (var r = coordinates.row; r < toRow && r < this._slotsPerColumn; r++) {
-                        for (var c = coordinates.column, toColumn = coordinates.column + itemEntry.columns; c < toColumn; c++) {
-                            this.occupancyMap[this.coordinateToIndex(c, r)] = itemEntry;
-                        }
-                    }
-                    this._offScreenSlotsPerColumn = Math.max(this._offScreenSlotsPerColumn, toRow - this._slotsPerColumn);
-                },
-
-                isSlotEmpty: function CellSpanningGroup_isSlotEmpty(itemSize, row, column) {
-                    for (var r = row, toRow = row + itemSize.rows; r < toRow; r++) {
-                        for (var c = column, toColumn = column + itemSize.columns; c < toColumn; c++) {
-                            if ((r >= this._slotsPerColumn) || (this.occupancyMap[this.coordinateToIndex(c, r)] !== undefined)) {
-                                return false;
-                            }
-                        }
-                    }
-                    return true;
-                },
-
-                findEmptySlot: function CellSpanningGroup_findEmptySlot(startIndex, itemSize, newColumn) {
-                    var coordinates = this._layout._indexToCoordinate(startIndex, this._slotsPerColumn),
-                        startRow = coordinates.row,
-                        lastColumn = Math.floor((this.occupancyMap.length - 1) / this._slotsPerColumn);
-
-                    if (newColumn) {
-                        for (var c = coordinates.column + 1; c <= lastColumn; c++) {
-                            if (this.isSlotEmpty(itemSize, 0, c)) {
-                                return this.coordinateToIndex(c, 0);
-                            }
-                        }
-                    } else {
-                        for (var c = coordinates.column; c <= lastColumn; c++) {
-                            for (var r = startRow; r < this._slotsPerColumn; r++) {
-                                if (this.isSlotEmpty(itemSize, r, c)) {
-                                    return this.coordinateToIndex(c, r);
-                                }
-                            }
-                            startRow = 0;
-                        }
-                    }
-
-                    return (lastColumn + 1) * this._slotsPerColumn;
-                },
-
-                findItem: function CellSpanningGroup_findItem(index) {
-                    for (var inMapIndex = index, len = this.occupancyMap.length; inMapIndex < len; inMapIndex++) {
-                        var entry = this.occupancyMap[inMapIndex];
-                        if (entry && entry.index === index) {
-                            return inMapIndex;
-                        }
-                    }
-                    return inMapIndex;
-                },
-
-                getItemSize: function CellSpanningGroup_getItemSize(index) {
-                    var inMapIndex = this.findItem(index),
-                        entry = this.occupancyMap[inMapIndex],
-                        coords = this._layout._indexToCoordinate(inMapIndex, this._slotsPerColumn);
-
-                    if (index === entry.index) {
-                        return {
-                            row: coords.row,
-                            column: coords.column,
-                            contentWidth: entry.contentWidth,
-                            contentHeight: entry.contentHeight,
-                            columns: entry.columns,
-                            rows: entry.rows
-                        };
-                    } else {
-                        return null;
-                    }
-                },
-
-                resetMap: function CellSpanningGroup_resetMap() {
-                    this.occupancyMap = [];
-                    this.lastAdded = 0;
-                    this._offScreenSlotsPerColumn = 0;
-                },
-
-                addItemToMap: function CellSpanningGroup_addItemToMap(index, itemInfo) {
-                    var that = this;
-
-                    function add(mapEntry, newColumn) {
-                        var inMapIndex = that.findEmptySlot(that.lastAdded, mapEntry, newColumn);
-                        that.lastAdded = inMapIndex;
-                        that.markSlotAsFull(inMapIndex, mapEntry);
-                    }
-
-                    var groupInfo = that.groupInfo,
-                        margins = that._layout._sizes.containerMargins,
-                        mapEntry = {
-                            index: index,
-                            contentWidth: itemInfo.width,
-                            contentHeight: itemInfo.height,
-                            columns: Math.max(1, Math.ceil((itemInfo.width + margins.left + margins.right) / groupInfo.cellWidth)),
-                            rows: Math.max(1, Math.ceil((itemInfo.height + margins.top + margins.bottom) / groupInfo.cellHeight))
-                        };
-
-                    add(mapEntry, itemInfo.newColumn);
-                },
-
-                indexFromOffset: function CellSpanningGroup_indexFromOffset(adjustedOffset, wholeItem, last) {
-                    var measuredWidth = 0,
-                        lastItem = 0,
-                        groupInfo = this.groupInfo,
-                        index = 0;
-
-                    if (this.occupancyMap.length > 0) {
-                        lastItem = this.getOccupancyMapItemCount() - 1;
-                        measuredWidth = Math.ceil((this.occupancyMap.length - 1) / this._slotsPerColumn) * groupInfo.cellWidth;
-
-                        if (adjustedOffset < measuredWidth) {
-                            var counter = this._slotsPerColumn,
-                                index = (Math.max(0, Math.floor(adjustedOffset / groupInfo.cellWidth)) + last) * this._slotsPerColumn - last;
-                            while (!this.occupancyMap[index] && counter-- > 0) {
-                                index += (last > 0 ? -1 : 1);
-                            }
-                            return {
-                                index: index,
-                                item: this.occupancyMap[index].index
-                            };
-                        } else {
-                            index = this.occupancyMap.length - 1;
-                        }
-                    }
-
-                    return {
-                        index: index,
-                        item: lastItem + (Math.max(0, Math.floor((adjustedOffset - measuredWidth) / groupInfo.cellWidth)) + last) * this._slotsPerColumn - last
-                    };
-                }
-            });
-        })
-
-    });
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-
-        ListLayout: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(exports._LegacyLayout, function ListLayout_ctor(options) {
-                /// <signature helpKeyword="WinJS.UI.ListLayout">
-                /// <summary locid="WinJS.UI.ListLayout">
-                /// Creates a new ListLayout object.
-                /// </summary>
-                /// <param name="options" type="Object" locid="WinJS.UI.ListLayout_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control. Each property of the options
-                /// object corresponds to one of the object's properties or events. Event names must begin with "on".
-                /// </param>
-                /// <returns type="WinJS.UI.ListLayout" locid="WinJS.UI.ListLayout_returnValue">
-                /// The new ListLayout object.
-                /// </returns>
-                /// </signature>
-                options = options || {};
-                this._itemInfo = {};
-                this._groupInfo = {};
-                this._groupHeaderPosition = options.groupHeaderPosition || HeaderPosition.top;
-                this._inListMode = true;
-                this.orientation = options.orientation || "vertical";
-            }, {
-                initialize: function ListLayout_initialize(site, groupsEnabled) {
-                    _ElementUtilities.addClass(site.surface, _Constants._listLayoutClass);
-                    exports._LegacyLayout.prototype.initialize.call(this, site, groupsEnabled);
-                },
-
-                uninitialize: function ListLayout_uninitialize() {
-                    if (this._site) {
-                        _ElementUtilities.removeClass(this._site.surface, _Constants._listLayoutClass);
-                    }
-                    exports._LegacyLayout.prototype.uninitialize.call(this);
-                },
-
-                layout: function ListLayout_layout(tree, changedRange, modifiedItems, modifiedGroups) {
-                    if (!this._groupsEnabled && !this._horizontal) {
-                        return this._layoutNonGroupedVerticalList(tree, changedRange, modifiedItems, modifiedGroups);
-                    } else {
-                        return exports._LegacyLayout.prototype.layout.call(this, tree, changedRange, modifiedItems, modifiedGroups);
-                    }
-                },
-
-                _layoutNonGroupedVerticalList: function ListLayout_layoutNonGroupedVerticalList(tree, changedRange, modifiedItems, modifiedGroups) {
-                    var that = this;
-                    var perfId = "Layout:_layoutNonGroupedVerticalList";
-                    that._site._writeProfilerMark(perfId + ",StartTM");
-                    this._layoutPromise = that._measureItem(0).then(function () {
-                        _ElementUtilities[(that._usingStructuralNodes) ? "addClass" : "removeClass"]
-                            (that._site.surface, _Constants._structuralNodesClass);
-                        _ElementUtilities[(that._envInfo.nestedFlexTooLarge || that._envInfo.nestedFlexTooSmall) ? "addClass" : "removeClass"]
-                            (that._site.surface, _Constants._singleItemsBlockClass);
-
-
-                        if (that._sizes.viewportContentSize !== that._getViewportCrossSize()) {
-                            that._viewportSizeChanged(that._getViewportCrossSize());
-                        }
-
-                        that._cacheRemovedElements(modifiedItems, that._cachedItemRecords, that._cachedInsertedItemRecords, that._cachedRemovedItems, false);
-                        that._cacheRemovedElements(modifiedGroups, that._cachedHeaderRecords, that._cachedInsertedHeaderRecords, that._cachedRemovedHeaders, true);
-
-                        var itemsContainer = tree[0].itemsContainer,
-                            group = new Groups.UniformFlowGroup(that, itemsContainer);
-                        that._groups = [group];
-                        group.groupInfo = { enableCellSpanning: false };
-                        group.startIndex = 0;
-                        group.count = getItemsContainerLength(itemsContainer);
-                        group.offset = 0;
-                        group.layout();
-
-                        that._site._writeProfilerMark(perfId + ":setSurfaceWidth,info");
-                        that._site.surface.style.width = that._sizes.surfaceContentSize + "px";
-
-                        that._layoutAnimations(modifiedItems, modifiedGroups);
-                        that._site._writeProfilerMark(perfId + ":complete,info");
-                        that._site._writeProfilerMark(perfId + ",StopTM");
-                    }, function (error) {
-                        that._site._writeProfilerMark(perfId + ":canceled,info");
-                        that._site._writeProfilerMark(perfId + ",StopTM");
-                        return Promise.wrapError(error);
-                    });
-                    return {
-                        realizedRangeComplete: this._layoutPromise,
-                        layoutComplete: this._layoutPromise
-                    };
-                },
-
-                numberOfItemsPerItemsBlock: {
-                    get: function ListLayout_getNumberOfItemsPerItemsBlock() {
-                        var that = this;
-                        // Measure when numberOfItemsPerItemsBlock is called so that we measure before ListView has created the full tree structure
-                        // which reduces the trident layout required by measure.
-                        return this._measureItem(0).then(function () {
-                            if (that._envInfo.nestedFlexTooLarge || that._envInfo.nestedFlexTooSmall) {
-                                // Store all items in a single itemsblock
-                                that._usingStructuralNodes = true;
-                                return Number.MAX_VALUE;
-                            } else {
-                                that._usingStructuralNodes = exports.ListLayout._numberOfItemsPerItemsBlock > 0;
-                                return exports.ListLayout._numberOfItemsPerItemsBlock;
-                            }
-                        });
-                    }
-                },
-            }, {
-                // The maximum number of win-containers to put into each items block. win-containers
-                // are grouped into items blocks in order to mitigate the costs of the platform doing
-                // a layout in response to insertions and removals of win-containers.
-                _numberOfItemsPerItemsBlock: 10
-            });
-        }),
-
-        CellSpanningLayout: _Base.Namespace._lazy(function () {
-            return _Base.Class.derive(exports._LayoutCommon, function CellSpanningLayout_ctor(options) {
-                /// <signature helpKeyword="WinJS.UI.CellSpanningLayout">
-                /// <summary locid="WinJS.UI.CellSpanningLayout">
-                /// Creates a new CellSpanningLayout object.
-                /// </summary>
-                /// <param name="options" type="Object" locid="WinJS.UI.CellSpanningLayout_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new object. Each property of the options
-                /// object corresponds to one of the object's properties or events. Event names must begin with "on".
-                /// </param>
-                /// <returns type="WinJS.UI.CellSpanningLayout" locid="WinJS.UI.CellSpanningLayout_returnValue">
-                /// The new CellSpanningLayout object.
-                /// </returns>
-                /// </signature>
-                options = options || {};
-                this._itemInfo = options.itemInfo;
-                this._groupInfo = options.groupInfo;
-                this._groupHeaderPosition = options.groupHeaderPosition || HeaderPosition.top;
-                this._horizontal = true;
-                this._cellSpanning = true;
-            }, {
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.CellSpanningLayout.maximumRowsOrColumns" helpKeyword="WinJS.UI.CellSpanningLayout.maximumRowsOrColumns">
-                /// Gets or set the maximum number of rows or columns, depending on the orientation, to display before content begins to wrap.
-                /// A value of 0 indicates that there is no maximum.
-                /// </field>
-                maximumRowsOrColumns: {
-                    get: function () {
-                        return this._maxRowsOrColumns;
-                    },
-                    set: function (value) {
-                        this._setMaxRowsOrColumns(value);
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.CellSpanningLayout.itemInfo" helpKeyword="WinJS.UI.CellSpanningLayout.itemInfo">
-                /// Gets or sets a function that returns the width and height of an item, as well as whether
-                /// it should  appear in a new column. Setting this function improves performance because
-                /// the ListView can allocate space for an item without having to measure it first.
-                /// The function takes a single parameter: the index of the item to render.
-                /// The function returns an object that has three properties:
-                /// width: The  total width of the item.
-                /// height: The total height of the item.
-                /// newColumn: Set to true to create a column break; otherwise, false.
-                /// </field>
-                itemInfo: {
-                    enumerable: true,
-                    get: function () {
-                        return this._itemInfo;
-                    },
-                    set: function (itemInfo) {
-                        this._itemInfo = itemInfo;
-                        this._invalidateLayout();
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.CellSpanningLayout.groupInfo" helpKeyword="WinJS.UI.CellSpanningLayout.groupInfo">
-                /// Gets or sets a function that enables cell-spanning and establishes base cell dimensions.
-                /// The function returns an object that has these properties:
-                /// enableCellSpanning: Set to true to allow the ListView to contain items of multiple sizes.
-                /// cellWidth: The width of the base cell.
-                /// cellHeight: The height of the base cell.
-                /// </field>
-                groupInfo: {
-                    enumerable: true,
-                    get: function () {
-                        return this._groupInfo;
-                    },
-                    set: function (groupInfo) {
-                        this._groupInfo = groupInfo;
-                        this._invalidateLayout();
-                    }
-                },
-
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.Orientation" locid="WinJS.UI.CellSpanningLayout.orientation" helpKeyword="WinJS.UI.CellSpanningLayout.orientation">
-                /// Gets the orientation of the layout. CellSpanning layout only supports horizontal orientation.
-                /// </field>
-                orientation: {
-                    enumerable: true,
-                    get: function () {
-                        return "horizontal";
-                    }
-                }
-            });
-        }),
-
-        _LayoutWrapper: _Base.Namespace._lazy(function () {
-            return _Base.Class.define(function LayoutWrapper_ctor(layout) {
-                this.defaultAnimations = true;
-
-                // Initialize and hitTest are required
-                this.initialize = function LayoutWrapper_initialize(site, groupsEnabled) {
-                    layout.initialize(site, groupsEnabled);
-                };
-                this.hitTest = function LayoutWrapper_hitTest(x, y) {
-                    return layout.hitTest(x, y);
-                };
-
-                // These methods are optional
-                layout.uninitialize && (this.uninitialize = function LayoutWrapper_uninitialize() {
-                    layout.uninitialize();
-                });
-
-                if ("numberOfItemsPerItemsBlock" in layout) {
-                    Object.defineProperty(this, "numberOfItemsPerItemsBlock", {
-                        get: function LayoutWrapper_getNumberOfItemsPerItemsBlock() {
-                            return layout.numberOfItemsPerItemsBlock;
-                        }
-                    });
-                }
-
-                layout._getItemPosition && (this._getItemPosition = function LayoutWrapper_getItemPosition(index) {
-                    return layout._getItemPosition(index);
-                });
-
-                layout.itemsFromRange && (this.itemsFromRange = function LayoutWrapper_itemsFromRange(start, end) {
-                    return layout.itemsFromRange(start, end);
-                });
-
-                layout.getAdjacent && (this.getAdjacent = function LayoutWrapper_getAdjacent(currentItem, pressedKey) {
-                    return layout.getAdjacent(currentItem, pressedKey);
-                });
-
-                layout.dragOver && (this.dragOver = function LayoutWrapper_dragOver(x, y, dragInfo) {
-                    return layout.dragOver(x, y, dragInfo);
-                });
-
-                layout.dragLeave && (this.dragLeave = function LayoutWrapper_dragLeave() {
-                    return layout.dragLeave();
-                });
-                var propertyDefinition = {
-                    enumerable: true,
-                    get: function () {
-                        return "vertical";
-                    }
-                };
-                if (layout.orientation !== undefined) {
-                    propertyDefinition.get = function () {
-                        return layout.orientation;
-                    };
-                    propertyDefinition.set = function (value) {
-                        layout.orientation = value;
-                    };
-                }
-                Object.defineProperty(this, "orientation", propertyDefinition);
-
-                if (layout.setupAnimations || layout.executeAnimations) {
-                    this.defaultAnimations = false;
-                    this.setupAnimations = function LayoutWrapper_setupAnimations() {
-                        return layout.setupAnimations();
-                    };
-                    this.executeAnimations = function LayoutWrapper_executeAnimations() {
-                        return layout.executeAnimations();
-                    };
-                }
-
-                if (layout.layout) {
-                    if (this.defaultAnimations) {
-                        var that = this;
-                        this.layout = function LayoutWrapper_layout(tree, changedRange, modifiedItems, modifiedGroups) {
-                            var promises = normalizeLayoutPromises(layout.layout(tree, changedRange, [], [])),
-                                synchronous;
-                            promises.realizedRangeComplete.then(function () {
-                                synchronous = true;
-                            });
-                            synchronous && that._layoutAnimations(modifiedItems, modifiedGroups);
-                            return promises;
-                        };
-                    } else {
-                        this.layout = function LayoutWrapper_layout(tree, changedRange, modifiedItems, modifiedGroups) {
-                            return normalizeLayoutPromises(layout.layout(tree, changedRange, modifiedItems, modifiedGroups));
-                        };
-                    }
-                }
-            }, {
-                uninitialize: function LayoutWrapper_uninitialize() {
-                },
-                numberOfItemsPerItemsBlock: {
-                    get: function LayoutWrapper_getNumberOfItemsPerItemsBlock() {
-                    }
-                },
-                layout: function LayoutWrapper_layout(tree, changedRange, modifiedItems, modifiedGroups) {
-                    if (this.defaultAnimations) {
-                        this._layoutAnimations(modifiedItems, modifiedGroups);
-                    }
-                    return normalizeLayoutPromises();
-                },
-                itemsFromRange: function LayoutWrapper_itemsFromRange() {
-                    return { firstIndex: 0, lastIndex: Number.MAX_VALUE };
-                },
-                getAdjacent: function LayoutWrapper_getAdjacent(currentItem, pressedKey) {
-
-                    switch (pressedKey) {
-                        case Key.pageUp:
-                        case Key.upArrow:
-                        case Key.leftArrow:
-                            return { type: currentItem.type, index: currentItem.index - 1 };
-                        case Key.downArrow:
-                        case Key.rightArrow:
-                        case Key.pageDown:
-                            return { type: currentItem.type, index: currentItem.index + 1 };
-                    }
-                },
-                dragOver: function LayoutWrapper_dragOver() {
-                },
-                dragLeave: function LayoutWrapper_dragLeaver() {
-                },
-                setupAnimations: function LayoutWrapper_setupAnimations() {
-                },
-                executeAnimations: function LayoutWrapper_executeAnimations() {
-                },
-                _getItemPosition: function LayoutWrapper_getItemPosition() {
-                },
-                _layoutAnimations: function LayoutWrapper_layoutAnimations() {
-                },
-            });
-        }),
-    });
-
-    function normalizeLayoutPromises(retVal) {
-        if (Promise.is(retVal)) {
-            return {
-                realizedRangeComplete: retVal,
-                layoutComplete: retVal
-            };
-        } else if (typeof retVal === "object" && retVal && retVal.layoutComplete) {
-            return retVal;
-        } else {
-            return {
-                realizedRangeComplete: Promise.wrap(),
-                layoutComplete: Promise.wrap()
-            };
-        }
-    }
-
-    var HeaderPosition = {
-        left: "left",
-        top: "top"
-    };
-
-    function getMargins(element) {
-        return {
-            left: getDimension(element, "marginLeft"),
-            right: getDimension(element, "marginRight"),
-            top: getDimension(element, "marginTop"),
-            bottom: getDimension(element, "marginBottom")
-        };
-    }
-
-    // Layout, _LayoutCommon, and _LegacyLayout are defined ealier so that their fully
-    // qualified names can be used in _Base.Class.derive. This is required by Blend.
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        HeaderPosition: HeaderPosition,
-        _getMargins: getMargins
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ListView/_VirtualizeContentsView',[
-    'exports',
-    '../../Core/_Global',
-    '../../Core/_Base',
-    '../../Core/_BaseUtils',
-    '../../Promise',
-    '../../_Signal',
-    '../../Scheduler',
-    '../../Utilities/_Dispose',
-    '../../Utilities/_ElementUtilities',
-    '../../Utilities/_SafeHtml',
-    '../../Utilities/_UI',
-    '../ItemContainer/_Constants',
-    '../ItemContainer/_ItemEventsHandler',
-    './_Helpers',
-    './_ItemsContainer'
-], function virtualizeContentsViewInit(exports, _Global, _Base, _BaseUtils, Promise, _Signal, Scheduler, _Dispose, _ElementUtilities, _SafeHtml, _UI, _Constants, _ItemEventsHandler, _Helpers, _ItemsContainer) {
-    "use strict";
-
-    function setFlow(from, to) {
-        _ElementUtilities._setAttribute(from, "aria-flowto", to.id);
-        _ElementUtilities._setAttribute(to, "x-ms-aria-flowfrom", from.id);
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _VirtualizeContentsView: _Base.Namespace._lazy(function () {
-
-            function cooperativeQueueWorker(info) {
-                var workItems = info.job._workItems;
-                var work;
-                while (workItems.length && !info.shouldYield) {
-                    work = workItems.shift();
-                    work();
-                }
-
-                info.setWork(cooperativeQueueWorker);
-
-                if (!workItems.length) {
-                    info.job.pause();
-                }
-            }
-
-            function scheduleQueueJob(priority, name) {
-
-                var job = Scheduler.schedule(cooperativeQueueWorker, priority, null, name);
-
-                job._workItems = [];
-
-                job.addWork = function (work, head) {
-                    if (head) {
-                        this._workItems.unshift(work);
-                    } else {
-                        this._workItems.push(work);
-                    }
-                    this.resume();
-                };
-
-                job.clearWork = function () {
-                    this._workItems.length = 0;
-                };
-
-                job.dispose = function () {
-                    this.cancel();
-                    this._workItems.length = 0;
-                };
-
-                return job;
-            }
-
-            function shouldWaitForSeZo(listView) {
-                return listView._zooming || listView._pinching;
-            }
-
-            function waitForSeZo(listView, timeout) {
-                // waitForSeZo will block until sezo calls endZoom on listview, or a timeout duration has elapsed to
-                // unblock a potential deadlock between the sezo waiting on container creation, and container creation
-                // waiting on endZoom.
-
-                if (listView._isZombie()) { return Promise.wrap(); }
-                if (shouldWaitForSeZo(listView)) {
-                    if (+timeout !== timeout) {
-                        timeout = _VirtualizeContentsView._waitForSeZoTimeoutDuration;
-                    }
-                    //To improve SeZo's zoom animation and pinch detection perf, we want to ensure unimportant task
-                    //is only run while zooming or pinching is not in progress.
-                    return Promise.timeout(_VirtualizeContentsView._waitForSeZoIntervalDuration).then(function () {
-                        timeout -= _VirtualizeContentsView._waitForSeZoIntervalDuration;
-                        if (timeout <= 0) {
-                            return true;
-                        }
-                        return waitForSeZo(listView, timeout);
-                    });
-                } else {
-                    return Promise.wrap();
-                }
-            }
-
-            function makeFunctor(scrollToFunctor) {
-                if (typeof scrollToFunctor === "number") {
-                    var pos = scrollToFunctor;
-
-                    scrollToFunctor = function () {
-                        return {
-                            position: pos,
-                            direction: "right"
-                        };
-                    };
-                }
-                return scrollToFunctor;
-            }
-
-            var _VirtualizeContentsView = _Base.Class.define(function VirtualizeContentsView_ctor(listView) {
-
-                this._listView = listView;
-                this._forceRelayout = false;
-                this.maxLeadingPages = _BaseUtils._isiOS ? _VirtualizeContentsView._iOSMaxLeadingPages : _VirtualizeContentsView._defaultPagesToPrefetch;
-                this.maxTrailingPages = _BaseUtils._isiOS ? _VirtualizeContentsView._iOSMaxTrailingPages : _VirtualizeContentsView._defaultPagesToPrefetch;
-                this.items = new _ItemsContainer._ItemsContainer(listView);
-                this.firstIndexDisplayed = -1;
-                this.lastIndexDisplayed = -1;
-                this.begin = 0;
-                this.end = 0;
-                this._realizePass = 1;
-                this._firstLayoutPass = true;
-                this._runningAnimations = null;
-                this._renderCompletePromise = Promise.wrap();
-                this._state = new CreatedState(this);
-                this._createLayoutSignal();
-                this._createTreeBuildingSignal();
-                this._layoutWork = null;
-                this._onscreenJob = scheduleQueueJob(Scheduler.Priority.aboveNormal, "on-screen items");
-                this._frontOffscreenJob = scheduleQueueJob(Scheduler.Priority.normal, "front off-screen items");
-                this._backOffscreenJob = scheduleQueueJob(Scheduler.Priority.belowNormal, "back off-screen items");
-                this._scrollbarPos = 0;
-                this._direction = "right";
-                this._scrollToFunctor = makeFunctor(0);
-            },
-            {
-
-                _dispose: function VirtualizeContentsView_dispose() {
-                    this.cleanUp();
-                    this.items = null;
-                    this._renderCompletePromise && this._renderCompletePromise.cancel();
-                    this._renderCompletePromise = null;
-                    this._onscreenJob.dispose();
-                    this._frontOffscreenJob.dispose();
-                    this._backOffscreenJob.dispose();
-                },
-
-                _createItem: function VirtualizeContentsView_createItem(itemIndex, itemPromise, available, unavailable) {
-                    this._listView._writeProfilerMark("createItem(" + itemIndex + ") " + this._getBoundingRectString(itemIndex) + ",info");
-
-                    var that = this;
-                    that._listView._itemsManager._itemFromItemPromiseThrottled(itemPromise).done(
-                        function (element) {
-                            if (element) {
-                                available(itemIndex, element, that._listView._itemsManager._recordFromElement(element));
-                            } else {
-                                unavailable(itemIndex);
-                            }
-                        },
-                        function (err) {
-                            unavailable(itemIndex);
-                            return Promise.wrapError(err);
-                        }
-                    );
-                },
-
-                _addItem: function VirtualizeContentsView_addItem(fragment, itemIndex, element, currentPass) {
-                    if (this._realizePass === currentPass) {
-                        var record = this._listView._itemsManager._recordFromElement(element);
-
-                        delete this._pendingItemPromises[record.itemPromise.handle];
-
-                        this.items.setItemAt(itemIndex, {
-                            itemBox: null,
-                            container: null,
-                            element: element,
-                            detached: true,
-                            itemsManagerRecord: record
-                        });
-                    }
-                },
-
-                lastItemIndex: function VirtualizeContentsView_lastItemIndex() {
-                    return (this.containers ? (this.containers.length - 1) : -1);
-                },
-
-                _setSkipRealizationForChange: function (skip) {
-                    if (skip) {
-                        if (this._realizationLevel !== _VirtualizeContentsView._realizationLevel.realize) {
-                            this._realizationLevel = _VirtualizeContentsView._realizationLevel.skip;
-                        }
-                    } else {
-                        this._realizationLevel = _VirtualizeContentsView._realizationLevel.realize;
-                    }
-                },
-
-                _realizeItems: function VirtualizeContentsView_realizeItems(fragment, begin, end, count, currentPass, scrollbarPos, direction, firstInView, lastInView, ignoreGaps) {
-                    var perfId = "_realizeItems(" + begin + "-" + (end - 1) + ") visible(" + firstInView + "-" + lastInView + ")";
-
-                    this._listView._writeProfilerMark(perfId + ",StartTM");
-
-                    direction = direction || "right";
-
-                    var counter = end - begin;
-                    var inView = lastInView - firstInView + 1,
-                        inViewCounter = inView,
-                        rightOffscreenCount = end - lastInView - 1,
-                        leftOffscreenCount = firstInView - begin;
-                    var renderCompletePromises = [];
-                    var entranceAnimationSignal = new _Signal();
-                    var viewportItemsRealized = new _Signal();
-                    var frontItemsRealized = new _Signal();
-
-                    var that = this;
-
-                    function itemIsReady(itemIndex, itemsManagerRecord) {
-                        renderCompletePromises.push(Promise._cancelBlocker(itemsManagerRecord.renderComplete));
-
-                        delivered(itemIndex);
-                    }
-
-                    function appendItemsToDom(startIndex, endIndex) {
-                        that._listView._writeProfilerMark("_realizeItems_appendedItemsToDom,StartTM");
-                        if (that._listView._isZombie()) { return; }
-
-                        function updateDraggable(itemData, element) {
-                            if (!itemData.updatedDraggableAttribute && (that._listView.itemsDraggable || that._listView.itemsReorderable)) {
-                                itemData.itemsManagerRecord.renderComplete.done(function () {
-                                    if (that._realizePass === currentPass) {
-                                        if (!_ElementUtilities.hasClass(element, _Constants._nonDraggableClass)) {
-                                            itemData.itemBox.draggable = true;
-                                        }
-                                        itemData.updatedDraggableAttribute = true;
-                                    }
-                                });
-                            }
-                        }
-
-                        var itemIndex;
-                        var appendItemsCount = 0;
-                        var firstIndex = -1;
-                        var lastIndex = -1;
-                        for (itemIndex = startIndex; itemIndex <= endIndex; itemIndex++) {
-                            var itemData = that.items.itemDataAt(itemIndex);
-                            if (itemData) {
-                                var element = itemData.element,
-                                    itemBox = itemData.itemBox;
-
-                                if (!itemBox) {
-                                    itemBox = that._listView._itemBoxTemplate.cloneNode(true);
-                                    itemData.itemBox = itemBox;
-
-                                    itemBox.appendChild(element);
-                                    _ElementUtilities.addClass(element, _Constants._itemClass);
-
-                                    that._listView._setupAriaSelectionObserver(element);
-
-                                    if (that._listView._isSelected(itemIndex)) {
-                                        _ItemEventsHandler._ItemEventsHandler.renderSelection(itemBox, element, true, true);
-                                    }
-
-                                    that._listView._currentMode().renderDragSourceOnRealizedItem(itemIndex, itemBox);
-                                }
-
-                                updateDraggable(itemData, element);
-
-                                var container = that.getContainer(itemIndex);
-                                if (itemBox.parentNode !== container) {
-                                    itemData.container = container;
-                                    that._appendAndRestoreFocus(container, itemBox);
-
-                                    appendItemsCount++;
-                                    if (firstIndex < 0) {
-                                        firstIndex = itemIndex;
-                                    }
-                                    lastIndex = itemIndex;
-
-                                    if (that._listView._isSelected(itemIndex)) {
-                                        _ElementUtilities.addClass(container, _Constants._selectedClass);
-                                    }
-
-                                    _ElementUtilities.removeClass(container, _Constants._backdropClass);
-
-                                    // elementAvailable needs to be called after fragment.appendChild. elementAvailable fulfills a promise for items requested
-                                    // by the keyboard focus handler. That handler will explicitly call .focus() on the element, so in order for
-                                    // the focus handler to work, the element needs to be in a tree prior to focusing.
-
-                                    that.items.elementAvailable(itemIndex);
-                                }
-                            }
-                        }
-
-                        that._listView._writeProfilerMark("_realizeItems_appendedItemsToDom,StopTM");
-                        if (appendItemsCount > 0) {
-                            that._listView._writeProfilerMark("_realizeItems_appendedItemsToDom:" + appendItemsCount + " (" + firstIndex + "-" + lastIndex + "),info");
-                            that._reportElementsLevel(direction);
-                        }
-                    }
-
-                    function removeGaps(first, last, begin, end) {
-                        if (ignoreGaps) {
-                            return;
-                        }
-                        // If we realized items 0 through 20 and then scrolled so that items 25 - 30 are on screen when we
-                        // append them to the dom we should remove items 0 - 20 from the dom so there are no gaps between the
-                        // two realized spots.
-
-                        // Walk backwards from the beginning and if we find an item which is missing remove the rest
-                        var foundMissing = false;
-                        while (first >= begin) {
-                            foundMissing = testGap(first, foundMissing);
-                            first--;
-                        }
-
-                        // Walk forwards from the end and if we find an item which is missing remove the rest
-                        foundMissing = false;
-                        while (last <= end) {
-                            foundMissing = testGap(last, foundMissing);
-                            last++;
-                        }
-
-                        function testGap(itemIndex, foundMissing) {
-                            // This helper method is called for each index and once an item is missing from the dom
-                            // it removes any future one it encounters.
-                            var itemData = that.items.itemDataAt(itemIndex);
-                            if (itemData) {
-                                var itemBox = itemData.itemBox;
-                                if (!itemBox || !itemBox.parentNode) {
-                                    return true;
-                                } else if (foundMissing) {
-                                    _ElementUtilities.addClass(itemBox.parentNode, _Constants._backdropClass);
-                                    itemBox.parentNode.removeChild(itemBox);
-                                    return true;
-                                } else {
-                                    return false;
-                                }
-                            } else {
-                                return true;
-                            }
-                        }
-                    }
-
-                    function scheduleReadySignal(first, last, job, dir, head) {
-                        var promises = [];
-
-                        for (var i = first; i <= last; i++) {
-                            var itemData = that.items.itemDataAt(i);
-                            if (itemData) {
-                                promises.push(itemData.itemsManagerRecord.itemPromise);
-                            }
-                        }
-
-                        function schedule(itemIndex) {
-                            var itemData = that.items.itemDataAt(itemIndex);
-                            if (itemData) {
-                                var record = itemData.itemsManagerRecord;
-                                if (!record.readyComplete && that._realizePass === currentPass) {
-                                    job.addWork(function () {
-                                        if (that._listView._isZombie()) {
-                                            return;
-                                        }
-                                        if (record.pendingReady && that._realizePass === currentPass) {
-                                            that._listView._writeProfilerMark("pendingReady(" + itemIndex + "),info");
-                                            record.pendingReady();
-                                        }
-                                    }, head);
-                                }
-                            }
-                        }
-
-                        Promise.join(promises).then(function () {
-                            if (dir === "right") {
-                                for (var i = first; i <= last; i++) {
-                                    schedule(i);
-                                }
-                            } else {
-                                for (var i = last; i >= first; i--) {
-                                    schedule(i);
-                                }
-                            }
-                        });
-                    }
-
-                    function delivered(index) {
-                        if (that._realizePass !== currentPass) {
-                            return;
-                        }
-
-                        if (index >= firstInView && index <= lastInView) {
-                            if (--inViewCounter === 0) {
-                                appendItemsToDom(firstInView, lastInView);
-                                removeGaps(firstInView, lastInView, begin, end);
-
-                                if (that._firstLayoutPass) {
-                                    scheduleReadySignal(firstInView, lastInView, that._frontOffscreenJob, direction === "right" ? "left" : "right", true);
-
-                                    var entranceAnimation = Scheduler.schedulePromiseHigh(null, "WinJS.UI.ListView.entranceAnimation").then(function () {
-                                        if (that._listView._isZombie()) { return; }
-                                        that._listView._writeProfilerMark("entranceAnimation,StartTM");
-                                        var promise = that._listView._animateListEntrance(!that._firstEntranceAnimated);
-                                        that._firstEntranceAnimated = true;
-                                        return promise;
-                                    });
-
-                                    that._runningAnimations = Promise.join([that._runningAnimations, entranceAnimation]);
-                                    that._runningAnimations.done(function () {
-                                        that._listView._writeProfilerMark("entranceAnimation,StopTM");
-                                        if (that._realizePass === currentPass) {
-                                            that._runningAnimations = null;
-                                            entranceAnimationSignal.complete();
-                                        }
-                                    });
-                                    that._firstLayoutPass = false;
-
-                                    if (that._listView._isCurrentZoomView) {
-                                        Scheduler.requestDrain(that._onscreenJob.priority);
-                                    }
-                                } else {
-                                    // during scrolling ready for onscreen items after front off screen items
-                                    scheduleReadySignal(firstInView, lastInView, that._frontOffscreenJob, direction);
-                                    entranceAnimationSignal.complete();
-                                }
-
-                                that._updateHeaders(that._listView._canvas, firstInView, lastInView + 1).done(function () {
-                                    viewportItemsRealized.complete();
-                                });
-                            }
-                        } else if (index < firstInView) {
-                            --leftOffscreenCount;
-                            if (leftOffscreenCount % inView === 0) {
-                                appendItemsToDom(begin, firstInView - 1);
-                            }
-                            if (!leftOffscreenCount) {
-                                that._updateHeaders(that._listView._canvas, begin, firstInView).done(function () {
-                                    if (direction !== "right") {
-                                        frontItemsRealized.complete();
-                                    }
-                                });
-                                scheduleReadySignal(begin, firstInView - 1, direction !== "right" ? that._frontOffscreenJob : that._backOffscreenJob, "left");
-                            }
-                        } else if (index > lastInView) {
-                            --rightOffscreenCount;
-                            if (rightOffscreenCount % inView === 0) {
-                                appendItemsToDom(lastInView + 1, end - 1);
-                            }
-                            if (!rightOffscreenCount) {
-                                that._updateHeaders(that._listView._canvas, lastInView + 1, end).then(function () {
-                                    if (direction === "right") {
-                                        frontItemsRealized.complete();
-                                    }
-                                });
-                                scheduleReadySignal(lastInView + 1, end - 1, direction === "right" ? that._frontOffscreenJob : that._backOffscreenJob, "right");
-                            }
-                        }
-                        counter--;
-
-                        if (counter === 0) {
-                            that._renderCompletePromise = Promise.join(renderCompletePromises).then(null, function (e) {
-                                var error = Array.isArray(e) && e.some(function (item) { return item && !(item instanceof Error && item.name === "Canceled"); });
-                                if (error) {
-                                    // rethrow
-                                    return Promise.wrapError(e);
-                                }
-                            });
-
-                            (that._headerRenderPromises || Promise.wrap()).done(function () {
-                                Scheduler.schedule(function VirtualizeContentsView_async_delivered() {
-                                    if (that._listView._isZombie()) {
-                                        workCompleteSignal.cancel();
-                                    } else {
-                                        workCompleteSignal.complete();
-                                    }
-                                }, Math.min(that._onscreenJob.priority, that._backOffscreenJob.priority), null, "WinJS.UI.ListView._allItemsRealized");
-                            });
-                        }
-                    }
-
-                    function newItemIsReady(itemIndex, element, itemsManagerRecord) {
-                        if (that._realizePass === currentPass) {
-                            var element = itemsManagerRecord.element;
-                            that._addItem(fragment, itemIndex, element, currentPass);
-                            itemIsReady(itemIndex, itemsManagerRecord);
-                        }
-                    }
-
-                    if (counter > 0) {
-                        var createCount = 0;
-                        var updateCount = 0;
-                        var cleanCount = 0;
-                        that.firstIndexDisplayed = firstInView;
-                        that.lastIndexDisplayed = lastInView;
-
-                        var isCurrentZoomView = that._listView._isCurrentZoomView;
-                        if (that._highPriorityRealize && (that._firstLayoutPass || that._hasAnimationInViewportPending)) {
-                            // startup or edits that will animate items in the viewport
-                            that._highPriorityRealize = false;
-                            that._onscreenJob.priority = Scheduler.Priority.high;
-                            that._frontOffscreenJob.priority = Scheduler.Priority.normal;
-                            that._backOffscreenJob.priority = Scheduler.Priority.belowNormal;
-                        } else if (that._highPriorityRealize) {
-                            // edits that won't animate items in the viewport
-                            that._highPriorityRealize = false;
-                            that._onscreenJob.priority = Scheduler.Priority.high;
-                            that._frontOffscreenJob.priority = Scheduler.Priority.high - 1;
-                            that._backOffscreenJob.priority = Scheduler.Priority.high - 1;
-                        } else if (isCurrentZoomView) {
-                            // scrolling
-                            that._onscreenJob.priority = Scheduler.Priority.aboveNormal;
-                            that._frontOffscreenJob.priority = Scheduler.Priority.normal;
-                            that._backOffscreenJob.priority = Scheduler.Priority.belowNormal;
-                        } else {
-                            // hidden ListView in SeZo
-                            that._onscreenJob.priority = Scheduler.Priority.belowNormal;
-                            that._frontOffscreenJob.priority = Scheduler.Priority.idle;
-                            that._backOffscreenJob.priority = Scheduler.Priority.idle;
-                        }
-
-                        // Create a promise to wrap the work in the queue. When the queue gets to the last item we can mark
-                        // the work promise complete and if the work promise is canceled we cancel the queue.
-                        //
-                        var workCompleteSignal = new _Signal();
-
-                        // If the version manager recieves a notification we clear the work in the work queues
-                        //
-                        var cancelToken = that._listView._versionManager.cancelOnNotification(workCompleteSignal.promise);
-
-                        var queueStage1AfterStage0 = function (job, record) {
-                            if (record.startStage1) {
-                                record.stage0.then(function () {
-                                    if (that._realizePass === currentPass && record.startStage1) {
-                                        job.addWork(record.startStage1);
-                                    }
-                                });
-                            }
-                        };
-
-                        var queueWork = function (job, itemIndex) {
-                            var itemData = that.items.itemDataAt(itemIndex);
-                            if (!itemData) {
-                                var itemPromise = that._listView._itemsManager._itemPromiseAtIndex(itemIndex);
-
-                                // Remember this pending item promise and avoid canceling it from the previous realization pass.
-                                that._pendingItemPromises[itemPromise.handle] = itemPromise;
-                                delete that._previousRealizationPendingItemPromises[itemPromise.handle];
-
-                                job.addWork(function VirtualizeContentsView_realizeItemsWork() {
-                                    if (that._listView._isZombie()) {
-                                        return;
-                                    }
-
-                                    createCount++;
-                                    that._createItem(itemIndex, itemPromise, newItemIsReady, delivered);
-
-                                    // _createItem runs user code
-                                    if (that._listView._isZombie() || that._realizePass !== currentPass) {
-                                        return;
-                                    }
-
-                                    if (itemPromise.handle) {
-                                        var record = that._listView._itemsManager._recordFromHandle(itemPromise.handle);
-                                        queueStage1AfterStage0(job, record);
-                                    }
-                                });
-                            }
-
-                        };
-
-                        var queueRight = function (job, first, last) {
-                            for (var itemIndex = first; itemIndex <= last; itemIndex++) {
-                                queueWork(job, itemIndex);
-                            }
-                        };
-
-                        var queueLeft = function (job, first, last) {
-                            // Always build the left side in the direction away from the center.
-                            for (var itemIndex = last; itemIndex >= first; itemIndex--) {
-                                queueWork(job, itemIndex);
-                            }
-                        };
-
-                        var handleExistingRange = function (job, first, last) {
-                            for (var itemIndex = first; itemIndex <= last; itemIndex++) {
-                                var itemData = that.items.itemDataAt(itemIndex);
-                                if (itemData) {
-                                    var record = itemData.itemsManagerRecord;
-                                    itemIsReady(itemIndex, record);
-                                    updateCount++;
-                                    queueStage1AfterStage0(job, record);
-                                }
-                            }
-                        };
-
-                        // PendingItemPromises are the item promises which we have requested from the ItemsManager
-                        // which have not returned an element (placeholder or real). Since we only clean up items
-                        // which have an element in _unrealizeItems we need to remember these item promises. We cancel
-                        // the item promises from the previous realization iteration if those item promises are not
-                        // used for the current realization.
-                        this._previousRealizationPendingItemPromises = this._pendingItemPromises || {};
-                        this._pendingItemPromises = {};
-
-                        var emptyFront;
-                        if (direction === "left") {
-                            queueLeft(that._onscreenJob, firstInView, lastInView);
-                            queueLeft(that._frontOffscreenJob, begin, firstInView - 1);
-                            emptyFront = begin > (firstInView - 1);
-                        } else {
-                            queueRight(that._onscreenJob, firstInView, lastInView);
-                            queueRight(that._frontOffscreenJob, lastInView + 1, end - 1);
-                            emptyFront = lastInView + 1 > (end - 1);
-                        }
-
-                        // Anything left in _previousRealizationPendingItemPromises can be canceled here.
-                        // Note: we are doing this synchronously. If we didn't do it synchronously we would have had to merge
-                        // _previousRealizationPendingItemPromises and _pendingItemPromises together. This also has the great
-                        // benefit to cancel item promises in the backOffScreenArea which are much less important.
-                        for (var i = 0, handles = Object.keys(this._previousRealizationPendingItemPromises), len = handles.length; i < len; i++) {
-                            var handle = handles[i];
-                            that._listView._itemsManager.releaseItemPromise(this._previousRealizationPendingItemPromises[handle]);
-                        }
-                        this._previousRealizationPendingItemPromises = {};
-
-
-                        // Handle existing items in the second pass to make sure that raising ready signal is added to the queues after creating items
-                        handleExistingRange(that._onscreenJob, firstInView, lastInView);
-                        if (direction === "left") {
-                            handleExistingRange(that._frontOffscreenJob, begin, firstInView - 1);
-                        } else {
-                            handleExistingRange(that._frontOffscreenJob, lastInView + 1, end - 1);
-                        }
-
-                        var showProgress = (inViewCounter === lastInView - firstInView + 1);
-
-                        if (that._firstLayoutPass) {
-                            that._listView._canvas.style.opacity = 0;
-                        } else {
-                            if (showProgress) {
-                                that._listView._showProgressBar(that._listView._element, "50%", "50%");
-                            } else {
-                                that._listView._hideProgressBar();
-                            }
-                        }
-
-                        that._frontOffscreenJob.pause();
-                        that._backOffscreenJob.pause();
-
-                        viewportItemsRealized.promise.done(
-                            function () {
-                                that._frontOffscreenJob.resume();
-
-                                if (emptyFront) {
-                                    frontItemsRealized.complete();
-                                }
-                            },
-                            function () {
-                                workCompleteSignal.cancel();
-                            }
-                        );
-
-                        frontItemsRealized.promise.done(function () {
-                            that._listView._writeProfilerMark("frontItemsRealized,info");
-
-                            if (direction === "left") {
-                                queueRight(that._backOffscreenJob, lastInView + 1, end - 1);
-                                handleExistingRange(that._backOffscreenJob, lastInView + 1, end - 1);
-                            } else {
-                                queueLeft(that._backOffscreenJob, begin, firstInView - 1);
-                                handleExistingRange(that._backOffscreenJob, begin, firstInView - 1);
-                            }
-
-                            that._backOffscreenJob.resume();
-                        });
-
-                        workCompleteSignal.promise.done(
-                            function () {
-                                that._listView._versionManager.clearCancelOnNotification(cancelToken);
-
-                                that._listView._writeProfilerMark(perfId + " complete(created:" + createCount + " updated:" + updateCount + "),info");
-                            },
-                            function (err) {
-                                that._listView._versionManager.clearCancelOnNotification(cancelToken);
-                                that._onscreenJob.clearWork();
-                                that._frontOffscreenJob.clearWork();
-                                that._backOffscreenJob.clearWork();
-
-                                entranceAnimationSignal.cancel();
-                                viewportItemsRealized.cancel();
-
-                                that._listView._writeProfilerMark(perfId + " canceled(created:" + createCount + " updated:" + updateCount + " clean:" + cleanCount + "),info");
-                                return Promise.wrapError(err);
-                            }
-                        );
-
-                        that._listView._writeProfilerMark(perfId + ",StopTM");
-                        return {
-                            viewportItemsRealized: viewportItemsRealized.promise,
-                            allItemsRealized: workCompleteSignal.promise,
-                            loadingCompleted: Promise.join([workCompleteSignal.promise, entranceAnimationSignal.promise]).then(function () {
-                                var promises = [];
-
-                                for (var i = begin; i < end; i++) {
-                                    var itemData = that.items.itemDataAt(i);
-                                    if (itemData) {
-                                        promises.push(itemData.itemsManagerRecord.itemReadyPromise);
-                                    }
-                                }
-                                return Promise._cancelBlocker(Promise.join(promises));
-                            })
-                        };
-                    } else {
-                        that._listView._writeProfilerMark(perfId + ",StopTM");
-                        return {
-                            viewportItemsRealized: Promise.wrap(),
-                            allItemsRealized: Promise.wrap(),
-                            loadingCompleted: Promise.wrap()
-                        };
-                    }
-                },
-
-                _setAnimationInViewportState: function VirtualizeContentsView_setAnimationInViewportState(modifiedElements) {
-                    this._hasAnimationInViewportPending = false;
-                    if (modifiedElements && modifiedElements.length > 0) {
-                        var viewportLength = this._listView._getViewportLength(),
-                            range = this._listView._layout.itemsFromRange(this._scrollbarPos, this._scrollbarPos + viewportLength - 1);
-                        for (var i = 0, len = modifiedElements.length; i < len; i++) {
-                            var modifiedElement = modifiedElements[i];
-                            if (modifiedElement.newIndex >= range.firstIndex && modifiedElement.newIndex <= range.lastIndex && modifiedElement.newIndex !== modifiedElement.oldIndex) {
-                                this._hasAnimationInViewportPending = true;
-                                break;
-                            }
-                        }
-                    }
-                },
-
-                _addHeader: function VirtualizeContentsView_addHeader(fragment, groupIndex) {
-                    var that = this;
-                    return this._listView._groups.renderGroup(groupIndex).then(function (header) {
-                        if (header) {
-                            header.element.tabIndex = 0;
-                            var placeholder = that._getHeaderContainer(groupIndex);
-                            if (header.element.parentNode !== placeholder) {
-                                placeholder.appendChild(header.element);
-                                _ElementUtilities.addClass(header.element, _Constants._headerClass);
-                            }
-
-                            that._listView._groups.setDomElement(groupIndex, header.element);
-                        }
-                    });
-                },
-
-                _updateHeaders: function VirtualizeContentsView_updateHeaders(fragment, begin, end) {
-                    var that = this;
-
-                    function updateGroup(index) {
-                        var group = that._listView._groups.group(index);
-                        if (group && !group.header) {
-                            var headerPromise = group.headerPromise;
-                            if (!headerPromise) {
-                                headerPromise = group.headerPromise = that._addHeader(fragment, index);
-                                headerPromise.done(function () {
-                                    group.headerPromise = null;
-                                }, function () {
-                                    group.headerPromise = null;
-                                });
-                            }
-                            return headerPromise;
-                        }
-                        return Promise.wrap();
-                    }
-
-                    this._listView._groups.removeElements();
-
-                    var groupStart = this._listView._groups.groupFromItem(begin),
-                        groupIndex = groupStart,
-                        groupEnd = this._listView._groups.groupFromItem(end - 1),
-                        realizationPromises = [];
-
-                    if (groupIndex !== null) {
-                        for (; groupIndex <= groupEnd; groupIndex++) {
-                            realizationPromises.push(updateGroup(groupIndex));
-                        }
-                    }
-
-                    function done() {
-                        that._headerRenderPromises = null;
-                    }
-                    this._headerRenderPromises = Promise.join(realizationPromises, this._headerRenderPromises).then(done, done);
-                    return this._headerRenderPromises || Promise.wrap();
-                },
-
-                _unrealizeItem: function VirtualizeContentsView_unrealizeItem(itemIndex) {
-                    var listView = this._listView,
-                        focusedItemPurged;
-
-                    this._listView._writeProfilerMark("_unrealizeItem(" + itemIndex + "),info");
-
-                    var focused = listView._selection._getFocused();
-                    if (focused.type === _UI.ObjectType.item && focused.index === itemIndex) {
-                        listView._unsetFocusOnItem();
-                        focusedItemPurged = true;
-                    }
-                    var itemData = this.items.itemDataAt(itemIndex),
-                        item = itemData.element,
-                        itemBox = itemData.itemBox;
-
-                    if (itemBox && itemBox.parentNode) {
-                        _ElementUtilities.removeClass(itemBox.parentNode, _Constants._selectedClass);
-                        _ElementUtilities.removeClass(itemBox.parentNode, _Constants._footprintClass);
-                        _ElementUtilities.addClass(itemBox.parentNode, _Constants._backdropClass);
-                        itemBox.parentNode.removeChild(itemBox);
-                    }
-                    itemData.container = null;
-
-                    if (listView._currentMode().itemUnrealized) {
-                        listView._currentMode().itemUnrealized(itemIndex, itemBox);
-                    }
-
-                    this.items.removeItem(itemIndex);
-
-                    // If this wasn't released by the itemsManager already, then
-                    // we remove it. This handles the special case of delete
-                    // occuring on an item that is outside of the current view, but
-                    // has not been cleaned up yet.
-                    //
-                    if (!itemData.removed) {
-                        listView._itemsManager.releaseItem(item);
-                    }
-
-
-                    _Dispose._disposeElement(item);
-
-                    if (focusedItemPurged) {
-                        // If the focused item was purged, we'll still want to focus on it if it comes into view sometime in the future.
-                        // calling _setFocusOnItem once the item is removed from this.items will set up a promise that will be fulfilled
-                        // if the item ever gets reloaded
-                        listView._setFocusOnItem(listView._selection._getFocused());
-                    }
-                },
-
-                _unrealizeGroup: function VirtualizeContentsView_unrealizeGroup(group) {
-                    var headerElement = group.header,
-                        focusedItemPurged;
-
-                    var focused = this._listView._selection._getFocused();
-                    if (focused.type === _UI.ObjectType.groupHeader && this._listView._groups.group(focused.index) === group) {
-                        this._listView._unsetFocusOnItem();
-                        focusedItemPurged = true;
-                    }
-
-                    if (headerElement.parentNode) {
-                        headerElement.parentNode.removeChild(headerElement);
-                    }
-
-                    _Dispose._disposeElement(headerElement);
-
-                    group.header = null;
-                    group.left = -1;
-                    group.top = -1;
-
-                    if (focusedItemPurged) {
-                        this._listView._setFocusOnItem(this._listView._selection._getFocused());
-                    }
-                },
-
-                _unrealizeItems: function VirtualizeContentsView_unrealizeItems(remove) {
-                    var that = this,
-                        removedCount = 0;
-
-                    this.items.eachIndex(function (index) {
-                        if (index < that.begin || index >= that.end) {
-                            that._unrealizeItem(index);
-                            return remove && ++removedCount >= remove;
-                        }
-                    });
-
-                    var groups = this._listView._groups,
-                        beginGroup = groups.groupFromItem(this.begin);
-
-                    if (beginGroup !== null) {
-                        var endGroup = groups.groupFromItem(this.end - 1);
-                        for (var i = 0, len = groups.length() ; i < len; i++) {
-                            var group = groups.group(i);
-                            if ((i < beginGroup || i > endGroup) && group.header) {
-                                this._unrealizeGroup(group);
-                            }
-                        }
-                    }
-                },
-
-                _unrealizeExcessiveItems: function VirtualizeContentsView_unrealizeExcessiveItems() {
-                    var realized = this.items.count(),
-                        needed = this.end - this.begin,
-                        approved = needed + this._listView._maxDeferredItemCleanup;
-
-                    this._listView._writeProfilerMark("_unrealizeExcessiveItems realized(" + realized + ") approved(" + approved + "),info");
-                    if (realized > approved) {
-                        this._unrealizeItems(realized - approved);
-                    }
-                },
-
-                _lazilyUnrealizeItems: function VirtualizeContentsView_lazilyUnrealizeItems() {
-                    this._listView._writeProfilerMark("_lazilyUnrealizeItems,StartTM");
-                    var that = this;
-                    return waitForSeZo(this._listView).then(function () {
-
-                        function done() {
-                            that._listView._writeProfilerMark("_lazilyUnrealizeItems,StopTM");
-                        }
-
-                        if (that._listView._isZombie()) {
-                            done();
-                            return;
-                        }
-
-                        var itemsToUnrealize = [];
-                        that.items.eachIndex(function (index) {
-                            if (index < that.begin || index >= that.end) {
-                                itemsToUnrealize.push(index);
-                            }
-                        });
-
-                        that._listView._writeProfilerMark("_lazilyUnrealizeItems itemsToUnrealize(" + itemsToUnrealize.length + "),info");
-
-                        var groupsToUnrealize = [],
-                            groups = that._listView._groups,
-                            beginGroup = groups.groupFromItem(that.begin);
-
-                        if (beginGroup !== null) {
-                            var endGroup = groups.groupFromItem(that.end - 1);
-                            for (var i = 0, len = groups.length() ; i < len; i++) {
-                                var group = groups.group(i);
-                                if ((i < beginGroup || i > endGroup) && group.header) {
-                                    groupsToUnrealize.push(group);
-                                }
-                            }
-                        }
-
-                        if (itemsToUnrealize.length || groupsToUnrealize.length) {
-                            var job;
-
-                            var promise = new Promise(function (complete) {
-
-                                function unrealizeWorker(info) {
-                                    if (that._listView._isZombie()) { return; }
-
-                                    var firstIndex = -1,
-                                        lastIndex = -1,
-                                        removeCount = 0,
-                                        zooming = shouldWaitForSeZo(that._listView);
-
-                                    while (itemsToUnrealize.length && !zooming && !info.shouldYield) {
-                                        var itemIndex = itemsToUnrealize.shift();
-                                        that._unrealizeItem(itemIndex);
-
-                                        removeCount++;
-                                        if (firstIndex < 0) {
-                                            firstIndex = itemIndex;
-                                        }
-                                        lastIndex = itemIndex;
-                                    }
-                                    that._listView._writeProfilerMark("unrealizeWorker removeItems:" + removeCount + " (" + firstIndex + "-" + lastIndex + "),info");
-
-                                    while (groupsToUnrealize.length && !zooming && !info.shouldYield) {
-                                        that._unrealizeGroup(groupsToUnrealize.shift());
-                                    }
-
-                                    if (itemsToUnrealize.length || groupsToUnrealize.length) {
-                                        if (zooming) {
-                                            info.setPromise(waitForSeZo(that._listView).then(function () {
-                                                return unrealizeWorker;
-                                            }));
-                                        } else {
-                                            info.setWork(unrealizeWorker);
-                                        }
-                                    } else {
-                                        complete();
-                                    }
-                                }
-
-                                job = Scheduler.schedule(unrealizeWorker, Scheduler.Priority.belowNormal, null, "WinJS.UI.ListView._lazilyUnrealizeItems");
-                            });
-
-                            return promise.then(done, function (error) {
-                                job.cancel();
-                                that._listView._writeProfilerMark("_lazilyUnrealizeItems canceled,info");
-                                that._listView._writeProfilerMark("_lazilyUnrealizeItems,StopTM");
-                                return Promise.wrapError(error);
-                            });
-
-                        } else {
-                            done();
-                            return Promise.wrap();
-                        }
-                    });
-                },
-
-                _getBoundingRectString: function VirtualizeContentsView_getBoundingRectString(itemIndex) {
-                    var result;
-                    if (itemIndex >= 0 && itemIndex < this.containers.length) {
-                        var itemPos = this._listView._layout._getItemPosition(itemIndex);
-                        if (itemPos) {
-                            result = "[" + itemPos.left + "; " + itemPos.top + "; " + itemPos.width + "; " + itemPos.height + " ]";
-                        }
-                    }
-                    return result || "";
-                },
-
-                _clearDeferTimeout: function VirtualizeContentsView_clearDeferTimeout() {
-                    if (this.deferTimeout) {
-                        this.deferTimeout.cancel();
-                        this.deferTimeout = null;
-                    }
-                    if (this.deferredActionCancelToken !== -1) {
-                        this._listView._versionManager.clearCancelOnNotification(this.deferredActionCancelToken);
-                        this.deferredActionCancelToken = -1;
-                    }
-                },
-
-                _setupAria: function VirtualizeContentsView_setupAria(timedOut) {
-                    if (this._listView._isZombie()) { return; }
-                    var that = this;
-
-                    function done() {
-                        that._listView._writeProfilerMark("aria work,StopTM");
-                    }
-
-                    function calcLastRealizedIndexInGroup(groupIndex) {
-                        var groups = that._listView._groups,
-                            nextGroup = groups.group(groupIndex + 1);
-                        return (nextGroup ? Math.min(nextGroup.startIndex - 1, that.end - 1) : that.end - 1);
-                    }
-
-                    this._listView._createAriaMarkers();
-                    return this._listView._itemsCount().then(function (count) {
-                        if (count > 0 && that.firstIndexDisplayed !== -1 && that.lastIndexDisplayed !== -1) {
-                            that._listView._writeProfilerMark("aria work,StartTM");
-                            var startMarker = that._listView._ariaStartMarker,
-                                endMarker = that._listView._ariaEndMarker,
-                                index = that.begin,
-                                item = that.items.itemAt(that.begin),
-                                job,
-                                // These are only used when the ListView is using groups
-                                groups,
-                                startGroup,
-                                currentGroup,
-                                group,
-                                lastRealizedIndexInGroup;
-
-                            if (item) {
-                                _ElementUtilities._ensureId(item);
-                                if (that._listView._groupsEnabled()) {
-                                    groups = that._listView._groups;
-                                    startGroup = currentGroup = groups.groupFromItem(that.begin);
-                                    group = groups.group(currentGroup);
-                                    lastRealizedIndexInGroup = calcLastRealizedIndexInGroup(currentGroup);
-                                    _ElementUtilities._ensureId(group.header);
-                                    _ElementUtilities._setAttribute(group.header, "role", that._listView._headerRole);
-                                    _ElementUtilities._setAttribute(group.header, "x-ms-aria-flowfrom", startMarker.id);
-                                    setFlow(group.header, item);
-                                    _ElementUtilities._setAttribute(group.header, "tabindex", that._listView._tabIndex);
-                                } else {
-                                    _ElementUtilities._setAttribute(item, "x-ms-aria-flowfrom", startMarker.id);
-                                }
-
-                                return new Promise(function (completeJobPromise) {
-                                    var skipWait = timedOut;
-                                    job = Scheduler.schedule(function ariaWorker(jobInfo) {
-                                        if (that._listView._isZombie()) {
-                                            done();
-                                            return;
-                                        }
-
-                                        for (; index < that.end; index++) {
-                                            if (!skipWait && shouldWaitForSeZo(that._listView)) {
-                                                jobInfo.setPromise(waitForSeZo(that._listView).then(function (timedOut) {
-                                                    skipWait = timedOut;
-                                                    return ariaWorker;
-                                                }));
-                                                return;
-                                            } else if (jobInfo.shouldYield) {
-                                                jobInfo.setWork(ariaWorker);
-                                                return;
-                                            }
-
-                                            item = that.items.itemAt(index);
-                                            var nextItem = that.items.itemAt(index + 1);
-
-                                            if (nextItem) {
-                                                _ElementUtilities._ensureId(nextItem);
-                                            }
-
-                                            _ElementUtilities._setAttribute(item, "role", that._listView._itemRole);
-                                            _ElementUtilities._setAttribute(item, "aria-setsize", count);
-                                            _ElementUtilities._setAttribute(item, "aria-posinset", index + 1);
-                                            _ElementUtilities._setAttribute(item, "tabindex", that._listView._tabIndex);
-
-                                            if (that._listView._groupsEnabled()) {
-                                                if (index === lastRealizedIndexInGroup || !nextItem) {
-                                                    var nextGroup = groups.group(currentGroup + 1);
-
-                                                    // If group is the last realized group, then nextGroup won't exist in the DOM.
-                                                    // When this is the case, nextItem shouldn't exist.
-                                                    if (nextGroup && nextGroup.header && nextItem) {
-                                                        _ElementUtilities._setAttribute(nextGroup.header, "tabindex", that._listView._tabIndex);
-                                                        _ElementUtilities._setAttribute(nextGroup.header, "role", that._listView._headerRole);
-                                                        _ElementUtilities._ensureId(nextGroup.header);
-                                                        setFlow(item, nextGroup.header);
-                                                        setFlow(nextGroup.header, nextItem);
-                                                    } else {
-                                                        // We're at the last group so flow to the end marker
-                                                        _ElementUtilities._setAttribute(item, "aria-flowto", endMarker.id);
-                                                    }
-
-                                                    currentGroup++;
-                                                    group = nextGroup;
-                                                    lastRealizedIndexInGroup = calcLastRealizedIndexInGroup(currentGroup);
-                                                } else {
-                                                    // This is not the last item in the group so flow to the next item
-                                                    setFlow(item, nextItem);
-                                                }
-                                            } else if (nextItem) {
-                                                // Groups are disabled so as long as we aren't at the last item, flow to the next one
-                                                setFlow(item, nextItem);
-                                            } else {
-                                                // Groups are disabled and we're at the last item, so flow to the end marker
-                                                _ElementUtilities._setAttribute(item, "aria-flowto", endMarker.id);
-                                            }
-                                            if (!nextItem) {
-                                                break;
-                                            }
-                                        }
-
-                                        that._listView._fireAccessibilityAnnotationCompleteEvent(that.begin, index, startGroup, currentGroup - 1);
-
-                                        done();
-                                        completeJobPromise();
-                                    }, Scheduler.Priority.belowNormal, null, "WinJS.UI.ListView._setupAria");
-                                }, function () {
-                                    // Cancellation handler for promise returned by setupAria
-                                    job.cancel();
-                                    done();
-                                });
-                            } else {
-                                // the first item is null
-                                done();
-                            }
-                        } else {
-                            // The count is 0
-                            return Promise.wrap();
-                        }
-                    });
-                },
-
-                _setupDeferredActions: function VirtualizeContentsView_setupDeferredActions() {
-                    this._listView._writeProfilerMark("_setupDeferredActions,StartTM");
-                    var that = this;
-
-                    this._clearDeferTimeout();
-
-                    function cleanUp() {
-                        if (that._listView._isZombie()) { return; }
-                        that.deferTimeout = null;
-                        that._listView._versionManager.clearCancelOnNotification(that.deferredActionCancelToken);
-                        that.deferredActionCancelToken = -1;
-                    }
-
-                    this.deferTimeout = this._lazilyRemoveRedundantItemsBlocks().then(function () {
-                        return Promise.timeout(_Constants._DEFERRED_ACTION);
-                    }).
-                        then(function () {
-                            return waitForSeZo(that._listView);
-                        }).
-                        then(function (timedOut) {
-                            return that._setupAria(timedOut);
-                        }).
-                        then(cleanUp, function (error) {
-                            cleanUp();
-                            return Promise.wrapError(error);
-                        });
-
-                    this.deferredActionCancelToken = this._listView._versionManager.cancelOnNotification(this.deferTimeout);
-                    this._listView._writeProfilerMark("_setupDeferredActions,StopTM");
-                },
-
-                // Sets aria-flowto on _ariaStartMarker and x-ms-aria-flowfrom on _ariaEndMarker. The former
-                // points to either the first visible group header or the first visible item. The latter points
-                // to the last visible item.
-                _updateAriaMarkers: function VirtualizeContentsView_updateAriaMarkers(listViewIsEmpty, firstIndexDisplayed, lastIndexDisplayed) {
-                    var that = this;
-                    if (this._listView._isZombie()) {
-                        return;
-                    }
-
-                    function getFirstVisibleItem() {
-                        return that.items.itemAt(firstIndexDisplayed);
-                    }
-
-                    // At a certain index, the VDS may return null for all items at that index and
-                    // higher. When this is the case, the end marker should point to the last
-                    // non-null item in the visible range.
-                    function getLastVisibleItem() {
-                        for (var i = lastIndexDisplayed; i >= firstIndexDisplayed; i--) {
-                            if (that.items.itemAt(i)) {
-                                return that.items.itemAt(i);
-                            }
-                        }
-                        return null;
-                    }
-
-                    this._listView._createAriaMarkers();
-                    var startMarker = this._listView._ariaStartMarker,
-                        endMarker = this._listView._ariaEndMarker,
-                        firstVisibleItem,
-                        lastVisibleItem;
-
-                    if (firstIndexDisplayed !== -1 && lastIndexDisplayed !== -1 && firstIndexDisplayed <= lastIndexDisplayed) {
-                        firstVisibleItem = getFirstVisibleItem();
-                        lastVisibleItem = getLastVisibleItem();
-                    }
-
-                    if (listViewIsEmpty || !firstVisibleItem || !lastVisibleItem) {
-                        setFlow(startMarker, endMarker);
-                        this._listView._fireAccessibilityAnnotationCompleteEvent(-1, -1);
-                    } else {
-                        _ElementUtilities._ensureId(firstVisibleItem);
-                        _ElementUtilities._ensureId(lastVisibleItem);
-
-                        // Set startMarker's flowto
-                        if (this._listView._groupsEnabled()) {
-                            var groups = this._listView._groups,
-                                firstVisibleGroup = groups.group(groups.groupFromItem(firstIndexDisplayed));
-
-                            if (firstVisibleGroup.header) {
-                                _ElementUtilities._ensureId(firstVisibleGroup.header);
-
-                                if (firstIndexDisplayed === firstVisibleGroup.startIndex) {
-                                    _ElementUtilities._setAttribute(startMarker, "aria-flowto", firstVisibleGroup.header.id);
-                                } else {
-                                    _ElementUtilities._setAttribute(startMarker, "aria-flowto", firstVisibleItem.id);
-                                }
-                            }
-                        } else {
-                            _ElementUtilities._setAttribute(startMarker, "aria-flowto", firstVisibleItem.id);
-                        }
-
-                        // Set endMarker's flowfrom
-                        _ElementUtilities._setAttribute(endMarker, "x-ms-aria-flowfrom", lastVisibleItem.id);
-                    }
-                },
-
-                // Update the ARIA attributes on item that are needed so that Narrator can announce it.
-                // item must be in the items container.
-                updateAriaForAnnouncement: function VirtualizeContentsView_updateAriaForAnnouncement(item, count) {
-                    if (item === this._listView.header || item === this._listView.footer) {
-                        return;
-                    }
-
-                    var index = -1;
-                    var type = _UI.ObjectType.item;
-                    if (_ElementUtilities.hasClass(item, _Constants._headerClass)) {
-                        index = this._listView._groups.index(item);
-                        type = _UI.ObjectType.groupHeader;
-                        _ElementUtilities._setAttribute(item, "role", this._listView._headerRole);
-                        _ElementUtilities._setAttribute(item, "tabindex", this._listView._tabIndex);
-                    } else {
-                        index = this.items.index(item);
-                        _ElementUtilities._setAttribute(item, "aria-setsize", count);
-                        _ElementUtilities._setAttribute(item, "aria-posinset", index + 1);
-                        _ElementUtilities._setAttribute(item, "role", this._listView._itemRole);
-                        _ElementUtilities._setAttribute(item, "tabindex", this._listView._tabIndex);
-                    }
-
-                    if (type === _UI.ObjectType.groupHeader) {
-                        this._listView._fireAccessibilityAnnotationCompleteEvent(-1, -1, index, index);
-                    } else {
-                        this._listView._fireAccessibilityAnnotationCompleteEvent(index, index, -1, -1);
-                    }
-                },
-
-                _reportElementsLevel: function VirtualizeContentsView_reportElementsLevel(direction) {
-                    var items = this.items;
-
-                    function elementsCount(first, last) {
-                        var count = 0;
-                        for (var itemIndex = first; itemIndex <= last; itemIndex++) {
-                            var itemData = items.itemDataAt(itemIndex);
-                            if (itemData && itemData.container) {
-                                count++;
-                            }
-                        }
-                        return count;
-                    }
-
-                    var level;
-                    if (direction === "right") {
-                        level = Math.floor(100 * elementsCount(this.firstIndexDisplayed, this.end - 1) / (this.end - this.firstIndexDisplayed));
-                    } else {
-                        level = Math.floor(100 * elementsCount(this.begin, this.lastIndexDisplayed) / (this.lastIndexDisplayed - this.begin + 1));
-                    }
-
-                    this._listView._writeProfilerMark("elementsLevel level(" + level + "),info");
-                },
-
-                _createHeaderContainer: function VirtualizeContentsView_createHeaderContainer(insertAfter) {
-                    return this._createSurfaceChild(_Constants._headerContainerClass, insertAfter);
-                },
-
-                _createItemsContainer: function VirtualizeContentsView_createItemsContainer(insertAfter) {
-                    var itemsContainer = this._createSurfaceChild(_Constants._itemsContainerClass, insertAfter);
-                    var padder = _Global.document.createElement("div");
-                    padder.className = _Constants._padderClass;
-                    itemsContainer.appendChild(padder);
-                    return itemsContainer;
-                },
-
-                _ensureContainerInDOM: function VirtualizeContentsView_ensureContainerInDOM(index) {
-                    var container = this.containers[index];
-                    if (container && !this._listView._canvas.contains(container)) {
-                        this._forceItemsBlocksInDOM(index, index + 1);
-                        return true;
-                    }
-                    return false;
-                },
-
-                _ensureItemsBlocksInDOM: function VirtualizeContentsView_ensureItemsBlocksInDOM(begin, end) {
-                    if (this._expandedRange) {
-                        var oldBegin = this._expandedRange.first.index,
-                            oldEnd = this._expandedRange.last.index + 1;
-
-                        if (begin <= oldBegin && end > oldBegin) {
-                            end = Math.max(end, oldEnd);
-                        } else if (begin < oldEnd && end >= oldEnd) {
-                            begin = Math.min(begin, oldBegin);
-                        }
-                    }
-                    this._forceItemsBlocksInDOM(begin, end);
-                },
-
-                _removeRedundantItemsBlocks: function VirtualizeContentsView_removeRedundantItemsBlocks() {
-                    if (this.begin !== -1 && this.end !== -1) {
-                        this._forceItemsBlocksInDOM(this.begin, this.end);
-                    }
-                },
-
-                _lazilyRemoveRedundantItemsBlocks: function VirtualizeContentsView_lazilyRemoveRedundantItemsBlocks() {
-                    this._listView._writeProfilerMark("_lazilyRemoveRedundantItemsBlocks,StartTM");
-                    var that = this;
-                    return waitForSeZo(this._listView).then(function () {
-
-                        function done() {
-                            that._listView._writeProfilerMark("_lazilyRemoveRedundantItemsBlocks,StopTM");
-                        }
-
-                        if (that._listView._isZombie()) {
-                            done();
-                            return;
-                        }
-
-                        if (that._expandedRange && that.begin !== -1 && that.end !== -1 && (that._expandedRange.first.index < that.begin || that._expandedRange.last.index + 1 > that.end)) {
-                            var job;
-
-                            var promise = new Promise(function (complete) {
-
-                                function blocksCleanupWorker(info) {
-                                    if (that._listView._isZombie()) { return; }
-
-                                    var zooming = shouldWaitForSeZo(that._listView);
-
-                                    while (that._expandedRange.first.index < that.begin && !zooming && !info.shouldYield) {
-                                        var begin = Math.min(that.begin, that._expandedRange.first.index + that._blockSize * _VirtualizeContentsView._blocksToRelease);
-                                        that._forceItemsBlocksInDOM(begin, that.end);
-                                    }
-
-                                    while (that._expandedRange.last.index + 1 > that.end && !zooming && !info.shouldYield) {
-                                        var end = Math.max(that.end, that._expandedRange.last.index - that._blockSize * _VirtualizeContentsView._blocksToRelease);
-                                        that._forceItemsBlocksInDOM(that.begin, end);
-                                    }
-
-                                    if (that._expandedRange.first.index < that.begin || that._expandedRange.last.index + 1 > that.end) {
-                                        if (zooming) {
-                                            info.setPromise(waitForSeZo(that._listView).then(function () {
-                                                return blocksCleanupWorker;
-                                            }));
-                                        } else {
-                                            info.setWork(blocksCleanupWorker);
-                                        }
-                                    } else {
-                                        complete();
-                                    }
-                                }
-
-                                job = Scheduler.schedule(blocksCleanupWorker, Scheduler.Priority.belowNormal, null, "WinJS.UI.ListView._lazilyRemoveRedundantItemsBlocks");
-                            });
-
-                            return promise.then(done, function (error) {
-                                job.cancel();
-                                that._listView._writeProfilerMark("_lazilyRemoveRedundantItemsBlocks canceled,info");
-                                that._listView._writeProfilerMark("_lazilyRemoveRedundantItemsBlocks,StopTM");
-                                return Promise.wrapError(error);
-                            });
-
-                        } else {
-                            done();
-                            return Promise.wrap();
-                        }
-                    });
-                },
-
-                _forceItemsBlocksInDOM: function VirtualizeContentsView_forceItemsBlocksInDOM(begin, end) {
-                    if (!this._blockSize) {
-                        return;
-                    }
-                    var perfId = "_forceItemsBlocksInDOM begin(" + begin + ") end(" + end + "),";
-                    this._listView._writeProfilerMark(perfId + "StartTM");
-
-                    var that = this,
-                        added = 0,
-                        removed = 0,
-                        paddingProperty = "padding" + (this._listView._horizontal() ? "Left" : "Top");
-
-                    function setPadder(itemsContainer, padding) {
-                        var padder = itemsContainer.element.firstElementChild;
-                        padder.style[paddingProperty] = padding;
-                    }
-
-                    function forEachBlock(callback) {
-                        for (var g = 0; g < that.tree.length; g++) {
-                            var itemsContainer = that.tree[g].itemsContainer;
-                            for (var b = 0, len = itemsContainer.itemsBlocks.length; b < len; b++) {
-                                if (callback(itemsContainer, itemsContainer.itemsBlocks[b])) {
-                                    return;
-                                }
-                            }
-                        }
-                    }
-
-                    function measureItemsBlock(itemsBlock) {
-                        that._listView._writeProfilerMark("_itemsBlockExtent,StartTM");
-                        that._listView._itemsBlockExtent = _ElementUtilities[that._listView._horizontal() ? "getTotalWidth" : "getTotalHeight"](itemsBlock.element);
-                        that._listView._writeProfilerMark("_itemsBlockExtent(" + that._listView._itemsBlockExtent + "),info");
-                        that._listView._writeProfilerMark("_itemsBlockExtent,StopTM");
-                    }
-
-                    function getItemsBlockExtent() {
-                        if (that._listView._itemsBlockExtent === -1) {
-                            // first try blocks already added to the DOM
-                            forEachBlock(function (itemsContainer, itemsBlock) {
-                                if (itemsBlock.items.length === that._blockSize && itemsBlock.element.parentNode === itemsContainer.element) {
-                                    measureItemsBlock(itemsBlock);
-                                    return true;
-                                }
-                                return false;
-                            });
-                        }
-
-                        if (that._listView._itemsBlockExtent === -1) {
-                            forEachBlock(function (itemsContainer, itemsBlock) {
-                                if (itemsBlock.items.length === that._blockSize) {
-                                    itemsContainer.element.appendChild(itemsBlock.element);
-                                    measureItemsBlock(itemsBlock);
-                                    itemsContainer.element.removeChild(itemsBlock.element);
-                                    return true;
-                                }
-                                return false;
-                            });
-                        }
-                        return that._listView._itemsBlockExtent;
-                    }
-
-                    function removeBlocks(itemsContainer, begin, end) {
-
-                        function remove(blockIndex) {
-                            var block = itemsContainer.itemsBlocks[blockIndex];
-                            if (block && block.element.parentNode === itemsContainer.element) {
-                                itemsContainer.element.removeChild(block.element);
-                                removed++;
-                            }
-                        }
-
-                        if (Array.isArray(begin)) {
-                            begin.forEach(remove);
-                        } else {
-                            for (var i = begin; i < end; i++) {
-                                remove(i);
-                            }
-                        }
-                    }
-
-                    function addBlocks(itemsContainer, begin, end) {
-                        var padder = itemsContainer.element.firstElementChild,
-                            previous = padder;
-
-                        for (var i = begin; i < end; i++) {
-                            var block = itemsContainer.itemsBlocks[i];
-                            if (block) {
-                                if (block.element.parentNode !== itemsContainer.element) {
-                                    itemsContainer.element.insertBefore(block.element, previous.nextElementSibling);
-                                    added++;
-                                }
-                                previous = block.element;
-                            }
-                        }
-                    }
-
-                    function collapseGroup(groupIndex) {
-                        if (groupIndex < that.tree.length) {
-                            that._listView._writeProfilerMark("collapseGroup(" + groupIndex + "),info");
-                            var itemsContainer = that.tree[groupIndex].itemsContainer;
-                            removeBlocks(itemsContainer, 0, itemsContainer.itemsBlocks.length);
-                            setPadder(itemsContainer, "");
-                        }
-                    }
-
-                    function expandGroup(groupIndex) {
-                        if (groupIndex < that.tree.length) {
-                            that._listView._writeProfilerMark("expandGroup(" + groupIndex + "),info");
-                            var itemsContainer = that.tree[groupIndex].itemsContainer;
-                            addBlocks(itemsContainer, 0, itemsContainer.itemsBlocks.length);
-                            setPadder(itemsContainer, "");
-                        }
-                    }
-
-                    function removedFromRange(oldRange, newRange) {
-                        function expand(first, last) {
-                            var array = [];
-                            for (var i = first; i <= last; i++) {
-                                array.push(i);
-                            }
-                            return array;
-                        }
-
-                        var newL = newRange[0];
-                        var newR = newRange[1];
-                        var oldL = oldRange[0];
-                        var oldR = oldRange[1];
-
-                        if (newR < oldL || newL > oldR) {
-                            return expand(oldL, oldR);
-                        } else if (newL > oldL && newR < oldR) {
-                            return expand(oldL, newL - 1).concat(expand(newR + 1, oldR));
-                        } else if (oldL < newL) {
-                            return expand(oldL, newL - 1);
-                        } else if (oldR > newR) {
-                            return expand(newR + 1, oldR);
-                        } else {
-                            return null;
-                        }
-                    }
-
-                    var firstGroupIndex = this._listView._groups.groupFromItem(begin),
-                        lastGroupIndex = this._listView._groups.groupFromItem(end - 1);
-
-                    var firstGroup = this._listView._groups.group(firstGroupIndex),
-                        firstItemsContainer = that.tree[firstGroupIndex].itemsContainer;
-
-                    var firstBlock = Math.floor((begin - firstGroup.startIndex) / this._blockSize);
-
-                    var lastGroup = this._listView._groups.group(lastGroupIndex),
-                        lastItemsContainer = that.tree[lastGroupIndex].itemsContainer;
-
-                    var lastBlock = Math.floor((end - 1 - lastGroup.startIndex) / this._blockSize);
-
-                    // if size of structure block is needed try to obtain it before modifying the tree to avoid a layout pass
-                    if (firstBlock && that._listView._itemsBlockExtent === -1) {
-                        forEachBlock(function (itemsContainer, itemsBlock) {
-                            if (itemsBlock.items.length === that._blockSize && itemsBlock.element.parentNode === itemsContainer.element) {
-                                measureItemsBlock(itemsBlock);
-                                return true;
-                            }
-                            return false;
-                        });
-                    }
-
-                    var groupsToCollapse = this._expandedRange ? removedFromRange([this._expandedRange.first.groupIndex, this._expandedRange.last.groupIndex], [firstGroupIndex, lastGroupIndex]) : null;
-                    if (groupsToCollapse) {
-                        groupsToCollapse.forEach(collapseGroup);
-                    }
-
-                    if (this._expandedRange && this._expandedRange.first.groupKey === firstGroup.key) {
-                        var blocksToRemove = removedFromRange([this._expandedRange.first.block, Number.MAX_VALUE], [firstBlock, Number.MAX_VALUE]);
-                        if (blocksToRemove) {
-                            removeBlocks(firstItemsContainer, blocksToRemove);
-                        }
-                    } else if (this._expandedRange && firstGroupIndex >= this._expandedRange.first.groupIndex && firstGroupIndex <= this._expandedRange.last.groupIndex) {
-                        removeBlocks(firstItemsContainer, 0, firstBlock);
-                    }
-
-                    if (firstGroupIndex !== lastGroupIndex) {
-                        addBlocks(firstItemsContainer, firstBlock, firstItemsContainer.itemsBlocks.length);
-                        addBlocks(lastItemsContainer, 0, lastBlock + 1);
-                    } else {
-                        addBlocks(firstItemsContainer, firstBlock, lastBlock + 1);
-                    }
-
-                    if (this._expandedRange && this._expandedRange.last.groupKey === lastGroup.key) {
-                        var blocksToRemove = removedFromRange([0, this._expandedRange.last.block], [0, lastBlock]);
-                        if (blocksToRemove) {
-                            removeBlocks(lastItemsContainer, blocksToRemove);
-                        }
-                    } else if (this._expandedRange && lastGroupIndex >= this._expandedRange.first.groupIndex && lastGroupIndex <= this._expandedRange.last.groupIndex) {
-                        removeBlocks(lastItemsContainer, lastBlock + 1, lastItemsContainer.itemsBlocks.length);
-                    }
-
-                    setPadder(firstItemsContainer, firstBlock ? firstBlock * getItemsBlockExtent() + "px" : "");
-
-                    if (firstGroupIndex !== lastGroupIndex) {
-                        setPadder(lastItemsContainer, "");
-                    }
-
-                    // groups between first and last
-                    for (var i = firstGroupIndex + 1; i < lastGroupIndex; i++) {
-                        expandGroup(i);
-                    }
-
-                    this._expandedRange = {
-                        first: {
-                            index: begin,
-                            groupIndex: firstGroupIndex,
-                            groupKey: firstGroup.key,
-                            block: firstBlock
-                        },
-                        last: {
-                            index: end - 1,
-                            groupIndex: lastGroupIndex,
-                            groupKey: lastGroup.key,
-                            block: lastBlock
-                        },
-                    };
-                    this._listView._writeProfilerMark("_forceItemsBlocksInDOM groups(" + firstGroupIndex + "-" + lastGroupIndex + ") blocks(" + firstBlock + "-" + lastBlock + ") added(" + added + ") removed(" + removed + "),info");
-                    this._listView._writeProfilerMark(perfId + "StopTM");
-                },
-
-                _realizePageImpl: function VirtualizeContentsView_realizePageImpl() {
-                    var that = this;
-
-                    var perfId = "realizePage(scrollPosition:" + this._scrollbarPos + " forceLayout:" + this._forceRelayout + ")";
-                    this._listView._writeProfilerMark(perfId + ",StartTM");
-
-                    // It's safe to skip realizePage, so we just queue up the last request to run when the version manager
-                    // get unlocked.
-                    //
-                    if (this._listView._versionManager.locked) {
-                        this._listView._versionManager.unlocked.done(function () {
-                            if (!that._listView._isZombie()) {
-                                that._listView._batchViewUpdates(_Constants._ViewChange.realize, _Constants._ScrollToPriority.low, that._listView.scrollPosition);
-                            }
-                        });
-                        this._listView._writeProfilerMark(perfId + ",StopTM");
-                        return Promise.cancel;
-                    }
-
-                    return new Promise(function (c) {
-                        var renderingCompleteSignal = new _Signal();
-
-                        function complete() {
-                            c();
-                            renderingCompleteSignal.complete();
-                        }
-
-                        function viewPortPageRealized() {
-                            that._listView._hideProgressBar();
-                            that._state.setLoadingState(that._listView._LoadingState.viewPortLoaded);
-                            if (that._executeAnimations) {
-                                that._setState(RealizingAnimatingState, renderingCompleteSignal.promise);
-                            }
-                        }
-
-                        function pageRealized(count) {
-                            that._updateAriaMarkers(count === 0, that.firstIndexDisplayed, that.lastIndexDisplayed);
-                            that._state.setLoadingState && that._state.setLoadingState(that._listView._LoadingState.itemsLoaded);
-                        }
-
-                        function finish(count) {
-                            that._listView._clearInsertedItems();
-                            that._listView._groups.removeElements();
-                            viewPortPageRealized();
-                            pageRealized(count);
-                            complete();
-                        }
-
-                        that._state.setLoadingState(that._listView._LoadingState.itemsLoading);
-                        if (that._firstLayoutPass) {
-                            that._listView._showProgressBar(that._listView._element, "50%", "50%");
-                        }
-
-                        var count = that.containers.length;
-
-                        if (count) {
-                            // While the zoom animation is played we want to minimize the # of pages
-                            // being fetched to improve TtFF for SeZo scenarios
-                            var pagesToPrefetch = that.maxLeadingPages;
-                            var pagesToRetain = that.maxTrailingPages;
-                            var viewportLength = that._listView._getViewportLength();
-                            var pagesBefore, pagesAfter;
-
-                            if (that._listView._zooming) {
-                                pagesBefore = pagesAfter = 0;
-                            } else if (_VirtualizeContentsView._disableCustomPagesPrefetch) {
-                                pagesBefore = pagesAfter = _VirtualizeContentsView._defaultPagesToPrefetch;
-                            } else {
-                                pagesBefore = (that._direction === "left" ? pagesToPrefetch : pagesToRetain);
-
-                                // Optimize the beginning of the list such that if you scroll, then change direction and start going back towards the beginning of the list,
-                                // we maintain a remainder of pages that can be added to pagesAfter. This ensures that at beginning of the list, which is the common case,
-                                // we always have pagesToPrefetch ahead, even when the scrolling direction is constantly changing.
-                                var pagesShortBehind = Math.max(0, (pagesBefore - (that._scrollbarPos / viewportLength)));
-                                pagesAfter = Math.min(pagesToPrefetch, pagesShortBehind + (that._direction === "right" ? pagesToPrefetch : pagesToRetain));
-                            }
-
-                            var beginningOffset = Math.max(0, that._scrollbarPos - pagesBefore * viewportLength),
-                                  endingOffset = that._scrollbarPos + (1 + pagesAfter) * viewportLength;
-
-                            var range = that._listView._layout.itemsFromRange(beginningOffset, endingOffset - 1);
-                            if ((range.firstIndex < 0 || range.firstIndex >= count) && (range.lastIndex < 0 || range.lastIndex >= count)) {
-                                that.begin = -1;
-                                that.end = -1;
-                                that.firstIndexDisplayed = -1;
-                                that.lastIndexDisplayed = -1;
-                                finish(count);
-                            } else {
-                                var begin = _ElementUtilities._clamp(range.firstIndex, 0, count - 1),
-                                    end = _ElementUtilities._clamp(range.lastIndex + 1, 0, count);
-
-                                var inView = that._listView._layout.itemsFromRange(that._scrollbarPos, that._scrollbarPos + viewportLength - 1),
-                                    firstInView = _ElementUtilities._clamp(inView.firstIndex, 0, count - 1),
-                                    lastInView = _ElementUtilities._clamp(inView.lastIndex, 0, count - 1);
-
-                                if (that._realizationLevel === _VirtualizeContentsView._realizationLevel.skip && !that.lastRealizePass && firstInView === that.firstIndexDisplayed && lastInView === that.lastIndexDisplayed) {
-                                    that.begin = begin;
-                                    that.end = begin + Object.keys(that.items._itemData).length;
-                                    that._updateHeaders(that._listView._canvas, that.begin, that.end).done(function () {
-                                        that.lastRealizePass = null;
-                                        finish(count);
-                                    });
-                                } else if ((that._forceRelayout || begin !== that.begin || end !== that.end || firstInView !== that.firstIndexDisplayed || lastInView !== that.lastIndexDisplayed) && (begin < end) && (beginningOffset < endingOffset)) {
-                                    that._listView._writeProfilerMark("realizePage currentInView(" + firstInView + "-" + lastInView + ") previousInView(" + that.firstIndexDisplayed + "-" + that.lastIndexDisplayed + ") change(" + (firstInView - that.firstIndexDisplayed) + "),info");
-                                    that._cancelRealize();
-                                    // cancelRealize changes the realizePass and resets begin/end
-                                    var currentPass = that._realizePass;
-                                    that.begin = begin;
-                                    that.end = end;
-                                    that.firstIndexDisplayed = firstInView;
-                                    that.lastIndexDisplayed = lastInView;
-                                    that.deletesWithoutRealize = 0;
-
-                                    that._ensureItemsBlocksInDOM(that.begin, that.end);
-
-                                    var realizeWork = that._realizeItems(
-                                        that._listView._itemCanvas,
-                                        that.begin,
-                                        that.end,
-                                        count,
-                                        currentPass,
-                                        that._scrollbarPos,
-                                        that._direction,
-                                        firstInView,
-                                        lastInView,
-                                        that._forceRelayout);
-
-                                    that._forceRelayout = false;
-
-                                    var realizePassWork = realizeWork.viewportItemsRealized.then(function () {
-                                        viewPortPageRealized();
-                                        return realizeWork.allItemsRealized;
-                                    }).then(function () {
-                                        if (that._realizePass === currentPass) {
-                                            return that._updateHeaders(that._listView._canvas, that.begin, that.end).then(function () {
-                                                pageRealized(count);
-                                            });
-                                        }
-                                    }).then(function () {
-                                        return realizeWork.loadingCompleted;
-                                    }).then(
-                                        function () {
-                                            that._unrealizeExcessiveItems();
-                                            that.lastRealizePass = null;
-                                            complete();
-                                        },
-                                        function (e) {
-                                            if (that._realizePass === currentPass) {
-                                                that.lastRealizePass = null;
-                                                that.begin = -1;
-                                                that.end = -1;
-                                            }
-                                            return Promise.wrapError(e);
-                                        }
-                                    );
-
-                                    that.lastRealizePass = Promise.join([realizeWork.viewportItemsRealized, realizeWork.allItemsRealized, realizeWork.loadingCompleted, realizePassWork]);
-
-                                    that._unrealizeExcessiveItems();
-
-                                } else if (!that.lastRealizePass) {
-                                    // We are currently in the "itemsLoading" state and need to get back to "complete". The
-                                    // previous realize pass has been completed so proceed to the other states.
-                                    finish(count);
-                                } else {
-                                    that.lastRealizePass.then(complete);
-                                }
-                            }
-                        } else {
-                            that.begin = -1;
-                            that.end = -1;
-                            that.firstIndexDisplayed = -1;
-                            that.lastIndexDisplayed = -1;
-
-                            finish(count);
-                        }
-
-                        that._reportElementsLevel(that._direction);
-
-                        that._listView._writeProfilerMark(perfId + ",StopTM");
-                    });
-                },
-
-                realizePage: function VirtualizeContentsView_realizePage(scrollToFunctor, forceRelayout, scrollEndPromise, StateType) {
-                    this._scrollToFunctor = makeFunctor(scrollToFunctor);
-                    this._forceRelayout = this._forceRelayout || forceRelayout;
-                    this._scrollEndPromise = scrollEndPromise;
-
-                    this._listView._writeProfilerMark(this._state.name + "_realizePage,info");
-                    this._state.realizePage(StateType || RealizingState);
-                },
-
-                onScroll: function VirtualizeContentsView_onScroll(scrollToFunctor, scrollEndPromise) {
-                    this.realizePage(scrollToFunctor, false, scrollEndPromise, ScrollingState);
-                },
-
-                reload: function VirtualizeContentsView_reload(scrollToFunctor, highPriority) {
-                    if (this._listView._isZombie()) { return; }
-
-                    this._scrollToFunctor = makeFunctor(scrollToFunctor);
-                    this._forceRelayout = true;
-                    this._highPriorityRealize = !!highPriority;
-
-                    this.stopWork(true);
-
-                    this._listView._writeProfilerMark(this._state.name + "_rebuildTree,info");
-                    this._state.rebuildTree();
-                },
-
-                refresh: function VirtualizeContentsView_refresh(scrollToFunctor) {
-                    if (this._listView._isZombie()) { return; }
-
-                    this._scrollToFunctor = makeFunctor(scrollToFunctor);
-                    this._forceRelayout = true;
-                    this._highPriorityRealize = true;
-
-                    this.stopWork();
-
-                    this._listView._writeProfilerMark(this._state.name + "_relayout,info");
-                    this._state.relayout();
-                },
-
-                waitForValidScrollPosition: function VirtualizeContentsView_waitForValidScrollPosition(newPosition) {
-                    var that = this;
-                    var currentMaxScroll = this._listView._viewport[this._listView._scrollLength] - this._listView._getViewportLength();
-                    if (newPosition > currentMaxScroll) {
-                        return that._listView._itemsCount().then(function (count) {
-                            // Wait until we have laid out enough containers to be able to set the scroll position to newPosition
-                            if (that.containers.length < count) {
-                                return Promise._cancelBlocker(that._creatingContainersWork && that._creatingContainersWork.promise).then(function () {
-                                    return that._getLayoutCompleted();
-                                }).then(function () {
-                                    return newPosition;
-                                });
-                            } else {
-                                return newPosition;
-                            }
-                        });
-                    } else {
-                        return Promise.wrap(newPosition);
-                    }
-                },
-
-                waitForEntityPosition: function VirtualizeContentsView_waitForEntityPosition(entity) {
-                    var that = this;
-                    if (entity.type === _UI.ObjectType.header || entity.type === _UI.ObjectType.footer) {
-                        // Headers and footers are always laid out by the ListView as soon as it gets them, so there's nothing to wait on
-                        return Promise.wrap();
-                    }
-                    this._listView._writeProfilerMark(this._state.name + "_waitForEntityPosition" + "(" + entity.type + ": " + entity.index + ")" + ",info");
-                    return Promise._cancelBlocker(this._state.waitForEntityPosition(entity).then(function () {
-                        if ((entity.type !== _UI.ObjectType.groupHeader && entity.index >= that.containers.length) ||
-                            (entity.type === _UI.ObjectType.groupHeader && that._listView._groups.group(entity.index).startIndex >= that.containers.length)) {
-                            return that._creatingContainersWork && that._creatingContainersWork.promise;
-                        }
-                    }).then(function () {
-                        return that._getLayoutCompleted();
-                    }));
-                },
-
-                stopWork: function VirtualizeContentsView_stopWork(stopTreeCreation) {
-                    this._listView._writeProfilerMark(this._state.name + "_stop,info");
-                    this._state.stop(stopTreeCreation);
-
-                    if (this._layoutWork) {
-                        this._layoutWork.cancel();
-                    }
-
-                    if (stopTreeCreation && this._creatingContainersWork) {
-                        this._creatingContainersWork.cancel();
-                    }
-
-                    if (stopTreeCreation) {
-                        this._state = new CreatedState(this);
-                    }
-                },
-
-                _cancelRealize: function VirtualizeContentsView_cancelRealize() {
-                    this._listView._writeProfilerMark("_cancelRealize,StartTM");
-
-                    if (this.lastRealizePass || this.deferTimeout) {
-                        this._forceRelayout = true;
-                    }
-
-                    this._clearDeferTimeout();
-                    this._realizePass++;
-
-                    if (this._headerRenderPromises) {
-                        this._headerRenderPromises.cancel();
-                        this._headerRenderPromises = null;
-                    }
-
-                    var last = this.lastRealizePass;
-                    if (last) {
-                        this.lastRealizePass = null;
-                        this.begin = -1;
-                        this.end = -1;
-                        last.cancel();
-                    }
-                    this._listView._writeProfilerMark("_cancelRealize,StopTM");
-                },
-
-                resetItems: function VirtualizeContentsView_resetItems(unparent) {
-                    if (!this._listView._isZombie()) {
-                        this.firstIndexDisplayed = -1;
-                        this.lastIndexDisplayed = -1;
-                        this._runningAnimations = null;
-                        this._executeAnimations = false;
-
-                        var listView = this._listView;
-                        this._firstLayoutPass = true;
-                        listView._unsetFocusOnItem();
-                        if (listView._currentMode().onDataChanged) {
-                            listView._currentMode().onDataChanged();
-                        }
-
-                        this.items.each(function (index, item) {
-                            if (unparent && item.parentNode && item.parentNode.parentNode) {
-                                item.parentNode.parentNode.removeChild(item.parentNode);
-                            }
-                            listView._itemsManager.releaseItem(item);
-                            _Dispose._disposeElement(item);
-                        });
-
-                        this.items.removeItems();
-                        this._deferredReparenting = [];
-
-                        if (unparent) {
-                            listView._groups.removeElements();
-                        }
-
-                        listView._clearInsertedItems();
-                    }
-                },
-
-                reset: function VirtualizeContentsView_reset() {
-                    this.stopWork(true);
-                    this._state = new CreatedState(this);
-
-                    this.resetItems();
-
-                    // when in the zombie state, we let disposal cleanup the ScrollView state
-                    //
-                    if (!this._listView._isZombie()) {
-                        var listView = this._listView;
-                        listView._groups.resetGroups();
-                        listView._resetCanvas();
-
-                        this.tree = null;
-                        this.keyToGroupIndex = null;
-                        this.containers = null;
-                        this._expandedRange = null;
-                    }
-                },
-
-                cleanUp: function VirtualizeContentsView_cleanUp() {
-                    this.stopWork(true);
-
-                    this._runningAnimations && this._runningAnimations.cancel();
-                    var itemsManager = this._listView._itemsManager;
-                    this.items.each(function (index, item) {
-                        itemsManager.releaseItem(item);
-                        _Dispose._disposeElement(item);
-                    });
-                    this._listView._unsetFocusOnItem();
-                    this.items.removeItems();
-                    this._deferredReparenting = [];
-                    this._listView._groups.resetGroups();
-                    this._listView._resetCanvas();
-
-                    this.tree = null;
-                    this.keyToGroupIndex = null;
-                    this.containers = null;
-                    this._expandedRange = null;
-
-                    this.destroyed = true;
-                },
-
-                getContainer: function VirtualizeContentsView_getContainer(itemIndex) {
-                    return this.containers[itemIndex];
-                },
-
-                _getHeaderContainer: function VirtualizeContentsView_getHeaderContainer(groupIndex) {
-                    return this.tree[groupIndex].header;
-                },
-
-                _getGroups: function VirtualizeContentsView_getGroups(count) {
-                    if (this._listView._groupDataSource) {
-                        var groupsContainer = this._listView._groups.groups,
-                            groups = [];
-                        if (count) {
-                            for (var i = 0, len = groupsContainer.length; i < len; i++) {
-                                var group = groupsContainer[i],
-                                    nextStartIndex = i + 1 < len ? groupsContainer[i + 1].startIndex : count;
-                                groups.push({
-                                    key: group.key,
-                                    size: nextStartIndex - group.startIndex
-                                });
-                            }
-                        }
-                        return groups;
-                    } else {
-                        return [{ key: "-1", size: count }];
-                    }
-                },
-
-                // Overridden by tests.
-                // Tests should have _createChunk return true when they want _createContainers to stop creating containers.
-                _createChunk: function VirtualizeContentsView_createChunk(groups, count, chunkSize) {
-                    var that = this;
-
-                    this._listView._writeProfilerMark("createChunk,StartTM");
-
-                    function addToGroup(itemsContainer, groupSize) {
-                        var children = itemsContainer.element.children,
-                            oldSize = children.length,
-                            toAdd = Math.min(groupSize - itemsContainer.items.length, chunkSize);
-
-                        _SafeHtml.insertAdjacentHTMLUnsafe(itemsContainer.element, "beforeend", _Helpers._repeat("<div class='win-container win-backdrop'></div>", toAdd));
-
-                        for (var i = 0; i < toAdd; i++) {
-                            var container = children[oldSize + i];
-                            itemsContainer.items.push(container);
-                            that.containers.push(container);
-                        }
-                    }
-
-                    function newGroup(group) {
-                        var node = {
-                            header: that._listView._groupDataSource ? that._createHeaderContainer() : null,
-                            itemsContainer: {
-                                element: that._createItemsContainer(),
-                                items: []
-                            }
-                        };
-
-
-                        that.tree.push(node);
-                        that.keyToGroupIndex[group.key] = that.tree.length - 1;
-                        addToGroup(node.itemsContainer, group.size);
-                    }
-
-                    if (this.tree.length && this.tree.length <= groups.length) {
-                        var last = this.tree[this.tree.length - 1],
-                            finalSize = groups[this.tree.length - 1].size;
-
-                        // check if the last group in the tree already has all items. If not add items to this group
-                        if (last.itemsContainer.items.length < finalSize) {
-                            addToGroup(last.itemsContainer, finalSize);
-                            this._listView._writeProfilerMark("createChunk,StopTM");
-                            return;
-                        }
-                    }
-
-                    if (this.tree.length < groups.length) {
-                        newGroup(groups[this.tree.length]);
-                    }
-
-                    this._listView._writeProfilerMark("createChunk,StopTM");
-                },
-
-                // Overridden by tests.
-                // Tests should have _createChunkWithBlocks return true when they want _createContainers to stop creating containers.
-                _createChunkWithBlocks: function VirtualizeContentsView_createChunkWithBlocks(groups, count, blockSize, chunkSize) {
-                    var that = this;
-                    this._listView._writeProfilerMark("createChunk,StartTM");
-
-                    function addToGroup(itemsContainer, toAdd) {
-                        var indexOfNextGroupItem;
-                        var lastExistingBlock = itemsContainer.itemsBlocks.length ? itemsContainer.itemsBlocks[itemsContainer.itemsBlocks.length - 1] : null;
-
-                        toAdd = Math.min(toAdd, chunkSize);
-
-                        // 1) Add missing containers to the latest itemsblock if it was only partially filled during the previous pass.
-                        if (lastExistingBlock && lastExistingBlock.items.length < blockSize) {
-                            var emptySpotsToFill = Math.min(toAdd, blockSize - lastExistingBlock.items.length),
-                                sizeOfOldLastBlock = lastExistingBlock.items.length,
-
-                            indexOfNextGroupItem = (itemsContainer.itemsBlocks.length - 1) * blockSize + sizeOfOldLastBlock;
-                            var containersMarkup = _Helpers._stripedContainers(emptySpotsToFill, indexOfNextGroupItem);
-
-                            _SafeHtml.insertAdjacentHTMLUnsafe(lastExistingBlock.element, "beforeend", containersMarkup);
-                            children = lastExistingBlock.element.children;
-
-                            for (var j = 0; j < emptySpotsToFill; j++) {
-                                var child = children[sizeOfOldLastBlock + j];
-                                lastExistingBlock.items.push(child);
-                                that.containers.push(child);
-                            }
-
-                            toAdd -= emptySpotsToFill;
-                        }
-                        indexOfNextGroupItem = itemsContainer.itemsBlocks.length * blockSize;
-
-                        // 2) Generate as many full itemblocks of containers as we can.
-                        var newBlocksCount = Math.floor(toAdd / blockSize),
-                            markup = "",
-                            firstBlockFirstItemIndex = indexOfNextGroupItem,
-                            secondBlockFirstItemIndex = indexOfNextGroupItem + blockSize;
-
-                        if (newBlocksCount > 0) {
-                            var pairOfItemBlocks = [
-                                // Use pairs to ensure that the container striping pattern is maintained regardless if blockSize is even or odd.
-                                "<div class='win-itemsblock'>" + _Helpers._stripedContainers(blockSize, firstBlockFirstItemIndex) + "</div>",
-                                "<div class='win-itemsblock'>" + _Helpers._stripedContainers(blockSize, secondBlockFirstItemIndex) + "</div>"
-                            ];
-                            markup = _Helpers._repeat(pairOfItemBlocks, newBlocksCount);
-                            indexOfNextGroupItem += (newBlocksCount * blockSize);
-                        }
-
-                        // 3) Generate and partially fill, one last itemblock if there are any remaining containers to add.
-                        var sizeOfNewLastBlock = toAdd % blockSize;
-                        if (sizeOfNewLastBlock > 0) {
-                            markup += "<div class='win-itemsblock'>" + _Helpers._stripedContainers(sizeOfNewLastBlock, indexOfNextGroupItem) + "</div>";
-                            indexOfNextGroupItem += sizeOfNewLastBlock;
-                            newBlocksCount++;
-                        }
-
-                        var blocksTemp = _Global.document.createElement("div");
-                        _SafeHtml.setInnerHTMLUnsafe(blocksTemp, markup);
-                        var children = blocksTemp.children;
-
-                        for (var i = 0; i < newBlocksCount; i++) {
-                            var block = children[i],
-                                blockNode = {
-                                    element: block,
-                                    items: _Helpers._nodeListToArray(block.children)
-                                };
-                            itemsContainer.itemsBlocks.push(blockNode);
-                            for (var n = 0; n < blockNode.items.length; n++) {
-                                that.containers.push(blockNode.items[n]);
-                            }
-                        }
-                    }
-
-                    function newGroup(group) {
-                        var node = {
-                            header: that._listView._groupDataSource ? that._createHeaderContainer() : null,
-                            itemsContainer: {
-                                element: that._createItemsContainer(),
-                                itemsBlocks: []
-                            }
-                        };
-
-                        that.tree.push(node);
-                        that.keyToGroupIndex[group.key] = that.tree.length - 1;
-
-                        addToGroup(node.itemsContainer, group.size);
-                    }
-
-                    if (this.tree.length && this.tree.length <= groups.length) {
-                        var lastContainer = this.tree[this.tree.length - 1].itemsContainer,
-                            finalSize = groups[this.tree.length - 1].size,
-                            currentSize = 0;
-
-                        if (lastContainer.itemsBlocks.length) {
-                            currentSize = (lastContainer.itemsBlocks.length - 1) * blockSize + lastContainer.itemsBlocks[lastContainer.itemsBlocks.length - 1].items.length;
-                        }
-
-                        if (currentSize < finalSize) {
-                            addToGroup(lastContainer, finalSize - currentSize);
-                            this._listView._writeProfilerMark("createChunk,StopTM");
-                            return;
-                        }
-                    }
-
-                    if (this.tree.length < groups.length) {
-                        newGroup(groups[this.tree.length]);
-                    }
-
-                    this._listView._writeProfilerMark("createChunk,StopTM");
-                },
-
-                _generateCreateContainersWorker: function VirtualizeContentsView_generateCreateContainersWorker() {
-                    var that = this,
-                        counter = 0,
-                        skipWait = false;
-
-                    return function work(info) {
-                        if (!that._listView._versionManager.locked) {
-                            that._listView._itemsCount().then(function (count) {
-                                var zooming = !skipWait && shouldWaitForSeZo(that._listView);
-
-                                if (!zooming) {
-                                    if (that._listView._isZombie()) { return; }
-
-                                    skipWait = false;
-
-                                    var end = _BaseUtils._now() + _VirtualizeContentsView._createContainersJobTimeslice,
-                                        groups = that._getGroups(count),
-                                        startLength = that.containers.length,
-                                        realizedToEnd = that.end === that.containers.length,
-                                        chunkSize = _VirtualizeContentsView._chunkSize;
-
-                                    do {
-                                        that._blockSize ? that._createChunkWithBlocks(groups, count, that._blockSize, chunkSize) : that._createChunk(groups, count, chunkSize);
-                                        counter++;
-                                    } while (that.containers.length < count && _BaseUtils._now() < end);
-
-                                    that._listView._writeProfilerMark("createContainers yields containers(" + that.containers.length + "),info");
-
-                                    that._listView._affectedRange.add({ start: startLength, end: that.containers.length }, count);
-
-                                    if (realizedToEnd) {
-                                        that.stopWork();
-                                        that._listView._writeProfilerMark(that._state.name + "_relayout,info");
-                                        that._state.relayout();
-                                    } else {
-                                        that._listView._writeProfilerMark(that._state.name + "_layoutNewContainers,info");
-                                        that._state.layoutNewContainers();
-                                    }
-
-                                    if (that.containers.length < count) {
-                                        info.setWork(work);
-                                    } else {
-                                        that._listView._writeProfilerMark("createContainers completed steps(" + counter + "),info");
-                                        that._creatingContainersWork.complete();
-                                    }
-                                } else {
-                                    // Waiting on zooming
-                                    info.setPromise(waitForSeZo(that._listView).then(function (timedOut) {
-                                        skipWait = timedOut;
-                                        return work;
-                                    }));
-                                }
-                            });
-                        } else {
-                            // Version manager locked
-                            info.setPromise(that._listView._versionManager.unlocked.then(function () {
-                                return work;
-                            }));
-                        }
-                    };
-                },
-
-                _scheduleLazyTreeCreation: function VirtualizeContentsView_scheduleLazyTreeCreation() {
-                    return Scheduler.schedule(this._generateCreateContainersWorker(), Scheduler.Priority.idle, this, "WinJS.UI.ListView.LazyTreeCreation");
-                },
-
-                _createContainers: function VirtualizeContentsView_createContainers() {
-                    this.tree = null;
-                    this.keyToGroupIndex = null;
-                    this.containers = null;
-                    this._expandedRange = null;
-
-                    var that = this,
-                        count;
-
-                    return this._listView._itemsCount().then(function (c) {
-                        if (c === 0) {
-                            that._listView._hideProgressBar();
-                        }
-                        count = c;
-                        that._listView._writeProfilerMark("createContainers(" + count + "),StartTM");
-                        if (that._listView._groupDataSource) {
-                            return that._listView._groups.initialize();
-                        }
-                    }).then(function () {
-                        that._listView._writeProfilerMark("numberOfItemsPerItemsBlock,StartTM");
-                        return (count && that._listView._groups.length() ? that._listView._layout.numberOfItemsPerItemsBlock : null);
-                    }).then(function (blockSize) {
-                        that._listView._writeProfilerMark("numberOfItemsPerItemsBlock(" + blockSize + "),info");
-                        that._listView._writeProfilerMark("numberOfItemsPerItemsBlock,StopTM");
-
-                        that._listView._resetCanvas();
-
-                        that.tree = [];
-                        that.keyToGroupIndex = {};
-                        that.containers = [];
-                        that._blockSize = blockSize;
-
-                        var groups = that._getGroups(count);
-
-                        var end = _BaseUtils._now() + _VirtualizeContentsView._maxTimePerCreateContainers,
-                            chunkSize = Math.min(_VirtualizeContentsView._startupChunkSize, _VirtualizeContentsView._chunkSize);
-                        var stop;
-                        do {
-                            // Tests override _createChunk/_createChunkWithBlocks and take advantage of its boolean return value
-                            // to stop initial container creation after a certain number of containers have been created.
-                            stop = blockSize ? that._createChunkWithBlocks(groups, count, blockSize, chunkSize) : that._createChunk(groups, count, chunkSize);
-                        } while (_BaseUtils._now() < end && that.containers.length < count && !stop);
-
-                        that._listView._writeProfilerMark("createContainers created(" + that.containers.length + "),info");
-
-                        that._listView._affectedRange.add({ start: 0, end: that.containers.length }, count);
-
-                        if (that.containers.length < count) {
-                            var jobNode = that._scheduleLazyTreeCreation();
-
-                            that._creatingContainersWork.promise.done(null, function () {
-                                jobNode.cancel();
-                            });
-                        } else {
-                            that._listView._writeProfilerMark("createContainers completed synchronously,info");
-                            that._creatingContainersWork.complete();
-                        }
-
-                        that._listView._writeProfilerMark("createContainers(" + count + "),StopTM");
-                    });
-                },
-
-                _updateItemsBlocks: function VirtualizeContentsView_updateItemsBlocks(blockSize) {
-                    var that = this;
-                    var usingStructuralNodes = !!blockSize;
-
-                    function createNewBlock() {
-                        var element = _Global.document.createElement("div");
-                        element.className = _Constants._itemsBlockClass;
-                        return element;
-                    }
-
-                    function updateGroup(itemsContainer, startIndex) {
-                        var blockElements = [],
-                            itemsCount = 0,
-                            blocks = itemsContainer.itemsBlocks,
-                            b;
-
-                        function rebuildItemsContainer() {
-                            itemsContainer.itemsBlocks = null;
-                            itemsContainer.items = [];
-                            for (var i = 0; i < itemsCount; i++) {
-                                var container = that.containers[startIndex + i];
-                                itemsContainer.element.appendChild(container);
-                                itemsContainer.items.push(container);
-                            }
-                        }
-
-                        function rebuildItemsContainerWithBlocks() {
-                            itemsContainer.itemsBlocks = [{
-                                element: blockElements.length ? blockElements.shift() : createNewBlock(),
-                                items: []
-                            }];
-                            var currentBlock = itemsContainer.itemsBlocks[0];
-                            for (var i = 0; i < itemsCount; i++) {
-                                if (currentBlock.items.length === blockSize) {
-                                    var nextBlock = blockElements.length ? blockElements.shift() : createNewBlock();
-                                    itemsContainer.itemsBlocks.push({
-                                        element: nextBlock,
-                                        items: []
-                                    });
-                                    currentBlock = itemsContainer.itemsBlocks[itemsContainer.itemsBlocks.length - 1];
-                                }
-
-                                var container = that.containers[startIndex + i];
-                                currentBlock.element.appendChild(container);
-                                currentBlock.items.push(container);
-                            }
-                            itemsContainer.items = null;
-                        }
-
-                        if (blocks) {
-                            for (b = 0; b < blocks.length; b++) {
-                                itemsCount += blocks[b].items.length;
-                                blockElements.push(blocks[b].element);
-                            }
-                        } else {
-                            itemsCount = itemsContainer.items.length;
-                        }
-
-                        if (usingStructuralNodes) {
-                            rebuildItemsContainerWithBlocks();
-                        } else {
-                            rebuildItemsContainer();
-                        }
-
-                        for (b = 0; b < blockElements.length; b++) {
-                            var block = blockElements[b];
-                            if (block.parentNode === itemsContainer.element) {
-                                itemsContainer.element.removeChild(block);
-                            }
-                        }
-
-                        return itemsCount;
-                    }
-
-                    for (var g = 0, startIndex = 0; g < this.tree.length; g++) {
-                        startIndex += updateGroup(this.tree[g].itemsContainer, startIndex);
-                    }
-
-                    that._blockSize = blockSize;
-                },
-
-                _layoutItems: function VirtualizeContentsView_layoutItems() {
-                    var that = this;
-                    return this._listView._itemsCount().then(function () {
-                        return Promise.as(that._listView._layout.numberOfItemsPerItemsBlock).then(function (blockSize) {
-                            that._listView._writeProfilerMark("numberOfItemsPerItemsBlock(" + blockSize + "),info");
-                            if (blockSize !== that._blockSize) {
-                                that._updateItemsBlocks(blockSize);
-                                that._listView._itemsBlockExtent = -1;
-                            }
-
-                            var affectedRange = that._listView._affectedRange.get();
-                            var changedRange;
-
-                            // We accumulate all changes that occur between layouts in _affectedRange. If layout is interrupted due to additional
-                            // modifications, _affectedRange will become the union of the previous range of changes and the new range of changes
-                            // and will be passed to layout again. _affectedRange is reset whenever layout completes.
-                            if (affectedRange) {
-                                changedRange = {
-                                    // _affectedRange is stored in the format [start, end), layout expects a range in the form of [firstIndex , lastIndex]
-                                    // To ensure that layout can successfully use the expected range to find all of the groups which need to be re-laid out
-                                    // we will pad an extra index at the front end such that layout receives [start - 1, end] in form of [lastIndex, firstIndex].
-                                    firstIndex: Math.max(affectedRange.start - 1, 0),
-                                    lastIndex: Math.min(that.containers.length - 1, affectedRange.end) // Account for any constrained upper limits from lazily loaded win-container's.
-                                };
-                                if (changedRange.firstIndex < that.containers.length || that.containers.length === 0) {
-                                    return that._listView._layout.layout(that.tree, changedRange,
-                                        that._modifiedElements || [], that._modifiedGroups || []);
-                                }
-                            }
-
-                            // There is nothing to layout.
-                            that._listView._affectedRange.clear();
-                            return {
-                                realizedRangeComplete: Promise.wrap(),
-                                layoutComplete: Promise.wrap()
-                            };
-                        });
-                    });
-                },
-
-                updateTree: function VirtualizeContentsView_updateTree(count, delta, modifiedElements) {
-                    this._listView._writeProfilerMark(this._state.name + "_updateTree,info");
-                    return this._state.updateTree(count, delta, modifiedElements);
-                },
-
-                _updateTreeImpl: function VirtualizeContentsView_updateTreeImpl(count, delta, modifiedElements, skipUnrealizeItems) {
-                    this._executeAnimations = true;
-                    this._modifiedElements = modifiedElements;
-
-                    if (modifiedElements.handled) {
-                        return;
-                    }
-                    modifiedElements.handled = true;
-
-                    this._listView._writeProfilerMark("_updateTreeImpl,StartTM");
-
-                    var that = this,
-                        i;
-
-                    if (!skipUnrealizeItems) {
-                        // If we skip unrealize items, this work will eventually happen when we reach the UnrealizingState. Sometimes,
-                        // it is appropriate to defer the unrealize work in order to optimize scenarios (e.g, edits that happen when we are
-                        // in the CompletedState, that way the animation can start sooner).
-                        this._unrealizeItems();
-                    }
-
-                    function removeElements(array) {
-                        for (var i = 0, len = array.length; i < len; i++) {
-                            var itemBox = array[i];
-                            itemBox.parentNode.removeChild(itemBox);
-                        }
-                    }
-
-                    for (var i = 0, len = modifiedElements.length; i < len; i++) {
-                        if (modifiedElements[i]._itemBox && modifiedElements[i]._itemBox.parentNode) {
-                            _ElementUtilities.removeClass(modifiedElements[i]._itemBox.parentNode, _Constants._selectedClass);
-                        }
-                    }
-
-                    this.items.each(function (index, item, itemData) {
-                        itemData.container && _ElementUtilities.removeClass(itemData.container, _Constants._selectedClass);
-                        itemData.container && _ElementUtilities.addClass(itemData.container, _Constants._backdropClass);
-                    });
-
-                    var removedGroups = this._listView._updateContainers(this._getGroups(count), count, delta, modifiedElements);
-
-                    removeElements(removedGroups.removedHeaders);
-                    removeElements(removedGroups.removedItemsContainers);
-
-                    for (var i = 0, len = modifiedElements.length; i < len; i++) {
-                        var modifiedElement = modifiedElements[i];
-                        if (modifiedElement.newIndex !== -1) {
-                            modifiedElement.element = this.getContainer(modifiedElement.newIndex);
-                            if (!modifiedElement.element) {
-                                throw "Container missing after updateContainers.";
-                            }
-                        } else {
-                            _ElementUtilities.removeClass(modifiedElement.element, _Constants._backdropClass);
-                        }
-                    }
-
-                    // We only need to restore focus if the current focus is within surface
-                    var activeElement = _Global.document.activeElement;
-                    if (this._listView._canvas.contains(activeElement)) {
-                        this._requireFocusRestore = activeElement;
-                    }
-
-                    this._deferredReparenting = [];
-                    this.items.each(function (index, item, itemData) {
-                        var container = that.getContainer(index),
-                            itemBox = itemData.itemBox;
-
-                        if (itemBox && container) {
-                            itemData.container = container;
-                            if (itemBox.parentNode !== container) {
-                                if (index >= that.firstIndexDisplayed && index <= that.lastIndexDisplayed) {
-                                    that._appendAndRestoreFocus(container, itemBox);
-                                } else {
-                                    that._deferredReparenting.push({ itemBox: itemBox, container: container });
-                                }
-                            }
-                            _ElementUtilities.removeClass(container, _Constants._backdropClass);
-
-                            _ElementUtilities[that._listView.selection._isIncluded(index) ? "addClass" : "removeClass"](container, _Constants._selectedClass);
-                            if (!that._listView.selection._isIncluded(index) && _ElementUtilities.hasClass(itemBox, _Constants._selectedClass)) {
-                                _ItemEventsHandler._ItemEventsHandler.renderSelection(itemBox, itemData.element, false, true);
-                            }
-                        }
-                    });
-
-                    this._listView._writeProfilerMark("_updateTreeImpl,StopTM");
-                },
-
-                _completeUpdateTree: function () {
-                    if (this._deferredReparenting) {
-                        var deferredCount = this._deferredReparenting.length;
-                        if (deferredCount > 0) {
-                            var perfId = "_completeReparenting(" + deferredCount + ")";
-                            this._listView._writeProfilerMark(perfId + ",StartTM");
-                            var deferredItem;
-                            for (var i = 0; i < deferredCount; i++) {
-                                deferredItem = this._deferredReparenting[i];
-                                this._appendAndRestoreFocus(deferredItem.container, deferredItem.itemBox);
-                            }
-                            this._deferredReparenting = [];
-                            this._listView._writeProfilerMark(perfId + ",StopTM");
-                        }
-                    }
-                    this._requireFocusRestore = null;
-                },
-
-                _appendAndRestoreFocus: function VirtualizeContentsView_appendAndRestoreFocus(container, itemBox) {
-                    if (itemBox.parentNode !== container) {
-                        var activeElement;
-                        if (this._requireFocusRestore) {
-                            activeElement = _Global.document.activeElement;
-                        }
-
-                        if (this._requireFocusRestore && this._requireFocusRestore === activeElement && (container.contains(activeElement) || itemBox.contains(activeElement))) {
-                            this._listView._unsetFocusOnItem();
-                            activeElement = _Global.document.activeElement;
-                        }
-
-                        _ElementUtilities.empty(container);
-                        container.appendChild(itemBox);
-
-                        if (this._requireFocusRestore && activeElement === this._listView._keyboardEventsHelper) {
-                            var focused = this._listView._selection._getFocused();
-                            if (focused.type === _UI.ObjectType.item && this.items.itemBoxAt(focused.index) === itemBox) {
-                                _ElementUtilities._setActive(this._requireFocusRestore);
-                                this._requireFocusRestore = null;
-                            }
-                        }
-                    }
-                },
-
-                _startAnimations: function VirtualizeContentsView_startAnimations() {
-                    this._listView._writeProfilerMark("startAnimations,StartTM");
-
-                    var that = this;
-                    this._hasAnimationInViewportPending = false;
-                    var animationPromise = Promise.as(this._listView._layout.executeAnimations()).then(function () {
-                        that._listView._writeProfilerMark("startAnimations,StopTM");
-                    });
-                    return animationPromise;
-                },
-
-                _setState: function VirtualizeContentsView_setState(NewStateType, arg) {
-                    if (!this._listView._isZombie()) {
-                        var prevStateName = this._state.name;
-                        this._state = new NewStateType(this, arg);
-                        this._listView._writeProfilerMark(this._state.name + "_enter from(" + prevStateName + "),info");
-                        this._state.enter();
-                    }
-                },
-
-                getAdjacent: function VirtualizeContentsView_getAdjacent(currentFocus, direction) {
-                    var that = this;
-                    return this.waitForEntityPosition(currentFocus).then(function () {
-                        return that._listView._layout.getAdjacent(currentFocus, direction);
-                    });
-                },
-
-                hitTest: function VirtualizeContentsView_hitTest(x, y) {
-                    if (!this._realizedRangeLaidOut) {
-                        var retVal = this._listView._layout.hitTest(x, y);
-                        retVal.index = _ElementUtilities._clamp(retVal.index, -1, this._listView._cachedCount - 1, 0);
-                        retVal.insertAfterIndex = _ElementUtilities._clamp(retVal.insertAfterIndex, -1, this._listView._cachedCount - 1, 0);
-                        return retVal;
-                    } else {
-                        return {
-                            index: -1,
-                            insertAfterIndex: -1
-                        };
-                    }
-                },
-
-                _createTreeBuildingSignal: function VirtualizeContentsView__createTreeBuildingSignal() {
-                    if (!this._creatingContainersWork) {
-                        this._creatingContainersWork = new _Signal();
-
-                        var that = this;
-                        this._creatingContainersWork.promise.done(
-                            function () {
-                                that._creatingContainersWork = null;
-                            },
-                            function () {
-                                that._creatingContainersWork = null;
-                            }
-                        );
-                    }
-                },
-
-                _createLayoutSignal: function VirtualizeContentsView_createLayoutSignal() {
-                    var that = this;
-
-                    if (!this._layoutCompleted) {
-                        this._layoutCompleted = new _Signal();
-
-                        this._layoutCompleted.promise.done(
-                            function () {
-                                that._layoutCompleted = null;
-                            },
-                            function () {
-                                that._layoutCompleted = null;
-                            }
-                        );
-                    }
-
-                    if (!this._realizedRangeLaidOut) {
-                        this._realizedRangeLaidOut = new _Signal();
-                        this._realizedRangeLaidOut.promise.done(
-                            function () {
-                                that._realizedRangeLaidOut = null;
-                            },
-                            function () {
-                                that._realizedRangeLaidOut = null;
-                            }
-                        );
-                    }
-                },
-
-                _getLayoutCompleted: function VirtualizeContentsView_getLayoutCompleted() {
-                    return this._layoutCompleted ? Promise._cancelBlocker(this._layoutCompleted.promise) : Promise.wrap();
-                },
-
-                _createSurfaceChild: function VirtualizeContentsView_createSurfaceChild(className, insertAfter) {
-                    var element = _Global.document.createElement("div");
-                    element.className = className;
-                    this._listView._canvas.insertBefore(element, insertAfter ? insertAfter.nextElementSibling : null);
-                    return element;
-                },
-
-                _executeScrollToFunctor: function VirtualizeContentsView_executeScrollToFunctor() {
-                    var that = this;
-                    return Promise.as(this._scrollToFunctor ? this._scrollToFunctor() : null).then(function (scroll) {
-                        that._scrollToFunctor = null;
-
-                        scroll = scroll || {};
-                        // _scrollbarPos is initialized to 0 in the constructor, and we only set it when a valid integer
-                        // value is passed in order to account for cases when there is not a _scrollToFunctor
-                        if (+scroll.position === scroll.position) {
-                            that._scrollbarPos = scroll.position;
-                        }
-                        that._direction = scroll.direction || "right";
-                    });
-                }
-            }, {
-                _defaultPagesToPrefetch: 2,
-                _iOSMaxLeadingPages: 6,
-                _iOSMaxTrailingPages: 2,
-                _disableCustomPagesPrefetch: false,
-                _waitForSeZoIntervalDuration: 100,
-                _waitForSeZoTimeoutDuration: 500,
-                _chunkSize: 500,
-                _startupChunkSize: 100,
-                _maxTimePerCreateContainers: 5,
-                _createContainersJobTimeslice: 15,
-                _blocksToRelease: 10,
-                _realizationLevel: {
-                    skip: "skip",
-                    realize: "realize",
-                    normal: "normal"
-                }
-            });
-
-
-            function nop() { }
-
-            /*
-            View is in this state before reload is called so during startup, after datasource change etc.
-            */
-
-            var CreatedState = _Base.Class.define(function CreatedState_ctor(view) {
-                this.view = view;
-                this.view._createTreeBuildingSignal();
-                this.view._createLayoutSignal();
-            }, {
-                name: 'CreatedState',
-                enter: function CreatedState_enter() {
-                    this.view._createTreeBuildingSignal();
-                    this.view._createLayoutSignal();
-                },
-                stop: nop,
-                realizePage: nop,
-                rebuildTree: function CreatedState_rebuildTree() {
-                    this.view._setState(BuildingState);
-                },
-                relayout: function CreatedState_relayout() {
-                    this.view._setState(BuildingState);
-                },
-                layoutNewContainers: nop,
-                waitForEntityPosition: function CreatedState_waitForEntityPosition() {
-                    this.view._setState(BuildingState);
-                    return this.view._getLayoutCompleted();
-                },
-                updateTree: nop
-            });
-
-            /*
-            In this state View is building its DOM tree with win-container element for each item in the data set.
-            To build the tree the view needs to know items count or for grouped case the count of groups and the
-            count of items in each group. The view enters this state when the tree needs to be built during
-            startup or rebuild after data source change and etc.
-
-            BuildingState => LayingoutState | CreatedState
-            */
-            var BuildingState = _Base.Class.define(function BuildingState_ctor(view) {
-                this.view = view;
-            }, {
-                name: 'BuildingState',
-                enter: function BuildingState_enter() {
-                    this.canceling = false;
-                    this.view._createTreeBuildingSignal();
-                    this.view._createLayoutSignal();
-
-                    var that = this;
-
-                    // Use a signal to guarantee that this.promise is set before the promise
-                    // handler is executed.
-                    var promiseStoredSignal = new _Signal();
-                    this.promise = promiseStoredSignal.promise.then(function () {
-                        return that.view._createContainers();
-                    }).then(
-                        function () {
-                            that.view._setState(LayingoutState);
-                        },
-                        function (error) {
-                            if (!that.canceling) {
-                                // this is coming from layout. ListView is hidden. We need to raise complete and wait in initial state for further actions
-                                that.view._setState(CreatedState);
-                                that.view._listView._raiseViewComplete();
-                            }
-                            return Promise.wrapError(error);
-                        }
-                    );
-                    promiseStoredSignal.complete();
-                },
-                stop: function BuildingState_stop() {
-                    this.canceling = true;
-                    this.promise.cancel();
-                    this.view._setState(CreatedState);
-                },
-                realizePage: nop,
-                rebuildTree: function BuildingState_rebuildTree() {
-                    this.canceling = true;
-                    this.promise.cancel();
-                    this.enter();
-                },
-                relayout: nop,
-                layoutNewContainers: nop,
-                waitForEntityPosition: function BuildingState_waitForEntityPosition() {
-                    return this.view._getLayoutCompleted();
-                },
-                updateTree: nop
-            });
-
-            /*
-            In this state View waits for the layout to lay out win-container elements. The view enters this state
-            after edits or resize.
-
-            LayingoutState => RealizingState | BuildingState | CanceledState | CompletedState | LayoutCanceledState
-            */
-            var LayingoutState = _Base.Class.define(function LayingoutState_ctor(view, NextStateType) {
-                this.view = view;
-                this.nextStateType = NextStateType || RealizingState;
-            }, {
-                name: 'LayingoutState',
-                enter: function LayingoutState_enter() {
-                    var that = this;
-                    this.canceling = false;
-                    this.view._createLayoutSignal();
-
-                    this.view._listView._writeProfilerMark(this.name + "_enter_layoutItems,StartTM");
-
-                    // Use a signal to guarantee that this.promise is set before the promise
-                    // handler is executed.
-                    var promiseStoredSignal = new _Signal();
-                    this.promise = promiseStoredSignal.promise.then(function () {
-                        return that.view._layoutItems();
-                    }).then(function (layoutPromises) {
-
-                        // View is taking ownership of this promise and it will cancel it in stopWork
-                        that.view._layoutWork = layoutPromises.layoutComplete;
-
-                        return layoutPromises.realizedRangeComplete;
-                    }).then(
-                        function () {
-                            that.view._listView._writeProfilerMark(that.name + "_enter_layoutItems,StopTM");
-
-                            that.view._listView._clearInsertedItems();
-                            that.view._setAnimationInViewportState(that.view._modifiedElements);
-                            that.view._modifiedElements = [];
-                            that.view._modifiedGroups = [];
-
-                            that.view._realizedRangeLaidOut.complete();
-
-                            that.view._layoutWork.then(function () {
-                                that.view._listView._writeProfilerMark(that.name + "_enter_layoutCompleted,info");
-                                that.view._listView._affectedRange.clear();
-                                that.view._layoutCompleted.complete();
-                            });
-
-                            if (!that.canceling) {
-                                that.view._setState(that.nextStateType);
-                            }
-                        },
-                        function (error) {
-                            that.view._listView._writeProfilerMark(that.name + "_enter_layoutCanceled,info");
-
-                            if (!that.canceling) {
-                                // Cancel is coming from layout itself so ListView is hidden or empty. In this case we want to raise loadingStateChanged
-                                that.view.firstIndexDisplayed = that.view.lastIndexDisplayed = -1;
-                                that.view._updateAriaMarkers(true, that.view.firstIndexDisplayed, that.view.lastIndexDisplayed);
-                                that.view._setState(CompletedState);
-                            }
-
-                            return Promise.wrapError(error);
-                        }
-                    );
-                    promiseStoredSignal.complete();
-
-                    if (this.canceling) {
-                        this.promise.cancel();
-                    }
-                },
-                cancelLayout: function LayingoutState_cancelLayout(switchState) {
-                    this.view._listView._writeProfilerMark(this.name + "_cancelLayout,info");
-                    this.canceling = true;
-                    if (this.promise) {
-                        this.promise.cancel();
-                    }
-                    if (switchState) {
-                        this.view._setState(LayoutCanceledState);
-                    }
-                },
-                stop: function LayingoutState_stop() {
-                    this.cancelLayout(true);
-                },
-                realizePage: nop,
-                rebuildTree: function LayingoutState_rebuildTree() {
-                    this.cancelLayout(false);
-                    this.view._setState(BuildingState);
-                },
-                relayout: function LayingoutState_relayout() {
-                    this.cancelLayout(false);
-                    this.enter();
-                },
-                layoutNewContainers: function LayingoutState_layoutNewContainers() {
-                    this.relayout();
-                },
-                waitForEntityPosition: function LayingoutState_waitForEntityPosition() {
-                    return this.view._getLayoutCompleted();
-                },
-                updateTree: function LayingoutState_updateTree(count, delta, modifiedElements) {
-                    return this.view._updateTreeImpl(count, delta, modifiedElements);
-                }
-            });
-
-
-            /*
-            View enters this state when layout is canceled.
-
-            LayoutCanceledState => LayingoutState | BuildingState
-            */
-            var LayoutCanceledState = _Base.Class.define(function LayoutCanceledState_ctor(view) {
-                this.view = view;
-            }, {
-                name: 'LayoutCanceledState',
-                enter: nop,
-                stop: nop,
-                realizePage: function LayoutCanceledState_realizePage() {
-                    this.relayout();
-                },
-                rebuildTree: function LayoutCanceledState_rebuildTree() {
-                    this.view._setState(BuildingState);
-                },
-                relayout: function LayoutCanceledState_relayout() {
-                    this.view._setState(LayingoutState);
-                },
-                layoutNewContainers: function LayoutCanceledState_layoutNewContainers() {
-                    this.relayout();
-                },
-                waitForEntityPosition: function LayoutCanceledState_waitForEntityPosition() {
-                    return this.view._getLayoutCompleted();
-                },
-                updateTree: function LayoutCanceledState_updateTree(count, delta, modifiedElements) {
-                    return this.view._updateTreeImpl(count, delta, modifiedElements);
-                }
-            });
-
-            /*
-            Contents of items in the current viewport and prefetch area is realized during this stage.
-            The view enters this state when items needs to be realized for instance during initialization, edits and resize.
-
-            RealizingState => RealizingAnimatingState | UnrealizingState | LayingoutState | BuildingState | CanceledState
-            */
-            var RealizingState = _Base.Class.define(function RealizingState_ctor(view) {
-                this.view = view;
-                this.nextState = UnrealizingState;
-                this.relayoutNewContainers = true;
-            }, {
-                name: 'RealizingState',
-                enter: function RealizingState_enter() {
-                    var that = this;
-                    var promiseStoredSignal = new _Signal();
-                    this.promise = promiseStoredSignal.promise.then(function () {
-                        return that.view._executeScrollToFunctor();
-                    }).then(function () {
-                        that.relayoutNewContainers = false;
-                        return Promise._cancelBlocker(that.view._realizePageImpl());
-                    }).then(
-                        function () {
-                            if (that.view._state === that) {
-                                that.view._completeUpdateTree();
-                                that.view._listView._writeProfilerMark("RealizingState_to_UnrealizingState");
-                                that.view._setState(that.nextState);
-                            }
-                        },
-                        function (error) {
-                            if (that.view._state === that && !that.canceling) {
-                                that.view._listView._writeProfilerMark("RealizingState_to_CanceledState");
-                                that.view._setState(CanceledState);
-                            }
-                            return Promise.wrapError(error);
-                        }
-                    );
-                    promiseStoredSignal.complete();
-                },
-                stop: function RealizingState_stop() {
-                    this.canceling = true;
-                    this.promise.cancel();
-                    this.view._cancelRealize();
-                    this.view._setState(CanceledState);
-                },
-                realizePage: function RealizingState_realizePage() {
-                    this.canceling = true;
-                    this.promise.cancel();
-                    this.enter();
-                },
-                rebuildTree: function RealizingState_rebuildTree() {
-                    this.stop();
-                    this.view._setState(BuildingState);
-                },
-                relayout: function RealizingState_relayout() {
-                    this.stop();
-                    this.view._setState(LayingoutState);
-                },
-                layoutNewContainers: function RealizingState_layoutNewContainers() {
-                    if (this.relayoutNewContainers) {
-                        this.relayout();
-                    } else {
-                        this.view._createLayoutSignal();
-                        this.view._relayoutInComplete = true;
-                    }
-                },
-                waitForEntityPosition: function RealizingState_waitForEntityPosition() {
-                    return this.view._getLayoutCompleted();
-                },
-                updateTree: function RealizingState_updateTree(count, delta, modifiedElements) {
-                    return this.view._updateTreeImpl(count, delta, modifiedElements);
-                },
-                setLoadingState: function RealizingState_setLoadingState(state) {
-                    this.view._listView._setViewState(state);
-                }
-            });
-
-            /*
-            The view enters this state when the realize pass, animations or unrealizing was canceled or after newContainers have been laid out.
-            In this state view waits for the next call from ListViewImpl. It can be scroll, edit etc.
-
-            CanceledState => RealizingState | ScrollingState | LayingoutState | BuildingState
-            */
-            var CanceledState = _Base.Class.define(function CanceledState_ctor(view) {
-                this.view = view;
-            }, {
-                name: 'CanceledState',
-                enter: nop,
-                stop: function CanceledState_stop() {
-                    // cancelRealize cancels ariaSetup which can still be in progress
-                    this.view._cancelRealize();
-                },
-                realizePage: function CanceledState_realizePage(NewStateType) {
-                    this.stop();
-                    this.view._setState(NewStateType);
-                },
-                rebuildTree: function CanceledState_rebuildTree() {
-                    this.stop();
-                    this.view._setState(BuildingState);
-                },
-                relayout: function CanceledState_relayout(NextStateType) {
-                    this.stop();
-                    this.view._setState(LayingoutState, NextStateType);
-                },
-                layoutNewContainers: function CanceledState_layoutNewContainers() {
-                    this.relayout(CanceledState);
-                },
-                waitForEntityPosition: function CanceledState_waitForEntityPosition() {
-                    return this.view._getLayoutCompleted();
-                },
-                updateTree: function CanceledState_updateTree(count, delta, modifiedElements) {
-                    return this.view._updateTreeImpl(count, delta, modifiedElements);
-                }
-            });
-
-            /*
-            This state is almost identical with RealizingState. Currently the difference is that in this state loadingStateChanged events aren’t
-            raised and after complete the state is switched to ScrollingPausedState to wait until end of scrolling.
-
-            ScrollingState => RealizingAnimatingState | ScrollingPausedState | LayingoutState | BuildingState | CanceledState
-            */
-            var ScrollingState = _Base.Class.derive(RealizingState, function ScrollingState_ctor(view) {
-                this.view = view;
-                this.nextState = ScrollingPausedState;
-                this.relayoutNewContainers = true;
-            }, {
-                name: 'ScrollingState',
-                setLoadingState: function ScrollingState_setLoadingState() {
-                }
-            });
-
-            /*
-            The view waits in this state for end of scrolling which for touch is signaled by MSManipulationStateChanged event and for mouse it is timeout.
-
-            ScrollingPausedState => RealizingAnimatingState | ScrollingPausedState | LayingoutState | BuildingState | CanceledState
-            */
-            var ScrollingPausedState = _Base.Class.derive(CanceledState, function ScrollingPausedState_ctor(view) {
-                this.view = view;
-            }, {
-                name: 'ScrollingPausedState',
-                enter: function ScrollingPausedState_enter() {
-                    var that = this;
-                    this.promise = Promise._cancelBlocker(this.view._scrollEndPromise).then(function () {
-                        that.view._setState(UnrealizingState);
-                    });
-                },
-                stop: function ScrollingPausedState_stop() {
-                    this.promise.cancel();
-                    // cancelRealize cancels ariaSetup which can still be in progress
-                    this.view._cancelRealize();
-                },
-            });
-
-            /*
-            In this state, view unrealizes not needed items and then waits for all renderers to complete.
-
-            UnrealizingState => CompletedState | RealizingState | ScrollingState | LayingoutState | BuildingState | CanceledState
-            */
-            var UnrealizingState = _Base.Class.define(function UnrealizingState_ctor(view) {
-                this.view = view;
-            }, {
-                name: 'UnrealizingState',
-                enter: function UnrealizingState_enter() {
-                    var that = this;
-                    this.promise = this.view._lazilyUnrealizeItems().then(function () {
-                        that.view._listView._writeProfilerMark("_renderCompletePromise wait starts,info");
-                        return that.view._renderCompletePromise;
-                    }).then(function () {
-                        that.view._setState(CompletedState);
-                    });
-                },
-                stop: function UnrealizingState_stop() {
-                    // cancelRealize cancels ariaSetup which can still be in progress
-                    this.view._cancelRealize();
-                    this.promise.cancel();
-                    this.view._setState(CanceledState);
-                },
-                realizePage: function UnrealizingState_realizePage(NewStateType) {
-                    this.promise.cancel();
-                    this.view._setState(NewStateType);
-                },
-                rebuildTree: function UnrealizingState_rebuildTree() {
-                    this.view._setState(BuildingState);
-                },
-                relayout: function UnrealizingState_relayout() {
-                    this.view._setState(LayingoutState);
-                },
-                layoutNewContainers: function UnrealizingState_layoutNewContainers() {
-                    this.view._createLayoutSignal();
-                    this.view._relayoutInComplete = true;
-                },
-                waitForEntityPosition: function UnrealizingState_waitForEntityPosition() {
-                    return this.view._getLayoutCompleted();
-                },
-                updateTree: function UnrealizingState_updateTree(count, delta, modifiedElements) {
-                    return this.view._updateTreeImpl(count, delta, modifiedElements);
-                }
-            });
-
-            /*
-            We enter this state, when there are animations to execute, and we have already fired the viewportloaded event
-
-            RealizingAnimatingState => RealizingState | UnrealizingState | LayingoutState | BuildingState | CanceledState
-            */
-            var RealizingAnimatingState = _Base.Class.define(function RealizingStateAnimating_ctor(view, realizePromise) {
-                this.view = view;
-                this.realizePromise = realizePromise;
-                this.realizeId = 1;
-            }, {
-                name: 'RealizingAnimatingState',
-                enter: function RealizingAnimatingState_enter() {
-                    var that = this;
-
-
-                    this.animating = true;
-                    this.animatePromise = this.view._startAnimations();
-                    this.animateSignal = new _Signal();
-                    this.view._executeAnimations = false;
-
-                    this.animatePromise.done(
-                        function () {
-                            that.animating = false;
-                            if (that.modifiedElements) {
-                                that.view._updateTreeImpl(that.count, that.delta, that.modifiedElements);
-                                that.modifiedElements = null;
-                                that.view._setState(CanceledState);
-                            } else {
-                                that.animateSignal.complete();
-                            }
-                        }, function (error) {
-                            that.animating = false;
-                            return Promise.wrapError(error);
-                        }
-                    );
-
-                    this._waitForRealize();
-                },
-
-                _waitForRealize: function RealizingAnimatingState_waitForRealize() {
-                    var that = this;
-
-                    this.realizing = true;
-                    this.realizePromise.done(function () {
-                        that.realizing = false;
-                    });
-
-                    var currentRealizeId = ++this.realizeId;
-                    Promise.join([this.realizePromise, this.animateSignal.promise]).done(function () {
-                        if (currentRealizeId === that.realizeId) {
-                            that.view._completeUpdateTree();
-                            that.view._listView._writeProfilerMark("RealizingAnimatingState_to_UnrealizingState");
-                            that.view._setState(UnrealizingState);
-                        }
-                    });
-                },
-
-                stop: function RealizingAnimatingState_stop(stopTreeCreation) {
-                    // always cancel realization
-                    this.realizePromise.cancel();
-                    this.view._cancelRealize();
-
-                    // animations are canceled only when tree needs to be rebuilt
-                    if (stopTreeCreation) {
-                        this.animatePromise.cancel();
-                        this.view._setState(CanceledState);
-                    }
-                },
-                realizePage: function RealizingAnimatingState_realizePage() {
-                    if (!this.modifiedElements) {
-                        var that = this;
-                        this.realizePromise = this.view._executeScrollToFunctor().then(function () {
-                            return Promise._cancelBlocker(that.view._realizePageImpl());
-                        });
-                        this._waitForRealize();
-                    }
-                },
-                rebuildTree: function RealizingAnimatingState_rebuildTree() {
-                    this.stop(true);
-                    this.view._setState(BuildingState);
-                },
-                relayout: function RealizingAnimatingState_relayout() {
-                    // Relayout caused by edits should be stopped by updateTree but relayout can be caused by resize or containers creation and in these cases we should stop animations
-                    this.stop(true);
-                    // if tree update was waiting for animations we should do it now
-                    if (this.modifiedElements) {
-                        this.view._updateTreeImpl(this.count, this.delta, this.modifiedElements);
-                        this.modifiedElements = null;
-                    }
-                    this.view._setState(LayingoutState);
-                },
-                layoutNewContainers: function RealizingAnimatingState_layoutNewContainers() {
-                    this.view._createLayoutSignal();
-                    this.view._relayoutInComplete = true;
-                },
-                waitForEntityPosition: function RealizingAnimatingState_waitForEntityPosition() {
-                    return this.view._getLayoutCompleted();
-                },
-                updateTree: function RealizingAnimatingState_updateTree(count, delta, modifiedElements) {
-                    if (this.animating) {
-                        var previousModifiedElements = this.modifiedElements;
-                        this.count = count;
-                        this.delta = delta;
-                        this.modifiedElements = modifiedElements;
-
-                        return previousModifiedElements ? Promise.cancel : this.animatePromise;
-                    } else {
-                        return this.view._updateTreeImpl(count, delta, modifiedElements);
-                    }
-                },
-                setLoadingState: function RealizingAnimatingState_setLoadingState(state) {
-                    this.view._listView._setViewState(state);
-                }
-            });
-
-            /*
-            The view enters this state when the tree is built, layout and realized after animations have
-            finished. The layout can still laying out items outside of realized view during this stage.
-
-            CompletedState => RealizingState | ScrollingState | LayingoutState | BuildingState | LayingoutNewContainersState
-            */
-            var CompletedState = _Base.Class.derive(CanceledState, function CompletedState_ctor(view) {
-                this.view = view;
-            }, {
-                name: 'CompletedState',
-                enter: function CompletedState_enter() {
-                    this._stopped = false;
-                    this.view._setupDeferredActions();
-
-                    this.view._realizationLevel = _VirtualizeContentsView._realizationLevel.normal;
-                    this.view._listView._raiseViewComplete();
-
-                    // _raiseViewComplete will cause user event listener code to run synchronously.
-                    // If any updates are made to the Listview, this state will be stopped by the updater.
-                    // We don't want to change state to LayingoutNewContainersState if that happens.
-                    if (this.view._state === this && this.view._relayoutInComplete && !this._stopped) {
-                        this.view._setState(LayingoutNewContainersState);
-                    }
-                },
-                stop: function CompletedState_stop() {
-                    this._stopped = true;
-                    // Call base class method.
-                    CanceledState.prototype.stop.call(this);
-                },
-                layoutNewContainers: function CompletedState_layoutNewContainers() {
-                    this.view._createLayoutSignal();
-                    this.view._setState(LayingoutNewContainersState);
-                },
-                updateTree: function CompletedState_updateTree(count, delta, modifiedElements) {
-                    return this.view._updateTreeImpl(count, delta, modifiedElements, true);
-                }
-            });
-
-            /*
-            The view waits in this state for previous layout pass to finish.
-
-            LayingoutNewContainersState => RealizingState | ScrollingState | LayingoutState | BuildingState
-            */
-            var LayingoutNewContainersState = _Base.Class.derive(CanceledState, function LayingoutNewContainersState(view) {
-                this.view = view;
-            }, {
-                name: 'LayingoutNewContainersState',
-                enter: function LayingoutNewContainersState_enter() {
-                    var that = this;
-
-                    // _layoutWork is completed when the previous layout pass is done. _getLayoutCompleted will be completed when these new containers are laid out
-                    this.promise = Promise.join([this.view.deferTimeout, this.view._layoutWork]);
-                    this.promise.then(function () {
-                        that.view._relayoutInComplete = false;
-                        that.relayout(CanceledState);
-                    });
-                },
-                stop: function LayingoutNewContainersState_stop() {
-                    // cancelRealize cancels ariaSetup which can still be in progress
-                    this.promise.cancel();
-                    this.view._cancelRealize();
-                },
-                realizePage: function LayingoutNewContainersState_realizePage(NewStateType) {
-                    // in this state realizePage needs to run layout before realizing items
-                    this.stop();
-                    this.view._setState(LayingoutState, NewStateType);
-                },
-                layoutNewContainers: function LayingoutNewContainersState_layoutNewContainers() {
-                    this.view._createLayoutSignal();
-                }
-            });
-
-            return _VirtualizeContentsView;
-        })
-    });
-
-});
-
-
-define('require-style!less/styles-listview',[],function(){});
-
-define('require-style!less/colors-listview',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ListView',[
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Events',
-    '../Core/_Log',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../_Accents',
-    '../Animations',
-    '../Animations/_TransitionAnimation',
-    '../BindingList',
-    '../Promise',
-    '../Scheduler',
-    '../_Signal',
-    '../Utilities/_Control',
-    '../Utilities/_Dispose',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    '../Utilities/_ItemsManager',
-    '../Utilities/_SafeHtml',
-    '../Utilities/_TabContainer',
-    '../Utilities/_UI',
-    '../Utilities/_VersionManager',
-    './ElementResizeInstrument',
-    './ItemContainer/_Constants',
-    './ItemContainer/_ItemEventsHandler',
-    './ListView/_BrowseMode',
-    './ListView/_ErrorMessages',
-    './ListView/_GroupFocusCache',
-    './ListView/_GroupsContainer',
-    './ListView/_Helpers',
-    './ListView/_ItemsContainer',
-    './ListView/_Layouts',
-    './ListView/_SelectionManager',
-    './ListView/_VirtualizeContentsView',
-    'require-style!less/styles-listview',
-    'require-style!less/colors-listview'
-], function listViewImplInit(_Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, _Accents, Animations, _TransitionAnimation, BindingList, Promise, Scheduler, _Signal, _Control, _Dispose, _ElementUtilities, _Hoverable, _ItemsManager, _SafeHtml, _TabContainer, _UI, _VersionManager, _ElementResizeInstrument, _Constants, _ItemEventsHandler, _BrowseMode, _ErrorMessages, _GroupFocusCache, _GroupsContainer, _Helpers, _ItemsContainer, _Layouts, _SelectionManager, _VirtualizeContentsView) {
-    "use strict";
-
-    _Accents.createAccentRule(
-        ".win-listview:not(.win-selectionstylefilled) .win-selectioncheckmarkbackground,\
-         .win-itemcontainer:not(.win-selectionstylefilled) .win-selectioncheckmarkbackground", [
-             { name: "border-color", value: _Accents.ColorTypes.accent },
-             { name: "background-color", value: _Accents.ColorTypes.accent },
-         ]);
-
-    _Accents.createAccentRule(
-        ".win-listview:not(.win-selectionstylefilled) .win-container.win-selected .win-selectionborder,\
-         .win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected .win-selectionborder", [
-            { name: "border-color", value: _Accents.ColorTypes.accent },
-         ]);
-
-    _Accents.createAccentRule(
-        ".win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,\
-         .win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground", [
-             { name: "background-color", value: _Accents.ColorTypes.accent }
-         ]);
-
-    var transformNames = _BaseUtils._browserStyleEquivalents["transform"];
-    var DISPOSE_TIMEOUT = 1000;
-    var controlsToDispose = [];
-    var disposeControlTimeout;
-    var uniqueID = _ElementUtilities._uniqueID;
-
-    function disposeControls() {
-        var temp = controlsToDispose;
-        controlsToDispose = [];
-        temp = temp.filter(function (c) {
-            if (c._isZombie()) {
-                c._dispose();
-                return false;
-            } else {
-                return true;
-            }
-        });
-        controlsToDispose = controlsToDispose.concat(temp);
-    }
-    function scheduleForDispose(lv) {
-        controlsToDispose.push(lv);
-        disposeControlTimeout && disposeControlTimeout.cancel();
-        disposeControlTimeout = Promise.timeout(DISPOSE_TIMEOUT).then(disposeControls);
-    }
-
-    function getOffsetRight(element) {
-        return element.offsetParent ? (element.offsetParent.offsetWidth - element.offsetLeft - element.offsetWidth) : 0;
-    }
-
-    var strings = {
-        get notCompatibleWithSemanticZoom() { return "ListView can only be used with SemanticZoom if randomAccess loading behavior is specified."; },
-        get listViewInvalidItem() { return "Item must provide index, key or description of corresponding item."; },
-        get listViewViewportAriaLabel() { return _Resources._getWinJSString("ui/listViewViewportAriaLabel").value; }
-    };
-
-    var requireSupportedForProcessing = _BaseUtils.requireSupportedForProcessing;
-
-    var ListViewAnimationType = {
-        /// <field locid="WinJS.UI.ListView.ListViewAnimationType.entrance" helpKeyword="WinJS.UI.ListViewAnimationType.entrance">
-        /// The animation plays when the ListView is first displayed.
-        /// </field>
-        entrance: "entrance",
-        /// <field locid="WinJS.UI.ListView.ListViewAnimationType.contentTransition" helpKeyword="WinJS.UI.ListViewAnimationType.contentTransition">
-        /// The animation plays when the ListView is changing its content.
-        /// </field>
-        contentTransition: "contentTransition"
-    };
-
-    // ListView implementation
-
-    _Base.Namespace.define("WinJS.UI", {
-
-        /// <field locid="WinJS.UI.ListView.ListViewAnimationType" helpKeyword="WinJS.UI.ListViewAnimationType">
-        /// Specifies whether the ListView animation is an entrance animation or a transition animation.
-        /// <compatibleWith platform="Windows" minVersion="8.0"/>
-        /// </field>
-        ListViewAnimationType: ListViewAnimationType,
-
-        /// <field>
-        /// <summary locid="WinJS.UI.ListView">
-        /// Displays items in a customizable list or grid.
-        /// </summary>
-        /// </field>
-        /// <icon src="ui_winjs.ui.listview.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.listview.16x16.png" width="16" height="16" />
-        /// <htmlSnippet><![CDATA[<div data-win-control="WinJS.UI.ListView"></div>]]></htmlSnippet>
-        /// <event name="contentanimating" bubbles="true" locid="WinJS.UI.ListView_e:contentanimating">Raised when the ListView is about to play an entrance or a transition animation.</event>
-        /// <event name="iteminvoked" bubbles="true" locid="WinJS.UI.ListView_e:iteminvoked">Raised when the user taps or clicks an item.</event>
-        /// <event name="groupheaderinvoked" bubbles="true" locid="WinJS.UI.ListView_e:groupheaderinvoked">Raised when the user taps or clicks a group header.</event>
-        /// <event name="selectionchanging" bubbles="true" locid="WinJS.UI.ListView_e:selectionchanging">Raised before items are selected or deselected.</event>
-        /// <event name="selectionchanged" bubbles="true" locid="WinJS.UI.ListView_e:selectionchanged">Raised after items are selected or deselected.</event>
-        /// <event name="loadingstatechanged" bubbles="true" locid="WinJS.UI.ListView_e:loadingstatechanged">Raised when the loading state changes.</event>
-        /// <event name="keyboardnavigating" bubbles="true" locid="WinJS.UI.ListView_e:keyboardnavigating">Raised when the focused item changes.</event>
-        /// <event name="itemdragstart" bubbles="true" locid="WinJS.UI.ListView_e:itemdragstart">Raised when the the user begins dragging ListView items.</event>
-        /// <event name="itemdragenter" bubbles="true" locid="WinJS.UI.ListView_e:itemdragenter">Raised when the user drags into the ListView.</event>
-        /// <event name="itemdragend" bubbles="true" locid="WinJS.UI.ListView_e:itemdragend">Raised when a drag operation begun in a ListView ends.</event>
-        /// <event name="itemdragbetween" bubbles="true" locid="WinJS.UI.ListView_e:itemdragbetween">Raised when the user drags between two ListView items.</event>
-        /// <event name="itemdragleave" bubbles="true" locid="WinJS.UI.ListView_e:itemdragleave">Raised when the user drags outside of the ListView region.</event>
-        /// <event name="itemdragchanged" bubbles="true" locid="WinJS.UI.ListView_e:itemdragchanged">Raised when the items being dragged are changed due to a datasource modification.</event>
-        /// <event name="itemdragdrop" bubbles="true" locid="WinJS.UI.ListView_e:itemdragdrop">Raised when the user drops items into the ListView.</event>
-        /// <event name="headervisibilitychanged" bubbles="true" locid="WinJS.UI.ListView_e:headervisibilitychanged">Raised when the header's visibility property changes. </event>
-        /// <event name="footervisibilitychanged" bubbles="true" locid="WinJS.UI.ListView_e:footervisibilitychanged">Raised when the footer's visibility property changes. </event>
-        /// <event name="accessibilityannotationcomplete" bubbles="true" locid="WinJS.UI.ListView_e:accessibilityannotationcomplete">Raised when the accessibility attributes have been added to the ListView items.</event>
-        /// <part name="listView" class="win-listview" locid="WinJS.UI.ListView_part:listView">The entire ListView control.</part>
-        /// <part name="viewport" class="win-viewport" locid="WinJS.UI.ListView_part:viewport">The viewport of the ListView. </part>
-        /// <part name="surface" class="win-surface" locid="WinJS.UI.ListView_part:surface">The scrollable region of the ListView.</part>
-        /// <part name="item" class="win-item" locid="WinJS.UI.ListView_part:item">An item in the ListView.</part>
-        /// <part name="selectionbackground" class="win-selectionbackground" locid="WinJS.UI.ListView_part:selectionbackground">The background of a selection checkmark.</part>
-        /// <part name="selectioncheckmark" class="win-selectioncheckmark" locid="WinJS.UI.ListView_part:selectioncheckmark">A selection checkmark.</part>
-        /// <part name="groupHeader" class="win-groupheader" locid="WinJS.UI.ListView_part:groupHeader">The header of a group.</part>
-        /// <part name="progressbar" class="win-progress" locid="WinJS.UI.ListView_part:progressbar">The progress indicator of the ListView.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        ListView: _Base.Namespace._lazy(function () {
-            var AffectedRange = _Base.Class.define(function () {
-                this.clear();
-            }, {
-                // Marks the union of the current affected range and range as requiring layout
-                add: function (range, itemsCount) {
-                    range._lastKnownSizeOfData = itemsCount; // store this in order to make unions.
-                    if (!this._range) {
-                        this._range = range;
-                    } else {
-                        // Take the union of these two ranges.
-                        this._range.start = Math.min(this._range.start, range.start);
-                        // To accurately calculate the new unioned range 'end' value, we need to convert the current and new range end
-                        // positions into values that represent the remaining number of un-modified items in between the end of the range
-                        // and the end of the list of data.
-                        var previousUnmodifiedItemsFromEnd = (this._range._lastKnownSizeOfData - this._range.end);
-                        var newUnmodifiedItemsFromEnd = (range._lastKnownSizeOfData - range.end);
-                        var finalUnmodifiedItemsFromEnd = Math.min(previousUnmodifiedItemsFromEnd, newUnmodifiedItemsFromEnd);
-                        this._range._lastKnownSizeOfData = range._lastKnownSizeOfData;
-                        // Convert representation of the unioned end position back into a value which matches the above definition of _affecteRange.end
-                        this._range.end = this._range._lastKnownSizeOfData - finalUnmodifiedItemsFromEnd;
-                    }
-                },
-
-                // Marks everything as requiring layout
-                addAll: function () {
-                    this.add({ start: 0, end: Number.MAX_VALUE }, Number.MAX_VALUE);
-                },
-
-                // Marks nothing as requiring layout
-                clear: function () {
-                    this._range = null;
-                },
-
-                get: function () {
-                    return this._range;
-                }
-            });
-
-            var ZoomableView = _Base.Class.define(function ZoomableView_ctor(listView) {
-                // Constructor
-
-                this._listView = listView;
-            }, {
-                // Public methods
-
-                getPanAxis: function () {
-                    return this._listView._getPanAxis();
-                },
-
-                configureForZoom: function (isZoomedOut, isCurrentView, triggerZoom, prefetchedPages) {
-                    this._listView._configureForZoom(isZoomedOut, isCurrentView, triggerZoom, prefetchedPages);
-                },
-
-                setCurrentItem: function (x, y) {
-                    this._listView._setCurrentItem(x, y);
-                },
-
-                getCurrentItem: function () {
-                    return this._listView._getCurrentItem();
-                },
-
-                beginZoom: function () {
-                    return this._listView._beginZoom();
-                },
-
-                positionItem: function (item, position) {
-                    return this._listView._positionItem(item, position);
-                },
-
-                endZoom: function (isCurrentView) {
-                    this._listView._endZoom(isCurrentView);
-                },
-
-                pinching: {
-                    get: function () {
-                        return this._listView._pinching;
-                    },
-                    set: function (value) {
-                        this._listView._pinching = value;
-                    }
-                }
-            });
-
-            var ListView = _Base.Class.define(function ListView_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.ListView.ListView">
-                /// <summary locid="WinJS.UI.ListView.constructor">
-                /// Creates a new ListView.
-                /// </summary>
-                /// <param name="element" domElement="true" locid="WinJS.UI.ListView.constructor_p:element">
-                /// The DOM element that hosts the ListView control.
-                /// </param>
-                /// <param name="options" type="Object" locid="WinJS.UI.ListView.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// Event names must begin with "on". For example, to provide a handler for the selectionchanged event,
-                /// add a property named "onselectionchanged" to the options object and set its value to the event handler.
-                /// </param>
-                /// <returns type="WinJS.UI.ListView" locid="WinJS.UI.ListView.constructor_returnValue">
-                /// The new ListView.
-                /// </returns>
-                /// </signature>
-                element = element || _Global.document.createElement("div");
-
-                this._id = element.id || "";
-                this._writeProfilerMark("constructor,StartTM");
-
-                options = options || {};
-
-                // Attaching JS control to DOM element
-                element.winControl = this;
-                _ElementUtilities.addClass(element, "win-disposable");
-                this._affectedRange = new AffectedRange();
-                this._mutationObserver = new _ElementUtilities._MutationObserver(this._itemPropertyChange.bind(this));
-                this._versionManager = null;
-                this._insertedItems = {};
-                this._element = element;
-                this._startProperty = null;
-                this._scrollProperty = null;
-                this._scrollLength = null;
-                this._scrolling = false;
-                this._zooming = false;
-                this._pinching = false;
-                this._itemsManager = null;
-                this._canvas = null;
-                this._cachedCount = _Constants._UNINITIALIZED;
-                this._loadingState = this._LoadingState.complete;
-                this._firstTimeDisplayed = true;
-                this._currentScrollPosition = 0;
-                this._lastScrollPosition = 0;
-                this._notificationHandlers = [];
-                this._itemsBlockExtent = -1;
-                this._lastFocusedElementInGroupTrack = { type: _UI.ObjectType.item, index: -1 };
-                this._headerFooterVisibilityStatus = { headerVisible: false, footerVisible: false };
-                this._viewportWidth = _Constants._UNINITIALIZED;
-                this._viewportHeight = _Constants._UNINITIALIZED;
-                this._manipulationState = _ElementUtilities._MSManipulationEvent.MS_MANIPULATION_STATE_STOPPED;
-                this._maxDeferredItemCleanup = Number.MAX_VALUE;
-                this._groupsToRemove = {};
-                this._setupInternalTree();
-                this._isCurrentZoomView = true;
-                this._dragSource = false;
-                this._reorderable = false;
-                this._groupFocusCache = new _GroupFocusCache._UnsupportedGroupFocusCache();
-                this._viewChange = _Constants._ViewChange.rebuild;
-                this._scrollToFunctor = null;
-                this._setScrollbarPosition = false;
-                // The view needs to be initialized after the internal tree is setup, because the view uses the canvas node immediately to insert an element in its constructor
-                this._view = new _VirtualizeContentsView._VirtualizeContentsView(this);
-                this._selection = new _SelectionManager._SelectionManager(this);
-                this._createTemplates();
-                this._groupHeaderRenderer = _ItemsManager._trivialHtmlRenderer;
-                this._itemRenderer = _ItemsManager._trivialHtmlRenderer;
-                this._groupHeaderRelease = null;
-                this._itemRelease = null;
-                if (!options.itemDataSource) {
-                    var list = new BindingList.List();
-                    this._dataSource = list.dataSource;
-                } else {
-                    this._dataSource = options.itemDataSource;
-                }
-                this._selectionMode = _UI.SelectionMode.multi;
-                this._tap = _UI.TapBehavior.invokeOnly;
-                this._groupHeaderTap = _UI.GroupHeaderTapBehavior.invoke;
-                this._mode = new _BrowseMode._SelectionMode(this);
-
-                this._groups = new _GroupsContainer._NoGroups(this);
-                this._updateItemsAriaRoles();
-                this._updateGroupHeadersAriaRoles();
-                this._element.setAttribute("aria-multiselectable", this._multiSelection());
-                this._element.tabIndex = -1;
-                this._tabManager.tabIndex = this._tabIndex;
-                if (this._element.style.position !== "absolute" && this._element.style.position !== "relative") {
-                    this._element.style.position = "relative";
-                }
-                this._updateItemsManager();
-                if (!options.layout) {
-                    this._updateLayout(new _Layouts.GridLayout());
-                }
-                this._attachEvents();
-
-                this._runningInit = true;
-                _Control.setOptions(this, options);
-                this._runningInit = false;
-
-                this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.medium, 0);
-                this._writeProfilerMark("constructor,StopTM");
-            }, {
-                // Public properties
-
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.ListView.element" helpKeyword="WinJS.UI.ListView.element">
-                /// Gets the DOM element that hosts the ListView.
-                /// </field>
-                element: {
-                    get: function () { return this._element; }
-                },
-
-                /// <field type="WinJS.UI.Layout" locid="WinJS.UI.ListView.layout" helpKeyword="WinJS.UI.ListView.layout">
-                /// Gets or sets an object that controls the layout of the ListView.
-                /// </field>
-                layout: {
-                    get: function () {
-                        return this._layoutImpl;
-                    },
-                    set: function (layoutObject) {
-                        this._updateLayout(layoutObject);
-
-                        if (!this._runningInit) {
-                            this._view.reset();
-                            this._updateItemsManager();
-                            this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.medium, 0, true);
-                        }
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.ListView.maxLeadingPages" helpKeyword="WinJS.UI.ListView.maxLeadingPages" isAdvanced="true">
-                /// Gets or sets the maximum number of pages to prefetch in the leading buffer for virtualization.
-                /// </field>
-                maxLeadingPages: {
-                    get: function ListView_getMaxLeadingPages() {
-                        return this._view.maxLeadingPages;
-                    },
-                    set: function ListView_setMaxLeadingPages(value) {
-                        this._view.maxLeadingPages = Math.max(0, Math.floor(value));
-                    },
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.ListView.maxTrailingPages" helpKeyword="WinJS.UI.ListView.maxTrailingPages" isAdvanced="true">
-                /// Gets or sets the maximum number of pages to prefetch in the trailing buffer for virtualization.
-                /// </field>
-                maxTrailingPages: {
-                    get: function ListView_getMaxTrailingPages() {
-                        return this._view.maxTrailingPages;
-                    },
-                    set: function ListView_setMaxTrailingPages(value) {
-                        this._view.maxTrailingPages = Math.max(0, Math.floor(value));
-                    },
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.ListView.pagesToLoad" helpKeyword="WinJS.UI.ListView.pagesToLoad" isAdvanced="true">
-                /// Gets or sets the number of pages to load when the user scrolls beyond the
-                /// threshold specified by the pagesToLoadThreshold property if
-                /// the loadingBehavior property is set to incremental.
-                /// <deprecated type="deprecate">
-                /// pagesToLoad is deprecated. The control will not use this property. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.
-                /// </deprecated>
-                /// </field>
-                pagesToLoad: {
-                    get: function () {
-                        return (_VirtualizeContentsView._VirtualizeContentsView._defaultPagesToPrefetch * 2) + 1;
-                    },
-                    set: function () {
-                        _ElementUtilities._deprecated(_ErrorMessages.pagesToLoadIsDeprecated);
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.ListView.pagesToLoadThreshold" helpKeyword="WinJS.UI.ListView.pagesToLoadThreshold" isAdvanced="true">
-                /// Gets or sets the threshold (in pages) for initiating an incremental load. When the last visible item is
-                /// within the specified number of pages from the end of the loaded portion of the list,
-                /// and if automaticallyLoadPages is true and loadingBehavior is set to "incremental",
-                /// the ListView initiates an incremental load.
-                /// <deprecated type="deprecate">
-                /// pagesToLoadThreshold is deprecated.  The control will not use this property. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.
-                /// </deprecated>
-                /// </field>
-                pagesToLoadThreshold: {
-                    get: function () {
-                        return 0;
-                    },
-                    set: function () {
-                        _ElementUtilities._deprecated(_ErrorMessages.pagesToLoadThresholdIsDeprecated);
-                    }
-                },
-
-                /// <field type="Object" locid="WinJS.UI.ListView.groupDataSource" helpKeyword="WinJS.UI.ListView.groupDataSource">
-                /// Gets or sets the data source that contains the groups for the items in the itemDataSource.
-                /// </field>
-                groupDataSource: {
-                    get: function () {
-                        return this._groupDataSource;
-                    },
-                    set: function (newValue) {
-                        this._writeProfilerMark("set_groupDataSource,info");
-
-                        var that = this;
-
-                        function groupStatusChanged(eventObject) {
-                            if (eventObject.detail === _UI.DataSourceStatus.failure) {
-                                that.itemDataSource = null;
-                                that.groupDataSource = null;
-                            }
-                        }
-
-                        if (this._groupDataSource && this._groupDataSource.removeEventListener) {
-                            this._groupDataSource.removeEventListener("statuschanged", groupStatusChanged, false);
-                        }
-
-                        this._groupDataSource = newValue;
-                        this._groupFocusCache = (newValue && this._supportsGroupHeaderKeyboarding) ? new _GroupFocusCache._GroupFocusCache(this) : new _GroupFocusCache._UnsupportedGroupFocusCache();
-
-                        if (this._groupDataSource && this._groupDataSource.addEventListener) {
-                            this._groupDataSource.addEventListener("statuschanged", groupStatusChanged, false);
-                        }
-
-                        this._createGroupsContainer();
-
-                        if (!this._runningInit) {
-                            this._view.reset();
-                            this._pendingLayoutReset = true;
-                            this._pendingGroupWork = true;
-                            this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.medium, 0, true);
-                        } else {
-                            this._updateGroupWork();
-                            this._resetLayout();
-                        }
-                    }
-                },
-
-                _updateGroupWork: function () {
-                    this._pendingGroupWork = false;
-
-                    if (this._groupDataSource) {
-                        _ElementUtilities.addClass(this._element, _Constants._groupsClass);
-                    } else {
-                        _ElementUtilities.removeClass(this._element, _Constants._groupsClass);
-                    }
-                    this._resetLayout();
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.ListView.automaticallyLoadPages" helpKeyword="WinJS.UI.ListView.automaticallyLoadPages">
-                /// Gets or sets a value that indicates whether the next set of pages is automatically loaded
-                /// when the user scrolls beyond the number of pages specified by the
-                /// pagesToLoadThreshold property.
-                /// <deprecated type="deprecate">
-                /// automaticallyLoadPages is deprecated. The control will default this property to false. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.
-                /// </deprecated>
-                /// </field>
-                automaticallyLoadPages: {
-                    get: function () {
-                        return false;
-                    },
-                    set: function () {
-                        _ElementUtilities._deprecated(_ErrorMessages.automaticallyLoadPagesIsDeprecated);
-                    }
-                },
-
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.ListView.LoadingBehavior" locid="WinJS.UI.ListView.loadingBehavior" helpKeyword="WinJS.UI.ListView.loadingBehavior">
-                /// Gets or sets a value that determines how many data items are loaded into the DOM.
-                /// <deprecated type="deprecate">
-                /// pagesToLoadThreshold is deprecated. The control will default this property to 'randomAccess'. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.
-                /// </deprecated>
-                /// </field>
-                loadingBehavior: {
-                    get: function () {
-                        return "randomAccess";
-                    },
-                    set: function () {
-                        _ElementUtilities._deprecated(_ErrorMessages.loadingBehaviorIsDeprecated);
-                    }
-                },
-
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.ListView.SelectionMode" locid="WinJS.UI.ListView.selectionMode" helpKeyword="WinJS.UI.ListView.selectionMode">
-                /// Gets or sets a value that specifies how many ListView items the user can select: "none", "single", or "multi".
-                /// </field>
-                selectionMode: {
-                    get: function () {
-                        return this._selectionMode;
-                    },
-                    set: function (newMode) {
-                        if (typeof newMode === "string") {
-                            if (newMode.match(/^(none|single|multi)$/)) {
-                                if (_BaseUtils.isPhone && newMode === _UI.SelectionMode.single) {
-                                    return;
-                                }
-                                this._selectionMode = newMode;
-                                this._element.setAttribute("aria-multiselectable", this._multiSelection());
-                                this._updateItemsAriaRoles();
-                                this._configureSelectionMode();
-                                return;
-                            }
-                        }
-                        throw new _ErrorFromName("WinJS.UI.ListView.ModeIsInvalid", _ErrorMessages.modeIsInvalid);
-                    }
-                },
-
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.TapBehavior" locid="WinJS.UI.ListView.tapBehavior" helpKeyword="WinJS.UI.ListView.tapBehavior">
-                /// Gets or sets how the ListView reacts when the user taps or clicks an item.
-                /// The tap or click can invoke the item, select it and invoke it, or have no
-                /// effect.
-                /// </field>
-                tapBehavior: {
-                    get: function () {
-                        return this._tap;
-                    },
-                    set: function (tap) {
-                        if (_BaseUtils.isPhone && tap === _UI.TapBehavior.directSelect) {
-                            return;
-                        }
-                        this._tap = tap;
-                        this._updateItemsAriaRoles();
-                        this._configureSelectionMode();
-                    }
-                },
-
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.GroupHeaderTapBehavior" locid="WinJS.UI.ListView.groupHeaderTapBehavior" helpKeyword="WinJS.UI.ListView.groupHeaderTapBehavior">
-                /// Gets or sets how the ListView reacts when the user taps or clicks a group header.
-                /// </field>
-                groupHeaderTapBehavior: {
-                    get: function () {
-                        return this._groupHeaderTap;
-                    },
-                    set: function (tap) {
-                        this._groupHeaderTap = tap;
-                        this._updateGroupHeadersAriaRoles();
-                    }
-                },
-
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.SwipeBehavior" locid="WinJS.UI.ListView.swipeBehavior" helpKeyword="WinJS.UI.ListView.swipeBehavior">
-                /// Gets or sets how the ListView reacts to the swipe interaction.
-                /// The swipe gesture can select the swiped items or it can
-                /// have no effect on the current selection.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// <deprecated type="deprecate">
-                /// swipeBehavior is deprecated. The control will not use this property.
-                /// </deprecated>
-                /// </field>
-                swipeBehavior: {
-                    get: function () {
-                        return "none";
-                    },
-                    set: function (value) {
-                        _ElementUtilities._deprecated(_ErrorMessages.swipeBehaviorDeprecated);
-                    }
-                },
-
-                /// <field type="Object" locid="WinJS.UI.ListView.itemDataSource" helpKeyword="WinJS.UI.ListView.itemDataSource">
-                /// Gets or sets the data source that provides items for the ListView.
-                /// </field>
-                itemDataSource: {
-                    get: function () {
-                        return this._itemsManager.dataSource;
-                    },
-                    set: function (newData) {
-                        this._writeProfilerMark("set_itemDataSource,info");
-                        this._dataSource = newData || new BindingList.List().dataSource;
-                        this._groupFocusCache.clear();
-
-                        if (!this._runningInit) {
-                            this._selection._reset();
-                            this._cancelAsyncViewWork(true);
-                            this._updateItemsManager();
-                            this._pendingLayoutReset = true;
-                            this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.medium, 0, true);
-                        }
-                    }
-                },
-
-                /// <field type="Object" locid="WinJS.UI.ListView.itemTemplate" helpKeyword="WinJS.UI.ListView.itemTemplate" potentialValueSelector="[data-win-control='WinJS.Binding.Template']">
-                /// Gets or sets the templating function that creates the DOM elements
-                /// for each item in the itemDataSource. Each item can contain multiple
-                /// DOM elements, but we recommend that it have a single root element.
-                /// </field>
-                itemTemplate: {
-                    get: function () {
-                        return this._itemRenderer;
-                    },
-                    set: function (newRenderer) {
-                        this._setRenderer(newRenderer, false);
-
-                        if (!this._runningInit) {
-                            this._cancelAsyncViewWork(true);
-                            this._updateItemsManager();
-                            this._pendingLayoutReset = true;
-                            this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.medium, 0, true);
-                        }
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.ListView.resetItem" helpKeyword="WinJS.UI.ListView.resetItem">
-                /// Gets or sets the function that is called when the ListView recycles the
-                /// element representation of an item.
-                /// <deprecated type="deprecate">
-                /// resetItem may be altered or unavailable in future versions. Instead, mark the element as disposable using WinJS.Utilities.markDisposable.
-                /// </deprecated>
-                /// </field>
-                resetItem: {
-                    get: function () {
-                        return this._itemRelease;
-                    },
-                    set: function (release) {
-                        _ElementUtilities._deprecated(_ErrorMessages.resetItemIsDeprecated);
-                        this._itemRelease = release;
-                    }
-                },
-
-                /// <field type="Object" locid="WinJS.UI.ListView.groupHeaderTemplate" helpKeyword="WinJS.UI.ListView.groupHeaderTemplate" potentialValueSelector="[data-win-control='WinJS.Binding.Template']">
-                /// Gets or sets the templating function that creates the DOM elements
-                /// for each group header in the groupDataSource. Each group header
-                /// can contain multiple elements, but it must have a single root element.
-                /// </field>
-                groupHeaderTemplate: {
-                    get: function () {
-                        return this._groupHeaderRenderer;
-                    },
-                    set: function (newRenderer) {
-                        this._setRenderer(newRenderer, true);
-
-                        if (!this._runningInit) {
-                            this._cancelAsyncViewWork(true);
-                            this._pendingLayoutReset = true;
-                            this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.medium, 0, true);
-                        }
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.ListView.resetGroupHeader" helpKeyword="WinJS.UI.ListView.resetGroupHeader" isAdvanced="true">
-                /// Gets or sets the function that is called when the ListView recycles the DOM element representation
-                /// of a group header.
-                /// <deprecated type="deprecate">
-                /// resetGroupHeader may be altered or unavailable in future versions. Instead, mark the header element as disposable using WinJS.Utilities.markDisposable.
-                /// </deprecated>
-                /// </field>
-                resetGroupHeader: {
-                    get: function () {
-                        return this._groupHeaderRelease;
-                    },
-                    set: function (release) {
-                        _ElementUtilities._deprecated(_ErrorMessages.resetGroupHeaderIsDeprecated);
-                        this._groupHeaderRelease = release;
-                    }
-                },
-
-                /// <field type="HTMLElement" domElement="true" locid="WinJS.UI.ListView.header" helpKeyword="WinJS.UI.ListView.header">
-                /// Gets or sets the header to display at the start of the ListView.
-                /// </field>
-                header: {
-                    get: function () {
-                        return this._header;
-                    },
-                    set: function (newHeader) {
-                        _ElementUtilities.empty(this._headerContainer);
-                        this._header = newHeader;
-                        if (newHeader) {
-                            this._header.tabIndex = this._tabIndex;
-                            this._headerContainer.appendChild(newHeader);
-                        }
-
-                        var currentFocus = this._selection._getFocused();
-                        if (currentFocus.type === _UI.ObjectType.header) {
-                            var targetEntity = currentFocus;
-                            if (!newHeader) {
-                                targetEntity = { type: _UI.ObjectType.item, index: 0 };
-                            }
-
-                            if (this._hasKeyboardFocus) {
-                                this._changeFocus(targetEntity, true, false, true);
-                            } else {
-                                this._changeFocusPassively(targetEntity);
-                            }
-                        }
-                        this.recalculateItemPosition();
-                        this._raiseHeaderFooterVisibilityEvent();
-                    }
-                },
-
-                /// <field type="HTMLElement" domElement="true" locid="WinJS.UI.ListView.footer" helpKeyword="WinJS.UI.ListView.footer">
-                /// Gets or sets the footer to display at the end of the ListView.
-                /// </field>
-                footer: {
-                    get: function () {
-                        return this._footer;
-                    },
-                    set: function (newFooter) {
-                        _ElementUtilities.empty(this._footerContainer);
-                        this._footer = newFooter;
-                        if (newFooter) {
-                            this._footer.tabIndex = this._tabIndex;
-                            this._footerContainer.appendChild(newFooter);
-                        }
-
-                        var currentFocus = this._selection._getFocused();
-                        if (currentFocus.type === _UI.ObjectType.footer) {
-                            var targetEntity = currentFocus;
-                            if (!newFooter) {
-                                targetEntity = { type: _UI.ObjectType.item, index: 0 };
-                            }
-
-                            if (this._hasKeyboardFocus) {
-                                this._changeFocus(targetEntity, true, false, true);
-                            } else {
-                                this._changeFocusPassively(targetEntity);
-                            }
-                        }
-                        this.recalculateItemPosition();
-                        this._raiseHeaderFooterVisibilityEvent();
-                    }
-                },
-
-                /// <field type="String" hidden="true" locid="WinJS.UI.ListView.loadingState" helpKeyword="WinJS.UI.ListView.loadingState">
-                /// Gets a value that indicates whether the ListView is still loading or whether
-                /// loading is complete.  This property can return one of these values:
-                /// "itemsLoading", "viewPortLoaded", "itemsLoaded", or "complete".
-                /// </field>
-                loadingState: {
-                    get: function () {
-                        return this._loadingState;
-                    }
-                },
-
-                /// <field type="Object" locid="WinJS.UI.ListView.selection" helpKeyword="WinJS.UI.ListView.selection" isAdvanced="true">
-                /// Gets an ISelection object that contains the currently selected items.
-                /// </field>
-                selection: {
-                    get: function () {
-                        return this._selection;
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.ListView.indexOfFirstVisible" helpKeyword="WinJS.UI.ListView.indexOfFirstVisible" isAdvanced="true">
-                /// Gets or sets the first visible item. When setting this property, the ListView scrolls so that the
-                /// item with the specified index is at the top of the list.
-                /// </field>
-                indexOfFirstVisible: {
-                    get: function () {
-                        return this._view.firstIndexDisplayed;
-                    },
-
-                    set: function (itemIndex) {
-                        if (itemIndex < 0) {
-                            return;
-                        }
-
-                        this._writeProfilerMark("set_indexOfFirstVisible(" + itemIndex + "),info");
-                        this._raiseViewLoading(true);
-
-                        var that = this;
-                        this._batchViewUpdates(_Constants._ViewChange.realize, _Constants._ScrollToPriority.high, function () {
-                            var range;
-                            return that._entityInRange({ type: _UI.ObjectType.item, index: itemIndex }).then(function (validated) {
-                                if (!validated.inRange) {
-                                    return {
-                                        position: 0,
-                                        direction: "left"
-                                    };
-                                } else {
-                                    return that._getItemOffset({ type: _UI.ObjectType.item, index: validated.index }).then(function (r) {
-                                        range = r;
-                                        return that._ensureFirstColumnRange(_UI.ObjectType.item);
-                                    }).then(function () {
-                                        range = that._correctRangeInFirstColumn(range, _UI.ObjectType.item);
-                                        range = that._convertFromCanvasCoordinates(range);
-
-                                        return that._view.waitForValidScrollPosition(range.begin);
-                                    }).then(function (begin) {
-                                        var direction = (begin < that._lastScrollPosition) ? "left" : "right";
-                                        var max = that._viewport[that._scrollLength] - that._getViewportLength();
-                                        begin = _ElementUtilities._clamp(begin, 0, max);
-
-                                        return {
-                                            position: begin,
-                                            direction: direction
-                                        };
-                                    });
-                                }
-                            });
-                        }, true);
-                    }
-                },
-
-                /// <field type="Number" integer="true" readonly="true" locid="WinJS.UI.ListView.indexOfLastVisible" helpKeyword="WinJS.UI.ListView.indexOfLastVisible" isAdvanced="true">
-                /// Gets the index of the last visible item.
-                /// </field>
-                indexOfLastVisible: {
-                    get: function () {
-                        return this._view.lastIndexDisplayed;
-                    }
-                },
-
-                /// <field type="Object" locid="WinJS.UI.ListView.currentItem" helpKeyword="WinJS.UI.ListView.currentItem" isAdvanced="true">
-                /// Gets or sets an object that indicates which item should get keyboard focus and its focus status.
-                /// The object has these properties:
-                /// index: the index of the item in the itemDataSource.
-                /// key: the key of the item in the itemDataSource.
-                /// hasFocus: when getting this property, this value is true if the item already has focus; otherwise, it's false.
-                /// When setting this property, set this value to true if the item should get focus immediately; otherwise, set it to
-                /// false and the item will get focus eventually.
-                /// showFocus: true if the item displays the focus rectangle; otherwise, false.
-                /// </field>
-                currentItem: {
-                    get: function () {
-                        var focused = this._selection._getFocused();
-                        var retVal = {
-                            index: focused.index,
-                            type: focused.type,
-                            key: null,
-                            hasFocus: !!this._hasKeyboardFocus,
-                            showFocus: false
-                        };
-                        if (focused.type === _UI.ObjectType.groupHeader) {
-                            var group = this._groups.group(focused.index);
-                            if (group) {
-                                retVal.key = group.key;
-                                retVal.showFocus = !!(group.header && _ElementUtilities.hasClass(group.header, _Constants._itemFocusClass));
-                            }
-                        } else if (focused.type === _UI.ObjectType.item) {
-                            var item = this._view.items.itemAt(focused.index);
-                            if (item) {
-                                var record = this._itemsManager._recordFromElement(item);
-                                retVal.key = record.item && record.item.key;
-                                retVal.showFocus = !!item.parentNode.querySelector("." + _Constants._itemFocusOutlineClass);
-                            }
-                        }
-                        return retVal;
-                    },
-
-                    set: function (data) {
-                        this._hasKeyboardFocus = data.hasFocus || this._hasKeyboardFocus;
-                        if (!data.type) {
-                            data.type = _UI.ObjectType.item;
-                        }
-                        var that = this;
-                        function setItemFocused(item, isInTree, entity) {
-                            var drawKeyboardFocus = !!data.showFocus && that._hasKeyboardFocus;
-                            that._unsetFocusOnItem(isInTree);
-                            that._selection._setFocused(entity, drawKeyboardFocus);
-                            if (that._hasKeyboardFocus) {
-                                that._keyboardFocusInbound = drawKeyboardFocus;
-                                that._setFocusOnItem(entity);
-                            } else {
-                                that._tabManager.childFocus = (isInTree ? item : null);
-                            }
-                            if (entity.type !== _UI.ObjectType.groupHeader) {
-                                that._updateFocusCache(entity.index);
-                                if (that._updater) {
-                                    that._updater.newSelectionPivot = entity.index;
-                                    that._updater.oldSelectionPivot = -1;
-                                }
-                                that._selection._pivot = entity.index;
-                            }
-                        }
-
-                        if (data.key &&
-                            ((data.type === _UI.ObjectType.item && this._dataSource.itemFromKey) ||
-                            (data.type === _UI.ObjectType.groupHeader && this._groupDataSource && this._groupDataSource.itemFromKey))) {
-                            if (this.oldCurrentItemKeyFetch) {
-                                this.oldCurrentItemKeyFetch.cancel();
-                            }
-                            var dataSource = (data.type === _UI.ObjectType.groupHeader ? this._groupDataSource : this._dataSource);
-                            this.oldCurrentItemKeyFetch = dataSource.itemFromKey(data.key).then(function (item) {
-                                that.oldCurrentItemKeyFetch = null;
-                                if (item) {
-                                    var element = (data.type === _UI.ObjectType.groupHeader ? that._groups.group(item.index).header : that._view.items.itemAt(item.index));
-                                    setItemFocused(element, !!element, { type: data.type, index: item.index });
-                                }
-                            });
-                        } else {
-                            var element;
-                            if (data.type === _UI.ObjectType.header || data.type === _UI.ObjectType.footer) {
-                                element = (data.type === _UI.ObjectType.header ? this._header : this._footer);
-                                setItemFocused(element, !!element, { type: data.type, index: data.index });
-                            } else if (data.index !== undefined) {
-                                if (data.type === _UI.ObjectType.groupHeader) {
-                                    var group = that._groups.group(data.index);
-                                    element = group && group.header;
-                                } else {
-                                    element = that._view.items.itemAt(data.index);
-                                }
-                                setItemFocused(element, !!element, { type: data.type, index: data.index });
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="Object" locid="WinJS.UI.ListView.zoomableView" helpKeyword="WinJS.UI.ListView.zoomableView" isAdvanced="true">
-                /// Gets a ZoomableView. This API supports the SemanticZoom infrastructure
-                /// and is not intended to be used directly from your code.
-                /// </field>
-                zoomableView: {
-                    get: function () {
-                        if (!this._zoomableView) {
-                            this._zoomableView = new ZoomableView(this);
-                        }
-
-                        return this._zoomableView;
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.ListView.itemsDraggable" helpKeyword="WinJS.UI.ListView.itemsDraggable">
-                /// Gets or sets whether the ListView's items can be dragged via drag and drop.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                itemsDraggable: {
-                    get: function () {
-                        return this._dragSource;
-                    },
-
-                    set: function (value) {
-                        if (_BaseUtils.isPhone) {
-                            return;
-                        }
-                        if (this._dragSource !== value) {
-                            this._dragSource = value;
-                            this._setDraggable();
-                        }
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.ListView.itemsReorderable" helpKeyword="WinJS.UI.ListView.itemsReorderable">
-                /// Gets or sets whether the ListView's items can be reordered within itself via drag and drop. When a ListView is marked as reorderable, its items can be dragged about inside itself, but it will not require the itemdrag events it fires to be handled.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                itemsReorderable: {
-                    get: function () {
-                        return this._reorderable;
-                    },
-
-                    set: function (value) {
-                        if (_BaseUtils.isPhone) {
-                            return;
-                        }
-                        if (this._reorderable !== value) {
-                            this._reorderable = value;
-                            this._setDraggable();
-                        }
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.ListView.maxDeferredItemCleanup" helpKeyword="WinJS.UI.ListView.maxDeferredItemCleanup" isAdvanced="true">
-                /// Gets or sets the maximum number of realized items.
-                /// </field>
-                maxDeferredItemCleanup: {
-                    get: function () {
-                        return this._maxDeferredItemCleanup;
-                    },
-
-                    set: function (value) {
-                        this._maxDeferredItemCleanup = Math.max(0, +value || 0);
-                    }
-                },
-
-                // Public methods
-
-                dispose: function () {
-                    /// <signature helpKeyword="WinJS.UI.ListView.dispose">
-                    /// <summary locid="WinJS.UI.ListView.dispose">
-                    /// Disposes this ListView.
-                    /// </summary>
-                    /// </signature>
-                    this._dispose();
-                },
-
-                elementFromIndex: function (itemIndex) {
-                    /// <signature helpKeyword="WinJS.UI.ListView.elementFromIndex">
-                    /// <summary locid="WinJS.UI.ListView.elementFromIndex">
-                    /// Returns the DOM element that represents the item at the specified index.
-                    /// </summary>
-                    /// <param name="itemIndex" type="Number" integer="true" locid="WinJS.UI.ListView.elementFromIndex_p:itemIndex">
-                    /// The index of the item.
-                    /// </param>
-                    /// <returns type="Object" domElement="true" locid="WinJS.UI.ListView.elementFromIndex_returnValue">
-                    /// The DOM element that represents the specified item.
-                    /// </returns>
-                    /// </signature>
-
-                    return this._view.items.itemAt(itemIndex);
-                },
-
-                indexOfElement: function (element) {
-                    /// <signature helpKeyword="WinJS.UI.ListView.indexOfElement">
-                    /// <summary locid="WinJS.UI.ListView.indexOfElement">
-                    /// Returns the index of the item that the specified DOM element displays.
-                    /// </summary>
-                    /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.UI.ListView.indexOfElement_p:element">
-                    /// The DOM element that displays the item.
-                    /// </param>
-                    /// <returns type="Number" integer="true" locid="WinJS.UI.ListView.indexOfElement_returnValue">
-                    /// The index of item that the specified DOM element displays.
-                    /// </returns>
-                    /// </signature>
-
-                    return this._view.items.index(element);
-                },
-
-                ensureVisible: function ListView_ensureVisible(value) {
-                    /// <signature helpKeyword="WinJS.UI.ListView.ensureVisible">
-                    /// <summary locid="WinJS.UI.ListView.ensureVisible">
-                    /// Makes the specified item visible. The ListView scrolls to the item if needed.
-                    /// </summary>
-                    /// <param name="value" type="Number|IListViewEntity" integer="true" locid="WinJS.UI.ListView.ensureVisible_p:value">
-                    /// The index of the ListView item or IListViewEntity to bring into view.
-                    /// </param>
-                    /// </signature>
-                    var type = _UI.ObjectType.item,
-                        itemIndex = value;
-                    if (+value !== value) {
-                        type = value.type;
-                        itemIndex = value.index;
-                    }
-                    this._writeProfilerMark("ensureVisible(" + type + ": " + itemIndex + "),info");
-
-                    if (itemIndex < 0) {
-                        return;
-                    }
-
-                    this._raiseViewLoading(true);
-
-                    var that = this;
-                    this._batchViewUpdates(_Constants._ViewChange.realize, _Constants._ScrollToPriority.high, function () {
-                        var range;
-
-                        return that._entityInRange({ type: type, index: itemIndex }).then(function (validated) {
-                            if (!validated.inRange) {
-                                return {
-                                    position: 0,
-                                    direction: "left"
-                                };
-                            } else {
-                                return that._getItemOffset({ type: type, index: validated.index }).then(function (r) {
-                                    range = r;
-                                    return that._ensureFirstColumnRange(type);
-                                }).then(function () {
-                                    range = that._correctRangeInFirstColumn(range, type);
-
-                                    var viewportLength = that._getViewportLength(),
-                                        left = that._viewportScrollPosition,
-                                        right = left + viewportLength,
-                                        newPosition = that._viewportScrollPosition,
-                                        entityWidth = range.end - range.begin;
-
-                                    range = that._convertFromCanvasCoordinates(range);
-
-                                    var handled = false;
-                                    if (type === _UI.ObjectType.groupHeader && left <= range.begin) {
-                                        // EnsureVisible on a group where the entire header is fully visible does not
-                                        // scroll. This prevents tabbing from an item in a very large group to align
-                                        // the scroll to the header element.
-                                        var header = that._groups.group(validated.index).header;
-                                        if (header) {
-                                            var headerEnd;
-                                            var margins = _Layouts._getMargins(header);
-                                            if (that._horizontalLayout) {
-                                                var rtl = that._rtl();
-                                                var headerStart = (rtl ? getOffsetRight(header) - margins.right : header.offsetLeft - margins.left);
-                                                headerEnd = headerStart + header.offsetWidth + (rtl ? margins.left : margins.right);
-                                            } else {
-                                                headerEnd = header.offsetTop + header.offsetHeight + margins.top;
-                                            }
-                                            handled = headerEnd <= right;
-                                        }
-                                    }
-                                    if (!handled) {
-                                        if (entityWidth >= right - left) {
-                                            // This item is larger than the viewport so we will just set
-                                            // the scroll position to the beginning of the item.
-                                            newPosition = range.begin;
-                                        } else {
-                                            if (range.begin < left) {
-                                                newPosition = range.begin;
-                                            } else if (range.end > right) {
-                                                newPosition = range.end - viewportLength;
-                                            }
-                                        }
-                                    }
-
-                                    var direction = (newPosition < that._lastScrollPosition) ? "left" : "right";
-                                    var max = that._viewport[that._scrollLength] - viewportLength;
-                                    newPosition = _ElementUtilities._clamp(newPosition, 0, max);
-
-                                    return {
-                                        position: newPosition,
-                                        direction: direction
-                                    };
-                                });
-                            }
-                        });
-                    }, true);
-                },
-
-                loadMorePages: function ListView_loadMorePages() {
-                    /// <signature helpKeyword="WinJS.UI.ListView.loadMorePages">
-                    /// <summary locid="WinJS.UI.ListView.loadMorePages">
-                    /// Loads the next set of pages if the ListView object's loadingBehavior is set to incremental.
-                    /// <deprecated type="deprecate">
-                    /// loadMorePages is deprecated. Invoking this function will not have any effect. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior.
-                    /// </deprecated>
-                    /// </summary>
-                    /// </signature>
-                    _ElementUtilities._deprecated(_ErrorMessages.loadMorePagesIsDeprecated);
-                },
-
-                recalculateItemPosition: function ListView_recalculateItemPosition() {
-                    /// <signature helpKeyword="WinJS.UI.ListView.recalculateItemPosition">
-                    /// <summary locid="WinJS.UI.ListView.recalculateItemPosition">
-                    /// Repositions all the visible items in the ListView to adjust for items whose sizes have changed. Use this function or forceLayout when making the ListView visible again after you set its style.display property to "none" or after style changes have been made that affect the size or position of the ListView or its items. Unlike forceLayout, this method doesn’t recreate items and it doesn’t display entrance animation.
-                    /// </summary>
-                    /// </signature>
-                    this._writeProfilerMark("recalculateItemPosition,info");
-                    this._forceLayoutImpl(_Constants._ViewChange.relayout);
-                },
-
-                forceLayout: function ListView_forceLayout() {
-                    /// <signature helpKeyword="WinJS.UI.ListView.forceLayout">
-                    /// <summary locid="WinJS.UI.ListView.forceLayout">
-                    /// Forces the ListView to update its layout. Use this function or relcaculateItemPosition when making the ListView visible again after you set its style.display property to "none” or after style changes have been made that affect the size or position of the ListView or its items.
-                    /// after you set its style.display property to "none".
-                    /// </summary>
-                    /// </signature>
-                    this._writeProfilerMark("forceLayout,info");
-                    this._forceLayoutImpl(_Constants._ViewChange.remeasure);
-                },
-
-                _entityInRange: function ListView_entityInRange(entity) {
-                    if (entity.type === _UI.ObjectType.item) {
-                        return this._itemsCount().then(function (itemsCount) {
-                            var index = _ElementUtilities._clamp(entity.index, 0, itemsCount - 1);
-                            return {
-                                inRange: index >= 0 && index < itemsCount,
-                                index: index
-                            };
-                        });
-                    } else if (entity.type === _UI.ObjectType.groupHeader) {
-                        var index = _ElementUtilities._clamp(entity.index, 0, this._groups.length() - 1);
-                        return Promise.wrap({
-                            inRange: index >= 0 && index < this._groups.length(),
-                            index: index
-                        });
-                    } else {
-                        return Promise.wrap({
-                            inRange: true,
-                            index: 0
-                        });
-                    }
-                },
-
-                _forceLayoutImpl: function ListView_forceLayoutImpl(viewChange) {
-                    var that = this;
-                    if (!this._versionManager) {
-                        return;
-                    }
-                    this._versionManager.unlocked.then(function () {
-                        that._writeProfilerMark("_forceLayoutImpl viewChange(" + viewChange + "),info");
-
-                        that._cancelAsyncViewWork();
-                        that._pendingLayoutReset = true;
-                        that._resizeViewport();
-
-                        that._batchViewUpdates(viewChange, _Constants._ScrollToPriority.low, function () {
-                            return {
-                                position: that._lastScrollPosition,
-                                direction: "right"
-                            };
-                        }, true, true);
-                    });
-                },
-
-                _configureSelectionMode: function () {
-                    var selectionModeClass = _Constants._selectionModeClass,
-                        hidingSelectionModeClass = _Constants._hidingSelectionMode;
-                    if (this._isInSelectionMode()) {
-                        _ElementUtilities.addClass(this._canvas, selectionModeClass);
-                        _ElementUtilities.removeClass(this._canvas, hidingSelectionModeClass);
-                    } else {
-                        if (_ElementUtilities.hasClass(this._canvas, selectionModeClass)) {
-                            var that = this;
-                            _Global.setTimeout(function () {
-                                _Global.setTimeout(function () {
-                                    _ElementUtilities.removeClass(that._canvas, hidingSelectionModeClass);
-                                }, _Constants._hidingSelectionModeAnimationTimeout);
-                            }, 50);
-                            _ElementUtilities.addClass(this._canvas, hidingSelectionModeClass);
-                        }
-                        _ElementUtilities.removeClass(this._canvas, selectionModeClass);
-                    }
-                },
-
-                _lastScrollPosition: {
-                    get: function () {
-                        return this._lastScrollPositionValue;
-                    },
-                    set: function (position) {
-                        if (position === 0) {
-                            this._lastDirection = "right";
-                            this._direction = "right";
-                            this._lastScrollPositionValue = 0;
-                        } else {
-                            var currentDirection = position < this._lastScrollPositionValue ? "left" : "right";
-                            this._direction = this._scrollDirection(position);
-                            this._lastDirection = currentDirection;
-                            this._lastScrollPositionValue = position;
-                        }
-                    }
-                },
-
-                _hasHeaderOrFooter: {
-                    get: function () {
-                        return !!(this._header || this._footer);
-                    }
-                },
-
-                _getHeaderOrFooterFromElement: function (element) {
-                    if (this._header && this._header.contains(element)) {
-                        return this._header;
-                    } else if (this._footer && this._footer.contains(element)) {
-                        return this._footer;
-                    }
-
-                    return null;
-                },
-
-                _supportsGroupHeaderKeyboarding: {
-                    get: function () {
-                        return this._groupDataSource;
-                    }
-                },
-
-                _viewportScrollPosition: {
-                    get: function () {
-                        this._currentScrollPosition = _ElementUtilities.getScrollPosition(this._viewport)[this._scrollProperty];
-                        return this._currentScrollPosition;
-                    },
-                    set: function (value) {
-                        var newScrollPos = {};
-                        newScrollPos[this._scrollProperty] = value;
-                        _ElementUtilities.setScrollPosition(this._viewport, newScrollPos);
-                        this._currentScrollPosition = value;
-                    }
-                },
-
-                _canvasStart: {
-                    get: function () {
-                        return this._canvasStartValue || 0;
-                    },
-                    set: function (value) {
-                        var transformX = this._horizontal() ? (this._rtl() ? -value : value) : 0,
-                            transformY = this._horizontal() ? 0 : value;
-                        if (value !== 0) {
-                            this._canvas.style[transformNames.scriptName] = "translate( " + transformX + "px, " + transformY + "px)";
-                        } else {
-                            this._canvas.style[transformNames.scriptName] = "";
-                        }
-                        this._canvasStartValue = value;
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.ListView.scrollPosition" helpKeyword="WinJS.UI.ListView.scrollPosition">
-                /// Gets or sets the position of the ListView's scrollbar.
-                /// </field>
-                scrollPosition: {
-                    get: function () {
-                        return this._viewportScrollPosition;
-                    },
-                    set: function (newPosition) {
-                        var that = this;
-                        this._batchViewUpdates(_Constants._ViewChange.realize, _Constants._ScrollToPriority.high, function () {
-                            return that._view.waitForValidScrollPosition(newPosition).then(function () {
-                                var max = that._viewport[that._scrollLength] - that._getViewportLength();
-                                newPosition = _ElementUtilities._clamp(newPosition, 0, max);
-                                var direction = (newPosition < that._lastScrollPosition) ? "left" : "right";
-                                return {
-                                    position: newPosition,
-                                    direction: direction
-                                };
-                            });
-                        }, true);
-                    }
-                },
-
-                _setRenderer: function ListView_setRenderer(newRenderer, isGroupHeaderRenderer) {
-                    var renderer;
-                    if (!newRenderer) {
-                        if (_BaseUtils.validation) {
-                            throw new _ErrorFromName("WinJS.UI.ListView.invalidTemplate", _ErrorMessages.invalidTemplate);
-                        }
-                        renderer = _ItemsManager.trivialHtmlRenderer;
-                    } else if (typeof newRenderer === "function") {
-                        renderer = newRenderer;
-                    } else if (typeof newRenderer === "object") {
-                        if (_BaseUtils.validation && !newRenderer.renderItem) {
-                            throw new _ErrorFromName("WinJS.UI.ListView.invalidTemplate", _ErrorMessages.invalidTemplate);
-                        }
-                        renderer = newRenderer.renderItem;
-                    }
-
-                    if (renderer) {
-                        if (isGroupHeaderRenderer) {
-                            this._groupHeaderRenderer = renderer;
-                        } else {
-                            this._itemRenderer = renderer;
-                        }
-                    }
-                },
-
-                _renderWithoutReuse: function ListView_renderWithoutReuse(itemPromise, oldElement) {
-                    if (oldElement) {
-                        _Dispose._disposeElement(oldElement);
-                    }
-                    var templateResult = this._itemRenderer(itemPromise);
-                    if (templateResult.then) {
-                        return templateResult.then(function (element) {
-                            element.tabIndex = 0;
-                            return element;
-                        });
-                    } else {
-                        var element = templateResult.element || templateResult;
-                        element.tabIndex = 0;
-                        return templateResult;
-                    }
-                },
-
-                _isInsertedItem: function ListView_isInsertedItem(itemPromise) {
-                    return !!this._insertedItems[itemPromise.handle];
-                },
-
-                _clearInsertedItems: function ListView_clearInsertedItems() {
-                    var keys = Object.keys(this._insertedItems);
-                    for (var i = 0, len = keys.length; i < len; i++) {
-                        this._insertedItems[keys[i]].release();
-                    }
-                    this._insertedItems = {};
-                    this._modifiedElements = [];
-                    this._countDifference = 0;
-                },
-
-                // Private methods
-                _cancelAsyncViewWork: function (stopTreeCreation) {
-                    this._view.stopWork(stopTreeCreation);
-                },
-
-                _updateView: function ListView_updateView() {
-                    if (this._isZombie()) { return; }
-
-                    var that = this;
-                    function resetCache() {
-                        that._itemsBlockExtent = -1;
-                        that._firstItemRange = null;
-                        that._firstHeaderRange = null;
-                        that._itemMargins = null;
-                        that._headerMargins = null;
-                        that._canvasMargins = null;
-                        that._cachedRTL = null;
-                        // Retrieve the values before DOM modifications occur
-                        that._rtl();
-                    }
-
-                    var viewChange = this._viewChange;
-                    this._viewChange = _Constants._ViewChange.realize;
-
-                    function functorWrapper() {
-                        that._scrollToPriority = _Constants._ScrollToPriority.uninitialized;
-                        var setScrollbarPosition = that._setScrollbarPosition;
-                        that._setScrollbarPosition = false;
-
-                        var position = typeof that._scrollToFunctor === "number" ? { position: that._scrollToFunctor } : that._scrollToFunctor();
-                        return Promise.as(position).then(
-                            function (scroll) {
-                                scroll = scroll || {};
-                                if (setScrollbarPosition && +scroll.position === scroll.position) {
-                                    that._lastScrollPosition = scroll.position;
-                                    that._viewportScrollPosition = scroll.position;
-                                }
-                                return scroll;
-                            },
-                            function (error) {
-                                that._setScrollbarPosition |= setScrollbarPosition;
-                                return Promise.wrapError(error);
-                            }
-                        );
-                    }
-
-                    if (viewChange === _Constants._ViewChange.rebuild) {
-                        if (this._pendingGroupWork) {
-                            this._updateGroupWork();
-                        }
-                        if (this._pendingLayoutReset) {
-                            this._resetLayout();
-                        }
-                        resetCache();
-                        if (!this._firstTimeDisplayed) {
-                            this._view.reset();
-                        }
-                        this._view.reload(functorWrapper, true);
-                        this._setFocusOnItem(this._selection._getFocused());
-                        this._headerFooterVisibilityStatus = { headerVisible: false, footerVisible: false };
-                    } else if (viewChange === _Constants._ViewChange.remeasure) {
-                        this._view.resetItems(true);
-                        this._resetLayout();
-                        resetCache();
-                        this._view.refresh(functorWrapper);
-                        this._setFocusOnItem(this._selection._getFocused());
-                        this._headerFooterVisibilityStatus = { headerVisible: false, footerVisible: false };
-                    } else if (viewChange === _Constants._ViewChange.relayout) {
-                        if (this._pendingLayoutReset) {
-                            this._resetLayout();
-                            resetCache();
-                        }
-                        this._view.refresh(functorWrapper);
-                    } else {
-                        this._view.onScroll(functorWrapper);
-                        this._raiseHeaderFooterVisibilityEvent();
-                    }
-                },
-
-                _batchViewUpdates: function ListView_batchViewUpdates(viewChange, scrollToPriority, positionFunctor, setScrollbarPosition, skipFadeout) {
-                    this._viewChange = Math.min(this._viewChange, viewChange);
-
-                    if (this._scrollToFunctor === null || scrollToPriority >= this._scrollToPriority) {
-                        this._scrollToPriority = scrollToPriority;
-                        this._scrollToFunctor = positionFunctor;
-                    }
-
-                    this._setScrollbarPosition |= !!setScrollbarPosition;
-
-                    if (!this._batchingViewUpdates) {
-                        this._raiseViewLoading();
-
-                        var that = this;
-                        this._batchingViewUpdatesSignal = new _Signal();
-                        this._batchingViewUpdates = Promise.any([this._batchingViewUpdatesSignal.promise, Scheduler.schedulePromiseHigh(null, "WinJS.UI.ListView._updateView")]).then(function () {
-                            if (that._isZombie()) { return; }
-
-                            // If we're displaying for the first time, or there were no items visible in the view, we can skip the fade out animation
-                            // and go straight to the refresh. _view.items._itemData.length is the most trustworthy way to find how many items are visible.
-                            if (that._viewChange === _Constants._ViewChange.rebuild && !that._firstTimeDisplayed && Object.keys(that._view.items._itemData).length !== 0 && !skipFadeout) {
-                                return that._fadeOutViewport();
-                            }
-                        }).then(
-                            function () {
-                                that._batchingViewUpdates = null;
-                                that._batchingViewUpdatesSignal = null;
-                                that._updateView();
-                                that._firstTimeDisplayed = false;
-                            },
-                            function () {
-                                that._batchingViewUpdates = null;
-                                that._batchingViewUpdatesSignal = null;
-                            }
-                        );
-                    }
-
-                    return this._batchingViewUpdatesSignal;
-                },
-
-                _resetCanvas: function () {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    // Layouts do not currently support saving the scroll position when forceLayout() is called.
-                    // Layouts need to recreate the canvas because the tabManager is there and you don't want to
-                    // construct 2 instances of WinJS.UI.TabContainer for the same element.
-                    var newCanvas = _Global.document.createElement('div');
-                    newCanvas.className = this._canvas.className;
-                    this._viewport.replaceChild(newCanvas, this._canvas);
-                    this._canvas = newCanvas;
-                    this._groupsToRemove = {};
-                    // We reset the itemCanvas on _resetCanvas in case a ListView client uses two separate custom layouts, and each layout
-                    // changes different styles on the itemCanvas without resetting it.
-                    this._canvas.appendChild(this._canvasProxy);
-                },
-
-                _setupInternalTree: function ListView_setupInternalTree() {
-                    _ElementUtilities.addClass(this._element, _Constants._listViewClass);
-                    _ElementUtilities[this._rtl() ? "addClass" : "removeClass"](this._element, _Constants._rtlListViewClass);
-
-                    this._element.innerHTML =
-                        '<div tabIndex="-1" role="group" class="' + _Constants._viewportClass + ' ' + _Constants._horizontalClass + '">' +
-                            '<div></div>' +
-                            '<div class="' + _Constants._scrollableClass + '">' +
-                                // Create a proxy element inside the canvas so that during an MSPointerDown event we can call
-                                // msSetPointerCapture on it. This allows hover to not be passed to it which saves a large invalidation.
-                                '<div class="' + _Constants._proxyClass + '"></div>' +
-                            '</div>' +
-                            '<div></div>' +
-                            '<div></div>' +
-                        '</div>' +
-                        // The keyboard event helper is a dummy node that allows us to keep getting keyboard events when a virtualized element
-                        // gets discarded. It has to be positioned in the center of the viewport, though, otherwise calling .focus() on it
-                        // can move our viewport around when we don't want it moved.
-                        // The keyboard event helper element will be skipped in the tab order if it doesn't have width+height set on it.
-                       '<div aria-hidden="true" style="position:absolute;left:50%;top:50%;width:0px;height:0px;" tabindex="-1"></div>';
-
-                    this._viewport = this._element.firstElementChild;
-                    this._headerContainer = this._viewport.firstElementChild;
-                    _ElementUtilities.addClass(this._headerContainer, _Constants._listHeaderContainerClass);
-                    this._canvas = this._headerContainer.nextElementSibling;
-                    this._footerContainer = this._canvas.nextElementSibling;
-                    _ElementUtilities.addClass(this._footerContainer, _Constants._listFooterContainerClass);
-                    this._canvasProxy = this._canvas.firstElementChild;
-                    // The deleteWrapper div is used to maintain the scroll width (after delete(s)) until the animation is done
-                    this._deleteWrapper = this._canvas.nextElementSibling;
-                    this._keyboardEventsHelper = this._viewport.nextElementSibling;
-                    this._tabIndex = _ElementUtilities.getTabIndex(this._element);
-                    if (this._tabIndex < 0) {
-                        this._tabIndex = 0;
-                    }
-                    this._tabManager = new _TabContainer.TabContainer(this._viewport);
-                    this._tabManager.tabIndex = this._tabIndex;
-
-                    this._progressBar = _Global.document.createElement("progress");
-                    _ElementUtilities.addClass(this._progressBar, _Constants._progressClass);
-                    _ElementUtilities.addClass(this._progressBar, "win-progress-ring");
-                    this._progressBar.style.position = "absolute";
-                    this._progressBar.max = 100;
-                },
-
-                _unsetFocusOnItem: function ListView_unsetFocusOnItem(newFocusExists) {
-                    if (this._tabManager.childFocus) {
-                        this._clearFocusRectangle(this._tabManager.childFocus);
-                    }
-                    if (this._isZombie()) {
-                        return;
-                    }
-                    if (!newFocusExists) {
-                        // _setFocusOnItem may run asynchronously so prepare the keyboardEventsHelper
-                        // to receive focus.
-                        if (this._tabManager.childFocus) {
-                            this._tabManager.childFocus = null;
-                        }
-
-                        this._keyboardEventsHelper._shouldHaveFocus = false;
-                        // If the viewport has focus, leave it there. This will prevent focus from jumping
-                        // from the viewport to the keyboardEventsHelper when scrolling with Narrator Touch.
-                        if (_Global.document.activeElement !== this._viewport && this._hasKeyboardFocus) {
-                            this._keyboardEventsHelper._shouldHaveFocus = true;
-                            _ElementUtilities._setActive(this._keyboardEventsHelper);
-                        }
-                    }
-                    this._itemFocused = false;
-                },
-
-                _setFocusOnItem: function ListView_setFocusOnItem(entity) {
-                    this._writeProfilerMark("_setFocusOnItem,info");
-                    if (this._focusRequest) {
-                        this._focusRequest.cancel();
-                    }
-                    if (this._isZombie()) {
-                        return;
-                    }
-                    var that = this;
-                    var setFocusOnItemImpl = function (item) {
-                        if (that._isZombie()) {
-                            return;
-                        }
-
-                        if (that._tabManager.childFocus !== item) {
-                            that._tabManager.childFocus = item;
-                        }
-                        that._focusRequest = null;
-                        if (that._hasKeyboardFocus && !that._itemFocused) {
-                            if (that._selection._keyboardFocused()) {
-                                that._drawFocusRectangle(item);
-                            }
-                            // The requestItem promise just completed so _cachedCount will
-                            // be initialized.
-                            if (entity.type === _UI.ObjectType.groupHeader || entity.type === _UI.ObjectType.item) {
-                                that._view.updateAriaForAnnouncement(item, (entity.type === _UI.ObjectType.groupHeader ? that._groups.length() : that._cachedCount));
-                            }
-
-                            // Some consumers of ListView listen for item invoked events and hide the listview when an item is clicked.
-                            // Since keyboard interactions rely on async operations, sometimes an invoke event can be received before we get
-                            // to WinJS.Utilities._setActive(item), and the listview will be made invisible. If that happens and we call item.setActive(), an exception
-                            // is raised for trying to focus on an invisible item. Checking visibility is non-trivial, so it's best
-                            // just to catch the exception and ignore it.
-                            that._itemFocused = true;
-                            _ElementUtilities._setActive(item);
-                        }
-                    };
-
-                    if (entity.type === _UI.ObjectType.item) {
-                        this._focusRequest = this._view.items.requestItem(entity.index);
-                    } else if (entity.type === _UI.ObjectType.groupHeader) {
-                        this._focusRequest = this._groups.requestHeader(entity.index);
-                    } else {
-                        this._focusRequest = Promise.wrap(entity.type === _UI.ObjectType.header ? this._header : this._footer);
-                    }
-                    this._focusRequest.then(setFocusOnItemImpl);
-                },
-
-                _attachEvents: function ListView_attachEvents() {
-                    var that = this;
-
-                    function listViewHandler(eventName, caseSensitive, capture) {
-                        return {
-                            name: (caseSensitive ? eventName : eventName.toLowerCase()),
-                            handler: function (eventObject) {
-                                that["_on" + eventName](eventObject);
-                            },
-                            capture: capture
-                        };
-                    }
-
-                    function modeHandler(eventName, caseSensitive, capture) {
-                        return {
-                            capture: capture,
-                            name: (caseSensitive ? eventName : eventName.toLowerCase()),
-                            handler: function (eventObject) {
-                                var currentMode = that._mode,
-                                    name = "on" + eventName;
-                                if (!that._disposed && currentMode[name]) {
-                                    currentMode[name](eventObject);
-                                }
-                            }
-                        };
-                    }
-
-                    function observerHandler(handlerName, attributesFilter) {
-                        return {
-                            handler: function (listOfChanges) {
-                                that["_on" + handlerName](listOfChanges);
-                            },
-                            filter: attributesFilter
-                        };
-                    }
-
-                    // Observers for specific element attribute changes
-                    var elementObservers = [
-                        observerHandler("PropertyChange", ["dir", "style", "tabindex"])
-                    ];
-                    this._cachedStyleDir = this._element.style.direction;
-
-                    elementObservers.forEach(function (elementObserver) {
-                        new _ElementUtilities._MutationObserver(elementObserver.handler).observe(that._element, { attributes: true, attributeFilter: elementObserver.filter });
-                    });
-
-                    // KeyDown handler needs to be added explicitly via addEventListener instead of using attachEvent.
-                    // If it's not added via addEventListener, the eventObject given to us on event does not have the functions stopPropagation() and preventDefault().
-                    var events = [
-                        modeHandler("PointerDown"),
-                        modeHandler("click", false),
-                        modeHandler("PointerUp"),
-                        modeHandler("LostPointerCapture"),
-                        modeHandler("MSHoldVisual", true),
-                        modeHandler("PointerCancel"),
-                        modeHandler("DragStart"),
-                        modeHandler("DragOver"),
-                        modeHandler("DragEnter"),
-                        modeHandler("DragLeave"),
-                        modeHandler("Drop"),
-                        modeHandler("ContextMenu")
-                    ];
-                    events.forEach(function (eventHandler) {
-                        _ElementUtilities._addEventListener(that._viewport, eventHandler.name, eventHandler.handler, !!eventHandler.capture);
-                    });
-
-                    var elementEvents = [
-                        listViewHandler("FocusIn", false, false),
-                        listViewHandler("FocusOut", false, false),
-                        modeHandler("KeyDown"),
-                        modeHandler("KeyUp"),
-                    ];
-                    elementEvents.forEach(function (eventHandler) {
-                        _ElementUtilities._addEventListener(that._element, eventHandler.name, eventHandler.handler, !!eventHandler.capture);
-                    });
-                    this._onElementResizeBound = this._onElementResize.bind(this);
-                    _ElementUtilities._resizeNotifier.subscribe(this._element, this._onElementResizeBound);
-                    this._elementResizeInstrument = new _ElementResizeInstrument._ElementResizeInstrument();
-                    this._element.appendChild(this._elementResizeInstrument.element);
-                    this._elementResizeInstrument.addEventListener("resize", this._onElementResizeBound);
-
-                    _ElementUtilities._inDom(this.element)
-                        .then(function () {
-                            if (!that._disposed) {
-                                that._elementResizeInstrument.addedToDom();
-                            }
-                        });
-
-                    var viewportEvents = [
-                        listViewHandler("MSManipulationStateChanged", true),
-                        listViewHandler("Scroll")
-                    ];
-                    viewportEvents.forEach(function (viewportEvent) {
-                        that._viewport.addEventListener(viewportEvent.name, viewportEvent.handler, false);
-                    });
-                    this._viewport.addEventListener("onTabEnter", this._onTabEnter.bind(this));
-                    this._viewport.addEventListener("onTabExit", this._onTabExit.bind(this));
-                    this._viewport.addEventListener("onTabEntered", function (e) {
-                        that._mode.onTabEntered(e);
-                    });
-                    this._viewport.addEventListener("onTabExiting", function (e) {
-                        that._mode.onTabExiting(e);
-                    });
-                },
-
-                _updateItemsManager: function ListView_updateItemsManager() {
-                    var that = this,
-                        notificationHandler = {
-                            // Following methods are used by ItemsManager
-                            beginNotifications: function ListView_beginNotifications() {
-                            },
-
-                            changed: function ListView_changed(newItem, oldItem) {
-                                if (that._ifZombieDispose()) { return; }
-
-                                that._createUpdater();
-
-                                var elementInfo = that._updater.elements[uniqueID(oldItem)];
-                                if (elementInfo) {
-                                    var selected = that.selection._isIncluded(elementInfo.index);
-                                    if (selected) {
-                                        that._updater.updateDrag = true;
-                                    }
-
-                                    if (oldItem !== newItem) {
-                                        if (that._tabManager.childFocus === oldItem || that._updater.newFocusedItem === oldItem) {
-                                            that._updater.newFocusedItem = newItem;
-                                            that._tabManager.childFocus = null;
-                                        }
-
-                                        if (elementInfo.itemBox) {
-                                            _ElementUtilities.addClass(newItem, _Constants._itemClass);
-                                            that._setupAriaSelectionObserver(newItem);
-
-                                            var next = oldItem.nextElementSibling;
-                                            elementInfo.itemBox.removeChild(oldItem);
-                                            elementInfo.itemBox.insertBefore(newItem, next);
-                                        }
-
-                                        that._setAriaSelected(newItem, selected);
-                                        that._view.items.setItemAt(elementInfo.newIndex, {
-                                            element: newItem,
-                                            itemBox: elementInfo.itemBox,
-                                            container: elementInfo.container,
-                                            itemsManagerRecord: elementInfo.itemsManagerRecord
-                                        });
-                                        delete that._updater.elements[uniqueID(oldItem)];
-                                        _Dispose._disposeElement(oldItem);
-                                        that._updater.elements[uniqueID(newItem)] = {
-                                            item: newItem,
-                                            container: elementInfo.container,
-                                            itemBox: elementInfo.itemBox,
-                                            index: elementInfo.index,
-                                            newIndex: elementInfo.newIndex,
-                                            itemsManagerRecord: elementInfo.itemsManagerRecord
-                                        };
-                                    } else if (elementInfo.itemBox && elementInfo.container) {
-                                        _ItemEventsHandler._ItemEventsHandler.renderSelection(elementInfo.itemBox, newItem, selected, true);
-                                        _ElementUtilities[selected ? "addClass" : "removeClass"](elementInfo.container, _Constants._selectedClass);
-                                    }
-                                    that._updater.changed = true;
-                                }
-                                for (var i = 0, len = that._notificationHandlers.length; i < len; i++) {
-                                    that._notificationHandlers[i].changed(newItem, oldItem);
-                                }
-                                that._writeProfilerMark("changed,info");
-                            },
-
-                            removed: function ListView_removed(item, mirage, handle) {
-                                if (that._ifZombieDispose()) { return; }
-
-                                that._createUpdater();
-
-                                function removeFromSelection(index) {
-                                    that._updater.updateDrag = true;
-                                    if (that._currentMode()._dragging && that._currentMode()._draggingUnselectedItem && that._currentMode()._dragInfo._isIncluded(index)) {
-                                        that._updater.newDragInfo = new _SelectionManager._Selection(that, []);
-                                    }
-
-                                    var firstRange = that._updater.selectionFirst[index],
-                                        lastRange = that._updater.selectionLast[index],
-                                        range = firstRange || lastRange;
-
-                                    if (range) {
-                                        delete that._updater.selectionFirst[range.oldFirstIndex];
-                                        delete that._updater.selectionLast[range.oldLastIndex];
-                                        that._updater.selectionChanged = true;
-                                    }
-                                }
-
-                                var insertedItem = that._insertedItems[handle];
-                                if (insertedItem) {
-                                    delete that._insertedItems[handle];
-                                }
-
-                                var index;
-                                if (item) {
-                                    var elementInfo = that._updater.elements[uniqueID(item)],
-                                        itemObject = that._itemsManager.itemObject(item);
-
-                                    if (itemObject) {
-                                        that._groupFocusCache.deleteItem(itemObject.key);
-                                    }
-
-                                    if (elementInfo) {
-                                        index = elementInfo.index;
-
-                                        // We track removed elements for animation purposes (layout
-                                        // component consumes this).
-                                        //
-                                        if (elementInfo.itemBox) {
-                                            var itemBox = elementInfo.itemBox,
-                                                oddStripe = _Constants._containerOddClass,
-                                                evenStripe = _Constants._containerEvenClass,
-                                                // Store the even/odd container class from the container the itemBox was in before being removed.
-                                                // We want to reapply that class on whichever container we use to perform the itemBox's exit animation.
-                                                containerStripe = _ElementUtilities.hasClass(itemBox.parentElement, evenStripe) ? evenStripe : oddStripe;
-
-                                            that._updater.removed.push({
-                                                index: index,
-                                                itemBox: itemBox,
-                                                containerStripe: containerStripe,
-                                            });
-                                        }
-                                        that._updater.deletesCount++;
-
-                                        // The view can't access the data from the itemsManager
-                                        // anymore, so we need to flag the itemData that it
-                                        // has been removed.
-                                        //
-                                        var itemData = that._view.items.itemDataAt(index);
-                                        itemData.removed = true;
-
-                                        delete that._updater.elements[uniqueID(item)];
-                                    } else {
-                                        index = itemObject && itemObject.index;
-                                    }
-
-                                    if (that._updater.oldFocus.type !== _UI.ObjectType.groupHeader && that._updater.oldFocus.index === index) {
-                                        that._updater.newFocus.index = index; // If index is too high, it'll be fixed in endNotifications
-                                        that._updater.focusedItemRemoved = true;
-                                    }
-
-                                    removeFromSelection(index);
-                                } else {
-                                    index = that._updater.selectionHandles[handle];
-                                    if (index === +index) {
-                                        removeFromSelection(index);
-                                    }
-                                }
-                                that._writeProfilerMark("removed(" + index + "),info");
-
-                                that._updater.changed = true;
-                            },
-
-                            updateAffectedRange: function ListView_updateAffectedRange(newerRange) {
-                                that._itemsCount().then(function (count) {
-                                    // When we receive insertion notifications before all of the containers have
-                                    // been created and the affected range is beyond the container range, the
-                                    // affected range indices will not correspond to the indices of the containers
-                                    // created by updateContainers. In this case, start the affected range at the end
-                                    // of the containers so that the affected range includes any containers that get
-                                    // appended due to this batch of notifications.
-                                    var containerCount = that._view.containers ? that._view.containers.length : 0;
-                                    newerRange.start = Math.min(newerRange.start, containerCount);
-
-                                    that._affectedRange.add(newerRange, count);
-                                });
-                                that._createUpdater();
-                                that._updater.changed = true;
-                            },
-
-                            indexChanged: function ListView_indexChanged(item, newIndex, oldIndex) {
-                                // We should receive at most one indexChanged notification per oldIndex
-                                // per notification cycle.
-                                if (that._ifZombieDispose()) { return; }
-
-                                that._createUpdater();
-
-                                if (item) {
-                                    var itemObject = that._itemsManager.itemObject(item);
-                                    if (itemObject) {
-                                        that._groupFocusCache.updateItemIndex(itemObject.key, newIndex);
-                                    }
-
-                                    var elementInfo = that._updater.elements[uniqueID(item)];
-                                    if (elementInfo) {
-                                        elementInfo.newIndex = newIndex;
-                                        that._updater.changed = true;
-                                    }
-                                    that._updater.itemsMoved = true;
-                                }
-                                if (that._currentMode()._dragging && that._currentMode()._draggingUnselectedItem && that._currentMode()._dragInfo._isIncluded(oldIndex)) {
-                                    that._updater.newDragInfo = new _SelectionManager._Selection(that, [{ firstIndex: newIndex, lastIndex: newIndex }]);
-                                    that._updater.updateDrag = true;
-                                }
-
-                                if (that._updater.oldFocus.type !== _UI.ObjectType.groupHeader && that._updater.oldFocus.index === oldIndex) {
-                                    that._updater.newFocus.index = newIndex;
-                                    that._updater.changed = true;
-                                }
-
-                                if (that._updater.oldSelectionPivot === oldIndex) {
-                                    that._updater.newSelectionPivot = newIndex;
-                                    that._updater.changed = true;
-                                }
-
-                                var range = that._updater.selectionFirst[oldIndex];
-                                if (range) {
-                                    range.newFirstIndex = newIndex;
-                                    that._updater.changed = true;
-                                    that._updater.selectionChanged = true;
-                                    that._updater.updateDrag = true;
-                                }
-                                range = that._updater.selectionLast[oldIndex];
-                                if (range) {
-                                    range.newLastIndex = newIndex;
-                                    that._updater.changed = true;
-                                    that._updater.selectionChanged = true;
-                                    that._updater.updateDrag = true;
-                                }
-                            },
-
-                            endNotifications: function ListView_endNotifications() {
-                                that._update();
-                            },
-
-                            inserted: function ListView_inserted(itemPromise) {
-                                if (that._ifZombieDispose()) { return; }
-                                that._writeProfilerMark("inserted,info");
-
-                                that._createUpdater();
-                                that._updater.changed = true;
-                                itemPromise.retain();
-                                that._updater.insertsCount++;
-                                that._insertedItems[itemPromise.handle] = itemPromise;
-                            },
-
-                            moved: function ListView_moved(item, previous, next, itemPromise) {
-                                if (that._ifZombieDispose()) { return; }
-
-                                that._createUpdater();
-
-                                that._updater.movesCount++;
-                                if (item) {
-                                    that._updater.itemsMoved = true;
-
-                                    var elementInfo = that._updater.elements[uniqueID(item)];
-                                    if (elementInfo) {
-                                        elementInfo.moved = true;
-                                    }
-                                }
-
-                                var index = that._updater.selectionHandles[itemPromise.handle];
-                                if (index === +index) {
-                                    that._updater.updateDrag = true;
-                                    that._updater.selectionChanged = true;
-                                    that._updater.changed = true;
-
-                                    var firstRange = that._updater.selectionFirst[index],
-                                        lastRange = that._updater.selectionLast[index],
-                                        range = firstRange || lastRange;
-
-                                    if (range && range.oldFirstIndex !== range.oldLastIndex) {
-                                        delete that._updater.selectionFirst[range.oldFirstIndex];
-                                        delete that._updater.selectionLast[range.oldLastIndex];
-                                    }
-                                }
-                                that._writeProfilerMark("moved(" + index + "),info");
-                            },
-
-                            countChanged: function ListView_countChanged(newCount, oldCount) {
-                                if (that._ifZombieDispose()) { return; }
-                                that._writeProfilerMark("countChanged(" + newCount + "),info");
-
-                                that._cachedCount = newCount;
-                                that._createUpdater();
-
-                                if ((that._view.lastIndexDisplayed + 1) === oldCount) {
-                                    that._updater.changed = true;
-                                }
-
-                                that._updater.countDifference += newCount - oldCount;
-                            },
-
-                            reload: function ListView_reload() {
-                                if (that._ifZombieDispose()) {
-                                    return;
-                                }
-                                that._writeProfilerMark("reload,info");
-
-                                that._processReload();
-                            }
-                        };
-
-                    function statusChanged(eventObject) {
-                        if (eventObject.detail === _UI.DataSourceStatus.failure) {
-                            that.itemDataSource = null;
-                            that.groupDataSource = null;
-                        }
-                    }
-
-                    if (this._versionManager) {
-                        this._versionManager._dispose();
-                    }
-
-                    this._versionManager = new _VersionManager._VersionManager();
-                    this._updater = null;
-
-                    var ranges = this._selection.getRanges();
-                    this._selection._selected.clear();
-
-                    if (this._itemsManager) {
-
-                        if (this._itemsManager.dataSource && this._itemsManager.dataSource.removeEventListener) {
-                            this._itemsManager.dataSource.removeEventListener("statuschanged", statusChanged, false);
-                        }
-
-                        this._clearInsertedItems();
-                        this._itemsManager.release();
-                    }
-
-                    if (this._itemsCountPromise) {
-                        this._itemsCountPromise.cancel();
-                        this._itemsCountPromise = null;
-                    }
-                    this._cachedCount = _Constants._UNINITIALIZED;
-
-                    this._itemsManager = _ItemsManager._createItemsManager(
-                        this._dataSource,
-                        this._renderWithoutReuse.bind(this),
-                        notificationHandler,
-                        {
-                            ownerElement: this._element,
-                            versionManager: this._versionManager,
-                            indexInView: function (index) {
-                                return (index >= that.indexOfFirstVisible && index <= that.indexOfLastVisible);
-                            },
-                            viewCallsReady: true,
-                            profilerId: this._id
-                        });
-
-                    if (this._dataSource.addEventListener) {
-                        this._dataSource.addEventListener("statuschanged", statusChanged, false);
-                    }
-
-                    this._selection._selected.set(ranges);
-                },
-
-                _processReload: function () {
-                    this._affectedRange.addAll();
-
-                    // Inform scroll view that a realization pass is coming so that it doesn't restart the
-                    // realization pass itself.
-                    this._cancelAsyncViewWork(true);
-                    if (this._currentMode()._dragging) {
-                        this._currentMode()._clearDragProperties();
-                    }
-
-                    this._groupFocusCache.clear();
-                    this._selection._reset();
-                    this._updateItemsManager();
-                    this._pendingLayoutReset = true;
-                    this._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.low, this.scrollPosition);
-                },
-
-                _createUpdater: function ListView_createUpdater() {
-                    if (!this._updater) {
-                        if (this.itemDataSource._isVirtualizedDataSource) {
-                            // VDS doesn't support the _updateAffectedRange notification so assume
-                            // that everything needs to be relaid out.
-                            this._affectedRange.addAll();
-                        }
-                        this._versionManager.beginUpdating();
-
-                        // Inform scroll view that a realization pass is coming so that it doesn't restart the
-                        // realization pass itself.
-                        this._cancelAsyncViewWork();
-
-                        var updater = {
-                            changed: false,
-                            elements: {},
-                            selectionFirst: {},
-                            selectionLast: {},
-                            selectionHandles: {},
-                            oldSelectionPivot: { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX },
-                            newSelectionPivot: { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX },
-                            removed: [],
-                            selectionChanged: false,
-                            oldFocus: { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX },
-                            newFocus: { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX },
-                            hadKeyboardFocus: this._hasKeyboardFocus,
-                            itemsMoved: false,
-                            lastVisible: this.indexOfLastVisible,
-                            updateDrag: false,
-                            movesCount: 0,
-                            insertsCount: 0,
-                            deletesCount: 0,
-                            countDifference: 0
-                        };
-
-                        this._view.items.each(function (index, item, itemData) {
-                            updater.elements[uniqueID(item)] = {
-                                item: item,
-                                container: itemData.container,
-                                itemBox: itemData.itemBox,
-                                index: index,
-                                newIndex: index,
-                                itemsManagerRecord: itemData.itemsManagerRecord,
-                                detached: itemData.detached
-                            };
-                        });
-
-                        var selection = this._selection._selected._ranges;
-                        for (var i = 0, len = selection.length; i < len; i++) {
-                            var range = selection[i];
-                            var newRange = {
-                                newFirstIndex: selection[i].firstIndex,
-                                oldFirstIndex: selection[i].firstIndex,
-                                newLastIndex: selection[i].lastIndex,
-                                oldLastIndex: selection[i].lastIndex
-                            };
-                            updater.selectionFirst[newRange.oldFirstIndex] = newRange;
-                            updater.selectionLast[newRange.oldLastIndex] = newRange;
-                            updater.selectionHandles[range.firstPromise.handle] = newRange.oldFirstIndex;
-                            updater.selectionHandles[range.lastPromise.handle] = newRange.oldLastIndex;
-                        }
-                        updater.oldSelectionPivot = this._selection._pivot;
-                        updater.newSelectionPivot = updater.oldSelectionPivot;
-                        updater.oldFocus = this._selection._getFocused();
-                        updater.newFocus = this._selection._getFocused();
-
-                        this._updater = updater;
-                    }
-                },
-
-                _synchronize: function ListView_synchronize() {
-                    var updater = this._updater;
-                    this._updater = null;
-                    this._groupsChanged = false;
-
-                    this._countDifference = this._countDifference || 0;
-
-                    if (updater && updater.changed) {
-                        if (updater.itemsMoved) {
-                            this._layout.itemsMoved && this._layout.itemsMoved();
-                        }
-                        if (updater.removed.length) {
-                            this._layout.itemsRemoved && this._layout.itemsRemoved(updater.removed.map(function (node) {
-                                return node.itemBox;
-                            }));
-                        }
-
-                        if (updater.itemsMoved || updater.removed.length || Object.keys(this._insertedItems).length) {
-                            this._layout.setupAnimations && this._layout.setupAnimations();
-                        }
-
-                        if (this._currentMode().onDataChanged) {
-                            this._currentMode().onDataChanged();
-                        }
-
-                        var newSelection = [];
-                        for (var i in updater.selectionFirst) {
-                            if (updater.selectionFirst.hasOwnProperty(i)) {
-                                var range = updater.selectionFirst[i];
-                                updater.selectionChanged = updater.selectionChanged || ((range.newLastIndex - range.newFirstIndex) !== (range.oldLastIndex - range.oldFirstIndex));
-                                if (range.newFirstIndex <= range.newLastIndex) {
-                                    newSelection.push({
-                                        firstIndex: range.newFirstIndex,
-                                        lastIndex: range.newLastIndex
-                                    });
-                                }
-                            }
-                        }
-
-                        if (updater.selectionChanged) {
-                            var newSelectionItems = new _SelectionManager._Selection(this, newSelection);
-
-                            // We do not allow listeners to cancel the selection
-                            // change because the cancellation would also have to
-                            // prevent the deletion.
-                            this._selection._fireSelectionChanging(newSelectionItems);
-                            this._selection._selected.set(newSelection);
-                            this._selection._fireSelectionChanged();
-                            newSelectionItems.clear();
-                        } else {
-                            this._selection._selected.set(newSelection);
-                        }
-                        this._selection._updateCount(this._cachedCount);
-                        updater.newSelectionPivot = Math.min(this._cachedCount - 1, updater.newSelectionPivot);
-                        this._selection._pivot = (updater.newSelectionPivot >= 0 ? updater.newSelectionPivot : _Constants._INVALID_INDEX);
-
-                        if (updater.newFocus.type !== _UI.ObjectType.groupHeader) {
-                            updater.newFocus.index = Math.max(0, Math.min(this._cachedCount - 1, updater.newFocus.index));
-                        }
-                        this._selection._setFocused(updater.newFocus, this._selection._keyboardFocused());
-
-                        // If there are 2 edits before layoutAnimations runs we need to merge the 2 groups of modified elements.
-                        // For example:
-                        // If you start with A, B, C and add item Z to the beginning you will have
-                        // [ -1 -> 0, 0 -> 1, 1 -> 2, 2 -> 3]
-                        // However before layout is called an insert of Y to the beginning also happens you should get
-                        // [ -1 -> 0, -1 -> 1, 0 -> 2, 1 -> 3, 2 -> 4]
-                        var previousModifiedElements = this._modifiedElements || [];
-                        var previousModifiedElementsHash = {};
-                        this._modifiedElements = [];
-                        this._countDifference += updater.countDifference;
-
-                        for (i = 0; i < previousModifiedElements.length; i++) {
-                            var modifiedElement = previousModifiedElements[i];
-                            if (modifiedElement.newIndex === -1) {
-                                this._modifiedElements.push(modifiedElement);
-                            } else {
-                                previousModifiedElementsHash[modifiedElement.newIndex] = modifiedElement;
-                            }
-                        }
-
-                        for (i = 0; i < updater.removed.length; i++) {
-                            var removed = updater.removed[i];
-                            var modifiedElement = previousModifiedElementsHash[removed.index];
-                            if (modifiedElement) {
-                                delete previousModifiedElementsHash[removed.index];
-                            } else {
-                                modifiedElement = {
-                                    oldIndex: removed.index
-                                };
-                            }
-                            modifiedElement.newIndex = -1;
-                            if (!modifiedElement._removalHandled) {
-                                modifiedElement._itemBox = removed.itemBox;
-                                modifiedElement._containerStripe = removed.containerStripe;
-                            }
-                            this._modifiedElements.push(modifiedElement);
-                        }
-
-                        var insertedKeys = Object.keys(this._insertedItems);
-                        for (i = 0; i < insertedKeys.length; i++) {
-                            this._modifiedElements.push({
-                                oldIndex: -1,
-                                newIndex: this._insertedItems[insertedKeys[i]].index
-                            });
-                        }
-
-                        this._writeProfilerMark("_synchronize:update_modifiedElements,StartTM");
-                        var newItems = {};
-                        for (i in updater.elements) {
-                            if (updater.elements.hasOwnProperty(i)) {
-                                var elementInfo = updater.elements[i];
-                                newItems[elementInfo.newIndex] = {
-                                    element: elementInfo.item,
-                                    container: elementInfo.container,
-                                    itemBox: elementInfo.itemBox,
-                                    itemsManagerRecord: elementInfo.itemsManagerRecord,
-                                    detached: elementInfo.detached
-                                };
-
-                                var modifiedElement = previousModifiedElementsHash[elementInfo.index];
-                                if (modifiedElement) {
-                                    delete previousModifiedElementsHash[elementInfo.index];
-                                    modifiedElement.newIndex = elementInfo.newIndex;
-                                } else {
-                                    modifiedElement = {
-                                        oldIndex: elementInfo.index,
-                                        newIndex: elementInfo.newIndex
-                                    };
-                                }
-                                modifiedElement.moved = elementInfo.moved;
-                                this._modifiedElements.push(modifiedElement);
-                            }
-                        }
-                        this._writeProfilerMark("_synchronize:update_modifiedElements,StopTM");
-
-                        var previousIndices = Object.keys(previousModifiedElementsHash);
-                        for (i = 0; i < previousIndices.length; i++) {
-                            var key = previousIndices[i];
-                            var modifiedElement = previousModifiedElementsHash[key];
-                            if (modifiedElement.oldIndex !== -1) {
-                                this._modifiedElements.push(modifiedElement);
-                            }
-                        }
-
-                        this._view.items._itemData = newItems;
-                        if (updater.updateDrag && this._currentMode()._dragging) {
-                            if (!this._currentMode()._draggingUnselectedItem) {
-                                this._currentMode()._dragInfo = this._selection;
-                            } else if (updater.newDragInfo) {
-                                this._currentMode()._dragInfo = updater.newDragInfo;
-                            }
-                            this._currentMode().fireDragUpdateEvent();
-                        }
-
-                        // If the focused item is removed, or the item we're trying to focus on has been moved before we can focus on it,
-                        // we need to update our focus request to get the item from the appropriate index.
-                        if (updater.focusedItemRemoved || (this._focusRequest && (updater.oldFocus.index !== updater.newFocus.index) || (updater.oldFocus.type !== updater.newFocus.type))) {
-                            this._itemFocused = false;
-                            this._setFocusOnItem(this._selection._getFocused());
-                        } else if (updater.newFocusedItem) {
-                            // We need to restore the value of _hasKeyboardFocus because a changed item
-                            // gets removed from the DOM at the time of the notification. If the item
-                            // had focus at that time, then our value of _hasKeyboardFocus will have changed.
-                            this._hasKeyboardFocus = updater.hadKeyboardFocus;
-                            this._itemFocused = false;
-                            this._setFocusOnItem(this._selection._getFocused());
-                        }
-
-                        var that = this;
-                        return this._groups.synchronizeGroups().then(function () {
-                            if (updater.newFocus.type === _UI.ObjectType.groupHeader) {
-                                updater.newFocus.index = Math.min(that._groups.length() - 1, updater.newFocus.index);
-
-                                if (updater.newFocus.index < 0) {
-                                    // An empty listview has currentFocus = item 0
-                                    updater.newFocus = { type: _UI.ObjectType.item, index: 0 };
-                                }
-                                that._selection._setFocused(updater.newFocus, that._selection._keyboardFocused());
-                            }
-
-                            that._versionManager.endUpdating();
-                            if (updater.deletesCount > 0) {
-                                that._updateDeleteWrapperSize();
-                            }
-
-                            return that._view.updateTree(that._cachedCount, that._countDifference, that._modifiedElements);
-                        }).then(function () {
-                            return that._lastScrollPosition;
-                        });
-                    } else {
-                        this._countDifference += updater ? updater.countDifference : 0;
-
-                        var that = this;
-                        return this._groups.synchronizeGroups().then(function ListView_synchronizeGroups_success_groupsChanged() {
-                            updater && that._versionManager.endUpdating();
-                            return that._view.updateTree(that._cachedCount, that._countDifference, that._modifiedElements);
-                        }).then(function () {
-                            return that.scrollPosition;
-                        });
-                    }
-                },
-
-                _updateDeleteWrapperSize: function ListView_updateDeleteWrapperSize(clear) {
-                    var sizeProperty = this._horizontal() ? "width" : "height";
-                    this._deleteWrapper.style["min-" + sizeProperty] = (clear ? 0 : this.scrollPosition + this._getViewportSize()[sizeProperty]) + "px";
-                },
-
-                _verifyRealizationNeededForChange: function ListView_skipRealization() {
-                    // If the updater indicates that only deletes occurred, and we have not lost a viewport full of items,
-                    // we skip realizing all the items and appending new ones until other action causes a full realize (e.g. scrolling).
-                    //
-                    var skipRealization = false;
-                    var totalInViewport = (this._view.lastIndexDisplayed || 0) - (this._view.firstIndexDisplayed || 0);
-                    var deletesOnly = this._updater && this._updater.movesCount === 0 && this._updater.insertsCount === 0 && this._updater.deletesCount > 0 && (this._updater.deletesCount === Math.abs(this._updater.countDifference));
-                    if (deletesOnly && this._updater.elements) {
-                        // Verify that the indices of the elements in the updater are within the valid range
-                        var elementsKeys = Object.keys(this._updater.elements);
-                        for (var i = 0, len = elementsKeys.length; i < len; i++) {
-                            var element = this._updater.elements[elementsKeys[i]];
-                            var delta = element.index - element.newIndex;
-                            if (delta < 0 || delta > this._updater.deletesCount) {
-                                deletesOnly = false;
-                                break;
-                            }
-                        }
-                    }
-                    this._view.deletesWithoutRealize = this._view.deletesWithoutRealize || 0;
-
-                    if (deletesOnly &&
-                        (this._view.lastIndexDisplayed < this._view.end - totalInViewport) &&
-                        (this._updater.deletesCount + this._view.deletesWithoutRealize) < totalInViewport) {
-
-                        skipRealization = true;
-                        this._view.deletesWithoutRealize += Math.abs(this._updater.countDifference);
-                        this._writeProfilerMark("skipping realization on delete,info");
-                    } else {
-                        this._view.deletesWithoutRealize = 0;
-                    }
-                    this._view._setSkipRealizationForChange(skipRealization);
-                },
-
-                _update: function ListView_update() {
-                    this._writeProfilerMark("update,StartTM");
-                    if (this._ifZombieDispose()) { return; }
-
-                    this._updateJob = null;
-
-                    var that = this;
-                    if (this._versionManager.noOutstandingNotifications) {
-                        if (this._updater || this._groupsChanged) {
-                            this._cancelAsyncViewWork();
-                            this._verifyRealizationNeededForChange();
-                            this._synchronize().then(function (scrollbarPos) {
-                                that._writeProfilerMark("update,StopTM");
-                                that._batchViewUpdates(_Constants._ViewChange.relayout, _Constants._ScrollToPriority.low, scrollbarPos).complete();
-                            });
-                        } else {
-                            // Even if nothing important changed we need to restart aria work if it was canceled.
-                            this._batchViewUpdates(_Constants._ViewChange.relayout, _Constants._ScrollToPriority.low, this._lastScrollPosition).complete();
-                        }
-                    }
-                },
-
-                _scheduleUpdate: function ListView_scheduleUpdate() {
-                    if (!this._updateJob) {
-                        var that = this;
-                        // Batch calls to _scheduleUpdate
-                        this._updateJob = Scheduler.schedulePromiseHigh(null, "WinJS.UI.ListView._update").then(function () {
-                            if (that._updateJob) {
-                                that._update();
-                            }
-                        });
-
-                        this._raiseViewLoading();
-                    }
-                },
-
-                _createGroupsContainer: function () {
-                    if (this._groups) {
-                        this._groups.cleanUp();
-                    }
-
-                    if (this._groupDataSource) {
-                        this._groups = new _GroupsContainer._UnvirtualizedGroupsContainer(this, this._groupDataSource);
-                    } else {
-                        this._groups = new _GroupsContainer._NoGroups(this);
-                    }
-                },
-
-                _createLayoutSite: function () {
-                    var that = this;
-                    return Object.create({
-                        invalidateLayout: function () {
-                            that._pendingLayoutReset = true;
-                            var orientationChanged = (that._layout.orientation === "horizontal") !== that._horizontalLayout;
-                            that._affectedRange.addAll();
-                            that._batchViewUpdates(_Constants._ViewChange.rebuild, _Constants._ScrollToPriority.low, orientationChanged ? 0 : that.scrollPosition, false, true);
-                        },
-                        itemFromIndex: function (itemIndex) {
-                            return that._itemsManager._itemPromiseAtIndex(itemIndex);
-                        },
-                        groupFromIndex: function (groupIndex) {
-                            if (that._groupsEnabled()) {
-                                return groupIndex < that._groups.length() ? that._groups.group(groupIndex).userData : null;
-                            } else {
-                                return { key: "-1" };
-                            }
-                        },
-                        groupIndexFromItemIndex: function (itemIndex) {
-                            // If itemIndex < 0, returns 0. If itemIndex is larger than the
-                            // biggest item index, returns the last group index.
-                            itemIndex = Math.max(0, itemIndex);
-                            return that._groups.groupFromItem(itemIndex);
-                        },
-                        renderItem: function (itemPromise) {
-                            return Promise._cancelBlocker(that._itemsManager._itemFromItemPromise(itemPromise)).then(function (element) {
-                                if (element) {
-                                    var record = that._itemsManager._recordFromElement(element);
-                                    if (record.pendingReady) {
-                                        record.pendingReady();
-                                    }
-
-                                    element = element.cloneNode(true);
-
-                                    _ElementUtilities.addClass(element, _Constants._itemClass);
-
-                                    var itemBox = _Global.document.createElement("div");
-                                    _ElementUtilities.addClass(itemBox, _Constants._itemBoxClass);
-                                    itemBox.appendChild(element);
-
-                                    var container = _Global.document.createElement("div");
-                                    _ElementUtilities.addClass(container, _Constants._containerClass);
-                                    container.appendChild(itemBox);
-
-                                    return container;
-                                } else {
-                                    return Promise.cancel;
-                                }
-                            });
-                        },
-                        renderHeader: function (group) {
-                            var rendered = _ItemsManager._normalizeRendererReturn(that.groupHeaderTemplate(Promise.wrap(group)));
-                            return rendered.then(function (headerRecord) {
-                                _ElementUtilities.addClass(headerRecord.element, _Constants._headerClass);
-                                var container = _Global.document.createElement("div");
-                                _ElementUtilities.addClass(container, _Constants._headerContainerClass);
-                                container.appendChild(headerRecord.element);
-                                return container;
-                            });
-                        },
-                        readyToMeasure: function () {
-                            that._getViewportLength();
-                            that._getCanvasMargins();
-                        },
-                        _isZombie: function () {
-                            return that._isZombie();
-                        },
-                        _writeProfilerMark: function (text) {
-                            that._writeProfilerMark(text);
-                        }
-                    }, {
-                        _itemsManager: {
-                            enumerable: true,
-                            get: function () {
-                                return that._itemsManager;
-                            }
-                        },
-                        rtl: {
-                            enumerable: true,
-                            get: function () {
-                                return that._rtl();
-                            }
-                        },
-                        surface: {
-                            enumerable: true,
-                            get: function () {
-                                return that._canvas;
-                            }
-                        },
-                        viewport: {
-                            enumerable: true,
-                            get: function () {
-                                return that._viewport;
-                            }
-                        },
-                        scrollbarPos: {
-                            enumerable: true,
-                            get: function () {
-                                return that.scrollPosition;
-                            }
-                        },
-                        viewportSize: {
-                            enumerable: true,
-                            get: function () {
-                                return that._getViewportSize();
-                            }
-                        },
-                        loadingBehavior: {
-                            enumerable: true,
-                            get: function () {
-                                return that.loadingBehavior;
-                            }
-                        },
-                        animationsDisabled: {
-                            enumerable: true,
-                            get: function () {
-                                return that._animationsDisabled();
-                            }
-                        },
-                        tree: {
-                            enumerable: true,
-                            get: function () {
-                                return that._view.tree;
-                            }
-                        },
-                        realizedRange: {
-                            enumerable: true,
-                            get: function () {
-                                return {
-                                    firstPixel: Math.max(0, that.scrollPosition - 2 * that._getViewportLength()),
-                                    lastPixel: that.scrollPosition + 3 * that._getViewportLength() - 1
-                                };
-                            }
-                        },
-                        visibleRange: {
-                            enumerable: true,
-                            get: function () {
-                                return {
-                                    firstPixel: that.scrollPosition,
-                                    lastPixel: that.scrollPosition + that._getViewportLength() - 1
-                                };
-                            }
-                        },
-                        itemCount: {
-                            enumerable: true,
-                            get: function () {
-                                return that._itemsCount();
-                            }
-                        },
-                        groupCount: {
-                            enumerable: true,
-                            get: function () {
-                                return that._groups.length();
-                            }
-                        },
-                        header: {
-                            enumerable: true,
-                            get: function () {
-                                return that.header;
-                            }
-                        },
-                        footer: {
-                            enumerable: true,
-                            get: function () {
-                                return that.footer;
-                            }
-                        }
-                    });
-                },
-
-                _initializeLayout: function () {
-                    this._affectedRange.addAll();
-                    var layoutSite = this._createLayoutSite();
-                    this._layout.initialize(layoutSite, this._groupsEnabled());
-                    return this._layout.orientation === "horizontal";
-                },
-
-                _resetLayoutOrientation: function ListView_resetLayoutOrientation(resetScrollPosition) {
-                    if (this._horizontalLayout) {
-                        this._startProperty = "left";
-                        this._scrollProperty = "scrollLeft";
-                        this._scrollLength = "scrollWidth";
-                        this._deleteWrapper.style.minHeight = "";
-                        _ElementUtilities.addClass(this._viewport, _Constants._horizontalClass);
-                        _ElementUtilities.removeClass(this._viewport, _Constants._verticalClass);
-                        if (resetScrollPosition) {
-                            this._viewport.scrollTop = 0;
-                        }
-                    } else {
-                        this._startProperty = "top";
-                        this._scrollProperty = "scrollTop";
-                        this._scrollLength = "scrollHeight";
-                        this._deleteWrapper.style.minWidth = "";
-                        _ElementUtilities.addClass(this._viewport, _Constants._verticalClass);
-                        _ElementUtilities.removeClass(this._viewport, _Constants._horizontalClass);
-                        if (resetScrollPosition) {
-                            _ElementUtilities.setScrollPosition(this._viewport, { scrollLeft: 0 });
-                        }
-                    }
-                },
-
-                _resetLayout: function ListView_resetLayout() {
-                    this._pendingLayoutReset = false;
-                    this._affectedRange.addAll();
-                    if (this._layout) {
-                        this._layout.uninitialize();
-                        this._horizontalLayout = this._initializeLayout();
-                        this._resetLayoutOrientation();
-                    }
-                },
-
-                _updateLayout: function ListView_updateLayout(layoutObject) {
-                    var hadPreviousLayout = false;
-                    if (this._layout) {
-                        // The old layout is reset here in case it was in the middle of animating when the layout got changed. Reset
-                        // will cancel out the animations.
-                        this._cancelAsyncViewWork(true);
-                        this._layout.uninitialize();
-                        hadPreviousLayout = true;
-                    }
-
-                    var layoutImpl;
-                    if (layoutObject && typeof layoutObject.type === "function") {
-                        var LayoutCtor = requireSupportedForProcessing(layoutObject.type);
-                        layoutImpl = new LayoutCtor(layoutObject);
-                    } else if (layoutObject && (layoutObject.initialize)) {
-                        layoutImpl = layoutObject;
-                    } else {
-                        layoutImpl = new _Layouts.GridLayout(layoutObject);
-                    }
-
-                    hadPreviousLayout && this._resetCanvas();
-
-                    this._layoutImpl = layoutImpl;
-                    this._layout = new _Layouts._LayoutWrapper(layoutImpl);
-
-                    hadPreviousLayout && this._unsetFocusOnItem();
-                    this._setFocusOnItem({ type: _UI.ObjectType.item, index: 0 });
-                    this._selection._setFocused({ type: _UI.ObjectType.item, index: 0 });
-                    this._lastFocusedElementInGroupTrack = { type: _UI.ObjectType.item, index: -1 };
-
-                    this._headerContainer.style.opacity = 0;
-                    this._footerContainer.style.opacity = 0;
-                    this._horizontalLayout = this._initializeLayout();
-                    this._resetLayoutOrientation(hadPreviousLayout);
-
-                    if (hadPreviousLayout) {
-                        this._canvas.style.width = this._canvas.style.height = "";
-                    }
-                },
-
-                _currentMode: function ListView_currentMode() {
-                    return this._mode;
-                },
-
-                _setDraggable: function ListView_setDraggable() {
-                    var dragEnabled = (this.itemsDraggable || this.itemsReorderable);
-                    this._view.items.each(function (index, item, itemData) {
-                        if (itemData.itemBox) {
-                            itemData.itemBox.draggable = (dragEnabled && !_ElementUtilities.hasClass(item, _Constants._nonDraggableClass));
-                        }
-                    });
-                },
-
-                _resizeViewport: function ListView_resizeViewport() {
-                    this._viewportWidth = _Constants._UNINITIALIZED;
-                    this._viewportHeight = _Constants._UNINITIALIZED;
-                },
-
-                _onElementResize: function ListView_onResize() {
-                    this._writeProfilerMark("_onElementResize,info");
-                    Scheduler.schedule(function ListView_async_elementResize() {
-                        if (this._isZombie()) { return; }
-                        // If these values are uninitialized there is already a realization pass pending.
-                        if (this._viewportWidth !== _Constants._UNINITIALIZED && this._viewportHeight !== _Constants._UNINITIALIZED) {
-                            var newWidth = this._element.offsetWidth,
-                                newHeight = this._element.offsetHeight;
-                            if ((this._previousWidth !== newWidth) || (this._previousHeight !== newHeight)) {
-
-                                this._writeProfilerMark("resize (" + this._previousWidth + "x" + this._previousHeight + ") => (" + newWidth + "x" + newHeight + "),info");
-
-                                this._previousWidth = newWidth;
-                                this._previousHeight = newHeight;
-
-                                this._resizeViewport();
-
-                                var that = this;
-                                this._affectedRange.addAll();
-                                this._batchViewUpdates(_Constants._ViewChange.relayout, _Constants._ScrollToPriority.low, function () {
-                                    return {
-                                        position: that.scrollPosition,
-                                        direction: "right"
-                                    };
-                                });
-                            }
-                        }
-                    }, Scheduler.Priority.max, this, "WinJS.UI.ListView._onElementResize");
-                },
-
-                _onFocusIn: function ListView_onFocusIn(event) {
-                    this._hasKeyboardFocus = true;
-                    var that = this;
-                    function moveFocusToItem(keyboardFocused) {
-                        that._changeFocus(that._selection._getFocused(), true, false, false, keyboardFocused);
-                    }
-                    // The keyboardEventsHelper object can get focus through three ways: We give it focus explicitly, in which case _shouldHaveFocus will be true,
-                    // or the item that should be focused isn't in the viewport, so keyboard focus could only go to our helper. The third way happens when
-                    // focus was already on the keyboard helper and someone alt tabbed away from and eventually back to the app. In the second case, we want to navigate
-                    // back to the focused item via changeFocus(). In the third case, we don't want to move focus to a real item. We differentiate between cases two and three
-                    // by checking if the flag _keyboardFocusInbound is true. It'll be set to true when the tab manager notifies us about the user pressing tab
-                    // to move focus into the listview.
-                    if (event.target === this._keyboardEventsHelper) {
-                        if (!this._keyboardEventsHelper._shouldHaveFocus && this._keyboardFocusInbound) {
-                            moveFocusToItem(true);
-                        } else {
-                            this._keyboardEventsHelper._shouldHaveFocus = false;
-                        }
-                    } else if (event.target === this._element) {
-                        // If someone explicitly calls .focus() on the listview element, we need to route focus to the item that should be focused
-                        moveFocusToItem();
-                    } else {
-                        if (this._mode.inboundFocusHandled) {
-                            this._mode.inboundFocusHandled = false;
-                            return;
-                        }
-
-                        // In the event that .focus() is explicitly called on an element, we need to figure out what item got focus and set our state appropriately.
-                        var items = this._view.items,
-                            entity = {},
-                            element = this._getHeaderOrFooterFromElement(event.target),
-                            winItem = null;
-                        if (element) {
-                            entity.index = 0;
-                            entity.type = (element === this._header ? _UI.ObjectType.header : _UI.ObjectType.footer);
-                            this._lastFocusedElementInGroupTrack = entity;
-                        } else {
-                            element = this._groups.headerFrom(event.target);
-                            if (element) {
-                                entity.type = _UI.ObjectType.groupHeader;
-                                entity.index = this._groups.index(element);
-                                this._lastFocusedElementInGroupTrack = entity;
-                            } else {
-                                entity.index = items.index(event.target);
-                                entity.type = _UI.ObjectType.item;
-                                element = items.itemBoxAt(entity.index);
-                                winItem = items.itemAt(entity.index);
-                            }
-                        }
-
-                        // In the old layouts, index will be -1 if a group header got focus
-                        if (entity.index !== _Constants._INVALID_INDEX) {
-                            if (this._keyboardFocusInbound || this._selection._keyboardFocused()) {
-                                if ((entity.type === _UI.ObjectType.groupHeader && event.target === element) ||
-                                        (entity.type === _UI.ObjectType.item && event.target.parentNode === element)) {
-                                    // For items we check the parentNode because the srcElement is win-item and element is win-itembox,
-                                    // for header, they should both be the win-groupheader
-                                    this._drawFocusRectangle(element);
-                                }
-                            }
-                            if (this._tabManager.childFocus !== element && this._tabManager.childFocus !== winItem) {
-                                this._selection._setFocused(entity, this._keyboardFocusInbound || this._selection._keyboardFocused());
-                                this._keyboardFocusInbound = false;
-                                if (entity.type === _UI.ObjectType.item) {
-                                    element = items.itemAt(entity.index);
-                                }
-                                this._tabManager.childFocus = element;
-
-                                if (that._updater) {
-                                    var elementInfo = that._updater.elements[uniqueID(element)],
-                                        focusIndex = entity.index;
-                                    if (elementInfo && elementInfo.newIndex) {
-                                        focusIndex = elementInfo.newIndex;
-                                    }
-
-                                    // Note to not set old and new focus to the same object
-                                    that._updater.oldFocus = { type: entity.type, index: focusIndex };
-                                    that._updater.newFocus = { type: entity.type, index: focusIndex };
-                                }
-                            }
-                        }
-                    }
-                },
-
-                _onFocusOut: function ListView_onFocusOut(event) {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    this._hasKeyboardFocus = false;
-                    this._itemFocused = false;
-                    var element = this._view.items.itemBoxFrom(event.target) || this._groups.headerFrom(event.target);
-                    if (element) {
-                        this._clearFocusRectangle(element);
-                    }
-                },
-
-                _onMSManipulationStateChanged: function ListView_onMSManipulationStateChanged(ev) {
-                    var that = this;
-                    function done() {
-                        that._manipulationEndSignal = null;
-                    }
-
-                    this._manipulationState = ev.currentState;
-                    that._writeProfilerMark("_onMSManipulationStateChanged state(" + ev.currentState + "),info");
-
-                    if (this._manipulationState !== _ElementUtilities._MSManipulationEvent.MS_MANIPULATION_STATE_STOPPED && !this._manipulationEndSignal) {
-                        this._manipulationEndSignal = new _Signal();
-                        this._manipulationEndSignal.promise.done(done, done);
-                    }
-
-                    if (this._manipulationState === _ElementUtilities._MSManipulationEvent.MS_MANIPULATION_STATE_STOPPED) {
-                        this._manipulationEndSignal.complete();
-                    }
-                },
-
-                _pendingScroll: false,
-
-                _onScroll: function ListView_onScroll() {
-                    if (!this._zooming && !this._pendingScroll) {
-                        this._checkScroller();
-                    }
-                },
-
-                _checkScroller: function ListView_checkScroller() {
-                    if (this._isZombie()) { return; }
-
-                    var currentScrollPosition = this._viewportScrollPosition;
-                    if (currentScrollPosition !== this._lastScrollPosition) {
-                        this._pendingScroll = _BaseUtils._requestAnimationFrame(this._checkScroller.bind(this));
-
-                        currentScrollPosition = Math.max(0, currentScrollPosition);
-                        var direction = this._scrollDirection(currentScrollPosition);
-
-                        this._lastScrollPosition = currentScrollPosition;
-                        this._raiseViewLoading(true);
-                        this._raiseHeaderFooterVisibilityEvent();
-                        var that = this;
-                        this._view.onScroll(function () {
-                            return {
-                                position: that._lastScrollPosition,
-                                direction: direction
-                            };
-                        },
-                            this._manipulationEndSignal ? this._manipulationEndSignal.promise : Promise.timeout(_Constants._DEFERRED_SCROLL_END));
-                    } else {
-                        this._pendingScroll = null;
-                    }
-                },
-
-                _scrollDirection: function ListView_scrollDirectionl(currentScrollPosition) {
-                    var currentDirection = currentScrollPosition < this._lastScrollPosition ? "left" : "right";
-
-                    // When receiving a sequence of scroll positions, the browser may give us one scroll position
-                    // which doesn't fit (e.g. the scroll positions were increasing but just this one is decreasing).
-                    // To filter out this noise, _scrollDirection and _direction are stubborn -- they only change
-                    // when we've received a sequence of 3 scroll position which all indicate the same direction.
-                    return currentDirection === this._lastDirection ? currentDirection : this._direction;
-                },
-
-                _onTabEnter: function ListView_onTabEnter() {
-                    this._keyboardFocusInbound = true;
-                },
-
-                _onTabExit: function ListView_onTabExit() {
-                    this._keyboardFocusInbound = false;
-                },
-
-                _onPropertyChange: function ListView_onPropertyChange(list) {
-                    var that = this;
-                    list.forEach(function (record) {
-                        var dirChanged = false;
-                        if (record.attributeName === "dir") {
-                            dirChanged = true;
-                        } else if (record.attributeName === "style") {
-                            dirChanged = (that._cachedStyleDir !== record.target.style.direction);
-                        }
-                        if (dirChanged) {
-                            that._cachedStyleDir = record.target.style.direction;
-                            that._cachedRTL = null;
-                            _ElementUtilities[that._rtl() ? "addClass" : "removeClass"](that._element, _Constants._rtlListViewClass);
-
-                            that._lastScrollPosition = 0;
-                            that._viewportScrollPosition = 0;
-
-                            that.forceLayout();
-                        }
-
-                        if (record.attributeName === "tabIndex") {
-                            var newTabIndex = that._element.tabIndex;
-                            if (newTabIndex >= 0) {
-                                that._view.items.each(function (index, item) {
-                                    item.tabIndex = newTabIndex;
-                                });
-                                that._header && (that._header.tabIndex = newTabIndex);
-                                that._footer && (that._footer.tabIndex = newTabIndex);
-                                that._tabIndex = newTabIndex;
-                                that._tabManager.tabIndex = newTabIndex;
-                                that._element.tabIndex = -1;
-                            }
-                        }
-                    });
-                },
-
-                _getCanvasMargins: function ListView_getCanvasMargins() {
-                    if (!this._canvasMargins) {
-                        this._canvasMargins = _Layouts._getMargins(this._canvas);
-                    }
-                    return this._canvasMargins;
-                },
-
-                // Convert between canvas coordinates and viewport coordinates
-                _convertCoordinatesByCanvasMargins: function ListView_convertCoordinatesByCanvasMargins(coordinates, conversionCallback) {
-                    function fix(field, offset) {
-                        if (coordinates[field] !== undefined) {
-                            coordinates[field] = conversionCallback(coordinates[field], offset);
-                        }
-                    }
-
-                    var offset;
-                    if (this._horizontal()) {
-                        offset = this._getCanvasMargins()[this._rtl() ? "right" : "left"];
-                        fix("left", offset);
-                    } else {
-                        offset = this._getCanvasMargins().top;
-                        fix("top", offset);
-                    }
-                    fix("begin", offset);
-                    fix("end", offset);
-
-                    return coordinates;
-                },
-                _convertFromCanvasCoordinates: function ListView_convertFromCanvasCoordinates(coordinates) {
-                    return this._convertCoordinatesByCanvasMargins(coordinates, function (coordinate, canvasMargin) {
-                        return coordinate + canvasMargin;
-                    });
-                },
-                _convertToCanvasCoordinates: function ListView_convertToCanvasCoordinates(coordinates) {
-                    return this._convertCoordinatesByCanvasMargins(coordinates, function (coordinate, canvasMargin) {
-                        return coordinate - canvasMargin;
-                    });
-                },
-
-                // Methods in the site interface used by ScrollView
-                _getViewportSize: function ListView_getViewportSize() {
-                    if (this._viewportWidth === _Constants._UNINITIALIZED || this._viewportHeight === _Constants._UNINITIALIZED) {
-                        this._viewportWidth = Math.max(0, _ElementUtilities.getContentWidth(this._element));
-                        this._viewportHeight = Math.max(0, _ElementUtilities.getContentHeight(this._element));
-                        this._writeProfilerMark("viewportSizeDetected width:" + this._viewportWidth + " height:" + this._viewportHeight);
-
-                        this._previousWidth = this._element.offsetWidth;
-                        this._previousHeight = this._element.offsetHeight;
-                    }
-                    return {
-                        width: this._viewportWidth,
-                        height: this._viewportHeight
-                    };
-                },
-
-                _itemsCount: function ListView_itemsCount() {
-                    var that = this;
-                    function cleanUp() {
-                        that._itemsCountPromise = null;
-                    }
-
-                    if (this._cachedCount !== _Constants._UNINITIALIZED) {
-                        return Promise.wrap(this._cachedCount);
-                    } else {
-                        var retVal;
-                        if (!this._itemsCountPromise) {
-                            retVal = this._itemsCountPromise = this._itemsManager.dataSource.getCount().then(
-                                function (count) {
-                                    if (count === _UI.CountResult.unknown) {
-                                        count = 0;
-                                    }
-                                    that._cachedCount = count;
-                                    that._selection._updateCount(that._cachedCount);
-                                    return count;
-                                },
-                                function () {
-                                    return Promise.cancel;
-                                }
-                            );
-
-                            this._itemsCountPromise.then(cleanUp, cleanUp);
-                        } else {
-                            retVal = this._itemsCountPromise;
-                        }
-
-                        return retVal;
-                    }
-                },
-
-                _isSelected: function ListView_isSelected(index) {
-                    return this._selection._isIncluded(index);
-                },
-
-                _LoadingState: {
-                    itemsLoading: "itemsLoading",
-                    viewPortLoaded: "viewPortLoaded",
-                    itemsLoaded: "itemsLoaded",
-                    complete: "complete"
-                },
-
-                _raiseViewLoading: function ListView_raiseViewLoading(scrolling) {
-                    if (this._loadingState !== this._LoadingState.itemsLoading) {
-                        this._scrolling = !!scrolling;
-                    }
-                    this._setViewState(this._LoadingState.itemsLoading);
-                },
-
-                _raiseViewComplete: function ListView_raiseViewComplete() {
-                    if (!this._disposed && !this._view.animating) {
-                        this._setViewState(this._LoadingState.complete);
-                    }
-                },
-
-                _raiseHeaderFooterVisibilityEvent: function ListView_raiseHeaderFooterVisibilityEvent() {
-                    var that = this;
-                    var elementInViewport = function (element) {
-                        if (!element) {
-                            return false;
-                        }
-
-                        var scrollPosition = that._lastScrollPosition,
-                            elementPosition = element[(that._horizontal() ? "offsetLeft" : "offsetTop")],
-                            elementLength = element[(that._horizontal() ? "offsetWidth" : "offsetHeight")];
-
-                        return ((elementPosition + elementLength) > scrollPosition && elementPosition < (scrollPosition + that._getViewportLength()));
-                    },
-                    raiseVisibilityEvent = function (eventName, visible) {
-                        var visibilityEvent = _Global.document.createEvent("CustomEvent");
-                        visibilityEvent.initCustomEvent(eventName, true, true, { visible: visible });
-                        that._element.dispatchEvent(visibilityEvent);
-                    };
-
-                    var headerInView = (!!this._header && elementInViewport(this._headerContainer));
-                    var footerInView = (!!this._footer && elementInViewport(this._footerContainer));
-
-                    if (this._headerFooterVisibilityStatus.headerVisible !== headerInView) {
-                        this._headerFooterVisibilityStatus.headerVisible = headerInView;
-                        raiseVisibilityEvent("headervisibilitychanged", headerInView);
-                    }
-                    if (this._headerFooterVisibilityStatus.footerVisible !== footerInView) {
-                        this._headerFooterVisibilityStatus.footerVisible = footerInView;
-                        raiseVisibilityEvent("footervisibilitychanged", footerInView);
-                    }
-                },
-
-                _setViewState: function ListView_setViewState(state) {
-                    if (state !== this._loadingState) {
-                        var detail = {
-                            scrolling: false
-                        };
-                        // We can go from any state to itemsLoading but the rest of the states transitions must follow this
-                        // order: itemsLoading -> viewPortLoaded -> itemsLoaded -> complete.
-                        // Recursively set the previous state until you hit the current state or itemsLoading.
-                        switch (state) {
-                            case this._LoadingState.viewPortLoaded:
-                                if (!this._scheduledForDispose) {
-                                    scheduleForDispose(this);
-                                    this._scheduledForDispose = true;
-                                }
-                                this._setViewState(this._LoadingState.itemsLoading);
-                                break;
-
-                            case this._LoadingState.itemsLoaded:
-                                detail = {
-                                    scrolling: this._scrolling
-                                };
-                                this._setViewState(this._LoadingState.viewPortLoaded);
-                                break;
-
-                            case this._LoadingState.complete:
-                                this._setViewState(this._LoadingState.itemsLoaded);
-                                this._updateDeleteWrapperSize(true);
-                                break;
-                        }
-
-                        this._writeProfilerMark("loadingStateChanged:" + state + ",info");
-                        this._loadingState = state;
-                        var eventObject = _Global.document.createEvent("CustomEvent");
-                        eventObject.initCustomEvent("loadingstatechanged", true, false, detail);
-                        this._element.dispatchEvent(eventObject);
-                    }
-                },
-
-                _createTemplates: function ListView_createTemplates() {
-
-                    function createNodeWithClass(className, skipAriaHidden) {
-                        var element = _Global.document.createElement("div");
-                        element.className = className;
-                        if (!skipAriaHidden) {
-                            element.setAttribute("aria-hidden", true);
-                        }
-                        return element;
-                    }
-
-                    this._itemBoxTemplate = createNodeWithClass(_Constants._itemBoxClass, true);
-                },
-
-                // Methods used by SelectionManager
-                _updateSelection: function ListView_updateSelection() {
-                    var indices = this._selection.getIndices(),
-                        selectAll = this._selection.isEverything(),
-                        selectionMap = {};
-
-                    if (!selectAll) {
-                        for (var i = 0, len = indices.length ; i < len; i++) {
-                            var index = indices[i];
-                            selectionMap[index] = true;
-                        }
-                    }
-
-                    this._view.items.each(function (index, element, itemData) {
-                        if (itemData.itemBox) {
-                            var selected = selectAll || !!selectionMap[index];
-                            _ItemEventsHandler._ItemEventsHandler.renderSelection(itemData.itemBox, element, selected, true);
-                            if (itemData.container) {
-                                _ElementUtilities[selected ? "addClass" : "removeClass"](itemData.container, _Constants._selectedClass);
-                            }
-                        }
-                    });
-                },
-
-                _getViewportLength: function ListView_getViewportLength() {
-                    return this._getViewportSize()[this._horizontal() ? "width" : "height"];
-                },
-
-                _horizontal: function ListView_horizontal() {
-                    return this._horizontalLayout;
-                },
-
-                _rtl: function ListView_rtl() {
-                    if (typeof this._cachedRTL !== "boolean") {
-                        this._cachedRTL = _ElementUtilities._getComputedStyle(this._element, null).direction === "rtl";
-                    }
-                    return this._cachedRTL;
-                },
-
-                _showProgressBar: function ListView_showProgressBar(parent, x, y) {
-                    var progressBar = this._progressBar,
-                        progressStyle = progressBar.style;
-
-                    if (!progressBar.parentNode) {
-                        this._fadingProgressBar = false;
-                        if (this._progressIndicatorDelayTimer) {
-                            this._progressIndicatorDelayTimer.cancel();
-                        }
-                        var that = this;
-                        this._progressIndicatorDelayTimer = Promise.timeout(_Constants._LISTVIEW_PROGRESS_DELAY).then(function () {
-                            if (!that._isZombie()) {
-                                parent.appendChild(progressBar);
-                                Animations.fadeIn(progressBar);
-                                that._progressIndicatorDelayTimer = null;
-                            }
-                        });
-                    }
-                    progressStyle[this._rtl() ? "right" : "left"] = x;
-                    progressStyle.top = y;
-                },
-
-                _hideProgressBar: function ListView_hideProgressBar() {
-                    if (this._progressIndicatorDelayTimer) {
-                        this._progressIndicatorDelayTimer.cancel();
-                        this._progressIndicatorDelayTimer = null;
-                    }
-
-                    var progressBar = this._progressBar;
-                    if (progressBar.parentNode && !this._fadingProgressBar) {
-                        this._fadingProgressBar = true;
-                        var that = this;
-                        Animations.fadeOut(progressBar).then(function () {
-                            if (progressBar.parentNode) {
-                                progressBar.parentNode.removeChild(progressBar);
-                            }
-                            that._fadingProgressBar = false;
-                        });
-                    }
-                },
-
-                _getPanAxis: function () {
-                    return this._horizontal() ? "horizontal" : "vertical";
-                },
-
-                _configureForZoom: function (isZoomedOut, isCurrentView, triggerZoom) {
-                    if (_BaseUtils.validation) {
-                        if (!this._view.realizePage || typeof this._view.begin !== "number") {
-                            throw new _ErrorFromName("WinJS.UI.ListView.NotCompatibleWithSemanticZoom", strings.notCompatibleWithSemanticZoom);
-                        }
-                    }
-
-                    this._isZoomedOut = isZoomedOut;
-                    this._disableEntranceAnimation = !isCurrentView;
-
-                    this._isCurrentZoomView = isCurrentView;
-
-                    this._triggerZoom = triggerZoom;
-                },
-
-                _setCurrentItem: function (x, y) {
-                    // First, convert the position into canvas coordinates
-                    if (this._rtl()) {
-                        x = this._viewportWidth - x;
-                    }
-                    if (this._horizontal()) {
-                        x += this.scrollPosition;
-                    } else {
-                        y += this.scrollPosition;
-                    }
-
-                    var result = this._view.hitTest(x, y),
-                        entity = { type: result.type ? result.type : _UI.ObjectType.item, index: result.index };
-                    if (entity.index >= 0) {
-                        if (this._hasKeyboardFocus) {
-                            this._changeFocus(entity, true, false, true);
-                        } else {
-                            this._changeFocusPassively(entity);
-                        }
-                    }
-                },
-
-                _getCurrentItem: function () {
-                    var focused = this._selection._getFocused();
-
-                    if (focused.type === _UI.ObjectType.groupHeader) {
-                        focused = { type: _UI.ObjectType.item, index: this._groups.group(focused.index).startIndex };
-                    } else if (focused.type !== _UI.ObjectType.item) {
-                        focused = { type: _UI.ObjectType.item, index: (focused.type === _UI.ObjectType.header ? 0 : this._cachedCount) };
-                    }
-
-                    if (typeof focused.index !== "number") {
-                        // Do a hit-test in the viewport center
-                        this._setCurrentItem(0.5 * this._viewportWidth, 0.5 * this._viewportHeight);
-
-                        focused = this._selection._getFocused();
-                    }
-
-                    var that = this;
-                    var promisePosition = this._getItemOffsetPosition(focused.index).
-                            then(function (posCanvas) {
-                                var scrollOffset = that._canvasStart;
-
-                                posCanvas[that._startProperty] += scrollOffset;
-
-                                return posCanvas;
-                            });
-
-                    return Promise.join({
-                        item: this._dataSource.itemFromIndex(focused.index),
-                        position: promisePosition
-                    });
-                },
-
-                _animateItemsForPhoneZoom: function () {
-                    var containersOnScreen = [],
-                        itemRows = [],
-                        promises = [],
-                        minRow = Number.MAX_VALUE,
-                        that = this;
-
-                    for (var i = this._view.firstIndexDisplayed, len = Math.min(this._cachedCount, this._view.lastIndexDisplayed + 1) ; i < len; i++) {
-                        promises.push(this._view.waitForEntityPosition({ type: _UI.ObjectType.item, index: i }).then(function () {
-                            containersOnScreen.push(that._view.items.containerAt(i));
-                            var itemRow = 0;
-                            if (that.layout._getItemPosition) {
-                                var itemPosition = that.layout._getItemPosition(i);
-                                if (itemPosition.row) {
-                                    itemRow = itemPosition.row;
-                                }
-                            }
-                            itemRows.push(itemRow);
-                            minRow = Math.min(itemRow, minRow);
-                        }));
-                    }
-
-                    function rowStaggerDelay(minRow, rows, delayBetweenRows) {
-                        return function (index) {
-                            return ((rows[index] - minRow) * delayBetweenRows);
-                        };
-                    }
-
-                    function clearTransform() {
-                        for (var i = 0, len = containersOnScreen.length; i < len; i++) {
-                            containersOnScreen[i].style[transformNames.scriptName] = "";
-                        }
-                    }
-
-                    return Promise.join(promises).then(function () {
-                        return (containersOnScreen.length === 0 ? Promise.wrap() : _TransitionAnimation.executeTransition(
-                            containersOnScreen,
-                            {
-                                property: transformNames.cssName,
-                                delay: rowStaggerDelay(minRow, itemRows, 30),
-                                duration: 100,
-                                timing: "ease-in-out",
-                                from: (!that._isCurrentZoomView ? "rotateX(-90deg)" : "rotateX(0deg)"),
-                                to: (!that._isCurrentZoomView ? "rotateX(0deg)" : "rotateX(90deg)")
-                            })).then(clearTransform, clearTransform);
-                    }).then(clearTransform, clearTransform);
-                },
-
-                _beginZoom: function () {
-                    this._zooming = true;
-                    var zoomPromise = null;
-
-                    if (_BaseUtils.isPhone) {
-                        if (this._isZoomedOut) {
-                            this._zoomAnimationPromise && this._zoomAnimationPromise.cancel();
-                            // The phone's zoom animations need to be handled in two different spots.
-                            // When zooming out, we need to wait for _positionItem to be called so that we have the right items in view before trying to animate.
-                            // When zooming back in, the items we need to animate are already ready (and _positionItem won't be called on the zoomed out view, since it's
-                            // being dismissed), so we play the animation in _beginZoom.
-                            if (this._isCurrentZoomView) {
-                                var that = this;
-                                var animationComplete = function animationComplete() {
-                                    that._zoomAnimationPromise = null;
-                                };
-                                this._zoomAnimationPromise = zoomPromise = this._animateItemsForPhoneZoom().then(animationComplete, animationComplete);
-                            } else {
-                                this._zoomAnimationPromise = new _Signal();
-                                zoomPromise = this._zoomAnimationPromise.promise;
-                            }
-                        }
-                    } else {
-                        // Hide the scrollbar and extend the content beyond the ListView viewport
-                        var horizontal = this._horizontal(),
-                            scrollOffset = -this.scrollPosition;
-
-                        _ElementUtilities.addClass(this._viewport, horizontal ? _Constants._zoomingXClass : _Constants._zoomingYClass);
-                        this._canvasStart = scrollOffset;
-                        _ElementUtilities.addClass(this._viewport, horizontal ? _Constants._zoomingYClass : _Constants._zoomingXClass);
-                    }
-                    return zoomPromise;
-                },
-
-                _positionItem: function (item, position) {
-                    var that = this;
-                    function positionItemAtIndex(index) {
-                        return that._getItemOffsetPosition(index).then(function positionItemAtIndex_then_ItemOffsetPosition(posCanvas) {
-                            var horizontal = that._horizontal(),
-                                canvasSize = that._viewport[horizontal ? "scrollWidth" : "scrollHeight"],
-                                viewportSize = (horizontal ? that._viewportWidth : that._viewportHeight),
-                                headerSizeProp = (horizontal ? "headerContainerWidth" : "headerContainerHeight"),
-                                layoutSizes = that.layout._sizes,
-                                headerSize = 0,
-                                scrollPosition;
-
-                            if (layoutSizes && layoutSizes[headerSizeProp]) {
-                                headerSize = layoutSizes[headerSizeProp];
-                            }
-                            // Align the leading edge
-                            var start = (_BaseUtils.isPhone ? headerSize : position[that._startProperty]),
-                                startMax = viewportSize - (horizontal ? posCanvas.width : posCanvas.height);
-
-                            // Ensure the item ends up within the viewport
-                            start = Math.max(0, Math.min(startMax, start));
-
-                            scrollPosition = posCanvas[that._startProperty] - start;
-
-
-                            // Ensure the scroll position is valid
-                            var adjustedScrollPosition = Math.max(0, Math.min(canvasSize - viewportSize, scrollPosition)),
-                            scrollAdjustment = adjustedScrollPosition - scrollPosition;
-
-                            scrollPosition = adjustedScrollPosition;
-
-                            var entity = { type: _UI.ObjectType.item, index: index };
-                            if (that._hasKeyboardFocus) {
-                                that._changeFocus(entity, true);
-                            } else {
-                                that._changeFocusPassively(entity);
-                            }
-
-                            that._raiseViewLoading(true);
-                            // Since a zoom is in progress, adjust the div position
-                            if (!_BaseUtils.isPhone) {
-                                var scrollOffset = -scrollPosition;
-                                that._canvasStart = scrollOffset;
-                            } else {
-                                that._viewportScrollPosition = scrollPosition;
-                            }
-                            that._view.realizePage(scrollPosition, true);
-
-                            if (_BaseUtils.isPhone && that._isZoomedOut) {
-                                var animationComplete = function animationComplete() {
-                                    that._zoomAnimationPromise && that._zoomAnimationPromise.complete && that._zoomAnimationPromise.complete();
-                                    that._zoomAnimationPromise = null;
-                                };
-                                that._animateItemsForPhoneZoom().then(animationComplete, animationComplete);
-                            }
-                            return (
-                                horizontal ?
-                            { x: scrollAdjustment, y: 0 } :
-                            { x: 0, y: scrollAdjustment }
-                            );
-                        });
-                    }
-
-                    var itemIndex = 0;
-                    if (item) {
-                        itemIndex = (this._isZoomedOut ? item.groupIndexHint : item.firstItemIndexHint);
-                    }
-
-                    if (typeof itemIndex === "number") {
-                        return positionItemAtIndex(itemIndex);
-                    } else {
-                        // We'll need to obtain the index from the data source
-                        var itemPromise;
-
-                        var key = (this._isZoomedOut ? item.groupKey : item.firstItemKey);
-                        if (typeof key === "string" && this._dataSource.itemFromKey) {
-                            itemPromise = this._dataSource.itemFromKey(key, (this._isZoomedOut ? {
-                                groupMemberKey: item.key,
-                                groupMemberIndex: item.index
-                            } : null));
-                        } else {
-                            var description = (this._isZoomedOut ? item.groupDescription : item.firstItemDescription);
-
-                            if (_BaseUtils.validation) {
-                                if (description === undefined) {
-                                    throw new _ErrorFromName("WinJS.UI.ListView.InvalidItem", strings.listViewInvalidItem);
-                                }
-                            }
-
-                            itemPromise = this._dataSource.itemFromDescription(description);
-                        }
-
-                        return itemPromise.then(function (item) {
-                            return positionItemAtIndex(item.index);
-                        });
-                    }
-                },
-
-                _endZoom: function (isCurrentView) {
-                    if (this._isZombie()) {
-                        return;
-                    }
-
-                    // Crop the content again and re-enable the scrollbar
-                    if (!_BaseUtils.isPhone) {
-                        var scrollOffset = this._canvasStart;
-
-                        _ElementUtilities.removeClass(this._viewport, _Constants._zoomingYClass);
-                        _ElementUtilities.removeClass(this._viewport, _Constants._zoomingXClass);
-                        this._canvasStart = 0;
-                        this._viewportScrollPosition = -scrollOffset;
-                    }
-                    this._disableEntranceAnimation = !isCurrentView;
-                    this._isCurrentZoomView = isCurrentView;
-                    this._zooming = false;
-                    this._view.realizePage(this.scrollPosition, false);
-                },
-
-                _getItemOffsetPosition: function (index) {
-                    var that = this;
-                    return this._getItemOffset({ type: _UI.ObjectType.item, index: index }).then(function (position) {
-                        return that._ensureFirstColumnRange(_UI.ObjectType.item).then(function () {
-                            position = that._correctRangeInFirstColumn(position, _UI.ObjectType.item);
-                            position = that._convertFromCanvasCoordinates(position);
-                            if (that._horizontal()) {
-                                position.left = position.begin;
-                                position.width = position.end - position.begin;
-                                position.height = position.totalHeight;
-                            } else {
-                                position.top = position.begin;
-                                position.height = position.end - position.begin;
-                                position.width = position.totalWidth;
-                            }
-                            return position;
-                        });
-                    });
-                },
-
-                _groupRemoved: function (key) {
-                    this._groupFocusCache.deleteGroup(key);
-                },
-
-                _updateFocusCache: function (itemIndex) {
-                    if (this._updateFocusCacheItemRequest) {
-                        this._updateFocusCacheItemRequest.cancel();
-                    }
-
-                    var that = this;
-                    this._updateFocusCacheItemRequest = this._view.items.requestItem(itemIndex).then(function () {
-                        that._updateFocusCacheItemRequest = null;
-                        var itemData = that._view.items.itemDataAt(itemIndex);
-                        var groupIndex = that._groups.groupFromItem(itemIndex);
-                        var groupKey = that._groups.group(groupIndex).key;
-                        if (itemData.itemsManagerRecord.item) {
-                            that._groupFocusCache.updateCache(groupKey, itemData.itemsManagerRecord.item.key, itemIndex);
-                        }
-                    });
-                },
-
-                _changeFocus: function (newFocus, skipSelection, ctrlKeyDown, skipEnsureVisible, keyboardFocused) {
-                    if (this._isZombie()) {
-                        return;
-                    }
-                    var targetItem;
-
-                    if (newFocus.type === _UI.ObjectType.item) {
-                        targetItem = this._view.items.itemAt(newFocus.index);
-                        if (!skipSelection && targetItem && _ElementUtilities.hasClass(targetItem, _Constants._nonSelectableClass)) {
-                            skipSelection = true;
-                        }
-                        this._updateFocusCache(newFocus.index);
-                    } else if (newFocus.type === _UI.ObjectType.groupHeader) {
-                        this._lastFocusedElementInGroupTrack = newFocus;
-                        var group = this._groups.group(newFocus.index);
-                        targetItem = group && group.header;
-                    } else {
-                        this._lastFocusedElementInGroupTrack = newFocus;
-                        targetItem = (newFocus.type === _UI.ObjectType.footer ? this._footer : this._header);
-                    }
-                    this._unsetFocusOnItem(!!targetItem);
-                    this._hasKeyboardFocus = true;
-                    this._selection._setFocused(newFocus, keyboardFocused);
-                    if (!skipEnsureVisible) {
-                        this.ensureVisible(newFocus);
-                    }
-
-                    // _selection.set() needs to know which item has focus so we
-                    // must call it after _selection._setFocused() has been called.
-                    if (!skipSelection && this._selectFocused(ctrlKeyDown)) {
-                        this._selection.set(newFocus.index);
-                    }
-                    this._setFocusOnItem(newFocus);
-                },
-
-                // Updates ListView's internal focus state and, if ListView currently has focus, moves
-                // Trident's focus to the item at index newFocus.
-                // Similar to _changeFocus except _changeFocusPassively doesn't:
-                // - ensure the item is selected or visible
-                // - set Trident's focus to newFocus when ListView doesn't have focus
-                _changeFocusPassively: function (newFocus) {
-                    var targetItem;
-                    switch (newFocus.type) {
-                        case _UI.ObjectType.item:
-                            targetItem = this._view.items.itemAt(newFocus.index);
-                            this._updateFocusCache(newFocus.index);
-                            break;
-                        case _UI.ObjectType.groupHeader:
-                            this._lastFocusedElementInGroupTrack = newFocus;
-                            var group = this._groups.group(newFocus.index);
-                            targetItem = group && group.header;
-                            break;
-                        case _UI.ObjectType.header:
-                            this._lastFocusedElementInGroupTrack = newFocus;
-                            targetItem = this._header;
-                            break;
-                        case _UI.ObjectType.footer:
-                            this._lastFocusedElementInGroupTrack = newFocus;
-                            targetItem = this._footer;
-                            break;
-                    }
-                    this._unsetFocusOnItem(!!targetItem);
-                    this._selection._setFocused(newFocus);
-                    this._setFocusOnItem(newFocus);
-                },
-
-                _drawFocusRectangle: function (item) {
-                    if (item === this._header || item === this._footer) {
-                        return;
-                    }
-                    if (_ElementUtilities.hasClass(item, _Constants._headerClass)) {
-                        _ElementUtilities.addClass(item, _Constants._itemFocusClass);
-                    } else {
-                        var itemBox = this._view.items.itemBoxFrom(item);
-                        if (itemBox.querySelector("." + _Constants._itemFocusOutlineClass)) {
-                            return;
-                        }
-                        _ElementUtilities.addClass(itemBox, _Constants._itemFocusClass);
-                        var outline = _Global.document.createElement("div");
-                        outline.className = _Constants._itemFocusOutlineClass;
-                        itemBox.appendChild(outline);
-                    }
-                },
-
-                _clearFocusRectangle: function (item) {
-                    if (!item || this._isZombie() || item === this._header || item === this._footer) {
-                        return;
-                    }
-
-                    var itemBox = this._view.items.itemBoxFrom(item);
-                    if (itemBox) {
-                        _ElementUtilities.removeClass(itemBox, _Constants._itemFocusClass);
-                        var outline = itemBox.querySelector("." + _Constants._itemFocusOutlineClass);
-                        if (outline) {
-                            outline.parentNode.removeChild(outline);
-                        }
-                    } else {
-                        var header = this._groups.headerFrom(item);
-                        if (header) {
-                            _ElementUtilities.removeClass(header, _Constants._itemFocusClass);
-                        }
-                    }
-                },
-
-                _defaultInvoke: function (entity) {
-                    if (this._isZoomedOut || (_BaseUtils.isPhone && this._triggerZoom && entity.type === _UI.ObjectType.groupHeader)) {
-                        this._changeFocusPassively(entity);
-                        this._triggerZoom();
-                    }
-                },
-
-                _selectionAllowed: function ListView_selectionAllowed(itemIndex) {
-                    var item = (itemIndex !== undefined ? this.elementFromIndex(itemIndex) : null),
-                        itemSelectable = !(item && _ElementUtilities.hasClass(item, _Constants._nonSelectableClass));
-                    return itemSelectable && this._selectionMode !== _UI.SelectionMode.none;
-                },
-
-                _multiSelection: function ListView_multiSelection() {
-                    return this._selectionMode === _UI.SelectionMode.multi;
-                },
-
-                _isInSelectionMode: function ListView_isInSelectionMode() {
-                    return (this.tapBehavior === _UI.TapBehavior.toggleSelect && this.selectionMode === _UI.SelectionMode.multi);
-                },
-
-                _selectOnTap: function ListView_selectOnTap() {
-                    return this._tap === _UI.TapBehavior.toggleSelect || this._tap === _UI.TapBehavior.directSelect;
-                },
-
-                _selectFocused: function ListView_selectFocused(ctrlKeyDown) {
-                    return this._tap === _UI.TapBehavior.directSelect && this._selectionMode === _UI.SelectionMode.multi && !ctrlKeyDown;
-                },
-
-                _dispose: function () {
-                    if (!this._disposed) {
-                        this._disposed = true;
-                        var clear = function clear(e) {
-                            e && (e.textContent = "");
-                        };
-
-                        _ElementUtilities._resizeNotifier.unsubscribe(this._element, this._onElementResizeBound);
-                        this._elementResizeInstrument.dispose();
-
-                        this._batchingViewUpdates && this._batchingViewUpdates.cancel();
-
-                        this._view && this._view._dispose && this._view._dispose();
-                        this._mode && this._mode._dispose && this._mode._dispose();
-                        this._groups && this._groups._dispose && this._groups._dispose();
-                        this._selection && this._selection._dispose && this._selection._dispose();
-                        this._layout && this._layout.uninitialize && this._layout.uninitialize();
-
-                        this._itemsCountPromise && this._itemsCountPromise.cancel();
-                        this._versionManager && this._versionManager._dispose();
-                        this._clearInsertedItems();
-                        this._itemsManager && this._itemsManager.release();
-                        this._zoomAnimationPromise && this._zoomAnimationPromise.cancel();
-
-                        clear(this._viewport);
-                        clear(this._canvas);
-                        clear(this._canvasProxy);
-
-                        this._versionManager = null;
-                        this._view = null;
-                        this._mode = null;
-                        this._element = null;
-                        this._viewport = null;
-                        this._itemsManager = null;
-                        this._canvas = null;
-                        this._canvasProxy = null;
-                        this._itemsCountPromise = null;
-                        this._scrollToFunctor = null;
-
-                        var index = controlsToDispose.indexOf(this);
-                        if (index >= 0) {
-                            controlsToDispose.splice(index, 1);
-                        }
-                    }
-                },
-
-                _isZombie: function () {
-                    // determines if this ListView is no longer in the DOM or has been cleared
-                    //
-                    return this._disposed || !(this.element.firstElementChild && _Global.document.body.contains(this.element));
-                },
-
-                _ifZombieDispose: function () {
-                    var zombie = this._isZombie();
-                    if (zombie && !this._disposed) {
-                        scheduleForDispose(this);
-                    }
-                    return zombie;
-                },
-
-                _animationsDisabled: function () {
-                    if (this._viewportWidth === 0 || this._viewportHeight === 0) {
-                        return true;
-                    }
-
-                    return !_TransitionAnimation.isAnimationEnabled();
-                },
-
-                _fadeOutViewport: function ListView_fadeOutViewport() {
-                    var that = this;
-                    return new Promise(function (complete) {
-                        if (that._animationsDisabled()) {
-                            complete();
-                            return;
-                        }
-
-                        if (!that._fadingViewportOut) {
-                            if (that._waitingEntranceAnimationPromise) {
-                                that._waitingEntranceAnimationPromise.cancel();
-                                that._waitingEntranceAnimationPromise = null;
-                            }
-                            var eventDetails = that._fireAnimationEvent(ListViewAnimationType.contentTransition);
-                            that._firedAnimationEvent = true;
-                            if (!eventDetails.prevented) {
-                                that._fadingViewportOut = true;
-                                that._viewport.style.overflow = "hidden";
-                                Animations.fadeOut(that._viewport).then(function () {
-                                    if (that._isZombie()) { return; }
-                                    that._fadingViewportOut = false;
-                                    that._viewport.style.opacity = 1.0;
-                                    complete();
-                                });
-                            } else {
-                                that._disableEntranceAnimation = true;
-                                that._viewport.style.opacity = 1.0;
-                                complete();
-                            }
-                        }
-                    });
-                },
-
-                _animateListEntrance: function (firstTime) {
-                    var eventDetails = {
-                        prevented: false,
-                        animationPromise: Promise.wrap()
-                    };
-                    var that = this;
-                    this._raiseHeaderFooterVisibilityEvent();
-                    function resetViewOpacity() {
-                        that._canvas.style.opacity = 1;
-                        that._headerContainer.style.opacity = 1;
-                        that._footerContainer.style.opacity = 1;
-                        that._viewport.style.overflow = "";
-                        that._raiseHeaderFooterVisibilityEvent();
-                    }
-
-                    if (this._disableEntranceAnimation || this._animationsDisabled()) {
-                        resetViewOpacity();
-                        if (this._waitingEntranceAnimationPromise) {
-                            this._waitingEntranceAnimationPromise.cancel();
-                            this._waitingEntranceAnimationPromise = null;
-                        }
-                        return Promise.wrap();
-                    }
-
-                    if (!this._firedAnimationEvent) {
-                        eventDetails = this._fireAnimationEvent(ListViewAnimationType.entrance);
-                    } else {
-                        this._firedAnimationEvent = false;
-                    }
-
-                    // The listview does not have an entrance animation on Phone
-                    if (eventDetails.prevented || _BaseUtils.isPhone) {
-                        resetViewOpacity();
-                        return Promise.wrap();
-                    } else {
-                        if (this._waitingEntranceAnimationPromise) {
-                            this._waitingEntranceAnimationPromise.cancel();
-                        }
-                        this._canvas.style.opacity = 0;
-                        this._viewport.style.overflow = "hidden";
-                        this._headerContainer.style.opacity = 1;
-                        this._footerContainer.style.opacity = 1;
-                        this._waitingEntranceAnimationPromise = eventDetails.animationPromise.then(function () {
-                            if (!that._isZombie()) {
-                                that._canvas.style.opacity = 1;
-
-                                return Animations.enterContent(that._viewport).then(function () {
-                                    if (!that._isZombie()) {
-                                        that._waitingEntranceAnimationPromise = null;
-                                        that._viewport.style.overflow = "";
-                                    }
-                                });
-                            }
-                        });
-                        return this._waitingEntranceAnimationPromise;
-                    }
-                },
-
-                _fireAnimationEvent: function (type) {
-                    var animationEvent = _Global.document.createEvent("CustomEvent"),
-                        animationPromise = Promise.wrap();
-
-                    animationEvent.initCustomEvent("contentanimating", true, true, {
-                        type: type
-                    });
-                    if (type === ListViewAnimationType.entrance) {
-                        animationEvent.detail.setPromise = function (delayPromise) {
-                            animationPromise = delayPromise;
-                        };
-                    }
-                    var prevented = !this._element.dispatchEvent(animationEvent);
-                    return {
-                        prevented: prevented,
-                        animationPromise: animationPromise
-                    };
-                },
-
-                // If they don't yet exist, create the start and end markers which are required
-                // by Narrator's aria-flowto/flowfrom implementation. They mark the start and end
-                // of ListView's set of out-of-order DOM elements and so they must surround the
-                // headers and groups in the DOM.
-                _createAriaMarkers: function ListView_createAriaMarkers() {
-                    if (!this._viewport.getAttribute("aria-label")) {
-                        this._viewport.setAttribute("aria-label", strings.listViewViewportAriaLabel);
-                    }
-
-                    if (!this._ariaStartMarker) {
-                        this._ariaStartMarker = _Global.document.createElement("div");
-                        this._ariaStartMarker.id = uniqueID(this._ariaStartMarker);
-                        this._viewport.insertBefore(this._ariaStartMarker, this._viewport.firstElementChild);
-                    }
-                    if (!this._ariaEndMarker) {
-                        this._ariaEndMarker = _Global.document.createElement("div");
-                        this._ariaEndMarker.id = uniqueID(this._ariaEndMarker);
-                        this._viewport.appendChild(this._ariaEndMarker);
-                    }
-                },
-
-                // If the ListView is in static mode, then the roles of the list and items should be "list" and "listitem", respectively.
-                // Otherwise, the roles should be "listbox" and "option." If the ARIA roles are out of sync with the ListView's
-                // static/interactive state, update the role of the ListView and the role of each realized item.
-                _updateItemsAriaRoles: function ListView_updateItemsAriaRoles() {
-                    var that = this;
-                    var listRole = this._element.getAttribute("role"),
-                        expectedListRole,
-                        expectedItemRole;
-
-                    if (this._currentMode().staticMode()) {
-                        expectedListRole = "list";
-                        expectedItemRole = "listitem";
-                    } else {
-                        expectedListRole = "listbox";
-                        expectedItemRole = "option";
-                    }
-
-                    if (listRole !== expectedListRole || this._itemRole !== expectedItemRole) {
-                        this._element.setAttribute("role", expectedListRole);
-                        this._itemRole = expectedItemRole;
-                        this._view.items.each(function (index, itemElement) {
-                            itemElement.setAttribute("role", that._itemRole);
-                        });
-                    }
-                },
-
-                _updateGroupHeadersAriaRoles: function ListView_updateGroupHeadersAriaRoles() {
-                    var headerRole = (this.groupHeaderTapBehavior === _UI.GroupHeaderTapBehavior.none ? "separator" : "link");
-                    if (this._headerRole !== headerRole) {
-                        this._headerRole = headerRole;
-                        for (var i = 0, len = this._groups.length() ; i < len; i++) {
-                            var header = this._groups.group(i).header;
-                            if (header) {
-                                header.setAttribute("role", this._headerRole);
-                            }
-                        }
-                    }
-                },
-
-                // Avoids unnecessary UIA selection events by only updating aria-selected if it has changed
-                _setAriaSelected: function ListView_setAriaSelected(itemElement, isSelected) {
-                    var ariaSelected = (itemElement.getAttribute("aria-selected") === "true");
-
-                    if (isSelected !== ariaSelected) {
-                        itemElement.setAttribute("aria-selected", isSelected);
-                    }
-                },
-
-                _setupAriaSelectionObserver: function ListView_setupAriaSelectionObserver(item) {
-                    if (!item._mutationObserver) {
-                        this._mutationObserver.observe(item, { attributes: true, attributeFilter: ["aria-selected"] });
-                        item._mutationObserver = true;
-                    }
-                },
-
-                _itemPropertyChange: function ListView_itemPropertyChange(list) {
-                    if (this._isZombie()) { return; }
-
-                    var that = this;
-                    var singleSelection = that._selectionMode === _UI.SelectionMode.single;
-                    var changedItems = [];
-                    var unselectableItems = [];
-
-                    function revertAriaSelected(items) {
-                        items.forEach(function (entry) {
-                            entry.item.setAttribute("aria-selected", !entry.selected);
-                        });
-                    }
-
-                    for (var i = 0, len = list.length; i < len; i++) {
-                        var item = list[i].target;
-                        var itemBox = that._view.items.itemBoxFrom(item);
-                        var selected = item.getAttribute("aria-selected") === "true";
-
-                        // Only respond to aria-selected changes coming from UIA. This check
-                        // relies on the fact that, in renderSelection, we update the selection
-                        // visual before aria-selected.
-                        if (itemBox && (selected !== _ElementUtilities._isSelectionRendered(itemBox))) {
-                            var index = that._view.items.index(itemBox);
-                            var entry = { index: index, item: item, selected: selected };
-                            (that._selectionAllowed(index) ? changedItems : unselectableItems).push(entry);
-                        }
-                    }
-                    if (changedItems.length > 0) {
-                        var signal = new _Signal();
-                        that.selection._synchronize(signal).then(function () {
-                            var newSelection = that.selection._cloneSelection();
-
-                            changedItems.forEach(function (entry) {
-                                if (entry.selected) {
-                                    newSelection[singleSelection ? "set" : "add"](entry.index);
-                                } else {
-                                    newSelection.remove(entry.index);
-                                }
-                            });
-
-                            return that.selection._set(newSelection);
-                        }).then(function (approved) {
-                            if (!that._isZombie() && !approved) {
-                                // A selectionchanging event handler rejected the selection change
-                                revertAriaSelected(changedItems);
-                            }
-
-                            signal.complete();
-                        });
-                    }
-
-                    revertAriaSelected(unselectableItems);
-                },
-
-                _groupsEnabled: function () {
-                    return !!this._groups.groupDataSource;
-                },
-
-                _getItemPosition: function ListView_getItemPosition(entity, preserveItemsBlocks) {
-                    var that = this;
-                    return this._view.waitForEntityPosition(entity).then(function () {
-                        var container,
-                            alreadyCorrectedForCanvasMargins = (that._zooming && that._canvasStart !== 0);
-
-                        switch (entity.type) {
-                            case _UI.ObjectType.item:
-                                container = that._view.getContainer(entity.index);
-                                break;
-                            case _UI.ObjectType.groupHeader:
-                                container = that._view._getHeaderContainer(entity.index);
-                                break;
-                            case _UI.ObjectType.header:
-                                alreadyCorrectedForCanvasMargins = true;
-                                container = that._headerContainer;
-                                break;
-                            case _UI.ObjectType.footer:
-                                alreadyCorrectedForCanvasMargins = true;
-                                container = that._footerContainer;
-                                break;
-                        }
-
-                        if (container) {
-                            that._writeProfilerMark("WinJS.UI.ListView:getItemPosition,info");
-                            var itemsBlockFrom;
-                            var itemsBlockTo;
-                            if (that._view._expandedRange) {
-                                itemsBlockFrom = that._view._expandedRange.first.index;
-                                itemsBlockTo = that._view._expandedRange.last.index;
-                            } else {
-                                preserveItemsBlocks = false;
-                            }
-
-                            if (entity.type === _UI.ObjectType.item) {
-                                preserveItemsBlocks = !!preserveItemsBlocks;
-                                preserveItemsBlocks &= that._view._ensureContainerInDOM(entity.index);
-                            } else {
-                                preserveItemsBlocks = false;
-                            }
-
-                            var margins = that._getItemMargins(entity.type),
-                                position = {
-                                    left: (that._rtl() ? getOffsetRight(container) - margins.right : container.offsetLeft - margins.left),
-                                    top: container.offsetTop - margins.top,
-                                    totalWidth: _ElementUtilities.getTotalWidth(container),
-                                    totalHeight: _ElementUtilities.getTotalHeight(container),
-                                    contentWidth: _ElementUtilities.getContentWidth(container),
-                                    contentHeight: _ElementUtilities.getContentHeight(container)
-                                };
-
-                            if (preserveItemsBlocks) {
-                                that._view._forceItemsBlocksInDOM(itemsBlockFrom, itemsBlockTo + 1);
-                            }
-
-                            // When a translation is applied to the surface during zooming, offsetLeft includes the canvas margins, so the left/top position will already be in canvas coordinates.
-                            // If we're not zooming, we need to convert the position to canvas coordinates before returning.
-                            // We also want to skip correcting for canvas margins when we're looking at the position of the layout header or footer, since they aren't parented under the canvas.
-                            return (alreadyCorrectedForCanvasMargins ? position : that._convertToCanvasCoordinates(position));
-                        } else {
-                            return Promise.cancel;
-                        }
-                    });
-                },
-
-                _getItemOffset: function ListView_getItemOffset(entity, preserveItemsBlocks) {
-                    var that = this;
-                    return this._getItemPosition(entity, preserveItemsBlocks).then(function (pos) {
-                        // _getItemOffset also includes the right/bottom margin of the previous row/column of items, so that ensureVisible/indexOfFirstVisible will jump such that
-                        // the previous row/column is directly offscreen of the target item.
-                        var margins = that._getItemMargins(entity.type);
-                        if (that._horizontal()) {
-                            var rtl = that._rtl();
-                            pos.begin = pos.left - margins[rtl ? "left" : "right"];
-                            pos.end = pos.left + pos.totalWidth + margins[rtl ? "right" : "left"];
-                        } else {
-                            pos.begin = pos.top - margins.bottom;
-                            pos.end = pos.top + pos.totalHeight + margins.top;
-                        }
-                        return pos;
-                    });
-                },
-
-                _getItemMargins: function ListView_getItemMargins(type) {
-                    type = type || _UI.ObjectType.item;
-                    var that = this;
-                    var calculateMargins = function (className) {
-                        var item = that._canvas.querySelector("." + className),
-                                cleanup;
-
-                        if (!item) {
-                            item = _Global.document.createElement("div"),
-                            _ElementUtilities.addClass(item, className);
-                            that._viewport.appendChild(item);
-
-                            cleanup = true;
-                        }
-
-                        var margins = _Layouts._getMargins(item);
-
-                        if (cleanup) {
-                            that._viewport.removeChild(item);
-                        }
-                        return margins;
-                    };
-
-                    if (type === _UI.ObjectType.item) {
-                        return (this._itemMargins ? this._itemMargins : (this._itemMargins = calculateMargins(_Constants._containerClass)));
-                    } else if (type === _UI.ObjectType.groupHeader) {
-                        return (this._headerMargins ? this._headerMargins : (this._headerMargins = calculateMargins(_Constants._headerContainerClass)));
-                    } else {
-                        if (!this._headerFooterMargins) {
-                            this._headerFooterMargins = {
-                                headerMargins: calculateMargins(_Constants._listHeaderContainerClass),
-                                footerMargins: calculateMargins(_Constants._listFooterContainerClass)
-                            };
-                        }
-                        return this._headerFooterMargins[(type === _UI.ObjectType.header ? "headerMargins" : "footerMargins")];
-                    }
-                },
-
-                _fireAccessibilityAnnotationCompleteEvent: function ListView_fireAccessibilityAnnotationCompleteEvent(firstIndex, lastIndex, firstHeaderIndex, lastHeaderIndex) {
-                    // This event is fired in these cases:
-                    // - When the data source count is 0, it is fired after the aria markers have been
-                    //   updated. The event detail will be { firstIndex: -1, lastIndex: -1 }.
-                    // - When the data source count is non-zero, it is fired after the aria markers
-                    //   have been updated and the deferred work for the aria properties on the items
-                    //   has completed.
-                    // - When an item gets focus. The event will be { firstIndex: indexOfItem, lastIndex: indexOfItem }.
-                    var detail = {
-                        firstIndex: firstIndex,
-                        lastIndex: lastIndex,
-                        firstHeaderIndex: (+firstHeaderIndex) || -1,
-                        lastHeaderIndex: (+lastHeaderIndex) || -1
-                    };
-                    var eventObject = _Global.document.createEvent("CustomEvent");
-                    eventObject.initCustomEvent("accessibilityannotationcomplete", true, false, detail);
-                    this._element.dispatchEvent(eventObject);
-                },
-
-                _ensureFirstColumnRange: function ListView_ensureFirstColumnRange(type) {
-                    if (type === _UI.ObjectType.header || type === _UI.ObjectType.footer) {
-                        // No corrections are necessary for the layout header or footer, since they exist outside of the canvas
-                        return Promise.wrap();
-                    }
-                    var propName = (type === _UI.ObjectType.item ? "_firstItemRange" : "_firstHeaderRange");
-                    if (!this[propName]) {
-                        var that = this;
-                        return this._getItemOffset({ type: type, index: 0 }, true).then(function (firstRange) {
-                            that[propName] = firstRange;
-                        });
-                    } else {
-                        return Promise.wrap();
-                    }
-                },
-
-                _correctRangeInFirstColumn: function ListView_correctRangeInFirstColumn(range, type) {
-                    if (type === _UI.ObjectType.header || type === _UI.ObjectType.footer) {
-                        // No corrections are necessary for the layout header or footer, since they exist outside of the canvas
-                        return range;
-                    }
-                    var firstRange = (type === _UI.ObjectType.groupHeader ? this._firstHeaderRange : this._firstItemRange);
-                    if (firstRange.begin === range.begin) {
-                        if (this._horizontal()) {
-                            range.begin = -this._getCanvasMargins()[this._rtl() ? "right" : "left"];
-                        } else {
-                            range.begin = -this._getCanvasMargins().top;
-                        }
-                    }
-                    return range;
-                },
-
-                _updateContainers: function ListView_updateContainers(groups, count, containersDelta, modifiedElements) {
-                    var that = this;
-
-                    // If the ListView is still in the middle of asynchronously creating containers (i.e. createContainersWorker isn't done),
-                    // then we need to cap the number of containers we create here. Without the cap, we'll synchronously finish creating all
-                    // of the containers nullifying the responsiveness benefits of the asynchronous create containers worker. However, if
-                    // the worker has already finished, there's no need for the cap.
-                    var containerCountAfterEdits = this._view.containers.length + containersDelta;
-                    var asyncContainerCreationInProgress = containerCountAfterEdits < count;
-                    var maxContainers;
-                    if (asyncContainerCreationInProgress) {
-                        // Just create enough containers to handle the edits in the realized range. We need to create at least
-                        // this many containers so that we can play the edit animations.
-                        var countInsertedInRealizedRange = 0;
-                        for (var i = 0; i < modifiedElements.length; i++) {
-                            if (modifiedElements[i].oldIndex === -1) {
-                                countInsertedInRealizedRange++;
-                            }
-                        }
-                        maxContainers = this._view.containers.length + countInsertedInRealizedRange;
-                    } else {
-                        // Create enough containers for every item in the data source.
-                        maxContainers = count;
-                    }
-
-                    var newTree = [];
-                    var newKeyToGroupIndex = {};
-                    var newContainers = [];
-                    var removedContainers = [];
-
-                    function createContainer() {
-                        var element = _Global.document.createElement("div");
-                        element.className = _Constants._containerClass;
-                        return element;
-                    }
-
-                    function updateExistingGroupWithBlocks(groupNode, firstItem, newSize) {
-                        if (firstItem + newSize > maxContainers) {
-                            newSize = maxContainers - firstItem;
-                        }
-
-                        var itemsContainer = groupNode.itemsContainer,
-                            blocks = itemsContainer.itemsBlocks,
-                            blockSize = that._view._blockSize,
-                            lastBlock = blocks.length ? blocks[blocks.length - 1] : null,
-                            indexOfNextGroupItem = blocks.length ? (blocks.length - 1) * blockSize + lastBlock.items.length : 0,
-                            delta = newSize - indexOfNextGroupItem,
-                            children;
-
-                        if (delta > 0) {
-                            // Insert new containers.
-                            var toAdd = delta,
-                                sizeOfOldLastBlock;
-
-                            // 1) Add containers to the last itemsblock in the group if it's not already full.
-                            if (lastBlock && lastBlock.items.length < blockSize) {
-                                var emptySpotsToFill = Math.min(toAdd, blockSize - lastBlock.items.length);
-                                sizeOfOldLastBlock = lastBlock.items.length;
-
-                                var containersMarkup = _Helpers._stripedContainers(emptySpotsToFill, indexOfNextGroupItem);
-
-                                _SafeHtml.insertAdjacentHTMLUnsafe(lastBlock.element, "beforeend", containersMarkup);
-                                children = lastBlock.element.children;
-
-                                for (var j = 0; j < emptySpotsToFill; j++) {
-                                    lastBlock.items.push(children[sizeOfOldLastBlock + j]);
-                                }
-
-                                toAdd -= emptySpotsToFill;
-                            }
-                            indexOfNextGroupItem = blocks.length * blockSize;
-
-                            // 2) Generate as many full itemblocks of containers as we can.
-                            var newBlocksCount = Math.floor(toAdd / blockSize),
-                                markup = "",
-                                firstBlockFirstItemIndex = indexOfNextGroupItem,
-                                secondBlockFirstItemIndex = indexOfNextGroupItem + blockSize;
-
-                            if (newBlocksCount > 0) {
-                                var pairOfItemBlocks = [
-                                    // Use pairs to ensure that the container striping pattern is maintained regardless if blockSize is even or odd.
-                                    "<div class='win-itemsblock'>" + _Helpers._stripedContainers(blockSize, firstBlockFirstItemIndex) + "</div>",
-                                    "<div class='win-itemsblock'>" + _Helpers._stripedContainers(blockSize, secondBlockFirstItemIndex) + "</div>"
-                                ];
-                                markup = _Helpers._repeat(pairOfItemBlocks, newBlocksCount);
-                                indexOfNextGroupItem += (newBlocksCount * blockSize);
-                            }
-
-                            // 3) Generate and partially fill, one last itemblock if there are any remaining containers to add.
-                            var sizeOfNewLastBlock = toAdd % blockSize;
-                            if (sizeOfNewLastBlock > 0) {
-                                markup += "<div class='win-itemsblock'>" + _Helpers._stripedContainers(sizeOfNewLastBlock, indexOfNextGroupItem) + "</div>";
-                                indexOfNextGroupItem += sizeOfNewLastBlock;
-                                newBlocksCount++;
-                            }
-
-                            var blocksTemp = _Global.document.createElement("div");
-                            _SafeHtml.setInnerHTMLUnsafe(blocksTemp, markup);
-                            var children = blocksTemp.children;
-
-                            for (var j = 0; j < newBlocksCount; j++) {
-                                var block = children[j],
-                                    blockNode = {
-                                        element: block,
-                                        items: _Helpers._nodeListToArray(block.children)
-                                    };
-                                blocks.push(blockNode);
-                            }
-                        } else if (delta < 0) {
-                            // Remove Containers
-                            for (var n = delta; n < 0; n++) {
-
-                                var container = lastBlock.items.pop();
-
-                                if (!that._view._requireFocusRestore && container.contains(_Global.document.activeElement)) {
-                                    that._view._requireFocusRestore = _Global.document.activeElement;
-                                    that._unsetFocusOnItem();
-                                }
-
-                                lastBlock.element.removeChild(container);
-                                removedContainers.push(container);
-
-                                if (!lastBlock.items.length) {
-                                    if (itemsContainer.element === lastBlock.element.parentNode) {
-                                        itemsContainer.element.removeChild(lastBlock.element);
-                                    }
-
-                                    blocks.pop();
-                                    lastBlock = blocks[blocks.length - 1];
-                                }
-                            }
-                        }
-
-                        // Update references to containers.
-                        for (var j = 0, len = blocks.length; j < len; j++) {
-                            var block = blocks[j];
-                            for (var n = 0; n < block.items.length; n++) {
-                                newContainers.push(block.items[n]);
-                            }
-                        }
-                    }
-
-                    function addInserted(groupNode, firstItemIndex, newSize) {
-                        var added = modifiedElements.filter(function (entry) {
-                            return (entry.oldIndex === -1 && entry.newIndex >= firstItemIndex && entry.newIndex < (firstItemIndex + newSize));
-                        }).sort(function (left, right) {
-                            return left.newIndex - right.newIndex;
-                        });
-
-                        var itemsContainer = groupNode.itemsContainer;
-
-                        for (var i = 0, len = added.length; i < len; i++) {
-                            var entry = added[i],
-                                offset = entry.newIndex - firstItemIndex;
-
-                            var container = createContainer(),
-                                next = offset < itemsContainer.items.length ? itemsContainer.items[offset] : null;
-                            itemsContainer.items.splice(offset, 0, container);
-                            itemsContainer.element.insertBefore(container, next);
-                        }
-                    }
-
-                    function updateExistingGroup(groupNode, firstItem, newSize) {
-                        if (firstItem + newSize > maxContainers) {
-                            newSize = maxContainers - firstItem;
-                        }
-
-                        var itemsContainer = groupNode.itemsContainer,
-                            delta = newSize - itemsContainer.items.length;
-
-                        if (delta > 0) {
-                            var children = itemsContainer.element.children,
-                                oldSize = children.length;
-
-                            _SafeHtml.insertAdjacentHTMLUnsafe(itemsContainer.element, "beforeend", _Helpers._repeat("<div class='win-container win-backdrop'></div>", delta));
-
-                            for (var n = 0; n < delta; n++) {
-                                var container = children[oldSize + n];
-                                itemsContainer.items.push(container);
-                            }
-                        }
-
-                        for (var n = delta; n < 0; n++) {
-                            var container = itemsContainer.items.pop();
-                            itemsContainer.element.removeChild(container);
-                            removedContainers.push(container);
-                        }
-
-                        for (var n = 0, len = itemsContainer.items.length; n < len; n++) {
-                            newContainers.push(itemsContainer.items[n]);
-                        }
-                    }
-
-                    function addNewGroup(groupInfo, firstItem) {
-                        var header = that._view._createHeaderContainer(prevElement);
-
-                        var groupNode = {
-                            header: header,
-                            itemsContainer: {
-                                element: that._view._createItemsContainer(header),
-                            }
-                        };
-
-                        groupNode.itemsContainer[that._view._blockSize ? "itemsBlocks" : "items"] = [];
-
-                        if (that._view._blockSize) {
-                            updateExistingGroupWithBlocks(groupNode, firstItem, groupInfo.size);
-                        } else {
-                            updateExistingGroup(groupNode, firstItem, groupInfo.size);
-                        }
-
-                        return groupNode;
-                    }
-
-                    function shift(groupNode, oldFirstItemIndex, currentFirstItemIndex, newSize) {
-                        var currentLast = currentFirstItemIndex + newSize - 1,
-                            firstShifted,
-                            delta;
-
-                        for (var i = 0, len = modifiedElements.length; i < len; i++) {
-                            var entry = modifiedElements[i];
-                            if (entry.newIndex >= currentFirstItemIndex && entry.newIndex <= currentLast && entry.oldIndex !== -1) {
-                                if (firstShifted !== +firstShifted || entry.newIndex < firstShifted) {
-                                    firstShifted = entry.newIndex;
-                                    delta = entry.newIndex - entry.oldIndex;
-                                }
-                            }
-                        }
-
-                        if (firstShifted === +firstShifted) {
-                            var addedBeforeShift = 0;
-                            for (i = 0, len = modifiedElements.length; i < len; i++) {
-                                var entry = modifiedElements[i];
-                                if (entry.newIndex >= currentFirstItemIndex && entry.newIndex < firstShifted && entry.oldIndex === -1) {
-                                    addedBeforeShift++;
-                                }
-                            }
-                            var removedBeforeShift = 0,
-                                oldFirstShifted = firstShifted - delta;
-                            for (i = 0, len = modifiedElements.length; i < len; i++) {
-                                var entry = modifiedElements[i];
-                                if (entry.oldIndex >= oldFirstItemIndex && entry.oldIndex < oldFirstShifted && entry.newIndex === -1) {
-                                    removedBeforeShift++;
-                                }
-                            }
-
-                            delta += removedBeforeShift;
-                            delta -= addedBeforeShift;
-                            delta -= currentFirstItemIndex - oldFirstItemIndex;
-
-                            var itemsContainer = groupNode.itemsContainer;
-
-                            if (delta > 0) {
-                                var children = itemsContainer.element.children;
-
-                                _SafeHtml.insertAdjacentHTMLUnsafe(itemsContainer.element, "afterBegin", _Helpers._repeat("<div class='win-container win-backdrop'></div>", delta));
-
-                                for (var n = 0; n < delta; n++) {
-                                    var container = children[n];
-                                    itemsContainer.items.splice(n, 0, container);
-                                }
-                            }
-
-                            for (var n = delta; n < 0; n++) {
-                                var container = itemsContainer.items.shift();
-                                itemsContainer.element.removeChild(container);
-                            }
-
-                            if (delta) {
-                                // Invalidate the layout of the entire group because we do not know the exact indices which were added/modified since they were before the realization range.
-                                that._affectedRange.add({
-                                    start: currentFirstItemIndex,
-                                    end: currentFirstItemIndex + newSize
-                                }, count);
-                            }
-                        }
-                    }
-
-                    function flatIndexToGroupIndex(index) {
-                        var firstItem = 0;
-                        for (var i = 0, len = that._view.tree.length; i < len; i++) {
-                            var group = that._view.tree[i],
-                                size = group.itemsContainer.items.length,
-                                lastItem = firstItem + size - 1;
-
-                            if (index >= firstItem && index <= lastItem) {
-                                return {
-                                    group: i,
-                                    item: index - firstItem
-                                };
-                            }
-
-                            firstItem += size;
-                        }
-                    }
-
-                    var oldFirstItem = [];
-                    var firstItem = 0;
-                    if (!that._view._blockSize) {
-                        for (var i = 0, len = this._view.tree.length; i < len; i++) {
-                            oldFirstItem.push(firstItem);
-                            firstItem += this._view.tree[i].itemsContainer.items.length;
-                        }
-                    }
-
-                    if (!that._view._blockSize) {
-                        var removed = modifiedElements.filter(function (entry) {
-                            return entry.newIndex === -1 && !entry._removalHandled;
-                        }).sort(function (left, right) {
-                            return right.oldIndex - left.oldIndex;
-                        });
-
-                        for (var i = 0, len = removed.length; i < len; i++) {
-                            var entry = removed[i];
-                            entry._removalHandled = true;
-                            var itemBox = entry._itemBox;
-                            entry._itemBox = null;
-
-                            var groupIndex = flatIndexToGroupIndex(entry.oldIndex);
-                            var group = this._view.tree[groupIndex.group];
-
-                            var container = group.itemsContainer.items[groupIndex.item];
-                            container.parentNode.removeChild(container);
-
-                            if (_ElementUtilities.hasClass(itemBox, _Constants._selectedClass)) {
-                                _ElementUtilities.addClass(container, _Constants._selectedClass);
-                            }
-
-                            group.itemsContainer.items.splice(groupIndex.item, 1);
-
-                            entry.element = container;
-                        }
-                    }
-
-                    this._view._modifiedGroups = [];
-
-                    var prevElement = this._canvasProxy;
-                    firstItem = 0;
-                    // When groups are disabled, loop thru all of the groups (there's only 1).
-                    // When groups are enabled, loop until either we exhaust all of the groups in the data source
-                    // or we exhaust all of the containers that have been created so far.
-                    for (var i = 0, len = groups.length; i < len && (!this._groupsEnabled() || firstItem < maxContainers) ; i++) {
-                        var groupInfo = groups[i],
-                            existingGroupIndex = this._view.keyToGroupIndex[groupInfo.key],
-                            existingGroup = this._view.tree[existingGroupIndex];
-
-                        if (existingGroup) {
-                            if (that._view._blockSize) {
-                                updateExistingGroupWithBlocks(existingGroup, firstItem, groupInfo.size);
-                            } else {
-                                shift(existingGroup, oldFirstItem[existingGroupIndex], firstItem, groupInfo.size);
-                                addInserted(existingGroup, firstItem, groupInfo.size);
-                                updateExistingGroup(existingGroup, firstItem, groupInfo.size);
-                            }
-                            newTree.push(existingGroup);
-                            newKeyToGroupIndex[groupInfo.key] = newTree.length - 1;
-                            delete this._view.keyToGroupIndex[groupInfo.key];
-
-                            prevElement = existingGroup.itemsContainer.element;
-
-                            this._view._modifiedGroups.push({
-                                oldIndex: existingGroupIndex,
-                                newIndex: newTree.length - 1,
-                                element: existingGroup.header
-                            });
-                        } else {
-                            var newGroup = addNewGroup(groupInfo, firstItem);
-                            newTree.push(newGroup);
-                            newKeyToGroupIndex[groupInfo.key] = newTree.length - 1;
-
-                            this._view._modifiedGroups.push({
-                                oldIndex: -1,
-                                newIndex: newTree.length - 1,
-                                element: newGroup.header
-                            });
-
-                            prevElement = newGroup.itemsContainer.element;
-                        }
-                        firstItem += groupInfo.size;
-                    }
-
-                    var removedItemsContainers = [],
-                        removedHeaders = [],
-                        removedGroups = this._view.keyToGroupIndex ? Object.keys(this._view.keyToGroupIndex) : [];
-
-                    for (var i = 0, len = removedGroups.length; i < len; i++) {
-                        var groupIndex = this._view.keyToGroupIndex[removedGroups[i]],
-                            groupNode = this._view.tree[groupIndex];
-
-                        removedHeaders.push(groupNode.header);
-                        removedItemsContainers.push(groupNode.itemsContainer.element);
-
-                        if (this._view._blockSize) {
-                            for (var b = 0; b < groupNode.itemsContainer.itemsBlocks.length; b++) {
-                                var block = groupNode.itemsContainer.itemsBlocks[b];
-                                for (var n = 0; n < block.items.length; n++) {
-                                    removedContainers.push(block.items[n]);
-                                }
-                            }
-                        } else {
-                            for (var n = 0; n < groupNode.itemsContainer.items.length; n++) {
-                                removedContainers.push(groupNode.itemsContainer.items[n]);
-                            }
-                        }
-
-                        this._view._modifiedGroups.push({
-                            oldIndex: groupIndex,
-                            newIndex: -1,
-                            element: groupNode.header
-                        });
-                    }
-
-                    for (var i = 0, len = modifiedElements.length; i < len; i++) {
-                        if (modifiedElements[i].newIndex === -1 && !modifiedElements[i]._removalHandled) {
-                            modifiedElements[i]._removalHandled = true;
-                            var itemBox = modifiedElements[i]._itemBox;
-                            modifiedElements[i]._itemBox = null;
-                            var container;
-                            if (removedContainers.length) {
-                                container = removedContainers.pop();
-                                _ElementUtilities.empty(container);
-                            } else {
-                                container = createContainer();
-                            }
-                            if (_ElementUtilities.hasClass(itemBox, _Constants._selectedClass)) {
-                                _ElementUtilities.addClass(container, _Constants._selectedClass);
-                            }
-                            if (modifiedElements._containerStripe === _Constants._containerEvenClass) {
-                                _ElementUtilities.addClass(container, _Constants._containerEvenClass);
-                                _ElementUtilities.removeClass(container, _Constants._containerOddClass);
-                            } else {
-                                _ElementUtilities.addClass(container, _Constants._containerOddClass);
-                                _ElementUtilities.removeClass(container, _Constants._containerEvenClass);
-                            }
-                            container.appendChild(itemBox);
-                            modifiedElements[i].element = container;
-                        }
-                    }
-
-                    this._view.tree = newTree;
-                    this._view.keyToGroupIndex = newKeyToGroupIndex;
-                    this._view.containers = newContainers;
-
-                    return {
-                        removedHeaders: removedHeaders,
-                        removedItemsContainers: removedItemsContainers
-                    };
-                },
-
-                _writeProfilerMark: function ListView_writeProfilerMark(text) {
-                    var message = "WinJS.UI.ListView:" + this._id + ":" + text;
-                    _WriteProfilerMark(message);
-                    _Log.log && _Log.log(message, null, "listviewprofiler");
-                }
-            }, {
-                // Static members
-
-                triggerDispose: function () {
-                    /// <signature helpKeyword="WinJS.UI.ListView.triggerDispose">
-                    /// <summary locid="WinJS.UI.ListView.triggerDispose">
-                    /// Triggers the ListView disposal service manually. In normal operation this is triggered
-                    /// at ListView instantiation. However in some scenarios it may be appropriate to run
-                    /// the disposal service manually.
-                    /// </summary>
-                    /// </signature>
-                    disposeControls();
-                }
-
-            });
-            _Base.Class.mix(ListView, _Events.createEventProperties(
-                "iteminvoked",
-                "groupheaderinvoked",
-                "selectionchanging",
-                "selectionchanged",
-                "loadingstatechanged",
-                "keyboardnavigating",
-                "contentanimating",
-                "itemdragstart",
-                "itemdragenter",
-                "itemdragend",
-                "itemdragbetween",
-                "itemdragleave",
-                "itemdragchanged",
-                "itemdragdrop",
-                "headervisibilitychanged",
-                "footervisibilitychanged",
-                "accessibilityannotationcomplete"));
-            _Base.Class.mix(ListView, _Control.DOMEventMixin);
-            return ListView;
-        })
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/FlipView/_Constants',[
-    ], function constantsInit() {
-    "use strict";
-
-    var members = {};
-
-    members.datasourceCountChangedEvent = "datasourcecountchanged";
-    members.pageVisibilityChangedEvent = "pagevisibilitychanged";
-    members.pageSelectedEvent = "pageselected";
-    members.pageCompletedEvent = "pagecompleted";
-
-    return members;
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-
-define('WinJS/Controls/FlipView/_PageManager',[
-    'exports',
-    '../../Core/_Global',
-    '../../Core/_Base',
-    '../../Core/_BaseUtils',
-    '../../Core/_ErrorFromName',
-    '../../Core/_Log',
-    '../../Core/_Resources',
-    '../../Core/_WriteProfilerMark',
-    '../../Animations',
-    '../../Promise',
-    '../../_Signal',
-    '../../Scheduler',
-    '../../Utilities/_Dispose',
-    '../../Utilities/_ElementUtilities',
-    '../../Utilities/_TabContainer',
-    './_Constants'
-    ], function flipperPageManagerInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Log, _Resources, _WriteProfilerMark, Animations, Promise, _Signal, Scheduler, _Dispose, _ElementUtilities, _TabContainer, _Constants) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-
-        // Definition of our private utility
-        _FlipPageManager: _Base.Namespace._lazy(function () {
-            var uniqueID = _ElementUtilities._uniqueID;
-            var styleEquivalents = _BaseUtils._browserStyleEquivalents;
-
-            var leftBufferAmount = 50,
-                itemSelectedEventDelay = 250;
-
-            var strings = {
-                get badCurrentPage() { return "Invalid argument: currentPage must be a number greater than or equal to zero and be within the bounds of the datasource"; }
-            };
-
-            function isFlipper(element) {
-                var control = element.winControl;
-                if (control && control._isFlipView) {
-                    return true;
-                }
-
-                return false;
-            }
-
-            function flipperPropertyChanged(list) {
-                list.forEach(function (record) {
-                    var element = record.target;
-                    if (element.winControl && element.tabIndex >= 0) {
-                        element.winControl._pageManager._updateTabIndex(element.tabIndex);
-                        element.tabIndex = -1;
-                    }
-                    var that = element.winControl;
-                    if (that && that._isFlipView) {
-                        var dirChanged = false;
-                        if (record.attributeName === "dir") {
-                            dirChanged = true;
-                        } else if (record.attributeName === "style") {
-                            dirChanged = (that._cachedStyleDir !== element.style.direction);
-                        }
-                        if (dirChanged) {
-                            that._cachedStyleDir = element.style.direction;
-                            that._pageManager._rtl = _ElementUtilities._getComputedStyle(that._pageManager._flipperDiv, null).direction === "rtl";
-                            that._pageManager.resized();
-                        }
-                    }
-                });
-            }
-
-            var _FlipPageManager = _Base.Class.define(function _FlipPageManager_ctor(flipperDiv, panningDiv, panningDivContainer, itemsManager, itemSpacing, environmentSupportsTouch, buttonVisibilityHandler) {
-                // Construction
-                this._visibleElements = [];
-                this._flipperDiv = flipperDiv;
-                this._panningDiv = panningDiv;
-                this._panningDivContainer = panningDivContainer;
-                this._buttonVisibilityHandler = buttonVisibilityHandler;
-                this._currentPage = null;
-                this._rtl = _ElementUtilities._getComputedStyle(this._flipperDiv, null).direction === "rtl";
-                this._itemsManager = itemsManager;
-                this._itemSpacing = itemSpacing;
-                this._tabIndex = _ElementUtilities.getTabIndex(flipperDiv);
-                if (this._tabIndex < 0) {
-                    this._tabIndex = 0;
-                }
-                panningDiv.tabIndex = -1;
-                flipperDiv.tabIndex = -1;
-                this._tabManager = new _TabContainer.TabContainer(this._panningDivContainer);
-                this._tabManager.tabIndex = this._tabIndex;
-                this._lastSelectedPage = null;
-                this._lastSelectedElement = null;
-                this._bufferSize = _FlipPageManager.flipPageBufferCount;
-                this._cachedSize = -1;
-                this._environmentSupportsTouch = environmentSupportsTouch;
-
-                var that = this;
-                this._panningDiv.addEventListener("keydown", function (event) {
-                    if (that._blockTabs && event.keyCode === _ElementUtilities.Key.tab) {
-                        event.stopImmediatePropagation();
-                        event.preventDefault();
-                    }
-                }, true);
-                _ElementUtilities._addEventListener(this._flipperDiv, "focusin", function (event) {
-                    if (event.target === that._flipperDiv) {
-                        if (that._currentPage.element) {
-                            _ElementUtilities._setActive(that._currentPage.element);
-                        }
-                    }
-                }, false);
-                new _ElementUtilities._MutationObserver(flipperPropertyChanged).observe(this._flipperDiv, { attributes: true, attributeFilter: ["dir", "style", "tabindex"] });
-                this._cachedStyleDir = this._flipperDiv.style.direction;
-
-                this._handleManipulationStateChangedBound = this._handleManipulationStateChanged.bind(this);
-
-                if (this._environmentSupportsTouch) {
-                    this._panningDivContainer.addEventListener(_BaseUtils._browserEventEquivalents["manipulationStateChanged"], this._handleManipulationStateChangedBound, true);
-                }
-            }, {
-                // Public Methods
-
-                initialize: function (initialIndex, isHorizontal) {
-                    var currPage = null;
-                    // Every call to offsetWidth/offsetHeight causes an switch from Script to Layout which affects
-                    // the performance of the control. The values will be cached and will be updated when a resize occurs.
-                    this._panningDivContainerOffsetWidth = this._panningDivContainer.offsetWidth;
-                    this._panningDivContainerOffsetHeight = this._panningDivContainer.offsetHeight;
-                    this._isHorizontal = isHorizontal;
-                    if (!this._currentPage) {
-                        this._bufferAriaStartMarker = _Global.document.createElement("div");
-                        this._bufferAriaStartMarker.id = uniqueID(this._bufferAriaStartMarker);
-                        this._panningDiv.appendChild(this._bufferAriaStartMarker);
-
-                        this._currentPage = this._createFlipPage(null, this);
-                        currPage = this._currentPage;
-                        this._panningDiv.appendChild(currPage.pageRoot);
-
-                        // flipPageBufferCount is added here twice.
-                        // Once for the buffer prior to the current item, and once for the buffer ahead of the current item.
-                        var pagesToInit = 2 * this._bufferSize;
-                        for (var i = 0; i < pagesToInit; i++) {
-                            currPage = this._createFlipPage(currPage, this);
-                            this._panningDiv.appendChild(currPage.pageRoot);
-                        }
-
-                        this._bufferAriaEndMarker = _Global.document.createElement("div");
-                        this._bufferAriaEndMarker.id = uniqueID(this._bufferAriaEndMarker);
-                        this._panningDiv.appendChild(this._bufferAriaEndMarker);
-                    }
-
-                    this._prevMarker = this._currentPage.prev.prev;
-
-                    if (this._itemsManager) {
-                        this.setNewItemsManager(this._itemsManager, initialIndex);
-                    }
-                },
-
-                dispose: function () {
-                    var curPage = this._currentPage;
-
-                    var tmpPage = curPage;
-                    do {
-                        _Dispose._disposeElement(tmpPage.element);
-                        tmpPage = tmpPage.next;
-                    } while (tmpPage !== curPage);
-                },
-
-                setOrientation: function (isHorizontal) {
-                    if (this._notificationsEndedSignal) {
-                        var that = this;
-                        this._notificationsEndedSignal.promise.done(function () {
-                            that._notificationsEndedSignal = null;
-                            that.setOrientation(isHorizontal);
-                        });
-                        return;
-                    }
-
-                    if (isHorizontal === this._isHorizontal) {
-                        return;
-                    }
-
-                    this._isOrientationChanging = true;
-
-                    if (this._isHorizontal) {
-                        _ElementUtilities.setScrollPosition(this._panningDivContainer, { scrollLeft: this._getItemStart(this._currentPage), scrollTop: 0 });
-                    } else {
-                        _ElementUtilities.setScrollPosition(this._panningDivContainer, { scrollLeft: 0, scrollTop: this._getItemStart(this._currentPage) });
-                    }
-                    this._isHorizontal = isHorizontal;
-
-                    var containerStyle = this._panningDivContainer.style;
-                    containerStyle.overflowX = "hidden";
-                    containerStyle.overflowY = "hidden";
-
-                    var that = this;
-                    _BaseUtils._requestAnimationFrame(function () {
-                        that._isOrientationChanging = false;
-                        that._forEachPage(function (curr) {
-                            var currStyle = curr.pageRoot.style;
-                            currStyle.left = "0px";
-                            currStyle.top = "0px";
-                        });
-                        containerStyle.overflowX = ((that._isHorizontal && that._environmentSupportsTouch) ? "scroll" : "hidden");
-                        containerStyle.overflowY = ((that._isHorizontal || !that._environmentSupportsTouch) ? "hidden" : "scroll");
-                        that._ensureCentered();
-                    });
-                },
-
-                resetState: function (initialIndex) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:resetState,info");
-                    if (initialIndex !== 0) {
-                        var indexValid = this.jumpToIndex(initialIndex, true);
-                        if (!indexValid && _BaseUtils.validation) {
-                            throw new _ErrorFromName("WinJS.UI.FlipView.BadCurrentPage", strings.badCurrentPage);
-                        }
-                        return indexValid;
-                    } else {
-                        _Dispose.disposeSubTree(this._flipperDiv);
-                        this._resetBuffer(null, true);
-                        var that = this;
-                        var work = Promise.wrap(true);
-                        if (this._itemsManager) {
-                            work = that._itemsManager._firstItem().then(function (e) {
-                                that._currentPage.setElement(e);
-                                return that._fetchPreviousItems(true).
-                                    then(function () {
-                                        return that._fetchNextItems();
-                                    }).then(function () {
-                                        that._setButtonStates();
-                                    });
-                            });
-                        }
-                        return work.then(function () {
-                            that._tabManager.childFocus = that._currentPage.element;
-                            that._ensureCentered();
-                            that._itemSettledOn();
-                        });
-                    }
-                },
-
-                setNewItemsManager: function (manager, initialIndex) {
-                    this._itemsManager = manager;
-                    var that = this;
-                    return this.resetState(initialIndex).then(function () {
-                        // resetState already configures the tabManager, calls _ensureCentered and _itemSettledOn when the initial index is 0
-                        if (initialIndex !== 0) {
-                            that._tabManager.childFocus = that._currentPage.element;
-                            that._ensureCentered();
-                            that._itemSettledOn();
-                        }
-                    });
-                },
-
-                currentIndex: function () {
-                    if (!this._itemsManager) {
-                        return 0;
-                    }
-                    var index = 0;
-                    var element = (this._navigationAnimationRecord ? this._navigationAnimationRecord.newCurrentElement : this._currentPage.element);
-                    if (element) {
-                        index = this._getElementIndex(element);
-                    }
-                    return index;
-                },
-
-                resetScrollPos: function () {
-                    this._ensureCentered();
-                },
-
-                scrollPosChanged: function () {
-
-                    if (this._hasFocus) {
-                        this._hadFocus = true;
-                    }
-
-                    if (!this._itemsManager || !this._currentPage.element || this._isOrientationChanging) {
-                        return;
-                    }
-
-                    var newPos = this._getViewportStart(),
-                        bufferEnd = (this._lastScrollPos > newPos ? this._getTailOfBuffer() : this._getHeadOfBuffer());
-
-                    if (newPos === this._lastScrollPos) {
-                        return;
-                    }
-
-                    var movedPages = false;
-
-                    while (this._currentPage.element && this._currentPage.prev && this._currentPage.prev.element && newPos <= this._getItemStart(this._currentPage.prev)) {
-                        this._currentPage = this._currentPage.prev;
-                        this._fetchOnePrevious(bufferEnd.prev);
-                        bufferEnd = bufferEnd.prev;
-                        movedPages = true;
-                    }
-
-                    while (this._currentPage.element && this._currentPage.next && this._currentPage.next.element && newPos >= this._getItemStart(this._currentPage.next)) {
-                        this._currentPage = this._currentPage.next;
-                        this._fetchOneNext(bufferEnd.next);
-                        bufferEnd = bufferEnd.next;
-                        movedPages = true;
-                    }
-
-                    this._setButtonStates();
-                    this._checkElementVisibility(false);
-                    this._blockTabs = true;
-                    this._lastScrollPos = newPos;
-
-                    if (this._currentPage.element) {
-                        this._tabManager.childFocus = this._currentPage.element;
-                    }
-
-                    if (movedPages) {
-                        this._ensureCentered(true);
-                    }
-
-                    if (!this._manipulationState && this._viewportOnItemStart()) {
-                        // Setup a timeout to invoke _itemSettledOn in cases where the scroll position is changed, and the control
-                        // does not know when it has settled on an item (e.g. 1-finger swipe with narrator touch).
-                        this._currentPage.element.setAttribute("aria-setsize", this._cachedSize);
-                        this._currentPage.element.setAttribute("aria-posinset", this.currentIndex() + 1);
-                        this._timeoutPageSelection();
-                    }
-                },
-
-                itemRetrieved: function (real, placeholder) {
-                    var that = this;
-                    this._forEachPage(function (curr) {
-                        if (curr.element === placeholder) {
-                            if (curr === that._currentPage || curr === that._currentPage.next) {
-                                that._changeFlipPage(curr, placeholder, real);
-                            } else {
-                                curr.setElement(real, true);
-                            }
-                            return true;
-                        }
-                    });
-                    if (this._navigationAnimationRecord && this._navigationAnimationRecord.elementContainers) {
-                        var animatingElements = this._navigationAnimationRecord.elementContainers;
-                        for (var i = 0, len = animatingElements.length; i < len; i++) {
-                            if (animatingElements[i].element === placeholder) {
-                                that._changeFlipPage(animatingElements[i], placeholder, real);
-                                animatingElements[i].element = real;
-                            }
-                        }
-                    }
-                    this._checkElementVisibility(false);
-                },
-
-                resized: function () {
-                    this._panningDivContainerOffsetWidth = this._panningDivContainer.offsetWidth;
-                    this._panningDivContainerOffsetHeight = this._panningDivContainer.offsetHeight;
-                    var that = this;
-                    this._forEachPage(function (curr) {
-                        curr.pageRoot.style.width = that._panningDivContainerOffsetWidth + "px";
-                        curr.pageRoot.style.height = that._panningDivContainerOffsetHeight + "px";
-                    });
-
-                    // Call _ensureCentered to adjust all the width/height of the pages in the buffer
-                    this._ensureCentered();
-                    this._writeProfilerMark("WinJS.UI.FlipView:resize,StopTM");
-                },
-
-                jumpToIndex: function (index, forceJump) {
-                    // If we force jumping to an index, we are not interested in making sure that there is distance
-                    // between the current and the new index.
-                    if (!forceJump) {
-                        if (!this._itemsManager || !this._currentPage.element || index < 0) {
-                            return Promise.wrap(false);
-                        }
-
-                        // If we have to keep our pages in memory, we need to iterate through every single item from our current position to the desired target
-                        var currIndex = this._getElementIndex(this._currentPage.element),
-                            distance = Math.abs(index - currIndex);
-
-                        if (distance === 0) {
-                            return Promise.wrap(false);
-                        }
-                    }
-
-                    var tail = Promise.wrap(true);
-                    var that = this;
-
-                    tail = tail.then(function () {
-                        var itemPromise = that._itemsManager._itemPromiseAtIndex(index);
-                        return Promise.join({
-                            element: that._itemsManager._itemFromItemPromise(itemPromise),
-                            item: itemPromise
-                        }).then(function (v) {
-                            var elementAtIndex = v.element;
-
-                            // Reset the buffer regardless of whether we have elementAtIndex or not
-                            that._resetBuffer(elementAtIndex, forceJump);
-
-                            if (!elementAtIndex) {
-                                return false;
-                            }
-
-                            that._currentPage.setElement(elementAtIndex);
-                            return that._fetchNextItems().
-                                then(function () {
-                                    return that._fetchPreviousItems(true);
-                                }).
-                                then(function () {
-                                    return true;
-                                });
-                        });
-                    });
-                    tail = tail.then(function (v) {
-                        that._setButtonStates();
-                        return v;
-                    });
-
-                    return tail;
-                },
-
-                startAnimatedNavigation: function (goForward, cancelAnimationCallback, completionCallback) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:startAnimatedNavigation,info");
-                    if (this._currentPage.element) {
-                        var outgoingPage = this._currentPage,
-                            incomingPage = (goForward ? this._currentPage.next : this._currentPage.prev);
-
-                        if (incomingPage.element) {
-                            if (this._hasFocus) {
-                                // Give focus to the panning div ONLY if anything inside the flipview control currently has
-                                // focus; otherwise, it will be lost when the current page is animated during the navigation.
-                                _ElementUtilities._setActive(this._panningDiv);
-                            }
-                            this._navigationAnimationRecord = {};
-                            this._navigationAnimationRecord.goForward = goForward;
-                            this._navigationAnimationRecord.cancelAnimationCallback = cancelAnimationCallback;
-                            this._navigationAnimationRecord.completionCallback = completionCallback;
-                            this._navigationAnimationRecord.oldCurrentPage = outgoingPage;
-                            this._navigationAnimationRecord.newCurrentPage = incomingPage;
-                            var outgoingElement = outgoingPage.element;
-                            var incomingElement = incomingPage.element;
-                            this._navigationAnimationRecord.newCurrentElement = incomingElement;
-
-                            // When a page element is animated during a navigation, it is temporarily appended on a different container during the animation (see _createDiscardablePage).
-                            // However, updates in the data source can happen (change, remove, insert, etc) during the animation affecting the element that is being animated.
-                            // Therefore, the page object also maintains the elementUniqueID, and the functions that deal with re-building the internal buffer (shifting/remove/etc)
-                            // do all the comparissons, based on the page.elementUniqueID that way even if the element of the page is being animated, we are able to restore/discard it
-                            // into the internal buffer back in the correct place.
-                            outgoingPage.setElement(null, true);
-                            outgoingPage.elementUniqueID = uniqueID(outgoingElement);
-                            incomingPage.setElement(null, true);
-                            incomingPage.elementUniqueID = uniqueID(incomingElement);
-
-                            var outgoingFlipPage = this._createDiscardablePage(outgoingElement),
-                                incomingFlipPage = this._createDiscardablePage(incomingElement);
-
-                            outgoingFlipPage.pageRoot.itemIndex = this._getElementIndex(outgoingElement);
-                            incomingFlipPage.pageRoot.itemIndex = outgoingFlipPage.pageRoot.itemIndex + (goForward ? 1 : -1);
-                            outgoingFlipPage.pageRoot.style.position = "absolute";
-                            incomingFlipPage.pageRoot.style.position = "absolute";
-                            outgoingFlipPage.pageRoot.style.zIndex = 1;
-                            incomingFlipPage.pageRoot.style.zIndex = 2;
-                            this._setItemStart(outgoingFlipPage, 0);
-                            this._setItemStart(incomingFlipPage, 0);
-                            this._blockTabs = true;
-                            this._visibleElements.push(incomingElement);
-                            this._announceElementVisible(incomingElement);
-                            this._navigationAnimationRecord.elementContainers = [outgoingFlipPage, incomingFlipPage];
-                            return {
-                                outgoing: outgoingFlipPage,
-                                incoming: incomingFlipPage
-                            };
-                        }
-                    }
-                    return null;
-                },
-
-                endAnimatedNavigation: function (goForward, outgoing, incoming) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:endAnimatedNavigation,info");
-                    if (this._navigationAnimationRecord &&
-                        this._navigationAnimationRecord.oldCurrentPage &&
-                        this._navigationAnimationRecord.newCurrentPage) {
-                        var outgoingRemoved = this._restoreAnimatedElement(this._navigationAnimationRecord.oldCurrentPage, outgoing);
-                        this._restoreAnimatedElement(this._navigationAnimationRecord.newCurrentPage, incoming);
-                        if (!outgoingRemoved) {
-                            // Advance only when the element in the current page was not removed because if it did, all the pages
-                            // were shifted.
-                            this._setViewportStart(this._getItemStart(goForward ? this._currentPage.next : this._currentPage.prev));
-                        }
-                        this._navigationAnimationRecord = null;
-                        this._itemSettledOn();
-                    }
-                },
-
-                startAnimatedJump: function (index, cancelAnimationCallback, completionCallback) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:startAnimatedJump,info");
-
-                    if (this._hasFocus) {
-                        this._hadFocus = true;
-                    }
-                    if (this._currentPage.element) {
-                        var oldElement = this._currentPage.element;
-                        var oldIndex = this._getElementIndex(oldElement);
-                        var that = this;
-
-                        return that.jumpToIndex(index).then(function (v) {
-                            if (!v) {
-                                return null;
-                            }
-                            that._navigationAnimationRecord = {};
-                            that._navigationAnimationRecord.cancelAnimationCallback = cancelAnimationCallback;
-                            that._navigationAnimationRecord.completionCallback = completionCallback;
-                            that._navigationAnimationRecord.oldCurrentPage = null;
-                            that._forEachPage(function (curr) {
-                                if (curr.element === oldElement) {
-                                    that._navigationAnimationRecord.oldCurrentPage = curr;
-                                    return true;
-                                }
-                            });
-                            that._navigationAnimationRecord.newCurrentPage = that._currentPage;
-                            if (that._navigationAnimationRecord.newCurrentPage === that._navigationAnimationRecord.oldCurrentPage) {
-                                return null;
-                            }
-                            var newElement = that._currentPage.element;
-                            that._navigationAnimationRecord.newCurrentElement = newElement;
-
-                            // When a page element is animated during a jump, it is temporarily appended on a different container during the animation (see _createDiscardablePage).
-                            // However, updates in the data source can happen (change, remove, insert, etc) during the animation affecting the element that is being animated.
-                            // Therefore, the page object also maintains the elementUniqueID, and the functions that deal with re-building the internal buffer (shifting/remove/etc)
-                            // do all the comparissons, based on the page.elementUniqueID that way even if the element of the page is being animated, we are able to restore/discard it
-                            // into the internal buffer back in the correct place.
-                            that._currentPage.setElement(null, true);
-                            that._currentPage.elementUniqueID = uniqueID(newElement);
-
-                            if (that._navigationAnimationRecord.oldCurrentPage) {
-                                that._navigationAnimationRecord.oldCurrentPage.setElement(null, true);
-                            }
-
-                            var oldFlipPage = that._createDiscardablePage(oldElement),
-                                newFlipPage = that._createDiscardablePage(newElement);
-                            oldFlipPage.pageRoot.itemIndex = oldIndex;
-                            newFlipPage.pageRoot.itemIndex = index;
-                            oldFlipPage.pageRoot.style.position = "absolute";
-                            newFlipPage.pageRoot.style.position = "absolute";
-                            oldFlipPage.pageRoot.style.zIndex = 1;
-                            newFlipPage.pageRoot.style.zIndex = 2;
-                            that._setItemStart(oldFlipPage, 0);
-                            that._setItemStart(newFlipPage, that._itemSize(that._currentPage));
-                            that._visibleElements.push(newElement);
-                            that._announceElementVisible(newElement);
-                            that._navigationAnimationRecord.elementContainers = [oldFlipPage, newFlipPage];
-                            that._blockTabs = true;
-                            return {
-                                oldPage: oldFlipPage,
-                                newPage: newFlipPage
-                            };
-                        });
-                    }
-
-                    return Promise.wrap(null);
-                },
-
-                simulateMouseWheelScroll: function (ev) {
-
-                    if (this._environmentSupportsTouch || this._waitingForMouseScroll) {
-                        return;
-                    }
-
-                    var wheelingForward;
-
-                    if (typeof ev.deltaY === 'number') {
-                        wheelingForward = (ev.deltaX || ev.deltaY) > 0;
-                    } else {
-                        wheelingForward = ev.wheelDelta < 0;
-                    }
-
-                    var targetPage = wheelingForward ? this._currentPage.next : this._currentPage.prev;
-
-                    if (!targetPage.element) {
-                        return;
-                    }
-
-                    var zoomToContent = { contentX: 0, contentY: 0, viewportX: 0, viewportY: 0 };
-                    zoomToContent[this._isHorizontal ? "contentX" : "contentY"] = this._getItemStart(targetPage);
-                    _ElementUtilities._zoomTo(this._panningDivContainer, zoomToContent);
-                    this._waitingForMouseScroll = true;
-
-                    // The 100ms is added to the zoom duration to give the snap feeling where the page sticks
-                    // while scrolling
-                    _Global.setTimeout(function () {
-                        this._waitingForMouseScroll = false;
-                    }.bind(this), _ElementUtilities._zoomToDuration + 100);
-                },
-
-                endAnimatedJump: function (oldCurr, newCurr) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:endAnimatedJump,info");
-                    if (this._navigationAnimationRecord.oldCurrentPage) {
-                        this._navigationAnimationRecord.oldCurrentPage.setElement(oldCurr.element, true);
-                    } else {
-                        if (oldCurr.element.parentNode) {
-                            oldCurr.element.parentNode.removeChild(oldCurr.element);
-                        }
-                    }
-                    this._navigationAnimationRecord.newCurrentPage.setElement(newCurr.element, true);
-                    this._navigationAnimationRecord = null;
-                    this._ensureCentered();
-                    this._itemSettledOn();
-                },
-
-                inserted: function (element, prev, next, animateInsertion) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:inserted,info");
-                    var curr = this._prevMarker,
-                        passedCurrent = false,
-                        elementSuccessfullyPlaced = false;
-
-                    if (animateInsertion) {
-                        this._createAnimationRecord(uniqueID(element), null);
-                        this._getAnimationRecord(element).inserted = true;
-                    }
-
-                    if (!prev) {
-                        if (!next) {
-                            this._currentPage.setElement(element);
-                        } else {
-                            while (curr.next !== this._prevMarker && curr.elementUniqueID !== uniqueID(next)) {
-                                if (curr === this._currentPage) {
-                                    passedCurrent = true;
-                                }
-                                curr = curr.next;
-                            }
-
-                            if (curr.elementUniqueID === uniqueID(next) && curr !== this._prevMarker) {
-                                curr.prev.setElement(element);
-                                elementSuccessfullyPlaced = true;
-                            } else {
-                                this._releaseElementIfNotAnimated(element);
-                            }
-                        }
-                    } else {
-                        do {
-                            if (curr === this._currentPage) {
-                                passedCurrent = true;
-                            }
-                            if (curr.elementUniqueID === uniqueID(prev)) {
-                                elementSuccessfullyPlaced = true;
-                                var pageShifted = curr,
-                                    lastElementMoved = element,
-                                    lastElementMovedUniqueID = uniqueID(element),
-                                    temp;
-                                if (passedCurrent) {
-                                    while (pageShifted.next !== this._prevMarker) {
-                                        temp = pageShifted.next.element;
-                                        lastElementMovedUniqueID = pageShifted.next.elementUniqueID;
-                                        pageShifted.next.setElement(lastElementMoved, true);
-                                        if (!lastElementMoved && lastElementMovedUniqueID) {
-                                            // Shift the uniqueID of the page manually since its element is being animated.
-                                            // This page  will not contain the element until the animation completes.
-                                            pageShifted.next.elementUniqueID = lastElementMovedUniqueID;
-                                        }
-                                        lastElementMoved = temp;
-                                        pageShifted = pageShifted.next;
-                                    }
-                                } else {
-                                    if (curr.elementUniqueID === curr.next.elementUniqueID && curr.elementUniqueID) {
-                                        pageShifted = curr.next;
-                                    }
-                                    while (pageShifted.next !== this._prevMarker) {
-                                        temp = pageShifted.element;
-                                        lastElementMovedUniqueID = pageShifted.elementUniqueID;
-                                        pageShifted.setElement(lastElementMoved, true);
-                                        if (!lastElementMoved && lastElementMovedUniqueID) {
-                                            // Shift the uniqueID of the page manually since its element is being animated.
-                                            // This page  will not contain the element until the animation completes.
-                                            pageShifted.elementUniqueID = lastElementMovedUniqueID;
-                                        }
-                                        lastElementMoved = temp;
-                                        pageShifted = pageShifted.prev;
-                                    }
-                                }
-                                if (lastElementMoved) {
-                                    var reused = false;
-                                    this._forEachPage(function (curr) {
-                                        if (uniqueID(lastElementMoved) === curr.elementUniqueID) {
-                                            reused = true;
-                                            return true;
-                                        }
-                                    });
-                                    if (!reused) {
-                                        this._releaseElementIfNotAnimated(lastElementMoved);
-                                    }
-                                }
-                                break;
-                            }
-                            curr = curr.next;
-                        } while (curr !== this._prevMarker);
-                    }
-
-                    this._getAnimationRecord(element).successfullyMoved = elementSuccessfullyPlaced;
-                    this._setButtonStates();
-                },
-
-                changed: function (newVal, element) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:changed,info");
-                    var that = this;
-                    this._forEachPage(function (curr) {
-                        if (curr.elementUniqueID === uniqueID(element)) {
-                            var record = that._animationRecords[curr.elementUniqueID];
-                            record.changed = true;
-                            record.oldElement = element;
-                            record.newElement = newVal;
-                            curr.element = newVal; // We set curr's element field here so that next/prev works, but we won't update the visual until endNotifications
-                            curr.elementUniqueID = uniqueID(newVal);
-                            that._animationRecords[uniqueID(newVal)] = record;
-                            return true;
-                        }
-                    });
-
-                    if (this._navigationAnimationRecord && this._navigationAnimationRecord.elementContainers) {
-                        for (var i = 0, len = this._navigationAnimationRecord.elementContainers.length; i < len; i++) {
-                            var page = this._navigationAnimationRecord.elementContainers[i];
-                            if (page && page.elementUniqueID === uniqueID(element)) {
-                                page.element = newVal;
-                                page.elementUniqueID = uniqueID(newVal);
-                            }
-                        }
-
-                        var newElement = this._navigationAnimationRecord.newCurrentElement;
-                        if (newElement && uniqueID(newElement) === uniqueID(element)) {
-                            this._navigationAnimationRecord.newCurrentElement = newVal;
-                        }
-                    }
-                },
-
-                moved: function (element, prev, next) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:moved,info");
-                    var record = this._getAnimationRecord(element);
-
-                    if (!record) {
-                        record = this._createAnimationRecord(uniqueID(element));
-                    }
-
-                    record.moved = true;
-                    this.removed(element, false, false);
-                    if (prev || next) {
-                        this.inserted(element, prev, next, false);
-                    } else {
-                        record.successfullyMoved = false;
-                    }
-                },
-
-                removed: function (element, mirage, animateRemoval) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:removed,info");
-                    var that = this;
-                    var prevMarker = this._prevMarker;
-                    var work = Promise.wrap();
-
-                    if (mirage) {
-                        var clearNext = false;
-                        this._forEachPage(function (curr) {
-                            if (curr.elementUniqueID === uniqueID(element) || clearNext) {
-                                curr.setElement(null, true);
-                                clearNext = true;
-                            }
-                        });
-                        this._setButtonStates();
-                        return;
-                    }
-
-                    if (animateRemoval) {
-                        var record = this._getAnimationRecord(element);
-                        if (record) {
-                            record.removed = true;
-                        }
-                    }
-                    if (this._currentPage.elementUniqueID === uniqueID(element)) {
-                        if (this._currentPage.next.elementUniqueID) {
-                            this._shiftLeft(this._currentPage);
-                            this._ensureCentered();
-                        } else if (this._currentPage.prev.elementUniqueID) {
-                            this._shiftRight(this._currentPage);
-                        } else {
-                            this._currentPage.setElement(null, true);
-                        }
-                    } else if (prevMarker.elementUniqueID === uniqueID(element)) {
-                        if (prevMarker.next.element) {
-                            work = this._itemsManager._previousItem(prevMarker.next.element).
-                                then(function (e) {
-                                    if (e === element) {
-                                        // Because the VDS and Binding.List can send notifications in
-                                        // different states we accomodate this here by fixing the case
-                                        // where VDS hasn't yet removed an item when it sends a removed
-                                        // or moved notification.
-                                        //
-                                        e = that._itemsManager._previousItem(e);
-                                    }
-                                    return e;
-                                }).
-                                then(function (e) {
-                                    prevMarker.setElement(e, true);
-                                });
-                        } else {
-                            prevMarker.setElement(null, true);
-                        }
-                    } else if (prevMarker.prev.elementUniqueID === uniqueID(element)) {
-                        if (prevMarker.prev.prev && prevMarker.prev.prev.element) {
-                            work = this._itemsManager._nextItem(prevMarker.prev.prev.element).
-                                then(function (e) {
-                                    if (e === element) {
-                                        // Because the VDS and Binding.List can send notifications in
-                                        // different states we accomodate this here by fixing the case
-                                        // where VDS hasn't yet removed an item when it sends a removed
-                                        // or moved notification.
-                                        //
-                                        e = that._itemsManager._nextItem(e);
-                                    }
-                                    return e;
-                                }).
-                                then(function (e) {
-                                    prevMarker.prev.setElement(e, true);
-                                });
-                        } else {
-                            prevMarker.prev.setElement(null, true);
-                        }
-                    } else {
-                        var curr = this._currentPage.prev,
-                            handled = false;
-                        while (curr !== prevMarker && !handled) {
-                            if (curr.elementUniqueID === uniqueID(element)) {
-                                this._shiftRight(curr);
-                                handled = true;
-                            }
-
-                            curr = curr.prev;
-                        }
-
-                        curr = this._currentPage.next;
-                        while (curr !== prevMarker && !handled) {
-                            if (curr.elementUniqueID === uniqueID(element)) {
-                                this._shiftLeft(curr);
-                                handled = true;
-                            }
-
-                            curr = curr.next;
-                        }
-                    }
-
-                    return work.then(function () {
-                        that._setButtonStates();
-                    });
-                },
-
-                reload: function () {
-                    this._writeProfilerMark("WinJS.UI.FlipView:reload,info");
-                    this.resetState(0);
-                },
-
-                getItemSpacing: function () {
-                    return this._itemSpacing;
-                },
-
-                setItemSpacing: function (space) {
-                    this._itemSpacing = space;
-                    this._ensureCentered();
-                },
-
-                notificationsStarted: function () {
-                    this._writeProfilerMark("WinJS.UI.FlipView:changeNotifications,StartTM");
-                    this._logBuffer();
-                    this._notificationsStarted = this._notificationsStarted || 0;
-                    this._notificationsStarted++;
-                    // _notificationsEndedSignal is also used in the FlipView unit tests for coordination in the datasource tests
-                    this._notificationsEndedSignal = new _Signal();
-                    this._temporaryKeys = [];
-                    this._animationRecords = {};
-                    var that = this;
-                    this._forEachPage(function (curr) {
-                        that._createAnimationRecord(curr.elementUniqueID, curr);
-                    });
-
-                    // Since the current item is defined as the left-most item in the view, the only possible elements that can be in view at any time are
-                    // the current item and the item proceeding it. We'll save these two elements for animations during the notificationsEnded cycle
-                    this._animationRecords.currentPage = this._currentPage.element;
-                    this._animationRecords.nextPage = this._currentPage.next.element;
-                },
-
-                notificationsEnded: function () {
-                    // The animations are broken down into three parts.
-                    // First, we move everything back to where it was before the changes happened. Elements that were inserted between two pages won't have their flip pages moved.
-                    // Next, we figure out what happened to the two elements that used to be in view. If they were removed/moved, they get animated as appropriate in this order:
-                    // removed, moved
-                    // Finally, we figure out how the items that are now in view got there, and animate them as necessary, in this order: moved, inserted.
-                    // The moved animation of the last part is joined with the moved animation of the previous part, so in the end it is:
-                    // removed -> moved items in view + moved items not in view -> inserted.
-                    var that = this;
-                    this._endNotificationsWork && this._endNotificationsWork.cancel();
-                    this._endNotificationsWork = this._ensureBufferConsistency().then(function () {
-                        var animationPromises = [];
-                        that._forEachPage(function (curr) {
-                            var record = that._getAnimationRecord(curr.element);
-                            if (record) {
-                                if (record.changed) {
-                                    record.oldElement.removedFromChange = true;
-                                    animationPromises.push(that._changeFlipPage(curr, record.oldElement, record.newElement));
-                                }
-                                record.newLocation = curr.location;
-                                that._setItemStart(curr, record.originalLocation);
-                                if (record.inserted) {
-                                    curr.elementRoot.style.opacity = 0.0;
-                                }
-                            }
-                        });
-
-                        function flipPageFromElement(element) {
-                            var flipPage = null;
-                            that._forEachPage(function (curr) {
-                                if (curr.element === element) {
-                                    flipPage = curr;
-                                    return true;
-                                }
-                            });
-                            return flipPage;
-                        }
-
-                        function animateOldViewportItemRemoved(record, item) {
-                            that._writeProfilerMark("WinJS.UI.FlipView:_animateOldViewportItemRemoved,info");
-                            var removedPage = that._createDiscardablePage(item);
-                            that._setItemStart(removedPage, record.originalLocation);
-                            animationPromises.push(that._deleteFlipPage(removedPage));
-                        }
-
-                        function animateOldViewportItemMoved(record, item) {
-                            that._writeProfilerMark("WinJS.UI.FlipView:_animateOldViewportItemMoved,info");
-                            var newLocation = record.originalLocation,
-                                movedPage;
-                            if (!record.successfullyMoved) {
-                                // If the old visible item got moved, but the next/prev of that item don't match up with anything
-                                // currently in our flip page buffer, we need to figure out in which direction it moved.
-                                // The exact location doesn't matter since we'll be deleting it anyways, but we do need to
-                                // animate it going in the right direction.
-                                movedPage = that._createDiscardablePage(item);
-                                var indexMovedTo = that._getElementIndex(item);
-                                var newCurrentIndex = (that._currentPage.element ? that._getElementIndex(that._currentPage.element) : 0);
-                                newLocation += (newCurrentIndex > indexMovedTo ? -100 * that._bufferSize : 100 * that._bufferSize);
-                            } else {
-                                movedPage = flipPageFromElement(item);
-                                newLocation = record.newLocation;
-                            }
-                            if (movedPage) {
-                                that._setItemStart(movedPage, record.originalLocation);
-                                animationPromises.push(that._moveFlipPage(movedPage, function () {
-                                    that._setItemStart(movedPage, newLocation);
-                                }));
-                            }
-                        }
-
-                        var oldCurrent = that._animationRecords.currentPage,
-                            oldCurrentRecord = that._getAnimationRecord(oldCurrent),
-                            oldNext = that._animationRecords.nextPage,
-                            oldNextRecord = that._getAnimationRecord(oldNext);
-                        if (oldCurrentRecord && oldCurrentRecord.changed) {
-                            oldCurrent = oldCurrentRecord.newElement;
-                        }
-                        if (oldNextRecord && oldNextRecord.changed) {
-                            oldNext = oldNextRecord.newElement;
-                        }
-
-                        if (oldCurrent !== that._currentPage.element || oldNext !== that._currentPage.next.element) {
-                            if (oldCurrentRecord && oldCurrentRecord.removed) {
-                                animateOldViewportItemRemoved(oldCurrentRecord, oldCurrent);
-                            }
-                            if (oldNextRecord && oldNextRecord.removed) {
-                                animateOldViewportItemRemoved(oldNextRecord, oldNext);
-                            }
-                        }
-
-                        function joinAnimationPromises() {
-                            if (animationPromises.length === 0) {
-                                animationPromises.push(Promise.wrap());
-                            }
-
-                            return Promise.join(animationPromises);
-                        }
-                        that._blockTabs = true;
-                        joinAnimationPromises().then(function () {
-                            animationPromises = [];
-                            if (oldCurrentRecord && oldCurrentRecord.moved) {
-                                animateOldViewportItemMoved(oldCurrentRecord, oldCurrent);
-                            }
-                            if (oldNextRecord && oldNextRecord.moved) {
-                                animateOldViewportItemMoved(oldNextRecord, oldNext);
-                            }
-                            var newCurrRecord = that._getAnimationRecord(that._currentPage.element),
-                                newNextRecord = that._getAnimationRecord(that._currentPage.next.element);
-                            that._forEachPage(function (curr) {
-                                var record = that._getAnimationRecord(curr.element);
-                                if (record) {
-                                    if (!record.inserted) {
-                                        if (record.originalLocation !== record.newLocation) {
-                                            if ((record !== oldCurrentRecord && record !== oldNextRecord) ||
-                                                (record === oldCurrentRecord && !oldCurrentRecord.moved) ||
-                                                (record === oldNextRecord && !oldNextRecord.moved)) {
-                                                animationPromises.push(that._moveFlipPage(curr, function () {
-                                                    that._setItemStart(curr, record.newLocation);
-                                                }));
-                                            }
-                                        }
-                                    } else if (record !== newCurrRecord && record !== newNextRecord) {
-                                        curr.elementRoot.style.opacity = 1.0;
-                                    }
-                                }
-                            });
-                            joinAnimationPromises().then(function () {
-                                animationPromises = [];
-                                if (newCurrRecord && newCurrRecord.inserted) {
-                                    animationPromises.push(that._insertFlipPage(that._currentPage));
-                                }
-                                if (newNextRecord && newNextRecord.inserted) {
-                                    animationPromises.push(that._insertFlipPage(that._currentPage.next));
-                                }
-                                joinAnimationPromises().then(function () {
-                                    that._checkElementVisibility(false);
-                                    that._itemSettledOn();
-                                    that._setListEnds();
-                                    that._notificationsStarted--;
-                                    if (that._notificationsStarted === 0) {
-                                        that._notificationsEndedSignal.complete();
-                                    }
-                                    that._writeProfilerMark("WinJS.UI.FlipView:changeNotifications,StopTM");
-                                    that._logBuffer();
-                                    that._endNotificationsWork = null;
-                                });
-                            });
-                        });
-                    });
-                },
-
-                disableTouchFeatures: function () {
-                    this._environmentSupportsTouch = false;
-                    var panningContainerStyle = this._panningDivContainer.style;
-                    this._panningDivContainer.removeEventListener(_BaseUtils._browserEventEquivalents["manipulationStateChanged"], this._handleManipulationStateChangedBound, true);
-                    panningContainerStyle.overflowX = "hidden";
-                    panningContainerStyle.overflowY = "hidden";
-                    var panningContainerPropertiesToClear = [
-                        "scroll-snap-type",
-                        "scroll-snap-points-x",
-                        "scroll-snap-points-y",
-                        "scroll-limit-x-min",
-                        "scroll-limit-x-max",
-                        "scroll-limit-y-min",
-                        "scroll-limit-y-max"
-                    ];
-                    panningContainerPropertiesToClear.forEach(function (propertyName) {
-                        var platformPropertyName = styleEquivalents[propertyName];
-                        if (platformPropertyName) {
-                            panningContainerStyle[platformPropertyName.scriptName] = "";
-                        }
-                    });
-                },
-
-                // Private methods
-
-                _hasFocus: {
-                    get: function () {
-                        return this._flipperDiv.contains(_Global.document.activeElement);
-                    }
-                },
-
-                _timeoutPageSelection: function () {
-                    var that = this;
-                    if (this._lastTimeoutRequest) {
-                        this._lastTimeoutRequest.cancel();
-                    }
-                    this._lastTimeoutRequest = Promise.timeout(itemSelectedEventDelay).then(function () {
-                        that._itemSettledOn();
-                    });
-                },
-
-                _updateTabIndex: function (newIndex) {
-                    this._forEachPage(function (curr) {
-                        if (curr.element) {
-                            curr.element.tabIndex = newIndex;
-                        }
-                    });
-                    this._tabIndex = newIndex;
-                    this._tabManager.tabIndex = newIndex;
-                },
-
-                _releaseElementIfNotAnimated: function (element) {
-                    var animatedRecord = this._getAnimationRecord(element);
-                    if (!(animatedRecord && (animatedRecord.changed || animatedRecord.inserted || animatedRecord.moved || animatedRecord.removed))) {
-                        this._itemsManager.releaseItem(element);
-                    }
-                },
-
-                _getAnimationRecord: function (element) {
-                    return (element ? this._animationRecords[uniqueID(element)] : null);
-                },
-
-                _createAnimationRecord: function (elementUniqueID, flipPage) {
-                    if (elementUniqueID) {
-                        var record = this._animationRecords[elementUniqueID] = {
-                            removed: false,
-                            changed: false,
-                            inserted: false
-                        };
-
-                        if (flipPage) {
-                            record.originalLocation = flipPage.location;
-                        }
-
-                        return record;
-                    }
-                },
-
-                _writeProfilerMark: function (message) {
-                    _WriteProfilerMark(message);
-                    if (this._flipperDiv.winControl.constructor._enabledDebug) {
-                        _Log.log && _Log.log(message, null, "flipviewdebug");
-                    }
-                },
-
-                _getElementIndex: function (element) {
-                    var index = 0;
-                    try {
-                        index = this._itemsManager.itemObject(element).index;
-                    }
-                    catch (e) {
-                        // Failures are expected in cases where items are moved and then deleted. Animations will simply animate as if the item
-                        // moved to the beginning of the list.
-                    }
-                    return index;
-                },
-
-                _resetBuffer: function (elementToSave, skipReleases) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:_resetBuffer,info");
-                    var head = this._currentPage,
-                        curr = head;
-                    do {
-                        if ((curr.element && curr.element === elementToSave) || skipReleases) {
-                            curr.setElement(null, true);
-                        } else {
-                            curr.setElement(null);
-                        }
-                        curr = curr.next;
-                    } while (curr !== head);
-                },
-
-                _getHeadOfBuffer: function () {
-                    return this._prevMarker.prev;
-                },
-
-                _getTailOfBuffer: function () {
-                    return this._prevMarker;
-                },
-
-                _insertNewFlipPage: function (prevElement) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:_insertNewFlipPage,info");
-                    var newPage = this._createFlipPage(prevElement, this);
-                    this._panningDiv.appendChild(newPage.pageRoot);
-                    return newPage;
-                },
-
-                _fetchNextItems: function () {
-                    this._writeProfilerMark("WinJS.UI.FlipView:_fetchNextItems,info");
-                    var tail = Promise.wrap(this._currentPage);
-                    var that = this;
-
-                    for (var i = 0; i < this._bufferSize; i++) {
-                        tail = tail.then(function (curr) {
-                            if (curr.next === that._prevMarker) {
-                                that._insertNewFlipPage(curr);
-                            }
-                            if (curr.element) {
-                                return that._itemsManager._nextItem(curr.element).
-                                    then(function (element) {
-                                        curr.next.setElement(element);
-                                        return curr.next;
-                                    });
-                            } else {
-                                curr.next.setElement(null);
-                                return curr.next;
-                            }
-                        });
-                    }
-
-                    return tail;
-                },
-
-                _fetchOneNext: function (target) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:_fetchOneNext,info");
-                    var prevElement = target.prev.element;
-                    // If the target we want to fill with the next item is the end of the circular buffer but we want to keep everything in memory, we've got to increase the buffer size
-                    // so that we don't reuse prevMarker.
-                    if (this._prevMarker === target) {
-                        this._prevMarker = this._prevMarker.next;
-                    }
-                    if (!prevElement) {
-                        target.setElement(null);
-                        return;
-                    }
-                    var that = this;
-                    return this._itemsManager._nextItem(prevElement).
-                        then(function (element) {
-                            target.setElement(element);
-                            that._movePageAhead(target.prev, target);
-                        });
-                },
-
-                _fetchPreviousItems: function (setPrevMarker) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:_fetchPreviousItems,info");
-                    var that = this;
-
-                    var tail = Promise.wrap(this._currentPage);
-
-                    for (var i = 0; i < this._bufferSize; i++) {
-                        tail = tail.then(function (curr) {
-                            if (curr.element) {
-                                return that._itemsManager._previousItem(curr.element).
-                                    then(function (element) {
-                                        curr.prev.setElement(element);
-                                        return curr.prev;
-                                    });
-                            } else {
-                                curr.prev.setElement(null);
-                                return curr.prev;
-                            }
-                        });
-                    }
-
-                    return tail.then(function (curr) {
-                        if (setPrevMarker) {
-                            that._prevMarker = curr;
-                        }
-                    });
-                },
-
-                _fetchOnePrevious: function (target) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:_fetchOnePrevious,info");
-                    var nextElement = target.next.element;
-
-                    // If the target we want to fill with the previous item is the end of the circular buffer but we want to keep everything in memory, we've got to increase the buffer size
-                    // so that we don't reuse prevMarker. We'll add a new element to be prevMarker's prev, then set prevMarker to point to that new element.
-                    if (this._prevMarker === target.next) {
-                        this._prevMarker = this._prevMarker.prev;
-                    }
-                    if (!nextElement) {
-                        target.setElement(null);
-                        return Promise.wrap();
-                    }
-                    var that = this;
-                    return this._itemsManager._previousItem(nextElement).
-                        then(function (element) {
-                            target.setElement(element);
-                            that._movePageBehind(target.next, target);
-                        });
-                },
-
-                _setButtonStates: function () {
-                    if (this._currentPage.prev.element) {
-                        this._buttonVisibilityHandler.showPreviousButton();
-                    } else {
-                        this._buttonVisibilityHandler.hidePreviousButton();
-                    }
-
-                    if (this._currentPage.next.element) {
-                        this._buttonVisibilityHandler.showNextButton();
-                    } else {
-                        this._buttonVisibilityHandler.hideNextButton();
-                    }
-                },
-
-                _ensureCentered: function (delayBoundariesSet) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:_ensureCentered,info");
-                    this._setItemStart(this._currentPage, leftBufferAmount * this._viewportSize());
-                    var curr = this._currentPage;
-                    while (curr !== this._prevMarker) {
-                        this._movePageBehind(curr, curr.prev);
-                        curr = curr.prev;
-                    }
-
-                    curr = this._currentPage;
-                    while (curr.next !== this._prevMarker) {
-                        this._movePageAhead(curr, curr.next);
-                        curr = curr.next;
-                    }
-                    var boundariesSet = false;
-                    if (this._lastScrollPos && !delayBoundariesSet) {
-                        this._setListEnds();
-                        boundariesSet = true;
-                    }
-                    this._lastScrollPos = this._getItemStart(this._currentPage);
-                    this._setViewportStart(this._lastScrollPos);
-                    this._checkElementVisibility(true);
-                    this._setupSnapPoints();
-                    if (!boundariesSet) {
-                        this._setListEnds();
-                    }
-                },
-
-                _ensureBufferConsistency: function () {
-                    var that = this;
-                    var currentElement = this._currentPage.element;
-                    if (!currentElement) {
-                        return Promise.wrap();
-                    }
-
-                    var refreshBuffer = false;
-                    var seenUniqueIDs = {};
-                    var seenLocations = {};
-                    this._forEachPage(function (page) {
-                        if (page && page.elementUniqueID) {
-                            if (!seenUniqueIDs[page.elementUniqueID]) {
-                                seenUniqueIDs[page.elementUniqueID] = true;
-                            } else {
-                                refreshBuffer = true;
-                                return true;
-                            }
-
-                            if (page.location > 0) {
-                                if (!seenLocations[page.location]) {
-                                    seenLocations[page.location] = true;
-                                } else {
-                                    refreshBuffer = true;
-                                    return true;
-                                }
-                            }
-                        }
-                    });
-
-                    var animationKeys = Object.keys(this._animationRecords);
-                    animationKeys.forEach(function (key) {
-                        var record = that._animationRecords[key];
-                        if (record && (record.changed || record.inserted || record.moved || record.removed)) {
-                            refreshBuffer = true;
-                        }
-                    });
-
-                    if (refreshBuffer) {
-                        this._resetBuffer(null, true);
-                        this._currentPage.setElement(currentElement);
-                        return this._fetchNextItems().
-                            then(function () {
-                                return that._fetchPreviousItems(true);
-                            }).
-                            then(function () {
-                                that._ensureCentered();
-                            });
-                    } else {
-                        return Promise.wrap();
-                    }
-                },
-
-                _shiftLeft: function (startingPoint) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:_shiftLeft,info");
-                    var curr = startingPoint,
-                        nextEl = null;
-                    while (curr !== this._prevMarker && curr.next !== this._prevMarker) {
-                        nextEl = curr.next.element;
-                        if (!nextEl && curr.next.elementUniqueID) {
-                            // Shift the uniqueID of the page manually since its element is being animated.
-                            // This page  will not contain the element until the animation completes.
-                            curr.elementUniqueID = curr.next.elementUniqueID;
-                        }
-                        curr.next.setElement(null, true);
-                        curr.setElement(nextEl, true);
-                        curr = curr.next;
-                    }
-                    if (curr !== this._prevMarker && curr.prev.element) {
-                        var that = this;
-                        return this._itemsManager._nextItem(curr.prev.element).
-                            then(function (element) {
-                                curr.setElement(element);
-                                that._createAnimationRecord(curr.elementUniqueID, curr);
-                            });
-                    }
-                },
-
-                _logBuffer: function () {
-                    if (this._flipperDiv.winControl.constructor._enabledDebug) {
-                        _Log.log && _Log.log(this._currentPage.next.next.next.elementUniqueID + "\t@:" + this._currentPage.next.next.next.location + (this._currentPage.next.next.next.element ? ("\t" + this._currentPage.next.next.next.element.textContent) : ""), null, "flipviewdebug");
-                        _Log.log && _Log.log(this._currentPage.next.next.next.next.elementUniqueID + "\t@:" + this._currentPage.next.next.next.next.location + (this._currentPage.next.next.next.next.element ? ("\t" + this._currentPage.next.next.next.next.element.textContent) : ""), null, "flipviewdebug");
-                        _Log.log && _Log.log("> " + this._currentPage.elementUniqueID + "\t@:" + this._currentPage.location + (this._currentPage.element ? ("\t" + this._currentPage.element.textContent) : ""), null, "flipviewdebug");
-                        _Log.log && _Log.log(this._currentPage.next.elementUniqueID + "\t@:" + this._currentPage.next.location + (this._currentPage.next.element ? ("\t" + this._currentPage.next.element.textContent) : ""), null, "flipviewdebug");
-                        _Log.log && _Log.log(this._currentPage.next.next.elementUniqueID + "\t@:" + this._currentPage.next.next.location + (this._currentPage.next.next.element ? ("\t" + this._currentPage.next.next.element.textContent) : ""), null, "flipviewdebug");
-
-                        var keys = Object.keys(this._itemsManager._elementMap);
-                        var bufferKeys = [];
-                        this._forEachPage(function (page) {
-                            if (page && page.elementUniqueID) {
-                                bufferKeys.push(page.elementUniqueID);
-                            }
-                        });
-                        _Log.log && _Log.log("itemsmanager  = [" + keys.join(" ") + "] flipview [" + bufferKeys.join(" ") + "]", null, "flipviewdebug");
-                    }
-                },
-
-                _shiftRight: function (startingPoint) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:_shiftRight,info");
-                    var curr = startingPoint,
-                        prevEl = null;
-                    while (curr !== this._prevMarker) {
-                        prevEl = curr.prev.element;
-                        if (!prevEl && curr.prev.elementUniqueID) {
-                            // Shift the uniqueID of the page manually since its element is being animated.
-                            // This page  will not contain the element until the animation completes.
-                            curr.elementUniqueID = curr.prev.elementUniqueID;
-                        }
-                        curr.prev.setElement(null, true);
-                        curr.setElement(prevEl, true);
-                        curr = curr.prev;
-                    }
-                    if (curr.next.element) {
-                        var that = this;
-                        return this._itemsManager._previousItem(curr.next.element).
-                            then(function (element) {
-                                curr.setElement(element);
-                                that._createAnimationRecord(curr.elementUniqueID, curr);
-                            });
-                    }
-                },
-
-                _checkElementVisibility: function (viewWasReset) {
-                    var i,
-                        len;
-                    if (viewWasReset) {
-                        var currentElement = this._currentPage.element;
-                        for (i = 0, len = this._visibleElements.length; i < len; i++) {
-                            if (this._visibleElements[i] !== currentElement) {
-                                this._announceElementInvisible(this._visibleElements[i]);
-                            }
-                        }
-
-                        this._visibleElements = [];
-                        if (currentElement) {
-                            this._visibleElements.push(currentElement);
-                            this._announceElementVisible(currentElement);
-                        }
-                    } else {
-                        // Elements that have been removed completely from the flipper still need to raise pageVisibilityChangedEvents if they were visible prior to being removed,
-                        // so before going through all the elements we go through the ones that we knew were visible and see if they're missing a parentNode. If they are,
-                        // the elements were removed and we announce them as invisible.
-                        for (i = 0, len = this._visibleElements.length; i < len; i++) {
-                            if (!this._visibleElements[i].parentNode || this._visibleElements[i].removedFromChange) {
-                                this._announceElementInvisible(this._visibleElements[i]);
-                            }
-                        }
-                        this._visibleElements = [];
-                        var that = this;
-                        this._forEachPage(function (curr) {
-                            var element = curr.element;
-                            if (element) {
-                                if (that._itemInView(curr)) {
-                                    that._visibleElements.push(element);
-                                    that._announceElementVisible(element);
-                                } else {
-                                    that._announceElementInvisible(element);
-                                }
-                            }
-                        });
-                    }
-                },
-
-                _announceElementVisible: function (element) {
-                    if (element && !element.visible) {
-                        element.visible = true;
-
-                        var event = _Global.document.createEvent("CustomEvent");
-                        this._writeProfilerMark("WinJS.UI.FlipView:pageVisibilityChangedEvent(visible:true),info");
-                        event.initCustomEvent(_Constants.pageVisibilityChangedEvent, true, false, { source: this._flipperDiv, visible: true });
-
-                        element.dispatchEvent(event);
-                    }
-                },
-
-                _announceElementInvisible: function (element) {
-                    if (element && element.visible) {
-                        element.visible = false;
-
-                        // Elements that have been removed from the flipper still need to fire invisible events, but they can't do that without being in the DOM.
-                        // To fix that, we add the element back into the flipper, fire the event, then remove it.
-                        var addedToDomForEvent = false;
-                        if (!element.parentNode) {
-                            addedToDomForEvent = true;
-                            this._panningDivContainer.appendChild(element);
-                        }
-
-                        var event = _Global.document.createEvent("CustomEvent");
-                        this._writeProfilerMark("WinJS.UI.FlipView:pageVisibilityChangedEvent(visible:false),info");
-                        event.initCustomEvent(_Constants.pageVisibilityChangedEvent, true, false, { source: this._flipperDiv, visible: false });
-
-                        element.dispatchEvent(event);
-                        if (addedToDomForEvent) {
-                            this._panningDivContainer.removeChild(element);
-                        }
-                    }
-                },
-
-                _createDiscardablePage: function (content) {
-                    var pageDivs = this._createPageContainer(),
-                        page = {
-                            pageRoot: pageDivs.root,
-                            elementRoot: pageDivs.elementContainer,
-                            discardable: true,
-                            element: content,
-                            elementUniqueID: uniqueID(content),
-                            discard: function () {
-                                if (page.pageRoot.parentNode) {
-                                    page.pageRoot.parentNode.removeChild(page.pageRoot);
-                                }
-                                if (page.element.parentNode) {
-                                    page.element.parentNode.removeChild(page.element);
-                                }
-                            }
-                        };
-                    page.pageRoot.style.top = "0px";
-                    page.elementRoot.appendChild(content);
-                    this._panningDiv.appendChild(page.pageRoot);
-                    return page;
-                },
-
-                _createPageContainer: function () {
-                    var width = this._panningDivContainerOffsetWidth,
-                        height = this._panningDivContainerOffsetHeight,
-                        parentDiv = _Global.document.createElement("div"),
-                        pageStyle = parentDiv.style,
-                        flexBox = _Global.document.createElement("div");
-                    flexBox.className = "win-item";
-                    pageStyle.position = "absolute";
-                    pageStyle.overflow = "hidden";
-                    pageStyle.width = width + "px";
-                    pageStyle.height = height + "px";
-
-                    parentDiv.appendChild(flexBox);
-                    return {
-                        root: parentDiv,
-                        elementContainer: flexBox
-                    };
-                },
-
-                _createFlipPage: function (prev, manager) {
-                    var page = {};
-                    page.element = null;
-                    page.elementUniqueID = null;
-
-                    // The flip pages are managed as a circular doubly-linked list. this.currentItem should always refer to the current item in view, and this._prevMarker marks the point
-                    // in the list where the last previous item is stored. Why a circular linked list?
-                    // The virtualized flipper reuses its flip pages. When a new item is requested, the flipper needs to reuse an old item from the buffer. In the case of previous items,
-                    // the flipper has to go all the way back to the farthest next item in the buffer and recycle it (which is why having a .prev pointer on the farthest previous item is really useful),
-                    // and in the case of the next-most item, it needs to recycle next's next (ie, the this._prevMarker). The linked structure comes in really handy when iterating through the list
-                    // and separating out prev items from next items (like removed and ensureCentered do). If we were to use a structure like an array it would be pretty messy to do that and still
-                    // maintain a buffer of recyclable items.
-                    if (!prev) {
-                        page.next = page;
-                        page.prev = page;
-                    } else {
-                        page.prev = prev;
-                        page.next = prev.next;
-                        page.next.prev = page;
-                        prev.next = page;
-                    }
-                    var pageContainer = this._createPageContainer();
-                    page.elementRoot = pageContainer.elementContainer;
-                    page.elementRoot.style["msOverflowStyle"] = "auto";
-                    page.pageRoot = pageContainer.root;
-
-                    // Sets the element to display in this flip page
-                    page.setElement = function (element, isReplacement) {
-                        if (element === undefined) {
-                            element = null;
-                        }
-                        if (element === page.element) {
-                            if (!element) {
-                                // If there are data source updates during the animation (e.g. item removed), a page element can be set to null when the shiftLeft/Right functions
-                                // call this function with a null element. However, since the element in the page is in the middle of an animation its page.elementUniqueID
-                                // is still set, so we need to explicitly clear its value so that when the animation completes, the animated element is not
-                                // restored back into the internal buffer.
-                                page.elementUniqueID = null;
-                            }
-                            return;
-                        }
-                        if (page.element) {
-                            if (!isReplacement) {
-                                manager._itemsManager.releaseItem(page.element);
-                                _Dispose._disposeElement(page.element);
-                            }
-                        }
-                        page.element = element;
-                        page.elementUniqueID = (element ? uniqueID(element) : null);
-                        _ElementUtilities.empty(page.elementRoot);
-
-                        if (page.element) {
-                            if (page === manager._currentPage) {
-                                manager._tabManager.childFocus = element;
-                            }
-                            if (!isFlipper(page.element)) {
-                                page.element.tabIndex = manager._tabIndex;
-                                page.element.setAttribute("role", "option");
-                                page.element.setAttribute("aria-selected", false);
-                                if (!page.element.id) {
-                                    page.element.id = uniqueID(page.element);
-                                }
-
-                                var setFlowAttribute = function (source, target, attributeName) {
-                                    source.setAttribute(attributeName, target.id);
-                                };
-
-                                var isEnd = !page.next.element || page === manager._prevMarker.prev;
-                                if (isEnd) {
-                                    setFlowAttribute(page.element, manager._bufferAriaEndMarker, "aria-flowto");
-                                    setFlowAttribute(manager._bufferAriaEndMarker, page.element, "x-ms-aria-flowfrom");
-                                }
-
-                                if (page !== manager._prevMarker && page.prev.element) {
-                                    setFlowAttribute(page.prev.element, page.element, "aria-flowto");
-                                    setFlowAttribute(page.element, page.prev.element, "x-ms-aria-flowfrom");
-                                }
-                                if (page.next !== manager._prevMarker && page.next.element) {
-                                    setFlowAttribute(page.element, page.next.element, "aria-flowto");
-                                    setFlowAttribute(page.next.element, page.element, "x-ms-aria-flowfrom");
-                                }
-
-                                if (!page.prev.element) {
-                                    setFlowAttribute(page.element, manager._bufferAriaStartMarker, "x-ms-aria-flowfrom");
-                                    // aria-flowto in the start marker is configured in itemSettledOn to point to the current page in view
-                                }
-                            }
-                            page.elementRoot.appendChild(page.element);
-                        }
-                    };
-
-                    return page;
-                },
-
-                _itemInView: function (flipPage) {
-                    return this._itemEnd(flipPage) > this._getViewportStart() && this._getItemStart(flipPage) < this._viewportEnd();
-                },
-
-                _getViewportStart: function () {
-                    if (!this._panningDivContainer.parentNode) {
-                        return;
-                    }
-                    if (this._isHorizontal) {
-                        return _ElementUtilities.getScrollPosition(this._panningDivContainer).scrollLeft;
-                    } else {
-                        return _ElementUtilities.getScrollPosition(this._panningDivContainer).scrollTop;
-                    }
-                },
-
-                _setViewportStart: function (newValue) {
-                    if (!this._panningDivContainer.parentNode) {
-                        return;
-                    }
-                    if (this._isHorizontal) {
-                        _ElementUtilities.setScrollPosition(this._panningDivContainer, { scrollLeft: newValue });
-                    } else {
-                        _ElementUtilities.setScrollPosition(this._panningDivContainer, { scrollTop: newValue });
-                    }
-                },
-
-                _viewportEnd: function () {
-                    var element = this._panningDivContainer;
-                    if (this._isHorizontal) {
-                        if (this._rtl) {
-                            return this._getViewportStart() + this._panningDivContainerOffsetWidth;
-                        } else {
-                            return _ElementUtilities.getScrollPosition(element).scrollLeft + this._panningDivContainerOffsetWidth;
-                        }
-                    } else {
-                        return element.scrollTop + this._panningDivContainerOffsetHeight;
-                    }
-                },
-
-                _viewportSize: function () {
-                    return this._isHorizontal ? this._panningDivContainerOffsetWidth : this._panningDivContainerOffsetHeight;
-                },
-
-                _getItemStart: function (flipPage) {
-                    return flipPage.location;
-                },
-
-                _setItemStart: function (flipPage, newValue) {
-                    if (newValue === undefined) {
-                        return;
-                    }
-
-                    if (this._isHorizontal) {
-                        flipPage.pageRoot.style.left = (this._rtl ? -newValue : newValue) + "px";
-                    } else {
-                        flipPage.pageRoot.style.top = newValue + "px";
-                    }
-                    flipPage.location = newValue;
-                },
-
-                _itemEnd: function (flipPage) {
-                    return (this._isHorizontal ? flipPage.location + this._panningDivContainerOffsetWidth : flipPage.location + this._panningDivContainerOffsetHeight) + this._itemSpacing;
-                },
-
-                _itemSize: function () {
-                    return this._isHorizontal ? this._panningDivContainerOffsetWidth : this._panningDivContainerOffsetHeight;
-                },
-
-                _movePageAhead: function (referencePage, pageToPlace) {
-                    var delta = this._itemSize(referencePage) + this._itemSpacing;
-                    this._setItemStart(pageToPlace, this._getItemStart(referencePage) + delta);
-                },
-
-                _movePageBehind: function (referencePage, pageToPlace) {
-                    var delta = this._itemSize(referencePage) + this._itemSpacing;
-                    this._setItemStart(pageToPlace, this._getItemStart(referencePage) - delta);
-                },
-
-                _setupSnapPoints: function () {
-                    if (!this._environmentSupportsTouch) {
-                        return;
-                    }
-                    var containerStyle = this._panningDivContainer.style;
-                    containerStyle[styleEquivalents["scroll-snap-type"].scriptName] = "mandatory";
-                    var viewportSize = this._viewportSize();
-                    var snapInterval = viewportSize + this._itemSpacing;
-                    var propertyName = "scroll-snap-points";
-                    var startSnap = 0;
-                    var currPos = this._getItemStart(this._currentPage);
-                    startSnap = currPos % (viewportSize + this._itemSpacing);
-                    containerStyle[styleEquivalents[(this._isHorizontal ? propertyName + "-x" : propertyName + "-y")].scriptName] = "snapInterval(" + startSnap + "px, " + snapInterval + "px)";
-                },
-
-                _setListEnds: function () {
-                    if (!this._environmentSupportsTouch) {
-                        return;
-                    }
-
-                    if (this._currentPage.element) {
-                        var containerStyle = this._panningDivContainer.style,
-                            startScroll = 0,
-                            endScroll = 0,
-                            startNonEmptyPage = this._getTailOfBuffer(),
-                            endNonEmptyPage = this._getHeadOfBuffer(),
-                            startBoundaryStyle = styleEquivalents["scroll-limit-" + (this._isHorizontal ? "x-min" : "y-min")].scriptName,
-                            endBoundaryStyle = styleEquivalents["scroll-limit-" + (this._isHorizontal ? "x-max" : "y-max")].scriptName;
-
-                        while (!endNonEmptyPage.element) {
-                            endNonEmptyPage = endNonEmptyPage.prev;
-
-                            // We started at the item before prevMarker (going backwards), so we will exit if all
-                            // the pages in the buffer are empty.
-                            if (endNonEmptyPage === this._prevMarker.prev) {
-                                break;
-                            }
-                        }
-
-                        while (!startNonEmptyPage.element) {
-                            startNonEmptyPage = startNonEmptyPage.next;
-
-                            // We started at prevMarker (going forward), so we will exit if all the pages in the
-                            // buffer are empty.
-                            if (startNonEmptyPage === this._prevMarker) {
-                                break;
-                            }
-                        }
-
-                        endScroll = this._getItemStart(endNonEmptyPage);
-                        startScroll = this._getItemStart(startNonEmptyPage);
-                        containerStyle[startBoundaryStyle] = startScroll + "px";
-                        containerStyle[endBoundaryStyle] = endScroll + "px";
-                    }
-                },
-
-                _viewportOnItemStart: function () {
-                    return this._getItemStart(this._currentPage) === this._getViewportStart();
-                },
-
-                _restoreAnimatedElement: function (oldPage, discardablePage) {
-                    var removed = true;
-                    // Restore the element in the old page only if it still matches the uniqueID, and the page
-                    // does not have new updated content. If the element was removed, it won't be restore in the
-                    // old page.
-                    if (oldPage.elementUniqueID === uniqueID(discardablePage.element) && !oldPage.element) {
-                        oldPage.setElement(discardablePage.element, true);
-                        removed = false;
-                    } else {
-                        // Iterate through the pages to see if the element was moved
-                        this._forEachPage(function (curr) {
-                            if (curr.elementUniqueID === discardablePage.elementUniqueID && !curr.element) {
-                                curr.setElement(discardablePage.element, true);
-                                removed = false;
-                            }
-                        });
-                    }
-                    return removed;
-                },
-
-                _itemSettledOn: function () {
-                    if (this._lastTimeoutRequest) {
-                        this._lastTimeoutRequest.cancel();
-                        this._lastTimeoutRequest = null;
-                    }
-
-                    var that = this;
-                    // Need to yield to the host here
-                    _BaseUtils._setImmediate(function () {
-                        if (that._viewportOnItemStart()) {
-                            that._blockTabs = false;
-                            if (that._currentPage.element) {
-                                if (that._lastSelectedElement !== that._currentPage.element) {
-                                    if (that._lastSelectedPage && that._lastSelectedPage.element && !isFlipper(that._lastSelectedPage.element)) {
-                                        that._lastSelectedPage.element.setAttribute("aria-selected", false);
-                                    }
-                                    that._lastSelectedPage = that._currentPage;
-                                    that._lastSelectedElement = that._currentPage.element;
-                                    if (!isFlipper(that._currentPage.element)) {
-                                        that._currentPage.element.setAttribute("aria-selected", true);
-                                    }
-
-                                    // Need to schedule this:
-                                    // - to be able to register for the pageselected event after instantiating the control and still get the event
-                                    // - in case a FlipView navigation is triggered inside the pageselected listener (avoid reentering _itemSettledOn)
-                                    Scheduler.schedule(function FlipView_dispatchPageSelectedEvent() {
-                                        if (that._currentPage.element) {
-                                            if (that._hasFocus || that._hadFocus) {
-                                                that._hadFocus = false;
-                                                _ElementUtilities._setActive(that._currentPage.element);
-                                                that._tabManager.childFocus = that._currentPage.element;
-                                            }
-                                            var event = _Global.document.createEvent("CustomEvent");
-                                            event.initCustomEvent(_Constants.pageSelectedEvent, true, false, { source: that._flipperDiv });
-                                            that._writeProfilerMark("WinJS.UI.FlipView:pageSelectedEvent,info");
-                                            that._currentPage.element.dispatchEvent(event);
-
-                                            // Fire the pagecompleted event when the render completes if we are still looking  at the same element.
-                                            // Check that the current element is not null, since the app could've triggered a navigation inside the
-                                            // pageselected event handler.
-                                            var originalElement = that._currentPage.element;
-                                            if (originalElement) {
-                                                var record = that._itemsManager._recordFromElement(originalElement, true);
-                                                if (record) {
-                                                    record.renderComplete.then(function () {
-                                                        if (originalElement === that._currentPage.element) {
-                                                            that._currentPage.element.setAttribute("aria-setsize", that._cachedSize);
-                                                            that._currentPage.element.setAttribute("aria-posinset", that.currentIndex() + 1);
-                                                            that._bufferAriaStartMarker.setAttribute("aria-flowto", that._currentPage.element.id);
-                                                            event = _Global.document.createEvent("CustomEvent");
-                                                            event.initCustomEvent(_Constants.pageCompletedEvent, true, false, { source: that._flipperDiv });
-                                                            that._writeProfilerMark("WinJS.UI.FlipView:pageCompletedEvent,info");
-                                                            that._currentPage.element.dispatchEvent(event);
-                                                        }
-                                                    });
-                                                }
-                                            }
-                                        }
-                                    }, Scheduler.Priority.normal, null, "WinJS.UI.FlipView._dispatchPageSelectedEvent");
-                                }
-                            }
-                        }
-                    });
-                },
-
-                _forEachPage: function (callback) {
-                    var curr = this._prevMarker;
-                    do {
-                        if (callback(curr)) {
-                            break;
-                        }
-                        curr = curr.next;
-                    } while (curr !== this._prevMarker);
-                },
-
-                _changeFlipPage: function (page, oldElement, newElement) {
-                    this._writeProfilerMark("WinJS.UI.FlipView:_changeFlipPage,info");
-                    page.element = null;
-                    if (page.setElement) {
-                        page.setElement(newElement, true);
-                    } else {
-                        // Discardable pages that are created for animations aren't full fleged pages, and won't have some of the functions a normal page would.
-                        // changeFlipPage will be called on them when an item that's animating gets fetched. When that happens, we need to replace its element
-                        // manually, then center it.
-                        oldElement.parentNode.removeChild(oldElement);
-                        page.elementRoot.appendChild(newElement);
-                    }
-
-                    var style = oldElement.style;
-                    style.position = "absolute";
-                    style.left = "0px";
-                    style.top = "0px";
-                    style.opacity = 1.0;
-
-                    page.pageRoot.appendChild(oldElement);
-                    oldElement.style.left = Math.max(0, (page.pageRoot.offsetWidth - oldElement.offsetWidth) / 2) + "px";
-                    oldElement.style.top = Math.max(0, (page.pageRoot.offsetHeight - oldElement.offsetHeight) / 2) + "px";
-
-                    return Animations.fadeOut(oldElement).then(function () {
-                        oldElement.parentNode && oldElement.parentNode.removeChild(oldElement);
-                    });
-                },
-
-                _deleteFlipPage: function (page) {
-                    _WriteProfilerMark("WinJS.UI.FlipView:_deleteFlipPage,info");
-                    page.elementRoot.style.opacity = 0;
-                    var animation = Animations.createDeleteFromListAnimation([page.elementRoot]);
-
-                    var that = this;
-                    return animation.execute().then(function () {
-                        if (page.discardable) {
-                            page.discard();
-                            that._itemsManager.releaseItem(page.element);
-                        }
-                    });
-                },
-
-                _insertFlipPage: function (page) {
-                    _WriteProfilerMark("WinJS.UI.FlipView:_insertFlipPage,info");
-                    page.elementRoot.style.opacity = 1.0;
-                    var animation = Animations.createAddToListAnimation([page.elementRoot]);
-
-                    return animation.execute().then(function () {
-                        if (page.discardable) {
-                            page.discard();
-                        }
-                    });
-                },
-
-                _moveFlipPage: function (page, move) {
-                    _WriteProfilerMark("WinJS.UI.FlipView:_moveFlipPage,info");
-                    var animation = Animations.createRepositionAnimation(page.pageRoot);
-
-                    move();
-
-                    var that = this;
-                    return animation.execute().then(function () {
-                        if (page.discardable) {
-                            page.discard();
-                            var animationRecord = that._getAnimationRecord(page.element);
-                            if (animationRecord && !animationRecord.successfullyMoved) {
-                                // If the animationRecord was not succesfully moved, the item is now outside of the buffer,
-                                // and we can release it.
-                                that._itemsManager.releaseItem(page.element);
-                            }
-                        }
-                    });
-                },
-
-                _handleManipulationStateChanged: function (event) {
-                    this._manipulationState = event.currentState;
-                    if (event.currentState === 0 && event.target === this._panningDivContainer) {
-                        this._itemSettledOn();
-                        this._ensureCentered();
-                    }
-                }
-            }, {
-                supportedForProcessing: false,
-            });
-            _FlipPageManager.flipPageBufferCount = 2; // The number of items that should surround the current item as a buffer at any time
-            return _FlipPageManager;
-        })
-    });
-
-});
-
-
-define('require-style!less/styles-flipview',[],function(){});
-
-define('require-style!less/colors-flipview',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/FlipView',[
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Events',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../Animations',
-    '../Animations/_TransitionAnimation',
-    '../BindingList',
-    '../Promise',
-    '../Scheduler',
-    '../Utilities/_Control',
-    '../Utilities/_Dispose',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    '../Utilities/_ItemsManager',
-    '../Utilities/_UI',
-    './ElementResizeInstrument',
-    './FlipView/_Constants',
-    './FlipView/_PageManager',
-    'require-style!less/styles-flipview',
-    'require-style!less/colors-flipview'
-], function flipperInit(_Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _WriteProfilerMark, Animations, _TransitionAnimation, BindingList, Promise, Scheduler, _Control, _Dispose, _ElementUtilities, _Hoverable, _ItemsManager, _UI, _ElementResizeInstrument, _Constants, _PageManager) {
-    "use strict";
-
-    _Base.Namespace.define("WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.FlipView">
-        /// Displays a collection, such as a set of photos, one item at a time.
-        /// </summary>
-        /// </field>
-        /// <icon src="ui_winjs.ui.flipview.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.flipview.16x16.png" width="16" height="16" />
-        /// <htmlSnippet><![CDATA[<div data-win-control="WinJS.UI.FlipView"></div>]]></htmlSnippet>
-        /// <event name="datasourcecountchanged" bubbles="true" locid="WinJS.UI.FlipView_e:datasourcecountchanged">Raised when the number of items in the itemDataSource changes.</event>
-        /// <event name="pagevisibilitychanged" bubbles="true" locid="WinJS.UI.FlipView_e:pagevisibilitychanged">Raised when a FlipView page becomes visible or invisible.</event>
-        /// <event name="pageselected" bubbles="true" locid="WinJS.UI.FlipView_e:pageselected">Raised when the FlipView flips to a page.</event>
-        /// <event name="pagecompleted" bubbles="true" locid="WinJS.UI.FlipView_e:pagecompleted">Raised when the FlipView flips to a page and its renderer function completes.</event>
-        /// <part name="flipView" class="win-flipview" locid="WinJS.UI.FlipView_part:flipView">The entire FlipView control.</part>
-        /// <part name="navigationButton" class="win-navbutton" locid="WinJS.UI.FlipView_part:navigationButton">The general class for all FlipView navigation buttons.</part>
-        /// <part name="leftNavigationButton" class="win-navleft" locid="WinJS.UI.FlipView_part:leftNavigationButton">The left navigation button.</part>
-        /// <part name="rightNavigationButton" class="win-navright" locid="WinJS.UI.FlipView_part:rightNavigationButton">The right navigation button.</part>
-        /// <part name="topNavigationButton" class="win-navtop" locid="WinJS.UI.FlipView_part:topNavigationButton">The top navigation button.</part>
-        /// <part name="bottomNavigationButton" class="win-navbottom" locid="WinJS.UI.FlipView_part:bottomNavigationButton">The bottom navigation button.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        FlipView: _Base.Namespace._lazy(function () {
-
-            // Class names
-            var navButtonClass = "win-navbutton",
-                flipViewClass = "win-flipview",
-                navButtonLeftClass = "win-navleft",
-                navButtonRightClass = "win-navright",
-                navButtonTopClass = "win-navtop",
-                navButtonBottomClass = "win-navbottom";
-
-            // Aria labels
-            var previousButtonLabel = "Previous",
-                nextButtonLabel = "Next";
-
-            var buttonFadeDelay = 3000,
-                avoidTrapDelay = 500,
-                leftArrowGlyph = "&#57570;",
-                rightArrowGlyph = "&#57571;",
-                topArrowGlyph = "&#57572;",
-                bottomArrowGlyph = "&#57573;",
-                animationMoveDelta = 40;
-
-            function flipViewPropertyChanged(list) {
-                var that = list[0].target.winControl;
-                if (that && that instanceof FlipView) {
-                    if (list.some(function (record) {
-                        if (record.attributeName === "dir") {
-                            return true;
-                    } else if (record.attributeName === "style") {
-                            return (that._cachedStyleDir !== record.target.style.direction);
-                    } else {
-                            return false;
-                    }
-                    })) {
-                        that._cachedStyleDir = that._flipviewDiv.style.direction;
-                        that._rtl = _ElementUtilities._getComputedStyle(that._flipviewDiv, null).direction === "rtl";
-                        that._setupOrientation();
-                    }
-                }
-            }
-
-            var strings = {
-                get badAxis() { return "Invalid argument: orientation must be a string, either 'horizontal' or 'vertical'"; },
-                get badCurrentPage() { return "Invalid argument: currentPage must be a number greater than or equal to zero and be within the bounds of the datasource"; },
-                get noitemsManagerForCount() { return "Invalid operation: can't get count if no dataSource has been set"; },
-                get badItemSpacingAmount() { return "Invalid argument: itemSpacing must be a number greater than or equal to zero"; },
-                get navigationDuringStateChange() { return "Error: After changing itemDataSource or itemTemplate, any navigation in the FlipView control should be delayed until the pageselected event is fired."; },
-                get panningContainerAriaLabel() { return _Resources._getWinJSString("ui/flipViewPanningContainerAriaLabel").value; }
-            };
-
-            var FlipView = _Base.Class.define(function FlipView_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.FlipView.FlipView">
-                /// <summary locid="WinJS.UI.FlipView.constructor">
-                /// Creates a new FlipView.
-                /// </summary>
-                /// <param name="element" domElement="true" locid="WinJS.UI.FlipView.constructor_p:element">
-                /// The DOM element that hosts the control.
-                /// </param>
-                /// <param name="options" type="Object" locid="WinJS.UI.FlipView.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// Event names must begin with "on". For example, to provide a handler for the pageselected event,
-                /// add a property named "onpageselected" to the options object and set its value to the event handler.
-                /// This parameter is optional.
-                /// </param>
-                /// <returns type="WinJS.UI.FlipView" locid="WinJS.UI.FlipView.constructor_returnValue">
-                /// The new FlipView control.
-                /// </returns>
-                /// </signature>
-                _WriteProfilerMark("WinJS.UI.FlipView:constructor,StartTM");
-
-                this._disposed = false;
-
-                element = element || _Global.document.createElement("div");
-
-                var isHorizontal = true,
-                    dataSource = null,
-                    itemRenderer = _ItemsManager._trivialHtmlRenderer,
-                    initialIndex = 0,
-                    itemSpacing = 0;
-
-                if (options) {
-                    // flipAxis parameter checking. Must be a string, either "horizontal" or "vertical"
-                    if (options.orientation) {
-                        if (typeof options.orientation === "string") {
-                            switch (options.orientation.toLowerCase()) {
-                                case "horizontal":
-                                    isHorizontal = true;
-                                    break;
-
-                                case "vertical":
-                                    isHorizontal = false;
-                                    break;
-                            }
-                        }
-                    }
-
-                    if (options.currentPage) {
-                        initialIndex = options.currentPage >> 0;
-                        initialIndex = initialIndex < 0 ? 0 : initialIndex;
-                    }
-
-                    if (options.itemDataSource) {
-                        dataSource = options.itemDataSource;
-                    }
-
-                    if (options.itemTemplate) {
-                        itemRenderer = this._getItemRenderer(options.itemTemplate);
-                    }
-
-                    if (options.itemSpacing) {
-                        itemSpacing = options.itemSpacing >> 0;
-                        itemSpacing = itemSpacing < 0 ? 0 : itemSpacing;
-                    }
-                }
-
-                if (!dataSource) {
-                    var list = new BindingList.List();
-                    dataSource = list.dataSource;
-                }
-                _ElementUtilities.empty(element);
-
-                // Set _flipviewDiv so the element getter works correctly, then call _setOption with eventsOnly flag on before calling _initializeFlipView
-                // so that event listeners are added before page loading
-                this._flipviewDiv = element;
-                element.winControl = this;
-                _Control._setOptions(this, options, true);
-                this._initializeFlipView(element, isHorizontal, dataSource, itemRenderer, initialIndex, itemSpacing);
-                _ElementUtilities.addClass(element, "win-disposable");
-                this._avoidTrappingTime = 0;
-                this._windowWheelHandlerBound = this._windowWheelHandler.bind(this);
-                _ElementUtilities._globalListener.addEventListener(element, 'wheel', this._windowWheelHandlerBound);
-                _ElementUtilities._globalListener.addEventListener(element, 'mousewheel', this._windowWheelHandlerBound);
-
-                _WriteProfilerMark("WinJS.UI.FlipView:constructor,StopTM");
-            }, {
-
-                // Public methods
-
-                dispose: function FlipView_dispose() {
-                    /// <signature helpKeyword="WinJS.UI.FlipView.dispose">
-                    /// <summary locid="WinJS.UI.FlipView.dispose">
-                    /// Disposes this FlipView.
-                    /// </summary>
-                    /// </signature>
-                    _WriteProfilerMark("WinJS.UI.FlipView:dispose,StopTM");
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    _ElementUtilities._globalListener.removeEventListener(this._flipviewDiv, 'wheel', this._windowWheelHandlerBound);
-                    _ElementUtilities._globalListener.removeEventListener(this._flipviewDiv, 'mousewheel', this._windowWheelHandlerBound);
-                    _ElementUtilities._resizeNotifier.unsubscribe(this._flipviewDiv, this._resizeHandlerBound);
-                    this._elementResizeInstrument.dispose();
-
-
-                    this._disposed = true;
-                    this._pageManager.dispose();
-                    this._itemsManager.release();
-                    this.itemDataSource = null;
-                },
-
-                next: function FlipView_next() {
-                    /// <signature helpKeyword="WinJS.UI.FlipView.next">
-                    /// <summary locid="WinJS.UI.FlipView.next">
-                    /// Navigates to the next item.
-                    /// </summary>
-                    /// <returns type="Boolean" locid="WinJS.UI.FlipView.next_returnValue">
-                    /// true if the FlipView begins navigating to the next page;
-                    /// false if the FlipView is at the last page or is in the middle of another navigation animation.
-                    /// </returns>
-                    /// </signature>
-                    _WriteProfilerMark("WinJS.UI.FlipView:next,info");
-                    var cancelAnimationCallback = this._nextAnimation ? null : this._cancelDefaultAnimation;
-                    return this._navigate(true, cancelAnimationCallback);
-                },
-
-                previous: function FlipView_previous() {
-                    /// <signature helpKeyword="WinJS.UI.FlipView.previous">
-                    /// <summary locid="WinJS.UI.FlipView.previous">
-                    /// Navigates to the previous item.
-                    /// </summary>
-                    /// <returns type="Boolean" locid="WinJS.UI.FlipView.previous_returnValue">
-                    /// true if FlipView begins navigating to the previous page;
-                    /// false if the FlipView is already at the first page or is in the middle of another navigation animation.
-                    /// </returns>
-                    /// </signature>
-                    _WriteProfilerMark("WinJS.UI.FlipView:prev,info");
-                    var cancelAnimationCallback = this._prevAnimation ? null : this._cancelDefaultAnimation;
-                    return this._navigate(false, cancelAnimationCallback);
-                },
-
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.FlipView.element" helpKeyword="WinJS.UI.FlipView.element">
-                /// The DOM element that hosts the FlipView control.
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._flipviewDiv;
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.FlipView.currentPage" helpKeyword="WinJS.UI.FlipView.currentPage" minimum="0">
-                /// Gets or sets the index of the currently displayed page. The minimum value is 0 and the maximum value is one less than the total number of items returned by the data source.
-                /// </field>
-                currentPage: {
-                    get: function () {
-                        return this._getCurrentIndex();
-                    },
-                    set: function (index) {
-                        _WriteProfilerMark("WinJS.UI.FlipView:set_currentPage,info");
-
-                        if (this._pageManager._notificationsEndedSignal) {
-                            var that = this;
-                            this._pageManager._notificationsEndedSignal.promise.done(function () {
-                                that._pageManager._notificationsEndedSignal = null;
-                                that.currentPage = index;
-                            });
-                            return;
-                        }
-
-                        if (this._animating && !this._cancelAnimation()) {
-                            return;
-                        }
-
-                        index = index >> 0;
-                        index = index < 0 ? 0 : index;
-
-                        if (this._refreshTimer) {
-                            this._indexAfterRefresh = index;
-                        } else {
-                            if (this._pageManager._cachedSize > 0) {
-                                index = Math.min(this._pageManager._cachedSize - 1, index);
-                            } else if (this._pageManager._cachedSize === 0) {
-                                index = 0;
-                            }
-
-                            var that = this;
-                            if (this._jumpingToIndex === index) {
-                                return;
-                            }
-                            var clearJumpToIndex = function () {
-                                that._jumpingToIndex = null;
-                            };
-                            this._jumpingToIndex = index;
-                            var jumpAnimation = (this._jumpAnimation ? this._jumpAnimation : this._defaultAnimation.bind(this)),
-                                cancelAnimationCallback = (this._jumpAnimation ? null : this._cancelDefaultAnimation),
-                                completionCallback = function () { that._completeJump(); };
-                            this._pageManager.startAnimatedJump(index, cancelAnimationCallback, completionCallback).
-                            then(function (elements) {
-                                if (elements) {
-                                    that._animationsStarted();
-                                    var currElement = elements.oldPage.pageRoot;
-                                    var newCurrElement = elements.newPage.pageRoot;
-                                    that._contentDiv.appendChild(currElement);
-                                    that._contentDiv.appendChild(newCurrElement);
-
-                                    that._completeJumpPending = true;
-                                    jumpAnimation(currElement, newCurrElement).
-                                        then(function () {
-                                            if (that._completeJumpPending) {
-                                                completionCallback();
-                                                _WriteProfilerMark("WinJS.UI.FlipView:set_currentPage.animationComplete,info");
-                                            }
-                                        }).done(clearJumpToIndex, clearJumpToIndex);
-                                } else {
-                                    clearJumpToIndex();
-                                }
-                            }, clearJumpToIndex);
-                        }
-                    }
-                },
-
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.Orientation" locid="WinJS.UI.FlipView.orientation" helpKeyword="WinJS.UI.FlipView.orientation">
-                /// Gets or sets the layout orientation of the FlipView, horizontal or vertical.
-                /// </field>
-                orientation: {
-                    get: function () {
-                        return this._axisAsString();
-                    },
-                    set: function (orientation) {
-                        _WriteProfilerMark("WinJS.UI.FlipView:set_orientation,info");
-                        var isHorizontal = orientation === "horizontal";
-                        if (isHorizontal !== this._isHorizontal) {
-                            this._isHorizontal = isHorizontal;
-                            this._setupOrientation();
-                            this._pageManager.setOrientation(this._isHorizontal);
-                        }
-                    }
-                },
-
-                /// <field type="object" locid="WinJS.UI.FlipView.itemDataSource" helpKeyword="WinJS.UI.FlipView.itemDataSource">
-                /// Gets or sets the data source that provides the FlipView with items to display.
-                /// The FlipView displays one item at a time, each on its own page.
-                /// </field>
-                itemDataSource: {
-                    get: function () {
-                        return this._dataSource;
-                    },
-
-                    set: function (dataSource) {
-                        _WriteProfilerMark("WinJS.UI.FlipView:set_itemDataSource,info");
-                        this._dataSourceAfterRefresh = dataSource || new BindingList.List().dataSource;
-                        this._refresh();
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.FlipView.itemTemplate" helpKeyword="WinJS.UI.FlipView.itemTemplate" potentialValueSelector="[data-win-control='WinJS.Binding.Template']">
-                /// Gets or sets a WinJS.Binding.Template or a function that defines the HTML for each item's page.
-                /// </field>
-                itemTemplate: {
-                    get: function () {
-                        return this._itemRenderer;
-                    },
-
-                    set: function (itemTemplate) {
-                        _WriteProfilerMark("WinJS.UI.FlipView:set_itemTemplate,info");
-                        this._itemRendererAfterRefresh = this._getItemRenderer(itemTemplate);
-                        this._refresh();
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.FlipView.itemSpacing" helpKeyword="WinJS.UI.FlipView.itemSpacing">
-                /// Gets or sets the spacing between items, in pixels.
-                /// </field>
-                itemSpacing: {
-                    get: function () {
-                        return this._pageManager.getItemSpacing();
-                    },
-
-                    set: function (spacing) {
-                        _WriteProfilerMark("WinJS.UI.FlipView:set_itemSpacing,info");
-                        spacing = spacing >> 0;
-                        spacing = spacing < 0 ? 0 : spacing;
-                        this._pageManager.setItemSpacing(spacing);
-                    }
-                },
-
-                count: function FlipView_count() {
-                    /// <signature helpKeyword="WinJS.UI.FlipView.count">
-                    /// <summary locid="WinJS.UI.FlipView.count">
-                    /// Returns the number of items in the FlipView object's itemDataSource.
-                    /// </summary>
-                    /// <returns type="WinJS.Promise" locid="WinJS.UI.FlipView.count_returnValue">
-                    /// A Promise that contains the number of items in the list
-                    /// or WinJS.UI.CountResult.unknown if the count is unavailable.
-                    /// </returns>
-                    /// </signature>
-
-                    _WriteProfilerMark("WinJS.UI.FlipView:count,info");
-                    var that = this;
-                    return new Promise(function (complete, error) {
-                        if (that._itemsManager) {
-                            if (that._pageManager._cachedSize === _UI.CountResult.unknown || that._pageManager._cachedSize >= 0) {
-                                complete(that._pageManager._cachedSize);
-                            } else {
-                                that._dataSource.getCount().then(function (count) {
-                                    that._pageManager._cachedSize = count;
-                                    complete(count);
-                                });
-                            }
-                        } else {
-                            error(FlipView.noitemsManagerForCount);
-                        }
-                    });
-                },
-
-                setCustomAnimations: function FlipView_setCustomAnimations(animations) {
-                    /// <signature helpKeyword="WinJS.UI.FlipView.setCustomAnimations">
-                    /// <summary locid="WinJS.UI.FlipView.setCustomAnimations">
-                    /// Sets custom animations for the FlipView to use when navigating between pages.
-                    /// </summary>
-                    /// <param name="animations" type="Object" locid="WinJS.UI.FlipView.setCustomAnimations_p:animations">
-                    /// An object containing up to three fields, one for each navigation action: next, previous, and jump
-                    /// Each of those fields must be a function with this signature: function (outgoingPage, incomingPage).
-                    /// This function returns a WinJS.Promise object that completes once the animations are finished.
-                    /// If a field is null or undefined, the FlipView reverts to its default animation for that action.
-                    /// </param>
-                    /// </signature>
-                    _WriteProfilerMark("WinJS.UI.FlipView:setCustomAnimations,info");
-
-                    if (animations.next !== undefined) {
-                        this._nextAnimation = animations.next;
-                    }
-                    if (animations.previous !== undefined) {
-                        this._prevAnimation = animations.previous;
-                    }
-                    if (animations.jump !== undefined) {
-                        this._jumpAnimation = animations.jump;
-                    }
-                },
-
-                forceLayout: function FlipView_forceLayout() {
-                    /// <signature helpKeyword="WinJS.UI.FlipView.forceLayout">
-                    /// <summary locid="WinJS.UI.FlipView.forceLayout">
-                    /// Forces the FlipView to update its layout.
-                    /// Use this function when making the FlipView visible again after its style.display property had been set to "none".
-                    /// </summary>
-                    /// </signature>
-                    _WriteProfilerMark("WinJS.UI.FlipView:forceLayout,info");
-
-                    this._pageManager.resized();
-                },
-
-                // Private members
-
-                _initializeFlipView: function FlipView_initializeFlipView(element, isHorizontal, dataSource, itemRenderer, initialIndex, itemSpacing) {
-                    var that = this;
-                    var flipViewInitialized = false;
-                    this._flipviewDiv = element;
-                    _ElementUtilities.addClass(this._flipviewDiv, flipViewClass);
-                    this._contentDiv = _Global.document.createElement("div");
-                    this._panningDivContainer = _Global.document.createElement("div");
-                    this._panningDivContainer.className = "win-surface";
-                    this._panningDiv = _Global.document.createElement("div");
-                    this._prevButton = _Global.document.createElement("button");
-                    this._nextButton = _Global.document.createElement("button");
-                    this._isHorizontal = isHorizontal;
-                    this._dataSource = dataSource;
-                    this._itemRenderer = itemRenderer;
-                    this._itemsManager = null;
-                    this._pageManager = null;
-
-                    var stylesRequiredForFullFeatureMode = [
-                        "scroll-limit-x-max",
-                        "scroll-limit-x-min",
-                        "scroll-limit-y-max",
-                        "scroll-limit-y-min",
-                        "scroll-snap-type",
-                        "scroll-snap-x",
-                        "scroll-snap-y",
-                        "overflow-style",
-                    ];
-
-                    var allFeaturesSupported = true,
-                        styleEquivalents = _BaseUtils._browserStyleEquivalents;
-                    for (var i = 0, len = stylesRequiredForFullFeatureMode.length; i < len; i++) {
-                        allFeaturesSupported = allFeaturesSupported && !!(styleEquivalents[stylesRequiredForFullFeatureMode[i]]);
-                    }
-                    allFeaturesSupported = allFeaturesSupported && !!_BaseUtils._browserEventEquivalents["manipulationStateChanged"];
-                    allFeaturesSupported = allFeaturesSupported && _ElementUtilities._supportsSnapPoints;
-                    this._environmentSupportsTouch = allFeaturesSupported;
-
-                    var accName = this._flipviewDiv.getAttribute("aria-label");
-                    if (!accName) {
-                        this._flipviewDiv.setAttribute("aria-label", "");
-                    }
-
-                    this._flipviewDiv.setAttribute("role", "listbox");
-                    if (!this._flipviewDiv.style.overflow) {
-                        this._flipviewDiv.style.overflow = "hidden";
-                    }
-                    this._contentDiv.style.position = "relative";
-                    this._contentDiv.style.zIndex = 0;
-                    this._contentDiv.style.width = "100%";
-                    this._contentDiv.style.height = "100%";
-                    this._panningDiv.style.position = "relative";
-                    this._panningDivContainer.style.position = "relative";
-                    this._panningDivContainer.style.width = "100%";
-                    this._panningDivContainer.style.height = "100%";
-                    this._panningDivContainer.setAttribute("role", "group");
-                    this._panningDivContainer.setAttribute("aria-label", strings.panningContainerAriaLabel);
-
-                    this._contentDiv.appendChild(this._panningDivContainer);
-                    this._flipviewDiv.appendChild(this._contentDiv);
-
-                    this._panningDiv.style.width = "100%";
-                    this._panningDiv.style.height = "100%";
-                    this._setupOrientation();
-                    function setUpButton(button) {
-                        button.setAttribute("aria-hidden", true);
-                        button.style.visibility = "hidden";
-                        button.style.opacity = 0.0;
-                        button.tabIndex = -1;
-                        button.style.zIndex = 1000;
-                    }
-                    setUpButton(this._prevButton);
-                    setUpButton(this._nextButton);
-                    this._prevButton.setAttribute("aria-label", previousButtonLabel);
-                    this._nextButton.setAttribute("aria-label", nextButtonLabel);
-                    this._prevButton.setAttribute("type", "button");
-                    this._nextButton.setAttribute("type", "button");
-                    this._panningDivContainer.appendChild(this._panningDiv);
-                    this._contentDiv.appendChild(this._prevButton);
-                    this._contentDiv.appendChild(this._nextButton);
-
-                    this._itemsManagerCallback = {
-                        // Callbacks for itemsManager
-                        inserted: function FlipView_inserted(itemPromise, previousHandle, nextHandle) {
-                            that._itemsManager._itemFromPromise(itemPromise).then(function (element) {
-                                var previous = that._itemsManager._elementFromHandle(previousHandle);
-                                var next = that._itemsManager._elementFromHandle(nextHandle);
-                                that._pageManager.inserted(element, previous, next, true);
-                            });
-                        },
-
-                        countChanged: function FlipView_countChanged(newCount, oldCount) {
-                            that._pageManager._cachedSize = newCount;
-
-                            // Don't fire the datasourcecountchanged event when there is a state transition
-                            if (oldCount !== _UI.CountResult.unknown) {
-                                that._fireDatasourceCountChangedEvent();
-                            }
-                        },
-
-                        changed: function FlipView_changed(newElement, oldElement) {
-                            that._pageManager.changed(newElement, oldElement);
-                        },
-
-                        moved: function FlipView_moved(element, prev, next, itemPromise) {
-                            var elementReady = function (element) {
-                                that._pageManager.moved(element, prev, next);
-                            };
-
-                            // If we haven't instantiated this item yet, do so now
-                            if (!element) {
-                                that._itemsManager._itemFromPromise(itemPromise).then(elementReady);
-                            } else {
-                                elementReady(element);
-                            }
-
-                        },
-
-                        removed: function FlipView_removed(element, mirage) {
-                            if (element) {
-                                that._pageManager.removed(element, mirage, true);
-                            }
-                        },
-
-                        knownUpdatesComplete: function FlipView_knownUpdatesComplete() {
-                        },
-
-                        beginNotifications: function FlipView_beginNotifications() {
-                            that._cancelAnimation();
-                            that._pageManager.notificationsStarted();
-                        },
-
-                        endNotifications: function FlipView_endNotifications() {
-                            that._pageManager.notificationsEnded();
-                        },
-
-                        itemAvailable: function FlipView_itemAvailable(real, placeholder) {
-                            that._pageManager.itemRetrieved(real, placeholder);
-                        },
-
-                        reload: function FlipView_reload() {
-                            that._pageManager.reload();
-                        }
-                    };
-
-                    if (this._dataSource) {
-                        this._itemsManager = _ItemsManager._createItemsManager(this._dataSource, this._itemRenderer, this._itemsManagerCallback, {
-                            ownerElement: this._flipviewDiv
-                        });
-                    }
-
-                    this._pageManager = new _PageManager._FlipPageManager(this._flipviewDiv, this._panningDiv, this._panningDivContainer, this._itemsManager, itemSpacing, this._environmentSupportsTouch,
-                    {
-                        hidePreviousButton: function () {
-                            that._hasPrevContent = false;
-                            that._fadeOutButton("prev");
-                            that._prevButton.setAttribute("aria-hidden", true);
-                        },
-
-                        showPreviousButton: function () {
-                            that._hasPrevContent = true;
-                            that._fadeInButton("prev");
-                            that._prevButton.setAttribute("aria-hidden", false);
-                        },
-
-                        hideNextButton: function () {
-                            that._hasNextContent = false;
-                            that._fadeOutButton("next");
-                            that._nextButton.setAttribute("aria-hidden", true);
-                        },
-
-                        showNextButton: function () {
-                            that._hasNextContent = true;
-                            that._fadeInButton("next");
-                            that._nextButton.setAttribute("aria-hidden", false);
-                        }
-                    });
-
-                    this._pageManager.initialize(initialIndex, this._isHorizontal);
-
-                    this._dataSource.getCount().then(function (count) {
-                        that._pageManager._cachedSize = count;
-                    });
-
-                    this._prevButton.addEventListener("click", function () {
-                        that.previous();
-                    }, false);
-
-                    this._nextButton.addEventListener("click", function () {
-                        that.next();
-                    }, false);
-
-                    new _ElementUtilities._MutationObserver(flipViewPropertyChanged).observe(this._flipviewDiv, { attributes: true, attributeFilter: ["dir", "style"] });
-                    this._cachedStyleDir = this._flipviewDiv.style.direction;
-
-                    this._contentDiv.addEventListener("mouseleave", function () {
-                        that._mouseInViewport = false;
-                    }, false);
-
-                    var PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || "touch";
-                    function handleShowButtons(e) {
-                        if (e.pointerType !== PT_TOUCH) {
-                            that._touchInteraction = false;
-                            if (e.screenX === that._lastMouseX && e.screenY === that._lastMouseY) {
-                                return;
-                            }
-                            that._lastMouseX = e.screenX;
-                            that._lastMouseY = e.screenY;
-                            that._mouseInViewport = true;
-                            that._fadeInButton("prev");
-                            that._fadeInButton("next");
-                            that._fadeOutButtons();
-                        }
-                    }
-
-                    function handlePointerDown(e) {
-                        if (e.pointerType === PT_TOUCH) {
-                            that._mouseInViewport = false;
-                            that._touchInteraction = true;
-                            that._fadeOutButtons(true);
-                        } else {
-                            that._touchInteraction = false;
-                            if (!that._isInteractive(e.target)) {
-                                // Disable the default behavior of the mouse wheel button to avoid auto-scroll
-                                if ((e.buttons & 4) !== 0) {
-                                    e.stopPropagation();
-                                    e.preventDefault();
-                                }
-                            }
-                        }
-                    }
-
-                    function handlePointerUp(e) {
-                        if (e.pointerType !== PT_TOUCH) {
-                            that._touchInteraction = false;
-                        }
-                    }
-
-                    if (this._environmentSupportsTouch) {
-                        _ElementUtilities._addEventListener(this._contentDiv, "pointerdown", handlePointerDown, false);
-                        _ElementUtilities._addEventListener(this._contentDiv, "pointermove", handleShowButtons, false);
-                        _ElementUtilities._addEventListener(this._contentDiv, "pointerup", handlePointerUp, false);
-                    }
-
-                    this._panningDivContainer.addEventListener("scroll", function () {
-                        that._scrollPosChanged();
-                    }, false);
-
-                    this._panningDiv.addEventListener("blur", function () {
-                        if (!that._touchInteraction) {
-                            that._fadeOutButtons();
-                        }
-                    }, true);
-
-                    this._resizeHandlerBound = this._resizeHandler.bind(this);
-                    this._elementResizeInstrument = new _ElementResizeInstrument._ElementResizeInstrument();
-                    this._flipviewDiv.appendChild(this._elementResizeInstrument.element);
-                    this._elementResizeInstrument.addEventListener("resize", this._resizeHandlerBound);
-                    _ElementUtilities._resizeNotifier.subscribe(this._flipviewDiv, this._resizeHandlerBound);
-
-                    var initiallyParented = _Global.document.body.contains(this._flipviewDiv);
-                    if (initiallyParented) {
-                        this._elementResizeInstrument.addedToDom();
-                    }
-
-                    // Scroll position isn't maintained when an element is added/removed from
-                    // the DOM so every time we are placed back in, let the PageManager
-                    // fix the scroll position.
-                    _ElementUtilities._addInsertedNotifier(this._flipviewDiv);
-                    var initialTrigger = true;
-                    this._flipviewDiv.addEventListener("WinJSNodeInserted", function (event) {
-                        // WinJSNodeInserted fires even if the element was already in the DOM
-                        if (initialTrigger) {
-                            initialTrigger = false;
-                            if (!initiallyParented) {
-                                that._elementResizeInstrument.addedToDom();
-                                that._pageManager.resized();
-                            }
-                        } else { 
-                            that._pageManager.resized();
-                        }
-                    }, false);
-
-
-
-                    this._flipviewDiv.addEventListener("keydown", function (event) {
-                        if (that._disposed) {
-                            return;
-                        }
-
-                        var cancelBubbleIfHandled = true;
-                        if (!that._isInteractive(event.target)) {
-                            var Key = _ElementUtilities.Key,
-                                handled = false;
-                            if (that._isHorizontal) {
-                                switch (event.keyCode) {
-                                    case Key.leftArrow:
-                                        if (!that._rtl && that.currentPage > 0) {
-                                            that.previous();
-                                            handled = true;
-                                        } else if (that._rtl && that.currentPage < that._pageManager._cachedSize - 1) {
-                                            that.next();
-                                            handled = true;
-                                        }
-                                        break;
-
-                                    case Key.pageUp:
-                                        if (that.currentPage > 0) {
-                                            that.previous();
-                                            handled = true;
-                                        }
-                                        break;
-
-                                    case Key.rightArrow:
-                                        if (!that._rtl && that.currentPage < that._pageManager._cachedSize - 1) {
-                                            that.next();
-                                            handled = true;
-                                        } else if (that._rtl && that.currentPage > 0) {
-                                            that.previous();
-                                            handled = true;
-                                        }
-                                        break;
-
-                                    case Key.pageDown:
-                                        if (that.currentPage < that._pageManager._cachedSize - 1) {
-                                            that.next();
-                                            handled = true;
-                                        }
-                                        break;
-
-                                        // Prevent scrolling pixel by pixel, but let the event bubble up
-                                    case Key.upArrow:
-                                    case Key.downArrow:
-                                        handled = true;
-                                        cancelBubbleIfHandled = false;
-                                        break;
-                                }
-                            } else {
-                                switch (event.keyCode) {
-                                    case Key.upArrow:
-                                    case Key.pageUp:
-                                        if (that.currentPage > 0) {
-                                            that.previous();
-                                            handled = true;
-                                        }
-                                        break;
-
-                                    case Key.downArrow:
-                                    case Key.pageDown:
-                                        if (that.currentPage < that._pageManager._cachedSize - 1) {
-                                            that.next();
-                                            handled = true;
-                                        }
-                                        break;
-
-                                    case Key.space:
-                                        handled = true;
-                                        break;
-                                }
-                            }
-
-                            switch (event.keyCode) {
-                                case Key.home:
-                                    that.currentPage = 0;
-                                    handled = true;
-                                    break;
-
-                                case Key.end:
-                                    if (that._pageManager._cachedSize > 0) {
-                                        that.currentPage = that._pageManager._cachedSize - 1;
-                                    }
-                                    handled = true;
-                                    break;
-                            }
-
-                            if (handled) {
-                                event.preventDefault();
-                                if (cancelBubbleIfHandled) {
-                                    event.stopPropagation();
-                                }
-                                return true;
-                            }
-                        }
-                    }, false);
-
-                    flipViewInitialized = true;
-                },
-
-                _windowWheelHandler: function FlipView_windowWheelHandler(ev) {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    // When you are using the mouse wheel to scroll a horizontal area such as a WinJS.UI.Hub and one of the sections
-                    // has a WinJS.UI.FlipView you may get stuck on that item. This logic is to allow a scroll event to skip the flipview's
-                    // overflow scroll div and instead go to the parent scroller. We only skip the scroll wheel event for a fixed amount of time
-                    ev = ev.detail.originalEvent;
-                    var wheelWithinFlipper = ev.target && (this._flipviewDiv.contains(ev.target) || this._flipviewDiv === ev.target);
-                    var that = this;
-                    var now = _BaseUtils._now();
-                    var withinAvoidTime = this._avoidTrappingTime > now;
-
-                    if (!wheelWithinFlipper || withinAvoidTime) {
-                        this._avoidTrappingTime = now + avoidTrapDelay;
-                    }
-
-                    if (wheelWithinFlipper && withinAvoidTime) {
-                        this._panningDivContainer.style["overflowX"] = "hidden";
-                        this._panningDivContainer.style["overflowY"] = "hidden";
-                        _BaseUtils._yieldForDomModification(function () {
-                            // Avoid being stuck between items
-                            that._pageManager._ensureCentered();
-
-                            if (that._isHorizontal) {
-                                that._panningDivContainer.style["overflowX"] = (that._environmentSupportsTouch ? "scroll" : "hidden");
-                                that._panningDivContainer.style["overflowY"] = "hidden";
-                            } else {
-                                that._panningDivContainer.style["overflowY"] = (that._environmentSupportsTouch ? "scroll" : "hidden");
-                                that._panningDivContainer.style["overflowX"] = "hidden";
-                            }
-                        });
-                    } else if (wheelWithinFlipper) {
-                        this._pageManager.simulateMouseWheelScroll(ev);
-                    }
-                },
-
-                _isInteractive: function FlipView_isInteractive(element) {
-                    if (element.parentNode) {
-                        var matches = element.parentNode.querySelectorAll(".win-interactive, .win-interactive *");
-                        for (var i = 0, len = matches.length; i < len; i++) {
-                            if (matches[i] === element) {
-                                return true;
-                            }
-                        }
-                    }
-                    return false;
-                },
-
-                _resizeHandler: function FlipView_resizeHandler() {
-                    _WriteProfilerMark("WinJS.UI.FlipView:resize,StartTM");
-                    this._pageManager.resized();
-                },
-
-                _refreshHandler: function FlipView_refreshHandler() {
-                    var dataSource = this._dataSourceAfterRefresh || this._dataSource,
-                        renderer = this._itemRendererAfterRefresh || this._itemRenderer,
-                        initialIndex = this._indexAfterRefresh || 0;
-                    this._setDatasource(dataSource, renderer, initialIndex);
-                    this._dataSourceAfterRefresh = null;
-                    this._itemRendererAfterRefresh = null;
-                    this._indexAfterRefresh = 0;
-                    this._refreshTimer = false;
-                },
-
-                _refresh: function FlipView_refresh() {
-                    if (!this._refreshTimer) {
-                        var that = this;
-                        this._refreshTimer = true;
-                        // Batch calls to _refresh
-                        Scheduler.schedule(function FlipView_refreshHandler() {
-                            if (that._refreshTimer && !that._disposed) {
-                                that._refreshHandler();
-                            }
-                        }, Scheduler.Priority.high, null, "WinJS.UI.FlipView._refreshHandler");
-                    }
-                },
-
-                _getItemRenderer: function FlipView_getItemRenderer(itemTemplate) {
-                    var itemRenderer = null;
-                    if (typeof itemTemplate === "function") {
-                        var itemPromise = new Promise(function () { });
-                        var itemTemplateResult = itemTemplate(itemPromise);
-                        if (itemTemplateResult.element) {
-                            if (typeof itemTemplateResult.element === "object" && typeof itemTemplateResult.element.then === "function") {
-                                // This renderer returns a promise to an element
-                                itemRenderer = function (itemPromise) {
-                                    var elementRoot = _Global.document.createElement("div");
-                                    elementRoot.className = "win-template";
-                                    _Dispose.markDisposable(elementRoot);
-                                    return {
-                                        element: elementRoot,
-                                        renderComplete: itemTemplate(itemPromise).element.then(function (element) {
-                                            elementRoot.appendChild(element);
-                                        })
-                                    };
-                                };
-                            } else {
-                                // This renderer already returns a placeholder
-                                itemRenderer = itemTemplate;
-                            }
-                        } else {
-                            // Return a renderer that has return a placeholder
-                            itemRenderer = function (itemPromise) {
-                                var elementRoot = _Global.document.createElement("div");
-                                elementRoot.className = "win-template";
-                                _Dispose.markDisposable(elementRoot);
-                                // The pagecompleted event relies on this elementRoot
-                                // to ensure that we are still looking at the same
-                                // item after the render completes.
-                                return {
-                                    element: elementRoot,
-                                    renderComplete: itemPromise.then(function () {
-                                        return Promise.as(itemTemplate(itemPromise)).then(function (element) {
-                                            elementRoot.appendChild(element);
-                                        });
-                                    })
-                                };
-                            };
-                        }
-                    } else if (typeof itemTemplate === "object") {
-                        itemRenderer = itemTemplate.renderItem;
-                    }
-                    return itemRenderer;
-                },
-
-                _navigate: function FlipView_navigate(goForward, cancelAnimationCallback) {
-                    if (_BaseUtils.validation && this._refreshTimer) {
-                        throw new _ErrorFromName("WinJS.UI.FlipView.NavigationDuringStateChange", strings.navigationDuringStateChange);
-                    }
-
-                    if (!this._animating) {
-                        this._animatingForward = goForward;
-                    }
-                    this._goForward = goForward;
-
-                    if (this._animating && !this._cancelAnimation()) {
-                        return false;
-                    }
-                    var that = this;
-                    var customAnimation = (goForward ? this._nextAnimation : this._prevAnimation),
-                        animation = (customAnimation ? customAnimation : this._defaultAnimation.bind(this)),
-                        completionCallback = function (goForward) { that._completeNavigation(goForward); },
-                        elements = this._pageManager.startAnimatedNavigation(goForward, cancelAnimationCallback, completionCallback);
-                    if (elements) {
-                        this._animationsStarted();
-                        var outgoingElement = elements.outgoing.pageRoot,
-                            incomingElement = elements.incoming.pageRoot;
-                        this._contentDiv.appendChild(outgoingElement);
-                        this._contentDiv.appendChild(incomingElement);
-
-                        this._completeNavigationPending = true;
-                        animation(outgoingElement, incomingElement).then(function () {
-                            if (that._completeNavigationPending) {
-                                completionCallback(that._goForward);
-                            }
-                        }).done();
-                        return true;
-                    } else {
-                        return false;
-                    }
-                },
-
-                _cancelDefaultAnimation: function FlipView_cancelDefaultAnimation(outgoingElement, incomingElement) {
-                    // Cancel the fadeOut animation
-                    outgoingElement.style.opacity = 0;
-
-                    // Cancel the enterContent animation
-                    incomingElement.style.animationName = "";
-                    incomingElement.style.opacity = 1;
-                },
-
-                _cancelAnimation: function FlipView_cancelAnimation() {
-                    if (this._pageManager._navigationAnimationRecord &&
-                        this._pageManager._navigationAnimationRecord.completionCallback) {
-
-                        var cancelCallback = this._pageManager._navigationAnimationRecord.cancelAnimationCallback;
-                        if (cancelCallback) {
-                            cancelCallback = cancelCallback.bind(this);
-                        }
-
-                        if (this._pageManager._navigationAnimationRecord && this._pageManager._navigationAnimationRecord.elementContainers) {
-                            var outgoingPage = this._pageManager._navigationAnimationRecord.elementContainers[0],
-                            incomingPage = this._pageManager._navigationAnimationRecord.elementContainers[1],
-                            outgoingElement = outgoingPage.pageRoot,
-                            incomingElement = incomingPage.pageRoot;
-
-                            // Invoke the function that will cancel the animation
-                            if (cancelCallback) {
-                                cancelCallback(outgoingElement, incomingElement);
-                            }
-
-                            // Invoke the completion function after cancelling the animation
-                            this._pageManager._navigationAnimationRecord.completionCallback(this._animatingForward);
-
-                            return true;
-                        }
-                    }
-                    return false;
-                },
-
-                _completeNavigation: function FlipView_completeNavigation(goForward) {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    this._pageManager._resizing = false;
-                    if (this._pageManager._navigationAnimationRecord &&
-                        this._pageManager._navigationAnimationRecord.elementContainers) {
-
-                        var outgoingPage = this._pageManager._navigationAnimationRecord.elementContainers[0],
-                            incomingPage = this._pageManager._navigationAnimationRecord.elementContainers[1],
-                            outgoingElement = outgoingPage.pageRoot,
-                            incomingElement = incomingPage.pageRoot;
-
-                        if (outgoingElement.parentNode) {
-                            outgoingElement.parentNode.removeChild(outgoingElement);
-                        }
-                        if (incomingElement.parentNode) {
-                            incomingElement.parentNode.removeChild(incomingElement);
-                        }
-                        this._pageManager.endAnimatedNavigation(goForward, outgoingPage, incomingPage);
-                        this._fadeOutButtons();
-                        this._scrollPosChanged();
-                        this._pageManager._ensureCentered(true);
-                        this._animationsFinished();
-                    }
-                    this._completeNavigationPending = false;
-                },
-
-                _completeJump: function FlipView_completeJump() {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    this._pageManager._resizing = false;
-                    if (this._pageManager._navigationAnimationRecord &&
-                        this._pageManager._navigationAnimationRecord.elementContainers) {
-
-                        var outgoingPage = this._pageManager._navigationAnimationRecord.elementContainers[0],
-                            incomingPage = this._pageManager._navigationAnimationRecord.elementContainers[1],
-                            outgoingElement = outgoingPage.pageRoot,
-                            incomingElement = incomingPage.pageRoot;
-
-                        if (outgoingElement.parentNode) {
-                            outgoingElement.parentNode.removeChild(outgoingElement);
-                        }
-                        if (incomingElement.parentNode) {
-                            incomingElement.parentNode.removeChild(incomingElement);
-                        }
-
-                        this._pageManager.endAnimatedJump(outgoingPage, incomingPage);
-                        this._animationsFinished();
-                    }
-                    this._completeJumpPending = false;
-                },
-
-                _setCurrentIndex: function FlipView_setCurrentIndex(index) {
-                    return this._pageManager.jumpToIndex(index);
-                },
-
-                _getCurrentIndex: function FlipView_getCurrentIndex() {
-                    return this._pageManager.currentIndex();
-                },
-
-                _setDatasource: function FlipView_setDatasource(source, template, index) {
-                    if (this._animating) {
-                        this._cancelAnimation();
-                    }
-
-                    var initialIndex = 0;
-                    if (index !== undefined) {
-                        initialIndex = index;
-                    }
-                    this._dataSource = source;
-                    this._itemRenderer = template;
-                    var oldItemsManager = this._itemsManager;
-                    this._itemsManager = _ItemsManager._createItemsManager(this._dataSource, this._itemRenderer, this._itemsManagerCallback, {
-                        ownerElement: this._flipviewDiv
-                    });
-                    this._dataSource = this._itemsManager.dataSource;
-
-                    var that = this;
-                    this._dataSource.getCount().then(function (count) {
-                        that._pageManager._cachedSize = count;
-                    });
-                    this._pageManager.setNewItemsManager(this._itemsManager, initialIndex);
-                    oldItemsManager && oldItemsManager.release();
-                },
-
-                _fireDatasourceCountChangedEvent: function FlipView_fireDatasourceCountChangedEvent() {
-                    var that = this;
-                    Scheduler.schedule(function FlipView_dispatchDataSourceCountChangedEvent() {
-                        var event = _Global.document.createEvent("Event");
-                        event.initEvent(FlipView.datasourceCountChangedEvent, true, true);
-                        _WriteProfilerMark("WinJS.UI.FlipView:dataSourceCountChangedEvent,info");
-                        that._flipviewDiv.dispatchEvent(event);
-                    }, Scheduler.Priority.normal, null, "WinJS.UI.FlipView._dispatchDataSourceCountChangedEvent");
-                },
-
-                _scrollPosChanged: function FlipView_scrollPosChanged() {
-                    if (!this._disposed) {
-                        this._pageManager.scrollPosChanged();
-                    }
-                },
-
-                _axisAsString: function FlipView_axisAsString() {
-                    return (this._isHorizontal ? "horizontal" : "vertical");
-                },
-
-                _setupOrientation: function FlipView_setupOrientation() {
-                    if (this._isHorizontal) {
-                        this._panningDivContainer.style["overflowX"] = (this._environmentSupportsTouch ? "scroll" : "hidden");
-                        this._panningDivContainer.style["overflowY"] = "hidden";
-                        var rtl = _ElementUtilities._getComputedStyle(this._flipviewDiv, null).direction === "rtl";
-                        this._rtl = rtl;
-                        if (rtl) {
-                            this._prevButton.className = navButtonClass + " " + navButtonRightClass;
-                            this._nextButton.className = navButtonClass + " " + navButtonLeftClass;
-                        } else {
-                            this._prevButton.className = navButtonClass + " " + navButtonLeftClass;
-                            this._nextButton.className = navButtonClass + " " + navButtonRightClass;
-                        }
-                        this._prevButton.innerHTML = (rtl ? rightArrowGlyph : leftArrowGlyph);
-                        this._nextButton.innerHTML = (rtl ? leftArrowGlyph : rightArrowGlyph);
-                    } else {
-                        this._panningDivContainer.style["overflowY"] = (this._environmentSupportsTouch ? "scroll" : "hidden");
-                        this._panningDivContainer.style["overflowX"] = "hidden";
-                        this._prevButton.className = navButtonClass + " " + navButtonTopClass;
-                        this._nextButton.className = navButtonClass + " " + navButtonBottomClass;
-                        this._prevButton.innerHTML = topArrowGlyph;
-                        this._nextButton.innerHTML = bottomArrowGlyph;
-                    }
-                    this._panningDivContainer.style["msOverflowStyle"] = "none";
-                },
-
-                _fadeInButton: function FlipView_fadeInButton(button, forceShow) {
-                    if (this._mouseInViewport || forceShow || !this._environmentSupportsTouch) {
-                        if (button === "next" && this._hasNextContent) {
-                            if (this._nextButtonAnimation) {
-                                this._nextButtonAnimation.cancel();
-                                this._nextButtonAnimation = null;
-                            }
-
-                            this._nextButton.style.visibility = "visible";
-                            this._nextButtonAnimation = this._fadeInFromCurrentValue(this._nextButton);
-                        } else if (button === "prev" && this._hasPrevContent) {
-                            if (this._prevButtonAnimation) {
-                                this._prevButtonAnimation.cancel();
-                                this._prevButtonAnimation = null;
-                            }
-
-                            this._prevButton.style.visibility = "visible";
-                            this._prevButtonAnimation = this._fadeInFromCurrentValue(this._prevButton);
-                        }
-                    }
-                },
-
-                _fadeOutButton: function FlipView_fadeOutButton(button) {
-                    var that = this;
-                    if (button === "next") {
-                        if (this._nextButtonAnimation) {
-                            this._nextButtonAnimation.cancel();
-                            this._nextButtonAnimation = null;
-                        }
-
-                        this._nextButtonAnimation = Animations.fadeOut(this._nextButton).
-                            then(function () {
-                                that._nextButton.style.visibility = "hidden";
-                            });
-                        return this._nextButtonAnimation;
-                    } else {
-                        if (this._prevButtonAnimation) {
-                            this._prevButtonAnimation.cancel();
-                            this._prevButtonAnimation = null;
-                        }
-
-                        this._prevButtonAnimation = Animations.fadeOut(this._prevButton).
-                            then(function () {
-                                that._prevButton.style.visibility = "hidden";
-                            });
-                        return this._prevButtonAnimation;
-                    }
-                },
-
-                _fadeOutButtons: function FlipView_fadeOutButtons(immediately) {
-                    if (!this._environmentSupportsTouch) {
-                        return;
-                    }
-
-                    if (this._buttonFadePromise) {
-                        this._buttonFadePromise.cancel();
-                        this._buttonFadePromise = null;
-                    }
-
-                    var that = this;
-                    this._buttonFadePromise = (immediately ? Promise.wrap() : Promise.timeout(_TransitionAnimation._animationTimeAdjustment(buttonFadeDelay))).then(function () {
-                        that._fadeOutButton("prev");
-                        that._fadeOutButton("next");
-                        that._buttonFadePromise = null;
-                    });
-                },
-
-                _animationsStarted: function FlipView_animationsStarted() {
-                    this._animating = true;
-                },
-
-                _animationsFinished: function FlipView_animationsFinished() {
-                    this._animating = false;
-                },
-
-                _defaultAnimation: function FlipView_defaultAnimation(curr, next) {
-                    var incomingPageMove = {};
-                    next.style.left = "0px";
-                    next.style.top = "0px";
-                    next.style.opacity = 0.0;
-                    var pageDirection = ((curr.itemIndex > next.itemIndex) ? -animationMoveDelta : animationMoveDelta);
-                    incomingPageMove.left = (this._isHorizontal ? (this._rtl ? -pageDirection : pageDirection) : 0) + "px";
-                    incomingPageMove.top = (this._isHorizontal ? 0 : pageDirection) + "px";
-                    var fadeOutPromise = Animations.fadeOut(curr),
-                        enterContentPromise = Animations.enterContent(next, [incomingPageMove], { mechanism: "transition" });
-                    return Promise.join([fadeOutPromise, enterContentPromise]);
-                },
-
-                _fadeInFromCurrentValue: function FlipView_fadeInFromCurrentValue(shown) {
-                    // Intentionally not using the PVL fadeIn animation because we don't want
-                    // to start always from 0 in some cases
-                    return _TransitionAnimation.executeTransition(
-                        shown,
-                        {
-                            property: "opacity",
-                            delay: 0,
-                            duration: 167,
-                            timing: "linear",
-                            to: 1
-                        });
-                }
-            }, _Constants);
-
-            _Base.Class.mix(FlipView, _Events.createEventProperties(
-                FlipView.datasourceCountChangedEvent,
-                FlipView.pageVisibilityChangedEvent,
-                FlipView.pageSelectedEvent,
-                FlipView.pageCompletedEvent));
-            _Base.Class.mix(FlipView, _Control.DOMEventMixin);
-
-            return FlipView;
-        })
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ItemContainer',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Events',
-    '../Core/_Log',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../Promise',
-    '../Scheduler',
-    '../Utilities/_Control',
-    '../Utilities/_Dispose',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    '../Utilities/_KeyboardBehavior',
-    '../Utilities/_UI',
-    './ItemContainer/_Constants',
-    './ItemContainer/_ItemEventsHandler'
-], function itemContainerInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, Promise, Scheduler, _Control, _Dispose, _ElementUtilities, _Hoverable, _KeyboardBehavior, _UI, _Constants, _ItemEventsHandler) {
-    "use strict";
-
-    var createEvent = _Events._createEventProperty;
-    var eventNames = {
-        invoked: "invoked",
-        selectionchanging: "selectionchanging",
-        selectionchanged: "selectionchanged"
-    };
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.ItemContainer">
-        /// Defines an item that can be pressed, selected, and dragged.
-        /// </summary>
-        /// </field>
-        /// <icon src="ui_winjs.ui.itemcontainer.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.itemcontainer.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[
-        /// <div data-win-control="WinJS.UI.ItemContainer" data-win-options="{selected: true}">HTML content</div>
-        /// ]]></htmlSnippet>
-        /// <event name="invoked" bubbles="true" locid="WinJS.UI.ItemContainer_e:invoked">Raised when the user taps or clicks the item.</event>
-        /// <event name="selectionchanging" bubbles="true" locid="WinJS.UI.ItemContainer_e:selectionchanging">Raised before the item is selected or deselected.</event>
-        /// <event name="selectionchanged" bubbles="true" locid="WinJS.UI.ItemContainer_e:selectionchanged">Raised after the item is selected or deselected.</event>
-        /// <part name="itemcontainer" class="win-itemcontainer" locid="WinJS.UI.ItemContainer_part:itemcontainer">Main container for the selection item control.</part>
-        /// <part name="selectionbackground" class="win-selectionbackground" locid="WinJS.UI.ItemContainer_part:selectionbackground">The background of a selection checkmark.</part>
-        /// <part name="selectioncheckmark" class="win-selectioncheckmark" locid="WinJS.UI.ItemContainer_part:selectioncheckmark">A selection checkmark.</part>
-        /// <part name="focusedoutline" class="win-focusedoutline" locid="WinJS.UI.ItemContainer_part:focusedoutline">Used to display an outline when the main container has keyboard focus.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        ItemContainer: _Base.Namespace._lazy(function () {
-            var strings = {
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; },
-                get swipeOrientationDeprecated() { return "Invalid configuration: swipeOrientation is deprecated. The control will default this property to 'none'"; },
-                get swipeBehaviorDeprecated() { return "Invalid configuration: swipeBehavior is deprecated. The control will default this property to 'none'"; }
-            };
-
-            var ItemContainer = _Base.Class.define(function ItemContainer_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.ItemContainer.ItemContainer">
-                /// <summary locid="WinJS.UI.ItemContainer.constructor">
-                /// Creates a new ItemContainer control.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" isOptional="true" locid="WinJS.UI.ItemContainer.constructor_p:element">
-                /// The DOM element that hosts the ItemContainer control.
-                /// </param>
-                /// <param name="options" type="Object" isOptional="true" locid="WinJS.UI.ItemContainer.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// Event names must begin with "on". For example, to provide a handler for the selectionchanging event,
-                /// add a property named "onselectionchanging" to the options object and set its value to the event handler.
-                /// </param>
-                /// <returns type="WinJS.UI.ItemContainer" locid="WinJS.UI.ItemContainer.constructor_returnValue">
-                /// The new ItemContainer control.
-                /// </returns>
-                /// </signature>
-                element = element || _Global.document.createElement("DIV");
-                this._id = element.id || _ElementUtilities._uniqueID(element);
-                this._writeProfilerMark("constructor,StartTM");
-
-                options = options || {};
-
-                if (element.winControl) {
-                    throw new _ErrorFromName("WinJS.UI.ItemContainer.DuplicateConstruction", strings.duplicateConstruction);
-                }
-
-                // Attaching JS control to DOM element
-                element.winControl = this;
-
-                this._element = element;
-                _ElementUtilities.addClass(element, "win-disposable");
-                this._selectionMode = _UI.SelectionMode.single;
-                this._draggable = false;
-                this._pressedEntity = { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX };
-
-                this.tapBehavior = _UI.TapBehavior.invokeOnly;
-
-                _ElementUtilities.addClass(this.element, ItemContainer._ClassName.itemContainer + " " + _Constants._containerClass);
-
-                this._setupInternalTree();
-
-                this._selection = new exports._SingleItemSelectionManager(element, this._itemBox);
-                this._setTabIndex();
-
-                _Control.setOptions(this, options);
-
-                this._mutationObserver = new _ElementUtilities._MutationObserver(this._itemPropertyChange.bind(this));
-                this._mutationObserver.observe(element, { attributes: true, attributeFilter: ["aria-selected"] });
-                this._setAriaRole();
-
-                var that = this;
-                if (!this.selectionDisabled) {
-                    Scheduler.schedule(function ItemContainer_async_initialize() {
-                        that._setDirectionClass();
-                    }, Scheduler.Priority.normal, null, "WinJS.UI.ItemContainer_async_initialize");
-                }
-                this._itemEventsHandler = new _ItemEventsHandler._ItemEventsHandler(Object.create({
-                    containerFromElement: function () {
-                        return that.element;
-                    },
-                    indexForItemElement: function () {
-                        return 1;
-                    },
-                    indexForHeaderElement: function () {
-                        return _Constants._INVALID_INDEX;
-                    },
-                    itemBoxAtIndex: function () {
-                        return that._itemBox;
-                    },
-                    itemAtIndex: function () {
-                        return that.element;
-                    },
-                    headerAtIndex: function () {
-                        return null;
-                    },
-                    containerAtIndex: function () {
-                        return that.element;
-                    },
-                    isZombie: function () {
-                        return this._disposed;
-                    },
-                    getItemPosition: function () {
-                        return that._getItemPosition();
-                    },
-                    rtl: function () {
-                        return that._rtl();
-                    },
-                    fireInvokeEvent: function () {
-                        that._fireInvokeEvent();
-                    },
-                    verifySelectionAllowed: function () {
-                        return that._verifySelectionAllowed();
-                    },
-                    changeFocus: function () { },
-                    selectRange: function (firstIndex, lastIndex) {
-                        return that._selection.set({ firstIndex: firstIndex, lastIndex: lastIndex });
-                    }
-                }, {
-                    pressedEntity: {
-                        get: function () {
-                            return that._pressedEntity;
-                        },
-                        set: function (value) {
-                            that._pressedEntity = value;
-                        }
-                    },
-                    pressedElement: {
-                        enumerable: true,
-                        set: function (value) {
-                            that._pressedElement = value;
-                        }
-                    },
-                    eventHandlerRoot: {
-                        enumerable: true,
-                        get: function () {
-                            return that.element;
-                        }
-                    },
-                    selectionMode: {
-                        enumerable: true,
-                        get: function () {
-                            return that._selectionMode;
-                        }
-                    },
-                    accessibleItemClass: {
-                        enumerable: true,
-                        get: function () {
-                            // CSS class of the element with the aria role
-                            return _Constants._containerClass;
-                        }
-                    },
-                    canvasProxy: {
-                        enumerable: true,
-                        get: function () {
-                            return that._captureProxy;
-                        }
-                    },
-                    tapBehavior: {
-                        enumerable: true,
-                        get: function () {
-                            return that._tapBehavior;
-                        }
-                    },
-                    draggable: {
-                        enumerable: true,
-                        get: function () {
-                            return that._draggable;
-                        }
-                    },
-                    selection: {
-                        enumerable: true,
-                        get: function () {
-                            return that._selection;
-                        }
-                    },
-                    customFootprintParent: {
-                        enumerable: true,
-                        get: function () {
-                            // Use the main container as the footprint
-                            return null;
-                        }
-                    },
-                    skipPreventDefaultOnPointerDown: {
-                        enumerable: true,
-                        get: function () {
-                            return true;
-                        }
-                    }
-                }));
-
-                function eventHandler(eventName, caseSensitive, capture) {
-                    return {
-                        name: (caseSensitive ? eventName : eventName.toLowerCase()),
-                        handler: function (eventObject) {
-                            that["_on" + eventName](eventObject);
-                        },
-                        capture: capture
-                    };
-                }
-                var events = [
-                    eventHandler("PointerDown"),
-                    eventHandler("Click"),
-                    eventHandler("PointerUp"),
-                    eventHandler("PointerCancel"),
-                    eventHandler("LostPointerCapture"),
-                    eventHandler("ContextMenu"),
-                    eventHandler("MSHoldVisual", true),
-                    eventHandler("FocusIn"),
-                    eventHandler("FocusOut"),
-                    eventHandler("DragStart"),
-                    eventHandler("DragEnd"),
-                    eventHandler("KeyDown")
-                ];
-                events.forEach(function (eventHandler) {
-                    _ElementUtilities._addEventListener(that.element, eventHandler.name, eventHandler.handler, !!eventHandler.capture);
-                });
-
-                this._writeProfilerMark("constructor,StopTM");
-            }, {
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.ItemContainer.element" helpKeyword="WinJS.UI.ItemContainer.element">
-                /// Gets the DOM element that hosts the itemContainer control.
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.ItemContainer.draggable" helpKeyword="WinJS.UI.ItemContainer.draggable">
-                /// Gets or sets a value that specifies whether the item can be dragged. The default value is false.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                draggable: {
-                    get: function () {
-                        return this._draggable;
-                    },
-
-                    set: function (value) {
-                        if (_BaseUtils.isPhone) {
-                            return;
-                        }
-                        if (this._draggable !== value) {
-                            this._draggable = value;
-                            this._updateDraggableAttribute();
-                        }
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.ItemContainer.selected" helpKeyword="WinJS.UI.ItemContainer.selected">
-                /// Gets or sets a value that specifies whether the item is selected.
-                /// </field>
-                selected: {
-                    get: function () {
-                        return this._selection.selected;
-                    },
-
-                    set: function (value) {
-                        if (this._selection.selected !== value) {
-                            this._selection.selected = value;
-                        }
-                    }
-                },
-
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.Orientation" locid="WinJS.UI.ItemContainer.swipeOrientation" helpKeyword="WinJS.UI.ItemContainer.swipeOrientation">
-                /// Gets or sets the swipe orientation of the ItemContainer control.
-                /// The default value is "none".
-                /// <deprecated type="deprecate">
-                /// swipeOrientation is deprecated. The control will not use this property.
-                /// </deprecated>
-                /// </field>
-                swipeOrientation: {
-                    get: function () {
-                        return "none";
-                    },
-                    set: function (value) {
-                        _ElementUtilities._deprecated(strings.swipeOrientationDeprecated);
-                    }
-                },
-
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.TapBehavior" locid="WinJS.UI.ItemContainer.tapBehavior" helpKeyword="WinJS.UI.ItemContainer.tapBehavior">
-                /// Gets or sets how the ItemContainer control reacts when the user taps or clicks an item.
-                /// The tap or click can invoke the item, select it and invoke it, or have no effect.
-                /// Possible values: "toggleSelect", "invokeOnly", and "none". The default value is "invokeOnly".
-                /// </field>
-                tapBehavior: {
-                    get: function () {
-                        return this._tapBehavior;
-                    },
-                    set: function (value) {
-                        if (_BaseUtils.isPhone && value === _UI.TapBehavior.directSelect) {
-                            return;
-                        }
-                        this._tapBehavior = value;
-                        this._setAriaRole();
-                    }
-                },
-
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.SwipeBehavior" locid="WinJS.UI.ItemContainer.swipeBehavior" helpKeyword="WinJS.UI.ItemContainer.swipeBehavior">
-                /// Gets or sets how the ItemContainer control reacts to the swipe interaction.
-                /// The swipe gesture can select the item or it can have no effect on the current selection.
-                /// Possible values: "none".
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// <deprecated type="deprecate">
-                /// swipeBehavior is deprecated. The control will not use this property.
-                /// </deprecated>
-                /// </field>
-                swipeBehavior: {
-                    get: function () {
-                        return "none";
-                    },
-                    set: function (value) {
-                        _ElementUtilities._deprecated(strings.swipeBehaviorDeprecated);
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.ItemContainer.selectionDisabled" helpKeyword="WinJS.UI.ItemContainer.selectionDisabled">
-                /// Gets or sets whether the item selection is disabled. The default value is false.
-                /// </field>
-                selectionDisabled: {
-                    get: function () {
-                        return this._selectionMode === _UI.SelectionMode.none;
-                    },
-
-                    set: function (value) {
-                        if (value) {
-                            this._selectionMode = _UI.SelectionMode.none;
-                        } else {
-                            this._setDirectionClass();
-                            this._selectionMode = _UI.SelectionMode.single;
-                        }
-                        this._setAriaRole();
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.ItemCotrol.oninvoked" helpKeyword="WinJS.UI.ItemCotrol.oninvoked">
-                /// Raised when the item is invoked. You can use the tapBehavior property to specify whether taps and clicks invoke the item.
-                /// </field>
-                oninvoked: createEvent(eventNames.invoked),
-
-                /// <field type="Function" locid="WinJS.UI.ItemCotrol.onselectionchanging" helpKeyword="WinJS.UI.ItemCotrol.onselectionchanging">
-                /// Raised just before the item is selected or deselected.
-                /// </field>
-                onselectionchanging: createEvent(eventNames.selectionchanging),
-
-                /// <field type="Function" locid="WinJS.UI.ItemCotrol.onselectionchanged" helpKeyword="WinJS.UI.ItemCotrol.onselectionchanged">
-                /// Raised after the item is selected or deselected.
-                /// </field>
-                onselectionchanged: createEvent(eventNames.selectionchanged),
-
-                forceLayout: function () {
-                    /// <signature helpKeyword="WinJS.UI.ItemContainer.forceLayout">
-                    /// <summary locid="WinJS.UI.ItemContainer.forceLayout">
-                    /// Forces the ItemContainer control to update its layout.
-                    /// Use this function when the reading direction  of the app changes after the control has been initialized.
-                    /// </summary>
-                    /// </signature>
-                    this._forceLayout();
-                },
-
-                dispose: function () {
-                    /// <signature helpKeyword="WinJS.UI.ItemContainer.dispose">
-                    /// <summary locid="WinJS.UI.ItemContainer.dispose">
-                    /// Disposes this control.
-                    /// </summary>
-                    /// </signature>
-
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._disposed = true;
-
-                    this._itemEventsHandler.dispose();
-                    _Dispose.disposeSubTree(this.element);
-                },
-
-                _onMSManipulationStateChanged: function ItemContainer_onMSManipulationStateChanged(eventObject) {
-                    this._itemEventsHandler.onMSManipulationStateChanged(eventObject);
-                },
-
-                _onPointerDown: function ItemContainer_onPointerDown(eventObject) {
-                    this._itemEventsHandler.onPointerDown(eventObject);
-                },
-
-                _onClick: function ItemContainer_onClick(eventObject) {
-                    this._itemEventsHandler.onClick(eventObject);
-                },
-
-                _onPointerUp: function ItemContainer_onPointerUp(eventObject) {
-                    if (_ElementUtilities.hasClass(this._itemBox, _Constants._itemFocusClass)) {
-                        this._onFocusOut(eventObject);
-                    }
-                    this._itemEventsHandler.onPointerUp(eventObject);
-                },
-
-                _onPointerCancel: function ItemContainer_onPointerCancel(eventObject) {
-                    this._itemEventsHandler.onPointerCancel(eventObject);
-                },
-
-                _onLostPointerCapture: function ItemContainer_onLostPointerCapture(eventObject) {
-                    this._itemEventsHandler.onLostPointerCapture(eventObject);
-                },
-
-                _onContextMenu: function ItemContainer_onContextMenu(eventObject) {
-                    this._itemEventsHandler.onContextMenu(eventObject);
-                },
-
-                _onMSHoldVisual: function ItemContainer_onMSHoldVisual(eventObject) {
-                    this._itemEventsHandler.onMSHoldVisual(eventObject);
-                },
-
-                _onFocusIn: function ItemContainer_onFocusIn() {
-                    if (this._itemBox.querySelector("." + _Constants._itemFocusOutlineClass) || !_KeyboardBehavior._keyboardSeenLast) {
-                        return;
-                    }
-                    _ElementUtilities.addClass(this._itemBox, _Constants._itemFocusClass);
-                    var outline = _Global.document.createElement("div");
-                    outline.className = _Constants._itemFocusOutlineClass;
-                    this._itemBox.appendChild(outline);
-                },
-
-                _onFocusOut: function ItemContainer_onFocusOut() {
-                    _ElementUtilities.removeClass(this._itemBox, _Constants._itemFocusClass);
-                    var outline = this._itemBox.querySelector("." + _Constants._itemFocusOutlineClass);
-                    if (outline) {
-                        outline.parentNode.removeChild(outline);
-                    }
-                },
-
-                _onDragStart: function ItemContainer_onDragStart(eventObject) {
-                    // Drag shouldn't be initiated when the user holds down the mouse on a win-interactive element and moves.
-                    // The problem is that the dragstart event's srcElement+target will both be an itembox (which has draggable=true), so we can't check for win-interactive in the dragstart event handler.
-                    // The itemEventsHandler sets our _pressedElement field on PointerDown, so we use that instead when checking for interactive.
-                    if (this._pressedElement && this._itemEventsHandler._isInteractive(this._pressedElement)) {
-                        eventObject.preventDefault();
-                    } else {
-                        this._dragging = true;
-                        var that = this;
-
-                        // Firefox requires setData to be called on the dataTransfer object in order for DnD to continue.
-                        // Firefox also has an issue rendering the item's itemBox+element, so we need to use setDragImage, using the item's container, to get it to render.
-                        eventObject.dataTransfer.setData("text", "");
-                        if (eventObject.dataTransfer.setDragImage) {
-                            var rect = this.element.getBoundingClientRect();
-                            eventObject.dataTransfer.setDragImage(this.element, eventObject.clientX - rect.left, eventObject.clientY - rect.top);
-                        }
-                        // We delay setting the win-dragsource CSS class so that IE has time to create a thumbnail before me make it opaque
-                        _BaseUtils._yieldForDomModification(function () {
-                            if (that._dragging) {
-                                _ElementUtilities.addClass(that._itemBox, _Constants._dragSourceClass);
-                            }
-                        });
-                    }
-                },
-
-                _onDragEnd: function ItemContainer_onDragEnd() {
-                    this._dragging = false;
-                    _ElementUtilities.removeClass(this._itemBox, _Constants._dragSourceClass);
-                    this._itemEventsHandler.resetPointerDownState();
-                },
-
-                _onKeyDown: function ItemContainer_onKeyDown(eventObject) {
-                    if (!this._itemEventsHandler._isInteractive(eventObject.target)) {
-                        var Key = _ElementUtilities.Key,
-                            keyCode = eventObject.keyCode;
-
-                        var handled = false;
-                        if (!eventObject.ctrlKey && keyCode === Key.enter) {
-                            var allowed = this._verifySelectionAllowed();
-                            if (allowed.canTapSelect) {
-                                this.selected = !this.selected;
-                            }
-                            this._fireInvokeEvent();
-                            handled = true;
-                        } else if (eventObject.ctrlKey && keyCode === Key.enter || keyCode === Key.space) {
-                            if (!this.selectionDisabled) {
-                                this.selected = !this.selected;
-                                handled = _ElementUtilities._setActive(this.element);
-                            }
-                        } else if (keyCode === Key.escape && this.selected) {
-                            this.selected = false;
-                            handled = true;
-                        }
-
-                        if (handled) {
-                            eventObject.stopPropagation();
-                            eventObject.preventDefault();
-                        }
-                    }
-                },
-
-                _setTabIndex: function ItemContainer_setTabIndex() {
-                    var currentTabIndex = this.element.getAttribute("tabindex");
-                    if (!currentTabIndex) {
-                        // Set the tabindex to 0 only if the application did not already
-                        // provide a tabindex
-                        this.element.setAttribute("tabindex", "0");
-                    }
-                },
-
-                _rtl: function ItemContainer_rtl() {
-                    if (typeof this._cachedRTL !== "boolean") {
-                        this._cachedRTL = _ElementUtilities._getComputedStyle(this.element, null).direction === "rtl";
-                    }
-                    return this._cachedRTL;
-                },
-
-                _setDirectionClass: function ItemContainer_setDirectionClass() {
-                    _ElementUtilities[this._rtl() ? "addClass" : "removeClass"](this.element, _Constants._rtlListViewClass);
-                },
-
-                _forceLayout: function ItemContainer_forceLayout() {
-                    this._cachedRTL = _ElementUtilities._getComputedStyle(this.element, null).direction === "rtl";
-                    this._setDirectionClass();
-                },
-
-                _getItemPosition: function ItemContainer_getItemPosition() {
-                    var container = this.element;
-                    if (container) {
-                        return Promise.wrap({
-                            left: (this._rtl() ?
-                                container.offsetParent.offsetWidth - container.offsetLeft - container.offsetWidth :
-                                container.offsetLeft),
-                            top: container.offsetTop,
-                            totalWidth: _ElementUtilities.getTotalWidth(container),
-                            totalHeight: _ElementUtilities.getTotalHeight(container),
-                            contentWidth: _ElementUtilities.getContentWidth(container),
-                            contentHeight: _ElementUtilities.getContentHeight(container)
-                        });
-                    } else {
-                        return Promise.cancel;
-                    }
-                },
-
-                _itemPropertyChange: function ItemContainer_itemPropertyChange(list) {
-                    if (this._disposed) { return; }
-
-                    var container = list[0].target;
-                    var ariaSelected = container.getAttribute("aria-selected") === "true";
-
-                    // Only respond to aria-selected changes coming from UIA. This check
-                    // relies on the fact that, in renderSelection, we update the selection
-                    // visual before aria-selected.
-                    if (ariaSelected !== _ElementUtilities._isSelectionRendered(this._itemBox)) {
-                        if (this.selectionDisabled) {
-                            // Revert the change made by UIA since the control has selection disabled
-                            _ElementUtilities._setAttribute(container, "aria-selected", !ariaSelected);
-                        } else {
-                            this.selected = ariaSelected;
-                            // Revert the change because the update was prevented on the selectionchanging event
-                            if (ariaSelected !== this.selected) {
-                                _ElementUtilities._setAttribute(container, "aria-selected", !ariaSelected);
-                            }
-                        }
-                    }
-                },
-
-                _updateDraggableAttribute: function ItemContainer_updateDraggableAttribute() {
-                    this._itemBox.setAttribute("draggable", this._draggable);
-                },
-
-                _verifySelectionAllowed: function ItemContainer_verifySelectionAllowed() {
-                    if (this._selectionMode !== _UI.SelectionMode.none && this._tapBehavior === _UI.TapBehavior.toggleSelect) {
-                        var canSelect = this._selection.fireSelectionChanging();
-                        return {
-                            canSelect: canSelect,
-                            canTapSelect: canSelect && this._tapBehavior === _UI.TapBehavior.toggleSelect
-                        };
-                    } else {
-                        return {
-                            canSelect: false,
-                            canTapSelect: false
-                        };
-                    }
-                },
-
-                _setupInternalTree: function ItemContainer_setupInternalTree() {
-                    var item = _Global.document.createElement("div");
-                    item.className = _Constants._itemClass;
-                    this._captureProxy = _Global.document.createElement("div");
-                    this._itemBox = _Global.document.createElement("div");
-                    this._itemBox.className = _Constants._itemBoxClass;
-                    var child = this.element.firstChild;
-                    while (child) {
-                        var sibling = child.nextSibling;
-                        item.appendChild(child);
-                        child = sibling;
-                    }
-                    this.element.appendChild(this._itemBox);
-                    this._itemBox.appendChild(item);
-                    this.element.appendChild(this._captureProxy);
-                },
-
-                _fireInvokeEvent: function ItemContainer_fireInvokeEvent() {
-                    if (this.tapBehavior !== _UI.TapBehavior.none) {
-                        var eventObject = _Global.document.createEvent("CustomEvent");
-                        eventObject.initCustomEvent(eventNames.invoked, true, false, {});
-                        this.element.dispatchEvent(eventObject);
-                    }
-                },
-
-                _setAriaRole: function ItemContainer_setAriaRole() {
-                    if (!this.element.getAttribute("role") || this._usingDefaultItemRole) {
-                        this._usingDefaultItemRole = true;
-                        var defaultItemRole;
-                        if (this.tapBehavior === _UI.TapBehavior.none && this.selectionDisabled) {
-                            defaultItemRole = "listitem";
-                        } else {
-                            defaultItemRole = "option";
-                        }
-                        _ElementUtilities._setAttribute(this.element, "role", defaultItemRole);
-                    }
-                },
-
-                _writeProfilerMark: function ItemContainer_writeProfilerMark(text) {
-                    var message = "WinJS.UI.ItemContainer:" + this._id + ":" + text;
-                    _WriteProfilerMark(message);
-                    _Log.log && _Log.log(message, null, "itemcontainerprofiler");
-                }
-            }, {
-                // Names of classes used by the ItemContainer.
-                _ClassName: {
-                    itemContainer: "win-itemcontainer",
-                    vertical: "win-vertical",
-                    horizontal: "win-horizontal",
-                }
-            });
-            _Base.Class.mix(ItemContainer, _Control.DOMEventMixin);
-            return ItemContainer;
-        }),
-
-        _SingleItemSelectionManager: _Base.Namespace._lazy(function () {
-            return _Base.Class.define(function SingleItemSelectionManager_ctor(element, itemBox) {
-                this._selected = false;
-                this._element = element;
-                this._itemBox = itemBox;
-            }, {
-                selected: {
-                    get: function () {
-                        return this._selected;
-                    },
-                    set: function (value) {
-                        value = !!value;
-                        if (this._selected !== value) {
-                            if (this.fireSelectionChanging()) {
-                                this._selected = value;
-                                _ItemEventsHandler._ItemEventsHandler.renderSelection(this._itemBox, this._element, value, true, this._element);
-                                this.fireSelectionChanged();
-                            }
-                        }
-                    }
-                },
-
-                count: function SingleItemSelectionManager_count() {
-                    return this._selected ? 1 : 0;
-                },
-
-                getIndices: function SingleItemSelectionManager_getIndices() {
-                    // not used
-                },
-
-                getItems: function SingleItemSelectionManager_getItems() {
-                    // not used
-                },
-
-                getRanges: function SingleItemSelectionManager_getRanges() {
-                    // not used
-                },
-
-                isEverything: function SingleItemSelectionManager_isEverything() {
-                    return false;
-                },
-
-                set: function SingleItemSelectionManager_set() {
-                    this.selected = true;
-                },
-
-                clear: function SingleItemSelectionManager_clear() {
-                    this.selected = false;
-                },
-
-                add: function SingleItemSelectionManager_add() {
-                    this.selected = true;
-                },
-
-                remove: function SingleItemSelectionManager_remove() {
-                    this.selected = false;
-                },
-
-                selectAll: function SingleItemSelectionManager_selectAll() {
-                    // not used
-                },
-
-                fireSelectionChanging: function SingleItemSelectionManager_fireSelectionChanging() {
-                    var eventObject = _Global.document.createEvent("CustomEvent");
-                    eventObject.initCustomEvent(eventNames.selectionchanging, true, true, {});
-                    return this._element.dispatchEvent(eventObject);
-                },
-
-                fireSelectionChanged: function ItemContainer_fireSelectionChanged() {
-                    var eventObject = _Global.document.createEvent("CustomEvent");
-                    eventObject.initCustomEvent(eventNames.selectionchanged, true, false, {});
-                    this._element.dispatchEvent(eventObject);
-                },
-
-                _isIncluded: function SingleItemSelectionManager_isIncluded() {
-                    return this._selected;
-                },
-
-                _getFocused: function SingleItemSelectionManager_getFocused() {
-                    return { type: _UI.ObjectType.item, index: _Constants._INVALID_INDEX };
-                }
-            });
-        })
-    });
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/Repeater',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_ErrorFromName',
-    '../Core/_Events',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../BindingList',
-    '../BindingTemplate',
-    '../Promise',
-    '../Utilities/_Control',
-    '../Utilities/_Dispose',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    ], function repeaterInit(exports, _Global, _Base, _ErrorFromName, _Events, _Resources, _WriteProfilerMark, BindingList, BindingTemplate, Promise, _Control, _Dispose, _ElementUtilities, _Hoverable) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.Repeater">
-        /// Uses templates to generate HTML from a set of data.
-        /// </summary>
-        /// </field>
-        /// <icon src="ui_winjs.ui.repeater.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.repeater.16x16.png" width="16" height="16" />
-        /// <htmlSnippet><![CDATA[<div data-win-control="WinJS.UI.Repeater"></div>]]></htmlSnippet>
-        /// <part name="repeater" class="win-repeater" locid="WinJS.UI.Repeater_part:repeater">The Repeater control itself</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        Repeater: _Base.Namespace._lazy(function () {
-
-            // Constants
-            var ITEMSLOADED = "itemsloaded",
-                ITEMCHANGING = "itemchanging",
-                ITEMCHANGED = "itemchanged",
-                ITEMINSERTING = "iteminserting",
-                ITEMINSERTED = "iteminserted",
-                ITEMMOVING = "itemmoving",
-                ITEMMOVED = "itemmoved",
-                ITEMREMOVING = "itemremoving",
-                ITEMREMOVED = "itemremoved",
-                ITEMSRELOADING = "itemsreloading",
-                ITEMSRELOADED = "itemsreloaded";
-
-            var createEvent = _Events._createEventProperty;
-
-            function stringifyItem(dataItem) {
-                // Repeater uses this as its default renderer when no template is provided.
-                var itemElement = _Global.document.createElement("div");
-                itemElement.textContent = JSON.stringify(dataItem);
-                return itemElement;
-            }
-
-            // Statics
-            var strings = {
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; },
-                get asynchronousRender() { return "Top level items must render synchronously"; },
-                get repeaterReentrancy() { return "Cannot modify Repeater data until Repeater has commited previous modification."; },
-            };
-
-            var Repeater = _Base.Class.define(function Repeater_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.Repeater.Repeater">
-                /// <summary locid="WinJS.UI.Repeater.constructor">
-                /// Creates a new Repeater control.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" isOptional="true" locid="WinJS.UI.Repeater.constructor_p:element">
-                /// The DOM element that will host the new control. The Repeater will create an element if this value is null.
-                /// </param>
-                /// <param name="options" type="Object" isOptional="true" locid="WinJS.UI.Repeater.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the
-                /// new Repeater. Each property of the options object corresponds to one of the
-                /// object's properties or events. Event names must begin with "on".
-                /// </param>
-                /// <returns type="WinJS.UI.Repeater" locid="WinJS.UI.Repeater.constructor_returnValue">
-                /// The new Repeater control.
-                /// </returns>
-                /// </signature>
-
-                // Check to make sure we weren't duplicated
-                if (element && element.winControl) {
-                    throw new _ErrorFromName("WinJS.UI.Repeater.DuplicateConstruction", strings.duplicateConstruction);
-                }
-
-                this._element = element || _Global.document.createElement("div");
-                this._id = this._element.id || _ElementUtilities._uniqueID(this._element);
-                this._writeProfilerMark("constructor,StartTM");
-                options = options || {};
-                _ElementUtilities.addClass(this._element, "win-repeater win-disposable");
-
-                this._render = null;
-                this._modifying = false;
-                this._disposed = false;
-                this._element.winControl = this;
-                this._dataListeners = {
-                    itemchanged: this._dataItemChangedHandler.bind(this),
-                    iteminserted: this._dataItemInsertedHandler.bind(this),
-                    itemmoved: this._dataItemMovedHandler.bind(this),
-                    itemremoved: this._dataItemRemovedHandler.bind(this),
-                    reload: this._dataReloadHandler.bind(this),
-                };
-
-                // Consume Repeater innerHTML and return a template.
-                var inlineTemplate = this._extractInlineTemplate();
-                this._initializing = true;
-                // Use the inlinetemplate if a parameter was not given.
-                // Either way, Repeater's innerHTML has now been consumed.
-                this.template = options.template || inlineTemplate;
-
-                this.data = options.data;
-                this._initializing = false;
-
-                _Control._setOptions(this, options, true); // Events only
-
-                this._repeatedDOM = [];
-                this._renderAllItems();
-                this.dispatchEvent(ITEMSLOADED, {});
-
-                this._writeProfilerMark("constructor,StopTM");
-            }, {
-
-                /// <field type="HTMLElement" domElement="true" readonly="true" hidden="true" locid="WinJS.UI.Repeater.element" helpKeyword="WinJS.UI.Repeater.element">
-                /// Gets the DOM element that hosts the Repeater.
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-
-                /// <field type="WinJS.Binding.List" locid="WinJS.UI.Repeater.data" helpKeyword="WinJS.UI.Repeater.data">
-                /// Gets or sets the WinJS.Binding.List that provides the Repeater control with items to display.
-                /// </field>
-                data: {
-                    get: function () { return this._data; },
-                    set: function (data) {
-                        this._writeProfilerMark("data.set,StartTM");
-                        if (this._data) {
-                            this._removeDataListeners();
-                        }
-                        this._data = data || new BindingList.List();
-                        this._addDataListeners();
-                        if (!this._initializing) {
-                            this._reloadRepeater(true);
-                            this.dispatchEvent(ITEMSLOADED, {});
-                        }
-                        this._writeProfilerMark("data.set,StopTM");
-                    }
-                },
-
-                /// <field type="Object" locid="WinJS.UI.Repeater.template" helpKeyword="WinJS.UI.Repeater.template" potentialValueSelector="[data-win-control='WinJS.Binding.Template']">
-                /// Gets or sets a Template or custom rendering function that defines the HTML of each item within the Repeater.
-                /// </field>
-                template: {
-                    get: function () { return this._template; },
-                    set: function (template) {
-                        this._writeProfilerMark("template.set,StartTM");
-                        this._template = (template || stringifyItem);
-                        this._render = _ElementUtilities._syncRenderer(this._template, this.element.tagName);
-                        if (!this._initializing) {
-                            this._reloadRepeater(true);
-                            this.dispatchEvent(ITEMSLOADED, {});
-                        }
-                        this._writeProfilerMark("template.set,StopTM");
-                    }
-                },
-
-                /// <field type="Number" hidden="true" locid="WinJS.UI.Repeater.length" helpKeyword="WinJS.UI.Repeater.length">
-                /// Gets the number of items in the Repeater control.
-                /// </field>
-                length: {
-                    get: function () { return this._repeatedDOM.length; },
-                },
-
-                elementFromIndex: function Repeater_elementFromIndex(index) {
-                    /// <signature helpKeyword="WinJS.UI.Repeater.elementFromIndex">
-                    /// <summary locid="WinJS.UI.Repeater.elementFromIndex">
-                    /// Returns the HTML element for the item with the specified index.
-                    /// </summary>
-                    /// <param name="index" type="Number" locid="WinJS.UI.Repeater.elementFromIndex _p:index">
-                    /// The index of the item.
-                    /// </param>
-                    /// <returns type="HTMLElement" domElement="true" locid=" WinJS.UI.Repeater.elementFromIndex_returnValue">
-                    /// The DOM element for the specified item.
-                    /// </returns>
-                    /// </signature>
-                    return this._repeatedDOM[index];
-                },
-
-                dispose: function Repeater_dispose() {
-                    /// <signature helpKeyword="WinJS.UI.Repeater.dispose">
-                    /// <summary locid="WinJS.UI.Repeater.dispose">
-                    /// Prepare this Repeater for garbage collection.
-                    /// </summary>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._disposed = true; // Mark this control as disposed.
-                    this._removeDataListeners();
-                    this._data = null;
-                    this._template = null;
-                    for (var i = 0, len = this._repeatedDOM.length; i < len; i++) {
-                        _Dispose._disposeElement(this._repeatedDOM[i]);
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.Repeater.onitemsloaded" helpKeyword="WinJS.UI.Repeater.onitemsloaded">
-                /// Raised when the Repeater has finished loading a new set of data. This event is only fired on construction
-                /// or when the Repeater control's data source or template is replaced.
-                /// </field>
-                onitemsloaded: createEvent(ITEMSLOADED),
-
-                /// <field type="Function" locid="WinJS.UI.Repeater.onitemchanging" helpKeyword="WinJS.UI.Repeater.onitemchanging">
-                /// Raised after an item in the Repeater control's data source changes but before the corresponding DOM element has been updated.
-                /// </field>
-                onitemchanging: createEvent(ITEMCHANGING),
-
-                /// <field type="Function" locid="WinJS.UI.Repeater.onitemchanged" helpKeyword="WinJS.UI.Repeater.onitemchanged">
-                /// Raised after an item in the Repeater control's data source changes and after the corresponding DOM element has been updated.
-                /// </field>
-                onitemchanged: createEvent(ITEMCHANGED),
-
-                /// <field type="Function" locid="WinJS.UI.Repeater.oniteminserting" helpKeyword="WinJS.UI.Repeater.oniteminserting">
-                /// Raised after an item has been added to the Repeater control's data source but before the corresponding DOM element has been added.
-                /// </field>
-                oniteminserting: createEvent(ITEMINSERTING),
-
-                /// <field type="Function" locid="WinJS.UI.Repeater.oniteminserted" helpKeyword="WinJS.UI.Repeater.oniteminserted">
-                /// Raised after an item has been added to the Repeater control's data source and after the corresponding DOM element has been added.
-                /// </field>
-                oniteminserted: createEvent(ITEMINSERTED),
-
-                /// <field type="Function" locid="WinJS.UI.Repeater.onitemmoving" helpKeyword="WinJS.UI.Repeater.onitemmoving">
-                /// Raised after an item has been moved from one index to another in the Repeater control's data source but before the corresponding DOM element has been moved.
-                /// </field>
-                onitemmoving: createEvent(ITEMMOVING),
-
-                /// <field type="Function" locid="WinJS.UI.Repeater.onitemmoved" helpKeyword="WinJS.UI.Repeater.onitemmoved">
-                /// Raised after an item has been moved from one index to another in the Repeater control's data source and after the corresponding DOM element has been moved.
-                /// </field>
-                onitemmoved: createEvent(ITEMMOVED),
-
-                /// <field type="Function" locid="WinJS.UI.Repeater.onitemremoving" helpKeyword="WinJS.UI.Repeater.onitemremoving">
-                /// Raised after an item has been removed from the Repeater control's data source but before the corresponding DOM element has been removed.
-                /// </field>
-                onitemremoving: createEvent(ITEMREMOVING),
-
-                /// <field type="Function" locid="WinJS.UI.Repeater.onitemremoved" helpKeyword="WinJS.UI.Repeater.onitemremoved">
-                /// Raised after an item has been removed from one index to another in the Repeater control's data source and after the corresponding DOM element has been removed.
-                /// </field>
-                onitemremoved: createEvent(ITEMREMOVED),
-
-                /// <field type="Function" locid="WinJS.UI.Repeater.onitemsreloading" helpKeyword="WinJS.UI.Repeater.onitemsreloading">
-                /// The list has been refreshed and any references to data in the list may be incorrect.
-                /// Raised after the Repeater control's underlying data has been updated but before the updated HTML has been reloaded.
-                /// </field>
-                onitemsreloading: createEvent(ITEMSRELOADING),
-
-                /// <field type="Function" locid="WinJS.UI.Repeater.onitemsreloaded" helpKeyword="WinJS.UI.Repeater.onitemsreloaded">
-                /// Raised after the Repeater control's underlying data has been updated and after the updated HTML has been reloaded.
-                /// </field>
-                onitemsreloaded: createEvent(ITEMSRELOADED),
-
-                _extractInlineTemplate: function Repeater_extractInlineTemplate() {
-                    // Creates and returns a WinJS.BindingTemplate from the Repeater innerHTML.
-                    if (this._element.firstElementChild) {
-                        var templateElement = _Global.document.createElement(this._element.tagName);
-                        while (this._element.firstElementChild) {
-                            // Move each child element from the Repeater to the Template Element
-                            templateElement.appendChild(this._element.firstElementChild);
-                        }
-                        return new BindingTemplate.Template(templateElement, { extractChild: true });
-                    }
-                },
-
-                _renderAllItems: function Repeater_renderAllItems() {
-                    var fragment = _Global.document.createDocumentFragment();
-                    for (var i = 0, len = this._data.length; i < len; i++) {
-                        var renderedItem = this._render(this._data.getAt(i));
-                        if (!renderedItem) {
-                            throw new _ErrorFromName("WinJS.UI.Repeater.AsynchronousRender", strings.asynchronousRender);
-
-                        }
-                        fragment.appendChild(renderedItem);
-                        this._repeatedDOM.push(renderedItem);
-                    }
-                    this._element.appendChild(fragment);
-                },
-
-                _reloadRepeater: function Repeater_reloadRepeater(shouldDisposeElements) {
-                    this._unloadRepeatedDOM(shouldDisposeElements);
-                    this._repeatedDOM = [];
-                    this._renderAllItems();
-                },
-
-                _unloadRepeatedDOM: function Repeater_unloadRepeatedDOM(shouldDisposeElements) {
-                    for (var i = 0, len = this._repeatedDOM.length; i < len; i++) {
-                        var element = this._repeatedDOM[i];
-                        if (!!shouldDisposeElements) {
-                            // this_dataReloadHandler uses this to defer disposal until after animations have completed,
-                            // at which point it manually disposes each element.
-                            _Dispose._disposeElement(element);
-                        }
-                        if (element.parentElement === this._element) {
-                            this._element.removeChild(element);
-                        }
-                    }
-                },
-
-                _addDataListeners: function Repeater_addDataListeners() {
-                    Object.keys(this._dataListeners).forEach(function (eventName) {
-                        this._data.addEventListener(eventName, this._dataListeners[eventName], false);
-                    }.bind(this));
-                },
-
-                _beginModification: function Repeater_beginModification() {
-                    if (this._modifying) {
-                        throw new _ErrorFromName("WinJS.UI.Repeater.RepeaterModificationReentrancy", strings.repeaterReentrancy);
-                    }
-                    this._modifying = true;
-                },
-
-                _endModification: function Repeater_endModification() {
-                    this._modifying = false;
-                },
-
-                _removeDataListeners: function Repeater_removeDataListeners() {
-                    Object.keys(this._dataListeners).forEach(function (eventName) {
-                        this._data.removeEventListener(eventName, this._dataListeners[eventName], false);
-                    }.bind(this));
-                },
-
-                _dataItemChangedHandler: function Repeater_dataItemChangedHandler(eventInfo) {
-                    // Handles the 'itemchanged' event fired by WinJS.Binding.List
-
-                    this._beginModification();
-                    var animationPromise;
-
-                    var root = this._element;
-                    var index = eventInfo.detail.index;
-                    var renderedItem = this._render(eventInfo.detail.newValue);
-                    if (!renderedItem) {
-                        throw new _ErrorFromName("WinJS.UI.Repeater.AsynchronousRender", strings.asynchronousRender);
-                    }
-
-                    // Append to the event object
-                    if (this._repeatedDOM[index]) {
-                        eventInfo.detail.oldElement = this._repeatedDOM[index];
-                    }
-                    eventInfo.detail.newElement = renderedItem;
-                    eventInfo.detail.setPromise = function setPromise(delayPromise) {
-                        animationPromise = delayPromise;
-                    };
-
-                    this._writeProfilerMark(ITEMCHANGING + ",info");
-                    this.dispatchEvent(ITEMCHANGING, eventInfo.detail);
-
-                    // Make the change
-                    var oldItem = null;
-                    if (index < this._repeatedDOM.length) {
-                        oldItem = this._repeatedDOM[index];
-                        root.replaceChild(renderedItem, oldItem);
-                        this._repeatedDOM[index] = renderedItem;
-                    } else {
-                        root.appendChild(renderedItem);
-                        this._repeatedDOM.push(renderedItem);
-                    }
-
-                    this._endModification();
-                    this._writeProfilerMark(ITEMCHANGED + ",info");
-                    this.dispatchEvent(ITEMCHANGED, eventInfo.detail);
-
-                    if (oldItem) { // Give the option to delay element disposal.
-                        Promise.as(animationPromise).done(function () {
-                            _Dispose._disposeElement(oldItem);
-                        }.bind(this));
-                    }
-                },
-
-                _dataItemInsertedHandler: function Repeater_dataItemInsertedHandler(eventInfo) {
-                    // Handles the 'iteminserted' event fired by WinJS.Binding.List
-
-                    this._beginModification();
-                    var index = eventInfo.detail.index;
-                    var renderedItem = this._render(eventInfo.detail.value);
-                    if (!renderedItem) {
-                        throw new _ErrorFromName("WinJS.UI.Repeater.AsynchronousRender", strings.asynchronousRender);
-                    }
-
-                    var root = this._element;
-
-                    eventInfo.detail.affectedElement = renderedItem;
-                    this._writeProfilerMark(ITEMINSERTING + ",info");
-                    this.dispatchEvent(ITEMINSERTING, eventInfo.detail);
-
-                    if (index < this._repeatedDOM.length) {
-                        var nextSibling = this._repeatedDOM[index];
-                        root.insertBefore(renderedItem, nextSibling);
-                    } else {
-                        root.appendChild(renderedItem);
-                    }
-
-                    // Update collection of rendered elements
-                    this._repeatedDOM.splice(index, 0, renderedItem);
-
-                    this._endModification();
-                    this._writeProfilerMark(ITEMINSERTED + ",info");
-                    this.dispatchEvent(ITEMINSERTED, eventInfo.detail);
-
-                },
-
-                _dataItemMovedHandler: function Repeater_dataItemMovedHandler(eventInfo) {
-                    // Handles the 'itemmoved' event fired by WinJS.Binding.List
-
-                    this._beginModification();
-
-                    var movingItem = this._repeatedDOM[eventInfo.detail.oldIndex];
-
-                    // Fire the event before we start the move.
-                    eventInfo.detail.affectedElement = movingItem;
-                    this._writeProfilerMark(ITEMMOVING + ",info");
-                    this.dispatchEvent(ITEMMOVING, eventInfo.detail);
-
-                    // Remove
-                    this._repeatedDOM.splice(eventInfo.detail.oldIndex, 1)[0];
-                    movingItem.parentNode.removeChild(movingItem);
-
-                    // Insert
-                    if (eventInfo.detail.newIndex < (this._data.length) - 1) {
-                        var nextSibling = this._repeatedDOM[eventInfo.detail.newIndex];
-                        this._element.insertBefore(movingItem, nextSibling);
-                        this._repeatedDOM.splice(eventInfo.detail.newIndex, 0, movingItem);
-                    } else {
-                        this._repeatedDOM.push(movingItem);
-                        this._element.appendChild(movingItem);
-                    }
-
-                    this._endModification();
-                    this._writeProfilerMark(ITEMMOVED + ",info");
-                    this.dispatchEvent(ITEMMOVED, eventInfo.detail);
-                },
-
-                _dataItemRemovedHandler: function Repeater_dataItemRemoveHandler(eventInfo) {
-                    // Handles the 'itemremoved' event fired by WinJS.Binding.List
-
-                    this._beginModification();
-                    var animationPromise;
-                    var oldItem = this._repeatedDOM[eventInfo.detail.index];
-
-                    // Trim 'value' and 'key' from the eventInfo.details that Binding.List gave for the removal case,
-                    // since both of those properties already exist inside of eventInfo.details.item.
-                    var eventDetail = { affectedElement: oldItem, index: eventInfo.detail.index, item: eventInfo.detail.item };
-                    eventDetail.setPromise = function setPromise(delayPromise) {
-                        animationPromise = delayPromise;
-                    };
-
-                    this._writeProfilerMark(ITEMREMOVING + ",info");
-                    this.dispatchEvent(ITEMREMOVING, eventDetail);
-
-                    oldItem.parentNode.removeChild(oldItem);
-                    this._repeatedDOM.splice(eventInfo.detail.index, 1);
-
-                    this._endModification();
-                    this._writeProfilerMark(ITEMREMOVED + ",info");
-                    this.dispatchEvent(ITEMREMOVED, eventDetail);
-
-                    Promise.as(animationPromise).done(function () {
-                        _Dispose._disposeElement(oldItem);
-                    }.bind(this));
-                },
-
-                _dataReloadHandler: function Repeater_dataReloadHandler() {
-                    // Handles the 'reload' event fired by WinJS.Binding.List whenever it performs operations such as reverse() or sort()
-
-                    this._beginModification();
-                    var animationPromise;
-
-                    var shallowCopyBefore = this._repeatedDOM.slice(0);
-                    var eventDetail = { affectedElements: shallowCopyBefore };
-                    eventDetail.setPromise = function (delayPromise) {
-                        animationPromise = delayPromise;
-                    };
-
-                    this._writeProfilerMark(ITEMSRELOADING + ",info");
-                    this.dispatchEvent(ITEMSRELOADING, eventDetail);
-                    this._reloadRepeater(false /*shouldDisposeElements */);
-
-                    var shallowCopyAfter = this._repeatedDOM.slice(0);
-                    this._endModification();
-                    this._writeProfilerMark(ITEMSRELOADED + ",info");
-                    this.dispatchEvent(ITEMSRELOADED, { affectedElements: shallowCopyAfter });
-
-                    Promise.as(animationPromise).done(function () { // Gives the option to defer disposal.
-                        for (var i = 0, len = shallowCopyBefore.length; i < len; i++) {
-                            _Dispose._disposeElement(shallowCopyBefore[i]);
-                        }
-                    }.bind(this));
-                },
-
-                _writeProfilerMark: function Repeater_writeProfilerMark(text) {
-                    _WriteProfilerMark("WinJS.UI.Repeater:" + this._id + ":" + text);
-                }
-            }, {
-                isDeclarativeControlContainer: true,
-            });
-            _Base.Class.mix(Repeater, _Control.DOMEventMixin);
-            return Repeater;
-        })
-    });
-
-});
-
-
-define('require-style!less/styles-datetimepicker',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/DatePicker',[
-    '../Core/_Global',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_Events',
-    '../Core/_Resources',
-    '../Utilities/_Control',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    '../Utilities/_Select',
-    'require-style!less/styles-datetimepicker'
-    ], function datePickerInit(_Global, _WinRT, _Base, _BaseUtils, _Events, _Resources, _Control, _ElementUtilities, _Hoverable, _Select) {
-    "use strict";
-
-    _Base.Namespace.define("WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.DatePicker">Allows users to pick a date value.</summary>
-        /// <compatibleWith platform="Windows" minVersion="8.0"/>
-        /// </field>
-        /// <name locid="WinJS.UI.DatePicker_name">Date Picker</name>
-        /// <icon src="ui_winjs.ui.datepicker.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.datepicker.16x16.png" width="16" height="16" />
-        /// <htmlSnippet><![CDATA[<div data-win-control="WinJS.UI.DatePicker"></div>]]></htmlSnippet>
-        /// <event name="change" locid="WinJS.UI.DatePicker_e:change">Occurs when the current date changes.</event>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        DatePicker: _Base.Namespace._lazy(function () {
-            // Constants definition
-            var DEFAULT_DAY_PATTERN = 'day',
-                DEFAULT_MONTH_PATTERN = '{month.full}',
-                DEFAULT_YEAR_PATTERN = 'year.full';
-
-            var strings = {
-                get ariaLabel() { return _Resources._getWinJSString("ui/datePicker").value; },
-                get selectDay() { return _Resources._getWinJSString("ui/selectDay").value; },
-                get selectMonth() { return _Resources._getWinJSString("ui/selectMonth").value; },
-                get selectYear() { return _Resources._getWinJSString("ui/selectYear").value; },
-            };
-
-            var yearFormatCache = {};
-
-            function newFormatter(pattern, calendar, defaultPattern) {
-                var dtf = _WinRT.Windows.Globalization.DateTimeFormatting;
-                pattern = !pattern ? defaultPattern : pattern;
-                var c = new dtf.DateTimeFormatter(pattern);
-                if (calendar) {
-                    return new dtf.DateTimeFormatter(pattern, c.languages, c.geographicRegion, calendar, c.clock);
-                }
-                return c;
-            }
-
-            function formatCacheLookup(pattern, calendar, defaultPattern) {
-                var pat = yearFormatCache[pattern];
-                if (!pat) {
-                    pat = yearFormatCache[pattern] = {};
-                }
-                var cal = pat[calendar];
-                if (!cal) {
-                    cal = pat[calendar] = {};
-                }
-                var def = cal[defaultPattern];
-                if (!def) {
-                    def = cal[defaultPattern] = {};
-                    def.formatter = newFormatter(pattern, calendar, defaultPattern);
-                    def.years = {};
-                }
-                return def;
-            }
-
-            function formatYear(pattern, calendar, defaultPattern, datePatterns, order, cal) {
-                var cache = formatCacheLookup(pattern, calendar, defaultPattern);
-                var y = cache.years[cal.year + "-" + cal.era];
-                if (!y) {
-                    y = cache.formatter.format(cal.getDateTime());
-                    cache.years[cal.year + "-" + cal.era] = y;
-                }
-                return y;
-            }
-
-            function formatMonth(pattern, calendar, defaultPattern, cal) {
-                var cache = formatCacheLookup(pattern, calendar, defaultPattern);
-                // can't cache actual month names because the hebrew calendar varies
-                // the month name depending on religious holidays and leap months.
-                //
-                return cache.formatter.format(cal.getDateTime());
-            }
-
-            function formatDay(pattern, calendar, defaultPattern, cal) {
-                var cache = formatCacheLookup(pattern, calendar, defaultPattern);
-                // can't cache actual day names because the format may include the day of the week,
-                // which, of course, varies from month to month.
-                //
-                return cache.formatter.format(cal.getDateTime());
-            }
-
-            function newCal(calendar) {
-                var glob = _WinRT.Windows.Globalization;
-                var c = new glob.Calendar();
-                if (calendar) {
-                    return new glob.Calendar(c.languages, calendar, c.getClock());
-                }
-                return c;
-            }
-
-            function yearDiff(start, end) {
-                var yearCount = 0;
-
-                if (start.era === end.era) {
-                    yearCount = end.year - start.year;
-                } else {
-                    while (start.era !== end.era || start.year !== end.year) {
-                        yearCount++;
-                        start.addYears(1);
-                    }
-                }
-                return yearCount;
-            }
-
-            var DatePicker = _Base.Class.define(function DatePicker_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.DatePicker.DatePicker">
-                /// <summary locid="WinJS.UI.DatePicker.constructor">Creates a new DatePicker control.</summary>
-                /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.UI.DatePicker.constructor_p:element">
-                /// The DOM element that will host the DatePicker control.
-                /// </param>
-                /// <param name="options" type="Object" locid="WinJS.UI.DatePicker.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control. Each property of the options object corresponds
-                /// to one of the control's properties or events.
-                /// </param>
-                /// <returns type="WinJS.UI.DatePicker" locid="WinJS.UI.DatePicker.constructor_returnValue">A constructed DatePicker control.</returns>
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </signature>
-
-                // Default to current date
-                this._currentDate = new Date();
-
-                // Default to +/- 100 years
-                this._minYear = this._currentDate.getFullYear() - 100;
-                this._maxYear = this._currentDate.getFullYear() + 100;
-                this._datePatterns = {
-                    date: null,
-                    month: null,
-                    year: null
-                };
-
-                element = element || _Global.document.createElement("div");
-                _ElementUtilities.addClass(element, "win-disposable");
-                element.winControl = this;
-
-                var label = element.getAttribute("aria-label");
-                if (!label) {
-                    element.setAttribute("aria-label", strings.ariaLabel);
-                }
-
-                // Options should be set after the element is initialized which is
-                // the same order of operation as imperatively setting options.
-                this._init(element);
-                _Control.setOptions(this, options);
-            }, {
-                _information: null,
-                _currentDate: null,
-                _calendar: null,
-                _disabled: false,
-                _dateElement: null,
-                _dateControl: null,
-                _monthElement: null,
-                _monthControl: null,
-                _minYear: null,
-                _maxYear: null,
-                _yearElement: null,
-                _yearControl: null,
-                _datePatterns: {
-                    date: null,
-                    month: null,
-                    year: null
-                },
-
-                _addAccessibilityAttributes: function () {
-                    //see http://www.w3.org/TR/wai-aria/rdf_model.png for details
-                    this._domElement.setAttribute("role", "group");
-
-                    this._dateElement.setAttribute("aria-label", strings.selectDay);
-                    this._monthElement.setAttribute("aria-label", strings.selectMonth);
-                    this._yearElement.setAttribute("aria-label", strings.selectYear);
-                },
-
-                _addControlsInOrder: function () {
-                    var e = this._domElement;
-                    var that = this;
-                    var orderIndex = 0; // don't use forEach's index, because "era" is in the list
-                    that._information.order.forEach(function (s) {
-                        switch (s) {
-                            case "month":
-                                e.appendChild(that._monthElement);
-                                _ElementUtilities.addClass(that._monthElement, "win-order" + (orderIndex++));
-                                break;
-                            case "date":
-                                e.appendChild(that._dateElement);
-                                _ElementUtilities.addClass(that._dateElement, "win-order" + (orderIndex++));
-                                break;
-                            case "year":
-                                e.appendChild(that._yearElement);
-                                _ElementUtilities.addClass(that._yearElement, "win-order" + (orderIndex++));
-                                break;
-                        }
-                    });
-                },
-
-                _createControlElements: function () {
-                    this._monthElement = _Global.document.createElement("select");
-                    this._monthElement.className = "win-datepicker-month win-dropdown";
-                    this._dateElement = _Global.document.createElement("select");
-                    this._dateElement.className = "win-datepicker-date win-dropdown";
-                    this._yearElement = _Global.document.createElement("select");
-                    this._yearElement.className = "win-datepicker-year win-dropdown";
-                },
-
-                _createControls: function () {
-                    var info = this._information;
-                    var index = info.getIndex(this.current);
-
-                    if (info.forceLanguage) {
-                        this._domElement.setAttribute("lang", info.forceLanguage);
-                        this._domElement.setAttribute("dir", info.isRTL ? "rtl" : "ltr");
-                    }
-
-
-                    this._yearControl = new _Select._Select(this._yearElement, {
-                        dataSource: this._information.years,
-                        disabled: this.disabled,
-                        index: index.year
-                    });
-
-                    this._monthControl = new _Select._Select(this._monthElement, {
-                        dataSource: this._information.months(index.year),
-                        disabled: this.disabled,
-                        index: index.month
-                    });
-
-                    this._dateControl = new _Select._Select(this._dateElement, {
-                        dataSource: this._information.dates(index.year, index.month),
-                        disabled: this.disabled,
-                        index: index.date
-                    });
-
-                    this._wireupEvents();
-                },
-                dispose: function () {
-                    /// <signature helpKeyword="WinJS.UI.DatePicker.dispose">
-                    /// <summary locid="WinJS.UI.DatePicker.dispose">
-                    /// Disposes this control.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                },
-
-                /// <field type="String" locid="WinJS.UI.DatePicker.calendar" helpKeyword="WinJS.UI.DatePicker.calendar">
-                /// Gets or sets the calendar to use.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                calendar: {
-                    get: function () {
-                        return this._calendar;
-                    },
-                    set: function (value) {
-                        this._calendar = value;
-                        this._setElement(this._domElement);
-                    }
-                },
-
-                /// <field type="Date" locid="WinJS.UI.DatePicker.current" helpKeyword="WinJS.UI.DatePicker.current">
-                /// Gets or sets the current date of the DatePicker.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                current: {
-                    get: function () {
-                        var d = this._currentDate;
-                        var y = d.getFullYear();
-                        return new Date(Math.max(Math.min(this.maxYear, y), this.minYear), d.getMonth(), d.getDate(), 12, 0, 0, 0);
-                    },
-                    set: function (value) {
-                        var newDate;
-                        if (typeof (value) === "string") {
-                            newDate = new Date(Date.parse(value));
-                            newDate.setHours(12, 0, 0, 0);
-                        } else {
-                            newDate = value;
-                        }
-                        if (newDate) {
-                            var oldDate = this._currentDate;
-                            if (oldDate !== newDate) {
-                                this._currentDate = newDate;
-                                this._updateDisplay();
-                            }
-                        }
-                        
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.DatePicker.disabled" helpKeyword="WinJS.UI.DatePicker.disabled">
-                /// Gets or sets a value that specifies whether the DatePicker is disabled. A value of true indicates that the DatePicker is disabled.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                disabled: {
-                    get: function () { return this._disabled; },
-                    set: function (value) {
-                        if (this._disabled !== value) {
-                            this._disabled = value;
-                            // all controls get populated at the same time, so any check is OK
-                            //
-                            if (this._yearControl) {
-                                this._monthControl.setDisabled(value);
-                                this._dateControl.setDisabled(value);
-                                this._yearControl.setDisabled(value);
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.DatePicker.datePattern" helpKeyword="WinJS.UI.DatePicker.datePattern">
-                /// Gets or sets the display pattern for the date.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                datePattern: {
-                    get: function () { return this._datePatterns.date; },
-                    set: function (value) {
-                        if (this._datePatterns.date !== value) {
-                            this._datePatterns.date = value;
-                            this._init();
-                        }
-                    }
-                },
-
-
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.DatePicker.element" helpKeyword="WinJS.UI.DatePicker.element">
-                /// Gets the DOM element for the DatePicker.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                element: {
-                    get: function () { return this._domElement; }
-                },
-
-                _setElement: function (element) {
-                    this._domElement = this._domElement || element;
-                    if (!this._domElement) { return; }
-
-                    _ElementUtilities.empty(this._domElement);
-                    _ElementUtilities.addClass(this._domElement, "win-datepicker");
-
-                    this._updateInformation();
-
-                    this._createControlElements();
-                    this._addControlsInOrder();
-                    this._createControls();
-                    this._addAccessibilityAttributes();
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.DatePicker.minYear" helpKeyword="WinJS.UI.DatePicker.minYear">
-                /// Gets or sets the minimum Gregorian year available for picking.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                minYear: {
-                    get: function () {
-                        return this._information.getDate({ year: 0, month: 0, date: 0 }).getFullYear();
-                    },
-                    set: function (value) {
-                        if (this._minYear !== value) {
-                            this._minYear = value;
-                            if (value > this._maxYear) {
-                                this._maxYear = value;
-                            }
-                            this._updateInformation();
-                            if (this._yearControl) {
-                                this._yearControl.dataSource = this._information.years;
-                            }
-
-                            this._updateDisplay();
-                        }
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.DatePicker.maxYear" helpKeyword="WinJS.UI.DatePicker.maxYear">
-                /// Gets or sets the maximum Gregorian year available for picking.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                maxYear: {
-                    get: function () {
-                        var index = {
-                            year: this._information.years.getLength() - 1
-                        };
-                        index.month = this._information.months(index.year).getLength() - 1;
-                        index.date = this._information.dates(index.year, index.month).getLength() - 1;
-                        return this._information.getDate(index).getFullYear();
-                    },
-                    set: function (value) {
-                        if (this._maxYear !== value) {
-                            this._maxYear = value;
-                            if (value < this._minYear) {
-                                this._minYear = value;
-                            }
-                            this._updateInformation();
-                            if (this._yearControl) {
-                                this._yearControl.dataSource = this._information.years;
-                            }
-
-                            this._updateDisplay();
-                        }
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.DatePicker.monthPattern" helpKeyword="WinJS.UI.DatePicker.monthPattern">
-                /// Gets or sets the display pattern for the month.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                monthPattern: {
-                    get: function () { return this._datePatterns.month; },
-                    set: function (value) {
-                        if (this._datePatterns.month !== value) {
-                            this._datePatterns.month = value;
-                            this._init();
-                        }
-                    }
-                },
-
-                _updateInformation: function () {
-                    // since "year" in the date ctor can be two digit (85 == 1985), we need
-                    // to force "full year" to capture dates < 100 a.d.
-                    //
-                    var min = new Date(this._minYear, 0, 1, 12, 0, 0);
-                    var max = new Date(this._maxYear, 11, 31, 12, 0, 0);
-                    min.setFullYear(this._minYear);
-                    max.setFullYear(this._maxYear);
-
-                    this._information = DatePicker.getInformation(min, max, this._calendar, this._datePatterns);
-                },
-
-                _init: function (element) {
-                    this._setElement(element);
-                },
-
-                _updateDisplay: function () {
-                    if (!this._domElement) {
-                        return;
-                    }
-
-                    // all controls get populated at the same time, so any check is OK
-                    //
-                    if (this._yearControl) {
-                        //Render display index based on constraints (minYear and maxYear constraints)
-                        //Will not modify current date
-                        var index = this._information.getIndex(this.current);
-
-                        this._yearControl.index = index.year;
-                        this._monthControl.dataSource = this._information.months(index.year);
-                        this._monthControl.index = index.month;
-                        this._dateControl.dataSource = this._information.dates(index.year, index.month);
-                        this._dateControl.index = index.date;
-                    }
-                },
-
-                _wireupEvents: function () {
-                    var that = this;
-                    function changed() {
-                        that._currentDate = that._information.getDate({ year: that._yearControl.index, month: that._monthControl.index, date: that._dateControl.index }, that._currentDate);
-                        var index = that._information.getIndex(that._currentDate);
-
-                        // Changing the month (or year, if the current date is 2/29) changes the day range, and could have made the day selection invalid
-                        that._monthControl.dataSource = that._information.months(index.year);
-                        that._monthControl.index = index.month;
-                        that._dateControl.dataSource = that._information.dates(index.year, index.month);
-                        that._dateControl.index = index.date;
-                    }
-
-                    this._dateElement.addEventListener("change", changed, false);
-                    this._monthElement.addEventListener("change", changed, false);
-                    this._yearElement.addEventListener("change", changed, false);
-                },
-
-                /// <field type="String" locid="WinJS.UI.DatePicker.yearPattern" helpKeyword="WinJS.UI.DatePicker.yearPattern">
-                /// Gets or sets the display pattern for year.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                yearPattern: {
-                    get: function () { return this._datePatterns.year; },
-                    set: function (value) {
-                        if (this._datePatterns.year !== value) {
-                            this._datePatterns.year = value;
-                            this._init();
-                        }
-                    }
-                },
-            }, {
-                _getInformationWinRT: function (startDate, endDate, calendar, datePatterns) {
-                    datePatterns = datePatterns || { date: DEFAULT_DAY_PATTERN, month: DEFAULT_MONTH_PATTERN, year: DEFAULT_YEAR_PATTERN };
-
-                    var tempCal = newCal(calendar);
-                    var monthCal = newCal(calendar);
-                    var dayCal = newCal(calendar);
-
-                    tempCal.setToMin();
-                    var minDateTime = tempCal.getDateTime();
-                    tempCal.setToMax();
-                    var maxDateTime = tempCal.getDateTime();
-
-                    function clamp(date) {
-                        return new Date(Math.min(new Date(Math.max(minDateTime, date)), maxDateTime));
-                    }
-
-                    tempCal.hour = 12;
-
-                    startDate = clamp(startDate);
-                    endDate = clamp(endDate);
-
-                    tempCal.setDateTime(endDate);
-                    var end = { year: tempCal.year, era: tempCal.era };
-
-                    tempCal.setDateTime(startDate);
-                    var yearLen = 0;
-
-                    yearLen = yearDiff(tempCal, end) + 1;
-
-                    // Explicity use a template that's equivalent to a longdate template
-                    // as longdate/shortdate can be overriden by the user
-                    var dateformat = formatCacheLookup("day month.full year", calendar).formatter;
-                    var localdatepattern = dateformat.patterns[0];
-                    var isRTL = localdatepattern.charCodeAt(0) === 8207;
-                    var order = ["date", "month", "year"];
-
-                    var indexes = {
-                        month: localdatepattern.indexOf("{month"),
-                        date: localdatepattern.indexOf("{day"),
-                        year: localdatepattern.indexOf("{year")
-                    };
-                    order.sort(function (a, b) {
-                        if (indexes[a] < indexes[b]) {
-                            return -1;
-                        } else if (indexes[a] > indexes[b]) {
-                            return 1;
-                        } else {
-                            return 0;
-                        }
-                    });
-
-                    var yearSource = (function () {
-                        return {
-                            getLength: function () { return yearLen; },
-                            getValue: function (index) {
-                                tempCal.setDateTime(startDate);
-                                tempCal.addYears(index);
-
-                                return formatYear(datePatterns.year, calendar, DEFAULT_YEAR_PATTERN, datePatterns, order, tempCal);
-                            }
-                        };
-                    })();
-
-                    var monthSource = function (yearIndex) {
-                        monthCal.setDateTime(startDate);
-                        monthCal.addYears(yearIndex);
-
-                        return {
-                            getLength: function () { return monthCal.numberOfMonthsInThisYear; },
-                            getValue: function (index) {
-                                monthCal.month = monthCal.firstMonthInThisYear;
-                                monthCal.addMonths(index);
-                                return formatMonth(datePatterns.month, calendar, DEFAULT_MONTH_PATTERN, monthCal);
-                            }
-                        };
-                    };
-
-                    var dateSource = function (yearIndex, monthIndex) {
-                        dayCal.setDateTime(startDate);
-                        dayCal.addYears(yearIndex);
-                        dayCal.month = dayCal.firstMonthInThisYear;
-                        dayCal.addMonths(monthIndex);
-                        dayCal.day = dayCal.firstDayInThisMonth;
-
-                        return {
-                            getLength: function () { return dayCal.numberOfDaysInThisMonth; },
-                            getValue: function (index) {
-                                dayCal.day = dayCal.firstDayInThisMonth;
-                                dayCal.addDays(index);
-                                return formatDay(datePatterns.date, calendar, DEFAULT_DAY_PATTERN, dayCal);
-                            }
-                        };
-                    };
-
-                    return {
-                        isRTL: isRTL,
-                        forceLanguage: dateformat.resolvedLanguage,
-
-                        order: order,
-
-                        getDate: function (index, lastDate) {
-                            var lastCal;
-
-                            if (lastDate) {
-                                tempCal.setDateTime(lastDate);
-                                lastCal = { year: tempCal.year, month: tempCal.month, day: tempCal.day };
-                            }
-
-                            var c = tempCal;
-                            c.setDateTime(startDate);
-                            c.addYears(index.year);
-
-                            var guessMonth;
-                            if (c.firstMonthInThisYear > c.lastMonthInThisYear) {
-                                if (index.month + c.firstMonthInThisYear > c.numberOfMonthsInThisYear) {
-                                    guessMonth = index.month + c.firstMonthInThisYear - c.numberOfMonthsInThisYear;
-                                } else {
-                                    guessMonth = index.month + c.firstMonthInThisYear;
-                                }
-                                if (lastCal && lastCal.year !== c.year) {
-                                    // Year has changed in some transitions in Thai Calendar, this will change the first month, and last month indices of the year.
-                                    guessMonth = Math.max(Math.min(lastCal.month, c.numberOfMonthsInThisYear), 1);
-                                }
-                            } else {
-                                if (lastCal && lastCal.year !== c.year) {
-                                    // Year has changed in some transitions in Thai Calendar, this will change the first month, and last month indices of the year.
-                                    guessMonth = Math.max(Math.min(lastCal.month, c.firstMonthInThisYear + c.numberOfMonthsInThisYear - 1), c.firstMonthInThisYear);
-                                } else {
-                                    guessMonth = Math.max(Math.min(index.month + c.firstMonthInThisYear, c.firstMonthInThisYear + c.numberOfMonthsInThisYear - 1), c.firstMonthInThisYear);
-                                }
-                            }
-                            c.month = guessMonth;
-
-                            var guessDay = Math.max(Math.min(index.date + c.firstDayInThisMonth, c.firstDayInThisMonth + c.numberOfDaysInThisMonth - 1), c.firstDayInThisMonth);
-                            if (lastCal && (lastCal.year !== c.year || lastCal.month !== c.month)) {
-                                guessDay = Math.max(Math.min(lastCal.day, c.firstDayInThisMonth + c.numberOfDaysInThisMonth - 1), c.firstDayInThisMonth);
-                            }
-                            c.day = c.firstDayInThisMonth;
-                            c.addDays(guessDay - c.firstDayInThisMonth);
-                            return c.getDateTime();
-                        },
-                        getIndex: function (date) {
-                            var curDate = clamp(date);
-                            tempCal.setDateTime(curDate);
-                            var cur = { year: tempCal.year, era: tempCal.era };
-
-                            var yearIndex = 0;
-
-                            tempCal.setDateTime(startDate);
-                            tempCal.month = 1;
-                            yearIndex = yearDiff(tempCal, cur);
-
-                            tempCal.setDateTime(curDate);
-                            var monthIndex = tempCal.month - tempCal.firstMonthInThisYear;
-                            if (monthIndex < 0) {
-                                // A special case is in some ThaiCalendar years first month
-                                // of the year is April, last month is March and month flow is wrap-around
-                                // style; April, March .... November, December, January, February, March. So the first index
-                                // will be 4 and last index will be 3. We are handling the case to convert this wraparound behavior
-                                // into selected index.
-                                monthIndex = tempCal.month - tempCal.firstMonthInThisYear + tempCal.numberOfMonthsInThisYear;
-                            }
-                            var dateIndex = tempCal.day - tempCal.firstDayInThisMonth;
-
-                            var index = {
-                                year: yearIndex,
-                                month: monthIndex,
-                                date: dateIndex
-                            };
-
-                            return index;
-                        },
-                        years: yearSource,
-                        months: monthSource,
-                        dates: dateSource
-                    };
-
-                },
-
-                _getInformationJS: function (startDate, endDate) {
-                    var minYear = startDate.getFullYear();
-                    var maxYear = endDate.getFullYear();
-                    var yearSource = {
-                        getLength: function () { return Math.max(0, maxYear - minYear + 1); },
-                        getValue: function (index) { return minYear + index; }
-                    };
-
-                    var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
-                    var monthSource = function () {
-                        return {
-                            getLength: function () { return months.length; },
-                            getValue: function (index) { return months[index]; },
-                            getMonthNumber: function (index) { return Math.min(index, months.length - 1); }
-                        };
-                    };
-
-                    var dateSource = function (yearIndex, monthIndex) {
-                        var temp = new Date();
-                        var year = yearSource.getValue(yearIndex);
-                        // The +1 is needed to make using a day of 0 work correctly
-                        var month = monthIndex + 1; // index is always correct, unlike getMonth which changes when the date is invalid
-                        temp.setFullYear(year, month, 0);
-
-                        var maxValue = temp.getDate();
-
-                        return {
-                            getLength: function () { return maxValue; },
-                            getValue: function (index) { return "" + (index + 1); },
-                            getDateNumber: function (index) { return Math.min(index + 1, maxValue); }
-                        };
-                    };
-
-                    return {
-                        order: ["month", "date", "year"],
-
-                        getDate: function (index) {
-                            return new Date(
-                                yearSource.getValue(index.year),
-                                monthSource(index.year).getMonthNumber(index.month),
-                                dateSource(index.year, index.month).getDateNumber(index.date),
-                                12, 0
-                            );
-                        },
-                        getIndex: function (date) {
-                            var yearIndex = 0;
-                            var year = date.getFullYear();
-                            if (year < minYear) {
-                                yearIndex = 0;
-                            } else if (year > this.maxYear) {
-                                yearIndex = yearSource.getLength() - 1;
-                            } else {
-                                yearIndex = date.getFullYear() - minYear;
-                            }
-
-                            var monthIndex = Math.min(date.getMonth(), monthSource(yearIndex).getLength());
-
-                            var dateIndex = Math.min(date.getDate() - 1, dateSource(yearIndex, monthIndex).getLength());
-
-                            return {
-                                year: yearIndex,
-                                month: monthIndex,
-                                date: dateIndex
-                            };
-                        },
-                        years: yearSource,
-                        months: monthSource,
-                        dates: dateSource
-                    };
-                }
-            });
-            if (_WinRT.Windows.Globalization.Calendar && _WinRT.Windows.Globalization.DateTimeFormatting) {
-                DatePicker.getInformation = DatePicker._getInformationWinRT;
-            } else {
-                DatePicker.getInformation = DatePicker._getInformationJS;
-            }
-            _Base.Class.mix(DatePicker, _Events.createEventProperties("change"));
-            _Base.Class.mix(DatePicker, _Control.DOMEventMixin);
-            return DatePicker;
-        })
-    });
-
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-
-define('WinJS/Controls/TimePicker',[
-    '../Core/_Global',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_Events',
-    '../Core/_Resources',
-    '../Utilities/_Control',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    '../Utilities/_Select',
-    'require-style!less/styles-datetimepicker'
-    ], function timePickerInit(_Global, _WinRT, _Base, _BaseUtils, _Events, _Resources, _Control, _ElementUtilities, _Hoverable, _Select) {
-    "use strict";
-
-    _Base.Namespace.define("WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.TimePicker">Allows users to select time values.</summary>
-        /// <compatibleWith platform="Windows" minVersion="8.0"/>
-        /// </field>
-        /// <name locid="WinJS.UI.TimePicker_name">Time Picker</name>
-        /// <icon src="ui_winjs.ui.timepicker.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.timepicker.16x16.png" width="16" height="16" />
-        /// <htmlSnippet><![CDATA[<div data-win-control="WinJS.UI.TimePicker"></div>]]></htmlSnippet>
-        /// <event name="change" locid="WinJS.UI.TimePicker_e:change">Occurs when the time changes.</event>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        TimePicker: _Base.Namespace._lazy(function () {
-            // Constants definition
-            var DEFAULT_MINUTE_PATTERN = "{minute.integer(2)}",
-                DEFAULT_HOUR_PATTERN = "{hour.integer(1)}",
-                DEFAULT_PERIOD_PATTERN = "{period.abbreviated(2)}";
-
-            var strings = {
-                get ariaLabel() { return _Resources._getWinJSString("ui/timePicker").value; },
-                get selectHour() { return _Resources._getWinJSString("ui/selectHour").value; },
-                get selectMinute() { return _Resources._getWinJSString("ui/selectMinute").value; },
-                get selectAMPM() { return _Resources._getWinJSString("ui/selectAMPM").value; },
-            };
-
-            // date1 and date2 must be Date objects with their date portions set to the
-            // sentinel date.
-            var areTimesEqual = function (date1, date2) {
-                return date1.getHours() === date2.getHours() &&
-                    date1.getMinutes() === date2.getMinutes();
-            };
-
-            var TimePicker = _Base.Class.define(function TimePicker_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.TimePicker.TimePicker">
-                /// <summary locid="WinJS.UI.TimePicker.constructor">Initializes a new instance of the TimePicker control</summary>
-                /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.UI.TimePicker.constructor_p:element">
-                /// The DOM element associated with the TimePicker control.
-                /// </param>
-                /// <param name="options" type="Object" locid="WinJS.UI.TimePicker.constructor_p:options">
-                /// The set of options to be applied initially to the TimePicker control.
-                /// </param>
-                /// <returns type="WinJS.UI.TimePicker" locid="WinJS.UI.TimePicker.constructor_returnValue">A constructed TimePicker control.</returns>
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </signature>
-
-                // Default to current time
-                this._currentTime = TimePicker._sentinelDate();
-
-                element = element || _Global.document.createElement("div");
-                _ElementUtilities.addClass(element, "win-disposable");
-                element.winControl = this;
-
-                var label = element.getAttribute("aria-label");
-                if (!label) {
-                    element.setAttribute("aria-label", strings.ariaLabel);
-                }
-
-                this._timePatterns = {
-                    minute: null,
-                    hour: null,
-                    period: null
-                };
-
-                // Options should be set after the element is initialized which is
-                // the same order of operation as imperatively setting options.
-                this._init(element);
-                _Control.setOptions(this, options);
-            }, {
-                _currentTime: null,
-                _clock: null,
-                _disabled: false,
-                _hourElement: null,
-                _hourControl: null,
-                _minuteElement: null,
-                _minuteControl: null,
-                _ampmElement: null,
-                _ampmControl: null,
-                _minuteIncrement: 1,
-                _timePatterns: {
-                    minute: null,
-                    hour: null,
-                    period: null
-                },
-                _information: null,
-
-                _addAccessibilityAttributes: function () {
-                    //see http://www.w3.org/TR/wai-aria/rdf_model.png for details
-                    this._domElement.setAttribute("role", "group");
-
-                    this._hourElement.setAttribute("aria-label", strings.selectHour);
-                    this._minuteElement.setAttribute("aria-label", strings.selectMinute);
-                    if (this._ampmElement) {
-                        this._ampmElement.setAttribute("aria-label", strings.selectAMPM);
-                    }
-                },
-
-                _addControlsInOrder: function (info) {
-                    var that = this;
-                    info.order.forEach(function (s, index) {
-                        switch (s) {
-                            case "hour":
-                                that._domElement.appendChild(that._hourElement);
-                                _ElementUtilities.addClass(that._hourElement, "win-order" + index);
-                                break;
-                            case "minute":
-                                that._domElement.appendChild(that._minuteElement);
-                                _ElementUtilities.addClass(that._minuteElement, "win-order" + index);
-                                break;
-                            case "period":
-                                if (that._ampmElement) {
-                                    that._domElement.appendChild(that._ampmElement);
-                                    _ElementUtilities.addClass(that._ampmElement, "win-order" + index);
-                                }
-                                break;
-                        }
-                    });
-                },
-
-                dispose: function () {
-                    /// <signature helpKeyword="WinJS.UI.TimePicker.dispose">
-                    /// <summary locid="WinJS.UI.TimePicker.dispose">
-                    /// Disposes this TimePicker.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                },
-
-                /// <field type="String" locid="WinJS.UI.TimePicker.clock" helpKeyword="WinJS.UI.TimePicker.clock">
-                /// Gets or sets the type of clock to display (12HourClock or 24HourClock). It defaults to the user setting.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                clock: {
-                    get: function () {
-                        return this._clock;
-                    },
-                    set: function (value) {
-                        if (this._clock !== value) {
-                            this._clock = value;
-                            this._init();
-                        }
-                    }
-                },
-
-                /// <field type="Date" locid="WinJS.UI.TimePicker.current" helpKeyword="WinJS.UI.TimePicker.current">
-                /// Gets or sets the current date (and time) of the TimePicker.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                current: {
-                    get: function () {
-                        var cur = this._currentTime;
-                        if (cur) {
-                            var time = TimePicker._sentinelDate();
-                            time.setHours(cur.getHours()); // accounts for AM/PM
-                            time.setMinutes(this._getMinutesIndex(cur) * this.minuteIncrement);
-                            time.setSeconds(0);
-                            time.setMilliseconds(0);
-                            return time;
-                        } else {
-                            return cur;
-                        }
-                    },
-                    set: function (value) {
-                        var newTime;
-                        if (typeof (value) === "string") {
-                            newTime = TimePicker._sentinelDate();
-                            newTime.setTime(Date.parse(newTime.toDateString() + " " + value));
-                        } else {
-                            newTime = TimePicker._sentinelDate();
-                            newTime.setHours(value.getHours());
-                            newTime.setMinutes(value.getMinutes());
-                        }
-
-                        var oldTime = this._currentTime;
-                        if (!areTimesEqual(oldTime, newTime)) {
-                            this._currentTime = newTime;
-
-                            this._updateDisplay();
-                        }
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.TimePicker.disabled" helpKeyword="WinJS.UI.TimePicker.disabled">
-                /// Specifies whether the TimePicker is disabled.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                disabled: {
-                    get: function () { return this._disabled; },
-                    set: function (value) {
-                        if (this._disabled !== value) {
-                            this._disabled = value;
-                            if (this._hourControl) {
-                                this._hourControl.setDisabled(value);
-                                this._minuteControl.setDisabled(value);
-                            }
-                            if (this._ampmControl) {
-                                this._ampmControl.setDisabled(value);
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.TimePicker.element" helpKeyword="WinJS.UI.TimePicker.element">
-                /// Gets the DOM element for the TimePicker.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                element: {
-                    get: function () { return this._domElement; }
-                },
-
-
-                _init: function (element) {
-                    this._setElement(element);
-                    this._updateDisplay();
-                },
-
-                /// <field type="String" locid="WinJS.UI.TimePicker.hourPattern" helpKeyword="WinJS.UI.TimePicker.hourPattern">
-                /// Gets or sets the display pattern for the hour.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                hourPattern: {
-                    get: function () { return this._timePatterns.hour.pattern; },
-                    set: function (value) {
-                        if (this._timePatterns.hour !== value) {
-                            this._timePatterns.hour = value;
-                            this._init();
-                        }
-                    }
-
-                },
-
-                _getHoursAmpm: function (time) {
-                    var hours24 = time.getHours();
-                    if (this._ampmElement) {
-                        if (hours24 === 0) {
-                            return { hours: 12, ampm: 0 };
-                        } else if (hours24 < 12) {
-                            return { hours: hours24, ampm: 0 };
-                        }
-                        return { hours: hours24 - 12, ampm: 1 };
-                    }
-
-                    return { hours: hours24 };
-                },
-
-                _getHoursIndex: function (hours) {
-                    if (this._ampmElement && hours === 12) {
-                        return 0;
-                    }
-                    return hours;
-                },
-
-                _getMinutesIndex: function (time) {
-                    return parseInt(time.getMinutes() / this.minuteIncrement);
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.TimePicker.minuteIncrement" helpKeyword="WinJS.UI.TimePicker.minuteIncrement">
-                /// Gets or sets the minute increment. For example, "15" specifies that the TimePicker minute control should display only the choices 00, 15, 30, 45.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                minuteIncrement: {
-                    //prevent divide by 0, and leave user's input intact
-                    get: function () { return Math.max(1, Math.abs(this._minuteIncrement | 0) % 60); },
-                    set: function (value) {
-                        if (this._minuteIncrement !== value) {
-                            this._minuteIncrement = value;
-                            this._init();
-                        }
-                    }
-
-                },
-
-                /// <field type="String" locid="WinJS.UI.TimePicker.minutePattern" helpKeyword="WinJS.UI.TimePicker.minutePattern">
-                /// Gets or sets the display pattern for the minute.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                minutePattern: {
-                    get: function () { return this._timePatterns.minute.pattern; },
-                    set: function (value) {
-                        if (this._timePatterns.minute !== value) {
-                            this._timePatterns.minute = value;
-                            this._init();
-                        }
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.TimePicker.periodPattern" helpKeyword="WinJS.UI.TimePicker.periodPattern">
-                /// Gets or sets the display pattern for the period.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                periodPattern: {
-                    get: function () { return this._timePatterns.period.pattern; },
-                    set: function (value) {
-
-                        if (this._timePatterns.period !== value) {
-                            this._timePatterns.period = value;
-                            this._init();
-                        }
-                    }
-                },
-
-                _setElement: function (element) {
-                    this._domElement = this._domElement || element;
-                    if (!this._domElement) { return; }
-
-                    var info = TimePicker.getInformation(this.clock, this.minuteIncrement, this._timePatterns);
-                    this._information = info;
-
-                    if (info.forceLanguage) {
-                        this._domElement.setAttribute("lang", info.forceLanguage);
-                        this._domElement.setAttribute("dir", info.isRTL ? "rtl" : "ltr");
-                    }
-
-                    _ElementUtilities.empty(this._domElement);
-                    _ElementUtilities.addClass(this._domElement, "win-timepicker");
-
-                    this._hourElement = _Global.document.createElement("select");
-                    _ElementUtilities.addClass(this._hourElement, "win-timepicker-hour win-dropdown");
-
-                    this._minuteElement = _Global.document.createElement("select");
-                    _ElementUtilities.addClass(this._minuteElement, "win-timepicker-minute win-dropdown");
-
-                    this._ampmElement = null;
-                    if (info.clock === "12HourClock") {
-                        this._ampmElement = _Global.document.createElement("select");
-                        _ElementUtilities.addClass(this._ampmElement, "win-timepicker-period win-dropdown");
-                    }
-
-                    this._addControlsInOrder(info);
-
-                    var hoursAmpm = this._getHoursAmpm(this.current);
-                    this._hourControl = new _Select._Select(this._hourElement, {
-                        dataSource: this._getInfoHours(),
-                        disabled: this.disabled,
-                        index: this._getHoursIndex(hoursAmpm.hours)
-                    });
-                    this._minuteControl = new _Select._Select(this._minuteElement, {
-                        dataSource: info.minutes,
-                        disabled: this.disabled,
-                        index: this._getMinutesIndex(this.current)
-                    });
-                    this._ampmControl = null;
-                    if (this._ampmElement) {
-                        this._ampmControl = new _Select._Select(this._ampmElement, {
-                            dataSource: info.periods,
-                            disabled: this.disabled,
-                            index: hoursAmpm.ampm
-                        });
-                    }
-
-                    this._wireupEvents();
-                    this._updateValues();
-                    this._addAccessibilityAttributes();
-                },
-
-                _getInfoHours: function () {
-                    return this._information.hours;
-                },
-
-                _updateLayout: function () {
-                    if (!this._domElement) {
-                        return;
-                    }
-                    this._updateValues();
-                },
-
-                _updateValues: function () {
-                    if (this._hourControl) {
-                        var hoursAmpm = this._getHoursAmpm(this.current);
-                        if (this._ampmControl) {
-                            this._ampmControl.index = hoursAmpm.ampm;
-                        }
-                        this._hourControl.index = this._getHoursIndex(hoursAmpm.hours);
-                        this._minuteControl.index = this._getMinutesIndex(this.current);
-                    }
-                },
-
-                _updateDisplay: function () {
-                    //Render display index based on constraints (minuteIncrement)
-                    //Will not modify current time
-
-                    var hoursAmpm = this._getHoursAmpm(this.current);
-
-                    if (this._ampmControl) {
-                        this._ampmControl.index = hoursAmpm.ampm;
-                    }
-
-                    if (this._hourControl) {
-                        this._hourControl.index = this._getHoursIndex(hoursAmpm.hours);
-                        this._minuteControl.index = this._getMinutesIndex(this.current);
-                    }
-                },
-
-                _wireupEvents: function () {
-                    var that = this;
-
-                    var fixupHour = function () {
-                        var hour = that._hourControl.index;
-                        if (that._ampmElement) {
-                            if (that._ampmControl.index === 1) {
-                                if (hour !== 12) {
-                                    hour += 12;
-                                }
-                            }
-                        }
-                        return hour;
-                    };
-
-                    var changed = function () {
-                        var hour = fixupHour();
-                        that._currentTime.setHours(hour);
-
-                        that._currentTime.setMinutes(that._minuteControl.index * that.minuteIncrement);
-                    };
-
-                    this._hourElement.addEventListener("change", changed, false);
-                    this._minuteElement.addEventListener("change", changed, false);
-                    if (this._ampmElement) {
-                        this._ampmElement.addEventListener("change", changed, false);
-                    }
-                }
-            }, {
-                _sentinelDate: function () {
-                    // This is July 15th, 2011 as our sentinel date. There are no known
-                    //  daylight savings transitions that happened on that date.
-                    var current = new Date();
-                    return new Date(2011, 6, 15, current.getHours(), current.getMinutes());
-                },
-                _getInformationWinRT: function (clock, minuteIncrement, timePatterns) {
-                    var newFormatter = function (pattern, defaultPattern) {
-                        var dtf = _WinRT.Windows.Globalization.DateTimeFormatting;
-                        pattern = !pattern ? defaultPattern : pattern;
-                        var formatter = new dtf.DateTimeFormatter(pattern);
-                        if (clock) {
-                            formatter = dtf.DateTimeFormatter(pattern, formatter.languages, formatter.geographicRegion, formatter.calendar, clock);
-                        }
-                        return formatter;
-                    };
-
-                    var glob = _WinRT.Windows.Globalization;
-                    var calendar = new glob.Calendar();
-                    if (clock) {
-                        calendar = new glob.Calendar(calendar.languages, calendar.getCalendarSystem(), clock);
-                    }
-                    calendar.setDateTime(TimePicker._sentinelDate());
-
-                    var computedClock = calendar.getClock();
-                    var numberOfHours = 24;
-                    numberOfHours = calendar.numberOfHoursInThisPeriod;
-
-                    var periods = (function () {
-                        var periodFormatter = newFormatter(timePatterns.period, DEFAULT_PERIOD_PATTERN);
-                        return {
-                            getLength: function () { return 2; },
-                            getValue: function (index) {
-                                var date = TimePicker._sentinelDate();
-                                if (index === 0) {
-                                    date.setHours(1);
-                                    var am = periodFormatter.format(date);
-                                    return am;
-                                }
-                                if (index === 1) {
-                                    date.setHours(13);
-                                    var pm = periodFormatter.format(date);
-                                    return pm;
-                                }
-                                return null;
-                            }
-                        };
-                    })();
-
-                    // Determine minute format from the DateTimeFormatter
-                    var minutes = (function () {
-                        var minuteFormatter = newFormatter(timePatterns.minute, DEFAULT_MINUTE_PATTERN);
-                        var now = TimePicker._sentinelDate();
-                        return {
-                            getLength: function () { return 60 / minuteIncrement; },
-                            getValue: function (index) {
-                                var display = index * minuteIncrement;
-                                now.setMinutes(display);
-                                return minuteFormatter.format(now);
-                            }
-                        };
-                    })();
-
-
-                    // Determine hour format from the DateTimeFormatter
-                    var hours = (function () {
-                        var hourFormatter = newFormatter(timePatterns.hour, DEFAULT_HOUR_PATTERN);
-                        var now = TimePicker._sentinelDate();
-                        return {
-                            getLength: function () { return numberOfHours; },
-                            getValue: function (index) {
-                                now.setHours(index);
-                                return hourFormatter.format(now);
-                            }
-                        };
-                    })();
-
-                    // Determine the order of the items from the DateTimeFormatter.
-                    // "hour minute" also returns the period (if needed).
-                    //
-                    var hourMinuteFormatter = newFormatter("hour minute");
-                    var pattern = hourMinuteFormatter.patterns[0];
-                    var order = ["hour", "minute"];
-
-                    var indexes = {
-                        period: pattern.indexOf("{period"),
-                        hour: pattern.indexOf("{hour"),
-                        minute: pattern.indexOf("{minute")
-                    };
-                    if (indexes.period > -1) {
-                        order.push("period");
-                    }
-
-
-                    var DateTimeFormatter = _WinRT.Windows.Globalization.DateTimeFormatting.DateTimeFormatter;
-                    var dtf = new DateTimeFormatter("month.full", _WinRT.Windows.Globalization.ApplicationLanguages.languages, "ZZ", "GregorianCalendar", "24HourClock");
-                    var pat = dtf.patterns[0];
-                    var isRTL = pat.charCodeAt(0) === 8207;
-
-                    if (isRTL) {
-                        var temp = indexes.hour;
-                        indexes.hour = indexes.minute;
-                        indexes.minute = temp;
-                    }
-
-                    order.sort(function (a, b) {
-                        if (indexes[a] < indexes[b]) {
-                            return -1;
-                        } else if (indexes[a] > indexes[b]) {
-                            return 1;
-                        } else {
-                            return 0;
-                        }
-                    });
-
-                    return { minutes: minutes, hours: hours, clock: computedClock, periods: periods, order: order, forceLanguage: hourMinuteFormatter.resolvedLanguage, isRTL: isRTL };
-                },
-                _getInformationJS: function (clock, minuteIncrement) {
-                    var hours = [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
-
-                    var minutes = {};
-                    minutes.getLength = function () { return 60 / minuteIncrement; };
-                    minutes.getValue = function (index) {
-                        var display = index * minuteIncrement;
-                        if (display < 10) {
-                            return "0" + display.toString();
-                        } else {
-                            return display.toString();
-                        }
-                    };
-
-                    var order = ["hour", "minute", "period"];
-                    if (clock === "24HourClock") {
-                        hours = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23];
-                        order = ["hour", "minute"];
-                    }
-                    return { minutes: minutes, hours: hours, clock: clock || "12HourClock", periods: ["AM", "PM"], order: order };
-                }
-            });
-            if (_WinRT.Windows.Globalization.DateTimeFormatting && _WinRT.Windows.Globalization.Calendar && _WinRT.Windows.Globalization.ApplicationLanguages) {
-                TimePicker.getInformation = TimePicker._getInformationWinRT;
-            } else {
-                TimePicker.getInformation = TimePicker._getInformationJS;
-            }
-            _Base.Class.mix(TimePicker, _Events.createEventProperties("change"));
-            _Base.Class.mix(TimePicker, _Control.DOMEventMixin);
-            return TimePicker;
-        })
-    });
-
-
-});
-
-
-define('require-style!less/styles-backbutton',[],function(){});
-
-define('require-style!less/colors-backbutton',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// Back Button
-define('WinJS/Controls/BackButton',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_ErrorFromName',
-    '../Core/_Resources',
-    '../Navigation',
-    '../Utilities/_Control',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    'require-style!less/styles-backbutton',
-    'require-style!less/colors-backbutton'
-    ], function backButtonInit(exports, _Global, _Base, _ErrorFromName, _Resources, Navigation, _Control, _ElementUtilities, _Hoverable) {
-    "use strict";
-
-    var Key = _ElementUtilities.Key;
-
-    // Class Names
-    var navigationBackButtonClass = 'win-navigation-backbutton';
-    var glyphClass = "win-back";
-
-    // CONSTANTS
-    var MOUSE_BACK_BUTTON = 3;
-
-    // Create Singleton for global event registering/unregistering. This Singleton should only be created once.
-    // Here the function 'returnBackButtonSingelton' is called immediateley and its result is the singleton object.
-    var singleton = (function createBackButtonSingleton() {
-
-        /* Step 1: Build JavaScript closure */
-
-        function hookUpBackButtonGlobalEventHandlers() {
-            // Subscribes to global events on the window object
-            _Global.addEventListener('keyup', backButtonGlobalKeyUpHandler, false);
-            _ElementUtilities._addEventListener(_Global, 'pointerup', backButtonGlobalMSPointerUpHandler, false);
-        }
-
-        function unHookBackButtonGlobalEventHandlers() {
-            // Unsubscribes from global events on the window object
-            _Global.removeEventListener('keyup', backButtonGlobalKeyUpHandler, false);
-            _ElementUtilities._removeEventListener(_Global, 'pointerup', backButtonGlobalMSPointerUpHandler, false);
-        }
-
-        function backButtonGlobalKeyUpHandler(event) {
-            // Navigates back when (alt + left) or BrowserBack keys are released.
-            if ((event.keyCode === Key.leftArrow && event.altKey && !event.shiftKey && !event.ctrlKey) || (event.keyCode === Key.browserBack)) {
-                Navigation.back();
-                event.preventDefault();
-            }
-        }
-
-        function backButtonGlobalMSPointerUpHandler(event) {
-            // Responds to clicks to enable navigation using 'back' mouse buttons.
-            if (event.button === MOUSE_BACK_BUTTON) {
-                Navigation.back();
-            }
-        }
-
-        // Singleton reference count for registering and unregistering global event handlers.
-        var backButtonReferenceCount = 0; //
-
-        /* Step 2: Return Singleton object literal */
-        return {
-            addRef: function () {
-                if (backButtonReferenceCount === 0) {
-                    hookUpBackButtonGlobalEventHandlers();
-                }
-                backButtonReferenceCount++;
-            },
-            release: function () {
-                if (backButtonReferenceCount > 0) { // Ensure count won't become negative.
-                    backButtonReferenceCount--;
-                    if (backButtonReferenceCount === 0) {
-                        unHookBackButtonGlobalEventHandlers();
-                    }
-                }
-            },
-            getCount: function () { // Return the value of the reference count. Useful for unit testing.
-                return backButtonReferenceCount;
-            }
-        };
-    }()); // Immediate invoke creates and returns the Singleton
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.BackButton">
-        /// Provides backwards navigation functionality.
-        /// </summary>
-        /// <compatibleWith platform="Windows" minVersion="8.1"/>
-        /// </field>
-        /// <icon src="ui_winjs.ui.backbutton.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.backbutton.16x16.png" width="16" height="16" />
-        /// <htmlSnippet><![CDATA[<button data-win-control="WinJS.UI.BackButton"></button>]]></htmlSnippet>
-        /// <part name="BackButton" class="win-navigation-backbutton" locid="WinJS.UI.BackButton_part:BackButton">The BackButton control itself</part>
-        /// <part name="BackArrowGlyph" class="win-back" locid="WinJS.UI.BackButton_part:BackArrowGlyph">The Back Arrow glyph</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        BackButton: _Base.Namespace._lazy(function () {
-            // Statics
-            var strings = {
-                get ariaLabel() { return _Resources._getWinJSString("ui/backbuttonarialabel").value; },
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; },
-                get badButtonElement() { return "Invalid argument: For a button, toggle, or flyout command, the element must be null or a button element"; }
-            };
-
-            var BackButton = _Base.Class.define(function BackButton_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.BackButton.BackButton">
-                /// <summary locid="WinJS.UI.BackButton.constructor">
-                /// Creates a new BackButton control
-                /// </summary>
-                /// <param name="element" domElement="true" locid="WinJS.UI.BackButton.constructor_p:element">
-                /// The DOM element that will host the control. If this parameter is null, this constructor creates one for you.
-                /// </param>
-                /// <param name="options" type="Object" isOptional="true" locid="WinJS.UI.MenuBackButtonCommand.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control. Each property of the options object corresponds to
-                /// one of the control's properties or events.
-                /// </param>
-                /// <returns type="WinJS.UI.BackButton" locid="WinJS.UI.BackButton.constructor_returnValue">
-                /// A BackButton control.
-                /// </returns>
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </signature>
-
-                // Check to make sure we weren't duplicated
-                if (element && element.winControl) {
-                    throw new _ErrorFromName("WinJS.UI.BackButton.DuplicateConstruction", strings.duplicateConstruction);
-                }
-
-                this._element = element || _Global.document.createElement("button");
-                options = options || {};
-
-                this._initializeButton(); // This will also set the aria-label and tooltip
-
-                this._disposed = false;
-
-                // Remember ourselves
-                this._element.winControl = this;
-
-                _Control.setOptions(this, options);
-
-                // Add event handlers for this back button instance
-                this._buttonClickHandler = this._handleBackButtonClick.bind(this);
-                this._element.addEventListener('click', this._buttonClickHandler, false);
-                this._navigatedHandler = this._handleNavigatedEvent.bind(this);
-                Navigation.addEventListener('navigated', this._navigatedHandler, false);
-
-                // Increment reference count / manage add global event handlers
-                singleton.addRef();
-            }, {
-
-                /// <field type="HTMLElement" domElement="true" readonly="true" hidden="true" locid="WinJS.UI.BackButton.element" helpKeyword="WinJS.UI.BackButton.element">
-                /// Gets the DOM element that hosts the BackButton control.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-
-                dispose: function () {
-                    /// <signature helpKeyword="WinJS.UI.BackButton.dispose">
-                    /// <summary locid="WinJS.UI.BackButton.dispose">
-                    /// Disposes this control.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._disposed = true; // Mark this control as disposed.
-
-                    // Remove 'navigated' eventhandler for this BackButton
-                    Navigation.removeEventListener('navigated', this._navigatedHandler, false);
-
-                    singleton.release(); // Decrement reference count.
-
-                },
-
-                refresh: function () {
-                    /// <signature helpKeyword="WinJS.UI.BackButton.refresh">
-                    /// <summary locid="WinJS.UI.BackButton.refresh">
-                    /// Sets the 'disabled' attribute to correct the value based on the current navigation history stack.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </signature>
-                    if (Navigation.canGoBack) {
-                        this._element.disabled = false;
-                    } else {
-                        this._element.disabled = true;
-                    }
-                },
-
-                _initializeButton: function () {
-                    //Final EN-US HTML should be:
-                    //<button class="win-navigation-backbutton" aria-label="Back" title="Back" type="button"><span class="win-back"></span></button>
-                    //Button will automatically be disabled if WinJS.Navigation.history.canGoBack is false.
-
-                    // Verify the HTML is a button
-                    if (this._element.tagName !== "BUTTON") {
-                        throw new _ErrorFromName("WinJS.UI.BackButton.BadButtonElement", strings.badButtonElement);
-                    }
-
-                    // Attach our css classes
-                    _ElementUtilities.addClass(this._element, navigationBackButtonClass);
-
-                    // Attach disposable class.
-                    _ElementUtilities.addClass(this._element, "win-disposable");
-
-                    // Create inner glyph element
-                    this._element.innerHTML = '<span class="' + glyphClass + '"></span>';
-
-                    // Set the 'disabled' property to the correct value based on the current navigation history stack.
-                    this.refresh();
-
-                    // Set Aria-label and native tooltip to the same localized string equivalent of "Back"
-                    this._element.setAttribute("aria-label", strings.ariaLabel);
-                    this._element.setAttribute("title", strings.ariaLabel);
-
-                    // Explicitly set type attribute to avoid the default <button> "submit" type.
-                    this._element.setAttribute("type", "button");
-                },
-
-                _handleNavigatedEvent: function () {
-                    // Handles WinJS.Navigation 'navigated' behavior
-                    this.refresh();
-                },
-
-                _handleBackButtonClick: function () {
-                    // Handles BackButton 'click' behavior
-                    Navigation.back();
-                }
-
-            });
-            // Private Static Method.
-            BackButton._getReferenceCount = function () {
-                return singleton.getCount(); // Expose this for Unit testing.
-            };
-            _Base.Class.mix(BackButton, _Control.DOMEventMixin);
-            return BackButton;
-        })
-    });
-
-});
-
-
-define('require-style!less/styles-tooltip',[],function(){});
-
-define('require-style!less/colors-tooltip',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/Tooltip',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_Events',
-    '../Animations',
-    '../Animations/_TransitionAnimation',
-    '../Utilities/_Control',
-    '../Utilities/_Dispose',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    'require-style!less/styles-tooltip',
-    'require-style!less/colors-tooltip'
-    ], function tooltipInit(exports, _Global, _WinRT, _Base, _BaseUtils, _Events, Animations, _TransitionAnimation, _Control, _Dispose, _ElementUtilities, _Hoverable) {
-    "use strict";
-
-    // Tooltip control implementation
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.Tooltip">
-        /// Displays a tooltip that can contain images and formatting.
-        /// </summary>
-        /// <compatibleWith platform="Windows" minVersion="8.0"/>
-        /// </field>
-        /// <icon src="ui_winjs.ui.tooltip.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.tooltip.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div style="display:inline-block;" data-win-control="WinJS.UI.Tooltip" data-win-options="{innerHTML:'Tooltip content goes here'}"></div>]]></htmlSnippet>
-        /// <event name="beforeopen" bubbles="false" locid="WinJS.UI.Tooltip_e:beforeopen">Raised when the tooltip is about to appear.</event>
-        /// <event name="opened" bubbles="false" locid="WinJS.UI.Tooltip_e:opened">Raised when the tooltip is showing.</event>
-        /// <event name="beforeclose" bubbles="false" locid="WinJS.UI.Tooltip_e:beforeclose">Raised when the tooltip is about to become hidden.</event>
-        /// <event name="closed" bubbles="false" locid="WinJS.UI.Tooltip_e:close">Raised when the tooltip is hidden.</event>
-        /// <part name="tooltip" class="win-tooltip" locid="WinJS.UI.Tooltip_e:tooltip">The entire Tooltip control.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        Tooltip: _Base.Namespace._lazy(function () {
-            var lastCloseTime = 0;
-            var Key = _ElementUtilities.Key;
-
-            // Constants definition
-            var DEFAULT_PLACEMENT = "top";
-            var DELAY_INITIAL_TOUCH_SHORT = _TransitionAnimation._animationTimeAdjustment(400);
-            var DELAY_INITIAL_TOUCH_LONG = _TransitionAnimation._animationTimeAdjustment(1200);
-            var DEFAULT_MOUSE_HOVER_TIME = _TransitionAnimation._animationTimeAdjustment(400); // 0.4 second
-            var DEFAULT_MESSAGE_DURATION = _TransitionAnimation._animationTimeAdjustment(5000); // 5 secs
-            var DELAY_RESHOW_NONINFOTIP_TOUCH = _TransitionAnimation._animationTimeAdjustment(0);
-            var DELAY_RESHOW_NONINFOTIP_NONTOUCH = _TransitionAnimation._animationTimeAdjustment(600);
-            var DELAY_RESHOW_INFOTIP_TOUCH = _TransitionAnimation._animationTimeAdjustment(400);
-            var DELAY_RESHOW_INFOTIP_NONTOUCH = _TransitionAnimation._animationTimeAdjustment(600);
-            var RESHOW_THRESHOLD = _TransitionAnimation._animationTimeAdjustment(200);
-            var HIDE_DELAY_MAX = _TransitionAnimation._animationTimeAdjustment(300000); // 5 mins
-            var OFFSET_KEYBOARD = 12;
-            var OFFSET_MOUSE = 20;
-            var OFFSET_TOUCH = 45;
-            var OFFSET_PROGRAMMATIC_TOUCH = 20;
-            var OFFSET_PROGRAMMATIC_NONTOUCH = 12;
-            var SAFETY_NET_GAP = 1; // We set a 1-pixel gap between the right or bottom edge of the tooltip and the viewport to avoid possible re-layout
-            var PT_MOUSE = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_MOUSE || "mouse"; // pointer type to indicate a mouse event
-            var PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || "touch"; // pointer type to indicate a touch event
-
-            var EVENTS_INVOKE = { "keyup": "", "pointerover": "", "pointerdown": "" },
-                EVENTS_UPDATE = { "pointermove": "" },
-                EVENTS_DISMISS = { "pointerdown": "", "keydown": "", "focusout": "", "pointerout": "", "pointercancel": "", "pointerup": "" },
-                EVENTS_BY_CHILD = { "pointerover": "", "pointerout": "" };
-
-            function isInvokeEvent(eventType, pointerType) {
-                if (eventType === "pointerdown") {
-                    return pointerType === PT_TOUCH;
-                } else {
-                    return eventType in EVENTS_INVOKE;
-                }
-            }
-
-            function isDismissEvent(eventType, pointerType) {
-                if (eventType === "pointerdown") {
-                    return pointerType !== PT_TOUCH;
-                } else {
-                    return eventType in EVENTS_DISMISS;
-                }
-            }
-
-            // CSS class names
-            var msTooltip = "win-tooltip",
-            msTooltipPhantom = "win-tooltip-phantom";
-
-            // Global attributes
-            var mouseHoverTime = DEFAULT_MOUSE_HOVER_TIME,
-                nonInfoTooltipNonTouchShowDelay = 2 * mouseHoverTime,
-                infoTooltipNonTouchShowDelay = 2.5 * mouseHoverTime,
-                messageDuration = DEFAULT_MESSAGE_DURATION,
-                isLeftHanded = false;
-
-            var hasInitWinRTSettings = false;
-
-            var createEvent = _Events._createEventProperty;
-
-            return _Base.Class.define(function Tooltip_ctor(anchorElement, options) {
-                /// <signature helpKeyword="WinJS.UI.Tooltip.Tooltip">
-                /// <summary locid="WinJS.UI.Tooltip.constructor">
-                /// Creates a new Tooltip.
-                /// </summary>
-                /// <param name="element" domElement="true" locid="WinJS.UI.Tooltip.constructor_p:element">
-                /// The DOM element that hosts the Tooltip.
-                /// </param>
-                /// <param name="options" type="Object" locid="WinJS.UI.Tooltip.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// Event names must begin with "on". For example, to provide a handler for the opened event,
-                /// add a property named "onopened" to the options object and set its value to the event handler.
-                /// This parameter is optional.
-                /// </param>
-                /// <returns type="WinJS.UI.Tooltip" locid="WinJS.UI.Tooltip.constructor_returnValue">
-                /// The new Tooltip.
-                /// </returns>
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </signature>
-                anchorElement = anchorElement || _Global.document.createElement("div");
-
-                var tooltip = _ElementUtilities.data(anchorElement).tooltip;
-                if (tooltip) {
-                    return tooltip;
-                }
-
-                // Set system attributes if it is in WWA, otherwise, use the default values
-                if (!hasInitWinRTSettings && _WinRT.Windows.UI.ViewManagement.UISettings) { // in WWA
-                    var uiSettings = new _WinRT.Windows.UI.ViewManagement.UISettings();
-                    mouseHoverTime = _TransitionAnimation._animationTimeAdjustment(uiSettings.mouseHoverTime);
-                    nonInfoTooltipNonTouchShowDelay = 2 * mouseHoverTime;
-                    infoTooltipNonTouchShowDelay = 2.5 * mouseHoverTime;
-                    messageDuration = _TransitionAnimation._animationTimeAdjustment(uiSettings.messageDuration * 1000);  // uiSettings.messageDuration is in seconds.
-                    var handedness = uiSettings.handPreference;
-                    isLeftHanded = (handedness === _WinRT.Windows.UI.ViewManagement.HandPreference.leftHanded);
-                }
-                hasInitWinRTSettings = true;
-
-                // Need to initialize properties
-                this._disposed = false;
-                this._placement = DEFAULT_PLACEMENT;
-                this._infotip = false;
-                this._innerHTML = null;
-                this._contentElement = null;
-                this._extraClass = null;
-                this._lastContentType = "html";
-                this._anchorElement = anchorElement;
-                this._domElement = null;
-                this._phantomDiv = null;
-                this._triggerByOpen = false;
-                this._eventListenerRemoveStack = [];
-
-                // To handle keyboard navigation
-                this._lastKeyOrBlurEvent = null;
-                this._currentKeyOrBlurEvent = null;
-
-                // Remember ourselves
-                anchorElement.winControl = this;
-                _ElementUtilities.addClass(anchorElement, "win-disposable");
-
-                // If anchor element's title is defined, set as the default tooltip content
-                if (anchorElement.title) {
-                    this._innerHTML = this._anchorElement.title;
-                    this._anchorElement.removeAttribute("title");
-                }
-
-                _Control.setOptions(this, options);
-                this._events();
-                _ElementUtilities.data(anchorElement).tooltip = this;
-            }, {
-                /// <field type="String" locid="WinJS.UI.Tooltip.innerHTML" helpKeyword="WinJS.UI.Tooltip.innerHTML">
-                /// Gets or sets the HTML content of the Tooltip.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                innerHTML: {
-                    get: function () {
-                        return this._innerHTML;
-                    },
-                    set: function (value) {
-                        this._innerHTML = value;
-                        if (this._domElement) {
-                            // If we set the innerHTML to null or "" while tooltip is up, we should close it
-                            if (!this._innerHTML || this._innerHTML === "") {
-                                this._onDismiss();
-                                return;
-                            }
-                            this._domElement.innerHTML = value;
-                            this._position();
-                        }
-                        this._lastContentType = "html";
-                    }
-                },
-
-                /// <field type="HTMLElement" hidden="true" locid="WinJS.UI.Tooltip.element" helpKeyword="WinJS.UI.Tooltip.element">
-                /// Gets or sets the DOM element that hosts the Tooltip.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._anchorElement;
-                    }
-                },
-
-                /// <field type="HTMLElement" locid="WinJS.UI.Tooltip.contentElement" helpKeyword="WinJS.UI.Tooltip.contentElement" potentialValueSelector="div[style='display: none;']>div[id], div[style='display: none;']>div[class]">
-                /// Gets or sets the DOM element that is the content for the ToolTip.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                contentElement: {
-                    get: function () {
-                        return this._contentElement;
-                    },
-                    set: function (value) {
-                        this._contentElement = value;
-                        if (this._domElement) {
-                            // If we set the contentElement to null while tooltip is up, we should close it
-                            if (!this._contentElement) {
-                                this._onDismiss();
-                                return;
-                            }
-                            this._domElement.innerHTML = "";
-                            this._domElement.appendChild(this._contentElement);
-                            this._position();
-                        }
-                        this._lastContentType = "element";
-                    }
-                },
-
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.Tooltip.placement" locid="WinJS.UI.Tooltip.placement" helpKeyword="WinJS.UI.Tooltip.placement">
-                /// Gets or sets the position for the Tooltip relative to its target element: top, bottom, left or right.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                placement: {
-                    get: function () {
-                        return this._placement;
-                    },
-                    set: function (value) {
-                        if (value !== "top" && value !== "bottom" && value !== "left" && value !== "right") {
-                            value = DEFAULT_PLACEMENT;
-                        }
-                        this._placement = value;
-                        if (this._domElement) {
-                            this._position();
-                        }
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.Tooltip.infotip" helpKeyword="WinJS.UI.Tooltip.infotip">
-                /// Gets or sets a value that specifies whether the Tooltip is an infotip, a tooltip that contains
-                /// a lot of info and should be displayed for longer than a typical Tooltip.
-                /// The default value is false.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                infotip: {
-                    get: function () {
-                        return this._infotip;
-                    },
-                    set: function (value) {
-                        this._infotip = !!value; //convert the value to boolean
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.Tooltip.extraClass" helpKeyword="WinJS.UI.Tooltip.extraClass" isAdvanced="true">
-                /// Gets or sets additional CSS classes to apply to the Tooltip control's host element.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                extraClass: {
-                    get: function () {
-                        return this._extraClass;
-                    },
-                    set: function (value) {
-                        this._extraClass = value;
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.Tooltip.onbeforeopen" helpKeyword="WinJS.UI.Tooltip.onbeforeopen">
-                /// Raised just before the Tooltip appears.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                onbeforeopen: createEvent("beforeopen"),
-
-                /// <field type="Function" locid="WinJS.UI.Tooltip.onopened" helpKeyword="WinJS.UI.Tooltip.onopened">
-                /// Raised when the Tooltip is shown.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                onopened: createEvent("opened"),
-
-                /// <field type="Function" locid="WinJS.UI.Tooltip.onbeforeclose" helpKeyword="WinJS.UI.Tooltip.onbeforeclose">
-                /// Raised just before the Tooltip is hidden.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                onbeforeclose: createEvent("beforeclose"),
-
-                /// <field type="Function" locid="WinJS.UI.Tooltip.onclosed" helpKeyword="WinJS.UI.Tooltip.onclosed">
-                /// Raised when the Tooltip is no longer displayed.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                onclosed: createEvent("closed"),
-
-                dispose: function () {
-                    /// <signature helpKeyword="WinJS.UI.Tooltip.dispose">
-                    /// <summary locid="WinJS.UI.Tooltip.dispose">
-                    /// Disposes this Tooltip.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    this._disposed = true;
-                    _Dispose.disposeSubTree(this.element);
-                    for (var i = 0, len = this._eventListenerRemoveStack.length; i < len; i++) {
-                        this._eventListenerRemoveStack[i]();
-                    }
-                    this._onDismiss();
-                    var data = _ElementUtilities.data(this._anchorElement);
-                    if (data) {
-                        delete data.tooltip;
-                    }
-                },
-
-                addEventListener: function (eventName, eventCallBack, capture) {
-                    /// <signature helpKeyword="WinJS.UI.Tooltip.addEventListener">
-                    /// <summary locid="WinJS.UI.Tooltip.addEventListener">
-                    /// Registers an event handler for the specified event.
-                    /// </summary>
-                    /// <param name="eventName" type="String" locid="WinJS.UI.Tooltip.addEventListener_p:eventName">The name of the event.</param>
-                    /// <param name="eventCallback" type="Function" locid="WinJS.UI.Tooltip.addEventListener_p:eventCallback">The event handler function to associate with this event.</param>
-                    /// <param name="capture" type="Boolean" locid="WinJS.UI.Tooltip.addEventListener_p:capture">Set to true to register the event handler for the capturing phase; set to false to register for the bubbling phase.</param>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-
-                    if (this._anchorElement) {
-                        this._anchorElement.addEventListener(eventName, eventCallBack, capture);
-
-                        var that = this;
-                        this._eventListenerRemoveStack.push(function () {
-                            that._anchorElement.removeEventListener(eventName, eventCallBack, capture);
-                        });
-                    }
-                },
-
-                removeEventListener: function (eventName, eventCallBack, capture) {
-                    /// <signature helpKeyword="WinJS.UI.Tooltip.removeEventListener">
-                    /// <summary locid="WinJS.UI.Tooltip.removeEventListener">
-                    /// Unregisters an event handler for the specified event.
-                    /// </summary>
-                    /// <param name="eventName" type="String" locid="WinJS.UI.Tooltip.removeEventListener:eventName">The name of the event.</param>
-                    /// <param name="eventCallback" type="Function" locid="WinJS.UI.Tooltip.removeEventListener:eventCallback">The event handler function to remove.</param>
-                    /// <param name="capture" type="Boolean" locid="WinJS.UI.Tooltip.removeEventListener:capture">Set to true to unregister the event handler for the capturing phase; otherwise, set to false to unregister the event handler for the bubbling phase.</param>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-
-                    if (this._anchorElement) {
-                        this._anchorElement.removeEventListener(eventName, eventCallBack, capture);
-                    }
-                },
-
-                open: function (type) {
-                    /// <signature helpKeyword="WinJS.UI.Tooltip.open">
-                    /// <summary locid="WinJS.UI.Tooltip.open">
-                    /// Shows the Tooltip.
-                    /// </summary>
-                    /// <param name="type" type="String" locid="WinJS.UI.Tooltip.open_p:type">The type of tooltip to show: "touch", "mouseover", "mousedown", or "keyboard". The default value is "mousedown".</param>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-
-                    // Open takes precedence over other triggering events
-                    // Once tooltip is opened using open(), it can only be closed by time out(mouseover or keyboard) or explicitly by close().
-                    this._triggerByOpen = true;
-
-                    if (type !== "touch" && type !== "mouseover" && type !== "mousedown" && type !== "keyboard") {
-                        type = "default";
-                    }
-
-                    switch (type) {
-                        case "touch":
-                            this._onInvoke("touch", "never");
-                            break;
-                        case "mouseover":
-                            this._onInvoke("mouse", "auto");
-                            break;
-                        case "keyboard":
-                            this._onInvoke("keyboard", "auto");
-                            break;
-                        case "mousedown":
-                        case "default":
-                            this._onInvoke("nodelay", "never");
-                            break;
-                    }
-
-                },
-
-                close: function () {
-                    /// <signature helpKeyword="WinJS.UI.Tooltip.close">
-                    /// <summary locid="WinJS.UI.Tooltip.close">
-                    /// Hids the Tooltip.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-
-                    this._onDismiss();
-                },
-
-                _cleanUpDOM: function () {
-                    if (this._domElement) {
-                        _Dispose.disposeSubTree(this._domElement);
-                        _Global.document.body.removeChild(this._domElement);
-                        this._domElement = null;
-
-                        _Global.document.body.removeChild(this._phantomDiv);
-                        this._phantomDiv = null;
-                    }
-                },
-
-                _createTooltipDOM: function () {
-                    this._cleanUpDOM();
-
-                    this._domElement = _Global.document.createElement("div");
-
-                    var id = _ElementUtilities._uniqueID(this._domElement);
-                    this._domElement.setAttribute("id", id);
-
-                    // Set the direction of tooltip according to anchor element's
-                    var computedStyle = _ElementUtilities._getComputedStyle(this._anchorElement, null);
-                    var elemStyle = this._domElement.style;
-                    elemStyle.direction = computedStyle.direction;
-                    elemStyle.writingMode = computedStyle["writing-mode"]; // must use CSS name, not JS name
-
-                    // Make the tooltip non-focusable
-                    this._domElement.setAttribute("tabindex", -1);
-
-                    // Set the aria tags for accessibility
-                    this._domElement.setAttribute("role", "tooltip");
-                    this._anchorElement.setAttribute("aria-describedby", id);
-
-                    // Set the tooltip content
-                    if (this._lastContentType === "element") { // Last update through contentElement option
-                        this._domElement.appendChild(this._contentElement);
-                    } else { // Last update through innerHTML option
-                        this._domElement.innerHTML = this._innerHTML;
-                    }
-
-                    _Global.document.body.appendChild(this._domElement);
-                    _ElementUtilities.addClass(this._domElement, msTooltip);
-
-                    // In the event of user-assigned classes, add those too
-                    if (this._extraClass) {
-                        _ElementUtilities.addClass(this._domElement, this._extraClass);
-                    }
-
-                    // Create a phantom div on top of the tooltip div to block all interactions
-                    this._phantomDiv = _Global.document.createElement("div");
-                    this._phantomDiv.setAttribute("tabindex", -1);
-                    _Global.document.body.appendChild(this._phantomDiv);
-                    _ElementUtilities.addClass(this._phantomDiv, msTooltipPhantom);
-                    var zIndex = _ElementUtilities._getComputedStyle(this._domElement, null).zIndex + 1;
-                    this._phantomDiv.style.zIndex = zIndex;
-                },
-
-                _raiseEvent: function (type, eventProperties) {
-                    if (this._anchorElement) {
-                        var customEvent = _Global.document.createEvent("CustomEvent");
-                        customEvent.initCustomEvent(type, false, false, eventProperties);
-                        this._anchorElement.dispatchEvent(customEvent);
-                    }
-                },
-
-                // Support for keyboard navigation
-                _captureLastKeyBlurOrPointerOverEvent: function (event) {
-                    this._lastKeyOrBlurEvent = this._currentKeyOrBlurEvent;
-                    switch (event.type) {
-                        case "keyup":
-                            if (event.keyCode === Key.shift) {
-                                this._currentKeyOrBlurEvent = null;
-                            } else {
-                                this._currentKeyOrBlurEvent = "keyboard";
-                            }
-                            break;
-                        case "focusout":
-                            //anchor element no longer in focus, clear up the stack
-                            this._currentKeyOrBlurEvent = null;
-                            break;
-                        default:
-                            break;
-
-                    }
-                },
-
-                _registerEventToListener: function (element, eventType) {
-                    var that = this;
-                    var handler = function (event) {
-                        that._captureLastKeyBlurOrPointerOverEvent(event);
-                        that._handleEvent(event);
-                    };
-                    _ElementUtilities._addEventListener(element, eventType, handler, false);
-
-                    this._eventListenerRemoveStack.push(function () {
-                        _ElementUtilities._removeEventListener(element, eventType, handler, false);
-                    });
-                },
-
-                _events: function () {
-                    for (var eventType in EVENTS_INVOKE) {
-                        this._registerEventToListener(this._anchorElement, eventType);
-                    }
-                    for (var eventType in EVENTS_UPDATE) {
-                        this._registerEventToListener(this._anchorElement, eventType);
-                    }
-                    for (eventType in EVENTS_DISMISS) {
-                        this._registerEventToListener(this._anchorElement, eventType);
-                    }
-                    this._registerEventToListener(this._anchorElement, "contextmenu");
-                    this._registerEventToListener(this._anchorElement, "MSHoldVisual");
-                },
-
-                _handleEvent: function (event) {
-                    var eventType = event._normalizedType || event.type;
-                    if (!this._triggerByOpen) {
-                        // If the anchor element has children, we should ignore events that are caused within the anchor element
-                        // Please note that we are not using event.target here as in bubbling phases from the child, the event target
-                        // is usually the child
-                        if (eventType in EVENTS_BY_CHILD && _ElementUtilities.eventWithinElement(this._anchorElement, event)) {
-                            return;
-                        } else if (isInvokeEvent(eventType, event.pointerType)) {
-                            if (event.pointerType === PT_TOUCH) {
-                                if (!this._isShown) {
-                                    this._showTrigger = "touch";
-                                }
-                                this._onInvoke("touch", "never", event);
-                            } else if (this._skipMouseOver && event.pointerType === PT_MOUSE && eventType === "pointerover") {
-                                // In browsers which use touch (instead of pointer) events, when the user taps their finger on
-                                // an element which has a tooltip, we receive the following sequence of events:
-                                //   - pointerdown (from touchstart; causes the Tooltip to show)
-                                //   - pointerup (from touchend; causes the Tooltip to hide)
-                                //   - pointerover (from mouseover; causes the Tooltip to show)
-                                // At the end, the Tooltip should be hidden but instead it'll be shown due to mouseover coming
-                                // after touchend. To avoid this problem, we use the _skipMouseOver flag to ignore the mouseover
-                                // that follows touchend.
-                                this._skipMouseOver = false;
-                                return;
-                            } else {
-                                var type = eventType.substring(0, 3) === "key" ? "keyboard" : "mouse";
-                                if (!this._isShown) {
-                                    this._showTrigger = type;
-                                }
-                                this._onInvoke(type, "auto", event);
-                            }
-                        } else if (eventType in EVENTS_UPDATE) {
-                            this._contactPoint = { x: event.clientX, y: event.clientY };
-                        } else if (isDismissEvent(eventType, event.pointerType)) {
-                            var eventTrigger;
-                            if (event.pointerType === PT_TOUCH) {
-                                if (eventType === "pointerup") {
-                                    this._skipMouseOver = true;
-                                    var that = this;
-                                    _BaseUtils._yieldForEvents(function () {
-                                        that._skipMouseOver = false;
-                                    });
-                                }
-                                eventTrigger = "touch";
-                            } else {
-                                eventTrigger = eventType.substring(0, 3) === "key" ? "keyboard" : "mouse";
-                            }
-                            if (eventType !== "focusout" && eventTrigger !== this._showTrigger) {
-                                return;
-                            }
-                            this._onDismiss();
-                        } else if (eventType === "contextmenu" || eventType === "MSHoldVisual") {
-                            event.preventDefault();
-                        }
-                    }
-                },
-
-                _onShowAnimationEnd: function () {
-                    if (this._shouldDismiss || this._disposed) {
-                        return;
-                    }
-                    this._raiseEvent("opened");
-                    if (this._domElement) {
-                        if (this._hideDelay !== "never") {
-                            var that = this;
-                            var delay = this._infotip ? Math.min(3 * messageDuration, HIDE_DELAY_MAX) : messageDuration;
-                            this._hideDelayTimer = this._setTimeout(function () {
-                                that._onDismiss();
-                            }, delay);
-                        }
-                    }
-                },
-
-                _onHideAnimationEnd: function () {
-                    _Global.document.body.removeEventListener("DOMNodeRemoved", this._removeTooltip, false);
-                    this._cleanUpDOM();
-                    // Once we remove the tooltip from the DOM, we should remove the aria tag from the anchor
-                    if (this._anchorElement) {
-                        this._anchorElement.removeAttribute("aria-describedby");
-                    }
-                    lastCloseTime = (new Date()).getTime();
-                    this._triggerByOpen = false;
-                    if (!this._disposed) {
-                        this._raiseEvent("closed");
-                    }
-                },
-
-                _decideOnDelay: function (type) {
-                    var value;
-                    this._useAnimation = true;
-
-                    if (type === "nodelay") {
-                        value = 0;
-                        this._useAnimation = false;
-                    } else {
-                        var curTime = (new Date()).getTime();
-                        // If the mouse is moved immediately from another anchor that has
-                        // tooltip open, we should use a shorter delay
-                        if (curTime - lastCloseTime <= RESHOW_THRESHOLD) {
-                            if (type === "touch") {
-                                value = this._infotip ? DELAY_RESHOW_INFOTIP_TOUCH : DELAY_RESHOW_NONINFOTIP_TOUCH;
-                            } else {
-                                value = this._infotip ? DELAY_RESHOW_INFOTIP_NONTOUCH : DELAY_RESHOW_NONINFOTIP_NONTOUCH;
-                            }
-                            this._useAnimation = false;
-                        } else if (type === "touch") {
-                            value = this._infotip ? DELAY_INITIAL_TOUCH_LONG : DELAY_INITIAL_TOUCH_SHORT;
-                        } else {
-                            value = this._infotip ? infoTooltipNonTouchShowDelay : nonInfoTooltipNonTouchShowDelay;
-                        }
-                    }
-                    return value;
-                },
-
-                // This function returns the anchor element's position in the Window coordinates.
-                _getAnchorPositionFromElementWindowCoord: function () {
-                    var rect = this._anchorElement.getBoundingClientRect();
-
-                    return {
-                        x: rect.left,
-                        y: rect.top,
-                        width: rect.width,
-                        height: rect.height
-                    };
-                },
-
-                _getAnchorPositionFromPointerWindowCoord: function (contactPoint) {
-                    return {
-                        x: contactPoint.x,
-                        y: contactPoint.y,
-                        width: 1,
-                        height: 1
-                    };
-                },
-
-                _canPositionOnSide: function (placement, viewport, anchor, tip) {
-                    var availWidth = 0, availHeight = 0;
-
-                    switch (placement) {
-                        case "top":
-                            availWidth = tip.width + this._offset;
-                            availHeight = anchor.y;
-                            break;
-                        case "bottom":
-                            availWidth = tip.width + this._offset;
-                            availHeight = viewport.height - anchor.y - anchor.height;
-                            break;
-                        case "left":
-                            availWidth = anchor.x;
-                            availHeight = tip.height + this._offset;
-                            break;
-                        case "right":
-                            availWidth = viewport.width - anchor.x - anchor.width;
-                            availHeight = tip.height + this._offset;
-                            break;
-                    }
-                    return ((availWidth >= tip.width + this._offset) && (availHeight >= tip.height + this._offset));
-                },
-
-                _positionOnSide: function (placement, viewport, anchor, tip) {
-                    var left = 0, top = 0;
-
-                    switch (placement) {
-                        case "top":
-                        case "bottom":
-                            // Align the tooltip to the anchor's center horizontally
-                            left = anchor.x + anchor.width / 2 - tip.width / 2;
-
-                            // If the left boundary is outside the window, set it to 0
-                            // If the right boundary is outside the window, set it to align with the window right boundary
-                            left = Math.min(Math.max(left, 0), viewport.width - tip.width - SAFETY_NET_GAP);
-
-                            top = (placement === "top") ? anchor.y - tip.height - this._offset : anchor.y + anchor.height + this._offset;
-                            break;
-                        case "left":
-                        case "right":
-                            // Align the tooltip to the anchor's center vertically
-                            top = anchor.y + anchor.height / 2 - tip.height / 2;
-
-                            // If the top boundary is outside the window, set it to 0
-                            // If the bottom boundary is outside the window, set it to align with the window bottom boundary
-                            top = Math.min(Math.max(top, 0), viewport.height - tip.height - SAFETY_NET_GAP);
-
-                            left = (placement === "left") ? anchor.x - tip.width - this._offset : anchor.x + anchor.width + this._offset;
-                            break;
-                    }
-
-                    // Actually set the position
-                    this._domElement.style.left = left + "px";
-                    this._domElement.style.top = top + "px";
-
-                    // Set the phantom's position and size
-                    this._phantomDiv.style.left = left + "px";
-                    this._phantomDiv.style.top = top + "px";
-                    this._phantomDiv.style.width = tip.width + "px";
-                    this._phantomDiv.style.height = tip.height + "px";
-                },
-
-                _position: function (contactType) {
-                    var viewport = { width: 0, height: 0 };
-                    var anchor = { x: 0, y: 0, width: 0, height: 0 };
-                    var tip = { width: 0, height: 0 };
-
-                    viewport.width = _Global.document.documentElement.clientWidth;
-                    viewport.height = _Global.document.documentElement.clientHeight;
-                    if (_ElementUtilities._getComputedStyle(_Global.document.body, null)["writing-mode"] === "tb-rl") {
-                        viewport.width = _Global.document.documentElement.clientHeight;
-                        viewport.height = _Global.document.documentElement.clientWidth;
-                    }
-
-                    if (this._contactPoint && (contactType === "touch" || contactType === "mouse")) {
-                        anchor = this._getAnchorPositionFromPointerWindowCoord(this._contactPoint);
-                    } else {
-                        // keyboard or programmatic is relative to element
-                        anchor = this._getAnchorPositionFromElementWindowCoord();
-                    }
-                    tip.width = this._domElement.offsetWidth;
-                    tip.height = this._domElement.offsetHeight;
-                    var fallback_order = {
-                        "top": ["top", "bottom", "left", "right"],
-                        "bottom": ["bottom", "top", "left", "right"],
-                        "left": ["left", "right", "top", "bottom"],
-                        "right": ["right", "left", "top", "bottom"]
-                    };
-                    if (isLeftHanded) {
-                        fallback_order.top[2] = "right";
-                        fallback_order.top[3] = "left";
-                        fallback_order.bottom[2] = "right";
-                        fallback_order.bottom[3] = "left";
-                    }
-
-                    // Try to position the tooltip according to the placement preference
-                    // We use this order:
-                    // 1. Try the preferred placement
-                    // 2. Try the opposite placement
-                    // 3. If the preferred placement is top or bottom, we should try left
-                    // and right (or right and left if left handed)
-                    // If the preferred placement is left or right, we should try top and bottom
-                    var order = fallback_order[this._placement];
-                    var length = order.length;
-                    for (var i = 0; i < length; i++) {
-                        if (i === length - 1 || this._canPositionOnSide(order[i], viewport, anchor, tip)) {
-                            this._positionOnSide(order[i], viewport, anchor, tip);
-                            break;
-                        }
-                    }
-                    return order[i];
-                },
-
-                _showTooltip: function (contactType) {
-                    // Give a chance to dismiss the tooltip before it starts to show
-                    if (this._shouldDismiss) {
-                        return;
-                    }
-                    this._isShown = true;
-                    this._raiseEvent("beforeopen");
-
-                    // If the anchor is not in the DOM tree, we don't create the tooltip
-                    if (!_Global.document.body.contains(this._anchorElement)) {
-                        return;
-                    }
-                    if (this._shouldDismiss) {
-                        return;
-                    }
-
-                    // If the contentElement is set to null or innerHTML set to null or "", we should NOT show the tooltip
-                    if (this._lastContentType === "element") { // Last update through contentElement option
-                        if (!this._contentElement) {
-                            this._isShown = false;
-                            return;
-                        }
-                    } else { // Last update through innerHTML option
-                        if (!this._innerHTML || this._innerHTML === "") {
-                            this._isShown = false;
-                            return;
-                        }
-                    }
-
-                    var that = this;
-                    this._removeTooltip = function (event) {
-                        var current = that._anchorElement;
-                        while (current) {
-                            if (event.target === current) {
-                                _Global.document.body.removeEventListener("DOMNodeRemoved", that._removeTooltip, false);
-                                that._cleanUpDOM();
-                                break;
-                            }
-                            current = current.parentNode;
-                        }
-                    };
-
-                    _Global.document.body.addEventListener("DOMNodeRemoved", this._removeTooltip, false);
-                    this._createTooltipDOM();
-                    this._position(contactType);
-                    if (this._useAnimation) {
-                        Animations.fadeIn(this._domElement)
-                            .then(this._onShowAnimationEnd.bind(this));
-                    } else {
-                        this._onShowAnimationEnd();
-                    }
-                },
-
-                _onInvoke: function (type, hide, event) {
-                    // Reset the dismiss flag
-                    this._shouldDismiss = false;
-
-                    // If the tooltip is already shown, ignore the current event
-                    if (this._isShown) {
-                        return;
-                    }
-
-                    // To handle keyboard support, we only want to display tooltip on the first tab key event only
-                    if (event && event.type === "keyup") {
-                        if (this._lastKeyOrBlurEvent === "keyboard" ||
-                            !this._lastKeyOrBlurEvent && event.keyCode !== Key.tab) {
-                            return;
-                        }
-                    }
-
-                    // Set the hide delay,
-                    this._hideDelay = hide;
-
-                    this._contactPoint = null;
-                    if (event) { // Open through interaction
-                        this._contactPoint = { x: event.clientX, y: event.clientY };
-                        // Tooltip display offset differently for touch events and non-touch events
-                        if (type === "touch") {
-                            this._offset = OFFSET_TOUCH;
-                        } else if (type === "keyboard") {
-                            this._offset = OFFSET_KEYBOARD;
-                        } else {
-                            this._offset = OFFSET_MOUSE;
-                        }
-                    } else { // Open Programmatically
-                        if (type === "touch") {
-                            this._offset = OFFSET_PROGRAMMATIC_TOUCH;
-                        } else {
-                            this._offset = OFFSET_PROGRAMMATIC_NONTOUCH;
-                        }
-                    }
-
-                    this._clearTimeout(this._delayTimer);
-                    this._clearTimeout(this._hideDelayTimer);
-
-                    // Set the delay time
-                    var delay = this._decideOnDelay(type);
-                    if (delay > 0) {
-                        var that = this;
-                        this._delayTimer = this._setTimeout(function () {
-                            that._showTooltip(type);
-                        }, delay);
-                    } else {
-                        this._showTooltip(type);
-                    }
-                },
-
-                _onDismiss: function () {
-                    // Set the dismiss flag so that we don't miss dismiss events
-                    this._shouldDismiss = true;
-
-                    // If the tooltip is already dismissed, ignore the current event
-                    if (!this._isShown) {
-                        return;
-                    }
-
-                    this._isShown = false;
-
-                    // Reset tooltip state
-                    this._showTrigger = "mouse";
-
-                    if (this._domElement) {
-                        this._raiseEvent("beforeclose");
-                        if (this._useAnimation) {
-                            Animations.fadeOut(this._domElement)
-                                .then(this._onHideAnimationEnd.bind(this));
-                        } else {
-                            this._onHideAnimationEnd();
-                        }
-                    } else {
-                        this._raiseEvent("beforeclose");
-                        this._raiseEvent("closed");
-                    }
-                },
-
-                _setTimeout: function (callback, delay) {
-                    return _Global.setTimeout(callback, delay);
-                },
-
-                _clearTimeout: function (id) {
-                    _Global.clearTimeout(id);
-                }
-            }, {
-
-                _DELAY_INITIAL_TOUCH_SHORT: {
-                    get: function () { return DELAY_INITIAL_TOUCH_SHORT; },
-                },
-
-                _DELAY_INITIAL_TOUCH_LONG: {
-                    get: function () { return DELAY_INITIAL_TOUCH_LONG ; }
-                },
-
-                _DEFAULT_MOUSE_HOVER_TIME: {
-                    get: function () { return DEFAULT_MOUSE_HOVER_TIME; }
-                },
-
-                _DEFAULT_MESSAGE_DURATION: {
-                    get: function () { return DEFAULT_MESSAGE_DURATION; }
-                },
-
-                _DELAY_RESHOW_NONINFOTIP_TOUCH: {
-                    get: function () { return DELAY_RESHOW_NONINFOTIP_TOUCH; }
-                },
-
-                _DELAY_RESHOW_NONINFOTIP_NONTOUCH: {
-                    get: function () { return DELAY_RESHOW_NONINFOTIP_NONTOUCH; }
-                },
-
-                _DELAY_RESHOW_INFOTIP_TOUCH: {
-                    get: function () { return DELAY_RESHOW_INFOTIP_TOUCH; }
-                },
-
-                _DELAY_RESHOW_INFOTIP_NONTOUCH: {
-                    get: function () { return DELAY_RESHOW_INFOTIP_NONTOUCH; }
-                },
-
-                _RESHOW_THRESHOLD: {
-                    get: function () { return RESHOW_THRESHOLD; }
-                },
-
-                _HIDE_DELAY_MAX: {
-                    get: function () { return HIDE_DELAY_MAX; }
-                },
-            });
-        })
-    });
-
-});
-
-define('require-style!less/styles-rating',[],function(){});
-
-define('require-style!less/colors-rating',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/Rating',[
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_ErrorFromName',
-    '../Core/_Events',
-    '../Core/_Resources',
-    '../_Accents',
-    '../Utilities/_Control',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    '../Utilities/_SafeHtml',
-    './Tooltip',
-    'require-style!less/styles-rating',
-    'require-style!less/colors-rating'
-], function ratingInit(_Global, _Base, _ErrorFromName, _Events, _Resources, _Accents, _Control, _ElementUtilities, _Hoverable, _SafeHtml, Tooltip) {
-    "use strict";
-
-    _Accents.createAccentRule(".win-rating .win-star.win-user.win-full, .win-rating .win-star.win-user.win-full.win-disabled", [{ name: "color", value: _Accents.ColorTypes.accent }]);
-
-    // Rating control implementation
-    _Base.Namespace.define("WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.Rating">
-        /// The Rating control allows users to give a number on a scale of 1 to maxRating (5 is the default).
-        /// </summary>
-        /// <compatibleWith platform="Windows" minVersion="8.0"/>
-        /// </field>
-        /// <icon src="ui_winjs.ui.rating.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.rating.16x16.png" width="16" height="16" />
-        /// <htmlSnippet><![CDATA[<div data-win-control="WinJS.UI.Rating"></div>]]></htmlSnippet>
-        /// <event name="previewchange" bubbles="false" locid="WinJS.UI.Rating_e:previewchange">Raised when the user chooses a new tentative rating but hasn't commited the change.</event>
-        /// <event name="cancel" bubbles="false" locid="WinJS.UI.Rating_e:cancel">Raised when the user finishes interacting with the rating control without committing a tentative rating.</event>
-        /// <event name="change" bubbles="false" locid="WinJS.UI.Rating_e:change">Raised when the user commits a change to the userRating.</event>
-        /// <part name="rating" class="win-rating" locid="WinJS.UI.Rating_part:rating">The entire Rating control.</part>
-        /// <part name="average-empty" class="win-star win-average win-empty" locid="WinJS.UI.Rating_part:average-empty">The empty star when the Rating control shows the average rating.</part>
-        /// <part name="average-full" class="win-star win-average win-full" locid="WinJS.UI.Rating_part:average-full">The full star when the Rating control shows the average rating.</part>
-        /// <part name="user-empty" class="win-star win-user win-empty" locid="WinJS.UI.Rating_part:user-empty">The empty star when the Rating control shows the user rating.</part>
-        /// <part name="user-full" class="win-star win-user win-full" locid="WinJS.UI.Rating_part:user-full">The full star when the Rating control shows the user rating.</part>
-        /// <part name="tentative-empty" class="win-star win-tentative win-empty" locid="WinJS.UI.Rating_part:tentative-empty">The empty star when the Rating control shows the tentative rating.</part>
-        /// <part name="tentative-full" class="win-star win-tentative win-full" locid="WinJS.UI.Rating_part:tentative-full">The full star when the Rating control shows the tentative rating.</part>
-        /// <part name="disabled-empty" class="win-star win-disabled win-empty" locid="WinJS.UI.Rating_part:disabled-empty">The empty star when the control is disabled.</part>
-        /// <part name="disabled-full" class="win-star win-disabled win-full" locid="WinJS.UI.Rating_part:disabled-full">The full star when the control is disabled.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        Rating: _Base.Namespace._lazy(function () {
-            var createEvent = _Events._createEventProperty;
-
-            var strings = {
-                get averageRating() { return _Resources._getWinJSString("ui/averageRating").value; },
-                get clearYourRating() { return _Resources._getWinJSString("ui/clearYourRating").value; },
-                get tentativeRating() { return _Resources._getWinJSString("ui/tentativeRating").value; },
-                get tooltipStringsIsInvalid() { return "Invalid argument: tooltipStrings must be null or an array of strings."; },
-                get unrated() { return _Resources._getWinJSString("ui/unrated").value; },
-                get userRating() { return _Resources._getWinJSString("ui/userRating").value; },
-            };
-
-            // Constants definition
-            var DEFAULT_MAX_RATING = 5,
-                DEFAULT_DISABLED = false,
-                CANCEL = "cancel",
-                CHANGE = "change",
-                PREVIEW_CHANGE = "previewchange",
-                MOUSE_LBUTTON = 0, // Event attribute to indicate a mouse left click
-                PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || "touch", // Pointer type to indicate a touch event
-                PT_PEN = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_PEN || "pen", // Pointer type to indicate a pen event
-                PT_MOUSE = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_MOUSE || "mouse"; // Pointer type to indicate a mouse event
-
-            var hiddenAverageRatingCss = "padding-left: 0px; padding-right: 0px; border-left: 0px; border-right: 0px; -ms-flex: none; -webkit-flex: none; flex: none; display: none";
-
-            // CSS class names
-            var msRating = "win-rating",
-                msRatingEmpty = "win-star win-empty",
-                msRatingAverageEmpty = "win-star win-average win-empty",
-                msRatingAverageFull = "win-star win-average win-full",
-                msRatingUserEmpty = "win-star win-user win-empty",
-                msRatingUserFull = "win-star win-user win-full",
-                msRatingTentativeEmpty = "win-star win-tentative win-empty",
-                msRatingTentativeFull = "win-star win-tentative win-full",
-                msRatingDisabled = "win-disabled",
-                msAverage = "win-average",
-                msUser = "win-user";
-
-            return _Base.Class.define(function Rating_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.Rating.Rating">
-                /// <summary locid="WinJS.UI.Rating.constructor">
-                /// Creates a new Rating.
-                /// </summary>
-                /// <param name="element" domElement="true" locid="WinJS.UI.Rating.constructor_p:element">
-                /// The DOM element that hosts the new Rating.
-                /// </param>
-                /// <param name="options" type="Object" locid="WinJS.UI.Rating.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// Event names must begin with "on". For example, to provide a handler for the cancel event,
-                /// add a property named "oncancel" to the options object and set its value to the event handler.
-                /// This parameter is optional.
-                /// </param>
-                /// <returns type="WinJS.UI.Rating" locid="WinJS.UI.Rating.constructor_returnValue">
-                /// The new Rating.
-                /// </returns>
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </signature>
-                this._disposed = false;
-
-                element = element || _Global.document.createElement("div");
-                options = options || {};
-                this._element = element;
-                _ElementUtilities.addClass(this._element, "win-disposable");
-
-                //initialize properties with default value
-                this._userRating = 0;
-                this._averageRating = 0;
-                this._disabled = DEFAULT_DISABLED;
-                this._enableClear = true;
-                this._tooltipStrings = [];
-
-                this._controlUpdateNeeded = false;
-                this._setControlSize(options.maxRating);
-                if (!options.tooltipStrings) {
-                    this._updateTooltips(null);
-                }
-                _Control.setOptions(this, options);
-                this._controlUpdateNeeded = true;
-                this._forceLayout();
-
-                // Register for notification when we are added to DOM
-                _ElementUtilities._addInsertedNotifier(this._element);
-
-                // Remember ourselves
-                element.winControl = this;
-                this._events();
-            }, {
-                /// <field type="Number" integer="true" locid="WinJS.UI.Rating.maxRating" helpKeyword="WinJS.UI.Rating.maxRating">
-                /// Gets or sets the maximum possible rating value. The default is 5.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                maxRating: {
-                    get: function () {
-                        return this._maxRating;
-                    },
-                    set: function (value) {
-                        this._setControlSize(value);
-                        this._forceLayout();
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.Rating.userRating" helpKeyword="WinJS.UI.Rating.userRating">
-                /// Gets or sets the user's rating. This value must be between greater than or equal to zero and less than or equal to the maxRating.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                userRating: {
-                    get: function () {
-                        return this._userRating;
-                    },
-                    set: function (value) {
-                        // Coerce value to a positive integer between 0 and maxRating
-                        this._userRating = Math.max(0, Math.min(Number(value) >> 0, this._maxRating));
-                        this._updateControl();
-                    }
-                },
-
-                /// <field type="Number" locid="WinJS.UI.Rating.averageRating" helpKeyword="WinJS.UI.Rating.averageRating">
-                /// Gets or sets the average rating as a float value. This value must be [equal to zero] OR [greater than or equal to 1 AND less than or equal to the maxRating].
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                averageRating: {
-                    get: function () {
-                        return this._averageRating;
-                    },
-                    set: function (value) {
-                        // Coerce value to either 0 or a positive float between 1 and maxRating
-                        this._averageRating = (Number(value) < 1) ? 0 : Math.min(Number(value) || 0, this._maxRating);
-                        if (this._averageRatingElement) { // After the control has been created..
-                            this._ensureAverageMSStarRating(); // ..ensure correct msStarRating is given to 'average-rating' star.
-                        }
-                        this._updateControl();
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.Rating.disabled" helpKeyword="WinJS.UI.Rating.disabled">
-                /// Gets or sets a value that specifies whether the control is disabled. When the control is disabled, the user can't specify a
-                /// new rating or modify an existing rating.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                disabled: {
-                    get: function () {
-                        return this._disabled;
-                    },
-                    set: function (value) {
-                        this._disabled = !!value;
-                        if (this._disabled) {
-                            this._clearTooltips();
-                        }
-                        this._updateTabIndex();
-                        this._updateControl();
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.Rating.enableClear" helpKeyword="WinJS.UI.Rating.enableClear">
-                /// Gets or sets whether the control lets the user clear the rating.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                enableClear: {
-                    get: function () {
-                        return this._enableClear;
-                    },
-                    set: function (value) {
-                        this._enableClear = !!value;
-                        this._setAriaValueMin();
-                        this._updateControl();
-                    }
-                },
-
-                /// <field type="Array" locid="WinJS.UI.Rating.tooltipStrings" helpKeyword="WinJS.UI.Rating.tooltipStrings">
-                /// Gets or sets a set of descriptions to show for rating values in the tooltip. The array must
-                /// contain a string for each available rating value, and it can contain an optional string
-                /// (at the end of the array) for the clear rating option.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                tooltipStrings: {
-                    get: function () {
-                        return this._tooltipStrings;
-                    },
-                    set: function (value) {
-                        if (typeof value !== "object") {
-                            throw new _ErrorFromName("WinJS.UI.Rating.TooltipStringsIsInvalid", strings.tooltipStringsIsInvalid);
-                        }
-                        this._updateTooltips(value);
-                        this._updateAccessibilityRestState();
-                    }
-                },
-
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.Rating.element" helpKeyword="WinJS.UI.Rating.element">
-                /// Gets the DOM element that hosts the Rating.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.Rating.oncancel" helpKeyword="WinJS.UI.Rating.oncancel">
-                /// Raised when the user finishes interacting with the rating control without committing a tentative rating.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                oncancel: createEvent(CANCEL),
-
-                /// <field type="Function" locid="WinJS.UI.Rating.onchange" helpKeyword="WinJS.UI.Rating.onchange">
-                /// Raised when the user commits a change to the userRating.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                onchange: createEvent(CHANGE),
-
-                /// <field type="Function" locid="WinJS.UI.Rating.onpreviewchange" helpKeyword="WinJS.UI.Rating.onpreviewchange">
-                /// Raised when the user is choosing a new tentative Rating.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                onpreviewchange: createEvent(PREVIEW_CHANGE),
-
-                dispose: function () {
-                    /// <signature helpKeyword="WinJS.UI.Rating.dispose">
-                    /// <summary locid="WinJS.UI.Rating.dispose">
-                    /// Disposes this Rating.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._disposed = true;
-
-                    for (var i = 0; i < this._toolTips.length; i++) {
-                        this._toolTips[i].dispose();
-                    }
-                    this._toolTips = null;
-                },
-
-                addEventListener: function (eventName, eventCallBack, capture) {
-                    /// <signature helpKeyword="WinJS.UI.Rating.addEventListener">
-                    /// <summary locid="WinJS.UI.Rating.addEventListener">
-                    /// Registers an event handler for the specified event.
-                    /// </summary>
-                    /// <param name="eventName" type="String" locid="WinJS.UI.Rating.addEventListener_p:eventName">The name of the event.</param>
-                    /// <param name="eventCallback" type="Function" locid="WinJS.UI.Rating.addEventListener_p:eventCallback">The event handler function to associate with this event.</param>
-                    /// <param name="capture" type="Boolean" locid="WinJS.UI.Rating.addEventListener_p:capture">Set to true to register the event handler for the capturing phase; set to false to register for the bubbling phase.</param>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-
-                    this._element.addEventListener(eventName, eventCallBack, capture);
-                },
-
-                removeEventListener: function (eventName, eventCallBack, capture) {
-                    /// <signature helpKeyword="WinJS.UI.Rating.removeEventListener">
-                    /// <summary locid="WinJS.UI.Rating.removeEventListener">
-                    /// Unregisters an event handler for the specified event.
-                    /// </summary>
-                    /// <param name="eventName" type="String" locid="WinJS.UI.Rating.removeEventListener_p:eventName">The name of the event.</param>
-                    /// <param name="eventCallback" type="Function" locid="WinJS.UI.Rating.removeEventListener_p:eventCallback">The event handler function to remove.</param>
-                    /// <param name="capture" type="Boolean" locid="WinJS.UI.Rating.removeEventListener_p:capture">Set to true to unregister the event handler for the capturing phase; otherwise, set to false to unregister the event handler for the bubbling phase.</param>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-
-                    return this._element.removeEventListener(eventName, eventCallBack, capture);
-                },
-
-                _forceLayout: function () {
-                    if (!this._controlUpdateNeeded) {
-                        return;
-                    }
-
-                    // Disable incremental update during redraw, postpone till all properties set
-                    var updateNeeded = false;
-                    this._updateControl = function () {
-                        updateNeeded = true;
-                    };
-
-                    // Coerce userRating and averageRating to conform to maxRating
-                    this.userRating = this._userRating;
-                    this.averageRating = this._averageRating;
-
-                    // Reset properties
-                    this._lastEventWasChange = false;
-                    this._lastEventWasCancel = false;
-                    this._tentativeRating = -1;
-                    this._captured = false;
-                    this._pointerDownFocus = false;
-                    this._elements = [];
-                    this._toolTips = [];
-                    this._clearElement = null;
-
-                    // Element that is used for showing average rating
-                    this._averageRatingElement = null;
-                    this._elementWidth = null;
-                    this._elementPadding = null;
-                    this._elementBorder = null;
-                    this._floatingValue = 0;
-
-                    this._createControl();
-                    this._setAccessibilityProperties();
-
-                    delete this._updateControl;
-                    if (updateNeeded) {
-                        this._updateControl();
-                    }
-
-                },
-
-                // Hide the help star if the control is not showing average rating
-                _hideAverageRating: function () {
-                    if (!this._averageRatingHidden) {
-                        this._averageRatingHidden = true;
-                        this._averageRatingElement.style.cssText = hiddenAverageRatingCss;
-                    }
-                },
-
-                _createControl: function () {
-                    // rating control could have more than one class name
-                    _ElementUtilities.addClass(this._element, msRating);
-
-                    var html = "";
-                    this._averageRatingHidden = true;
-                    // create control
-                    for (var i = 0; i <= this._maxRating; i++) {
-                        if (i === this._maxRating) {
-                            html = html + "<div class='" + msRatingAverageFull + "' style='" + hiddenAverageRatingCss + "'></div>";
-                        } else {
-                            html = html + "<div class='" + msRatingUserEmpty + "'></div>";
-                        }
-                    }
-                    _SafeHtml.setInnerHTMLUnsafe(this._element, html);
-                    var oneStar = this._element.firstElementChild;
-                    var i = 0;
-                    while (oneStar) {
-                        this._elements[i] = oneStar;
-                        if (i < this._maxRating) {
-                            _ElementUtilities.data(oneStar).msStarRating = i + 1;
-                        }
-                        oneStar = oneStar.nextElementSibling;
-                        i++;
-                    }
-                    this._averageRatingElement = this._elements[this._maxRating];
-                    this._ensureAverageMSStarRating();
-
-                    // add focus capability relative to element's position in the document
-                    this._updateTabIndex();
-                },
-
-                _setAriaValueMin: function () {
-                    this._element.setAttribute("aria-valuemin", this._enableClear ? 0 : 1);
-                },
-
-                _setAccessibilityProperties: function () {
-                    this._element.setAttribute("role", "slider");
-                    this._element.setAttribute("aria-valuemax", this._maxRating);
-                    this._setAriaValueMin();
-                    this._updateAccessibilityRestState();
-                },
-
-                _getText: function (number) {
-                    var string = this._tooltipStrings[number];
-                    if (string) {
-                        var tempDiv = _Global.document.createElement("div");
-                        tempDiv.innerHTML = string;
-                        return tempDiv.textContent;
-                    } else if (number === this._maxRating) {
-                        return strings.clearYourRating;
-                    } else {
-                        return number + 1;
-                    }
-                },
-
-                _updateAccessibilityRestState: function () {
-                    var element = this._element;
-                    this._ariaValueNowMutationObserver && this._ariaValueNowMutationObserver.disconnect();
-                    element.setAttribute("aria-readOnly", this._disabled);
-
-                    if (this._userRating !== 0) {
-                        element.setAttribute("aria-valuenow", this._userRating);
-                        element.setAttribute("aria-label", strings.userRating);
-                        element.setAttribute("aria-valuetext", this._getText(this._userRating - 1));
-                    } else if (this._averageRating !== 0) {
-                        element.setAttribute("aria-valuenow", this._averageRating);
-                        element.setAttribute("aria-label", strings.averageRating);
-                        element.setAttribute("aria-valuetext", this._averageRating);
-                    } else {
-                        element.setAttribute("aria-valuenow", strings.unrated);
-                        element.setAttribute("aria-label", strings.userRating);
-                        element.setAttribute("aria-valuetext", strings.unrated);
-                    }
-
-                    this._ariaValueNowMutationObserver && this._ariaValueNowMutationObserver.observe(this._element, { attributes: true, attributeFilter: ["aria-valuenow"] });
-                },
-
-                _updateAccessibilityHoverState: function () {
-                    var element = this._element;
-                    this._ariaValueNowMutationObserver && this._ariaValueNowMutationObserver.disconnect();
-                    element.setAttribute("aria-readOnly", this._disabled);
-
-                    if (this._tentativeRating > 0) {
-                        element.setAttribute("aria-label", strings.tentativeRating);
-                        element.setAttribute("aria-valuenow", this._tentativeRating);
-                        element.setAttribute("aria-valuetext", this._getText(this._tentativeRating - 1));
-                    } else if (this._tentativeRating === 0) {
-                        element.setAttribute("aria-valuenow", strings.unrated);
-                        element.setAttribute("aria-label", strings.tentativeRating);
-                        element.setAttribute("aria-valuetext", this._getText(this._maxRating));
-                    } else {
-                        //shouldn't get here
-                        element.setAttribute("aria-valuenow", strings.unrated);
-                        element.setAttribute("aria-label", strings.tentativeRating);
-                        element.setAttribute("aria-valuetext", strings.unrated);
-                    }
-
-                    this._ariaValueNowMutationObserver && this._ariaValueNowMutationObserver.observe(this._element, { attributes: true, attributeFilter: ["aria-valuenow"] });
-                },
-
-                _ensureTooltips: function () {
-                    if (this.disabled) {
-                        return;
-                    }
-
-                    if (this._toolTips.length === 0) {
-                        for (var i = 0; i < this._maxRating; i++) {
-                            this._toolTips[i] = new Tooltip.Tooltip(this._elements[i]);
-                        }
-                    }
-                },
-
-                // decrement tentative rating by one
-                _decrementRating: function () {
-                    this._closeTooltip();
-                    var firePreviewChange = true;
-                    if (this._tentativeRating <= 0) {
-                        firePreviewChange = false;
-                    } else {
-                        if (this._tentativeRating > 0) {
-                            this._tentativeRating--;
-                        } else if (this._tentativeRating === -1) {
-                            if (this._userRating !== 0) {
-                                if (this._userRating > 0) {
-                                    this._tentativeRating = this._userRating - 1;
-                                } else {
-                                    this._tentativeRating = 0;
-                                }
-                            } else {
-                                this._tentativeRating = 0;
-                            }
-                        }
-
-                        if ((this._tentativeRating === 0) && !this._enableClear) {
-                            this._tentativeRating = 1;
-                            firePreviewChange = false;
-                        }
-                    }
-
-                    this._showTentativeRating(firePreviewChange, "keyboard");
-                },
-
-                _events: function () {
-                    var that = this;
-                    function ratingHandler(eventName) {
-                        return {
-                            name: eventName,
-                            lowerCaseName: eventName.toLowerCase(),
-                            handler: function (event) {
-                                var fn = that["_on" + eventName];
-                                if (fn) {
-                                    fn.apply(that, [event]);
-                                }
-                            }
-                        };
-                    }
-
-                    var eventsRegisteredInLowerCase = [
-                            ratingHandler("KeyDown"),
-                            ratingHandler("FocusOut"),
-                            ratingHandler("FocusIn"),
-                            ratingHandler("PointerCancel"),
-                            ratingHandler("PointerDown"),
-                            ratingHandler("PointerMove"),
-                            ratingHandler("PointerOver"),
-                            ratingHandler("PointerUp"),
-                            ratingHandler("PointerOut")
-                    ];
-                    var events = [
-                        ratingHandler("WinJSNodeInserted")
-                    ];
-
-                    var i;
-                    for (i = 0; i < eventsRegisteredInLowerCase.length; ++i) {
-                        _ElementUtilities._addEventListener(this._element, eventsRegisteredInLowerCase[i].lowerCaseName, eventsRegisteredInLowerCase[i].handler, false);
-                    }
-                    for (i = 0; i < events.length; ++i) {
-                        this._element.addEventListener(events[i].name, events[i].handler, false);
-                    }
-
-                    this._ariaValueNowMutationObserver = new _ElementUtilities._MutationObserver(this._ariaValueNowChanged.bind(this));
-                    this._ariaValueNowMutationObserver.observe(this._element, { attributes: true, attributeFilter: ["aria-valuenow"] });
-                },
-
-                _onWinJSNodeInserted: function () {
-                    this._recalculateStarProperties();
-                    this._updateControl();
-                },
-
-                _recalculateStarProperties: function () {
-                    var j = 0;
-                    // If the average rating is 1 we do not have correct padding on the first star so we are reading it from the second star
-                    // When we create average rating star we are creating it from 2 divs - stars. The first one is the average rating star the second one is the regular rating star.
-                    // If the average rating is 1 we are creating that rating on the following way - The first part of star
-                    // (without right padding, right border) is average rating star - the second part is regular star that does not have left padding and left border anymore
-                    // (we set on 0 to create average rating star). In that situation the average rating star has correct left padding and left border.
-                    if (this._averageRating === 1) {
-                        j = 1;
-                    }
-                    var style = _ElementUtilities._getComputedStyle(this._elements[j]);
-                    this._elementWidth = style.width;
-                    if (_ElementUtilities._getComputedStyle(this._element).direction === "rtl") {
-                        this._elementPadding = style.paddingRight;
-                        this._elementBorder = style.borderRight;
-                    } else {
-                        this._elementPadding = style.paddingLeft;
-                        this._elementBorder = style.borderLeft;
-                    }
-                },
-
-                // Hide the help star if the control is not showing average rating
-                _hideAverageStar: function () {
-                    // check if this average rating control
-                    if (this._averageRating !== 0) {
-                        // hide the empty star
-                        this._resetAverageStar(false);
-                    }
-                },
-
-                // increase tentative rating by one
-                _incrementRating: function () {
-                    this._closeTooltip();
-                    var firePreviewChange = true;
-                    if (this._tentativeRating < 0 || this._tentativeRating >= this._maxRating) {
-                        firePreviewChange = false;
-                    }
-
-                    if (this._tentativeRating !== -1) {
-                        if (this._tentativeRating < this._maxRating) {
-                            this._tentativeRating++;
-                        }
-                    } else {
-                        if (this._userRating !== 0) {
-                            if (this._userRating < this._maxRating) {
-                                this._tentativeRating = this._userRating + 1;
-                            } else {
-                                this._tentativeRating = this._maxRating;
-                            }
-                        } else {
-                            this._tentativeRating = 1;
-                        }
-                    }
-                    this._showTentativeRating(firePreviewChange, "keyboard");
-                },
-
-                _ariaValueNowChanged: function () {
-                    if (!this._disabled) {
-                        var attrNode = this._element.getAttributeNode("aria-valuenow");
-                        if (attrNode !== null) {
-                            var value = Number(attrNode.nodeValue);
-                            if (this.userRating !== value) {
-                                this.userRating = value;
-                                this._tentativeRating = this._userRating;
-                                this._raiseEvent(CHANGE, this._userRating);
-                            }
-                        }
-                    }
-                },
-
-                _onPointerCancel: function () {
-                    this._showCurrentRating();
-                    if (!this._lastEventWasChange) {
-                        this._raiseEvent(CANCEL, null);
-                    }
-                    this._captured = false;
-                },
-
-                _onPointerDown: function (eventObject) {
-                    if (eventObject.pointerType === PT_MOUSE && eventObject.button !== MOUSE_LBUTTON) {
-                        return; // Ignore any mouse clicks that are not left clicks.
-                    }
-                    if (!this._captured) { // Rating Control does not support multi-touch, ignore mspointerdown messages if the control already has capture.
-                        this._pointerDownAt = { x: eventObject.clientX, y: eventObject.clientY };
-                        this._pointerDownFocus = true;
-                        if (!this._disabled) {
-                            // Only capture the event when active to support block panning
-                            _ElementUtilities._setPointerCapture(this._element, eventObject.pointerId);
-                            this._captured = true;
-
-                            if (eventObject.pointerType === PT_TOUCH) {
-                                this._tentativeRating = _ElementUtilities.data(eventObject.target).msStarRating || 0;
-                                // change states for all stars
-                                this._setStarClasses(msRatingTentativeFull, this._tentativeRating, msRatingTentativeEmpty);
-                                this._hideAverageStar();
-                                this._updateAccessibilityHoverState();
-                                this._openTooltip("touch");
-                                this._raiseEvent(PREVIEW_CHANGE, this._tentativeRating);
-                            } else {
-                                this._openTooltip("mousedown");
-                            }
-                        }
-                    }
-                },
-
-                _onCapturedPointerMove: function (eventObject, tooltipType) {
-                    // Manual hit-test because we capture the pointer
-                    // If the pointer is already down, we use its information.
-                    var pointerAt = this._pointerDownAt || { x: eventObject.clientX, y: eventObject.clientY };
-
-                    var star;
-                    var hit = _ElementUtilities._elementsFromPoint(eventObject.clientX, pointerAt.y);
-                    if (hit) {
-                        for (var i = 0, len = hit.length; i < len; i++) {
-                            var item = hit[i];
-                            if (item.getAttribute("role") === "tooltip") {
-                                return;
-                            }
-                            if (_ElementUtilities.hasClass(item, "win-star")) {
-                                star = item;
-                                break;
-                            }
-                        }
-                    }
-                    var starNum;
-                    if (star && (star.parentElement === this._element)) {
-                        starNum = _ElementUtilities.data(star).msStarRating || 0;
-                    } else {
-                        var left = 0, right = this.maxRating;
-                        if (_ElementUtilities._getComputedStyle(this._element).direction === "rtl") {
-                            left = right;
-                            right = 0;
-                        }
-                        if (eventObject.clientX < pointerAt.x) {
-                            starNum = left;
-                        } else {
-                            starNum = right;
-                        }
-                    }
-
-                    var firePreviewChange = false;
-                    var newTentativeRating = Math.min(Math.ceil(starNum), this._maxRating);
-                    if ((newTentativeRating === 0) && !this._enableClear) {
-                        newTentativeRating = 1;
-                    }
-                    if (newTentativeRating !== this._tentativeRating) {
-                        this._closeTooltip();
-                        firePreviewChange = true;
-                    }
-
-                    this._tentativeRating = newTentativeRating;
-                    this._showTentativeRating(firePreviewChange, tooltipType);
-                    eventObject.preventDefault();
-                },
-
-                _onPointerMove: function (eventObject) {
-                    if (this._captured) {
-                        if (eventObject.pointerType === PT_TOUCH) {
-                            this._onCapturedPointerMove(eventObject, "touch");
-                        } else {
-                            this._onCapturedPointerMove(eventObject, "mousedown");
-                        }
-                    }
-                },
-
-                _onPointerOver: function (eventObject) {
-                    if (!this._disabled && (eventObject.pointerType === PT_PEN || eventObject.pointerType === PT_MOUSE)) {
-                        this._onCapturedPointerMove(eventObject, "mouseover");
-                    }
-                },
-
-                _onPointerUp: function (eventObject) {
-                    if (this._captured) {
-                        _ElementUtilities._releasePointerCapture(this._element, eventObject.pointerId);
-                        this._captured = false;
-                        this._onUserRatingChanged();
-                    }
-                    this._pointerDownAt = null;
-                },
-
-                _onFocusOut: function () {
-                    if (!this._captured) {
-                        this._onUserRatingChanged();
-                        if (!this._lastEventWasChange && !this._lastEventWasCancel) {
-                            this._raiseEvent(CANCEL, null);
-                        }
-                    }
-                },
-
-                _onFocusIn: function () {
-                    if (!this._pointerDownFocus) {
-                        // if the control is read only don't hover stars
-                        if (!this._disabled) {
-                            // change states for all previous stars
-                            // but only if user didnt vote
-                            if (this._userRating === 0) {
-                                for (var i = 0; i < this._maxRating; i++) {
-                                    this._elements[i].className = msRatingTentativeEmpty;
-                                }
-                            }
-                            // hide the help star
-                            this._hideAverageStar();
-                        }
-
-                        if (this._userRating !== 0) {
-                            this._raiseEvent(PREVIEW_CHANGE, this._userRating);
-                        } else {
-                            this._raiseEvent(PREVIEW_CHANGE, 0);
-                        }
-                        this._tentativeRating = this._userRating;
-                    }
-                    this._pointerDownFocus = false;
-                },
-
-                _onKeyDown: function (eventObject) {
-                    var Key = _ElementUtilities.Key;
-                    var keyCode = eventObject.keyCode;
-                    var rtlString = _ElementUtilities._getComputedStyle(this._element).direction;
-                    var handled = true;
-                    switch (keyCode) {
-                        case Key.enter: // Enter
-                            this._onUserRatingChanged();
-                            break;
-                        case Key.tab: //Tab
-                            this._onUserRatingChanged();
-                            handled = false;
-                            break;
-                        case Key.escape: // escape
-                            this._showCurrentRating();
-
-                            if (!this._lastEventWasChange) {
-                                this._raiseEvent(CANCEL, null);
-                            }
-
-                            break;
-                        case Key.leftArrow: // Arrow Left
-                            if (rtlString === "rtl" && this._tentativeRating < this.maxRating) {
-                                this._incrementRating();
-                            } else if (rtlString !== "rtl" && this._tentativeRating > 0) {
-                                this._decrementRating();
-                            } else {
-                                handled = false;
-                            }
-                            break;
-                        case Key.upArrow: // Arrow Up
-                            if (this._tentativeRating < this.maxRating) {
-                                this._incrementRating();
-                            } else {
-                                handled = false;
-                            }
-                            break;
-                        case Key.rightArrow: // Arrow Right
-                            if (rtlString === "rtl" && this._tentativeRating > 0) {
-                                this._decrementRating();
-                            } else if (rtlString !== "rtl" && this._tentativeRating < this.maxRating) {
-                                this._incrementRating();
-                            } else {
-                                handled = false;
-                            }
-                            break;
-                        case Key.downArrow: // Arrow Down
-                            if (this._tentativeRating > 0) {
-                                this._decrementRating();
-                            } else {
-                                handled = false;
-                            }
-                            break;
-                        default:
-                            var number = 0;
-                            if ((keyCode >= Key.num0) && (keyCode <= Key.num9)) {
-                                number = Key.num0;
-                            } else if ((keyCode >= Key.numPad0) && (keyCode <= Key.numPad9)) {
-                                number = Key.numPad0;
-                            }
-
-                            if (number > 0) {
-                                var firePreviewChange = false;
-                                var newTentativeRating = Math.min(keyCode - number, this._maxRating);
-                                if ((newTentativeRating === 0) && !this._enableClear) {
-                                    newTentativeRating = 1;
-                                }
-                                if (newTentativeRating !== this._tentativeRating) {
-                                    this._closeTooltip();
-                                    firePreviewChange = true;
-                                }
-                                this._tentativeRating = newTentativeRating;
-                                this._showTentativeRating(firePreviewChange, "keyboard");
-                            } else {
-                                handled = false;
-                            }
-                            break;
-                    }
-
-                    if (handled) {
-                        eventObject.stopPropagation();
-                        eventObject.preventDefault();
-                    }
-                },
-
-                _onPointerOut: function (eventObject) {
-                    if (!this._captured && !_ElementUtilities.eventWithinElement(this._element, eventObject)) {
-                        this._showCurrentRating();
-                        if (!this._lastEventWasChange) {
-                            // only fire cancel event if we move out of the rating control, and if
-                            // user did not change rating on the control
-                            this._raiseEvent(CANCEL, null);
-                        }
-                    }
-                },
-
-                _onUserRatingChanged: function () {
-                    if (!this._disabled) {
-                        this._closeTooltip();
-                        // Only submit a change event if the user has altered the rating control value via PREVIEWCHANGE event.
-                        if (this._userRating !== this._tentativeRating && !this._lastEventWasCancel && !this._lastEventWasChange) {
-                            this.userRating = this._tentativeRating;
-                            this._raiseEvent(CHANGE, this._userRating);
-                        } else {
-                            this._updateControl();
-                        }
-                    }
-                },
-
-                _raiseEvent: function (eventName, tentativeRating) {
-                    if (!this._disabled) {
-                        this._lastEventWasChange = (eventName === CHANGE);
-                        this._lastEventWasCancel = (eventName === CANCEL);
-                        if (_Global.document.createEvent) {
-                            var event = _Global.document.createEvent("CustomEvent");
-                            event.initCustomEvent(eventName, false, false, { tentativeRating: tentativeRating });
-                            this._element.dispatchEvent(event);
-                        }
-                    }
-                },
-
-                _resetNextElement: function (prevState) {
-                    if (this._averageRatingElement.nextSibling !== null) {
-                        _ElementUtilities._setFlexStyle(this._averageRatingElement.nextSibling, { grow: 1, shrink: 1 });
-                        var style = this._averageRatingElement.nextSibling.style;
-                        var direction = _ElementUtilities._getComputedStyle(this._element).direction;
-                        if (prevState) {
-                            if (direction === "rtl") {
-                                direction = "ltr";
-                            } else {
-                                direction = "rtl";
-                            }
-                        }
-                        if (direction === "rtl") {
-                            style.paddingRight = this._elementPadding;
-                            style.borderRight = this._elementBorder;
-                            style.direction = "rtl";
-                        } else {
-                            style.paddingLeft = this._elementPadding;
-                            style.borderLeft = this._elementBorder;
-                            style.direction = "ltr";
-                        }
-                        style.backgroundPosition = "left";
-                        style.backgroundSize = "100% 100%";
-                        style.width = this._resizeStringValue(this._elementWidth, 1, style.width);
-                    }
-                },
-
-                _resetAverageStar: function (prevState) {
-                    this._resetNextElement(prevState);
-                    this._hideAverageRating();
-                },
-
-                _resizeStringValue: function (string, factor, curString) {
-                    var number = parseFloat(string);
-                    if (isNaN(number)) {
-                        if (curString !== null) {
-                            return curString;
-                        } else {
-                            return string;
-                        }
-                    }
-                    var unit = string.substring(number.toString(10).length);
-                    number = number * factor;
-                    return (number + unit);
-                },
-
-                _setControlSize: function (value) {
-                    // Coerce value to a positive integer between 0 and maxRating
-                    // if negative default to DEFAULT_MAX_RATING
-                    var maxRating = (Number(value) || DEFAULT_MAX_RATING) >> 0;
-                    this._maxRating = maxRating > 0 ? maxRating : DEFAULT_MAX_RATING;
-                },
-
-                _updateTooltips: function (value) {
-                    var i, max = 0;
-                    if (value !== null) {
-                        max = ((value.length <= this._maxRating + 1) ? value.length : this._maxRating + 1);
-                        for (i = 0; i < max; i++) {
-                            this._tooltipStrings[i] = value[i];
-                        }
-                    } else {
-                        for (i = 0; i < this._maxRating; i++) {
-                            this._tooltipStrings[i] = i + 1;
-                        }
-                        this._tooltipStrings[this._maxRating] = strings.clearYourRating;
-                    }
-                },
-
-                _updateTabIndex: function () {
-                    this._element.tabIndex = (this._disabled ? "-1" : "0");
-                },
-
-                _setStarClasses: function (classNameBeforeThreshold, threshold, classNameAfterThreshold) {
-                    for (var i = 0; i < this._maxRating; i++) {
-                        if (i < threshold) {
-                            this._elements[i].className = classNameBeforeThreshold;
-                        } else {
-                            this._elements[i].className = classNameAfterThreshold;
-                        }
-                    }
-                },
-
-                // Average rating star is created from 2 divs:
-                // In the first div the glyph starts from the beginning in the direction of the control
-                // In the second div the glyph starts from the beginning in the opposite direction
-                // That way we are making the average star look like one glyph
-                _updateAverageStar: function () {
-                    var style = this._averageRatingElement.style;
-                    var nextStyle = this._averageRatingElement.nextSibling.style;
-                    if (_ElementUtilities._getComputedStyle(this._element).direction === "rtl") {
-                        style.backgroundPosition = "right";
-                        style.paddingRight = this._elementPadding;
-                        style.borderRight = this._elementBorder;
-                        nextStyle.paddingRight = "0px";
-                        nextStyle.borderRight = "0px";
-                        nextStyle.direction = "ltr";
-                    } else {
-                        style.backgroundPosition = "left";
-                        nextStyle.backgroundPosition = "right";
-                        style.paddingLeft = this._elementPadding;
-                        style.borderLeft = this._elementBorder;
-                        nextStyle.paddingLeft = "0px";
-                        nextStyle.borderLeft = "0px";
-                        nextStyle.direction = "rtl";
-                    }
-                    _ElementUtilities._setFlexStyle(this._averageRatingElement, { grow: this._floatingValue, shrink: this._floatingValue });
-                    style.width = this._resizeStringValue(this._elementWidth, this._floatingValue, style.width);
-                    style.backgroundSize = (100 / this._floatingValue) + "% 100%";
-                    style.display = _ElementUtilities._getComputedStyle(this._averageRatingElement.nextSibling).display;
-                    this._averageRatingHidden = false;
-                    _ElementUtilities._setFlexStyle(this._averageRatingElement.nextSibling, { grow: 1 - this._floatingValue, shrink: 1 - this._floatingValue });
-                    nextStyle.width = this._resizeStringValue(this._elementWidth, 1 - this._floatingValue, nextStyle.width);
-                    nextStyle.backgroundSize = (100 / (1 - this._floatingValue)) + "% 100%";
-                },
-
-                // show current rating
-                _showCurrentRating: function () {
-                    this._closeTooltip();
-                    // reset tentative rating
-                    this._tentativeRating = -1;
-                    // if the control is read only then we didn't change anything on hover
-                    if (!this._disabled) {
-                        this._updateControl();
-                    }
-                    this._updateAccessibilityRestState();
-                },
-
-                _showTentativeRating: function (firePreviewChange, tooltipType) {
-                    // if the control is read only don't hover stars
-                    if ((!this._disabled) && (this._tentativeRating >= 0)) {
-                        this._setStarClasses(msRatingTentativeFull, this._tentativeRating, msRatingTentativeEmpty);
-
-                        // hide the empty star
-                        this._hideAverageStar();
-                    }
-
-                    this._updateAccessibilityHoverState();
-
-                    if (firePreviewChange) {
-                        this._openTooltip(tooltipType);
-                        this._raiseEvent(PREVIEW_CHANGE, this._tentativeRating);
-                    }
-                },
-
-                _openTooltip: function (tooltipType) {
-                    if (this.disabled) {
-                        return;
-                    }
-
-                    this._ensureTooltips();
-                    if (this._tentativeRating > 0) {
-                        this._toolTips[this._tentativeRating - 1].innerHTML = this._tooltipStrings[this._tentativeRating - 1];
-                        this._toolTips[this._tentativeRating - 1].open(tooltipType);
-                    } else if (this._tentativeRating === 0) {
-                        this._clearElement = _Global.document.createElement("div");
-                        var distance = this._elements[0].offsetWidth + parseInt(this._elementPadding, 10);
-                        if (_ElementUtilities._getComputedStyle(this._element).direction === "ltr") {
-                            distance *= -1;
-                        }
-                        this._clearElement.style.cssText = "visiblity:hidden; position:absolute; width:0px; height:100%; left:" + distance + "px; top:0px;";
-                        this._elements[0].appendChild(this._clearElement);
-                        this._toolTips[this._maxRating] = new Tooltip.Tooltip(this._clearElement);
-                        this._toolTips[this._maxRating].innerHTML = this._tooltipStrings[this._maxRating];
-                        this._toolTips[this._maxRating].open(tooltipType);
-                    }
-                },
-
-                _closeTooltip: function () {
-                    if (this._toolTips.length !== 0) {
-                        if (this._tentativeRating > 0) {
-                            this._toolTips[this._tentativeRating - 1].close();
-                        } else if (this._tentativeRating === 0) {
-                            if (this._clearElement !== null) {
-                                this._toolTips[this._maxRating].close();
-                                this._elements[0].removeChild(this._clearElement);
-                                this._clearElement = null;
-                            }
-                        }
-                    }
-                },
-
-                _clearTooltips: function () {
-                    if (this._toolTips && this._toolTips.length !== 0) {
-                        for (var i = 0; i < this._maxRating; i++) {
-                            this._toolTips[i].innerHTML = null;
-                        }
-                    }
-                },
-
-                _appendClass: function (classNameToBeAdded) {
-                    for (var i = 0; i <= this._maxRating; i++) {
-                        _ElementUtilities.addClass(this._elements[i], classNameToBeAdded);
-                    }
-                },
-
-                _setClasses: function (classNameBeforeThreshold, threshold, classNameAfterThreshold) {
-                    for (var i = 0; i < this._maxRating; i++) {
-                        if (i < threshold) {
-                            this._elements[i].className = classNameBeforeThreshold;
-                        } else {
-                            this._elements[i].className = classNameAfterThreshold;
-                        }
-                    }
-                },
-
-                _ensureAverageMSStarRating: function () {
-                    _ElementUtilities.data(this._averageRatingElement).msStarRating = Math.ceil(this._averageRating);
-                },
-
-                _updateControl: function () {
-                    if (!this._controlUpdateNeeded) {
-                        return;
-                    }
-
-                    // check for average rating (if user rating is specified then we are not showing average rating)
-                    if ((this._averageRating !== 0) && (this._userRating === 0)) {
-                        if ((this._averageRating >= 1) && (this._averageRating <= this._maxRating)) { // Display average rating
-                            this._setClasses(msRatingAverageFull, this._averageRating - 1, msRatingAverageEmpty);
-                            this._averageRatingElement.className = msRatingAverageFull;
-
-                            for (var i = 0; i < this._maxRating; i++) {
-                                // check if it is average star
-                                if ((i < this._averageRating) && ((i + 1) >= this._averageRating)) {
-                                    this._resetNextElement(false);
-
-                                    this._element.insertBefore(this._averageRatingElement, this._elements[i]);
-
-                                    this._floatingValue = this._averageRating - i;
-                                    var elementStyle = _ElementUtilities._getComputedStyle(this._elements[i]);
-                                    this._elementWidth = elementStyle.width;
-
-                                    if (_ElementUtilities._getComputedStyle(this._element).direction === "rtl") {
-                                        this._elementPadding = elementStyle.paddingRight;
-                                        this._elementBorder = elementStyle.borderRight;
-                                    } else {
-                                        this._elementPadding = elementStyle.paddingLeft;
-                                        this._elementBorder = elementStyle.borderLeft;
-                                    }
-
-                                    this._updateAverageStar();
-                                }
-                            }
-                        }
-                    }
-
-                    // check if it is user rating control
-                    if (this._userRating !== 0) {
-                        if ((this._userRating >= 1) && (this._userRating <= this._maxRating)) { // Display user rating.
-                            this._setClasses(msRatingUserFull, this._userRating, msRatingUserEmpty);
-
-                            // hide average star
-                            this._resetAverageStar(false);
-                        }
-                    }
-
-                    // update stars if the rating is not set
-                    if ((this._userRating === 0) && (this._averageRating === 0)) { // Display empty rating
-                        this._setClasses(msRatingEmpty, this._maxRating);
-
-                        // hide average star
-                        this._resetAverageStar(false);
-                    }
-
-                    if (this.disabled) { // Display disabled rating.
-                        this._appendClass(msRatingDisabled);
-                    }
-
-                    // update classes to differentiate average rating vs user rating
-                    // If the userRating is 0 and averageRating is 0 we would like to treat that rating control as user rating control (not as average rating control).
-                    if ((this._averageRating !== 0) && (this._userRating === 0)) {
-                        this._appendClass(msAverage);
-                    } else {
-                        this._appendClass(msUser);
-                    }
-
-                    this._updateAccessibilityRestState();
-                }
-            });
-        })
-    });
-
-});
-
-
-define('require-style!less/styles-toggleswitch',[],function(){});
-
-define('require-style!less/colors-toggleswitch',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ToggleSwitch',[
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_Events',
-    '../Core/_Resources',
-    '../_Accents',
-    '../Utilities/_Control',
-    '../Utilities/_ElementUtilities',
-    'require-style!less/styles-toggleswitch',
-    'require-style!less/colors-toggleswitch'
-    ],
-    function toggleInit(_Global, _Base, _BaseUtils, _Events, _Resources, _Accents, _Control, _ElementUtilities) {
-        "use strict";
-        
-        _Accents.createAccentRule(".win-toggleswitch-on .win-toggleswitch-track", [{ name: "background-color", value: _Accents.ColorTypes.accent }]);
-        _Accents.createAccentRule("html.win-hoverable .win-toggleswitch-on:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track", [{ name: "background-color", value: _Accents.ColorTypes.listSelectPress }]);
-
-        _Base.Namespace.define("WinJS.UI", {
-            /// <field>
-            /// <summary locid="WinJS.UI.ToggleSwitch">
-            /// A control that lets the user switch an option on or off.
-            /// </summary>
-            /// </field>
-            /// <icon src="ui_winjs.ui.toggleswitch.12x12.png" width="12" height="12" />
-            /// <icon src="ui_winjs.ui.toggleswitch.16x16.png" width="16" height="16" />
-            /// <htmlSnippet><![CDATA[<div data-win-control="WinJS.UI.ToggleSwitch"></div>]]></htmlSnippet>
-            /// <event name="change" bubbles="true" locid="WinJS.UI.ToggleSwitch_e:change">Raised when the switch is flipped to on (checked is set to true) or off (checked is set to false). </event>
-            /// <part name="toggle" class="win-toggleswitch" locid="WinJS.UI.ToggleSwitch_part:toggle">The entire ToggleSwitch control.</part>
-            /// <part name="track" class="win-toggleswitch-track" locid="WinJS.UI.ToggleSwitch_part:track">The slider portion of the toggle.</part>
-            /// <part name="thumb" class="win-toggleswitch-thumb" locid="WinJS.UI.ToggleSwitch_part:thumb">The thumb of the slider.</part>
-            /// <part name="title" class="win-toggleswitch-header" locid="WinJS.UI.ToggleSwitch_part:title">The main text for the ToggleSwitch control.</part>
-            /// <part name="label-on" class="win-toggleswitch-value" locid="WinJS.UI.ToggleSwitch_part:label-on">The text for when the switch is on.</part>
-            /// <part name="label-off" class="win-toggleswitch-value" locid="WinJS.UI.ToggleSwitch_part:label-off:">The text for when the switch is off.</part>
-            /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-            /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-            ToggleSwitch: _Base.Namespace._lazy(function () {
-
-                // Store some class names
-                var classContainer = 'win-toggleswitch';
-                var classHeader = 'win-toggleswitch-header';
-                var classClick = 'win-toggleswitch-clickregion';
-                var classTrack = 'win-toggleswitch-track';
-                var classThumb = 'win-toggleswitch-thumb';
-                var classValues = 'win-toggleswitch-values';
-                var classValue = 'win-toggleswitch-value';
-                var classValueOn = 'win-toggleswitch-value-on';
-                var classValueOff = 'win-toggleswitch-value-off';
-                var classDescription = 'win-toggleswitch-description';
-                var classOn = 'win-toggleswitch-on';
-                var classOff = 'win-toggleswitch-off';
-                var classDisabled = 'win-toggleswitch-disabled';
-                var classEnabled = 'win-toggleswitch-enabled';
-                var classDragging = 'win-toggleswitch-dragging';
-                var classPressed = 'win-toggleswitch-pressed';
-
-                // Localized  strings
-                var strings = {
-                    get on() {
-                        return _Resources._getWinJSString("ui/on").value;
-                    },
-                    get off() {
-                        return _Resources._getWinJSString("ui/off").value;
-                    },
-                };
-
-                // Define the ToggleSwitch class
-                var Toggle = _Base.Class.define(function ToggleSwitch_ctor(element, options) {
-                    /// <signature helpKeyword="WinJS.UI.ToggleSwitch.ToggleSwitch">
-                    /// <summary locid="WinJS.UI.ToggleSwitch.constructor">
-                    /// Creates a new ToggleSwitch.
-                    /// </summary>
-                    /// <param name="element" domElement="true" locid="WinJS.UI.ToggleSwitch.constructor_p:element">
-                    /// The DOM element that hosts the ToggleSwitch.
-                    /// </param>
-                    /// <param name="options" type="Object" locid="WinJS.UI.ToggleSwitch.constructor_p:options">
-                    /// An object that contains one or more property/value pairs to apply to the new control.
-                    /// Each property of the options object corresponds to one of the control's properties or events.
-                    /// Event names must begin with "on". For example, to provide a handler for the change event,
-                    /// add a property named "onchange" to the options object and set its value to the event handler.
-                    /// This parameter is optional.
-                    /// </param>
-                    /// <returns type="WinJS.UI.ToggleSwitch" locid="WinJS.UI.ToggleSwitch.constructor_returnValue">
-                    /// The new ToggleSwitch.
-                    /// </returns>
-                    /// </signature>
-
-                    // Main container
-                    element = element || _Global.document.createElement('div');
-                    this._domElement = element;
-                    _ElementUtilities.addClass(this._domElement, classContainer);
-
-                    // Set up DOM elements
-                    this._domElement.innerHTML = [
-                        '<div class="' + classHeader + '"></div>',
-                        '<div class="' + classClick + '">',
-                        '   <div class="' + classTrack + '">',
-                        '       <div class="' + classThumb + '"></div>',
-                        '   </div>',
-                        '   <div class="' + classValues + '">',
-                        '      <div class="' + classValue + ' ' + classValueOn + '"></div>',
-                        '      <div class="' + classValue + ' ' + classValueOff + '"></div>',
-                        '   </div>',
-                        '</div>',
-                        '<div class="' + classDescription + '"></div>'
-                    ].join('\n');
-
-                    // Get references to elements
-                    this._headerElement = this._domElement.firstElementChild;
-                    this._clickElement = this._headerElement.nextElementSibling;
-                    this._trackElement = this._clickElement.firstElementChild;
-                    this._thumbElement = this._trackElement.firstElementChild;
-                    this._labelsElement = this._trackElement.nextElementSibling;
-                    this._labelOnElement = this._labelsElement.firstElementChild;
-                    this._labelOffElement = this._labelOnElement.nextElementSibling;
-                    this._descriptionElement = this._clickElement.nextElementSibling;
-
-                    // Set aria label info
-                    this._headerElement.setAttribute('aria-hidden', true);
-                    this._labelsElement.setAttribute('aria-hidden', true);
-                    this._headerElement.setAttribute('id', _ElementUtilities._uniqueID(this._headerElement));
-                    this._domElement.setAttribute('aria-labelledby', this._headerElement.id);
-                    this._domElement.setAttribute('role', 'checkbox');
-
-                    // Some initialization of main element
-                    this._domElement.winControl = this;
-                    _ElementUtilities.addClass(this._domElement, 'win-disposable');
-
-                    // Add listeners
-                    this._domElement.addEventListener('keydown', this._keyDownHandler.bind(this));
-                    _ElementUtilities._addEventListener(this._clickElement, 'pointerdown', this._pointerDownHandler.bind(this));
-                    _ElementUtilities._addEventListener(this._clickElement, 'pointercancel', this._pointerCancelHandler.bind(this));
-                    this._boundPointerMove = this._pointerMoveHandler.bind(this);
-                    this._boundPointerUp = this._pointerUpHandler.bind(this);
-
-                    // Need mutation observer to listen for aria checked change
-                    this._mutationObserver = new _ElementUtilities._MutationObserver(this._ariaChangedHandler.bind(this));
-                    this._mutationObserver.observe(this._domElement, {attributes: true, attributeFilter: ['aria-checked']});
-
-                    // Current x coord while being dragged
-                    this._dragX = 0;
-                    this._dragging = false;
-
-                    // Default state
-                    this.checked = false;
-                    this.disabled = false;
-                    this.labelOn = strings.on;
-                    this.labelOff = strings.off;
-
-                    // Apply options
-                    _Control.setOptions(this, options);
-                }, {
-                    // Properties
-
-                    /// <field type='HTMLElement' domElement='true' hidden='true' locid="WinJS.UI.ToggleSwitch.element" helpKeyword="WinJS.UI.ToggleSwitch.element">
-                    /// The DOM element that hosts the ToggleSwitch control.
-                    /// </field>
-                    element: {
-                        get: function () {
-                            return this._domElement;
-                        }
-                    },
-                    /// <field type="Boolean" locid="WinJS.UI.ToggleSwitch.checked" helpKeyword="WinJS.UI.ToggleSwitch.checked">
-                    /// Gets or sets whether the control is on (checked is set to true) or off (checked is set to false).
-                    /// </field>
-                    checked: {
-                        get: function () {
-                            return this._checked;
-                        },
-                        set: function (value) {
-                            value = !!value;
-                            if (value === this.checked) {
-                                return;
-                            }
-
-                            this._checked = value;
-                            this._domElement.setAttribute('aria-checked', value);
-                            if (value) {
-                                _ElementUtilities.addClass(this._domElement, classOn);
-                                _ElementUtilities.removeClass(this._domElement, classOff);
-                            } else {
-                                _ElementUtilities.addClass(this._domElement, classOff);
-                                _ElementUtilities.removeClass(this._domElement, classOn);
-                            }
-                            this.dispatchEvent("change");
-                        }
-                    },
-                    /// <field type="Boolean" locid="WinJS.UI.ToggleSwitch.disabled" helpKeyword="WinJS.UI.ToggleSwitch.disabled">
-                    /// Gets or sets a value that specifies whether the control is disabled.
-                    /// </field>
-                    disabled: {
-                        get: function () {
-                            return this._disabled;
-                        },
-                        set: function (value) {
-                            value = !!value;
-                            if (value === this._disabled) {
-                                return;
-                            }
-
-                            if (value) {
-                                _ElementUtilities.addClass(this._domElement, classDisabled);
-                                _ElementUtilities.removeClass(this._domElement, classEnabled);
-                            } else {
-                                _ElementUtilities.removeClass(this._domElement, classDisabled);
-                                _ElementUtilities.addClass(this._domElement, classEnabled);
-                            }
-
-                            this._disabled = value;
-                            this._domElement.setAttribute('aria-disabled', value);
-                            this._domElement.setAttribute('tabIndex', value ? -1 : 0);
-                        }
-                    },
-                    /// <field type="String" locid="WinJS.UI.ToggleSwitch.labelOn" helpKeyword="WinJS.UI.ToggleSwitch.labelOn">
-                    /// Gets or sets the text that displays when the control is on (checked is set to true). The default value is "On".
-                    /// </field>
-                    labelOn: {
-                        get: function () {
-                            return this._labelOnElement.innerHTML;
-                        },
-                        set: function (value) {
-                            this._labelOnElement.innerHTML = value;
-                        }
-                    },
-                    /// <field type="String" locid="WinJS.UI.ToggleSwitch.labelOff" helpKeyword="WinJS.UI.ToggleSwitch.labelOff">
-                    /// Gets or sets the text that displays when the control is off (checked is set to false). The default value is "Off".
-                    /// </field>
-                    labelOff: {
-                        get: function () {
-                            return this._labelOffElement.innerHTML;
-                        },
-                        set: function (value) {
-                            this._labelOffElement.innerHTML = value;
-                        }
-                    },
-                    /// <field type='String' locid="WinJS.UI.ToggleSwitch.title" helpKeyword="WinJS.UI.ToggleSwitch.title">
-                    /// Gets or sets the main text for the ToggleSwitch control. This text is always displayed, regardless of whether
-                    /// the control is switched on or off.
-                    /// </field>
-                    title: {
-                        get: function () {
-                            return this._headerElement.innerHTML;
-                        },
-                        set: function (value) {
-                            this._headerElement.innerHTML = value;
-                        }
-                    },
-
-                    // Events
-
-                    /// <field type="Function" locid="WinJS.UI.ToggleSwitch.onchange" helpKeyword="WinJS.UI.ToggleSwitch.onchange">
-                    /// Occurs when the ToggleSwitch control is flipped to on (checked == true) or off (checked == false).
-                    /// </field>
-                    onchange: _Events._createEventProperty('change'),
-
-                    // Public methods
-                    dispose: function ToggleSwitch_dispose() {
-                        if (this._disposed) {
-                            return;
-                        }
-
-                        this._disposed = true;
-                    },
-
-                    // Private event handlers
-                    _ariaChangedHandler: function ToggleSwitch_ariaChanged() {
-                        var value = this._domElement.getAttribute('aria-checked');
-                        value = (value === 'true') ? true : false;
-                        this.checked = value;
-                    },
-                    _keyDownHandler: function ToggleSwitch_keyDown(e) {
-                        if (this.disabled) {
-                            return;
-                        }
-
-                        // Toggle checked on spacebar
-                        if (e.keyCode === _ElementUtilities.Key.space) {
-                            e.preventDefault();
-                            this.checked = !this.checked;
-                        }
-
-                        // Arrow keys set value
-                        if (e.keyCode === _ElementUtilities.Key.rightArrow ||
-                            e.keyCode === _ElementUtilities.Key.upArrow) {
-                            e.preventDefault();
-                            this.checked = true;
-                        }
-                        if (e.keyCode === _ElementUtilities.Key.leftArrow ||
-                            e.keyCode === _ElementUtilities.Key.downArrow) {
-                            e.preventDefault();
-                            this.checked = false;
-                        }
-
-                    },
-                    _pointerDownHandler: function ToggleSwitch_pointerDown(e) {
-                        if (this.disabled || this._mousedown) {
-                            return;
-                        }
-
-                        e.preventDefault();
-
-                        this._mousedown = true;
-                        this._dragXStart = e.pageX - this._trackElement.getBoundingClientRect().left;
-                        this._dragX = this._dragXStart;
-                        this._dragging = false;
-                        _ElementUtilities.addClass(this._domElement, classPressed);
-
-                        _ElementUtilities._globalListener.addEventListener(this._domElement, 'pointermove', this._boundPointerMove, true);
-                        _ElementUtilities._globalListener.addEventListener(this._domElement, 'pointerup', this._boundPointerUp, true);
-                        if (e.pointerType === _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH) {
-                            _ElementUtilities._setPointerCapture(this._domElement, e.pointerId);
-                        }
-                    },
-                    _pointerCancelHandler: function ToggleSwitch_pointerCancel(e) {
-                        this._resetPressedState();
-                        if (e.pointerType === _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH) {
-                            _ElementUtilities._releasePointerCapture(this._domElement, e.pointerId);
-                        }
-                    },
-                    _pointerUpHandler: function ToggleSwitch_pointerUp(e) {
-                        if (this.disabled) {
-                            return;
-                        }
-
-                        // Since up is a global event we should only take action
-                        // if a mousedown was registered on us initially
-                        if (!this._mousedown) {
-                            return;
-                        }
-
-                        e = e.detail.originalEvent;
-                        e.preventDefault();
-
-                        // If the thumb is being dragged, pick a new value based on what the thumb
-                        // was closest to
-                        var trackRect = this._trackElement.getBoundingClientRect();
-                        var thumbRect = this._thumbElement.getBoundingClientRect();
-                        var isRTL = _ElementUtilities._getComputedStyle(this._domElement).direction === 'rtl';
-                        if (this._dragging) {
-                            var maxX = trackRect.width - thumbRect.width;
-                            this.checked = isRTL ? this._dragX < maxX / 2 : this._dragX >= maxX / 2;
-                            this._dragging = false;
-                            _ElementUtilities.removeClass(this._domElement, classDragging);
-                        } else {
-                            // Otherwise, just toggle the value as the up constitutes a
-                            // click event
-                            this.checked = !this.checked;
-                        }
-
-                        // Reset tracking variables and intermediate styles
-                        this._resetPressedState();
-                    },
-                    _pointerMoveHandler: function ToggleSwitch_pointerMove(e) {
-                        if (this.disabled) {
-                            return;
-                        }
-
-                        // Not dragging if mouse isn't down
-                        if (!this._mousedown) {
-                            return;
-                        }
-
-                        e = e.detail.originalEvent;
-                        e.preventDefault();
-
-                        // Get pointer x coord relative to control
-                        var trackRect = this._trackElement.getBoundingClientRect();
-                        var localMouseX = e.pageX - trackRect.left;
-
-                        // Not dragging if mouse is outside track
-                        if (localMouseX > trackRect.width) {
-                            return;
-                        }
-
-                        // Calculate a position for the thumb
-                        var thumbRect = this._thumbElement.getBoundingClientRect();
-                        var maxX = trackRect.width - thumbRect.width - 6;
-                        this._dragX = Math.min(maxX, localMouseX - thumbRect.width / 2);
-                        this._dragX = Math.max(2, this._dragX);
-
-                        // Calculate if this pointermove constitutes switching to drag mode
-                        if (!this._dragging && Math.abs(localMouseX - this._dragXStart) > 3) {
-                            this._dragging = true;
-                            _ElementUtilities.addClass(this._domElement, classDragging);
-                        }
-
-                        this._thumbElement.style.left = this._dragX + 'px';
-                    },
-                    _resetPressedState: function ToggleSwitch_resetPressedState() {
-                        this._mousedown = false;
-                        this._thumbElement.style.left = '';
-                        _ElementUtilities.removeClass(this._domElement, classPressed);
-                        _ElementUtilities._globalListener.removeEventListener(this._domElement, 'pointermove', this._boundPointerMove, true);
-                        _ElementUtilities._globalListener.removeEventListener(this._domElement, 'pointerup', this._boundPointerUp, true);
-                    }
-                });
-
-                // addEventListener, removeEventListener, dispatchEvent
-                _Base.Class.mix(Toggle, _Control.DOMEventMixin);
-
-                return Toggle;
-            })
-        });
-    }
-);
-
-
-define('require-style!less/styles-semanticzoom',[],function(){});
-
-define('require-style!less/colors-semanticzoom',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// Semantic Zoom control
-define('WinJS/Controls/SemanticZoom',[
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Events',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../Animations',
-    '../Animations/_TransitionAnimation',
-    '../ControlProcessor',
-    '../Promise',
-    '../Utilities/_Control',
-    '../Utilities/_Dispose',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_ElementListUtilities',
-    '../Utilities/_Hoverable',
-    './ElementResizeInstrument',
-    'require-style!less/styles-semanticzoom',
-    'require-style!less/colors-semanticzoom'
-    ], function semanticZoomInit(_Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _WriteProfilerMark, Animations, _TransitionAnimation, ControlProcessor, Promise, _Control, _Dispose, _ElementUtilities, _ElementListUtilities, _Hoverable, _ElementResizeInstrument) {
-    "use strict";
-
-    _Base.Namespace.define("WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.SemanticZoom">
-        /// Enables the user to zoom between two different views supplied by two child controls.
-        /// One child control supplies the zoomed-out view and the other provides the zoomed-in view.
-        /// </summary>
-        /// </field>
-        /// <icon src="ui_winjs.ui.semanticzoom.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.semanticzoom.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.SemanticZoom"><div class="zoomedInContainer" data-win-control="WinJS.UI.ListView"></div><div class="zoomedOutContainer" data-win-control="WinJS.UI.ListView"></div></div>]]></htmlSnippet>
-        /// <part name="semanticZoom" class="win-semanticzoom" locid="WinJS.UI.SemanticZoom_part:semanticZoom">The entire SemanticZoom control.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        SemanticZoom: _Base.Namespace._lazy(function () {
-            var browserStyleEquivalents = _BaseUtils._browserStyleEquivalents;
-
-            var strings = {
-                get invalidZoomFactor() { return "Invalid zoomFactor"; },
-            };
-
-            function identity(item) {
-                return item;
-            }
-
-            // Private statics
-
-            var sezoButtonClass = "win-semanticzoom-button";
-            var sezoButtonLocationClass = "win-semanticzoom-button-location";
-            var sezoButtonShowDuration = 3000;
-            var sezoButtonMouseMoveThreshold = 8;
-
-            var semanticZoomClass = "win-semanticzoom";
-            var zoomedInElementClass = "win-semanticzoom-zoomedinview";
-            var zoomedOutElementClass = "win-semanticzoom-zoomedoutview";
-
-            var zoomChangedEvent = "zoomchanged";
-
-            var bounceFactor = 1.05;
-            var defaultZoomFactor = 0.65; // Value used by the shell
-            // If we change these we need to update the metadata for the zoomFactor property as well.
-            var maxZoomFactor = 0.8;
-            var minZoomFactor = 0.2;
-
-            var canvasSizeMax = 4096;
-
-            var outgoingOpacityTransitionDuration = 0.333;
-            var incomingOpacityTransitionDuration = 0.333;
-            var outgoingScaleTransitionDuration = 0.333;
-            var incomingScaleTransitionDuration = 0.333;
-            var zoomAnimationDuration = outgoingOpacityTransitionDuration * 1000;
-            var zoomAnimationTTFFBuffer = 50;
-            // PS 846107 - TransitionEnd event not being fired occassionally if duration is not same
-            var bounceInDuration = 0.333;
-            var bounceBackDuration = 0.333;
-            var easeOutBezier = "cubic-bezier(0.1,0.9,0.2,1)";
-            var transformNames = browserStyleEquivalents["transform"];
-            var transitionScriptName = browserStyleEquivalents["transition"].scriptName;
-
-            function buildTransition(prop, duration, timing) {
-                return prop + " " + _TransitionAnimation._animationTimeAdjustment(duration) + "s " + timing + " " + _TransitionAnimation._libraryDelay + "ms";
-            }
-            function outgoingElementTransition() {
-                return buildTransition(transformNames.cssName, outgoingScaleTransitionDuration, "ease-in-out") + ", " +
-                       buildTransition("opacity", outgoingOpacityTransitionDuration, "ease-in-out");
-            }
-
-            function incomingElementTransition() {
-                return buildTransition(transformNames.cssName, incomingScaleTransitionDuration, "ease-in-out") + ", " +
-                       buildTransition("opacity", incomingOpacityTransitionDuration, "ease-in-out");
-            }
-
-            function bounceInTransition() {
-                return buildTransition(transformNames.cssName, bounceInDuration, easeOutBezier);
-            }
-
-            function bounceBackTransition() {
-                return buildTransition(transformNames.cssName, bounceBackDuration, easeOutBezier);
-            }
-
-            var pinchDistanceCount = 2;
-            var zoomOutGestureDistanceChangeFactor = 0.2;
-            var zoomInGestureDistanceChangeFactor = 0.45;
-
-            var zoomAnimationTimeout = 1000;
-
-            // The semantic zoom has to piece together information from a variety of separate events to get an understanding of the current
-            // manipulation state. Since these events are altogether separate entities, we have to put a delay between the end of one event
-            // to allow time for another event to come around. For example, when we handle MSLostPointerCapture events, we need
-            // to wait because DManip might be taking over. If it is, we'll receive an MSManipulationStateChanged event soon,
-            // and so we don't want to reset our state back, and need give that event a chance to fire.
-            var eventTimeoutDelay = 50;
-
-            var PinchDirection = {
-                none: 0,
-                zoomedIn: 1,
-                zoomedOut: 2
-            };
-
-            var PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || "touch";
-            var PT_PEN = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_PEN || "pen";
-            var PT_MOUSE = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_MOUSE || "mouse";
-
-            function getDimension(element, property) {
-                return _ElementUtilities.convertToPixels(element, property);
-            }
-
-            function scaleElement(element, scale) {
-                if (_TransitionAnimation.isAnimationEnabled()) {
-                    element.style[transformNames.scriptName] = "scale(" + scale + ")";
-                }
-            }
-
-            var origin = { x: 0, y: 0 };
-
-            function onSemanticZoomPropertyChanged(list) {
-                // This will only be called for "aria-checked" changes
-                var control = list[0].target && list[0].target.winControl;
-                if (control && control instanceof SemanticZoom) {
-                    control._onPropertyChanged();
-                }
-            }
-
-            var SemanticZoom = _Base.Class.define(function SemanticZoom_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.SemanticZoom.SemanticZoom">
-                /// <summary locid="WinJS.UI.SemanticZoom.constructor">
-                /// Creates a new SemanticZoom.
-                /// </summary>
-                /// <param name="element" domElement="true" locid="WinJS.UI.SemanticZoom.constructor_p:element">
-                /// The DOM element that hosts the SemanticZoom.
-                /// </param>
-                /// <param name="options" type="object" locid="WinJS.UI.SemanticZoom.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events. This parameter is optional.
-                /// </param>
-                /// <returns type="WinJS.UI.SemanticZoom" locid="WinJS.UI.SemanticZoom.constructor_returnValue">
-                /// The new SemanticZoom control.
-                /// </returns>
-                /// </signature>
-
-                this._disposed = false;
-
-                var that = this;
-                var isPhone = _BaseUtils.isPhone;
-
-                this._element = element;
-                this._element.winControl = this;
-                _ElementUtilities.addClass(this._element, "win-disposable");
-                _ElementUtilities.addClass(this._element, semanticZoomClass);
-                this._element.setAttribute("role", "ms-semanticzoomcontainer");
-                var ariaLabel = this._element.getAttribute("aria-label");
-                if (!ariaLabel) {
-                    this._element.setAttribute("aria-label", "");
-                }
-
-                options = options || {};
-                this._zoomedOut = !!options.zoomedOut || !!options.initiallyZoomedOut || false;
-                this._enableButton = !isPhone;
-                if (!isPhone && options.enableButton !== undefined) {
-                    this._enableButton = !!options.enableButton;
-                }
-
-                this._element.setAttribute("aria-checked", this._zoomedOut.toString());
-                this._zoomFactor = _ElementUtilities._clamp(options.zoomFactor, minZoomFactor, maxZoomFactor, defaultZoomFactor);
-
-                this.zoomedInItem = options.zoomedInItem;
-                this.zoomedOutItem = options.zoomedOutItem;
-
-                if (_BaseUtils.validation) {
-                    if (options._zoomFactor && options._zoomFactor !== this._zoomFactor) {
-                        throw new _ErrorFromName("WinJS.UI.SemanticZoom.InvalidZoomFactor", strings.invalidZoomFactor);
-                    }
-                }
-
-                this._locked = !!options.locked;
-
-                this._zoomInProgress = false;
-                this._isBouncingIn = false;
-                this._isBouncing = false;
-                this._zooming = false;
-                this._aligning = false;
-                this._gesturing = false;
-                this._gestureEnding = false;
-                this._buttonShown = false;
-                this._shouldFakeTouchCancel = ("TouchEvent" in _Global);
-
-                // Initialize the control
-
-                this._initialize();
-                this._configure();
-
-                // Register event handlers
-                this._onResizeBound = this._onResize.bind(this);
-                this._elementResizeInstrument = new _ElementResizeInstrument._ElementResizeInstrument();
-                this._element.appendChild(this._elementResizeInstrument.element);
-                this._elementResizeInstrument.addEventListener("resize", this._onResizeBound);
-                _ElementUtilities._resizeNotifier.subscribe(this._element, this._onResizeBound);
-
-                var initiallyParented = _Global.document.body.contains(this._element);
-                if (initiallyParented) {
-                    this._elementResizeInstrument.addedToDom();
-                }
-
-                _ElementUtilities._addInsertedNotifier(this._element);
-                var initialTrigger = true;
-                this._element.addEventListener("WinJSNodeInserted", function (event) {
-                    // WinJSNodeInserted fires even if the element was already in the DOM
-                    if (initialTrigger) {
-                        initialTrigger = false;
-                        if (!initiallyParented) {
-                            that._elementResizeInstrument.addedToDom();
-                            that._onResizeBound();
-                        }
-                    } else {
-                        that._onResizeBound();
-                    }
-                }, false);
-
-                new _ElementUtilities._MutationObserver(onSemanticZoomPropertyChanged).observe(this._element, { attributes: true, attributeFilter: ["aria-checked"] });
-
-                if (!isPhone) {
-                    this._element.addEventListener("wheel", this._onWheel.bind(this), true);
-                    this._element.addEventListener("mousewheel", this._onMouseWheel.bind(this), true);
-                    this._element.addEventListener("keydown", this._onKeyDown.bind(this), true);
-
-                    _ElementUtilities._addEventListener(this._element, "pointerdown", this._onPointerDown.bind(this), true);
-                    _ElementUtilities._addEventListener(this._element, "pointermove", this._onPointerMove.bind(this), true);
-                    _ElementUtilities._addEventListener(this._element, "pointerout", this._onPointerOut.bind(this), true);
-                    _ElementUtilities._addEventListener(this._element, "pointercancel", this._onPointerCancel.bind(this), true);
-                    _ElementUtilities._addEventListener(this._element, "pointerup", this._onPointerUp.bind(this), false);
-                    this._hiddenElement.addEventListener("gotpointercapture", this._onGotPointerCapture.bind(this), false);
-                    this._hiddenElement.addEventListener("lostpointercapture", this._onLostPointerCapture.bind(this), false);
-                    this._element.addEventListener("click", this._onClick.bind(this), true);
-                    this._canvasIn.addEventListener(_BaseUtils._browserEventEquivalents["transitionEnd"], this._onCanvasTransitionEnd.bind(this), false);
-                    this._canvasOut.addEventListener(_BaseUtils._browserEventEquivalents["transitionEnd"], this._onCanvasTransitionEnd.bind(this), false);
-                    this._element.addEventListener("MSContentZoom", this._onMSContentZoom.bind(this), true);
-                    this._resetPointerRecords();
-                }
-
-                // Get going
-                this._onResizeImpl();
-
-                _Control._setOptions(this, options, true);
-
-                // Present the initial view
-                that._setVisibility();
-            }, {
-                // Public members
-
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.SemanticZoom.element" helpKeyword="WinJS.UI.SemanticZoom.element">
-                /// The DOM element that hosts the SemanticZoom control.
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.SemanticZoom.enableButton" helpKeyword="WinJS.UI.SemanticZoom.enableButton">
-                /// Gets or sets a value that specifies whether the semantic zoom button should be displayed or not
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                enableButton: {
-                    get: function () {
-                        return this._enableButton;
-                    },
-                    set: function (value) {
-                        var newValue = !!value;
-                        if (this._enableButton !== newValue && !_BaseUtils.isPhone) {
-                            this._enableButton = newValue;
-                            if (newValue) {
-                                this._createSemanticZoomButton();
-                            } else {
-                                this._removeSemanticZoomButton();
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.SemanticZoom.zoomedOut" helpKeyword="WinJS.UI.SemanticZoom.zoomedOut">
-                /// Gets or sets a value that specifies whether the zoomed out view is currently displayed.
-                /// </field>
-                zoomedOut: {
-                    get: function () {
-                        return this._zoomedOut;
-                    },
-                    set: function (value) {
-                        this._zoom(!!value, { x: 0.5 * this._sezoClientWidth, y: 0.5 * this._sezoClientHeight }, false, false, (this._zoomedOut && _BaseUtils.isPhone));
-                    }
-                },
-
-                /// <field type="Number" locid="WinJS.UI.SemanticZoom.zoomFactor" helpKeyword="WinJS.UI.SemanticZoom.zoomFactor" minimum="0.2" maximum="0.8">
-                /// Gets or sets a value between 0.2 and 0.85 that specifies the scale of the zoomed out view. The default is 0.65.
-                /// </field>
-                zoomFactor: {
-                    get: function () {
-                        return this._zoomFactor;
-                    },
-                    set: function (value) {
-                        var oldValue = this._zoomFactor;
-                        var newValue = _ElementUtilities._clamp(value, minZoomFactor, maxZoomFactor, defaultZoomFactor);
-                        if (oldValue !== newValue) {
-                            this._zoomFactor = newValue;
-                            this.forceLayout();
-                        }
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.SemanticZoom.locked" helpKeyword="WinJS.UI.SemanticZoom.locked">
-                /// Gets or sets a value that indicates whether SemanticZoom is locked and zooming between views is disabled.
-                /// </field>
-                locked: {
-                    get: function () {
-                        return this._locked;
-                    },
-                    set: function (value) {
-                        this._locked = !!value;
-                        if (value) {
-                            this._hideSemanticZoomButton();
-                        } else {
-                            this._displayButton();
-                        }
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.SemanticZoom.zoomedInItem" helpKeyword="WinJS.UI.SemanticZoom.zoomedInItem">
-                /// Gets or sets a mapping function which can be used to change the item which is targeted on zoom in.
-                /// </field>
-                zoomedInItem: {
-                    get: function () { return this._zoomedInItem; },
-                    set: function (value) {
-                        this._zoomedInItem = value || identity;
-                    },
-                },
-
-                /// <field type="Function" locid="WinJS.UI.SemanticZoom.zoomedOutItem" helpKeyword="WinJS.UI.SemanticZoom.zoomedOutItem">
-                /// Gets or sets a mapping function which can be used to change the item which is targeted on zoom out.
-                /// </field>
-                zoomedOutItem: {
-                    get: function () { return this._zoomedOutItem; },
-                    set: function (value) {
-                        this._zoomedOutItem = value || identity;
-                    },
-                },
-
-                dispose: function () {
-                    /// <signature helpKeyword="WinJS.UI.SemanticZoom.dispose">
-                    /// <summary locid="WinJS.UI.SemanticZoom.dispose">
-                    /// Disposes this SemanticZoom.
-                    /// </summary>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    this._disposed = true;
-                    this._elementResizeInstrument.dispose();
-                    _ElementUtilities._resizeNotifier.unsubscribe(this._element, this._onResizeBound);
-                    _Dispose._disposeElement(this._elementIn);
-                    _Dispose._disposeElement(this._elementOut);
-
-                    this._clearTimeout(this._completeZoomTimer);
-                    this._clearTimeout(this._TTFFTimer);
-                },
-
-                forceLayout: function () {
-                    /// <signature helpKeyword="WinJS.UI.SemanticZoom.forceLayout">
-                    /// <summary locid="WinJS.UI.SemanticZoom.forceLayout">
-                    /// Forces the SemanticZoom to update its layout. Use this function when making the SemanticZoom visible again
-                    /// after its style.display property had been set to "none".
-                    /// </summary>
-                    /// </signature>
-                    this._onResizeImpl();
-                },
-
-                // Private members
-
-                _initialize: function () {
-                    // initialize the semantic zoom, parent the child controls
-
-                    // Zoomed in and zoomed out controls must be on the first two child elements
-
-                    var children = _ElementListUtilities.children(this._element);
-                    this._elementIn = children[0];
-                    this._elementOut = children[1];
-
-                    // Ensure the child controls have the same height as the SemanticZoom element
-
-                    this._elementIn.style.height = this._elementOut.style.height = this._element.offsetHeight + "px";
-
-                    // Create the child controls if they haven't been created already
-
-                    ControlProcessor.processAll(this._elementIn);
-                    ControlProcessor.processAll(this._elementOut);
-
-                    this._viewIn = this._elementIn.winControl.zoomableView;
-                    this._viewOut = this._elementOut.winControl.zoomableView;
-
-                    // Remove the children and place them beneath new divs that will serve as canvases and viewports
-                    this._element.removeChild(this._elementOut);
-                    this._element.removeChild(this._elementIn);
-                    this._element.innerHTML = "";
-                    this._cropViewport = _Global.document.createElement("div");
-                    this._element.appendChild(this._cropViewport);
-                    this._viewportIn = _Global.document.createElement("div");
-                    this._opticalViewportIn = _Global.document.createElement("div");
-                    this._viewportOut = _Global.document.createElement("div");
-                    this._opticalViewportOut = _Global.document.createElement("div");
-                    this._opticalViewportIn.appendChild(this._viewportIn);
-                    this._opticalViewportOut.appendChild(this._viewportOut);
-                    this._cropViewport.appendChild(this._opticalViewportIn);
-                    this._cropViewport.appendChild(this._opticalViewportOut);
-
-                    this._canvasIn = _Global.document.createElement("div");
-                    this._canvasOut = _Global.document.createElement("div");
-                    this._viewportIn.appendChild(this._canvasIn);
-                    this._viewportOut.appendChild(this._canvasOut);
-                    this._canvasIn.appendChild(this._elementIn);
-                    this._canvasOut.appendChild(this._elementOut);
-
-                    if (this._enableButton) {
-                        this._createSemanticZoomButton();
-                    }
-
-                    this._hiddenElement = _Global.document.createElement("div");
-                    this._hiddenElement.tabIndex = -1;
-                    this._hiddenElement.visibility = "hidden";
-                    this._hiddenElement.setAttribute("aria-hidden", "true");
-                    this._element.appendChild(this._hiddenElement);
-
-                    _ElementUtilities.addClass(this._elementIn, zoomedInElementClass);
-                    _ElementUtilities.addClass(this._elementOut, zoomedOutElementClass);
-                    this._setLayout(this._element, "relative", "hidden");
-                    this._setLayout(this._cropViewport, "absolute", "hidden");
-                    this._setLayout(this._opticalViewportIn, "absolute", "auto");
-                    this._setLayout(this._opticalViewportOut, "absolute", "auto");
-                    this._setLayout(this._viewportIn, "absolute", "hidden");
-                    this._setLayout(this._viewportOut, "absolute", "hidden");
-                    this._setLayout(this._canvasIn, "absolute", "hidden");
-                    this._setLayout(this._canvasOut, "absolute", "hidden");
-                    // Pinch zoom on a precision touchpad doesn't send PointerMove etc. events like ordinary touch actions. PTP has to be handled specially.
-                    // PTP ignores the -ms-touch-action styles that are applied to elements, which means it ignores the style we apply to disable
-                    // optical zooming. An element can be optically zoomed via PTP but not with touch. SemanticZoom takes advantage of this fact to
-                    // implement zoom for PTPs. The _opticalViewportIn/Out elements have optical zoom properties attached to them to enable
-                    // optical zoom, and we attach an MSContentZoom event handler to our root element. When we receive that event on an optical viewport,
-                    // and it's in the direction for triggering a zoom, we'll trigger a zoom just like we would for scroll wheel/keyboard.
-                    // A nice side effect of this is that we don't need to play the overbounce animation in the PTP code, since optical zoom will
-                    // zoom out a small percentage then hit the min/max zoom value for us, then automatically return to 100% once the user stops manipulating.
-                    this._setupOpticalViewport(this._opticalViewportIn);
-                    this._setupOpticalViewport(this._opticalViewportOut);
-
-                    // Optical zoom can only work on elements with overflow = scroll. The opticalViewportIn/Out elements have overflow=scroll applied to them to enable this,
-                    // but we don't want those scrollbars to be visible, so they also have -ms-overflow-style=none.
-                    // The -ms-overflow-style on the optical viewport is inherited by its children. We don't want that, so we'll set the immediate children to have the
-                    // default overflow style.
-                    this._viewportIn.style["-ms-overflow-style"] = "-ms-autohiding-scrollbar";
-                    this._viewportOut.style["-ms-overflow-style"] = "-ms-autohiding-scrollbar";
-
-                    this._elementIn.style.position = "absolute";
-                    this._elementOut.style.position = "absolute";
-                },
-
-                _createSemanticZoomButton: function () {
-                    this._sezoButton = _Global.document.createElement("button");
-                    this._sezoButton.setAttribute("type", "button");
-                    this._sezoButton.className = sezoButtonClass + " " + sezoButtonLocationClass + " win-button";
-                    this._sezoButton.tabIndex = -1;
-                    this._sezoButton.style.visibility = "hidden";
-                    this._sezoButton.setAttribute("aria-hidden", true);
-                    this._element.appendChild(this._sezoButton);
-
-                    //register the appropriate events for display the sezo button
-                    this._sezoButton.addEventListener("click", this._onSeZoButtonZoomOutClick.bind(this), false);
-                    this._element.addEventListener("scroll", this._onSeZoChildrenScroll.bind(this), true);
-                    _ElementUtilities._addEventListener(this._element, "pointermove", this._onPenHover.bind(this), false);
-                },
-
-                _removeSemanticZoomButton: function () {
-                    if (this._sezoButton) {
-                        this._element.removeChild(this._sezoButton);
-                        this._sezoButton = null;
-                    }
-                },
-
-                _configure: function () {
-                    // Configure the controls for zooming
-                    var axisIn = this._viewIn.getPanAxis(),
-                        axisOut = this._viewOut.getPanAxis(),
-                        isPhone = _BaseUtils.isPhone;
-                    this._pansHorizontallyIn = (axisIn === "horizontal" || axisIn === "both");
-                    this._pansVerticallyIn = (axisIn === "vertical" || axisIn === "both");
-                    this._pansHorizontallyOut = (axisOut === "horizontal" || axisOut === "both");
-                    this._pansVerticallyOut = (axisOut === "vertical" || axisOut === "both");
-
-                    if (this._zoomInProgress) {
-                        return;
-                    }
-
-                    var pagesToPrefetchIn = 1 / this._zoomFactor - 1,
-                        pagesToPrefetchOut = bounceFactor - 1;
-
-                    this._setLayout(this._elementIn, "absolute", "visible");
-                    this._setLayout(this._elementOut, "absolute", "visible");
-                    this._viewIn.configureForZoom(false, !this._zoomedOut, this._zoomFromCurrent.bind(this, true), pagesToPrefetchIn);
-                    this._viewOut.configureForZoom(true, this._zoomedOut, this._zoomFromCurrent.bind(this, false), pagesToPrefetchOut);
-                    this._pinching = false;
-                    this._pinchGesture = 0;
-                    this._canvasLeftIn = 0;
-                    this._canvasTopIn = 0;
-                    this._canvasLeftOut = 0;
-                    this._canvasTopOut = 0;
-
-                    // Set scales and opacity when not on the phone
-                    if (!isPhone) {
-                        if (this._zoomedOut) {
-                            scaleElement(this._canvasIn, this._zoomFactor);
-                        } else {
-                            scaleElement(this._canvasOut, 1 / this._zoomFactor);
-                        }
-                    }
-                    var styleViewportIn = this._opticalViewportIn.style,
-                        styleViewportOut = this._opticalViewportOut.style,
-                        styleCanvasIn = this._canvasIn.style,
-                        styleCanvasOut = this._canvasOut.style;
-
-                    styleCanvasIn.opacity = (this._zoomedOut && !isPhone ? 0 : 1);
-                    styleCanvasOut.opacity = (this._zoomedOut ? 1 : 0);
-                    // Set the zoomed out canvas to have a higher zIndex than the zoomedIn canvas, so that when hosted on the phone
-                    // the SeZo will display both views properly.
-                    if (isPhone) {
-                        styleCanvasIn.zIndex = 1;
-                        styleCanvasOut.zIndex = 2;
-                    }
-
-                    // Enable animation
-                    if (_TransitionAnimation.isAnimationEnabled() && !isPhone) {
-                        styleViewportIn[browserStyleEquivalents["transition-property"].scriptName] = transformNames.cssName;
-                        styleViewportIn[browserStyleEquivalents["transition-duration"].scriptName] = "0s";
-                        styleViewportIn[browserStyleEquivalents["transition-timing-function"].scriptName] = "linear";
-
-                        styleViewportOut[browserStyleEquivalents["transition-property"].scriptName] = transformNames.cssName;
-                        styleViewportOut[browserStyleEquivalents["transition-duration"].scriptName] = "0s";
-                        styleViewportOut[browserStyleEquivalents["transition-timing-function"].scriptName] = "linear";
-                    }
-                },
-
-                _onPropertyChanged: function () {
-                    // This will only be called for "aria-checked" changes...also, the list is not important.
-                    var newValue = this._element.getAttribute("aria-checked");
-                    var zoomedOut = newValue === "true";
-                    if (this._zoomedOut !== zoomedOut) {
-                        this.zoomedOut = zoomedOut;
-                    }
-                },
-
-                _onResizeImpl: function () {
-                    this._resizing = this._resizing || 0;
-                    this._resizing++;
-                    try {
-                        var positionElement = function (element, left, top, width, height) {
-                            var style = element.style;
-                            style.left = left + "px";
-                            style.top = top + "px";
-                            style.width = width + "px";
-                            style.height = height + "px";
-                        };
-
-                        var sezoComputedStyle = _ElementUtilities._getComputedStyle(this._element, null),
-                            computedWidth = parseFloat(sezoComputedStyle.width),
-                            computedHeight = parseFloat(sezoComputedStyle.height),
-                            sezoPaddingLeft = getDimension(this._element, sezoComputedStyle["paddingLeft"]),
-                            sezoPaddingRight = getDimension(this._element, sezoComputedStyle["paddingRight"]),
-                            sezoPaddingTop = getDimension(this._element, sezoComputedStyle["paddingTop"]),
-                            sezoPaddingBottom = getDimension(this._element, sezoComputedStyle["paddingBottom"]),
-                            viewportWidth = computedWidth - sezoPaddingLeft - sezoPaddingRight,
-                            viewportHeight = computedHeight - sezoPaddingTop - sezoPaddingBottom,
-                            scaleFactor = 1 / this._zoomFactor;
-
-
-                        if (this._viewportWidth === viewportWidth && this._viewportHeight === viewportHeight) {
-                            return;
-                        }
-                        this._sezoClientHeight = computedHeight;
-                        this._sezoClientWidth = computedWidth;
-                        this._viewportWidth = viewportWidth;
-                        this._viewportHeight = viewportHeight;
-
-                        this._configure();
-
-                        var multiplierIn = 2 * scaleFactor - 1,
-                            canvasInWidth = Math.min(canvasSizeMax, (this._pansHorizontallyIn ? multiplierIn : 1) * viewportWidth),
-                            canvasInHeight = Math.min(canvasSizeMax, (this._pansVerticallyIn ? multiplierIn : 1) * viewportHeight);
-
-                        this._canvasLeftIn = 0.5 * (canvasInWidth - viewportWidth);
-                        this._canvasTopIn = 0.5 * (canvasInHeight - viewportHeight);
-                        positionElement(this._cropViewport, sezoPaddingLeft, sezoPaddingTop, viewportWidth, viewportHeight);
-                        positionElement(this._viewportIn, 0, 0, viewportWidth, viewportHeight);
-                        positionElement(this._opticalViewportIn, 0, 0, viewportWidth, viewportHeight);
-                        positionElement(this._canvasIn, -this._canvasLeftIn, -this._canvasTopIn, canvasInWidth, canvasInHeight);
-                        positionElement(this._elementIn, this._canvasLeftIn, this._canvasTopIn, viewportWidth, viewportHeight);
-
-                        var multiplierOut = 2 * bounceFactor - 1,
-                            canvasOutWidth = (this._pansHorizontallyOut ? multiplierOut : 1) * viewportWidth,
-                            canvasOutHeight = (this._pansVerticallyOut ? multiplierOut : 1) * viewportHeight;
-
-                        this._canvasLeftOut = 0.5 * (canvasOutWidth - viewportWidth);
-                        this._canvasTopOut = 0.5 * (canvasOutHeight - viewportHeight);
-                        positionElement(this._viewportOut, 0, 0, viewportWidth, viewportHeight);
-                        positionElement(this._opticalViewportOut, 0, 0, viewportWidth, viewportHeight);
-                        positionElement(this._canvasOut, -this._canvasLeftOut, -this._canvasTopOut, canvasOutWidth, canvasOutHeight);
-                        positionElement(this._elementOut, this._canvasLeftOut, this._canvasTopOut, viewportWidth, viewportHeight);
-                    } finally {
-                        this._resizing--;
-                    }
-                },
-
-                _onResize: function () {
-                    if (!this._resizing) {
-                        this._onResizeImpl();
-                    }
-                },
-
-                _onMouseMove: function (ev) {
-                    if (this._zooming ||
-                         (!this._lastMouseX && !this._lastMouseY) ||
-                         (ev.screenX === this._lastMouseX && ev.screenY === this._lastMouseY)) {
-                        this._lastMouseX = ev.screenX;
-                        this._lastMouseY = ev.screenY;
-                        return;
-                    }
-
-                    if (Math.abs(ev.screenX - this._lastMouseX) <= sezoButtonMouseMoveThreshold &&
-                        Math.abs(ev.screenY - this._lastMouseY) <= sezoButtonMouseMoveThreshold) {
-                        return;
-                    }
-
-                    this._lastMouseX = ev.screenX;
-                    this._lastMouseY = ev.screenY;
-
-                    this._displayButton();
-                },
-
-                _displayButton: function () {
-                    if (!_Hoverable.isHoverable) {
-                        return;
-                    }
-
-                    _Global.clearTimeout(this._dismissButtonTimer);
-                    this._showSemanticZoomButton();
-
-                    var that = this;
-                    this._dismissButtonTimer = _Global.setTimeout(function () {
-                        that._hideSemanticZoomButton();
-                    }, _TransitionAnimation._animationTimeAdjustment(sezoButtonShowDuration));
-                },
-
-                _showSemanticZoomButton: function () {
-                    if (this._disposed || this._buttonShown) {
-                        return;
-                    }
-
-                    if (this._sezoButton && !this._zoomedOut && !this._locked) {
-                        Animations.fadeIn(this._sezoButton);
-                        this._sezoButton.style.visibility = "visible";
-                        this._buttonShown = true;
-                    }
-                },
-
-                _hideSemanticZoomButton: function (immediately) {
-                    if (this._disposed || !this._buttonShown) {
-                        return;
-                    }
-
-                    if (this._sezoButton) {
-                        if (!immediately) {
-                            var that = this;
-                            Animations.fadeOut(this._sezoButton).then(function () {
-                                that._sezoButton.style.visibility = "hidden";
-                            });
-                        } else {
-                            this._sezoButton.style.visibility = "hidden";
-                        }
-                        this._buttonShown = false;
-                    }
-                },
-
-                _onSeZoChildrenScroll: function (ev) {
-                    if (ev.target !== this.element) {
-                        this._hideSemanticZoomButton(true);
-                    }
-                },
-
-                _onWheel: function (ev) {
-                    if (ev.ctrlKey) {
-                        this._zoom(ev.deltaY > 0, this._getPointerLocation(ev));
-
-                        ev.stopPropagation();
-                        ev.preventDefault();
-                    }
-                },
-
-                _onMouseWheel: function (ev) {
-                    if (ev.ctrlKey) {
-                        this._zoom(ev.wheelDelta < 0, this._getPointerLocation(ev));
-
-                        ev.stopPropagation();
-                        ev.preventDefault();
-                    }
-                },
-
-                _onPenHover: function (ev) {
-                    if (ev.pointerType === PT_PEN && ev.buttons === 0) {
-                        this._displayButton();
-                    }
-                },
-
-                _onSeZoButtonZoomOutClick: function () {
-                    this._hideSemanticZoomButton();
-                    this._zoom(true, { x: 0.5 * this._sezoClientWidth, y: 0.5 * this._sezoClientHeight }, false);
-                },
-
-                _onKeyDown: function (ev) {
-                    var handled = false;
-
-                    if (ev.ctrlKey) {
-                        var Key = _ElementUtilities.Key;
-
-                        switch (ev.keyCode) {
-                            case Key.add:
-                            case Key.equal:
-                            case 61: //Firefox uses a different keycode
-                                this._zoom(false);
-                                handled = true;
-                                break;
-
-                            case Key.subtract:
-                            case Key.dash:
-                            case 173: //Firefox uses a different keycode
-                                this._zoom(true);
-                                handled = true;
-                                break;
-                        }
-                    }
-
-                    if (handled) {
-                        ev.stopPropagation();
-                        ev.preventDefault();
-                    }
-                },
-
-                _createPointerRecord: function (ev, fireCancelOnPinch) {
-                    var location = this._getPointerLocation(ev);
-
-                    var newRecord = {};
-                    newRecord.startX = newRecord.currentX = location.x;
-                    newRecord.startY = newRecord.currentY = location.y;
-                    newRecord.fireCancelOnPinch = fireCancelOnPinch;
-
-                    this._pointerRecords[ev.pointerId] = newRecord;
-                    this._pointerCount = Object.keys(this._pointerRecords).length;
-
-                    return newRecord;
-                },
-
-                _deletePointerRecord: function (id) {
-                    var record = this._pointerRecords[id];
-
-                    delete this._pointerRecords[id];
-                    this._pointerCount = Object.keys(this._pointerRecords).length;
-
-                    if (this._pointerCount !== 2) {
-                        this._pinching = false;
-                    }
-
-                    return record;
-                },
-
-                _fakeCancelOnPointer: function (ev) {
-                    var touchEvent = _Global.document.createEvent("UIEvent");
-                    touchEvent.initUIEvent("touchcancel", true, true, _Global, 0);
-                    touchEvent.touches = ev.touches;
-                    touchEvent.targetTouches = ev.targetTouches;
-                    touchEvent.changedTouches = [ev._currentTouch];
-                    touchEvent._fakedBySemanticZoom = true;
-                    ev.target.dispatchEvent(touchEvent);
-                },
-
-                _handlePointerDown: function (ev) {
-                    this._createPointerRecord(ev, false);
-
-                    // When we get more than one pointer, we need to explicitly set PointerCapture on every pointer we've got to the SemanticZoom.
-                    // This will fire lostCapture events on any descendant elements that had called setCapture earlier (for example, ListView items),
-                    // and let the hosted control know that the pointer is no longer under its control.
-                    var contactKeys = Object.keys(this._pointerRecords);
-
-                    for (var i = 0, len = contactKeys.length; i < len; i++) {
-                        try {
-                            _ElementUtilities._setPointerCapture(this._hiddenElement, contactKeys[i] || 0);
-                        } catch (e) {
-                            this._resetPointerRecords();
-                            return;
-                        }
-                    }
-
-
-                    ev.stopImmediatePropagation();
-                    ev.preventDefault();
-                },
-
-                _handleFirstPointerDown: function (ev) {
-                    this._resetPointerRecords();
-                    this._createPointerRecord(ev, this._shouldFakeTouchCancel);
-                    this._startedZoomedOut = this._zoomedOut;
-                },
-
-                // SeZo wants to prevent clicks while it is playing the bounce animation
-                // This can happen when user try to pinch out on the zoomed out view
-                // and lift the finger up on the same item
-                _onClick: function (ev) {
-                    if (ev.target !== this._element) {
-                        if (this._isBouncing) {
-                            ev.stopImmediatePropagation();
-                        }
-                    }
-                },
-
-                // To optimize perf for ListView and to support more than 2 contact points
-                // for custom control, we wire up pointerDown routine for listview during capture
-                // but during bubbling phase for everythign else
-                _onPointerDown: function (ev) {
-                    if (ev.pointerType !== PT_TOUCH) {
-                        return;
-                    }
-
-                    if (this._pointerCount === 0) {
-                        this._handleFirstPointerDown(ev);
-                    } else {
-                        this._handlePointerDown(ev);
-                    }
-                },
-
-                // SemanticZoom uses MSPointerMove messages to recognize a pinch. It has to use pointer messages instead of GestureUpdate for a few reasons:
-                // 1 - MSGestureUpdate events' scale property (the property that determines pinches) is based on a scalar value. We want our pinch threshold to be pixel based
-                // 2 - MSGestureUpdate events' scale property doesn't work when multiple contacts are on multiple surfaces. When that happens .scale will always stay 1.0.
-                _onPointerMove: function (ev) {
-                    if (ev.pointerType === PT_MOUSE || ev.pointerType === PT_PEN) {
-                        this._onMouseMove(ev);
-                        return;
-                    }
-
-                    if (ev.pointerType !== PT_TOUCH) {
-                        return;
-                    }
-
-                    function distance(startX, startY, endX, endY) {
-                        return Math.sqrt((endX - startX) * (endX - startX) + (endY - startY) * (endY - startY));
-                    }
-
-                    function midpoint(point1, point2) {
-                        return {
-                            x: (0.5 * (point1.currentX + point2.currentX)) | 0,
-                            y: (0.5 * (point1.currentY + point2.currentY)) | 0
-                        };
-                    }
-
-                    var pointerRecord = this._pointerRecords[ev.pointerId],
-                        location = this._getPointerLocation(ev);
-
-                    // We listen to MSPointerDown on the bubbling phase of its event, but listen to MSPointerMove on the capture phase.
-                    // MSPointerDown can be stopped from bubbling if the underlying control doesn't want the SemanticZoom to interfere for whatever reason.
-                    // When that happens, we won't have a pointer record for the event we just got, so there's no sense in doing additional processing.
-                    if (!pointerRecord) {
-                        return;
-                    }
-                    pointerRecord.currentX = location.x;
-                    pointerRecord.currentY = location.y;
-
-                    if (this._pointerCount === 2) {
-                        this._pinching = true;
-
-                        // The order in which these contacts are stored and retrieved from contactKeys is unimportant.  Any two points will suffice."
-                        var contactKeys = Object.keys(this._pointerRecords),
-                            point1 = this._pointerRecords[contactKeys[0]],
-                            point2 = this._pointerRecords[contactKeys[1]];
-                        this._currentMidPoint = midpoint(point1, point2);
-                        var contactDistance = distance(point1.currentX, point1.currentY, point2.currentX, point2.currentY);
-                        var that = this;
-                        var processPinchGesture = function (zoomingOut) {
-                            var pinchDirection = (zoomingOut ? PinchDirection.zoomedOut : PinchDirection.zoomedIn),
-                                gestureReversed = (zoomingOut ? (that._pinchedDirection === PinchDirection.zoomedIn && !that._zoomingOut) : (that._pinchedDirection === PinchDirection.zoomedOut && that._zoomingOut)),
-                                canZoomInGesturedDirection = (zoomingOut ? !that._zoomedOut : that._zoomedOut);
-                            if (that._pinchedDirection === PinchDirection.none) {
-                                if (canZoomInGesturedDirection) {
-                                    that._isBouncingIn = false;
-                                    that._zoom(zoomingOut, midpoint(point1, point2), true);
-                                    that._pinchedDirection = pinchDirection;
-                                } else if (!that._isBouncingIn) {
-                                    that._playBounce(true, midpoint(point1, point2));
-                                }
-                            } else if (gestureReversed) {
-                                var deltaFromStart = that._lastPinchDistance / that._lastPinchStartDistance;
-                                var deltaFromLast = that._lastLastPinchDistance / that._lastPinchDistance;
-                                if ((zoomingOut && deltaFromStart > zoomOutGestureDistanceChangeFactor) ||
-                                    (!zoomingOut && deltaFromLast > zoomInGestureDistanceChangeFactor)) {
-                                    that._zoom(zoomingOut, midpoint(point1, point2), true);
-                                    that._pinchedDirection = pinchDirection;
-                                }
-                            }
-                        };
-                        this._updatePinchDistanceRecords(contactDistance);
-                        if (this._pinchDistanceCount >= pinchDistanceCount) {
-                            if (!this._zooming && !this._isBouncing) {
-                                _WriteProfilerMark("WinJS.UI.SemanticZoom:EndPinchDetection,info");
-                                processPinchGesture(this._lastPinchDirection === PinchDirection.zoomedOut);
-                            }
-                        }
-                    } else if (this._pointerCount > 2) {
-                        // When more than two pointers are down, we're not going to interpret that as a pinch, so we reset the distance we'd recorded when it was
-                        // just two pointers down.
-                        this._resetPinchDistanceRecords();
-                    }
-
-                    if (this._pointerCount >= 2) {
-                        // When two or more pointers are down, we want to hide all of their move events from the underlying view.
-                        // If the pointer we're looking at needs to have a touch cancel event fired for it, we'll fake that now.
-                        if (pointerRecord.fireCancelOnPinch) {
-                            this._fakeCancelOnPointer(ev, pointerRecord);
-                            pointerRecord.fireCancelOnPinch = false;
-                        }
-                        ev.stopImmediatePropagation();
-                        ev.preventDefault();
-                    }
-                    // If the pointerCount isn't 2, we're no longer making a pinch. This generally happens if you try pinching, find you can't zoom in the pinched direction,
-                    // then release one finger. When that happens we need to animate back to normal state.
-                    if (this._pointerCount !== 2 && this._isBouncingIn) {
-                        this._playBounce(false);
-                    }
-                },
-
-                _onPointerOut: function (ev) {
-                    if (ev.pointerType !== PT_TOUCH || ev.target !== this._element) {
-                        return;
-                    }
-
-                    this._completePointerUp(ev, false);
-                },
-
-                _onPointerUp: function (ev) {
-                    this._releasePointerCapture(ev);
-                    this._completePointerUp(ev, true);
-                    this._completeZoomingIfTimeout();
-                },
-
-                _onPointerCancel: function (ev) {
-                    if (!ev._fakedBySemanticZoom) {
-                        this._releasePointerCapture(ev);
-                        this._completePointerUp(ev, false);
-                        this._completeZoomingIfTimeout();
-                    }
-                },
-
-                _onGotPointerCapture: function (ev) {
-                    var pointerRecord = this._pointerRecords[ev.pointerId];
-                    if (pointerRecord) {
-                        pointerRecord.dirty = false;
-                    }
-                },
-
-                _onLostPointerCapture: function (ev) {
-                    var pointerRecord = this._pointerRecords[ev.pointerId];
-                    if (pointerRecord) {
-                        // If we lose capture on an element, there are three things that could be happening:
-                        // 1 - Independent Manipulations are taking over. If that's the case, we should be getting an MSManipulationStateChanged event soon.
-                        // 2 - Capture is just moving around inside of the semantic zoom region. We should get a got capture event soon, so we'll want to preserve this record.
-                        // 3 - Capture got moved outside of the semantic zoom region. We'll destroy the pointer record if this happens.
-                        pointerRecord.dirty = true;
-                        var that = this;
-                        Promise.timeout(eventTimeoutDelay).then(function () {
-                            if (pointerRecord.dirty) {
-                                // If the timeout completed and the record is still dirty, we can discard it
-                                that._completePointerUp(ev, false);
-                            }
-                        });
-                    }
-                },
-
-                _onMSContentZoom: function (ev) {
-                    var sourceElement = ev.target;
-                    if (sourceElement === this._opticalViewportIn || sourceElement === this._opticalViewportOut) {
-                        // msZoomFactor is a floating point, and sometimes it'll won't be exactly 1.0 when at rest. We'll give a 5/1000ths margin above/below 1.0 as the start points for a zoomIn or out gesture.
-                        var zoomingOut = (sourceElement.msContentZoomFactor < 0.995),
-                            zoomingIn = (sourceElement.msContentZoomFactor > 1.005);
-                        if (zoomingOut && !(this._zoomedOut || this._zoomingOut)) {
-                            this.zoomedOut = true;
-                        } else if (zoomingIn && (this._zoomedOut || this._zoomingOut)) {
-                            this.zoomedOut = false;
-                        }
-                    }
-                },
-
-                _updatePinchDistanceRecords: function (contactDistance) {
-                    var that = this;
-                    function updatePinchDirection(direction) {
-                        if (that._lastPinchDirection === direction) {
-                            that._pinchDistanceCount++;
-                        } else {
-                            that._pinchGesture++;
-                            that._pinchDistanceCount = 0;
-                            that._lastPinchStartDistance = contactDistance;
-                        }
-                        that._lastPinchDirection = direction;
-                        that._lastPinchDistance = contactDistance;
-                        that._lastLastPinchDistance = that._lastPinchDistance;
-                    }
-
-                    if (this._lastPinchDistance === -1) {
-                        _WriteProfilerMark("WinJS.UI.SemanticZoom:StartPinchDetection,info");
-                        this._lastPinchDistance = contactDistance;
-                    } else {
-                        if (this._lastPinchDistance !== contactDistance) {
-                            if (this._lastPinchDistance > contactDistance) {
-                                updatePinchDirection(PinchDirection.zoomedOut);
-                            } else {
-                                updatePinchDirection(PinchDirection.zoomedIn);
-                            }
-                        }
-                    }
-                },
-
-                _zoomFromCurrent: function (zoomOut) {
-                    this._zoom(zoomOut, null, false, true);
-                },
-
-                _zoom: function (zoomOut, zoomCenter, gesture, centerOnCurrent, skipAlignment) {
-                    _WriteProfilerMark("WinJS.UI.SemanticZoom:StartZoom(zoomOut=" + zoomOut + "),info");
-
-                    this._clearTimeout(this._completeZoomTimer);
-                    this._clearTimeout(this._TTFFTimer);
-
-                    this._hideSemanticZoomButton();
-                    this._resetPinchDistanceRecords();
-
-                    if (this._locked || this._gestureEnding) {
-                        return;
-                    }
-
-                    if (this._zoomInProgress) {
-                        if (this._gesturing === !gesture) {
-                            return;
-                        }
-
-                        if (zoomOut !== this._zoomingOut) {
-                            // Reverse the zoom that's currently in progress
-                            this._startAnimations(zoomOut);
-                        }
-                    } else if (zoomOut !== this._zoomedOut) {
-                        this._zooming = true;
-                        this._aligning = true;
-                        this._gesturing = !!gesture;
-
-                        if (zoomCenter) {
-                            (zoomOut ? this._viewIn : this._viewOut).setCurrentItem(zoomCenter.x, zoomCenter.y);
-                        }
-
-                        this._zoomInProgress = true;
-
-                        (zoomOut ? this._opticalViewportOut : this._opticalViewportIn).style.visibility = "visible";
-                        if (zoomOut && _BaseUtils.isPhone) {
-                            // When on the phone, we need to make sure the zoomed out canvas is visible before calling beginZoom(), otherwise
-                            // beginZoom will start up animations on an invisible element, and those animations will be animated dependently.
-                            this._canvasOut.style.opacity = 1;
-                        }
-
-                        var promiseIn = this._viewIn.beginZoom(),
-                            promiseOut = this._viewOut.beginZoom(),
-                            beginZoomPromises = null;
-
-                        if ((promiseIn || promiseOut) && _BaseUtils.isPhone) {
-                            beginZoomPromises = Promise.join([promiseIn, promiseOut]);
-                        }
-                        // To simplify zoomableView implementations, only call getCurrentItem between beginZoom and endZoom
-                        if (centerOnCurrent && !skipAlignment) {
-                            var that = this;
-                            (zoomOut ? this._viewIn : this._viewOut).getCurrentItem().then(function (current) {
-                                var position = current.position;
-
-                                // Pass in current item to avoid calling getCurrentItem again
-                                that._prepareForZoom(zoomOut, {
-                                    x: that._rtl() ? (that._sezoClientWidth - position.left - 0.5 * position.width) : position.left + 0.5 * position.width,
-                                    y: position.top + 0.5 * position.height
-                                }, Promise.wrap(current), beginZoomPromises);
-                            });
-                        } else {
-                            this._prepareForZoom(zoomOut, zoomCenter || {}, null, beginZoomPromises, skipAlignment);
-                        }
-                    }
-                },
-
-                _prepareForZoom: function (zoomOut, zoomCenter, completedCurrentItem, customViewAnimationPromise, skipAlignment) {
-                    _WriteProfilerMark("WinJS.UI.SemanticZoom:prepareForZoom,StartTM");
-                    var that = this;
-                    var centerX = zoomCenter.x,
-                        centerY = zoomCenter.y;
-
-
-                    if (typeof centerX !== "number" || !this._pansHorizontallyIn || !this._pansHorizontallyOut) {
-                        centerX = 0.5 * this._sezoClientWidth;
-                    }
-
-                    if (typeof centerY !== "number" || !this._pansVerticallyIn || !this._pansVerticallyOut) {
-                        centerY = 0.5 * this._sezoClientHeight;
-                    }
-
-                    function setZoomCenters(adjustmentIn, adjustmentOut) {
-                        that._canvasIn.style[browserStyleEquivalents["transform-origin"].scriptName] = (that._canvasLeftIn + centerX - adjustmentIn.x) + "px " + (that._canvasTopIn + centerY - adjustmentIn.y) + "px";
-                        that._canvasOut.style[browserStyleEquivalents["transform-origin"].scriptName] = (that._canvasLeftOut + centerX - adjustmentOut.x) + "px " + (that._canvasTopOut + centerY - adjustmentOut.y) + "px";
-                    }
-
-                    setZoomCenters(origin, origin);
-
-                    if (!skipAlignment) {
-                        this._alignViewsPromise = this._alignViews(zoomOut, centerX, centerY, completedCurrentItem).then(function () {
-                            that._aligning = false;
-                            that._gestureEnding = false;
-                            that._alignViewsPromise = null;
-                            if (!that._zooming && !that._gesturing) {
-                                that._completeZoom();
-                            }
-                        });
-                    } else {
-                        this._aligning = false;
-                    }
-                    this._zoomingOut = zoomOut;
-                    // Force style resolution
-                    _ElementUtilities._getComputedStyle(this._canvasIn).opacity;
-                    _ElementUtilities._getComputedStyle(this._canvasOut).opacity;
-                    _WriteProfilerMark("WinJS.UI.SemanticZoom:prepareForZoom,StopTM");
-                    this._startAnimations(zoomOut, customViewAnimationPromise);
-                },
-
-                _alignViews: function (zoomOut, centerX, centerY, completedCurrentItem) {
-                    var multiplier = (1 - this._zoomFactor),
-                        rtl = this._rtl(),
-                        offsetLeft = multiplier * (rtl ? this._viewportWidth - centerX : centerX),
-                        offsetTop = multiplier * centerY;
-
-                    var that = this;
-                    if (zoomOut) {
-                        var item = completedCurrentItem || this._viewIn.getCurrentItem();
-                        if (item) {
-                            return item.then(function (current) {
-                                var positionIn = current.position,
-                                positionOut = {
-                                    left: positionIn.left * that._zoomFactor + offsetLeft,
-                                    top: positionIn.top * that._zoomFactor + offsetTop,
-                                    width: positionIn.width * that._zoomFactor,
-                                    height: positionIn.height * that._zoomFactor
-                                };
-
-                                return that._viewOut.positionItem(that._zoomedOutItem(current.item), positionOut);
-                            });
-                        }
-                    } else {
-                        var item2 = completedCurrentItem || this._viewOut.getCurrentItem();
-                        if (item2) {
-                            return item2.then(function (current) {
-                                var positionOut = current.position,
-                                positionIn = {
-                                    left: (positionOut.left - offsetLeft) / that._zoomFactor,
-                                    top: (positionOut.top - offsetTop) / that._zoomFactor,
-                                    width: positionOut.width / that._zoomFactor,
-                                    height: positionOut.height / that._zoomFactor
-                                };
-
-                                return that._viewIn.positionItem(that._zoomedInItem(current.item), positionIn);
-                            });
-                        }
-                    }
-
-                    return new Promise(function (c) { c({ x: 0, y: 0 }); });
-                },
-
-                _startAnimations: function (zoomOut, customViewAnimationPromise) {
-                    this._zoomingOut = zoomOut;
-
-                    var isPhone = _BaseUtils.isPhone;
-                    if (_TransitionAnimation.isAnimationEnabled() && !isPhone) {
-                        _WriteProfilerMark("WinJS.UI.SemanticZoom:ZoomAnimation,StartTM");
-                        this._canvasIn.style[transitionScriptName] = (zoomOut ? outgoingElementTransition() : incomingElementTransition());
-                        this._canvasOut.style[transitionScriptName] = (zoomOut ? incomingElementTransition() : outgoingElementTransition());
-                    }
-
-                    if (!isPhone) {
-                        scaleElement(this._canvasIn, (zoomOut ? this._zoomFactor : 1));
-                        scaleElement(this._canvasOut, (zoomOut ? 1 : 1 / this._zoomFactor));
-                    }
-                    this._canvasIn.style.opacity = (zoomOut && !isPhone ? 0 : 1);
-                    if (!isPhone || zoomOut) {
-                        this._canvasOut.style.opacity = (zoomOut ? 1 : 0);
-                    }
-
-                    if (!_TransitionAnimation.isAnimationEnabled()) {
-                        this._zooming = false;
-                        this._canvasIn.style[transformNames.scriptName] = "";
-                        this._canvasOut.style[transformNames.scriptName] = "";
-                        this._completeZoom();
-                    } else if (!customViewAnimationPromise) {
-                        this.setTimeoutAfterTTFF(this._onZoomAnimationComplete.bind(this), _TransitionAnimation._animationTimeAdjustment(zoomAnimationDuration));
-                    } else {
-                        var that = this;
-                        var onComplete = function onComplete() {
-                            that._canvasIn.style[transformNames.scriptName] = "";
-                            that._canvasOut.style[transformNames.scriptName] = "";
-                            that._onZoomAnimationComplete();
-                        };
-                        customViewAnimationPromise.then(onComplete, onComplete);
-                    }
-                },
-
-                _onBounceAnimationComplete: function () {
-                    if (!this._isBouncingIn && !this._disposed) {
-                        this._completeZoom();
-                    }
-                },
-
-                _onZoomAnimationComplete: function () {
-                    _WriteProfilerMark("WinJS.UI.SemanticZoom:ZoomAnimation,StopTM");
-
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._zooming = false;
-                    if (!this._aligning && !this._gesturing && !this._gestureEnding) {
-                        this._completeZoom();
-                    }
-                },
-
-                _onCanvasTransitionEnd: function (ev) {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    if ((ev.target === this._canvasOut || ev.target === this._canvasIn) && this._isBouncing) {
-                        this._onBounceAnimationComplete();
-                        return;
-                    }
-
-                    if (ev.target === this._canvasIn && ev.propertyName === transformNames.cssName) {
-                        this._onZoomAnimationComplete();
-                    }
-                },
-
-                _clearTimeout: function (timer) {
-                    if (timer) {
-                        _Global.clearTimeout(timer);
-                    }
-                },
-
-                _completePointerUp: function (ev, stopPropagation) {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    var id = ev.pointerId;
-                    var pointerRecord = this._pointerRecords[id];
-                    if (pointerRecord) {
-                        this._deletePointerRecord(id);
-                        if (this._isBouncingIn) {
-                            this._playBounce(false);
-                        }
-
-                        if (stopPropagation && this._pinchedDirection !== PinchDirection.none) {
-                            ev.stopImmediatePropagation();
-                        }
-
-                        if (this._pointerCount === 0) {
-                            // if we are not zooming and if there's any single pending pinch gesture detected that's not being triggered (fast pinch), process them now
-                            if (this._pinchGesture === 1 && !this._zooming && this._lastPinchDirection !== PinchDirection.none && this._pinchDistanceCount < pinchDistanceCount) {
-                                this._zoom(this._lastPinchDirection === PinchDirection.zoomedOut, this._currentMidPoint, false);
-                                this._pinchGesture = 0;
-                                this._attemptRecordReset();
-                                return;
-                            }
-
-                            if (this._pinchedDirection !== PinchDirection.none) {
-                                this._gesturing = false;
-                                if (!this._aligning && !this._zooming) {
-                                    this._completeZoom();
-                                }
-                            }
-                            this._pinchGesture = 0;
-                            this._attemptRecordReset();
-                        }
-                    }
-                },
-
-                setTimeoutAfterTTFF: function (callback, delay) {
-                    var that = this;
-                    that._TTFFTimer = _Global.setTimeout(function () {
-                        if (this._disposed) {
-                            return;
-                        }
-                        that._TTFFTimer = _Global.setTimeout(callback, delay);
-                    }, zoomAnimationTTFFBuffer);
-                },
-
-                _completeZoomingIfTimeout: function () {
-                    if (this._pointerCount !== 0) {
-                        return;
-                    }
-
-                    var that = this;
-                    if (this._zoomInProgress || this._isBouncing) {
-                        that._completeZoomTimer = _Global.setTimeout(function () {
-                            that._completeZoom();
-                        }, _TransitionAnimation._animationTimeAdjustment(zoomAnimationTimeout));
-                    }
-                },
-
-                _completeZoom: function () {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    if (this._isBouncing) {
-                        if (this._zoomedOut) {
-                            this._viewOut.endZoom(true);
-                        } else {
-                            this._viewIn.endZoom(true);
-                        }
-                        this._isBouncing = false;
-                        return;
-                    }
-
-
-                    if (!this._zoomInProgress) {
-                        return;
-                    }
-
-                    _WriteProfilerMark("WinJS.UI.SemanticZoom:CompleteZoom,info");
-                    this._aligning = false;
-                    this._alignViewsPromise && this._alignViewsPromise.cancel();
-
-                    this._clearTimeout(this._completeZoomTimer);
-                    this._clearTimeout(this._TTFFTimer);
-
-                    this._gestureEnding = false;
-                    this[this._zoomingOut ? "_opticalViewportOut" : "_opticalViewportIn"].msContentZoomFactor = 1.0;
-                    this._viewIn.endZoom(!this._zoomingOut);
-                    this._viewOut.endZoom(this._zoomingOut);
-                    this._canvasIn.style.opacity = (this._zoomingOut && !_BaseUtils.isPhone ? 0 : 1);
-                    this._canvasOut.style.opacity = (this._zoomingOut ? 1 : 0);
-
-                    this._zoomInProgress = false;
-
-                    var zoomChanged = false;
-                    if (this._zoomingOut !== this._zoomedOut) {
-                        this._zoomedOut = !!this._zoomingOut;
-                        this._element.setAttribute("aria-checked", this._zoomedOut.toString());
-                        zoomChanged = true;
-                    }
-
-                    this._setVisibility();
-
-                    if (zoomChanged) {
-                        // Dispatch the zoomChanged event
-                        var ev = _Global.document.createEvent("CustomEvent");
-                        ev.initCustomEvent(zoomChangedEvent, true, true, this._zoomedOut);
-                        this._element.dispatchEvent(ev);
-
-                        if (this._isActive) {
-                            // If the element is no longer a valid focus target, it will throw, we
-                            // simply won't do anything in this case
-                            _ElementUtilities._setActive(this._zoomedOut ? this._elementOut : this._elementIn);
-                        }
-                    }
-
-                    _WriteProfilerMark("WinJS.UI.SemanticZoom:CompleteZoom_Custom,info");
-                },
-
-                _isActive: function () {
-                    var active = _Global.document.activeElement;
-                    return this._element === active || this._element.contains(active);
-                },
-
-                _setLayout: function (element, position, overflow) {
-                    var style = element.style;
-                    style.position = position;
-                    style.overflow = overflow;
-                },
-
-                _setupOpticalViewport: function (viewport) {
-                    viewport.style["-ms-overflow-style"] = "none";
-                    if (!_BaseUtils.isPhone) {
-                        viewport.style["-ms-content-zooming"] = "zoom";
-                        // We don't want the optical zoom to be too obvious with PTP (we're mostly just using it to get MSContentZoom events).
-                        // We'll use a +/-1% margin around 100% so that we can still optically zoom, but not too far.
-                        viewport.style["-ms-content-zoom-limit-min"] = "99%";
-                        viewport.style["-ms-content-zoom-limit-max"] = "101%";
-                        viewport.style["-ms-content-zoom-snap-points"] = "snapList(100%)";
-                        viewport.style["-ms-content-zoom-snap-type"] = "mandatory";
-                    }
-                },
-
-                _setVisibility: function () {
-                    function setVisibility(element, isVisible) {
-                        element.style.visibility = (isVisible ? "visible" : "hidden");
-                    }
-                    setVisibility(this._opticalViewportIn, !this._zoomedOut || _BaseUtils.isPhone);
-                    setVisibility(this._opticalViewportOut, this._zoomedOut);
-                    this._opticalViewportIn.setAttribute("aria-hidden", !!this._zoomedOut);
-                    this._opticalViewportOut.setAttribute("aria-hidden", !this._zoomedOut);
-                },
-
-                _resetPointerRecords: function () {
-                    this._pinchedDirection = PinchDirection.none;
-                    this._pointerCount = 0;
-                    this._pointerRecords = {};
-                    this._resetPinchDistanceRecords();
-                },
-
-                _releasePointerCapture: function (ev) {
-                    var id = ev.pointerId;
-                    try {
-                        // Release the pointer capture since they are going away, to allow in air touch pointers
-                        // to be reused for multiple interactions
-                        _ElementUtilities._releasePointerCapture(this._hiddenElement, id);
-                    } catch (e) {
-                        // This can throw if the pointer was not already captured
-                    }
-                },
-
-                _attemptRecordReset: function () {
-                    if (this._recordResetPromise) {
-                        this._recordResetPromise.cancel();
-                    }
-
-                    var that = this;
-                    this._recordResetPromise = Promise.timeout(eventTimeoutDelay).then(function () {
-                        if (that._pointerCount === 0) {
-                            that._resetPointerRecords();
-                            that._recordResetPromise = null;
-                        }
-                    });
-                },
-
-                _resetPinchDistanceRecords: function () {
-                    this._lastPinchDirection = PinchDirection.none;
-                    this._lastPinchDistance = -1;
-                    this._lastLastPinchDistance = -1;
-                    this._pinchDistanceCount = 0;
-                    this._currentMidPoint = null;
-                },
-
-                _getPointerLocation: function (ev) {
-                    // Get pointer location returns co-ordinate in the sezo control co-ordinate space
-                    var sezoBox = { left: 0, top: 0 };
-                    try {
-                        sezoBox = this._element.getBoundingClientRect();
-                    }
-                    catch (err) { }  // an exception can be thrown if SeZoDiv is no longer available
-
-                    var sezoComputedStyle = _ElementUtilities._getComputedStyle(this._element, null),
-                        sezoPaddingLeft = getDimension(this._element, sezoComputedStyle["paddingLeft"]),
-                        sezoPaddingTop = getDimension(this._element, sezoComputedStyle["paddingTop"]),
-                        sezoBorderLeft = getDimension(this._element, sezoComputedStyle["borderLeftWidth"]);
-
-                    return {
-                        x: +ev.clientX === ev.clientX ? (ev.clientX - sezoBox.left - sezoPaddingLeft - sezoBorderLeft) : 0,
-                        y: +ev.clientY === ev.clientY ? (ev.clientY - sezoBox.top - sezoPaddingTop - sezoPaddingTop) : 0
-                    };
-                },
-
-                _playBounce: function (beginBounce, center) {
-                    if (!_TransitionAnimation.isAnimationEnabled()) {
-                        return;
-                    }
-
-                    if (this._isBouncingIn === beginBounce) {
-                        return;
-                    }
-
-                    this._clearTimeout(this._completeZoomTimer);
-                    this._clearTimeout(this._TTFFTimer);
-                    this._isBouncing = true;
-                    this._isBouncingIn = beginBounce;
-                    if (beginBounce) {
-                        this._bounceCenter = center;
-                    } else {
-                        this._aligned = true;
-                    }
-
-                    var targetElement = (this._zoomedOut ? this._canvasOut : this._canvasIn);
-                    var adjustmentX = (this._zoomedOut ? this._canvasLeftOut : this._canvasLeftIn);
-                    var adjustmentY = (this._zoomedOut ? this._canvasTopOut : this._canvasTopIn);
-                    targetElement.style[browserStyleEquivalents["transform-origin"].scriptName] = (adjustmentX + this._bounceCenter.x) + "px " + (adjustmentY + this._bounceCenter.y) + "px";
-                    targetElement.style[transitionScriptName] = beginBounce ? bounceInTransition() : bounceBackTransition();
-
-                    if (!this._zoomedOut) {
-                        this._viewIn.beginZoom();
-                    } else {
-                        this._viewOut.beginZoom();
-                    }
-
-                    var scale = (beginBounce ? (this._zoomedOut ? 2 - bounceFactor : bounceFactor) : 1);
-
-                    scaleElement(targetElement, scale);
-
-                    this.setTimeoutAfterTTFF(this._onBounceAnimationComplete.bind(this), _TransitionAnimation._animationTimeAdjustment(zoomAnimationDuration));
-                },
-
-                _rtl: function () {
-                    return _ElementUtilities._getComputedStyle(this._element, null).direction === "rtl";
-                },
-
-                _pinching: {
-                    set: function (value) {
-                        this._viewIn.pinching = value;
-                        this._viewOut.pinching = value;
-                    }
-                }
-            });
-            _Base.Class.mix(SemanticZoom, _Events.createEventProperties("zoomchanged"));
-            _Base.Class.mix(SemanticZoom, _Control.DOMEventMixin);
-            return SemanticZoom;
-        })
-
-    });
-
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-"use strict";
-define('WinJS/Controls/Pivot/_Constants',["require", "exports"], function (require, exports) {
-    // Names of classes used by the Pivot.
-    exports._ClassNames = {
-        pivot: "win-pivot",
-        pivotCustomHeaders: "win-pivot-customheaders",
-        pivotLocked: "win-pivot-locked",
-        pivotTitle: "win-pivot-title",
-        pivotHeaderArea: "win-pivot-header-area",
-        pivotHeaderLeftCustom: "win-pivot-header-leftcustom",
-        pivotHeaderRightCustom: "win-pivot-header-rightcustom",
-        pivotHeaderItems: "win-pivot-header-items",
-        pivotHeaders: "win-pivot-headers",
-        pivotHeader: "win-pivot-header",
-        pivotHeaderSelected: "win-pivot-header-selected",
-        pivotViewport: "win-pivot-viewport",
-        pivotSurface: "win-pivot-surface",
-        pivotNoSnap: "win-pivot-nosnap",
-        pivotNavButton: "win-pivot-navbutton",
-        pivotNavButtonPrev: "win-pivot-navbutton-prev",
-        pivotNavButtonNext: "win-pivot-navbutton-next",
-        pivotShowNavButtons: "win-pivot-shownavbuttons",
-        pivotInputTypeMouse: "win-pivot-mouse",
-        pivotInputTypeTouch: "win-pivot-touch",
-        pivotDisableContentSwipeNavigation: "win-pivot-disablecontentswipenavigation"
-    };
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/Pivot/_Item',[
-    'exports',
-    '../../Core/_Global',
-    '../../Core/_Base',
-    '../../Core/_BaseUtils',
-    '../../Core/_ErrorFromName',
-    '../../Core/_Resources',
-    '../../ControlProcessor',
-    '../../Promise',
-    '../../Scheduler',
-    '../../Utilities/_Control',
-    '../../Utilities/_Dispose',
-    '../../Utilities/_ElementUtilities',
-    './_Constants'
-    ], function pivotItemInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Resources, ControlProcessor, Promise, Scheduler, _Control, _Dispose, _ElementUtilities, _Constants) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.PivotItem">
-        /// Defines a Item of a Pivot control.
-        /// </summary>
-        /// <compatibleWith platform="WindowsPhoneApp" minVersion="8.1"/>
-        /// </field>
-        /// <icon src="ui_winjs.ui.pivotitem.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.pivotitem.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.PivotItem" data-win-options="{header: 'PivotItem Header'}">PivotItem Content</div>]]></htmlSnippet>
-        /// <part name="pivotitem" class="win-pivot-item" locid="WinJS.UI.PivotItem_part:pivotitem">The entire PivotItem control.</part>
-        /// <part name="content" class="win-pivot-item-content" locid="WinJS.UI.PivotItem_part:content">The content region of the PivotItem.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        PivotItem: _Base.Namespace._lazy(function () {
-            var strings = {
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; }
-            };
-
-            var PivotItem = _Base.Class.define(function PivotItem_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.PivotItem.PivotItem">
-                /// <summary locid="WinJS.UI.PivotItem.constructor">
-                /// Creates a new PivotItem.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" isOptional="true" locid="WinJS.UI.PivotItem.constructor_p:element">
-                /// The DOM element that hosts the PivotItem control.
-                /// </param>
-                /// <param name="options" type="Object" isOptional="true" locid="WinJS.UI.PivotItem.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// </param>
-                /// <returns type="WinJS.UI.PivotItem" locid="WinJS.UI.PivotItem.constructor_returnValue">
-                /// The new PivotItem.
-                /// </returns>
-                /// <compatibleWith platform="WindowsPhoneApp" minVersion="8.1"/>
-                /// </signature>
-                element = element || _Global.document.createElement("DIV");
-                options = options || {};
-
-                if (element.winControl) {
-                    throw new _ErrorFromName("WinJS.UI.PivotItem.DuplicateConstruction", strings.duplicateConstruction);
-                }
-
-                // Attaching JS control to DOM element
-                element.winControl = this;
-                this._element = element;
-                _ElementUtilities.addClass(this.element, PivotItem._ClassName.pivotItem);
-                _ElementUtilities.addClass(this.element, "win-disposable");
-                this._element.setAttribute('role', 'tabpanel');
-
-                this._contentElement = _Global.document.createElement("DIV");
-                this._contentElement.className = PivotItem._ClassName.pivotItemContent;
-                element.appendChild(this._contentElement);
-
-                // Reparent any existing elements inside the new pivot item content element.
-                var elementToMove = this.element.firstChild;
-                while (elementToMove !== this._contentElement) {
-                    var nextElement = elementToMove.nextSibling;
-                    this._contentElement.appendChild(elementToMove);
-                    elementToMove = nextElement;
-                }
-
-                this._processors = [ControlProcessor.processAll];
-
-                _Control.setOptions(this, options);
-            }, {
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.PivotItem.element" helpKeyword="WinJS.UI.PivotItem.element">
-                /// Gets the DOM element that hosts the PivotItem.
-                /// <compatibleWith platform="WindowsPhoneApp" minVersion="8.1"/>
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-                /// <field type="HTMLElement" domElement="true" locid="WinJS.UI.PivotItem.contentElement" helpKeyword="WinJS.UI.PivotItem.contentElement">
-                /// Gets the DOM element that hosts the PivotItem's content.
-                /// <compatibleWith platform="WindowsPhoneApp" minVersion="8.1"/>
-                /// </field>
-                contentElement: {
-                    get: function () {
-                        return this._contentElement;
-                    }
-                },
-                /// <field type="Object" locid="WinJS.UI.PivotItem.header" helpKeyword="WinJS.UI.PivotItem.header">
-                /// Get or set the PivotItem's header. After you set this property, the Pivot renders the header again.
-                /// <compatibleWith platform="WindowsPhoneApp" minVersion="8.1"/>
-                /// </field>
-                header: {
-                    get: function () {
-                        return this._header;
-                    },
-                    set: function (value) {
-                        // Render again even if it is equal to itself.
-                        this._header = value;
-                        this._parentPivot && this._parentPivot._headersState.handleHeaderChanged(this);
-                    }
-                },
-                _parentPivot: {
-                    get: function () {
-                        var el = this._element;
-                        while (el && !_ElementUtilities.hasClass(el, _Constants._ClassNames.pivot)) {
-                            el = el.parentNode;
-                        }
-                        return el && el.winControl;
-                    }
-                },
-                _process: function PivotItem_process() {
-                    var that = this;
-
-                    if (this._processors) {
-                        this._processors.push(function () {
-                            return Scheduler.schedulePromiseAboveNormal();
-                        });
-                    }
-
-                    this._processed = (this._processors || []).reduce(function (promise, processor) {
-                        return promise.then(function () {
-                            return processor(that.contentElement);
-                        });
-                    }, this._processed || Promise.as());
-                    this._processors = null;
-
-                    return this._processed;
-                },
-                dispose: function PivotItem_dispose() {
-                    /// <signature helpKeyword="WinJS.UI.PivotItem.dispose">
-                    /// <summary locid="WinJS.UI.PivotItem.dispose">
-                    /// Disposes this control.
-                    /// </summary>
-                    /// <compatibleWith platform="WindowsPhoneApp" minVersion="8.1"/>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._disposed = true;
-                    this._processors = null;
-
-                    _Dispose.disposeSubTree(this.contentElement);
-                }
-            }, {
-                // Names of classes used by the PivotItem.
-                _ClassName: {
-                    pivotItem: "win-pivot-item",
-                    pivotItemContent: "win-pivot-item-content"
-                },
-                isDeclarativeControlContainer: _BaseUtils.markSupportedForProcessing(function (item, callback) {
-                    if (callback === ControlProcessor.processAll) {
-                        return;
-                    }
-
-                    item._processors = item._processors || [];
-                    item._processors.push(callback);
-
-                    // Once processed the first time synchronously queue up new processors as they come in
-                    if (item._processed) {
-                        item._process();
-                    }
-                })
-            });
-
-            return PivotItem;
-        })
-    });
-
-});
-
-
-define('require-style!less/styles-pivot',[],function(){});
-
-define('require-style!less/colors-pivot',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <reference path="../../../../../typings/require.d.ts" />
-var __extends = this.__extends || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    __.prototype = b.prototype;
-    d.prototype = new __();
-};
-define('WinJS/Controls/Pivot/_Pivot',["require", "exports", "../../Core/_Global", "../../Animations", "../../BindingList", "../../ControlProcessor", "../../Promise", "../../Scheduler", "../../Core/_Base", "../../Core/_BaseUtils", "../../Utilities/_Control", "../../Utilities/_Dispose", "../ElementResizeInstrument", "../../Utilities/_ElementUtilities", "../../Core/_ErrorFromName", "../../Core/_Events", "../../Utilities/_Hoverable", "../../Utilities/_KeyboardBehavior", "../../Core/_Log", "../../Core/_Resources", "../../Animations/_TransitionAnimation", "../../Core/_WriteProfilerMark", "./_Constants"], function (require, exports, _Global, Animations, BindingList, ControlProcessor, Promise, Scheduler, _Base, _BaseUtils, _Control, _Dispose, _ElementResizeInstrument, _ElementUtilities, _ErrorFromName, _Events, _Hoverable, _KeyboardBehavior, _Log, _Resources, _TransitionAnimation, _WriteProfilerMark, _Constants) {
-    // Force-load Dependencies
-    _Hoverable.isHoverable;
-    require(["require-style!less/styles-pivot"]);
-    require(["require-style!less/colors-pivot"]);
-    "use strict";
-    var _EventNames = {
-        selectionChanged: "selectionchanged",
-        itemAnimationStart: "itemanimationstart",
-        itemAnimationEnd: "itemanimationend",
-    };
-    var strings = {
-        get duplicateConstruction() {
-            return "Invalid argument: Controls may only be instantiated one time for each DOM element";
-        },
-        get duplicateItem() {
-            return _Resources._getWinJSString("ui/duplicateItem").value;
-        },
-        get invalidContent() {
-            return "Invalid content: Pivot content must be made up of PivotItems.";
-        },
-        get pivotAriaLabel() {
-            return _Resources._getWinJSString("ui/pivotAriaLabel").value;
-        },
-        get pivotViewportAriaLabel() {
-            return _Resources._getWinJSString("ui/pivotViewportAriaLabel").value;
-        }
-    };
-    var supportsSnap = !!(_ElementUtilities._supportsSnapPoints && "inertiaDestinationX" in _Global["MSManipulationEvent"].prototype);
-    var PT_MOUSE = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_MOUSE || "mouse";
-    var PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || "touch";
-    var Keys = _ElementUtilities.Key;
-    var _headerSlideAnimationDuration = 250;
-    var _invalidMeasurement = -1;
-    function pivotDefaultHeaderTemplate(item) {
-        var element = _Global.document.createTextNode(typeof item.header === "object" ? JSON.stringify(item.header) : ('' + item.header));
-        return element;
-    }
-    var Pivot = (function () {
-        function Pivot(element, options) {
-            var _this = this;
-            if (options === void 0) { options = {}; }
-            this._disposed = false;
-            this._firstLoad = true;
-            this._hidePivotItemAnimation = Promise.wrap();
-            this._loadPromise = Promise.wrap();
-            this._pendingRefresh = false;
-            this._selectedIndex = 0;
-            this._showPivotItemAnimation = Promise.wrap();
-            this._slideHeadersAnimation = Promise.wrap();
-            /// <signature helpKeyword="WinJS.UI.Pivot.Pivot">
-            /// <summary locid="WinJS.UI.Pivot.constructor">
-            /// Creates a new Pivot control.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" domElement="true" isOptional="true" locid="WinJS.UI.Pivot.constructor_p:element">
-            /// The DOM element that hosts the Pivot control.
-            /// </param>
-            /// <param name="options" type="Object" isOptional="true" locid="WinJS.UI.Pivot.constructor_p:options">
-            /// An object that contains one or more property/value pairs to apply to the new control.
-            /// Each property of the options object corresponds to one of the control's properties or events.
-            /// Event names must begin with "on". For example, to provide a handler for the index changed event,
-            /// add a property named "onselectionchanged" to the options object and set its value to the event handler.
-            /// </param>
-            /// <returns type="WinJS.UI.Pivot" locid="WinJS.UI.Pivot.constructor_returnValue">
-            /// The new Pivot.
-            /// </returns>
-            /// </signature>
-            element = element || _Global.document.createElement("DIV");
-            if (element["winControl"]) {
-                throw new _ErrorFromName("WinJS.UI.Pivot.DuplicateConstruction", strings.duplicateConstruction);
-            }
-            this._handleItemChanged = this._handleItemChanged.bind(this);
-            this._handleItemInserted = this._handleItemInserted.bind(this);
-            this._handleItemMoved = this._handleItemMoved.bind(this);
-            this._handleItemRemoved = this._handleItemRemoved.bind(this);
-            this._handleItemReload = this._handleItemReload.bind(this);
-            this._resizeHandler = this._resizeHandler.bind(this);
-            this._updatePointerType = this._updatePointerType.bind(this);
-            this._id = element.id || _ElementUtilities._uniqueID(element);
-            this._writeProfilerMark("constructor,StartTM");
-            // Attaching JS control to DOM element
-            element["winControl"] = this;
-            this._element = element;
-            this._element.setAttribute("role", "tablist");
-            if (!this._element.getAttribute("aria-label")) {
-                this._element.setAttribute('aria-label', strings.pivotAriaLabel);
-            }
-            _ElementUtilities.addClass(this.element, _Constants._ClassNames.pivot);
-            _ElementUtilities.addClass(this.element, "win-disposable");
-            _ElementUtilities._addEventListener(this.element, "pointerenter", this._updatePointerType);
-            _ElementUtilities._addEventListener(this.element, "pointerout", this._updatePointerType);
-            // Title element
-            this._titleElement = _Global.document.createElement("DIV");
-            this._titleElement.style.display = "none";
-            _ElementUtilities.addClass(this._titleElement, _Constants._ClassNames.pivotTitle);
-            this._element.appendChild(this._titleElement);
-            // Header Area
-            this._headerAreaElement = _Global.document.createElement("DIV");
-            _ElementUtilities.addClass(this._headerAreaElement, _Constants._ClassNames.pivotHeaderArea);
-            this._element.appendChild(this._headerAreaElement);
-            // Header Items
-            this._headerItemsElement = _Global.document.createElement("DIV");
-            _ElementUtilities.addClass(this._headerItemsElement, _Constants._ClassNames.pivotHeaderItems);
-            this._headerAreaElement.appendChild(this._headerItemsElement);
-            this._headerItemsElWidth = null;
-            // Headers Container
-            this._headersContainerElement = _Global.document.createElement("DIV");
-            this._headersContainerElement.tabIndex = 0;
-            _ElementUtilities.addClass(this._headersContainerElement, _Constants._ClassNames.pivotHeaders);
-            this._headersContainerElement.addEventListener("keydown", this._headersKeyDown.bind(this));
-            _ElementUtilities._addEventListener(this._headersContainerElement, "pointerenter", this._showNavButtons.bind(this));
-            _ElementUtilities._addEventListener(this._headersContainerElement, "pointerout", this._hideNavButtons.bind(this));
-            this._headerItemsElement.appendChild(this._headersContainerElement);
-            this._element.addEventListener("click", this._elementClickedHandler.bind(this));
-            this._winKeyboard = new _KeyboardBehavior._WinKeyboard(this._headersContainerElement);
-            // Custom Headers
-            this._customLeftHeader = _Global.document.createElement("DIV");
-            _ElementUtilities.addClass(this._customLeftHeader, _Constants._ClassNames.pivotHeaderLeftCustom);
-            this._headerAreaElement.insertBefore(this._customLeftHeader, this._headerAreaElement.children[0]);
-            this._customRightHeader = _Global.document.createElement("DIV");
-            _ElementUtilities.addClass(this._customRightHeader, _Constants._ClassNames.pivotHeaderRightCustom);
-            this._headerAreaElement.appendChild(this._customRightHeader);
-            // Viewport
-            this._viewportElement = _Global.document.createElement("DIV");
-            this._viewportElement.className = _Constants._ClassNames.pivotViewport;
-            this._element.appendChild(this._viewportElement);
-            this._viewportElement.setAttribute("role", "group");
-            this._viewportElement.setAttribute("aria-label", strings.pivotViewportAriaLabel);
-            this._elementResizeInstrument = new _ElementResizeInstrument._ElementResizeInstrument();
-            this._element.appendChild(this._elementResizeInstrument.element);
-            this._elementResizeInstrument.addEventListener("resize", this._resizeHandler);
-            _ElementUtilities._inDom(this._element).then(function () {
-                if (!_this._disposed) {
-                    _this._elementResizeInstrument.addedToDom();
-                }
-            });
-            _ElementUtilities._resizeNotifier.subscribe(this.element, this._resizeHandler);
-            this._viewportElWidth = null;
-            // Surface
-            this._surfaceElement = _Global.document.createElement("DIV");
-            this._surfaceElement.className = _Constants._ClassNames.pivotSurface;
-            this._viewportElement.appendChild(this._surfaceElement);
-            this._headersState = new HeaderStateBase(this);
-            // Navigation handlers
-            if (supportsSnap) {
-                this._viewportElement.addEventListener("MSManipulationStateChanged", this._MSManipulationStateChangedHandler.bind(this));
-            }
-            else {
-                _ElementUtilities.addClass(this.element, _Constants._ClassNames.pivotNoSnap);
-                _ElementUtilities._addEventListener(this._element, "pointerdown", this._elementPointerDownHandler.bind(this));
-                _ElementUtilities._addEventListener(this._element, "pointerup", this._elementPointerUpHandler.bind(this));
-            }
-            // This internally assigns this.items which causes item to be used (even from options) before selectedIndex
-            this._parse();
-            options = _BaseUtils._shallowCopy(options);
-            if (options.items) {
-                // Set this first so selectedIndex and selectedItem can work against the new items.
-                this.items = options.items;
-                delete options.items;
-            }
-            _Control.setOptions(this, options);
-            this._refresh();
-            this._writeProfilerMark("constructor,StopTM");
-        }
-        Object.defineProperty(Pivot.prototype, "element", {
-            /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.Pivot.element" helpKeyword="WinJS.UI.Pivot.element">
-            /// Gets the DOM element that hosts the Pivot.
-            /// </field>
-            get: function () {
-                return this._element;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(Pivot.prototype, "customLeftHeader", {
-            /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.Pivot.customLeftHeader" helpKeyword="WinJS.UI.Pivot.customLeftHeader">
-            /// Gets or sets the left custom header.
-            /// </field>
-            get: function () {
-                return this._customLeftHeader.firstElementChild;
-            },
-            set: function (value) {
-                _ElementUtilities.empty(this._customLeftHeader);
-                if (value) {
-                    this._customLeftHeader.appendChild(value);
-                    _ElementUtilities.addClass(this._element, _Constants._ClassNames.pivotCustomHeaders);
-                }
-                else {
-                    if (!this._customLeftHeader.children.length && !this._customRightHeader.childNodes.length) {
-                        _ElementUtilities.removeClass(this._element, _Constants._ClassNames.pivotCustomHeaders);
-                    }
-                }
-                this.forceLayout();
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(Pivot.prototype, "customRightHeader", {
-            /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.Pivot.customRightHeader" helpKeyword="WinJS.UI.Pivot.customRightHeader">
-            /// Gets or sets the right custom header.
-            /// </field>
-            get: function () {
-                return this._customRightHeader.firstElementChild;
-            },
-            set: function (value) {
-                _ElementUtilities.empty(this._customRightHeader);
-                if (value) {
-                    this._customRightHeader.appendChild(value);
-                    _ElementUtilities.addClass(this._element, _Constants._ClassNames.pivotCustomHeaders);
-                }
-                else {
-                    if (!this._customLeftHeader.children.length && !this._customRightHeader.childNodes.length) {
-                        _ElementUtilities.removeClass(this._element, _Constants._ClassNames.pivotCustomHeaders);
-                    }
-                }
-                this.forceLayout();
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(Pivot.prototype, "locked", {
-            /// <field type="Boolean" locid="WinJS.UI.Pivot.locked" helpKeyword="WinJS.UI.Pivot.locked">
-            /// Gets or sets a value that specifies whether the Pivot is locked to the current item.
-            /// </field>
-            get: function () {
-                return _ElementUtilities.hasClass(this.element, _Constants._ClassNames.pivotLocked);
-            },
-            set: function (value) {
-                _ElementUtilities[value ? "addClass" : "removeClass"](this.element, _Constants._ClassNames.pivotLocked);
-                if (value) {
-                    this._hideNavButtons();
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(Pivot.prototype, "items", {
-            /// <field type="WinJS.Binding.List" locid="WinJS.UI.Pivot.items" helpKeyword="WinJS.UI.Pivot.items">
-            /// Gets or sets the WinJS.Binding.List of PivotItem objects that belong to this Pivot.
-            /// </field>
-            get: function () {
-                if (this._pendingItems) {
-                    return this._pendingItems;
-                }
-                return this._items;
-            },
-            set: function (value) {
-                this._pendingItems = value;
-                this._refresh();
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(Pivot.prototype, "title", {
-            /// <field type="String" locid="WinJS.UI.Pivot.title" helpKeyword="WinJS.UI.Pivot.title">
-            /// Gets or sets the title of the Pivot.
-            /// </field>
-            get: function () {
-                return this._titleElement.textContent;
-            },
-            set: function (value) {
-                if (value) {
-                    this._titleElement.style.display = "block";
-                    this._titleElement.textContent = value;
-                }
-                else {
-                    this._titleElement.style.display = "none";
-                    this._titleElement.textContent = "";
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(Pivot.prototype, "selectedIndex", {
-            /// <field type="Number" integer="true" locid="WinJS.UI.Pivot.selectedIndex" helpKeyword="WinJS.UI.Pivot.selectedIndex">
-            /// Gets or sets the index of the item in view. This property is useful for restoring a previous view when your app launches or resumes.
-            /// </field>
-            get: function () {
-                if (this.items.length === 0) {
-                    return -1;
-                }
-                return this._selectedIndex;
-            },
-            set: function (value) {
-                if (value >= 0 && value < this.items.length) {
-                    if (this._pendingRefresh) {
-                        this._selectedIndex = value;
-                    }
-                    else {
-                        this._loadItem(value);
-                    }
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(Pivot.prototype, "selectedItem", {
-            /// <field type="WinJS.UI.PivotItem" locid="WinJS.UI.Pivot.selectedItem" helpKeyword="WinJS.UI.Pivot.selectedItem">
-            /// Gets or sets the item in view. This property is useful for restoring a previous view when your app launches or resumes.
-            /// </field>
-            get: function () {
-                return this.items.getAt(this.selectedIndex);
-            },
-            set: function (value) {
-                var index = this.items.indexOf(value);
-                if (index !== -1) {
-                    this.selectedIndex = index;
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        // Public Methods
-        Pivot.prototype.dispose = function () {
-            /// <signature helpKeyword="WinJS.UI.Pivot.dispose">
-            /// <summary locid="WinJS.UI.Pivot.dispose">
-            /// Disposes this control.
-            /// </summary>
-            /// </signature>
-            if (this._disposed) {
-                return;
-            }
-            this._disposed = true;
-            this._updateEvents(this._items, null);
-            _ElementUtilities._resizeNotifier.unsubscribe(this.element, this._resizeHandler);
-            this._elementResizeInstrument.dispose();
-            this._headersState.exit();
-            _Dispose._disposeElement(this._headersContainerElement);
-            for (var i = 0, len = this.items.length; i < len; i++) {
-                this.items.getAt(i).dispose();
-            }
-        };
-        Pivot.prototype.forceLayout = function () {
-            /// <signature helpKeyword="WinJS.UI.Pivot.forceLayout">
-            /// <summary locid="WinJS.UI.Pivot.forceLayout">
-            /// Forces the control to relayout its content. This function is expected to be called
-            /// when the pivot element is manually resized.
-            /// </summary>
-            /// </signature>
-            if (this._disposed) {
-                return;
-            }
-            this._resizeHandler();
-        };
-        // Lifecycle Methods
-        Pivot.prototype._applyProperties = function () {
-            if (this._disposed) {
-                return;
-            }
-            if (this._pendingItems) {
-                this._updateEvents(this._items, this._pendingItems);
-                this._items = this._pendingItems;
-                this._pendingItems = null;
-                while (this.element.firstElementChild !== this._titleElement) {
-                    var toRemove = this.element.firstElementChild;
-                    toRemove.parentNode.removeChild(toRemove);
-                }
-                _ElementUtilities.empty(this._surfaceElement);
-            }
-            attachItems(this);
-            this._rtl = _ElementUtilities._getComputedStyle(this._element, null).direction === "rtl";
-            this._headersState.refreshHeadersState(true);
-            this._pendingRefresh = false;
-            this._firstLoad = true;
-            this.selectedIndex = this._selectedIndex;
-            this._firstLoad = false;
-            this._recenterViewport();
-            function attachItems(pivot) {
-                for (var i = 0, len = pivot.items.length; i < len; i++) {
-                    var item = pivot._items.getAt(i);
-                    if (item.element.parentNode === pivot._surfaceElement) {
-                        throw new _ErrorFromName("WinJS.UI.Pivot.DuplicateItem", strings.duplicateItem);
-                    }
-                    item.element.style.display = "none";
-                    pivot._surfaceElement.appendChild(item.element);
-                }
-            }
-        };
-        Pivot.prototype._parse = function () {
-            var pivotItems = [];
-            var pivotItemEl = this.element.firstElementChild;
-            while (pivotItemEl !== this._titleElement) {
-                ControlProcessor.processAll(pivotItemEl);
-                var pivotItemContent = pivotItemEl["winControl"];
-                if (pivotItemContent) {
-                    pivotItems.push(pivotItemContent);
-                }
-                else {
-                    throw new _ErrorFromName("WinJS.UI.Pivot.InvalidContent", strings.invalidContent);
-                }
-                var nextItemEl = pivotItemEl.nextElementSibling;
-                pivotItemEl = nextItemEl;
-            }
-            this.items = new BindingList.List(pivotItems);
-        };
-        Pivot.prototype._refresh = function () {
-            if (this._pendingRefresh) {
-                return;
-            }
-            // This is to coalesce property setting operations such as items and scrollPosition.
-            this._pendingRefresh = true;
-            Scheduler.schedule(this._applyProperties.bind(this), Scheduler.Priority.high);
-        };
-        Pivot.prototype._resizeHandler = function () {
-            if (this._disposed || this._pendingRefresh) {
-                return;
-            }
-            var oldViewportWidth = this._getViewportWidth();
-            var oldHeaderItemsWidth = this._getHeaderItemsWidth();
-            this._invalidateMeasures();
-            if (oldViewportWidth !== this._getViewportWidth() || oldHeaderItemsWidth !== this._getHeaderItemsWidth()) {
-                // Measures have changed
-                _Log.log && _Log.log('_resizeHandler, viewport from:' + oldViewportWidth + " to: " + this._getViewportWidth());
-                _Log.log && _Log.log('_resizeHandler, headers from:' + oldHeaderItemsWidth + " to: " + this._getHeaderItemsWidth());
-                this._hidePivotItemAnimation && this._hidePivotItemAnimation.cancel();
-                this._showPivotItemAnimation && this._showPivotItemAnimation.cancel();
-                this._slideHeadersAnimation && this._slideHeadersAnimation.cancel();
-                this._recenterViewport();
-                this._headersState.handleResize();
-            }
-            else {
-                _Log.log && _Log.log('_resizeHandler worthless resize');
-            }
-        };
-        // Navigation Methods
-        Pivot.prototype._activateHeader = function (headerElement) {
-            if (this.locked) {
-                return;
-            }
-            var index = this._items.indexOf(headerElement["_item"]);
-            if (index !== this.selectedIndex) {
-                this._headersState.activateHeader(headerElement);
-            }
-            else {
-                // Move focus into content for Narrator.
-                _ElementUtilities._setActiveFirstFocusableElement(this.selectedItem.element);
-            }
-        };
-        Pivot.prototype._goNext = function () {
-            if (this.selectedIndex < this._items.length - 1) {
-                this.selectedIndex++;
-            }
-            else {
-                this.selectedIndex = 0;
-            }
-        };
-        Pivot.prototype._goPrevious = function () {
-            this._animateToPrevious = true;
-            if (this.selectedIndex > 0) {
-                this.selectedIndex--;
-            }
-            else {
-                this.selectedIndex = this._items.length - 1;
-            }
-            this._animateToPrevious = false;
-        };
-        Pivot.prototype._loadItem = function (index) {
-            var _this = this;
-            this._rtl = _ElementUtilities._getComputedStyle(this._element, null).direction === "rtl";
-            this._hidePivotItemAnimation.cancel();
-            this._showPivotItemAnimation.cancel();
-            this._slideHeadersAnimation.cancel();
-            var goPrev = this._animateToPrevious;
-            var newItem = this._items.getAt(index);
-            var skipAnimation = this._firstLoad;
-            var thisLoadPromise = this._loadPromise = this._loadPromise.then(function () {
-                var oldItem = _this._items.getAt(_this.selectedIndex);
-                oldItem && _this._hidePivotItem(oldItem.element, goPrev, skipAnimation);
-                var oldIndex = _this._selectedIndex;
-                _this._selectedIndex = index;
-                var selectionChangedDetail = {
-                    index: index,
-                    direction: goPrev ? "backwards" : "forward",
-                    item: newItem
-                };
-                _this._fireEvent(_EventNames.selectionChanged, true, false, selectionChangedDetail);
-                _this._headersState.handleNavigation(goPrev, index, oldIndex);
-                // Note: Adding Promise.timeout to force asynchrony so that thisLoadPromise
-                // is set before handler executes and compares thisLoadPromise.
-                return Promise.join([newItem._process(), _this._hidePivotItemAnimation, Promise.timeout()]).then(function () {
-                    if (_this._disposed || _this._loadPromise !== thisLoadPromise) {
-                        return;
-                    }
-                    _this._recenterViewport();
-                    return _this._showPivotItem(newItem.element, goPrev, skipAnimation).then(function () {
-                        if (_this._disposed || _this._loadPromise !== thisLoadPromise) {
-                            return;
-                        }
-                        _this._loadPromise = Promise.wrap();
-                        _this._writeProfilerMark("itemAnimationStop,info");
-                        _this._fireEvent(_EventNames.itemAnimationEnd, true, false, null);
-                    });
-                });
-            });
-        };
-        Pivot.prototype._recenterViewport = function () {
-            _ElementUtilities.setScrollPosition(this._viewportElement, { scrollLeft: this._getViewportWidth() });
-            if (this.selectedItem) {
-                this.selectedItem.element.style[this._getDirectionAccessor()] = this._getViewportWidth() + "px";
-            }
-        };
-        // Utility Methods
-        Pivot.prototype._fireEvent = function (type, canBubble, cancelable, detail) {
-            // Returns true if ev.preventDefault() was not called
-            var event = _Global.document.createEvent("CustomEvent");
-            event.initCustomEvent(type, !!canBubble, !!cancelable, detail);
-            return this.element.dispatchEvent(event);
-        };
-        Pivot.prototype._getDirectionAccessor = function () {
-            return this._rtl ? "right" : "left";
-        };
-        Pivot.prototype._getHeaderItemsWidth = function () {
-            if (!this._headerItemsElWidth) {
-                this._headerItemsElWidth = parseFloat(_ElementUtilities._getComputedStyle(this._headerItemsElement).width);
-            }
-            return this._headerItemsElWidth || _invalidMeasurement;
-        };
-        Pivot.prototype._getViewportWidth = function () {
-            if (!this._viewportElWidth) {
-                this._viewportElWidth = parseFloat(_ElementUtilities._getComputedStyle(this._viewportElement).width);
-                if (supportsSnap) {
-                    this._viewportElement.style[_BaseUtils._browserStyleEquivalents["scroll-snap-points-x"].scriptName] = "snapInterval(0%, " + Math.ceil(this._viewportElWidth) + "px)";
-                }
-            }
-            return this._viewportElWidth || _invalidMeasurement;
-        };
-        Pivot.prototype._invalidateMeasures = function () {
-            this._viewportElWidth = this._headerItemsElWidth = null;
-        };
-        Pivot.prototype._updateEvents = function (oldItems, newItems) {
-            if (oldItems) {
-                oldItems.removeEventListener("itemchanged", this._handleItemChanged);
-                oldItems.removeEventListener("iteminserted", this._handleItemInserted);
-                oldItems.removeEventListener("itemmoved", this._handleItemMoved);
-                oldItems.removeEventListener("itemremoved", this._handleItemRemoved);
-                oldItems.removeEventListener("reload", this._handleItemReload);
-            }
-            if (newItems) {
-                newItems.addEventListener("itemchanged", this._handleItemChanged);
-                newItems.addEventListener("iteminserted", this._handleItemInserted);
-                newItems.addEventListener("itemmoved", this._handleItemMoved);
-                newItems.addEventListener("itemremoved", this._handleItemRemoved);
-                newItems.addEventListener("reload", this._handleItemReload);
-            }
-        };
-        Pivot.prototype._writeProfilerMark = function (text) {
-            var message = "WinJS.UI.Pivot:" + this._id + ":" + text;
-            _WriteProfilerMark(message);
-            _Log.log && _Log.log(message, null, "pivotprofiler");
-        };
-        // Datasource Mutation Handlers
-        Pivot.prototype._handleItemChanged = function (ev) {
-            // Change is triggered by binding list setAt() API.
-            if (this._pendingItems) {
-                return;
-            }
-            var index = ev.detail.index;
-            var newItem = ev.detail.newValue;
-            var oldItem = ev.detail.oldValue;
-            if (newItem.element !== oldItem.element) {
-                if (newItem.element.parentNode === this._surfaceElement) {
-                    throw new _ErrorFromName("WinJS.UI.Pivot.DuplicateItem", strings.duplicateItem);
-                }
-                newItem.element.style.display = "none";
-                this._surfaceElement.insertBefore(newItem.element, oldItem.element);
-                this._surfaceElement.removeChild(oldItem.element);
-                if (index === this.selectedIndex) {
-                    this.selectedIndex = index;
-                }
-            }
-            this._headersState.render();
-            this._headersState.refreshHeadersState(true);
-        };
-        Pivot.prototype._handleItemInserted = function (ev) {
-            // Insert is triggered by binding list insert APIs such as splice(), push(), and unshift().
-            if (this._pendingItems) {
-                return;
-            }
-            var index = ev.detail.index;
-            var item = ev.detail.value;
-            if (item.element.parentNode === this._surfaceElement) {
-                throw new _ErrorFromName("WinJS.UI.Pivot.DuplicateItem", strings.duplicateItem);
-            }
-            item.element.style.display = "none";
-            if (index < this.items.length - 1) {
-                this._surfaceElement.insertBefore(item.element, this.items.getAt(index + 1).element);
-            }
-            else {
-                this._surfaceElement.appendChild(item.element);
-            }
-            this._headersState.render();
-            this._headersState.refreshHeadersState(true);
-            if (index <= this.selectedIndex) {
-                this._selectedIndex++;
-            }
-            if (this._items.length === 1) {
-                this.selectedIndex = 0;
-            }
-        };
-        Pivot.prototype._handleItemMoved = function (ev) {
-            // Move is triggered by binding list move() API.
-            if (this._pendingItems) {
-                return;
-            }
-            var oldIndex = ev.detail.oldIndex;
-            var newIndex = ev.detail.newIndex;
-            var item = ev.detail.value;
-            if (newIndex < this.items.length - 1) {
-                this._surfaceElement.insertBefore(item.element, this.items.getAt(newIndex + 1).element);
-            }
-            else {
-                this._surfaceElement.appendChild(item.element);
-            }
-            if (oldIndex < this.selectedIndex && newIndex >= this.selectedIndex) {
-                this._selectedIndex--;
-            }
-            else if (newIndex > this.selectedIndex && oldIndex <= this.selectedIndex) {
-                this._selectedIndex++;
-            }
-            else if (oldIndex === this.selectedIndex) {
-                this.selectedIndex = this.selectedIndex;
-            }
-            this._headersState.render();
-            this._headersState.refreshHeadersState(true);
-        };
-        Pivot.prototype._handleItemReload = function () {
-            // Reload is triggered by large operations on the binding list such as reverse(). This causes
-            // _pendingItems to be true which ignores future insert/remove/modified/moved events until the new
-            // items list is applied.
-            this.items = this.items;
-        };
-        Pivot.prototype._handleItemRemoved = function (ev) {
-            // Removed is triggered by binding list removal APIs such as splice(), pop(), and shift().
-            if (this._pendingItems) {
-                return;
-            }
-            var item = ev.detail.value;
-            var index = ev.detail.index;
-            this._surfaceElement.removeChild(item.element);
-            if (index < this.selectedIndex) {
-                this._selectedIndex--;
-            }
-            else if (index === this._selectedIndex) {
-                this.selectedIndex = Math.min(this.items.length - 1, this._selectedIndex);
-            }
-            this._headersState.render();
-            this._headersState.refreshHeadersState(true);
-        };
-        // Event Handlers
-        Pivot.prototype._elementClickedHandler = function (e) {
-            if (this.locked || this._navigationHandled) {
-                this._navigationHandled = false;
-                return;
-            }
-            var header;
-            var src = e.target;
-            if (_ElementUtilities.hasClass(src, _Constants._ClassNames.pivotHeader)) {
-                // UIA invoke clicks on the real header elements.
-                header = src;
-            }
-            else {
-                var hitSrcElement = false;
-                var hitTargets = _ElementUtilities._elementsFromPoint(e.clientX, e.clientY);
-                if (hitTargets && hitTargets[0] === this._viewportElement) {
-                    for (var i = 0, len = hitTargets.length; i < len; i++) {
-                        if (hitTargets[i] === src) {
-                            hitSrcElement = true;
-                        }
-                        if (_ElementUtilities.hasClass(hitTargets[i], _Constants._ClassNames.pivotHeader)) {
-                            header = hitTargets[i];
-                        }
-                    }
-                }
-                if (!hitSrcElement) {
-                    // The click's coordinates and source element do not correspond so we
-                    // can't trust the coordinates. Ignore the click. This case happens in
-                    // clicks triggered by UIA invoke because UIA invoke uses the top left
-                    // of the window as the coordinates of every click.
-                    header = null;
-                }
-            }
-            if (header) {
-                this._activateHeader(header);
-            }
-        };
-        Pivot.prototype._elementPointerDownHandler = function (e) {
-            if (supportsSnap) {
-                return;
-            }
-            var element = e.target;
-            this._elementPointerDownPoint = { x: e.clientX, y: e.clientY, type: e.pointerType || "mouse", time: Date.now(), inHeaders: this._headersContainerElement.contains(element) };
-        };
-        Pivot.prototype._elementPointerUpHandler = function (e) {
-            if (!this._elementPointerDownPoint || this.locked) {
-                this._elementPointerDownPoint = null;
-                return;
-            }
-            var element = e.target;
-            var filterDistance = 32;
-            var dyDxThresholdRatio = 0.4;
-            var dy = Math.abs(e.clientY - this._elementPointerDownPoint.y);
-            var dx = e.clientX - this._elementPointerDownPoint.x;
-            var thresholdY = Math.abs(dx * dyDxThresholdRatio);
-            var doSwipeDetection = dy < thresholdY && Math.abs(dx) > filterDistance && (!_ElementUtilities._supportsTouchDetection || (this._elementPointerDownPoint.type === e.pointerType && e.pointerType === PT_TOUCH)) && (!this.element.classList.contains(_Constants._ClassNames.pivotDisableContentSwipeNavigation) || (this._elementPointerDownPoint.inHeaders && this._headersContainerElement.contains(element)));
-            this._navigationHandled = false;
-            if (doSwipeDetection) {
-                // Swipe navigation detection
-                // Simulate inertia by multiplying dx by a polynomial function of dt
-                var dt = Date.now() - this._elementPointerDownPoint.time;
-                dx *= Math.max(1, Math.pow(350 / dt, 2));
-                dx = this._rtl ? -dx : dx;
-                var vwDiv4 = this._getViewportWidth() / 4;
-                if (dx < -vwDiv4) {
-                    this._goNext();
-                    this._navigationHandled = true;
-                }
-                else if (dx > vwDiv4) {
-                    this._goPrevious();
-                    this._navigationHandled = true;
-                }
-            }
-            if (!this._navigationHandled) {
-                while (element !== null && !_ElementUtilities.hasClass(element, _Constants._ClassNames.pivotHeader)) {
-                    element = element.parentElement;
-                }
-                if (element !== null) {
-                    this._activateHeader(element);
-                    this._navigationHandled = true;
-                }
-            }
-            this._elementPointerDownPoint = null;
-        };
-        Pivot.prototype._headersKeyDown = function (e) {
-            if (this.locked) {
-                return;
-            }
-            if (e.keyCode === Keys.leftArrow || e.keyCode === Keys.pageUp) {
-                this._rtl ? this._goNext() : this._goPrevious();
-                e.preventDefault();
-            }
-            else if (e.keyCode === Keys.rightArrow || e.keyCode === Keys.pageDown) {
-                this._rtl ? this._goPrevious() : this._goNext();
-                e.preventDefault();
-            }
-        };
-        Pivot.prototype._hideNavButtons = function (e) {
-            if (e && this._headersContainerElement.contains(e.relatedTarget)) {
-                // Don't hide the nav button if the pointerout event is being fired from going
-                // from one element to another within the header track.
-                return;
-            }
-            _ElementUtilities.removeClass(this._headersContainerElement, _Constants._ClassNames.pivotShowNavButtons);
-        };
-        Pivot.prototype._hidePivotItem = function (element, goPrevious, skipAnimation) {
-            if (skipAnimation || !_TransitionAnimation.isAnimationEnabled()) {
-                element.style.display = "none";
-                this._hidePivotItemAnimation = Promise.wrap();
-                return this._hidePivotItemAnimation;
-            }
-            this._hidePivotItemAnimation = _TransitionAnimation.executeTransition(element, {
-                property: "opacity",
-                delay: 0,
-                duration: 67,
-                timing: "linear",
-                from: "",
-                to: "0",
-            }).then(function () {
-                element.style.display = "none";
-            });
-            return this._hidePivotItemAnimation;
-        };
-        Pivot.prototype._MSManipulationStateChangedHandler = function (e) {
-            if (e.target !== this._viewportElement) {
-                // Ignore sub scroller manipulations.
-                return;
-            }
-            if (e.currentState === _ElementUtilities._MSManipulationEvent.MS_MANIPULATION_STATE_INERTIA) {
-                var delta = e["inertiaDestinationX"] - this._getViewportWidth();
-                if (delta > 0) {
-                    this._goNext();
-                }
-                else if (delta < 0) {
-                    this._goPrevious();
-                }
-            }
-        };
-        Pivot.prototype._updatePointerType = function (e) {
-            if (this._pointerType === (e.pointerType || PT_MOUSE)) {
-                return;
-            }
-            this._pointerType = e.pointerType || PT_MOUSE;
-            if (this._pointerType === PT_TOUCH) {
-                _ElementUtilities.removeClass(this.element, _Constants._ClassNames.pivotInputTypeMouse);
-                _ElementUtilities.addClass(this.element, _Constants._ClassNames.pivotInputTypeTouch);
-                this._hideNavButtons();
-            }
-            else {
-                _ElementUtilities.removeClass(this.element, _Constants._ClassNames.pivotInputTypeTouch);
-                _ElementUtilities.addClass(this.element, _Constants._ClassNames.pivotInputTypeMouse);
-            }
-        };
-        Pivot.prototype._showNavButtons = function (e) {
-            if (this.locked || (e && e.pointerType === PT_TOUCH)) {
-                return;
-            }
-            _ElementUtilities.addClass(this._headersContainerElement, _Constants._ClassNames.pivotShowNavButtons);
-        };
-        Pivot.prototype._showPivotItem = function (element, goPrevious, skipAnimation) {
-            this._writeProfilerMark("itemAnimationStart,info");
-            this._fireEvent(_EventNames.itemAnimationStart, true, false, null);
-            element.style.display = "";
-            if (skipAnimation || !_TransitionAnimation.isAnimationEnabled()) {
-                element.style.opacity = "";
-                this._showPivotItemAnimation = Promise.wrap();
-                return this._showPivotItemAnimation;
-            }
-            var negativeTransform = this._rtl ? !goPrevious : goPrevious;
-            // Find the elements to slide in
-            function filterOnScreen(element) {
-                var elementBoundingClientRect = element.getBoundingClientRect();
-                // Can't check left/right since it might be scrolled off.
-                return elementBoundingClientRect.top < viewportBoundingClientRect.bottom && elementBoundingClientRect.bottom > viewportBoundingClientRect.top;
-            }
-            var viewportBoundingClientRect = this._viewportElement.getBoundingClientRect();
-            var slideGroup1Els = element.querySelectorAll(".win-pivot-slide1");
-            var slideGroup2Els = element.querySelectorAll(".win-pivot-slide2");
-            var slideGroup3Els = element.querySelectorAll(".win-pivot-slide3");
-            //Filter the slide groups to the elements actually on screen to avoid animating extra elements
-            slideGroup1Els = Array.prototype.filter.call(slideGroup1Els, filterOnScreen);
-            slideGroup2Els = Array.prototype.filter.call(slideGroup2Els, filterOnScreen);
-            slideGroup3Els = Array.prototype.filter.call(slideGroup3Els, filterOnScreen);
-            this._showPivotItemAnimation = Promise.join([
-                _TransitionAnimation.executeTransition(element, {
-                    property: "opacity",
-                    delay: 0,
-                    duration: 333,
-                    timing: "cubic-bezier(0.1,0.9,0.2,1)",
-                    from: "0",
-                    to: "",
-                }),
-                _TransitionAnimation.executeTransition(element, {
-                    property: _BaseUtils._browserStyleEquivalents["transform"].cssName,
-                    delay: 0,
-                    duration: 767,
-                    timing: "cubic-bezier(0.1,0.9,0.2,1)",
-                    from: "translateX(" + (negativeTransform ? "-20px" : "20px") + ")",
-                    to: "",
-                }),
-                Animations[negativeTransform ? "slideRightIn" : "slideLeftIn"](null, slideGroup1Els, slideGroup2Els, slideGroup3Els)
-            ]);
-            return this._showPivotItemAnimation;
-        };
-        Pivot.supportedForProcessing = true;
-        Pivot._ClassNames = _Constants._ClassNames;
-        Pivot._EventNames = _EventNames;
-        return Pivot;
-    })();
-    exports.Pivot = Pivot;
-    var HeaderStateBase = (function () {
-        function HeaderStateBase(pivot) {
-            this.pivot = pivot;
-        }
-        // Called when transitioning away from this state
-        HeaderStateBase.prototype.exit = function () {
-        };
-        // Render headers
-        HeaderStateBase.prototype.render = function (goPrevious) {
-        };
-        // Called when a header is activated, i.e. tapped, clicked, arrow keyed to
-        HeaderStateBase.prototype.activateHeader = function (header) {
-        };
-        // Called when the selectedIndex changed
-        HeaderStateBase.prototype.handleNavigation = function (goPrevious, index, oldIndex) {
-        };
-        // Called when the control size changed
-        HeaderStateBase.prototype.handleResize = function () {
-        };
-        // Called when the header string of the specified pivotItem changed
-        HeaderStateBase.prototype.handleHeaderChanged = function (pivotItem) {
-        };
-        HeaderStateBase.prototype.getCumulativeHeaderWidth = function (index) {
-            // Computes the total width of headers from 0 up to the specified index
-            if (index === 0) {
-                return 0;
-            }
-            var originalLength = this.pivot._headersContainerElement.children.length;
-            for (var i = 0; i < index; i++) {
-                var header = this.renderHeader(i, false);
-                this.pivot._headersContainerElement.appendChild(header);
-            }
-            var width = 0;
-            var leftElement = (this.pivot._rtl ? this.pivot._headersContainerElement.lastElementChild : this.pivot._headersContainerElement.children[originalLength]);
-            var rightElement = (this.pivot._rtl ? this.pivot._headersContainerElement.children[originalLength] : this.pivot._headersContainerElement.lastElementChild);
-            width = (rightElement.offsetLeft + rightElement.offsetWidth) - leftElement.offsetLeft;
-            width += 2 * HeaderStateBase.headerHorizontalMargin;
-            for (var i = 0; i < index; i++) {
-                this.pivot._headersContainerElement.removeChild(this.pivot._headersContainerElement.lastElementChild);
-            }
-            return width;
-        };
-        HeaderStateBase.prototype.refreshHeadersState = function (invalidateCache) {
-            // Measures the cumulative header length and switches headers states if necessary
-            if (invalidateCache) {
-                this.cachedHeaderWidth = 0;
-            }
-            var width = this.cachedHeaderWidth || this.getCumulativeHeaderWidth(this.pivot.items.length);
-            this.cachedHeaderWidth = width;
-            if (width > this.pivot._getHeaderItemsWidth() && !(this.pivot["_headersState"] instanceof HeaderStateOverflow)) {
-                this.exit();
-                this.pivot["_headersState"] = new HeaderStateOverflow(this.pivot);
-            }
-            else if (width <= this.pivot._getHeaderItemsWidth() && !(this.pivot["_headersState"] instanceof HeaderStateStatic)) {
-                this.exit();
-                this.pivot["_headersState"] = new HeaderStateStatic(this.pivot);
-            }
-        };
-        HeaderStateBase.prototype.renderHeader = function (index, aria) {
-            // Renders a single header
-            var that = this;
-            var template = _ElementUtilities._syncRenderer(pivotDefaultHeaderTemplate);
-            var item = this.pivot.items.getAt(index);
-            var headerContainerEl = _Global.document.createElement("BUTTON");
-            headerContainerEl.tabIndex = -1;
-            headerContainerEl.setAttribute("type", "button");
-            headerContainerEl.style.marginLeft = headerContainerEl.style.marginRight = HeaderStateBase.headerHorizontalMargin + "px";
-            _ElementUtilities.addClass(headerContainerEl, _Constants._ClassNames.pivotHeader);
-            headerContainerEl["_item"] = item;
-            headerContainerEl["_pivotItemIndex"] = index;
-            template(item, headerContainerEl);
-            function ariaSelectedMutated() {
-                if (that.pivot._disposed) {
-                    return;
-                }
-                if (that.pivot._headersContainerElement.contains(headerContainerEl) && index !== that.pivot.selectedIndex && headerContainerEl.getAttribute('aria-selected') === "true") {
-                    // Ignore aria selected changes on selected item.
-                    // By selecting another tab we change to it.
-                    that.pivot.selectedIndex = index;
-                }
-            }
-            if (aria) {
-                headerContainerEl.setAttribute('aria-selected', "" + (index === this.pivot.selectedIndex));
-                headerContainerEl.setAttribute('role', 'tab');
-                new _ElementUtilities._MutationObserver(ariaSelectedMutated).observe(headerContainerEl, { attributes: true, attributeFilter: ["aria-selected"] });
-            }
-            return headerContainerEl;
-        };
-        HeaderStateBase.prototype.updateHeader = function (item) {
-            // Updates the label of a header
-            var index = this.pivot.items.indexOf(item);
-            var headerElement = this.pivot._headersContainerElement.children[index];
-            headerElement.innerHTML = "";
-            var template = _ElementUtilities._syncRenderer(pivotDefaultHeaderTemplate);
-            template(item, headerElement);
-        };
-        HeaderStateBase.prototype.setActiveHeader = function (newSelectedHeader) {
-            // Updates the selected header and clears the previously selected header if applicable
-            var focusWasInHeaders = false;
-            var currentSelectedHeader = this.pivot._headersContainerElement.querySelector("." + _Constants._ClassNames.pivotHeaderSelected);
-            if (currentSelectedHeader) {
-                currentSelectedHeader.classList.remove(_Constants._ClassNames.pivotHeaderSelected);
-                currentSelectedHeader.setAttribute("aria-selected", "false");
-                focusWasInHeaders = this.pivot._headersContainerElement.contains(_Global.document.activeElement);
-            }
-            newSelectedHeader.classList.add(_Constants._ClassNames.pivotHeaderSelected);
-            newSelectedHeader.setAttribute("aria-selected", "true");
-            focusWasInHeaders && this.pivot._headersContainerElement.focus();
-        };
-        HeaderStateBase.headersContainerLeadingMargin = 12;
-        HeaderStateBase.headerHorizontalMargin = 12;
-        return HeaderStateBase;
-    })();
-    // This state renders headers statically in the order they appear in the binding list.
-    // There is no animation when the selectedIndex changes, only the highlighted header changes.
-    var HeaderStateStatic = (function (_super) {
-        __extends(HeaderStateStatic, _super);
-        function HeaderStateStatic(pivot) {
-            _super.call(this, pivot);
-            this._firstRender = true;
-            this._transitionAnimation = Promise.wrap();
-            if (pivot._headersContainerElement.children.length && _TransitionAnimation.isAnimationEnabled()) {
-                // We transitioned from another headers state, do transition animation
-                // Calculate the offset from the selected header to where the selected header should be in static layout
-                var selectedHeader = pivot._headersContainerElement.querySelector("." + _Constants._ClassNames.pivotHeaderSelected);
-                var start = 0;
-                var end = 0;
-                if (pivot._rtl) {
-                    start = selectedHeader.offsetLeft + selectedHeader.offsetWidth + HeaderStateBase.headerHorizontalMargin;
-                    end = pivot._getHeaderItemsWidth() - this.getCumulativeHeaderWidth(pivot.selectedIndex) - HeaderStateBase.headersContainerLeadingMargin;
-                    end += parseFloat(pivot._headersContainerElement.style.marginLeft);
-                }
-                else {
-                    start = selectedHeader.offsetLeft;
-                    start += parseFloat(pivot._headersContainerElement.style.marginLeft); // overflow state has a hidden first element that we need to account for
-                    end = this.getCumulativeHeaderWidth(pivot.selectedIndex) + HeaderStateBase.headersContainerLeadingMargin + HeaderStateBase.headerHorizontalMargin;
-                }
-                var offset = start - end;
-                this.render();
-                // Offset every header by the calculated offset so there is no visual difference after the render call
-                var transformProperty = _BaseUtils._browserStyleEquivalents["transform"].cssName;
-                var transformValue = "translateX(" + offset + "px)";
-                for (var i = 0, l = pivot._headersContainerElement.children.length; i < l; i++) {
-                    pivot._headersContainerElement.children[i].style[transformProperty] = transformValue;
-                }
-                // Transition headers back to their original location
-                this._transitionAnimation = _TransitionAnimation.executeTransition(pivot._headersContainerElement.querySelectorAll("." + _Constants._ClassNames.pivotHeader), {
-                    property: transformProperty,
-                    delay: 0,
-                    duration: _headerSlideAnimationDuration,
-                    timing: "ease-out",
-                    to: ""
-                });
-            }
-            else {
-                this.render();
-            }
-        }
-        HeaderStateStatic.prototype.exit = function () {
-            this._transitionAnimation.cancel();
-        };
-        HeaderStateStatic.prototype.render = function () {
-            var pivot = this.pivot;
-            if (pivot._pendingRefresh || !pivot._items) {
-                return;
-            }
-            _Dispose._disposeElement(pivot._headersContainerElement);
-            _ElementUtilities.empty(pivot._headersContainerElement);
-            if (pivot._rtl) {
-                pivot._headersContainerElement.style.marginLeft = "0px";
-                pivot._headersContainerElement.style.marginRight = HeaderStateBase.headersContainerLeadingMargin + "px";
-            }
-            else {
-                pivot._headersContainerElement.style.marginLeft = HeaderStateBase.headersContainerLeadingMargin + "px";
-                pivot._headersContainerElement.style.marginRight = "0px";
-            }
-            pivot._viewportElement.style.overflow = pivot.items.length === 1 ? "hidden" : "";
-            if (pivot.items.length) {
-                for (var i = 0; i < pivot.items.length; i++) {
-                    var header = this.renderHeader(i, true);
-                    pivot._headersContainerElement.appendChild(header);
-                    if (i === pivot.selectedIndex) {
-                        header.classList.add(_Constants._ClassNames.pivotHeaderSelected);
-                    }
-                }
-            }
-            this._firstRender = false;
-        };
-        HeaderStateStatic.prototype.activateHeader = function (headerElement) {
-            this.setActiveHeader(headerElement);
-            this.pivot._animateToPrevious = headerElement["_pivotItemIndex"] < this.pivot.selectedIndex;
-            this.pivot.selectedIndex = headerElement["_pivotItemIndex"];
-            this.pivot._animateToPrevious = false;
-        };
-        HeaderStateStatic.prototype.handleNavigation = function (goPrevious, index, oldIndex) {
-            if (this._firstRender) {
-                this.render();
-            }
-            this.setActiveHeader(this.pivot._headersContainerElement.children[index]);
-        };
-        HeaderStateStatic.prototype.handleResize = function () {
-            this.refreshHeadersState(false);
-        };
-        HeaderStateStatic.prototype.handleHeaderChanged = function (pivotItem) {
-            this.updateHeader(pivotItem);
-            this.refreshHeadersState(true);
-        };
-        return HeaderStateStatic;
-    })(HeaderStateBase);
-    // This state renders the selected header always left-aligned (in ltr) and
-    // animates the headers when the selectedIndex changes.
-    var HeaderStateOverflow = (function (_super) {
-        __extends(HeaderStateOverflow, _super);
-        function HeaderStateOverflow(pivot) {
-            _super.call(this, pivot);
-            this._blocked = false;
-            this._firstRender = true;
-            this._transitionAnimation = Promise.wrap();
-            pivot._slideHeadersAnimation = Promise.wrap();
-            if (pivot._headersContainerElement.children.length && _TransitionAnimation.isAnimationEnabled()) {
-                // We transitioned from another headers state, do transition animation
-                var that = this;
-                var done = function () {
-                    that._blocked = false;
-                    that.render();
-                };
-                this._blocked = true;
-                // Calculate the offset from the selected header to the leading edge of the container
-                var selectedHeader = pivot._headersContainerElement.querySelector("." + _Constants._ClassNames.pivotHeaderSelected);
-                var start = 0;
-                var end = 0;
-                if (pivot._rtl) {
-                    start = pivot._getHeaderItemsWidth() - HeaderStateBase.headersContainerLeadingMargin;
-                    end = selectedHeader.offsetLeft;
-                    end += HeaderStateBase.headerHorizontalMargin;
-                    end += selectedHeader.offsetWidth;
-                    end += parseFloat(pivot._headersContainerElement.style.marginLeft);
-                }
-                else {
-                    start = HeaderStateBase.headersContainerLeadingMargin;
-                    end = selectedHeader.offsetLeft;
-                    end -= HeaderStateBase.headerHorizontalMargin;
-                    end += parseFloat(pivot._headersContainerElement.style.marginLeft);
-                }
-                var offset = start - end;
-                for (var i = 0; i < pivot.selectedIndex; i++) {
-                    pivot._headersContainerElement.appendChild(pivot._headersContainerElement.children[i].cloneNode(true));
-                }
-                // Transition headers to the leading edge of the container, then render the container as usual
-                var transformProperty = _BaseUtils._browserStyleEquivalents["transform"].cssName;
-                this._transitionAnimation = _TransitionAnimation.executeTransition(pivot._headersContainerElement.querySelectorAll("." + _Constants._ClassNames.pivotHeader), {
-                    property: transformProperty,
-                    delay: 0,
-                    duration: _headerSlideAnimationDuration,
-                    timing: "ease-out",
-                    to: "translateX(" + offset + "px)"
-                }).then(done, done);
-            }
-            else {
-                this.render();
-            }
-        }
-        HeaderStateOverflow.prototype.exit = function () {
-            this._transitionAnimation.cancel();
-            this.pivot._slideHeadersAnimation.cancel();
-        };
-        HeaderStateOverflow.prototype.render = function (goPrevious) {
-            var pivot = this.pivot;
-            if (this._blocked || pivot._pendingRefresh || !pivot._items) {
-                return;
-            }
-            var restoreFocus = pivot._headersContainerElement.contains(_Global.document.activeElement);
-            _Dispose._disposeElement(pivot._headersContainerElement);
-            _ElementUtilities.empty(pivot._headersContainerElement);
-            if (pivot._items.length === 1) {
-                var header = this.renderHeader(0, true);
-                header.classList.add(_Constants._ClassNames.pivotHeaderSelected);
-                pivot._headersContainerElement.appendChild(header);
-                pivot._viewportElement.style.overflow = "hidden";
-                pivot._headersContainerElement.style.marginLeft = "0px";
-                pivot._headersContainerElement.style.marginRight = "0px";
-            }
-            else if (pivot._items.length > 1) {
-                // We always render 1 additional header before the current item.
-                // When going backwards, we render 2 additional headers, the first one as usual, and the second one for
-                // fading out the previous last header.
-                var numberOfHeadersToRender = pivot._items.length + (goPrevious ? 2 : 1);
-                var maxHeaderWidth = pivot._getHeaderItemsWidth() * 0.8;
-                var indexToRender = pivot.selectedIndex - 1;
-                if (pivot._viewportElement.style.overflow) {
-                    pivot._viewportElement.style.overflow = "";
-                }
-                for (var i = 0; i < numberOfHeadersToRender; i++) {
-                    if (indexToRender === -1) {
-                        indexToRender = pivot._items.length - 1;
-                    }
-                    else if (indexToRender === pivot._items.length) {
-                        indexToRender = 0;
-                    }
-                    var header = this.renderHeader(indexToRender, true);
-                    pivot._headersContainerElement.appendChild(header);
-                    if (header.offsetWidth > maxHeaderWidth) {
-                        header.style.textOverflow = "ellipsis";
-                        header.style.width = maxHeaderWidth + "px";
-                    }
-                    if (indexToRender === pivot.selectedIndex) {
-                        header.classList.add(_Constants._ClassNames.pivotHeaderSelected);
-                    }
-                    indexToRender++;
-                }
-                if (!pivot._firstLoad && !this._firstRender) {
-                    var start, end;
-                    if (goPrevious) {
-                        start = "";
-                        end = "0";
-                    }
-                    else {
-                        start = "0";
-                        end = "";
-                    }
-                    var lastHeader = pivot._headersContainerElement.children[numberOfHeadersToRender - 1];
-                    lastHeader.style.opacity = start;
-                    var lastHeaderFadeInDuration = 0.167;
-                    lastHeader.style[_BaseUtils._browserStyleEquivalents["transition"].scriptName] = "opacity " + _TransitionAnimation._animationTimeAdjustment(lastHeaderFadeInDuration) + "s";
-                    _ElementUtilities._getComputedStyle(lastHeader).opacity;
-                    lastHeader.style.opacity = end;
-                }
-                pivot._headersContainerElement.children[0].setAttribute("aria-hidden", "true");
-                pivot._headersContainerElement.style.marginLeft = "0px";
-                pivot._headersContainerElement.style.marginRight = "0px";
-                var leadingMargin = pivot._rtl ? "marginRight" : "marginLeft";
-                var firstHeader = pivot._headersContainerElement.children[0];
-                var leadingSpace = _ElementUtilities.getTotalWidth(firstHeader) - HeaderStateBase.headersContainerLeadingMargin;
-                if (firstHeader !== pivot._headersContainerElement.children[0]) {
-                    // Calling getTotalWidth caused a layout which can trigger a synchronous resize which in turn
-                    // calls renderHeaders. We can ignore this one since its the old headers which are not in the DOM.
-                    return;
-                }
-                pivot._headersContainerElement.style[leadingMargin] = (-1 * leadingSpace) + "px";
-                // Create header track nav button elements
-                pivot._prevButton = _Global.document.createElement("button");
-                pivot._prevButton.setAttribute("type", "button");
-                _ElementUtilities.addClass(pivot._prevButton, _Constants._ClassNames.pivotNavButton);
-                _ElementUtilities.addClass(pivot._prevButton, _Constants._ClassNames.pivotNavButtonPrev);
-                pivot._prevButton.addEventListener("click", function () {
-                    if (pivot.locked) {
-                        return;
-                    }
-                    pivot._rtl ? pivot._goNext() : pivot._goPrevious();
-                });
-                pivot._headersContainerElement.appendChild(pivot._prevButton);
-                pivot._prevButton.style.left = pivot._rtl ? "0px" : leadingSpace + "px";
-                pivot._nextButton = _Global.document.createElement("button");
-                pivot._nextButton.setAttribute("type", "button");
-                _ElementUtilities.addClass(pivot._nextButton, _Constants._ClassNames.pivotNavButton);
-                _ElementUtilities.addClass(pivot._nextButton, _Constants._ClassNames.pivotNavButtonNext);
-                pivot._nextButton.addEventListener("click", function () {
-                    if (pivot.locked) {
-                        return;
-                    }
-                    pivot._rtl ? pivot._goPrevious() : pivot._goNext();
-                });
-                pivot._headersContainerElement.appendChild(pivot._nextButton);
-                pivot._nextButton.style.right = pivot._rtl ? leadingSpace + "px" : "0px";
-            }
-            var firstHeaderIndex = pivot._headersContainerElement.children.length > 1 ? 1 : 0;
-            if (restoreFocus) {
-                pivot._headersContainerElement.focus();
-            }
-            this._firstRender = false;
-        };
-        HeaderStateOverflow.prototype.activateHeader = function (headerElement) {
-            if (!headerElement.previousSibling) {
-                // prevent clicking the previous header
-                return;
-            }
-            this.pivot.selectedIndex = headerElement["_pivotItemIndex"];
-        };
-        HeaderStateOverflow.prototype.handleNavigation = function (goPrevious, index, oldIndex) {
-            var that = this;
-            var pivot = this.pivot;
-            if (this._blocked || index < 0 || pivot._firstLoad) {
-                this.render(goPrevious);
-                return;
-            }
-            var targetHeader;
-            if (goPrevious) {
-                targetHeader = pivot._headersContainerElement.children[0];
-            }
-            else {
-                if (index < oldIndex) {
-                    index += pivot._items.length;
-                }
-                targetHeader = pivot._headersContainerElement.children[1 + index - oldIndex];
-            }
-            if (!targetHeader) {
-                this.render(goPrevious);
-                return;
-            }
-            // Update the selected one:
-            _ElementUtilities.removeClass(pivot._headersContainerElement.children[1], _Constants._ClassNames.pivotHeaderSelected);
-            _ElementUtilities.addClass(targetHeader, _Constants._ClassNames.pivotHeaderSelected);
-            var rtl = pivot._rtl;
-            function offset(element) {
-                if (rtl) {
-                    return element.offsetParent.offsetWidth - element.offsetLeft - element.offsetWidth;
-                }
-                else {
-                    return element.offsetLeft;
-                }
-            }
-            var endPosition = offset(pivot._headersContainerElement.children[1]) - offset(targetHeader);
-            if (rtl) {
-                endPosition *= -1;
-            }
-            function headerCleanup() {
-                if (pivot._disposed) {
-                    return;
-                }
-                that.render(goPrevious);
-                pivot._slideHeadersAnimation = Promise.wrap();
-            }
-            var headerAnimation;
-            if (_TransitionAnimation.isAnimationEnabled()) {
-                headerAnimation = _TransitionAnimation.executeTransition(pivot._headersContainerElement.querySelectorAll("." + _Constants._ClassNames.pivotHeader), {
-                    property: _BaseUtils._browserStyleEquivalents["transform"].cssName,
-                    delay: 0,
-                    duration: _headerSlideAnimationDuration,
-                    timing: "ease-out",
-                    to: "translateX(" + endPosition + "px)"
-                });
-            }
-            else {
-                headerAnimation = Promise.wrap();
-            }
-            pivot._slideHeadersAnimation = headerAnimation.then(headerCleanup, headerCleanup);
-        };
-        HeaderStateOverflow.prototype.handleResize = function () {
-            this.refreshHeadersState(false);
-        };
-        HeaderStateOverflow.prototype.handleHeaderChanged = function (pivotItem) {
-            this.render();
-            this.refreshHeadersState(true);
-        };
-        return HeaderStateOverflow;
-    })(HeaderStateBase);
-    _Base.Class.mix(Pivot, _Events.createEventProperties(_EventNames.itemAnimationEnd, _EventNames.itemAnimationStart, _EventNames.selectionChanged));
-    _Base.Class.mix(Pivot, _Control.DOMEventMixin);
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <reference path="../../../../typings/require.d.ts" />
-define('WinJS/Controls/Pivot',["require", "exports", '../Core/_Base', './Pivot/_Item'], function (require, exports, _Base, _Item) {
-    // We need PivotItem to be added to the public WinJS.UI namespace immediately.
-    // Force load the PivotItem module by accessing an undefined property on it.
-    // We do this to prevent:
-    //   1) the TypeScript compiler from optimizing it away since we don't use it 
-    //      anywhere else in this file. 
-    //   2) triggering a premature unwrap of the lazily loaded PivotItem module
-    //      which would happen if we accessed the _Item.PivotItem getter now.
-    _Item["touch"];
-    var module = null;
-    _Base.Namespace.define("WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.Pivot">
-        /// Tab control which displays a item of content.
-        /// </summary>
-        /// </field>
-        /// <icon src="ui_winjs.ui.pivot.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.pivot.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.Pivot">
-        /// <div data-win-control="WinJS.UI.PivotItem" data-win-options="{header: 'PivotItem Header'}">PivotItem Content</div>
-        /// </div>]]></htmlSnippet>
-        /// <event name="selectionchanged" bubbles="true" locid="WinJS.UI.Pivot_e:selectionchanged">Raised when the item on screen has changed.</event>
-        /// <event name="itemanimationstart" bubbles="true" locid="WinJS.UI.Pivot_e:itemloaded">Raised when the item's animation starts.</event>
-        /// <event name="itemanimationend" bubbles="true" locid="WinJS.UI.Pivot_e:itemanimationend">Raised when the item's animation ends.</event>
-        /// <part name="pivot" class="win-pivot" locid="WinJS.UI.Pivot_part:pivot">The entire Pivot control.</part>
-        /// <part name="title" class="win-pivot-title" locid="WinJS.UI.Pivot_part:title">The title for the Pivot control.</part>
-        /// <part name="header" class="win-pivot-header" locid="WinJS.UI.Pivot_part:header">A header of a Pivot Item.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        Pivot: {
-            get: function () {
-                if (!module) {
-                    require(["./Pivot/_Pivot"], function (m) {
-                        module = m;
-                    });
-                }
-                return module.Pivot;
-            }
-        }
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/Hub/_Section',[
-    'exports',
-    '../../Core/_Global',
-    '../../Core/_Base',
-    '../../Core/_BaseUtils',
-    '../../Core/_ErrorFromName',
-    '../../Core/_Resources',
-    '../../ControlProcessor',
-    '../../Promise',
-    '../../Utilities/_Control',
-    '../../Utilities/_Dispose',
-    '../../Utilities/_ElementUtilities',
-    '../../Utilities/_KeyboardBehavior'
-    ], function hubSectionInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Resources, ControlProcessor, Promise, _Control, _Dispose, _ElementUtilities, _KeyboardBehavior) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.HubSection">
-        /// Defines a section of a Hub control.
-        /// </summary>
-        /// <compatibleWith platform="Windows" minVersion="8.1"/>
-        /// </field>
-        /// <icon src="ui_winjs.ui.hubsection.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.hubsection.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.HubSection" data-win-options="{header: 'HubSection Header'}">HubSection Content</div>]]></htmlSnippet>
-        /// <part name="hubsection" class="win-hub-section" locid="WinJS.UI.HubSection_part:hubsection">The entire HubSection control.</part>
-        /// <part name="header" class="win-hub-section-header" locid="WinJS.UI.HubSection_part:header">The header region of the HubSection.</part>
-        /// <part name="headertabstop" class="win-hub-section-header-tabstop" locid="WinJS.UI.HubSection_part:headertabstop">The tab stop region of the header region of the HubSection.</part>
-        /// <part name="headercontent" class="win-hub-section-header-content" locid="WinJS.UI.HubSection_part:headercontent">The content region of the header region of the HubSection.</part>
-        /// <part name="headerchevron" class="win-hub-section-header-chevron" locid="WinJS.UI.HubSection_part:headerchevron">The chevron region of the header region of the HubSection.</part>
-        /// <part name="content" class="win-hub-section-content" locid="WinJS.UI.HubSection_part:content">The content region of the HubSection.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        HubSection: _Base.Namespace._lazy(function () {
-            var strings = {
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; },
-                get seeMore() { return _Resources._getWinJSString("ui/seeMore").value; }
-            };
-
-            var HubSection = _Base.Class.define(function HubSection_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.HubSection.HubSection">
-                /// <summary locid="WinJS.UI.HubSection.constructor">
-                /// Creates a new HubSection.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" isOptional="true" locid="WinJS.UI.HubSection.constructor_p:element">
-                /// The DOM element that hosts the HubSection control.
-                /// </param>
-                /// <param name="options" type="Object" isOptional="true" locid="WinJS.UI.HubSection.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// </param>
-                /// <returns type="WinJS.UI.HubSection" locid="WinJS.UI.HubSection.constructor_returnValue">
-                /// The new HubSection.
-                /// </returns>
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </signature>
-                element = element || _Global.document.createElement("DIV");
-                options = options || {};
-
-                if (element.winControl) {
-                    throw new _ErrorFromName("WinJS.UI.HubSection.DuplicateConstruction", strings.duplicateConstruction);
-                }
-
-                // Attaching JS control to DOM element
-                element.winControl = this;
-                this._element = element;
-                _ElementUtilities.addClass(this.element, HubSection._ClassName.hubSection);
-                _ElementUtilities.addClass(this.element, "win-disposable");
-
-                // Not using innerHTML here because there could have been some children already.
-                this._headerElement = _Global.document.createElement("DIV");
-                this._headerElement.className = HubSection._ClassName.hubSectionHeader;
-                this._headerElement.innerHTML =
-                    '<button type="button" role="link" class="' + HubSection._ClassName.hubSectionInteractive + ' ' + HubSection._ClassName.hubSectionHeaderTabStop + '">' +
-                        '<div class="' +  HubSection._ClassName.hubSectionHeaderWrapper + '" tabindex="-1">' +
-                            '<h2 class="win-type-subheader ' + HubSection._ClassName.hubSectionHeaderContent + '"></h2>' +
-                            '<span class="' + HubSection._ClassName.hubSectionHeaderChevron + ' win-type-body">' + strings.seeMore + '</span>' +
-                        '</div>' +
-                    '</button>';
-                this._headerTabStopElement = this._headerElement.firstElementChild;
-                // The purpose of headerWrapperElement is to lay out its children in a flexbox. Ideally, this flexbox would
-                // be on headerTabStopElement. However, firefox lays out flexboxes with display:flex differently.
-                // Firefox bug 1014285 (Button with display:inline-flex doesn't layout properly)
-                // https://bugzilla.mozilla.org/show_bug.cgi?id=1014285
-                this._headerWrapperElement = this._headerTabStopElement.firstElementChild;
-                this._headerContentElement = this._headerWrapperElement.firstElementChild;
-                this._headerChevronElement = this._headerWrapperElement.lastElementChild;
-                element.appendChild(this._headerElement);
-
-                this._winKeyboard = new _KeyboardBehavior._WinKeyboard(this._headerElement);
-
-                this._contentElement = _Global.document.createElement("DIV");
-                this._contentElement.className = HubSection._ClassName.hubSectionContent;
-                this._contentElement.style.visibility = "hidden";
-                element.appendChild(this._contentElement);
-
-                // Reparent any existing elements inside the new hub section content element.
-                var elementToMove = this.element.firstChild;
-                while (elementToMove !== this._headerElement) {
-                    var nextElement = elementToMove.nextSibling;
-                    this._contentElement.appendChild(elementToMove);
-                    elementToMove = nextElement;
-                }
-
-                this._processors = [ControlProcessor.processAll];
-
-                _Control.setOptions(this, options);
-            }, {
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.HubSection.element" helpKeyword="WinJS.UI.HubSection.element">
-                /// Gets the DOM element that hosts the HubSection.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-                /// <field type="Boolean" locid="WinJS.UI.HubSection.isHeaderStatic" helpKeyword="WinJS.UI.HubSection.isHeaderStatic">
-                /// Gets or sets a value that specifies whether the header is static. Set this value to true to disable clicks and other interactions.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                isHeaderStatic: {
-                    get: function () {
-                        return this._isHeaderStatic;
-                    },
-                    set: function (value) {
-                        this._isHeaderStatic = value;
-                        if (!this._isHeaderStatic) {
-                            this._headerTabStopElement.setAttribute("role", "link");
-                            _ElementUtilities.addClass(this._headerTabStopElement, HubSection._ClassName.hubSectionInteractive);
-                        } else {
-                            this._headerTabStopElement.setAttribute("role", "heading");
-                            _ElementUtilities.removeClass(this._headerTabStopElement, HubSection._ClassName.hubSectionInteractive);
-                        }
-                    }
-                },
-                /// <field type="HTMLElement" domElement="true" locid="WinJS.UI.HubSection.contentElement" helpKeyword="WinJS.UI.HubSection.contentElement">
-                /// Gets the DOM element that hosts the HubSection's content.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                contentElement: {
-                    get: function () {
-                        return this._contentElement;
-                    }
-                },
-                /// <field type="Object" locid="WinJS.UI.HubSection.header" helpKeyword="WinJS.UI.HubSection.header">
-                /// Get or set the HubSection's header. After you set this property, the Hub renders the header again.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                header: {
-                    get: function () {
-                        return this._header;
-                    },
-                    set: function (value) {
-                        // Render again even if it is equal to itself.
-                        this._header = value;
-                        this._renderHeader();
-                    }
-                },
-                _setHeaderTemplate: function HubSection_setHeaderTemplate(template) {
-                    this._template = _ElementUtilities._syncRenderer(template);
-                    this._renderHeader();
-                },
-                _renderHeader: function HubSection_renderHeader() {
-                    if (this._template) {
-                        _Dispose._disposeElement(this._headerContentElement);
-                        _ElementUtilities.empty(this._headerContentElement);
-                        this._template(this, this._headerContentElement);
-                    }
-                },
-                _process: function HubSection_process() {
-                    var that = this;
-
-                    this._processed = (this._processors || []).reduce(function (promise, processor) {
-                        return promise.then(function () {
-                            return processor(that.contentElement);
-                        });
-                    }, this._processed || Promise.as());
-                    this._processors = null;
-
-                    return this._processed;
-                },
-                dispose: function HubSection_dispose() {
-                    /// <signature helpKeyword="WinJS.UI.HubSection.dispose">
-                    /// <summary locid="WinJS.UI.HubSection.dispose">
-                    /// Disposes this control.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._disposed = true;
-                    this._processors = null;
-
-                    _Dispose._disposeElement(this._headerContentElement);
-                    _Dispose.disposeSubTree(this.contentElement);
-                }
-            }, {
-                // Names of classes used by the HubSection.
-                _ClassName: {
-                    hubSection: "win-hub-section",
-                    hubSectionHeader: "win-hub-section-header",
-                    hubSectionHeaderTabStop: "win-hub-section-header-tabstop",
-                    hubSectionHeaderWrapper: "win-hub-section-header-wrapper",
-                    hubSectionInteractive: "win-hub-section-header-interactive",
-                    hubSectionHeaderContent: "win-hub-section-header-content",
-                    hubSectionHeaderChevron: "win-hub-section-header-chevron",
-                    hubSectionContent: "win-hub-section-content"
-                },
-                isDeclarativeControlContainer: _BaseUtils.markSupportedForProcessing(function (section, callback) {
-                    if (callback === ControlProcessor.processAll) {
-                        return;
-                    }
-
-                    section._processors = section._processors || [];
-                    section._processors.push(callback);
-
-                    // Once processed the first time synchronously queue up new processors as they come in
-                    if (section._processed) {
-                        section._process();
-                    }
-                })
-            });
-
-            return HubSection;
-        })
-    });
-
-});
-
-
-define('require-style!less/styles-hub',[],function(){});
-
-define('require-style!less/colors-hub',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/Hub',[
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Events',
-    '../Core/_Log',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../_Accents',
-    '../Animations',
-    '../Animations/_TransitionAnimation',
-    '../BindingList',
-    '../ControlProcessor',
-    '../Promise',
-    '../_Signal',
-    '../Scheduler',
-    '../Utilities/_Control',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    '../Utilities/_UI',
-    './ElementResizeInstrument',
-    './Hub/_Section',
-    'require-style!less/styles-hub',
-    'require-style!less/colors-hub'
-], function hubInit(_Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, _Accents, Animations, _TransitionAnimation, BindingList, ControlProcessor, Promise, _Signal, Scheduler, _Control, _ElementUtilities, _Hoverable, _UI, _ElementResizeInstrument, _Section) {
-    "use strict";
-
-    _Accents.createAccentRule(
-            ".win-semanticzoom-zoomedoutview .win-hub-section-header-interactive .win-hub-section-header-content,\
-             .win-hub-section-header-interactive .win-hub-section-header-chevron",
-        [{ name: "color", value: _Accents.ColorTypes.accent }]);
-
-    _Base.Namespace.define("WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.Hub">
-        /// Displays sections of content.
-        /// </summary>
-        /// <compatibleWith platform="Windows" minVersion="8.1"/>
-        /// </field>
-        /// <icon src="ui_winjs.ui.hub.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.hub.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.Hub">
-        /// <div data-win-control="WinJS.UI.HubSection" data-win-options="{header: 'HubSection Header'}">HubSection Content</div>
-        /// </div>]]></htmlSnippet>
-        /// <event name="contentanimating" bubbles="true" locid="WinJS.UI.Hub_e:contentanimating">Raised when the Hub is about to play an entrance or a transition animation.</event>
-        /// <event name="headerinvoked" bubbles="true" locid="WinJS.UI.Hub_e:headerinvoked">Raised when a header is invoked.</event>
-        /// <event name="loadingstatechanged" bubbles="true" locid="WinJS.UI.Hub_e:loadingstatechanged">Raised when the loading state changes.</event>
-        /// <part name="hub" class="win-hub" locid="WinJS.UI.Hub_part:hub">The entire Hub control.</part>
-        /// <part name="progress" class="win-hub-progress" locid="WinJS.UI.Hub_part:progress">The progress indicator for the Hub.</part>
-        /// <part name="viewport" class="win-hub-viewport" locid="WinJS.UI.Hub_part:viewport">The viewport of the Hub.</part>
-        /// <part name="surface" class="win-hub-surface" locid="WinJS.UI.Hub_part:surface">The scrollable region of the Hub.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        Hub: _Base.Namespace._lazy(function () {
-            var Key = _ElementUtilities.Key;
-
-            function hubDefaultHeaderTemplate(section) {
-                var element = _Global.document.createTextNode(typeof section.header === "object" ? JSON.stringify(section.header) : ('' + section.header));
-                return element;
-            }
-
-            var createEvent = _Events._createEventProperty;
-            var eventNames = {
-                contentAnimating: "contentanimating",
-                headerInvoked: "headerinvoked",
-                loadingStateChanged: "loadingstatechanged"
-            };
-
-            // Delay time before progress dots are shown when loading hub section(s) on screen.
-            var progressDelay = 500;
-
-            var verticalNames = {
-                scrollPos: "scrollTop",
-                scrollSize: "scrollHeight",
-                offsetPos: "offsetTop",
-                offsetSize: "offsetHeight",
-                oppositeOffsetSize: "offsetWidth",
-                marginStart: "marginTop",
-                marginEnd: "marginBottom",
-                borderStart: "borderTopWidth",
-                borderEnd: "borderBottomWidth",
-                paddingStart: "paddingTop",
-                paddingEnd: "paddingBottom"
-            };
-            var rtlHorizontalNames = {
-                scrollPos: "scrollLeft",
-                scrollSize: "scrollWidth",
-                offsetPos: "offsetLeft",
-                offsetSize: "offsetWidth",
-                oppositeOffsetSize: "offsetHeight",
-                marginStart: "marginRight",
-                marginEnd: "marginLeft",
-                borderStart: "borderRightWidth",
-                borderEnd: "borderLeftWidth",
-                paddingStart: "paddingRight",
-                paddingEnd: "paddingLeft"
-            };
-            var ltrHorizontalNames = {
-                scrollPos: "scrollLeft",
-                scrollSize: "scrollWidth",
-                offsetPos: "offsetLeft",
-                offsetSize: "offsetWidth",
-                oppositeOffsetSize: "offsetHeight",
-                marginStart: "marginLeft",
-                marginEnd: "marginRight",
-                borderStart: "borderLeftWidth",
-                borderEnd: "borderRightWidth",
-                paddingStart: "paddingLeft",
-                paddingEnd: "paddingRight"
-            };
-
-            var Hub = _Base.Class.define(function Hub_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.Hub.Hub">
-                /// <summary locid="WinJS.UI.Hub.constructor">
-                /// Creates a new Hub control.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" isOptional="true" locid="WinJS.UI.Hub.constructor_p:element">
-                /// The DOM element that hosts the Hub control.
-                /// </param>
-                /// <param name="options" type="Object" isOptional="true" locid="WinJS.UI.Hub.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// Event names must begin with "on". For example, to provide a handler for the contentanimating event,
-                /// add a property named "oncontentanimating" to the options object and set its value to the event handler.
-                /// </param>
-                /// <returns type="WinJS.UI.Hub" locid="WinJS.UI.Hub.constructor_returnValue">
-                /// The new Hub.
-                /// </returns>
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </signature>
-                element = element || _Global.document.createElement("DIV");
-                options = options || {};
-
-                if (element.winControl) {
-                    throw new _ErrorFromName("WinJS.UI.Hub.DuplicateConstruction", strings.duplicateConstruction);
-                }
-
-                this._id = element.id || _ElementUtilities._uniqueID(element);
-                this._writeProfilerMark("constructor,StartTM");
-
-                this._windowKeyDownHandlerBound = this._windowKeyDownHandler.bind(this);
-                _Global.addEventListener('keydown', this._windowKeyDownHandlerBound);
-
-                // Attaching JS control to DOM element
-                element.winControl = this;
-                this._element = element;
-                _ElementUtilities.addClass(this.element, Hub._ClassName.hub);
-                _ElementUtilities.addClass(this.element, "win-disposable");
-
-                // This internally assigns this.sections which causes section to be used (even from options) before
-                // scrollPosition or sectionOnScreen.
-                this._parse();
-
-                this._viewportElement = _Global.document.createElement("DIV");
-                this._viewportElement.className = Hub._ClassName.hubViewport;
-                this._element.appendChild(this._viewportElement);
-                this._viewportElement.setAttribute("role", "group");
-                this._viewportElement.setAttribute("aria-label", strings.hubViewportAriaLabel);
-
-                this._surfaceElement = _Global.document.createElement("DIV");
-                this._surfaceElement.className = Hub._ClassName.hubSurface;
-                this._viewportElement.appendChild(this._surfaceElement);
-
-                // Start invisible so that you do not see the content loading until the sections are ready.
-                this._visible = false;
-                this._viewportElement.style.opacity = 0;
-
-                if (!options.orientation) {
-                    this._orientation = _UI.Orientation.horizontal;
-                    _ElementUtilities.addClass(this.element, Hub._ClassName.hubHorizontal);
-                }
-
-                this._fireEntrance = true;
-                this._animateEntrance = true;
-                this._loadId = 0;
-                this.runningAnimations = new Promise.wrap();
-                this._currentIndexForSezo = 0;
-
-                _Control.setOptions(this, options);
-
-                _ElementUtilities._addEventListener(this.element, "focusin", this._focusin.bind(this), false);
-                this.element.addEventListener("keydown", this._keyDownHandler.bind(this));
-                this.element.addEventListener("click", this._clickHandler.bind(this));
-                this._viewportElement.addEventListener("scroll", this._scrollHandler.bind(this));
-
-                this._resizeHandlerBound = this._resizeHandler.bind(this);
-                this._elementResizeInstrument = new _ElementResizeInstrument._ElementResizeInstrument();
-                this._element.appendChild(this._elementResizeInstrument.element);
-                this._elementResizeInstrument.addEventListener("resize", this._resizeHandlerBound);
-                var that = this;
-                _ElementUtilities._inDom(this.element).then(function () {
-                    if (!that._disposed) {
-                        that._elementResizeInstrument.addedToDom();
-                    }
-                });
-                _ElementUtilities._resizeNotifier.subscribe(this.element, this._resizeHandlerBound);
-
-                this._handleSectionChangedBind = this._handleSectionChanged.bind(this);
-                this._handleSectionInsertedBind = this._handleSectionInserted.bind(this);
-                this._handleSectionMovedBind = this._handleSectionMoved.bind(this);
-                this._handleSectionRemovedBind = this._handleSectionRemoved.bind(this);
-                this._handleSectionReloadBind = this._handleSectionReload.bind(this);
-
-                this._refresh();
-
-                this._writeProfilerMark("constructor,StopTM");
-            }, {
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.Hub.element" helpKeyword="WinJS.UI.Hub.element">
-                /// Gets the DOM element that hosts the Hub.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.Orientation" locid="WinJS.UI.Hub.orientation" helpKeyword="WinJS.UI.Hub.orientation">
-                /// Gets or sets the orientation of sections within the Hub.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                orientation: {
-                    get: function () {
-                        return this._orientation;
-                    },
-                    set: function (value) {
-                        if (value === this._orientation) {
-                            return;
-                        }
-                        this._measured = false;
-                        // clear existing scroll before we switch orientation
-                        if (this._names) { // handle setting orientation before we measure
-                            var newScrollPos = {};
-                            newScrollPos[this._names.scrollPos] = 0;
-                            _ElementUtilities.setScrollPosition(this._viewportElement, newScrollPos);
-                        }
-                        if (value === _UI.Orientation.vertical) {
-                            _ElementUtilities.removeClass(this.element, Hub._ClassName.hubHorizontal);
-                            _ElementUtilities.addClass(this.element, Hub._ClassName.hubVertical);
-                        } else {
-                            value = _UI.Orientation.horizontal;
-                            _ElementUtilities.removeClass(this.element, Hub._ClassName.hubVertical);
-                            _ElementUtilities.addClass(this.element, Hub._ClassName.hubHorizontal);
-                        }
-                        this._orientation = value;
-                        Scheduler.schedule(this._updateSnapList.bind(this), Scheduler.Priority.idle);
-                    }
-                },
-                /// <field type="WinJS.Binding.List" locid="WinJS.UI.Hub.sections" helpKeyword="WinJS.UI.Hub.sections">
-                /// Gets or sets the WinJS.Binding.List of HubSection objects that belong to this Hub.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                sections: {
-                    get: function () {
-                        if (this._pendingSections) {
-                            return this._pendingSections;
-                        }
-                        return this._sections;
-                    },
-                    set: function (value) {
-                        var resetScrollPosition = !this._pendingSections;
-                        this._pendingSections = value;
-                        this._refresh();
-                        if (resetScrollPosition) {
-                            this.scrollPosition = 0;
-                        }
-                    }
-                },
-                /// <field type="Object" locid="WinJS.UI.Hub.headerTemplate" helpKeyword="WinJS.UI.Hub.headerTemplate" potentialValueSelector="[data-win-control='WinJS.Binding.Template']">
-                /// Gets or sets the WinJS.Binding.Template or template function that creates the DOM elements
-                /// which represent the header for each HubSection. Each header can
-                /// contain multiple DOM elements, but we recommend that it have a single
-                /// root element.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                headerTemplate: {
-                    get: function () {
-                        if (this._pendingHeaderTemplate) {
-                            return this._pendingHeaderTemplate;
-                        }
-
-                        if (!this._headerTemplate) {
-                            this._headerTemplate = hubDefaultHeaderTemplate;
-                        }
-
-                        return this._headerTemplate;
-                    },
-                    set: function (value) {
-                        this._pendingHeaderTemplate = value || hubDefaultHeaderTemplate;
-                        this._refresh();
-                    }
-                },
-                /// <field type="Number" integer="true" locid="WinJS.UI.Hub.scrollPosition" helpKeyword="WinJS.UI.Hub.scrollPosition">
-                /// Gets or sets the position of the Hub's scrollbar.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                scrollPosition: {
-                    get: function () {
-                        if (+this._pendingScrollLocation === this._pendingScrollLocation) {
-                            return this._pendingScrollLocation;
-                        }
-
-                        this._measure();
-                        return this._scrollPosition;
-                    },
-                    set: function (value) {
-                        value = Math.max(0, value);
-                        if (this._pendingRefresh) {
-                            // Unable to constrain length because sections may have changed.
-                            this._pendingScrollLocation = value;
-                            this._pendingSectionOnScreen = null;
-                        } else {
-                            this._measure();
-                            var targetScrollPos = Math.max(0, Math.min(this._scrollLength - this._viewportSize, value));
-                            this._scrollPosition = targetScrollPos;
-                            var newScrollPos = {};
-                            newScrollPos[this._names.scrollPos] = targetScrollPos;
-                            _ElementUtilities.setScrollPosition(this._viewportElement, newScrollPos);
-                        }
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.Hub.sectionOnScreen" helpKeyword="WinJS.UI.Hub.sectionOnScreen">
-                /// Gets or sets the index of first section in view. This property is useful for restoring a previous view when your app launches or resumes.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                sectionOnScreen: {
-                    get: function () {
-                        if (+this._pendingSectionOnScreen === this._pendingSectionOnScreen) {
-                            return this._pendingSectionOnScreen;
-                        }
-
-                        this._measure();
-                        for (var i = 0; i < this._sectionSizes.length; i++) {
-                            var sectionSize = this._sectionSizes[i];
-                            if ((sectionSize.offset + sectionSize.size - sectionSize.borderEnd - sectionSize.paddingEnd) > (this._scrollPosition + this._startSpacer + sectionSize.borderStart + sectionSize.paddingStart)) {
-                                return i;
-                            }
-                        }
-                        return -1;
-                    },
-                    set: function (value) {
-                        value = Math.max(0, value);
-                        if (this._pendingRefresh) {
-                            this._pendingSectionOnScreen = value;
-                            this._pendingScrollLocation = null;
-                        } else {
-                            this._measure();
-                            if (value >= 0 && value < this._sectionSizes.length) {
-                                this._scrollToSection(value);
-                            }
-                        }
-                    }
-                },
-                /// <field type="Number" integer="true" isAdvanced="true" locid="WinJS.UI.Hub.indexOfFirstVisible" helpKeyword="WinJS.UI.Hub.indexOfFirstVisible">
-                /// Gets or sets the index of first section at least partially in view. Use for animations.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                indexOfFirstVisible: {
-                    get: function () {
-                        this._measure();
-                        for (var i = 0; i < this._sectionSizes.length; i++) {
-                            var sectionSize = this._sectionSizes[i];
-                            if ((sectionSize.offset + sectionSize.size - sectionSize.borderEnd - sectionSize.paddingEnd) > this._scrollPosition) {
-                                return i;
-                            }
-                        }
-                        return -1;
-                    }
-                },
-                /// <field type="Number" integer="true" isAdvanced="true" locid="WinJS.UI.Hub.indexOfLastVisible" helpKeyword="WinJS.UI.Hub.indexOfLastVisible">
-                /// Gets or sets the index of last section at least partially in view. Use for animations.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                indexOfLastVisible: {
-                    get: function () {
-                        this._measure();
-                        for (var i = this._sectionSizes.length - 1; i >= 0; i--) {
-                            var sectionSize = this._sectionSizes[i];
-                            if ((sectionSize.offset + sectionSize.paddingStart + sectionSize.borderStart) < (this._scrollPosition + this._viewportSize)) {
-                                return i;
-                            }
-                        }
-                        return -1;
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.Hub.onheaderinvoked" helpKeyword="WinJS.UI.Hub.onheaderinvoked">
-                /// Raised  when the user clicks on an interactive header.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                onheaderinvoked: createEvent(eventNames.headerInvoked),
-
-                /// <field type="Function" locid="WinJS.UI.Hub.onloadingstatechanged" helpKeyword="WinJS.UI.Hub.onloadingstatechanged">
-                /// Raised when the loadingState of the Hub changes.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                onloadingstatechanged: createEvent(eventNames.loadingStateChanged),
-
-                /// <field type="Function" locid="WinJS.UI.Hub.oncontentanimating" helpKeyword="WinJS.UI.Hub.oncontentanimating">
-                /// Raised when Hub is about to play entrance, contentTransition, insert, or remove animations.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                oncontentanimating: createEvent(eventNames.contentAnimating),
-
-                _refresh: function hub_refresh() {
-                    if (this._pendingRefresh) {
-                        return;
-                    }
-
-                    this._loadId++;
-                    this._setState(Hub.LoadingState.loading);
-                    // This is to coalesce property setting operations such as sections and scrollPosition.
-                    this._pendingRefresh = true;
-
-                    Scheduler.schedule(this._refreshImpl.bind(this), Scheduler.Priority.high);
-                },
-                _refreshImpl: function hub_refreshImpl() {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    var fadeOutAnimation = Promise.wrap();
-                    if (this._pendingSections) {
-                        this._animateEntrance = true;
-                        this._fireEntrance = !this._visible;
-                        if (!this._fireEntrance) {
-                            this._visible = false;
-                            this._viewportElement.style.opacity = 0;
-
-                            if (_TransitionAnimation.isAnimationEnabled()) {
-                                var animateTransition = this._fireEvent(Hub._EventName.contentAnimating, {
-                                    type: Hub.AnimationType.contentTransition
-                                });
-
-                                if (animateTransition) {
-                                    this._viewportElement.style["-ms-overflow-style"] = "none";
-                                    fadeOutAnimation = Animations.fadeOut(this._viewportElement).then(function () {
-                                        this._viewportElement.style["-ms-overflow-style"] = "";
-                                    }.bind(this));
-                                }
-                                this._animateEntrance = animateTransition;
-                            }
-                        }
-                    }
-
-                    fadeOutAnimation.done(this._applyProperties.bind(this));
-                },
-                _applyProperties: function hub_applyProperties() {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    this._pendingRefresh = false;
-
-                    var needsToLoadSections = false;
-                    if (this._pendingSections) {
-                        needsToLoadSections = true;
-                        this._updateEvents(this._sections, this._pendingSections);
-
-                        if (this._sections) {
-                            this._sections.forEach(function (section) {
-                                var el = section.element;
-                                el.parentElement.removeChild(el);
-                            });
-                        }
-
-                        this._sections = this._pendingSections;
-                        this._pendingSections = null;
-                    }
-
-                    if (this._pendingHeaderTemplate) {
-                        this._headerTemplate = this._pendingHeaderTemplate;
-                        this._pendingHeaderTemplate = null;
-                    }
-
-                    this._assignHeaderTemplate();
-
-                    if (needsToLoadSections) {
-                        this._attachSections();
-                    }
-
-                    // Scroll after headers are rendered and sections are attached so the scroll thumb is correct.
-                    if (+this._pendingSectionOnScreen === this._pendingSectionOnScreen) {
-                        // If there are both pending section on screen and scroll location use section on screen.
-                        this.sectionOnScreen = this._pendingSectionOnScreen;
-                    } else if (+this._pendingScrollLocation === this._pendingScrollLocation) {
-                        this.scrollPosition = this._pendingScrollLocation;
-                    } else {
-                        // Sections reset without sectionOnScreen or scrollPosition APIs.
-                        this.scrollPosition = 0;
-                    }
-
-                    this._pendingSectionOnScreen = null;
-                    this._pendingScrollLocation = null;
-
-                    // Using current (or new) scroll location load the sections
-                    this._setState(Hub.LoadingState.loading);
-                    this._loadSections();
-                },
-                _handleSectionChanged: function hub_handleSectionChanged(ev) {
-                    // Change is triggered by binding list setAt() API.
-                    if (this._pendingSections) {
-                        return;
-                    }
-
-                    var newSection = ev.detail.newValue;
-                    var oldSection = ev.detail.oldValue;
-                    newSection._setHeaderTemplate(this.headerTemplate);
-                    if (newSection.element !== oldSection.element) {
-                        if (newSection.element.parentNode === this._surfaceElement) {
-                            throw new _ErrorFromName("WinJS.UI.Hub.DuplicateSection", strings.duplicateSection);
-                        }
-
-                        this._surfaceElement.insertBefore(newSection.element, oldSection.element);
-                        this._surfaceElement.removeChild(oldSection.element);
-                        this._measured = false;
-
-                        this._setState(Hub.LoadingState.loading);
-                        this._loadSections();
-                    }
-                },
-                _handleSectionInserted: function hub_handleSectionInserted(ev) {
-                    // Insert is triggered by binding list insert APIs such as splice(), push(), and unshift().
-                    if (this._pendingSections) {
-                        return;
-                    }
-
-                    var index = ev.detail.index;
-                    var section = ev.detail.value;
-
-                    if (section._animation) {
-                        section._animation.cancel();
-                    }
-
-                    var animation;
-                    var result = this._fireEvent(Hub._EventName.contentAnimating, {
-                        type: Hub.AnimationType.insert,
-                        index: index,
-                        section: section
-                    });
-
-                    if (result) {
-
-                        var affectedElements = [];
-
-                        for (var i = index + 1; i < this.sections.length; i++) {
-                            affectedElements.push(this.sections.getAt(i).element);
-                        }
-
-                        animation = new Animations._createUpdateListAnimation([section.element], [], affectedElements);
-                    }
-
-                    if (section.element.parentNode === this._surfaceElement) {
-                        throw new _ErrorFromName("WinJS.UI.Hub.DuplicateSection", strings.duplicateSection);
-                    }
-
-                    section._setHeaderTemplate(this.headerTemplate);
-                    if (index < this.sections.length - 1) {
-                        this._surfaceElement.insertBefore(section.element, this.sections.getAt(index + 1).element);
-                    } else {
-                        this._surfaceElement.appendChild(section.element);
-                    }
-                    this._measured = false;
-
-                    if (animation) {
-                        var insertAnimation = animation.execute();
-                        this.runningAnimations = Promise.join([this.runningAnimations, insertAnimation]);
-                    }
-
-                    this._setState(Hub.LoadingState.loading);
-                    this._loadSections();
-                },
-                _handleSectionMoved: function hub_handleSectionMoved(ev) {
-                    // Move is triggered by binding list move() API.
-                    if (this._pendingSections) {
-                        return;
-                    }
-
-                    var newIndex = ev.detail.newIndex;
-                    var section = ev.detail.value;
-
-                    if (newIndex < this.sections.length - 1) {
-                        this._surfaceElement.insertBefore(section.element, this.sections.getAt(newIndex + 1).element);
-                    } else {
-                        this._surfaceElement.appendChild(section.element);
-                    }
-                    this._measured = false;
-
-                    this._setState(Hub.LoadingState.loading);
-                    this._loadSections();
-                },
-                _handleSectionRemoved: function hub_handleSectionRemoved(ev) {
-                    // Removed is triggered by binding list removal APIs such as splice(), pop(), and shift().
-                    if (this._pendingSections) {
-                        return;
-                    }
-
-                    var section = ev.detail.value;
-                    var index = ev.detail.index;
-
-                    var animationPromise = Promise.wrap();
-                    var result = this._fireEvent(Hub._EventName.contentAnimating, {
-                        type: Hub.AnimationType.remove,
-                        index: index,
-                        section: section
-                    });
-
-                    if (result) {
-                        var affectedElements = [];
-
-                        for (var i = index; i < this.sections.length; i++) {
-                            affectedElements.push(this.sections.getAt(i).element);
-                        }
-
-                        var animation = new Animations._createUpdateListAnimation([], [section.element], affectedElements);
-
-                        this._measure();
-                        var offsetTop = section.element.offsetTop;
-                        var offsetLeft = section.element.offsetLeft;
-                        section.element.style.position = "absolute";
-                        section.element.style.top = offsetTop;
-                        section.element.style.left = offsetLeft;
-                        section.element.style.opacity = 0;
-                        this._measured = false;
-
-                        animationPromise = animation.execute().then(function () {
-                            section.element.style.position = "";
-                            section.element.style.top = "";
-                            section.element.style.left = "";
-                            section.element.style.opacity = 1;
-                        }.bind(this));
-                    }
-
-                    animationPromise.done(function () {
-                        if (!this._disposed) {
-                            this._surfaceElement.removeChild(section.element);
-                            this._measured = false;
-                        }
-                    }.bind(this));
-
-                    // Store animation promise in case it is inserted before remove animation finishes.
-                    section._animation = animationPromise;
-                    this.runningAnimations = Promise.join([this.runningAnimations, animationPromise]);
-
-                    this._setState(Hub.LoadingState.loading);
-                    this._loadSections();
-                },
-                _handleSectionReload: function hub_handleSectionReload() {
-                    // Reload is triggered by large operations on the binding list such as reverse(). This causes
-                    // _pendingSections to be true which ignores future insert/remove/modified/moved events until the new
-                    // sections list is applied.
-                    this.sections = this.sections;
-                },
-                _updateEvents: function hub_updateEvents(oldSections, newSections) {
-                    if (oldSections) {
-                        oldSections.removeEventListener("itemchanged", this._handleSectionChangedBind);
-                        oldSections.removeEventListener("iteminserted", this._handleSectionInsertedBind);
-                        oldSections.removeEventListener("itemmoved", this._handleSectionMovedBind);
-                        oldSections.removeEventListener("itemremoved", this._handleSectionRemovedBind);
-                        oldSections.removeEventListener("reload", this._handleSectionReloadBind);
-                    }
-
-                    if (newSections) {
-                        newSections.addEventListener("itemchanged", this._handleSectionChangedBind);
-                        newSections.addEventListener("iteminserted", this._handleSectionInsertedBind);
-                        newSections.addEventListener("itemmoved", this._handleSectionMovedBind);
-                        newSections.addEventListener("itemremoved", this._handleSectionRemovedBind);
-                        newSections.addEventListener("reload", this._handleSectionReloadBind);
-                    }
-                },
-                _attachSections: function hub_attachSections() {
-                    this._measured = false;
-                    for (var i = 0; i < this.sections.length; i++) {
-                        var section = this._sections.getAt(i);
-                        if (section._animation) {
-                            section._animation.cancel();
-                        }
-                        if (section.element.parentNode === this._surfaceElement) {
-                            throw new _ErrorFromName("WinJS.UI.Hub.DuplicateSection", strings.duplicateSection);
-                        }
-                        this._surfaceElement.appendChild(section.element);
-                    }
-                },
-                _assignHeaderTemplate: function hub_assignHeaderTemplate() {
-                    this._measured = false;
-                    for (var i = 0; i < this.sections.length; i++) {
-                        var section = this._sections.getAt(i);
-                        section._setHeaderTemplate(this.headerTemplate);
-                    }
-                },
-                _loadSection: function hub_loadSection(index) {
-                    var section = this._sections.getAt(index);
-                    return section._process().then(function resetVisibility() {
-                        var style = section.contentElement.style;
-                        if (style.visibility !== "") {
-                            style.visibility = "";
-                        }
-                    });
-                },
-                _loadSections: function hub_loadSections() {
-                    // Used to know if another load has interrupted this one.
-                    this._loadId++;
-                    var loadId = this._loadId;
-                    var that = this;
-                    var onScreenItemsAnimatedPromise = Promise.wrap();
-                    var sectionIndicesToLoad = [];
-                    var allSectionsLoadedPromise = Promise.wrap();
-
-                    function loadNextSectionAfterPromise(promise) {
-                        promise.then(function () {
-                            Scheduler.schedule(loadNextSection, Scheduler.Priority.idle);
-                        });
-                    }
-
-                    function loadNextSection() {
-                        if (loadId === that._loadId && !that._disposed) {
-                            if (sectionIndicesToLoad.length) {
-                                var index = sectionIndicesToLoad.shift();
-                                var loadedPromise = that._loadSection(index);
-                                loadNextSectionAfterPromise(loadedPromise);
-                            } else {
-                                allSectionsLoadedSignal.complete();
-                            }
-                        }
-                    }
-
-                    if (!this._showProgressPromise) {
-                        this._showProgressPromise = Promise.timeout(progressDelay).then(function () {
-                            if (this._disposed) {
-                                return;
-                            }
-
-                            if (!this._progressBar) {
-                                this._progressBar = _Global.document.createElement("progress");
-                                _ElementUtilities.addClass(this._progressBar, Hub._ClassName.hubProgress);
-                                this._progressBar.max = 100;
-                            }
-                            if (!this._progressBar.parentNode) {
-                                this.element.insertBefore(this._progressBar, this._viewportElement);
-                            }
-                            this._showProgressPromise = null;
-                        }.bind(this), function () {
-                            this._showProgressPromise = null;
-                        }.bind(this));
-                    }
-
-                    if (this.sections.length) {
-                        var allSectionsLoadedSignal = new _Signal();
-                        allSectionsLoadedPromise = allSectionsLoadedSignal.promise;
-                        // Synchronously load the sections on screen.
-                        var synchronousProcessPromises = [];
-                        var start = Math.max(0, this.indexOfFirstVisible);
-                        var end = Math.max(0, this.indexOfLastVisible);
-                        for (var i = start; i <= end; i++) {
-                            synchronousProcessPromises.push(this._loadSection(i));
-                        }
-
-                        // Determine the order to load the rest of the sections.
-                        start--;
-                        end++;
-                        while (start >= 0 || end < this.sections.length) {
-                            if (end < this.sections.length) {
-                                sectionIndicesToLoad.push(end);
-                                end++;
-                            }
-                            if (start >= 0) {
-                                sectionIndicesToLoad.push(start);
-                                start--;
-                            }
-                        }
-
-                        var onScreenSectionsLoadedPromise = Promise.join(synchronousProcessPromises);
-
-                        // In case there are overlapping load calls
-                        onScreenSectionsLoadedPromise.done(function () {
-                            if (loadId === this._loadId && !that._disposed) {
-                                if (this._showProgressPromise) {
-                                    this._showProgressPromise.cancel();
-                                }
-
-                                if (this._progressBar && this._progressBar.parentNode) {
-                                    this._progressBar.parentNode.removeChild(this._progressBar);
-                                }
-
-                                Scheduler.schedule(function Hub_entranceAnimation() {
-                                    if (loadId === this._loadId && !that._disposed) {
-                                        if (!this._visible) {
-                                            this._visible = true;
-                                            this._viewportElement.style.opacity = 1;
-
-                                            if (this._animateEntrance && _TransitionAnimation.isAnimationEnabled()) {
-                                                var eventDetail = {
-                                                    type: Hub.AnimationType.entrance
-                                                };
-
-                                                if (!this._fireEntrance || this._fireEvent(Hub._EventName.contentAnimating, eventDetail)) {
-                                                    this._viewportElement.style["-ms-overflow-style"] = "none";
-                                                    onScreenItemsAnimatedPromise = Animations.enterContent(this._viewportElement).then(function () {
-                                                        this._viewportElement.style["-ms-overflow-style"] = "";
-
-                                                        this._viewportElement.onmousewheel = function () {
-                                                            /*
-                                                                This fixes a mousewheel scrolling issue on Chrome. This empty event handler can be removed
-                                                                once https://code.google.com/p/chromium/issues/detail?id=515674 is resolved and fixed.
-                                                            */
-                                                        };
-                                                    }.bind(this));
-                                                }
-                                            }
-                                            if (this._element === _Global.document.activeElement) {
-                                                this._moveFocusIn(this.sectionOnScreen);
-                                            }
-                                        }
-                                    }
-                                }, Scheduler.Priority.high, this, "WinJS.UI.Hub.entranceAnimation");
-                            }
-                        }.bind(this));
-
-                        loadNextSectionAfterPromise(onScreenSectionsLoadedPromise);
-                    } else {
-                        if (this._showProgressPromise) {
-                            this._showProgressPromise.cancel();
-                        }
-
-                        if (this._progressBar && this._progressBar.parentNode) {
-                            this._progressBar.parentNode.removeChild(this._progressBar);
-                        }
-                    }
-
-                    Promise.join([this.runningAnimations, onScreenItemsAnimatedPromise, allSectionsLoadedPromise]).done(function () {
-                        if (loadId === this._loadId && !that._disposed) {
-                            this.runningAnimations = Promise.wrap();
-                            if (this._measured && this._scrollLength !== this._viewportElement[this._names.scrollSize]) {
-                                // A section changed size during processing. Invalidate the Hub's measurements so that its
-                                // API's work correctly within the loadingState=complete handler.
-                                this._measured = false;
-                            }
-                            this._setState(Hub.LoadingState.complete);
-                            Scheduler.schedule(this._updateSnapList.bind(this), Scheduler.Priority.idle);
-                        }
-                    }.bind(this));
-                },
-                /// <field type="String" hidden="true" locid="WinJS.UI.Hub.loadingState" helpKeyword="WinJS.UI.Hub.loadingState">
-                /// Gets a value that indicates whether the Hub is still loading or whether
-                /// loading is complete.  This property can return one of these values:
-                /// "loading" or "complete".
-                /// </field>
-                loadingState: {
-                    get: function () {
-                        return this._loadingState;
-                    }
-                },
-                _setState: function Hub_setState(state) {
-                    if (state !== this._loadingState) {
-                        this._writeProfilerMark("loadingStateChanged:" + state + ",info");
-                        this._loadingState = state;
-                        var eventObject = _Global.document.createEvent("CustomEvent");
-                        eventObject.initCustomEvent(Hub._EventName.loadingStateChanged, true, false, { loadingState: state });
-                        this._element.dispatchEvent(eventObject);
-                    }
-                },
-                _parse: function hub_parse() {
-                    // Parse and initialize any declaratively specified hub sections.
-                    var hubSections = [];
-                    var hubSectionEl = this.element.firstElementChild;
-
-                    while (hubSectionEl) {
-                        ControlProcessor.processAll(hubSectionEl);
-
-                        var hubSectionContent = hubSectionEl.winControl;
-                        if (hubSectionContent) {
-                            hubSections.push(hubSectionContent);
-                        } else {
-                            throw new _ErrorFromName("WinJS.UI.Hub.InvalidContent", strings.invalidContent);
-                        }
-
-                        var nextSectionEl = hubSectionEl.nextElementSibling;
-                        hubSectionEl.parentElement.removeChild(hubSectionEl);
-                        hubSectionEl = nextSectionEl;
-                    }
-
-                    this.sections = new BindingList.List(hubSections);
-                },
-                _fireEvent: function hub_fireEvent(type, detail) {
-                    // Returns true if ev.preventDefault() was not called
-                    var event = _Global.document.createEvent("CustomEvent");
-                    event.initCustomEvent(type, true, true, detail);
-                    return this.element.dispatchEvent(event);
-                },
-
-                _findHeaderTabStop: function hub_findHeaderTabStop(element) {
-                    if (element.parentNode) {
-                        if (_ElementUtilities._matchesSelector(element, ".win-hub-section-header-tabstop, .win-hub-section-header-tabstop *")) {
-                            while (!_ElementUtilities.hasClass(element, "win-hub-section-header-tabstop")) {
-                                element = element.parentElement;
-                            }
-                            return element;
-                        }
-                    }
-                    return null;
-                },
-                _isInteractive: function hub_isInteractive(element) {
-                    // Helper method to skip keyboarding and clicks
-
-                    while (element && element !== _Global.document.body) {
-                        if (_ElementUtilities.hasClass(element, "win-interactive")) {
-                            return true;
-                        }
-                        element = element.parentElement;
-                    }
-                    return false;
-                },
-                _clickHandler: function hub_clickHandler(ev) {
-                    var headerTabStopElement = this._findHeaderTabStop(ev.target);
-                    if (headerTabStopElement && !this._isInteractive(ev.target)) {
-                        var section = headerTabStopElement.parentElement.parentElement.winControl;
-                        if (!section.isHeaderStatic) {
-                            var sectionIndex = this.sections.indexOf(section);
-                            this._fireEvent(Hub._EventName.headerInvoked, {
-                                index: sectionIndex,
-                                section: section
-                            });
-                        }
-                    }
-                },
-                _resizeHandler: function hub_resizeHandler() {
-                    // Viewport, Sections and scroll length need to be measured
-                    this._measured = false;
-                    Scheduler.schedule(this._updateSnapList.bind(this), Scheduler.Priority.idle);
-                },
-
-                _scrollHandler: function hub_scrollHandler() {
-                    // Scroll location needs to be retrieved
-                    this._measured = false;
-
-                    if (this._pendingSections) {
-                        return;
-                    }
-
-                    // Scroll events caused by users overwrite pending API modifications to scrollposition.
-                    this._pendingScrollLocation = null;
-                    this._pendingSectionOnScreen = null;
-
-                    if (!this._pendingScrollHandler) {
-                        this._pendingScrollHandler = _BaseUtils._requestAnimationFrame(function () {
-                            this._pendingScrollHandler = null;
-
-                            if (this._pendingSections) {
-                                return;
-                            }
-
-                            if (this.loadingState !== Hub.LoadingState.complete) {
-                                this._loadSections();
-                            }
-                        }.bind(this));
-                    }
-                },
-                _measure: function hub_measure() {
-                    // Any time a size changes (section growing, window resizing, etc) cachedSizes should be set to false
-                    // and any time the variables need to be read again we should measure the variables. To avoid a lot of
-                    // seperate layouts we measure the variables in a single batch.
-                    if (!this._measured || this._scrollLength === 0) {
-                        this._writeProfilerMark("measure,StartTM");
-                        this._measured = true;
-
-                        this._rtl = _ElementUtilities._getComputedStyle(this._element, null).direction === "rtl";
-
-                        if (this.orientation === _UI.Orientation.vertical) {
-                            this._names = verticalNames;
-                        } else {
-                            if (this._rtl) {
-                                this._names = rtlHorizontalNames;
-                            } else {
-                                this._names = ltrHorizontalNames;
-                            }
-                        }
-
-                        this._viewportSize = this._viewportElement[this._names.offsetSize];
-                        this._viewportOppositeSize = this._viewportElement[this._names.oppositeOffsetSize];
-                        this._scrollPosition = _ElementUtilities.getScrollPosition(this._viewportElement)[this._names.scrollPos];
-                        this._scrollLength = this._viewportElement[this._names.scrollSize];
-
-                        var surfaceElementComputedStyle = _ElementUtilities._getComputedStyle(this._surfaceElement);
-                        this._startSpacer = parseFloat(surfaceElementComputedStyle[this._names.marginStart]) + parseFloat(surfaceElementComputedStyle[this._names.borderStart]) + parseFloat(surfaceElementComputedStyle[this._names.paddingStart]);
-                        this._endSpacer = parseFloat(surfaceElementComputedStyle[this._names.marginEnd]) + parseFloat(surfaceElementComputedStyle[this._names.borderEnd]) + parseFloat(surfaceElementComputedStyle[this._names.paddingEnd]);
-
-                        this._sectionSizes = [];
-                        for (var i = 0; i < this.sections.length; i++) {
-                            var section = this.sections.getAt(i);
-                            var computedSectionStyle = _ElementUtilities._getComputedStyle(section.element);
-                            this._sectionSizes[i] = {
-                                offset: section.element[this._names.offsetPos],
-                                // Reminder: offsetWidth doesn't include margins and also rounds.
-                                size: section.element[this._names.offsetSize],
-                                marginStart: parseFloat(computedSectionStyle[this._names.marginStart]),
-                                marginEnd: parseFloat(computedSectionStyle[this._names.marginEnd]),
-                                borderStart: parseFloat(computedSectionStyle[this._names.borderStart]),
-                                borderEnd: parseFloat(computedSectionStyle[this._names.borderEnd]),
-                                paddingStart: parseFloat(computedSectionStyle[this._names.paddingStart]),
-                                paddingEnd: parseFloat(computedSectionStyle[this._names.paddingEnd])
-                            };
-
-                            if (this._rtl && this.orientation === _UI.Orientation.horizontal) {
-                                this._sectionSizes[i].offset = this._viewportSize - (this._sectionSizes[i].offset + this._sectionSizes[i].size);
-                            }
-                        }
-
-                        this._writeProfilerMark("measure,StopTM");
-                    }
-                },
-                _updateSnapList: function hub_updateSnapList() {
-                    this._writeProfilerMark("updateSnapList,StartTM");
-                    this._measure();
-
-                    var snapList = "snapList(";
-                    for (var i = 0; i < this._sectionSizes.length; i++) {
-                        if (i > 0) {
-                            snapList += ",";
-                        }
-                        var sectionSize = this._sectionSizes[i];
-                        snapList += (sectionSize.offset - sectionSize.marginStart - this._startSpacer) + "px";
-                    }
-                    snapList += ")";
-
-                    var snapListY = "";
-                    var snapListX = "";
-                    if (this.orientation === _UI.Orientation.vertical) {
-                        snapListY = snapList;
-                    } else {
-                        snapListX = snapList;
-                    }
-
-                    if (this._lastSnapPointY !== snapListY) {
-                        this._lastSnapPointY = snapListY;
-                        this._viewportElement.style['-ms-scroll-snap-points-y'] = snapListY;
-                    }
-
-                    if (this._lastSnapPointX !== snapListX) {
-                        this._lastSnapPointX = snapListX;
-                        this._viewportElement.style['-ms-scroll-snap-points-x'] = snapListX;
-                    }
-
-                    this._writeProfilerMark("updateSnapList,StopTM");
-                },
-                _scrollToSection: function Hub_scrollToSection(index, withAnimation) {
-                    this._measure();
-                    var sectionSize = this._sectionSizes[index];
-                    var scrollPositionToShowStartMargin = Math.min(this._scrollLength - this._viewportSize, sectionSize.offset - sectionSize.marginStart - this._startSpacer);
-
-                    this._scrollTo(scrollPositionToShowStartMargin, withAnimation);
-                },
-                _ensureVisible: function hub_ensureVisible(index, withAnimation) {
-                    this._measure();
-                    var targetScrollPos = this._ensureVisibleMath(index, this._scrollPosition);
-                    this._scrollTo(targetScrollPos, withAnimation);
-                },
-                _ensureVisibleMath: function hub_ensureVisibleMath(index, targetScrollPos) {
-                    this._measure();
-                    var sectionSize = this._sectionSizes[index];
-
-                    var scrollPositionToShowStartMargin = Math.min(this._scrollLength - this._viewportSize, sectionSize.offset - sectionSize.marginStart - this._startSpacer);
-                    var scrollPositionToShowEndMargin = Math.max(0, sectionSize.offset + sectionSize.size + sectionSize.marginEnd + this._endSpacer - this._viewportSize + 1);
-                    if (targetScrollPos > scrollPositionToShowStartMargin) {
-                        targetScrollPos = scrollPositionToShowStartMargin;
-                    } else if (targetScrollPos < scrollPositionToShowEndMargin) {
-                        targetScrollPos = Math.min(scrollPositionToShowStartMargin, scrollPositionToShowEndMargin);
-                    }
-
-                    return targetScrollPos;
-                },
-                _scrollTo: function hub_scrollTo(scrollPos, withAnimation) {
-                    this._scrollPosition = scrollPos;
-                    if (withAnimation) {
-                        if (this.orientation === _UI.Orientation.vertical) {
-                            _ElementUtilities._zoomTo(this._viewportElement, { contentX: 0, contentY: this._scrollPosition, viewportX: 0, viewportY: 0 });
-                        } else {
-                            _ElementUtilities._zoomTo(this._viewportElement, { contentX: this._scrollPosition, contentY: 0, viewportX: 0, viewportY: 0 });
-                        }
-                    } else {
-                        var newScrollPos = {};
-                        newScrollPos[this._names.scrollPos] = this._scrollPosition;
-                        _ElementUtilities.setScrollPosition(this._viewportElement, newScrollPos);
-                    }
-                },
-                _windowKeyDownHandler: function hub_windowKeyDownHandler(ev) {
-                    // Include tab and shift tab. Note: Alt Key + Tab and Windows Key + Tab do not fire keydown with ev.key === "Tab".
-                    if (ev.keyCode === Key.tab) {
-                        this._tabSeenLast = true;
-
-                        var that = this;
-                        _BaseUtils._yieldForEvents(function () {
-                            that._tabSeenLast = false;
-                        });
-                    }
-                },
-                _focusin: function hub_focusin(ev) {
-                    // On focus we call ensureVisible to handle the tab or shift/tab to header. However if the
-                    // focus was caused by a pointer down event we skip the focus.
-                    if (this._tabSeenLast) {
-                        var headerTabStopElement = this._findHeaderTabStop(ev.target);
-                        if (headerTabStopElement && !this._isInteractive(ev.target)) {
-                            var sectionIndex = this.sections.indexOf(headerTabStopElement.parentElement.parentElement.winControl);
-                            if (sectionIndex > -1) {
-                                this._ensureVisible(sectionIndex, true);
-                            }
-                        }
-                    }
-
-                    // Always remember the focused section for SemanticZoom.
-                    var sectionElement = ev.target;
-                    while (sectionElement && !_ElementUtilities.hasClass(sectionElement, _Section.HubSection._ClassName.hubSection)) {
-                        sectionElement = sectionElement.parentElement;
-                    }
-                    if (sectionElement) {
-                        var sectionIndex = this.sections.indexOf(sectionElement.winControl);
-                        if (sectionIndex > -1) {
-                            this._currentIndexForSezo = sectionIndex;
-                        }
-                    }
-
-                    if (ev.target === this.element) {
-                        var indexToFocus;
-                        if (+this._sectionToFocus === this._sectionToFocus && this._sectionToFocus >= 0 && this._sectionToFocus < this.sections.length) {
-                            indexToFocus = this._sectionToFocus;
-                            this._sectionToFocus = null;
-                        } else {
-                            indexToFocus = this.sectionOnScreen;
-                        }
-
-                        this._moveFocusIn(indexToFocus);
-                    }
-                },
-                _moveFocusIn: function hub_moveFocusIn(indexToFocus) {
-                    if (indexToFocus >= 0) {
-                        for (var i = indexToFocus; i < this.sections.length; i++) {
-                            var section = this.sections.getAt(i);
-
-                            var focusAttempt = _ElementUtilities._trySetActive(section._headerTabStopElement, this._viewportElement);
-
-                            if (focusAttempt) {
-                                return;
-                            }
-
-                            if (_ElementUtilities._setActiveFirstFocusableElement(section.contentElement, this._viewportElement)) {
-                                return;
-                            }
-                        }
-
-                        for (var i = indexToFocus - 1; i >= 0; i--) {
-                            var section = this.sections.getAt(i);
-
-                            if (_ElementUtilities._setActiveFirstFocusableElement(section.contentElement, this._viewportElement)) {
-                                return;
-                            }
-
-                            var focusAttempt = _ElementUtilities._trySetActive(section._headerTabStopElement, this._viewportElement);
-
-                            if (focusAttempt) {
-                                return;
-                            }
-                        }
-                    }
-                },
-                _keyDownHandler: function hub_keyDownHandler(ev) {
-                    if (this._isInteractive(ev.target) || _ElementUtilities._hasCursorKeysBehaviors(ev.target)) {
-                        return;
-                    }
-
-                    var leftKey = this._rtl ? Key.rightArrow : Key.leftArrow;
-                    var rightKey = this._rtl ? Key.leftArrow : Key.rightArrow;
-
-                    if (ev.keyCode === Key.upArrow || ev.keyCode === Key.downArrow || ev.keyCode === Key.leftArrow || ev.keyCode === Key.rightArrow || ev.keyCode === Key.pageUp || ev.keyCode === Key.pageDown) {
-                        var headerTabStopElement = this._findHeaderTabStop(ev.target);
-                        if (headerTabStopElement) {
-                            var currentSection = this.sections.indexOf(headerTabStopElement.parentElement.parentElement.winControl);
-                            var targetSectionIndex;
-                            var useEnsureVisible = false;
-                            // Page up/down go to the next/previous header and line it up with the app header. Up/Right/Down/Left
-                            // move focus to the next/previous header and move it on screen (app header distance from either edge).
-                            if (ev.keyCode === Key.pageDown ||
-                                (this.orientation === _UI.Orientation.horizontal && ev.keyCode === rightKey) ||
-                                (this.orientation === _UI.Orientation.vertical && ev.keyCode === Key.downArrow)) {
-                                // Do not include hidden headers.
-                                for (var i = currentSection + 1; i < this.sections.length; i++) {
-                                    if (this._tryFocus(i)) {
-                                        targetSectionIndex = i;
-                                        break;
-                                    }
-                                }
-                            } else if (ev.keyCode === Key.pageUp ||
-                                (this.orientation === _UI.Orientation.horizontal && ev.keyCode === leftKey) ||
-                                (this.orientation === _UI.Orientation.vertical && ev.keyCode === Key.upArrow)) {
-                                // Do not include hidden headers.
-                                for (var i = currentSection - 1; i >= 0; i--) {
-                                    if (this._tryFocus(i)) {
-                                        targetSectionIndex = i;
-                                        break;
-                                    }
-                                }
-                            }
-                            if (ev.keyCode === Key.upArrow || ev.keyCode === Key.downArrow || ev.keyCode === Key.leftArrow || ev.keyCode === Key.rightArrow) {
-                                useEnsureVisible = true;
-                            }
-
-                            if (+targetSectionIndex === targetSectionIndex) {
-                                if (useEnsureVisible) {
-                                    this._ensureVisible(targetSectionIndex, true);
-                                } else {
-                                    this._scrollToSection(targetSectionIndex, true);
-                                }
-                                ev.preventDefault();
-                            }
-                        }
-                    } else if (ev.keyCode === Key.home || ev.keyCode === Key.end) {
-                        // Home/End scroll to start/end and leave focus where it is.
-                        this._measure();
-                        var maxScrollPos = Math.max(0, this._scrollLength - this._viewportSize);
-                        this._scrollTo(ev.keyCode === Key.home ? 0 : maxScrollPos, true);
-                        ev.preventDefault();
-                    }
-                },
-                _tryFocus: function hub_tryFocus(index) {
-                    var targetSection = this.sections.getAt(index);
-
-                    _ElementUtilities._setActive(targetSection._headerTabStopElement, this._viewportElement);
-
-                    return _Global.document.activeElement === targetSection._headerTabStopElement;
-                },
-                /// <field type="Object" locid="WinJS.UI.Hub.zoomableView" helpKeyword="WinJS.UI.Hub.zoomableView" isAdvanced="true">
-                /// Gets a ZoomableView. This API supports the SemanticZoom infrastructure
-                /// and is not intended to be used directly from your code.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                zoomableView: {
-                    get: function zoomableView_get() {
-                        if (!this._zoomableView) {
-                            this._zoomableView = new ZoomableView(this);
-                        }
-
-                        return this._zoomableView;
-                    }
-                },
-                _getPanAxis: function hub_getPanAxis() {
-                    return this.orientation === _UI.Orientation.horizontal ? "horizontal" : "vertical";
-                },
-                _configureForZoom: function hub_configureForZoom() {
-                    // Nothing to configure.
-                },
-                _setCurrentItem: function hub_setCurrentItem(x, y) {
-                    var offset;
-                    if (this.orientation === _UI.Orientation.horizontal) {
-                        offset = x;
-                    } else {
-                        offset = y;
-                    }
-
-                    this._measure();
-                    offset = offset + this._scrollPosition;
-                    this._currentIndexForSezo = this._sectionSizes.length - 1;
-                    for (var i = 1; i < this._sectionSizes.length; i++) {
-                        var sectionSize = this._sectionSizes[i];
-                        if (sectionSize.offset - sectionSize.marginStart > offset) {
-                            this._currentIndexForSezo = i - 1;
-                            break;
-                        }
-                    }
-                },
-                _getCurrentItem: function hub_getCurrentItem() {
-                    var itemPosition;
-                    if (this._sectionSizes.length > 0) {
-                        this._measure();
-                        var index = Math.max(0, Math.min(this._currentIndexForSezo, this._sectionSizes.length));
-                        var sectionSize = this._sectionSizes[index];
-                        if (this.orientation === _UI.Orientation.horizontal) {
-                            itemPosition = {
-                                left: Math.max(0, sectionSize.offset - sectionSize.marginStart - this._scrollPosition),
-                                top: 0,
-                                width: sectionSize.size,
-                                height: this._viewportOppositeSize
-                            };
-                        } else {
-                            itemPosition = {
-                                left: 0,
-                                top: Math.max(0, sectionSize.offset - sectionSize.marginStart - this._scrollPosition),
-                                width: this._viewportOppositeSize,
-                                height: sectionSize.size,
-                            };
-                        }
-
-                        var section = this.sections.getAt(index);
-                        // BUGBUG: 53301 ListView and Hub should document what they expect to be returned from the
-                        // getCurrentItem so that positionItem apis line up. ListView zoomed out expects an object with
-                        // groupIndexHint, groupKey, or groupDescription. Hub expects an object with index.
-                        return Promise.wrap({ item: { data: section, index: index, groupIndexHint: index }, position: itemPosition });
-                    }
-                },
-                _beginZoom: function hub_beginZoom() {
-                    // Hide scroll thumb.
-                    this._viewportElement.style["-ms-overflow-style"] = "none";
-                },
-                _positionItem: function hub_positionItem(item, position) {
-                    if (item.index >= 0 && item.index < this._sectionSizes.length) {
-                        this._measure();
-                        var sectionSize = this._sectionSizes[item.index];
-
-                        var offsetFromViewport;
-                        if (this.orientation === _UI.Orientation.horizontal) {
-                            offsetFromViewport = position.left;
-                        } else {
-                            offsetFromViewport = position.top;
-                        }
-
-                        this._sectionToFocus = item.index;
-
-                        var targetScrollPosition = sectionSize.offset - offsetFromViewport;
-                        // clamp section:
-                        var targetScrollPosition = this._ensureVisibleMath(item.index, targetScrollPosition);
-
-                        this._scrollPosition = targetScrollPosition;
-                        var newScrollPos = {};
-                        newScrollPos[this._names.scrollPos] = this._scrollPosition;
-                        _ElementUtilities.setScrollPosition(this._viewportElement, newScrollPos);
-                    }
-                },
-                _endZoom: function hub_endZoom() {
-                    // Show scroll thumb.
-                    this._viewportElement.style["-ms-overflow-style"] = "";
-                },
-                _writeProfilerMark: function hub_writeProfilerMark(text) {
-                    var message = "WinJS.UI.Hub:" + this._id + ":" + text;
-                    _WriteProfilerMark(message);
-                    _Log.log && _Log.log(message, null, "hubprofiler");
-                },
-                /// <signature helpKeyword="WinJS.UI.Hub.dispose">
-                /// <summary locid="WinJS.UI.Hub.dispose">
-                /// Disposes this control.
-                /// </summary>
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </signature>
-                dispose: function hub_dispose() {
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._disposed = true;
-
-                    _Global.removeEventListener('keydown', this._windowKeyDownHandlerBound);
-                    _ElementUtilities._resizeNotifier.unsubscribe(this.element, this._resizeHandlerBound);
-                    this._elementResizeInstrument.dispose();
-
-                    this._updateEvents(this._sections);
-
-                    for (var i = 0; i < this.sections.length; i++) {
-                        this.sections.getAt(i).dispose();
-                    }
-                },
-                /// <signature helpKeyword="WinJS.UI.Hub.forceLayout">
-                /// <summary locid="WinJS.UI.Hub.forceLayout">
-                /// Forces the Hub to update its layout.
-                /// Use this function when making the Hub visible again after you've set its style.display property to "none” or after style changes have been made that affect the size of the HubSections.
-                /// </summary>
-                /// </signature>
-                forceLayout: function hub_forceLayout() {
-                    // Currently just the same behavior as resize.
-                    this._resizeHandler();
-                }
-            }, {
-                /// <field locid="WinJS.UI.Hub.AnimationType" helpKeyword="WinJS.UI.Hub.AnimationType">
-                /// Specifies whether the Hub animation is an entrance animation or a transition animation.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                AnimationType: {
-                    /// <field locid="WinJS.UI.Hub.AnimationType.entrance" helpKeyword="WinJS.UI.Hub.AnimationType.entrance">
-                    /// The animation plays when the Hub is first displayed.
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </field>
-                    entrance: "entrance",
-                    /// <field locid="WinJS.UI.Hub.AnimationType.contentTransition" helpKeyword="WinJS.UI.Hub.AnimationType.contentTransition">
-                    /// The animation plays when the Hub is changing its content.
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </field>
-                    contentTransition: "contentTransition",
-                    /// <field locid="WinJS.UI.Hub.AnimationType.insert" helpKeyword="WinJS.UI.Hub.AnimationType.insert">
-                    /// The animation plays when a section is inserted into the Hub.
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </field>
-                    insert: "insert",
-                    /// <field locid="WinJS.UI.Hub.AnimationType.remove" helpKeyword="WinJS.UI.Hub.AnimationType.remove">
-                    /// The animation plays when a section is removed into the Hub.
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </field>
-                    remove: "remove",
-                },
-                /// <field locid="WinJS.UI.Hub.LoadingState" helpKeyword="WinJS.UI.Hub.LoadingState">
-                /// Gets the current loading state of the Hub.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                LoadingState: {
-                    /// <field locid="WinJS.UI.Hub.LoadingState.loading" helpKeyword="WinJS.UI.Hub.LoadingState.loading">
-                    /// The Hub is loading sections.
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </field>
-                    loading: "loading",
-                    /// <field locid="WinJS.UI.Hub.LoadingState.complete" helpKeyword="WinJS.UI.Hub.LoadingState.complete">
-                    /// All sections are loaded and animations are complete.
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </field>
-                    complete: "complete"
-                },
-                // Names of classes used by the Hub.
-                _ClassName: {
-                    hub: "win-hub",
-                    hubSurface: "win-hub-surface",
-                    hubProgress: "win-hub-progress",
-                    hubViewport: "win-hub-viewport",
-                    hubVertical: "win-hub-vertical",
-                    hubHorizontal: "win-hub-horizontal",
-                },
-                // Names of events fired by the Hub.
-                _EventName: {
-                    contentAnimating: eventNames.contentAnimating,
-                    headerInvoked: eventNames.headerInvoked,
-                    loadingStateChanged: eventNames.loadingStateChanged
-                },
-            });
-
-            _Base.Class.mix(Hub, _Control.DOMEventMixin);
-
-            var ZoomableView = _Base.Class.define(function ZoomableView_ctor(hub) {
-                this._hub = hub;
-            }, {
-                getPanAxis: function () {
-                    return this._hub._getPanAxis();
-                },
-                configureForZoom: function (isZoomedOut, isCurrentView, triggerZoom, prefetchedPages) {
-                    this._hub._configureForZoom(isZoomedOut, isCurrentView, triggerZoom, prefetchedPages);
-                },
-                setCurrentItem: function (x, y) {
-                    this._hub._setCurrentItem(x, y);
-                },
-                getCurrentItem: function () {
-                    return this._hub._getCurrentItem();
-                },
-                beginZoom: function () {
-                    this._hub._beginZoom();
-                },
-                positionItem: function (item, position) {
-                    return this._hub._positionItem(item, position);
-                },
-                endZoom: function (isCurrentView) {
-                    this._hub._endZoom(isCurrentView);
-                }
-            });
-
-            var strings = {
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; },
-                get duplicateSection() { return "Hub duplicate sections: Each HubSection must be unique"; },
-                get invalidContent() { return "Invalid content: Hub content must be made up of HubSections."; },
-                get hubViewportAriaLabel() { return _Resources._getWinJSString("ui/hubViewportAriaLabel").value; }
-            };
-
-            return Hub;
-        })
-    });
-
-});
-
-define('require-style!less/styles-lightdismissservice',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-var __extends = this.__extends || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    __.prototype = b.prototype;
-    d.prototype = new __();
-};
-define('WinJS/_LightDismissService',["require", "exports", './Application', './Core/_Base', './Core/_BaseUtils', './Utilities/_ElementUtilities', './Core/_Global', './Utilities/_KeyboardBehavior', './Core/_Log', './Core/_Resources'], function (require, exports, Application, _Base, _BaseUtils, _ElementUtilities, _Global, _KeyboardBehavior, _Log, _Resources) {
-    require(["require-style!less/styles-lightdismissservice"]);
-    "use strict";
-    //
-    // Implementation Overview
-    //
-    // The _LightDismissService was designed to coordinate light dismissables. A light
-    // dismissable is an element which, when shown, can be dismissed due to a variety of
-    // cues (listed in LightDismissalReasons):
-    //   - Clicking/tapping outside of the light dismissable
-    //   - Focus leaving the light dismissable
-    //   - User pressing the escape key
-    //   - User pressing the hardware back button
-    //   - User resizing the window
-    //   - User focusing on a different app
-    //
-    // The _LightDismissService's responsibilites have grown so that it can manage more than
-    // just light dismissables (e.g. modals which ignore most of the light dismiss cues). Its
-    // responsibilities include:
-    //   - Rendering the dismissables in the correct z-order. The most recently opened dismissable
-    //     is the topmost one. In order for this requirement to be fulfilled, apps must make
-    //     dismissables direct children of the body. For details, see:
-    //     https://github.com/winjs/winjs/wiki/Dismissables-and-Stacking-Contexts
-    //   - When a different dismissable becomes the topmost, giving that dismissable focus.
-    //   - Informing dismissables when a dismiss cue occurs so they can dismiss if they want to
-    //   - Propagating keyboard events which occur within a dismissable to dismissables underneath
-    //     it in the stack. When a modal dialog is in the stack, this enables the modal to prevent
-    //     any keyboard events from escaping the light dismiss stack. Consequently, global
-    //     hotkeys such as the WinJS BackButton's global back hotkey will be disabled while a
-    //     modal dialog is in the stack.
-    //   - Disabling SearchBox's type to search feature while any dismissable is in the stack.
-    //     Consequently, type to search can only be used in the body -- it cannot be used inside
-    //     of dismissables. If the _LightDismissService didn't do this, typing within any light
-    //     dismissable would cause focus to move into the SearchBox in the body and for all light
-    //     dismissables to lose focus and thus close. Type to search is provided by the event
-    //     requestingFocusOnKeyboardInput.
-    //
-    // Controls which want to utilize the _LightDismissService must implement ILightDismissable.
-    // The _LightDismissService provides a couple of classes which controls can utilize that
-    // implement most of the methods of ILightDismissable:
-    //   - LightDismissableElement. Used by controls which are light dismissable. These include:
-    //     - AppBar/ToolBar
-    //     - Flyout
-    //     - Menu
-    //     - SplitView
-    //   - ModalElement. Used by controls which are modal. These include:
-    //     - ContentDialog
-    //
-    // Debugging tip.
-    //   Call WinJS.UI._LightDismissService._setDebug(true)
-    //   This disables the "window blur" light dismiss cue. It enables you to move focus
-    //   to the debugger or DOM explorer without causing the light dismissables to close.
-    //
-    // Example usage of _LightDismissService
-    //   To implement a new light dismissable, you just need to:
-    //     - Tell the service when you are shown
-    //     - Tell the service when you are hidden
-    //     - Create an object which implements ILightDismissable. In most cases, you will
-    //       utilize the LightDismissableElement or ModalElement helper which only requires
-    //       you to provide a DOM element, a tab index for that element, and an
-    //       implementation of onLightDismiss.
-    //
-    //   Here's what a basic light dismissable looks like in code:
-    //
-    //     var SimpleOverlay = _Base.Class.define(function (element) {
-    //         var that = this;
-    //         this.element = element || document.createElement("div");
-    //         this.element.winControl = this;
-    //         _ElementUtilities.addClass(this.element, "simpleoverlay");
-    //
-    //         this._dismissable = new _LightDismissService.LightDismissableElement({
-    //             element: this.element,
-    //             tabIndex: this.element.hasAttribute("tabIndex") ? this.element.tabIndex : -1,
-    //             onLightDismiss: function () {
-    //                 that.hide();
-    //             }
-    //         });
-    //     }, {
-    //         show: function () {
-    //             _ElementUtilities.addClass(this.element, "simpleoverlay-shown");
-    //             _LightDismissService.shown(this._dismissable);
-    //         },
-    //         hide: function () {
-    //             _ElementUtilities.removeClass(this.element, "simpleoverlay-shown");
-    //             _LightDismissService.hidden(this._dismissable);
-    //         }
-    //     });
-    //
-    //   When using LightDismissableElement/ModalElement, you may optionally override:
-    //     - onShouldLightDismiss: This enables you to specify which light dismiss cues
-    //       should trigger a light dismiss for your control. The defaults are:
-    //       - LightDismissableElement: Essentially all cues trigger a dismiss.
-    //       - ModalElement: Only the escape key and hardware back button trigger a
-    //         dismiss.
-    //     - onTakeFocus: This enables you to specify which element within your control
-    //       should receive focus when it becomes the topmost dismissable. When overriding
-    //       this method, it's common to start by calling this.restoreFocus, a helper
-    //       provided by LightDismissableElement/ModalElement, to restore focus to the
-    //       element within the dismissable which most recently had it. By default,
-    //       onTakeFocus tries to give focus to elements in the following order:
-    //       - Tries to restore focus to the element that previously had focus
-    //       - Tries to give focus to the first focusable element in the dismissable.
-    //       - Tries to give focus to the root element of the dismissable.
-    //
-    var baseZIndex = 1000;
-    var Strings = {
-        get closeOverlay() {
-            return _Resources._getWinJSString("ui/closeOverlay").value;
-        }
-    };
-    exports._ClassNames = {
-        _clickEater: "win-clickeater"
-    };
-    var EventNames = {
-        requestingFocusOnKeyboardInput: "requestingfocusonkeyboardinput"
-    };
-    exports.LightDismissalReasons = {
-        tap: "tap",
-        lostFocus: "lostFocus",
-        escape: "escape",
-        hardwareBackButton: "hardwareBackButton",
-        windowResize: "windowResize",
-        windowBlur: "windowBlur"
-    };
-    // Built-in implementations of ILightDismissable's onShouldLightDismiss.
-    exports.DismissalPolicies = {
-        light: function LightDismissalPolicies_light_onShouldLightDismiss(info) {
-            switch (info.reason) {
-                case exports.LightDismissalReasons.tap:
-                case exports.LightDismissalReasons.escape:
-                    if (info.active) {
-                        return true;
-                    }
-                    else {
-                        info.stopPropagation();
-                        return false;
-                    }
-                    break;
-                case exports.LightDismissalReasons.hardwareBackButton:
-                    if (info.active) {
-                        info.preventDefault(); // prevent backwards navigation in the app
-                        return true;
-                    }
-                    else {
-                        info.stopPropagation();
-                        return false;
-                    }
-                    break;
-                case exports.LightDismissalReasons.lostFocus:
-                case exports.LightDismissalReasons.windowResize:
-                case exports.LightDismissalReasons.windowBlur:
-                    return true;
-            }
-        },
-        modal: function LightDismissalPolicies_modal_onShouldLightDismiss(info) {
-            // Light dismiss cues should not be seen by dismissables behind the modal
-            info.stopPropagation();
-            switch (info.reason) {
-                case exports.LightDismissalReasons.tap:
-                case exports.LightDismissalReasons.lostFocus:
-                case exports.LightDismissalReasons.windowResize:
-                case exports.LightDismissalReasons.windowBlur:
-                    return false;
-                    break;
-                case exports.LightDismissalReasons.escape:
-                    return info.active;
-                    break;
-                case exports.LightDismissalReasons.hardwareBackButton:
-                    info.preventDefault(); // prevent backwards navigation in the app
-                    return info.active;
-                    break;
-            }
-        },
-        sticky: function LightDismissalPolicies_sticky_onShouldLightDismiss(info) {
-            info.stopPropagation();
-            return false;
-        }
-    };
-    var KeyboardInfoType = {
-        keyDown: "keyDown",
-        keyUp: "keyUp",
-        keyPress: "keyPress"
-    };
-    var AbstractDismissableElement = (function () {
-        function AbstractDismissableElement(args) {
-            this.element = args.element;
-            this.element.tabIndex = args.tabIndex;
-            this.onLightDismiss = args.onLightDismiss;
-            // Allow the caller to override the default implementations of our ILightDismissable methods.
-            if (args.onTakeFocus) {
-                this.onTakeFocus = args.onTakeFocus;
-            }
-            if (args.onShouldLightDismiss) {
-                this.onShouldLightDismiss = args.onShouldLightDismiss;
-            }
-            this._ldeOnKeyDownBound = this._ldeOnKeyDown.bind(this);
-            this._ldeOnKeyUpBound = this._ldeOnKeyUp.bind(this);
-            this._ldeOnKeyPressBound = this._ldeOnKeyPress.bind(this);
-        }
-        // Helper which can be called when implementing onTakeFocus. Restores focus to
-        // whatever element within the dismissable previously had focus. Returns true
-        // if focus was successfully restored and false otherwise. In the false case,
-        // onTakeFocus implementers typically try to give focus to either the first
-        // focusable element in the dismissable or to the root element of the dismissable.
-        AbstractDismissableElement.prototype.restoreFocus = function () {
-            var activeElement = _Global.document.activeElement;
-            if (activeElement && this.containsElement(activeElement)) {
-                this._ldeCurrentFocus = activeElement;
-                return true;
-            }
-            else {
-                // If the last input type was keyboard, use focus() so a keyboard focus visual is drawn.
-                // Otherwise, use setActive() so no focus visual is drawn.
-                var useSetActive = !_KeyboardBehavior._keyboardSeenLast;
-                return this._ldeCurrentFocus && this.containsElement(this._ldeCurrentFocus) && _ElementUtilities._tryFocusOnAnyElement(this._ldeCurrentFocus, useSetActive);
-            }
-        };
-        AbstractDismissableElement.prototype._ldeOnKeyDown = function (eventObject) {
-            this._ldeService.keyDown(this, eventObject);
-        };
-        AbstractDismissableElement.prototype._ldeOnKeyUp = function (eventObject) {
-            this._ldeService.keyUp(this, eventObject);
-        };
-        AbstractDismissableElement.prototype._ldeOnKeyPress = function (eventObject) {
-            this._ldeService.keyPress(this, eventObject);
-        };
-        // ILightDismissable
-        //
-        AbstractDismissableElement.prototype.setZIndex = function (zIndex) {
-            this.element.style.zIndex = zIndex;
-        };
-        AbstractDismissableElement.prototype.getZIndexCount = function () {
-            return 1;
-        };
-        AbstractDismissableElement.prototype.containsElement = function (element) {
-            return this.element.contains(element);
-        };
-        AbstractDismissableElement.prototype.onTakeFocus = function (useSetActive) {
-            this.restoreFocus() || _ElementUtilities._focusFirstFocusableElement(this.element, useSetActive) || _ElementUtilities._tryFocusOnAnyElement(this.element, useSetActive);
-        };
-        AbstractDismissableElement.prototype.onFocus = function (element) {
-            this._ldeCurrentFocus = element;
-        };
-        AbstractDismissableElement.prototype.onShow = function (service) {
-            this._ldeService = service;
-            this.element.addEventListener("keydown", this._ldeOnKeyDownBound);
-            this.element.addEventListener("keyup", this._ldeOnKeyUpBound);
-            this.element.addEventListener("keypress", this._ldeOnKeyPressBound);
-        };
-        AbstractDismissableElement.prototype.onHide = function () {
-            this._ldeCurrentFocus = null;
-            this._ldeService = null;
-            this.element.removeEventListener("keydown", this._ldeOnKeyDownBound);
-            this.element.removeEventListener("keyup", this._ldeOnKeyUpBound);
-            this.element.removeEventListener("keypress", this._ldeOnKeyPressBound);
-        };
-        // Concrete subclasses are expected to implement these.
-        AbstractDismissableElement.prototype.onKeyInStack = function (info) {
-        };
-        AbstractDismissableElement.prototype.onShouldLightDismiss = function (info) {
-            return false;
-        };
-        // Consumers of concrete subclasses of AbstractDismissableElement are expected to
-        // provide these as parameters to the constructor.
-        AbstractDismissableElement.prototype.onLightDismiss = function (info) {
-        };
-        return AbstractDismissableElement;
-    })();
-    var LightDismissableElement = (function (_super) {
-        __extends(LightDismissableElement, _super);
-        function LightDismissableElement() {
-            _super.apply(this, arguments);
-        }
-        LightDismissableElement.prototype.onKeyInStack = function (info) {
-        };
-        LightDismissableElement.prototype.onShouldLightDismiss = function (info) {
-            return exports.DismissalPolicies.light(info);
-        };
-        return LightDismissableElement;
-    })(AbstractDismissableElement);
-    exports.LightDismissableElement = LightDismissableElement;
-    var ModalElement = (function (_super) {
-        __extends(ModalElement, _super);
-        function ModalElement() {
-            _super.apply(this, arguments);
-        }
-        ModalElement.prototype.onKeyInStack = function (info) {
-            // stopPropagation so that none of the app's other event handlers will see the event.
-            // Don't preventDefault so that the browser's hotkeys will still work.
-            info.stopPropagation();
-        };
-        ModalElement.prototype.onShouldLightDismiss = function (info) {
-            return exports.DismissalPolicies.modal(info);
-        };
-        return ModalElement;
-    })(AbstractDismissableElement);
-    exports.ModalElement = ModalElement;
-    // An implementation of ILightDismissable that represents the HTML body element. It can never be dismissed. The
-    // service should instantiate one of these to act as the bottommost light dismissable at all times (it isn't expected
-    // for anybody else to instantiate one). It takes care of restoring focus when the last dismissable is dismissed.
-    var LightDismissableBody = (function () {
-        function LightDismissableBody() {
-        }
-        LightDismissableBody.prototype.setZIndex = function (zIndex) {
-        };
-        LightDismissableBody.prototype.getZIndexCount = function () {
-            return 1;
-        };
-        LightDismissableBody.prototype.containsElement = function (element) {
-            return _Global.document.body.contains(element);
-        };
-        LightDismissableBody.prototype.onTakeFocus = function (useSetActive) {
-            this.currentFocus && this.containsElement(this.currentFocus) && _ElementUtilities._tryFocusOnAnyElement(this.currentFocus, useSetActive);
-        };
-        LightDismissableBody.prototype.onFocus = function (element) {
-            this.currentFocus = element;
-        };
-        LightDismissableBody.prototype.onShow = function (service) {
-        };
-        LightDismissableBody.prototype.onHide = function () {
-            this.currentFocus = null;
-        };
-        LightDismissableBody.prototype.onKeyInStack = function (info) {
-        };
-        LightDismissableBody.prototype.onShouldLightDismiss = function (info) {
-            return false;
-        };
-        LightDismissableBody.prototype.onLightDismiss = function (info) {
-        };
-        return LightDismissableBody;
-    })();
-    ;
-    var LightDismissService = (function () {
-        function LightDismissService() {
-            this._debug = false; // Disables dismiss due to window blur. Useful during debugging.
-            this._clients = [];
-            this._notifying = false;
-            this._bodyClient = new LightDismissableBody();
-            // State private to _updateDom. No other method should make use of it.
-            this._updateDom_rendered = {
-                serviceActive: false
-            };
-            this._clickEaterEl = this._createClickEater();
-            this._onBeforeRequestingFocusOnKeyboardInputBound = this._onBeforeRequestingFocusOnKeyboardInput.bind(this);
-            this._onFocusInBound = this._onFocusIn.bind(this);
-            this._onKeyDownBound = this._onKeyDown.bind(this);
-            this._onWindowResizeBound = this._onWindowResize.bind(this);
-            this._onClickEaterPointerUpBound = this._onClickEaterPointerUp.bind(this);
-            this._onClickEaterPointerCancelBound = this._onClickEaterPointerCancel.bind(this);
-            // Register for infrequent events.
-            Application.addEventListener("backclick", this._onBackClick.bind(this));
-            // Focus handlers generally use _ElementUtilities._addEventListener with focusout/focusin. This
-            // uses the browser's blur event directly beacuse _addEventListener doesn't support focusout/focusin
-            // on window.
-            _Global.window.addEventListener("blur", this._onWindowBlur.bind(this));
-            this.shown(this._bodyClient);
-        }
-        // Dismissables should call this as soon as they are ready to be shown. More specifically, they should call this:
-        //   - After they are in the DOM and ready to receive focus (e.g. style.display cannot = "none")
-        //   - Before their entrance animation is played
-        LightDismissService.prototype.shown = function (client) {
-            var index = this._clients.indexOf(client);
-            if (index === -1) {
-                this._clients.push(client);
-                client.onShow(this);
-                this._updateDom();
-            }
-        };
-        // Dismissables should call this when they are done being dismissed (i.e. after their exit animation has finished)
-        LightDismissService.prototype.hidden = function (client) {
-            var index = this._clients.indexOf(client);
-            if (index !== -1) {
-                this._clients.splice(index, 1);
-                client.setZIndex("");
-                client.onHide();
-                this._updateDom();
-            }
-        };
-        // Dismissables should call this when their state has changed such that it'll affect the behavior of some method
-        // in its ILightDismissable interface. For example, if the dismissable was altered such that getZIndexCount will
-        // now return 2 instead of 1, that dismissable should call *updated* so the LightDismissService can find out about
-        // this change.
-        LightDismissService.prototype.updated = function (client) {
-            this._updateDom();
-        };
-        // Dismissables should call keyDown, keyUp, and keyPress when such an event occurs within the dismissable. The
-        // _LightDismissService takes these events and propagates them to other ILightDismissables in the stack by calling
-        // onKeyInStack on them. LightDismissableElement and ModalElement call keyDown, keyUp, and keyPress for you so
-        // if you use them while implementing an ILightDismissable, you don't have to worry about this responsibility.
-        LightDismissService.prototype.keyDown = function (client, eventObject) {
-            if (eventObject.keyCode === _ElementUtilities.Key.escape) {
-                this._escapePressed(eventObject);
-            }
-            else {
-                this._dispatchKeyboardEvent(client, KeyboardInfoType.keyDown, eventObject);
-            }
-        };
-        LightDismissService.prototype.keyUp = function (client, eventObject) {
-            this._dispatchKeyboardEvent(client, KeyboardInfoType.keyUp, eventObject);
-        };
-        LightDismissService.prototype.keyPress = function (client, eventObject) {
-            this._dispatchKeyboardEvent(client, KeyboardInfoType.keyPress, eventObject);
-        };
-        LightDismissService.prototype.isShown = function (client) {
-            return this._clients.indexOf(client) !== -1;
-        };
-        LightDismissService.prototype.isTopmost = function (client) {
-            return client === this._clients[this._clients.length - 1];
-        };
-        // Disables dismiss due to window blur. Useful during debugging.
-        LightDismissService.prototype._setDebug = function (debug) {
-            this._debug = debug;
-        };
-        LightDismissService.prototype._updateDom = function (options) {
-            options = options || {};
-            var activeDismissableNeedsFocus = !!options.activeDismissableNeedsFocus;
-            var rendered = this._updateDom_rendered;
-            if (this._notifying) {
-                return;
-            }
-            var serviceActive = this._clients.length > 1;
-            if (serviceActive !== rendered.serviceActive) {
-                // Unregister/register for events that occur frequently.
-                if (serviceActive) {
-                    Application.addEventListener("beforerequestingfocusonkeyboardinput", this._onBeforeRequestingFocusOnKeyboardInputBound);
-                    _ElementUtilities._addEventListener(_Global.document.documentElement, "focusin", this._onFocusInBound);
-                    _Global.document.documentElement.addEventListener("keydown", this._onKeyDownBound);
-                    _Global.window.addEventListener("resize", this._onWindowResizeBound);
-                    this._bodyClient.currentFocus = _Global.document.activeElement;
-                    _Global.document.body.appendChild(this._clickEaterEl);
-                }
-                else {
-                    Application.removeEventListener("beforerequestingfocusonkeyboardinput", this._onBeforeRequestingFocusOnKeyboardInputBound);
-                    _ElementUtilities._removeEventListener(_Global.document.documentElement, "focusin", this._onFocusInBound);
-                    _Global.document.documentElement.removeEventListener("keydown", this._onKeyDownBound);
-                    _Global.window.removeEventListener("resize", this._onWindowResizeBound);
-                    var parent = this._clickEaterEl.parentNode;
-                    parent && parent.removeChild(this._clickEaterEl);
-                }
-                rendered.serviceActive = serviceActive;
-            }
-            var zIndexGap = 0;
-            var lastUsedZIndex = baseZIndex + 1;
-            this._clients.forEach(function (c, i) {
-                var currentZIndex = parseInt(lastUsedZIndex.toString()) + parseInt(zIndexGap.toString());
-                c.setZIndex("" + currentZIndex);
-                lastUsedZIndex = currentZIndex;
-                // count + 1 so that there's an unused zIndex between each pair of
-                // dismissables that can be used by the click eater.
-                zIndexGap = parseInt(c.getZIndexCount().toString()) + 1;
-            });
-            if (serviceActive) {
-                this._clickEaterEl.style.zIndex = "" + (lastUsedZIndex - 1);
-            }
-            var activeDismissable = this._clients.length > 0 ? this._clients[this._clients.length - 1] : null;
-            if (this._activeDismissable !== activeDismissable) {
-                this._activeDismissable = activeDismissable;
-                activeDismissableNeedsFocus = true;
-            }
-            if (activeDismissableNeedsFocus) {
-                // If the last input type was keyboard, use focus() so a keyboard focus visual is drawn.
-                // Otherwise, use setActive() so no focus visual is drawn.
-                var useSetActive = !_KeyboardBehavior._keyboardSeenLast;
-                this._activeDismissable && this._activeDismissable.onTakeFocus(useSetActive);
-            }
-        };
-        LightDismissService.prototype._dispatchKeyboardEvent = function (client, keyboardInfoType, eventObject) {
-            var index = this._clients.indexOf(client);
-            if (index !== -1) {
-                var info = {
-                    type: keyboardInfoType,
-                    keyCode: eventObject.keyCode,
-                    propagationStopped: false,
-                    stopPropagation: function () {
-                        this.propagationStopped = true;
-                        eventObject.stopPropagation();
-                    }
-                };
-                var clients = this._clients.slice(0, index + 1);
-                for (var i = clients.length - 1; i >= 0 && !info.propagationStopped; i--) {
-                    clients[i].onKeyInStack(info);
-                }
-            }
-        };
-        LightDismissService.prototype._dispatchLightDismiss = function (reason, clients, options) {
-            if (this._notifying) {
-                _Log.log && _Log.log('_LightDismissService ignored dismiss trigger to avoid re-entrancy: "' + reason + '"', "winjs _LightDismissService", "warning");
-                return;
-            }
-            clients = clients || this._clients.slice(0);
-            if (clients.length === 0) {
-                return;
-            }
-            this._notifying = true;
-            var lightDismissInfo = {
-                // Which of the LightDismissalReasons caused this event to fire?
-                reason: reason,
-                // Is this dismissable currently the active dismissable?
-                active: false,
-                _stop: false,
-                stopPropagation: function () {
-                    this._stop = true;
-                },
-                _doDefault: true,
-                preventDefault: function () {
-                    this._doDefault = false;
-                }
-            };
-            for (var i = clients.length - 1; i >= 0 && !lightDismissInfo._stop; i--) {
-                lightDismissInfo.active = this._activeDismissable === clients[i];
-                if (clients[i].onShouldLightDismiss(lightDismissInfo)) {
-                    clients[i].onLightDismiss(lightDismissInfo);
-                }
-            }
-            this._notifying = false;
-            this._updateDom(options);
-            return lightDismissInfo._doDefault;
-        };
-        LightDismissService.prototype._onBeforeRequestingFocusOnKeyboardInput = function (eventObject) {
-            // Suppress the requestingFocusOnKeyboardInput event.
-            return true;
-        };
-        //
-        // Light dismiss triggers
-        //
-        // Called by tests.
-        LightDismissService.prototype._clickEaterTapped = function () {
-            this._dispatchLightDismiss(exports.LightDismissalReasons.tap);
-        };
-        LightDismissService.prototype._onFocusIn = function (eventObject) {
-            var target = eventObject.target;
-            for (var i = this._clients.length - 1; i >= 0; i--) {
-                if (this._clients[i].containsElement(target)) {
-                    break;
-                }
-            }
-            if (i !== -1) {
-                this._clients[i].onFocus(target);
-            }
-            if (i + 1 < this._clients.length) {
-                this._dispatchLightDismiss(exports.LightDismissalReasons.lostFocus, this._clients.slice(i + 1), {
-                    activeDismissableNeedsFocus: true
-                });
-            }
-        };
-        LightDismissService.prototype._onKeyDown = function (eventObject) {
-            if (eventObject.keyCode === _ElementUtilities.Key.escape) {
-                this._escapePressed(eventObject);
-            }
-        };
-        LightDismissService.prototype._escapePressed = function (eventObject) {
-            eventObject.preventDefault();
-            eventObject.stopPropagation();
-            this._dispatchLightDismiss(exports.LightDismissalReasons.escape);
-        };
-        // Called by tests.
-        LightDismissService.prototype._onBackClick = function (eventObject) {
-            var doDefault = this._dispatchLightDismiss(exports.LightDismissalReasons.hardwareBackButton);
-            return !doDefault; // Returns whether or not the event was handled.
-        };
-        LightDismissService.prototype._onWindowResize = function (eventObject) {
-            this._dispatchLightDismiss(exports.LightDismissalReasons.windowResize);
-        };
-        LightDismissService.prototype._onWindowBlur = function (eventObject) {
-            if (this._debug) {
-                return;
-            }
-            // Want to trigger a light dismiss on window blur.
-            // We get blur if we click off the window, including into an iframe within our window.
-            // Both blurs call this function, but fortunately document.hasFocus is true if either
-            // the document window or our iframe window has focus.
-            if (!_Global.document.hasFocus()) {
-                // The document doesn't have focus, so they clicked off the app, so light dismiss.
-                this._dispatchLightDismiss(exports.LightDismissalReasons.windowBlur);
-            }
-            else {
-                // We were trying to unfocus the window, but document still has focus,
-                // so make sure the iframe that took the focus will check for blur next time.
-                var active = _Global.document.activeElement;
-                if (active && active.tagName === "IFRAME" && !active["msLightDismissBlur"]) {
-                    // - This will go away when the IFRAME goes away, and we only create one.
-                    // - This only works in IE because other browsers don't fire focus events on iframe elements.
-                    // - Can't use _ElementUtilities._addEventListener's focusout because it doesn't fire when an
-                    //   iframe loses focus due to changing windows.
-                    active.addEventListener("blur", this._onWindowBlur.bind(this), false);
-                    active["msLightDismissBlur"] = true;
-                }
-            }
-        };
-        LightDismissService.prototype._createClickEater = function () {
-            var clickEater = _Global.document.createElement("section");
-            clickEater.className = exports._ClassNames._clickEater;
-            _ElementUtilities._addEventListener(clickEater, "pointerdown", this._onClickEaterPointerDown.bind(this), true);
-            clickEater.addEventListener("click", this._onClickEaterClick.bind(this), true);
-            // Tell Aria that it's clickable
-            clickEater.setAttribute("role", "menuitem");
-            clickEater.setAttribute("aria-label", Strings.closeOverlay);
-            // Prevent CED from removing any current selection
-            clickEater.setAttribute("unselectable", "on");
-            return clickEater;
-        };
-        LightDismissService.prototype._onClickEaterPointerDown = function (eventObject) {
-            eventObject.stopPropagation();
-            eventObject.preventDefault();
-            this._clickEaterPointerId = eventObject.pointerId;
-            if (!this._registeredClickEaterCleanUp) {
-                _ElementUtilities._addEventListener(_Global.window, "pointerup", this._onClickEaterPointerUpBound);
-                _ElementUtilities._addEventListener(_Global.window, "pointercancel", this._onClickEaterPointerCancelBound);
-                this._registeredClickEaterCleanUp = true;
-            }
-        };
-        LightDismissService.prototype._onClickEaterPointerUp = function (eventObject) {
-            var _this = this;
-            eventObject.stopPropagation();
-            eventObject.preventDefault();
-            if (eventObject.pointerId === this._clickEaterPointerId) {
-                this._resetClickEaterPointerState();
-                var element = _Global.document.elementFromPoint(eventObject.clientX, eventObject.clientY);
-                if (element === this._clickEaterEl) {
-                    this._skipClickEaterClick = true;
-                    _BaseUtils._yieldForEvents(function () {
-                        _this._skipClickEaterClick = false;
-                    });
-                    this._clickEaterTapped();
-                }
-            }
-        };
-        LightDismissService.prototype._onClickEaterClick = function (eventObject) {
-            eventObject.stopPropagation();
-            eventObject.preventDefault();
-            if (!this._skipClickEaterClick) {
-                // Handle the UIA invoke action on the click eater. this._skipClickEaterClick is false which tells
-                // us that we received a click event without an associated PointerUp event. This means that the click
-                // event was triggered thru UIA rather than thru the GUI.
-                this._clickEaterTapped();
-            }
-        };
-        LightDismissService.prototype._onClickEaterPointerCancel = function (eventObject) {
-            if (eventObject.pointerId === this._clickEaterPointerId) {
-                this._resetClickEaterPointerState();
-            }
-        };
-        LightDismissService.prototype._resetClickEaterPointerState = function () {
-            if (this._registeredClickEaterCleanUp) {
-                _ElementUtilities._removeEventListener(_Global.window, "pointerup", this._onClickEaterPointerUpBound);
-                _ElementUtilities._removeEventListener(_Global.window, "pointercancel", this._onClickEaterPointerCancelBound);
-            }
-            this._clickEaterPointerId = null;
-            this._registeredClickEaterCleanUp = false;
-        };
-        return LightDismissService;
-    })();
-    var service = new LightDismissService();
-    exports.shown = service.shown.bind(service);
-    exports.hidden = service.hidden.bind(service);
-    exports.updated = service.updated.bind(service);
-    exports.isShown = service.isShown.bind(service);
-    exports.isTopmost = service.isTopmost.bind(service);
-    exports.keyDown = service.keyDown.bind(service);
-    exports.keyUp = service.keyUp.bind(service);
-    exports.keyPress = service.keyPress.bind(service);
-    exports._clickEaterTapped = service._clickEaterTapped.bind(service);
-    exports._onBackClick = service._onBackClick.bind(service);
-    exports._setDebug = service._setDebug.bind(service);
-    _Base.Namespace.define("WinJS.UI._LightDismissService", {
-        shown: exports.shown,
-        hidden: exports.hidden,
-        updated: exports.updated,
-        isShown: exports.isShown,
-        isTopmost: exports.isTopmost,
-        keyDown: exports.keyDown,
-        keyUp: exports.keyUp,
-        keyPress: exports.keyPress,
-        _clickEaterTapped: exports._clickEaterTapped,
-        _onBackClick: exports._onBackClick,
-        _setDebug: exports._setDebug,
-        LightDismissableElement: LightDismissableElement,
-        DismissalPolicies: exports.DismissalPolicies,
-        LightDismissalReasons: exports.LightDismissalReasons,
-        _ClassNames: exports._ClassNames,
-        _service: service
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/_LegacyAppBar/_Constants',[
-     'exports',
-     '../../Core/_Base',
-], function appBarConstantsInit(exports, _Base) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, null, {
-        // AppBar class names.
-        appBarClass: "win-navbar",
-        firstDivClass: "win-firstdiv",
-        finalDivClass: "win-finaldiv",
-        invokeButtonClass: "win-navbar-invokebutton",
-        ellipsisClass: "win-navbar-ellipsis",
-        primaryCommandsClass: "win-primarygroup",
-        secondaryCommandsClass: "win-secondarygroup",
-        commandLayoutClass: "win-commandlayout",
-        menuLayoutClass: "win-menulayout",
-        topClass: "win-top",
-        bottomClass: "win-bottom",
-        showingClass : "win-navbar-opening",
-        shownClass : "win-navbar-opened",
-        hidingClass : "win-navbar-closing",
-        hiddenClass: "win-navbar-closed",
-        compactClass: "win-navbar-compact",
-        minimalClass: "win-navbar-minimal",
-        menuContainerClass: "win-navbar-menu",
-
-        // Constants for AppBar placement
-        appBarPlacementTop: "top",
-        appBarPlacementBottom: "bottom",
-
-        // Constants for AppBar layouts
-        appBarLayoutCustom: "custom",
-        appBarLayoutCommands: "commands",
-        appBarLayoutMenu: "menu",
-
-        // Constant for AppBar invokebutton width
-        appBarInvokeButtonWidth: 32,
-
-        // Constants for Commands
-        typeSeparator: "separator",
-        typeContent: "content",
-        typeButton: "button",
-        typeToggle: "toggle",
-        typeFlyout: "flyout",
-        appBarCommandClass: "win-command",
-        appBarCommandGlobalClass: "win-global",
-        appBarCommandSelectionClass: "win-selection",
-        commandHiddenClass: "win-command-hidden",
-        sectionSelection: "selection", /* deprecated, use sectionSecondary */
-        sectionGlobal: "global", /* deprecated, use sectionPrimary */
-        sectionPrimary: "primary",
-        sectionSecondary: "secondary",
-
-        // Constants for Menus
-        menuCommandClass: "win-command",
-        menuCommandButtonClass: "win-command-button",
-        menuCommandToggleClass: "win-command-toggle",
-        menuCommandFlyoutClass: "win-command-flyout",
-        menuCommandFlyoutActivatedClass: "win-command-flyout-activated",
-        menuCommandSeparatorClass: "win-command-separator",
-        _menuCommandInvokedEvent: "_invoked", // Private event
-        menuClass: "win-menu",
-        menuContainsToggleCommandClass: "win-menu-containstogglecommand",
-        menuContainsFlyoutCommandClass: "win-menu-containsflyoutcommand",
-        menuMouseSpacingClass: "win-menu-mousespacing",
-        menuTouchSpacingClass: "win-menu-touchspacing",
-        menuCommandHoverDelay: 400,
-
-        // Other class names
-        overlayClass: "win-overlay",
-        flyoutClass: "win-flyout",
-        flyoutLightClass: "win-ui-light",
-        settingsFlyoutClass: "win-settingsflyout",
-        scrollsClass: "win-scrolls",
-        pinToRightEdge: -1,
-        pinToBottomEdge: -1,
-
-        // Constants for AppBarCommand full-size widths.
-        separatorWidth: 34,
-        buttonWidth: 68,
-
-        narrowClass: "win-narrow",
-        wideClass: "win-wide",
-        _visualViewportClass: "win-visualviewport-space",
-
-        // Event names
-        commandPropertyMutated: "_commandpropertymutated",
-        commandVisibilityChanged: "commandvisibilitychanged",
-    });
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <reference path="../../../../typings/require.d.ts" />
-define('WinJS/Utilities/_KeyboardInfo',["require", "exports", '../Core/_BaseCoreUtils', '../Core/_Global', '../Core/_WinRT'], function (require, exports, _BaseCoreUtils, _Global, _WinRT) {
-    "use strict";
-    var _Constants = {
-        visualViewportClass: "win-visualviewport-space",
-        scrollTimeout: 150,
-    };
-    // Definiton of *Visible Document*:
-    //   Some portions of this file refer to the *visible document* or *visibleDoc*. Generally speaking,
-    //   this is the portion of the app that is visible to the user (factoring in optical zoom and input pane occlusion).
-    //   Technically speaking, in most cases, this is equivalent to the *visual viewport*. The exception is
-    //   when the input pane has shown without resizing the *visual viewport*. In this case, the *visible document*
-    //   is the *visual viewport* height minus the input pane occlusion.
-    // This private module provides accurate metrics for the Visual Viewport and WWA's IHM offsets in Win10 WWA 
-    // where "-ms-device-fixed" CSS positioning is supported. WinJS controls will also use this module for
-    // positoning themselves relative to the viewport in a web browser outside of WWA. Their preference is still 
-    // to rely on "-ms-device-fixed" positioning, but currently fallback to "fixed" positioning in enviornments where
-    // "-ms-device-fixed" is not supported.
-    exports._KeyboardInfo;
-    // WWA Soft Keyboard offsets
-    exports._KeyboardInfo = {
-        // Determine if the keyboard is visible or not.
-        get _visible() {
-            try {
-                return (_WinRT.Windows.UI.ViewManagement.InputPane && _WinRT.Windows.UI.ViewManagement.InputPane.getForCurrentView().occludedRect.height > 0);
-            }
-            catch (e) {
-                return false;
-            }
-        },
-        // See if we have to reserve extra space for the IHM
-        get _extraOccluded() {
-            var occluded = 0;
-            // Controls using -ms-device-fixed positioning only need to reposition themselves to remain visible
-            // If the IHM has not resized the viewport.  
-            if (!exports._KeyboardInfo._isResized && _WinRT.Windows.UI.ViewManagement.InputPane) {
-                occluded = _WinRT.Windows.UI.ViewManagement.InputPane.getForCurrentView().occludedRect.height;
-            }
-            return occluded;
-        },
-        // See if the view has been resized to fit a keyboard
-        get _isResized() {
-            // Compare ratios.  Very different includes IHM space.
-            var heightRatio = _Global.document.documentElement.clientHeight / _Global.innerHeight, widthRatio = _Global.document.documentElement.clientWidth / _Global.innerWidth;
-            // If they're nearly identical, then the view hasn't been resized for the IHM
-            // Only check one bound because we know the IHM will make it shorter, not skinnier.
-            return (widthRatio / heightRatio < 0.99);
-        },
-        // Get the bottom of the visible area, relative to the top edge of the visible area.
-        get _visibleDocBottom() {
-            return exports._KeyboardInfo._visibleDocTop + exports._KeyboardInfo._visibleDocHeight;
-        },
-        // Get the height of the visible area, e.g. the height of the visual viewport minus any IHM occlusion.
-        get _visibleDocHeight() {
-            return exports._KeyboardInfo._visualViewportHeight - exports._KeyboardInfo._extraOccluded;
-        },
-        // Get the top offset of our visible area, aka the top of the visual viewport.
-        // This is always 0 when elements use -ms-device-fixed positioning.
-        get _visibleDocTop() {
-            return 0;
-        },
-        // Get the offset for, and relative to, the bottom edge of the visual viewport plus any IHM occlusion.
-        get _visibleDocBottomOffset() {
-            // For -ms-device-fixed positioned elements, the bottom is just 0 when there's no IHM.
-            // When the IHM appears, the text input that invoked it may be in a position on the page that is occluded by the IHM.
-            // In that instance, the default browser behavior is to resize the visual viewport and scroll the input back into view.
-            // However, if the viewport resize is prevented by an IHM event listener, the keyboard will still occlude
-            // -ms-device-fixed elements, so we adjust the bottom offset of the appbar by the height of the occluded rect of the IHM.
-            return exports._KeyboardInfo._extraOccluded;
-        },
-        // Get the visual viewport height. window.innerHeight doesn't return floating point values which are present with high DPI.
-        get _visualViewportHeight() {
-            var boundingRect = exports._KeyboardInfo._visualViewportSpace;
-            return boundingRect.height;
-        },
-        // Get the visual viewport width. window.innerWidth doesn't return floating point values which are present with high DPI.
-        get _visualViewportWidth() {
-            var boundingRect = exports._KeyboardInfo._visualViewportSpace;
-            return boundingRect.width;
-        },
-        // The visual viewport space element is hidden given -ms-device-fixed positioning and used to calculate
-        // the 4 edges of the visual viewport with floating point precision. 
-        get _visualViewportSpace() {
-            var visualViewportSpace = _Global.document.body.querySelector("." + _Constants.visualViewportClass);
-            if (!visualViewportSpace) {
-                visualViewportSpace = _Global.document.createElement("DIV");
-                visualViewportSpace.className = _Constants.visualViewportClass;
-                _Global.document.body.appendChild(visualViewportSpace);
-            }
-            return visualViewportSpace.getBoundingClientRect();
-        },
-        // Get total length of the IHM showPanel animation
-        get _animationShowLength() {
-            if (_BaseCoreUtils.hasWinRT) {
-                if (_WinRT.Windows.UI.Core.AnimationMetrics) {
-                    // Desktop exposes the AnimationMetrics API that allows us to look up the relevant IHM animation metrics.
-                    var a = _WinRT.Windows.UI.Core.AnimationMetrics, animationDescription = new a.AnimationDescription(a.AnimationEffect.showPanel, a.AnimationEffectTarget.primary);
-                    var animations = animationDescription.animations;
-                    var max = 0;
-                    for (var i = 0; i < animations.size; i++) {
-                        var animation = animations[i];
-                        max = Math.max(max, animation.delay + animation.duration);
-                    }
-                    return max;
-                }
-                else {
-                    // Phone platform does not yet expose the Animation Metrics API. 
-                    // Hard code the correct values for the time being.
-                    // https://github.com/winjs/winjs/issues/1060
-                    var animationDuration = 300;
-                    var animationDelay = 50;
-                    return animationDelay + animationDuration;
-                }
-            }
-            else {
-                return 0;
-            }
-        },
-        // Padding for IHM timer to allow for first scroll event. Tpyically used in conjunction with the
-        // _animationShowLength to determine the length of time in which a showing IHM would have triggered
-        // a window resize to occur.
-        get _scrollTimeout() {
-            return _Constants.scrollTimeout;
-        },
-        // _layoutViewportCoords gives the top and bottom offset of the visible document for elements using
-        // position:fixed. Comparison with position:-ms-device-fixed helper:
-        //   - Like -ms-device-fixed helper, takes into account input pane occlusion.
-        //   - Unlike -ms-device-fixed helper, doesn't account for optical zoom.
-        get _layoutViewportCoords() {
-            var topOffset = _Global.window.pageYOffset - _Global.document.documentElement.scrollTop;
-            var bottomOffset = _Global.document.documentElement.clientHeight - (topOffset + this._visibleDocHeight);
-            return {
-                visibleDocTop: topOffset,
-                visibleDocBottom: bottomOffset
-            };
-        }
-    };
-});
-
-
-define('require-style!less/styles-overlay',[],function(){});
-
-define('require-style!less/colors-overlay',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <dictionary>animatable,appbar,appbars,divs,Flyout,Flyouts,iframe,Statics,unfocus,unselectable</dictionary>
-define('WinJS/Controls/Flyout/_Overlay',[
-    'exports',
-    '../../Core/_Global',
-    '../../Core/_WinRT',
-    '../../Core/_Base',
-    '../../Core/_BaseUtils',
-    '../../Core/_ErrorFromName',
-    '../../Core/_Events',
-    '../../Core/_Resources',
-    '../../Core/_WriteProfilerMark',
-    '../../_Accents',
-    '../../Animations',
-    '../../Application',
-    '../../ControlProcessor',
-    '../../Promise',
-    '../../Scheduler',
-    '../../Utilities/_Control',
-    '../../Utilities/_ElementUtilities',
-    '../../Utilities/_KeyboardInfo',
-    '../_LegacyAppBar/_Constants',
-    'require-style!less/styles-overlay',
-    'require-style!less/colors-overlay'
-], function overlayInit(exports, _Global, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _WriteProfilerMark, _Accents, Animations, Application, ControlProcessor, Promise, Scheduler, _Control, _ElementUtilities, _KeyboardInfo, _Constants) {
-    "use strict";
-
-    _Accents.createAccentRule(
-        "button[aria-checked=true].win-command:before,\
-         .win-menu-containsflyoutcommand button.win-command-flyout-activated:before", [
-        { name: "background-color", value: _Accents.ColorTypes.accent },
-        { name: "border-color", value: _Accents.ColorTypes.accent },
-         ]);
-
-    _Accents.createAccentRule(".win-flyout, .win-settingsflyout", [{ name: "border-color", value: _Accents.ColorTypes.accent }]);
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _Overlay: _Base.Namespace._lazy(function () {
-
-            // Helper for Global Event listeners. Invokes the specified callback member function on each _Overlay in the DOM.
-            function _allOverlaysCallback(event, nameOfFunctionCall, stopImmediatePropagationWhenHandled) {
-                var elements = _Global.document.querySelectorAll("." + _Constants.overlayClass);
-                if (elements) {
-                    var len = elements.length;
-                    for (var i = 0; i < len; i++) {
-                        var element = elements[i];
-                        var overlay = element.winControl;
-                        if (!overlay._disposed) {
-                            if (overlay) {
-                                var handled = overlay[nameOfFunctionCall](event);
-                                if (stopImmediatePropagationWhenHandled && handled) {
-                                    // The caller has indicated we should exit as soon as the event is handled.
-                                    return handled;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-
-            // _Overlay Global Events Listener Class. We hang a singleton instance of this class off of a static _Overlay property.
-            var _GlobalListener = _Base.Class.define(function _GlobalListener_ctor() {
-                this._currentState = _GlobalListener.states.off;
-
-                this._inputPaneShowing = this._inputPaneShowing.bind(this);
-                this._inputPaneHiding = this._inputPaneHiding.bind(this);
-                this._documentScroll = this._documentScroll.bind(this);
-                this._windowResized = this._windowResized.bind(this);
-            }, {
-                initialize: function _GlobalListener_initialize() {
-                    this._toggleListeners(_GlobalListener.states.on);
-                },
-                // Expose this for unit tests.
-                reset: function _GlobalListener_reset() {
-                    this._toggleListeners(_GlobalListener.states.off);
-                    this._toggleListeners(_GlobalListener.states.on);
-                },
-                _inputPaneShowing: function _GlobalListener_inputePaneShowing(event) {
-                    _WriteProfilerMark(_GlobalListener.profilerString + "_showingKeyboard,StartTM");
-                    _allOverlaysCallback(event, "_showingKeyboard");
-                    _WriteProfilerMark(_GlobalListener.profilerString + "_showingKeyboard,StopTM");
-                },
-                _inputPaneHiding: function _GlobalListener_inputPaneHiding(event) {
-                    _WriteProfilerMark(_GlobalListener.profilerString + "_hidingKeyboard,StartTM");
-                    _allOverlaysCallback(event, "_hidingKeyboard");
-                    _WriteProfilerMark(_GlobalListener.profilerString + "_hidingKeyboard,StopTM");
-                },
-                _documentScroll: function _GlobalListener_documentScroll(event) {
-                    _WriteProfilerMark(_GlobalListener.profilerString + "_checkScrollPosition,StartTM");
-                    _allOverlaysCallback(event, "_checkScrollPosition");
-                    _WriteProfilerMark(_GlobalListener.profilerString + "_checkScrollPosition,StopTM");
-                },
-                _windowResized: function _GlobalListener_windowResized(event) {
-                    _WriteProfilerMark(_GlobalListener.profilerString + "_baseResize,StartTM");
-                    _allOverlaysCallback(event, "_baseResize");
-                    _WriteProfilerMark(_GlobalListener.profilerString + "_baseResize,StopTM");
-                },
-                _toggleListeners: function _GlobalListener_toggleListeners(newState) {
-                    // Add/Remove global event listeners for all _Overlays
-                    var listenerOperation;
-                    if (this._currentState !== newState) {
-                        if (newState === _GlobalListener.states.on) {
-                            listenerOperation = "addEventListener";
-                        } else if (newState === _GlobalListener.states.off) {
-                            listenerOperation = "removeEventListener";
-                        }
-
-                        if (_WinRT.Windows.UI.ViewManagement.InputPane) {
-                            // React to Soft Keyboard events
-                            var inputPane = _WinRT.Windows.UI.ViewManagement.InputPane.getForCurrentView();
-                            inputPane[listenerOperation]("showing", this._inputPaneShowing, false);
-                            inputPane[listenerOperation]("hiding", this._inputPaneHiding, false);
-
-                            _Global.document[listenerOperation]("scroll", this._documentScroll, false);
-                        }
-
-                        // Window resize event
-                        _Global.addEventListener("resize", this._windowResized, false);
-
-                        this._currentState = newState;
-                    }
-                },
-            }, {
-                // Statics
-                profilerString: {
-                    get: function () {
-                        return "WinJS.UI._Overlay Global Listener:";
-                    }
-                },
-                states: {
-                    get: function () {
-                        return {
-                            off: 0,
-                            on: 1,
-                        };
-                    },
-                },
-            });
-
-            // Helper to get DOM elements from input single object or array or IDs/toolkit/dom elements
-            function _resolveElements(elements) {
-                // No input is just an empty array
-                if (!elements) {
-                    return [];
-                }
-
-                // Make sure it's in array form.
-                if (typeof elements === "string" || !elements || !elements.length) {
-                    elements = [elements];
-                }
-
-                // Make sure we have a DOM element for each one, (could be string id name or toolkit object)
-                var i,
-                    realElements = [];
-                for (i = 0; i < elements.length; i++) {
-                    if (elements[i]) {
-                        if (typeof elements[i] === "string") {
-                            var element = _Global.document.getElementById(elements[i]);
-                            if (element) {
-                                realElements.push(element);
-                            }
-                        } else if (elements[i].element) {
-                            realElements.push(elements[i].element);
-                        } else {
-                            realElements.push(elements[i]);
-                        }
-                    }
-                }
-
-                return realElements;
-            }
-
-            var strings = {
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; },
-                get mustContainCommands() { return "Invalid HTML: AppBars/Menus must contain only AppBarCommands/MenuCommands"; },
-                get closeOverlay() { return _Resources._getWinJSString("ui/closeOverlay").value; },
-            };
-
-            var _Overlay = _Base.Class.define(function _Overlay_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI._Overlay">
-                /// <summary locid="WinJS.UI._Overlay">
-                /// Constructs the Overlay control and associates it with the underlying DOM element.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.UI._Overlay_p:element">
-                /// The DOM element to be associated with the Overlay control.
-                /// </param>
-                /// <param name="options" type="Object" domElement="false" locid="WinJS.UI._Overlay_p:options">
-                /// The set of options to be applied initially to the Overlay control.
-                /// </param>
-                /// <returns type="WinJS.UI._Overlay" locid="WinJS.UI._Overlay_returnValue">A fully constructed Overlay control.</returns>
-                /// </signature>
-                this._baseOverlayConstructor(element, options);
-            }, {
-                // Functions/properties
-                _baseOverlayConstructor: function _Overlay_baseOverlayConstructor(element, options) {
-
-                    this._disposed = false;
-
-                    // Make sure there's an input element
-                    if (!element) {
-                        element = _Global.document.createElement("div");
-                    }
-
-                    // Check to make sure we weren't duplicated
-                    var overlay = element.winControl;
-                    if (overlay) {
-                        throw new _ErrorFromName("WinJS.UI._Overlay.DuplicateConstruction", strings.duplicateConstruction);
-                    }
-
-                    if (!this._element) {
-                        this._element = element;
-                    }
-
-                    if (!this._element.hasAttribute("tabIndex")) {
-                        this._element.tabIndex = -1;
-                    }
-
-                    this._sticky = false;
-                    this._doNext = "";
-
-                    this._element.style.visibility = "hidden";
-                    this._element.style.opacity = 0;
-
-                    // Remember ourselves
-                    element.winControl = this;
-
-                    // Attach our css class
-                    _ElementUtilities.addClass(this._element, _Constants.overlayClass);
-                    _ElementUtilities.addClass(this._element, "win-disposable");
-
-                    // We don't want to be selectable, set UNSELECTABLE
-                    var unselectable = this._element.getAttribute("unselectable");
-                    if (unselectable === null || unselectable === undefined) {
-                        this._element.setAttribute("unselectable", "on");
-                    }
-
-                    // Base animation is popIn/popOut
-                    this._currentAnimateIn = this._baseAnimateIn;
-                    this._currentAnimateOut = this._baseAnimateOut;
-                    this._animationPromise = Promise.as();
-
-                    // Command Animations to Queue
-                    this._queuedToShow = [];
-                    this._queuedToHide = [];
-                    this._queuedCommandAnimation = false;
-
-                    if (options) {
-                        _Control.setOptions(this, options);
-                    }
-
-                    // Make sure _Overlay event handlers are hooked up (this aids light dismiss)
-                    _Overlay._globalEventListeners.initialize();
-                },
-
-                /// <field type="HTMLElement" domElement="true" readonly="true" hidden="true" locid="WinJS.UI._Overlay.element" helpKeyword="WinJS.UI._Overlay.element">The DOM element the Overlay is attached to</field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-
-                dispose: function () {
-                    /// <signature helpKeyword="WinJS.UI.Overlay.dispose">
-                    /// <summary locid="WinJS.UI.Overlay.dispose">
-                    /// Disposes this Overlay.
-                    /// </summary>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    this._disposed = true;
-                    this._dispose();
-                },
-
-                _dispose: function _Overlay_dispose() {
-                    // To be overridden by subclasses
-                },
-
-                _show: function _Overlay_show() {
-                    // We call our base _baseShow because AppBar may need to override show
-                    this._baseShow();
-                },
-
-                _hide: function _Overlay_hide() {
-                    // We call our base _baseHide because AppBar may need to override hide
-                    this._baseHide();
-                },
-
-                // Is the overlay "hidden"?
-                /// <field type="Boolean" hidden="true" locid="WinJS.UI._Overlay.hidden" helpKeyword="WinJS.UI._Overlay.hidden">Gets or sets Overlay's visibility.</field>
-                hidden: {
-                    get: function () {
-                        return (this._element.style.visibility === "hidden" ||
-                                this._element.winAnimating === "hiding" ||
-                                this._doNext === "hide");
-                    },
-                    set: function (hidden) {
-                        var currentlyHidden = this.hidden;
-                        if (!hidden && currentlyHidden) {
-                            this.show();
-                        } else if (hidden && !currentlyHidden) {
-                            this.hide();
-                        }
-                    }
-                },
-
-                addEventListener: function (type, listener, useCapture) {
-                    /// <signature helpKeyword="WinJS.UI._Overlay.addEventListener">
-                    /// <summary locid="WinJS.UI._Overlay.addEventListener">
-                    /// Add an event listener to the DOM element for this Overlay
-                    /// </summary>
-                    /// <param name="type" type="String" locid="WinJS.UI._Overlay.addEventListener_p:type">Required. Event type to add, "beforehide", "afterhide", "beforeshow", or "aftershow"</param>
-                    /// <param name="listener" type="Function" locid="WinJS.UI._Overlay.addEventListener_p:listener">Required. The event handler function to associate with this event.</param>
-                    /// <param name="useCapture" type="Boolean" locid="WinJS.UI._Overlay.addEventListener_p:useCapture">Optional. True, register for the event capturing phase.  False for the event bubbling phase.</param>
-                    /// </signature>
-                    return this._element.addEventListener(type, listener, useCapture);
-                },
-
-                removeEventListener: function (type, listener, useCapture) {
-                    /// <signature helpKeyword="WinJS.UI._Overlay.removeEventListener">
-                    /// <summary locid="WinJS.UI._Overlay.removeEventListener">
-                    /// Remove an event listener to the DOM element for this Overlay
-                    /// </summary>
-                    /// <param name="type" type="String" locid="WinJS.UI._Overlay.removeEventListener_p:type">Required. Event type to remove, "beforehide", "afterhide", "beforeshow", or "aftershow"</param>
-                    /// <param name="listener" type="Function" locid="WinJS.UI._Overlay.removeEventListener_p:listener">Required. The event handler function to associate with this event.</param>
-                    /// <param name="useCapture" type="Boolean" locid="WinJS.UI._Overlay.removeEventListener_p:useCapture">Optional. True, register for the event capturing phase.  False for the event bubbling phase.</param>
-                    /// </signature>
-                    return this._element.removeEventListener(type, listener, useCapture);
-                },
-
-                _baseShow: function _Overlay_baseShow() {
-                    // If we are already animating, just remember this for later
-                    if (this._animating || this._needToHandleHidingKeyboard) {
-                        this._doNext = "show";
-                        return false;
-                    }
-
-                    if (this._element.style.visibility !== "visible") {
-                        // Let us know we're showing.
-                        this._element.winAnimating = "showing";
-
-                        // Hiding, but not none
-                        this._element.style.display = "";
-                        this._element.style.visibility = "hidden";
-
-                        // In case their event is going to manipulate commands, see if there are
-                        // any queued command animations we can handle while we're still hidden.
-                        if (this._queuedCommandAnimation) {
-                            this._showAndHideFast(this._queuedToShow, this._queuedToHide);
-                            this._queuedToShow = [];
-                            this._queuedToHide = [];
-                        }
-
-                        // Do our derived classes show stuff 
-                        this._beforeShow();
-
-                        // Send our "beforeShow" event
-                        this._sendEvent(_Overlay.beforeShow);
-
-                        // Need to measure
-                        this._ensurePosition();
-
-                        // Make sure it's visible, and fully opaque.
-                        // Do the popup thing, sending event afterward.
-                        var that = this;
-                        this._animationPromise = this._currentAnimateIn().
-                        then(function () {
-                            that._baseEndShow();
-                        }, function () {
-                            that._baseEndShow();
-                        });
-                        return true;
-                    }
-                    return false;
-                },
-
-                _beforeShow: function _Overlay_beforeShow() {
-                    // Nothing by default
-                },
-
-                // Flyout in particular will need to measure our positioning.
-                _ensurePosition: function _Overlay_ensurePosition() {
-                    // Nothing by default
-                },
-
-                _baseEndShow: function _Overlay_baseEndShow() {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    // Make sure it's visible after showing
-                    this._element.setAttribute("aria-hidden", "false");
-
-                    this._element.winAnimating = "";
-
-                    // We're shown now
-                    if (this._doNext === "show") {
-                        this._doNext = "";
-                    }
-
-                    // After showing, send the after showing event
-                    this._sendEvent(_Overlay.afterShow);
-                    this._writeProfilerMark("show,StopTM"); // Overlay writes the stop profiler mark for all of its derived classes.
-
-                    // If we had something queued, do that
-                    Scheduler.schedule(this._checkDoNext, Scheduler.Priority.normal, this, "WinJS.UI._Overlay._checkDoNext");
-                },
-
-                _baseHide: function _Overlay_baseHide() {
-                    // If we are already animating, just remember this for later
-                    if (this._animating) {
-                        this._doNext = "hide";
-                        return false;
-                    }
-
-                    // In the unlikely event we're between the hiding keyboard and the resize events, just snap it away:
-                    if (this._needToHandleHidingKeyboard) {
-                        // use the "uninitialized" flag
-                        this._element.style.visibility = "";
-                    }
-
-                    if (this._element.style.visibility !== "hidden") {
-                        // Let us know we're hiding, accessibility as well.
-                        this._element.winAnimating = "hiding";
-                        this._element.setAttribute("aria-hidden", "true");
-
-                        // Send our "beforeHide" event
-                        this._sendEvent(_Overlay.beforeHide);
-
-                        // If our visibility is empty, then this is the first time, just hide it
-                        if (this._element.style.visibility === "") {
-                            // Initial hiding, just hide it
-                            this._element.style.opacity = 0;
-                            this._baseEndHide();
-                        } else {
-                            // Make sure it's hidden, and fully transparent.
-                            var that = this;
-                            this._animationPromise = this._currentAnimateOut().
-                            then(function () {
-                                that._baseEndHide();
-                            }, function () {
-                                that._baseEndHide();
-                            });
-                        }
-                        return true;
-                    }
-
-                    return false;
-                },
-
-                _baseEndHide: function _Overlay_baseEndHide() {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    // Do our derived classes hide stuff
-                    this._beforeEndHide();
-
-                    // Make sure animation is finished.
-                    this._element.style.visibility = "hidden";
-                    this._element.style.display = "none";
-                    this._element.winAnimating = "";
-
-                    // In case their event is going to manipulate commands, see if there
-                    // are any queued command animations we can handle now we're hidden.
-                    if (this._queuedCommandAnimation) {
-                        this._showAndHideFast(this._queuedToShow, this._queuedToHide);
-                        this._queuedToShow = [];
-                        this._queuedToHide = [];
-                    }
-
-                    // We're hidden now
-                    if (this._doNext === "hide") {
-                        this._doNext = "";
-                    }
-
-                    // Do our derived classes hide stuff
-                    this._afterHide();
-
-                    // After hiding, send our "afterHide" event
-                    this._sendEvent(_Overlay.afterHide);
-                    this._writeProfilerMark("hide,StopTM"); // Overlay writes the stop profiler mark for all of its derived classes.
-
-
-                    // If we had something queued, do that.  This has to be after
-                    // the afterHide event in case it triggers a show() and they
-                    // have something to do in beforeShow that requires afterHide first.
-                    Scheduler.schedule(this._checkDoNext, Scheduler.Priority.normal, this, "WinJS.UI._Overlay._checkDoNext");
-                },
-
-                // Called after the animation but while the Overlay is still visible. It's
-                // important that this runs while the Overlay is visible because hiding
-                // a DOM element (e.g. visibility="hidden", display="none") while it contains
-                // focus has the side effect of moving focus to the body or null and triggering
-                // focus move events. _beforeEndHide is a good hook for the Overlay to move focus
-                // elsewhere before its DOM element gets hidden.
-                _beforeEndHide: function _Overlay_beforeEndHide() {
-                    // Nothing by default
-                },
-
-                _afterHide: function _Overlay_afterHide() {
-                    // Nothing by default
-                },
-
-                _checkDoNext: function _Overlay_checkDoNext() {
-                    // Do nothing if we're still animating
-                    if (this._animating || this._needToHandleHidingKeyboard || this._disposed) {
-                        return;
-                    }
-
-                    if (this._doNext === "hide") {
-                        // Do hide first because animating commands would be easier
-                        this._hide();
-                        this._doNext = "";
-                    } else if (this._queuedCommandAnimation) {
-                        // Do queued commands before showing if possible
-                        this._showAndHideQueue();
-                    } else if (this._doNext === "show") {
-                        // Show last so that we don't unnecessarily animate commands
-                        this._show();
-                        this._doNext = "";
-                    }
-                },
-
-                // Default animations
-                _baseAnimateIn: function _Overlay_baseAnimateIn() {
-                    this._element.style.opacity = 0;
-                    this._element.style.visibility = "visible";
-                    // touch opacity so that IE fades from the 0 we just set to 1
-                    _ElementUtilities._getComputedStyle(this._element, null).opacity;
-                    return Animations.fadeIn(this._element);
-                },
-
-                _baseAnimateOut: function _Overlay_baseAnimateOut() {
-                    this._element.style.opacity = 1;
-                    // touch opacity so that IE fades from the 1 we just set to 0
-                    _ElementUtilities._getComputedStyle(this._element, null).opacity;
-                    return Animations.fadeOut(this._element);
-                },
-
-                _animating: {
-                    get: function _Overlay_animating_get() {
-                        // Ensure it's a boolean because we're using the DOM element to keep in-sync
-                        return !!this._element.winAnimating;
-                    }
-                },
-
-                // Send one of our events
-                _sendEvent: function _Overlay_sendEvent(eventName, detail) {
-                    if (this._disposed) {
-                        return;
-                    }
-                    var event = _Global.document.createEvent("CustomEvent");
-                    event.initEvent(eventName, true, true, (detail || {}));
-                    this._element.dispatchEvent(event);
-                },
-
-                // Show commands
-                _showCommands: function _Overlay_showCommands(commands, immediate) {
-                    var showHide = this._resolveCommands(commands);
-                    this._showAndHideCommands(showHide.commands, [], immediate);
-                },
-
-                // Hide commands
-                _hideCommands: function _Overlay_hideCommands(commands, immediate) {
-                    var showHide = this._resolveCommands(commands);
-                    this._showAndHideCommands([], showHide.commands, immediate);
-                },
-
-                // Hide commands
-                _showOnlyCommands: function _Overlay_showOnlyCommands(commands, immediate) {
-                    var showHide = this._resolveCommands(commands);
-                    this._showAndHideCommands(showHide.commands, showHide.others, immediate);
-                },
-
-                _showAndHideCommands: function _Overlay_showAndHideCommands(showCommands, hideCommands, immediate) {
-                    // Immediate is "easy"
-                    if (immediate || (this.hidden && !this._animating)) {
-                        // Immediate mode (not animated)
-                        this._showAndHideFast(showCommands, hideCommands);
-                        // Need to remove them from queues, but others could be queued
-                        this._removeFromQueue(showCommands, this._queuedToShow);
-                        this._removeFromQueue(hideCommands, this._queuedToHide);
-                    } else {
-
-                        // Queue Commands
-                        this._updateAnimateQueue(showCommands, this._queuedToShow, this._queuedToHide);
-                        this._updateAnimateQueue(hideCommands, this._queuedToHide, this._queuedToShow);
-                    }
-                },
-
-                _removeFromQueue: function _Overlay_removeFromQueue(commands, queue) {
-                    // remove commands from queue.
-                    var count;
-                    for (count = 0; count < commands.length; count++) {
-                        // Remove if it was in queue
-                        var countQ;
-                        for (countQ = 0; countQ < queue.length; countQ++) {
-                            if (queue[countQ] === commands[count]) {
-                                queue.splice(countQ, 1);
-                                break;
-                            }
-                        }
-                    }
-                },
-
-                _updateAnimateQueue: function _Overlay_updateAnimateQueue(addCommands, toQueue, fromQueue) {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    // Add addCommands to toQueue and remove addCommands from fromQueue.
-                    var count;
-                    for (count = 0; count < addCommands.length; count++) {
-                        // See if it's already in toQueue
-                        var countQ;
-                        for (countQ = 0; countQ < toQueue.length; countQ++) {
-                            if (toQueue[countQ] === addCommands[count]) {
-                                break;
-                            }
-                        }
-                        if (countQ === toQueue.length) {
-                            // Not found, add it
-                            toQueue[countQ] = addCommands[count];
-                        }
-                        // Remove if it was in fromQueue
-                        for (countQ = 0; countQ < fromQueue.length; countQ++) {
-                            if (fromQueue[countQ] === addCommands[count]) {
-                                fromQueue.splice(countQ, 1);
-                                break;
-                            }
-                        }
-                    }
-                    // If we haven't queued the actual animation
-                    if (!this._queuedCommandAnimation) {
-                        // If not already animating, we'll need to call _checkDoNext
-                        if (!this._animating) {
-                            Scheduler.schedule(this._checkDoNext, Scheduler.Priority.normal, this, "WinJS.UI._Overlay._checkDoNext");
-                        }
-                        this._queuedCommandAnimation = true;
-                    }
-                },
-
-                // show/hide commands without doing any animation.
-                _showAndHideFast: function _Overlay_showAndHideFast(showCommands, hideCommands) {
-                    var count;
-                    var command;
-                    for (count = 0; count < showCommands.length; count++) {
-                        command = showCommands[count];
-                        if (command && command.style) {
-                            command.style.visibility = "";
-                            command.style.display = "";
-                        }
-                    }
-                    for (count = 0; count < hideCommands.length; count++) {
-                        command = hideCommands[count];
-                        if (command && command.style) {
-                            command.style.visibility = "hidden";
-                            command.style.display = "none";
-                        }
-                    }
-
-                    this._commandsUpdated();
-
-                },
-
-                // show and hide the queued commands, perhaps animating if overlay isn't hidden.
-                _showAndHideQueue: function _Overlay_showAndHideQueue() {
-                    // Only called if not currently animating.
-                    // We'll be done with the queued stuff when we return.
-                    this._queuedCommandAnimation = false;
-
-                    // Shortcut if hidden
-                    if (this.hidden) {
-                        this._showAndHideFast(this._queuedToShow, this._queuedToHide);
-                        // Might be something else to do
-                        Scheduler.schedule(this._checkDoNext, Scheduler.Priority.normal, this, "WinJS.UI._Overlay._checkDoNext");
-                    } else {
-                        // Animation has 3 parts:  "hiding", "showing", and "moving"
-                        // PVL has "addToList" and "deleteFromList", both of which allow moving parts.
-                        // So we'll set up "add" for showing, and use "delete" for "hiding" + moving,
-                        // then trigger both at the same time.
-                        var showCommands = this._queuedToShow;
-                        var hideCommands = this._queuedToHide;
-                        var siblings = this._findSiblings(showCommands.concat(hideCommands));
-
-                        // Filter out the commands queued for animation that don't need to be animated.
-                        var count;
-                        for (count = 0; count < showCommands.length; count++) {
-                            // If this one's not real or not attached, skip it
-                            if (!showCommands[count] ||
-                                !showCommands[count].style ||
-                                !_Global.document.body.contains(showCommands[count])) {
-                                // Not real, skip it
-                                showCommands.splice(count, 1);
-                                count--;
-                            } else if (showCommands[count].style.visibility !== "hidden" && showCommands[count].style.opacity !== "0") {
-                                // Don't need to animate showing this one, already visible, so now it's a sibling
-                                siblings.push(showCommands[count]);
-                                showCommands.splice(count, 1);
-                                count--;
-                            }
-                        }
-                        for (count = 0; count < hideCommands.length; count++) {
-                            // If this one's not real or not attached, skip it
-                            if (!hideCommands[count] ||
-                                !hideCommands[count].style ||
-                                !_Global.document.body.contains(hideCommands[count]) ||
-                                hideCommands[count].style.visibility === "hidden" ||
-                                hideCommands[count].style.opacity === "0") {
-                                // Don't need to animate hiding this one, not real, or it's hidden,
-                                // so don't even need it as a sibling.
-                                hideCommands.splice(count, 1);
-                                count--;
-                            }
-                        }
-
-                        // Start command animations.
-                        var commandsAnimationPromise = this._baseBeginAnimateCommands(showCommands, hideCommands, siblings);
-
-                        // Hook end animations
-                        var that = this;
-                        if (commandsAnimationPromise) {
-                            // Needed to animate
-                            commandsAnimationPromise.done(
-                                function () { that._baseEndAnimateCommands(hideCommands); },
-                                function () { that._baseEndAnimateCommands(hideCommands); }
-                                );
-                        } else {
-                            // Already positioned correctly
-                            Scheduler.schedule(function Overlay_async_baseEndAnimationCommands() { that._baseEndAnimateCommands([]); },
-                                Scheduler.Priority.normal, null,
-                                "WinJS.UI._Overlay._endAnimateCommandsWithoutAnimation");
-                        }
-                    }
-
-                    // Done, clear queues
-                    this._queuedToShow = [];
-                    this._queuedToHide = [];
-                },
-
-                _baseBeginAnimateCommands: function _Overlay_baseBeginAnimateCommands(showCommands, hideCommands, siblings) {
-                    // The parameters are 3 mutually exclusive arrays of win-command elements contained in this Overlay.
-                    // 1) showCommands[]: All of the HIDDEN win-command elements that ARE scheduled to show.
-                    // 2) hideCommands[]: All of the VISIBLE win-command elements that ARE shceduled to hide.
-                    // 3) siblings[]: i. All VISIBLE win-command elements that ARE NOT scheduled to hide.
-                    //               ii. All HIDDEN win-command elements that ARE NOT scheduled to hide OR show.
-                    this._beginAnimateCommands(showCommands, hideCommands, this._getVisibleCommands(siblings));
-
-                    var showAnimated = null,
-                        hideAnimated = null;
-
-                    // Hide commands first, with siblings if necessary,
-                    // so that the showing commands don't disrupt the hiding commands position.
-                    if (hideCommands.length > 0) {
-                        hideAnimated = Animations.createDeleteFromListAnimation(hideCommands, showCommands.length === 0 ? siblings : undefined);
-                    }
-                    if (showCommands.length > 0) {
-                        showAnimated = Animations.createAddToListAnimation(showCommands, siblings);
-                    }
-
-                    // Update hiding commands
-                    for (var count = 0, len = hideCommands.length; count < len; count++) {
-                        // Need to fix our position
-                        var rectangle = hideCommands[count].getBoundingClientRect(),
-                            style = _ElementUtilities._getComputedStyle(hideCommands[count]);
-
-                        // Use the bounding box, adjusting for margins
-                        hideCommands[count].style.top = (rectangle.top - parseFloat(style.marginTop)) + "px";
-                        hideCommands[count].style.left = (rectangle.left - parseFloat(style.marginLeft)) + "px";
-                        hideCommands[count].style.opacity = 0;
-                        hideCommands[count].style.position = "fixed";
-                    }
-
-                    // Mark as animating
-                    this._element.winAnimating = "rearranging";
-
-                    // Start hiding animations
-                    // Hide needs extra cleanup when done
-                    var promise = null;
-                    if (hideAnimated) {
-                        promise = hideAnimated.execute();
-                    }
-
-                    // Update showing commands,
-                    // After hiding commands so that the hiding ones fade in the right place.
-                    for (count = 0; count < showCommands.length; count++) {
-                        showCommands[count].style.visibility = "";
-                        showCommands[count].style.display = "";
-                        showCommands[count].style.opacity = 1;
-                    }
-
-                    // Start showing animations
-                    if (showAnimated) {
-                        var newPromise = showAnimated.execute();
-                        if (promise) {
-                            promise = Promise.join([promise, newPromise]);
-                        } else {
-                            promise = newPromise;
-                        }
-                    }
-
-                    return promise;
-                },
-
-                _beginAnimateCommands: function _Overlay_beginAnimateCommands() {
-                    // Nothing by default
-                },
-
-                _getVisibleCommands: function _Overlay_getVisibleCommands(commandSubSet) {
-                    var command,
-                        commands = commandSubSet,
-                        visibleCommands = [];
-
-                    if (!commands) {
-                        // Crawl the inner HTML for the commands.
-                        commands = this.element.querySelectorAll(".win-command");
-                    }
-
-                    for (var i = 0, len = commands.length; i < len; i++) {
-                        command = commands[i].winControl || commands[i];
-                        if (!command.hidden) {
-                            visibleCommands.push(command);
-                        }
-                    }
-
-                    return visibleCommands;
-                },
-
-                // Once animation is complete, ensure that the commands are display:none
-                // and check if there's another animation to start.
-                _baseEndAnimateCommands: function _Overlay_baseEndAnimateCommands(hideCommands) {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    // Update us
-                    var count;
-                    for (count = 0; count < hideCommands.length; count++) {
-                        // Force us back into our appbar so that we can show again correctly
-                        hideCommands[count].style.position = "";
-                        hideCommands[count].style.top = "";
-                        hideCommands[count].style.left = "";
-                        hideCommands[count].getBoundingClientRect();
-                        // Now make us really hidden
-                        hideCommands[count].style.visibility = "hidden";
-                        hideCommands[count].style.display = "none";
-                        hideCommands[count].style.opacity = 1;
-                    }
-                    // Done animating
-                    this._element.winAnimating = "";
-
-                    this._endAnimateCommands();
-
-                    // Might be something else to do
-                    this._checkDoNext();
-                },
-
-                _endAnimateCommands: function _Overlay_endAnimateCommands() {
-                    // Nothing by default
-                },
-
-                // Resolves our commands
-                _resolveCommands: function _Overlay_resolveCommands(commands) {
-                    // First make sure they're all DOM elements.
-                    commands = _resolveElements(commands);
-
-                    // Now make sure they're all in this container
-                    var result = {};
-                    result.commands = [];
-                    result.others = [];
-                    var allCommands = this.element.querySelectorAll(".win-command");
-                    var countAll, countIn;
-                    for (countAll = 0; countAll < allCommands.length; countAll++) {
-                        var found = false;
-                        for (countIn = 0; countIn < commands.length; countIn++) {
-                            if (commands[countIn] === allCommands[countAll]) {
-                                result.commands.push(allCommands[countAll]);
-                                commands.splice(countIn, 1);
-                                found = true;
-                                break;
-                            }
-                        }
-                        if (!found) {
-                            result.others.push(allCommands[countAll]);
-                        }
-                    }
-                    return result;
-                },
-
-                // Find siblings, all DOM elements now.
-                // Returns all .win-commands in this Overlay that are NOT in the passed in 'commands' array.
-                _findSiblings: function _Overlay_findSiblings(commands) {
-                    // Now make sure they're all in this container
-                    var siblings = [];
-                    var allCommands = this.element.querySelectorAll(".win-command");
-                    var countAll, countIn;
-                    for (countAll = 0; countAll < allCommands.length; countAll++) {
-                        var found = false;
-                        for (countIn = 0; countIn < commands.length; countIn++) {
-                            if (commands[countIn] === allCommands[countAll]) {
-                                commands.splice(countIn, 1);
-                                found = true;
-                                break;
-                            }
-                        }
-                        if (!found) {
-                            siblings.push(allCommands[countAll]);
-                        }
-                    }
-                    return siblings;
-                },
-
-                _baseResize: function _Overlay_baseResize(event) {
-                    // Call specific resize
-                    this._resize(event);
-                },
-
-                _hideOrDismiss: function _Overlay_hideOrDismiss() {
-                    var element = this._element;
-                    if (element && _ElementUtilities.hasClass(element, _Constants.settingsFlyoutClass)) {
-                        this._dismiss();
-                    } else if (element && _ElementUtilities.hasClass(element, _Constants.appBarClass)) {
-                        this.close();
-                    } else {
-                        this.hide();
-                    }
-                },
-
-                _resize: function _Overlay_resize() {
-                    // Nothing by default
-                },
-
-                _commandsUpdated: function _Overlay_commandsUpdated() {
-                    // Nothing by default
-                },
-
-                _checkScrollPosition: function _Overlay_checkScrollPosition() {
-                    // Nothing by default
-                },
-
-                _showingKeyboard: function _Overlay_showingKeyboard() {
-                    // Nothing by default
-                },
-
-                _hidingKeyboard: function _Overlay_hidingKeyboard() {
-                    // Nothing by default
-                },
-
-                // Verify that this HTML AppBar only has AppBar/MenuCommands.
-                _verifyCommandsOnly: function _Overlay_verifyCommandsOnly(element, type) {
-                    var children = element.children;
-                    var commands = new Array(children.length);
-                    for (var i = 0; i < children.length; i++) {
-                        // If constructed they have win-command class, otherwise they have data-win-control
-                        if (!_ElementUtilities.hasClass(children[i], "win-command") &&
-                        children[i].getAttribute("data-win-control") !== type) {
-                            // Wasn't tagged with class or AppBar/MenuCommand, not an AppBar/MenuCommand
-                            throw new _ErrorFromName("WinJS.UI._Overlay.MustContainCommands", strings.mustContainCommands);
-                        } else {
-                            // Instantiate the commands.
-                            ControlProcessor.processAll(children[i]);
-                            commands[i] = children[i].winControl;
-                        }
-                    }
-                    return commands;
-                },
-
-                // Sets focus on what we think is the last tab stop. If nothing is focusable will
-                // try to set focus on itself.
-                _focusOnLastFocusableElementOrThis: function _Overlay_focusOnLastFocusableElementOrThis() {
-                    if (!this._focusOnLastFocusableElement()) {
-                        // Nothing is focusable.  Set focus to this.
-                        _Overlay._trySetActive(this._element);
-                    }
-                },
-
-                // Sets focus to what we think is the last tab stop. This element must have
-                // a firstDiv with tabIndex equal to the lowest tabIndex in the element
-                // and a finalDiv with tabIndex equal to the highest tabIndex in the element.
-                // Also the firstDiv must be its first child and finalDiv be its last child.
-                // Returns true if successful, false otherwise.
-                _focusOnLastFocusableElement: function _Overlay_focusOnLastFocusableElement() {
-                    if (this._element.firstElementChild) {
-                        var oldFirstTabIndex = this._element.firstElementChild.tabIndex;
-                        var oldLastTabIndex = this._element.lastElementChild.tabIndex;
-                        this._element.firstElementChild.tabIndex = -1;
-                        this._element.lastElementChild.tabIndex = -1;
-
-                        var tabResult = _ElementUtilities._focusLastFocusableElement(this._element);
-
-                        if (tabResult) {
-                            _Overlay._trySelect(_Global.document.activeElement);
-                        }
-
-                        this._element.firstElementChild.tabIndex = oldFirstTabIndex;
-                        this._element.lastElementChild.tabIndex = oldLastTabIndex;
-
-                        return tabResult;
-                    } else {
-                        return false;
-                    }
-                },
-
-
-                // Sets focus on what we think is the first tab stop. If nothing is focusable will
-                // try to set focus on itself.
-                _focusOnFirstFocusableElementOrThis: function _Overlay_focusOnFirstFocusableElementOrThis() {
-                    if (!this._focusOnFirstFocusableElement()) {
-                        // Nothing is focusable.  Set focus to this.
-                        _Overlay._trySetActive(this._element);
-                    }
-                },
-
-                // Sets focus to what we think is the first tab stop. This element must have
-                // a firstDiv with tabIndex equal to the lowest tabIndex in the element
-                // and a finalDiv with tabIndex equal to the highest tabIndex in the element.
-                // Also the firstDiv must be its first child and finalDiv be its last child.
-                // Returns true if successful, false otherwise.
-                _focusOnFirstFocusableElement: function _Overlay__focusOnFirstFocusableElement(useSetActive, scroller) {
-                    if (this._element.firstElementChild) {
-                        var oldFirstTabIndex = this._element.firstElementChild.tabIndex;
-                        var oldLastTabIndex = this._element.lastElementChild.tabIndex;
-                        this._element.firstElementChild.tabIndex = -1;
-                        this._element.lastElementChild.tabIndex = -1;
-
-                        var tabResult = _ElementUtilities._focusFirstFocusableElement(this._element, useSetActive, scroller);
-
-                        if (tabResult) {
-                            _Overlay._trySelect(_Global.document.activeElement);
-                        }
-
-                        this._element.firstElementChild.tabIndex = oldFirstTabIndex;
-                        this._element.lastElementChild.tabIndex = oldLastTabIndex;
-
-                        return tabResult;
-                    } else {
-                        return false;
-                    }
-                },
-
-                _writeProfilerMark: function _Overlay_writeProfilerMark(text) {
-                    _WriteProfilerMark("WinJS.UI._Overlay:" + this._id + ":" + text);
-                }
-            },
-            {
-                // Statics
-
-                _isFlyoutVisible: function () {
-                    var flyouts = _Global.document.querySelectorAll("." + _Constants.flyoutClass);
-                    for (var i = 0; i < flyouts.length; i++) {
-                        var flyoutControl = flyouts[i].winControl;
-                        if (flyoutControl && !flyoutControl.hidden) {
-                            return true;
-                        }
-                    }
-
-                    return false;
-                },
-
-                // Try to set us as active
-                _trySetActive: function (element, scroller) {
-                    if (!element || !_Global.document.body || !_Global.document.body.contains(element)) {
-                        return false;
-                    }
-                    if (!_ElementUtilities._setActive(element, scroller)) {
-                        return false;
-                    }
-                    return (element === _Global.document.activeElement);
-                },
-
-                // Try to select the text so keyboard can be used.
-                _trySelect: function (element) {
-                    try {
-                        if (element && element.select) {
-                            element.select();
-                        }
-                    } catch (e) { }
-                },
-
-                _sizeOfDocument: function () {
-                    return {
-                        width: _Global.document.documentElement.offsetWidth,
-                        height: _Global.document.documentElement.offsetHeight,
-                    };
-                },
-
-                _getParentControlUsingClassName: function (element, className) {
-                    while (element && element !== _Global.document.body) {
-                        if (_ElementUtilities.hasClass(element, className)) {
-                            return element.winControl;
-                        }
-                        element = element.parentNode;
-                    }
-                    return null;
-                },
-
-                // Static controller for _Overlay global events registering/unregistering.
-                _globalEventListeners: new _GlobalListener(),
-
-                // Show/Hide all bars
-                _hideAppBars: function _Overlay_hideAppBars(bars, keyboardInvoked) {
-                    var allBarsAnimationPromises = bars.map(function (bar) {
-                        bar.close();
-                        return bar._animationPromise;
-                    });
-                    return Promise.join(allBarsAnimationPromises);
-                },
-
-                _showAppBars: function _Overlay_showAppBars(bars, keyboardInvoked) {
-                    var allBarsAnimationPromises = bars.map(function (bar) {
-                        bar._show();
-                        return bar._animationPromise;
-                    });
-                    return Promise.join(allBarsAnimationPromises);
-                },
-
-                // WWA Soft Keyboard offsets
-                _keyboardInfo: _KeyboardInfo._KeyboardInfo,
-
-                // Padding for IHM timer to allow for first scroll event
-                _scrollTimeout: _KeyboardInfo._KeyboardInfo._scrollTimeout,
-
-                // Events
-                beforeShow: "beforeshow",
-                beforeHide: "beforehide",
-                afterShow: "aftershow",
-                afterHide: "afterhide",
-
-                commonstrings: {
-                    get cannotChangeCommandsWhenVisible() { return "Invalid argument: You must call hide() before changing {0} commands"; },
-                    get cannotChangeHiddenProperty() { return "Unable to set hidden property while parent {0} is visible."; }
-                },
-            });
-
-            _Base.Class.mix(_Overlay, _Control.DOMEventMixin);
-
-            return _Overlay;
-        })
-    });
-
-});
-
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <dictionary>appbar,Flyout,Flyouts,Statics</dictionary>
-define('WinJS/Controls/Flyout',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Events',
-    '../Core/_Log',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../Animations',
-    '../_Signal',
-    '../_LightDismissService',
-    '../Utilities/_Dispose',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_KeyboardBehavior',
-    '../Utilities/_Hoverable',
-    './_LegacyAppBar/_Constants',
-    './Flyout/_Overlay'
-], function flyoutInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, Animations, _Signal, _LightDismissService, _Dispose, _ElementUtilities, _KeyboardBehavior, _Hoverable, _Constants, _Overlay) {
-    "use strict";
-
-    // Implementation details:
-    //
-    // The WinJS Flyout is a low policy control for popup ui and can host any arbitrary HTML that an app would like to display. Flyout derives from the private WinJS
-    // _Overlay class, and relies on _Overlay to create the hide and show animations as well as fire all beforeshow, aftershow, beforehide, afterhide.  Flyout also has a
-    // child class, WinJS Menu, which is a high policy control for popup ui and has many more restrictions on the content it can host.
-    //
-    // All of the following information pertains to both Flyouts and Menus, but for simplicity only the term flyout is used. Notes on Menu specific implementation details are
-    // covered separately in the Menu class.
-    //
-    // The responsibilities of the WinJS Flyout include:
-    //
-    //  - On screen positioning:
-    //      - A showing Flyout can be positioned in one of two ways
-    //          - Relative to another element, as specified by the flyout "anchor", "placement", and "alignment" properties and the flyout.show() method
-    //          - At a location specified by a mouse event, as specified in the parameters to the flyout.showAt(MouseEvent) method.
-    //      - A shown Flyout always wants to stay within bounds of the visual viewport in the users App. In IE11, Edge, Win 8.1 apps and Win 10 apps, the Flyout uses CSS
-    //        position: -ms-device-fixed; which will cause its top, left, bottom & right CSS properties be styled in relation to the visual viewport.
-    //      - In other browsers -ms-device-fixed positioning doesn't exist and the Flyout falls back to CSS position: fixed; which will cause its top, left, bottom & right
-    //        CSS properties be styled in relation to the layout viewport.
-    //      - See http://quirksmode.org/mobile/viewports2.html for more details on the difference between layout viewport and visual viewport.
-    //      - Being able to position the Flyout relative to the visual viewport is particularly important in windows 8.1 apps and Windows 10 apps (as opposed to the web),
-    //        because the Flyout is also concerned with getting out of the way of the Windows IHM (virtual keyboard). When the IHM starts to show or hide, the Flyout reacts to
-    //        a WinRT event, if the IHM would occlude part of a Flyout, the Flyout will move itself  up and out of the way, normally pinning its bottom edge to the top edge of
-    //        the IHM.
-    //      - Computing this is quite tricky as the IHM is a system pane and not actually in the DOM. Flyout uses the private _KeyboardInfo component to help calculate the top
-    //        and bottom coordinates of the "visible document" which is essentially the top and bottom of the visual viewport minus any IHM occlusion.
-    //      - The Flyout is not optimized for scenarios involving optical zoom. How and where the Flyout is affected when an optical zoom (pinch zoom) occurs will vary based on
-    //        the type of positioning being used for the environment.
-    //
-    //  - Rendering
-    //      - By default the flyout has a minimum height and minmium width defined in CSS, but no maximums, instead preferring to allow its element to  grow to the size of its
-    //        content.
-    //      - If a showing Flyout would be taller than the height of the "visible document" the flyout's show logic will temporarily constrain the max-height of the flyout
-    //        element to fit tightly within the upper and lower bounds of the "visible document", for as long as the flyout remains shown. While in this state the Flyout will
-    //        acquire a vertical scrollbar.
-    //
-    //  - Cascading Behavior:
-    //      - Starting in WinJS 4, flyouts, can be cascaded. Previous versions of WinJS did not allow more than one instance of a flyout to be shown at the same time.
-    //        Attempting to do so would first cause any other shown flyout to hide.
-    //      - Now any flyout can be shown as part of a cascade of other flyouts, allowing any other ancestor flyouts in the same cascade can remain open.
-    //      - The Flyout class relies on a private singleton _CascadeManager component to manage all flyouts in the current cascade. Here are some important implementation
-    //        details for _CascadeManager:
-    //          - The cascade is represented as a stack data structure and should only ever contain flyouts that are shown.
-    //          - If only one flyout is shown, it is considered to be in a cascade of length 1.
-    //          - A flyout "A" is considered to have an ancestor in the current cascade if flyout A's "anchor" property points to any element contained by ANY of the flyouts
-    //            in the current cascade, including the flyout elements themselves.
-    //          - Any time a flyout "A" transitions from hidden to shown, it is always added to the top of the stack.
-    //              - Only one cascade of flyouts can be shown at a time. If flyout "A" is about to be shown, and has no ancestors in the current cascade, all flyouts in the
-    //                current cascade must first be hidden and popped from the stack, then flyout "A" may be shown and pushed into the stack as the head flyout in a new cascade.
-    //              - If flyout "A" had an ancestor flyout in the cascade, flyout "A" will be put into the stack directly above its ancestor.
-    //              - If in the above scenario, the ancestor flyout already had other descendant flyouts on top of it in the stack, before flyout "A" can finish showing, all of
-    //                those flyouts are first popped off the stack and hidden,  then flyout "A" is pushed into the stack directly above its ancestor.
-    //          - Any time a flyout "A" is hidden, it is removed from the stack and no longer in the cascade. If that flyout also had any descendant flyouts in the cascade,
-    //            they are all hidden and removed from the stack as well. Any of flyout A's ancestor flyouts that were already in the cascade will remain there.
-    //
-    //  - Light Dismiss
-    //      - Cascades of flyouts are light dismissible, but an individual flyout is not.
-    //          - The WinJS Flyout implements a private LightDismissableLayer component to track focus and interpret light dismiss cues for all flyouts in the cascade.
-    //            The LightDismissableLayer is stored as a property on the _CascadeManager
-    //          - Normally when a lightdismissable control loses focus, it would trigger light dismiss, but that is not always the desired scenario for flyouts in the cascade.
-    //              - When focus moves from any Flyout in the cascade, to an element outside of the cascade, all flyouts in the cascade should light dismiss.
-    //              - When focus moves from an ancestor flyout "A" in the cascade, to descendant flyout "B" also in the cascade, no flyouts should light dismiss. A common
-    //                scenario for this is when flyout B first shows itself, since flyouts always take focus immediately after showing.
-    //              - When flyout "A" receives focus, all of A's descendant flyouts in the cascade should light dismiss. A common scenario for this is when a user clicks on an
-    //                ancestor flyout in the cascade, all descendant flyouts will close. WinJS Menu implements one exception to this rule where sometimes the immediate
-    //                descendant of the ancestor flyout would be allowed to remain open.
-    //          - The LightDismissibleLayer helps WinJS _LightDismissService dynamically manage the z-indices of all flyouts in the cascade. Flyouts as light dismissable
-    //            overlays are subject to the same stacking context pitfalls as any other light dismissible overlay:
-    //            https://github.com/winjs/winjs/wiki/Dismissables-and-Stacking-Contexts and therefore every flyout should always be defined as a direct child of the
-    //            <body> element.
-    //      - Debugging Tip: Light dismiss can make debugging shown flyouts tricky. A good idea is to temporarily suspend the light dismiss cue that triggers when clicking
-    //        outside of the current window. This can be achieved by executing the following code in the JavaScript console window:
-    //        "WinJS.UI._LightDismissService._setDebug(true)"
-
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.Flyout">
-        /// Displays lightweight UI that is either informational, or requires user interaction.
-        /// Unlike a dialog, a Flyout can be light dismissed by clicking or tapping off of it.
-        /// </summary>
-        /// <compatibleWith platform="Windows" minVersion="8.0"/>
-        /// </field>
-        /// <name locid="WinJS.UI.Flyout_name">Flyout</name>
-        /// <icon src="ui_winjs.ui.flyout.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.flyout.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.Flyout"></div>]]></htmlSnippet>
-        /// <event name="beforeshow" locid="WinJS.UI.Flyout_e:beforeshow">Raised just before showing a flyout.</event>
-        /// <event name="aftershow" locid="WinJS.UI.Flyout_e:aftershow">Raised immediately after a flyout is fully shown.</event>
-        /// <event name="beforehide" locid="WinJS.UI.Flyout_e:beforehide">Raised just before hiding a flyout.</event>
-        /// <event name="afterhide" locid="WinJS.UI.Flyout_e:afterhide">Raised immediately after a flyout is fully hidden.</event>
-        /// <part name="flyout" class="win-flyout" locid="WinJS.UI.Flyout_part:flyout">The Flyout control itself.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        Flyout: _Base.Namespace._lazy(function () {
-            var Key = _ElementUtilities.Key;
-
-            function getDimension(element, property) {
-                return _ElementUtilities.convertToPixels(element, _ElementUtilities._getComputedStyle(element, null)[property]);
-            }
-
-            function measureElement(element) {
-                return {
-                    marginTop: getDimension(element, "marginTop"),
-                    marginBottom: getDimension(element, "marginBottom"),
-                    marginLeft: getDimension(element, "marginLeft"),
-                    marginRight: getDimension(element, "marginRight"),
-                    totalWidth: _ElementUtilities.getTotalWidth(element),
-                    totalHeight: _ElementUtilities.getTotalHeight(element),
-                    contentWidth: _ElementUtilities.getContentWidth(element),
-                    contentHeight: _ElementUtilities.getContentHeight(element),
-                };
-            }
-
-            var strings = {
-                get ariaLabel() { return _Resources._getWinJSString("ui/flyoutAriaLabel").value; },
-                get noAnchor() { return "Invalid argument: Flyout anchor element not found in DOM."; },
-                get badPlacement() { return "Invalid argument: Flyout placement should be 'top' (default), 'bottom', 'left', 'right', 'auto', 'autohorizontal', or 'autovertical'."; },
-                get badAlignment() { return "Invalid argument: Flyout alignment should be 'center' (default), 'left', or 'right'."; },
-                get noCoordinates() { return "Invalid argument: Flyout coordinates must contain a valid x,y pair."; },
-            };
-
-            var createEvent = _Events._createEventProperty;
-
-            // _LightDismissableLayer is an ILightDismissable which manages a set of ILightDismissables.
-            // It acts as a proxy between the LightDismissService and the light dismissables it manages.
-            // It enables multiple dismissables to be above the click eater at the same time.
-            var _LightDismissableLayer = _Base.Class.define(function _LightDismissableLayer_ctor(onLightDismiss) {
-                this._onLightDismiss = onLightDismiss;
-                this._currentlyFocusedClient = null;
-                this._clients = []; // Array of ILightDismissables
-            }, {
-                // Dismissables should call this as soon as they are ready to be shown. More specifically, they should call this:
-                //   - After they are in the DOM and ready to receive focus (e.g. style.display cannot be "none")
-                //   - Before their entrance animation is played
-                shown: function _LightDismissableLayer_shown(client /*: ILightDismissable */) {
-                    client._focusable = true;
-                    var index = this._clients.indexOf(client);
-                    if (index === -1) {
-                        this._clients.push(client);
-                        client.onShow(this);
-                        if (!_LightDismissService.isShown(this)) {
-                            _LightDismissService.shown(this);
-                        } else {
-                            _LightDismissService.updated(this);
-                            this._activateTopFocusableClientIfNeeded();
-                        }
-                    }
-                },
-
-                // Dismissables should call this at the start of their exit animation. A "hiding",
-                // dismissable will still be rendered with the proper z-index but it will no
-                // longer be given focus. Also, focus is synchronously moved out of this dismissable.
-                hiding: function _LightDismissableLayer_hiding(client /*: ILightDismissable */) {
-                    var index = this._clients.indexOf(client);
-                    if (index !== -1) {
-                        this._clients[index]._focusable = false;
-                        this._activateTopFocusableClientIfNeeded();
-                    }
-                },
-
-                // Dismissables should call this when they are done being dismissed (i.e. after their exit animation has finished)
-                hidden: function _LightDismissableLayer_hidden(client /*: ILightDismissable */) {
-                    var index = this._clients.indexOf(client);
-                    if (index !== -1) {
-                        this._clients.splice(index, 1);
-                        client.setZIndex("");
-                        client.onHide();
-                        if (this._clients.length === 0) {
-                            _LightDismissService.hidden(this);
-                        } else {
-                            _LightDismissService.updated(this);
-                            this._activateTopFocusableClientIfNeeded();
-                        }
-                    }
-                },
-
-                keyDown: function _LightDismissableLayer_keyDown(client /*: ILightDismissable */, eventObject) {
-                    _LightDismissService.keyDown(this, eventObject);
-                },
-                keyUp: function _LightDismissableLayer_keyUp(client /*: ILightDismissable */, eventObject) {
-                    _LightDismissService.keyUp(this, eventObject);
-                },
-                keyPress: function _LightDismissableLayer_keyPress(client /*: ILightDismissable */, eventObject) {
-                    _LightDismissService.keyPress(this, eventObject);
-                },
-
-                // Used by tests.
-                clients: {
-                    get: function _LightDismissableLayer_clients_get() {
-                        return this._clients;
-                    }
-                },
-
-                _clientForElement: function _LightDismissableLayer_clientForElement(element) {
-                    for (var i = this._clients.length - 1; i >= 0; i--) {
-                        if (this._clients[i].containsElement(element)) {
-                            return this._clients[i];
-                        }
-                    }
-                    return null;
-                },
-
-                _focusableClientForElement: function _LightDismissableLayer_focusableClientForElement(element) {
-                    for (var i = this._clients.length - 1; i >= 0; i--) {
-                        if (this._clients[i]._focusable && this._clients[i].containsElement(element)) {
-                            return this._clients[i];
-                        }
-                    }
-                    return null;
-                },
-
-                _getTopmostFocusableClient: function _LightDismissableLayer_getTopmostFocusableClient() {
-                    for (var i = this._clients.length - 1; i >= 0; i--) {
-                        var client = this._clients[i];
-                        if (client && client._focusable) {
-                            return client;
-                        }
-                    }
-                    return null;
-                },
-
-                _activateTopFocusableClientIfNeeded: function _LightDismissableLayer_activateTopFocusableClientIfNeeded() {
-                    var topClient = this._getTopmostFocusableClient();
-                    if (topClient && _LightDismissService.isTopmost(this)) {
-                        // If the last input type was keyboard, use focus() so a keyboard focus visual is drawn.
-                        // Otherwise, use setActive() so no focus visual is drawn.
-                        var useSetActive = !_KeyboardBehavior._keyboardSeenLast;
-                        topClient.onTakeFocus(useSetActive);
-                    }
-                },
-
-                // ILightDismissable
-                //
-
-                setZIndex: function _LightDismissableLayer_setZIndex(zIndex) {
-                    this._clients.forEach(function (client, index) {
-                        client.setZIndex(zIndex + index);
-                    }, this);
-                },
-                getZIndexCount: function _LightDismissableLayer_getZIndexCount() {
-                    return this._clients.length;
-                },
-                containsElement: function _LightDismissableLayer_containsElement(element) {
-                    return !!this._clientForElement(element);
-                },
-                onTakeFocus: function _LightDismissableLayer_onTakeFocus(useSetActive) {
-                    // Prefer the client that has focus
-                    var client = this._focusableClientForElement(_Global.document.activeElement);
-
-                    if (!client && this._clients.indexOf(this._currentlyFocusedClient) !== -1 && this._currentlyFocusedClient._focusable) {
-                        // Next try the client that had focus most recently
-                        client = this._currentlyFocusedClient;
-                    }
-
-                    if (!client) {
-                        // Finally try the client at the top of the stack
-                        client = this._getTopmostFocusableClient();
-                    }
-
-                    this._currentlyFocusedClient = client;
-                    client && client.onTakeFocus(useSetActive);
-                },
-                onFocus: function _LightDismissableLayer_onFocus(element) {
-                    this._currentlyFocusedClient = this._clientForElement(element);
-                    this._currentlyFocusedClient && this._currentlyFocusedClient.onFocus(element);
-                },
-                onShow: function _LightDismissableLayer_onShow(service /*: ILightDismissService */) { },
-                onHide: function _LightDismissableLayer_onHide() {
-                    this._currentlyFocusedClient = null;
-                },
-                onKeyInStack: function _LightDismissableLayer_onKeyInStack(info /*: IKeyboardInfo*/) {
-                    // A keyboard event occurred in the light dismiss stack. Notify the flyouts to
-                    // give them the opportunity to handle this evnet.
-                    var index = this._clients.indexOf(this._currentlyFocusedClient);
-                    if (index !== -1) {
-                        var clients = this._clients.slice(0, index + 1);
-                        for (var i = clients.length - 1; i >= 0 && !info.propagationStopped; i--) {
-                            if (clients[i]._focusable) {
-                                clients[i].onKeyInStack(info);
-                            }
-                        }
-                    }
-                },
-                onShouldLightDismiss: function _LightDismissableLayer_onShouldLightDismiss(info) {
-                    return _LightDismissService.DismissalPolicies.light(info);
-                },
-                onLightDismiss: function _LightDismissableLayer_onLightDismiss(info) {
-                    this._onLightDismiss(info);
-                }
-            });
-
-            // Singleton class for managing cascading flyouts
-            var _CascadeManager = _Base.Class.define(function _CascadeManager_ctor() {
-                var that = this;
-                this._dismissableLayer = new _LightDismissableLayer(function _CascadeManager_onLightDismiss(info) {
-                    if (info.reason === _LightDismissService.LightDismissalReasons.escape) {
-                        that.collapseFlyout(that.getAt(that.length - 1));
-                    } else {
-                        that.collapseAll();
-                    }
-                });
-                this._cascadingStack = [];
-                this._handleKeyDownInCascade_bound = this._handleKeyDownInCascade.bind(this);
-                this._inputType = null;
-            },
-            {
-                appendFlyout: function _CascadeManager_appendFlyout(flyoutToAdd) {
-                    // PRECONDITION: this.reentrancyLock must be false. appendFlyout should only be called from baseFlyoutShow() which is the function responsible for preventing reentrancy.
-                    _Log.log && this.reentrancyLock && _Log.log('_CascadeManager is attempting to append a Flyout through reentrancy.', "winjs _CascadeManager", "error");
-
-                    if (this.indexOf(flyoutToAdd) < 0) {
-                        // IF the anchor element for flyoutToAdd is contained within another flyout,
-                        // && that flyout is currently in the cascadingStack, consider that flyout to be the parent of flyoutToAdd:
-                        //  Remove from the cascadingStack, any subflyout descendants of the parent flyout.
-                        // ELSE flyoutToAdd isn't anchored to any of the Flyouts in the existing cascade
-                        //  Collapse the entire cascadingStack to start a new cascade.
-                        // FINALLY:
-                        //  add flyoutToAdd to the end of the cascading stack. Monitor it for events.
-
-                        var collapseFn = this.collapseAll;
-                        if (flyoutToAdd._positionRequest instanceof PositionRequests.AnchorPositioning) {
-                            var indexOfParentFlyout = this.indexOfElement(flyoutToAdd._positionRequest.anchor);
-                            if (indexOfParentFlyout >= 0) {
-                                collapseFn = function collapseFn() {
-                                    this.collapseFlyout(this.getAt(indexOfParentFlyout + 1));
-                                };
-                            }
-                        }
-                        collapseFn.call(this);
-
-                        flyoutToAdd.element.addEventListener("keydown", this._handleKeyDownInCascade_bound, false);
-                        this._cascadingStack.push(flyoutToAdd);
-                    }
-                },
-                collapseFlyout: function _CascadeManager_collapseFlyout(flyout) {
-                    // Synchronously removes flyout param and its subflyout descendants from the _cascadingStack.
-                    // Synchronously calls hide on all removed flyouts.
-
-                    if (!this.reentrancyLock && flyout && this.indexOf(flyout) >= 0) {
-                        this.reentrancyLock = true;
-                        var signal = new _Signal();
-                        this.unlocked = signal.promise;
-
-                        var subFlyout;
-                        while (this.length && flyout !== subFlyout) {
-                            subFlyout = this._cascadingStack.pop();
-                            subFlyout.element.removeEventListener("keydown", this._handleKeyDownInCascade_bound, false);
-                            subFlyout._hide(); // We use the reentrancyLock to prevent reentrancy here.
-                        }
-
-                        if (this._cascadingStack.length === 0) {
-                            // The cascade is empty so clear the input type. This gives us the opportunity
-                            // to recalculate the input type when the next cascade starts.
-                            this._inputType = null;
-                        }
-
-                        this.reentrancyLock = false;
-                        this.unlocked = null;
-                        signal.complete();
-                    }
-                },
-                flyoutShown: function _CascadeManager_flyoutShown(flyout) {
-                    this._dismissableLayer.shown(flyout._dismissable);
-                },
-                flyoutHiding: function _CascadeManager_flyoutHiding(flyout) {
-                    this._dismissableLayer.hiding(flyout._dismissable);
-                },
-                flyoutHidden: function _CascadeManager_flyoutHidden(flyout) {
-                    this._dismissableLayer.hidden(flyout._dismissable);
-                },
-                collapseAll: function _CascadeManager_collapseAll() {
-                    // Empties the _cascadingStack and hides all flyouts.
-                    var headFlyout = this.getAt(0);
-                    if (headFlyout) {
-                        this.collapseFlyout(headFlyout);
-                    }
-                },
-                indexOf: function _CascadeManager_indexOf(flyout) {
-                    return this._cascadingStack.indexOf(flyout);
-                },
-                indexOfElement: function _CascadeManager_indexOfElement(el) {
-                    // Returns an index cooresponding to the Flyout in the cascade whose element contains the element in question.
-                    // Returns -1 if the element is not contained by any Flyouts in the cascade.
-                    var indexOfAssociatedFlyout = -1;
-                    for (var i = 0, len = this.length; i < len; i++) {
-                        var currentFlyout = this.getAt(i);
-                        if (currentFlyout.element.contains(el)) {
-                            indexOfAssociatedFlyout = i;
-                            break;
-                        }
-                    }
-                    return indexOfAssociatedFlyout;
-                },
-                length: {
-                    get: function _CascadeManager_getLength() {
-                        return this._cascadingStack.length;
-                    }
-                },
-                getAt: function _CascadeManager_getAt(index) {
-                    return this._cascadingStack[index];
-                },
-                handleFocusIntoFlyout: function _CascadeManager_handleFocusIntoFlyout(event) {
-                    // When a flyout in the cascade recieves focus, we close all subflyouts beneath it.
-                    var index = this.indexOfElement(event.target);
-                    if (index >= 0) {
-                        var subFlyout = this.getAt(index + 1);
-                        this.collapseFlyout(subFlyout);
-                    }
-                },
-                // Compute the input type that is associated with the cascading stack on demand. Allows
-                // each Flyout in the cascade to adjust its sizing based on the current input type
-                // and to do it in a way that is consistent with the rest of the Flyouts in the cascade.
-                inputType: {
-                    get: function _CascadeManager_inputType_get() {
-                        if (!this._inputType) {
-                            this._inputType = _KeyboardBehavior._lastInputType;
-                        }
-                        return this._inputType;
-                    }
-                },
-                // Used by tests.
-                dismissableLayer: {
-                    get: function _CascadeManager_dismissableLayer_get() {
-                        return this._dismissableLayer;
-                    }
-                },
-                _handleKeyDownInCascade: function _CascadeManager_handleKeyDownInCascade(event) {
-                    var rtl = _ElementUtilities._getComputedStyle(event.target).direction === "rtl",
-                        leftKey = rtl ? Key.rightArrow : Key.leftArrow,
-                        target = event.target;
-
-                    if (event.keyCode === leftKey) {
-                        // Left key press in a SubFlyout will close that subFlyout and any subFlyouts cascading from it.
-                        var index = this.indexOfElement(target);
-                        if (index >= 1) {
-                            var subFlyout = this.getAt(index);
-                            this.collapseFlyout(subFlyout);
-                            // Prevent document scrolling
-                            event.preventDefault();
-                        }
-                    } else if (event.keyCode === Key.alt || event.keyCode === Key.F10) {
-                        this.collapseAll();
-                    }
-                }
-            });
-
-            var AnimationOffsets = {
-                top: { top: "50px", left: "0px", keyframe: "WinJS-showFlyoutTop" },
-                bottom: { top: "-50px", left: "0px", keyframe: "WinJS-showFlyoutBottom" },
-                left: { top: "0px", left: "50px", keyframe: "WinJS-showFlyoutLeft" },
-                right: { top: "0px", left: "-50px", keyframe: "WinJS-showFlyoutRight" },
-            };
-
-            var PositionRequests = {
-                AnchorPositioning: _Base.Class.define(function AnchorPositioning_ctor(anchor, placement, alignment) {
-
-                    // We want to position relative to an anchor element. Anchor element is required.
-
-                    // Dereference the anchor if necessary
-                    if (typeof anchor === "string") {
-                        anchor = _Global.document.getElementById(anchor);
-                    } else if (anchor && anchor.element) {
-                        anchor = anchor.element;
-                    }
-
-                    if (!anchor) {
-                        // We expect an anchor
-                        throw new _ErrorFromName("WinJS.UI.Flyout.NoAnchor", strings.noAnchor);
-                    }
-
-                    this.anchor = anchor;
-                    this.placement = placement;
-                    this.alignment = alignment;
-                },
-                {
-                    getTopLeft: function AnchorPositioning_getTopLeft(flyoutMeasurements, isRtl) {
-                        // This determines our positioning.  We have 8 placements, the 1st four are explicit, the last 4 are automatic:
-                        // * top - position explicitly on the top of the anchor, shrinking and adding scrollbar as needed.
-                        // * bottom - position explicitly below the anchor, shrinking and adding scrollbar as needed.
-                        // * left - position left of the anchor, shrinking and adding a vertical scrollbar as needed.
-                        // * right - position right of the anchor, shrinking and adding a vertical scroolbar as needed.
-                        // * _cascade - Private placement algorithm used by MenuCommand._activateFlyoutCommand.
-                        // * auto - Automatic placement.
-                        // * autohorizontal - Automatic placement (only left or right).
-                        // * autovertical - Automatic placement (only top or bottom).
-                        // Auto tests the height of the anchor and the flyout.  For consistency in orientation, we imagine
-                        // that the anchor is placed in the vertical center of the display.  If the flyout would fit above
-                        // that centered anchor, then we will place the flyout vertically in relation to the anchor, otherwise
-                        // placement will be horizontal.
-                        // Vertical auto or autovertical placement will be positioned on top of the anchor if room, otherwise below the anchor.
-                        //   - this is because touch users would be more likely to obscure flyouts below the anchor.
-                        // Horizontal auto or autohorizontal placement will be positioned to the left of the anchor if room, otherwise to the right.
-                        //   - this is because right handed users would be more likely to obscure a flyout on the right of the anchor.
-                        // All three auto placements will add a vertical scrollbar if necessary.
-                        //
-
-                        var anchorBorderBox;
-
-                        try {
-                            // Anchor needs to be in DOM.
-                            anchorBorderBox = this.anchor.getBoundingClientRect();
-                        }
-                        catch (e) {
-                            throw new _ErrorFromName("WinJS.UI.Flyout.NoAnchor", strings.noAnchor);
-                        }
-
-                        var nextLeft;
-                        var nextTop;
-                        var doesScroll;
-                        var nextAnimOffset;
-                        var verticalMarginBorderPadding = (flyoutMeasurements.totalHeight - flyoutMeasurements.contentHeight);
-                        var nextContentHeight = flyoutMeasurements.contentHeight;
-
-                        function configureVerticalWithScroll(anchorBorderBox) {
-                            // Won't fit top or bottom. Pick the one with the most space and add a scrollbar.
-                            if (topHasMoreRoom(anchorBorderBox)) {
-                                // Top
-                                nextContentHeight = spaceAbove(anchorBorderBox) - verticalMarginBorderPadding;
-                                nextTop = _Overlay._Overlay._keyboardInfo._visibleDocTop;
-                                nextAnimOffset = AnimationOffsets.top;
-                            } else {
-                                // Bottom
-                                nextContentHeight = spaceBelow(anchorBorderBox) - verticalMarginBorderPadding;
-                                nextTop = _Constants.pinToBottomEdge;
-                                nextAnimOffset = AnimationOffsets.bottom;
-                            }
-                            doesScroll = true;
-                        }
-
-                        // If the anchor is centered vertically, would the flyout fit above it?
-                        function fitsVerticallyWithCenteredAnchor(anchorBorderBox, flyoutMeasurements) {
-                            // Returns true if the flyout would always fit at least top
-                            // or bottom of its anchor, regardless of the position of the anchor,
-                            // as long as the anchor never changed its height, nor did the height of
-                            // the visualViewport change.
-                            return ((_Overlay._Overlay._keyboardInfo._visibleDocHeight - anchorBorderBox.height) / 2) >= flyoutMeasurements.totalHeight;
-                        }
-
-                        function spaceAbove(anchorBorderBox) {
-                            return anchorBorderBox.top - _Overlay._Overlay._keyboardInfo._visibleDocTop;
-                        }
-
-                        function spaceBelow(anchorBorderBox) {
-                            return _Overlay._Overlay._keyboardInfo._visibleDocBottom - anchorBorderBox.bottom;
-                        }
-
-                        function topHasMoreRoom(anchorBorderBox) {
-                            return spaceAbove(anchorBorderBox) > spaceBelow(anchorBorderBox);
-                        }
-
-                        // See if we can fit in various places, fitting in the main view,
-                        // ignoring viewport changes, like for the IHM.
-                        function fitTop(bottomConstraint, flyoutMeasurements) {
-                            nextTop = bottomConstraint - flyoutMeasurements.totalHeight;
-                            nextAnimOffset = AnimationOffsets.top;
-                            return (nextTop >= _Overlay._Overlay._keyboardInfo._visibleDocTop &&
-                                    nextTop + flyoutMeasurements.totalHeight <= _Overlay._Overlay._keyboardInfo._visibleDocBottom);
-                        }
-
-                        function fitBottom(topConstraint, flyoutMeasurements) {
-                            nextTop = topConstraint;
-                            nextAnimOffset = AnimationOffsets.bottom;
-                            return (nextTop >= _Overlay._Overlay._keyboardInfo._visibleDocTop &&
-                                    nextTop + flyoutMeasurements.totalHeight <= _Overlay._Overlay._keyboardInfo._visibleDocBottom);
-                        }
-
-                        function fitLeft(leftConstraint, flyoutMeasurements) {
-                            nextLeft = leftConstraint - flyoutMeasurements.totalWidth;
-                            nextAnimOffset = AnimationOffsets.left;
-                            return (nextLeft >= 0 && nextLeft + flyoutMeasurements.totalWidth <= _Overlay._Overlay._keyboardInfo._visualViewportWidth);
-                        }
-
-                        function fitRight(rightConstraint, flyoutMeasurements) {
-                            nextLeft = rightConstraint;
-                            nextAnimOffset = AnimationOffsets.right;
-                            return (nextLeft >= 0 && nextLeft + flyoutMeasurements.totalWidth <= _Overlay._Overlay._keyboardInfo._visualViewportWidth);
-                        }
-
-                        function centerVertically(anchorBorderBox, flyoutMeasurements) {
-                            nextTop = anchorBorderBox.top + anchorBorderBox.height / 2 - flyoutMeasurements.totalHeight / 2;
-                            if (nextTop < _Overlay._Overlay._keyboardInfo._visibleDocTop) {
-                                nextTop = _Overlay._Overlay._keyboardInfo._visibleDocTop;
-                            } else if (nextTop + flyoutMeasurements.totalHeight >= _Overlay._Overlay._keyboardInfo._visibleDocBottom) {
-                                // Flag to pin to bottom edge of visual document.
-                                nextTop = _Constants.pinToBottomEdge;
-                            }
-                        }
-
-                        function alignHorizontally(anchorBorderBox, flyoutMeasurements, alignment) {
-                            if (alignment === "center") {
-                                nextLeft = anchorBorderBox.left + anchorBorderBox.width / 2 - flyoutMeasurements.totalWidth / 2;
-                            } else if (alignment === "left") {
-                                nextLeft = anchorBorderBox.left;
-                            } else if (alignment === "right") {
-                                nextLeft = anchorBorderBox.right - flyoutMeasurements.totalWidth;
-                            } else {
-                                throw new _ErrorFromName("WinJS.UI.Flyout.BadAlignment", strings.badAlignment);
-                            }
-                            if (nextLeft < 0) {
-                                nextLeft = 0;
-                            } else if (nextLeft + flyoutMeasurements.totalWidth >= _Overlay._Overlay._keyboardInfo._visualViewportWidth) {
-                                // Flag to pin to right edge of visible document.
-                                nextLeft = _Constants.pinToRightEdge;
-                            }
-                        }
-
-                        var currentAlignment = this.alignment;
-
-                        // Check fit for requested placement, doing fallback if necessary
-                        switch (this.placement) {
-                            case "top":
-                                if (!fitTop(anchorBorderBox.top, flyoutMeasurements)) {
-                                    // Didn't fit, needs scrollbar
-                                    nextTop = _Overlay._Overlay._keyboardInfo._visibleDocTop;
-                                    doesScroll = true;
-                                    nextContentHeight = spaceAbove(anchorBorderBox) - verticalMarginBorderPadding;
-                                }
-                                alignHorizontally(anchorBorderBox, flyoutMeasurements, currentAlignment);
-                                break;
-                            case "bottom":
-                                if (!fitBottom(anchorBorderBox.bottom, flyoutMeasurements)) {
-                                    // Didn't fit, needs scrollbar
-                                    nextTop = _Constants.pinToBottomEdge;
-                                    doesScroll = true;
-                                    nextContentHeight = spaceBelow(anchorBorderBox) - verticalMarginBorderPadding;
-                                }
-                                alignHorizontally(anchorBorderBox, flyoutMeasurements, currentAlignment);
-                                break;
-                            case "left":
-                                if (!fitLeft(anchorBorderBox.left, flyoutMeasurements)) {
-                                    // Didn't fit, just shove it to edge
-                                    nextLeft = 0;
-                                }
-                                centerVertically(anchorBorderBox, flyoutMeasurements);
-                                break;
-                            case "right":
-                                if (!fitRight(anchorBorderBox.right, flyoutMeasurements)) {
-                                    // Didn't fit, just shove it to edge
-                                    nextLeft = _Constants.pinToRightEdge;
-                                }
-                                centerVertically(anchorBorderBox, flyoutMeasurements);
-                                break;
-                            case "autovertical":
-                                if (!fitTop(anchorBorderBox.top, flyoutMeasurements)) {
-                                    // Didn't fit above (preferred), so go below.
-                                    if (!fitBottom(anchorBorderBox.bottom, flyoutMeasurements)) {
-                                        // Didn't fit, needs scrollbar
-                                        configureVerticalWithScroll(anchorBorderBox);
-                                    }
-                                }
-                                alignHorizontally(anchorBorderBox, flyoutMeasurements, currentAlignment);
-                                break;
-                            case "autohorizontal":
-                                if (!fitLeft(anchorBorderBox.left, flyoutMeasurements)) {
-                                    // Didn't fit left (preferred), so go right.
-                                    if (!fitRight(anchorBorderBox.right, flyoutMeasurements)) {
-                                        // Didn't fit,just shove it to edge
-                                        nextLeft = _Constants.pinToRightEdge;
-                                    }
-                                }
-                                centerVertically(anchorBorderBox, flyoutMeasurements);
-                                break;
-                            case "auto":
-                                // Auto, if the anchor was in the vertical center of the display would we fit above it?
-                                if (fitsVerticallyWithCenteredAnchor(anchorBorderBox, flyoutMeasurements)) {
-                                    // It will fit above or below the anchor
-                                    if (!fitTop(anchorBorderBox.top, flyoutMeasurements)) {
-                                        // Didn't fit above (preferred), so go below.
-                                        fitBottom(anchorBorderBox.bottom, flyoutMeasurements);
-                                    }
-                                    alignHorizontally(anchorBorderBox, flyoutMeasurements, currentAlignment);
-                                } else {
-                                    // Won't fit above or below, try a side
-                                    if (!fitLeft(anchorBorderBox.left, flyoutMeasurements) &&
-                                        !fitRight(anchorBorderBox.right, flyoutMeasurements)) {
-                                        // Didn't fit left or right either
-                                        configureVerticalWithScroll(anchorBorderBox);
-                                        alignHorizontally(anchorBorderBox, flyoutMeasurements, currentAlignment);
-                                    } else {
-                                        centerVertically(anchorBorderBox, flyoutMeasurements);
-                                    }
-                                }
-                                break;
-                            case "_cascade":
-
-                                // Vertical Alignment:
-                                // PREFERRED:
-                                // When there is enough room to align a subMenu to either the top or the bottom of its
-                                // anchor element, the subMenu prefers to be top aligned.
-                                // FALLBACK:
-                                // When there is enough room to bottom align a subMenu but not enough room to top align it,
-                                // then the subMenu will align to the bottom of its anchor element.
-                                // LASTRESORT:
-                                // When there is not enough room to top align or bottom align the subMenu to its anchor,
-                                // then the subMenu will be center aligned to it's anchor's vertical midpoint.
-                                if (!fitBottom(anchorBorderBox.top - flyoutMeasurements.marginTop, flyoutMeasurements) && !fitTop(anchorBorderBox.bottom + flyoutMeasurements.marginBottom, flyoutMeasurements)) {
-                                    centerVertically(anchorBorderBox, flyoutMeasurements);
-                                }
-
-                                // Cascading Menus should overlap their ancestor menu horizontally by 4 pixels and we have a
-                                // unit test to verify that behavior. Because we don't have access to the ancestor flyout we
-                                // need to specify the overlap in terms of our anchor element. There is a 1px border around
-                                // the menu that contains our anchor we need to overlap our anchor by 3px to ensure that we
-                                // overlap the containing Menu by 4px.
-                                var horizontalOverlap = 3;
-
-                                // Horizontal Placement:
-                                // PREFERRED:
-                                // When there is enough room to fit a subMenu on either side of the anchor,
-                                // the subMenu prefers to go on the right hand side.
-                                // FALLBACK:
-                                // When there is only enough room to fit a subMenu on the left side of the anchor,
-                                // the subMenu is placed to the left of the parent menu.
-                                // LASTRESORT:
-                                // When there is not enough room to fit a subMenu on either side of the anchor,
-                                // the subMenu is pinned to the right edge of the window.
-                                var beginRight = anchorBorderBox.right - flyoutMeasurements.marginLeft - horizontalOverlap;
-                                var beginLeft = anchorBorderBox.left + flyoutMeasurements.marginRight + horizontalOverlap;
-
-                                if (isRtl) {
-                                    if (!fitLeft(beginLeft, flyoutMeasurements) && !fitRight(beginRight, flyoutMeasurements)) {
-                                        // Doesn't fit on either side, pin to the left edge.
-                                        nextLeft = 0;
-                                        nextAnimOffset = AnimationOffsets.left;
-                                    }
-                                } else {
-                                    if (!fitRight(beginRight, flyoutMeasurements) && !fitLeft(beginLeft, flyoutMeasurements)) {
-                                        // Doesn't fit on either side, pin to the right edge of the visible document.
-                                        nextLeft = _Constants.pinToRightEdge;
-                                        nextAnimOffset = AnimationOffsets.right;
-                                    }
-                                }
-
-                                break;
-                            default:
-                                // Not a legal placement value
-                                throw new _ErrorFromName("WinJS.UI.Flyout.BadPlacement", strings.badPlacement);
-                        }
-
-                        return {
-                            left: nextLeft,
-                            top: nextTop,
-                            animOffset: nextAnimOffset,
-                            doesScroll: doesScroll,
-                            contentHeight: nextContentHeight,
-                            verticalMarginBorderPadding: verticalMarginBorderPadding,
-                        };
-                    },
-                }),
-                CoordinatePositioning: _Base.Class.define(function CoordinatePositioning_ctor(coordinates) {
-                    // Normalize coordinates since they could be a mouse/pointer event object or an {x,y} pair.
-                    if (coordinates.clientX === +coordinates.clientX &&
-                        coordinates.clientY === +coordinates.clientY) {
-
-                        var temp = coordinates;
-
-                        coordinates = {
-                            x: temp.clientX,
-                            y: temp.clientY,
-                        };
-
-                    } else if (coordinates.x !== +coordinates.x ||
-                        coordinates.y !== +coordinates.y) {
-
-                        // We expect an x,y pair of numbers.
-                        throw new _ErrorFromName("WinJS.UI.Flyout.NoCoordinates", strings.noCoordinates);
-                    }
-                    this.coordinates = coordinates;
-                }, {
-                    getTopLeft: function CoordinatePositioning_getTopLeft(flyoutMeasurements, isRtl) {
-                        // This determines our positioning.
-                        // The top left corner of the Flyout border box is rendered at the specified coordinates
-
-                        // Place the top left of the Flyout's border box at the specified coordinates.
-                        // If we are in RTL, position the top right of the Flyout's border box instead.
-                        var currentCoordinates = this.coordinates;
-                        var widthOfBorderBox = (flyoutMeasurements.totalWidth - flyoutMeasurements.marginLeft - flyoutMeasurements.marginRight);
-                        var adjustForRTL = isRtl ? widthOfBorderBox : 0;
-
-                        var verticalMarginBorderPadding = (flyoutMeasurements.totalHeight - flyoutMeasurements.contentHeight);
-                        var nextContentHeight = flyoutMeasurements.contentHeight;
-                        var nextTop = currentCoordinates.y - flyoutMeasurements.marginTop;
-                        var nextLeft = currentCoordinates.x - flyoutMeasurements.marginLeft - adjustForRTL;
-
-                        if (nextTop < 0) {
-                            // Overran top, pin to top edge.
-                            nextTop = 0;
-                        } else if (nextTop + flyoutMeasurements.totalHeight > _Overlay._Overlay._keyboardInfo._visibleDocBottom) {
-                            // Overran bottom, pin to bottom edge.
-                            nextTop = _Constants.pinToBottomEdge;
-                        }
-
-                        if (nextLeft < 0) {
-                            // Overran left, pin to left edge.
-                            nextLeft = 0;
-                        } else if (nextLeft + flyoutMeasurements.totalWidth > _Overlay._Overlay._keyboardInfo._visualViewportWidth) {
-                            // Overran right, pin to right edge.
-                            nextLeft = _Constants.pinToRightEdge;
-                        }
-
-                        return {
-                            left: nextLeft,
-                            top: nextTop,
-                            verticalMarginBorderPadding: verticalMarginBorderPadding,
-                            contentHeight: nextContentHeight,
-                            doesScroll: false,
-                            animOffset: AnimationOffsets.top,
-                        };
-                    },
-                }),
-            };
-
-            var Flyout = _Base.Class.derive(_Overlay._Overlay, function Flyout_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.Flyout.Flyout">
-                /// <summary locid="WinJS.UI.Flyout.constructor">
-                /// Creates a new Flyout control.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.UI.Flyout.constructor_p:element">
-                /// The DOM element that hosts the control.
-                /// </param>
-                /// <param name="options" type="Object" domElement="false" locid="WinJS.UI.Flyout.constructor_p:options">
-                /// The set of properties and values to apply to the new Flyout.
-                /// </param>
-                /// <returns type="WinJS.UI.Flyout" locid="WinJS.UI.Flyout.constructor_returnValue">The new Flyout control.</returns>
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </signature>
-
-                // Simplify checking later
-                options = options || {};
-
-                // Make sure there's an input element
-                this._element = element || _Global.document.createElement("div");
-                this._id = this._element.id || _ElementUtilities._uniqueID(this._element);
-                this._writeProfilerMark("constructor,StartTM");
-
-                this._baseFlyoutConstructor(this._element, options);
-
-                var _elms = this._element.getElementsByTagName("*");
-                var firstDiv = this._addFirstDiv();
-                firstDiv.tabIndex = _ElementUtilities._getLowestTabIndexInList(_elms);
-                var finalDiv = this._addFinalDiv();
-                finalDiv.tabIndex = _ElementUtilities._getHighestTabIndexInList(_elms);
-
-                // Handle "esc" & "tab" key presses
-                this._element.addEventListener("keydown", this._handleKeyDown, true);
-
-                this._writeProfilerMark("constructor,StopTM");
-                return this;
-            }, {
-                _lastMaxHeight: null,
-
-                _baseFlyoutConstructor: function Flyout_baseFlyoutContstructor(element, options) {
-                    // Flyout constructor
-
-                    // We have some options with defaults
-                    this._placement = "auto";
-                    this._alignment = "center";
-
-                    // Call the base overlay constructor helper
-                    this._baseOverlayConstructor(element, options);
-
-                    // Start flyouts hidden
-                    this._element.style.visibilty = "hidden";
-                    this._element.style.display = "none";
-
-                    // Attach our css class
-                    _ElementUtilities.addClass(this._element, _Constants.flyoutClass);
-
-                    var that = this;
-                    // Each flyout has an ILightDismissable that is managed through the
-                    // CascasdeManager rather than by the _LightDismissService directly.
-                    this._dismissable = new _LightDismissService.LightDismissableElement({
-                        element: this._element,
-                        tabIndex: this._element.hasAttribute("tabIndex") ? this._element.tabIndex : -1,
-                        onLightDismiss: function () {
-                            that.hide();
-                        },
-                        onTakeFocus: function (useSetActive) {
-                            if (!that._dismissable.restoreFocus()) {
-                                if (!_ElementUtilities.hasClass(that.element, _Constants.menuClass)) {
-                                    // Put focus on the first child in the Flyout
-                                    that._focusOnFirstFocusableElementOrThis();
-                                } else {
-                                    // Make sure the menu has focus, but don't show a focus rect
-                                    _Overlay._Overlay._trySetActive(that._element);
-                                }
-                            }
-                        }
-                    });
-
-                    // Make sure we have an ARIA role
-                    var role = this._element.getAttribute("role");
-                    if (role === null || role === "" || role === undefined) {
-                        if (_ElementUtilities.hasClass(this._element, _Constants.menuClass)) {
-                            this._element.setAttribute("role", "menu");
-                        } else {
-                            this._element.setAttribute("role", "dialog");
-                        }
-                    }
-                    var label = this._element.getAttribute("aria-label");
-                    if (label === null || label === "" || label === undefined) {
-                        this._element.setAttribute("aria-label", strings.ariaLabel);
-                    }
-
-                    // Base animation is popIn, but our flyout has different arguments
-                    this._currentAnimateIn = this._flyoutAnimateIn;
-                    this._currentAnimateOut = this._flyoutAnimateOut;
-
-                    _ElementUtilities._addEventListener(this.element, "focusin", this._handleFocusIn.bind(this), false);
-                },
-
-                /// <field type="String" locid="WinJS.UI.Flyout.anchor" helpKeyword="WinJS.UI.Flyout.anchor">
-                /// Gets or sets the Flyout control's anchor. The anchor element is the HTML element which the Flyout originates from and is positioned relative to.
-                /// (This setting can be overridden when you call the show method.)
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                anchor: {
-                    get: function () {
-                        return this._anchor;
-                    },
-                    set: function (value) {
-                        this._anchor = value;
-                    }
-                },
-
-                /// <field type="String" defaultValue="auto" oamOptionsDatatype="WinJS.UI.Flyout.placement" locid="WinJS.UI.Flyout.placement" helpKeyword="WinJS.UI.Flyout.placement">
-                /// Gets or sets the default placement of this Flyout. (This setting can be overridden when you call the show method.)
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                placement: {
-                    get: function () {
-                        return this._placement;
-                    },
-                    set: function (value) {
-                        if (value !== "top" && value !== "bottom" && value !== "left" && value !== "right" && value !== "auto" && value !== "autohorizontal" && value !== "autovertical") {
-                            // Not a legal placement value
-                            throw new _ErrorFromName("WinJS.UI.Flyout.BadPlacement", strings.badPlacement);
-                        }
-                        this._placement = value;
-                    }
-                },
-
-                /// <field type="String" defaultValue="center" oamOptionsDatatype="WinJS.UI.Flyout.alignment" locid="WinJS.UI.Flyout.alignment" helpKeyword="WinJS.UI.Flyout.alignment">
-                /// Gets or sets the default alignment for this Flyout. (This setting can be overridden when you call the show method.)
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                alignment: {
-                    get: function () {
-                        return this._alignment;
-                    },
-                    set: function (value) {
-                        if (value !== "right" && value !== "left" && value !== "center") {
-                            // Not a legal alignment value
-                            throw new _ErrorFromName("WinJS.UI.Flyout.BadAlignment", strings.badAlignment);
-                        }
-                        this._alignment = value;
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.Flyout.disabled" helpKeyword="WinJS.UI.Flyout.disabled">Disable a Flyout, setting or getting the HTML disabled attribute.  When disabled the Flyout will no longer display with show(), and will hide if currently visible.</field>
-                disabled: {
-                    get: function () {
-                        // Ensure it's a boolean because we're using the DOM element to keep in-sync
-                        return !!this._element.disabled;
-                    },
-                    set: function (value) {
-                        // Force this check into a boolean because our current state could be a bit confused since we tie to the DOM element
-                        value = !!value;
-                        var oldValue = !!this._element.disabled;
-                        if (oldValue !== value) {
-                            this._element.disabled = value;
-                            if (!this.hidden && this._element.disabled) {
-                                this.hide();
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.Flyout.onbeforeshow" helpKeyword="WinJS.UI.Flyout.onbeforeshow">
-                /// Occurs immediately before the control is shown.
-                /// </field>
-                onbeforeshow: createEvent(_Overlay._Overlay.beforeShow),
-
-                /// <field type="Function" locid="WinJS.UI.Flyout.onaftershow" helpKeyword="WinJS.UI.Flyout.onaftershow">
-                /// Occurs immediately after the control is shown.
-                /// </field>
-                onaftershow: createEvent(_Overlay._Overlay.afterShow),
-
-                /// <field type="Function" locid="WinJS.UI.Flyout.onbeforehide" helpKeyword="WinJS.UI.Flyout.onbeforehide">
-                /// Occurs immediately before the control is hidden.
-                /// </field>
-                onbeforehide: createEvent(_Overlay._Overlay.beforeHide),
-
-                /// <field type="Function" locid="WinJS.UI.Flyout.onafterhide" helpKeyword="WinJS.UI.Flyout.onafterhide">
-                /// Occurs immediately after the control is hidden.
-                /// </field>
-                onafterhide: createEvent(_Overlay._Overlay.afterHide),
-
-                _dispose: function Flyout_dispose() {
-                    _Dispose.disposeSubTree(this.element);
-                    this._hide();
-                    Flyout._cascadeManager.flyoutHidden(this);
-                    this.anchor = null;
-                },
-
-                show: function (anchor, placement, alignment) {
-                    /// <signature helpKeyword="WinJS.UI.Flyout.show">
-                    /// <summary locid="WinJS.UI.Flyout.show">
-                    /// Shows the Flyout, if hidden, regardless of other states.
-                    /// </summary>
-                    /// <param name="anchor" type="HTMLElement" domElement="true" locid="WinJS.UI.Flyout.show_p:anchor">
-                    /// The DOM element, or ID of a DOM element to anchor the Flyout, overriding the anchor property for this time only.
-                    /// </param>
-                    /// <param name="placement" type="Object" domElement="false" locid="WinJS.UI.Flyout.show_p:placement">
-                    /// The placement of the Flyout to the anchor: 'auto' (default), 'top', 'bottom', 'left', or 'right'.  This parameter overrides the placement property for this show only.
-                    /// </param>
-                    /// <param name="alignment" type="Object" domElement="false" locid="WinJS.UI.Flyout.show:alignment">
-                    /// For 'top' or 'bottom' placement, the alignment of the Flyout to the anchor's edge: 'center' (default), 'left', or 'right'.
-                    /// This parameter overrides the alignment property for this show only.
-                    /// </param>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                    this._writeProfilerMark("show,StartTM"); // The corresponding "stop" profiler mark is handled in _Overlay._baseEndShow().
-
-                    // Pick up defaults
-                    this._positionRequest = new PositionRequests.AnchorPositioning(
-                        anchor || this._anchor,
-                        placement || this._placement,
-                        alignment || this._alignment
-                    );
-
-                    this._show();
-                },
-
-                _show: function Flyout_show() {
-                    this._baseFlyoutShow();
-                },
-
-                /// <signature helpKeyword="WinJS.UI.Flyout.showAt">
-                /// <summary locid="WinJS.UI.Flyout.showAt">
-                /// Shows the Flyout, if hidden, at the specified (x,y) coordinates.
-                /// </summary>
-                /// <param name="coordinates" type="Object" locid="WinJS.UI.Flyout.showAt_p:coordinates">
-                /// An Object specifying the (X,Y) position to render the top left corner of the Flyout. commands to show.
-                /// The coordinates object may be a MouseEventObj, or an Object in the shape of {x:number, y:number}.
-                /// </param>
-                /// </signature>
-                showAt: function Flyout_showAt(coordinates) {
-                    this._writeProfilerMark("show,StartTM"); // The corresponding "stop" profiler mark is handled in _Overlay._baseEndShow().
-
-                    this._positionRequest = new PositionRequests.CoordinatePositioning(coordinates);
-
-                    this._show();
-                },
-
-                hide: function () {
-                    /// <signature helpKeyword="WinJS.UI.Flyout.hide">
-                    /// <summary locid="WinJS.UI.Flyout.hide">
-                    /// Hides the Flyout, if visible, regardless of other states.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                    // Just wrap the private one, turning off keyboard invoked flag
-                    this._writeProfilerMark("hide,StartTM"); // The corresponding "stop" profiler mark is handled in _Overlay._baseEndHide().
-                    this._hide();
-                },
-
-                _hide: function Flyout_hide() {
-
-                    // First close all subflyout descendants in the cascade.
-                    // Any calls to collapseFlyout through reentrancy should nop.
-                    Flyout._cascadeManager.collapseFlyout(this);
-
-                    if (this._baseHide()) {
-                        Flyout._cascadeManager.flyoutHiding(this);
-                    }
-                },
-
-                _beforeEndHide: function Flyout_beforeEndHide() {
-                    Flyout._cascadeManager.flyoutHidden(this);
-                },
-
-                _baseFlyoutShow: function Flyout_baseFlyoutShow() {
-                    if (this.disabled || this._disposed) {
-                        // Don't do anything.
-                        return;
-                    }
-
-                    // If we're animating (eg baseShow is going to fail), or the cascadeManager is in the middle of
-                    // updating the cascade, then don't mess up our current state.
-                    // Add this flyout to the correct position in the cascadingStack, first collapsing flyouts
-                    // in the current stack that are not anchored ancestors to this flyout.
-                    Flyout._cascadeManager.appendFlyout(this);
-
-                    // If we're animating (eg baseShow is going to fail), or the cascadeManager is in the
-                    // middle of updating the cascade, then we have to try again later.
-                    if (this._element.winAnimating) {
-                        // Queue us up to wait for the current animation to finish.
-                        // _checkDoNext() is always scheduled after the current animation completes.
-                        this._doNext = "show";
-                    } else if (Flyout._cascadeManager.reentrancyLock) {
-                        // Queue us up to wait for the current animation to finish.
-                        // Schedule a call to _checkDoNext() for when the cascadeManager unlocks.
-                        this._doNext = "show";
-                        var that = this;
-                        Flyout._cascadeManager.unlocked.then(function () { that._checkDoNext(); });
-                    } else {
-                        // We call our base _baseShow to handle the actual animation
-                        if (this._baseShow()) {
-                            // (_baseShow shouldn't ever fail because we tested winAnimating above).
-                            if (!_ElementUtilities.hasClass(this.element, "win-menu")) {
-                                // Verify that the firstDiv is in the correct location.
-                                // Move it to the correct location or add it if not.
-                                var _elms = this._element.getElementsByTagName("*");
-                                var firstDiv = this.element.querySelectorAll(".win-first");
-                                if (this.element.children.length && !_ElementUtilities.hasClass(this.element.children[0], _Constants.firstDivClass)) {
-                                    if (firstDiv && firstDiv.length > 0) {
-                                        firstDiv.item(0).parentNode.removeChild(firstDiv.item(0));
-                                    }
-
-                                    firstDiv = this._addFirstDiv();
-                                }
-                                firstDiv.tabIndex = _ElementUtilities._getLowestTabIndexInList(_elms);
-
-                                // Verify that the finalDiv is in the correct location.
-                                // Move it to the correct location or add it if not.
-                                var finalDiv = this.element.querySelectorAll(".win-final");
-                                if (!_ElementUtilities.hasClass(this.element.children[this.element.children.length - 1], _Constants.finalDivClass)) {
-                                    if (finalDiv && finalDiv.length > 0) {
-                                        finalDiv.item(0).parentNode.removeChild(finalDiv.item(0));
-                                    }
-
-                                    finalDiv = this._addFinalDiv();
-                                }
-                                finalDiv.tabIndex = _ElementUtilities._getHighestTabIndexInList(_elms);
-                            }
-
-                            Flyout._cascadeManager.flyoutShown(this);
-                        }
-                    }
-                },
-
-                _lightDismiss: function Flyout_lightDismiss() {
-                    Flyout._cascadeManager.collapseAll();
-                },
-
-                // Find our new flyout position.
-                _ensurePosition: function Flyout_ensurePosition() {
-                    this._keyboardMovedUs = false;
-
-                    // Remove old height restrictions and scrolling.
-                    this._clearAdjustedStyles();
-
-                    this._setAlignment();
-
-                    // Set up the new position, and prep the offset for showPopup.
-                    var flyoutMeasurements = measureElement(this._element);
-                    var isRtl = _ElementUtilities._getComputedStyle(this._element).direction === "rtl";
-                    this._currentPosition = this._positionRequest.getTopLeft(flyoutMeasurements, isRtl);
-
-                    // Adjust position
-                    if (this._currentPosition.top < 0) {
-                        // Overran bottom, attach to bottom.
-                        this._element.style.bottom = _Overlay._Overlay._keyboardInfo._visibleDocBottomOffset + "px";
-                        this._element.style.top = "auto";
-                    } else {
-                        // Normal, set top
-                        this._element.style.top = this._currentPosition.top + "px";
-                        this._element.style.bottom = "auto";
-                    }
-                    if (this._currentPosition.left < 0) {
-                        // Overran right, attach to right
-                        this._element.style.right = "0px";
-                        this._element.style.left = "auto";
-                    } else {
-                        // Normal, set left
-                        this._element.style.left = this._currentPosition.left + "px";
-                        this._element.style.right = "auto";
-                    }
-
-                    // Adjust height/scrollbar
-                    if (this._currentPosition.doesScroll) {
-                        _ElementUtilities.addClass(this._element, _Constants.scrollsClass);
-                        this._lastMaxHeight = this._element.style.maxHeight;
-                        this._element.style.maxHeight = this._currentPosition.contentHeight + "px";
-                    }
-
-                    // May need to adjust if the IHM is showing.
-                    if (_Overlay._Overlay._keyboardInfo._visible) {
-                        // Use keyboard logic
-                        this._checkKeyboardFit();
-
-                        if (this._keyboardMovedUs) {
-                            this._adjustForKeyboard();
-                        }
-                    }
-                },
-
-
-                _clearAdjustedStyles: function Flyout_clearAdjustedStyles() {
-                    // Move to 0,0 in case it is off screen, so that it lays out at a reasonable size
-                    this._element.style.top = "0px";
-                    this._element.style.bottom = "auto";
-                    this._element.style.left = "0px";
-                    this._element.style.right = "auto";
-
-                    // Clear height restrictons and scrollbar class
-                    _ElementUtilities.removeClass(this._element, _Constants.scrollsClass);
-                    if (this._lastMaxHeight !== null) {
-                        this._element.style.maxHeight = this._lastMaxHeight;
-                        this._lastMaxHeight = null;
-                    }
-
-                    // Clear Alignment
-                    _ElementUtilities.removeClass(this._element, "win-rightalign");
-                    _ElementUtilities.removeClass(this._element, "win-leftalign");
-                },
-
-                _setAlignment: function Flyout_setAlignment() {
-                    // Alignment
-                    switch (this._positionRequest.alignment) {
-                        case "left":
-                            _ElementUtilities.addClass(this._element, "win-leftalign");
-                            break;
-                        case "right":
-                            _ElementUtilities.addClass(this._element, "win-rightalign");
-                            break;
-                        default:
-                            break;
-                    }
-                },
-
-                _showingKeyboard: function Flyout_showingKeyboard(event) {
-                    if (this.hidden) {
-                        return;
-                    }
-
-                    // The only way that we can be showing a keyboard when a flyout is up is because the input was
-                    // in the flyout itself, in which case we'll be moving ourselves.  There is no practical way
-                    // for the application to override this as the focused element is in our flyout.
-                    event.ensuredFocusedElementInView = true;
-
-                    // See if the keyboard is going to force us to move
-                    this._checkKeyboardFit();
-
-                    if (this._keyboardMovedUs) {
-                        // Pop out immediately, then move to new spot
-                        this._element.style.opacity = 0;
-                        var that = this;
-                        _Global.setTimeout(function () { that._adjustForKeyboard(); that._baseAnimateIn(); }, _Overlay._Overlay._keyboardInfo._animationShowLength);
-                    }
-                },
-
-                _resize: function Flyout_resize() {
-                    // If hidden and not busy animating, then nothing to do
-                    if (!this.hidden || this._animating) {
-
-                        // This should only happen if the IHM is dismissing,
-                        // the only other way is for viewstate changes, which
-                        // would dismiss any flyout.
-                        if (this._needToHandleHidingKeyboard) {
-                            // Hiding keyboard, update our position, giving the anchor a chance to update first.
-                            var that = this;
-                            _BaseUtils._setImmediate(function () {
-                                if (!that.hidden || that._animating) {
-                                    that._ensurePosition();
-                                }
-                            });
-                            this._needToHandleHidingKeyboard = false;
-                        }
-                    }
-                },
-
-                // If you were not pinned to the bottom, you might have to be now.
-                _checkKeyboardFit: function Flyout_checkKeyboardFit() {
-                    // Special Flyout positioning rules to determine if the Flyout needs to adjust its
-                    // position because of the IHM. If the Flyout needs to adjust for the IHM, it will reposition
-                    // itself to be pinned to either the top or bottom edge of the visual viewport.
-                    // - Too Tall, above top, or below bottom.
-
-                    var keyboardMovedUs = false;
-                    var viewportHeight = _Overlay._Overlay._keyboardInfo._visibleDocHeight;
-                    var adjustedMarginBoxHeight = this._currentPosition.contentHeight + this._currentPosition.verticalMarginBorderPadding;
-                    if (adjustedMarginBoxHeight > viewportHeight) {
-                        // The Flyout is now too tall to fit in the viewport, pin to top and adjust height.
-                        keyboardMovedUs = true;
-                        this._currentPosition.top = _Constants.pinToBottomEdge;
-                        this._currentPosition.contentHeight = viewportHeight - this._currentPosition.verticalMarginBorderPadding;
-                        this._currentPosition.doesScroll = true;
-                    } else if (this._currentPosition.top >= 0 &&
-                        this._currentPosition.top + adjustedMarginBoxHeight > _Overlay._Overlay._keyboardInfo._visibleDocBottom) {
-                        // Flyout clips the bottom of the viewport. Pin to bottom.
-                        this._currentPosition.top = _Constants.pinToBottomEdge;
-                        keyboardMovedUs = true;
-                    } else if (this._currentPosition.top === _Constants.pinToBottomEdge) {
-                        // We were already pinned to the bottom, so our position on screen will change
-                        keyboardMovedUs = true;
-                    }
-
-                    // Signals use of basic fadein animation
-                    this._keyboardMovedUs = keyboardMovedUs;
-                },
-
-                _adjustForKeyboard: function Flyout_adjustForKeyboard() {
-                    // Keyboard moved us, update our metrics as needed
-                    if (this._currentPosition.doesScroll) {
-                        // Add scrollbar if we didn't already have scrollsClass
-                        if (!this._lastMaxHeight) {
-                            _ElementUtilities.addClass(this._element, _Constants.scrollsClass);
-                            this._lastMaxHeight = this._element.style.maxHeight;
-                        }
-                        // Adjust height
-                        this._element.style.maxHeight = this._currentPosition.contentHeight + "px";
-                    }
-
-                    // Update top/bottom
-                    this._checkScrollPosition(true);
-                },
-
-                _hidingKeyboard: function Flyout_hidingKeyboard() {
-                    // If we aren't visible and not animating, or haven't been repositioned, then nothing to do
-                    // We don't know if the keyboard moved the anchor, so _keyboardMovedUs doesn't help here
-                    if (!this.hidden || this._animating) {
-
-                        // Snap to the final position
-                        // We'll either just reveal the current space or resize the window
-                        if (_Overlay._Overlay._keyboardInfo._isResized) {
-                            // Flag resize that we'll need an updated position
-                            this._needToHandleHidingKeyboard = true;
-                        } else {
-                            // Not resized, update our final position, giving the anchor a chance to update first.
-                            var that = this;
-                            _BaseUtils._setImmediate(function () {
-                                if (!that.hidden || that._animating) {
-                                    that._ensurePosition();
-                                }
-                            });
-                        }
-                    }
-                },
-
-                _checkScrollPosition: function Flyout_checkScrollPosition(showing) {
-                    if (this.hidden && !showing) {
-                        return;
-                    }
-
-                    if (typeof this._currentPosition !== 'undefined') {
-                        // May need to adjust top by viewport offset
-                        if (this._currentPosition.top < 0) {
-                            // Need to attach to bottom
-                            this._element.style.bottom = _Overlay._Overlay._keyboardInfo._visibleDocBottomOffset + "px";
-                            this._element.style.top = "auto";
-                        } else {
-                            // Normal, attach to top
-                            this._element.style.top = this._currentPosition.top + "px";
-                            this._element.style.bottom = "auto";
-                        }
-                    }
-                },
-
-                // AppBar flyout animations
-                _flyoutAnimateIn: function Flyout_flyoutAnimateIn() {
-                    if (this._keyboardMovedUs) {
-                        return this._baseAnimateIn();
-                    } else {
-                        this._element.style.opacity = 1;
-                        this._element.style.visibility = "visible";
-                        return Animations.showPopup(this._element, (typeof this._currentPosition !== 'undefined') ? this._currentPosition.animOffset : 0);
-                    }
-                },
-
-                _flyoutAnimateOut: function Flyout_flyoutAnimateOut() {
-                    if (this._keyboardMovedUs) {
-                        return this._baseAnimateOut();
-                    } else {
-                        this._element.style.opacity = 0;
-                        return Animations.hidePopup(this._element, (typeof this._currentPosition !== 'undefined') ? this._currentPosition.animOffset : 0);
-                    }
-                },
-
-                // Hide all other flyouts besides this one
-                _hideAllOtherFlyouts: function Flyout_hideAllOtherFlyouts(thisFlyout) {
-                    var flyouts = _Global.document.querySelectorAll("." + _Constants.flyoutClass);
-                    for (var i = 0; i < flyouts.length; i++) {
-                        var flyoutControl = flyouts[i].winControl;
-                        if (flyoutControl && !flyoutControl.hidden && (flyoutControl !== thisFlyout)) {
-                            flyoutControl.hide();
-                        }
-                    }
-                },
-
-                _handleKeyDown: function Flyout_handleKeyDown(event) {
-                    if ((event.keyCode === Key.space || event.keyCode === Key.enter)
-                         && (this === _Global.document.activeElement)) {
-                        event.preventDefault();
-                        event.stopPropagation();
-                        this.winControl.hide();
-                    } else if (event.shiftKey && event.keyCode === Key.tab
-                          && this === _Global.document.activeElement
-                          && !event.altKey && !event.ctrlKey && !event.metaKey) {
-                        event.preventDefault();
-                        event.stopPropagation();
-                        this.winControl._focusOnLastFocusableElementOrThis();
-                    }
-                },
-
-                _handleFocusIn: function Flyout_handleFocusIn(event) {
-                    if (!this.element.contains(event.relatedTarget)) {
-                        Flyout._cascadeManager.handleFocusIntoFlyout(event);
-                    }
-                    // Else focus is only moving between elements in the flyout.
-                    // Doesn't need to be handled by cascadeManager.
-                },
-
-                // Create and add a new first div as the first child
-                _addFirstDiv: function Flyout_addFirstDiv() {
-                    var firstDiv = _Global.document.createElement("div");
-                    firstDiv.className = _Constants.firstDivClass;
-                    firstDiv.style.display = "inline";
-                    firstDiv.setAttribute("role", "menuitem");
-                    firstDiv.setAttribute("aria-hidden", "true");
-
-                    // add to beginning
-                    if (this._element.children[0]) {
-                        this._element.insertBefore(firstDiv, this._element.children[0]);
-                    } else {
-                        this._element.appendChild(firstDiv);
-                    }
-
-                    var that = this;
-                    _ElementUtilities._addEventListener(firstDiv, "focusin", function () { that._focusOnLastFocusableElementOrThis(); }, false);
-
-                    return firstDiv;
-                },
-
-                // Create and add a new final div as the last child
-                _addFinalDiv: function Flyout_addFinalDiv() {
-                    var finalDiv = _Global.document.createElement("div");
-                    finalDiv.className = _Constants.finalDivClass;
-                    finalDiv.style.display = "inline";
-                    finalDiv.setAttribute("role", "menuitem");
-                    finalDiv.setAttribute("aria-hidden", "true");
-
-                    this._element.appendChild(finalDiv);
-                    var that = this;
-                    _ElementUtilities._addEventListener(finalDiv, "focusin", function () { that._focusOnFirstFocusableElementOrThis(); }, false);
-
-                    return finalDiv;
-                },
-
-                _writeProfilerMark: function Flyout_writeProfilerMark(text) {
-                    _WriteProfilerMark("WinJS.UI.Flyout:" + this._id + ":" + text);
-                }
-            },
-            {
-                _cascadeManager: new _CascadeManager(),
-            });
-            return Flyout;
-        })
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/CommandingSurface/_Constants',["require", "exports"], function (require, exports) {
-    // CommandingSurface class names
-    exports.ClassNames = {
-        controlCssClass: "win-commandingsurface",
-        disposableCssClass: "win-disposable",
-        tabStopClass: "win-commandingsurface-tabstop",
-        contentClass: "win-commandingsurface-content",
-        actionAreaCssClass: "win-commandingsurface-actionarea",
-        actionAreaContainerCssClass: "win-commandingsurface-actionareacontainer",
-        overflowButtonCssClass: "win-commandingsurface-overflowbutton",
-        spacerCssClass: "win-commandingsurface-spacer",
-        ellipsisCssClass: "win-commandingsurface-ellipsis",
-        overflowAreaCssClass: "win-commandingsurface-overflowarea",
-        overflowAreaContainerCssClass: "win-commandingsurface-overflowareacontainer",
-        contentFlyoutCssClass: "win-commandingsurface-contentflyout",
-        menuCssClass: "win-menu",
-        menuContainsToggleCommandClass: "win-menu-containstogglecommand",
-        insetOutlineClass: "win-commandingsurface-insetoutline",
-        openingClass: "win-commandingsurface-opening",
-        openedClass: "win-commandingsurface-opened",
-        closingClass: "win-commandingsurface-closing",
-        closedClass: "win-commandingsurface-closed",
-        noneClass: "win-commandingsurface-closeddisplaynone",
-        minimalClass: "win-commandingsurface-closeddisplayminimal",
-        compactClass: "win-commandingsurface-closeddisplaycompact",
-        fullClass: "win-commandingsurface-closeddisplayfull",
-        overflowTopClass: "win-commandingsurface-overflowtop",
-        overflowBottomClass: "win-commandingsurface-overflowbottom",
-        commandHiddenClass: "win-commandingsurface-command-hidden",
-        commandPrimaryOverflownPolicyClass: "win-commandingsurface-command-primary-overflown",
-        commandSecondaryOverflownPolicyClass: "win-commandingsurface-command-secondary-overflown",
-        commandSeparatorHiddenPolicyClass: "win-commandingsurface-command-separator-hidden"
-    };
-    exports.EventNames = {
-        beforeOpen: "beforeopen",
-        afterOpen: "afteropen",
-        beforeClose: "beforeclose",
-        afterClose: "afterclose",
-        commandPropertyMutated: "_commandpropertymutated",
-    };
-    exports.actionAreaCommandWidth = 68;
-    exports.actionAreaSeparatorWidth = 34;
-    exports.actionAreaOverflowButtonWidth = 32;
-    exports.overflowCommandHeight = 44;
-    exports.overflowSeparatorHeight = 12;
-    exports.controlMinWidth = exports.actionAreaOverflowButtonWidth;
-    exports.overflowAreaMaxWidth = 480;
-    exports.heightOfMinimal = 24;
-    exports.heightOfCompact = 48;
-    exports.contentMenuCommandDefaultLabel = "Custom content";
-    exports.defaultClosedDisplayMode = "compact";
-    exports.defaultOpened = false;
-    exports.defaultOverflowDirection = "bottom";
-    // Constants for commands
-    exports.typeSeparator = "separator";
-    exports.typeContent = "content";
-    exports.typeButton = "button";
-    exports.typeToggle = "toggle";
-    exports.typeFlyout = "flyout";
-    exports.commandSelector = ".win-command";
-    exports.primaryCommandSection = "primary";
-    exports.secondaryCommandSection = "secondary";
-});
-
-define('WinJS/Controls/ToolBar/_Constants',["require", "exports", "../CommandingSurface/_Constants"], function (require, exports, _CommandingSurfaceConstants) {
-    // toolbar class names
-    exports.ClassNames = {
-        controlCssClass: "win-toolbar",
-        disposableCssClass: "win-disposable",
-        actionAreaCssClass: "win-toolbar-actionarea",
-        overflowButtonCssClass: "win-toolbar-overflowbutton",
-        spacerCssClass: "win-toolbar-spacer",
-        ellipsisCssClass: "win-toolbar-ellipsis",
-        overflowAreaCssClass: "win-toolbar-overflowarea",
-        contentFlyoutCssClass: "win-toolbar-contentflyout",
-        emptytoolbarCssClass: "win-toolbar-empty",
-        menuCssClass: "win-menu",
-        menuContainsToggleCommandClass: "win-menu-containstogglecommand",
-        openedClass: "win-toolbar-opened",
-        closedClass: "win-toolbar-closed",
-        compactClass: "win-toolbar-closeddisplaycompact",
-        fullClass: "win-toolbar-closeddisplayfull",
-        overflowTopClass: "win-toolbar-overflowtop",
-        overflowBottomClass: "win-toolbar-overflowbottom",
-        placeHolderCssClass: "win-toolbar-placeholder",
-    };
-    exports.EventNames = {
-        beforeOpen: "beforeopen",
-        afterOpen: "afteropen",
-        beforeClose: "beforeclose",
-        afterClose: "afterclose"
-    };
-    exports.OverflowDirection = {
-        top: "top",
-        bottom: "bottom",
-    };
-    exports.overflowAreaMaxWidth = _CommandingSurfaceConstants.overflowAreaMaxWidth;
-    exports.controlMinWidth = _CommandingSurfaceConstants.controlMinWidth;
-    exports.defaultClosedDisplayMode = "compact";
-    exports.defaultOpened = false;
-    // Constants for commands
-    exports.typeSeparator = "separator";
-    exports.typeContent = "content";
-    exports.typeButton = "button";
-    exports.typeToggle = "toggle";
-    exports.typeFlyout = "flyout";
-    exports.commandSelector = ".win-command";
-    exports.primaryCommandSection = "primary";
-    exports.secondaryCommandSection = "secondary";
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// Glyph Enumeration
-/// <dictionary>Segoe</dictionary>
-define('WinJS/Controls/AppBar/_Icon',[
-     'exports',
-     '../../Core/_Base',
-     '../../Core/_Resources'
-     ], function appBarIconInit(exports, _Base, _Resources) {
-    "use strict";
-
-    var glyphs = ["previous",
-                    "next",
-                    "play",
-                    "pause",
-                    "edit",
-                    "save",
-                    "clear",
-                    "delete",
-                    "remove",
-                    "add",
-                    "cancel",
-                    "accept",
-                    "more",
-                    "redo",
-                    "undo",
-                    "home",
-                    "up",
-                    "forward",
-                    "right",
-                    "back",
-                    "left",
-                    "favorite",
-                    "camera",
-                    "settings",
-                    "video",
-                    "sync",
-                    "download",
-                    "mail",
-                    "find",
-                    "help",
-                    "upload",
-                    "emoji",
-                    "twopage",
-                    "leavechat",
-                    "mailforward",
-                    "clock",
-                    "send",
-                    "crop",
-                    "rotatecamera",
-                    "people",
-                    "closepane",
-                    "openpane",
-                    "world",
-                    "flag",
-                    "previewlink",
-                    "globe",
-                    "trim",
-                    "attachcamera",
-                    "zoomin",
-                    "bookmarks",
-                    "document",
-                    "protecteddocument",
-                    "page",
-                    "bullets",
-                    "comment",
-                    "mail2",
-                    "contactinfo",
-                    "hangup",
-                    "viewall",
-                    "mappin",
-                    "phone",
-                    "videochat",
-                    "switch",
-                    "contact",
-                    "rename",
-                    "pin",
-                    "musicinfo",
-                    "go",
-                    "keyboard",
-                    "dockleft",
-                    "dockright",
-                    "dockbottom",
-                    "remote",
-                    "refresh",
-                    "rotate",
-                    "shuffle",
-                    "list",
-                    "shop",
-                    "selectall",
-                    "orientation",
-                    "import",
-                    "importall",
-                    "browsephotos",
-                    "webcam",
-                    "pictures",
-                    "savelocal",
-                    "caption",
-                    "stop",
-                    "showresults",
-                    "volume",
-                    "repair",
-                    "message",
-                    "page2",
-                    "calendarday",
-                    "calendarweek",
-                    "calendar",
-                    "characters",
-                    "mailreplyall",
-                    "read",
-                    "link",
-                    "accounts",
-                    "showbcc",
-                    "hidebcc",
-                    "cut",
-                    "attach",
-                    "paste",
-                    "filter",
-                    "copy",
-                    "emoji2",
-                    "important",
-                    "mailreply",
-                    "slideshow",
-                    "sort",
-                    "manage",
-                    "allapps",
-                    "disconnectdrive",
-                    "mapdrive",
-                    "newwindow",
-                    "openwith",
-                    "contactpresence",
-                    "priority",
-                    "uploadskydrive",
-                    "gototoday",
-                    "font",
-                    "fontcolor",
-                    "contact2",
-                    "folder",
-                    "audio",
-                    "placeholder",
-                    "view",
-                    "setlockscreen",
-                    "settile",
-                    "cc",
-                    "stopslideshow",
-                    "permissions",
-                    "highlight",
-                    "disableupdates",
-                    "unfavorite",
-                    "unpin",
-                    "openlocal",
-                    "mute",
-                    "italic",
-                    "underline",
-                    "bold",
-                    "movetofolder",
-                    "likedislike",
-                    "dislike",
-                    "like",
-                    "alignright",
-                    "aligncenter",
-                    "alignleft",
-                    "zoom",
-                    "zoomout",
-                    "openfile",
-                    "otheruser",
-                    "admin",
-                    "street",
-                    "map",
-                    "clearselection",
-                    "fontdecrease",
-                    "fontincrease",
-                    "fontsize",
-                    "cellphone",
-                    "print",
-                    "share",
-                    "reshare",
-                    "tag",
-                    "repeatone",
-                    "repeatall",
-                    "outlinestar",
-                    "solidstar",
-                    "calculator",
-                    "directions",
-                    "target",
-                    "library",
-                    "phonebook",
-                    "memo",
-                    "microphone",
-                    "postupdate",
-                    "backtowindow",
-                    "fullscreen",
-                    "newfolder",
-                    "calendarreply",
-                    "unsyncfolder",
-                    "reporthacked",
-                    "syncfolder",
-                    "blockcontact",
-                    "switchapps",
-                    "addfriend",
-                    "touchpointer",
-                    "gotostart",
-                    "zerobars",
-                    "onebar",
-                    "twobars",
-                    "threebars",
-                    "fourbars",
-                    "scan",
-                    "preview",
-                    "hamburger"];
-
-    // Provide properties to grab resources for each of the icons
-    /// <summary locid="WinJS.UI.AppBarIcon">
-    /// The AppBarIcon enumeration provides a set of glyphs for use with the AppBarCommand icon property.
-    /// </summary>
-    var icons = glyphs.reduce(function (fixedIcons, item) {
-       fixedIcons[item] = { get: function () { return _Resources._getWinJSString("ui/appBarIcons/" + item).value; } };
-       return fixedIcons;
-     }, {});
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI.AppBarIcon", icons);
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// AppBarCommand
-/// <dictionary>appbar,appbars,Flyout,Flyouts,onclick,Statics</dictionary>
-define('WinJS/Controls/AppBar/_Command',[
-    'exports',
-    '../../Core/_Global',
-    '../../Core/_WinRT',
-    '../../Core/_Base',
-    "../../Core/_BaseUtils",
-    '../../Core/_ErrorFromName',
-    "../../Core/_Events",
-    '../../Core/_Resources',
-    '../../Utilities/_Control',
-    '../../Utilities/_Dispose',
-    '../../Utilities/_ElementUtilities',
-    '../Flyout/_Overlay',
-    '../Tooltip',
-    '../_LegacyAppBar/_Constants',
-    './_Icon'
-], function appBarCommandInit(exports, _Global, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _Control, _Dispose, _ElementUtilities, _Overlay, Tooltip, _Constants, _Icon) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.AppBarCommand">
-        /// Represents a command to display in an AppBar.
-        /// </summary>
-        /// </field>
-        /// <icon src="ui_winjs.ui.appbarcommand.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.appbarcommand.16x16.png" width="16" height="16" />
-        /// <htmlSnippet><![CDATA[<button data-win-control="WinJS.UI.AppBarCommand" data-win-options="{type:'button',label:'Button'}"></button>]]></htmlSnippet>
-        /// <event name="commandvisibilitychanged" locid="WinJS.UI.AppBarCommand_e:commandvisibilitychanged">Raised after the hidden property has been programmatically changed.</event>
-        /// <part name="appBarCommand" class="win-command" locid="WinJS.UI.AppBarCommand_part:appBarCommand">The AppBarCommand control itself.</part>
-        /// <part name="appBarCommandIcon" class="win-commandicon" locid="WinJS.UI.AppBarCommand_part:appBarCommandIcon">The AppBarCommand's icon box.</part>
-        /// <part name="appBarCommandImage" class="win-commandimage" locid="WinJS.UI.AppBarCommand_part:appBarCommandImage">The AppBarCommand's icon's image formatting.</part>
-        /// <part name="appBarCommandLabel" class="win-label" locid="WinJS.UI.AppBarCommand_part:appBarCommandLabel">The AppBarCommand's label</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        AppBarCommand: _Base.Namespace._lazy(function () {
-
-            function _handleClick(event) {
-                /*jshint validthis: true */
-                var command = this.winControl;
-                if (command) {
-                    if (command._type === _Constants.typeToggle) {
-                        command.selected = !command.selected;
-                    } else if (command._type === _Constants.typeFlyout && command._flyout) {
-                        var flyout = command._flyout;
-                        // Flyout may not have processAll'd, so this may be a DOM object
-                        if (typeof flyout === "string") {
-                            flyout = _Global.document.getElementById(flyout);
-                        }
-                        if (!flyout.show) {
-                            flyout = flyout.winControl;
-                        }
-                        if (flyout && flyout.show) {
-                            flyout.show(this, "autovertical");
-                        }
-                    }
-                    if (command.onclick) {
-                        command.onclick(event);
-                    }
-                }
-            }
-
-            // Used by AppBarCommands to notify listeners that a property has changed.
-            var PropertyMutations = _Base.Class.define(function PropertyMutations_ctor() {
-                this._observer = _BaseUtils._merge({}, _Events.eventMixin);
-            }, {
-                bind: function (callback) {
-                    this._observer.addEventListener(_Constants.commandPropertyMutated, callback);
-                },
-                unbind: function (callback) {
-                    this._observer.removeEventListener(_Constants.commandPropertyMutated, callback);
-                },
-                dispatchEvent: function (type, detail) {
-                    this._observer.dispatchEvent(type, detail);
-                },
-            });
-
-            var strings = {
-                get ariaLabel() { return _Resources._getWinJSString("ui/appBarCommandAriaLabel").value; },
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; },
-                get badClick() { return "Invalid argument: The onclick property for an {0} must be a function"; },
-                get badDivElement() { return "Invalid argument: For a content command, the element must be null or a div element"; },
-                get badHrElement() { return "Invalid argument: For a separator, the element must be null or an hr element"; },
-                get badButtonElement() { return "Invalid argument: For a button, toggle, or flyout command, the element must be null or a button element"; },
-                get badPriority() { return "Invalid argument: the priority of an {0} must be a non-negative integer"; }
-            };
-
-            var AppBarCommand = _Base.Class.define(function AppBarCommand_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.AppBarCommand.AppBarCommand">
-                /// <summary locid="WinJS.UI.AppBarCommand.constructor">
-                /// Creates a new AppBarCommand control.
-                /// </summary>
-                /// <param name="element" domElement="true" locid="WinJS.UI.AppBarCommand.constructor_p:element">
-                /// The DOM element that will host the control. AppBarCommand will create one if null.
-                /// </param>
-                /// <param name="options" type="Object" locid="WinJS.UI.AppBarCommand.constructor_p:options">
-                /// The set of properties and values to apply to the new AppBarCommand.
-                /// </param>
-                /// <returns type="WinJS.UI.AppBarCommand" locid="WinJS.UI.AppBarCommand.constructor_returnValue">
-                /// The new AppBarCommand control.
-                /// </returns>
-                /// </signature>
-
-                // Check to make sure we weren't duplicated
-                if (element && element.winControl) {
-                    throw new _ErrorFromName("WinJS.UI.AppBarCommand.DuplicateConstruction", strings.duplicateConstruction);
-                }
-
-                this._disposed = false;
-
-                // Don't blow up if they didn't pass options
-                if (!options) {
-                    options = {};
-                }
-
-                // Need a type before we can create our element
-                if (!options.type) {
-                    this._type = _Constants.typeButton;
-                }
-
-                options.section = options.section || _Constants.sectionPrimary;
-
-                // Go ahead and create it, separator and content types look different than buttons
-                // Don't forget to use passed in element if one was provided.
-                this._element = element;
-
-                if (options.type === _Constants.typeContent) {
-                    this._createContent();
-                } else if (options.type === _Constants.typeSeparator) {
-                    this._createSeparator();
-                } else {
-                    // This will also set the icon & label
-                    this._createButton();
-                }
-                _ElementUtilities.addClass(this._element, "win-disposable");
-
-                // Remember ourselves
-                this._element.winControl = this;
-
-                // Attach our css class
-                _ElementUtilities.addClass(this._element, _Constants.appBarCommandClass);
-
-                if (options.onclick) {
-                    this.onclick = options.onclick;
-                }
-                // We want to handle some clicks
-                options.onclick = _handleClick;
-
-                _Control.setOptions(this, options);
-
-                if (this._type === _Constants.typeToggle && !options.selected) {
-                    this.selected = false;
-                }
-
-                // Set up pointerdown handler and clean up ARIA if needed
-                if (this._type !== _Constants.typeSeparator) {
-
-                    // Make sure we have an ARIA role
-                    var role = this._element.getAttribute("role");
-                    if (role === null || role === "" || role === undefined) {
-                        if (this._type === _Constants.typeToggle) {
-                            role = "checkbox";
-                        } else if (this._type === _Constants.typeContent) {
-                            role = "group";
-                        } else {
-                            role = "menuitem";
-                        }
-                        this._element.setAttribute("role", role);
-                        if (this._type === _Constants.typeFlyout) {
-                            this._element.setAttribute("aria-haspopup", true);
-                        }
-                    }
-                    // Label should've been set by label, but if it was missed for some reason:
-                    var label = this._element.getAttribute("aria-label");
-                    if (label === null || label === "" || label === undefined) {
-                        this._element.setAttribute("aria-label", strings.ariaLabel);
-                    }
-                }
-
-                this._propertyMutations = new PropertyMutations();
-                var that = this;
-                ObservablePropertyWhiteList.forEach(function (propertyName) {
-                    makeObservable(that, propertyName);
-                });
-            }, {
-                /// <field type="String" locid="WinJS.UI.AppBarCommand.id" helpKeyword="WinJS.UI.AppBarCommand.id" isAdvanced="true">
-                /// Gets or sets the ID of the AppBarCommand.
-                /// </field>
-                id: {
-                    get: function () {
-                        return this._element.id;
-                    },
-
-                    set: function (value) {
-                        // we allow setting first time only. otherwise we ignore it.
-                        if (value && !this._element.id) {
-                            this._element.id = value;
-                        }
-                    }
-                },
-
-                /// <field type="String" defaultValue="button" readonly="true" oamOptionsDatatype="WinJS.UI.AppBarCommand.type" locid="WinJS.UI.AppBarCommand.type" helpKeyword="WinJS.UI.AppBarCommand.type" isAdvanced="true">
-                /// Gets or sets the type of the AppBarCommand. Possible values are "button", "toggle", "flyout", "content" or "separator".
-                /// </field>
-                type: {
-                    get: function () {
-                        return this._type;
-                    },
-                    set: function (value) {
-                        // we allow setting first time only. otherwise we ignore it.
-                        if (!this._type) {
-                            if (value !== _Constants.typeContent && value !== _Constants.typeFlyout && value !== _Constants.typeToggle && value !== _Constants.typeSeparator) {
-                                this._type = _Constants.typeButton;
-                            } else {
-                                this._type = value;
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.AppBarCommand.label" helpKeyword="WinJS.UI.AppBarCommand.label">
-                /// Gets or sets the label of the AppBarCommand.
-                /// </field>
-                label: {
-                    get: function () {
-                        return this._label;
-                    },
-                    set: function (value) {
-                        this._label = value;
-                        if (this._labelSpan) {
-                            this._labelSpan.textContent = this.label;
-                        }
-
-                        // Ensure that we have a tooltip, by updating already-constructed tooltips.  Separators won't have these:
-                        if (!this.tooltip && this._tooltipControl) {
-                            this._tooltip = this.label;
-                            this._tooltipControl.innerHTML = this.label;
-                        }
-
-                        // Update aria-label
-                        this._element.setAttribute("aria-label", this.label);
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.AppBarCommand.icon" helpKeyword="WinJS.UI.AppBarCommand.icon">
-                /// Gets or sets the icon of the AppBarCommand.
-                /// </field>
-                icon: {
-                    get: function () {
-                        return this._icon;
-                    },
-                    set: function (value) {
-
-                        this._icon = _Icon[value] || value;
-
-                        if (this._imageSpan) {
-                            // If the icon's a single character, presume a glyph
-                            if (this._icon && this._icon.length === 1) {
-                                // Set the glyph
-                                this._imageSpan.textContent = this._icon;
-                                this._imageSpan.style.backgroundImage = "";
-                                this._imageSpan.style.msHighContrastAdjust = "";
-                                _ElementUtilities.addClass(this._imageSpan, "win-commandglyph");
-                            } else {
-                                // Must be an image, set that
-                                this._imageSpan.textContent = "";
-                                this._imageSpan.style.backgroundImage = this._icon;
-                                this._imageSpan.style.msHighContrastAdjust = "none";
-                                _ElementUtilities.removeClass(this._imageSpan, "win-commandglyph");
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.AppBarCommand.onclick" helpKeyword="WinJS.UI.AppBarCommand.onclick">
-                /// Gets or sets the function to invoke when the command is clicked.
-                /// </field>
-                onclick: {
-                    get: function () {
-                        return this._onclick;
-                    },
-                    set: function (value) {
-                        if (value && typeof value !== "function") {
-                            throw new _ErrorFromName("WinJS.UI.AppBarCommand.BadClick", _Resources._formatString(strings.badClick, "AppBarCommand"));
-                        }
-                        this._onclick = value;
-                    }
-                },
-
-                /// <field type="Number" locid="WinJS.UI.AppBarCommand.priority" helpKeyword="WinJS.UI.AppBarCommand.priority">
-                /// Gets or sets the priority of the command
-                /// </field>
-                priority: {
-                    get: function () {
-                        return this._priority;
-                    },
-                    set: function (value) {
-                        if (value === undefined || (typeof value === "number" && value >= 0)) {
-                            this._priority = value;
-                        } else {
-                            throw new _ErrorFromName("WinJS.UI.AppBarCommand.BadPriority", _Resources._formatString(strings.badPriority, "AppBarCommand"));
-                        }
-
-                    }
-                },
-
-                /// <field type="Object" locid="WinJS.UI.AppBarCommand.flyout" helpKeyword="WinJS.UI.AppBarCommand.flyout">
-                /// For flyout-type AppBarCommands, this property returns the WinJS.UI.Flyout that this command invokes.
-                /// When setting this property, you may also use the String ID of the flyout to invoke, the DOM object
-                /// for the flyout, or the WinJS.UI.Flyout object itself.
-                /// If the value is set to the String ID of the flyout to invoke, or the DOM object for the flyout, but this
-                /// has not been processed yet, the getter will return the DOM object until it is processed, and
-                /// subsequently return a flyout.
-                /// </field>
-                flyout: {
-                    get: function () {
-                        // Resolve it to the flyout
-                        var flyout = this._flyout;
-                        if (typeof flyout === "string") {
-                            flyout = _Global.document.getElementById(flyout);
-                        }
-                        // If it doesn't have a .element, then we need to getControl on it
-                        if (flyout && !flyout.element && flyout.winControl) {
-                            flyout = flyout.winControl;
-                        }
-
-                        return flyout;
-                    },
-                    set: function (value) {
-                        // Need to update aria-owns with the new ID.
-                        var id = value;
-                        if (id && typeof id !== "string") {
-                            // Our controls have .element properties
-                            if (id.element) {
-                                id = id.element;
-                            }
-                            // Hope it's a DOM element, get ID from DOM element
-                            if (id) {
-                                if (id.id) {
-                                    id = id.id;
-                                } else {
-                                    // No id, have to fake one
-                                    id.id = _ElementUtilities._uniqueID(id);
-                                    id = id.id;
-                                }
-                            }
-                        }
-                        if (typeof id === "string") {
-                            this._element.setAttribute("aria-owns", id);
-                        }
-
-                        // Remember it
-                        this._flyout = value;
-                    }
-                },
-
-                /// <field type="String" defaultValue="global" oamOptionsDatatype="WinJS.UI.AppBarCommand.section" locid="WinJS.UI.AppBarCommand.section" helpKeyword="WinJS.UI.AppBarCommand.section">
-                /// Gets or sets the section that the AppBarCommand is in. Possible values are "secondary" and "primary".
-                /// </field>
-                section: {
-                    get: function () {
-                        return this._section;
-                    },
-                    set: function (value) {
-                        // we allow settings section only one time
-                        if (!this._section || _WinRT.Windows.ApplicationModel.DesignMode.designModeEnabled) {
-                            this._setSection(value);
-                        }
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.AppBarCommand.tooltip" helpKeyword="WinJS.UI.AppBarCommand.tooltip">Gets or sets the tooltip text of the AppBarCommand.</field>
-                tooltip: {
-                    get: function () {
-                        return this._tooltip;
-                    },
-                    set: function (value) {
-                        this._tooltip = value;
-
-                        // Update already-constructed tooltips. Separators and content commands won't have these:
-                        if (this._tooltipControl) {
-                            this._tooltipControl.innerHTML = this._tooltip;
-                        }
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.AppBarCommand.selected" helpKeyword="WinJS.UI.AppBarCommand.selected">Set or get the selected state of a toggle button.</field>
-                selected: {
-                    get: function () {
-                        // Ensure it's a boolean because we're using the DOM element to keep in-sync
-                        return this._element.getAttribute("aria-checked") === "true";
-                    },
-                    set: function (value) {
-                        this._element.setAttribute("aria-checked", value);
-                    }
-                },
-
-                /// <field type="HTMLElement" domElement="true" readonly="true" hidden="true" locid="WinJS.UI.AppBarCommand.element" helpKeyword="WinJS.UI.AppBarCommand.element">
-                /// The DOM element that hosts the AppBarCommad.
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.AppBarCommand.disabled" helpKeyword="WinJS.UI.AppBarCommand.disabled">
-                /// Gets or sets a value that indicates whether the AppBarCommand is disabled. A value of true disables the AppBarCommand, and a value of false enables it.
-                /// </field>
-                disabled: {
-                    get: function () {
-                        // Ensure it's a boolean because we're using the DOM element to keep in-sync
-                        return !!this._element.disabled;
-                    },
-                    set: function (value) {
-                        this._element.disabled = value;
-                    }
-                },
-
-                /// <field type="Boolean" hidden="true" locid="WinJS.UI.AppBarCommand.hidden" helpKeyword="WinJS.UI.AppBarCommand.hidden">
-                /// Gets a value that indicates whether the AppBarCommand is hiding or in the process of becoming hidden.
-                /// A value of true indicates that the AppBarCommand is hiding or in the process of becoming hidden.
-                /// </field>
-                hidden: {
-                    get: function () {
-                        return _ElementUtilities.hasClass(this._element, _Constants.commandHiddenClass);
-                    },
-                    set: function (value) {
-                        if (value === this.hidden) {
-                            // No changes to make.
-                            return;
-                        }
-
-                        var wasHidden = this.hidden;
-
-                        if (value) {
-                            _ElementUtilities.addClass(this._element, _Constants.commandHiddenClass);
-                        } else {
-                            _ElementUtilities.removeClass(this._element, _Constants.commandHiddenClass);
-                        }
-
-                        if (!this._sendEvent(_Constants.commandVisibilityChanged)) {
-                            if (wasHidden) {
-                                _ElementUtilities.addClass(this._element, _Constants.commandHiddenClass);
-                            } else {
-                                _ElementUtilities.removeClass(this._element, _Constants.commandHiddenClass);
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="HTMLElement" domElement="true" locid="WinJS.UI.AppBarCommand.firstElementFocus" helpKeyword="WinJS.UI.AppBarCommand.firstElementFocus">
-                /// Gets or sets the HTMLElement within a "content" type AppBarCommand that should receive focus whenever focus moves via Home or the arrow keys,
-                /// from the previous AppBarCommand to the this AppBarCommand. Returns the AppBarCommand object's host element by default.
-                /// </field>
-                firstElementFocus: {
-                    get: function () {
-                        return this._firstElementFocus || this._lastElementFocus || this._element;
-                    },
-                    set: function (element) {
-                        // Arguments of null and this.element should treated the same to ensure that this.element is never a tabstop when either focus property has been set.
-                        this._firstElementFocus = (element === this.element) ? null : element;
-                        this._updateTabStop();
-                    }
-                },
-
-                /// <field type="HTMLElement" domElement="true" locid="WinJS.UI.AppBarCommand.lastElementFocus" helpKeyword="WinJS.UI.AppBarCommand.lastElementFocus">
-                /// Gets or sets the HTMLElement within a "content" type AppBarCommand that should receive focus whenever focus would move, via End or arrow keys,
-                /// from the next AppBarCommand to this AppBarCommand. Returns this AppBarCommand object's host element by default.
-                /// </field>
-                lastElementFocus: {
-                    get: function () {
-                        return this._lastElementFocus || this._firstElementFocus || this._element;
-                    },
-                    set: function (element) {
-                        // Arguments of null and this.element should treated the same to ensure that this.element is never a tabstop when either focus property has been set.
-                        this._lastElementFocus = (element === this.element) ? null : element;
-                        this._updateTabStop();
-                    }
-                },
-
-                dispose: function () {
-                    /// <signature helpKeyword="WinJS.UI.AppBarCommand.dispose">
-                    /// <summary locid="WinJS.UI.AppBarCommand.dispose">
-                    /// Disposes this control.
-                    /// </summary>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._disposed = true;
-
-                    if (this._tooltipControl) {
-                        this._tooltipControl.dispose();
-                    }
-
-                    if (this._type === _Constants.typeContent) {
-                        _Dispose.disposeSubTree(this.element);
-                    }
-                },
-
-                addEventListener: function (type, listener, useCapture) {
-                    /// <signature helpKeyword="WinJS.UI.AppBarCommand.addEventListener">
-                    /// <summary locid="WinJS.UI.AppBarCommand.addEventListener">
-                    /// Registers an event handler for the specified event.
-                    /// </summary>
-                    /// <param name="type" type="String" locid="WinJS.UI.AppBarCommand.addEventListener_p:type">
-                    /// Required. The name of the event to register.
-                    /// </param>
-                    /// <param name="listener" type="Function" locid="WinJS.UI.AppBarCommand.addEventListener_p:listener">Required. The event handler function to associate with this event.</param>
-                    /// <param name="useCapture" type="Boolean" locid="WinJS.UI.AppBarCommand.addEventListener_p:useCapture">
-                    /// Optional. Set to true to register the event handler for the capturing phase; otherwise, set to false to register the event handler for the bubbling phase.
-                    /// </param>
-                    /// </signature>
-                    return this._element.addEventListener(type, listener, useCapture);
-                },
-
-                removeEventListener: function (type, listener, useCapture) {
-                    /// <signature helpKeyword="WinJS.UI.AppBarCommand.removeEventListener">
-                    /// <summary locid="WinJS.UI.AppBarCommand.removeEventListener">
-                    /// Removes an event handler that the addEventListener method registered.
-                    /// </summary>
-                    /// <param name="type" type="String" locid="WinJS.UI.AppBarCommand.removeEventListener_p:type">Required. The name of the event to remove.</param>
-                    /// <param name="listener" type="Function" locid="WinJS.UI.AppBarCommand.removeEventListener_p:listener">Required. The event handler function to remove.</param>
-                    /// <param name="useCapture" type="Boolean" locid="WinJS.UI.AppBarCommand.removeEventListener_p:useCapture">
-                    /// Optional. Set to true to remove the capturing phase event handler; otherwise, set to false to remove the bubbling phase event handler.
-                    /// </param>
-                    /// </signature>
-                    return this._element.removeEventListener(type, listener, useCapture);
-                },
-
-                /// <field type="String" locid="WinJS.UI.AppBarCommand.extraClass" helpKeyword="WinJS.UI.AppBarCommand.extraClass" isAdvanced="true">Adds an extra CSS class during construction.</field>
-                extraClass: {
-                    get: function () {
-                        return this._extraClass;
-                    },
-                    set: function (value) {
-                        if (this._extraClass) {
-                            _ElementUtilities.removeClass(this._element, this._extraClass);
-                        }
-                        this._extraClass = value;
-                        _ElementUtilities.addClass(this._element, this._extraClass);
-                    }
-                },
-
-                _createContent: function AppBarCommand_createContent() {
-                    // Make sure there's an element
-                    if (!this._element) {
-                        this._element = _Global.document.createElement("div");
-                    } else {
-                        // Verify the element was a div
-                        if (this._element.tagName !== "DIV") {
-                            throw new _ErrorFromName("WinJS.UI.AppBarCommand.BadDivElement", strings.badDivElement);
-                        }
-                    }
-
-                    // If a tabIndex isnt set, default to 0;
-                    if (parseInt(this._element.getAttribute("tabIndex"), 10) !== this._element.tabIndex) {
-                        this._element.tabIndex = 0;
-                    }
-                },
-
-                _createSeparator: function AppBarCommand_createSeparator() {
-                    // Make sure there's an element
-                    if (!this._element) {
-                        this._element = _Global.document.createElement("hr");
-                    } else {
-                        // Verify the element was an hr
-                        if (this._element.tagName !== "HR") {
-                            throw new _ErrorFromName("WinJS.UI.AppBarCommand.BadHrElement", strings.badHrElement);
-                        }
-                    }
-                },
-
-                _createButton: function AppBarCommand_createButton() {
-                    // Make sure there's an element
-                    if (!this._element) {
-                        this._element = _Global.document.createElement("button");
-                    } else {
-                        // Verify the element was a button
-                        if (this._element.tagName !== "BUTTON") {
-                            throw new _ErrorFromName("WinJS.UI.AppBarCommand.BadButtonElement", strings.badButtonElement);
-                        }
-                        // Make sure it has a type="button"
-                        var type = this._element.getAttribute("type");
-                        if (type === null || type === "" || type === undefined) {
-                            this._element.setAttribute("type", "button");
-                        }
-                        this._element.innerHTML = "";
-                    }
-
-                    // AppBarCommand buttons need to look like this:
-                    //// <button type="button" onclick="" class="win-command win-global">
-                    ////      <span class="win-commandicon"><span class="win-commandimage">&#xE0D5;</span></span><span class="win-label">Command 1</span>
-                    //// Or This:
-                    ////      <span class="win-commandicon"><span class="win-commandimage" style="background-image:url('customimage.png')"></span></span><span class="win-label">Command 1</span>
-                    //// </button>
-                    this._element.type = "button";
-                    this._iconSpan = _Global.document.createElement("span");
-                    this._iconSpan.setAttribute("aria-hidden", "true");
-                    this._iconSpan.className = "win-commandicon";
-                    this._iconSpan.tabIndex = -1;
-                    this._element.appendChild(this._iconSpan);
-                    this._imageSpan = _Global.document.createElement("span");
-                    this._imageSpan.setAttribute("aria-hidden", "true");
-                    this._imageSpan.className = "win-commandimage";
-                    this._imageSpan.tabIndex = -1;
-                    this._iconSpan.appendChild(this._imageSpan);
-                    this._labelSpan = _Global.document.createElement("span");
-                    this._labelSpan.setAttribute("aria-hidden", "true");
-                    this._labelSpan.className = "win-label";
-                    this._labelSpan.tabIndex = -1;
-                    this._element.appendChild(this._labelSpan);
-                    // 'win-global' or 'win-selection' are added later by caller.
-                    // Label and icon are added later by caller.
-
-                    // Attach a tooltip - Note: we're going to stomp on it's setControl so we don't have to make another DOM element to hang it off of.
-                    // This private _tooltipControl attribute is used by other pieces, changing the name could break them.
-                    this._tooltipControl = new Tooltip.Tooltip(this._element);
-                },
-
-                _setSection: function AppBarCommand_setSection(section) {
-                    if (!section) {
-                        section = _Constants.sectionPrimary;
-                    }
-
-                    // _Constants.sectionSelection and _Constants.sectionGlobal are deprecated, so we will continue
-                    //  adding/removing its corresponding CSS class for app compat.
-                    // _Constants.sectionPrimary and _Constants.sectionSecondary no longer apply CSS classes to the
-                    // commands.
-
-                    if (this._section) {
-                        // Remove the old section class
-                        if (this._section === _Constants.sectionGlobal) {
-                            _ElementUtilities.removeClass(this._element, _Constants.appBarCommandGlobalClass);
-                        } else if (this.section === _Constants.sectionSelection) {
-                            _ElementUtilities.removeClass(this._element, _Constants.appBarCommandSelectionClass);
-                        }
-                    }
-                    // Add the new section class
-                    this._section = section;
-                    if (section === _Constants.sectionGlobal) {
-                        _ElementUtilities.addClass(this._element, _Constants.appBarCommandGlobalClass);
-                    } else if (section === _Constants.sectionSelection) {
-                        _ElementUtilities.addClass(this._element, _Constants.appBarCommandSelectionClass);
-                    }
-                },
-
-                _updateTabStop: function AppBarCommand_updateTabStop() {
-                    // Whenever the firstElementFocus or lastElementFocus properties are set for content type AppBarCommands,
-                    // the containing command element is no longer a tabstop.
-
-                    if (this._firstElementFocus || this._lastElementFocus) {
-                        this.element.tabIndex = -1;
-                    } else {
-                        this.element.tabIndex = 0;
-                    }
-                },
-
-                _isFocusable: function AppBarCommand_isFocusable() {
-                    return (!this.hidden && this._type !== _Constants.typeSeparator && !this.element.disabled &&
-                        (this.firstElementFocus.tabIndex >= 0 || this.lastElementFocus.tabIndex >= 0));
-                },
-
-                _sendEvent: function AppBarCommand_sendEvent(eventName, detail) {
-                    if (this._disposed) {
-                        return;
-                    }
-                    var event = _Global.document.createEvent("CustomEvent");
-                    event.initCustomEvent(eventName, true, true, (detail || {}));
-                    return this._element.dispatchEvent(event);
-                },
-            });
-
-
-            // The list of AppBarCommand properties that we care about firing an event 
-            // for, whenever they are changed after initial construction.
-            var ObservablePropertyWhiteList = [
-                "label",
-                "disabled",
-                "flyout",
-                "extraClass",
-                "selected",
-                "onclick",
-                "hidden",
-            ];
-
-            function makeObservable(command, propertyName) {
-                // Make a pre-existing AppBarCommand property observable by firing the "_commandpropertymutated"
-                // event whenever its value changes.
-
-                // Preserve initial value in JS closure variable
-                var _value = command[propertyName];
-
-                // Preserve original getter/setter if they exist, else use inline proxy functions.
-                var proto = command.constructor.prototype;
-                var originalDesc = getPropertyDescriptor(proto, propertyName) || {};
-                var getter = originalDesc.get.bind(command) || function getterProxy() {
-                    return _value;
-                };
-                var setter = originalDesc.set.bind(command) || function setterProxy(value) {
-                    _value = value;
-                };
-
-                // Define new observable Get/Set for propertyName on the command instance
-                Object.defineProperty(command, propertyName, {
-                    get: function observable_get() {
-                        return getter();
-                    },
-                    set: function observable_set(value) {
-
-                        var oldValue = getter();
-
-                        // Process value through the original setter & getter before deciding to send an event.
-                        setter(value);
-                        var newValue = getter();
-                        if (!this._disposed && oldValue !== value && oldValue !== newValue && !command._disposed) {
-
-                            command._propertyMutations.dispatchEvent(
-                                _Constants.commandPropertyMutated,
-                                {
-                                    command: command,
-                                    propertyName: propertyName,
-                                    oldValue: oldValue,
-                                    newValue: newValue,
-                                });
-                        }
-                    }
-                });
-            }
-
-            function getPropertyDescriptor(obj, propertyName) {
-                // Returns a matching property descriptor, or null, 
-                // if no matching descriptor is found.
-                var desc = null;
-                while (obj && !desc) {
-                    desc = Object.getOwnPropertyDescriptor(obj, propertyName);
-                    obj = Object.getPrototypeOf(obj);
-                    // Walk obj's prototype chain until we find a match.
-                }
-                return desc;
-            }
-
-            return AppBarCommand;
-        })
-    });
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        Command: _Base.Namespace._lazy(function () { return exports.AppBarCommand; })
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// Menu Command
-/// <dictionary>appbar,appbars,Flyout,Flyouts,onclick,Statics</dictionary>
-define('WinJS/Controls/Menu/_Command',[
-    'exports',
-    '../../Core/_Global',
-    '../../Core/_Base',
-    '../../Core/_ErrorFromName',
-    '../../Core/_Resources',
-    '../../Promise',
-    '../../Utilities/_Control',
-    '../../Utilities/_ElementUtilities',
-    '../_LegacyAppBar/_Constants',
-    '../Flyout/_Overlay',
-    '../Tooltip'
-], function menuCommandInit(exports, _Global, _Base, _ErrorFromName, _Resources, Promise, _Control, _ElementUtilities, _Constants, _Overlay, Tooltip) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.MenuCommand">
-        /// Represents a command to be displayed in a Menu. MenuCommand objects provide button, toggle button, flyout button,
-        /// or separator functionality for Menu controls.
-        /// </summary>
-        /// <compatibleWith platform="Windows" minVersion="8.0"/>
-        /// </field>
-        /// <icon src="ui_winjs.ui.menucommand.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.menucommand.16x16.png" width="16" height="16" />
-        /// <htmlSnippet><![CDATA[<button data-win-control="WinJS.UI.MenuCommand" data-win-options="{type:'button',label:'Button'}"></button>]]></htmlSnippet>
-        /// <part name="MenuCommand" class="win-command" locid="WinJS.UI.MenuCommand_name">The MenuCommand control itself</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        MenuCommand: _Base.Namespace._lazy(function () {
-
-            var strings = {
-                get ariaLabel() { return _Resources._getWinJSString("ui/menuCommandAriaLabel").value; },
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; },
-                get badClick() { return "Invalid argument: The onclick property for an {0} must be a function"; },
-                get badHrElement() { return "Invalid argument: For a separator, the element must be null or an hr element"; },
-                get badButtonElement() { return "Invalid argument: For a button, toggle, or flyout command, the element must be null or a button element"; }
-            };
-
-            var MenuCommand = _Base.Class.define(function MenuCommand_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.MenuCommand.MenuCommand">
-                /// <summary locid="WinJS.UI.MenuCommand.constructor">
-                /// Creates a new MenuCommand object.
-                /// </summary>
-                /// <param name="element" domElement="true" locid="WinJS.UI.MenuCommand.constructor_p:element">
-                /// The DOM element that will host the control.
-                /// </param>
-                /// <param name="options" type="Object" locid="WinJS.UI.MenuCommand.constructor_p:options">
-                /// The set of properties and values to apply to the new MenuCommand.
-                /// </param>
-                /// <returns type="WinJS.UI.MenuCommand" locid="WinJS.UI.MenuCommand.constructor_returnValue">
-                /// A MenuCommand control.
-                /// </returns>
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </signature>
-
-                // Check to make sure we weren't duplicated
-                if (element && element.winControl) {
-                    throw new _ErrorFromName("WinJS.UI.MenuCommand.DuplicateConstruction", strings.duplicateConstruction);
-                }
-
-                this._disposed = false;
-
-                // Don't blow up if they didn't pass options
-                if (!options) {
-                    options = {};
-                }
-
-                // Need a type before we can create our element
-                if (!options.type) {
-                    this._type = _Constants.typeButton;
-                }
-
-                // Go ahead and create it, separator types look different than buttons
-                // Don't forget to use passed in element if one was provided.
-                this._element = element;
-                if (options.type === _Constants.typeSeparator) {
-                    this._createSeparator();
-                } else {
-                    // This will also set the icon & label
-                    this._createButton();
-                }
-                _ElementUtilities.addClass(this._element, "win-disposable");
-
-                // Remember ourselves
-                this._element.winControl = this;
-
-                // Attach our css class
-                _ElementUtilities.addClass(this._element, _Constants.menuCommandClass);
-
-                if (!options.selected && options.type === _Constants.typeToggle) {
-                    // Make sure toggle's have selected false for CSS
-                    this.selected = false;
-                }
-
-                if (options.onclick) {
-                    this.onclick = options.onclick;
-                }
-                options.onclick = this._handleClick.bind(this);
-
-                _Control.setOptions(this, options);
-
-                // Set our options
-                if (this._type !== _Constants.typeSeparator) {
-                    // Make sure we have an ARIA role
-                    var role = this._element.getAttribute("role");
-                    if (role === null || role === "" || role === undefined) {
-                        role = "menuitem";
-                        if (this._type === _Constants.typeToggle) {
-                            role = "checkbox";
-                        }
-                        this._element.setAttribute("role", role);
-                        if (this._type === _Constants.typeFlyout) {
-                            this._element.setAttribute("aria-haspopup", true);
-                        }
-                    }
-                    var label = this._element.getAttribute("aria-label");
-                    if (label === null || label === "" || label === undefined) {
-                        this._element.setAttribute("aria-label", strings.ariaLabel);
-                    }
-                }
-
-            }, {
-                /// <field type="String" locid="WinJS.UI.MenuCommand.id" helpKeyword="WinJS.UI.MenuCommand.id" isAdvanced="true">
-                /// Gets the  ID of the MenuCommand.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                id: {
-                    get: function () {
-                        return this._element.id;
-                    },
-                    set: function (value) {
-                        // we allow setting first time only. otherwise we ignore it.
-                        if (!this._element.id) {
-                            this._element.id = value;
-                        }
-                    }
-                },
-
-                /// <field type="String" readonly="true" defaultValue="button" oamOptionsDatatype="WinJS.UI.MenuCommand.type" locid="WinJS.UI.MenuCommand.type" helpKeyword="WinJS.UI.MenuCommand.type" isAdvanced="true">
-                /// Gets the type of the MenuCommand. Possible values are "button", "toggle", "flyout", or "separator".
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                type: {
-                    get: function () {
-                        return this._type;
-                    },
-                    set: function (value) {
-                        // we allow setting first time only. otherwise we ignore it.
-                        if (!this._type) {
-                            if (value !== _Constants.typeButton && value !== _Constants.typeFlyout && value !== _Constants.typeToggle && value !== _Constants.typeSeparator) {
-                                value = _Constants.typeButton;
-                            }
-
-                            this._type = value;
-
-                            if (value === _Constants.typeButton) {
-                                _ElementUtilities.addClass(this.element, _Constants.menuCommandButtonClass);
-                            } else if (value === _Constants.typeFlyout) {
-                                _ElementUtilities.addClass(this.element, _Constants.menuCommandFlyoutClass);
-                                this.element.addEventListener("keydown", this._handleKeyDown.bind(this), false);
-                            } else if (value === _Constants.typeSeparator) {
-                                _ElementUtilities.addClass(this.element, _Constants.menuCommandSeparatorClass);
-                            } else if (value === _Constants.typeToggle) {
-                                _ElementUtilities.addClass(this.element, _Constants.menuCommandToggleClass);
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.MenuCommand.label" helpKeyword="WinJS.UI.MenuCommand.label">
-                /// The label of the MenuCommand
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                label: {
-                    get: function () {
-                        return this._label;
-                    },
-                    set: function (value) {
-                        this._label = value || "";
-                        if (this._labelSpan) {
-                            this._labelSpan.textContent = this.label;
-                        }
-
-                        // Update aria-label
-                        this._element.setAttribute("aria-label", this.label);
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.MenuCommand.onclick" helpKeyword="WinJS.UI.MenuCommand.onclick">
-                /// Gets or sets the function to invoke when the command is clicked.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                onclick: {
-                    get: function () {
-                        return this._onclick;
-                    },
-                    set: function (value) {
-                        if (value && typeof value !== "function") {
-                            throw new _ErrorFromName("WinJS.UI.MenuCommand.BadClick", _Resources._formatString(strings.badClick, "MenuCommand"));
-                        }
-                        this._onclick = value;
-                    }
-                },
-
-                /// <field type="Object" locid="WinJS.UI.MenuCommand.flyout" helpKeyword="WinJS.UI.MenuCommand.flyout">
-                /// For flyout type MenuCommands, this property  returns the WinJS.UI.Flyout that this command invokes. When setting this property, you can set
-                /// it to the string ID of the Flyout, the DOM object that hosts the Flyout, or the Flyout object itself.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                flyout: {
-                    get: function () {
-                        // Resolve it to the flyout
-                        var flyout = this._flyout;
-                        if (typeof flyout === "string") {
-                            flyout = _Global.document.getElementById(flyout);
-                        }
-                        // If it doesn't have a .element, then we need to getControl on it
-                        if (flyout && !flyout.element) {
-                            flyout = flyout.winControl;
-                        }
-
-                        return flyout;
-                    },
-                    set: function (value) {
-
-                        // Need to update aria-owns with the new ID.
-                        var id = value;
-                        if (id && typeof id !== "string") {
-                            // Our controls have .element properties
-                            if (id.element) {
-                                id = id.element;
-                            }
-                            // Hope it's a DOM element, get ID from DOM element
-                            if (id) {
-                                if (id.id) {
-                                    id = id.id;
-                                } else {
-                                    // No id, have to fake one
-                                    id.id = _ElementUtilities._uniqueID(id);
-                                    id = id.id;
-                                }
-                            }
-                        }
-                        if (typeof id === "string") {
-                            this._element.setAttribute("aria-owns", id);
-                        }
-
-                        if (this._flyout !== value) {
-                            MenuCommand._deactivateFlyoutCommand(this);
-                        }
-
-                        // Remember it
-                        this._flyout = value;
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.AppBarCommand.tooltip" helpKeyword="WinJS.UI.AppBarCommand.tooltip">Gets or sets the tooltip text of the AppBarCommand.</field>
-                tooltip: {
-                    get: function () {
-                        return this._tooltip;
-                    },
-                    set: function (value) {
-                        this._tooltip = value;
-
-                        // Update already-constructed tooltips. Separators and content commands won't have these:
-                        if (this._tooltipControl) {
-                            this._tooltipControl.innerHTML = this._tooltip;
-                        }
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.MenuCommand.selected" helpKeyword="WinJS.UI.MenuCommand.selected">
-                /// Gets or sets the selected state of a toggle button. This property is true if the toggle button is selected; otherwise, it's false.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                selected: {
-                    get: function () {
-                        // Ensure it's a boolean because we're using the DOM element to keep in-sync
-                        return this._element.getAttribute("aria-checked") === "true";
-                    },
-                    set: function (value) {
-                        this._element.setAttribute("aria-checked", !!value);
-                    }
-                },
-
-                /// <field type="HTMLElement" domElement="true" readonly="true" hidden="true" locid="WinJS.UI.MenuCommand.element" helpKeyword="WinJS.UI.MenuCommand.element">
-                /// Gets the DOM element that hosts this MenuCommand.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.MenuCommand.disabled" helpKeyword="WinJS.UI.MenuCommand.disabled">
-                /// Gets or sets a value that indicates whether the MenuCommand is disabled. This value is true if the MenuCommand is disabled; otherwise, false.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                disabled: {
-                    get: function () {
-                        // Ensure it's a boolean because we're using the DOM element to keep in-sync
-                        return !!this._element.disabled;
-                    },
-                    set: function (value) {
-                        value = !!value;
-                        if (value && this.type === _Constants.typeFlyout) {
-                            MenuCommand._deactivateFlyoutCommand(this);
-                        }
-                        this._element.disabled = value;
-                    }
-                },
-
-                /// <field type="Boolean" hidden="true" locid="WinJS.UI.MenuCommand.hidden" helpKeyword="WinJS.UI.MenuCommand.hidden">
-                /// Determine if a command is currently hidden.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                hidden: {
-                    get: function () {
-                        // Ensure it's a boolean because we're using the DOM element to keep in-sync
-                        return this._element.style.visibility === "hidden";
-                    },
-                    set: function (value) {
-                        var menuControl = _Overlay._Overlay._getParentControlUsingClassName(this._element, _Constants.menuClass);
-                        if (menuControl && !menuControl.hidden) {
-                            throw new _ErrorFromName("WinJS.UI.MenuCommand.CannotChangeHiddenProperty", _Resources._formatString(_Overlay._Overlay.commonstrings.cannotChangeHiddenProperty, "Menu"));
-                        }
-
-                        var style = this._element.style;
-                        if (value) {
-                            if (this.type === _Constants.typeFlyout) {
-                                MenuCommand._deactivateFlyoutCommand(this);
-                            }
-                            style.visibility = "hidden";
-                            style.display = "none";
-                        } else {
-                            style.visibility = "";
-                            style.display = "block";
-                        }
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.MenuCommand.extraClass" isAdvanced="true" helpKeyword="WinJS.UI.MenuCommand.extraClass">
-                /// Gets or sets the extra CSS class that is applied to the host DOM element.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                extraClass: {
-                    get: function () {
-                        return this._extraClass;
-                    },
-                    set: function (value) {
-                        if (this._extraClass) {
-                            _ElementUtilities.removeClass(this._element, this._extraClass);
-                        }
-                        this._extraClass = value;
-                        _ElementUtilities.addClass(this._element, this._extraClass);
-                    }
-                },
-
-
-                dispose: function () {
-                    /// <signature helpKeyword="WinJS.UI.MenuCommand.dispose">
-                    /// <summary locid="WinJS.UI.MenuCommand.dispose">
-                    /// Disposes this control.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._disposed = true;
-                    
-                    if (this._tooltipControl) {
-                        this._tooltipControl.dispose();
-                    }
-                },
-
-                addEventListener: function (type, listener, useCapture) {
-                    /// <signature helpKeyword="WinJS.UI.MenuCommand.addEventListener">
-                    /// <summary locid="WinJS.UI.MenuCommand.addEventListener">
-                    /// Registers an event handler for the specified event.
-                    /// </summary>
-                    /// <param name="type" type="String" locid="WinJS.UI.MenuCommand.addEventListener_p:type">The name of the event to register.</param>
-                    /// <param name="listener" type="Function" locid="WinJS.UI.MenuCommand.addEventListener_p:listener">The function that handles the event.</param>
-                    /// <param name="useCapture" type="Boolean" locid="WinJS.UI.MenuCommand.addEventListener_p:useCapture">
-                    /// Set to true to register the event handler for the capturing phase; otherwise, set to false to register the  event handler for the bubbling phase.
-                    /// </param>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                    return this._element.addEventListener(type, listener, useCapture);
-                },
-
-                removeEventListener: function (type, listener, useCapture) {
-                    /// <signature helpKeyword="WinJS.UI.MenuCommand.removeEventListener">
-                    /// <summary locid="WinJS.UI.MenuCommand.removeEventListener">
-                    /// Removes the specified event handler that the addEventListener method registered.
-                    /// </summary>
-                    /// <param name="type" type="String" locid="WinJS.UI.MenuCommand.removeEventListener_p:type">The name of the event to remove.</param>
-                    /// <param name="listener" type="Function" locid="WinJS.UI.MenuCommand.removeEventListener_p:listener">The event handler function to remove.</param>
-                    /// <param name="useCapture" type="Boolean" locid="WinJS.UI.MenuCommand.removeEventListener_p:useCapture">
-                    /// Set to true to remove the capturing phase event handler; set to false to remove the bubbling phase event handler.
-                    /// </param>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                    return this._element.removeEventListener(type, listener, useCapture);
-                },
-
-                // Private properties
-                _createSeparator: function MenuCommand_createSeparator() {
-                    // Make sure there's an input element
-                    if (!this._element) {
-                        this._element = _Global.document.createElement("hr");
-                    } else {
-                        // Verify the input was an hr
-                        if (this._element.tagName !== "HR") {
-                            throw new _ErrorFromName("WinJS.UI.MenuCommand.BadHrElement", strings.badHrElement);
-                        }
-                    }
-                },
-
-                _createButton: function MenuCommand_createButton() {
-                    // Make sure there's an element
-                    if (!this._element) {
-                        this._element = _Global.document.createElement("button");
-                    } else {
-                        // Verify the input was a button
-                        if (this._element.tagName !== "BUTTON") {
-                            throw new _ErrorFromName("WinJS.UI.MenuCommand.BadButtonElement", strings.badButtonElement);
-                        }
-                    }
-
-                    // Create our inner HTML. We will set aria values on the button itself further down in the constructor.
-                    this._element.innerHTML =
-                        '<div class="win-menucommand-liner">' +
-                            '<span class="win-toggleicon" aria-hidden="true"></span>' +
-                            '<span class="win-label" aria-hidden="true"></span>' +
-                            '<span class="win-flyouticon" aria-hidden="true"></span>' +
-                        '</div>';
-                    this._element.type = "button";
-
-                    // The purpose of menuCommandLiner is to lay out the MenuCommand's children in a flexbox. Ideally, this flexbox would
-                    // be on MenuCommand.element. However, firefox lays out buttons with display:flex differently.
-                    // Firefox bug 1014285 (Button with display:inline-flex doesn't layout properly)
-                    // https://bugzilla.mozilla.org/show_bug.cgi?id=1014285
-                    this._menuCommandLiner = this._element.firstElementChild;
-                    this._toggleSpan = this._menuCommandLiner.firstElementChild;
-                    this._labelSpan = this._toggleSpan.nextElementSibling;
-                    this._flyoutSpan = this._labelSpan.nextElementSibling;
-
-                    // Attach a tooltip - Note: we're going to stomp on it's setControl so we don't have to make another DOM element to hang it off of.
-                    // This private _tooltipControl attribute is used by other pieces, changing the name could break them.
-                    this._tooltipControl = new Tooltip.Tooltip(this._element);
-                },
-                _sendEvent: function MenuCommand_sendEvent(eventName, detail) {
-                    if (!this._disposed) {
-                        var event = _Global.document.createEvent("CustomEvent");
-                        event.initCustomEvent(eventName, true, true, (detail || {}));
-                        this._element.dispatchEvent(event);
-                    }
-                },
-
-                _invoke: function MenuCommand_invoke(event) {
-                    if (!this.hidden && !this.disabled && !this._disposed) {
-                        if (this._type === _Constants.typeToggle) {
-                            this.selected = !this.selected;
-                        } else if (this._type === _Constants.typeFlyout) {
-                            MenuCommand._activateFlyoutCommand(this);
-                        }
-
-                        if (event && event.type === "click" && this.onclick) {
-                            this.onclick(event);
-                        }
-
-                        // Bubble private 'invoked' event to Menu
-                        this._sendEvent(_Constants._menuCommandInvokedEvent, { command: this });
-                    }
-                },
-
-                _handleClick: function MenuCommand_handleClick(event) {
-                    this._invoke(event);
-                },
-
-                _handleKeyDown: function MenuCommand_handleKeyDown(event) {
-                    var Key = _ElementUtilities.Key,
-                        rtl = _ElementUtilities._getComputedStyle(this.element).direction === "rtl",
-                        rightKey = rtl ? Key.leftArrow : Key.rightArrow;
-
-                    if (event.keyCode === rightKey && this.type === _Constants.typeFlyout) {
-                        this._invoke(event);
-
-                        // Prevent the page from scrolling
-                        event.preventDefault();
-                    }
-                },
-            }, {
-                // Statics
-                _activateFlyoutCommand: function MenuCommand_activateFlyoutCommand(menuCommand) {
-                    // Activates the associated Flyout command and returns a promise once complete.
-                    // A command is considered to be activated once the proper CSS class has been applied and its associated flyout has finished showing.
-                    return new Promise(function (c, e) {
-                        menuCommand = menuCommand.winControl || menuCommand;
-                        var subFlyout = menuCommand.flyout;
-                        // Flyout may not have processAll'd, so this may be a DOM object
-                        if (subFlyout && subFlyout.hidden && subFlyout.show) {
-
-                            // Add activation state to the command.
-                            _ElementUtilities.addClass(menuCommand.element, _Constants.menuCommandFlyoutActivatedClass);
-                            subFlyout.element.setAttribute("aria-expanded", "true");
-                            subFlyout.addEventListener("beforehide", function beforeHide() {
-                                // Remove activation state from the command if the flyout is ever hidden.
-                                subFlyout.removeEventListener("beforehide", beforeHide, false);
-                                _ElementUtilities.removeClass(menuCommand.element, _Constants.menuCommandFlyoutActivatedClass);
-                                subFlyout.element.removeAttribute("aria-expanded");
-                            }, false);
-
-                            subFlyout.addEventListener("aftershow", function afterShow() {
-                                subFlyout.removeEventListener("aftershow", afterShow, false);
-
-                                // We are considered activated once we start showing the flyout.
-                                c();
-                            }, false);
-
-                            subFlyout.show(menuCommand, "_cascade");
-                        } else {
-                            // Could not change command to activated state.
-                            e();
-                        }
-                    });
-                },
-
-                _deactivateFlyoutCommand: function MenuCommand_deactivateFlyoutCommand(menuCommand) {
-                    // Deactivates the associated Flyout command and returns a promise once complete.
-                    // A command is considered to be deactivated once the proper CSS class has been removed and its associated flyout has finished hiding.
-                    return new Promise(function (c) {
-                        menuCommand = menuCommand.winControl || menuCommand;
-                        _ElementUtilities.removeClass(menuCommand.element, _Constants.menuCommandFlyoutActivatedClass);
-
-                        var subFlyout = menuCommand.flyout;
-                        // Flyout may not have processAll'd, so this may be a DOM object.
-                        if (subFlyout && !subFlyout.hidden && subFlyout.hide) {
-
-                            subFlyout.addEventListener("afterhide", function afterHide() {
-                                subFlyout.removeEventListener("afterhide", afterHide, false);
-                                c();
-                            }, false);
-
-                            // Leverage pre-existing "beforehide" listener already set on the Flyout for clearing the command's activated state.
-                            // The "beforehide" listener is expected to have been added to the Flyout in the call to _activateFlyoutCommand.
-                            subFlyout.hide();
-                        } else {
-                            // subFlyout does not need to be hidden.
-                            c();
-                        }
-                    });
-                },
-            });
-            return MenuCommand;
-        })
-    });
-
-});
-
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-var __extends = this.__extends || function (d, b) {
-    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
-    function __() { this.constructor = d; }
-    __.prototype = b.prototype;
-    d.prototype = new __();
-};
-define('WinJS/Controls/CommandingSurface/_MenuCommand',["require", "exports", "../Menu/_Command"], function (require, exports, _MenuCommandBase) {
-    var _MenuCommand = (function (_super) {
-        __extends(_MenuCommand, _super);
-        function _MenuCommand(element, options) {
-            if (options && options.beforeInvoke) {
-                this._beforeInvoke = options.beforeInvoke;
-            }
-            _super.call(this, element, options);
-        }
-        _MenuCommand.prototype._invoke = function (event) {
-            this._beforeInvoke && this._beforeInvoke(event);
-            _super.prototype._invoke.call(this, event);
-        };
-        return _MenuCommand;
-    })(_MenuCommandBase.MenuCommand);
-    exports._MenuCommand = _MenuCommand;
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <reference path="../../../../typings/require.d.ts" />
-define('WinJS/Utilities/_OpenCloseMachine',["require", "exports", '../Core/_Global', '../Promise', '../_Signal'], function (require, exports, _Global, Promise, _Signal) {
-    "use strict";
-    // This module provides a state machine which is designed to be used by controls which need to
-    // open, close, and fire related events (e.g. beforeopen, afterclose). The state machine handles
-    // many edge cases. For example, what happens if:
-    //  - open is called when we're already opened?
-    //  - close is called while we're in the middle of opening?
-    //  - dispose is called while we're in the middle of firing beforeopen?
-    // The state machine takes care of all of these edge cases so that the control doesn't have to.
-    // The control is responible for knowing how to play its open/close animations and update its DOM.
-    // The state machine is responsible for ensuring that these things happen at the appropriate times.
-    // This module is broken up into 3 major pieces:
-    //   - OpenCloseMachine: Controls should instantiate one of these. The machine keeps track of the
-    //     current state and has methods for forwarding calls to the current state.
-    //   - IOpenCloseControl: Controls must provide an object which implements this interface. The
-    //     interface gives the machine hooks for invoking the control's open and close animations.
-    //   - States: The various states (e.g. Closed, Opened, Opening) that the machine can be in. Each
-    //     implements IOpenCloseState.
-    // Example usage:
-    //   class MyControl {
-    //       element: HTMLElement;
-    //       private _machine: OpenCloseMachine;
-    //
-    //       constructor(element?: HTMLElement, options: any = {}) {
-    //           this.element = element || document.createElement("div");
-    //
-    //           // Create the machine.
-    //           this._machine = new OpenCloseMachine({
-    //               eventElement: this.element,
-    //               onOpen: (): Promise<any> => {
-    //                   // Do the work to render the contol in its opened state with an animation.
-    //                   // Return the animation promise.
-    //               },
-    //               onClose: (): Promise<any> => {
-    //                   // Do the work to render the contol in its closed state with an animation.
-    //                   // Return the animation promise.
-    //               },
-    //               onUpdateDom() {
-    //                   // Do the work to render the internal state of the control to the DOM. If a
-    //                   // control restricts all its DOM modifications to onUpdateDom, the state machine
-    //                   // can guarantee that the control won't modify its DOM while it is animating.
-    //               },
-    //               onUpdateDomWithIsOpened: (isOpened: boolean ) => {
-    //                   // Do the same work as onUpdateDom but ensure that the DOM is rendered with either
-    //                   // the opened or closed visual as dictacted by isOpened. The control should have some
-    //                   // internal state to track whether it is currently opened or closed. Treat this as a
-    //                   // cue to mutate that internal state to reflect the value of isOpened.
-    //               },
-    //           });
-    //
-    //           // Initialize the control. During this time, the machine will not ask the control to
-    //           // play any animations or update its DOM.
-    //           this.opened = true;
-    //           _Control.setOptions(this, options);
-    //
-    //           // Tell the machine the control is initialized. After this, the machine will start asking
-    //           // the control to play animations and update its DOM as appropriate.
-    //           this._machine.exitInit();
-    //       }
-    //
-    //       get opened() {
-    //           return this._machine.opened;
-    //       }
-    //       set opened(value: boolean) {
-    //           this._machine.opened = value;
-    //       }
-    //       open() {
-    //           this._machine.open();
-    //       }
-    //       close() {
-    //           this._machine.close();
-    //       }
-    //       forceLayout() {
-    //           this._machine.updateDom();
-    //       }
-    //       dispose() {
-    //           this._machine.dispose();
-    //       }
-    //   }
-    var EventNames = {
-        beforeOpen: "beforeopen",
-        afterOpen: "afteropen",
-        beforeClose: "beforeclose",
-        afterClose: "afterclose",
-        // Private events
-        // Indicates that the OpenCloseMachine has settled either into the Opened state
-        // or Closed state. This is more comprehensive than the "afteropen" and "afterclose"
-        // events because it fires even if the machine has reached the state due to:
-        //   - Exiting the Init state
-        //   - The beforeopen/beforeclose events being canceled
-        _openCloseStateSettled: "_openCloseStateSettled"
-    };
-    //
-    // OpenCloseMachine
-    //
-    var OpenCloseMachine = (function () {
-        //
-        // Methods called by the control
-        //
-        // When the machine is created, it sits in the Init state. When in the Init state, calls to
-        // updateDom will be postponed until the machine exits the Init state. Consequently, while in
-        // this state, the control can feel free to call updateDom as many times as it wants without
-        // worrying about it being expensive due to updating the DOM many times. The control should call
-        // *exitInit* to move the machine out of the Init state.
-        function OpenCloseMachine(args) {
-            this._control = args;
-            this._initializedSignal = new _Signal();
-            this._disposed = false;
-            this._setState(States.Init);
-        }
-        // Moves the machine out of the Init state and into the Opened or Closed state depending on whether
-        // open or close was called more recently.
-        OpenCloseMachine.prototype.exitInit = function () {
-            this._initializedSignal.complete();
-        };
-        // These method calls are forwarded to the current state.
-        OpenCloseMachine.prototype.updateDom = function () {
-            this._state.updateDom();
-        };
-        OpenCloseMachine.prototype.open = function () {
-            this._state.open();
-        };
-        OpenCloseMachine.prototype.close = function () {
-            this._state.close();
-        };
-        Object.defineProperty(OpenCloseMachine.prototype, "opened", {
-            get: function () {
-                return this._state.opened;
-            },
-            set: function (value) {
-                if (value) {
-                    this.open();
-                }
-                else {
-                    this.close();
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        // Puts the machine into the Disposed state.
-        OpenCloseMachine.prototype.dispose = function () {
-            this._setState(States.Disposed);
-            this._disposed = true;
-            this._control = null;
-        };
-        //
-        // Methods called by states
-        //
-        OpenCloseMachine.prototype._setState = function (NewState, arg0) {
-            if (!this._disposed) {
-                this._state && this._state.exit();
-                this._state = new NewState();
-                this._state.machine = this;
-                this._state.enter(arg0);
-            }
-        };
-        // Triggers arbitrary app code
-        OpenCloseMachine.prototype._fireEvent = function (eventName, options) {
-            options = options || {};
-            var detail = options.detail || null;
-            var cancelable = !!options.cancelable;
-            var eventObject = _Global.document.createEvent("CustomEvent");
-            eventObject.initCustomEvent(eventName, true, cancelable, detail);
-            return this._control.eventElement.dispatchEvent(eventObject);
-        };
-        // Triggers arbitrary app code
-        OpenCloseMachine.prototype._fireBeforeOpen = function () {
-            return this._fireEvent(EventNames.beforeOpen, {
-                cancelable: true
-            });
-        };
-        // Triggers arbitrary app code
-        OpenCloseMachine.prototype._fireBeforeClose = function () {
-            return this._fireEvent(EventNames.beforeClose, {
-                cancelable: true
-            });
-        };
-        return OpenCloseMachine;
-    })();
-    exports.OpenCloseMachine = OpenCloseMachine;
-    //
-    // States (each implements IOpenCloseState)
-    //
-    // WinJS animation promises always complete successfully. This
-    // helper allows an animation promise to complete in the canceled state
-    // so that the success handler can be skipped when the animation is
-    // interrupted.
-    function cancelablePromise(animationPromise) {
-        return Promise._cancelBlocker(animationPromise, function () {
-            animationPromise.cancel();
-        });
-    }
-    // Noop function, used in the various states to indicate that they don't support a given
-    // message. Named with the somewhat cute name '_' because it reads really well in the states.
-    function _() {
-    }
-    // Implementing the control as a state machine helps us correctly handle:
-    //   - re-entrancy while firing events
-    //   - calls into the control during asynchronous operations (e.g. animations)
-    //
-    // Many of the states do their "enter" work within a promise chain. The idea is that if
-    // the state is interrupted and exits, the rest of its work can be skipped by canceling
-    // the promise chain.
-    // An interesting detail is that anytime the state may trigger app code (e.g. due to
-    // firing an event), the current promise must end and a new promise must be chained off of it.
-    // This is necessary because the app code may interact with the control and cause it to
-    // change states. If we didn't create a new promise, then the very next line of code that runs
-    // after triggering app code may not be valid because the state may have exited. Starting a
-    // new promise after each triggering of app code prevents us from having to worry about this
-    // problem. In this configuration, when a promise's success handler runs, it guarantees that
-    // the state hasn't exited.
-    // For similar reasons, each of the promise chains created in "enter" starts off with a _Signal
-    // which is completed at the end of the "enter" function (this boilerplate is abstracted away by
-    // the "interruptible" function). The reason is that we don't want any of the code in "enter"
-    // to run until the promise chain has been stored in a variable. If we didn't do this (e.g. instead,
-    // started the promise chain with Promise.wrap()), then the "enter" code could trigger the "exit"
-    // function (via app code) before the promise chain had been stored in a variable. Under these
-    // circumstances, the promise chain would be uncancelable and so the "enter" work would be
-    // unskippable. This wouldn't be good when we needed the state to exit early.
-    // These two functions manage interruptible work promises (one creates them the other cancels
-    // them). They communicate with each other thru the _interruptibleWorkPromises property which
-    //  "interruptible" creates on your object.
-    function interruptible(object, workFn) {
-        object["_interruptibleWorkPromises"] = object["_interruptibleWorkPromises"] || [];
-        var workStoredSignal = new _Signal();
-        object["_interruptibleWorkPromises"].push(workFn(workStoredSignal.promise));
-        workStoredSignal.complete();
-    }
-    function cancelInterruptibles() {
-        (this["_interruptibleWorkPromises"] || []).forEach(function (workPromise) {
-            workPromise.cancel();
-        });
-    }
-    // Transitions:
-    //   When created, the state machine will take one of the following initialization
-    //   transitions depending on how the machines's APIs have been used by the time
-    //   exitInit() is called on it:
-    //     Init -> Closed
-    //     Init -> Opened
-    //   Following that, the life of the machine will be dominated by the following
-    //   sequences of transitions. In geneneral, these sequences are uninterruptible.
-    //     Closed -> BeforeOpen -> Closed (when preventDefault is called on beforeopen event)
-    //     Closed -> BeforeOpen -> Opening -> Opened
-    //     Opened -> BeforeClose -> Opened (when preventDefault is called on beforeclose event)
-    //     Opened -> BeforeClose -> Closing -> Closed
-    //   However, any state can be interrupted to go to the Disposed state:
-    //     * -> Disposed
-    var States;
-    (function (States) {
-        function updateDomImpl() {
-            this.machine._control.onUpdateDom();
-        }
-        // Initial state. Gives the control the opportunity to initialize itself without
-        // triggering any animations or DOM modifications. When done, the control should
-        // call *exitInit* to move the machine to the next state.
-        var Init = (function () {
-            function Init() {
-                this.name = "Init";
-                this.exit = cancelInterruptibles;
-                this.updateDom = _; // Postponed until immediately before we switch to another state
-            }
-            Init.prototype.enter = function () {
-                var _this = this;
-                interruptible(this, function (ready) {
-                    return ready.then(function () {
-                        return _this.machine._initializedSignal.promise;
-                    }).then(function () {
-                        _this.machine._control.onUpdateDomWithIsOpened(_this._opened);
-                        _this.machine._setState(_this._opened ? Opened : Closed);
-                    });
-                });
-            };
-            Object.defineProperty(Init.prototype, "opened", {
-                get: function () {
-                    return this._opened;
-                },
-                enumerable: true,
-                configurable: true
-            });
-            Init.prototype.open = function () {
-                this._opened = true;
-            };
-            Init.prototype.close = function () {
-                this._opened = false;
-            };
-            return Init;
-        })();
-        States.Init = Init;
-        // A rest state. The control is closed and is waiting for the app to call open.
-        var Closed = (function () {
-            function Closed() {
-                this.name = "Closed";
-                this.exit = _;
-                this.opened = false;
-                this.close = _;
-                this.updateDom = updateDomImpl;
-            }
-            Closed.prototype.enter = function (args) {
-                args = args || {};
-                if (args.openIsPending) {
-                    this.open();
-                }
-                this.machine._fireEvent(EventNames._openCloseStateSettled);
-            };
-            Closed.prototype.open = function () {
-                this.machine._setState(BeforeOpen);
-            };
-            return Closed;
-        })();
-        // An event state. The control fires the beforeopen event.
-        var BeforeOpen = (function () {
-            function BeforeOpen() {
-                this.name = "BeforeOpen";
-                this.exit = cancelInterruptibles;
-                this.opened = false;
-                this.open = _;
-                this.close = _;
-                this.updateDom = updateDomImpl;
-            }
-            BeforeOpen.prototype.enter = function () {
-                var _this = this;
-                interruptible(this, function (ready) {
-                    return ready.then(function () {
-                        return _this.machine._fireBeforeOpen(); // Give opportunity for chain to be canceled when triggering app code
-                    }).then(function (shouldOpen) {
-                        if (shouldOpen) {
-                            _this.machine._setState(Opening);
-                        }
-                        else {
-                            _this.machine._setState(Closed);
-                        }
-                    });
-                });
-            };
-            return BeforeOpen;
-        })();
-        // An animation/event state. The control plays its open animation and fires afteropen.
-        var Opening = (function () {
-            function Opening() {
-                this.name = "Opening";
-                this.exit = cancelInterruptibles;
-                this.updateDom = _; // Postponed until immediately before we switch to another state
-            }
-            Opening.prototype.enter = function () {
-                var _this = this;
-                interruptible(this, function (ready) {
-                    return ready.then(function () {
-                        _this._closeIsPending = false;
-                        return cancelablePromise(_this.machine._control.onOpen());
-                    }).then(function () {
-                        _this.machine._fireEvent(EventNames.afterOpen); // Give opportunity for chain to be canceled when triggering app code
-                    }).then(function () {
-                        _this.machine._control.onUpdateDom();
-                        _this.machine._setState(Opened, { closeIsPending: _this._closeIsPending });
-                    });
-                });
-            };
-            Object.defineProperty(Opening.prototype, "opened", {
-                get: function () {
-                    return !this._closeIsPending;
-                },
-                enumerable: true,
-                configurable: true
-            });
-            Opening.prototype.open = function () {
-                this._closeIsPending = false;
-            };
-            Opening.prototype.close = function () {
-                this._closeIsPending = true;
-            };
-            return Opening;
-        })();
-        // A rest state. The control is opened and is waiting for the app to call close.
-        var Opened = (function () {
-            function Opened() {
-                this.name = "Opened";
-                this.exit = _;
-                this.opened = true;
-                this.open = _;
-                this.updateDom = updateDomImpl;
-            }
-            Opened.prototype.enter = function (args) {
-                args = args || {};
-                if (args.closeIsPending) {
-                    this.close();
-                }
-                this.machine._fireEvent(EventNames._openCloseStateSettled);
-            };
-            Opened.prototype.close = function () {
-                this.machine._setState(BeforeClose);
-            };
-            return Opened;
-        })();
-        // An event state. The control fires the beforeclose event.
-        var BeforeClose = (function () {
-            function BeforeClose() {
-                this.name = "BeforeClose";
-                this.exit = cancelInterruptibles;
-                this.opened = true;
-                this.open = _;
-                this.close = _;
-                this.updateDom = updateDomImpl;
-            }
-            BeforeClose.prototype.enter = function () {
-                var _this = this;
-                interruptible(this, function (ready) {
-                    return ready.then(function () {
-                        return _this.machine._fireBeforeClose(); // Give opportunity for chain to be canceled when triggering app code
-                    }).then(function (shouldClose) {
-                        if (shouldClose) {
-                            _this.machine._setState(Closing);
-                        }
-                        else {
-                            _this.machine._setState(Opened);
-                        }
-                    });
-                });
-            };
-            return BeforeClose;
-        })();
-        // An animation/event state. The control plays the close animation and fires the afterclose event.
-        var Closing = (function () {
-            function Closing() {
-                this.name = "Closing";
-                this.exit = cancelInterruptibles;
-                this.updateDom = _; // Postponed until immediately before we switch to another state
-            }
-            Closing.prototype.enter = function () {
-                var _this = this;
-                interruptible(this, function (ready) {
-                    return ready.then(function () {
-                        _this._openIsPending = false;
-                        return cancelablePromise(_this.machine._control.onClose());
-                    }).then(function () {
-                        _this.machine._fireEvent(EventNames.afterClose); // Give opportunity for chain to be canceled when triggering app code
-                    }).then(function () {
-                        _this.machine._control.onUpdateDom();
-                        _this.machine._setState(Closed, { openIsPending: _this._openIsPending });
-                    });
-                });
-            };
-            Object.defineProperty(Closing.prototype, "opened", {
-                get: function () {
-                    return this._openIsPending;
-                },
-                enumerable: true,
-                configurable: true
-            });
-            Closing.prototype.open = function () {
-                this._openIsPending = true;
-            };
-            Closing.prototype.close = function () {
-                this._openIsPending = false;
-            };
-            return Closing;
-        })();
-        var Disposed = (function () {
-            function Disposed() {
-                this.name = "Disposed";
-                this.enter = _;
-                this.exit = _;
-                this.opened = false;
-                this.open = _;
-                this.close = _;
-                this.updateDom = _;
-            }
-            return Disposed;
-        })();
-        States.Disposed = Disposed;
-    })(States || (States = {}));
-});
-
-
-define('require-style!less/styles-commandingsurface',[],function(){});
-
-define('require-style!less/colors-commandingsurface',[],function(){});
-define('WinJS/Controls/CommandingSurface/_CommandingSurface',["require", "exports", "../../Animations", "../../Core/_Base", "../../Core/_BaseUtils", "../../BindingList", "../../ControlProcessor", "../CommandingSurface/_Constants", "../AppBar/_Command", "../CommandingSurface/_MenuCommand", "../../Utilities/_Control", "../../Utilities/_Dispose", "../../Utilities/_ElementUtilities", "../../Core/_ErrorFromName", '../../Core/_Events', "../../Controls/Flyout", "../../Core/_Global", "../../Utilities/_Hoverable", "../../Utilities/_KeyboardBehavior", '../../Core/_Log', '../../Promise', "../../Core/_Resources", "../../Scheduler", '../../Utilities/_OpenCloseMachine', '../../_Signal', "../../Core/_WriteProfilerMark"], function (require, exports, Animations, _Base, _BaseUtils, BindingList, ControlProcessor, _Constants, _Command, _CommandingSurfaceMenuCommand, _Control, _Dispose, _ElementUtilities, _ErrorFromName, _Events, _Flyout, _Global, _Hoverable, _KeyboardBehavior, _Log, Promise, _Resources, Scheduler, _OpenCloseMachine, _Signal, _WriteProfilerMark) {
-    require(["require-style!less/styles-commandingsurface"]);
-    require(["require-style!less/colors-commandingsurface"]);
-    "use strict";
-    ;
-    var strings = {
-        get overflowButtonAriaLabel() {
-            return _Resources._getWinJSString("ui/commandingSurfaceOverflowButtonAriaLabel").value;
-        },
-        get badData() {
-            return "Invalid argument: The data property must an instance of a WinJS.Binding.List";
-        },
-        get mustContainCommands() {
-            return "The commandingSurface can only contain WinJS.UI.Command or WinJS.UI.AppBarCommand controls";
-        },
-        get duplicateConstruction() {
-            return "Invalid argument: Controls may only be instantiated one time for each DOM element";
-        }
-    };
-    var OverflowDirection = {
-        /// The _CommandingSurface expands towards the bottom of the screen when opened and the overflow area renders below the actionarea.
-        bottom: "bottom",
-        /// The _CommandingSurface expands towards the top of the screen when opened and the overflow area renders above the actionarea.
-        top: "top",
-    };
-    var overflowDirectionClassMap = {};
-    overflowDirectionClassMap[OverflowDirection.top] = _Constants.ClassNames.overflowTopClass;
-    overflowDirectionClassMap[OverflowDirection.bottom] = _Constants.ClassNames.overflowBottomClass;
-    var ClosedDisplayMode = {
-        /// When the _CommandingSurface is closed, the actionarea is not visible and doesn't take up any space.
-        none: "none",
-        /// When the _CommandingSurface is closed, the height of the actionarea is reduced to the minimal height required to display only the actionarea overflowbutton. All other content in the actionarea is not displayed.
-        minimal: "minimal",
-        /// When the _CommandingSurface is closed, the height of the actionarea is reduced such that button commands are still visible, but their labels are hidden.
-        compact: "compact",
-        /// When the _CommandingSurface is closed, the height of the actionarea is always sized to content and does not change between opened and closed states.
-        full: "full",
-    };
-    var closedDisplayModeClassMap = {};
-    closedDisplayModeClassMap[ClosedDisplayMode.none] = _Constants.ClassNames.noneClass;
-    closedDisplayModeClassMap[ClosedDisplayMode.minimal] = _Constants.ClassNames.minimalClass;
-    closedDisplayModeClassMap[ClosedDisplayMode.compact] = _Constants.ClassNames.compactClass;
-    closedDisplayModeClassMap[ClosedDisplayMode.full] = _Constants.ClassNames.fullClass;
-    // Versions of add/removeClass that are no ops when called with falsy class names.
-    function addClass(element, className) {
-        className && _ElementUtilities.addClass(element, className);
-    }
-    function removeClass(element, className) {
-        className && _ElementUtilities.removeClass(element, className);
-    }
-    function diffElements(lhs, rhs) {
-        // Subtract array rhs from array lhs.
-        // Returns a new Array containing the subset of elements in lhs that are not also in rhs.
-        return lhs.filter(function (commandElement) {
-            return rhs.indexOf(commandElement) < 0;
-        });
-    }
-    function intersectElements(arr1, arr2) {
-        // Returns a new array that is the intersection between arr1 and arr2.
-        return arr1.filter(function (x) { return arr2.indexOf(x) !== -1; });
-    }
-    /// Represents an apaptive surface for displaying commands.
-    var _CommandingSurface = (function () {
-        function _CommandingSurface(element, options) {
-            /// Creates a new CommandingSurface control.
-            /// @param element: The DOM element that will host the control.
-            /// @param options: The set of properties and values to apply to the new CommandingSurface control.
-            /// @return: The new CommandingSurface control.
-            var _this = this;
-            if (options === void 0) { options = {}; }
-            this._hoverable = _Hoverable.isHoverable; /* force dependency on hoverable module */
-            this._dataChangedEvents = ["itemchanged", "iteminserted", "itemmoved", "itemremoved", "reload"];
-            this._updateDomImpl = (function () {
-                // Self executing function returns a JavaScript Object literal that
-                // implements the ICommandingSurface_UpdateDomImpl Inteface.
-                // State private to _renderDisplayMode. No other method should make use of it.
-                //
-                // Nothing has been rendered yet so these are all initialized to undefined. Because
-                // they are undefined, the first time _updateDomImpl.update is called, they will all be
-                // rendered.
-                var _renderedState = {
-                    closedDisplayMode: undefined,
-                    isOpenedMode: undefined,
-                    overflowDirection: undefined,
-                    overflowAlignmentOffset: undefined,
-                };
-                var _renderDisplayMode = function () {
-                    var rendered = _renderedState;
-                    var dom = _this._dom;
-                    if (rendered.isOpenedMode !== _this._isOpenedMode) {
-                        if (_this._isOpenedMode) {
-                            // Render opened
-                            removeClass(dom.root, _Constants.ClassNames.closedClass);
-                            addClass(dom.root, _Constants.ClassNames.openedClass);
-                            dom.overflowButton.setAttribute("aria-expanded", "true");
-                            // Focus should carousel between first and last tab stops while opened.
-                            dom.firstTabStop.tabIndex = 0;
-                            dom.finalTabStop.tabIndex = 0;
-                            dom.firstTabStop.setAttribute("x-ms-aria-flowfrom", dom.finalTabStop.id);
-                            dom.finalTabStop.setAttribute("aria-flowto", dom.firstTabStop.id);
-                        }
-                        else {
-                            // Render closed
-                            removeClass(dom.root, _Constants.ClassNames.openedClass);
-                            addClass(dom.root, _Constants.ClassNames.closedClass);
-                            dom.overflowButton.setAttribute("aria-expanded", "false");
-                            // Focus should not carousel between first and last tab stops while closed.
-                            dom.firstTabStop.tabIndex = -1;
-                            dom.finalTabStop.tabIndex = -1;
-                            dom.firstTabStop.removeAttribute("x-ms-aria-flowfrom");
-                            dom.finalTabStop.removeAttribute("aria-flowto");
-                        }
-                        rendered.isOpenedMode = _this._isOpenedMode;
-                    }
-                    if (rendered.closedDisplayMode !== _this.closedDisplayMode) {
-                        removeClass(dom.root, closedDisplayModeClassMap[rendered.closedDisplayMode]);
-                        addClass(dom.root, closedDisplayModeClassMap[_this.closedDisplayMode]);
-                        rendered.closedDisplayMode = _this.closedDisplayMode;
-                    }
-                    if (rendered.overflowDirection !== _this.overflowDirection) {
-                        removeClass(dom.root, overflowDirectionClassMap[rendered.overflowDirection]);
-                        addClass(dom.root, overflowDirectionClassMap[_this.overflowDirection]);
-                        rendered.overflowDirection = _this.overflowDirection;
-                    }
-                    if (_this._overflowAlignmentOffset !== rendered.overflowAlignmentOffset) {
-                        var offsetProperty = (_this._rtl ? "left" : "right");
-                        var offsetTextValue = _this._overflowAlignmentOffset + "px";
-                        dom.overflowAreaContainer.style[offsetProperty] = offsetTextValue;
-                    }
-                };
-                var CommandLayoutPipeline = {
-                    newDataStage: 3,
-                    measuringStage: 2,
-                    layoutStage: 1,
-                    idle: 0,
-                };
-                var _currentLayoutStage = CommandLayoutPipeline.idle;
-                var _updateCommands = function () {
-                    _this._writeProfilerMark("_updateDomImpl_updateCommands,info");
-                    var currentStage = _currentLayoutStage;
-                    while (currentStage !== CommandLayoutPipeline.idle) {
-                        var prevStage = currentStage;
-                        var okToProceed = false;
-                        switch (currentStage) {
-                            case CommandLayoutPipeline.newDataStage:
-                                currentStage = CommandLayoutPipeline.measuringStage;
-                                okToProceed = _this._processNewData();
-                                break;
-                            case CommandLayoutPipeline.measuringStage:
-                                currentStage = CommandLayoutPipeline.layoutStage;
-                                okToProceed = _this._measure();
-                                break;
-                            case CommandLayoutPipeline.layoutStage:
-                                currentStage = CommandLayoutPipeline.idle;
-                                okToProceed = _this._layoutCommands();
-                                break;
-                        }
-                        if (!okToProceed) {
-                            // If a stage fails, exit the loop and track that stage
-                            // to be restarted the next time _updateCommands is run.
-                            currentStage = prevStage;
-                            break;
-                        }
-                    }
-                    _currentLayoutStage = currentStage;
-                    if (currentStage === CommandLayoutPipeline.idle) {
-                        // Callback for unit tests.
-                        _this._layoutCompleteCallback && _this._layoutCompleteCallback();
-                    }
-                    else {
-                        // We didn't reach the end of the pipeline. Therefore
-                        // one of the stages failed and layout could not complete.
-                        _this._minimalLayout();
-                    }
-                };
-                return {
-                    get renderedState() {
-                        return {
-                            get closedDisplayMode() {
-                                return _renderedState.closedDisplayMode;
-                            },
-                            get isOpenedMode() {
-                                return _renderedState.isOpenedMode;
-                            },
-                            get overflowDirection() {
-                                return _renderedState.overflowDirection;
-                            },
-                            get overflowAlignmentOffset() {
-                                return _renderedState.overflowAlignmentOffset;
-                            },
-                        };
-                    },
-                    update: function () {
-                        _renderDisplayMode();
-                        _updateCommands();
-                    },
-                    dataDirty: function () {
-                        _currentLayoutStage = Math.max(CommandLayoutPipeline.newDataStage, _currentLayoutStage);
-                    },
-                    measurementsDirty: function () {
-                        _currentLayoutStage = Math.max(CommandLayoutPipeline.measuringStage, _currentLayoutStage);
-                    },
-                    layoutDirty: function () {
-                        _currentLayoutStage = Math.max(CommandLayoutPipeline.layoutStage, _currentLayoutStage);
-                    },
-                    get _currentLayoutStage() {
-                        // Expose this for its usefulness in F12 debugging.
-                        return _currentLayoutStage;
-                    },
-                };
-            })();
-            this._writeProfilerMark("constructor,StartTM");
-            if (element) {
-                // Check to make sure we weren't duplicated
-                if (element["winControl"]) {
-                    throw new _ErrorFromName("WinJS.UI._CommandingSurface.DuplicateConstruction", strings.duplicateConstruction);
-                }
-                if (!options.data) {
-                    // Shallow copy object so we can modify it.
-                    options = _BaseUtils._shallowCopy(options);
-                    // Get default data from any command defined in markup.
-                    options.data = options.data || this._getDataFromDOMElements(element);
-                }
-            }
-            this._initializeDom(element || _Global.document.createElement("div"));
-            this._machine = options.openCloseMachine || new _OpenCloseMachine.OpenCloseMachine({
-                eventElement: this._dom.root,
-                onOpen: function () {
-                    _this.synchronousOpen();
-                    return Promise.wrap();
-                },
-                onClose: function () {
-                    _this.synchronousClose();
-                    return Promise.wrap();
-                },
-                onUpdateDom: function () {
-                    _this._updateDomImpl.update();
-                },
-                onUpdateDomWithIsOpened: function (isOpened) {
-                    if (isOpened) {
-                        _this.synchronousOpen();
-                    }
-                    else {
-                        _this.synchronousClose();
-                    }
-                }
-            });
-            // Initialize private state.
-            this._disposed = false;
-            this._primaryCommands = [];
-            this._secondaryCommands = [];
-            this._refreshBound = this._refresh.bind(this);
-            this._resizeHandlerBound = this._resizeHandler.bind(this);
-            this._winKeyboard = new _KeyboardBehavior._WinKeyboard(this._dom.root);
-            this._refreshPending = false;
-            this._rtl = false;
-            this._initializedSignal = new _Signal();
-            this._isOpenedMode = _Constants.defaultOpened;
-            this._menuCommandProjections = [];
-            // Initialize public properties.
-            this.overflowDirection = _Constants.defaultOverflowDirection;
-            this.closedDisplayMode = _Constants.defaultClosedDisplayMode;
-            this.opened = this._isOpenedMode;
-            _Control.setOptions(this, options);
-            // Event handlers
-            _ElementUtilities._resizeNotifier.subscribe(this._dom.root, this._resizeHandlerBound);
-            this._dom.root.addEventListener('keydown', this._keyDownHandler.bind(this));
-            _ElementUtilities._addEventListener(this._dom.firstTabStop, "focusin", function () {
-                _this._focusLastFocusableElementOrThis(false);
-            });
-            _ElementUtilities._addEventListener(this._dom.finalTabStop, "focusin", function () {
-                _this._focusFirstFocusableElementOrThis(false);
-            });
-            // Exit the Init state.
-            _ElementUtilities._inDom(this._dom.root).then(function () {
-                _this._rtl = _ElementUtilities._getComputedStyle(_this._dom.root).direction === 'rtl';
-                if (!options.openCloseMachine) {
-                    // We should only call exitInit on the machine when we own the machine.
-                    _this._machine.exitInit();
-                }
-                _this._initializedSignal.complete();
-                _this._writeProfilerMark("constructor,StopTM");
-            });
-        }
-        Object.defineProperty(_CommandingSurface.prototype, "element", {
-            /// Gets the DOM element that hosts the CommandingSurface.
-            get: function () {
-                return this._dom.root;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(_CommandingSurface.prototype, "data", {
-            /// Gets or sets the Binding List of WinJS.UI.Command for the CommandingSurface.
-            get: function () {
-                return this._data;
-            },
-            set: function (value) {
-                this._writeProfilerMark("set_data,info");
-                if (value !== this.data) {
-                    if (!(value instanceof BindingList.List)) {
-                        throw new _ErrorFromName("WinJS.UI._CommandingSurface.BadData", strings.badData);
-                    }
-                    if (this._data) {
-                        this._removeDataListeners();
-                    }
-                    this._data = value;
-                    this._addDataListeners();
-                    this._dataUpdated();
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(_CommandingSurface.prototype, "closedDisplayMode", {
-            /// Gets or sets the closedDisplayMode for the CommandingSurface. Values are "none", "minimal", "compact", and "full".
-            get: function () {
-                return this._closedDisplayMode;
-            },
-            set: function (value) {
-                this._writeProfilerMark("set_closedDisplayMode,info");
-                var isChangingState = (value !== this._closedDisplayMode);
-                if (ClosedDisplayMode[value] && isChangingState) {
-                    // Changing closedDisplayMode can trigger the overflowButton to show/hide itself in the action area.
-                    // Commands may need to reflow based on any changes to the available width in the action area.
-                    this._updateDomImpl.layoutDirty();
-                    this._closedDisplayMode = value;
-                    this._machine.updateDom();
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(_CommandingSurface.prototype, "overflowDirection", {
-            /// Gets or sets which direction the commandingSurface overflows when opened. Values are "top" and "bottom" for.
-            get: function () {
-                return this._overflowDirection;
-            },
-            set: function (value) {
-                var isChangingState = (value !== this._overflowDirection);
-                if (OverflowDirection[value] && isChangingState) {
-                    this._overflowDirection = value;
-                    this._machine.updateDom();
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(_CommandingSurface.prototype, "opened", {
-            /// Gets or sets whether the _CommandingSurface is currently opened.
-            get: function () {
-                return this._machine.opened;
-            },
-            set: function (value) {
-                this._machine.opened = value;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        _CommandingSurface.prototype.open = function () {
-            /// Opens the _CommandingSurface's actionarea and overflowarea
-            this._machine.open();
-        };
-        _CommandingSurface.prototype.close = function () {
-            /// Closes the _CommandingSurface's actionarea and overflowarea
-            this._machine.close();
-        };
-        _CommandingSurface.prototype.dispose = function () {
-            /// Disposes this CommandingSurface.
-            if (this._disposed) {
-                return;
-            }
-            this._disposed = true;
-            this._machine.dispose();
-            _ElementUtilities._resizeNotifier.unsubscribe(this._dom.root, this._resizeHandlerBound);
-            if (this._contentFlyout) {
-                this._contentFlyout.dispose();
-                this._contentFlyout.element.parentNode.removeChild(this._contentFlyout.element);
-            }
-            _Dispose.disposeSubTree(this._dom.root);
-        };
-        _CommandingSurface.prototype.forceLayout = function () {
-            /// Forces the CommandingSurface to update its layout. Use this function when the window did not change 
-            /// size, but the container of the CommandingSurface changed size.
-            this._updateDomImpl.measurementsDirty();
-            this._machine.updateDom();
-        };
-        _CommandingSurface.prototype.getBoundingRects = function () {
-            return {
-                commandingSurface: this._dom.root.getBoundingClientRect(),
-                overflowArea: this._dom.overflowArea.getBoundingClientRect(),
-            };
-        };
-        _CommandingSurface.prototype.getCommandById = function (id) {
-            if (this._data) {
-                for (var i = 0, len = this._data.length; i < len; i++) {
-                    var command = this._data.getAt(i);
-                    if (command.id === id) {
-                        return command;
-                    }
-                }
-            }
-            return null;
-        };
-        _CommandingSurface.prototype.showOnlyCommands = function (commands) {
-            if (this._data) {
-                for (var i = 0, len = this._data.length; i < len; i++) {
-                    this._data.getAt(i).hidden = true;
-                }
-                for (var i = 0, len = commands.length; i < len; i++) {
-                    // The array passed to showOnlyCommands can contain either command ids, or the commands themselves.
-                    var command = (typeof commands[i] === "string" ? this.getCommandById(commands[i]) : commands[i]);
-                    if (command) {
-                        command.hidden = false;
-                    }
-                }
-            }
-        };
-        _CommandingSurface.prototype.takeFocus = function (useSetActive) {
-            this._focusFirstFocusableElementOrThis(useSetActive);
-        };
-        _CommandingSurface.prototype._focusFirstFocusableElementOrThis = function (useSetActive) {
-            _ElementUtilities._focusFirstFocusableElement(this._dom.content, useSetActive) || _ElementUtilities._tryFocusOnAnyElement(this.element, useSetActive);
-        };
-        _CommandingSurface.prototype._focusLastFocusableElementOrThis = function (useSetActive) {
-            _ElementUtilities._focusLastFocusableElement(this._dom.content, useSetActive) || _ElementUtilities._tryFocusOnAnyElement(this.element, useSetActive);
-        };
-        _CommandingSurface.prototype.deferredDomUpate = function () {
-            // Notify the machine that an update has been requested.
-            this._machine.updateDom();
-        };
-        _CommandingSurface.prototype.createOpenAnimation = function (closedHeight) {
-            // createOpenAnimation should only be called when the commanding surface is in a closed state. The control using the commanding surface is expected
-            // to call createOpenAnimation() before it opens the surface, then open the commanding surface, then call .execute() to start the animation.
-            // This function is overridden by our unit tests.
-            if (_Log.log) {
-                this._updateDomImpl.renderedState.isOpenedMode && _Log.log("The CommandingSurface should only attempt to create an open animation when it's not already opened");
-            }
-            var that = this;
-            return {
-                execute: function () {
-                    _ElementUtilities.addClass(that.element, _Constants.ClassNames.openingClass);
-                    var boundingRects = that.getBoundingRects();
-                    // The overflowAreaContainer has no size by default. Measure the overflowArea's size and apply it to the overflowAreaContainer before animating
-                    that._dom.overflowAreaContainer.style.width = boundingRects.overflowArea.width + "px";
-                    that._dom.overflowAreaContainer.style.height = boundingRects.overflowArea.height + "px";
-                    return Animations._commandingSurfaceOpenAnimation({
-                        actionAreaClipper: that._dom.actionAreaContainer,
-                        actionArea: that._dom.actionArea,
-                        overflowAreaClipper: that._dom.overflowAreaContainer,
-                        overflowArea: that._dom.overflowArea,
-                        oldHeight: closedHeight,
-                        newHeight: boundingRects.commandingSurface.height,
-                        overflowAreaHeight: boundingRects.overflowArea.height,
-                        menuPositionedAbove: (that.overflowDirection === OverflowDirection.top),
-                    }).then(function () {
-                        _ElementUtilities.removeClass(that.element, _Constants.ClassNames.openingClass);
-                        that._clearAnimation();
-                    });
-                }
-            };
-        };
-        _CommandingSurface.prototype.createCloseAnimation = function (closedHeight) {
-            // createCloseAnimation should only be called when the commanding surface is in an opened state. The control using the commanding surface is expected
-            // to call createCloseAnimation() before it closes the surface, then call execute() to let the animation run. Once the animation finishes, the control
-            // should close the commanding surface.
-            // This function is overridden by our unit tests.
-            if (_Log.log) {
-                !this._updateDomImpl.renderedState.isOpenedMode && _Log.log("The CommandingSurface should only attempt to create an closed animation when it's not already closed");
-            }
-            var openedHeight = this.getBoundingRects().commandingSurface.height, overflowAreaOpenedHeight = this._dom.overflowArea.offsetHeight, oldOverflowTop = this._dom.overflowArea.offsetTop, that = this;
-            return {
-                execute: function () {
-                    _ElementUtilities.addClass(that.element, _Constants.ClassNames.closingClass);
-                    return Animations._commandingSurfaceCloseAnimation({
-                        actionAreaClipper: that._dom.actionAreaContainer,
-                        actionArea: that._dom.actionArea,
-                        overflowAreaClipper: that._dom.overflowAreaContainer,
-                        overflowArea: that._dom.overflowArea,
-                        oldHeight: openedHeight,
-                        newHeight: closedHeight,
-                        overflowAreaHeight: overflowAreaOpenedHeight,
-                        menuPositionedAbove: (that.overflowDirection === OverflowDirection.top),
-                    }).then(function () {
-                        _ElementUtilities.removeClass(that.element, _Constants.ClassNames.closingClass);
-                        that._clearAnimation();
-                    });
-                }
-            };
-        };
-        Object.defineProperty(_CommandingSurface.prototype, "initialized", {
-            get: function () {
-                return this._initializedSignal.promise;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        _CommandingSurface.prototype._writeProfilerMark = function (text) {
-            _WriteProfilerMark("WinJS.UI._CommandingSurface:" + this._id + ":" + text);
-        };
-        _CommandingSurface.prototype._initializeDom = function (root) {
-            var _this = this;
-            this._writeProfilerMark("_intializeDom,info");
-            // Attaching JS control to DOM element
-            root["winControl"] = this;
-            this._id = root.id || _ElementUtilities._uniqueID(root);
-            if (!root.hasAttribute("tabIndex")) {
-                root.tabIndex = -1;
-            }
-            _ElementUtilities.addClass(root, _Constants.ClassNames.controlCssClass);
-            _ElementUtilities.addClass(root, _Constants.ClassNames.disposableCssClass);
-            var content = _Global.document.createElement("div");
-            _ElementUtilities.addClass(content, _Constants.ClassNames.contentClass);
-            root.appendChild(content);
-            var actionArea = _Global.document.createElement("div");
-            _ElementUtilities.addClass(actionArea, _Constants.ClassNames.actionAreaCssClass);
-            var actionAreaInsetOutline = document.createElement("div");
-            _ElementUtilities.addClass(actionAreaInsetOutline, _Constants.ClassNames.insetOutlineClass);
-            var actionAreaContainer = _Global.document.createElement("div");
-            _ElementUtilities.addClass(actionAreaContainer, _Constants.ClassNames.actionAreaContainerCssClass);
-            actionAreaContainer.appendChild(actionArea);
-            actionAreaContainer.appendChild(actionAreaInsetOutline);
-            content.appendChild(actionAreaContainer);
-            // This element helps us work around cross browser flexbox bugs. When there are no primary
-            // commands in the action area but there IS a visible overflow button, some browsers will:
-            //  1. Collapse the action area.
-            //  2. Push overflowbutton outside of the action area's clipping rect.
-            var actionAreaSpacer = _Global.document.createElement("div");
-            _ElementUtilities.addClass(actionAreaSpacer, _Constants.ClassNames.spacerCssClass);
-            actionAreaSpacer.tabIndex = -1;
-            actionArea.appendChild(actionAreaSpacer);
-            var overflowButton = _Global.document.createElement("button");
-            overflowButton.tabIndex = 0;
-            overflowButton.innerHTML = "<span class='" + _Constants.ClassNames.ellipsisCssClass + "'></span>";
-            overflowButton.setAttribute("aria-label", strings.overflowButtonAriaLabel);
-            _ElementUtilities.addClass(overflowButton, _Constants.ClassNames.overflowButtonCssClass);
-            actionArea.appendChild(overflowButton);
-            overflowButton.addEventListener("click", function () {
-                _this.opened = !_this.opened;
-            });
-            var overflowArea = _Global.document.createElement("div");
-            _ElementUtilities.addClass(overflowArea, _Constants.ClassNames.overflowAreaCssClass);
-            _ElementUtilities.addClass(overflowArea, _Constants.ClassNames.menuCssClass);
-            var overflowInsetOutline = _Global.document.createElement("DIV");
-            _ElementUtilities.addClass(overflowInsetOutline, _Constants.ClassNames.insetOutlineClass);
-            var overflowAreaContainer = _Global.document.createElement("div");
-            _ElementUtilities.addClass(overflowAreaContainer, _Constants.ClassNames.overflowAreaContainerCssClass);
-            overflowAreaContainer.appendChild(overflowArea);
-            overflowAreaContainer.appendChild(overflowInsetOutline);
-            content.appendChild(overflowAreaContainer);
-            // This element is always placed at the end of the overflow area and is used to provide a better
-            // "end of scrollable region" visual.
-            var overflowAreaSpacer = _Global.document.createElement("div");
-            _ElementUtilities.addClass(overflowAreaSpacer, _Constants.ClassNames.spacerCssClass);
-            overflowAreaSpacer.tabIndex = -1;
-            overflowArea.appendChild(overflowAreaSpacer);
-            var firstTabStop = _Global.document.createElement("div");
-            _ElementUtilities.addClass(firstTabStop, _Constants.ClassNames.tabStopClass);
-            _ElementUtilities._ensureId(firstTabStop);
-            root.insertBefore(firstTabStop, root.children[0]);
-            var finalTabStop = _Global.document.createElement("div");
-            _ElementUtilities.addClass(finalTabStop, _Constants.ClassNames.tabStopClass);
-            _ElementUtilities._ensureId(finalTabStop);
-            root.appendChild(finalTabStop);
-            this._dom = {
-                root: root,
-                content: content,
-                actionArea: actionArea,
-                actionAreaContainer: actionAreaContainer,
-                actionAreaSpacer: actionAreaSpacer,
-                overflowButton: overflowButton,
-                overflowArea: overflowArea,
-                overflowAreaContainer: overflowAreaContainer,
-                overflowAreaSpacer: overflowAreaSpacer,
-                firstTabStop: firstTabStop,
-                finalTabStop: finalTabStop,
-            };
-        };
-        _CommandingSurface.prototype._getFocusableElementsInfo = function () {
-            var _this = this;
-            var focusableCommandsInfo = {
-                elements: [],
-                focusedIndex: -1
-            };
-            var elementsInReach = Array.prototype.slice.call(this._dom.actionArea.children);
-            if (this._updateDomImpl.renderedState.isOpenedMode) {
-                elementsInReach = elementsInReach.concat(Array.prototype.slice.call(this._dom.overflowArea.children));
-            }
-            elementsInReach.forEach(function (element) {
-                if (_this._isElementFocusable(element)) {
-                    focusableCommandsInfo.elements.push(element);
-                    if (element.contains(_Global.document.activeElement)) {
-                        focusableCommandsInfo.focusedIndex = focusableCommandsInfo.elements.length - 1;
-                    }
-                }
-            });
-            return focusableCommandsInfo;
-        };
-        _CommandingSurface.prototype._dataUpdated = function () {
-            var _this = this;
-            this._primaryCommands = [];
-            this._secondaryCommands = [];
-            if (this.data.length > 0) {
-                this.data.forEach(function (command) {
-                    if (command.section === "secondary") {
-                        _this._secondaryCommands.push(command);
-                    }
-                    else {
-                        _this._primaryCommands.push(command);
-                    }
-                });
-            }
-            this._updateDomImpl.dataDirty();
-            this._machine.updateDom();
-        };
-        _CommandingSurface.prototype._refresh = function () {
-            var _this = this;
-            if (!this._refreshPending) {
-                this._refreshPending = true;
-                // Batch calls to _dataUpdated
-                this._batchDataUpdates(function () {
-                    if (_this._refreshPending && !_this._disposed) {
-                        _this._refreshPending = false;
-                        _this._dataUpdated();
-                    }
-                });
-            }
-        };
-        // _batchDataUpdates is used by unit tests
-        _CommandingSurface.prototype._batchDataUpdates = function (updateFn) {
-            Scheduler.schedule(function () {
-                updateFn();
-            }, Scheduler.Priority.high, null, "WinJS.UI._CommandingSurface._refresh");
-        };
-        _CommandingSurface.prototype._addDataListeners = function () {
-            var _this = this;
-            this._dataChangedEvents.forEach(function (eventName) {
-                _this._data.addEventListener(eventName, _this._refreshBound, false);
-            });
-        };
-        _CommandingSurface.prototype._removeDataListeners = function () {
-            var _this = this;
-            this._dataChangedEvents.forEach(function (eventName) {
-                _this._data.removeEventListener(eventName, _this._refreshBound, false);
-            });
-        };
-        _CommandingSurface.prototype._isElementFocusable = function (element) {
-            var focusable = false;
-            if (element) {
-                var command = element["winControl"];
-                if (command) {
-                    focusable = !this._hasAnyHiddenClasses(command) && command.type !== _Constants.typeSeparator && !command.hidden && !command.disabled && (!command.firstElementFocus || command.firstElementFocus.tabIndex >= 0 || command.lastElementFocus.tabIndex >= 0);
-                }
-                else {
-                    // e.g. the overflow button
-                    focusable = element.style.display !== "none" && _ElementUtilities._getComputedStyle(element).visibility !== "hidden" && element.tabIndex >= 0;
-                }
-            }
-            return focusable;
-        };
-        _CommandingSurface.prototype._clearHiddenPolicyClasses = function (command) {
-            _ElementUtilities.removeClass(command.element, _Constants.ClassNames.commandPrimaryOverflownPolicyClass);
-            _ElementUtilities.removeClass(command.element, _Constants.ClassNames.commandSecondaryOverflownPolicyClass);
-            _ElementUtilities.removeClass(command.element, _Constants.ClassNames.commandSeparatorHiddenPolicyClass);
-        };
-        _CommandingSurface.prototype._hasHiddenPolicyClasses = function (command) {
-            return _ElementUtilities.hasClass(command.element, _Constants.ClassNames.commandPrimaryOverflownPolicyClass) || _ElementUtilities.hasClass(command.element, _Constants.ClassNames.commandSecondaryOverflownPolicyClass) || _ElementUtilities.hasClass(command.element, _Constants.ClassNames.commandSeparatorHiddenPolicyClass);
-        };
-        _CommandingSurface.prototype._hasAnyHiddenClasses = function (command) {
-            // Checks if we've processed and recognized a command as being hidden
-            return _ElementUtilities.hasClass(command.element, _Constants.ClassNames.commandHiddenClass) || this._hasHiddenPolicyClasses(command);
-        };
-        _CommandingSurface.prototype._isCommandInActionArea = function (element) {
-            // Returns true if the element is a command in the actionarea, false otherwise
-            return element && element["winControl"] && element.parentElement === this._dom.actionArea;
-        };
-        _CommandingSurface.prototype._getLastElementFocus = function (element) {
-            if (this._isCommandInActionArea(element)) {
-                // Only commands in the actionarea support lastElementFocus
-                return element["winControl"].lastElementFocus;
-            }
-            else {
-                return element;
-            }
-        };
-        _CommandingSurface.prototype._getFirstElementFocus = function (element) {
-            if (this._isCommandInActionArea(element)) {
-                // Only commands in the actionarea support firstElementFocus
-                return element["winControl"].firstElementFocus;
-            }
-            else {
-                return element;
-            }
-        };
-        _CommandingSurface.prototype._keyDownHandler = function (ev) {
-            if (!ev.altKey) {
-                if (_ElementUtilities._matchesSelector(ev.target, ".win-interactive, .win-interactive *")) {
-                    return;
-                }
-                var Key = _ElementUtilities.Key;
-                var focusableElementsInfo = this._getFocusableElementsInfo();
-                var targetCommand;
-                if (focusableElementsInfo.elements.length) {
-                    switch (ev.keyCode) {
-                        case (this._rtl ? Key.rightArrow : Key.leftArrow):
-                        case Key.upArrow:
-                            var index = Math.max(0, focusableElementsInfo.focusedIndex - 1);
-                            targetCommand = this._getLastElementFocus(focusableElementsInfo.elements[index % focusableElementsInfo.elements.length]);
-                            break;
-                        case (this._rtl ? Key.leftArrow : Key.rightArrow):
-                        case Key.downArrow:
-                            var index = Math.min(focusableElementsInfo.focusedIndex + 1, focusableElementsInfo.elements.length - 1);
-                            targetCommand = this._getFirstElementFocus(focusableElementsInfo.elements[index]);
-                            break;
-                        case Key.home:
-                            var index = 0;
-                            targetCommand = this._getFirstElementFocus(focusableElementsInfo.elements[index]);
-                            break;
-                        case Key.end:
-                            var index = focusableElementsInfo.elements.length - 1;
-                            targetCommand = this._getLastElementFocus(focusableElementsInfo.elements[index]);
-                            break;
-                    }
-                }
-                if (targetCommand && targetCommand !== _Global.document.activeElement) {
-                    targetCommand.focus();
-                    ev.preventDefault();
-                }
-            }
-        };
-        _CommandingSurface.prototype._getDataFromDOMElements = function (root) {
-            this._writeProfilerMark("_getDataFromDOMElements,info");
-            ControlProcessor.processAll(root, true);
-            var commands = [];
-            var childrenLength = root.children.length;
-            var child;
-            for (var i = 0; i < childrenLength; i++) {
-                child = root.children[i];
-                if (child["winControl"] && child["winControl"] instanceof _Command.AppBarCommand) {
-                    commands.push(child["winControl"]);
-                }
-                else {
-                    throw new _ErrorFromName("WinJS.UI._CommandingSurface.MustContainCommands", strings.mustContainCommands);
-                }
-            }
-            return new BindingList.List(commands);
-        };
-        _CommandingSurface.prototype._canMeasure = function () {
-            return (this._updateDomImpl.renderedState.isOpenedMode || this._updateDomImpl.renderedState.closedDisplayMode === ClosedDisplayMode.compact || this._updateDomImpl.renderedState.closedDisplayMode === ClosedDisplayMode.full) && _Global.document.body.contains(this._dom.root) && this._dom.actionArea.offsetWidth > 0;
-        };
-        _CommandingSurface.prototype._resizeHandler = function () {
-            if (this._canMeasure()) {
-                var currentActionAreaWidth = _ElementUtilities._getPreciseContentWidth(this._dom.actionArea);
-                if (this._cachedMeasurements && this._cachedMeasurements.actionAreaContentBoxWidth !== currentActionAreaWidth) {
-                    this._cachedMeasurements.actionAreaContentBoxWidth = currentActionAreaWidth;
-                    this._updateDomImpl.layoutDirty();
-                    this._machine.updateDom();
-                }
-            }
-            else {
-                this._updateDomImpl.measurementsDirty();
-            }
-        };
-        _CommandingSurface.prototype.synchronousOpen = function () {
-            this._overflowAlignmentOffset = 0;
-            this._isOpenedMode = true;
-            this._updateDomImpl.update();
-            this._overflowAlignmentOffset = this._computeAdjustedOverflowAreaOffset();
-            this._updateDomImpl.update();
-        };
-        _CommandingSurface.prototype._computeAdjustedOverflowAreaOffset = function () {
-            // Returns any negative offset needed to prevent the shown overflowarea from clipping outside of the viewport.
-            // This function should only be called when CommandingSurface has been rendered in the opened state with
-            // an overflowAlignmentOffset of 0.
-            if (_Log.log) {
-                !this._updateDomImpl.renderedState.isOpenedMode && _Log.log("The CommandingSurface should only attempt to compute adjusted overflowArea offset " + " when it has been rendered opened");
-                this._updateDomImpl.renderedState.overflowAlignmentOffset !== 0 && _Log.log("The CommandingSurface should only attempt to compute adjusted overflowArea offset " + " when it has been rendered with an overflowAlignementOffset of 0");
-            }
-            var overflowArea = this._dom.overflowArea, boundingClientRects = this.getBoundingRects(), adjustedOffset = 0;
-            if (this._rtl) {
-                // In RTL the left edge of overflowarea prefers to align to the LEFT edge of the commandingSurface. 
-                // Make sure we avoid clipping through the RIGHT edge of the viewport
-                var viewportRight = window.innerWidth, rightOffsetFromViewport = boundingClientRects.overflowArea.right;
-                adjustedOffset = Math.min(viewportRight - rightOffsetFromViewport, 0);
-            }
-            else {
-                // In LTR the right edge of overflowarea prefers to align to the RIGHT edge of the commandingSurface.
-                // Make sure we avoid clipping through the LEFT edge of the viewport.
-                var leftOffsetFromViewport = boundingClientRects.overflowArea.left;
-                adjustedOffset = Math.min(0, leftOffsetFromViewport);
-            }
-            return adjustedOffset;
-        };
-        _CommandingSurface.prototype.synchronousClose = function () {
-            this._isOpenedMode = false;
-            this._updateDomImpl.update();
-        };
-        _CommandingSurface.prototype.updateDom = function () {
-            this._updateDomImpl.update();
-        };
-        _CommandingSurface.prototype._getDataChangeInfo = function () {
-            var _this = this;
-            var i = 0, len = 0;
-            var added = [];
-            var deleted = [];
-            var unchanged = [];
-            var prevVisible = [];
-            var prevElements = [];
-            var nextVisible = [];
-            var nextElements = [];
-            var nextOverflown = [];
-            var nextHiding = [];
-            var nextShowing = [];
-            Array.prototype.forEach.call(this._dom.actionArea.querySelectorAll(_Constants.commandSelector), function (commandElement) {
-                if (!_this._hasAnyHiddenClasses(commandElement["winControl"])) {
-                    prevVisible.push(commandElement);
-                }
-                prevElements.push(commandElement);
-            });
-            this.data.forEach(function (command) {
-                var hidden = command.hidden;
-                var hiding = hidden && !_ElementUtilities.hasClass(command.element, _Constants.ClassNames.commandHiddenClass);
-                var showing = !hidden && _ElementUtilities.hasClass(command.element, _Constants.ClassNames.commandHiddenClass);
-                var overflown = _ElementUtilities.hasClass(command.element, _Constants.ClassNames.commandPrimaryOverflownPolicyClass);
-                if (!_this._hasAnyHiddenClasses(command.element["winControl"])) {
-                    nextVisible.push(command.element);
-                }
-                if (overflown) {
-                    nextOverflown.push(command.element);
-                }
-                else if (hiding) {
-                    nextHiding.push(command.element);
-                }
-                else if (showing) {
-                    nextShowing.push(command.element);
-                }
-                nextElements.push(command.element);
-            });
-            deleted = diffElements(prevElements, nextElements);
-            unchanged = intersectElements(prevVisible, nextVisible);
-            added = diffElements(nextElements, prevElements);
-            return {
-                nextElements: nextElements,
-                prevElements: prevElements,
-                added: added,
-                deleted: deleted,
-                unchanged: unchanged,
-                hiding: nextHiding,
-                showing: nextShowing,
-                overflown: nextOverflown
-            };
-        };
-        _CommandingSurface.prototype._processNewData = function () {
-            var _this = this;
-            this._writeProfilerMark("_processNewData,info");
-            var changeInfo = this._getDataChangeInfo();
-            // Take a snapshot of the current state
-            var updateCommandAnimation = Animations._createUpdateListAnimation(changeInfo.added.concat(changeInfo.showing).concat(changeInfo.overflown), changeInfo.deleted.concat(changeInfo.hiding), changeInfo.unchanged);
-            // Unbind property mutation event listener from deleted IObservableCommands
-            changeInfo.deleted.forEach(function (deletedElement) {
-                var command = (deletedElement['winControl']);
-                if (command && command['_propertyMutations']) {
-                    command._propertyMutations.unbind(_this._refreshBound);
-                }
-            });
-            // Bind property mutation event listener to added IObservable commands
-            changeInfo.added.forEach(function (addedElement) {
-                var command = (addedElement['winControl']);
-                if (command && command['_propertyMutations']) {
-                    command._propertyMutations.bind(_this._refreshBound);
-                }
-            });
-            // Remove current ICommand elements
-            changeInfo.prevElements.forEach(function (element) {
-                if (element.parentElement) {
-                    element.parentElement.removeChild(element);
-                }
-            });
-            // Add new ICommand elements in the right order.
-            changeInfo.nextElements.forEach(function (element) {
-                _this._dom.actionArea.appendChild(element);
-            });
-            // Actually hide commands now that the animation has been created
-            changeInfo.hiding.forEach(function (element) {
-                _ElementUtilities.addClass(element, _Constants.ClassNames.commandHiddenClass);
-            });
-            // Actually show commands now that the animation has been created
-            changeInfo.showing.forEach(function (element) {
-                _ElementUtilities.removeClass(element, _Constants.ClassNames.commandHiddenClass);
-            });
-            // Ensure that the overflow button is always the last element in the actionarea
-            this._dom.actionArea.appendChild(this._dom.overflowButton);
-            // Execute the animation.
-            updateCommandAnimation.execute();
-            // Indicate processing was successful.
-            return true;
-        };
-        _CommandingSurface.prototype._measure = function () {
-            var _this = this;
-            this._writeProfilerMark("_measure,info");
-            if (this._canMeasure()) {
-                var originalDisplayStyle = this._dom.overflowButton.style.display;
-                this._dom.overflowButton.style.display = "";
-                var overflowButtonWidth = _ElementUtilities._getPreciseTotalWidth(this._dom.overflowButton);
-                this._dom.overflowButton.style.display = originalDisplayStyle;
-                var actionAreaContentBoxWidth = _ElementUtilities._getPreciseContentWidth(this._dom.actionArea);
-                var separatorWidth = 0;
-                var standardCommandWidth = 0;
-                var contentCommandWidths = {};
-                this._primaryCommands.forEach(function (command) {
-                    // Ensure that the element we are measuring does not have display: none (e.g. it was just added, and it
-                    // will be animated in)
-                    var originalDisplayStyle = command.element.style.display;
-                    command.element.style.display = "inline-block";
-                    if (command.type === _Constants.typeContent) {
-                        // Measure each 'content' command type that we find
-                        contentCommandWidths[_this._commandUniqueId(command)] = _ElementUtilities._getPreciseTotalWidth(command.element);
-                    }
-                    else if (command.type === _Constants.typeSeparator) {
-                        // Measure the first 'separator' command type we find.
-                        if (!separatorWidth) {
-                            separatorWidth = _ElementUtilities._getPreciseTotalWidth(command.element);
-                        }
-                    }
-                    else {
-                        // Button, toggle, 'flyout' command types have the same width. Measure the first one we find.
-                        if (!standardCommandWidth) {
-                            standardCommandWidth = _ElementUtilities._getPreciseTotalWidth(command.element);
-                        }
-                    }
-                    // Restore the original display style
-                    command.element.style.display = originalDisplayStyle;
-                });
-                this._cachedMeasurements = {
-                    contentCommandWidths: contentCommandWidths,
-                    separatorWidth: separatorWidth,
-                    standardCommandWidth: standardCommandWidth,
-                    overflowButtonWidth: overflowButtonWidth,
-                    actionAreaContentBoxWidth: actionAreaContentBoxWidth,
-                };
-                // Indicate measure was successful
-                return true;
-            }
-            else {
-                // Indicate measure was unsuccessful
-                return false;
-            }
-        };
-        _CommandingSurface.prototype._layoutCommands = function () {
-            var _this = this;
-            this._writeProfilerMark("_layoutCommands,StartTM");
-            var visibleSecondaryCommands = [];
-            var visiblePrimaryCommands = [];
-            var visiblePrimaryCommandsForActionArea = [];
-            var visiblePrimaryCommandsForOverflowArea = [];
-            // Separate hidden commands from visible commands.
-            // Organize visible commands by section.
-            this.data.forEach(function (command) {
-                _this._clearHiddenPolicyClasses(command);
-                if (!command.hidden) {
-                    if (command.section === _Constants.secondaryCommandSection) {
-                        visibleSecondaryCommands.push(command);
-                    }
-                    else {
-                        visiblePrimaryCommands.push(command);
-                    }
-                }
-            });
-            var hasVisibleSecondaryCommand = visibleSecondaryCommands.length > 0;
-            var primaryCommandsLocation = this._getVisiblePrimaryCommandsLocation(visiblePrimaryCommands, hasVisibleSecondaryCommand);
-            visiblePrimaryCommandsForActionArea = primaryCommandsLocation.commandsForActionArea;
-            visiblePrimaryCommandsForOverflowArea = primaryCommandsLocation.commandsForOverflowArea;
-            //
-            // Layout commands in the action area
-            //
-            // Apply the policy classes for overflown and secondary commands.
-            visiblePrimaryCommandsForOverflowArea.forEach(function (command) { return _ElementUtilities.addClass(command.element, _Constants.ClassNames.commandPrimaryOverflownPolicyClass); });
-            visibleSecondaryCommands.forEach(function (command) { return _ElementUtilities.addClass(command.element, _Constants.ClassNames.commandSecondaryOverflownPolicyClass); });
-            this._hideSeparatorsIfNeeded(visiblePrimaryCommandsForActionArea);
-            //
-            // Layout commands in the overflow area 
-            // Project overflowing and secondary commands into the overflowArea as MenuCommands.
-            //
-            // Clean up previous MenuCommand projections
-            _ElementUtilities.empty(this._dom.overflowArea);
-            this._menuCommandProjections.map(function (menuCommand) {
-                menuCommand.dispose();
-            });
-            // Set up a custom content flyout if there will be "content" typed commands in the overflowarea.
-            var isCustomContent = function (command) {
-                return command.type === _Constants.typeContent;
-            };
-            var hasCustomContent = visiblePrimaryCommandsForOverflowArea.some(isCustomContent) || visibleSecondaryCommands.some(isCustomContent);
-            if (hasCustomContent && !this._contentFlyout) {
-                this._contentFlyoutInterior = _Global.document.createElement("div");
-                _ElementUtilities.addClass(this._contentFlyoutInterior, _Constants.ClassNames.contentFlyoutCssClass);
-                this._contentFlyout = new _Flyout.Flyout();
-                this._contentFlyout.element.appendChild(this._contentFlyoutInterior);
-                _Global.document.body.appendChild(this._contentFlyout.element);
-                this._contentFlyout.onbeforeshow = function () {
-                    _ElementUtilities.empty(_this._contentFlyoutInterior);
-                    _ElementUtilities._reparentChildren(_this._chosenCommand.element, _this._contentFlyoutInterior);
-                };
-                this._contentFlyout.onafterhide = function () {
-                    _ElementUtilities._reparentChildren(_this._contentFlyoutInterior, _this._chosenCommand.element);
-                };
-            }
-            var hasToggleCommands = false, menuCommandProjections = [];
-            // Add primary commands that have overflowed.
-            visiblePrimaryCommandsForOverflowArea.forEach(function (command) {
-                if (command.type === _Constants.typeToggle) {
-                    hasToggleCommands = true;
-                }
-                menuCommandProjections.push(_this._projectAsMenuCommand(command));
-            });
-            // Add new separator between primary and secondary command, if applicable.
-            if (visiblePrimaryCommandsForOverflowArea.length > 0 && visibleSecondaryCommands.length > 0) {
-                var separator = new _CommandingSurfaceMenuCommand._MenuCommand(null, {
-                    type: _Constants.typeSeparator
-                });
-                menuCommandProjections.push(separator);
-            }
-            // Add secondary commands
-            visibleSecondaryCommands.forEach(function (command) {
-                if (command.type === _Constants.typeToggle) {
-                    hasToggleCommands = true;
-                }
-                menuCommandProjections.push(_this._projectAsMenuCommand(command));
-            });
-            this._hideSeparatorsIfNeeded(menuCommandProjections);
-            // Add menuCommandProjections to the DOM.
-            menuCommandProjections.forEach(function (command) {
-                _this._dom.overflowArea.appendChild(command.element);
-            });
-            this._menuCommandProjections = menuCommandProjections;
-            // Reserve additional horizontal space for toggle icons if any MenuCommand projection is type "toggle"
-            _ElementUtilities[hasToggleCommands ? "addClass" : "removeClass"](this._dom.overflowArea, _Constants.ClassNames.menuContainsToggleCommandClass);
-            if (menuCommandProjections.length > 0) {
-                // Re-append spacer to the end of the oveflowarea if there are visible commands there.
-                // Otherwise the overflow area should be empty and not take up height.
-                this._dom.overflowArea.appendChild(this._dom.overflowAreaSpacer);
-            }
-            //
-            // Style the overflow button
-            //
-            var needsOverflowButton = this._needsOverflowButton(visiblePrimaryCommandsForActionArea.length > 0, menuCommandProjections.length > 0);
-            this._dom.overflowButton.style.display = needsOverflowButton ? "" : "none";
-            this._writeProfilerMark("_layoutCommands,StopTM");
-            // Indicate layout was successful.
-            return true;
-        };
-        _CommandingSurface.prototype._getVisiblePrimaryCommandsInfo = function (visibleCommands) {
-            // PRECONDITION: Assumes that for every command in visibleCommands, command.hidden === false;
-            // Sorts and designates commands for the actionarea or the overflowarea, 
-            // depending on available space and the priority order of the commands
-            var width = 0;
-            var visibleCommandsInfo = [];
-            var priority = 0;
-            var currentAssignedPriority = 0;
-            for (var i = visibleCommands.length - 1; i >= 0; i--) {
-                var command = visibleCommands[i];
-                if (command.priority === undefined) {
-                    priority = currentAssignedPriority--;
-                }
-                else {
-                    priority = command.priority;
-                }
-                width = this._getCommandWidth(command);
-                visibleCommandsInfo.unshift({
-                    command: command,
-                    width: width,
-                    priority: priority
-                });
-            }
-            return visibleCommandsInfo;
-        };
-        _CommandingSurface.prototype._getVisiblePrimaryCommandsLocation = function (visiblePrimaryCommands, isThereAVisibleSecondaryCommand) {
-            // Returns two lists of primary commands, those which fit can in the actionarea and those which will overflow.
-            var commandsForActionArea = [];
-            var commandsForOverflowArea = [];
-            var visibleCommandsInfo = this._getVisiblePrimaryCommandsInfo(visiblePrimaryCommands);
-            // Sort by ascending priority 
-            var sortedCommandsInfo = visibleCommandsInfo.slice(0).sort(function (commandInfo1, commandInfo2) {
-                return commandInfo1.priority - commandInfo2.priority;
-            });
-            var maxPriority = Number.MAX_VALUE;
-            var currentAvailableWidth = this._cachedMeasurements.actionAreaContentBoxWidth;
-            // Even though we don't yet know if we will have any primary commands overflowing into the 
-            // overflow area, see if our current state already justifies a visible overflow button.
-            var overflowButtonAlreadyNeeded = this._needsOverflowButton(visiblePrimaryCommands.length > 0, isThereAVisibleSecondaryCommand);
-            for (var i = 0, len = sortedCommandsInfo.length; i < len; i++) {
-                currentAvailableWidth -= sortedCommandsInfo[i].width;
-                // Until we have reached the final sorted command, we presume we will need to fit 
-                // the overflow button into the action area as well. If we are on the last command, 
-                // and we don't already need an overflow button, free up the reserved space before 
-                // checking whether or not the last command fits
-                var additionalSpaceNeeded = (!overflowButtonAlreadyNeeded && (i === len - 1) ? 0 : this._cachedMeasurements.overflowButtonWidth);
-                if (currentAvailableWidth < additionalSpaceNeeded) {
-                    // All primary commands with a priority greater than this final value should overflow.
-                    maxPriority = sortedCommandsInfo[i].priority - 1;
-                    break;
-                }
-            }
-            // Designate each command to either the action area or the overflow area
-            visibleCommandsInfo.forEach(function (commandInfo) {
-                if (commandInfo.priority <= maxPriority) {
-                    commandsForActionArea.push(commandInfo.command);
-                }
-                else {
-                    commandsForOverflowArea.push(commandInfo.command);
-                }
-            });
-            return {
-                commandsForActionArea: commandsForActionArea,
-                commandsForOverflowArea: commandsForOverflowArea,
-            };
-        };
-        _CommandingSurface.prototype._needsOverflowButton = function (hasVisibleCommandsInActionArea, hasVisibleCommandsInOverflowArea) {
-            // The following "Inclusive-Or" conditions inform us if an overflow button is needed.
-            // 1. There are going to be visible commands in the overflowarea. (primary or secondary)
-            // 2. The action area is expandable and contains at least one visible primary command.
-            if (hasVisibleCommandsInOverflowArea) {
-                return true;
-            }
-            else if (this._hasExpandableActionArea() && hasVisibleCommandsInActionArea) {
-                return true;
-            }
-            else {
-                return false;
-            }
-        };
-        _CommandingSurface.prototype._minimalLayout = function () {
-            // Normally the overflowButton will be updated based on the most accurate measurements when layoutCommands() is run, 
-            // However if we are unable to measure, then layout will not run. Normally if we cannot measure it means the control
-            // is not rendered. However, when the control is closed with closedDisplayMode: 'minimal' we cannot measure and the 
-            // control is rendered. Perform a minimal layout to show/hide the overflow button whether or not there are any
-            // visible commands to show.
-            if (this.closedDisplayMode === ClosedDisplayMode.minimal) {
-                var isCommandVisible = function (command) {
-                    return !command.hidden;
-                };
-                var hasVisibleCommand = this.data.some(isCommandVisible);
-                this._dom.overflowButton.style.display = (hasVisibleCommand ? "" : "none");
-            }
-        };
-        _CommandingSurface.prototype._commandUniqueId = function (command) {
-            return _ElementUtilities._uniqueID(command.element);
-        };
-        _CommandingSurface.prototype._getCommandWidth = function (command) {
-            if (command.type === _Constants.typeContent) {
-                return this._cachedMeasurements.contentCommandWidths[this._commandUniqueId(command)];
-            }
-            else if (command.type === _Constants.typeSeparator) {
-                return this._cachedMeasurements.separatorWidth;
-            }
-            else {
-                return this._cachedMeasurements.standardCommandWidth;
-            }
-        };
-        _CommandingSurface.prototype._projectAsMenuCommand = function (originalCommand) {
-            var _this = this;
-            var menuCommand = new _CommandingSurfaceMenuCommand._MenuCommand(null, {
-                label: originalCommand.label,
-                type: (originalCommand.type === _Constants.typeContent ? _Constants.typeFlyout : originalCommand.type) || _Constants.typeButton,
-                disabled: originalCommand.disabled,
-                flyout: originalCommand.flyout,
-                tooltip: originalCommand.tooltip,
-                beforeInvoke: function () {
-                    // Save the command that was selected
-                    _this._chosenCommand = (menuCommand["_originalICommand"]);
-                    // If this WinJS.UI.MenuCommand has type: toggle, we should also toggle the value of the original WinJS.UI.Command
-                    if (_this._chosenCommand.type === _Constants.typeToggle) {
-                        _this._chosenCommand.selected = !_this._chosenCommand.selected;
-                    }
-                }
-            });
-            if (originalCommand.selected) {
-                menuCommand.selected = true;
-            }
-            if (originalCommand.extraClass) {
-                menuCommand.extraClass = originalCommand.extraClass;
-            }
-            if (originalCommand.type === _Constants.typeContent) {
-                if (!menuCommand.label) {
-                    menuCommand.label = _Constants.contentMenuCommandDefaultLabel;
-                }
-                menuCommand.flyout = this._contentFlyout;
-            }
-            else {
-                menuCommand.onclick = originalCommand.onclick;
-            }
-            menuCommand["_originalICommand"] = originalCommand;
-            return menuCommand;
-        };
-        _CommandingSurface.prototype._hideSeparatorsIfNeeded = function (commands) {
-            var prevType = _Constants.typeSeparator;
-            var command;
-            // Hide all leading or consecutive separators
-            var commandsLength = commands.length;
-            commands.forEach(function (command) {
-                if (command.type === _Constants.typeSeparator && prevType === _Constants.typeSeparator) {
-                    _ElementUtilities.addClass(command.element, _Constants.ClassNames.commandSeparatorHiddenPolicyClass);
-                }
-                prevType = command.type;
-            });
-            for (var i = commandsLength - 1; i >= 0; i--) {
-                command = commands[i];
-                if (command.type === _Constants.typeSeparator) {
-                    _ElementUtilities.addClass(command.element, _Constants.ClassNames.commandSeparatorHiddenPolicyClass);
-                }
-                else {
-                    break;
-                }
-            }
-        };
-        _CommandingSurface.prototype._hasExpandableActionArea = function () {
-            switch (this.closedDisplayMode) {
-                case ClosedDisplayMode.none:
-                case ClosedDisplayMode.minimal:
-                case ClosedDisplayMode.compact:
-                    return true;
-                case ClosedDisplayMode.full:
-                default:
-                    return false;
-            }
-        };
-        _CommandingSurface.prototype._clearAnimation = function () {
-            var transformScriptName = _BaseUtils._browserStyleEquivalents["transform"].scriptName;
-            this._dom.actionAreaContainer.style[transformScriptName] = "";
-            this._dom.actionArea.style[transformScriptName] = "";
-            this._dom.overflowAreaContainer.style[transformScriptName] = "";
-            this._dom.overflowArea.style[transformScriptName] = "";
-        };
-        /// Display options for the actionarea when the _CommandingSurface is closed.
-        _CommandingSurface.ClosedDisplayMode = ClosedDisplayMode;
-        /// Display options used by the _Commandingsurface to determine which direction it should expand when opening.
-        _CommandingSurface.OverflowDirection = OverflowDirection;
-        _CommandingSurface.supportedForProcessing = true;
-        return _CommandingSurface;
-    })();
-    exports._CommandingSurface = _CommandingSurface;
-    _Base.Class.mix(_CommandingSurface, _Events.createEventProperties(_Constants.EventNames.beforeOpen, _Constants.EventNames.afterOpen, _Constants.EventNames.beforeClose, _Constants.EventNames.afterClose));
-    // addEventListener, removeEventListener, dispatchEvent
-    _Base.Class.mix(_CommandingSurface, _Control.DOMEventMixin);
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <reference path="../../../../typings/require.d.ts" />
-define('WinJS/Controls/CommandingSurface',["require", "exports"], function (require, exports) {
-    var module = null;
-    function getModule() {
-        if (!module) {
-            require(["./CommandingSurface/_CommandingSurface"], function (m) {
-                module = m;
-            });
-        }
-        return module._CommandingSurface;
-    }
-    var publicMembers = Object.create({}, {
-        _CommandingSurface: {
-            get: function () {
-                return getModule();
-            }
-        }
-    });
-    return publicMembers;
-});
-
-
-define('require-style!less/styles-toolbar',[],function(){});
-define('WinJS/Controls/ToolBar/_ToolBar',["require", "exports", "../../Core/_Base", "../ToolBar/_Constants", "../CommandingSurface", "../../Utilities/_Control", "../../Utilities/_Dispose", "../../Utilities/_ElementUtilities", "../../Core/_ErrorFromName", '../../Core/_Events', "../../Core/_Global", '../../_LightDismissService', "../../Core/_Resources", '../../Utilities/_OpenCloseMachine', "../../Core/_WriteProfilerMark"], function (require, exports, _Base, _Constants, _CommandingSurface, _Control, _Dispose, _ElementUtilities, _ErrorFromName, _Events, _Global, _LightDismissService, _Resources, _OpenCloseMachine, _WriteProfilerMark) {
-    require(["require-style!less/styles-toolbar"]);
-    "use strict";
-    // The WinJS ToolBar is a specialized UI wrapper for the private _CommandingSurface UI component. The _CommandingSurface is responsible for rendering 
-    // opened and closed states, knowing how to create the open and close animations, laying out commands, creating command hide/show animations and 
-    // keyboard navigation across commands. The WinJS ToolBar is very similar to the WinJS AppBar, however the ToolBar is meant to be positioned in line 
-    // with your app content whereas the AppBar is meant to overlay your app content.
-    //
-    // The responsibilities of the ToolBar include:
-    //
-    //    - Seamlessly hosting the _CommandingSurface
-    //        - From an end user perspective, there should be no visual distinction between where the ToolBar ends and the _CommandingSurface begins.
-    //            - ToolBar wants to rely on the _CommandingSurface to do as much of the rendering as possible. The ToolBar relies on the _CommandingSurface to render its opened 
-    //              and closed states-- which defines the overall height of the ToolBar and CommandingSurface elements. The ToolBar has no policy or CSS styles regarding its own 
-    //              height and ToolBar takes advantage of the default behavior of its DIV element which is to always grow or shrink to match the height of its content.
-    //        - From an end developer perspective, the _CommandingSurface should be abstracted as an implementation detail of the ToolBar as much as possible.
-    //            - Developers should never have to interact with the CommandingSurface directly.The ToolBar exposes the majority of _CommandingSurface functionality through its 
-    //              own APIs
-    //            - There are some  HTML elements inside of the _CommandingSurface's DOM that a developer might like to style. After the _CommandingSurface has been instantiated 
-    //              and added to the ToolBar DOM, the ToolBar will inject its own "toolbar" specific class-names onto these elements to make them more discoverable to developers.
-    //            - Example of developer styling guidelines https://msdn.microsoft.com/en-us/library/windows/apps/jj839733.asp
-    //
-    //    - Open direction:
-    //        - The ToolBar and its _CommandingSurface component can open upwards or downwards.Because there is no policy on where the ToolBar can be placed in an App, the ToolBar 
-    //          always wants to avoid opening in a direction that would cause any of its content to clip outside of the screen.
-    //        - When the ToolBar is opening, it will always choose to expand in the direction(up or down) that currently has the most available space between the edge of the 
-    //          ToolBar element and the corresponding edge of the visual viewport.
-    //        - This means that the a ToolBar near the bottom of the page will open upwards, but if the page is scrolled down such that the ToolBar is now near the top, the next
-    //          time the ToolBar is opened it will open downwards.
-    //
-    //    - Light dismiss
-    //        - The ToolBar is a light dismissible when opened. This means that the ToolBar is closed thru a variety of cues such as tapping anywhere outside of it, 
-    //          pressing the escape key, and resizing the window.ToolBar relies on the _LightDismissService component for most of this functionality.
-    //          The only pieces the ToolBar is responsible for are:
-    //            - Describing what happens when a light dismiss is triggered on the ToolBar .
-    //            - Describing how the ToolBar should take / restore focus when it becomes the topmost light dismissible in the light dismiss stack
-    //        - Debugging Tip: Light dismiss can make debugging an opened ToolBar tricky.A good idea is to temporarily suspend the light dismiss cue that triggers when clicking
-    //          outside of the current window.This can be achieved by executing the following code in the JavaScript console window: "WinJS.UI._LightDismissService._setDebug(true)"
-    //
-    //    - Inline element when closed, overlay when opened:
-    //        - The design of the toolbar called for it to be an control that developers can place inline with their other app content.When the ToolBar is closed it exists as a an
-    //          element in your app, next to other app content and take up space in the flow of the document.
-    //        - However, when the ToolBar opens, its vertical height will increase.Normally the change in height of an inline element will cause all of the other elements below the
-    //          expanding element to move out of the way.Rather than push the rest of the app content down when opening, the design of the ToolBar called for it to overlay that content other content, while still taking up the same vertical space in the document as it did when closed.
-    //        - The implementation of this feature is very complicated:
-    //            - The only way one element can overlay another is to remove it from the flow of the document and give it a new CSS positioning like "absolute" or "fixed".
-    //            - However, simply removing the ToolBar element from the document to make it an overlay, would leave behind a gap in the document that all the neighboring elements 
-    //              would try to fill by shifting over, leading to a jarring reflow of many elements whenever the ToolBar was opened.This was also undesirable
-    //            - The final solution is as follows
-    //                - Create a transparent placeholder element that is the exact same height and width as the closed ToolBar element.
-    //                - Removing the ToolBar element from its place in the document while simultaneously inserting the placeholder element into the same spot the ToolBar element was 
-    //                  just removed from.
-    //                - Inserting the ToolBar element as a direct child of the body and giving it css position: fixed; 
-    //                  We insert it directly into the body element because while opened, ToolBar is a Light dismissible overlay and is subject to the same stacking context pitfalls 
-    //                  as any other light dismissible. https://github.com/winjs/winjs/wiki/Dismissables-and-Stacking-Contexts
-    //                - Reposition the ToolBar element to be exactly overlaid on top of the placeholder element.
-    //                - Render the ToolBar as opened, via the _CommandingSurface API, increasing the overall height of the ToolBar.
-    //            - Closing the ToolBar is basically the same steps but in reverse.
-    //        - One limitation to this implementation is that developers may not position the ToolBar element themselves directly via the CSS "position" or "float" properties.
-    //            - This is because The ToolBar expects its element to be in the flow of the document when closed, and the placeholder element would not receive these same styles
-    //              when inserted to replace the ToolBar element.
-    //            - An easy workaround for developers is to wrap the ToolBar into another DIV element that they may style and position however they'd like.
-    //
-    //        - Responding to the IHM:
-    //            - If the ToolBar is opened when the IHM is shown, it will close itself.This is to avoid scenarios where the IHM totally occludes the opened ToolBar. If the ToolBar 
-    //              did not close itself, then the next mouse or touch input within the App wouldn't appear to do anything since it would just go to closing the light dismissible 
-    //              ToolBar anyway.
-    var strings = {
-        get ariaLabel() {
-            return _Resources._getWinJSString("ui/toolbarAriaLabel").value;
-        },
-        get overflowButtonAriaLabel() {
-            return _Resources._getWinJSString("ui/toolbarOverflowButtonAriaLabel").value;
-        },
-        get mustContainCommands() {
-            return "The toolbar can only contain WinJS.UI.Command or WinJS.UI.AppBarCommand controls";
-        },
-        get duplicateConstruction() {
-            return "Invalid argument: Controls may only be instantiated one time for each DOM element";
-        }
-    };
-    var ClosedDisplayMode = {
-        /// <field locid="WinJS.UI.ToolBar.ClosedDisplayMode.compact" helpKeyword="WinJS.UI.ToolBar.ClosedDisplayMode.compact">
-        /// When the ToolBar is closed, the height of the ToolBar is reduced such that button commands are still visible, but their labels are hidden.
-        /// </field>
-        compact: "compact",
-        /// <field locid="WinJS.UI.ToolBar.ClosedDisplayMode.full" helpKeyword="WinJS.UI.ToolBar.ClosedDisplayMode.full">
-        /// When the ToolBar is closed, the height of the ToolBar is always sized to content.
-        /// </field>
-        full: "full",
-    };
-    var closedDisplayModeClassMap = {};
-    closedDisplayModeClassMap[ClosedDisplayMode.compact] = _Constants.ClassNames.compactClass;
-    closedDisplayModeClassMap[ClosedDisplayMode.full] = _Constants.ClassNames.fullClass;
-    // Versions of add/removeClass that are no ops when called with falsy class names.
-    function addClass(element, className) {
-        className && _ElementUtilities.addClass(element, className);
-    }
-    function removeClass(element, className) {
-        className && _ElementUtilities.removeClass(element, className);
-    }
-    /// <field>
-    /// <summary locid="WinJS.UI.ToolBar">
-    /// Displays ICommands within the flow of the app. Use the ToolBar around other statically positioned app content.
-    /// </summary>
-    /// </field>
-    /// <icon src="ui_winjs.ui.toolbar.12x12.png" width="12" height="12" />
-    /// <icon src="ui_winjs.ui.toolbar.16x16.png" width="16" height="16" />
-    /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.ToolBar">
-    /// <button data-win-control="WinJS.UI.Command" data-win-options="{id:'',label:'example',icon:'back',type:'button',onclick:null,section:'primary'}"></button>
-    /// </div>]]></htmlSnippet>
-    /// <part name="toolbar" class="win-toolbar" locid="WinJS.UI.ToolBar_part:toolbar">The entire ToolBar control.</part>
-    /// <part name="toolbar-overflowbutton" class="win-toolbar-overflowbutton" locid="WinJS.UI.ToolBar_part:ToolBar-overflowbutton">The toolbar overflow button.</part>
-    /// <part name="toolbar-overflowarea" class="win-toolbar-overflowarea" locid="WinJS.UI.ToolBar_part:ToolBar-overflowarea">The container for toolbar commands that overflow.</part>
-    /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-    /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-    var ToolBar = (function () {
-        function ToolBar(element, options) {
-            /// <signature helpKeyword="WinJS.UI.ToolBar.ToolBar">
-            /// <summary locid="WinJS.UI.ToolBar.constructor">
-            /// Creates a new ToolBar control.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.UI.ToolBar.constructor_p:element">
-            /// The DOM element that will host the control.
-            /// </param>
-            /// <param name="options" type="Object" locid="WinJS.UI.ToolBar.constructor_p:options">
-            /// The set of properties and values to apply to the new ToolBar control.
-            /// </param>
-            /// <returns type="WinJS.UI.ToolBar" locid="WinJS.UI.ToolBar.constructor_returnValue">
-            /// The new ToolBar control.
-            /// </returns>
-            /// </signature>
-            var _this = this;
-            if (options === void 0) { options = {}; }
-            // State private to the _updateDomImpl family of method. No other methods should make use of it.
-            //
-            // Nothing has been rendered yet so these are all initialized to undefined. Because
-            // they are undefined, the first time _updateDomImpl is called, they will all be
-            // rendered.
-            this._updateDomImpl_renderedState = {
-                isOpenedMode: undefined,
-                closedDisplayMode: undefined,
-                prevInlineWidth: undefined,
-            };
-            this._writeProfilerMark("constructor,StartTM");
-            // Check to make sure we weren't duplicated
-            if (element && element["winControl"]) {
-                throw new _ErrorFromName("WinJS.UI.ToolBar.DuplicateConstruction", strings.duplicateConstruction);
-            }
-            this._initializeDom(element || _Global.document.createElement("div"));
-            var stateMachine = new _OpenCloseMachine.OpenCloseMachine({
-                eventElement: this.element,
-                onOpen: function () {
-                    var openAnimation = _this._commandingSurface.createOpenAnimation(_this._getClosedHeight());
-                    _this._synchronousOpen();
-                    return openAnimation.execute();
-                },
-                onClose: function () {
-                    var closeAnimation = _this._commandingSurface.createCloseAnimation(_this._getClosedHeight());
-                    return closeAnimation.execute().then(function () {
-                        _this._synchronousClose();
-                    });
-                },
-                onUpdateDom: function () {
-                    _this._updateDomImpl();
-                },
-                onUpdateDomWithIsOpened: function (isOpened) {
-                    _this._isOpenedMode = isOpened;
-                    _this._updateDomImpl();
-                }
-            });
-            // Events
-            this._handleShowingKeyboardBound = this._handleShowingKeyboard.bind(this);
-            _ElementUtilities._inputPaneListener.addEventListener(this._dom.root, "showing", this._handleShowingKeyboardBound);
-            // Initialize private state.
-            this._disposed = false;
-            this._cachedClosedHeight = null;
-            this._commandingSurface = new _CommandingSurface._CommandingSurface(this._dom.commandingSurfaceEl, { openCloseMachine: stateMachine });
-            addClass(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-actionarea"), _Constants.ClassNames.actionAreaCssClass);
-            addClass(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-overflowarea"), _Constants.ClassNames.overflowAreaCssClass);
-            addClass(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-overflowbutton"), _Constants.ClassNames.overflowButtonCssClass);
-            addClass(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-ellipsis"), _Constants.ClassNames.ellipsisCssClass);
-            this._isOpenedMode = _Constants.defaultOpened;
-            this._dismissable = new _LightDismissService.LightDismissableElement({
-                element: this._dom.root,
-                tabIndex: this._dom.root.hasAttribute("tabIndex") ? this._dom.root.tabIndex : -1,
-                onLightDismiss: function () {
-                    _this.close();
-                },
-                onTakeFocus: function (useSetActive) {
-                    _this._dismissable.restoreFocus() || _this._commandingSurface.takeFocus(useSetActive);
-                }
-            });
-            // Initialize public properties.
-            this.closedDisplayMode = _Constants.defaultClosedDisplayMode;
-            this.opened = this._isOpenedMode;
-            _Control.setOptions(this, options);
-            // Exit the Init state.
-            _ElementUtilities._inDom(this.element).then(function () {
-                return _this._commandingSurface.initialized;
-            }).then(function () {
-                stateMachine.exitInit();
-                _this._writeProfilerMark("constructor,StopTM");
-            });
-        }
-        Object.defineProperty(ToolBar.prototype, "element", {
-            /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.ToolBar.element" helpKeyword="WinJS.UI.ToolBar.element">
-            /// Gets the DOM element that hosts the ToolBar.
-            /// </field>
-            get: function () {
-                return this._dom.root;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(ToolBar.prototype, "data", {
-            /// <field type="WinJS.Binding.List" locid="WinJS.UI.ToolBar.data" helpKeyword="WinJS.UI.ToolBar.data">
-            /// Gets or sets the Binding List of WinJS.UI.Command for the ToolBar.
-            /// </field>
-            get: function () {
-                return this._commandingSurface.data;
-            },
-            set: function (value) {
-                this._commandingSurface.data = value;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(ToolBar.prototype, "closedDisplayMode", {
-            /// <field type="String" locid="WinJS.UI.ToolBar.closedDisplayMode" helpKeyword="WinJS.UI.ToolBar.closedDisplayMode">
-            /// Gets or sets the closedDisplayMode for the ToolBar. Values are "compact" and "full".
-            /// </field>
-            get: function () {
-                return this._commandingSurface.closedDisplayMode;
-            },
-            set: function (value) {
-                if (ClosedDisplayMode[value]) {
-                    this._commandingSurface.closedDisplayMode = value;
-                    this._cachedClosedHeight = null;
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(ToolBar.prototype, "opened", {
-            /// <field type="Boolean" hidden="true" locid="WinJS.UI.ToolBar.opened" helpKeyword="WinJS.UI.ToolBar.opened">
-            /// Gets or sets whether the ToolBar is currently opened.
-            /// </field>
-            get: function () {
-                return this._commandingSurface.opened;
-            },
-            set: function (value) {
-                this._commandingSurface.opened = value;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        ToolBar.prototype.open = function () {
-            /// <signature helpKeyword="WinJS.UI.ToolBar.open">
-            /// <summary locid="WinJS.UI.ToolBar.open">
-            /// Opens the ToolBar
-            /// </summary>
-            /// </signature>
-            this._commandingSurface.open();
-        };
-        ToolBar.prototype.close = function () {
-            /// <signature helpKeyword="WinJS.UI.ToolBar.close">
-            /// <summary locid="WinJS.UI.ToolBar.close">
-            /// Closes the ToolBar
-            /// </summary>
-            /// </signature>
-            this._commandingSurface.close();
-        };
-        ToolBar.prototype.dispose = function () {
-            /// <signature helpKeyword="WinJS.UI.ToolBar.dispose">
-            /// <summary locid="WinJS.UI.ToolBar.dispose">
-            /// Disposes this ToolBar.
-            /// </summary>
-            /// </signature>
-            if (this._disposed) {
-                return;
-            }
-            this._disposed = true;
-            _LightDismissService.hidden(this._dismissable);
-            // Disposing the _commandingSurface will trigger dispose on its OpenCloseMachine and synchronously complete any animations that might have been running.
-            this._commandingSurface.dispose();
-            // If page navigation is happening, we don't want the ToolBar left behind in the body.
-            // Synchronoulsy close the ToolBar to force it out of the body and back into its parent element.
-            this._synchronousClose();
-            _ElementUtilities._inputPaneListener.removeEventListener(this._dom.root, "showing", this._handleShowingKeyboardBound);
-            _Dispose.disposeSubTree(this.element);
-        };
-        ToolBar.prototype.forceLayout = function () {
-            /// <signature helpKeyword="WinJS.UI.ToolBar.forceLayout">
-            /// <summary locid="WinJS.UI.ToolBar.forceLayout">
-            /// Forces the ToolBar to update its layout. Use this function when the window did not change size, but the container of the ToolBar changed size.
-            /// </summary>
-            /// </signature>
-            this._commandingSurface.forceLayout();
-        };
-        ToolBar.prototype.getCommandById = function (id) {
-            /// <signature helpKeyword="WinJS.UI.ToolBar.getCommandById">
-            /// <summary locid="WinJS.UI.ToolBar.getCommandById">
-            /// Retrieves the command with the specified ID from this ToolBar.
-            /// If more than one command is found, this method returns the first command found.
-            /// </summary>
-            /// <param name="id" type="String" locid="WinJS.UI.ToolBar.getCommandById_p:id">Id of the command to return.</param>
-            /// <returns type="object" locid="WinJS.UI.ToolBar.getCommandById_returnValue">
-            /// The command found, or null if no command is found.
-            /// </returns>
-            /// </signature>
-            return this._commandingSurface.getCommandById(id);
-        };
-        ToolBar.prototype.showOnlyCommands = function (commands) {
-            /// <signature helpKeyword="WinJS.UI.ToolBar.showOnlyCommands">
-            /// <summary locid="WinJS.UI.ToolBar.showOnlyCommands">
-            /// Show the specified commands, hiding all of the others in the ToolBar.
-            /// </summary>
-            /// <param name="commands" type="Array" locid="WinJS.UI.ToolBar.showOnlyCommands_p:commands">
-            /// An array of the commands to show. The array elements may be Command objects, or the string identifiers (IDs) of commands.
-            /// </param>
-            /// </signature>
-            return this._commandingSurface.showOnlyCommands(commands);
-        };
-        ToolBar.prototype._writeProfilerMark = function (text) {
-            _WriteProfilerMark("WinJS.UI.ToolBar:" + this._id + ":" + text);
-        };
-        ToolBar.prototype._initializeDom = function (root) {
-            this._writeProfilerMark("_intializeDom,info");
-            // Attaching JS control to DOM element
-            root["winControl"] = this;
-            this._id = root.id || _ElementUtilities._uniqueID(root);
-            _ElementUtilities.addClass(root, _Constants.ClassNames.controlCssClass);
-            _ElementUtilities.addClass(root, _Constants.ClassNames.disposableCssClass);
-            // Make sure we have an ARIA role
-            var role = root.getAttribute("role");
-            if (!role) {
-                root.setAttribute("role", "menubar");
-            }
-            var label = root.getAttribute("aria-label");
-            if (!label) {
-                root.setAttribute("aria-label", strings.ariaLabel);
-            }
-            // Create element for commandingSurface and reparent any declarative Commands.
-            // The CommandingSurface constructor will parse child elements as AppBarCommands.
-            var commandingSurfaceEl = document.createElement("DIV");
-            _ElementUtilities._reparentChildren(root, commandingSurfaceEl);
-            root.appendChild(commandingSurfaceEl);
-            // While the ToolBar is open, it will place itself in the <body> so it can become a light dismissible
-            // overlay. It leaves the placeHolder element behind as stand in at the ToolBar's original DOM location
-            // to avoid reflowing surrounding app content and create the illusion that the ToolBar hasn't moved along
-            // the x or y planes.
-            var placeHolder = _Global.document.createElement("DIV");
-            _ElementUtilities.addClass(placeHolder, _Constants.ClassNames.placeHolderCssClass);
-            // If the ToolBar's original HTML parent node is disposed while the ToolBar is open and repositioned as 
-            // a temporary child of the <body>, make sure that calling dispose on the placeHolder element will trigger 
-            // dispose on the ToolBar as well.
-            _Dispose.markDisposable(placeHolder, this.dispose.bind(this));
-            this._dom = {
-                root: root,
-                commandingSurfaceEl: commandingSurfaceEl,
-                placeHolder: placeHolder,
-            };
-        };
-        ToolBar.prototype._handleShowingKeyboard = function (event) {
-            // Because the ToolBar takes up layout space and is not an overlay, it doesn't have the same expectation 
-            // to move itself to get out of the way of a showing IHM. Instsead we just close the ToolBar to avoid 
-            // scenarios where the ToolBar is occluded, but the click-eating-div is still present since it may seem 
-            // strange to end users that an occluded ToolBar (out of sight, out of mind) is still eating their first 
-            // click.
-            // Mitigation:
-            // Because (1) custom content in a ToolBar can only be included as a 'content' type command, because (2)
-            // the ToolBar only supports closedDisplayModes 'compact' and 'full', and because (3) 'content' type
-            // commands in the overflowarea use a separate contentflyout to display their contents:
-            // Interactable custom content contained within the ToolBar actionarea or overflowarea, will remain
-            // visible and interactable even when showing the IHM closes the ToolBar.
-            this.close();
-        };
-        ToolBar.prototype._synchronousOpen = function () {
-            this._isOpenedMode = true;
-            this._updateDomImpl();
-        };
-        ToolBar.prototype._synchronousClose = function () {
-            this._isOpenedMode = false;
-            this._updateDomImpl();
-        };
-        ToolBar.prototype._updateDomImpl = function () {
-            var rendered = this._updateDomImpl_renderedState;
-            if (rendered.isOpenedMode !== this._isOpenedMode) {
-                if (this._isOpenedMode) {
-                    this._updateDomImpl_renderOpened();
-                }
-                else {
-                    this._updateDomImpl_renderClosed();
-                }
-                rendered.isOpenedMode = this._isOpenedMode;
-            }
-            if (rendered.closedDisplayMode !== this.closedDisplayMode) {
-                removeClass(this._dom.root, closedDisplayModeClassMap[rendered.closedDisplayMode]);
-                addClass(this._dom.root, closedDisplayModeClassMap[this.closedDisplayMode]);
-                rendered.closedDisplayMode = this.closedDisplayMode;
-            }
-            this._commandingSurface.updateDom();
-        };
-        ToolBar.prototype._getClosedHeight = function () {
-            if (this._cachedClosedHeight === null) {
-                var wasOpen = this._isOpenedMode;
-                if (this._isOpenedMode) {
-                    this._synchronousClose();
-                }
-                this._cachedClosedHeight = this._commandingSurface.getBoundingRects().commandingSurface.height;
-                if (wasOpen) {
-                    this._synchronousOpen();
-                }
-            }
-            return this._cachedClosedHeight;
-        };
-        ToolBar.prototype._updateDomImpl_renderOpened = function () {
-            var _this = this;
-            // Measure closed state.
-            this._updateDomImpl_renderedState.prevInlineWidth = this._dom.root.style.width;
-            var closedBorderBox = this._dom.root.getBoundingClientRect();
-            var closedContentWidth = _ElementUtilities._getPreciseContentWidth(this._dom.root);
-            var closedContentHeight = _ElementUtilities._getPreciseContentHeight(this._dom.root);
-            var closedStyle = _ElementUtilities._getComputedStyle(this._dom.root);
-            var closedPaddingTop = _ElementUtilities._convertToPrecisePixels(closedStyle.paddingTop);
-            var closedBorderTop = _ElementUtilities._convertToPrecisePixels(closedStyle.borderTopWidth);
-            var closedMargins = _ElementUtilities._getPreciseMargins(this._dom.root);
-            var closedContentBoxTop = closedBorderBox.top + closedBorderTop + closedPaddingTop;
-            var closedContentBoxBottom = closedContentBoxTop + closedContentHeight;
-            // Size our placeHolder. Set height and width to match borderbox of the closed ToolBar.
-            // Copy ToolBar margins to the placeholder.
-            var placeHolder = this._dom.placeHolder;
-            var placeHolderStyle = placeHolder.style;
-            placeHolderStyle.width = closedBorderBox.width + "px";
-            placeHolderStyle.height = closedBorderBox.height + "px";
-            placeHolderStyle.marginTop = closedMargins.top + "px";
-            placeHolderStyle.marginRight = closedMargins.right + "px";
-            placeHolderStyle.marginBottom = closedMargins.bottom + "px";
-            placeHolderStyle.marginLeft = closedMargins.left + "px";
-            _ElementUtilities._maintainFocus(function () {
-                // Move ToolBar element to the body in preparation of becoming a light dismissible. Leave an equal sized placeHolder element 
-                // at our original DOM location to avoid reflowing surrounding app content.
-                _this._dom.root.parentElement.insertBefore(placeHolder, _this._dom.root);
-                _Global.document.body.appendChild(_this._dom.root);
-                // Position the ToolBar to completely cover the same region as the placeholder element.
-                _this._dom.root.style.width = closedContentWidth + "px";
-                _this._dom.root.style.left = closedBorderBox.left - closedMargins.left + "px";
-                // Determine which direction to expand the CommandingSurface elements when opened. The overflow area will be rendered at the corresponding edge of 
-                // the ToolBar's content box, so we choose the direction that offers the most space between that edge and the corresponding edge of the viewport. 
-                // This is to reduce the chance that the overflow area might clip through the edge of the viewport.
-                var topOfViewport = 0;
-                var bottomOfViewport = _Global.innerHeight;
-                var distanceFromTop = closedContentBoxTop - topOfViewport;
-                var distanceFromBottom = bottomOfViewport - closedContentBoxBottom;
-                if (distanceFromTop > distanceFromBottom) {
-                    // CommandingSurface is going to expand updwards.
-                    _this._commandingSurface.overflowDirection = _Constants.OverflowDirection.top;
-                    // Position the bottom edge of the ToolBar marginbox over the bottom edge of the placeholder marginbox.
-                    _this._dom.root.style.bottom = (bottomOfViewport - closedBorderBox.bottom) - closedMargins.bottom + "px";
-                }
-                else {
-                    // CommandingSurface is going to expand downwards.
-                    _this._commandingSurface.overflowDirection = _Constants.OverflowDirection.bottom;
-                    // Position the top edge of the ToolBar marginbox over the top edge of the placeholder marginbox.
-                    _this._dom.root.style.top = (topOfViewport + closedBorderBox.top) - closedMargins.top + "px";
-                }
-                // Render opened state
-                _ElementUtilities.addClass(_this._dom.root, _Constants.ClassNames.openedClass);
-                _ElementUtilities.removeClass(_this._dom.root, _Constants.ClassNames.closedClass);
-            });
-            this._commandingSurface.synchronousOpen();
-            _LightDismissService.shown(this._dismissable); // Call at the start of the open animation
-        };
-        ToolBar.prototype._updateDomImpl_renderClosed = function () {
-            var _this = this;
-            _ElementUtilities._maintainFocus(function () {
-                if (_this._dom.placeHolder.parentElement) {
-                    // Restore our placement in the DOM
-                    var placeHolder = _this._dom.placeHolder;
-                    placeHolder.parentElement.insertBefore(_this._dom.root, placeHolder);
-                    placeHolder.parentElement.removeChild(placeHolder);
-                }
-                // Render Closed
-                _this._dom.root.style.top = "";
-                _this._dom.root.style.right = "";
-                _this._dom.root.style.bottom = "";
-                _this._dom.root.style.left = "";
-                _this._dom.root.style.width = _this._updateDomImpl_renderedState.prevInlineWidth;
-                _ElementUtilities.addClass(_this._dom.root, _Constants.ClassNames.closedClass);
-                _ElementUtilities.removeClass(_this._dom.root, _Constants.ClassNames.openedClass);
-            });
-            this._commandingSurface.synchronousClose();
-            _LightDismissService.hidden(this._dismissable); // Call after the close animation
-        };
-        /// <field locid="WinJS.UI.ToolBar.ClosedDisplayMode" helpKeyword="WinJS.UI.ToolBar.ClosedDisplayMode">
-        /// Display options for the actionarea when the ToolBar is closed.
-        /// </field>
-        ToolBar.ClosedDisplayMode = ClosedDisplayMode;
-        ToolBar.supportedForProcessing = true;
-        return ToolBar;
-    })();
-    exports.ToolBar = ToolBar;
-    _Base.Class.mix(ToolBar, _Events.createEventProperties(_Constants.EventNames.beforeOpen, _Constants.EventNames.afterOpen, _Constants.EventNames.beforeClose, _Constants.EventNames.afterClose));
-    // addEventListener, removeEventListener, dispatchEvent
-    _Base.Class.mix(ToolBar, _Control.DOMEventMixin);
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <reference path="../../../../typings/require.d.ts" />
-define('WinJS/Controls/ToolBar',["require", "exports", '../Core/_Base'], function (require, exports, _Base) {
-    var module = null;
-    _Base.Namespace.define("WinJS.UI", {
-        ToolBar: {
-            get: function () {
-                if (!module) {
-                    require(["./ToolBar/_ToolBar"], function (m) {
-                        module = m;
-                    });
-                }
-                return module.ToolBar;
-            }
-        }
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/_LegacyAppBar/_Layouts',[
-    'exports',
-    '../../Animations/_TransitionAnimation',
-    '../../BindingList',
-    '../../Core/_BaseUtils',
-    '../../Core/_Global',
-    '../../Core/_Base',
-    '../../Core/_ErrorFromName',
-    '../../Core/_Resources',
-    '../../Core/_WriteProfilerMark',
-    '../../Controls/ToolBar',
-    '../../Controls/ToolBar/_Constants',
-    '../../Promise',
-    '../../Scheduler',
-    '../../Utilities/_Control',
-    '../../Utilities/_Dispose',
-    '../../Utilities/_ElementUtilities',
-    '../AppBar/_Command',
-    './_Constants'
-], function appBarLayoutsInit(exports, _TransitionAnimation, BindingList, _BaseUtils, _Global, _Base, _ErrorFromName, _Resources, _WriteProfilerMark, ToolBar, _ToolBarConstants, Promise, Scheduler, _Control, _Dispose, _ElementUtilities, _Command, _Constants) {
-    "use strict";
-
-    // AppBar will use this when AppBar.layout property is set to "custom"
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _AppBarBaseLayout: _Base.Namespace._lazy(function () {
-            var baseType = _Constants.appBarLayoutCustom;
-
-            var strings = {
-                get nullCommand() { return "Invalid argument: command must not be null"; }
-            };
-
-            var _AppBarBaseLayout = _Base.Class.define(function _AppBarBaseLayout_ctor(appBarEl, options) {
-                this._disposed = false;
-
-                options = options || {};
-                _Control.setOptions(this, options);
-
-                if (appBarEl) {
-                    this.connect(appBarEl);
-                }
-            }, {
-                // Members
-                className: {
-                    get: function _AppBarBaseLayout_get_className() {
-                        return this._className;
-                    },
-                },
-                type: {
-                    get: function _AppBarBaseLayout_get_className() {
-                        return this._type || baseType;
-                    },
-                },
-                commandsInOrder: {
-                    get: function _AppBarBaseLayout_get_commandsInOrder() {
-                        // Get a DOM ordered collection of the AppBarCommand elements in the AppBar.
-                        var commandElements = this.appBarEl.querySelectorAll("." + _Constants.appBarCommandClass);
-
-                        // Return an array of AppBarCommand objects.
-                        return Array.prototype.map.call(commandElements, function (commandElement) {
-                            return commandElement.winControl;
-                        });
-                    }
-                },
-                connect: function _AppBarBaseLayout_connect(appBarEl) {
-                    if (this.className) {
-                        _ElementUtilities.addClass(appBarEl, this.className);
-                    }
-                    this.appBarEl = appBarEl;
-                },
-                disconnect: function _AppBarBaseLayout_disconnect() {
-                    if (this.className) {
-                        _ElementUtilities.removeClass(this.appBarEl, this.className);
-                    }
-                    this.appBarEl = null;
-                    this.dispose();
-                },
-                layout: function _AppBarBaseLayout_layout(commands) {
-                    // Append commands to the DOM.
-                    var len = commands.length;
-                    for (var i = 0; i < len; i++) {
-                        var command = this.sanitizeCommand(commands[i]);
-                        this.appBarEl.appendChild(command._element);
-                    }
-                },
-                showCommands: function _AppBarBaseLayout_showCommands(commands) {
-                    // Use the default overlay showCommands implementation
-                    this.appBarEl.winControl._showCommands(commands);
-                },
-                showOnlyCommands: function _AppBarBaseLayout_showOnlyCommands(commands) {
-                    // Use the default overlay _showOnlyCommands implementation
-                    this.appBarEl.winControl._showOnlyCommands(commands);
-                },
-                hideCommands: function _AppBarBaseLayout_hideCommands(commands) {
-                    // Use the default overlay _hideCommands implementation
-                    this.appBarEl.winControl._hideCommands(commands);
-                },
-                sanitizeCommand: function _AppBarBaseLayout_sanitizeCommand(command) {
-                    if (!command) {
-                        throw new _ErrorFromName("WinJS.UI.AppBar.NullCommand", strings.nullCommand);
-                    }
-                    // See if it's a command already
-                    command = command.winControl || command;
-                    if (!command._element) {
-                        // Not a command, so assume it is options for the command's constructor.
-                        command = new _Command.AppBarCommand(null, command);
-                    }
-                    // If we were attached somewhere else, detach us
-                    if (command._element.parentElement) {
-                        command._element.parentElement.removeChild(command._element);
-                    }
-
-                    return command;
-                },
-                dispose: function _AppBarBaseLayout_dispose() {
-                    this._disposed = true;
-                },
-                disposeChildren: function _AppBarBaseLayout_disposeChildren() {
-                    var appBarFirstDiv = this.appBarEl.querySelectorAll("." + _Constants.firstDivClass);
-                    appBarFirstDiv = appBarFirstDiv.length >= 1 ? appBarFirstDiv[0] : null;
-                    var appBarFinalDiv = this.appBarEl.querySelectorAll("." + _Constants.finalDivClass);
-                    appBarFinalDiv = appBarFinalDiv.length >= 1 ? appBarFinalDiv[0] : null;
-
-                    var children = this.appBarEl.children;
-                    var length = children.length;
-                    for (var i = 0; i < length; i++) {
-                        var element = children[i];
-                        if (element === appBarFirstDiv || element === appBarFinalDiv) {
-                            continue;
-                        } else {
-                            _Dispose.disposeSubTree(element);
-                        }
-                    }
-                },
-                handleKeyDown: function _AppBarBaseLayout_handleKeyDown() {
-                    // NOP
-                },
-                commandsUpdated: function _AppBarBaseLayout_commandsUpdated() {
-                    // NOP
-                },
-                beginAnimateCommands: function _AppBarBaseLayout_beginAnimateCommands() {
-                    // The parameters are 3 mutually exclusive arrays of win-command elements contained in this Overlay.
-                    // 1) showCommands[]: All of the HIDDEN win-command elements that ARE scheduled to show.
-                    // 2) hideCommands[]: All of the VISIBLE win-command elements that ARE scheduled to hide.
-                    // 3) otherVisibleCommands[]: All VISIBLE win-command elements that ARE NOT scheduled to hide.
-
-                    // NOP
-                },
-                endAnimateCommands: function _AppBarBaseLayout_endAnimateCommands() {
-                    // NOP
-                },
-                scale: function _AppBarBaseLayout_scale() {
-                    // NOP
-                },
-                resize: function _AppBarBaseLayout_resize() {
-                    // NOP
-                },
-                positionChanging: function _AppBarBaseLayout_positionChanging(fromPosition, toPosition) {
-                    // NOP
-                    return Promise.wrap();
-                },
-                setFocusOnShow: function _AppBarBaseLayout_setFocusOnShow() {
-                    this.appBarEl.winControl._setFocusToAppBar();
-                }
-            });
-            return _AppBarBaseLayout;
-        }),
-    });
-
-    // AppBar will use this when AppBar.layout property is set to "commands"
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _AppBarCommandsLayout: _Base.Namespace._lazy(function () {
-            var layoutClassName = _Constants.commandLayoutClass;
-            var layoutType = _Constants.appBarLayoutCommands;
-
-            var _AppBarCommandsLayout = _Base.Class.derive(exports._AppBarBaseLayout, function _AppBarCommandsLayout_ctor(appBarEl) {
-                exports._AppBarBaseLayout.call(this, appBarEl, { _className: layoutClassName, _type: layoutType });
-                this._commandLayoutsInit(appBarEl);
-            }, {
-                commandsInOrder: {
-                    get: function _AppBarCommandsLayout_get_commandsInOrder() {
-                        return this._originalCommands.filter(function (command) {
-                            // Make sure the element is still in the AppBar.
-                            return this.appBarEl.contains(command.element);
-                        }, this);
-                    }
-                },
-                layout: function _AppBarCommandsLayout_layout(commands) {
-                    // Insert commands and other layout specific DOM into the AppBar element.
-
-                    // Empty our tree.
-                    _ElementUtilities.empty(this._primaryCommands);
-                    _ElementUtilities.empty(this._secondaryCommands);
-
-                    // Keep track of the order we receive the commands in.
-                    this._originalCommands = [];
-
-                    // Layout commands
-                    for (var i = 0, len = commands.length; i < len; i++) {
-                        var command = this.sanitizeCommand(commands[i]);
-
-                        this._originalCommands.push(command);
-
-                        if ("primary" === command.section || "global" === command.section) {
-                            this._primaryCommands.appendChild(command._element);
-                        } else {
-                            this._secondaryCommands.appendChild(command._element);
-                        }
-                    }
-
-                    // Append layout containers to AppBar element.
-                    // Secondary Commands should come first in Tab Order.
-                    this.appBarEl.appendChild(this._secondaryCommands);
-                    this.appBarEl.appendChild(this._primaryCommands);
-
-
-                    // Need to measure all content commands after they have been added to the AppBar to make sure we allow
-                    // user defined CSS rules based on the ancestor of the content command to take affect.
-                    this._needToMeasureNewCommands = true;
-
-                    // In case this is called from the constructor before the AppBar element has been appended to the DOM,
-                    // we schedule the initial scaling of commands, with the expectation that the element will be added
-                    // synchronously, in the same block of code that called the constructor.
-                    Scheduler.schedule(function () {
-                        if (this._needToMeasureNewCommands && !this._disposed) {
-                            this.scale();
-                        }
-                    }.bind(this), Scheduler.Priority.idle, this, "WinJS._commandLayoutsMixin._scaleNewCommands");
-
-                },
-                disposeChildren: function _AppBarCommandsLayout_disposeChildren() {
-                    _Dispose.disposeSubTree(this._primaryCommands);
-                    _Dispose.disposeSubTree(this._secondaryCommands);
-                },
-                handleKeyDown: function _AppBarCommandsLayout_handleKeyDown(event) {
-                    var Key = _ElementUtilities.Key;
-
-                    if (_ElementUtilities._matchesSelector(event.target, ".win-interactive, .win-interactive *")) {
-                        return; // Ignore left, right, home & end keys if focused element has win-interactive class.
-                    }
-                    var rtl = _ElementUtilities._getComputedStyle(this.appBarEl).direction === "rtl";
-                    var leftKey = rtl ? Key.rightArrow : Key.leftArrow;
-                    var rightKey = rtl ? Key.leftArrow : Key.rightArrow;
-
-                    if (event.keyCode === leftKey || event.keyCode === rightKey || event.keyCode === Key.home || event.keyCode === Key.end) {
-
-                        var globalCommandHasFocus = this._primaryCommands.contains(_Global.document.activeElement);
-                        var focusableCommands = this._getFocusableCommandsInLogicalOrder(globalCommandHasFocus);
-                        var targetCommand;
-
-                        if (focusableCommands.length) {
-                            switch (event.keyCode) {
-                                case leftKey:
-                                    // Arrowing past the last command wraps back around to the first command.
-                                    var index = Math.max(-1, focusableCommands.focusedIndex - 1) + focusableCommands.length;
-                                    targetCommand = focusableCommands[index % focusableCommands.length].winControl.lastElementFocus;
-                                    break;
-
-                                case rightKey:
-                                    // Arrowing previous to the first command wraps back around to the last command.
-                                    var index = focusableCommands.focusedIndex + 1 + focusableCommands.length;
-                                    targetCommand = focusableCommands[index % focusableCommands.length].winControl.firstElementFocus;
-                                    break;
-
-                                case Key.home:
-                                    var index = 0;
-                                    targetCommand = focusableCommands[index].winControl.firstElementFocus;
-                                    break;
-
-                                case Key.end:
-                                    var index = focusableCommands.length - 1;
-                                    targetCommand = focusableCommands[index].winControl.lastElementFocus;
-                                    break;
-                            }
-                        }
-
-                        if (targetCommand && targetCommand !== _Global.document.activeElement) {
-                            targetCommand.focus();
-                            // Prevent default so that the browser doesn't also evaluate the keydown event on the newly focused element.
-                            event.preventDefault();
-                        }
-                    }
-                },
-                commandsUpdated: function _AppBarCommandsLayout_commandsUpdated(newSetOfVisibleCommands) {
-                    // Whenever new commands are set or existing commands are hiding/showing in the AppBar, this
-                    // function is called to update the cached width measurement of all visible AppBarCommands.
-
-                    var visibleCommands = (newSetOfVisibleCommands) ? newSetOfVisibleCommands : this.commandsInOrder.filter(function (command) {
-                        return !command.hidden;
-                    });
-                    this._fullSizeWidthOfLastKnownVisibleCommands = this._getWidthOfFullSizeCommands(visibleCommands);
-                },
-                beginAnimateCommands: function _AppBarCommandsLayout_beginAnimateCommands(showCommands, hideCommands, otherVisibleCommands) {
-                    // The parameters are 3 mutually exclusive arrays of win-command elements contained in this Overlay.
-                    // 1) showCommands[]: All of the HIDDEN win-command elements that ARE scheduled to show.
-                    // 2) hideCommands[]: All of the VISIBLE win-command elements that ARE scheduled to hide.
-                    // 3) otherVisibleCommands[]: All VISIBLE win-command elements that ARE NOT scheduled to hide.
-
-                    this._scaleAfterAnimations = false;
-
-                    // Determine if the overall width of visible commands in the primary row will be increasing OR decreasing.
-                    var changeInWidth = this._getWidthOfFullSizeCommands(showCommands) - this._getWidthOfFullSizeCommands(hideCommands);
-                    if (changeInWidth > 0) {
-                        // Width of contents is going to increase, update our command counts now, to what they will be after we complete the animations.
-                        var visibleCommandsAfterAnimations = otherVisibleCommands.concat(showCommands);
-                        this.commandsUpdated(visibleCommandsAfterAnimations);
-                        // Make sure we will have enough room to fit everything on a single row.
-                        this.scale();
-                    } else if (changeInWidth < 0) {
-                        // Width of contents is going to decrease. Once animations are complete, check if
-                        // there is enough available space to make the remaining commands full size.
-                        this._scaleAfterAnimations = true;
-                    }
-                },
-                endAnimateCommands: function _AppBarCommandsLayout_endAnimateCommands() {
-                    if (this._scaleAfterAnimations) {
-                        this.commandsUpdated();
-                        this.scale();
-                    }
-                },
-                resize: function _AppBarCommandsLayout_resize() {
-                    if (!this._disposed) {
-                        // Check for horizontal window resizes.
-                        this._appBarTotalKnownWidth = null;
-                        if (this.appBarEl.winControl.opened) {
-                            this.scale();
-                        }
-                    }
-                },
-                disconnect: function _AppBarCommandsLayout_disconnect() {
-                    exports._AppBarBaseLayout.prototype.disconnect.call(this);
-                },
-                _getWidthOfFullSizeCommands: function _AppBarCommandsLayout_getWidthOfFullSizeCommands(commands) {
-                    // Commands layout puts primary commands and secondary commands into the primary row.
-                    // Return the total width of all visible primary and secondary commands as if they were full-size.
-
-                    // Perform any pending measurements on "content" type AppBarCommands.
-                    if (this._needToMeasureNewCommands) {
-                        this._measureContentCommands();
-                    }
-                    var accumulatedWidth = 0;
-                    var separatorsCount = 0;
-                    var buttonsCount = 0;
-
-                    if (!commands) {
-                        // Return the cached full size width of the last known visible commands in the AppBar.
-                        return this._fullSizeWidthOfLastKnownVisibleCommands;
-                    } else {
-                        // Return the width of the specified commands.
-                        var command;
-                        for (var i = 0, len = commands.length; i < len; i++) {
-                            command = commands[i].winControl || commands[i];
-                            if (command._type === _Constants.typeSeparator) {
-                                separatorsCount++;
-                            } else if (command._type !== _Constants.typeContent) {
-                                // button, toggle, and flyout types all have the same width.
-                                buttonsCount++;
-                            } else {
-                                accumulatedWidth += command._fullSizeWidth;
-                            }
-                        }
-                    }
-                    return accumulatedWidth += (separatorsCount * _Constants.separatorWidth) + (buttonsCount * _Constants.buttonWidth);
-                },
-                _getFocusableCommandsInLogicalOrder: function _AppBarCommandsLayout_getCommandsInLogicalOrder() {
-                    // Function returns an array of all the contained AppBarCommands which are reachable by left/right arrows.
-
-                    var secondaryCommands = this._secondaryCommands.children,
-                        primaryCommands = this._primaryCommands.children,
-                        focusedIndex = -1;
-
-                    var getFocusableCommandsHelper = function (commandsInReach) {
-                        var focusableCommands = [];
-                        for (var i = 0, len = commandsInReach.length; i < len; i++) {
-                            var element = commandsInReach[i];
-                            if (_ElementUtilities.hasClass(element, _Constants.appBarCommandClass) && element.winControl) {
-                                var containsFocus = element.contains(_Global.document.activeElement);
-                                // With the inclusion of content type commands, it may be possible to tab to elements in AppBarCommands that are not reachable by arrow keys.
-                                // Regardless, when an AppBarCommand contains the element with focus, we just include the whole command so that we can determine which
-                                // commands are adjacent to it when looking for the next focus destination.
-                                if (element.winControl._isFocusable() || containsFocus) {
-                                    focusableCommands.push(element);
-                                    if (containsFocus) {
-                                        focusedIndex = focusableCommands.length - 1;
-                                    }
-                                }
-                            }
-                        }
-                        return focusableCommands;
-                    };
-
-                    // Determines which set of commands the user could potentially reach through Home, End, and arrow keys.
-                    // All commands in the commands layout AppBar, from left to right are in reach. Secondary (previously known as Selection)
-                    // then Primary (previously known as Global).
-                    var commandsInReach = Array.prototype.slice.call(secondaryCommands).concat(Array.prototype.slice.call(primaryCommands));
-
-                    var focusableCommands = getFocusableCommandsHelper(commandsInReach);
-                    focusableCommands.focusedIndex = focusedIndex;
-                    return focusableCommands;
-                },
-                _commandLayoutsInit: function _AppBarCommandsLayout_commandLayoutsInit() {
-                    // Create layout infrastructure
-                    this._primaryCommands = _Global.document.createElement("DIV");
-                    this._secondaryCommands = _Global.document.createElement("DIV");
-                    _ElementUtilities.addClass(this._primaryCommands, _Constants.primaryCommandsClass);
-                    _ElementUtilities.addClass(this._secondaryCommands, _Constants.secondaryCommandsClass);
-                },
-                _scaleHelper: function _AppBarCommandsLayout_scaleHelper() {
-                    // This exists as a single line function so that unit tests can
-                    // overwrite it since they can't resize the WWA window.
-
-                    // It is expected that AppBar is an immediate child of the <body> and will have 100% width.
-                    // We measure the clientWidth of the documentElement so that we can scale the AppBar lazily
-                    // even while its element is display: 'none'
-                    var extraPadding = this.appBarEl.winControl.closedDisplayMode === "minimal" ? _Constants.appBarInvokeButtonWidth : 0;
-                    return _Global.document.documentElement.clientWidth - extraPadding;
-                },
-                _measureContentCommands: function _AppBarCommandsLayout_measureContentCommands() {
-                    // AppBar measures the width of content commands when they are first added
-                    // and then caches that value to avoid additional layouts in the future.
-
-                    // Can't measure unless We're in the document body
-                    if (_Global.document.body.contains(this.appBarEl)) {
-                        this._needToMeasureNewCommands = false;
-
-                        var hadHiddenClass = _ElementUtilities.hasClass(this.appBarEl, "win-navbar-closed");
-                        _ElementUtilities.removeClass(this.appBarEl, "win-navbar-closed");
-
-                        // Make sure AppBar and children have width dimensions.
-                        var prevAppBarDisplay = this.appBarEl.style.display;
-                        this.appBarEl.style.display = "";
-                        var prevCommandDisplay;
-
-                        var contentElements = this.appBarEl.querySelectorAll("div." + _Constants.appBarCommandClass);
-                        var element;
-                        for (var i = 0, len = contentElements.length; i < len; i++) {
-                            element = contentElements[i];
-                            if (element.winControl && element.winControl._type === _Constants.typeContent) {
-                                // Make sure command has width dimensions before we measure.
-                                prevCommandDisplay = element.style.display;
-                                element.style.display = "";
-                                element.winControl._fullSizeWidth = _ElementUtilities.getTotalWidth(element) || 0;
-                                element.style.display = prevCommandDisplay;
-                            }
-                        }
-
-                        // Restore state to AppBar.
-                        this.appBarEl.style.display = prevAppBarDisplay;
-                        if (hadHiddenClass) {
-                            _ElementUtilities.addClass(this.appBarEl, "win-navbar-closed");
-                        }
-
-                        this.commandsUpdated();
-                    }
-                },
-            });
-            return _AppBarCommandsLayout;
-        }),
-    });
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _AppBarMenuLayout: _Base.Namespace._lazy(function () {
-            var layoutClassName = _Constants.menuLayoutClass;
-            var layoutType = _Constants.appBarLayoutMenu;
-
-            //
-            // Resize animation
-            //  The resize animation requires 2 animations to run simultaneously in sync with each other. It's implemented
-            //  without PVL because PVL doesn't provide a way to guarantee that 2 animations will start at the same time.
-            //
-            var transformNames = _BaseUtils._browserStyleEquivalents["transform"];
-            function transformWithTransition(element, transition) {
-                // transition's properties:
-                // - duration: Number representing the duration of the animation in milliseconds.
-                // - timing: String representing the CSS timing function that controls the progress of the animation.
-                // - to: The value of *element*'s transform property after the animation.
-                var duration = transition.duration * _TransitionAnimation._animationFactor;
-                var transitionProperty = _BaseUtils._browserStyleEquivalents["transition"].scriptName;
-                element.style[transitionProperty] = duration + "ms " + transformNames.cssName + " " + transition.timing;
-                element.style[transformNames.scriptName] = transition.to;
-
-                var finish;
-                return new Promise(function (c) {
-                    var onTransitionEnd = function (eventObject) {
-                        if (eventObject.target === element && eventObject.propertyName === transformNames.cssName) {
-                            finish();
-                        }
-                    };
-
-                    var didFinish = false;
-                    finish = function () {
-                        if (!didFinish) {
-                            _Global.clearTimeout(timeoutId);
-                            element.removeEventListener(_BaseUtils._browserEventEquivalents["transitionEnd"], onTransitionEnd);
-                            element.style[transitionProperty] = "";
-                            didFinish = true;
-                        }
-                        c();
-                    };
-
-                    // Watch dog timeout
-                    var timeoutId = _Global.setTimeout(function () {
-                        timeoutId = _Global.setTimeout(finish, duration);
-                    }, 50);
-
-                    element.addEventListener(_BaseUtils._browserEventEquivalents["transitionEnd"], onTransitionEnd);
-                }, function () {
-                    finish(); // On cancelation, complete the promise successfully to match PVL
-                });
-            }
-            // See resizeTransition's comment for documentation on *args*.
-            function growTransition(elementClipper, element, args) {
-                var diff = args.anchorTrailingEdge ? args.to.total - args.from.total : args.from.total - args.to.total;
-                var translate = args.dimension === "width" ? "translateX" : "translateY";
-                var size = args.dimension;
-                var duration = args.duration || 367;
-                var timing = args.timing || "cubic-bezier(0.1, 0.9, 0.2, 1)";
-
-                // Set up
-                elementClipper.style[size] = args.to.total + "px";
-                elementClipper.style[transformNames.scriptName] = translate + "(" + diff + "px)";
-                element.style[size] = args.to.content + "px";
-                element.style[transformNames.scriptName] = translate + "(" + -diff + "px)";
-
-                // Resolve styles
-                _ElementUtilities._getComputedStyle(elementClipper).opacity;
-                _ElementUtilities._getComputedStyle(element).opacity;
-
-                // Animate
-                var transition = {
-                    duration: duration,
-                    timing: timing,
-                    to: ""
-                };
-                return Promise.join([
-                    transformWithTransition(elementClipper,  transition),
-                    transformWithTransition(element, transition)
-                ]);
-            }
-            // See resizeTransition's comment for documentation on *args*.
-            function shrinkTransition(elementClipper, element, args) {
-                var diff = args.anchorTrailingEdge ? args.from.total - args.to.total : args.to.total - args.from.total;
-                var translate = args.dimension === "width" ? "translateX" : "translateY";
-                var duration = args.duration || 367;
-                var timing = args.timing || "cubic-bezier(0.1, 0.9, 0.2, 1)";
-
-                // Set up
-                elementClipper.style[transformNames.scriptName] = "";
-                element.style[transformNames.scriptName] = "";
-
-                // Resolve styles
-                _ElementUtilities._getComputedStyle(elementClipper).opacity;
-                _ElementUtilities._getComputedStyle(element).opacity;
-
-                // Animate
-                var transition = {
-                    duration: duration,
-                    timing: timing
-                };
-                var clipperTransition = _BaseUtils._merge(transition, { to: translate + "(" + diff + "px)" });
-                var elementTransition = _BaseUtils._merge(transition, { to: translate + "(" + -diff + "px)" });
-                return Promise.join([
-                    transformWithTransition(elementClipper, clipperTransition),
-                    transformWithTransition(element, elementTransition)
-                ]);
-            }
-            // Plays an animation which makes an element look like it is resizing in 1 dimension. Arguments:
-            // - elementClipper: The parent of *element*. It shouldn't have any margin, border, or padding and its
-            //   size should match element's size. Its purpose is to clip *element* during the animation to give
-            //   it the illusion that it is resizing.
-            // - element: The element that should look like it's resizing.
-            // - args: An object with the following required properties:
-            //   - from: An object representing the old width/height of the element.
-            //   - to: An object representing the new width/height of the element.
-            //     from/to are objects of the form { content: number; total: number; }. "content" is the
-            //     width/height of *element*'s content box (e.g. getContentWidth). "total" is the width/height
-            //     of *element*'s margin box (e.g. getTotalWidth).
-            //   - duration: The CSS transition duration property.
-            //   - timing: The CSS transition timing property.
-            //   - dimension: The dimension on which *element* is resizing. Either "width" or "height".
-            //   - anchorTrailingEdge: During the resize animation, one edge will move and the other edge will
-            //     remain where it is. This flag specifies which edge is anchored (i.e. won't move).
-            //
-            function resizeTransition(elementClipper, element, args) {
-                if (args.to.total > args.from.total) {
-                    return growTransition(elementClipper, element, args);
-                } else if (args.to.total < args.from.total) {
-                    return shrinkTransition(elementClipper, element, args);
-                } else {
-                    return Promise.as();
-                }
-            }
-
-            var _AppBarMenuLayout = _Base.Class.derive(exports._AppBarBaseLayout, function _AppBarMenuLayout_ctor(appBarEl) {
-                exports._AppBarBaseLayout.call(this, appBarEl, { _className: layoutClassName, _type: layoutType });
-                this._tranformNames = _BaseUtils._browserStyleEquivalents["transform"];
-                this._animationCompleteBound = this._animationComplete.bind(this);
-                this._positionToolBarBound = this._positionToolBar.bind(this);
-            }, {
-                commandsInOrder: {
-                    get: function _AppBarMenuLayout_get_commandsInOrder() {
-                        return this._originalCommands;
-                    }
-                },
-                layout: function _AppBarMenuLayout_layout(commands) {
-                    this._writeProfilerMark("layout,info");
-
-                    commands = commands || [];
-                    this._originalCommands = [];
-
-                    var that = this;
-                    commands.forEach(function (command) {
-                        that._originalCommands.push(that.sanitizeCommand(command));
-                    });
-                    this._displayedCommands = this._originalCommands.slice(0);
-
-                    if (this._menu) {
-                        _ElementUtilities.empty(this._menu);
-                    } else {
-                        this._menu = _Global.document.createElement("div");
-                        _ElementUtilities.addClass(this._menu, _Constants.menuContainerClass);
-                    }
-                    this.appBarEl.appendChild(this._menu);
-
-                    this._toolbarEl = _Global.document.createElement("div");
-                    this._menu.appendChild(this._toolbarEl);
-
-                    this._createToolBar(commands);
-                },
-
-                showCommands: function _AppBarMenuLayout_showCommands(commands) {
-                    var elements = this._getCommandsElements(commands);
-                    var data = [];
-                    var newDisplayedCommands = [];
-                    var that = this;
-                    this._originalCommands.forEach(function (command) {
-                        if (elements.indexOf(command.element) >= 0 || that._displayedCommands.indexOf(command) >= 0) {
-                            newDisplayedCommands.push(command);
-                            data.push(command);
-                        }
-                    });
-                    this._displayedCommands = newDisplayedCommands;
-                    this._updateData(data);
-                },
-
-                showOnlyCommands: function _AppBarMenuLayout_showOnlyCommands(commands) {
-                    this._displayedCommands = [];
-                    this.showCommands(commands);
-                },
-
-                hideCommands: function _AppBarMenuLayout_hideCommands(commands) {
-                    var elements = this._getCommandsElements(commands);
-                    var data = [];
-                    var newDisplayedCommands = [];
-                    var that = this;
-                    this._originalCommands.forEach(function (command) {
-                        if (elements.indexOf(command.element) === -1 && that._displayedCommands.indexOf(command) >= 0) {
-                            newDisplayedCommands.push(command);
-                            data.push(command);
-                        }
-                    });
-                    this._displayedCommands = newDisplayedCommands;
-                    this._updateData(data);
-                },
-
-                connect: function _AppBarMenuLayout_connect(appBarEl) {
-                    this._writeProfilerMark("connect,info");
-
-                    exports._AppBarBaseLayout.prototype.connect.call(this, appBarEl);
-                    this._id = _ElementUtilities._uniqueID(appBarEl);
-                },
-
-                resize: function _AppBarMenuLayout_resize() {
-                    this._writeProfilerMark("resize,info");
-
-                    if (this._initialized) {
-                        this._forceLayoutPending = true;
-                    }
-                },
-
-                positionChanging: function _AppBarMenuLayout_positionChanging(fromPosition, toPosition) {
-                    this._writeProfilerMark("positionChanging from:" + fromPosition + " to: " + toPosition + ",info");
-
-                    this._animationPromise = this._animationPromise || Promise.wrap();
-
-                    if (this._animating) {
-                        this._animationPromise.cancel();
-                    }
-
-                    this._animating = true;
-                    if (toPosition === "shown" || (fromPosition !== "shown" && toPosition === "compact")) {
-                        this._positionToolBar();
-                        this._animationPromise = this._animateToolBarEntrance();
-                    } else {
-                        if (fromPosition === "minimal" || fromPosition === "compact" || fromPosition === "hidden") {
-                            this._animationPromise = Promise.wrap();
-                        } else {
-                            this._animationPromise = this._animateToolBarExit();
-                        }
-                    }
-                    this._animationPromise.then(this._animationCompleteBound, this._animationCompleteBound);
-                    return this._animationPromise;
-                },
-
-                disposeChildren: function _AppBarMenuLayout_disposeChildren() {
-                    this._writeProfilerMark("disposeChildren,info");
-
-                    if (this._toolbar) {
-                        _Dispose.disposeSubTree(this._toolbarEl);
-                    }
-                    this._originalCommands = [];
-                    this._displayedCommands = [];
-                },
-
-                setFocusOnShow: function _AppBarMenuLayout_setFocusOnShow() {
-                    // Make sure the menu (used for clipping during the resize animation)
-                    // doesn't scroll when we give focus to the AppBar.
-                    this.appBarEl.winControl._setFocusToAppBar(true, this._menu);
-                },
-
-                _updateData: function _AppBarMenuLayout_updateData(data) {
-                    var hadHiddenClass = _ElementUtilities.hasClass(this.appBarEl, "win-navbar-closed");
-                    var hadShownClass = _ElementUtilities.hasClass(this.appBarEl, "win-navbar-opened");
-                    _ElementUtilities.removeClass(this.appBarEl, "win-navbar-closed");
-
-                    // Make sure AppBar and children have width dimensions.
-                    var prevAppBarDisplay = this.appBarEl.style.display;
-                    this.appBarEl.style.display = "";
-
-
-                    this._toolbar.data = new BindingList.List(data);
-                    if (hadHiddenClass) {
-                        this._positionToolBar();
-                    }
-
-                    // Restore state to AppBar.
-                    this.appBarEl.style.display = prevAppBarDisplay;
-                    if (hadHiddenClass) {
-                        _ElementUtilities.addClass(this.appBarEl, "win-navbar-closed");
-                    }
-
-                    if (hadShownClass) {
-                        this._positionToolBar();
-                        this._animateToolBarEntrance();
-                    }
-                },
-
-                _getCommandsElements: function _AppBarMenuLayout_getCommandsElements(commands) {
-                    if (!commands) {
-                        return [];
-                    }
-
-                    if (typeof commands === "string" || !commands || !commands.length) {
-                        commands = [commands];
-                    }
-
-                    var elements = [];
-                    for (var i = 0, len = commands.length; i < len; i++) {
-                        if (commands[i]) {
-                            if (typeof commands[i] === "string") {
-                                var element = _Global.document.getElementById(commands[i]);
-                                if (element) {
-                                    elements.push(element);
-                                } else {
-                                    // Check in the list we are tracking, since it might not be in the DOM yet
-                                    for (var j = 0, len2 = this._originalCommands.length; j < len2; j++) {
-                                        var element = this._originalCommands[j].element;
-                                        if (element.id === commands[i]) {
-                                            elements.push(element);
-                                        }
-                                    }
-                                }
-                            } else if (commands[i].element) {
-                                elements.push(commands[i].element);
-                            } else {
-                                elements.push(commands[i]);
-                            }
-                        }
-                    }
-
-                    return elements;
-                },
-
-                _animationComplete: function _AppBarMenuLayout_animationComplete() {
-                    if (!this._disposed) {
-                        this._animating = false;
-                    }
-                },
-
-                _createToolBar: function _AppBarMenuLayout_createToolBar(commands) {
-                    this._writeProfilerMark("_createToolBar,info");
-
-                    var hadHiddenClass = _ElementUtilities.hasClass(this.appBarEl, "win-navbar-closed");
-                    _ElementUtilities.removeClass(this.appBarEl, "win-navbar-closed");
-
-                    // Make sure AppBar and children have width dimensions.
-                    var prevAppBarDisplay = this.appBarEl.style.display;
-                    this.appBarEl.style.display = "";
-
-                    this._toolbar = new ToolBar.ToolBar(this._toolbarEl, {
-                        data: new BindingList.List(this._originalCommands),
-                        shownDisplayMode: 'full',
-                    });
-
-                    var that = this;
-                    this._appbarInvokeButton = this.appBarEl.querySelector("." + _Constants.invokeButtonClass);
-                    this._overflowButton = this._toolbarEl.querySelector("." + _ToolBarConstants.overflowButtonCssClass);
-                    this._overflowButton.addEventListener("click", function () {
-                        that._appbarInvokeButton.click();
-                    });
-
-                    this._positionToolBar();
-
-                    // Restore state to AppBar.
-                    this.appBarEl.style.display = prevAppBarDisplay;
-                    if (hadHiddenClass) {
-                        _ElementUtilities.addClass(this.appBarEl, "win-navbar-closed");
-                    }
-                },
-
-                _positionToolBar: function _AppBarMenuLayout_positionToolBar() {
-                    if (!this._disposed) {
-                        this._writeProfilerMark("_positionToolBar,info");
-                        this._initialized = true;
-                    }
-                },
-
-                _animateToolBarEntrance: function _AppBarMenuLayout_animateToolBarEntrance() {
-                    this._writeProfilerMark("_animateToolBarEntrance,info");
-
-                    if (this._forceLayoutPending) {
-                        this._forceLayoutPending = false;
-                        this._toolbar.forceLayout();
-                        this._positionToolBar();
-                    }
-                    var heightVisible = this._isMinimal() ? 0 : this.appBarEl.offsetHeight;
-                    if (this._isBottom()) {
-                        // Bottom AppBar Animation
-                        var offsetTop = this._menu.offsetHeight - heightVisible;
-                        return this._executeTranslate(this._menu, "translateY(" + -offsetTop + "px)");
-                    } else {
-                        // Top AppBar Animation
-                        return resizeTransition(this._menu, this._toolbarEl, {
-                            from: { content: heightVisible, total: heightVisible },
-                            to: { content: this._menu.offsetHeight, total: this._menu.offsetHeight },
-                            dimension: "height",
-                            duration: 400,
-                            timing: "ease-in",
-                        });
-                    }
-                },
-
-                _animateToolBarExit: function _AppBarMenuLayout_animateToolBarExit() {
-                    this._writeProfilerMark("_animateToolBarExit,info");
-
-                    var heightVisible = this._isMinimal() ? 0 : this.appBarEl.offsetHeight;
-                    if (this._isBottom()) {
-                        return this._executeTranslate(this._menu, "none");
-                    } else {
-                        // Top AppBar Animation
-                        return resizeTransition(this._menu, this._toolbarEl, {
-                            from: { content: this._menu.offsetHeight, total: this._menu.offsetHeight },
-                            to: { content: heightVisible, total: heightVisible },
-                            dimension: "height",
-                            duration: 400,
-                            timing: "ease-in",
-                        });
-                    }
-                },
-
-                _executeTranslate: function _AppBarMenuLayout_executeTranslate(element, value) {
-                    return _TransitionAnimation.executeTransition(element,
-                        {
-                            property: this._tranformNames.cssName,
-                            delay: 0,
-                            duration: 400,
-                            timing: "ease-in",
-                            to: value
-                        });
-                },
-
-                _isMinimal: function _AppBarMenuLayout_isMinimal() {
-                    return this.appBarEl.winControl.closedDisplayMode === "minimal";
-                },
-
-                _isBottom: function _AppBarMenuLayout_isBottom() {
-                    return this.appBarEl.winControl.placement === "bottom";
-                },
-
-                _writeProfilerMark: function _AppBarMenuLayout_writeProfilerMark(text) {
-                    _WriteProfilerMark("WinJS.UI._AppBarMenuLayout:" + this._id + ":" + text);
-                }
-            });
-
-            return _AppBarMenuLayout;
-        }),
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// _LegacyAppBar
-/// <dictionary>appbar,appBars,Flyout,Flyouts,iframe,Statics,unfocus,WinJS</dictionary>
-define('WinJS/Controls/_LegacyAppBar',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Events',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../Animations',
-    '../Promise',
-    '../Scheduler',
-    '../_LightDismissService',
-    '../Utilities/_Control',
-    '../Utilities/_Dispose',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    '../Utilities/_KeyboardBehavior',
-    './_LegacyAppBar/_Constants',
-    './_LegacyAppBar/_Layouts',
-    './AppBar/_Command',
-    './AppBar/_Icon',
-    './Flyout/_Overlay',
-    '../Application'
-], function appBarInit(exports, _Global, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _WriteProfilerMark, Animations, Promise, Scheduler, _LightDismissService, _Control, _Dispose, _ElementUtilities, _Hoverable, _KeyboardBehavior, _Constants, _Layouts, _Command, _Icon, _Overlay, Application) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI._LegacyAppBar">
-        /// Represents an application toolbar for display commands.
-        /// </summary>
-        /// </field>
-        /// <icon src="ui_winjs.ui.appbar.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.appbar.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI._LegacyAppBar">
-        /// <button data-win-control="WinJS.UI.AppBarCommand" data-win-options="{id:'',label:'example',icon:'back',type:'button',onclick:null,section:'primary'}"></button>
-        /// </div>]]></htmlSnippet>
-        /// <event name="beforeopen" locid="WinJS.UI._LegacyAppBar_e:beforeopen">Raised just before showing the _LegacyAppBar.</event>
-        /// <event name="afteropen" locid="WinJS.UI._LegacyAppBar_e:afteropen">Raised immediately after the _LegacyAppBar is fully shown.</event>
-        /// <event name="beforeclose" locid="WinJS.UI._LegacyAppBar_e:beforeclose">Raised just before hiding the _LegacyAppBar.</event>
-        /// <event name="afterclose" locid="WinJS.UI._LegacyAppBar_e:afterclose">Raised immediately after the _LegacyAppBar is fully hidden.</event>
-        /// <part name="appbar" class="win-commandlayout" locid="WinJS.UI._LegacyAppBar_part:appbar">The _LegacyAppBar control itself.</part>
-        /// <part name="appBarCustom" class="win-navbar" locid="WinJS.UI._LegacyAppBar_part:appBarCustom">Style for a custom layout _LegacyAppBar.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        _LegacyAppBar: _Base.Namespace._lazy(function () {
-            var EVENTS = {
-                beforeOpen: "beforeopen",
-                afterOpen: "afteropen",
-                beforeClose: "beforeclose",
-                afterClose: "afterclose",
-            };
-
-            var createEvent = _Events._createEventProperty;
-
-            // Enum of known constant pixel values for display modes.
-            var knownVisibleHeights = {
-                none: 0,
-                hidden: 0,
-                minimal: 25,
-                compact: 48
-            };
-
-            // Maps each notion of a display modes to the corresponding visible position
-            var displayModeVisiblePositions = {
-                none: "hidden",
-                hidden: "hidden",
-                minimal: "minimal",
-                shown: "shown",
-                compact: "compact"
-            };
-
-            // Enum of closedDisplayMode constants
-            var closedDisplayModes = {
-                none: "none",
-                minimal: "minimal",
-                compact: "compact"
-            };
-
-            // Constants shown/hidden states
-            var appbarShownState = "shown",
-                appbarHiddenState = "hidden";
-
-            // Hook into event
-            var globalEventsInitialized = false;
-
-            function _allManipulationChanged(event) {
-                var elements = _Global.document.querySelectorAll("." + _Constants.appBarClass);
-                if (elements) {
-                    var len = elements.length;
-                    for (var i = 0; i < len; i++) {
-                        var element = elements[i];
-                        var appbar = element.winControl;
-                        if (appbar && !element.disabled) {
-                            appbar._manipulationChanged(event);
-                        }
-                    }
-                }
-            }
-
-            var strings = {
-                get ariaLabel() { return _Resources._getWinJSString("ui/appBarAriaLabel").value; },
-                get requiresCommands() { return "Invalid argument: commands must not be empty"; },
-                get cannotChangePlacementWhenVisible() { return "Invalid argument: The placement property cannot be set when the AppBar is visible, call hide() first"; },
-                get cannotChangeLayoutWhenVisible() { return "Invalid argument: The layout property cannot be set when the AppBar is visible, call hide() first"; }
-            };
-
-            var _LegacyAppBar = _Base.Class.derive(_Overlay._Overlay, function _LegacyAppBar_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI._LegacyAppBar._LegacyAppBar">
-                /// <summary locid="WinJS.UI._LegacyAppBar.constructor">
-                /// Creates a new _LegacyAppBar control.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.UI._LegacyAppBar.constructor_p:element">
-                /// The DOM element that will host the control.
-                /// </param>
-                /// <param name="options" type="Object" locid="WinJS.UI._LegacyAppBar.constructor_p:options">
-                /// The set of properties and values to apply to the new _LegacyAppBar control.
-                /// </param>
-                /// <returns type="WinJS.UI._LegacyAppBar" locid="WinJS.UI._LegacyAppBar.constructor_returnValue">
-                /// The new _LegacyAppBar control.
-                /// </returns>
-                /// </signature>
-
-                this._initializing = true;
-
-                // Simplify checking later
-                options = options || {};
-
-                // Make sure there's an element
-                this._element = element || _Global.document.createElement("div");
-                this._id = this._element.id || _ElementUtilities._uniqueID(this._element);
-                this._writeProfilerMark("constructor,StartTM");
-
-                // Attach our css class.
-                _ElementUtilities.addClass(this._element, _Constants.appBarClass);
-                
-                var that = this;
-                this._dismissable = new _LightDismissService.LightDismissableElement({
-                    element: this._element,
-                    tabIndex: this._element.hasAttribute("tabIndex") ? this._element.tabIndex : -1,
-                    onLightDismiss: function () {
-                        that.close();
-                    },
-                    onTakeFocus: function (useSetActive) {
-                        if (!that._dismissable.restoreFocus()) {
-                            that._layoutImpl.setFocusOnShow();
-                        }
-                    },
-                });
-
-                // Make sure we have an ARIA role
-                var role = this._element.getAttribute("role");
-                if (!role) {
-                    this._element.setAttribute("role", "menubar");
-                }
-                var label = this._element.getAttribute("aria-label");
-                if (!label) {
-                    this._element.setAttribute("aria-label", strings.ariaLabel);
-                }
-
-                // Call the _Overlay constructor helper to finish setting up our element.
-                // Don't pass constructor options, _LegacyAppBar needs to set those itself specific order.
-                this._baseOverlayConstructor(this._element);
-
-                // Start off hidden
-                this._lastPositionVisited = displayModeVisiblePositions.none;
-                _ElementUtilities.addClass(this._element, _Constants.hiddenClass);
-
-                // Add Invoke button.
-                this._invokeButton = _Global.document.createElement("button");
-                this._invokeButton.tabIndex = 0;
-                this._invokeButton.setAttribute("type", "button");
-                this._invokeButton.innerHTML = "<span class='" + _Constants.ellipsisClass + "'></span>";
-                _ElementUtilities.addClass(this._invokeButton, _Constants.invokeButtonClass);
-                this._element.appendChild(this._invokeButton);
-                this._invokeButton.addEventListener("click", function () {
-                    if (that.opened) {
-                        that._hide();
-                    } else {
-                        that._show();
-                    }
-                }, false);
-
-                // Run layout setter immediately. We need to know our layout in order to correctly
-                // position any commands that may be getting set through the constructor.
-                this._layout = _Constants.appBarLayoutCustom;
-                delete options._layout;
-
-                // Need to set placement before closedDisplayMode, closedDisplayMode sets our starting position, which is dependant on placement.
-                this.placement = options.placement || _Constants.appBarPlacementBottom;
-                this.closedDisplayMode = options.closedDisplayMode || closedDisplayModes.compact;
-
-                _Control.setOptions(this, options);
-
-                var commandsUpdatedBound = this._commandsUpdated.bind(this);
-                this._element.addEventListener(_Constants.commandVisibilityChanged, function (ev) {
-                    if (that._disposed) {
-                        return;
-                    }
-                    if (that.opened) {
-                        ev.preventDefault();
-                    }
-                    commandsUpdatedBound();
-                });
-
-                this._initializing = false;
-
-                this._setFocusToAppBarBound = this._setFocusToAppBar.bind(this);
-
-                // Handle key down (left & right)
-                this._element.addEventListener("keydown", this._handleKeyDown.bind(this), false);
-
-                // Attach global event handlers
-                if (!globalEventsInitialized) {
-                    // Need to know if the IHM is done scrolling
-                    _Global.document.addEventListener("MSManipulationStateChanged", _allManipulationChanged, false);
-
-                    globalEventsInitialized = true;
-                }
-
-                if (this.closedDisplayMode === closedDisplayModes.none && this.layout === _Constants.appBarLayoutCommands) {
-                    // Remove the commands layout _LegacyAppBar from the layout tree at this point so we don't cause unnecessary layout costs whenever
-                    // the window resizes or when CSS changes are applied to the commands layout _LegacyAppBar's parent element.
-                    this._element.style.display = "none";
-                }
-
-                this._winKeyboard = new _KeyboardBehavior._WinKeyboard(this._element);
-
-                this._writeProfilerMark("constructor,StopTM");
-
-                return this;
-            }, {
-                // Public Properties
-
-                /// <field type="String" defaultValue="bottom" oamOptionsDatatype="WinJS.UI._LegacyAppBar.placement" locid="WinJS.UI._LegacyAppBar.placement" helpKeyword="WinJS.UI._LegacyAppBar.placement">The placement of the _LegacyAppBar on the display.  Values are "top" or "bottom".</field>
-                placement: {
-                    get: function _LegacyAppBar_get_placement() {
-                        return this._placement;
-                    },
-                    set: function _LegacyAppBar_set_placement(value) {
-                        // In designer we may have to move it
-                        var wasShown = false;
-                        if (_WinRT.Windows.ApplicationModel.DesignMode.designModeEnabled) {
-                            this._hide();
-                            wasShown = true;
-                        }
-
-                        if (this.opened) {
-                            throw new _ErrorFromName("WinJS.UI._LegacyAppBar.CannotChangePlacementWhenVisible", strings.cannotChangePlacementWhenVisible);
-                        }
-
-                        // Set placement, coerce invalid values to 'bottom'
-                        this._placement = (value === _Constants.appBarPlacementTop) ? _Constants.appBarPlacementTop : _Constants.appBarPlacementBottom;
-
-                        // Clean up win-top, win-bottom styles
-                        if (this._placement === _Constants.appBarPlacementTop) {
-                            _ElementUtilities.addClass(this._element, _Constants.topClass);
-                            _ElementUtilities.removeClass(this._element, _Constants.bottomClass);
-                        } else if (this._placement === _Constants.appBarPlacementBottom) {
-                            _ElementUtilities.removeClass(this._element, _Constants.topClass);
-                            _ElementUtilities.addClass(this._element, _Constants.bottomClass);
-                        }
-
-                        // Update our position on screen.
-                        this._ensurePosition();
-                        if (wasShown) {
-                            // Show again if we hid ourselves for the designer
-                            this._show();
-                        }
-                    }
-                },
-
-                _layout: {
-                    get: function _LegacyAppBar_get_layout() {
-                        return this._layoutImpl.type;
-                    },
-                    set: function (layout) {
-                        if (layout !== _Constants.appBarLayoutCommands &&
-                            layout !== _Constants.appBarLayoutCustom &&
-                            layout !== _Constants.appBarLayoutMenu) {
-                        }
-
-                        // In designer we may have to redraw it
-                        var wasShown = false;
-                        if (_WinRT.Windows.ApplicationModel.DesignMode.designModeEnabled) {
-                            this._hide();
-                            wasShown = true;
-                        }
-
-                        if (this.opened) {
-                            throw new _ErrorFromName("WinJS.UI._LegacyAppBar.CannotChangeLayoutWhenVisible", strings.cannotChangeLayoutWhenVisible);
-                        }
-
-                        var commands;
-                        if (!this._initializing) {
-                            // Gather commands in preparation for hand off to new layout.
-                            // We expect prev layout to return commands in the order they were set in,
-                            // not necessarily the current DOM order the layout is using.
-                            commands = this._layoutImpl.commandsInOrder;
-                            this._layoutImpl.disconnect();
-                        }
-
-                        // Set layout
-                        if (layout === _Constants.appBarLayoutCommands) {
-                            this._layoutImpl = new _Layouts._AppBarCommandsLayout();
-                        } else if (layout === _Constants.appBarLayoutMenu) {
-                            this._layoutImpl = new _Layouts._AppBarMenuLayout();
-                        } else {
-                            // Custom layout uses Base _LegacyAppBar Layout class.
-                            this._layoutImpl = new _Layouts._AppBarBaseLayout();
-                        }
-                        this._layoutImpl.connect(this._element);
-
-                        if (commands && commands.length) {
-                            // Reset _LegacyAppBar since layout changed.
-                            this._layoutCommands(commands);
-                        }
-
-                        // Show again if we hid ourselves for the designer
-                        if (wasShown) {
-                            this._show();
-                        }
-                    },
-                    configurable: true
-                },
-
-                /// <field type="Array" locid="WinJS.UI._LegacyAppBar.commands" helpKeyword="WinJS.UI._LegacyAppBar.commands" isAdvanced="true">
-                /// Sets the AppBarCommands in the _LegacyAppBar. This property accepts an array of AppBarCommand objects.
-                /// </field>
-                commands: {
-                    set: function _LegacyAppBar_set_commands(commands) {
-                        // Fail if trying to set when shown
-                        if (this.opened) {
-                            throw new _ErrorFromName("WinJS.UI._LegacyAppBar.CannotChangeCommandsWhenVisible", _Resources._formatString(_Overlay._Overlay.commonstrings.cannotChangeCommandsWhenVisible, "_LegacyAppBar"));
-                        }
-
-                        // Dispose old commands before tossing them out.
-                        if (!this._initializing) {
-                            // AppBarCommands defined in markup don't want to be disposed during initialization.
-                            this._disposeChildren();
-                        }
-                        this._layoutCommands(commands);
-                    }
-                },
-
-                _layoutCommands: function _LegacyAppBar_layoutCommands(commands) {
-                    // Function precondition: _LegacyAppBar must not be shown.
-
-                    // Empties _LegacyAppBar HTML and repopulates with passed in commands.
-                    _ElementUtilities.empty(this._element);
-                    this._element.appendChild(this._invokeButton); // Keep our Show/Hide button.
-
-                    // In case they had only one command to set...
-                    if (!Array.isArray(commands)) {
-                        commands = [commands];
-                    }
-
-                    this._layoutImpl.layout(commands);
-                },
-
-                /// <field type="String" defaultValue="compact" locid="WinJS.UI._LegacyAppBar.closedDisplayMode" helpKeyword="WinJS.UI._LegacyAppBar.closedDisplayMode" isAdvanced="true">
-                /// Gets/Sets how _LegacyAppBar will display itself while hidden. Values are "none", "minimal" and '"compact".
-                /// </field>
-                closedDisplayMode: {
-                    get: function _LegacyAppBar_get_closedDisplayMode() {
-                        return this._closedDisplayMode;
-                    },
-                    set: function _LegacyAppBar_set_closedDisplayMode(value) {
-                        var oldValue = this._closedDisplayMode;
-
-                        if (oldValue !== value) {
-
-                            // Determine if the visible position is changing. This can be used to determine if we need to delay updating closedDisplayMode related CSS classes
-                            // to avoid affecting the animation.
-                            var changeVisiblePosition = _ElementUtilities.hasClass(this._element, _Constants.hiddenClass) || _ElementUtilities.hasClass(this._element, _Constants.hidingClass);
-
-                            if (value === closedDisplayModes.none) {
-                                this._closedDisplayMode = closedDisplayModes.none;
-                                if (!changeVisiblePosition || !oldValue) {
-                                    _ElementUtilities.removeClass(this._element, _Constants.minimalClass);
-                                    _ElementUtilities.removeClass(this._element, _Constants.compactClass);
-                                }
-                            } else if (value === closedDisplayModes.minimal) {
-                                this._closedDisplayMode = closedDisplayModes.minimal;
-                                if (!changeVisiblePosition || !oldValue || oldValue === closedDisplayModes.none) {
-                                    _ElementUtilities.addClass(this._element, _Constants.minimalClass);
-                                    _ElementUtilities.removeClass(this._element, _Constants.compactClass);
-                                }
-                            } else {
-                                // Compact is default fallback.
-                                this._closedDisplayMode = closedDisplayModes.compact;
-                                _ElementUtilities.addClass(this._element, _Constants.compactClass);
-                                _ElementUtilities.removeClass(this._element, _Constants.minimalClass);
-                            }
-
-                            // The invoke button has changed the amount of available space in the _LegacyAppBar. Layout might need to scale.
-                            this._layoutImpl.resize();
-
-                            if (changeVisiblePosition) {
-                                // If the value is being set while we are not showing, change to our new position.
-                                this._changeVisiblePosition(displayModeVisiblePositions[this._closedDisplayMode]);
-                            }
-                        }
-                    },
-                },
-
-                /// <field type="Boolean" hidden="true" locid="WinJS.UI._LegacyAppBar.opened" helpKeyword="WinJS.UI._LegacyAppBar.opened">Gets or sets _LegacyAppBar's visibility.</field>
-                opened: {
-                    get: function () {
-                        // Returns true if _LegacyAppBar is not 'hidden'.
-                        return !_ElementUtilities.hasClass(this._element, _Constants.hiddenClass) &&
-                            !_ElementUtilities.hasClass(this._element, _Constants.hidingClass) &&
-                            this._doNext !== displayModeVisiblePositions.minimal &&
-                            this._doNext !== displayModeVisiblePositions.compact &&
-                            this._doNext !== displayModeVisiblePositions.none;
-                    },
-                    set: function (opened) {
-                        var currentlyOpen = this.opened;
-                        if (opened && !currentlyOpen) {
-                            this._show();
-                        } else if (!opened && currentlyOpen) {
-                            this._hide();
-                        }
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI._LegacyAppBar.onbeforeopen" helpKeyword="WinJS.UI._LegacyAppBar.onbeforeopen">
-                /// Occurs immediately before the control is opened.
-                /// </field>
-                onbeforeopen: createEvent(EVENTS.beforeOpen),
-
-                /// <field type="Function" locid="WinJS.UI._LegacyAppBar.onafteropen" helpKeyword="WinJS.UI._LegacyAppBar.onafteropen">
-                /// Occurs immediately after the control is opened.
-                /// </field>
-                onafteropen: createEvent(EVENTS.afterOpen),
-
-                /// <field type="Function" locid="WinJS.UI._LegacyAppBar.onbeforeclose" helpKeyword="WinJS.UI._LegacyAppBar.onbeforeclose">
-                /// Occurs immediately before the control is closed.
-                /// </field>
-                onbeforeclose: createEvent(EVENTS.beforeClose),
-
-                /// <field type="Function" locid="WinJS.UI._LegacyAppBar.onafterclose" helpKeyword="WinJS.UI._LegacyAppBar.onafterclose">
-                /// Occurs immediately after the control is closed.
-                /// </field>
-                onafterclose: createEvent(EVENTS.afterClose),
-
-                getCommandById: function (id) {
-                    /// <signature helpKeyword="WinJS.UI._LegacyAppBar.getCommandById">
-                    /// <summary locid="WinJS.UI._LegacyAppBar.getCommandById">
-                    /// Retrieves the command with the specified ID from this _LegacyAppBar.
-                    /// If more than one command is found, this method returns them all.
-                    /// </summary>
-                    /// <param name="id" type="String" locid="WinJS.UI._LegacyAppBar.getCommandById_p:id">Id of the command to return.</param>
-                    /// <returns type="object" locid="WinJS.UI._LegacyAppBar.getCommandById_returnValue">
-                    /// The command found, an array of commands if more than one have the same ID, or null if no command is found.
-                    /// </returns>
-                    /// </signature>
-                    var commands = this._layoutImpl.commandsInOrder.filter(function (command) {
-                        return command.id === id || command.element.id === id;
-                    });
-
-                    if (commands.length === 1) {
-                        return commands[0];
-                    } else if (commands.length === 0) {
-                        return null;
-                    }
-
-                    return commands;
-                },
-
-                showCommands: function (commands) {
-                    /// <signature helpKeyword="WinJS.UI._LegacyAppBar.showCommands">
-                    /// <summary locid="WinJS.UI._LegacyAppBar.showCommands">
-                    /// Show the specified commands of the _LegacyAppBar.
-                    /// </summary>
-                    /// <param name="commands" type="Array" locid="WinJS.UI._LegacyAppBar.showCommands_p:commands">
-                    /// An array of the commands to show. The array elements may be AppBarCommand objects, or the string identifiers (IDs) of commands.
-                    /// </param>
-                    /// </signature>
-                    if (!commands) {
-                        throw new _ErrorFromName("WinJS.UI._LegacyAppBar.RequiresCommands", strings.requiresCommands);
-                    }
-
-                    this._layoutImpl.showCommands(commands);
-                },
-
-                hideCommands: function (commands) {
-                    /// <signature helpKeyword="WinJS.UI._LegacyAppBar.hideCommands">
-                    /// <summary locid="WinJS.UI._LegacyAppBar.hideCommands">
-                    /// Hides the specified commands of the _LegacyAppBar.
-                    /// </summary>
-                    /// <param name="commands" type="Array" locid="WinJS.UI._LegacyAppBar.hideCommands_p:commands">Required. Command or Commands to hide, either String, DOM elements, or WinJS objects.</param>
-                    /// </signature>
-                    if (!commands) {
-                        throw new _ErrorFromName("WinJS.UI._LegacyAppBar.RequiresCommands", strings.requiresCommands);
-                    }
-
-                    this._layoutImpl.hideCommands(commands);
-                },
-
-                showOnlyCommands: function (commands) {
-                    /// <signature helpKeyword="WinJS.UI._LegacyAppBar.showOnlyCommands">
-                    /// <summary locid="WinJS.UI._LegacyAppBar.showOnlyCommands">
-                    /// Show the specified commands, hiding all of the others in the _LegacyAppBar.
-                    /// </summary>
-                    /// <param name="commands" type="Array" locid="WinJS.UI._LegacyAppBar.showOnlyCommands_p:commands">
-                    /// An array of the commands to show. The array elements may be AppBarCommand objects, or the string identifiers (IDs) of commands.
-                    /// </param>
-                    /// </signature>
-                    if (!commands) {
-                        throw new _ErrorFromName("WinJS.UI._LegacyAppBar.RequiresCommands", strings.requiresCommands);
-                    }
-
-                    this._layoutImpl.showOnlyCommands(commands);
-                },
-
-                open: function () {
-                    /// <signature helpKeyword="WinJS.UI._LegacyAppBar.open">
-                    /// <summary locid="WinJS.UI._LegacyAppBar.open">
-                    /// Opens the _LegacyAppBar, if closed and not disabled, regardless of other state.
-                    /// </summary>
-                    /// </signature>
-                    // Just wrap the private one, turning off keyboard invoked flag
-                    this._writeProfilerMark("show,StartTM");
-                    this._show();
-                },
-
-                _show: function _LegacyAppBar_show() {
-
-                    var toPosition = displayModeVisiblePositions.shown;
-                    var showing = null;
-
-                    // If we're already shown, we are just going to animate our position, not fire events or manage focus.
-                    if (!this.disabled && (_ElementUtilities.hasClass(this._element, _Constants.hiddenClass) || _ElementUtilities.hasClass(this._element, _Constants.hidingClass))) {
-                        showing = appbarShownState;
-                    }
-
-                    this._changeVisiblePosition(toPosition, showing);
-
-                    if (showing) {
-                        // Clean up tabbing behavior by making sure first and final divs are correct after showing.
-                        this._updateFirstAndFinalDiv();
-                        
-                        _LightDismissService.shown(this._dismissable);
-                    }
-                },
-
-                close: function () {
-                    /// <signature helpKeyword="WinJS.UI._LegacyAppBar.close">
-                    /// <summary locid="WinJS.UI._LegacyAppBar.close">
-                    /// Closes the _LegacyAppBar.
-                    /// </summary>
-                    /// </signature>
-                    // Just wrap the private one
-                    this._writeProfilerMark("hide,StartTM");
-                    this._hide();
-                },
-
-                _hide: function _LegacyAppBar_hide(toPosition) {
-
-                    var toPosition = toPosition || displayModeVisiblePositions[this.closedDisplayMode];
-                    var hiding = null;
-
-                    // If were already hidden, we are just going to animate our position, not fire events or manage focus again.
-                    if (!_ElementUtilities.hasClass(this._element, _Constants.hiddenClass) && !_ElementUtilities.hasClass(this._element, _Constants.hidingClass)) {
-                        hiding = appbarHiddenState;
-                    }
-
-                    this._changeVisiblePosition(toPosition, hiding);
-                },
-
-                _dispose: function _LegacyAppBar_dispose() {
-                    _Dispose.disposeSubTree(this.element);
-                    _LightDismissService.hidden(this._dismissable);
-                    this._layoutImpl.dispose();
-                    this.disabled = true;
-                    this.close();
-                },
-
-                _disposeChildren: function _LegacyAppBar_disposeChildren() {
-                    // Be purposeful about what we dispose.
-                    this._layoutImpl.disposeChildren();
-                },
-
-                _handleKeyDown: function _LegacyAppBar_handleKeyDown(event) {
-                    // On Left/Right arrow keys, moves focus to previous/next AppbarCommand element.
-
-                    // If the current active element isn't an intrinsic part of the _LegacyAppBar,
-                    // Layout might want to handle additional keys.
-                    if (!this._invokeButton.contains(_Global.document.activeElement)) {
-                        this._layoutImpl.handleKeyDown(event);
-                    }
-                },
-
-                _visiblePixels: {
-                    get: function () {
-                        // Returns object containing pixel height of each visible position
-                        return {
-                            hidden: knownVisibleHeights.hidden,
-                            minimal: knownVisibleHeights.minimal,
-                            compact: Math.max(this._heightWithoutLabels || 0, knownVisibleHeights.compact),
-                            // Element can change size as content gets added or removed or if it
-                            // experinces style changes. We have to look this up at run time.
-                            shown: this._element.offsetHeight,
-                        };
-                    }
-                },
-
-                _visiblePosition: {
-                    // Returns string value of our nearest, stationary, visible position.
-                    get: function () {
-                        // If we're animating into a new posistion, return the position we're animating into.
-                        if (this._animating && displayModeVisiblePositions[this._element.winAnimating]) {
-                            return this._element.winAnimating;
-                        } else {
-                            return this._lastPositionVisited;
-                        }
-                    }
-                },
-
-                _visible: {
-                    // Returns true if our visible position is not completely hidden, else false.
-                    get: function () {
-                        return (this._visiblePosition !== displayModeVisiblePositions.none);
-                    }
-                },
-
-                _changeVisiblePosition: function (toPosition, newState) {
-                    /// <signature helpKeyword="WinJS.UI._LegacyAppBar._changeVisiblePosition">
-                    /// <summary locid="WinJS.UI._LegacyAppBar._changeVisiblePosition">
-                    /// Changes the visible position of the _LegacyAppBar.
-                    /// </summary>
-                    /// <param name="toPosition" type="String" locid="WinJS.UI._LegacyAppBar._changeVisiblePosition_p:toPosition">
-                    /// Name of the visible position we want to move to.
-                    /// </param>
-                    /// <param name="newState" type="String" locid="WinJS.UI._LegacyAppBar._changeVisiblePosition_p:newState">
-                    /// Name of the state we are entering. Values can be "showing", "hiding" or null.
-                    /// If the value is null, then we are not changing states, only changing visible position.
-                    /// </param>
-                    /// </signature>
-
-                    if ((this._visiblePosition === toPosition && !this._keyboardObscured) ||
-                        (this.disabled && toPosition !== displayModeVisiblePositions.disabled)) {
-                        // If we want to go where we already are, or we're disabled, return false.
-                        this._afterPositionChange(null);
-                    } else if (this._animating || this._needToHandleShowingKeyboard || this._needToHandleHidingKeyboard) {
-                        // Only do one thing at a time. If we are already animating,
-                        // or the IHM is animating, schedule this for later.
-                        this._doNext = toPosition;
-                        this._afterPositionChange(null);
-                    } else {
-                        // Begin position changing sequence.
-
-                        // Set the animating flag to block any queued position changes until we're done.
-                        this._element.winAnimating = toPosition;
-                        var performAnimation = this._initializing ? false : true;
-
-                        // Assume we are animating from the last position visited.
-                        var fromPosition = this._lastPositionVisited;
-
-                        // We'll need to measure our element to determine how far we need to animate.
-                        // Make sure we have accurate dimensions.
-                        this._element.style.display = "";
-
-                        // Are we hiding completely, or about to become visible?
-                        var hidingCompletely = (toPosition === displayModeVisiblePositions.hidden);
-
-                        if (this._keyboardObscured) {
-                            // We're changing position while covered by the IHM.
-                            if (hidingCompletely) {
-                                // If we're covered by the IHM we already look hidden.
-                                // We can skip our animation and just hide.
-                                performAnimation = false;
-                            } else {
-                                // Some portion of the _LegacyAppBar should be visible to users after its position changes.
-
-                                // Un-obscure ourselves and become visible to the user again.
-                                // Need to animate to our desired position as if we were coming up from behind the keyboard.
-                                fromPosition = displayModeVisiblePositions.hidden;
-                            }
-                            this._keyboardObscured = false;
-                        }
-
-                        // Fire "before" event if we are changing state.
-                        if (newState === appbarShownState) {
-                            this._beforeShow();
-                        } else if (newState === appbarHiddenState) {
-                            this._beforeHide();
-                        }
-
-                        // Position our element into the correct "end of animation" position,
-                        // also accounting for any viewport scrolling or soft keyboard positioning.
-                        this._ensurePosition();
-
-                        this._element.style.opacity = 1;
-                        this._element.style.visibility = "visible";
-
-                        this._animationPromise = (performAnimation) ? this._animatePositionChange(fromPosition, toPosition) : Promise.wrap();
-                        this._animationPromise.then(
-                            function () { this._afterPositionChange(toPosition, newState); }.bind(this),
-                            function () { this._afterPositionChange(toPosition, newState); }.bind(this)
-                        );
-                    }
-                },
-
-                _afterPositionChange: function _LegacyAppBar_afterPositionChange(newPosition, newState) {
-                    // Defines body of work to perform after changing positions.
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    if (newPosition) {
-
-                        // Update closedDisplayMode related CSS classes, which were delayed from the closedDisplayMode setter to avoid affecting the animation
-                        if (newPosition === displayModeVisiblePositions.minimal) {
-                            _ElementUtilities.addClass(this._element, _Constants.minimalClass);
-                            _ElementUtilities.removeClass(this._element, _Constants.compactClass);
-                        }
-
-                        if (newPosition === displayModeVisiblePositions.hidden && this.closedDisplayMode === closedDisplayModes.none) {
-                            _ElementUtilities.removeClass(this._element, _Constants.minimalClass);
-                            _ElementUtilities.removeClass(this._element, _Constants.compactClass);
-                        }
-
-                        // Clear animation flag and record having visited this position.
-                        this._element.winAnimating = "";
-                        this._lastPositionVisited = newPosition;
-
-                        if (this._doNext === this._lastPositionVisited) {
-                            this._doNext = "";
-                        }
-                        
-                        if (newState === appbarHiddenState) {
-                            _LightDismissService.hidden(this._dismissable);
-                        }
-                        
-                        if (newPosition === displayModeVisiblePositions.hidden) {
-                            // Make sure animation is finished.
-                            this._element.style.visibility = "hidden";
-                            this._element.style.display = "none";
-                        }
-
-                        // Clean up animation transforms.
-                        var transformProperty = _BaseUtils._browserStyleEquivalents["transform"].scriptName;
-                        this._element.style[transformProperty] = "";
-
-                        // Fire "after" event if we changed state.
-                        if (newState === appbarShownState) {
-                            this._afterShow();
-                        } else if (newState === appbarHiddenState) {
-                            this._afterHide();
-                        }
-
-                        // If we had something queued, do that
-                        Scheduler.schedule(this._checkDoNext, Scheduler.Priority.normal, this, "WinJS.UI._LegacyAppBar._checkDoNext");
-                    }
-
-                    this._afterPositionChangeCallBack();
-                },
-
-                _afterPositionChangeCallBack: function () {
-                    // Leave this blank for unit tests to overwrite.
-                },
-
-                _beforeShow: function _LegacyAppBar_beforeShow() {
-                    // In case their event 'beforeopen' event listener is going to manipulate commands,
-                    // first see if there are any queued command animations we can handle while we're still hidden.
-                    if (this._queuedCommandAnimation) {
-                        this._showAndHideFast(this._queuedToShow, this._queuedToHide);
-                        this._queuedToShow = [];
-                        this._queuedToHide = [];
-                    }
-
-                    // Make sure everything fits before showing
-                    this._layoutImpl.scale();
-
-                    if (this.closedDisplayMode === closedDisplayModes.compact) {
-                        this._heightWithoutLabels = this._element.offsetHeight;
-                    }
-
-                    _ElementUtilities.removeClass(this._element, _Constants.hiddenClass);
-                    _ElementUtilities.addClass(this._element, _Constants.showingClass);
-
-                    // Send our "beforeopen" event
-                    this._sendEvent(EVENTS.beforeOpen);
-                },
-
-                _afterShow: function _LegacyAppBar_afterShow() {
-                    _ElementUtilities.removeClass(this._element, _Constants.showingClass);
-                    _ElementUtilities.addClass(this._element, _Constants.shownClass);
-
-                    // Send our "afteropen" event
-                    this._sendEvent(EVENTS.afterOpen);
-                    this._writeProfilerMark("show,StopTM");
-                },
-
-                _beforeHide: function _LegacyAppBar_beforeHide() {
-
-                    _ElementUtilities.removeClass(this._element, _Constants.shownClass);
-                    _ElementUtilities.addClass(this._element, _Constants.hidingClass);
-
-                    // Send our "beforeclose" event
-                    this._sendEvent(EVENTS.beforeClose);
-                },
-
-                _afterHide: function _LegacyAppBar_afterHide() {
-
-                    // In case their 'afterclose' event handler is going to manipulate commands,
-                    // first see if there are any queued command animations we can handle now we're hidden.
-                    if (this._queuedCommandAnimation) {
-                        this._showAndHideFast(this._queuedToShow, this._queuedToHide);
-                        this._queuedToShow = [];
-                        this._queuedToHide = [];
-                    }
-
-                    _ElementUtilities.removeClass(this._element, _Constants.hidingClass);
-                    _ElementUtilities.addClass(this._element, _Constants.hiddenClass);
-
-                    // Send our "afterclose" event
-                    this._sendEvent(EVENTS.afterClose);
-                    this._writeProfilerMark("hide,StopTM");
-                },
-
-                _animatePositionChange: function _LegacyAppBar_animatePositionChange(fromPosition, toPosition) {
-                    // Determines and executes the proper transition between visible positions
-
-                    var layoutElementsAnimationPromise = this._layoutImpl.positionChanging(fromPosition, toPosition),
-                        appBarElementAnimationPromise;
-
-                    // Get values in terms of pixels to perform animation.
-                    var beginningVisiblePixelHeight = this._visiblePixels[fromPosition],
-                        endingVisiblePixelHeight = this._visiblePixels[toPosition],
-                        distance = Math.abs(endingVisiblePixelHeight - beginningVisiblePixelHeight),
-                        offsetTop = (this._placement === _Constants.appBarPlacementTop) ? -distance : distance;
-
-                    if ((this._placement === _Constants.appBarPlacementTop) &&
-                        ((fromPosition === displayModeVisiblePositions.shown &&
-                        toPosition === displayModeVisiblePositions.compact) ||
-                        (fromPosition === displayModeVisiblePositions.compact &&
-                        toPosition === displayModeVisiblePositions.shown))) {
-                        // Command icons remain in the same location on a top appbar
-                        // when going from compact > shown or shown > compact.
-                        offsetTop = 0;
-                    }
-
-                    // Animate
-                    if (endingVisiblePixelHeight > beginningVisiblePixelHeight) {
-                        var fromOffset = { top: offsetTop + "px", left: "0px" };
-                        appBarElementAnimationPromise = Animations.showEdgeUI(this._element, fromOffset, { mechanism: "transition" });
-                    } else {
-                        var toOffset = { top: offsetTop + "px", left: "0px" };
-                        appBarElementAnimationPromise = Animations.hideEdgeUI(this._element, toOffset, { mechanism: "transition" });
-                    }
-
-                    return Promise.join([layoutElementsAnimationPromise, appBarElementAnimationPromise]);
-                },
-
-                _checkDoNext: function _LegacyAppBar_checkDoNext() {
-                    // Do nothing if we're still animating
-                    if (this._animating || this._needToHandleShowingKeyboard || this._needToHandleHidingKeyboard || this._disposed) {
-                        return;
-                    }
-
-                    if (this._doNext === displayModeVisiblePositions.disabled ||
-                        this._doNext === displayModeVisiblePositions.hidden ||
-                        this._doNext === displayModeVisiblePositions.minimal ||
-                        this._doNext === displayModeVisiblePositions.compact) {
-                        // Do hide first because animating commands would be easier
-                        this._hide(this._doNext);
-                        this._doNext = "";
-                    } else if (this._queuedCommandAnimation) {
-                        // Do queued commands before showing if possible
-                        this._showAndHideQueue();
-                    } else if (this._doNext === displayModeVisiblePositions.shown) {
-                        // Show last so that we don't unnecessarily animate commands
-                        this._show();
-                        this._doNext = "";
-                    }
-                },
-
-                // Set focus to the passed in _LegacyAppBar
-                _setFocusToAppBar: function _LegacyAppBar_setFocusToAppBar(useSetActive, scroller) {
-                    if (!this._focusOnFirstFocusableElement(useSetActive, scroller)) {
-                        // No first element, set it to appbar itself
-                        _Overlay._Overlay._trySetActive(this._element, scroller);
-                    }
-                },
-
-                _commandsUpdated: function _LegacyAppBar_commandsUpdated() {
-                    // If we are still initializing then we don't have a layout yet so it doesn't need updating.
-                    if (!this._initializing) {
-                        this._layoutImpl.commandsUpdated();
-                        this._layoutImpl.scale();
-                    }
-                },
-
-                _beginAnimateCommands: function _LegacyAppBar_beginAnimateCommands(showCommands, hideCommands, otherVisibleCommands) {
-                    // The parameters are 3 mutually exclusive arrays of win-command elements contained in this Overlay.
-                    // 1) showCommands[]: All of the HIDDEN win-command elements that ARE scheduled to show.
-                    // 2) hideCommands[]: All of the VISIBLE win-command elements that ARE scheduled to hide.
-                    // 3) otherVisibleCommands[]: All VISIBLE win-command elements that ARE NOT scheduled to hide.
-                    this._layoutImpl.beginAnimateCommands(showCommands, hideCommands, otherVisibleCommands);
-                },
-
-                _endAnimateCommands: function _LegacyAppBar_endAnimateCommands() {
-                    this._layoutImpl.endAnimateCommands();
-                    this._endAnimateCommandsCallBack();
-                },
-
-                _endAnimateCommandsCallBack: function _LegacyAppBar_endAnimateCommandsCallBack() {
-                    // Leave this blank for unit tests to overwrite.
-                },
-
-                // Get the top offset for top appbars.
-                _getTopOfVisualViewport: function _LegacyAppBar_getTopOfVisualViewPort() {
-                    return _Overlay._Overlay._keyboardInfo._visibleDocTop;
-                },
-
-                // Get the bottom offset for bottom appbars.
-                _getAdjustedBottom: function _LegacyAppBar_getAdjustedBottom() {
-                    // Need the distance the IHM moved as well.
-                    return _Overlay._Overlay._keyboardInfo._visibleDocBottomOffset;
-                },
-
-                _showingKeyboard: function _LegacyAppBar_showingKeyboard(event) {
-                    // Remember keyboard showing state.
-                    this._keyboardObscured = false;
-                    this._needToHandleHidingKeyboard = false;
-
-                    // If we're already moved, then ignore the whole thing
-                    if (_Overlay._Overlay._keyboardInfo._visible && this._alreadyInPlace()) {
-                        return;
-                    }
-
-                    this._needToHandleShowingKeyboard = true;
-                    // If focus is in the appbar, don't cause scrolling.
-                    if (this.opened && this._element.contains(_Global.document.activeElement)) {
-                        event.ensuredFocusedElementInView = true;
-                    }
-
-                    // Check if appbar moves or if we're ok leaving it obscured instead.
-                    if (this._visible && this._placement !== _Constants.appBarPlacementTop && _Overlay._Overlay._isFlyoutVisible()) {
-                        // Remember that we're obscured
-                        this._keyboardObscured = true;
-                    } else {
-                        // Don't be obscured, clear _scrollHappened flag to give us inference later on when to re-show ourselves.
-                        this._scrollHappened = false;
-                    }
-
-                    // Also set timeout regardless, so we can clean up our _keyboardShowing flag.
-                    var that = this;
-                    _Global.setTimeout(function (e) { that._checkKeyboardTimer(e); }, _Overlay._Overlay._keyboardInfo._animationShowLength + _Overlay._Overlay._scrollTimeout);
-                },
-
-                _hidingKeyboard: function _LegacyAppBar_hidingKeyboard() {
-                    // We'll either just reveal the current space under the IHM or restore the window height.
-
-                    // We won't be obscured
-                    this._keyboardObscured = false;
-                    this._needToHandleShowingKeyboard = false;
-                    this._needToHandleHidingKeyboard = true;
-
-                    // We'll either just reveal the current space or resize the window
-                    if (!_Overlay._Overlay._keyboardInfo._isResized) {
-                        // If we're not completely hidden, only fake hiding under keyboard, or already animating,
-                        // then snap us to our final position.
-                        if (this._visible || this._animating) {
-                            // Not resized, update our final position immediately
-                            this._checkScrollPosition();
-                            this._element.style.display = "";
-                        }
-                        this._needToHandleHidingKeyboard = false;
-                    }
-                    // Else resize should clear keyboardHiding.
-                },
-
-                _resize: function _LegacyAppBar_resize(event) {
-                    // If we're hidden by the keyboard, then hide bottom appbar so it doesn't pop up twice when it scrolls
-                    if (this._needToHandleShowingKeyboard) {
-                        // Top is allowed to scroll off the top, but we don't want bottom to peek up when
-                        // scrolled into view since we'll show it ourselves and don't want a stutter effect.
-                        if (this._visible) {
-                            if (this._placement !== _Constants.appBarPlacementTop && !this._keyboardObscured) {
-                                // If viewport doesn't match window, need to vanish momentarily so it doesn't scroll into view,
-                                // however we don't want to toggle the visibility="hidden" hidden flag.
-                                this._element.style.display = "none";
-                            }
-                        }
-                        // else if we're top we stay, and if there's a flyout, stay obscured by the keyboard.
-                    } else if (this._needToHandleHidingKeyboard) {
-                        this._needToHandleHidingKeyboard = false;
-                        if (this._visible || this._animating) {
-                            // Snap to final position
-                            this._checkScrollPosition();
-                            this._element.style.display = "";
-                        }
-                    }
-
-                    // Make sure everything still fits.
-                    if (!this._initializing) {
-                        this._layoutImpl.resize(event);
-                    }
-                },
-
-                _checkKeyboardTimer: function _LegacyAppBar_checkKeyboardTimer() {
-                    if (!this._scrollHappened) {
-                        this._mayEdgeBackIn();
-                    }
-                },
-
-                _manipulationChanged: function _LegacyAppBar_manipulationChanged(event) {
-                    // See if we're at the not manipulating state, and we had a scroll happen,
-                    // which is implicitly after the keyboard animated.
-                    if (event.currentState === 0 && this._scrollHappened) {
-                        this._mayEdgeBackIn();
-                    }
-                },
-
-                _mayEdgeBackIn: function _LegacyAppBar_mayEdgeBackIn() {
-                    // May need to react to IHM being resized event
-                    if (this._needToHandleShowingKeyboard) {
-                        // If not top appbar or viewport isn't still at top, then need to show again
-                        this._needToHandleShowingKeyboard = false;
-                        // If obscured (IHM + flyout showing), it's ok to stay obscured.
-                        // If bottom we have to move, or if top scrolled off screen.
-                        if (!this._keyboardObscured &&
-                            (this._placement !== _Constants.appBarPlacementTop || _Overlay._Overlay._keyboardInfo._visibleDocTop !== 0)) {
-                            var toPosition = this._visiblePosition;
-                            this._lastPositionVisited = displayModeVisiblePositions.hidden;
-                            this._changeVisiblePosition(toPosition, false);
-                        } else {
-                            // Ensure any animations dropped during the showing keyboard are caught up.
-                            this._checkDoNext();
-                        }
-                    }
-                    this._scrollHappened = false;
-                },
-
-                _ensurePosition: function _LegacyAppBar_ensurePosition() {
-                    // Position the _LegacyAppBar element relative to the top or bottom edge of the visible
-                    // document, based on the the visible position we think we need to be in.
-                    var offSet = this._computePositionOffset();
-                    this._element.style.bottom = offSet.bottom;
-                    this._element.style.top = offSet.top;
-
-                },
-
-                _computePositionOffset: function _LegacyAppBar_computePositionOffset() {
-                    // Calculates and returns top and bottom offsets for the _LegacyAppBar element, relative to the top or bottom edge of the visible
-                    // document.
-                    var positionOffSet = {};
-
-                    if (this._placement === _Constants.appBarPlacementBottom) {
-                        // If the IHM is open, the bottom of the visual viewport may or may not be obscured
-                        // Use _getAdjustedBottom to account for the IHM if it is covering the bottom edge.
-                        positionOffSet.bottom = this._getAdjustedBottom() + "px";
-                        positionOffSet.top = "";
-                    } else if (this._placement === _Constants.appBarPlacementTop) {
-                        positionOffSet.bottom = "";
-                        positionOffSet.top = this._getTopOfVisualViewport() + "px";
-                    }
-
-                    return positionOffSet;
-                },
-
-                _checkScrollPosition: function _LegacyAppBar_checkScrollPosition() {
-                    // If IHM has appeared, then remember we may come in
-                    if (this._needToHandleShowingKeyboard) {
-                        // Tag that it's OK to edge back in.
-                        this._scrollHappened = true;
-                        return;
-                    }
-
-                    // We only need to update if we're not completely hidden.
-                    if (this._visible || this._animating) {
-                        this._ensurePosition();
-                        // Ensure any animations dropped during the showing keyboard are caught up.
-                        this._checkDoNext();
-                    }
-                },
-
-                _alreadyInPlace: function _LegacyAppBar_alreadyInPlace() {
-                    // See if we're already where we're supposed to be.
-                    var offSet = this._computePositionOffset();
-                    return (offSet.top === this._element.style.top && offSet.bottom === this._element.style.bottom);
-                },
-
-                // If there is a shown non-sticky _LegacyAppBar then it sets the firstDiv tabIndex to
-                //   the minimum tabIndex found in the _LegacyAppBars and finalDiv to the max found.
-                // Otherwise sets their tabIndex to -1 so they are not tab stops.
-                _updateFirstAndFinalDiv: function _LegacyAppBar_updateFirstAndFinalDiv() {
-                    var appBarFirstDiv = this._element.querySelectorAll("." + _Constants.firstDivClass);
-                    appBarFirstDiv = appBarFirstDiv.length >= 1 ? appBarFirstDiv[0] : null;
-
-                    var appBarFinalDiv = this._element.querySelectorAll("." + _Constants.finalDivClass);
-                    appBarFinalDiv = appBarFinalDiv.length >= 1 ? appBarFinalDiv[0] : null;
-
-                    // Remove the firstDiv & finalDiv if they are not at the appropriate locations
-                    if (appBarFirstDiv && (this._element.children[0] !== appBarFirstDiv)) {
-                        appBarFirstDiv.parentNode.removeChild(appBarFirstDiv);
-                        appBarFirstDiv = null;
-                    }
-                    if (appBarFinalDiv && (this._element.children[this._element.children.length - 1] !== appBarFinalDiv)) {
-                        appBarFinalDiv.parentNode.removeChild(appBarFinalDiv);
-                        appBarFinalDiv = null;
-                    }
-
-                    // Create and add the firstDiv & finalDiv if they don't already exist
-                    if (!appBarFirstDiv) {
-                        // Add a firstDiv that will be the first child of the appBar.
-                        // On focus set focus to the last element of the AppBar.
-                        appBarFirstDiv = _Global.document.createElement("div");
-                        // display: inline is needed so that the div doesn't take up space and cause the page to scroll on focus
-                        appBarFirstDiv.style.display = "inline";
-                        appBarFirstDiv.className = _Constants.firstDivClass;
-                        appBarFirstDiv.tabIndex = -1;
-                        appBarFirstDiv.setAttribute("aria-hidden", "true");
-                        _ElementUtilities._addEventListener(appBarFirstDiv, "focusin", this._focusOnLastFocusableElementOrThis.bind(this), false);
-                        // add to beginning
-                        if (this._element.children[0]) {
-                            this._element.insertBefore(appBarFirstDiv, this._element.children[0]);
-                        } else {
-                            this._element.appendChild(appBarFirstDiv);
-                        }
-                    }
-                    if (!appBarFinalDiv) {
-                        // Add a finalDiv that will be the last child of the appBar.
-                        // On focus set focus to the first element of the AppBar.
-                        appBarFinalDiv = _Global.document.createElement("div");
-                        // display: inline is needed so that the div doesn't take up space and cause the page to scroll on focus
-                        appBarFinalDiv.style.display = "inline";
-                        appBarFinalDiv.className = _Constants.finalDivClass;
-                        appBarFinalDiv.tabIndex = -1;
-                        appBarFinalDiv.setAttribute("aria-hidden", "true");
-                        _ElementUtilities._addEventListener(appBarFinalDiv, "focusin", this._focusOnFirstFocusableElementOrThis.bind(this), false);
-                        this._element.appendChild(appBarFinalDiv);
-                    }
-
-
-                    // invokeButton should be the second to last element in the _LegacyAppBar's tab order. Second to the finalDiv.
-                    if (this._element.children[this._element.children.length - 2] !== this._invokeButton) {
-                        this._element.insertBefore(this._invokeButton, appBarFinalDiv);
-                    }
-                    var elms = this._element.getElementsByTagName("*");
-                    var highestTabIndex = _ElementUtilities._getHighestTabIndexInList(elms);
-                    this._invokeButton.tabIndex = highestTabIndex;
-
-                    // Update the tabIndex of the firstDiv & finalDiv
-                    if (appBarFirstDiv) {
-                        appBarFirstDiv.tabIndex = _ElementUtilities._getLowestTabIndexInList(elms);
-                    }
-                    if (appBarFinalDiv) {
-                        appBarFinalDiv.tabIndex = highestTabIndex;
-                    }
-                },
-
-                _writeProfilerMark: function _LegacyAppBar_writeProfilerMark(text) {
-                    _WriteProfilerMark("WinJS.UI._LegacyAppBar:" + this._id + ":" + text);
-                }
-            }, {
-                // Statics
-                _Events: EVENTS,
-            });
-
-            return _LegacyAppBar;
-        })
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// Menu
-/// <dictionary>Menu,Menus,Flyout,Flyouts,Statics</dictionary>
-define('WinJS/Controls/Menu',[
-    'exports',
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../Promise',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    '../Utilities/_KeyboardBehavior',
-    './_LegacyAppBar/_Constants',
-    './Flyout',
-    './Flyout/_Overlay',
-    './Menu/_Command'
-], function menuInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Resources, _WriteProfilerMark, Promise, _ElementUtilities, _Hoverable, _KeyboardBehavior, _Constants, Flyout, _Overlay, _Command) {
-    "use strict";
-    
-    // Implementation details:
-    //
-    // WinJS Menu is a child class of WinJS Flyout. Unlike flyouts, menus have a lot of policy on the content they can contain. flyouts can host any arbitrary HTML content,
-    // but menus can only host WinJS MenuCommand objects. Menu relies on its flyout base class for on screen positioning, light dismiss,  and cascading behavior.
-    //
-    // The responsibilities of the WinJS Menu include:
-    //  - Rendering and Laying out commands:
-    //      - MenuCommands are displayed in DOM order. 
-    //      - Menu will add and remove CSS classes on itself depending on whether or it contains any visible MenuCommands whose type property is set to either "toggle" or 
-    //        "flyout".
-    //      - The presence or absence of these command types in a Menu will affect the total width of all commands in the Menu as well as the horizontal alignment of their 
-    //        labels.
-    //      - Menu relies on logic defined in its _Overlay ancestor class to animate the hiding and showing of commands.
-    //	- Menu spacing for last input type: 
-    //      - The vertical padding within MenuCommands in a Menu will vary based on the last input type.
-    //      - When a menu is shown, it will check the last known input type, which is stored in the "inputType" property on the static Flyout._cascadeManager object.
-    //          - If the inputType was "touch" the vertical padding in all commands in the menu will be increased to enable a more touch friendly UI.
-    //          - If the input Type was "mouse" or "keyboard" the vertical padding in all commands in the menu will be decreased for space efficiency
-    //	- Arrow key navigation between commands.
-    //      - Menu listens to keydown events in order to redirect focus to the next/previous command whenever the Up and down arrows keys are pressed.
-    //	- Mouse over event. 
-    //      - Menu all detects mouseover events and if a mouseover occurs over one of its commands, the menu moves focus to that command.
-    //      - If a command has type === "flyout", and that command is hovered over for few hundred milliseconds, the Menu will invoke the "flyout" typed command, causing its
-    //        sub flyout to show in the cascade.
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.Menu">Represents a menu flyout for displaying commands.</summary>
-        /// <compatibleWith platform="Windows" minVersion="8.0"/>
-        /// </field>
-        /// <name locid="WinJS.UI.Menu_name">Menu</name>
-        /// <icon src="ui_winjs.ui.menu.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.menu.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.Menu">
-        /// <button data-win-control="WinJS.UI.MenuCommand" data-win-options="{id:'',label:'example',type:'button',onclick:null}"></button>
-        /// </div>]]></htmlSnippet>
-        /// <event name="beforeshow" locid="WinJS.UI.Menu_e:beforeshow">Raised just before showing a menu.</event>
-        /// <event name="aftershow" locid="WinJS.UI.Menu_e:aftershow">Raised immediately after a menu is fully shown.</event>
-        /// <event name="beforehide" locid="WinJS.UI.Menu_e:beforehide">Raised just before hiding a menu.</event>
-        /// <event name="afterhide" locid="WinJS.UI.Menu_e:afterhide">Raised immediately after a menu is fully hidden.</event>
-        /// <part name="menu" class="win-menu" locid="WinJS.UI.Menu_part:menu">The Menu control itself</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        Menu: _Base.Namespace._lazy(function () {
-            var Key = _ElementUtilities.Key;
-
-            var strings = {
-                get ariaLabel() { return _Resources._getWinJSString("ui/menuAriaLabel").value; },
-                get requiresCommands() { return "Invalid argument: commands must not be empty"; },
-                get nullCommand() { return "Invalid argument: command must not be null"; },
-            };
-
-            function isCommandInMenu(object) {
-                // Verifies that we have a menuCommand element and that it is in a Menu.
-                var element = object.element || object;
-                return _ElementUtilities._matchesSelector(element, "." + _Constants.menuClass + " " + "." + _Constants.menuCommandClass);
-            }
-
-            var Menu = _Base.Class.derive(Flyout.Flyout, function Menu_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.Menu.Menu">
-                /// <summary locid="WinJS.UI.Menu.constructor">
-                /// Creates a new Menu control.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.UI.Menu.constructor_p:element">
-                /// The DOM element that will host the control.
-                /// </param>
-                /// <param name="options" type="Object" domElement="false" locid="WinJS.UI.Menu.constructor_p:options">
-                /// The set of properties and values to apply to the control.
-                /// </param>
-                /// <returns type="WinJS.UI.Menu" locid="WinJS.UI.Menu.constructor_returnValue">The new Menu control.</returns>
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </signature>
-
-                // We need to be built on top of a Flyout, so stomp on the user's input
-                options = options || {};
-
-                // Make sure there's an input element
-                this._element = element || _Global.document.createElement("div");
-                this._id = this._element.id || _ElementUtilities._uniqueID(this._element);
-                this._writeProfilerMark("constructor,StartTM");
-
-                // validate that if they didn't set commands, in which
-                // case any HTML only contains commands.  Do this first
-                // so that we don't leave partial Menus in the DOM.
-                if (!options.commands && this._element) {
-                    // Shallow copy object so we can modify it.
-                    options = _BaseUtils._shallowCopy(options);
-                    options.commands = this._verifyCommandsOnly(this._element, "WinJS.UI.MenuCommand");
-                }
-
-                
-                // Menu default ARIA role and label.
-                var role = "menu";
-                var label = null;
-                if (this._element) {
-                    // We want to use any user defined ARIA role or label that have been set.
-                    // Store them now because the baseFlyoutConstructor will overwrite them.
-                    role = this._element.getAttribute("role") || role;
-                    label = this._element.getAttribute("aria-label") || label;
-                }
-
-                // Call the base constructor helper.
-                this._baseFlyoutConstructor(this._element, options);
-
-                // Set ARIA role and label.
-                this._element.setAttribute("role", role);
-                this._element.setAttribute("aria-label", label);
-
-                // Handle "esc" & "up/down" key presses
-                this._element.addEventListener("keydown", this._handleKeyDown.bind(this), true);
-                this._element.addEventListener(_Constants._menuCommandInvokedEvent, this._handleCommandInvoked.bind(this), false);
-                this._element.addEventListener("mouseover", this._handleMouseOver.bind(this), false);
-                this._element.addEventListener("mouseout", this._handleMouseOut.bind(this), false);
-
-                // Attach our css class
-                _ElementUtilities.addClass(this._element, _Constants.menuClass);
-
-                this._winKeyboard = new _KeyboardBehavior._WinKeyboard(this._element);
-
-                // Need to set our commands, making sure we're hidden first
-                this.hide();
-                this._writeProfilerMark("constructor,StopTM");
-            }, {
-                // Public Properties
-
-                /// <field type="Array" locid="WinJS.UI.Menu.commands" helpKeyword="WinJS.UI.Menu.commands" isAdvanced="true">
-                /// Sets the MenuCommand objects that appear in the Menu. You can set this to a single MenuCommand or an array of MenuCommand objects.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                commands: {
-                    set: function (value) {
-                        // Fail if trying to set when visible
-                        if (!this.hidden) {
-                            throw new _ErrorFromName("WinJS.UI.Menu.CannotChangeCommandsWhenVisible", _Resources._formatString(_Overlay._Overlay.commonstrings.cannotChangeCommandsWhenVisible, "Menu"));
-                        }
-
-                        // Start from scratch
-                        _ElementUtilities.empty(this._element);
-
-                        // In case they had only one...
-                        if (!Array.isArray(value)) {
-                            value = [value];
-                        }
-
-                        // Add commands
-                        var len = value.length;
-                        for (var i = 0; i < len; i++) {
-                            this._addCommand(value[i]);
-                        }
-                    }
-                },
-
-                getCommandById: function (id) {
-                    /// <signature helpKeyword="WinJS.UI.Menu.getCommandById">
-                    /// <summary locid="WinJS.UI.Menu.getCommandById">
-                    /// Retrieve the command with the specified ID from this Menu.  If more than one command is found, all are returned.
-                    /// </summary>
-                    /// <param name="id" type="String" locid="WinJS.UI.Menu.getCommandById_p:id">The ID of the command to find.</param>
-                    /// <returns type="object" locid="WinJS.UI.Menu.getCommandById_returnValue">
-                    /// The command found, an array of commands if more than one have the same ID, or null if no command is found.
-                    /// </returns>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                    var commands = this.element.querySelectorAll("#" + id);
-                    var newCommands = [];
-                    for (var count = 0, len = commands.length; count < len; count++) {
-                        if (commands[count].winControl) {
-                            newCommands.push(commands[count].winControl);
-                        }
-                    }
-
-                    if (newCommands.length === 1) {
-                        return newCommands[0];
-                    } else if (newCommands.length === 0) {
-                        return null;
-                    }
-
-                    return newCommands;
-                },
-
-
-                showCommands: function (commands) {
-                    /// <signature helpKeyword="WinJS.UI.Menu.showCommands">
-                    /// <summary locid="WinJS.UI.Menu.showCommands">
-                    /// Shows the specified commands of the Menu.
-                    /// </summary>
-                    /// <param name="commands" type="Array" locid="WinJS.UI.Menu.showCommands_p:commands">
-                    /// The commands to show. The array elements may be Menu objects, or the string identifiers (IDs) of commands.
-                    /// </param>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                    if (!commands) {
-                        throw new _ErrorFromName("WinJS.UI.Menu.RequiresCommands", strings.requiresCommands);
-                    }
-
-                    this._showCommands(commands, true);
-                },
-
-                hideCommands: function (commands) {
-                    /// <signature helpKeyword="WinJS.UI.Menu.hideCommands">
-                    /// <summary locid="WinJS.UI.Menu.hideCommands">
-                    /// Hides the Menu.
-                    /// </summary>
-                    /// <param name="commands" type="Array" locid="WinJS.UI.Menu.hideCommands_p:commands">
-                    /// Required. Command or Commands to hide, either String, DOM elements, or WinJS objects.
-                    /// </param>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                    if (!commands) {
-                        throw new _ErrorFromName("WinJS.UI.Menu.RequiresCommands", strings.requiresCommands);
-                    }
-
-                    this._hideCommands(commands, true);
-                },
-
-                showOnlyCommands: function (commands) {
-                    /// <signature helpKeyword="WinJS.UI.Menu.showOnlyCommands">
-                    /// <summary locid="WinJS.UI.Menu.showOnlyCommands">
-                    /// Shows the specified commands of the Menu while hiding all other commands.
-                    /// </summary>
-                    /// <param name="commands" type="Array" locid="WinJS.UI.Menu.showOnlyCommands_p:commands">
-                    /// The commands to show. The array elements may be MenuCommand objects, or the string identifiers (IDs) of commands.
-                    /// </param>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                    if (!commands) {
-                        throw new _ErrorFromName("WinJS.UI.Menu.RequiresCommands", strings.requiresCommands);
-                    }
-
-                    this._showOnlyCommands(commands, true);
-                },
-
-                _hide: function Menu_hide() {
-                    if (this._hoverPromise) {
-                        this._hoverPromise.cancel();
-                    }
-                    Flyout.Flyout.prototype._hide.call(this);
-                },
-                
-                _afterHide: function Menu_afterHide() {
-                    _ElementUtilities.removeClass(this.element, _Constants.menuMouseSpacingClass);
-                    _ElementUtilities.removeClass(this.element, _Constants.menuTouchSpacingClass);
-                },
-
-                _beforeShow: function Menu_beforeShow() {
-                    // Make sure menu commands display correctly
-                    if (!_ElementUtilities.hasClass(this.element, _Constants.menuMouseSpacingClass) && !_ElementUtilities.hasClass(this.element, _Constants.menuTouchSpacingClass)) {
-                        // The Menu's spacing shouldn't change while it is already shown. Only
-                        // add a spacing class if it doesn't already have one. It will get
-                        // removed after the Menu hides.
-                        _ElementUtilities.addClass(
-                            this.element,
-                            Flyout.Flyout._cascadeManager.inputType === _KeyboardBehavior._InputTypes.mouse || Flyout.Flyout._cascadeManager.inputType === _KeyboardBehavior._InputTypes.keyboard ?
-                                _Constants.menuMouseSpacingClass :
-                                _Constants.menuTouchSpacingClass
-                        );
-                    }
-
-                    this._checkMenuCommands();
-                },
-
-                _addCommand: function Menu_addCommand(command) {
-                    if (!command) {
-                        throw new _ErrorFromName("WinJS.UI.Menu.NullCommand", strings.nullCommand);
-                    }
-                    // See if it's a command already
-                    if (!command._element) {
-                        // Not a command, so assume it's options for a command
-                        command = new _Command.MenuCommand(null, command);
-                    }
-                    // If we were attached somewhere else, detach us
-                    if (command._element.parentElement) {
-                        command._element.parentElement.removeChild(command._element);
-                    }
-
-                    // Reattach us
-                    this._element.appendChild(command._element);
-                },
-
-                _dispose: function Menu_dispose() {
-                    if (this._hoverPromise) {
-                        this._hoverPromise.cancel();
-                    }
-                    Flyout.Flyout.prototype._dispose.call(this);
-
-                },
-
-                _commandsUpdated: function Menu_commandsUpdated() {
-                    if (!this.hidden) {
-                        this._checkMenuCommands();
-                    }
-                },
-
-                _checkMenuCommands: function Menu_checkMenuCommands() {
-                    // Make sure menu commands display correctly.
-                    // Called when we show/hide commands or by _beforeShow() when the Menu is showing
-
-                    var menuCommands = this._element.querySelectorAll(".win-command"),
-                        hasToggleCommands = false,
-                        hasFlyoutCommands = false;
-                    if (menuCommands) {
-                        for (var i = 0, len = menuCommands.length; i < len; i++) {
-                            var menuCommand = menuCommands[i].winControl;
-                            if (menuCommand && !menuCommand.hidden) {
-                                if (!hasToggleCommands && menuCommand.type === _Constants.typeToggle) {
-                                    hasToggleCommands = true;
-                                }
-                                if (!hasFlyoutCommands && menuCommand.type === _Constants.typeFlyout) {
-                                    hasFlyoutCommands = true;
-                                }
-                            }
-                        }
-                    }
-                    
-                    _ElementUtilities[hasToggleCommands ? 'addClass' : 'removeClass'](this._element, _Constants.menuContainsToggleCommandClass);
-                    _ElementUtilities[hasFlyoutCommands ? 'addClass' : 'removeClass'](this._element, _Constants.menuContainsFlyoutCommandClass);
-                },
-
-                _handleKeyDown: function Menu_handleKeyDown(event) {
-                    if (event.keyCode === Key.upArrow) {
-                        Menu._focusOnPreviousElement(this.element);
-
-                        // Prevent the page from scrolling
-                        event.preventDefault();
-                    } else if (event.keyCode === Key.downArrow) {
-                        Menu._focusOnNextElement(this.element);
-
-                        // Prevent the page from scrolling
-                        event.preventDefault();
-                    } else if ((event.keyCode === Key.space || event.keyCode === Key.enter)
-                           && (this.element === _Global.document.activeElement)) {
-                        event.preventDefault();
-                        this.hide();
-                    } else if (event.keyCode === Key.tab) {
-                        event.preventDefault();
-                    }
-                },
-
-                _handleFocusIn: function Menu_handleFocusIn(event) {
-                    // Menu focuses commands on mouseover. We need to handle cases involving activated flyout commands
-                    // to ensure that mousing over different commands in a menu closes that command's sub flyout.
-                    var target = event.target;
-                    if (isCommandInMenu(target)) {
-                        var command = target.winControl;
-                        if (_ElementUtilities.hasClass(command.element, _Constants.menuCommandFlyoutActivatedClass)) {
-                            // If it's an activated 'flyout' typed command, move focus onto the command's subFlyout.
-                            // We expect this will collapse all decendant Flyouts of the subFlyout from the cascade.
-                            command.flyout.element.focus();
-                        } else {
-                            // Deactivate any currently activated command in the Menu to subsequently trigger all subFlyouts descendants to collapse.
-                            var activatedSiblingCommand = this.element.querySelector("." + _Constants.menuCommandFlyoutActivatedClass);
-                            if (activatedSiblingCommand) {
-                                _Command.MenuCommand._deactivateFlyoutCommand(activatedSiblingCommand);
-                            }
-                        }
-                    } else if (target === this.element) {
-                        // The Menu itself is receiving focus. Rely on the Flyout base implementation to notify the cascadeManager.
-                        // We expect this will only happen when other Menu event handling code causes the Menu to focus itself.
-                        Flyout.Flyout.prototype._handleFocusIn.call(this, event);
-                    }
-                },
-
-                _handleCommandInvoked: function Menu_handleCommandInvoked(event) {
-                    // Cascading Menus hide when invoking a command commits an action, not when invoking a command opens a subFlyout.
-                    if (this._hoverPromise) {
-                        // Prevent pending duplicate invoke triggered via hover.
-                        this._hoverPromise.cancel();
-                    }
-                    var command = event.detail.command;
-                    if (command._type !== _Constants.typeFlyout && command._type !== _Constants.typeSeparator) {
-                        this._lightDismiss(); // Collapse all Menus/Flyouts.
-                    }
-                },
-
-                _hoverPromise: null,
-                _handleMouseOver: function Menu_handleMouseOver(event) {
-                    var target = event.target;
-                    if (isCommandInMenu(target)) {
-                        var command = target.winControl,
-                            that = this;
-
-                        if (target.focus) {
-                            target.focus();
-                            // remove keyboard focus rect since focus has been triggered by mouse over.
-                            _ElementUtilities.removeClass(target, "win-keyboard");
-
-                            if (command.type === _Constants.typeFlyout && command.flyout && command.flyout.hidden) {
-                                this._hoverPromise = this._hoverPromise || Promise.timeout(_Constants.menuCommandHoverDelay).then(
-                                    function () {
-                                        if (!that.hidden && !that._disposed) {
-                                            command._invoke(event);
-                                        }
-                                        that._hoverPromise = null;
-                                    },
-                                    function () {
-                                        that._hoverPromise = null;
-                                    });
-                            }
-                        }
-                    }
-                },
-
-                _handleMouseOut: function Menu_handleMouseOut(event) {
-                    var target = event.target;
-                    if (isCommandInMenu(target) && !target.contains(event.relatedTarget)) {
-                        if (target === _Global.document.activeElement) {
-                            // Menu gives focus to the menu itself
-                            this.element.focus();
-                        }
-                        if (this._hoverPromise) {
-                            this._hoverPromise.cancel();
-                        }
-                    }
-                },
-
-                _writeProfilerMark: function Menu_writeProfilerMark(text) {
-                    _WriteProfilerMark("WinJS.UI.Menu:" + this._id + ":" + text);
-                }
-            });
-
-            // Statics
-
-            // Set focus to next focusable element in the menu (loop if necessary).
-            //   Note: The loop works by first setting focus to the menu itself.  If the menu is
-            //         what had focus before, then we break.  Otherwise we try the first child next.
-            // Focus remains on the menu if nothing is focusable.
-            Menu._focusOnNextElement = function (menu) {
-                var _currentElement = _Global.document.activeElement;
-
-                do {
-                    if (_currentElement === menu) {
-                        _currentElement = _currentElement.firstElementChild;
-                    } else {
-                        _currentElement = _currentElement.nextElementSibling;
-                    }
-
-                    if (_currentElement) {
-                        _currentElement.focus();
-                    } else {
-                        _currentElement = menu;
-                    }
-
-                } while (_currentElement !== _Global.document.activeElement);
-            };
-
-            // Set focus to previous focusable element in the menu (loop if necessary).
-            //   Note: The loop works by first setting focus to the menu itself.  If the menu is
-            //         what had focus before, then we break.  Otherwise we try the last child next.
-            // Focus remains on the menu if nothing is focusable.
-            Menu._focusOnPreviousElement = function (menu) {
-                var _currentElement = _Global.document.activeElement;
-
-                do {
-                    if (_currentElement === menu) {
-                        _currentElement = _currentElement.lastElementChild;
-                    } else {
-                        _currentElement = _currentElement.previousElementSibling;
-                    }
-
-                    if (_currentElement) {
-                        _currentElement.focus();
-                    } else {
-                        _currentElement = menu;
-                    }
-
-                } while (_currentElement !== _Global.document.activeElement);
-            };
-
-            return Menu;
-        })
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/AutoSuggestBox/_SearchSuggestionManagerShim',[
-    'exports',
-    '../../_Signal',
-    '../../Core/_Base',
-    '../../Core/_BaseUtils',
-    '../../Core/_Events',
-    '../../BindingList',
-], function SearchSuggestionManagerShimInit(exports, _Signal, _Base, _BaseUtils, _Events, BindingList) {
-    "use strict";
-
-    var CollectionChange = {
-        reset: 0,
-        itemInserted: 1,
-        itemRemoved: 2,
-        itemChanged: 3
-    };
-    var SearchSuggestionKind = {
-        Query: 0,
-        Result: 1,
-        Separator: 2
-    };
-
-    var SuggestionVectorShim = _Base.Class.derive(Array, function SuggestionVectorShim_ctor() {
-    }, {
-        reset: function () {
-            this.length = 0;
-            this.dispatchEvent("vectorchanged", { collectionChange: CollectionChange.reset, index: 0 });
-        },
-
-        insert: function (index, data) {
-            this.splice(index, 0, data);
-            this.dispatchEvent("vectorchanged", { collectionChange: CollectionChange.itemInserted, index: index });
-        },
-
-        remove: function (index) {
-            this.splice(index, 1);
-            this.dispatchEvent("vectorchanged", { collectionChange: CollectionChange.itemRemoved, index: index });
-        },
-    });
-    _Base.Class.mix(SuggestionVectorShim, _Events.eventMixin);
-
-    var SearchSuggestionCollectionShim = _Base.Class.define(function SearchSuggestionCollectionShim_ctor() {
-        this._data = [];
-    }, {
-        size: {
-            get: function () {
-                return this._data.length;
-            }
-        },
-
-        appendQuerySuggestion: function (text) {
-            this._data.push({ kind: SearchSuggestionKind.Query, text: text });
-        },
-        appendQuerySuggestions: function (suggestions) {
-            suggestions.forEach(this.appendQuerySuggestion.bind(this));
-        },
-        appendResultSuggestion: function (text, detailText, tag, imageUrl, imageAlternateText) {
-            // 'image' must be null (not undefined) for SearchBox to fallback to use imageUrl instead
-            this._data.push({ kind: SearchSuggestionKind.Result, text: text, detailText: detailText, tag: tag, imageUrl: imageUrl, imageAlternateText: imageAlternateText, image: null });
-        },
-        appendSearchSeparator: function (label) {
-            this._data.push({ kind: SearchSuggestionKind.Separator, text: label });
-        }
-    });
-
-    var SuggestionsRequestedEventArgShim = _Base.Class.define(function SuggestionsRequestedEventArgShim_ctor(queryText, language, linguisticDetails) {
-        this._queryText = queryText;
-        this._language = language;
-        this._linguisticDetails = linguisticDetails;
-        this._searchSuggestionCollection = new SearchSuggestionCollectionShim();
-    }, {
-        language: {
-            get: function () {
-                return this._language;
-            }
-        },
-        linguisticDetails: {
-            get: function () {
-                return this._linguisticDetails;
-            }
-        },
-        queryText: {
-            get: function () {
-                return this._queryText;
-            }
-        },
-        searchSuggestionCollection: {
-            get: function () {
-                return this._searchSuggestionCollection;
-            }
-        },
-        getDeferral: function () {
-            return this._deferralSignal || (this._deferralSignal = new _Signal());
-        },
-
-        _deferralSignal: null,
-    });
-
-    var SearchSuggestionManagerShim = _Base.Class.define(function SearchSuggestionManagerShim_ctor() {
-        this._updateVector = this._updateVector.bind(this);
-
-        this._suggestionVector = new SuggestionVectorShim();
-        this._query = "";
-        this._history = { "": [] };
-
-        this._dataSource = [];
-
-        this.searchHistoryContext = "";
-        this.searchHistoryEnabled = true;
-    }, {
-        addToHistory: function (queryText /*, language */) {
-            if (!queryText || !queryText.trim()) {
-                return;
-            }
-
-            var history = this._history[this.searchHistoryContext];
-            var dupeIndex = -1;
-            for (var i = 0, l = history.length; i < l; i++) {
-                var item = history[i];
-                if (item.text.toLowerCase() === queryText.toLowerCase()) {
-                    dupeIndex = i;
-                    break;
-                }
-            }
-            if (dupeIndex >= 0) {
-                history.splice(dupeIndex, 1);
-            }
-
-            history.splice(0, 0, { text: queryText, kind: SearchSuggestionKind.Query });
-            this._updateVector();
-        },
-
-        clearHistory: function () {
-            this._history[this.searchHistoryContext] = [];
-            this._updateVector();
-        },
-
-        setLocalContentSuggestionSettings: function (settings) {
-        },
-
-        setQuery: function (queryText) {
-            var that = this;
-            function update(arr) {
-                that._dataSource = arr;
-                that._updateVector();
-            }
-
-            this._query = queryText;
-            var arg = new SuggestionsRequestedEventArgShim(queryText);
-            this.dispatchEvent("suggestionsrequested", { request: arg });
-            if (arg._deferralSignal) {
-                arg._deferralSignal.promise.then(update.bind(this, arg.searchSuggestionCollection._data));
-            } else {
-                update(arg.searchSuggestionCollection._data);
-            }
-        },
-
-        searchHistoryContext: {
-            get: function () {
-                return "" + this._searchHistoryContext;
-            },
-            set: function (value) {
-                value = "" + value;
-                if (!this._history[value]) {
-                    this._history[value] = [];
-                }
-                this._searchHistoryContext = value;
-            }
-        },
-
-        searchHistoryEnabled: {
-            get: function () {
-                return this._searchHistoryEnabled;
-            },
-            set: function (value) {
-                this._searchHistoryEnabled = value;
-            }
-        },
-
-        suggestions: {
-            get: function () {
-                return this._suggestionVector;
-            }
-        },
-
-        _updateVector: function () {
-            // Can never clear the entire suggestions list or it will cause a visual flash because
-            // the SearchBox control removes the suggestions list UI when the SSM fires vectorChanged
-            // with size === 0, then re-renders it when the first suggestion is added.
-            // Workaround is to insert a dummy entry, remove all old entries, add the new set of
-            // eligible suggestions, then remove the dummy entry.
-            this.suggestions.insert(this.suggestions.length, { text: "", kind: SearchSuggestionKind.Query });
-
-            while (this.suggestions.length > 1) {
-                this.suggestions.remove(0);
-            }
-
-            var index = 0;
-            var added = {};
-            if (this.searchHistoryEnabled) {
-                var q = this._query.toLowerCase();
-                this._history[this.searchHistoryContext].forEach(function (item) {
-                    var text = item.text.toLowerCase();
-                    if (text.indexOf(q) === 0) {
-                        this.suggestions.insert(index, item);
-                        added[text] = true;
-                        index++;
-                    }
-                }, this);
-            }
-            this._dataSource.forEach(function (item) {
-                if (item.kind === SearchSuggestionKind.Query) {
-                    if (!added[item.text.toLowerCase()]) {
-                        this.suggestions.insert(index, item);
-                        index++;
-                    }
-                } else {
-                    this.suggestions.insert(index, item);
-                    index++;
-                }
-            }, this);
-
-            this.suggestions.remove(this.suggestions.length - 1);
-        },
-    });
-    _Base.Class.mix(SearchSuggestionManagerShim, _Events.eventMixin);
-
-    _Base.Namespace._moduleDefine(exports, null, {
-        _CollectionChange: CollectionChange,
-        _SearchSuggestionKind: SearchSuggestionKind,
-        _SearchSuggestionManagerShim: SearchSuggestionManagerShim,
-    });
-});
-
-define('require-style!less/styles-autosuggestbox',[],function(){});
-
-define('require-style!less/colors-autosuggestbox',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-
-// High Level
-//	- Displays a suggestions list below the input box
-//		- Simple suggestions
-//		- Suggestion results with icons
-//		- Separators
-//	- Maintains a history of previous search queries
-
-//Emphasis on Light-Weight
-// The ASB is a very policy-light control that just displays a list of suggestions
-// below the input box. It does NOT filter the suggestions based on the current input,
-// or sorts the suggestions in any way. It is entirely up to the app developer what and
-// what not to display in the suggestions list, given the current input query.
-
-// Anatomy
-// ASB
-//	- Input box
-//	- Suggestion List wrapper div
-//		? Repeater
-
-// Fake focus and keyboard navigation
-// When the selection list with more than one item is displayed, the user can arrow up
-// and down the list of suggestions which visually mimics focus movement, however, it
-// is not. The focus is always maintained on the input box itself and the control
-// programmatically maintains and styles the "current selected suggestion" indicating
-// what is currently selected.
-
-//IME support
-// The ASB has special IME support in IE/Edge, whenever the msInputContext function is
-// available. The ASB will reposition the suggestion list to account for the space the
-// IME takes up.
-
-//SearchBox
-//History
-// A bit of history first. The SearchBox control predates the ASB control, yet the
-// SearchBox derives from the ASB implementation. The reason is that the SearchBox
-// originally solved a very specific scenario, which is Windows 8 Search contract
-// integration; both, the contract and the control have since been deprecated. Going
-// forward, a new Search-like control was needed, which is the AutoSuggestBox and its
-// specifications are identical to the SearchBox, minus the Search contract integration.
-// So the creation of the ASB was mostly a deletion of code from the SearchBox. Finally,
-// for compatibility's sake, the SearchBox control and all of its original API needed to
-// still exist which is why the SearchBox control simply derives from the ASB and adding
-// all the deleted stuff back on top.
-
-//Features
-//	- FocusOnKeyboardInput (Type-To-Search)
-//    This feature assumes that the SearchBox is a singleton (again, legacy reasons) and
-//    kidnaps every typed key. It first moves focus into the SearchBox, so the typed key
-//    appears in the SearchBox.
-//	- Buddy Icon (The magnifier button next to the input)
-//	  The SearchBox has a magnifier button next to the input that, when clicked, is
-//    equivalent to clicking on a suggestion or hitting the enter key.
-
-define('WinJS/Controls/AutoSuggestBox',[
-    "exports",
-    "../Core/_Global",
-    "../Core/_WinRT",
-    "../Core/_Base",
-    "../Core/_ErrorFromName",
-    "../Core/_Events",
-    "../Core/_Resources",
-    "../Utilities/_Control",
-    "../Utilities/_ElementListUtilities",
-    "../Utilities/_ElementUtilities",
-    '../Utilities/_Hoverable',
-    "../_Accents",
-    "../Animations",
-    "../BindingList",
-    "../Promise",
-    "./Repeater",
-    "./AutoSuggestBox/_SearchSuggestionManagerShim",
-    "require-style!less/styles-autosuggestbox",
-    "require-style!less/colors-autosuggestbox"
-], function autoSuggestBoxInit(exports, _Global, _WinRT, _Base, _ErrorFromName, _Events, _Resources, _Control, _ElementListUtilities, _ElementUtilities, _Hoverable, _Accents, Animations, BindingList, Promise, Repeater, _SuggestionManagerShim) {
-    "use strict";
-
-    _Accents.createAccentRule("html.win-hoverable .win-autosuggestbox .win-autosuggestbox-suggestion-selected:hover", [{ name: "background-color", value: _Accents.ColorTypes.listSelectHover }]);
-    _Accents.createAccentRule(".win-autosuggestbox .win-autosuggestbox-suggestion-selected", [{ name: "background-color", value: _Accents.ColorTypes.listSelectRest }]);
-    _Accents.createAccentRule(".win-autosuggestbox .win-autosuggestbox-suggestion-selected.win-autosuggestbox-suggestion-selected:hover:active", [{ name: "background-color", value: _Accents.ColorTypes.listSelectPress }]);
-
-    var ClassNames = {
-        asb: "win-autosuggestbox",
-        asbDisabled: "win-autosuggestbox-disabled",
-        asbFlyout: "win-autosuggestbox-flyout",
-        asbFlyoutAbove: "win-autosuggestbox-flyout-above",
-        asbBoxFlyoutHighlightText: "win-autosuggestbox-flyout-highlighttext",
-        asbHitHighlightSpan: "win-autosuggestbox-hithighlight-span",
-        asbInput: "win-autosuggestbox-input",
-        asbInputFocus: "win-autosuggestbox-input-focus",
-        asbSuggestionQuery: "win-autosuggestbox-suggestion-query",
-        asbSuggestionResult: "win-autosuggestbox-suggestion-result",
-        asbSuggestionResultText: "win-autosuggestbox-suggestion-result-text",
-        asbSuggestionResultDetailedText: "win-autosuggestbox-suggestion-result-detailed-text",
-        asbSuggestionSelected: "win-autosuggestbox-suggestion-selected",
-        asbSuggestionSeparator: "win-autosuggestbox-suggestion-separator",
-    };
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.AutoSuggestBox">
-        /// A rich input box that provides suggestions as the user types.
-        /// </summary>
-        /// <compatibleWith platform="Windows" minVersion="8.1"/>
-        /// </field>
-        /// <icon src="ui_winjs.ui.autosuggest.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.autosuggest.16x16.png" width="16" height="16" />
-        /// <htmlSnippet><![CDATA[<div data-win-control="WinJS.UI.AutoSuggestBox"></div>]]></htmlSnippet>
-        /// <event name="querychanged" bubbles="true" locid="WinJS.UI.AutoSuggestBox:querychanged">Raised when user or app changes the query text.</event>
-        /// <event name="querysubmitted" bubbles="true" locid="WinJS.UI.AutoSuggestBox:querysubmitted">Raised when user presses Enter.</event>
-        /// <event name="resultsuggestionchosen" bubbles="true" locid="WinJS.UI.AutoSuggestBox:resultsuggestionchosen">Raised when user clicks  one of the displayed suggestions.</event>
-        /// <event name="suggestionsrequested" bubbles="true" locid="WinJS.UI.AutoSuggestBox:suggestionsrequested">Raised when the system requests suggestions from this app.</event>
-        /// <part name="autosuggestbox" class="win-autosuggestbox" locid="WinJS.UI.AutoSuggestBox:autosuggest">Styles the entire Auto Suggest Box control.</part>
-        /// <part name="autosuggestbox-input" class="win-autosuggestbox-input" locid="WinJS.UI.AutoSuggestBox_part:Input">Styles the query input box.</part>
-        /// <part name="autosuggestbox-flyout" class="win-autosuggestbox-flyout" locid="WinJS.UI.AutoSuggestBox_part:Flyout">Styles the result suggestions flyout.</part>
-        /// <part name="autosuggestbox-suggestion-query" class="win-autosuggestbox-suggestion-query" locid="WinJS.UI.AutoSuggestBox_part:Suggestion_Query">Styles the query type suggestion.</part>
-        /// <part name="autosuggestbox-suggestion-result" class="win-autosuggestbox-suggestion-result" locid="WinJS.UI.AutoSuggestBox_part:Suggestion_Result">Styles the result type suggestion.</part>
-        /// <part name="autosuggestbox-suggestion-selected" class="win-autosuggestbox-suggestion-selected" locid="WinJS.UI.AutoSuggestBox_part:Suggestion_Selected">Styles the currently selected suggestion.</part>
-        /// <part name="autosuggestbox-suggestion-separator" class="win-autosuggestbox-suggestion-separator" locid="WinJS.UI.AutoSuggestBox_part:Suggestion_Separator">Styles the separator type suggestion.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        AutoSuggestBox: _Base.Namespace._lazy(function () {
-            var Key = _ElementUtilities.Key;
-
-            var EventNames = {
-                querychanged: "querychanged",
-                querysubmitted: "querysubmitted",
-                resultsuggestionchosen: "resultsuggestionchosen",
-                suggestionsrequested: "suggestionsrequested"
-            };
-
-            var Strings = {
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; },
-                get invalidSuggestionKind() { return "Error: Invalid suggestion kind."; },
-
-                get ariaLabel() { return _Resources._getWinJSString("ui/autoSuggestBoxAriaLabel").value; },
-                get ariaLabelInputNoPlaceHolder() { return _Resources._getWinJSString("ui/autoSuggestBoxAriaLabelInputNoPlaceHolder").value; },
-                get ariaLabelInputPlaceHolder() { return _Resources._getWinJSString("ui/autoSuggestBoxAriaLabelInputPlaceHolder").value; },
-                get ariaLabelQuery() { return _Resources._getWinJSString("ui/autoSuggestBoxAriaLabelQuery").value; },
-                get ariaLabelResult() { return _Resources._getWinJSString("ui/autoSuggestBoxAriaLabelResult").value; },
-                get ariaLabelSeparator() { return _Resources._getWinJSString("ui/autoSuggestBoxAriaLabelSeparator").value; },
-            };
-
-            var AutoSuggestBox = _Base.Class.define(function asb_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.AutoSuggestBox.AutoSuggestBox">
-                /// <summary locid="WinJS.UI.AutoSuggestBox.constructor">
-                /// Creates a new AutoSuggestBox.
-                /// </summary>
-                /// <param name="element" domElement="true" locid="WinJS.UI.AutoSuggestBox.constructor_p:element">
-                /// The DOM element that hosts the AutoSuggestBox.
-                /// </param>
-                /// <param name="options" type="Object" locid="WinJS.UI.AutoSuggestBox.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// Event names must begin with "on". For example, to provide a handler for the querychanged event,
-                /// add a property named "onquerychanged" to the options object and set its value to the event handler.
-                /// This parameter is optional.
-                /// </param>
-                /// <returns type="WinJS.UI.AutoSuggestBox" locid="WinJS.UI.AutoSuggestBox.constructor_returnValue">
-                /// The new AutoSuggestBox.
-                /// </returns>
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </signature>
-                element = element || _Global.document.createElement("div");
-                options = options || {};
-
-                if (element.winControl) {
-                    throw new _ErrorFromName("WinJS.UI.AutoSuggestBox.DuplicateConstruction", Strings.duplicateConstruction);
-                }
-
-                this._suggestionsChangedHandler = this._suggestionsChangedHandler.bind(this);
-                this._suggestionsRequestedHandler = this._suggestionsRequestedHandler.bind(this);
-
-                this._element = element;
-                element.winControl = this;
-                element.classList.add(ClassNames.asb);
-                element.classList.add("win-disposable");
-
-                this._setupDOM();
-                this._setupSSM();
-
-                this._chooseSuggestionOnEnter = false;
-                this._currentFocusedIndex = -1;
-                this._currentSelectedIndex = -1;
-                this._flyoutOpenPromise = Promise.wrap();
-                this._lastKeyPressLanguage = "";
-                this._prevLinguisticDetails = this._getLinguisticDetails();
-                this._prevQueryText = "";
-
-                _Control.setOptions(this, options);
-
-                this._hideFlyout();
-            }, {
-                /// <field type="Function" locid="WinJS.UI.AutoSuggestBox.onresultsuggestionchosen" helpKeyword="WinJS.UI.AutoSuggestBox.onresultsuggestionchosen">
-                /// Raised when user clicks on one of the suggestions displayed.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                onresultsuggestionchosen: _Events._createEventProperty(EventNames.resultsuggestionchosen),
-
-                /// <field type="Function" locid="WinJS.UI.AutoSuggestBox.onquerychanged" helpKeyword="WinJS.UI.AutoSuggestBox.onquerychanged">
-                /// Raised when user or app changes the query text.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                onquerychanged: _Events._createEventProperty(EventNames.querychanged),
-
-                /// <field type="Function" locid="WinJS.UI.AutoSuggestBox.onquerysubmitted" helpKeyword="WinJS.UI.AutoSuggestBox.onquerysubmitted">
-                /// Raised when user submits the current query.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                onquerysubmitted: _Events._createEventProperty(EventNames.querysubmitted),
-
-                /// <field type="Function" locid="WinJS.UI.AutoSuggestBox.onsuggestionsrequested" helpKeyword="WinJS.UI.AutoSuggestBox.onsuggestionsrequested">
-                /// Raised when Windows requests search suggestions from the app.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                onsuggestionsrequested: _Events._createEventProperty(EventNames.suggestionsrequested),
-
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.AutoSuggestBox.element" helpKeyword="WinJS.UI.AutoSuggestBox.element">
-                /// Gets the DOM element that hosts the AutoSuggestBox.
-                /// <compatibleWith platform="WindowsPhoneApp" minVersion="8.1" />
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-
-                /// <field type='String' locid="WinJS.UI.AutoSuggestBox.chooseSuggestionOnEnter" helpKeyword="WinJS.UI.AutoSuggestBox.chooseSuggestionOnEnter">
-                /// Gets or sets whether the first suggestion is chosen when the user presses Enter. When set to true, as the user types in the input box, a
-                /// focus rectangle is drawn on the first suggestion (if present and no IME composition in progress). Pressing enter will behave the same as
-                /// if clicked on the focused suggestion, and the down arrow key press will put real focus to the second suggestion and the up arrow key will
-                /// remove focus.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                chooseSuggestionOnEnter: {
-                    get: function () {
-                        return this._chooseSuggestionOnEnter;
-                    },
-                    set: function (value) {
-                        this._chooseSuggestionOnEnter = !!value;
-                    }
-                },
-
-                /// <field type='bool' locid="WinJS.UI.AutoSuggestBox.disabled" helpKeyword="WinJS.UI.AutoSuggestBox.disabled">
-                /// Gets or sets a value that specifies whether the AutoSuggestBox is disabled.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                disabled: {
-                    get: function () {
-                        return this._inputElement.disabled;
-                    },
-                    set: function (value) {
-                        if (this._inputElement.disabled === !!value) {
-                            return;
-                        }
-
-                        if (!value) {
-                            this._enableControl();
-                        } else {
-                            this._disableControl();
-                        }
-                    }
-                },
-
-                /// <field type='String' locid="WinJS.UI.AutoSuggestBox.placeholderText" helpKeyword="WinJS.UI.AutoSuggestBox.placeholderText">
-                /// Gets or sets the placeholder text for the AutoSuggestBox. This text is displayed if there is no other text in the input box.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                placeholderText: {
-                    get: function () {
-                        return this._inputElement.placeholder;
-                    },
-                    set: function (value) {
-                        this._inputElement.placeholder = value;
-                        this._updateInputElementAriaLabel();
-                    }
-                },
-
-                /// <field type='String' locid="WinJS.UI.AutoSuggestBox.queryText" helpKeyword="WinJS.UI.AutoSuggestBox.queryText">
-                /// Gets or sets the query text for the AutoSuggestBox.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                queryText: {
-                    get: function () {
-                        return this._inputElement.value;
-                    },
-                    set: function (value) {
-                        this._inputElement.value = ""; // This finalizes the IME composition
-                        this._inputElement.value = value;
-                    }
-                },
-
-                /// <field type='bool' locid="WinJS.UI.AutoSuggestBox.searchHistoryDisabled" helpKeyword="WinJS.UI.AutoSuggestBox.searchHistoryDisabled">
-                /// Gets or sets a value that specifies whether history is disabled for the AutoSuggestBox. The default value is false.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                searchHistoryDisabled: {
-                    get: function () {
-                        return !this._suggestionManager.searchHistoryEnabled;
-                    },
-                    set: function (value) {
-                        this._suggestionManager.searchHistoryEnabled = !value;
-                    }
-                },
-
-                /// <field type='String' locid="WinJS.UI.AutoSuggestBox.searchHistoryContext" helpKeyword="WinJS.UI.AutoSuggestBox.searchHistoryContext">
-                /// Gets or sets the search history context for the AutoSuggestBox. The search history context string is used as a secondary key for storing search history.
-                /// (The primary key is the AppId.) An app can use the search history context string to store different search histories based on the context of the application.
-                /// If you don't set this property, the system assumes that all searches in your app occur in the same context.
-                /// If you update this property while the search pane is open with suggestions showing, the changes won't take effect until the user enters the next character.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                searchHistoryContext: {
-                    get: function () {
-                        return this._suggestionManager.searchHistoryContext;
-                    },
-                    set: function (value) {
-                        this._suggestionManager.searchHistoryContext = value;
-                    }
-                },
-
-                dispose: function asb_dispose() {
-                    /// <signature helpKeyword="WinJS.UI.AutoSuggestBox.dispose">
-                    /// <summary locid="WinJS.UI.AutoSuggestBox.dispose">
-                    /// Disposes this control.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    // Cancel pending promises.
-                    this._flyoutOpenPromise.cancel();
-
-                    this._suggestions.removeEventListener("vectorchanged", this._suggestionsChangedHandler);
-                    this._suggestionManager.removeEventListener("suggestionsrequested", this._suggestionsRequestedHandler);
-
-                    this._suggestionManager = null;
-                    this._suggestions = null;
-                    this._hitFinder = null;
-
-                    this._disposed = true;
-                },
-
-                setLocalContentSuggestionSettings: function asb_setLocalContentSuggestionSettings(settings) {
-                    /// <signature helpKeyword="WinJS.UI.AutoSuggestBox.SetLocalContentSuggestionSettings">
-                    /// <summary locid="WinJS.UI.AutoSuggestBox.SetLocalContentSuggestionSettings">
-                    /// Specifies whether suggestions based on local files are automatically displayed in the input field, and defines the criteria that
-                    /// the system uses to locate and filter these suggestions.
-                    /// </summary>
-                    /// <param name="eventName" type="Windows.ApplicationModel.Search.LocalContentSuggestionSettings" locid="WinJS.UI.AutoSuggestBox.setLocalContentSuggestionSettings_p:settings">
-                    /// The new settings for local content suggestions.
-                    /// </param>
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </signature>
-                    this._suggestionManager.setLocalContentSuggestionSettings(settings);
-                },
-
-                // Constructor Helpers
-                _setupDOM: function asb_setupDOM() {
-                    var flyoutPointerReleasedHandler = this._flyoutPointerReleasedHandler.bind(this);
-                    var inputOrImeChangeHandler = this._inputOrImeChangeHandler.bind(this);
-
-                    // Root element
-                    if (!this._element.getAttribute("aria-label")) {
-                        this._element.setAttribute("aria-label", Strings.ariaLabel);
-                    }
-                    this._element.setAttribute("role", "group");
-
-                    // Input element
-                    this._inputElement = _Global.document.createElement("input");
-                    this._inputElement.autocorrect = "off";
-                    this._inputElement.type = "search";
-                    this._inputElement.classList.add(ClassNames.asbInput);
-                    this._inputElement.classList.add("win-textbox");
-                    this._inputElement.setAttribute("role", "textbox");
-                    this._inputElement.addEventListener("keydown", this._keyDownHandler.bind(this));
-                    this._inputElement.addEventListener("keypress", this._keyPressHandler.bind(this));
-                    this._inputElement.addEventListener("keyup", this._keyUpHandler.bind(this));
-                    this._inputElement.addEventListener("focus", this._inputFocusHandler.bind(this));
-                    this._inputElement.addEventListener("blur", this._inputBlurHandler.bind(this));
-                    this._inputElement.addEventListener("input", inputOrImeChangeHandler);
-                    this._inputElement.addEventListener("compositionstart", inputOrImeChangeHandler);
-                    this._inputElement.addEventListener("compositionupdate", inputOrImeChangeHandler);
-                    this._inputElement.addEventListener("compositionend", inputOrImeChangeHandler);
-                    _ElementUtilities._addEventListener(this._inputElement, "pointerdown", this._inputPointerDownHandler.bind(this));
-                    this._updateInputElementAriaLabel();
-                    this._element.appendChild(this._inputElement);
-                    var context = this._tryGetInputContext();
-                    if (context) {
-                        context.addEventListener("MSCandidateWindowShow", this._msCandidateWindowShowHandler.bind(this));
-                        context.addEventListener("MSCandidateWindowHide", this._msCandidateWindowHideHandler.bind(this));
-                    }
-
-                    // Flyout element
-                    this._flyoutElement = _Global.document.createElement("div");
-                    this._flyoutElement.classList.add(ClassNames.asbFlyout);
-                    this._flyoutElement.addEventListener("blur", this._flyoutBlurHandler.bind(this));
-                    _ElementUtilities._addEventListener(this._flyoutElement, "pointerup", flyoutPointerReleasedHandler);
-                    _ElementUtilities._addEventListener(this._flyoutElement, "pointercancel", flyoutPointerReleasedHandler);
-                    _ElementUtilities._addEventListener(this._flyoutElement, "pointerout", flyoutPointerReleasedHandler);
-                    _ElementUtilities._addEventListener(this._flyoutElement, "pointerdown", this._flyoutPointerDownHandler.bind(this));
-                    this._element.appendChild(this._flyoutElement);
-
-                    // Repeater
-                    var that = this;
-                    function repeaterTemplate(suggestion) {
-                        return that._renderSuggestion(suggestion);
-                    }
-                    this._suggestionsData = new BindingList.List();
-                    this._repeaterElement = _Global.document.createElement("div");
-                    this._repeater = new Repeater.Repeater(this._repeaterElement, {
-                        data: this._suggestionsData,
-                        template: repeaterTemplate,
-                    });
-                    _ElementUtilities._ensureId(this._repeaterElement);
-                    this._repeaterElement.setAttribute("role", "listbox");
-                    this._repeaterElement.setAttribute("aria-live", "polite");
-                    this._flyoutElement.appendChild(this._repeaterElement);
-                },
-
-                _setupSSM: function asb_setupSSM() {
-                    // Get the search suggestion provider if it is available
-                    this._suggestionManager = new _SuggestionManagerShim._SearchSuggestionManagerShim();
-                    this._suggestions = this._suggestionManager.suggestions;
-
-                    this._suggestions.addEventListener("vectorchanged", this._suggestionsChangedHandler);
-                    this._suggestionManager.addEventListener("suggestionsrequested", this._suggestionsRequestedHandler);
-                },
-
-                // Flyout functions
-                _hideFlyout: function asb_hideFlyout() {
-                    if (this._isFlyoutShown()) {
-                        this._flyoutElement.style.display = "none";
-                    }
-                },
-
-                _showFlyout: function asb_showFlyout() {
-                    var prevNumSuggestions = this._prevNumSuggestions || 0;
-                    this._prevNumSuggestions = this._suggestionsData.length;
-
-                    if (this._isFlyoutShown() && prevNumSuggestions === this._suggestionsData.length) {
-                        return;
-                    }
-
-                    if (this._suggestionsData.length === 0) {
-                        return;
-                    }
-
-                    this._flyoutElement.style.display = "block";
-
-                    var inputRect = this._inputElement.getBoundingClientRect();
-                    var flyoutRect = this._flyoutElement.getBoundingClientRect();
-                    var documentClientWidth = _Global.document.documentElement.clientWidth;
-
-                    // Display above vs below - the ASB flyout always opens in the direction where there is more space
-                    var spaceAbove = inputRect.top;
-                    var spaceBelow = _Global.document.documentElement.clientHeight - inputRect.bottom;
-                    this._flyoutBelowInput = spaceBelow >= spaceAbove;
-                    if (this._flyoutBelowInput) {
-                        this._flyoutElement.classList.remove(ClassNames.asbFlyoutAbove);
-                        this._flyoutElement.scrollTop = 0;
-                    } else {
-                        this._flyoutElement.classList.add(ClassNames.asbFlyoutAbove);
-                        this._flyoutElement.scrollTop = this._flyoutElement.scrollHeight - this._flyoutElement.clientHeight;
-                    }
-
-                    this._addFlyoutIMEPaddingIfRequired();
-
-                    // Align left vs right edge
-                    var alignRight;
-                    if (_ElementUtilities._getComputedStyle(this._flyoutElement).direction === "rtl") {
-                        // RTL: Align to the right edge if there is enough space to the left of the control's
-                        // right edge, or if there is not enough space to fit the flyout aligned to either edge.
-                        alignRight = ((inputRect.right - flyoutRect.width) >= 0) || ((inputRect.left + flyoutRect.width) > documentClientWidth);
-
-                    } else {
-                        // LTR: Align to the right edge if there isn't enough space to the right of the control's
-                        // left edge, but there is enough space to the left of the control's right edge.
-                        alignRight = ((inputRect.left + flyoutRect.width) > documentClientWidth) && ((inputRect.right - flyoutRect.width) >= 0);
-                    }
-
-                    if (alignRight) {
-                        this._flyoutElement.style.left = (inputRect.width - flyoutRect.width - this._element.clientLeft) + "px";
-                    } else {
-                        this._flyoutElement.style.left = "-" + this._element.clientLeft + "px";
-                    }
-
-                    // ms-scroll-chaining:none will still chain scroll parent element if child div does
-                    // not have a scroll bar. Prevent this by setting and updating touch action
-                    this._flyoutElement.style.touchAction = this._flyoutElement.scrollHeight > flyoutRect.height ? "pan-y" : "none";
-
-                    this._flyoutOpenPromise.cancel();
-                    var animationKeyframe = this._flyoutBelowInput ? "WinJS-flyoutBelowASB-showPopup" : "WinJS-flyoutAboveASB-showPopup";
-                    this._flyoutOpenPromise = Animations.showPopup(this._flyoutElement, { top: "0px", left: "0px", keyframe: animationKeyframe });
-                },
-
-                _addFlyoutIMEPaddingIfRequired: function asb_addFlyoutIMEPaddingIfRequired() {
-                    // Check if we have InputContext APIs
-                    var context = this._tryGetInputContext();
-                    if (!context) {
-                        return;
-                    }
-
-                    // Check if flyout is visible and below input
-                    if (!this._isFlyoutShown() || !this._flyoutBelowInput) {
-                        return;
-                    }
-
-                    // Check if IME is occluding flyout
-                    var flyoutRect = this._flyoutElement.getBoundingClientRect();
-                    var imeRect = context.getCandidateWindowClientRect();
-                    var inputRect = this._inputElement.getBoundingClientRect();
-                    var flyoutTop = inputRect.bottom;
-                    var flyoutBottom = inputRect.bottom + flyoutRect.height;
-                    if (imeRect.top > flyoutBottom || imeRect.bottom < flyoutTop) {
-                        return;
-                    }
-
-                    // Shift the flyout down or to the right depending on IME/ASB width ratio.
-                    // When the IME width is less than 45% of the ASB's width, the flyout gets
-                    // shifted right, otherwise shifted down.
-                    var animation = Animations.createRepositionAnimation(this._flyoutElement);
-                    if (imeRect.width < (inputRect.width * 0.45)) {
-                        this._flyoutElement.style.marginLeft = imeRect.width + "px";
-                    } else {
-                        this._flyoutElement.style.marginTop = (imeRect.bottom - imeRect.top + 4) + "px";
-                    }
-                    animation.execute();
-                },
-
-                _findNextSuggestionElementIndex: function asb_findNextSuggestionElementIndex(curIndex) {
-                    // Returns -1 if there are no focusable elements after curIndex
-                    // Returns first element if curIndex < 0
-                    var startIndex = curIndex < 0 ? 0 : curIndex + 1;
-                    for (var i = startIndex; i < this._suggestionsData.length; i++) {
-                        if ((this._repeater.elementFromIndex(i)) && (this._isSuggestionSelectable(this._suggestionsData.getAt(i)))) {
-                            return i;
-                        }
-                    }
-                    return -1;
-                },
-
-                _findPreviousSuggestionElementIndex: function asb_findPreviousSuggestionElementIndex(curIndex) {
-                    // Returns -1 if there are no focusable elements before curIndex
-                    // Returns last element if curIndex >= suggestionsdata.length
-                    var startIndex = curIndex >= this._suggestionsData.length ? this._suggestionsData.length - 1 : curIndex - 1;
-                    for (var i = startIndex; i >= 0; i--) {
-                        if ((this._repeater.elementFromIndex(i)) && (this._isSuggestionSelectable(this._suggestionsData.getAt(i)))) {
-                            return i;
-                        }
-                    }
-                    return -1;
-                },
-
-                _isFlyoutShown: function asb_isFlyoutShown() {
-                    return (this._flyoutElement.style.display !== "none");
-                },
-
-                _isSuggestionSelectable: function asb_isSuggestionSelectable(suggestion) {
-                    return ((suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Query) ||
-                            (suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Result));
-                },
-
-                _processSuggestionChosen: function asb_processSuggestionChosen(item, event) {
-                    this.queryText = item.text;
-                    if (item.kind === _SuggestionManagerShim._SearchSuggestionKind.Query) {
-                        this._submitQuery(item.text, false /*fillLinguisticDetails*/, event); // force empty linguistic details since explicitly chosen suggestion from list
-                    } else if (item.kind === _SuggestionManagerShim._SearchSuggestionKind.Result) {
-                        this._fireEvent(EventNames.resultsuggestionchosen, {
-                            tag: item.tag,
-                            keyModifiers: getKeyModifiers(event),
-                            storageFile: null
-                        });
-                    }
-                    this._hideFlyout();
-                },
-
-                _selectSuggestionAtIndex: function asb_selectSuggestionAtIndex(indexToSelect) {
-                    var that = this;
-                    function scrollToView(targetElement) {
-                        var popupHeight = that._flyoutElement.getBoundingClientRect().bottom - that._flyoutElement.getBoundingClientRect().top;
-                        if ((targetElement.offsetTop + targetElement.offsetHeight) > (that._flyoutElement.scrollTop + popupHeight)) {
-                            // Element to scroll is below popup visible area
-                            var scrollDifference = (targetElement.offsetTop + targetElement.offsetHeight) - (that._flyoutElement.scrollTop + popupHeight);
-                            _ElementUtilities._zoomTo(that._flyoutElement, { contentX: 0, contentY: (that._flyoutElement.scrollTop + scrollDifference), viewportX: 0, viewportY: 0 });
-                        } else if (targetElement.offsetTop < that._flyoutElement.scrollTop) {
-                            // Element to scroll is above popup visible area
-                            _ElementUtilities._zoomTo(that._flyoutElement, { contentX: 0, contentY: targetElement.offsetTop, viewportX: 0, viewportY: 0 });
-                        }
-                    }
-
-                    // Sets focus on the specified element and removes focus from others.
-                    // Clears selection if index is outside of suggestiondata index range.
-                    var curElement = null;
-                    for (var i = 0; i < this._suggestionsData.length; i++) {
-                        curElement = this._repeater.elementFromIndex(i);
-                        if (i !== indexToSelect) {
-                            curElement.classList.remove(ClassNames.asbSuggestionSelected);
-                            curElement.setAttribute("aria-selected", "false");
-                        } else {
-                            curElement.classList.add(ClassNames.asbSuggestionSelected);
-                            scrollToView(curElement);
-                            curElement.setAttribute("aria-selected", "true");
-                        }
-                    }
-                    this._currentSelectedIndex = indexToSelect;
-                    if (curElement) {
-                        this._inputElement.setAttribute("aria-activedescendant", this._repeaterElement.id + indexToSelect);
-                    } else if (this._inputElement.hasAttribute("aria-activedescendant")) {
-                        this._inputElement.removeAttribute("aria-activedescendant");
-                    }
-                },
-
-                _updateFakeFocus: function asb_updateFakeFocus() {
-                    var firstElementIndex;
-                    if (this._isFlyoutShown() && (this._chooseSuggestionOnEnter)) {
-                        firstElementIndex = this._findNextSuggestionElementIndex(-1);
-                    } else {
-                        // This will clear the fake focus.
-                        firstElementIndex = -1;
-                    }
-
-                    this._selectSuggestionAtIndex(firstElementIndex);
-                },
-
-                _updateQueryTextWithSuggestionText: function asb_updateQueryTextWithSuggestionText(suggestionIndex) {
-                    if ((suggestionIndex >= 0) && (suggestionIndex < this._suggestionsData.length)) {
-                        this.queryText = this._suggestionsData.getAt(suggestionIndex).text;
-                    }
-                },
-
-                // Helpers
-                _disableControl: function asb_disableControl() {
-                    if (this._isFlyoutShown()) {
-                        this._hideFlyout();
-                    }
-                    this._element.disabled = true;
-                    this._element.classList.add(ClassNames.asbDisabled);
-                    this._inputElement.disabled = true;
-                },
-
-                _enableControl: function asb_enableControl() {
-                    this._element.disabled = false;
-                    this._element.classList.remove(ClassNames.asbDisabled);
-                    this._inputElement.disabled = false;
-                    if (_Global.document.activeElement === this._element) {
-                        _ElementUtilities._setActive(this._inputElement);
-                    }
-                },
-
-                _fireEvent: function asb_fireEvent(type, detail) {
-                    // Returns true if ev.preventDefault() was not called
-                    var event = _Global.document.createEvent("CustomEvent");
-                    event.initCustomEvent(type, true, true, detail);
-                    return this._element.dispatchEvent(event);
-                },
-
-                _getLinguisticDetails: function asb_getLinguisticDetails(useCache, createFilled) { // createFilled=false always creates an empty linguistic details object, otherwise generate it or use the cache
-                    function createQueryLinguisticDetails(compositionAlternatives, compositionStartOffset, compositionLength, queryTextPrefix, queryTextSuffix) {
-                        var linguisticDetails = null;
-
-                        // The linguistic alternatives we receive are only for the composition string being composed. We need to provide the linguistic alternatives
-                        // in the form of the full query text with alternatives embedded.
-                        var fullCompositionAlternatives = [];
-                        for (var i = 0; i < compositionAlternatives.length; i++) {
-                            fullCompositionAlternatives[i] = queryTextPrefix + compositionAlternatives[i] + queryTextSuffix;
-                        }
-
-                        if (_WinRT.Windows.ApplicationModel.Search.SearchQueryLinguisticDetails) {
-                            try {
-                                linguisticDetails = new _WinRT.Windows.ApplicationModel.Search.SearchQueryLinguisticDetails(fullCompositionAlternatives, compositionStartOffset, compositionLength);
-                            } catch (e) {
-                                // WP10 currently exposes SQLD API but throws on instantiation.
-                            }
-                        }
-
-                        if (!linguisticDetails) {
-                            // If we're in web compartment, create a script version of the WinRT SearchQueryLinguisticDetails object
-                            linguisticDetails = {
-                                queryTextAlternatives: fullCompositionAlternatives,
-                                queryTextCompositionStart: compositionStartOffset,
-                                queryTextCompositionLength: compositionLength
-                            };
-                        }
-                        return linguisticDetails;
-                    }
-
-                    var linguisticDetails = null;
-                    if ((this._inputElement.value === this._prevQueryText) && useCache && this._prevLinguisticDetails && createFilled) {
-                        linguisticDetails = this._prevLinguisticDetails;
-                    } else {
-                        var compositionAlternatives = [];
-                        var compositionStartOffset = 0;
-                        var compositionLength = 0;
-                        var queryTextPrefix = "";
-                        var queryTextSuffix = "";
-                        if (createFilled) {
-                            var context = this._tryGetInputContext();
-                            if (context && context.getCompositionAlternatives) {
-                                compositionAlternatives = context.getCompositionAlternatives();
-                                compositionStartOffset = context.compositionStartOffset;
-                                compositionLength = context.compositionEndOffset - context.compositionStartOffset;
-
-                                if ((this._inputElement.value !== this._prevQueryText) || (this._prevCompositionLength === 0) || (compositionLength > 0)) {
-                                    queryTextPrefix = this._inputElement.value.substring(0, compositionStartOffset);
-                                    queryTextSuffix = this._inputElement.value.substring(compositionStartOffset + compositionLength);
-                                } else {
-                                    // composition ended, but alternatives have been kept, need to reuse the previous query prefix/suffix, but still report to the client that the composition has ended (start & length of composition of 0)
-                                    queryTextPrefix = this._inputElement.value.substring(0, this._prevCompositionStart);
-                                    queryTextSuffix = this._inputElement.value.substring(this._prevCompositionStart + this._prevCompositionLength);
-                                }
-                            }
-                        }
-                        linguisticDetails = createQueryLinguisticDetails(compositionAlternatives, compositionStartOffset, compositionLength, queryTextPrefix, queryTextSuffix);
-                    }
-                    return linguisticDetails;
-                },
-
-                _isElementInSearchControl: function asb_isElementInSearchControl(targetElement) {
-                    return this.element.contains(targetElement) || (this.element === targetElement);
-                },
-
-                _renderSuggestion: function asb_renderSuggestion(suggestion) {
-                    var root = null;
-                    if (!suggestion) {
-                        return root;
-                    }
-                    if (suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Query) {
-                        root = querySuggestionRenderer(this, suggestion);
-                    } else if (suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Separator) {
-                        root = separatorSuggestionRenderer(suggestion);
-                    } else if (suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Result) {
-                        root = resultSuggestionRenderer(this, suggestion);
-                    } else {
-                        throw new _ErrorFromName("WinJS.UI.AutoSuggestBox.invalidSuggestionKind", Strings.invalidSuggestionKind);
-                    }
-                    return root;
-                },
-
-                _shouldIgnoreInput: function asb_shouldIgnoreInput() {
-                    var processingIMEFocusLossKey = this._isProcessingDownKey || this._isProcessingUpKey || this._isProcessingTabKey || this._isProcessingEnterKey;
-                    return processingIMEFocusLossKey || this._isFlyoutPointerDown;
-                },
-
-                _submitQuery: function asb_submitQuery(queryText, fillLinguisticDetails, event) {
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    // get the most up to date value of the input langauge from WinRT if available
-                    if (_WinRT.Windows.Globalization.Language) {
-                        this._lastKeyPressLanguage = _WinRT.Windows.Globalization.Language.currentInputMethodLanguageTag;
-                    }
-
-                    this._fireEvent(EventNames.querysubmitted, {
-                        language: this._lastKeyPressLanguage,
-                        linguisticDetails: this._getLinguisticDetails(true /*useCache*/, fillLinguisticDetails), // allow caching, but generate empty linguistic details if suggestion is used
-                        queryText: queryText,
-                        keyModifiers: getKeyModifiers(event)
-                    });
-
-                    if (this._suggestionManager) {
-                        this._suggestionManager.addToHistory(this._inputElement.value, this._lastKeyPressLanguage);
-                    }
-                },
-
-                _tryGetInputContext: function asb_tryGetInputContext() {
-                    // On WP, msGetInputContext is defined but throws when invoked
-                    if (this._inputElement.msGetInputContext) {
-                        try {
-                            return this._inputElement.msGetInputContext();
-                        } catch (e) {
-                            return null;
-                        }
-                    }
-                    return null;
-                },
-
-                _updateInputElementAriaLabel: function asb_updateInputElementAriaLabel() {
-                    this._inputElement.setAttribute("aria-label",
-                        this._inputElement.placeholder ? _Resources._formatString(Strings.ariaLabelInputPlaceHolder, this._inputElement.placeholder) : Strings.ariaLabelInputNoPlaceHolder
-                    );
-                },
-
-                // Event Handlers
-                _flyoutBlurHandler: function asb_flyoutBlurHandler(event) {
-                    if (this._isElementInSearchControl(_Global.document.activeElement)) {
-                        this._internalFocusMove = true;
-                    } else {
-                        this._element.classList.remove(ClassNames.asbInputFocus);
-                        this._hideFlyout();
-                    }
-                },
-
-                _flyoutPointerDownHandler: function asb_flyoutPointerDownHandler(ev) {
-                    var that = this;
-                    var srcElement = ev.target;
-                    function findSuggestionElementIndex() {
-                        if (srcElement) {
-                            for (var i = 0; i < that._suggestionsData.length; i++) {
-                                if (that._repeater.elementFromIndex(i) === srcElement) {
-                                    return i;
-                                }
-                            }
-                        }
-                        return -1;
-                    }
-
-                    this._isFlyoutPointerDown = true;
-                    while (srcElement && (srcElement.parentNode !== this._repeaterElement)) {
-                        srcElement = srcElement.parentNode;
-                    }
-                    var index = findSuggestionElementIndex();
-                    if ((index >= 0) && (index < this._suggestionsData.length) && (this._currentFocusedIndex !== index)) {
-                        if (this._isSuggestionSelectable(this._suggestionsData.getAt(index))) {
-                            this._currentFocusedIndex = index;
-                            this._selectSuggestionAtIndex(index);
-                            this._updateQueryTextWithSuggestionText(this._currentFocusedIndex);
-                        }
-                    }
-                    // Prevent default so focus does not leave input element.
-                    ev.preventDefault();
-                },
-
-                _flyoutPointerReleasedHandler: function asb_flyoutPointerReleasedHandler() {
-                    this._isFlyoutPointerDown = false;
-
-                    if (this._reflowImeOnPointerRelease) {
-                        this._reflowImeOnPointerRelease = false;
-                        var animation = Animations.createRepositionAnimation(this._flyoutElement);
-                        this._flyoutElement.style.marginTop = "";
-                        this._flyoutElement.style.marginLeft = "";
-                        animation.execute();
-                    }
-                },
-
-                _inputBlurHandler: function asb_inputBlurHandler(event) {
-                    // Hide flyout if focus is leaving the control
-                    if (!this._isElementInSearchControl(_Global.document.activeElement)) {
-                        this._element.classList.remove(ClassNames.asbInputFocus);
-                        this._hideFlyout();
-                    }
-                    this.queryText = this._prevQueryText; // Finalize IME composition
-                    this._isProcessingDownKey = false;
-                    this._isProcessingUpKey = false;
-                    this._isProcessingTabKey = false;
-                    this._isProcessingEnterKey = false;
-                },
-
-                _inputFocusHandler: function asb_inputFocusHandler(event) {
-                    // Refresh hit highlighting if text has changed since focus was present
-                    // This can happen if the user committed a suggestion previously.
-                    if (this._inputElement.value !== this._prevQueryText) {
-                        if (_WinRT.Windows.Data.Text.SemanticTextQuery) {
-                            if (this._inputElement.value !== "") {
-                                this._hitFinder = new _WinRT.Windows.Data.Text.SemanticTextQuery(this._inputElement.value, this._inputElement.lang);
-                            } else {
-                                this._hitFinder = null;
-                            }
-                        }
-                    }
-
-                    // If focus is returning to the input box from outside the control, show the flyout and refresh the suggestions
-                    if (event.target === this._inputElement && !this._internalFocusMove) {
-                        this._showFlyout();
-                        if (this._currentFocusedIndex !== -1) {
-                            // Focus is not in input
-                            this._selectSuggestionAtIndex(this._currentFocusedIndex);
-                        } else {
-                            this._updateFakeFocus();
-                        }
-
-                        this._suggestionManager.setQuery(
-                            this._inputElement.value,
-                            this._lastKeyPressLanguage,
-                            this._getLinguisticDetails(true /*useCache*/, true /*createFilled*/)
-                        );
-                    }
-
-                    this._internalFocusMove = false;
-                    this._element.classList.add(ClassNames.asbInputFocus);
-                },
-
-                _inputOrImeChangeHandler: function asb_inputImeChangeHandler() {
-                    var that = this;
-                    function hasLinguisticDetailsChanged(newLinguisticDetails) {
-                        var hasLinguisticDetailsChanged = false;
-                        if ((that._prevLinguisticDetails.queryTextCompositionStart !== newLinguisticDetails.queryTextCompositionStart) ||
-                            (that._prevLinguisticDetails.queryTextCompositionLength !== newLinguisticDetails.queryTextCompositionLength) ||
-                            (that._prevLinguisticDetails.queryTextAlternatives.length !== newLinguisticDetails.queryTextAlternatives.length)) {
-                            hasLinguisticDetailsChanged = true;
-                        }
-                        that._prevLinguisticDetails = newLinguisticDetails;
-                        return hasLinguisticDetailsChanged;
-                    }
-
-                    // swallow the IME change event that gets fired when composition is ended due to keyboarding down to the suggestion list & mouse down on the button
-                    if (!this._shouldIgnoreInput()) {
-                        var linguisticDetails = this._getLinguisticDetails(false /*useCache*/, true /*createFilled*/); // never cache on explicit user changes
-                        var hasLinguisticDetailsChanged = hasLinguisticDetailsChanged(linguisticDetails); // updates this._prevLinguisticDetails
-
-                        // Keep the previous composition cache up to date, execpt when composition ended with no text change and alternatives are kept.
-                        // In that case, we need to use the cached values to correctly generate the query prefix/suffix for substituting alternatives, but still report to the client that the composition has ended (via start & length of composition of 0)
-                        if ((this._inputElement.value !== this._prevQueryText) || (this._prevCompositionLength === 0) || (linguisticDetails.queryTextCompositionLength > 0)) {
-                            this._prevCompositionStart = linguisticDetails.queryTextCompositionStart;
-                            this._prevCompositionLength = linguisticDetails.queryTextCompositionLength;
-                        }
-
-                        if ((this._prevQueryText === this._inputElement.value) && !hasLinguisticDetailsChanged) {
-                            // Sometimes the input change is fired even if there is no change in input.
-                            // Swallow event in those cases.
-                            return;
-                        }
-                        this._prevQueryText = this._inputElement.value;
-
-                        // get the most up to date value of the input langauge from WinRT if available
-                        if (_WinRT.Windows.Globalization.Language) {
-                            this._lastKeyPressLanguage = _WinRT.Windows.Globalization.Language.currentInputMethodLanguageTag;
-                        }
-
-                        if (_WinRT.Windows.Data.Text.SemanticTextQuery) {
-                            if (this._inputElement.value !== "") {
-                                this._hitFinder = new _WinRT.Windows.Data.Text.SemanticTextQuery(this._inputElement.value, this._lastKeyPressLanguage);
-                            } else {
-                                this._hitFinder = null;
-                            }
-                        }
-
-                        this._fireEvent(EventNames.querychanged, {
-                            language: this._lastKeyPressLanguage,
-                            queryText: this._inputElement.value,
-                            linguisticDetails: linguisticDetails
-                        });
-
-                        this._suggestionManager.setQuery(
-                            this._inputElement.value,
-                            this._lastKeyPressLanguage,
-                            linguisticDetails
-                        );
-                    }
-                },
-
-                _inputPointerDownHandler: function asb_inputPointerDownHandler() {
-                    if ((_Global.document.activeElement === this._inputElement) && (this._currentSelectedIndex !== -1)) {
-                        this._currentFocusedIndex = -1;
-                        this._selectSuggestionAtIndex(this._currentFocusedIndex);
-                    }
-                },
-
-                _keyDownHandler: function asb_keyDownHandler(event) {
-                    var that = this;
-                    function setSelection(index) {
-                        that._currentFocusedIndex = index;
-                        that._selectSuggestionAtIndex(index);
-                        event.preventDefault();
-                        event.stopPropagation();
-                    }
-
-                    this._lastKeyPressLanguage = event.locale;
-                    if (event.keyCode === Key.tab) {
-                        this._isProcessingTabKey = true;
-                    } else if (event.keyCode === Key.upArrow) {
-                        this._isProcessingUpKey = true;
-                    } else if (event.keyCode === Key.downArrow) {
-                        this._isProcessingDownKey = true;
-                    } else if ((event.keyCode === Key.enter) && (event.locale === "ko")) {
-                        this._isProcessingEnterKey = true;
-                    }
-                    // Ignore keys handled by ime.
-                    if (event.keyCode !== Key.IME) {
-                        if (event.keyCode === Key.tab) {
-                            var closeFlyout = true;
-                            if (event.shiftKey) {
-                                if (this._currentFocusedIndex !== -1) {
-                                    // Focus is not in input
-                                    setSelection(-1);
-                                    closeFlyout = false;
-                                }
-                            } else if (this._currentFocusedIndex === -1) {
-                                this._currentFocusedIndex =
-                                    this._flyoutBelowInput
-                                    ? this._findNextSuggestionElementIndex(this._currentFocusedIndex)
-                                    : this._findPreviousSuggestionElementIndex(this._suggestionsData.length);
-                                if (this._currentFocusedIndex !== -1) {
-                                    // Found a selectable element
-                                    setSelection(this._currentFocusedIndex);
-                                    this._updateQueryTextWithSuggestionText(this._currentFocusedIndex);
-                                    closeFlyout = false;
-                                }
-                            }
-
-                            if (closeFlyout) {
-                                this._hideFlyout();
-                            }
-                        } else if (event.keyCode === Key.escape) {
-                            if (this._currentFocusedIndex !== -1) {
-                                // Focus is not in input
-                                this.queryText = this._prevQueryText;
-                                setSelection(-1);
-                            } else if (this.queryText !== "") {
-                                this.queryText = "";
-                                this._inputOrImeChangeHandler(null);
-                                event.preventDefault();
-                                event.stopPropagation();
-                            }
-                        } else if ((this._flyoutBelowInput && event.keyCode === Key.upArrow) || (!this._flyoutBelowInput && event.keyCode === Key.downArrow)) {
-                            var prevIndex;
-                            if (this._currentSelectedIndex !== -1) {
-                                prevIndex = this._findPreviousSuggestionElementIndex(this._currentSelectedIndex);
-                                // Restore user entered query when user navigates back to input.
-                                if (prevIndex === -1) {
-                                    this.queryText = this._prevQueryText;
-                                }
-                            } else {
-                                prevIndex = this._findPreviousSuggestionElementIndex(this._suggestionsData.length);
-                            }
-                            setSelection(prevIndex);
-                            this._updateQueryTextWithSuggestionText(this._currentFocusedIndex);
-                        } else if ((this._flyoutBelowInput && event.keyCode === Key.downArrow) || (!this._flyoutBelowInput && event.keyCode === Key.upArrow)) {
-                            var nextIndex = this._findNextSuggestionElementIndex(this._currentSelectedIndex);
-                            // Restore user entered query when user navigates back to input.
-                            if ((this._currentSelectedIndex !== -1) && (nextIndex === -1)) {
-                                this.queryText = this._prevQueryText;
-                            }
-                            setSelection(nextIndex);
-                            this._updateQueryTextWithSuggestionText(this._currentFocusedIndex);
-                        } else if (event.keyCode === Key.enter) {
-                            if (this._currentSelectedIndex === -1) {
-                                this._submitQuery(this._inputElement.value, true /*fillLinguisticDetails*/, event);
-                            } else {
-                                this._processSuggestionChosen(this._suggestionsData.getAt(this._currentSelectedIndex), event);
-                            }
-                            this._hideFlyout();
-                        }
-                    }
-                },
-
-                _keyUpHandler: function asb_keyUpHandler(event) {
-                    if (event.keyCode === Key.tab) {
-                        this._isProcessingTabKey = false;
-                    } else if (event.keyCode === Key.upArrow) {
-                        this._isProcessingUpKey = false;
-                    } else if (event.keyCode === Key.downArrow) {
-                        this._isProcessingDownKey = false;
-                    } else if (event.keyCode === Key.enter) {
-                        this._isProcessingEnterKey = false;
-                    }
-                },
-
-                _keyPressHandler: function asb_keyPressHandler(event) {
-                    this._lastKeyPressLanguage = event.locale;
-                },
-
-                _msCandidateWindowHideHandler: function asb_msCandidateWindowHideHandler() {
-                    if (!this._isFlyoutPointerDown) {
-                        var animation = Animations.createRepositionAnimation(this._flyoutElement);
-                        this._flyoutElement.style.marginTop = "";
-                        this._flyoutElement.style.marginLeft = "";
-                        animation.execute();
-                    } else {
-                        this._reflowImeOnPointerRelease = true;
-                    }
-                },
-
-                _msCandidateWindowShowHandler: function asb_msCandidateWindowShowHandler() {
-                    this._addFlyoutIMEPaddingIfRequired();
-                    this._reflowImeOnPointerRelease = false;
-                },
-
-                _suggestionsChangedHandler: function asb_suggestionsChangedHandler(event) {
-                    var collectionChange = event.collectionChange || event.detail.collectionChange;
-                    var changeIndex = (+event.index === event.index) ? event.index : event.detail.index;
-                    var ChangeEnum = _SuggestionManagerShim._CollectionChange;
-                    if (collectionChange === ChangeEnum.reset) {
-                        if (this._isFlyoutShown()) {
-                            this._hideFlyout();
-                        }
-                        this._suggestionsData.splice(0, this._suggestionsData.length);
-                    } else if (collectionChange === ChangeEnum.itemInserted) {
-                        var suggestion = this._suggestions[changeIndex];
-                        this._suggestionsData.splice(changeIndex, 0, suggestion);
-
-                        this._showFlyout();
-
-                    } else if (collectionChange === ChangeEnum.itemRemoved) {
-                        if ((this._suggestionsData.length === 1)) {
-                            _ElementUtilities._setActive(this._inputElement);
-
-                            this._hideFlyout();
-                        }
-                        this._suggestionsData.splice(changeIndex, 1);
-                    } else if (collectionChange === ChangeEnum.itemChanged) {
-                        var suggestion = this._suggestions[changeIndex];
-                        if (suggestion !== this._suggestionsData.getAt(changeIndex)) {
-                            this._suggestionsData.setAt(changeIndex, suggestion);
-                        } else {
-                            // If the suggestions manager gives us an identical item, it means that only the hit highlighted text has changed.
-                            var existingElement = this._repeater.elementFromIndex(changeIndex);
-                            if (_ElementUtilities.hasClass(existingElement, ClassNames.asbSuggestionQuery)) {
-                                addHitHighlightedText(existingElement, suggestion, suggestion.text);
-                            } else {
-                                var resultSuggestionDiv = existingElement.querySelector("." + ClassNames.asbSuggestionResultText);
-                                if (resultSuggestionDiv) {
-                                    addHitHighlightedText(resultSuggestionDiv, suggestion, suggestion.text);
-                                    var resultSuggestionDetailDiv = existingElement.querySelector("." + ClassNames.asbSuggestionResultDetailedText);
-                                    if (resultSuggestionDetailDiv) {
-                                        addHitHighlightedText(resultSuggestionDetailDiv, suggestion, suggestion.detailText);
-                                    }
-                                }
-                            }
-                        }
-                    }
-
-                    if (_Global.document.activeElement === this._inputElement) {
-                        this._updateFakeFocus();
-                    }
-                },
-
-                _suggestionsRequestedHandler: function asb_suggestionsRequestedHandler(event) {
-                    // get the most up to date value of the input langauge from WinRT if available
-                    if (_WinRT.Windows.Globalization.Language) {
-                        this._lastKeyPressLanguage = _WinRT.Windows.Globalization.Language.currentInputMethodLanguageTag;
-                    }
-
-                    var request = event.request || event.detail.request;
-                    var deferral;
-                    this._fireEvent(EventNames.suggestionsrequested, {
-                        setPromise: function (promise) {
-                            deferral = request.getDeferral();
-                            promise.then(function () {
-                                deferral.complete();
-                            });
-                        },
-                        searchSuggestionCollection: request.searchSuggestionCollection,
-                        language: this._lastKeyPressLanguage,
-                        linguisticDetails: this._getLinguisticDetails(true /*useCache*/, true /*createFilled*/),
-                        queryText: this._inputElement.value
-                    });
-                },
-            }, {
-                createResultSuggestionImage: function asb_createResultSuggestionImage(url) {
-                    /// <signature helpKeyword="WinJS.UI.AutoSuggestBox.createResultSuggestionImage">
-                    /// <summary locid="WinJS.UI.AutoSuggestBox.createResultSuggestionImage">
-                    /// Creates the image argument for SearchSuggestionCollection.appendResultSuggestion.
-                    /// </summary>
-                    /// <param name="url" type="string" locid="WinJS.UI.AutoSuggestBox.asb_createResultSuggestionImage_p:url">
-                    /// The url of the image.
-                    /// </param>
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </signature>
-                    if (_WinRT.Windows.Foundation.Uri && _WinRT.Windows.Storage.Streams.RandomAccessStreamReference) {
-                        return _WinRT.Windows.Storage.Streams.RandomAccessStreamReference.createFromUri(new _WinRT.Windows.Foundation.Uri(url));
-                    }
-                    return url;
-                },
-
-                _EventNames: EventNames,
-
-                _sortAndMergeHits: function asb_sortAndMergeHits(hitsProvided) {
-                    function hitStartPositionAscendingSorter(firstHit, secondHit) {
-                        var returnValue = 0;
-                        if (firstHit.startPosition < secondHit.startPosition) {
-                            returnValue = -1;
-                        } else if (firstHit.startPosition > secondHit.startPosition) {
-                            returnValue = 1;
-                        }
-                        return returnValue;
-                    }
-                    function hitIntersectionReducer(reducedHits, nextHit, currentIndex) {
-                        if (currentIndex === 0) {
-                            reducedHits.push(nextHit);
-                        } else {
-                            var curHit = reducedHits[reducedHits.length - 1];
-                            var curHitEndPosition = curHit.startPosition + curHit.length;
-                            if (nextHit.startPosition <= curHitEndPosition) {
-                                // The next hit intersects or is next to current hit. Merge it.
-                                var nextHitEndPosition = nextHit.startPosition + nextHit.length;
-                                if (nextHitEndPosition > curHitEndPosition) {
-                                    curHit.length = nextHitEndPosition - curHit.startPosition;
-                                }
-                            } else {
-                                // No intersection, simply add to reduced list.
-                                reducedHits.push(nextHit);
-                            }
-                        }
-                        return reducedHits;
-                    }
-
-                    var reducedHits = [];
-                    if (hitsProvided) {
-                        // Copy hitsprovided array as winrt objects are immutable.
-                        var hits = new Array(hitsProvided.length);
-                        for (var i = 0; i < hitsProvided.length; i++) {
-                            hits.push({ startPosition: hitsProvided[i].startPosition, length: hitsProvided[i].length });
-                        }
-                        hits.sort(hitStartPositionAscendingSorter);
-                        hits.reduce(hitIntersectionReducer, reducedHits);
-                    }
-                    return reducedHits;
-                }
-            });
-
-            function addHitHighlightedText(element, item, text, hitFinder) {
-                function addNewSpan(element, textContent, insertBefore) {
-                    // Adds new span element with specified inner text as child to element, placed before insertBefore
-                    var spanElement = _Global.document.createElement("span");
-                    spanElement.textContent = textContent;
-                    spanElement.setAttribute("aria-hidden", "true");
-                    spanElement.classList.add(ClassNames.asbHitHighlightSpan);
-                    element.insertBefore(spanElement, insertBefore);
-                    return spanElement;
-                }
-
-                if (text) {
-                    // Remove any existing hit highlighted text spans
-                    _ElementListUtilities.query("." + ClassNames.asbHitHighlightSpan, element).forEach(function (childElement) {
-                        childElement.parentNode.removeChild(childElement);
-                    });
-
-                    // Insert spans at the front of element
-                    var firstChild = element.firstChild;
-
-                    var hitsProvided = item.hits;
-                    if ((!hitsProvided) && (hitFinder) && (item.kind !== _SuggestionManagerShim._SearchSuggestionKind.Separator)) {
-                        hitsProvided = hitFinder.find(text);
-                    }
-
-                    var hits = AutoSuggestBox._sortAndMergeHits(hitsProvided);
-
-                    var lastPosition = 0;
-                    for (var i = 0; i < hits.length; i++) {
-                        var hit = hits[i];
-
-                        // Add previous normal text
-                        addNewSpan(element, text.substring(lastPosition, hit.startPosition), firstChild);
-
-                        lastPosition = hit.startPosition + hit.length;
-
-                        // Add hit highlighted text
-                        var spanHitHighlightedText = addNewSpan(element, text.substring(hit.startPosition, lastPosition), firstChild);
-                        _ElementUtilities.addClass(spanHitHighlightedText, ClassNames.asbBoxFlyoutHighlightText);
-                    }
-
-                    // Add final normal text
-                    if (lastPosition < text.length) {
-                        addNewSpan(element, text.substring(lastPosition), firstChild);
-                    }
-                }
-            }
-
-            function getKeyModifiers(ev) {
-                // Returns the same value as http://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.system.virtualkeymodifiers
-                var VirtualKeys = {
-                    ctrlKey: 1,
-                    altKey: 2,
-                    shiftKey: 4
-                };
-
-                var keyModifiers = 0;
-                if (ev.ctrlKey) {
-                    keyModifiers |= VirtualKeys.ctrlKey;
-                }
-                if (ev.altKey) {
-                    keyModifiers |= VirtualKeys.altKey;
-                }
-                if (ev.shiftKey) {
-                    keyModifiers |= VirtualKeys.shiftKey;
-                }
-                return keyModifiers;
-            }
-
-            function resultSuggestionRenderer(asb, item) {
-                function handleInvoke(e) {
-                    asb._internalFocusMove = true;
-                    asb._inputElement.focus();
-                    asb._processSuggestionChosen(item, e);
-                }
-
-                var root = _Global.document.createElement("div");
-                var image = new _Global.Image();
-                image.style.opacity = 0;
-                var loadImage = function (url) {
-                    function onload() {
-                        image.removeEventListener("load", onload, false);
-                        Animations.fadeIn(image);
-                    }
-                    image.addEventListener("load", onload, false);
-                    image.src = url;
-                };
-
-                if (item.image !== null) {
-                    item.image.openReadAsync().then(function (streamWithContentType) {
-                        if (streamWithContentType !== null) {
-                            loadImage(_Global.URL.createObjectURL(streamWithContentType, { oneTimeOnly: true }));
-                        }
-                    });
-                } else if (item.imageUrl !== null) {
-                    loadImage(item.imageUrl);
-                }
-                image.setAttribute("aria-hidden", "true");
-                root.appendChild(image);
-
-                var divElement = _Global.document.createElement("div");
-                _ElementUtilities.addClass(divElement, ClassNames.asbSuggestionResultText);
-                addHitHighlightedText(divElement, item, item.text);
-                divElement.title = item.text;
-                divElement.setAttribute("aria-hidden", "true");
-                root.appendChild(divElement);
-
-                var brElement = _Global.document.createElement("br");
-                divElement.appendChild(brElement);
-
-                var divDetailElement = _Global.document.createElement("span");
-                _ElementUtilities.addClass(divDetailElement, ClassNames.asbSuggestionResultDetailedText);
-                addHitHighlightedText(divDetailElement, item, item.detailText);
-                divDetailElement.title = item.detailText;
-                divDetailElement.setAttribute("aria-hidden", "true");
-                divElement.appendChild(divDetailElement);
-
-                _ElementUtilities.addClass(root, ClassNames.asbSuggestionResult);
-
-                _ElementUtilities._addEventListener(root, "click", function (e) {
-                    if (!asb._isFlyoutPointerDown) {
-                        handleInvoke(e);
-                    }
-                });
-                _ElementUtilities._addEventListener(root, "pointerup", handleInvoke);
-
-                root.setAttribute("role", "option");
-                var ariaLabel = _Resources._formatString(Strings.ariaLabelResult, item.text, item.detailText);
-                root.setAttribute("aria-label", ariaLabel);
-                return root;
-            }
-
-            function querySuggestionRenderer(asb, item) {
-                function handleInvoke(e) {
-                    asb._internalFocusMove = true;
-                    asb._inputElement.focus();
-                    asb._processSuggestionChosen(item, e);
-                }
-
-                var root = _Global.document.createElement("div");
-
-                addHitHighlightedText(root, item, item.text);
-                root.title = item.text;
-
-                root.classList.add(ClassNames.asbSuggestionQuery);
-
-                _ElementUtilities._addEventListener(root, "click", function (e) {
-                    if (!asb._isFlyoutPointerDown) {
-                        handleInvoke(e);
-                    }
-                });
-                _ElementUtilities._addEventListener(root, "pointerup", handleInvoke);
-
-                var ariaLabel = _Resources._formatString(Strings.ariaLabelQuery, item.text);
-                root.setAttribute("role", "option");
-                root.setAttribute("aria-label", ariaLabel);
-
-                return root;
-            }
-
-            function separatorSuggestionRenderer(item) {
-                var root = _Global.document.createElement("div");
-                if (item.text.length > 0) {
-                    var textElement = _Global.document.createElement("div");
-                    textElement.textContent = item.text;
-                    textElement.title = item.text;
-                    textElement.setAttribute("aria-hidden", "true");
-                    root.appendChild(textElement);
-                }
-                root.insertAdjacentHTML("beforeend", "<hr/>");
-                _ElementUtilities.addClass(root, ClassNames.asbSuggestionSeparator);
-                root.setAttribute("role", "separator");
-                var ariaLabel = _Resources._formatString(Strings.ariaLabelSeparator, item.text);
-                root.setAttribute("aria-label", ariaLabel);
-                return root;
-            }
-
-            _Base.Class.mix(AutoSuggestBox, _Control.DOMEventMixin);
-            return AutoSuggestBox;
-        })
-    });
-    exports.ClassNames = ClassNames;
-});
-
-
-define('require-style!less/styles-searchbox',[],function(){});
-
-define('require-style!less/colors-searchbox',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/SearchBox',[
-    '../Core/_Global',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_ErrorFromName',
-    '../Core/_Events',
-    '../Core/_Resources',
-    './AutoSuggestBox',
-    '../_Accents',
-    '../Utilities/_Control',
-    '../Utilities/_ElementUtilities',
-    './AutoSuggestBox/_SearchSuggestionManagerShim',
-    '../Application',
-    'require-style!less/styles-searchbox',
-    'require-style!less/colors-searchbox'
-], function searchboxInit(_Global, _WinRT, _Base, _ErrorFromName, _Events, _Resources, AutoSuggestBox, _Accents, _Control, _ElementUtilities, _SuggestionManagerShim, Application) {
-    "use strict";
-
-    _Accents.createAccentRule("html.win-hoverable .win-searchbox-button:not(.win-searchbox-button-disabled):hover", [{ name: "color", value: _Accents.ColorTypes.accent }, ]);
-    _Accents.createAccentRule(".win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active", [{ name: "background-color", value: _Accents.ColorTypes.accent }, ]);
-
-    _Base.Namespace.define("WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.SearchBox">
-        /// Enables the user to perform search queries and select suggestions.
-        /// </summary>
-        /// <compatibleWith platform="Windows" minVersion="8.1"/>
-        /// </field>
-        /// <icon src="ui_winjs.ui.search.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.search.16x16.png" width="16" height="16" />
-        /// <htmlSnippet><![CDATA[<div data-win-control="WinJS.UI.SearchBox"></div>]]></htmlSnippet>
-        /// <event name="receivingfocusonkeyboardinput" bubbles="true" locid="WinJS.UI.SearchBox_e:receivingfocusonkeyboardinput">
-        /// Raised when the app automatically redirects focus to the search box. This event can only be raised when the focusOnKeyboardInput property is set to true.
-        /// </event>
-        /// <part name="searchbox" class="win-searchbox" locid="WinJS.UI.SearchBox:search">Styles the entire Search box control.</part>
-        /// <part name="searchbox-input" class="win-searchbox-input" locid="WinJS.UI.SearchBox_part:Input">Styles the query input box.</part>
-        /// <part name="searchbox-button" class="win-searchbox-button" locid="WinJS.UI.SearchBox_part:Button">Styles the search button.</part>
-        /// <part name="searchbox-flyout" class="win-searchbox-flyout" locid="WinJS.UI.SearchBox_part:Flyout">Styles the result suggestions flyout.</part>
-        /// <part name="searchbox-suggestion-result" class="win-searchbox-suggestion-result" locid="WinJS.UI.SearchBox_part:Suggestion_Result">Styles the result type suggestion.</part>
-        /// <part name="searchbox-suggestion-query" class="win-searchbox-suggestion-query" locid="WinJS.UI.SearchBox_part:Suggestion_Query">Styles the query type suggestion.</part>
-        /// <part name="searchbox-suggestion-separator" class="win-searchbox-suggestion-separator" locid="WinJS.UI.SearchBox_part:Suggestion_Separator">
-        /// Styles the separator type suggestion.
-        /// </part>
-        /// <part name="searchbox-suggestion-selected" class="win-searchbox-suggestion-selected" locid="WinJS.UI.SearchBox_part:Suggestion_Selected">
-        /// Styles the currently selected suggestion.
-        /// </part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        SearchBox: _Base.Namespace._lazy(function () {
-
-            // Enums
-            var ClassName = {
-                searchBox: "win-searchbox",
-                searchBoxDisabled: "win-searchbox-disabled",
-                searchBoxInput: "win-searchbox-input",
-                searchBoxInputFocus: "win-searchbox-input-focus",
-                searchBoxButton: "win-searchbox-button",
-                searchBoxFlyout: "win-searchbox-flyout",
-                searchBoxFlyoutHighlightText: "win-searchbox-flyout-highlighttext",
-                searchBoxHitHighlightSpan: "win-searchbox-hithighlight-span",
-                searchBoxSuggestionResult: "win-searchbox-suggestion-result",
-                searchBoxSuggestionResultText: "win-searchbox-suggestion-result-text",
-                searchBoxSuggestionResultDetailedText: "win-searchbox-suggestion-result-detailed-text",
-                searchBoxSuggestionSelected: "win-searchbox-suggestion-selected",
-                searchBoxSuggestionQuery: "win-searchbox-suggestion-query",
-                searchBoxSuggestionSeparator: "win-searchbox-suggestion-separator",
-                searchBoxButtonInputFocus: "win-searchbox-button-input-focus",
-                searchBoxButtonDisabled: "win-searchbox-button-disabled"
-            };
-
-            var EventName = {
-                receivingfocusonkeyboardinput: "receivingfocusonkeyboardinput"
-            };
-
-            var strings = {
-                get invalidSearchBoxSuggestionKind() { return "Error: Invalid search suggestion kind."; },
-                get ariaLabel() { return _Resources._getWinJSString("ui/searchBoxAriaLabel").value; },
-                get ariaLabelInputNoPlaceHolder() { return _Resources._getWinJSString("ui/searchBoxAriaLabelInputNoPlaceHolder").value; },
-                get ariaLabelInputPlaceHolder() { return _Resources._getWinJSString("ui/searchBoxAriaLabelInputPlaceHolder").value; },
-                get searchBoxDeprecated() { return "SearchBox is deprecated and may not be available in future releases. Instead use AutoSuggestBox."; }
-            };
-
-            var SearchBox = _Base.Class.derive(AutoSuggestBox.AutoSuggestBox, function SearchBox_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.SearchBox.SearchBox">
-                /// <summary locid="WinJS.UI.SearchBox.constructor">
-                /// Creates a new SearchBox.
-                /// </summary>
-                /// <param name="element" domElement="true" locid="WinJS.UI.SearchBox.constructor_p:element">
-                /// The DOM element that hosts the SearchBox.
-                /// </param>
-                /// <param name="options" type="Object" locid="WinJS.UI.SearchControl.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// Event names must begin with "on". For example, to provide a handler for the querychanged event,
-                /// add a property named "onquerychanged" to the options object and set its value to the event handler.
-                /// This parameter is optional.
-                /// </param>
-                /// <returns type="WinJS.UI.SearchBox" locid="WinJS.UI.SearchBox.constructor_returnValue">
-                /// The new SearchBox.
-                /// </returns>
-                /// <deprecated type="deprecate">
-                /// SearchBox is deprecated and may not be available in future releases. Instead use AutoSuggestBox.
-                /// </deprecated>
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </signature>
-                
-                _ElementUtilities._deprecated(strings.searchBoxDeprecated);
-                
-                this._requestingFocusOnKeyboardInputHandlerBind = this._requestingFocusOnKeyboardInputHandler.bind(this);
-
-                // Elements
-                this._buttonElement = _Global.document.createElement("div");
-
-                // Variables
-                this._focusOnKeyboardInput = false;
-
-                // Calling the super constructor - since the super constructor processes the options,
-                // any property setter at this point must be functional.
-                AutoSuggestBox.AutoSuggestBox.call(this, element, options);
-
-                // Add SearchBox classes to DOM elements
-                this.element.classList.add(ClassName.searchBox);
-                this._flyoutElement.classList.add(ClassName.searchBoxFlyout);
-
-                this._inputElement.classList.add(ClassName.searchBoxInput);
-                this._inputElement.addEventListener("blur", this._searchboxInputBlurHandler.bind(this));
-                this._inputElement.addEventListener("focus", this._searchboxInputFocusHandler.bind(this));
-
-                this._buttonElement.tabIndex = -1;
-                this._buttonElement.classList.add(ClassName.searchBoxButton);
-                this._buttonElement.addEventListener("click", this._buttonClickHandler.bind(this));
-                _ElementUtilities._addEventListener(this._buttonElement, "pointerdown", this._buttonPointerDownHandler.bind(this));
-                this.element.appendChild(this._buttonElement);
-            }, {
-                /// <field type='String' locid="WinJS.UI.SearchBox.focusOnKeyboardInput" helpKeyword="WinJS.UI.SearchBox.focusOnKeyboardInput">
-                /// Enable automatically focusing the search box when the user types into the app window (off by default) While this is enabled,
-                /// input on the current thread will be intercepted and redirected to the search box. Only textual input will trigger the search box to focus.
-                /// The caller will continue to receive non-text keys (such as arrows, tab, etc
-                /// This will also not affect WIN/CTRL/ALT key combinations (except for Ctrl-V for paste).
-                /// If the client needs more to happen than just set focus in the box (make control visible, etc.), they will need to handle the event.
-                /// If enabled, the app must be sure to disable this if the user puts focus in some other edit field.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                focusOnKeyboardInput: {
-                    get: function () {
-                        return this._focusOnKeyboardInput;
-                    },
-                    set: function (value) {
-                        if (this._focusOnKeyboardInput && !value) {
-                            Application._applicationListener.removeEventListener(this.element, "requestingfocusonkeyboardinput", this._requestingFocusOnKeyboardInputHandlerBind);
-                        } else if (!this._focusOnKeyboardInput && !!value) {
-                            Application._applicationListener.addEventListener(this.element, "requestingfocusonkeyboardinput", this._requestingFocusOnKeyboardInputHandlerBind);
-                        }
-                        this._focusOnKeyboardInput = !!value;
-                    }
-                },
-
-                // Methods
-                dispose: function SearchBox() {
-                    /// <signature helpKeyword="WinJS.UI.SearchBox.dispose">
-                    /// <summary locid="WinJS.UI.SearchBox.dispose">
-                    /// Disposes this control.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-                    AutoSuggestBox.AutoSuggestBox.prototype.dispose.call(this);
-
-                    if (this._focusOnKeyboardInput) {
-                        Application._applicationListener.removeEventListener(this.element, "requestingfocusonkeyboardinput", this._requestingFocusOnKeyboardInputHandlerBind);
-                    }
-                },
-
-                // Private methods 
-                _disableControl: function SearchBox_disableControl() {
-                    AutoSuggestBox.AutoSuggestBox.prototype._disableControl.call(this);
-                    this._buttonElement.disabled = true;
-                    this._buttonElement.classList.add(ClassName.searchBoxButtonDisabled);
-                    this.element.classList.add(ClassName.searchBoxDisabled);
-                },
-
-                _enableControl: function SearchBox_enableControl() {
-                    AutoSuggestBox.AutoSuggestBox.prototype._enableControl.call(this);
-                    this._buttonElement.disabled = false;
-                    this._buttonElement.classList.remove(ClassName.searchBoxButtonDisabled);
-                    this.element.classList.remove(ClassName.searchBoxDisabled);
-                },
-
-                _renderSuggestion: function SearchBox_renderSuggestion(suggestion) {
-                    // Overrides base class
-                    var render = AutoSuggestBox.AutoSuggestBox.prototype._renderSuggestion.call(this, suggestion);
-                    if (suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Query) {
-                        render.classList.add(ClassName.searchBoxSuggestionQuery);
-                    } else if (suggestion.kind === _SuggestionManagerShim._SearchSuggestionKind.Separator) {
-                        render.classList.add(ClassName.searchBoxSuggestionSeparator);
-                    } else {
-                        render.classList.add(ClassName.searchBoxSuggestionResult);
-
-                        var resultText = render.querySelector("." + AutoSuggestBox.ClassNames.asbSuggestionResultText);
-                        resultText.classList.add(ClassName.searchBoxSuggestionResultText);
-
-                        var resultDetailText = render.querySelector("." + AutoSuggestBox.ClassNames.asbSuggestionResultDetailedText);
-                        resultDetailText.classList.add(ClassName.searchBoxSuggestionResultDetailedText);
-
-                        var spans = render.querySelectorAll("." + AutoSuggestBox.ClassNames.asbHitHighlightSpan);
-                        for (var i = 0, len = spans.length; i < len; i++) {
-                            spans[i].classList.add(ClassName.searchBoxHitHighlightSpan);
-                        }
-                        var highlightTexts = render.querySelectorAll("." + AutoSuggestBox.ClassNames.asbBoxFlyoutHighlightText);
-                        for (var i = 0, len = highlightTexts.length; i < len; i++) {
-                            highlightTexts[i].classList.add(ClassName.searchBoxFlyoutHighlightText);
-                        }
-                    }
-                    return render;
-                },
-
-                _selectSuggestionAtIndex: function SearchBox_selectSuggestionAtIndex(indexToSelect) {
-                    // Overrides base class
-                    AutoSuggestBox.AutoSuggestBox.prototype._selectSuggestionAtIndex.call(this, indexToSelect);
-
-                    var currentSelected = this.element.querySelector("." + ClassName.searchBoxSuggestionSelected);
-                    currentSelected && currentSelected.classList.remove(ClassName.searchBoxSuggestionSelected);
-                    var newSelected = this.element.querySelector("." + AutoSuggestBox.ClassNames.asbSuggestionSelected);
-                    newSelected && newSelected.classList.add(ClassName.searchBoxSuggestionSelected);
-                },
-
-                _shouldIgnoreInput: function SearchBox_shouldIgnoreInput() {
-                    // Overrides base class
-                    var shouldIgnore = AutoSuggestBox.AutoSuggestBox.prototype._shouldIgnoreInput();
-                    var isButtonDown = _ElementUtilities._matchesSelector(this._buttonElement, ":active");
-
-                    return shouldIgnore || isButtonDown;
-                },
-
-                _updateInputElementAriaLabel: function SearchBox_updateInputElementAriaLabel() {
-                    // Override base class
-                    this._inputElement.setAttribute("aria-label",
-                        this._inputElement.placeholder ? _Resources._formatString(strings.ariaLabelInputPlaceHolder, this._inputElement.placeholder) : strings.ariaLabelInputNoPlaceHolder
-                    );
-                },
-
-                // Event Handlers
-                _buttonPointerDownHandler: function SearchBox_buttonPointerDownHandler(e) {
-                    this._inputElement.focus();
-                    e.preventDefault();
-                },
-
-                _buttonClickHandler: function SearchBox_buttonClickHandler(event) {
-                    this._inputElement.focus();
-                    this._submitQuery(this._inputElement.value, true /*fillLinguisticDetails*/, event);
-                    this._hideFlyout();
-                },
-
-                _searchboxInputBlurHandler: function SearchBox_inputBlurHandler() {
-                    _ElementUtilities.removeClass(this.element, ClassName.searchBoxInputFocus);
-                    _ElementUtilities.removeClass(this._buttonElement, ClassName.searchBoxButtonInputFocus);
-                },
-
-                _searchboxInputFocusHandler: function SearchBox_inputFocusHandler() {
-                    _ElementUtilities.addClass(this.element, ClassName.searchBoxInputFocus);
-                    _ElementUtilities.addClass(this._buttonElement, ClassName.searchBoxButtonInputFocus);
-                },
-
-                // Type to search helpers
-                _requestingFocusOnKeyboardInputHandler: function SearchBox_requestingFocusOnKeyboardInputHandler() {
-                    this._fireEvent(EventName.receivingfocusonkeyboardinput, null);
-                    if (_Global.document.activeElement !== this._inputElement) {
-                        try {
-                            this._inputElement.focus();
-                        } catch (e) {
-                        }
-                    }
-                }
-
-            }, {
-                createResultSuggestionImage: function SearchBox_createResultSuggestionImage(url) {
-                    /// <signature helpKeyword="WinJS.UI.SearchBox.createResultSuggestionImage">
-                    /// <summary locid="WinJS.UI.SearchBox.createResultSuggestionImage">
-                    /// Creates the image argument for SearchSuggestionCollection.appendResultSuggestion.
-                    /// </summary>
-                    /// <param name="url" type="string" locid="WinJS.UI.SearchBox.SearchBox_createResultSuggestionImage_p:url">
-                    /// The url of the image.
-                    /// </param>
-                    /// <deprecated type="deprecate">
-                    /// SearchBox is deprecated and may not be available in future releases. Instead use AutoSuggestBox.
-                    /// </deprecated>
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </signature>
-                    _ElementUtilities._deprecated(strings.searchBoxDeprecated);
-
-                    if (_WinRT.Windows.Foundation.Uri && _WinRT.Windows.Storage.Streams.RandomAccessStreamReference) {
-                        return _WinRT.Windows.Storage.Streams.RandomAccessStreamReference.createFromUri(new _WinRT.Windows.Foundation.Uri(url));
-                    }
-                    return url;
-                },
-
-                _getKeyModifiers: function SearchBox_getKeyModifiers(ev) {
-                    // Returns the same value as http://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.system.virtualkeymodifiers
-                    var VirtualKeys = {
-                        ctrlKey: 1,
-                        altKey: 2,
-                        shiftKey: 4
-                    };
-
-                    var keyModifiers = 0;
-                    if (ev.ctrlKey) {
-                        keyModifiers |= VirtualKeys.ctrlKey;
-                    }
-                    if (ev.altKey) {
-                        keyModifiers |= VirtualKeys.altKey;
-                    }
-                    if (ev.shiftKey) {
-                        keyModifiers |= VirtualKeys.shiftKey;
-                    }
-                    return keyModifiers;
-                },
-
-                _isTypeToSearchKey: function searchBox__isTypeToSearchKey(event) {
-                    if (event.shiftKey || event.ctrlKey || event.altKey) {
-                        return false;
-                    }
-                    return true;
-                }
-            });
-            _Base.Class.mix(SearchBox, _Control.DOMEventMixin);
-            return SearchBox;
-        })
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <dictionary>appbar,Flyout,Flyouts,registeredforsettings,SettingsFlyout,Statics,Syriac</dictionary>
-define('WinJS/Controls/SettingsFlyout',[
-    '../Core/_Global',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Events',
-    '../Core/_Resources',
-    '../Core/_WriteProfilerMark',
-    '../Animations',
-    '../Pages',
-    '../Promise',
-    '../_LightDismissService',
-    '../Utilities/_Dispose',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_ElementListUtilities',
-    '../Utilities/_Hoverable',
-    './_LegacyAppBar/_Constants',
-    './Flyout/_Overlay'
-    ], function settingsFlyoutInit(_Global, _WinRT, _Base, _BaseUtils, _ErrorFromName, _Events, _Resources, _WriteProfilerMark, Animations, Pages, Promise, _LightDismissService, _Dispose, _ElementUtilities, _ElementListUtilities, _Hoverable, _Constants, _Overlay) {
-    "use strict";
-
-    _Base.Namespace.define("WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.SettingsFlyout">Provides users with fast, in-context access to settings that affect the current app.</summary>
-        /// <compatibleWith platform="Windows" minVersion="8.0"/>
-        /// </field>
-        /// <name locid="WinJS.UI.SettingsFlyout_name">Settings Flyout</name>
-        /// <icon src="ui_winjs.ui.settingsflyout.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.settingsflyout.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.SettingsFlyout">
-        /// <div class="win-header">
-        /// <button type="button" onclick="WinJS.UI.SettingsFlyout.show()" class="win-backbutton"></button>
-        /// <div class="win-label">Custom Settings</div>
-        /// </div>
-        /// <div class="win-content">
-        /// {Your Content Here}
-        /// </div>
-        /// </div>]]></htmlSnippet>
-        /// <event name="beforeshow" locid="WinJS.UI.SettingsFlyout_e:beforeshow">Raised just before showing a SettingsFlyout.</event>
-        /// <event name="aftershow" locid="WinJS.UI.SettingsFlyout_e:aftershow">Raised immediately after a SettingsFlyout is fully shown.</event>
-        /// <event name="beforehide" locid="WinJS.UI.SettingsFlyout_e:beforehide">Raised just before hiding a SettingsFlyout.</event>
-        /// <event name="afterhide" locid="WinJS.UI.SettingsFlyout_e:afterhide">Raised immediately after a SettingsFlyout is fully hidden.</event>
-        /// <part name="settings" class="win-settingsflyout" locid="WinJS.UI.SettingsFlyout_part:settings">The SettingsFlyout control itself.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        SettingsFlyout: _Base.Namespace._lazy(function () {
-            var Key = _ElementUtilities.Key;
-
-            var createEvent = _Events._createEventProperty;
-
-            var settingsPageIsFocusedOnce;
-
-            // Constants for width
-            var settingsNarrow = "narrow",
-                settingsWide = "wide";
-
-            // Determine if the settings pane (system language) is RTL or not.
-            function _shouldAnimateFromLeft() {
-                if (_WinRT.Windows.UI.ApplicationSettings.SettingsEdgeLocation) {
-                    var appSettings = _WinRT.Windows.UI.ApplicationSettings;
-                    return (appSettings.SettingsPane.edge === appSettings.SettingsEdgeLocation.left);
-                } else {
-                    return false;
-                }
-            }
-
-            // Get the settings control by matching the settingsCommandId
-            // if no match we'll try to match element id
-            function _getChildSettingsControl(parentElement, id) {
-                var settingElements = parentElement.querySelectorAll("." + _Constants.settingsFlyoutClass);
-                var retValue,
-                    control;
-                for (var i = 0; i < settingElements.length; i++) {
-                    control = settingElements[i].winControl;
-                    if (control) {
-                        if (control.settingsCommandId === id) {
-                            retValue = control;
-                            break;
-                        }
-                        if (settingElements[i].id === id) {
-                            retValue = retValue || control;
-                        }
-                    }
-                }
-
-                return retValue;
-            }
-
-            var SettingsFlyout = _Base.Class.derive(_Overlay._Overlay, function SettingsFlyout_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.SettingsFlyout.SettingsFlyout">
-                /// <summary locid="WinJS.UI.SettingsFlyout.constructor">Creates a new SettingsFlyout control.</summary>
-                /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.UI.SettingsFlyout.constructor_p:element">
-                /// The DOM element that will host the control.
-                /// </param>
-                /// <param name="options" type="Object" locid="WinJS.UI.SettingsFlyout.constructor_p:options">
-                /// The set of properties and values to apply to the new SettingsFlyout.
-                /// </param>
-                /// <returns type="WinJS.UI.SettingsFlyout" locid="WinJS.UI.SettingsFlyout.constructor_returnValue">The new SettingsFlyout control.</returns>
-                /// <deprecated type="deprecate">
-                /// SettingsFlyout is deprecated and may not be available in future releases. Instead, put
-                /// settings on their own page within the app.
-                /// </deprecated>
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </signature>
-                
-                _ElementUtilities._deprecated(strings.settingsFlyoutIsDeprecated);
-
-                // Make sure there's an input element
-                this._element = element || _Global.document.createElement("div");
-                this._id = this._element.id || _ElementUtilities._uniqueID(this._element);
-                this._writeProfilerMark("constructor,StartTM");
-
-                // Call the base overlay constructor helper
-                this._baseOverlayConstructor(this._element, options);
-
-                this._addFirstDiv();
-                this._addFinalDiv();
-
-                // Handle "esc" & "tab" key presses
-                this._element.addEventListener("keydown", this._handleKeyDown, true);
-
-                // Start settings hidden
-                this._element.style.visibilty = "hidden";
-                this._element.style.display = "none";
-
-                // Attach our css class
-                _ElementUtilities.addClass(this._element, _Constants.settingsFlyoutClass);
-                
-                var that = this;
-                this._dismissable = new _LightDismissService.LightDismissableElement({
-                    element: this._element,
-                    tabIndex: this._element.hasAttribute("tabIndex") ? this._element.tabIndex : -1,
-                    onLightDismiss: function () {
-                        that.hide();
-                    },
-                    onTakeFocus: function (useSetActive) {
-                        if (!that._dismissable.restoreFocus()) {
-                            var firstDiv = that.element.querySelector("." + _Constants.firstDivClass);
-                            if (firstDiv) {
-                                if (!firstDiv.msSettingsFlyoutFocusOut) {
-                                    _ElementUtilities._addEventListener(firstDiv, "focusout", function () { settingsPageIsFocusedOnce = 1; }, false);
-                                    firstDiv.msSettingsFlyoutFocusOut = true;
-                                }
-                                
-                                settingsPageIsFocusedOnce = 0;
-                                _ElementUtilities._tryFocus(firstDiv, useSetActive);
-                            }
-                        }
-                    },
-                });
-
-                // apply the light theme styling to the win-content elements inside the SettingsFlyout
-                _ElementListUtilities.query("div.win-content", this._element).
-                    forEach(function (e) {
-                        if (!_ElementUtilities._matchesSelector(e, '.win-ui-dark, .win-ui-dark *')){
-                            _ElementUtilities.addClass(e, _Constants.flyoutLightClass);
-                        }
-                    });
-
-                // Make sure we have an ARIA role
-                var role = this._element.getAttribute("role");
-                if (role === null || role === "" || role === undefined) {
-                    this._element.setAttribute("role", "dialog");
-                }
-                var label = this._element.getAttribute("aria-label");
-                if (label === null || label === "" || label === undefined) {
-                    this._element.setAttribute("aria-label", strings.ariaLabel);
-                }
-
-                // Make sure animations are hooked up
-                this._currentAnimateIn = this._animateSlideIn;
-                this._currentAnimateOut = this._animateSlideOut;
-                this._writeProfilerMark("constructor,StopTM");
-            }, {
-                // Public Properties
-
-                /// <field type="String" defaultValue="narrow" oamOptionsDatatype="WinJS.UI.SettingsFlyout.width" locid="WinJS.UI.SettingsFlyout.width" helpKeyword="WinJS.UI.SettingsFlyout.width">
-                /// Width of the SettingsFlyout, "narrow", or "wide".
-                /// <deprecated type="deprecate">
-                /// SettingsFlyout.width may be altered or unavailable in future versions. Instead, style the CSS width property on elements with the .win-settingsflyout class.
-                /// </deprecated>
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                width: {
-                    get: function () {
-                        return this._width;
-                    },
-
-                    set: function (value) {
-                        _ElementUtilities._deprecated(strings.widthDeprecationMessage);
-                        if (value === this._width) {
-                            return;
-                        }
-                        // Get rid of old class
-                        if (this._width === settingsNarrow) {
-                            _ElementUtilities.removeClass(this._element, _Constants.narrowClass);
-                        } else if (this._width === settingsWide) {
-                            _ElementUtilities.removeClass(this._element, _Constants.wideClass);
-                        }
-                        this._width = value;
-
-                        // Attach our new css class
-                        if (this._width === settingsNarrow) {
-                            _ElementUtilities.addClass(this._element, _Constants.narrowClass);
-                        } else if (this._width === settingsWide) {
-                            _ElementUtilities.addClass(this._element, _Constants.wideClass);
-                        }
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.SettingsFlyout.settingsCommandId" helpKeyword="WinJS.UI.SettingsFlyout.settingsCommandId">
-                /// Define the settings command Id for the SettingsFlyout control.
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </field>
-                settingsCommandId: {
-                    get: function () {
-                        return this._settingsCommandId;
-                    },
-
-                    set: function (value) {
-                        this._settingsCommandId = value;
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.SettingsFlyout.disabled" helpKeyword="WinJS.UI.SettingsFlyout.disabled">Disable SettingsFlyout, setting or getting the HTML disabled attribute.  When disabled the SettingsFlyout will no longer display with show(), and will hide if currently visible.</field>
-                disabled: {
-                    get: function () {
-                        // Ensure it's a boolean because we're using the DOM element to keep in-sync
-                        return !!this._element.disabled;
-                    },
-                    set: function (value) {
-                        // Force this check into a boolean because our current state could be a bit confused since we tie to the DOM element
-                        value = !!value;
-                        var oldValue = !!this._element.disabled;
-                        if (oldValue !== value) {
-                            this._element.disabled = value;
-                            if (!this.hidden && this._element.disabled) {
-                                this._dismiss();
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.SettingsFlyout.onbeforeshow" helpKeyword="WinJS.UI.SettingsFlyout.onbeforeshow">
-                /// Occurs immediately before the control is shown.
-                /// </field>
-                onbeforeshow: createEvent(_Overlay._Overlay.beforeShow),
-
-                /// <field type="Function" locid="WinJS.UI.SettingsFlyout.onaftershow" helpKeyword="WinJS.UI.SettingsFlyout.onaftershow">
-                /// Occurs immediately after the control is shown.
-                /// </field>
-                onaftershow: createEvent(_Overlay._Overlay.afterShow),
-
-                /// <field type="Function" locid="WinJS.UI.SettingsFlyout.onbeforehide" helpKeyword="WinJS.UI.SettingsFlyout.onbeforehide">
-                /// Occurs immediately before the control is hidden.
-                /// </field>
-                onbeforehide: createEvent(_Overlay._Overlay.beforeHide),
-
-                /// <field type="Function" locid="WinJS.UI.SettingsFlyout.onafterhide" helpKeyword="WinJS.UI.SettingsFlyout.onafterhide">
-                /// Occurs immediately after the control is hidden.
-                /// </field>
-                onafterhide: createEvent(_Overlay._Overlay.afterHide),
-
-                show: function () {
-                    /// <signature helpKeyword="WinJS.UI.SettingsFlyout.show">
-                    /// <summary locid="WinJS.UI.SettingsFlyout.show">
-                    /// Shows the SettingsFlyout, if hidden.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                    // Just call private version to make appbar flags happy
-
-                    // Don't do anything if disabled
-                    if (this.disabled) {
-                        return;
-                    }
-                    this._writeProfilerMark("show,StartTM"); // The corresponding "stop" profiler mark is handled in _Overlay._baseEndShow().
-                    this._show();
-                },
-
-                _dispose: function SettingsFlyout_dispose() {
-                    _LightDismissService.hidden(this._dismissable);
-                    _Dispose.disposeSubTree(this.element);
-                    this._dismiss();
-                },
-
-                _show: function SettingsFlyout_show() {
-                    // We call our base "_baseShow" because SettingsFlyout overrides show
-                    if (this._baseShow()) {
-                        // Verify that the firstDiv and finalDiv are in the correct location.
-                        // Move them to the correct location or add them if they are not.
-                        if (!_ElementUtilities.hasClass(this.element.children[0], _Constants.firstDivClass)) {
-                            var firstDiv = this.element.querySelectorAll("." + _Constants.firstDivClass);
-                            if (firstDiv && firstDiv.length > 0) {
-                                firstDiv.item(0).parentNode.removeChild(firstDiv.item(0));
-                            }
-    
-                            this._addFirstDiv();
-                        }
-    
-                        if (!_ElementUtilities.hasClass(this.element.children[this.element.children.length - 1], _Constants.finalDivClass)) {
-                            var finalDiv = this.element.querySelectorAll("." + _Constants.finalDivClass);
-                            if (finalDiv && finalDiv.length > 0) {
-                                finalDiv.item(0).parentNode.removeChild(finalDiv.item(0));
-                            }
-    
-                            this._addFinalDiv();
-                        }
-                        
-                        this._setBackButtonsAriaLabel();
-                        
-                        _LightDismissService.shown(this._dismissable);
-                    }
-                },
-
-                _setBackButtonsAriaLabel: function SettingsFlyout_setBackButtonsAriaLabel() {
-                    var backbuttons = this.element.querySelectorAll(".win-backbutton");
-                    var label;
-                    for (var i = 0; i < backbuttons.length; i++) {
-                        label = backbuttons[i].getAttribute("aria-label");
-                        if (label === null || label === "" || label === undefined) {
-                            backbuttons[i].setAttribute("aria-label", strings.backbuttonAriaLabel);
-                        }
-                    }
-                },
-
-                hide: function () {
-                    /// <signature helpKeyword="WinJS.UI.SettingsFlyout.hide">
-                    /// <summary locid="WinJS.UI.SettingsFlyout.hide">
-                    /// Hides the SettingsFlyout, if visible, regardless of other state.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                    /// </signature>
-                    // Just call private version to make appbar flags happy
-                    this._writeProfilerMark("hide,StartTM"); // The corresponding "stop" profiler mark is handled in _Overlay._baseEndHide().
-                    this._hide();
-                },
-
-                _hide: function SettingsFlyout_hide() {
-                    this._baseHide();
-                },
-                
-                _beforeEndHide: function SettingsFlyout_beforeEndHide() {
-                    _LightDismissService.hidden(this._dismissable);
-                },
-
-                // SettingsFlyout animations
-                _animateSlideIn: function SettingsFlyout_animateSlideIn() {
-                    var animateFromLeft = _shouldAnimateFromLeft();
-                    var offset = animateFromLeft ? "-100px" : "100px";
-                    _ElementListUtilities.query("div.win-content", this._element).
-                        forEach(function (e) { Animations.enterPage(e, { left: offset }); });
-
-                    var where,
-                        width = this._element.offsetWidth;
-                    // Slide in from right side or left side?
-                    if (animateFromLeft) {
-                        // RTL
-                        where = { top: "0px", left: "-" + width + "px" };
-                        this._element.style.right = "auto";
-                        this._element.style.left = "0px";
-                    } else {
-                        // From right side
-                        where = { top: "0px", left: width + "px" };
-                        this._element.style.right = "0px";
-                        this._element.style.left = "auto";
-                    }
-
-                    this._element.style.opacity = 1;
-                    this._element.style.visibility = "visible";
-
-                    return Animations.showPanel(this._element, where);
-                },
-
-                _animateSlideOut: function SettingsFlyout_animateSlideOut() {
-                    var where,
-                        width = this._element.offsetWidth;
-                    if (_shouldAnimateFromLeft()) {
-                        // RTL
-                        where = { top: "0px", left: width + "px" };
-                        this._element.style.right = "auto";
-                        this._element.style.left = "-" + width + "px";
-                    } else {
-                        // From right side
-                        where = { top: "0px", left: "-" + width + "px" };
-                        this._element.style.right = "-" + width + "px";
-                        this._element.style.left = "auto";
-                    }
-
-                    return Animations.showPanel(this._element, where);
-                },
-
-                _fragmentDiv: {
-                    get: function SettingsFlyout_fragmentDiv_get() {
-                        return this._fragDiv;
-                    },
-
-                    set: function SettingsFlyout_fragmentDiv_set(value) {
-                        this._fragDiv = value;
-                    }
-                },
-
-                _unloadPage: function SettingsFlyout_unloadPage(event) {
-                    var settingsControl = event.currentTarget.winControl;
-                    settingsControl.removeEventListener(_Overlay._Overlay.afterHide, this._unloadPage, false);
-
-                    Promise.as().then(function () {
-                        if (settingsControl._fragmentDiv) {
-                            _Global.document.body.removeChild(settingsControl._fragmentDiv);
-                            settingsControl._fragmentDiv = null;
-                        }
-                    });
-                },
-
-                _dismiss: function SettingsFlyout_dismiss() {
-                    this.addEventListener(_Overlay._Overlay.afterHide, this._unloadPage, false);
-                    this._hide();
-                },
-
-                _handleKeyDown: function SettingsFlyout_handleKeyDown(event) {
-                    if ((event.keyCode === Key.space || event.keyCode === Key.enter)
-                           && (this.children[0] === _Global.document.activeElement)) {
-                        event.preventDefault();
-                        event.stopPropagation();
-                        this.winControl._dismiss();
-                    } else if (event.shiftKey && event.keyCode === Key.tab
-                    && this.children[0] === _Global.document.activeElement) {
-                        event.preventDefault();
-                        event.stopPropagation();
-                        var _elms = this.getElementsByTagName("*");
-
-                        for (var i = _elms.length - 2; i >= 0; i--) {
-                            _elms[i].focus();
-
-                            if (_elms[i] === _Global.document.activeElement) {
-                                break;
-                            }
-                        }
-                    }
-                },
-
-                _focusOnLastFocusableElementFromParent: function SettingsFlyout_focusOnLastFocusableElementFromParent() {
-                    var active = _Global.document.activeElement;
-                    if (!settingsPageIsFocusedOnce || !active || !_ElementUtilities.hasClass(active, _Constants.firstDivClass)) {
-                        return;
-                    }
-
-                    var _elms = this.parentElement.getElementsByTagName("*");
-
-                    // There should be at least 1 element in addition to the firstDiv & finalDiv
-                    if (_elms.length <= 2) {
-                        return;
-                    }
-
-                    // Get the tabIndex set to the finalDiv (which is the highest)
-                    var _highestTabIndex = _elms[_elms.length - 1].tabIndex;
-
-                    // If there are positive tabIndices, set focus to the element with the highest tabIndex.
-                    // Otherwise set focus to the last focusable element in DOM order.
-                    var i;
-                    if (_highestTabIndex) {
-                        for (i = _elms.length - 2; i > 0; i--) {
-                            if (_elms[i].tabIndex === _highestTabIndex) {
-                                _elms[i].focus();
-                                break;
-                            }
-                        }
-                    } else {
-                        for (i = _elms.length - 2; i > 0; i--) {
-                            // Skip <div> with undefined tabIndex (To work around Win8 bug #622245)
-                            if ((_elms[i].tagName !== "DIV") || (_elms[i].getAttribute("tabIndex") !== null)) {
-                                _elms[i].focus();
-
-                                if (_elms[i] === _Global.document.activeElement) {
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                },
-
-                _focusOnFirstFocusableElementFromParent: function SettingsFlyout_focusOnFirstFocusableElementFromParent() {
-                    var active = _Global.document.activeElement;
-                    if (!active || !_ElementUtilities.hasClass(active, _Constants.finalDivClass)) {
-                        return;
-                    }
-                    var _elms = this.parentElement.getElementsByTagName("*");
-
-                    // There should be at least 1 element in addition to the firstDiv & finalDiv
-                    if (_elms.length <= 2) {
-                        return;
-                    }
-
-                    // Get the tabIndex set to the firstDiv (which is the lowest)
-                    var _lowestTabIndex = _elms[0].tabIndex;
-
-                    // If there are positive tabIndices, set focus to the element with the lowest tabIndex.
-                    // Otherwise set focus to the first focusable element in DOM order.
-                    var i;
-                    if (_lowestTabIndex) {
-                        for (i = 1; i < _elms.length - 1; i++) {
-                            if (_elms[i].tabIndex === _lowestTabIndex) {
-                                _elms[i].focus();
-                                break;
-                            }
-                        }
-                    } else {
-                        for (i = 1; i < _elms.length - 1; i++) {
-                            // Skip <div> with undefined tabIndex (To work around Win8 bug #622245)
-                            if ((_elms[i].tagName !== "DIV") || (_elms[i].getAttribute("tabIndex") !== null)) {
-                                _elms[i].focus();
-
-                                if (_elms[i] === _Global.document.activeElement) {
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                },
-
-                // Create and add a new first div to the beginning of the list
-                _addFirstDiv: function SettingsFlyout_addFirstDiv() {
-                    var _elms = this._element.getElementsByTagName("*");
-                    var _minTab = 0;
-                    for (var i = 0; i < _elms.length; i++) {
-                        if ((0 < _elms[i].tabIndex) && (_minTab === 0 || _elms[i].tabIndex < _minTab)) {
-                            _minTab = _elms[i].tabIndex;
-                        }
-                    }
-                    var firstDiv = _Global.document.createElement("div");
-                    firstDiv.className = _Constants.firstDivClass;
-                    firstDiv.style.display = "inline";
-                    firstDiv.setAttribute("role", "menuitem");
-                    firstDiv.setAttribute("aria-hidden", "true");
-                    firstDiv.tabIndex = _minTab;
-                    _ElementUtilities._addEventListener(firstDiv, "focusin", this._focusOnLastFocusableElementFromParent, false);
-
-                    // add to beginning
-                    if (this._element.children[0]) {
-                        this._element.insertBefore(firstDiv, this._element.children[0]);
-                    } else {
-                        this._element.appendChild(firstDiv);
-                    }
-                },
-
-                // Create and add a new final div to the end of the list
-                _addFinalDiv: function SettingsFlyout_addFinalDiv() {
-                    var _elms = this._element.getElementsByTagName("*");
-                    var _maxTab = 0;
-                    for (var i = 0; i < _elms.length; i++) {
-                        if (_elms[i].tabIndex > _maxTab) {
-                            _maxTab = _elms[i].tabIndex;
-                        }
-                    }
-                    var finalDiv = _Global.document.createElement("div");
-                    finalDiv.className = _Constants.finalDivClass;
-                    finalDiv.style.display = "inline";
-                    finalDiv.setAttribute("role", "menuitem");
-                    finalDiv.setAttribute("aria-hidden", "true");
-                    finalDiv.tabIndex = _maxTab;
-                    _ElementUtilities._addEventListener(finalDiv, "focusin", this._focusOnFirstFocusableElementFromParent, false);
-
-                    this._element.appendChild(finalDiv);
-                },
-
-                _writeProfilerMark: function SettingsFlyout_writeProfilerMark(text) {
-                    _WriteProfilerMark("WinJS.UI.SettingsFlyout:" + this._id + ":" + text);
-                }
-            });
-
-            // Statics
-            SettingsFlyout.show = function () {
-                /// <signature helpKeyword="WinJS.UI.SettingsFlyout.show">
-                /// <summary locid="WinJS.UI.SettingsFlyout.show_static">
-                /// Shows the SettingsPane UI, if hidden, regardless of other states.
-                /// </summary>
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </signature>
-                /// Show the main settings pane
-                if (_WinRT.Windows.UI.ApplicationSettings.SettingsPane) {
-                    _WinRT.Windows.UI.ApplicationSettings.SettingsPane.show();
-                }
-                // And hide the WWA one
-                var elements = _Global.document.querySelectorAll('div[data-win-control="WinJS.UI.SettingsFlyout"]');
-                var len = elements.length;
-                for (var i = 0; i < len; i++) {
-                    var settingsFlyout = elements[i].winControl;
-                    if (settingsFlyout) {
-                        settingsFlyout._dismiss();
-                    }
-                }
-            };
-
-            var _settingsEvent = { event: undefined };
-            SettingsFlyout.populateSettings = function (e) {
-                /// <signature helpKeyword="WinJS.UI.SettingsFlyout.populateSettings">
-                /// <summary locid="WinJS.UI.SettingsFlyout.populateSettings">
-                /// Loads a portion of the SettingsFlyout. Your app calls this when the user invokes a settings command and the WinJS.Application.onsettings event occurs.
-                /// </summary>
-                /// <param name="e" type="Object" locid="WinJS.UI.SettingsFlyout.populateSettings_p:e">
-                /// An object that contains information about the event, received from the WinJS.Application.onsettings event. The detail property of this object contains
-                /// the applicationcommands sub-property that you set to an array of settings commands.
-                /// </param>
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </signature>
-                _settingsEvent.event = e.detail;
-
-                if (_settingsEvent.event.applicationcommands) {
-                    var n = _WinRT.Windows.UI.ApplicationSettings;
-                    Object.keys(_settingsEvent.event.applicationcommands).forEach(function (name) {
-                        var setting = _settingsEvent.event.applicationcommands[name];
-                        if (!setting.title) { setting.title = name; }
-                        var command = new n.SettingsCommand(name, setting.title, SettingsFlyout._onSettingsCommand);
-                        _settingsEvent.event.e.request.applicationCommands.append(command);
-                    });
-                }
-            };
-
-            SettingsFlyout._onSettingsCommand = function (command) {
-                var id = command.id;
-                if (_settingsEvent.event.applicationcommands && _settingsEvent.event.applicationcommands[id]) {
-                    SettingsFlyout.showSettings(id, _settingsEvent.event.applicationcommands[id].href);
-                }
-            };
-
-            SettingsFlyout.showSettings = function (id, path) {
-                /// <signature helpKeyword="WinJS.UI.SettingsFlyout.showSettings">
-                /// <summary locid="WinJS.UI.SettingsFlyout.showSettings">
-                /// Show the SettingsFlyout using the settings element identifier (ID) and the path of the page that contains the settings element.
-                /// </summary>
-                /// <param name="id" type="String" locid="WinJS.UI.SettingsFlyout.showSettings_p:id">
-                /// The ID of the settings element.
-                /// </param>
-                /// <param name="path" type="Object" locid="WinJS.UI.SettingsFlyout.showSettings_p:path">
-                ///  The path of the page that contains the settings element.
-                /// </param>
-                /// <compatibleWith platform="Windows" minVersion="8.0"/>
-                /// </signature>
-                var control = _getChildSettingsControl(_Global.document, id);
-                if (control) {
-                    control.show();
-                } else if (path) {
-                    var divElement = _Global.document.createElement("div");
-                    divElement = _Global.document.body.appendChild(divElement);
-                    Pages.render(path, divElement).then(function () {
-                        control = _getChildSettingsControl(divElement, id);
-                        if (control) {
-                            control._fragmentDiv = divElement;
-                            control.show();
-                        } else {
-                            _Global.document.body.removeChild(divElement);
-                        }
-                    });
-                } else {
-                    throw new _ErrorFromName("WinJS.UI.SettingsFlyout.BadReference", strings.badReference);
-                }
-            };
-
-            var strings = {
-                get ariaLabel() { return _Resources._getWinJSString("ui/settingsFlyoutAriaLabel").value; },
-                get badReference() { return "Invalid argument: Invalid href to settings flyout fragment"; },
-                get backbuttonAriaLabel() { return _Resources._getWinJSString("ui/backbuttonarialabel").value; },
-                get widthDeprecationMessage() { return "SettingsFlyout.width may be altered or unavailable in future versions. Instead, style the CSS width property on elements with the .win-settingsflyout class."; },
-                get settingsFlyoutIsDeprecated() { return "SettingsFlyout is deprecated and may not be available in future releases. Instead, put settings on their own page within the app."; }
-            };
-
-            return SettingsFlyout;
-        })
-    });
-
-
-});
-
-
-define('require-style!less/styles-splitviewcommand',[],function(){});
-
-define('require-style!less/colors-splitviewcommand',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/SplitView/Command',['exports',
-    '../../Core/_Global',
-    '../../Core/_Base',
-    '../../Core/_ErrorFromName',
-    '../../Core/_Events',
-    '../../ControlProcessor',
-    '../../Utilities/_Control',
-    '../../Utilities/_ElementUtilities',
-    '../../Utilities/_KeyboardBehavior',
-    '../AppBar/_Icon',
-    'require-style!less/styles-splitviewcommand',
-    'require-style!less/colors-splitviewcommand'
-], function SplitViewCommandInit(exports, _Global, _Base, _ErrorFromName, _Events, ControlProcessor, _Control, _ElementUtilities, _KeyboardBehavior, _Icon) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        _WinPressed: _Base.Namespace._lazy(function () {
-            var WinPressed = _Base.Class.define(function _WinPressed_ctor(element) {
-                // WinPressed is the combination of :hover:active
-                // :hover is delayed by trident for touch by 300ms so if you want :hover:active to work quickly you need to
-                // use this behavior.
-                // :active does not bubble to its parent like :hover does so this is also useful for that scenario.
-                this._element = element;
-                _ElementUtilities._addEventListener(this._element, "pointerdown", this._MSPointerDownButtonHandler.bind(this));
-            }, {
-                _MSPointerDownButtonHandler: function _WinPressed_MSPointerDownButtonHandler(ev) {
-                    if (!this._pointerUpBound) {
-                        this._pointerUpBound = this._MSPointerUpHandler.bind(this);
-                        this._pointerCancelBound = this._MSPointerCancelHandler.bind(this);
-                        this._pointerOverBound = this._MSPointerOverHandler.bind(this);
-                        this._pointerOutBound = this._MSPointerOutHandler.bind(this);
-                    }
-
-                    if (ev.isPrimary) {
-                        if (this._pointerId) {
-                            this._resetPointer();
-                        }
-
-                        if (!_ElementUtilities._matchesSelector(ev.target, ".win-interactive, .win-interactive *")) {
-                            this._pointerId = ev.pointerId;
-
-                            _ElementUtilities._addEventListener(_Global, "pointerup", this._pointerUpBound, true);
-                            _ElementUtilities._addEventListener(_Global, "pointercancel", this._pointerCancelBound), true;
-                            _ElementUtilities._addEventListener(this._element, "pointerover", this._pointerOverBound, true);
-                            _ElementUtilities._addEventListener(this._element, "pointerout", this._pointerOutBound, true);
-
-                            _ElementUtilities.addClass(this._element, WinPressed.winPressed);
-                        }
-                    }
-                },
-
-                _MSPointerOverHandler: function _WinPressed_MSPointerOverHandler(ev) {
-                    if (this._pointerId === ev.pointerId) {
-                        _ElementUtilities.addClass(this._element, WinPressed.winPressed);
-                    }
-                },
-
-                _MSPointerOutHandler: function _WinPressed_MSPointerOutHandler(ev) {
-                    if (this._pointerId === ev.pointerId) {
-                        _ElementUtilities.removeClass(this._element, WinPressed.winPressed);
-                    }
-                },
-
-                _MSPointerCancelHandler: function _WinPressed_MSPointerCancelHandler(ev) {
-                    if (this._pointerId === ev.pointerId) {
-                        this._resetPointer();
-                    }
-                },
-
-                _MSPointerUpHandler: function _WinPressed_MSPointerUpHandler(ev) {
-                    if (this._pointerId === ev.pointerId) {
-                        this._resetPointer();
-                    }
-                },
-
-                _resetPointer: function _WinPressed_resetPointer() {
-                    this._pointerId = null;
-
-                    _ElementUtilities._removeEventListener(_Global, "pointerup", this._pointerUpBound, true);
-                    _ElementUtilities._removeEventListener(_Global, "pointercancel", this._pointerCancelBound, true);
-                    _ElementUtilities._removeEventListener(this._element, "pointerover", this._pointerOverBound, true);
-                    _ElementUtilities._removeEventListener(this._element, "pointerout", this._pointerOutBound, true);
-
-                    _ElementUtilities.removeClass(this._element, WinPressed.winPressed);
-                },
-
-                dispose: function _WinPressed_dispose() {
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._disposed = true;
-
-                    this._resetPointer();
-                }
-            }, {
-                winPressed: "win-pressed"
-            });
-
-            return WinPressed;
-        }),
-        /// <field>
-        /// <summary locid="WinJS.UI.SplitViewCommand">
-        /// Represents a command in a SplitView.
-        /// </summary>
-        /// </field>
-        /// <htmlSnippet><![CDATA[<div data-win-control="WinJS.UI.SplitViewCommand" data-win-options="{label:'Home',icon:WinJS.UI.AppBarIcon.home}"></div>]]></htmlSnippet>
-        /// <part name="splitviewcommand" class="win-splitviewcommand" locid="WinJS.UI.SplitViewCommand_part:splitviewcommand">Styles the entire SplitViewCommand control.</part>
-        /// <part name="button" class="win-splitviewcommand-button" locid="WinJS.UI.SplitViewCommand_part:button">Styles the button in a SplitViewCommand.</part>
-        /// <part name="icon" class="win-splitviewcommand-icon" locid="WinJS.UI.SplitViewCommand_part:icon">Styles the icon in the button of a SplitViewCommand.</part>
-        /// <part name="label" class="win-splitviewcommand-label" locid="WinJS.UI.SplitViewCommand_part:label">Styles the label in the button of a SplitViewCommand.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        SplitViewCommand: _Base.Namespace._lazy(function () {
-            var Key = _ElementUtilities.Key;
-
-            var strings = {
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; }
-            };
-
-            var ClassNames = {
-                command: "win-splitviewcommand",
-                commandButton: "win-splitviewcommand-button",
-                commandButtonContent: "win-splitviewcommand-button-content",
-                commandSplitButton: "win-splitviewcommand-splitbutton",
-                commandSplitButtonOpened: "win-splitviewcommand-splitbutton-opened",
-                commandIcon: "win-splitviewcommand-icon",
-                commandLabel: "win-splitviewcommand-label"
-            };
-
-            var EventNames = {
-                invoked: "invoked",
-                _splitToggle: "_splittoggle",
-
-            };
-
-            var createEvent = _Events._createEventProperty;
-
-            var SplitViewCommand = _Base.Class.define(function SplitViewCommand_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.SplitViewCommand.SplitViewCommand">
-                /// <summary locid="WinJS.UI.SplitViewCommand.constructor">
-                /// Creates a new SplitViewCommand.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" isOptional="true" locid="WinJS.UI.SplitViewCommand.constructor_p:element">
-                /// The DOM element that will host the new  SplitViewCommand control.
-                /// </param>
-                /// <param name="options" type="Object" isOptional="true" locid="WinJS.UI.SplitViewCommand.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// Event names must begin with "on".
-                /// </param>
-                /// <returns type="WinJS.UI.SplitViewCommand" locid="WinJS.UI.SplitViewCommand.constructor_returnValue">
-                /// The new SplitViewCommand.
-                /// </returns>
-                /// </signature>
-                element = element || _Global.document.createElement("DIV");
-                options = options || {};
-
-                if (element.winControl) {
-                    throw new _ErrorFromName("WinJS.UI.SplitViewCommand.DuplicateConstruction", strings.duplicateConstruction);
-                }
-
-                // Sign up for keyboard focus rect
-                this._winKeyboard = new _KeyboardBehavior._WinKeyboard(element);
-
-                this._baseConstructor(element, options);
-            }, {
-
-                _baseConstructor: function SplitViewCommand_baseConstructor(element, options, classNames) {
-                    this._classNames = classNames || ClassNames;
-
-                    // Attaching JS control to DOM element
-                    element.winControl = this;
-                    this._element = element;
-                    _ElementUtilities.addClass(this.element, this._classNames.command);
-                    _ElementUtilities.addClass(this.element, "win-disposable");
-
-                    this._tooltip = null;
-                    this._splitOpened = false;
-                    this._buildDom();
-                    element.addEventListener('keydown', this._keydownHandler.bind(this));
-
-                    _Control.setOptions(this, options);
-                },
-
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.SplitViewCommand.element" helpKeyword="WinJS.UI.SplitViewCommand.element">
-                /// Gets the DOM element that hosts the SplitViewCommand.
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.SplitViewCommand.label" helpKeyword="WinJS.UI.SplitViewCommand.label">
-                /// Gets or sets the label of the SplitViewCommand.
-                /// </field>
-                label: {
-                    get: function () {
-                        return this._label;
-                    },
-                    set: function (value) {
-                        this._label = value;
-                        this._labelEl.textContent = value;
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.SplitViewCommand.tooltip" helpKeyword="WinJS.UI.SplitViewCommand.tooltip">
-                /// Gets or sets the tooltip of the SplitViewCommand.
-                /// </field>
-                tooltip: {
-                    get: function () {
-                        return this._tooltip;
-                    },
-                    set: function (value) {
-                        this._tooltip = value;
-                        if (this._tooltip || this._tooltip === "") {
-                            this._element.setAttribute('title', this._tooltip);
-                        } else {
-                            this._element.removeAttribute('title');
-                        }
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.SplitViewCommand.icon" helpKeyword="WinJS.UI.SplitViewCommand.icon">
-                /// Gets or sets the icon of the SplitViewCommand. This value is either one of the values of the AppBarIcon enumeration or the path of a custom PNG file.
-                /// </field>
-                icon: {
-                    get: function () {
-                        return this._icon;
-                    },
-                    set: function (value) {
-                        this._icon = (_Icon[value] || value);
-
-                        // If the icon's a single character, presume a glyph
-                        if (this._icon && this._icon.length === 1) {
-                            // Set the glyph
-                            this._imageSpan.textContent = this._icon;
-                            this._imageSpan.style.backgroundImage = "";
-                            this._imageSpan.style.msHighContrastAdjust = "";
-                            this._imageSpan.style.display = "";
-                        } else if (this._icon && this._icon.length > 1) {
-                            // Must be an image, set that
-                            this._imageSpan.textContent = "";
-                            this._imageSpan.style.backgroundImage = this._icon;
-                            this._imageSpan.style.msHighContrastAdjust = "none";
-                            this._imageSpan.style.display = "";
-                        } else {
-                            this._imageSpan.textContent = "";
-                            this._imageSpan.style.backgroundImage = "";
-                            this._imageSpan.style.msHighContrastAdjust = "";
-                            this._imageSpan.style.display = "none";
-                        }
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.SplitViewCommand.oninvoked" helpKeyword="WinJS.UI.SplitViewCommand.oninvoked">
-                /// Raised when a SplitViewCommand has been invoked.
-                /// </field>
-                oninvoked: createEvent(EventNames.invoked),
-
-                _toggleSplit: function SplitViewCommand_toggleSplit() {
-                    this._splitOpened = !this._splitOpened;
-                    if (this._splitOpened) {
-                        _ElementUtilities.addClass(this._splitButtonEl, this._classNames.commandSplitButtonOpened);
-                        this._splitButtonEl.setAttribute("aria-expanded", "true");
-                    } else {
-                        _ElementUtilities.removeClass(this._splitButtonEl, this._classNames.commandSplitButtonOpened);
-                        this._splitButtonEl.setAttribute("aria-expanded", "false");
-                    }
-                    this._fireEvent(SplitViewCommand._EventName._splitToggle);
-                },
-
-                _rtl: {
-                    get: function () {
-                        return _ElementUtilities._getComputedStyle(this.element).direction === "rtl";
-                    }
-                },
-
-                _keydownHandler: function SplitViewCommand_keydownHandler(ev) {
-                    if (_ElementUtilities._matchesSelector(ev.target, ".win-interactive, .win-interactive *")) {
-                        return;
-                    }
-
-                    var leftStr = this._rtl ? Key.rightArrow : Key.leftArrow;
-                    var rightStr = this._rtl ? Key.leftArrow : Key.rightArrow;
-
-                    if (!ev.altKey && (ev.keyCode === leftStr || ev.keyCode === Key.home || ev.keyCode === Key.end) && ev.target === this._splitButtonEl) {
-                        _ElementUtilities._setActive(this._buttonEl);
-                        if (ev.keyCode === leftStr) {
-                            ev.stopPropagation();
-                        }
-                        ev.preventDefault();
-                    } else if (!ev.altKey && ev.keyCode === rightStr && this.splitButton && (ev.target === this._buttonEl || this._buttonEl.contains(ev.target))) {
-                        _ElementUtilities._setActive(this._splitButtonEl);
-                        if (ev.keyCode === rightStr) {
-                            ev.stopPropagation();
-                        }
-                        ev.preventDefault();
-                    } else if ((ev.keyCode === Key.space || ev.keyCode === Key.enter) && (ev.target === this._buttonEl || this._buttonEl.contains(ev.target))) {
-                        this._invoke();
-                    } else if ((ev.keyCode === Key.space || ev.keyCode === Key.enter) && ev.target === this._splitButtonEl) {
-                        this._toggleSplit();
-                    }
-                },
-
-                _getFocusInto: function SplitViewCommand_getFocusInto(keyCode) {
-                    var leftStr = this._rtl ? Key.rightArrow : Key.leftArrow;
-                    if ((keyCode === leftStr) && this.splitButton) {
-                        return this._splitButtonEl;
-                    } else {
-                        return this._buttonEl;
-                    }
-                },
-
-                _buildDom: function SplitViewCommand_buildDom() {
-                    var markup =
-                        '<div tabindex="0" role="button" class="' + this._classNames.commandButton + '">' +
-                            '<div class="' + this._classNames.commandButtonContent + '">' +
-                                '<div class="' + this._classNames.commandIcon + '"></div>' +
-                                '<div class="' + this._classNames.commandLabel + '"></div>' +
-                            '</div>' +
-                        '</div>' +
-                        '<div tabindex="-1" aria-expanded="false" class="' + this._classNames.commandSplitButton + '"></div>';
-                    this.element.insertAdjacentHTML("afterBegin", markup);
-
-                    this._buttonEl = this.element.firstElementChild;
-                    this._buttonPressedBehavior = new exports._WinPressed(this._buttonEl);
-                    this._contentEl = this._buttonEl.firstElementChild;
-                    this._imageSpan = this._contentEl.firstElementChild;
-                    this._imageSpan.style.display = "none";
-                    this._labelEl = this._imageSpan.nextElementSibling;
-                    this._splitButtonEl = this._buttonEl.nextElementSibling;
-                    this._splitButtonPressedBehavior = new exports._WinPressed(this._splitButtonEl);
-                    this._splitButtonEl.style.display = "none";
-
-                    _ElementUtilities._ensureId(this._buttonEl);
-                    this._splitButtonEl.setAttribute("aria-labelledby", this._buttonEl.id);
-
-                    this._buttonEl.addEventListener("click", this._handleButtonClick.bind(this));
-
-                    var mutationObserver = new _ElementUtilities._MutationObserver(this._splitButtonAriaExpandedPropertyChangeHandler.bind(this));
-                    mutationObserver.observe(this._splitButtonEl, { attributes: true, attributeFilter: ["aria-expanded"] });
-                    this._splitButtonEl.addEventListener("click", this._handleSplitButtonClick.bind(this));
-
-                    // reparent any other elements.
-                    var tempEl = this._splitButtonEl.nextSibling;
-                    while (tempEl) {
-                        this._buttonEl.insertBefore(tempEl, this._contentEl);
-                        if (tempEl.nodeName !== "#text") {
-                            ControlProcessor.processAll(tempEl);
-                        }
-                        tempEl = this._splitButtonEl.nextSibling;
-                    }
-                },
-
-                _handleButtonClick: function SplitViewCommand_handleButtonClick(ev) {
-                    var srcElement = ev.target;
-                    if (!_ElementUtilities._matchesSelector(srcElement, ".win-interactive, .win-interactive *")) {
-                        this._invoke();
-                    }
-                },
-
-                _splitButtonAriaExpandedPropertyChangeHandler: function SplitViewCommand_splitButtonAriaExpandedPropertyChangeHandler() {
-                    if ((this._splitButtonEl.getAttribute("aria-expanded") === "true") !== this._splitOpened) {
-                        this._toggleSplit();
-                    }
-                },
-
-                _handleSplitButtonClick: function SplitViewCommand_handleSplitButtonClick() {
-                    this._toggleSplit();
-                },
-
-                _invoke: function SplitViewCommand_invoke() {
-                    this._fireEvent(SplitViewCommand._EventName.invoked);
-                },
-
-                _fireEvent: function SplitViewCommand_fireEvent(type, detail) {
-                    var event = _Global.document.createEvent("CustomEvent");
-                    event.initCustomEvent(type, true, false, detail);
-                    this.element.dispatchEvent(event);
-                },
-
-                dispose: function SplitViewCommand_dispose() {
-                    /// <signature helpKeyword="WinJS.UI.SplitViewCommand.dispose">
-                    /// <summary locid="WinJS.UI.SplitViewCommand.dispose">
-                    /// Disposes this control.
-                    /// </summary>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._disposed = true;
-
-                    this._buttonPressedBehavior.dispose();
-                    this._splitButtonPressedBehavior.dispose();
-                }
-            }, {
-                _ClassName: ClassNames,
-                _EventName: EventNames,
-            });
-            _Base.Class.mix(SplitViewCommand, _Control.DOMEventMixin);
-            return SplitViewCommand;
-        })
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/NavBar/_Command',[
-    'exports',
-    '../../Core/_Global',
-    '../../Core/_Base',
-    '../../Core/_ErrorFromName',
-    '../../Navigation',
-    '../../Utilities/_ElementUtilities',
-    '../SplitView/Command',
-], function NavBarCommandInit(exports, _Global, _Base, _ErrorFromName, Navigation, _ElementUtilities, SplitViewCommand) {
-    "use strict";
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.NavBarCommand">
-        /// Represents a navigation command in an NavBarContainer.
-        /// </summary>
-        /// <compatibleWith platform="Windows" minVersion="8.1"/>
-        /// </field>
-        /// <icon src="ui_winjs.ui.navbarcommand.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.navbarcommand.16x16.png" width="16" height="16" />
-        /// <htmlSnippet><![CDATA[<div data-win-control="WinJS.UI.NavBarCommand" data-win-options="{location:'/pages/home/home.html',label:'Home',icon:WinJS.UI.AppBarIcon.home}"></div>]]></htmlSnippet>
-        /// <part name="navbarcommand" class="win-navbarcommand" locid="WinJS.UI.NavBarCommand_part:navbarcommand">Styles the entire NavBarCommand control.</part>
-        /// <part name="button" class="win-navbarcommand-button" locid="WinJS.UI.NavBarCommand_part:button">Styles the main button in a NavBarCommand.</part>
-        /// <part name="splitbutton" class="win-navbarcommand-splitbutton" locid="WinJS.UI.NavBarCommand_part:splitbutton">Styles the split button in a NavBarCommand</part>
-        /// <part name="icon" class="win-navbarcommand-icon" locid="WinJS.UI.NavBarCommand_part:icon">Styles the icon in the main button of a NavBarCommand.</part>
-        /// <part name="label" class="win-navbarcommand-label" locid="WinJS.UI.NavBarCommand_part:label">Styles the label in the main button of a NavBarCommand.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        NavBarCommand: _Base.Namespace._lazy(function () {
-
-            var strings = {
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; },
-                get navBarCommandDeprecated() { return "NavBarCommand is deprecated and may not be available in future releases. If you were using a NavBarCommand inside of a SplitView, use SplitViewCommand instead."; }
-            };
-
-            var ClassNames = {
-                command: "win-navbarcommand",
-                commandButton: "win-navbarcommand-button",
-                commandButtonContent: "win-navbarcommand-button-content",
-                commandSplitButton: "win-navbarcommand-splitbutton",
-                commandSplitButtonOpened: "win-navbarcommand-splitbutton-opened",
-                commandIcon: "win-navbarcommand-icon",
-                commandLabel: "win-navbarcommand-label"
-            };
-
-            var superClass = SplitViewCommand.SplitViewCommand.prototype;
-
-            var NavBarCommand = _Base.Class.derive(SplitViewCommand.SplitViewCommand, function NavBarCommand_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.NavBarCommand.NavBarCommand">
-                /// <summary locid="WinJS.UI.NavBarCommand.constructor">
-                /// Creates a new NavBarCommand.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" isOptional="true" locid="WinJS.UI.NavBarCommand.constructor_p:element">
-                /// The DOM element that will host the new  NavBarCommand control.
-                /// </param>
-                /// <param name="options" type="Object" isOptional="true" locid="WinJS.UI.NavBarCommand.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// Event names must begin with "on".
-                /// </param>
-                /// <returns type="WinJS.UI.NavBarCommand" locid="WinJS.UI.NavBarCommand.constructor_returnValue">
-                /// The new NavBarCommand.
-                /// </returns>
-                /// <deprecated type="deprecate">
-                /// NavBarCommand is deprecated and may not be available in future releases. 
-                /// If you were using a NavBarCommand inside of a SplitView, use SplitViewCommand instead.
-                /// </deprecated>
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </signature>
-                _ElementUtilities._deprecated(strings.navBarCommandDeprecated);
-
-                element = element || _Global.document.createElement("DIV");
-                options = options || {};
-
-                if (element.winControl) {
-                    throw new _ErrorFromName("WinJS.UI.NavBarCommand.DuplicateConstruction", strings.duplicateConstruction);
-                }
-
-                this._baseConstructor(element, options, ClassNames);
-
-            },
-            {
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.NavBarCommand.element" helpKeyword="WinJS.UI.NavBarCommand.element">
-                /// Gets the DOM element that hosts the NavBarCommand.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                element: {
-                    get: function () {
-                        return Object.getOwnPropertyDescriptor(superClass, "element").get.call(this);
-                    }
-                },
-                /// <field type="String" locid="WinJS.UI.NavBarCommand.label" helpKeyword="WinJS.UI.NavBarCommand.label">
-                /// Gets or sets the label of the NavBarCommand.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                label: {
-                    get: function () {
-                        return Object.getOwnPropertyDescriptor(superClass, "label").get.call(this);
-                    },
-                    set: function (value) {
-                        return Object.getOwnPropertyDescriptor(superClass, "label").set.call(this, value);
-                    }
-                },
-                /// <field type="String" locid="WinJS.UI.NavBarCommand.tooltip" helpKeyword="WinJS.UI.NavBarCommand.tooltip">
-                /// Gets or sets the tooltip of the NavBarCommand.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                tooltip: {
-                    get: function () {
-                        return Object.getOwnPropertyDescriptor(superClass, "tooltip").get.call(this);
-                    },
-                    set: function (value) {
-                        return Object.getOwnPropertyDescriptor(superClass, "tooltip").set.call(this, value);
-                    }
-                },
-                /// <field type="String" locid="WinJS.UI.NavBarCommand.icon" helpKeyword="WinJS.UI.NavBarCommand.icon">
-                /// Gets or sets the icon of the NavBarCommand. This value is either one of the values of the AppBarIcon enumeration or the path of a custom PNG file.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                icon: {
-                    get: function () {
-                        return Object.getOwnPropertyDescriptor(superClass, "icon").get.call(this);
-                    },
-                    set: function (value) {
-                        return Object.getOwnPropertyDescriptor(superClass, "icon").set.call(this, value);
-                    }
-                },
-                /// <field type="String" locid="WinJS.UI.NavBarCommand.location" helpKeyword="WinJS.UI.NavBarCommand.location">
-                /// Gets or sets the command's target location.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                location: {
-                    get: function () {
-                        return this._location;
-                    },
-                    set: function (value) {
-                        this._location = value;
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.NavBarCommand.oninvoked" helpKeyword="WinJS.UI.NavBarCommand.oninvoked">
-                /// This API supports the Windows Library for JavaScript infrastructure and is not intended to be used directly from your code. 
-                /// </field>
-                oninvoked: {
-                    // Override this this property from our parent class to "un-inherit it".
-                    // NavBarCommand uses a private "_invoked" event to communicate with NavBarContainer.
-                    // NavBarContainer fires a public "invoked" event when one of its commands has been invoked.
-                    get: function () { return undefined; },
-                    enumerable: false
-                },
-
-                /// <field type="String" locid="WinJS.UI.NavBarCommand.state" helpKeyword="WinJS.UI.NavBarCommand.state">
-                /// Gets or sets the state value used for navigation. The command passes this object to the WinJS.Navigation.navigate function.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                state: {
-                    get: function () {
-                        return this._state;
-                    },
-                    set: function (value) {
-                        this._state = value;
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.NavBarCommand.splitButton" helpKeyword="WinJS.UI.NavBarCommand.splitButton">
-                /// Gets or sets a value that specifies whether the NavBarCommand has a split button.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                splitButton: {
-                    get: function () {
-                        return this._split;
-                    },
-                    set: function (value) {
-                        this._split = value;
-                        if (this._split) {
-                            this._splitButtonEl.style.display = "";
-                        } else {
-                            this._splitButtonEl.style.display = "none";
-                        }
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.NavBarCommand.splitOpened" hidden="true" helpKeyword="WinJS.UI.NavBarCommand.splitOpened">
-                /// Gets or sets a value that specifies whether the split button is open.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                splitOpened: {
-                    get: function () {
-                        return this._splitOpened;
-                    },
-                    set: function (value) {
-                        if (this._splitOpened !== !!value) {
-                            this._toggleSplit();
-                        }
-                    }
-                },
-
-                dispose: function NavBarCommand_dispose() {
-                    /// <signature helpKeyword="WinJS.UI.NavBarCommand.dispose">
-                    /// <summary locid="WinJS.UI.NavBarCommand.dispose">
-                    /// Disposes this control.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </signature>
-                    superClass.dispose.call(this);
-                },
-
-                _invoke: function NavBarCommand_invoke() {
-                    if (this.location) {
-                        Navigation.navigate(this.location, this.state);
-                    }
-                    this._fireEvent(NavBarCommand._EventName._invoked);
-                },
-            },
-            {
-                _ClassName: ClassNames,
-                _EventName: {
-                    _invoked: "_invoked",
-                    _splitToggle: "_splittoggle",
-                },
-            });
-            return NavBarCommand;
-        })
-    });
-
-});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/NavBar/_Container',[
-    'exports',
-    '../../Core/_Global',
-    '../../Core/_Base',
-    '../../Core/_BaseUtils',
-    '../../Core/_ErrorFromName',
-    '../../Core/_Events',
-    '../../Core/_Log',
-    '../../Core/_Resources',
-    '../../Core/_WriteProfilerMark',
-    '../../Animations',
-    '../../Animations/_TransitionAnimation',
-    '../../BindingList',
-    '../../ControlProcessor',
-    '../../Navigation',
-    '../../Promise',
-    '../../Scheduler',
-    '../../Utilities/_Control',
-    '../../Utilities/_ElementUtilities',
-    '../../Utilities/_KeyboardBehavior',
-    '../../Utilities/_UI',
-    '../_LegacyAppBar/_Constants',
-    '../Repeater',
-    './_Command'
-], function NavBarContainerInit(exports, _Global, _Base, _BaseUtils, _ErrorFromName, _Events, _Log, _Resources, _WriteProfilerMark, Animations, _TransitionAnimation, BindingList, ControlProcessor, Navigation, Promise, Scheduler, _Control, _ElementUtilities, _KeyboardBehavior, _UI, _Constants, Repeater, NavBarCommand) {
-    "use strict";
-
-    function nobodyHasFocus() {
-        return _Global.document.activeElement === null || _Global.document.activeElement === _Global.document.body;
-    }
-
-    _Base.Namespace._moduleDefine(exports, "WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.NavBarContainer">
-        /// Contains a group of NavBarCommand objects in a NavBar.
-        /// </summary>
-        /// <compatibleWith platform="Windows" minVersion="8.1"/>
-        /// </field>
-        /// <icon src="ui_winjs.ui.navbarcontainer.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.navbarcontainer.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.NavBarContainer">
-        /// <div data-win-control="WinJS.UI.NavBarCommand" data-win-options="{location:'/pages/home/home.html',label:'Home',icon:WinJS.UI.AppBarIcon.home}"></div>
-        /// </div>]]></htmlSnippet>
-        /// <event name="invoked" locid="WinJS.UI.NavBarContainer_e:invoked">Raised when a NavBarCommand is invoked.</event>
-        /// <event name="splittoggle" locid="WinJS.UI.NavBarContainer_e:splittoggle">Raised when the split button on a NavBarCommand is toggled.</event>
-        /// <part name="navbarcontainer" class="win-navbarcontainer" locid="WinJS.UI.NavBarContainer_part:navbarcontainer">Styles the entire NavBarContainer control.</part>
-        /// <part name="pageindicators" class="win-navbarcontainer-pageindicator-box" locid="WinJS.UI.NavBarContainer_part:pageindicators">
-        /// Styles the page indication for the NavBarContainer.
-        /// </part>
-        /// <part name="indicator" class="win-navbarcontainer-pagination-indicator" locid="WinJS.UI.NavBarContainer_part:indicator">Styles the page indication for each page.</part>
-        /// <part name="currentindicator" class="win-navbarcontainer-pagination-indicator-current" locid="WinJS.UI.NavBarContainer_part:currentindicator">
-        /// Styles the indication of the current page.
-        /// </part>
-        /// <part name="items" class="win-navbarcontainer-surface" locid="WinJS.UI.NavBarContainer_part:items">Styles the area that contains items for the NavBarContainer.</part>
-        /// <part name="navigationArrow" class="win-navbarcontainer-navarrow" locid="WinJS.UI.NavBarContainer_part:navigationArrow">Styles left and right navigation arrows.</part>
-        /// <part name="leftNavigationArrow" class="win-navbarcontainer-navleft" locid="WinJS.UI.NavBarContainer_part:leftNavigationArrow">Styles the left navigation arrow.</part>
-        /// <part name="rightNavigationArrow" class="win-navbarcontainer-navright" locid="WinJS.UI.NavBarContainer_part:rightNavigationArrow">Styles the right navigation arrow.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        NavBarContainer: _Base.Namespace._lazy(function () {
-            var Key = _ElementUtilities.Key;
-
-            var buttonFadeDelay = 3000;
-            var PT_TOUCH = _ElementUtilities._MSPointerEvent.MSPOINTER_TYPE_TOUCH || "touch";
-            var MS_MANIPULATION_STATE_STOPPED = 0;
-
-            var createEvent = _Events._createEventProperty;
-            var eventNames = {
-                invoked: "invoked",
-                splittoggle: "splittoggle"
-            };
-
-            var strings = {
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; },
-                get navBarContainerViewportAriaLabel() { return _Resources._getWinJSString("ui/navBarContainerViewportAriaLabel").value; },
-                get navBarContainerIsDeprecated() { return "NavBarContainer is deprecated and may not be available in future releases. Instead, use a WinJS SplitView to display navigation targets within the app."; }
-            };
-
-            var NavBarContainer = _Base.Class.define(function NavBarContainer_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.NavBarContainer.NavBarContainer">
-                /// <summary locid="WinJS.UI.NavBarContainer.constructor">
-                /// Creates a new NavBarContainer.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" isOptional="true" locid="WinJS.UI.NavBarContainer.constructor_p:element">
-                /// The DOM element that will host the NavBarContainer control.
-                /// </param>
-                /// <param name="options" type="Object" isOptional="true" locid="WinJS.UI.NavBarContainer.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// Event names must begin with "on".
-                /// </param>
-                /// <returns type="WinJS.UI.NavBarContainer" locid="WinJS.UI.NavBarContainer.constructor_returnValue">
-                /// The new NavBarContainer.
-                /// </returns>
-                /// <deprecated type="deprecate">
-                /// NavBarContainer is deprecated and may not be available in future releases. 
-                /// Instead, use a WinJS SplitView to display navigation targets within the app.
-                /// </deprecated>
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </signature>
-
-                _ElementUtilities._deprecated(strings.navBarContainerIsDeprecated);
-
-                element = element || _Global.document.createElement("DIV");
-                this._id = element.id || _ElementUtilities._uniqueID(element);
-                this._writeProfilerMark("constructor,StartTM");
-
-                options = options || {};
-
-                if (element.winControl) {
-                    throw new _ErrorFromName("WinJS.UI.NavBarContainer.DuplicateConstruction", strings.duplicateConstruction);
-                }
-
-                // Attaching JS control to DOM element
-                element.winControl = this;
-                this._element = element;
-                _ElementUtilities.addClass(this.element, NavBarContainer._ClassName.navbarcontainer);
-                _ElementUtilities.addClass(this.element, "win-disposable");
-                if (!element.getAttribute("tabIndex")) {
-                    element.tabIndex = -1;
-                }
-
-                this._focusCurrentItemPassivelyBound = this._focusCurrentItemPassively.bind(this);
-                this._closeSplitAndResetBound = this._closeSplitAndReset.bind(this);
-                this._currentManipulationState = MS_MANIPULATION_STATE_STOPPED;
-
-                this._panningDisabled = !_ElementUtilities._supportsSnapPoints;
-                this._fixedSize = false;
-                this._maxRows = 1;
-                this._sizes = {};
-
-                this._setupTree();
-
-                this._duringConstructor = true;
-
-                this._dataChangingBound = this._dataChanging.bind(this);
-                this._dataChangedBound = this._dataChanged.bind(this);
-
-                Navigation.addEventListener('navigated', this._closeSplitAndResetBound);
-
-                // Don't use set options for the properties so we can control the ordering to avoid rendering multiple times.
-                this.layout = options.layout || _UI.Orientation.horizontal;
-                if (options.maxRows) {
-                    this.maxRows = options.maxRows;
-                }
-                if (options.template) {
-                    this.template = options.template;
-                }
-                if (options.data) {
-                    this.data = options.data;
-                }
-                if (options.fixedSize) {
-                    this.fixedSize = options.fixedSize;
-                }
-
-                // Events only
-                _Control._setOptions(this, options, true);
-
-                this._duringConstructor = false;
-
-                if (options.currentIndex) {
-                    this.currentIndex = options.currentIndex;
-                }
-
-                this._updatePageUI();
-
-                Scheduler.schedule(function NavBarContainer_async_initialize() {
-                    this._updateAppBarReference();
-                }, Scheduler.Priority.normal, this, "WinJS.UI.NavBarContainer_async_initialize");
-
-                this._writeProfilerMark("constructor,StopTM");
-            }, {
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.NavBarContainer.element" helpKeyword="WinJS.UI.NavBarContainer.element">
-                /// Gets the DOM element that hosts the NavBarContainer.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                element: {
-                    get: function () {
-                        return this._element;
-                    }
-                },
-
-                /// <field type="Object" locid="WinJS.UI.NavBarContainer.template" helpKeyword="WinJS.UI.NavBarContainer.template" potentialValueSelector="[data-win-control='WinJS.Binding.Template']">
-                /// Gets or sets a Template or custom rendering function that defines the HTML of each item within the NavBarContainer.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                template: {
-                    get: function () {
-                        return this._template;
-                    },
-                    set: function (value) {
-                        this._template = value;
-                        if (this._repeater) {
-                            var hadFocus = this.element.contains(_Global.document.activeElement);
-
-                            if (!this._duringConstructor) {
-                                this._closeSplitIfOpen();
-                            }
-
-                            // the repeater's template is wired up to this._render() so just resetting it will rebuild the tree.
-                            this._repeater.template = this._repeater.template;
-
-                            if (!this._duringConstructor) {
-                                this._measured = false;
-                                this._sizes.itemMeasured = false;
-                                this._reset();
-                                if (hadFocus) {
-                                    this._keyboardBehavior._focus(0);
-                                }
-                            }
-                        }
-                    }
-                },
-
-                _render: function NavBarContainer_render(item) {
-                    var navbarCommandEl = _Global.document.createElement('div');
-
-                    var template = this._template;
-                    if (template) {
-                        if (template.render) {
-                            template.render(item, navbarCommandEl);
-                        } else if (template.winControl && template.winControl.render) {
-                            template.winControl.render(item, navbarCommandEl);
-                        } else {
-                            navbarCommandEl.appendChild(template(item));
-                        }
-                    }
-
-                    // Create the NavBarCommand after calling render so that the reparenting in navbarCommand works.
-                    var navbarCommand = new NavBarCommand.NavBarCommand(navbarCommandEl, item);
-                    return navbarCommand._element;
-                },
-
-                /// <field type="WinJS.Binding.List" locid="WinJS.UI.NavBarContainer.data" helpKeyword="WinJS.UI.NavBarContainer.data">
-                /// Gets or sets the WinJS.Binding.List that provides the NavBarContainer with items to display.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                data: {
-                    get: function () {
-                        return this._repeater && this._repeater.data;
-                    },
-                    set: function (value) {
-                        if (!value) {
-                            value = new BindingList.List();
-                        }
-
-                        if (!this._duringConstructor) {
-                            this._closeSplitIfOpen();
-                        }
-
-                        this._removeDataChangingEvents();
-                        this._removeDataChangedEvents();
-
-                        var hadFocus = this.element.contains(_Global.document.activeElement);
-
-                        if (!this._repeater) {
-                            this._surfaceEl.innerHTML = "";
-                            this._repeater = new Repeater.Repeater(this._surfaceEl, {
-                                template: this._render.bind(this)
-                            });
-                        }
-
-                        this._addDataChangingEvents(value);
-                        this._repeater.data = value;
-                        this._addDataChangedEvents(value);
-
-                        if (!this._duringConstructor) {
-                            this._measured = false;
-                            this._sizes.itemMeasured = false;
-                            this._reset();
-                            if (hadFocus) {
-                                this._keyboardBehavior._focus(0);
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.NavBarContainer.maxRows" helpKeyword="WinJS.UI.NavBarContainer.maxRows">
-                /// Gets or sets the number of rows allowed to be used before items are placed on additional pages.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                maxRows: {
-                    get: function () {
-                        return this._maxRows;
-                    },
-                    set: function (value) {
-                        value = (+value === value) ? value : 1;
-                        this._maxRows = Math.max(1, value);
-
-                        if (!this._duringConstructor) {
-                            this._closeSplitIfOpen();
-
-                            this._measured = false;
-                            this._reset();
-                        }
-                    }
-                },
-
-                /// <field type="String" oamOptionsDatatype="WinJS.UI.Orientation" locid="WinJS.UI.NavBarContainer.layout" helpKeyword="WinJS.UI.NavBarContainer.layout">
-                /// Gets or sets a value that specifies whether the NavBarContainer has a horizontal or vertical layout. The default is "horizontal".
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                layout: {
-                    get: function () {
-                        return this._layout;
-                    },
-                    set: function (value) {
-                        if (value === _UI.Orientation.vertical) {
-                            this._layout = _UI.Orientation.vertical;
-                            _ElementUtilities.removeClass(this.element, NavBarContainer._ClassName.horizontal);
-                            _ElementUtilities.addClass(this.element, NavBarContainer._ClassName.vertical);
-                        } else {
-                            this._layout = _UI.Orientation.horizontal;
-                            _ElementUtilities.removeClass(this.element, NavBarContainer._ClassName.vertical);
-                            _ElementUtilities.addClass(this.element, NavBarContainer._ClassName.horizontal);
-                        }
-
-                        this._viewportEl.style.msScrollSnapType = "";
-                        this._zooming = false;
-
-                        if (!this._duringConstructor) {
-                            this._measured = false;
-                            this._sizes.itemMeasured = false;
-                            this._ensureVisible(this._keyboardBehavior.currentIndex, true);
-                            this._updatePageUI();
-                            this._closeSplitIfOpen();
-                        }
-                    }
-                },
-
-                /// <field type="Number" integer="true" locid="WinJS.UI.NavBarContainer.currentIndex" hidden="true" helpKeyword="WinJS.UI.NavBarContainer.currentIndex">
-                /// Gets or sets the index of the current NavBarCommand.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                currentIndex: {
-                    get: function () {
-                        return this._keyboardBehavior.currentIndex;
-                    },
-                    set: function (value) {
-                        if (value === +value) {
-                            var hadFocus = this.element.contains(_Global.document.activeElement);
-
-                            this._keyboardBehavior.currentIndex = value;
-
-                            this._ensureVisible(this._keyboardBehavior.currentIndex, true);
-
-                            if (hadFocus) {
-                                this._keyboardBehavior._focus();
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.NavBarContainer.fixedSize" helpKeyword="WinJS.UI.NavBarContainer.fixedSize">
-                /// Gets or sets a value that specifies whether child NavBarCommand  objects should be a fixed width when there are multiple pages. A value of true indicates
-                /// that the NavBarCommand objects use a fixed width; a value of false indicates that they use a dynamic width.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                fixedSize: {
-                    get: function () {
-                        return this._fixedSize;
-                    },
-                    set: function (value) {
-                        this._fixedSize = !!value;
-
-                        if (!this._duringConstructor) {
-                            this._closeSplitIfOpen();
-
-                            if (!this._measured) {
-                                this._measure();
-                            } else if (this._surfaceEl.children.length > 0) {
-                                this._updateGridStyles();
-                            }
-                        }
-                    }
-                },
-
-                /// <field type="Function" locid="WinJS.UI.NavBarContainer.oninvoked" helpKeyword="WinJS.UI.NavBarContainer.oninvoked">
-                /// Raised when a NavBarCommand has been invoked.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                oninvoked: createEvent(eventNames.invoked),
-
-                /// <field type="Function" locid="WinJS.UI.NavBarContainer.onsplittoggle" helpKeyword="WinJS.UI.NavBarContainer.onsplittoggle">
-                /// Raised when the split button on a NavBarCommand is toggled.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                onsplittoggle: createEvent(eventNames.splittoggle),
-
-                forceLayout: function NavBarContainer_forceLayout() {
-                    /// <signature helpKeyword="WinJS.UI.NavBarContainer.forceLayout">
-                    /// <summary locid="WinJS.UI.NavBarContainer.forceLayout">
-                    /// Forces the NavBarContainer to update scroll positions and if the NavBar has changed size, it will also re-measure.
-                    /// Use this function when making the NavBarContainer visible again after you set its style.display property to "none".
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </signature>
-                    this._resizeHandler();
-                    if (this._measured) {
-                        this._scrollPosition = _ElementUtilities.getScrollPosition(this._viewportEl)[(this.layout === _UI.Orientation.horizontal ? "scrollLeft" : "scrollTop")];
-                    }
-
-                    this._duringForceLayout = true;
-                    this._ensureVisible(this._keyboardBehavior.currentIndex, true);
-                    this._updatePageUI();
-                    this._duringForceLayout = false;
-                },
-
-                _updateAppBarReference: function NavBarContainer_updateAppBarReference() {
-                    if (!this._appBarEl || !this._appBarEl.contains(this.element)) {
-                        if (this._appBarEl) {
-                            this._appBarEl.removeEventListener('beforeopen', this._closeSplitAndResetBound);
-                            this._appBarEl.removeEventListener('beforeopen', this._resizeImplBound);
-                            this._appBarEl.removeEventListener('afteropen', this._focusCurrentItemPassivelyBound);
-                        }
-
-                        var appBarEl = this.element.parentNode;
-                        while (appBarEl && !_ElementUtilities.hasClass(appBarEl, _Constants.appBarClass)) {
-                            appBarEl = appBarEl.parentNode;
-                        }
-                        this._appBarEl = appBarEl;
-
-                        if (this._appBarEl) {
-                            this._appBarEl.addEventListener('beforeopen', this._closeSplitAndResetBound);
-                            this._appBarEl.addEventListener('afteropen', this._focusCurrentItemPassivelyBound);
-                        }
-                    }
-                },
-
-                _closeSplitAndReset: function NavBarContainer_closeSplitAndReset() {
-                    this._closeSplitIfOpen();
-                    this._reset();
-                },
-
-                _dataChanging: function NavBarContainer_dataChanging(ev) {
-                    // Store the element that was active so that we can detect
-                    // if the focus went away because of the data change.
-                    this._elementHadFocus = _Global.document.activeElement;
-
-                    if (this._currentSplitNavItem && this._currentSplitNavItem.splitOpened) {
-                        if (ev.type === "itemremoved") {
-                            if (this._surfaceEl.children[ev.detail.index].winControl === this._currentSplitNavItem) {
-                                this._closeSplitIfOpen();
-                            }
-                        } else if (ev.type === "itemchanged") {
-                            if (this._surfaceEl.children[ev.detail.index].winControl === this._currentSplitNavItem) {
-                                this._closeSplitIfOpen();
-                            }
-                        } else if (ev.type === "itemmoved") {
-                            if (this._surfaceEl.children[ev.detail.oldIndex].winControl === this._currentSplitNavItem) {
-                                this._closeSplitIfOpen();
-                            }
-                        } else if (ev.type === "reload") {
-                            this._closeSplitIfOpen();
-                        }
-                    }
-                },
-
-                _dataChanged: function NavBarContainer_dataChanged(ev) {
-                    this._measured = false;
-
-                    if (ev.type === "itemremoved") {
-                        if (ev.detail.index < this._keyboardBehavior.currentIndex) {
-                            this._keyboardBehavior.currentIndex--;
-                        } else if (ev.detail.index === this._keyboardBehavior.currentIndex) {
-                            // This clamps if the item being removed was the last item in the list
-                            this._keyboardBehavior.currentIndex = this._keyboardBehavior.currentIndex;
-                            if (nobodyHasFocus() && this._elementHadFocus) {
-                                this._keyboardBehavior._focus();
-                            }
-                        }
-                    } else if (ev.type === "itemchanged") {
-                        if (ev.detail.index === this._keyboardBehavior.currentIndex) {
-                            if (nobodyHasFocus() && this._elementHadFocus) {
-                                this._keyboardBehavior._focus();
-                            }
-                        }
-                    } else if (ev.type === "iteminserted") {
-                        if (ev.detail.index <= this._keyboardBehavior.currentIndex) {
-                            this._keyboardBehavior.currentIndex++;
-                        }
-                    } else if (ev.type === "itemmoved") {
-                        if (ev.detail.oldIndex === this._keyboardBehavior.currentIndex) {
-                            this._keyboardBehavior.currentIndex = ev.detail.newIndex;
-                            if (nobodyHasFocus() && this._elementHadFocus) {
-                                this._keyboardBehavior._focus();
-                            }
-                        }
-                    } else if (ev.type === "reload") {
-                        this._keyboardBehavior.currentIndex = 0;
-                        if (nobodyHasFocus() && this._elementHadFocus) {
-                            this._keyboardBehavior._focus();
-                        }
-                    }
-
-                    this._ensureVisible(this._keyboardBehavior.currentIndex, true);
-                    this._updatePageUI();
-                },
-
-                _focusCurrentItemPassively: function NavBarContainer_focusCurrentItemPassively() {
-                    if (this.element.contains(_Global.document.activeElement)) {
-                        this._keyboardBehavior._focus();
-                    }
-                },
-
-                _reset: function NavBarContainer_reset() {
-                    this._keyboardBehavior.currentIndex = 0;
-
-                    if (this.element.contains(_Global.document.activeElement)) {
-                        this._keyboardBehavior._focus(0);
-                    }
-
-                    this._viewportEl.style.msScrollSnapType = "";
-                    this._zooming = false;
-
-                    this._ensureVisible(0, true);
-                    this._updatePageUI();
-                },
-
-                _removeDataChangedEvents: function NavBarContainer_removeDataChangedEvents() {
-                    if (this._repeater) {
-                        this._repeater.data.removeEventListener("itemchanged", this._dataChangedBound);
-                        this._repeater.data.removeEventListener("iteminserted", this._dataChangedBound);
-                        this._repeater.data.removeEventListener("itemmoved", this._dataChangedBound);
-                        this._repeater.data.removeEventListener("itemremoved", this._dataChangedBound);
-                        this._repeater.data.removeEventListener("reload", this._dataChangedBound);
-                    }
-                },
-
-                _addDataChangedEvents: function NavBarContainer_addDataChangedEvents() {
-                    if (this._repeater) {
-                        this._repeater.data.addEventListener("itemchanged", this._dataChangedBound);
-                        this._repeater.data.addEventListener("iteminserted", this._dataChangedBound);
-                        this._repeater.data.addEventListener("itemmoved", this._dataChangedBound);
-                        this._repeater.data.addEventListener("itemremoved", this._dataChangedBound);
-                        this._repeater.data.addEventListener("reload", this._dataChangedBound);
-                    }
-                },
-
-                _removeDataChangingEvents: function NavBarContainer_removeDataChangingEvents() {
-                    if (this._repeater) {
-                        this._repeater.data.removeEventListener("itemchanged", this._dataChangingBound);
-                        this._repeater.data.removeEventListener("iteminserted", this._dataChangingBound);
-                        this._repeater.data.removeEventListener("itemmoved", this._dataChangingBound);
-                        this._repeater.data.removeEventListener("itemremoved", this._dataChangingBound);
-                        this._repeater.data.removeEventListener("reload", this._dataChangingBound);
-                    }
-                },
-
-                _addDataChangingEvents: function NavBarContainer_addDataChangingEvents(bindingList) {
-                    bindingList.addEventListener("itemchanged", this._dataChangingBound);
-                    bindingList.addEventListener("iteminserted", this._dataChangingBound);
-                    bindingList.addEventListener("itemmoved", this._dataChangingBound);
-                    bindingList.addEventListener("itemremoved", this._dataChangingBound);
-                    bindingList.addEventListener("reload", this._dataChangingBound);
-                },
-
-                _mouseleave: function NavBarContainer_mouseleave() {
-                    if (this._mouseInViewport) {
-                        this._mouseInViewport = false;
-                        this._updateArrows();
-                    }
-                },
-
-                _MSPointerDown: function NavBarContainer_MSPointerDown(ev) {
-                    if (ev.pointerType === PT_TOUCH) {
-                        if (this._mouseInViewport) {
-                            this._mouseInViewport = false;
-                            this._updateArrows();
-                        }
-                    }
-                },
-
-                _MSPointerMove: function NavBarContainer_MSPointerMove(ev) {
-                    if (ev.pointerType !== PT_TOUCH) {
-                        if (!this._mouseInViewport) {
-                            this._mouseInViewport = true;
-                            this._updateArrows();
-                        }
-                    }
-                },
-
-                _setupTree: function NavBarContainer_setupTree() {
-                    this._animateNextPreviousButtons = Promise.wrap();
-                    this._element.addEventListener('mouseleave', this._mouseleave.bind(this));
-                    _ElementUtilities._addEventListener(this._element, 'pointerdown', this._MSPointerDown.bind(this));
-                    _ElementUtilities._addEventListener(this._element, 'pointermove', this._MSPointerMove.bind(this));
-                    _ElementUtilities._addEventListener(this._element, "focusin", this._focusHandler.bind(this), false);
-
-                    this._pageindicatorsEl = _Global.document.createElement('div');
-                    _ElementUtilities.addClass(this._pageindicatorsEl, NavBarContainer._ClassName.pageindicators);
-                    this._element.appendChild(this._pageindicatorsEl);
-
-                    this._ariaStartMarker = _Global.document.createElement("div");
-                    this._element.appendChild(this._ariaStartMarker);
-
-                    this._viewportEl = _Global.document.createElement('div');
-                    _ElementUtilities.addClass(this._viewportEl, NavBarContainer._ClassName.viewport);
-                    this._element.appendChild(this._viewportEl);
-                    this._viewportEl.setAttribute("role", "group");
-                    this._viewportEl.setAttribute("aria-label", strings.navBarContainerViewportAriaLabel);
-
-                    this._boundResizeHandler = this._resizeHandler.bind(this);
-                    _ElementUtilities._resizeNotifier.subscribe(this._element, this._boundResizeHandler);
-                    this._viewportEl.addEventListener("mselementresize", this._resizeHandler.bind(this));
-                    this._viewportEl.addEventListener("scroll", this._scrollHandler.bind(this));
-                    this._viewportEl.addEventListener("MSManipulationStateChanged", this._MSManipulationStateChangedHandler.bind(this));
-
-                    this._ariaEndMarker = _Global.document.createElement("div");
-                    this._element.appendChild(this._ariaEndMarker);
-
-                    this._surfaceEl = _Global.document.createElement('div');
-                    _ElementUtilities.addClass(this._surfaceEl, NavBarContainer._ClassName.surface);
-                    this._viewportEl.appendChild(this._surfaceEl);
-
-                    this._surfaceEl.addEventListener(NavBarCommand.NavBarCommand._EventName._invoked, this._navbarCommandInvokedHandler.bind(this));
-                    this._surfaceEl.addEventListener(NavBarCommand.NavBarCommand._EventName._splitToggle, this._navbarCommandSplitToggleHandler.bind(this));
-                    _ElementUtilities._addEventListener(this._surfaceEl, "focusin", this._itemsFocusHandler.bind(this), false);
-                    this._surfaceEl.addEventListener("keydown", this._keyDownHandler.bind(this));
-
-                    // Reparent NavBarCommands which were in declarative markup
-                    var tempEl = this.element.firstElementChild;
-                    while (tempEl !== this._pageindicatorsEl) {
-                        this._surfaceEl.appendChild(tempEl);
-                        ControlProcessor.process(tempEl);
-                        tempEl = this.element.firstElementChild;
-                    }
-
-                    this._leftArrowEl = _Global.document.createElement('div');
-                    _ElementUtilities.addClass(this._leftArrowEl, NavBarContainer._ClassName.navleftarrow);
-                    _ElementUtilities.addClass(this._leftArrowEl, NavBarContainer._ClassName.navarrow);
-                    this._element.appendChild(this._leftArrowEl);
-                    this._leftArrowEl.addEventListener('click', this._goLeft.bind(this));
-                    this._leftArrowEl.style.opacity = 0;
-                    this._leftArrowEl.style.visibility = 'hidden';
-                    this._leftArrowFadeOut = Promise.wrap();
-
-                    this._rightArrowEl = _Global.document.createElement('div');
-                    _ElementUtilities.addClass(this._rightArrowEl, NavBarContainer._ClassName.navrightarrow);
-                    _ElementUtilities.addClass(this._rightArrowEl, NavBarContainer._ClassName.navarrow);
-                    this._element.appendChild(this._rightArrowEl);
-                    this._rightArrowEl.addEventListener('click', this._goRight.bind(this));
-                    this._rightArrowEl.style.opacity = 0;
-                    this._rightArrowEl.style.visibility = 'hidden';
-                    this._rightArrowFadeOut = Promise.wrap();
-
-                    this._keyboardBehavior = new _KeyboardBehavior._KeyboardBehavior(this._surfaceEl, {
-                        scroller: this._viewportEl
-                    });
-                    this._winKeyboard = new _KeyboardBehavior._WinKeyboard(this._surfaceEl);
-                },
-
-                _goRight: function NavBarContainer_goRight() {
-                    if (this._sizes.rtl) {
-                        this._goPrev();
-                    } else {
-                        this._goNext();
-                    }
-                },
-
-                _goLeft: function NavBarContainer_goLeft() {
-                    if (this._sizes.rtl) {
-                        this._goNext();
-                    } else {
-                        this._goPrev();
-                    }
-                },
-
-                _goNext: function NavBarContainer_goNext() {
-                    this._measure();
-                    var itemsPerPage = this._sizes.rowsPerPage * this._sizes.columnsPerPage;
-                    var targetPage = Math.min(Math.floor(this._keyboardBehavior.currentIndex / itemsPerPage) + 1, this._sizes.pages - 1);
-                    this._keyboardBehavior.currentIndex = Math.min(itemsPerPage * targetPage, this._surfaceEl.children.length);
-                    this._keyboardBehavior._focus();
-                },
-
-                _goPrev: function NavBarContainer_goPrev() {
-                    this._measure();
-                    var itemsPerPage = this._sizes.rowsPerPage * this._sizes.columnsPerPage;
-                    var targetPage = Math.max(0, Math.floor(this._keyboardBehavior.currentIndex / itemsPerPage) - 1);
-                    this._keyboardBehavior.currentIndex = Math.max(itemsPerPage * targetPage, 0);
-                    this._keyboardBehavior._focus();
-                },
-
-                _currentPage: {
-                    get: function () {
-                        if (this.layout === _UI.Orientation.horizontal) {
-                            this._measure();
-                            if (this._sizes.viewportOffsetWidth > 0) {
-                                return Math.min(this._sizes.pages - 1, Math.round(this._scrollPosition / this._sizes.viewportOffsetWidth));
-                            }
-                        }
-                        return 0;
-                    }
-                },
-
-                _resizeHandler: function NavBarContainer_resizeHandler() {
-                    if (this._disposed) { return; }
-                    if (!this._measured) { return; }
-                    var viewportResized = this.layout === _UI.Orientation.horizontal
-                            ? this._sizes.viewportOffsetWidth !== parseFloat(_ElementUtilities._getComputedStyle(this._viewportEl).width)
-                            : this._sizes.viewportOffsetHeight !== parseFloat(_ElementUtilities._getComputedStyle(this._viewportEl).height);
-                    if (!viewportResized) { return; }
-
-                    this._measured = false;
-
-                    if (!this._pendingResize) {
-                        this._pendingResize = true;
-
-                        this._resizeImplBound = this._resizeImplBound || this._resizeImpl.bind(this);
-
-                        this._updateAppBarReference();
-
-                        if (this._appBarEl && this._appBarEl.winControl && !this._appBarEl.winControl.opened) {
-                            // Do resize lazily.
-                            Scheduler.schedule(this._resizeImplBound, Scheduler.Priority.idle, null, "WinJS.UI.NavBarContainer._resizeImpl");
-                            this._appBarEl.addEventListener('beforeopen', this._resizeImplBound);
-                        } else {
-                            // Do resize now
-                            this._resizeImpl();
-                        }
-                    }
-                },
-
-                _resizeImpl: function NavBarContainer_resizeImpl() {
-                    if (!this._disposed && this._pendingResize) {
-                        this._pendingResize = false;
-                        if (this._appBarEl) {
-                            this._appBarEl.removeEventListener('beforeopen', this._resizeImplBound);
-                        }
-
-                        this._keyboardBehavior.currentIndex = 0;
-                        if (this.element.contains(_Global.document.activeElement)) {
-                            this._keyboardBehavior._focus(this._keyboardBehavior.currentIndex);
-                        }
-                        this._closeSplitIfOpen();
-                        this._ensureVisible(this._keyboardBehavior.currentIndex, true);
-                        this._updatePageUI();
-                    }
-                },
-
-                _keyDownHandler: function NavBarContainer_keyDownHandler(ev) {
-                    var keyCode = ev.keyCode;
-                    if (!ev.altKey && (keyCode === Key.pageUp || keyCode === Key.pageDown)) {
-                        var srcElement = ev.target;
-                        if (_ElementUtilities._matchesSelector(srcElement, ".win-interactive, .win-interactive *")) {
-                            return;
-                        }
-
-                        var index = this._keyboardBehavior.currentIndex;
-                        this._measure();
-
-                        var sizes = this._sizes;
-                        var page = Math.floor(index / (sizes.columnsPerPage * sizes.rowsPerPage));
-
-                        var scrollPositionTarget = null;
-                        if (keyCode === Key.pageUp) {
-                            if (this.layout === _UI.Orientation.horizontal) {
-                                var indexOfFirstItemOnPage = page * sizes.columnsPerPage * sizes.rowsPerPage;
-                                if (index === indexOfFirstItemOnPage && this._surfaceEl.children[index].winControl._buttonEl === _Global.document.activeElement) {
-                                    // First item on page so go back 1 page.
-                                    index = index - sizes.columnsPerPage * sizes.rowsPerPage;
-                                } else {
-                                    // Not first item on page so go to the first item on page.
-                                    index = indexOfFirstItemOnPage;
-                                }
-                            } else {
-                                var currentItem = this._surfaceEl.children[index];
-                                var top = currentItem.offsetTop;
-                                var bottom = top + currentItem.offsetHeight;
-                                var scrollPosition = this._zooming ? this._zoomPosition : this._scrollPosition;
-
-                                if (top >= scrollPosition && bottom < scrollPosition + sizes.viewportOffsetHeight) {
-                                    // current item is fully on screen.
-                                    while (index > 0 &&
-                                        this._surfaceEl.children[index - 1].offsetTop > scrollPosition) {
-                                        index--;
-                                    }
-                                }
-
-                                if (this._keyboardBehavior.currentIndex === index) {
-                                    var scrollPositionForOnePageAboveItem = bottom - sizes.viewportOffsetHeight;
-                                    index = Math.max(0, index - 1);
-                                    while (index > 0 &&
-                                        this._surfaceEl.children[index - 1].offsetTop > scrollPositionForOnePageAboveItem) {
-                                        index--;
-                                    }
-                                    if (index > 0) {
-                                        scrollPositionTarget = this._surfaceEl.children[index].offsetTop - this._sizes.itemMarginTop;
-                                    } else {
-                                        scrollPositionTarget = 0;
-                                    }
-                                }
-                            }
-
-                            index = Math.max(index, 0);
-                            this._keyboardBehavior.currentIndex = index;
-
-                            var element = this._surfaceEl.children[index].winControl._buttonEl;
-
-                            if (scrollPositionTarget !== null) {
-                                this._scrollTo(scrollPositionTarget);
-                            }
-
-                            _ElementUtilities._setActive(element, this._viewportEl);
-                        } else {
-                            if (this.layout === _UI.Orientation.horizontal) {
-                                var indexOfLastItemOnPage = (page + 1) * sizes.columnsPerPage * sizes.rowsPerPage - 1;
-
-                                if (index === indexOfLastItemOnPage) {
-                                    // Last item on page so go forward 1 page.
-                                    index = index + sizes.columnsPerPage * sizes.rowsPerPage;
-                                } else {
-                                    // Not Last item on page so go to last item on page.
-                                    index = indexOfLastItemOnPage;
-                                }
-                            } else {
-                                var currentItem = this._surfaceEl.children[this._keyboardBehavior.currentIndex];
-                                var top = currentItem.offsetTop;
-                                var bottom = top + currentItem.offsetHeight;
-                                var scrollPosition = this._zooming ? this._zoomPosition : this._scrollPosition;
-
-                                if (top >= scrollPosition && bottom < scrollPosition + sizes.viewportOffsetHeight) {
-                                    // current item is fully on screen.
-                                    while (index < this._surfaceEl.children.length - 1 &&
-                                        this._surfaceEl.children[index + 1].offsetTop + this._surfaceEl.children[index + 1].offsetHeight < scrollPosition + sizes.viewportOffsetHeight) {
-                                        index++;
-                                    }
-                                }
-
-                                if (index === this._keyboardBehavior.currentIndex) {
-                                    var scrollPositionForOnePageBelowItem = top + sizes.viewportOffsetHeight;
-                                    index = Math.min(this._surfaceEl.children.length - 1, index + 1);
-                                    while (index < this._surfaceEl.children.length - 1 &&
-                                        this._surfaceEl.children[index + 1].offsetTop + this._surfaceEl.children[index + 1].offsetHeight < scrollPositionForOnePageBelowItem) {
-                                        index++;
-                                    }
-
-                                    if (index < this._surfaceEl.children.length - 1) {
-                                        scrollPositionTarget = this._surfaceEl.children[index + 1].offsetTop - this._sizes.viewportOffsetHeight;
-                                    } else {
-                                        scrollPositionTarget = this._scrollLength - this._sizes.viewportOffsetHeight;
-                                    }
-                                }
-                            }
-
-                            index = Math.min(index, this._surfaceEl.children.length - 1);
-                            this._keyboardBehavior.currentIndex = index;
-
-                            var element = this._surfaceEl.children[index].winControl._buttonEl;
-
-                            if (scrollPositionTarget !== null) {
-                                this._scrollTo(scrollPositionTarget);
-                            }
-
-                            try {
-                                _ElementUtilities._setActive(element, this._viewportEl);
-                            } catch (e) {
-                            }
-                        }
-                    }
-                },
-
-                _focusHandler: function NavBarContainer_focusHandler(ev) {
-                    var srcElement = ev.target;
-                    if (!this._surfaceEl.contains(srcElement)) {
-                        // Forward focus from NavBarContainer, viewport or surface to the currentIndex.
-                        this._skipEnsureVisible = true;
-                        this._keyboardBehavior._focus(this._keyboardBehavior.currentIndex);
-                    }
-                },
-
-                _itemsFocusHandler: function NavBarContainer_itemsFocusHandler(ev) {
-                    // Find the item which is being focused and scroll it to view.
-                    var srcElement = ev.target;
-                    if (srcElement === this._surfaceEl) {
-                        return;
-                    }
-
-                    while (srcElement.parentNode !== this._surfaceEl) {
-                        srcElement = srcElement.parentNode;
-                    }
-
-                    var index = -1;
-                    while (srcElement) {
-                        index++;
-                        srcElement = srcElement.previousSibling;
-                    }
-
-                    if (this._skipEnsureVisible) {
-                        this._skipEnsureVisible = false;
-                    } else {
-                        this._ensureVisible(index);
-                    }
-                },
-
-                _ensureVisible: function NavBarContainer_ensureVisible(index, withoutAnimation) {
-                    this._measure();
-
-                    if (this.layout === _UI.Orientation.horizontal) {
-                        var page = Math.floor(index / (this._sizes.rowsPerPage * this._sizes.columnsPerPage));
-                        this._scrollTo(page * this._sizes.viewportOffsetWidth, withoutAnimation);
-                    } else {
-                        var element = this._surfaceEl.children[index];
-                        var maxScrollPosition;
-                        if (index > 0) {
-                            maxScrollPosition = element.offsetTop - this._sizes.itemMarginTop;
-                        } else {
-                            maxScrollPosition = 0;
-                        }
-                        var minScrollPosition;
-                        if (index < this._surfaceEl.children.length - 1) {
-                            minScrollPosition = this._surfaceEl.children[index + 1].offsetTop - this._sizes.viewportOffsetHeight;
-                        } else {
-                            minScrollPosition = this._scrollLength - this._sizes.viewportOffsetHeight;
-                        }
-
-                        var newScrollPosition = this._zooming ? this._zoomPosition : this._scrollPosition;
-                        newScrollPosition = Math.max(newScrollPosition, minScrollPosition);
-                        newScrollPosition = Math.min(newScrollPosition, maxScrollPosition);
-                        this._scrollTo(newScrollPosition, withoutAnimation);
-                    }
-                },
-
-                _scrollTo: function NavBarContainer_scrollTo(targetScrollPosition, withoutAnimation) {
-                    this._measure();
-                    if (this.layout === _UI.Orientation.horizontal) {
-                        targetScrollPosition = Math.max(0, Math.min(this._scrollLength - this._sizes.viewportOffsetWidth, targetScrollPosition));
-                    } else {
-                        targetScrollPosition = Math.max(0, Math.min(this._scrollLength - this._sizes.viewportOffsetHeight, targetScrollPosition));
-                    }
-
-                    if (withoutAnimation) {
-                        if (Math.abs(this._scrollPosition - targetScrollPosition) > 1) {
-                            this._zooming = false;
-
-                            this._scrollPosition = targetScrollPosition;
-                            this._updatePageUI();
-                            if (!this._duringForceLayout) {
-                                this._closeSplitIfOpen();
-                            }
-
-                            var newScrollPos = {};
-                            newScrollPos[(this.layout === _UI.Orientation.horizontal ? "scrollLeft" : "scrollTop")] = targetScrollPosition;
-                            _ElementUtilities.setScrollPosition(this._viewportEl, newScrollPos);
-                        }
-                    } else {
-                        if ((!this._zooming && Math.abs(this._scrollPosition - targetScrollPosition) > 1) || (this._zooming && Math.abs(this._zoomPosition - targetScrollPosition) > 1)) {
-                            this._zoomPosition = targetScrollPosition;
-
-                            this._zooming = true;
-
-                            if (this.layout === _UI.Orientation.horizontal) {
-                                this._viewportEl.style.msScrollSnapType = "none";
-                                _ElementUtilities._zoomTo(this._viewportEl, { contentX: targetScrollPosition, contentY: 0, viewportX: 0, viewportY: 0 });
-                            } else {
-                                _ElementUtilities._zoomTo(this._viewportEl, { contentX: 0, contentY: targetScrollPosition, viewportX: 0, viewportY: 0 });
-                            }
-
-                            this._closeSplitIfOpen();
-                        }
-                    }
-                },
-
-                _MSManipulationStateChangedHandler: function NavBarContainer_MSManipulationStateChangedHandler(e) {
-                    this._currentManipulationState = e.currentState;
-
-                    if (e.currentState === e.MS_MANIPULATION_STATE_ACTIVE) {
-                        this._viewportEl.style.msScrollSnapType = "";
-                        this._zooming = false;
-                    }
-
-                    _Global.clearTimeout(this._manipulationStateTimeoutId);
-                    // The extra stop event is firing when an zoomTo is called during another zoomTo and
-                    // also the first zoomTo after a resize.
-                    if (e.currentState === e.MS_MANIPULATION_STATE_STOPPED) {
-                        this._manipulationStateTimeoutId = _Global.setTimeout(function () {
-                            this._viewportEl.style.msScrollSnapType = "";
-                            this._zooming = false;
-                            this._updateCurrentIndexIfPageChanged();
-                        }.bind(this), 100);
-                    }
-                },
-
-                _scrollHandler: function NavBarContainer_scrollHandler() {
-                    if (this._disposed) { return; }
-
-                    this._measured = false;
-                    if (!this._checkingScroll) {
-                        var that = this;
-                        this._checkingScroll = _BaseUtils._requestAnimationFrame(function () {
-                            if (that._disposed) { return; }
-                            that._checkingScroll = null;
-
-                            var newScrollPosition = _ElementUtilities.getScrollPosition(that._viewportEl)[(that.layout === _UI.Orientation.horizontal ? "scrollLeft" : "scrollTop")];
-                            if (newScrollPosition !== that._scrollPosition) {
-                                that._scrollPosition = newScrollPosition;
-                                that._closeSplitIfOpen();
-                            }
-                            that._updatePageUI();
-
-                            if (!that._zooming && that._currentManipulationState === MS_MANIPULATION_STATE_STOPPED) {
-                                that._updateCurrentIndexIfPageChanged();
-                            }
-                        });
-                    }
-                },
-
-                _updateCurrentIndexIfPageChanged: function NavBarContainer_updateCurrentIndexIfPageChanged() {
-                    // If you change pages via pagination arrows, mouse wheel, or panning we need to update the current
-                    // item to be the first item on the new page.
-                    if (this.layout === _UI.Orientation.horizontal) {
-                        this._measure();
-                        var currentPage = this._currentPage;
-                        var firstIndexOnPage = currentPage * this._sizes.rowsPerPage * this._sizes.columnsPerPage;
-                        var lastIndexOnPage = (currentPage + 1) * this._sizes.rowsPerPage * this._sizes.columnsPerPage - 1;
-
-                        if (this._keyboardBehavior.currentIndex < firstIndexOnPage || this._keyboardBehavior.currentIndex > lastIndexOnPage) {
-                            // Page change occurred.
-                            this._keyboardBehavior.currentIndex = firstIndexOnPage;
-
-                            if (this.element.contains(_Global.document.activeElement)) {
-                                this._keyboardBehavior._focus(this._keyboardBehavior.currentIndex);
-                            }
-                        }
-                    }
-                },
-
-                _measure: function NavBarContainer_measure() {
-                    if (!this._measured) {
-                        this._resizeImpl();
-                        this._writeProfilerMark("measure,StartTM");
-
-                        var sizes = this._sizes;
-
-                        sizes.rtl = _ElementUtilities._getComputedStyle(this._element).direction === "rtl";
-
-                        var itemCount = this._surfaceEl.children.length;
-                        if (itemCount > 0) {
-                            if (!this._sizes.itemMeasured) {
-                                this._writeProfilerMark("measureItem,StartTM");
-
-                                var elementToMeasure = this._surfaceEl.firstElementChild;
-                                // Clear inline margins set by NavBarContainer before measuring.
-                                elementToMeasure.style.margin = "";
-                                elementToMeasure.style.width = "";
-                                var elementComputedStyle = _ElementUtilities._getComputedStyle(elementToMeasure);
-                                sizes.itemOffsetWidth = parseFloat(_ElementUtilities._getComputedStyle(elementToMeasure).width);
-                                if (elementToMeasure.offsetWidth === 0) {
-                                    sizes.itemOffsetWidth = 0;
-                                }
-                                sizes.itemMarginLeft = parseFloat(elementComputedStyle.marginLeft);
-                                sizes.itemMarginRight = parseFloat(elementComputedStyle.marginRight);
-                                sizes.itemWidth = sizes.itemOffsetWidth + sizes.itemMarginLeft + sizes.itemMarginRight;
-                                sizes.itemOffsetHeight = parseFloat(_ElementUtilities._getComputedStyle(elementToMeasure).height);
-                                if (elementToMeasure.offsetHeight === 0) {
-                                    sizes.itemOffsetHeight = 0;
-                                }
-                                sizes.itemMarginTop = parseFloat(elementComputedStyle.marginTop);
-                                sizes.itemMarginBottom = parseFloat(elementComputedStyle.marginBottom);
-                                sizes.itemHeight = sizes.itemOffsetHeight + sizes.itemMarginTop + sizes.itemMarginBottom;
-                                if (sizes.itemOffsetWidth > 0 && sizes.itemOffsetHeight > 0) {
-                                    sizes.itemMeasured = true;
-                                }
-                                this._writeProfilerMark("measureItem,StopTM");
-                            }
-
-                            sizes.viewportOffsetWidth = parseFloat(_ElementUtilities._getComputedStyle(this._viewportEl).width);
-                            if (this._viewportEl.offsetWidth === 0) {
-                                sizes.viewportOffsetWidth = 0;
-                            }
-                            sizes.viewportOffsetHeight = parseFloat(_ElementUtilities._getComputedStyle(this._viewportEl).height);
-                            if (this._viewportEl.offsetHeight === 0) {
-                                sizes.viewportOffsetHeight = 0;
-                            }
-
-                            if (sizes.viewportOffsetWidth === 0 || sizes.itemOffsetHeight === 0) {
-                                this._measured = false;
-                            } else {
-                                this._measured = true;
-                            }
-
-                            if (this.layout === _UI.Orientation.horizontal) {
-                                this._scrollPosition = _ElementUtilities.getScrollPosition(this._viewportEl).scrollLeft;
-
-                                sizes.leadingEdge = this._leftArrowEl.offsetWidth + parseInt(_ElementUtilities._getComputedStyle(this._leftArrowEl).marginLeft) + parseInt(_ElementUtilities._getComputedStyle(this._leftArrowEl).marginRight);
-                                var usableSpace = sizes.viewportOffsetWidth - sizes.leadingEdge * 2;
-                                sizes.maxColumns = sizes.itemWidth ? Math.max(1, Math.floor(usableSpace / sizes.itemWidth)) : 1;
-                                sizes.rowsPerPage = Math.min(this.maxRows, Math.ceil(itemCount / sizes.maxColumns));
-                                sizes.columnsPerPage = Math.min(sizes.maxColumns, itemCount);
-                                sizes.pages = Math.ceil(itemCount / (sizes.columnsPerPage * sizes.rowsPerPage));
-                                sizes.trailingEdge = sizes.leadingEdge;
-                                sizes.extraSpace = usableSpace - (sizes.columnsPerPage * sizes.itemWidth);
-
-                                this._scrollLength = sizes.viewportOffsetWidth * sizes.pages;
-
-                                this._keyboardBehavior.fixedSize = sizes.rowsPerPage;
-                                this._keyboardBehavior.fixedDirection = _KeyboardBehavior._KeyboardBehavior.FixedDirection.height;
-
-                                this._surfaceEl.style.height = (sizes.itemHeight * sizes.rowsPerPage) + "px";
-                                this._surfaceEl.style.width = this._scrollLength + "px";
-                            } else {
-                                this._scrollPosition = this._viewportEl.scrollTop;
-
-                                sizes.leadingEdge = 0;
-                                sizes.rowsPerPage = itemCount;
-                                sizes.columnsPerPage = 1;
-                                sizes.pages = 1;
-                                sizes.trailingEdge = 0;
-
-                                // Reminder there is margin collapsing so just use scrollHeight instead of itemHeight * itemCount
-                                this._scrollLength = this._viewportEl.scrollHeight;
-
-                                this._keyboardBehavior.fixedSize = sizes.columnsPerPage;
-                                this._keyboardBehavior.fixedDirection = _KeyboardBehavior._KeyboardBehavior.FixedDirection.width;
-
-                                this._surfaceEl.style.height = "";
-                                this._surfaceEl.style.width = "";
-                            }
-
-                            this._updateGridStyles();
-                        } else {
-                            sizes.pages = 1;
-                            this._hasPreviousContent = false;
-                            this._hasNextContent = false;
-                            this._surfaceEl.style.height = "";
-                            this._surfaceEl.style.width = "";
-                        }
-
-                        this._writeProfilerMark("measure,StopTM");
-                    }
-                },
-
-                _updateGridStyles: function NavBarContainer_updateGridStyles() {
-                    var sizes = this._sizes;
-                    var itemCount = this._surfaceEl.children.length;
-
-                    for (var index = 0; index < itemCount; index++) {
-                        var itemEl = this._surfaceEl.children[index];
-
-                        var marginRight;
-                        var marginLeft;
-                        var width = "";
-
-                        if (this.layout === _UI.Orientation.horizontal) {
-                            var column = Math.floor(index / sizes.rowsPerPage);
-                            var isFirstColumnOnPage = column % sizes.columnsPerPage === 0;
-                            var isLastColumnOnPage = column % sizes.columnsPerPage === sizes.columnsPerPage - 1;
-
-                            var extraTrailingMargin = sizes.trailingEdge;
-                            if (this.fixedSize) {
-                                extraTrailingMargin += sizes.extraSpace;
-                            } else {
-                                var spaceToDistribute = sizes.extraSpace - (sizes.maxColumns - sizes.columnsPerPage) * sizes.itemWidth;
-                                width = (sizes.itemOffsetWidth + (spaceToDistribute / sizes.maxColumns)) + "px";
-                            }
-
-                            var extraMarginRight;
-                            var extraMarginLeft;
-
-                            if (sizes.rtl) {
-                                extraMarginRight = (isFirstColumnOnPage ? sizes.leadingEdge : 0);
-                                extraMarginLeft = (isLastColumnOnPage ? extraTrailingMargin : 0);
-                            } else {
-                                extraMarginRight = (isLastColumnOnPage ? extraTrailingMargin : 0);
-                                extraMarginLeft = (isFirstColumnOnPage ? sizes.leadingEdge : 0);
-                            }
-
-                            marginRight = extraMarginRight + sizes.itemMarginRight + "px";
-                            marginLeft = extraMarginLeft + sizes.itemMarginLeft + "px";
-                        } else {
-                            marginRight = "";
-                            marginLeft = "";
-                        }
-
-                        if (itemEl.style.marginRight !== marginRight) {
-                            itemEl.style.marginRight = marginRight;
-                        }
-                        if (itemEl.style.marginLeft !== marginLeft) {
-                            itemEl.style.marginLeft = marginLeft;
-                        }
-                        if (itemEl.style.width !== width) {
-                            itemEl.style.width = width;
-                        }
-                    }
-                },
-
-                _updatePageUI: function NavBarContainer_updatePageUI() {
-                    this._measure();
-                    var currentPage = this._currentPage;
-
-                    this._hasPreviousContent = (currentPage !== 0);
-                    this._hasNextContent = (currentPage < this._sizes.pages - 1);
-                    this._updateArrows();
-
-                    // Always output the pagination indicators so they reserves up space.
-                    if (this._indicatorCount !== this._sizes.pages) {
-                        this._indicatorCount = this._sizes.pages;
-                        this._pageindicatorsEl.innerHTML = new Array(this._sizes.pages + 1).join('<span class="' + NavBarContainer._ClassName.indicator + '"></span>');
-                    }
-
-                    for (var i = 0; i < this._pageindicatorsEl.children.length; i++) {
-                        if (i === currentPage) {
-                            _ElementUtilities.addClass(this._pageindicatorsEl.children[i], NavBarContainer._ClassName.currentindicator);
-                        } else {
-                            _ElementUtilities.removeClass(this._pageindicatorsEl.children[i], NavBarContainer._ClassName.currentindicator);
-                        }
-                    }
-
-                    if (this._sizes.pages > 1) {
-                        this._viewportEl.style.overflowX = this._panningDisabled ? "hidden" : "";
-                        this._pageindicatorsEl.style.visibility = "";
-                    } else {
-                        this._viewportEl.style.overflowX = "hidden";
-                        this._pageindicatorsEl.style.visibility = "hidden";
-                    }
-
-                    if (this._sizes.pages <= 1 || this._layout !== _UI.Orientation.horizontal) {
-                        this._ariaStartMarker.removeAttribute("aria-flowto");
-                        this._ariaEndMarker.removeAttribute("x-ms-aria-flowfrom");
-                    } else {
-                        var firstIndexOnCurrentPage = currentPage * this._sizes.rowsPerPage * this._sizes.columnsPerPage;
-                        var firstItem = this._surfaceEl.children[firstIndexOnCurrentPage].winControl._buttonEl;
-                        _ElementUtilities._ensureId(firstItem);
-                        this._ariaStartMarker.setAttribute("aria-flowto", firstItem.id);
-
-                        var lastIndexOnCurrentPage = Math.min(this._surfaceEl.children.length - 1, (currentPage + 1) * this._sizes.rowsPerPage * this._sizes.columnsPerPage - 1);
-                        var lastItem = this._surfaceEl.children[lastIndexOnCurrentPage].winControl._buttonEl;
-                        _ElementUtilities._ensureId(lastItem);
-                        this._ariaEndMarker.setAttribute("x-ms-aria-flowfrom", lastItem.id);
-                    }
-                },
-
-                _closeSplitIfOpen: function NavBarContainer_closeSplitIfOpen() {
-                    if (this._currentSplitNavItem) {
-                        if (this._currentSplitNavItem.splitOpened) {
-                            this._currentSplitNavItem._toggleSplit();
-                        }
-                        this._currentSplitNavItem = null;
-                    }
-                },
-
-                _updateArrows: function NavBarContainer_updateArrows() {
-                    var hasLeftContent = this._sizes.rtl ? this._hasNextContent : this._hasPreviousContent;
-                    var hasRightContent = this._sizes.rtl ? this._hasPreviousContent : this._hasNextContent;
-
-                    var that = this;
-                    // Previous and next are the arrows, not states. On mouse hover the arrows fade in immediately. If you
-                    // mouse out the arrows fade out after a delay. When you reach the last/first page, the corresponding
-                    // arrow fades out immediately as well.
-                    if ((this._mouseInViewport || this._panningDisabled) && hasLeftContent) {
-                        this._leftArrowWaitingToFadeOut && this._leftArrowWaitingToFadeOut.cancel();
-                        this._leftArrowWaitingToFadeOut = null;
-                        this._leftArrowFadeOut && this._leftArrowFadeOut.cancel();
-                        this._leftArrowFadeOut = null;
-                        this._leftArrowEl.style.visibility = '';
-                        this._leftArrowFadeIn = this._leftArrowFadeIn || Animations.fadeIn(this._leftArrowEl);
-                    } else {
-                        if (hasLeftContent) {
-                            // If we need a delayed fade out and we are already running a delayed fade out just use that one, don't extend it.
-                            // Otherwise create a delayed fade out.
-                            this._leftArrowWaitingToFadeOut = this._leftArrowWaitingToFadeOut || Promise.timeout(_TransitionAnimation._animationTimeAdjustment(buttonFadeDelay));
-                        } else {
-                            // If we need a immediate fade out and already have a delayed fade out cancel that one and create an immediate one.
-                            this._leftArrowWaitingToFadeOut && this._leftArrowWaitingToFadeOut.cancel();
-                            this._leftArrowWaitingToFadeOut = Promise.wrap();
-                        }
-                        this._leftArrowWaitingToFadeOut.then(function () {
-                            // After the delay cancel any fade in if running. If we already were fading out continue it otherwise start the fade out.
-                            this._leftArrowFadeIn && this._leftArrowFadeIn.cancel();
-                            this._leftArrowFadeIn = null;
-                            this._leftArrowFadeOut = this._leftArrowFadeOut || Animations.fadeOut(this._leftArrowEl).then(function () {
-                                that._leftArrowEl.style.visibility = 'hidden';
-                            });
-                        }.bind(this));
-                    }
-
-                    // Same pattern for Next arrow.
-                    if ((this._mouseInViewport || this._panningDisabled) && hasRightContent) {
-                        this._rightArrowWaitingToFadeOut && this._rightArrowWaitingToFadeOut.cancel();
-                        this._rightArrowWaitingToFadeOut = null;
-                        this._rightArrowFadeOut && this._rightArrowFadeOut.cancel();
-                        this._rightArrowFadeOut = null;
-                        this._rightArrowEl.style.visibility = '';
-                        this._rightArrowFadeIn = this._rightArrowFadeIn || Animations.fadeIn(this._rightArrowEl);
-                    } else {
-                        if (hasRightContent) {
-                            this._rightArrowWaitingToFadeOut = this._rightArrowWaitingToFadeOut || Promise.timeout(_TransitionAnimation._animationTimeAdjustment(buttonFadeDelay));
-                        } else {
-                            this._rightArrowWaitingToFadeOut && this._rightArrowWaitingToFadeOut.cancel();
-                            this._rightArrowWaitingToFadeOut = Promise.wrap();
-                        }
-                        this._rightArrowWaitingToFadeOut.then(function () {
-                            this._rightArrowFadeIn && this._rightArrowFadeIn.cancel();
-                            this._rightArrowFadeIn = null;
-                            this._rightArrowFadeOut = this._rightArrowFadeOut || Animations.fadeOut(this._rightArrowEl).then(function () {
-                                that._rightArrowEl.style.visibility = 'hidden';
-                            });
-                        }.bind(this));
-                    }
-                },
-
-                _navbarCommandInvokedHandler: function NavBarContainer_navbarCommandInvokedHandler(ev) {
-                    var srcElement = ev.target;
-                    var index = -1;
-                    while (srcElement) {
-                        index++;
-                        srcElement = srcElement.previousSibling;
-                    }
-
-                    this._fireEvent(NavBarContainer._EventName.invoked, {
-                        index: index,
-                        navbarCommand: ev.target.winControl,
-                        data: this._repeater ? this._repeater.data.getAt(index) : null
-                    });
-                },
-
-                _navbarCommandSplitToggleHandler: function NavBarContainer_navbarCommandSplitToggleHandler(ev) {
-                    var srcElement = ev.target;
-                    var index = -1;
-                    while (srcElement) {
-                        index++;
-                        srcElement = srcElement.previousSibling;
-                    }
-
-                    var navbarCommand = ev.target.winControl;
-
-                    this._closeSplitIfOpen();
-
-                    if (navbarCommand.splitOpened) {
-                        this._currentSplitNavItem = navbarCommand;
-                    }
-
-                    this._fireEvent(NavBarContainer._EventName.splitToggle, {
-                        opened: navbarCommand.splitOpened,
-                        index: index,
-                        navbarCommand: navbarCommand,
-                        data: this._repeater ? this._repeater.data.getAt(index) : null
-                    });
-                },
-
-                _fireEvent: function NavBarContainer_fireEvent(type, detail) {
-                    var event = _Global.document.createEvent("CustomEvent");
-                    event.initCustomEvent(type, true, false, detail);
-                    this.element.dispatchEvent(event);
-                },
-
-                _writeProfilerMark: function NavBarContainer_writeProfilerMark(text) {
-                    var message = "WinJS.UI.NavBarContainer:" + this._id + ":" + text;
-                    _WriteProfilerMark(message);
-                    _Log.log && _Log.log(message, null, "navbarcontainerprofiler");
-                },
-
-                dispose: function NavBarContainer_dispose() {
-                    /// <signature helpKeyword="WinJS.UI.NavBarContainer.dispose">
-                    /// <summary locid="WinJS.UI.NavBarContainer.dispose">
-                    /// Disposes this control.
-                    /// </summary>
-                    /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._disposed = true;
-
-                    if (this._appBarEl) {
-                        this._appBarEl.removeEventListener('beforeopen', this._closeSplitAndResetBound);
-                        this._appBarEl.removeEventListener('beforeopen', this._resizeImplBound);
-                    }
-
-                    Navigation.removeEventListener('navigated', this._closeSplitAndResetBound);
-
-                    this._leftArrowWaitingToFadeOut && this._leftArrowWaitingToFadeOut.cancel();
-                    this._leftArrowFadeOut && this._leftArrowFadeOut.cancel();
-                    this._leftArrowFadeIn && this._leftArrowFadeIn.cancel();
-                    this._rightArrowWaitingToFadeOut && this._rightArrowWaitingToFadeOut.cancel();
-                    this._rightArrowFadeOut && this._rightArrowFadeOut.cancel();
-                    this._rightArrowFadeIn && this._rightArrowFadeIn.cancel();
-
-                    _ElementUtilities._resizeNotifier.unsubscribe(this._element, this._boundResizeHandler);
-
-                    this._removeDataChangingEvents();
-                    this._removeDataChangedEvents();
-                }
-            }, {
-                // Names of classes used by the NavBarContainer.
-                _ClassName: {
-                    navbarcontainer: "win-navbarcontainer",
-                    pageindicators: "win-navbarcontainer-pageindicator-box",
-                    indicator: "win-navbarcontainer-pageindicator",
-                    currentindicator: "win-navbarcontainer-pageindicator-current",
-                    vertical: "win-navbarcontainer-vertical",
-                    horizontal: "win-navbarcontainer-horizontal",
-                    viewport: "win-navbarcontainer-viewport",
-                    surface: "win-navbarcontainer-surface",
-                    navarrow: "win-navbarcontainer-navarrow",
-                    navleftarrow: "win-navbarcontainer-navleft",
-                    navrightarrow: "win-navbarcontainer-navright"
-                },
-                _EventName: {
-                    invoked: eventNames.invoked,
-                    splitToggle: eventNames.splittoggle
-                }
-            });
-            _Base.Class.mix(NavBarContainer, _Control.DOMEventMixin);
-            return NavBarContainer;
-        })
-    });
-
-});
-
-
-define('require-style!less/styles-navbar',[],function(){});
-
-define('require-style!less/colors-navbar',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/NavBar',[
-    '../Core/_Global',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_Events',
-    '../Core/_WriteProfilerMark',
-    '../Promise',
-    '../Scheduler',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    "../_Accents",
-    './_LegacyAppBar',
-    './NavBar/_Command',
-    './NavBar/_Container',
-    'require-style!less/styles-navbar',
-    'require-style!less/colors-navbar'
-], function NavBarInit(_Global,_WinRT, _Base, _BaseUtils, _Events, _WriteProfilerMark, Promise, Scheduler, _ElementUtilities, _Hoverable, _Accents, _LegacyAppBar, _Command, _Container) {
-    "use strict";
-
-    _Accents.createAccentRule("html.win-hoverable .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover", [{ name: "background-color", value: _Accents.ColorTypes.listSelectHover }]);
-    _Accents.createAccentRule("html.win-hoverable .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover.win-pressed", [{ name: "background-color", value: _Accents.ColorTypes.listSelectPress }]);
-    _Accents.createAccentRule(".win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened", [{ name: "background-color", value: _Accents.ColorTypes.listSelectRest }]);
-    _Accents.createAccentRule(".win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened.win-pressed", [{ name: "background-color", value: _Accents.ColorTypes.listSelectPress }]);
-
-    var customLayout = "custom";
-
-    _Base.Namespace.define("WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.NavBar">
-        /// Displays navigation commands in a toolbar that the user can open or close.
-        /// </summary>
-        /// <compatibleWith platform="Windows" minVersion="8.1"/>
-        /// </field>
-        /// <icon src="ui_winjs.ui.navbar.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.navbar.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.NavBar">
-        /// <div data-win-control="WinJS.UI.NavBarContainer">
-        /// <div data-win-control="WinJS.UI.NavBarCommand" data-win-options="{location:'/pages/home/home.html',label:'Home',icon:WinJS.UI.AppBarIcon.home}"></div>
-        /// </div>
-        /// </div>]]></htmlSnippet>
-        /// <event name="beforeopen" locid="WinJS.UI.NavBar_e:beforeopen">Raised just before opening the NavBar.</event>
-        /// <event name="afteropen" locid="WinJS.UI.NavBar_e:afteropen">Raised immediately after an NavBar is fully opened.</event>
-        /// <event name="beforeclose" locid="WinJS.UI.NavBar_e:beforeclose">Raised just before closing the  NavBar.</event>
-        /// <event name="afterclose" locid="WinJS.UI.NavBar_e:afterclose">Raised immediately after the NavBar is fully closed.</event>
-        /// <event name="childrenprocessed" locid="WinJS.UI.NavBar_e:childrenprocessed">Fired when children of NavBar control have been processed from a WinJS.UI.processAll call.</event>
-        /// <part name="navbar" class="win-navbar" locid="WinJS.UI.NavBar_part:navbar">Styles the entire NavBar.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        NavBar: _Base.Namespace._lazy(function () {
-            var childrenProcessedEventName = "childrenprocessed";
-            var createEvent = _Events._createEventProperty;
-
-            var NavBar = _Base.Class.derive(_LegacyAppBar._LegacyAppBar, function NavBar_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.NavBar.NavBar">
-                /// <summary locid="WinJS.UI.NavBar.constructor">
-                /// Creates a new NavBar.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.UI.NavBar.constructor_p:element">
-                /// The DOM element that will host the new NavBar control.
-                /// </param>
-                /// <param name="options" type="Object" locid="WinJS.UI.NavBar.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control. Each property of the options object corresponds to one of the control's
-                /// properties or events.
-                /// </param>
-                /// <returns type="WinJS.UI.NavBar" locid="WinJS.UI.NavBar.constructor_returnValue">
-                /// The new NavBar control.
-                /// </returns>
-                /// <deprecated type="deprecate">
-                /// NavBar is deprecated and may not be available in future releases. 
-                /// Instead, use a WinJS SplitView to display navigation targets within the app.
-                /// </deprecated>
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </signature>
-
-                _ElementUtilities._deprecated(strings.navBarIsDeprecated);
-
-                options = options || {};
-
-                // Shallow copy object so we can modify it.
-                options = _BaseUtils._shallowCopy(options);
-
-                // Default to Placement = Top and Layout = Custom
-                options.placement = options.placement || "top";
-                options.layout = customLayout;
-                options.closedDisplayMode = options.closedDisplayMode || "minimal";
-
-                _LegacyAppBar._LegacyAppBar.call(this, element, options);
-
-                this._element.addEventListener("beforeopen", this._handleBeforeShow.bind(this));
-
-                _ElementUtilities.addClass(this.element, NavBar._ClassName.navbar);
-
-                if (_WinRT.Windows.ApplicationModel.DesignMode.designModeEnabled) {
-                    this._processChildren();
-                } else {
-                    Scheduler.schedule(this._processChildren.bind(this), Scheduler.Priority.idle, null, "WinJS.UI.NavBar.processChildren");
-                }
-            }, {
-
-                // Restrict values of closedDisplayMode to 'none' or 'minimal'
-
-                /// <field type="String" defaultValue="minimal" locid="WinJS.UI.NavBar.closedDisplayMode" helpKeyword="WinJS.UI.NavBar.closedDisplayMode" isAdvanced="true">
-                /// Gets/Sets how NavBar will display itself while hidden. Values are "none" and "minimal".
-                /// </field>
-                closedDisplayMode: {
-                    get: function () {
-                        return this._closedDisplayMode;
-                    },
-                    set: function (value) {
-                        var newValue = (value  === "none" ? "none" : "minimal");
-                        Object.getOwnPropertyDescriptor(_LegacyAppBar._LegacyAppBar.prototype, "closedDisplayMode").set.call(this, newValue);
-                        this._closedDisplayMode = newValue;
-                    },
-                },
-
-                /// <field type="Function" locid="WinJS.UI.NavBar.onchildrenprocessed" helpKeyword="WinJS.UI.NavBar.onchildrenprocessed">
-                /// Raised when children of NavBar control have been processed by a WinJS.UI.processAll call.
-                /// <compatibleWith platform="Windows" minVersion="8.1"/>
-                /// </field>
-                onchildrenprocessed: createEvent(childrenProcessedEventName),
-
-                _processChildren: function NavBar_processChildren() {
-                    // The NavBar control schedules processAll on its children at idle priority to avoid hurting startup
-                    // performance. If the NavBar is shown before the scheduler gets to the idle job, the NavBar will
-                    // immediately call processAll on its children. If your app needs the children to be processed before
-                    // the scheduled job executes, you may call processChildren to force the processAll call.
-                    if (!this._processed) {
-                        this._processed = true;
-
-                        this._writeProfilerMark("processChildren,StartTM");
-                        var that = this;
-                        var processed = Promise.as();
-                        if (this._processors) {
-                            this._processors.forEach(function (processAll) {
-                                for (var i = 0, len = that.element.children.length; i < len; i++) {
-                                    (function (child) {
-                                        processed = processed.then(function () {
-                                            processAll(child);
-                                        });
-                                    }(that.element.children[i]));
-                                }
-                            });
-                        }
-                        return processed.then(
-                            function () {
-                                that._writeProfilerMark("processChildren,StopTM");
-                                that._fireEvent(NavBar._EventName.childrenProcessed);
-                            },
-                            function () {
-                                that._writeProfilerMark("processChildren,StopTM");
-                                that._fireEvent(NavBar._EventName.childrenProcessed);
-                            }
-                        );
-                    }
-                    return Promise.wrap();
-                },
-
-                _show: function NavBar_show() {
-                    // Override _show to call processChildren first.
-                    //
-                    if (this.disabled) {
-                        return;
-                    }
-                    var that = this;
-                    this._processChildren().then(function () {
-                        _LegacyAppBar._LegacyAppBar.prototype._show.call(that);
-                    });
-                },
-
-                _handleBeforeShow: function NavBar_handleBeforeShow() {
-                    // Navbar needs to ensure its elements to have their correct height and width after _LegacyAppBar changes display="none"
-                    // to  display="" and _LegacyAppBar needs the elements to have their final height before it measures its own element height
-                    // to do the slide in animation over the correct amount of pixels.
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    var navbarcontainerEls = this.element.querySelectorAll('.win-navbarcontainer');
-                    for (var i = 0; i < navbarcontainerEls.length; i++) {
-                        navbarcontainerEls[i].winControl.forceLayout();
-                    }
-                },
-
-                _fireEvent: function NavBar_fireEvent(type, detail) {
-                    var event = _Global.document.createEvent("CustomEvent");
-                    event.initCustomEvent(type, true, false, detail || {});
-                    this.element.dispatchEvent(event);
-                },
-
-                _writeProfilerMark: function NavBar_writeProfilerMark(text) {
-                    _WriteProfilerMark("WinJS.UI.NavBar:" + this._id + ":" + text);
-                }
-            }, {
-                _ClassName: {
-                    navbar: "win-navbar"
-                },
-                _EventName: {
-                    childrenProcessed: childrenProcessedEventName
-                },
-                isDeclarativeControlContainer: _BaseUtils.markSupportedForProcessing(function (navbar, callback) {
-                    if (navbar._processed) {
-                        for (var i = 0, len = navbar.element.children.length; i < len; i++) {
-                            callback(navbar.element.children[i]);
-                        }
-                    } else {
-                        navbar._processors = navbar._processors || [];
-                        navbar._processors.push(callback);
-                    }
-                })
-            });
-
-            var strings = {
-                get navBarIsDeprecated() { return "NavBar is deprecated and may not be available in future releases. Instead, use a WinJS SplitView to display navigation targets within the app."; }
-            };
-
-            return NavBar;
-        })
-    });
-
-});
-
-define('require-style!less/styles-viewbox',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-// ViewBox control
-define('WinJS/Controls/ViewBox',[
-    '../Core/_Global',
-    '../Core/_Base',
-    '../Core/_BaseUtils',
-    '../Core/_ErrorFromName',
-    '../Core/_Resources',
-    '../Scheduler',
-    '../Utilities/_Control',
-    '../Utilities/_Dispose',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_Hoverable',
-    './ElementResizeInstrument',
-    'require-style!less/styles-viewbox'
-], function viewboxInit(_Global, _Base, _BaseUtils, _ErrorFromName, _Resources, Scheduler, _Control, _Dispose, _ElementUtilities, _Hoverable, _ElementResizeInstrument) {
-    "use strict";
-
-    _Base.Namespace.define("WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.ViewBox">
-        /// Scales a single child element to fill the available space without
-        /// resizing it. This control reacts to changes in the size of the container as well as
-        /// changes in size of the child element. For example, a media query may result in
-        /// a change in aspect ratio.
-        /// </summary>
-        /// </field>
-        /// <name locid="WinJS.UI.ViewBox_name">View Box</name>
-        /// <icon src="ui_winjs.ui.viewbox.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.viewbox.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.ViewBox"><div>ViewBox</div></div>]]></htmlSnippet>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        ViewBox: _Base.Namespace._lazy(function () {
-
-            var strings = {
-                get invalidViewBoxChildren() { return "ViewBox expects to be provided with only one child element"; },
-            };
-
-            var ViewBox = _Base.Class.define(function ViewBox_ctor(element) {
-                /// <signature helpKeyword="WinJS.UI.ViewBox.ViewBox">
-                /// <summary locid="WinJS.UI.ViewBox.constructor">Initializes a new instance of the ViewBox control</summary>
-                /// <param name="element" type="HTMLElement" domElement="true" mayBeNull="true" locid="WinJS.UI.ViewBox.constructor_p:element">
-                /// The DOM element that functions as the scaling box. This element fills 100% of the width and height allotted to it.
-                /// </param>
-                /// <param name="options" type="Object" optional="true" locid="WinJS.UI.ViewBox.constructor_p:options">
-                /// The set of options to be applied initially to the ViewBox control.
-                /// </param>
-                /// <returns type="WinJS.UI.ViewBox" locid="WinJS.UI.ViewBox.constructor_returnValue">A constructed ViewBox control.</returns>
-                /// </signature>
-                this._disposed = false;
-
-                this._element = element || _Global.document.createElement("div");
-                var box = this.element;
-                box.winControl = this;
-                _ElementUtilities.addClass(box, "win-disposable");
-                _ElementUtilities.addClass(box, "win-viewbox");
-
-                // Sign up for resize events.
-                this._handleResizeBound = this._handleResize.bind(this);
-                _ElementUtilities._resizeNotifier.subscribe(box, this._handleResizeBound);
-                this._elementResizeInstrument = new _ElementResizeInstrument._ElementResizeInstrument();
-                box.appendChild(this._elementResizeInstrument.element);
-                this._elementResizeInstrument.addEventListener("resize", this._handleResizeBound);
-                var that = this;
-                _ElementUtilities._inDom(box).then(function () {
-                    if (!that._disposed) {
-                        that._elementResizeInstrument.addedToDom();
-                    }
-                });
-
-                this.forceLayout();
-            }, {
-                _sizer: null,
-                _element: null,
-
-                /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.ViewBox.element" helpKeyword="WinJS.UI.ViewBox.element">
-                /// Gets the DOM element that functions as the scaling box.
-                /// </field>
-                element: {
-                    get: function () { return this._element; }
-                },
-
-                _rtl: {
-                    get: function () {
-                        return _ElementUtilities._getComputedStyle(this.element).direction === "rtl";
-                    }
-                },
-
-                _initialize: function () {
-                    var box = this.element;
-                    var children = Array.prototype.slice.call(box.children);
-
-                    // Make sure we contain our elementResizeInstrument. 
-                    if (children.indexOf(this._elementResizeInstrument.element) === -1) {
-                        box.appendChild(this._elementResizeInstrument.element);
-                    }
-
-                    // Make sure we contain a single sizer
-                    var that = this;
-                    if (children.indexOf(this._sizer) === -1) {
-                        var sizers = children.filter(function (element) {
-                            return (element !== that._elementResizeInstrument.element);
-                        });
-
-                        if (_BaseUtils.validation) {
-                            if (sizers.length !== 1) {
-                                throw new _ErrorFromName("WinJS.UI.ViewBox.InvalidChildren", strings.invalidViewBoxChildren);
-                            }
-                        }
-                        if (this._sizer) {
-                            this._sizer.onresize = null;
-                        }
-                        var sizer = sizers[0];
-                        this._sizer = sizer;
-
-                        if (box.clientWidth === 0 && box.clientHeight === 0) {
-                            var that = this;
-                            // Wait for the viewbox to get added to the DOM. It should be added
-                            // in the synchronous block in which _initialize was called.
-                            Scheduler.schedule(function ViewBox_async_initialize() {
-                                that._updateLayout();
-                            }, Scheduler.Priority.normal, null, "WinJS.UI.ViewBox._updateLayout");
-                        }
-                    }
-                },
-                _updateLayout: function () {
-                    var sizer = this._sizer;
-                    if (sizer) {
-                        var box = this.element;
-                        var w = sizer.clientWidth;
-                        var h = sizer.clientHeight;
-                        var bw = box.clientWidth;
-                        var bh = box.clientHeight;
-                        var wRatio = bw / w;
-                        var hRatio = bh / h;
-                        var mRatio = Math.min(wRatio, hRatio);
-                        var transX = Math.abs(bw - (w * mRatio)) / 2;
-                        var transY = Math.abs(bh - (h * mRatio)) / 2;
-                        var rtl = this._rtl;
-                        this._sizer.style[_BaseUtils._browserStyleEquivalents["transform"].scriptName] = "translate(" + (rtl ? "-" : "") + transX + "px," + transY + "px) scale(" + mRatio + ")";
-                        this._sizer.style[_BaseUtils._browserStyleEquivalents["transform-origin"].scriptName] = rtl ? "top right" : "top left";
-                    }
-
-                    this._layoutCompleteCallback();
-                },
-
-                _handleResize: function () {
-                    if (!this._resizing) {
-                        this._resizing = this._resizing || 0;
-                        this._resizing++;
-                        try {
-                            this._updateLayout();
-                        } finally {
-                            this._resizing--;
-                        }
-                    }
-                },
-
-                _layoutCompleteCallback: function () {
-                    // Overwritten by unit tests.
-                },
-
-                dispose: function () {
-                    /// <signature helpKeyword="WinJS.UI.ViewBox.dispose">
-                    /// <summary locid="WinJS.UI.ViewBox.dispose">
-                    /// Disposes this ViewBox.
-                    /// </summary>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-
-                    if (this.element) {
-                        _ElementUtilities._resizeNotifier.unsubscribe(this.element, this._handleResizeBound);
-                    }
-
-                    this._elementResizeInstrument.dispose();
-
-                    this._disposed = true;
-                    _Dispose.disposeSubTree(this._element);
-                },
-
-                forceLayout: function () {
-                    this._initialize();
-                    this._updateLayout();
-                }
-            });
-            _Base.Class.mix(ViewBox, _Control.DOMEventMixin);
-            return ViewBox;
-        })
-    });
-
-});
-
-
-define('require-style!less/styles-contentdialog',[],function(){});
-
-define('require-style!less/colors-contentdialog',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('WinJS/Controls/ContentDialog',[
-    '../Application',
-    '../Utilities/_Dispose',
-    '../_Accents',
-    '../Promise',
-    '../_Signal',
-    '../_LightDismissService',
-    '../Core/_BaseUtils',
-    '../Core/_Global',
-    '../Core/_WinRT',
-    '../Core/_Base',
-    '../Core/_Events',
-    '../Core/_ErrorFromName',
-    '../Core/_Resources',
-    '../Utilities/_Control',
-    '../Utilities/_ElementUtilities',
-    '../Utilities/_KeyboardInfo',
-    '../Utilities/_Hoverable',
-    '../Animations',
-    'require-style!less/styles-contentdialog',
-    'require-style!less/colors-contentdialog'
-], function contentDialogInit(Application, _Dispose, _Accents, Promise, _Signal, _LightDismissService, _BaseUtils, _Global, _WinRT, _Base, _Events, _ErrorFromName, _Resources, _Control, _ElementUtilities, _KeyboardInfo, _Hoverable, _Animations) {
-    "use strict";
-
-    _Accents.createAccentRule(".win-contentdialog-dialog", [{ name: "outline-color", value: _Accents.ColorTypes.accent }]);
-    
-    //
-    // Implementation Overview
-    //
-    // ContentDialog's responsibilities are divided into the following:
-    //
-    //   Show/hide state management
-    //     This involves firing the beforeshow, aftershow, beforehide, and afterhide events.
-    //     It also involves making sure the control behaves properly when things happen in a
-    //     variety of states such as:
-    //       - show is called while the control is already shown
-    //       - hide is called while the control is in the middle of showing
-    //       - dispose is called within a beforeshow event handler
-    //     The ContentDialog solves these problems by being implemented around a state machine.
-    //     The states are defined in a variable called *States* and the ContentDialog's *_setState*
-    //     method is used to change states. See the comments above the *States* variable for details.
-    //  
-    //   Modal
-    //     The ContentDialog is a modal. It must coordinate with other dismissables (e.g. Flyout,
-    //     AppBar). Specifically, it must coordinate moving focus as well as ensuring that it is
-    //     drawn at the proper z-index relative to the other dismissables. The ContentDialog
-    //     relies on the _LightDismissService for all of this coordination. The only pieces the
-    //     ContentDialog is responsible for are:
-    //       - Describing what happens when a light dismiss is triggered on the ContentDialog.
-    //       - Describing how the ContentDialog should take/restore focus when it becomes the
-    //         topmost dismissable.
-    //     Other functionality that the ContentDialog gets from the _LightDismissService is around
-    //     the eating of keyboard events. While a ContentDialog is shown, keyboard events should
-    //     not escape the ContentDialog. This prevents global hotkeys such as the WinJS BackButton's
-    //     global back hotkey from triggering while a ContentDialog is shown.
-    //
-    //   Positioning and sizing of the dialog
-    //     It was a goal of the ContentDialog's positioning and sizing implementation that the
-    //     dialog's position and size could respond to changes to the dialog's content without
-    //     the app having to be aware of or notify the dialog of the change. For example, suppose
-    //     the dialog is shown and the user expands an accordion control within the dialog. Now
-    //     that the dialog's content has changed size, the dialog should automatically adjust its
-    //     size and position.
-    //     To achieve this goal, the ContentDialog's positioning and sizing implementation is done
-    //     entirely in LESS/CSS rather than in JavaScript. At the time, there was no cross browser
-    //     element resize event so this was the only option. This solution resulted in LESS/CSS
-    //     that is quite tricky. See styles-contentdialog.less for details.
-    //
-    //   Responding to the input pane
-    //     The ContentDialog's general strategy for getting out of the way of the input pane is to
-    //     adhere to its normal positioning and sizing rules but to only use the visible portion
-    //     of the window rather than the entire height of the window.
-    //
-
-    _Base.Namespace.define("WinJS.UI", {
-        /// <field>
-        /// <summary locid="WinJS.UI.ContentDialog">
-        /// Displays a modal dialog which can display arbitrary HTML content.
-        /// </summary>
-        /// </field>
-        /// <icon src="ui_winjs.ui.contentdialog.12x12.png" width="12" height="12" />
-        /// <icon src="ui_winjs.ui.contentdialog.16x16.png" width="16" height="16" />
-        /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.ContentDialog"></div>]]></htmlSnippet>
-        /// <event name="beforeshow" locid="WinJS.UI.ContentDialog_e:beforeshow">Raised just before showing a dialog. Call preventDefault on this event to stop the dialog from being shown.</event>
-        /// <event name="aftershow" locid="WinJS.UI.ContentDialog_e:aftershow">Raised immediately after a dialog is fully shown.</event>
-        /// <event name="beforehide" locid="WinJS.UI.ContentDialog_e:beforehide">Raised just before hiding a dialog. Call preventDefault on this event to stop the dialog from being hidden.</event>
-        /// <event name="afterhide" locid="WinJS.UI.ContentDialog_e:afterhide">Raised immediately after a dialog is fully hidden.</event>
-        /// <part name="contentdialog" class="win-contentdialog" locid="WinJS.UI.ContentDialog_part:contentdialog">The entire ContentDialog control.</part>
-        /// <part name="contentdialog-backgroundoverlay" class="win-contentdialog-backgroundoverlay" locid="WinJS.UI.ContentDialog_part:contentdialog-backgroundoverlay">The full screen element which dims the content that is behind the dialog.</part>
-        /// <part name="contentdialog-dialog" class="win-contentdialog-dialog" locid="WinJS.UI.ContentDialog_part:contentdialog-dialog">The main element of the dialog which holds the dialog's title, content, and commands.</part>
-        /// <part name="contentdialog-title" class="win-contentdialog-title" locid="WinJS.UI.ContentDialog_part:contentdialog-title">The element which displays the dialog's title.</part>
-        /// <part name="contentdialog-content" class="win-contentdialog-content" locid="WinJS.UI.ContentDialog_part:contentdialog-content">The element which contains the dialog's custom content.</part>
-        /// <part name="contentdialog-commands" class="win-contentdialog-commands" locid="WinJS.UI.ContentDialog_part:contentdialog-commands">The element which contains the dialog's primary and secondary commands.</part>
-        /// <part name="contentdialog-primarycommand" class="win-contentdialog-primarycommand" locid="WinJS.UI.ContentDialog_part:contentdialog-primarycommand">The dialog's primary button.</part>
-        /// <part name="contentdialog-secondarycommand" class="win-contentdialog-secondarycommand" locid="WinJS.UI.ContentDialog_part:contentdialog-secondarycommand">The dialog's secondary button.</part>
-        /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-        /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-        ContentDialog: _Base.Namespace._lazy(function () {
-            var Strings = {
-                get duplicateConstruction() { return "Invalid argument: Controls may only be instantiated one time for each DOM element"; },
-                get controlDisposed() { return "Cannot interact with the control after it has been disposed"; },
-                get contentDialogAlreadyShowing() { return "Cannot show a ContentDialog if there is already a ContentDialog that is showing"; }
-            };
-            var DismissalResult = {
-                /// <field locid="WinJS.UI.ContentDialog.DismissalResult.none" helpKeyword="WinJS.UI.ContentDialog.DismissalResult.none">
-                /// The dialog was dismissed without the user selecting any of the commands. The user may have
-                /// dismissed the dialog by hitting the escape key or pressing the hardware back button.
-                /// </field>
-                none: "none",
-                /// <field locid="WinJS.UI.ContentDialog.DismissalResult.primary" helpKeyword="WinJS.UI.ContentDialog.DismissalResult.primary">
-                /// The user dismissed the dialog by pressing the primary command.
-                /// </field>
-                primary: "primary",
-                /// <field locid="WinJS.UI.ContentDialog.DismissalResult.secondary" helpKeyword="WinJS.UI.ContentDialog.DismissalResult.secondary">
-                /// The user dismissed the dialog by pressing the secondary command.
-                /// </field>
-                secondary: "secondary"
-            };
-            var ClassNames = {
-                contentDialog: "win-contentdialog",
-                backgroundOverlay: "win-contentdialog-backgroundoverlay",
-                dialog: "win-contentdialog-dialog",
-                title: "win-contentdialog-title",
-                content: "win-contentdialog-content",
-                commands: "win-contentdialog-commands",
-                primaryCommand: "win-contentdialog-primarycommand",
-                secondaryCommand: "win-contentdialog-secondarycommand",
-
-                _verticalAlignment: "win-contentdialog-verticalalignment",
-                _scroller: "win-contentdialog-scroller",
-                _column0or1: "win-contentdialog-column0or1",
-                _visible: "win-contentdialog-visible",
-                _tabStop: "win-contentdialog-tabstop",
-                _commandSpacer: "win-contentdialog-commandspacer",
-                _deviceFixedSupported: "win-contentdialog-devicefixedsupported"
-            };
-            var EventNames = {
-                beforeShow: "beforeshow",
-                afterShow: "aftershow",
-                beforeHide: "beforehide",
-                afterHide: "afterhide",
-            };
-            
-            var _supportsMsDeviceFixedCached;
-            function supportsMsDevicedFixed(dialogRoot) {
-                if (typeof _supportsMsDeviceFixedCached === "undefined") {
-                    var element = _Global.document.createElement("div");
-                    element.style.position = "-ms-device-fixed";
-                    _supportsMsDeviceFixedCached = (_ElementUtilities._getComputedStyle(element).position === "-ms-device-fixed");
-                }
-                return _supportsMsDeviceFixedCached;
-            }
-
-            // WinJS animation promises always complete successfully. This
-            // helper allows an animation promise to complete in the canceled state
-            // so that the success handler can be skipped when the animation is
-            // interrupted.
-            function cancelablePromise(animationPromise) {
-                return Promise._cancelBlocker(animationPromise, function () {
-                    animationPromise.cancel();
-                });
-            }
-
-            function onInputPaneShown(eventObject) {
-                /*jshint validthis: true */
-                eventObject.ensuredFocusedElementInView = true;
-                this.dialog._renderForInputPane(eventObject.occludedRect.height);
-            }
-
-            function onInputPaneHidden() {
-                /*jshint validthis: true */
-                this.dialog._clearInputPaneRendering();
-            }
-
-            // Noop function, used in the various states to indicate that they don't support a given
-            // message. Named with the somewhat cute name '_' because it reads really well in the states.
-
-            function _() { }
-
-            // Implementing the control as a state machine helps us correctly handle:
-            //   - re-entrancy while firing events
-            //   - calls into the control during asynchronous operations (e.g. animations)
-            //
-            // Many of the states do their "enter" work within a promise chain. The idea is that if
-            // the state is interrupted and exits, the rest of its work can be skipped by canceling
-            // the promise chain.
-            // An interesting detail is that anytime the state may call into app code (e.g. due to
-            // firing an event), the current promise must end and a new promise must be chained off of it.
-            // This is necessary because the app code may interact with the ContentDialog and cause it to
-            // change states. If we didn't create a new promise, then the very next line of code that runs
-            // after calling into app code may not be valid because the state may have exited. Starting a
-            // new promise after each call into app code prevents us from having to worry about this
-            // problem. In this configuration, when a promise's success handler runs, it guarantees that
-            // the state hasn't exited.
-            // For similar reasons, each of the promise chains created in "enter" starts off with a _Signal
-            // which is completed at the end of the "enter" function (this boilerplate is abstracted away by
-            // the "interruptible" function). The reason is that we don't want any of the code in "enter"
-            // to run until the promise chain has been stored in a variable. If we didn't do this (e.g. instead,
-            // started the promise chain with Promise.wrap()), then the "enter" code could trigger the "exit"
-            // function (via app code) before the promise chain had been stored in a variable. Under these
-            // circumstances, the promise chain would be uncancelable and so the "enter" work would be
-            // unskippable. This wouldn't be good when we needed the state to exit early.
-
-            // These two functions manage interruptible work promises (one creates them the other cancels
-            // them). They communicate with each other thru the _interruptibleWorkPromises property which
-            //  "interruptible" creates on your object.
-
-            function interruptible(object, workFn) {
-                object._interruptibleWorkPromises = object._interruptibleWorkPromises || [];
-                var workStoredSignal = new _Signal();
-                object._interruptibleWorkPromises.push(workFn(object, workStoredSignal.promise));
-                workStoredSignal.complete();
-            }
-
-            function cancelInterruptibles() {
-                /*jshint validthis: true */
-                (this._interruptibleWorkPromises || []).forEach(function (workPromise) {
-                    workPromise.cancel();
-                });
-            }
-
-            // Transitions:
-            //   When created, the control will take the following initialization transition:
-            //     Init -> Hidden
-            //   Following that, the life of the dialog will be dominated by the following 3
-            //   sequences of transitions. In geneneral, these sequences are uninterruptible.
-            //     Hidden -> BeforeShow -> Hidden (when preventDefault is called on beforeshow event)
-            //     Hidden -> BeforeShow -> Showing -> Shown
-            //     Shown -> BeforeHide -> Hiding -> Hidden
-            //     Shown -> BeforeHide -> Shown (when preventDefault is called on beforehide event)
-            //   However, any state can be interrupted to go to the Disposed state:
-            //     * -> Disposed
-            //
-            // interface IContentDialogState {
-            //     // Debugging
-            //     name: string;
-            //     // State lifecycle
-            //     enter(arg0);
-            //     exit();
-            //     // ContentDialog's public API surface
-            //     hidden: boolean;
-            //     show();
-            //     hide(dismissalResult);
-            //     // Events
-            //     onCommandClicked(dismissalResult);
-            //     onInputPaneShown(eventObject);
-            //     onInputPaneHidden();
-            //     // Provided by _setState for use within the state
-            //     dialog: WinJS.UI.ContentDialog;
-            // }
-
-            var States = {
-                // Initial state. Initializes state on the dialog shared by the various states.
-                Init: _Base.Class.define(null, {
-                    name: "Init",
-                    hidden: true,
-                    enter: function ContentDialog_InitState_enter() {
-                        var dialog = this.dialog;
-                        dialog._dismissable = new _LightDismissService.ModalElement({
-                            element: dialog._dom.root,
-                            tabIndex: dialog._dom.root.hasAttribute("tabIndex") ? dialog._dom.root.tabIndex : -1,
-                            onLightDismiss: function () {
-                                dialog.hide(DismissalResult.none);
-                            },
-                            onTakeFocus: function (useSetActive) {
-                                dialog._dismissable.restoreFocus() ||
-                                    _ElementUtilities._tryFocusOnAnyElement(dialog._dom.dialog, useSetActive);
-                            }
-                        });
-                        this.dialog._dismissedSignal = null; // The signal will be created on demand when show() is called
-                        this.dialog._setState(States.Hidden, false);
-                    },
-                    exit: _,
-                    show: function ContentDialog_InitState_show() {
-                        throw "It's illegal to call show on the Init state";
-                    },
-                    hide: _,
-                    onCommandClicked: _,
-                    onInputPaneShown: _,
-                    onInputPaneHidden: _
-                }),
-                // A rest state. The dialog is hidden and is waiting for the app to call show.
-                Hidden: _Base.Class.define(null, {
-                    name: "Hidden",
-                    hidden: true,
-                    enter: function ContentDialog_HiddenState_enter(showIsPending) {
-                        if (showIsPending) {
-                            this.show();
-                        }
-                    },
-                    exit: _,
-                    show: function ContentDialog_HiddenState_show() {
-                        var dismissedSignal = this.dialog._dismissedSignal = new _Signal(); // save the signal in case it changes when switching states
-                        this.dialog._setState(States.BeforeShow);
-                        return dismissedSignal.promise;
-                    },
-                    hide: _,
-                    onCommandClicked: _,
-                    onInputPaneShown: _,
-                    onInputPaneHidden: _
-                }),
-                // An event state. The dialog fires the beforeshow event.
-                BeforeShow: _Base.Class.define(null, {
-                    name: "BeforeShow",
-                    hidden: true,
-                    enter: function ContentDialog_BeforeShowState_enter() {
-                        interruptible(this, function (that, ready) {
-                            return ready.then(function () {
-                                return that.dialog._fireBeforeShow(); // Give opportunity for chain to be canceled when calling into app code
-                            }).then(function (shouldShow) {
-                                if (!shouldShow) {
-                                    that.dialog._cancelDismissalPromise(null); // Give opportunity for chain to be canceled when calling into app code
-                                }
-                                return shouldShow;
-                            }).then(function (shouldShow) {
-                                if (shouldShow) {
-                                    that.dialog._setState(States.Showing);
-                                } else {
-                                    that.dialog._setState(States.Hidden, false);
-                                }
-                            });
-                        });
-                    },
-                    exit: cancelInterruptibles,
-                    show: function ContentDialog_BeforeShowState_show() {
-                        return Promise.wrapError(new _ErrorFromName("WinJS.UI.ContentDialog.ContentDialogAlreadyShowing", Strings.contentDialogAlreadyShowing));
-                    },
-                    hide: _,
-                    onCommandClicked: _,
-                    onInputPaneShown: _,
-                    onInputPaneHidden: _
-                }),
-                // An animation/event state. The dialog plays its entrance animation and fires aftershow.
-                Showing: _Base.Class.define(null, {
-                    name: "Showing",
-                    hidden: {
-                        get: function ContentDialog_ShowingState_hidden_get() {
-                            return !!this._pendingHide;
-                        }
-                    },
-                    enter: function ContentDialog_ShowingState_enter() {
-                        interruptible(this, function (that, ready) {
-                            return ready.then(function () {
-                                that._pendingHide = null;
-                                _ElementUtilities.addClass(that.dialog._dom.root, ClassNames._visible);
-                                that.dialog._addExternalListeners();
-                                if (_KeyboardInfo._KeyboardInfo._visible) {
-                                    that.dialog._renderForInputPane();
-                                }
-                                _LightDismissService.shown(that.dialog._dismissable);
-                                return that.dialog._playEntranceAnimation();
-                            }).then(function () {
-                                that.dialog._fireEvent(EventNames.afterShow); // Give opportunity for chain to be canceled when calling into app code
-                            }).then(function () {
-                                that.dialog._setState(States.Shown, that._pendingHide);
-                            });
-                        });
-                    },
-                    exit: cancelInterruptibles,
-                    show: function ContentDialog_ShowingState_show() {
-                        if (this._pendingHide) {
-                            var dismissalResult = this._pendingHide.dismissalResult;
-                            this._pendingHide = null;
-                            return this.dialog._resetDismissalPromise(dismissalResult, new _Signal()).promise;
-                        } else {
-                            return Promise.wrapError(new _ErrorFromName("WinJS.UI.ContentDialog.ContentDialogAlreadyShowing", Strings.contentDialogAlreadyShowing));
-                        }
-                    },
-                    hide: function ContentDialog_ShowingState_hide(dismissalResult) {
-                        this._pendingHide = { dismissalResult: dismissalResult };
-                    },
-                    onCommandClicked: _,
-                    onInputPaneShown: onInputPaneShown,
-                    onInputPaneHidden: onInputPaneHidden
-                }),
-                // A rest state. The dialog is shown and is waiting for the user or the app to trigger hide.
-                Shown: _Base.Class.define(null, {
-                    name: "Shown",
-                    hidden: false,
-                    enter: function ContentDialog_ShownState_enter(pendingHide) {
-                         if (pendingHide) {
-                             this.hide(pendingHide.dismissalResult);
-                         }
-                    },
-                    exit: _,
-                    show: function ContentDialog_ShownState_show() {
-                        return Promise.wrapError(new _ErrorFromName("WinJS.UI.ContentDialog.ContentDialogAlreadyShowing", Strings.contentDialogAlreadyShowing));
-                    },
-                    hide: function ContentDialog_ShownState_hide(dismissalResult) {
-                        this.dialog._setState(States.BeforeHide, dismissalResult);
-                    },
-                    onCommandClicked: function ContentDialog_ShownState_onCommandClicked(dismissalResult) {
-                        this.hide(dismissalResult);
-                    },
-                    onInputPaneShown: onInputPaneShown,
-                    onInputPaneHidden: onInputPaneHidden
-                }),
-                // An event state. The dialog fires the beforehide event.
-                BeforeHide: _Base.Class.define(null, {
-                    name: "BeforeHide",
-                    hidden: false,
-                    enter: function ContentDialog_BeforeHideState_enter(dismissalResult) {
-                        interruptible(this, function (that, ready) {
-                            return ready.then(function () {
-                                return that.dialog._fireBeforeHide(dismissalResult); // Give opportunity for chain to be canceled when calling into app code
-                            }).then(function (shouldHide) {
-                                if (shouldHide) {
-                                    that.dialog._setState(States.Hiding, dismissalResult);
-                                } else {
-                                    that.dialog._setState(States.Shown, null);
-                                }
-                            });
-                        });
-                    },
-                    exit: cancelInterruptibles,
-                    show: function ContentDialog_BeforeHideState_show() {
-                        return Promise.wrapError(new _ErrorFromName("WinJS.UI.ContentDialog.ContentDialogAlreadyShowing", Strings.contentDialogAlreadyShowing));
-                    },
-                    hide: _,
-                    onCommandClicked: _,
-                    onInputPaneShown: onInputPaneShown,
-                    onInputPaneHidden: onInputPaneHidden
-                }),
-                // An animation/event state. The dialog plays the exit animation and fires the afterhide event.
-                Hiding: _Base.Class.define(null, {
-                    name: "Hiding",
-                    hidden: {
-                        get: function ContentDialog_HidingState_hidden_get() {
-                            return !this._showIsPending;
-                        }
-                    },
-                    enter: function ContentDialog_HidingState_enter(dismissalResult) {
-                        interruptible(this, function (that, ready) {
-                            return ready.then(function () {
-                                that._showIsPending = false;
-                                that.dialog._resetDismissalPromise(dismissalResult, null); // Give opportunity for chain to be canceled when calling into app code
-                            }).then(function () {
-                                return that.dialog._playExitAnimation();
-                            }).then(function () {
-                                that.dialog._removeExternalListeners();
-                                _LightDismissService.hidden(that.dialog._dismissable);
-                                _ElementUtilities.removeClass(that.dialog._dom.root, ClassNames._visible);
-                                that.dialog._clearInputPaneRendering();
-                                that.dialog._fireAfterHide(dismissalResult); // Give opportunity for chain to be canceled when calling into app code
-                            }).then(function () {
-                                that.dialog._setState(States.Hidden, that._showIsPending);
-                            });
-                        });
-                    },
-                    exit: cancelInterruptibles,
-                    show: function ContentDialog_HidingState_show() {
-                        if (this._showIsPending) {
-                            return Promise.wrapError(new _ErrorFromName("WinJS.UI.ContentDialog.ContentDialogAlreadyShowing", Strings.contentDialogAlreadyShowing));
-                        } else {
-                            this._showIsPending = true;
-                            this.dialog._dismissedSignal = new _Signal();
-                            return this.dialog._dismissedSignal.promise;
-                        }
-                    },
-                    hide: function ContentDialog_HidingState_hide(dismissalResult) {
-                        if (this._showIsPending) {
-                            this._showIsPending = false;
-                            this.dialog._resetDismissalPromise(dismissalResult, null);
-                        }
-                    },
-                    onCommandClicked: _,
-                    onInputPaneShown: _,
-                    onInputPaneHidden: _
-                }),
-                Disposed: _Base.Class.define(null, {
-                    name: "Disposed",
-                    hidden: true,
-                    enter: function ContentDialog_DisposedState_enter() {
-                        _LightDismissService.hidden(this.dialog._dismissable);
-                        this.dialog._removeExternalListeners();
-                        if (this.dialog._dismissedSignal) {
-                            this.dialog._dismissedSignal.error(new _ErrorFromName("WinJS.UI.ContentDialog.ControlDisposed", Strings.controlDisposed));
-                        }
-                    },
-                    exit: _,
-                    show: function ContentDialog_DisposedState_show() {
-                        return Promise.wrapError(new _ErrorFromName("WinJS.UI.ContentDialog.ControlDisposed", Strings.controlDisposed));
-                    },
-                    hide: _,
-                    onCommandClicked: _,
-                    onInputPaneShown: _,
-                    onInputPaneHidden: _
-                }),
-            };
-
-            var ContentDialog = _Base.Class.define(function ContentDialog_ctor(element, options) {
-                /// <signature helpKeyword="WinJS.UI.ContentDialog.ContentDialog">
-                /// <summary locid="WinJS.UI.ContentDialog.constructor">
-                /// Creates a new ContentDialog control.
-                /// </summary>
-                /// <param name="element" type="HTMLElement" domElement="true" isOptional="true" locid="WinJS.UI.ContentDialog.constructor_p:element">
-                /// The DOM element that hosts the ContentDialog control.
-                /// </param>
-                /// <param name="options" type="Object" isOptional="true" locid="WinJS.UI.ContentDialog.constructor_p:options">
-                /// An object that contains one or more property/value pairs to apply to the new control.
-                /// Each property of the options object corresponds to one of the control's properties or events.
-                /// Event names must begin with "on". For example, to provide a handler for the beforehide event,
-                /// add a property named "onbeforehide" to the options object and set its value to the event handler.
-                /// </param>
-                /// <returns type="WinJS.UI.ContentDialog" locid="WinJS.UI.ContentDialog.constructor_returnValue">
-                /// The new ContentDialog.
-                /// </returns>
-                /// </signature>
-
-                // Check to make sure we weren't duplicated
-                if (element && element.winControl) {
-                    throw new _ErrorFromName("WinJS.UI.ContentDialog.DuplicateConstruction", Strings.duplicateConstruction);
-                }
-                options = options || {};
-                
-                this._onInputPaneShownBound = this._onInputPaneShown.bind(this);
-                this._onInputPaneHiddenBound = this._onInputPaneHidden.bind(this);
-                this._onUpdateInputPaneRenderingBound = this._onUpdateInputPaneRendering.bind(this);
-
-                this._disposed = false;
-                this._currentFocus = null;
-                this._rendered = {
-                    registeredForResize: false,
-                    resizedForInputPane: false,
-                    top: "",
-                    bottom: ""
-                };
-
-                this._initializeDom(element || _Global.document.createElement("div"));
-                this._setState(States.Init);
-
-                this.title = "";
-                this.primaryCommandText = "";
-                this.primaryCommandDisabled = false;
-                this.secondaryCommandText = "";
-                this.secondaryCommandDisabled = false;
-
-                _Control.setOptions(this, options);
-            }, {
-                /// <field type="HTMLElement" domElement="true" readonly="true" hidden="true" locid="WinJS.UI.ContentDialog.element" helpKeyword="WinJS.UI.ContentDialog.element">
-                /// Gets the DOM element that hosts the ContentDialog control.
-                /// </field>
-                element: {
-                    get: function ContentDialog_element_get() {
-                        return this._dom.root;
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.ContentDialog.title" helpKeyword="WinJS.UI.ContentDialog.title">
-                /// The text displayed as the title of the dialog.
-                /// </field>
-                title: {
-                    get: function ContentDialog_title_get() {
-                        return this._title;
-                    },
-                    set: function ContentDialog_title_set(value) {
-                        value = value || "";
-                        if (this._title !== value) {
-                            this._title = value;
-                            this._dom.title.textContent = value;
-                            this._dom.title.style.display = value ? "" : "none";
-                        }
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.ContentDialog.primaryCommandText" helpKeyword="WinJS.UI.ContentDialog.primaryCommandText">
-                /// The text displayed on the primary command's button.
-                /// </field>
-                primaryCommandText: {
-                    get: function ContentDialog_primaryCommandText_get() {
-                        return this._primaryCommandText;
-                    },
-                    set: function ContentDialog_primaryCommandText_set(value) {
-                        value = value || "";
-                        if (this._primaryCommandText !== value) {
-                            this._primaryCommandText = value;
-                            this._dom.commands[0].textContent = value;
-                            this._updateCommandsUI();
-                        }
-                    }
-                },
-
-                /// <field type="String" locid="WinJS.UI.ContentDialog.secondaryCommandText" helpKeyword="WinJS.UI.ContentDialog.secondaryCommandText">
-                /// The text displayed on the secondary command's button.
-                /// </field>
-                secondaryCommandText: {
-                    get: function ContentDialog_secondaryCommandText_get() {
-                        return this._secondaryCommandText;
-                    },
-                    set: function ContentDialog_secondaryCommandText_set(value) {
-                        value = value || "";
-                        if (this._secondaryCommandText !== value) {
-                            this._secondaryCommandText = value;
-                            this._dom.commands[1].textContent = value;
-                            this._updateCommandsUI();
-                        }
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.ContentDialog.primaryCommandDisabled" helpKeyword="WinJS.UI.ContentDialog.primaryCommandDisabled">
-                /// Indicates whether the button representing the primary command is currently disabled.
-                /// </field>
-                primaryCommandDisabled: {
-                    get: function ContentDialog_primaryCommandDisabled_get() {
-                        return this._primaryCommandDisabled;
-                    },
-                    set: function ContentDialog_primaryCommandDisabled_set(value) {
-                        value = !!value;
-                        if (this._primaryCommandDisabled !== value) {
-                            this._primaryCommandDisabled = value;
-                            this._dom.commands[0].disabled = value;
-                        }
-                    }
-                },
-
-                /// <field type="Boolean" locid="WinJS.UI.ContentDialog.secondaryCommandDisabled" helpKeyword="WinJS.UI.ContentDialog.secondaryCommandDisabled">
-                /// Indicates whether the button representing the secondary command is currently disabled.
-                /// </field>
-                secondaryCommandDisabled: {
-                    get: function ContentDialog_secondaryCommandDisabled_get() {
-                        return this._secondaryCommandDisabled;
-                    },
-                    set: function ContentDialog_secondaryCommandDisabled_set(value) {
-                        value = !!value;
-                        if (this._secondaryCommandDisabled !== value) {
-                            this._secondaryCommandDisabled = value;
-                            this._dom.commands[1].disabled = value;
-                        }
-                    }
-                },
-
-                /// <field type="Boolean" readonly="true" hidden="true" locid="WinJS.UI.ContentDialog.hidden" helpKeyword="WinJS.UI.ContentDialog.hidden">
-                /// Gets or sets ContentDialog's visibility.
-                /// </field>
-                hidden: {
-                    get: function ContentDialog_hidden_get() {
-                        return this._state.hidden;
-                    },
-                    set: function ContentDialog_hidden_set(hidden) {
-                        if (!hidden && this._state.hidden) {
-                            var nop = function () {
-                            };
-                            // Show returns a promise. If hidden is set while the ContentDialog is disposed, show will return a promise
-                            // error which will be impossible to handle and it'll cause the app to terminate. We'll eat the promise returned by show 
-                            // to stop that from happening.
-                            this.show().done(nop, nop); 
-                        } else if (hidden && !this._state.hidden) {
-                            this.hide(DismissalResult.none);
-                        }
-                    }
-                },
-
-                dispose: function ContentDialog_dispose() {
-                    /// <signature helpKeyword="WinJS.UI.ContentDialog.dispose">
-                    /// <summary locid="WinJS.UI.ContentDialog.dispose">
-                    /// Disposes this control.
-                    /// </summary>
-                    /// </signature>
-                    if (this._disposed) {
-                        return;
-                    }
-                    this._setState(States.Disposed);
-                    this._disposed = true;
-                    _ElementUtilities._resizeNotifier.unsubscribe(this._dom.root, this._onUpdateInputPaneRenderingBound);
-                    _Dispose._disposeElement(this._dom.content);
-                },
-
-                show: function ContentDialog_show() {
-                    /// <signature helpKeyword="WinJS.UI.ContentDialog.show">
-                    /// <summary locid="WinJS.UI.ContentDialog.show">
-                    /// Shows the ContentDialog. Only one ContentDialog may be shown at a time. If another
-                    /// ContentDialog is already shown, this ContentDialog will remain hidden.
-                    /// </summary>
-                    /// <returns type="WinJS.Promise" locid="WinJS.UI.ContentDialog.show_returnValue">
-                    /// A promise which is successfully fulfilled when the dialog is dismissed. The
-                    /// completion value indicates the dialog's dismissal result. This may
-                    /// be 'primary', 'secondary', 'none', or whatever custom value was passed to hide.
-                    /// If this ContentDialog cannot be shown because a ContentDialog is already showing
-                    /// or the ContentDialog is disposed, then the return value is a promise which is in
-                    /// an error state. If preventDefault() is called on the beforeshow event, then this
-                    /// promise will be canceled.
-                    /// </returns>
-                    /// </signature>
-                    return this._state.show();
-                },
-
-                hide: function ContentDialog_hide(result) {
-                    /// <signature helpKeyword="WinJS.UI.ContentDialog.hide">
-                    /// <summary locid="WinJS.UI.ContentDialog.hide">
-                    /// Hides the ContentDialog.
-                    /// </summary>
-                    /// <param name="result" locid="WinJS.UI.ContentDialog.hide_p:result">
-                    /// A value indicating why the dialog is being hidden. The promise returned
-                    /// by show will be fulfilled with this value.
-                    /// </param>
-                    /// </signature>
-                    this._state.hide(result === undefined ? DismissalResult.none : result);
-                },
-
-                _initializeDom: function ContentDialog_initializeDom(root) {
-                    // Reparent the children of the root element into the content element.
-                    var contentEl = _Global.document.createElement("div");
-                    contentEl.className = ClassNames.content;
-                    _ElementUtilities._reparentChildren(root, contentEl);
-
-                    root.winControl = this;
-                    _ElementUtilities.addClass(root, ClassNames.contentDialog);
-                    _ElementUtilities.addClass(root, ClassNames._verticalAlignment);
-                    _ElementUtilities.addClass(root, "win-disposable");
-                    root.innerHTML =
-                        '<div class="' + ClassNames.backgroundOverlay + '"></div>' +
-                        '<div class="' + ClassNames._tabStop + '"></div>' +
-                        '<div tabindex="-1" role="dialog" class="' + ClassNames.dialog + '">' +
-                            '<h2 class="' + ClassNames.title + '" role="heading"></h2>' +
-                            '<div class="' + ClassNames._scroller + '"></div>' +
-                            '<div class="' + ClassNames.commands + '">' +
-                                '<button type="button" class="' + ClassNames._commandSpacer + ' win-button"></button>' +
-                                '<button type="button" class="' + ClassNames.primaryCommand + ' win-button"></button>' +
-                                '<button type="button" class="' + ClassNames.secondaryCommand + ' win-button"></button>' +
-                            '</div>' +
-                        '</div>' +
-                        '<div class="' + ClassNames._tabStop + '"></div>' +
-                        '<div class="' + ClassNames._column0or1 + '"></div>';
-
-                    var dom = {};
-                    dom.root = root;
-                    dom.backgroundOverlay = dom.root.firstElementChild;
-                    dom.startBodyTab = dom.backgroundOverlay.nextElementSibling;
-                    dom.dialog = dom.startBodyTab.nextElementSibling;
-                    dom.title = dom.dialog.firstElementChild;
-                    dom.scroller = dom.title.nextElementSibling;
-                    dom.commandContainer = dom.scroller.nextElementSibling;
-                    dom.commandSpacer = dom.commandContainer.firstElementChild;
-                    dom.commands = [];
-                    dom.commands.push(dom.commandSpacer.nextElementSibling);
-                    dom.commands.push(dom.commands[0].nextElementSibling);
-                    dom.endBodyTab = dom.dialog.nextElementSibling;
-                    dom.content = contentEl;
-                    this._dom = dom;
-
-                    // Put the developer's content into the scroller
-                    dom.scroller.appendChild(dom.content);
-
-                    _ElementUtilities._ensureId(dom.title);
-                    _ElementUtilities._ensureId(dom.startBodyTab);
-                    _ElementUtilities._ensureId(dom.endBodyTab);
-                    dom.dialog.setAttribute("aria-labelledby", dom.title.id);
-                    dom.startBodyTab.setAttribute("x-ms-aria-flowfrom", dom.endBodyTab.id);
-                    dom.endBodyTab.setAttribute("aria-flowto", dom.startBodyTab.id);
-                    this._updateTabIndices();
-                    
-                    dom.root.addEventListener("keydown", this._onKeyDownEnteringElement.bind(this), true);
-                    _ElementUtilities._addEventListener(dom.root, "pointerdown", this._onPointerDown.bind(this));
-                    _ElementUtilities._addEventListener(dom.root, "pointerup", this._onPointerUp.bind(this));
-                    dom.root.addEventListener("click", this._onClick.bind(this));
-                    _ElementUtilities._addEventListener(dom.startBodyTab, "focusin", this._onStartBodyTabFocusIn.bind(this));
-                    _ElementUtilities._addEventListener(dom.endBodyTab, "focusin", this._onEndBodyTabFocusIn.bind(this));
-                    dom.commands[0].addEventListener("click", this._onCommandClicked.bind(this, DismissalResult.primary));
-                    dom.commands[1].addEventListener("click", this._onCommandClicked.bind(this, DismissalResult.secondary));
-                    
-                    if (supportsMsDevicedFixed()) {
-                        _ElementUtilities.addClass(dom.root, ClassNames._deviceFixedSupported);
-                    }
-                },
-
-                _updateCommandsUI: function ContentDialog_updateCommandsUI() {
-                    this._dom.commands[0].style.display = this.primaryCommandText ? "" : "none";
-                    this._dom.commands[1].style.display = this.secondaryCommandText ? "" : "none";
-
-                    // commandSpacer's purpose is to ensure that when only 1 button is shown, that button takes up half
-                    // the width of the dialog and is right-aligned. It works by:
-                    // - When only one command is shown:
-                    //   - Coming before the other command in the DOM (so the other command will look right-aligned)
-                    //   - Having the same flex-grow as the other command (so it occupies half of the space)
-                    //   - Having visibility: hidden (so it's invisible but it takes up space)
-                    // - When both commands are shown:
-                    //   - Having display: none (so it doesn't occupy any space and the two shown commands each take up half the dialog)
-                    // - When 0 commands are shown:
-                    //   - Having display: none (so the commands area takes up no space)
-                    this._dom.commandSpacer.style.display = this.primaryCommandText && !this.secondaryCommandText || !this.primaryCommandText && this.secondaryCommandText ? "" : "none";
-                },
-
-                // _updateTabIndices and _updateTabIndicesImpl are used in tests
-                _updateTabIndices: function ContentDialog_updateTabIndices() {
-                    if (!this._updateTabIndicesThrottled) {
-                        this._updateTabIndicesThrottled = _BaseUtils._throttledFunction(100, this._updateTabIndicesImpl.bind(this));
-                    }
-                    this._updateTabIndicesThrottled();
-                },
-                _updateTabIndicesImpl: function ContentDialog_updateTabIndicesImpl() {
-                    var tabIndex = _ElementUtilities._getHighAndLowTabIndices(this._dom.content);
-                    this._dom.startBodyTab.tabIndex = tabIndex.lowest;
-                    this._dom.commands[0].tabIndex = tabIndex.highest;
-                    this._dom.commands[1].tabIndex = tabIndex.highest;
-                    this._dom.endBodyTab.tabIndex = tabIndex.highest;
-                },
-
-                _elementInDialog: function ContentDialog_elementInDialog(element) {
-                    return this._dom.dialog.contains(element) || element === this._dom.startBodyTab || element === this._dom.endBodyTab;
-                },
-
-                _onCommandClicked: function ContentDialog_onCommandClicked(dismissalResult) {
-                    this._state.onCommandClicked(dismissalResult);
-                },
-
-                _onPointerDown: function ContentDialog_onPointerDown(eventObject) {
-                    eventObject.stopPropagation();
-                    if (!this._elementInDialog(eventObject.target)) {
-                        eventObject.preventDefault();
-                    }
-                },
-
-                _onPointerUp: function ContentDialog_onPointerUp(eventObject) {
-                    eventObject.stopPropagation();
-                    if (!this._elementInDialog(eventObject.target)) {
-                        eventObject.preventDefault();
-                    }
-                },
-
-                _onClick: function ContentDialog_onClick(eventObject) {
-                    eventObject.stopPropagation();
-                    if (!this._elementInDialog(eventObject.target)) {
-                        eventObject.preventDefault();
-                    }
-                },
-                
-                _onKeyDownEnteringElement: function ContentDialog_onKeyDownEnteringElement(eventObject) {
-                    if (eventObject.keyCode === _ElementUtilities.Key.tab) {
-                        this._updateTabIndices();
-                    }
-                },
-
-                _onStartBodyTabFocusIn: function ContentDialog_onStartBodyTabFocusIn() {
-                    _ElementUtilities._focusLastFocusableElement(this._dom.dialog);
-                },
-
-                _onEndBodyTabFocusIn: function ContentDialog_onEndBodyTabFocusIn() {
-                    _ElementUtilities._focusFirstFocusableElement(this._dom.dialog);
-                },
-
-                _onInputPaneShown: function ContentDialog_onInputPaneShown(eventObject) {
-                    this._state.onInputPaneShown(eventObject.detail.originalEvent);
-                },
-
-                _onInputPaneHidden: function ContentDialog_onInputPaneHidden() {
-                    this._state.onInputPaneHidden();
-                },
-                
-                _onUpdateInputPaneRendering: function ContentDialog_onUpdateInputPaneRendering() {
-                    // When the dialog and the input pane are shown and the window resizes, this may
-                    // change the visual document's dimensions so we may need to update the rendering
-                    // of the dialog.
-                    this._renderForInputPane();
-                },
-
-                //
-                // Methods called by states
-                //
-
-                _setState: function ContentDialog_setState(NewState, arg0) {
-                    if (!this._disposed) {
-                        this._state && this._state.exit();
-                        this._state = new NewState();
-                        this._state.dialog = this;
-                        this._state.enter(arg0);
-                    }
-                },
-
-                // Calls into arbitrary app code
-                _resetDismissalPromise: function ContentDialog_resetDismissalPromise(dismissalResult, newSignal) {
-                    var dismissedSignal = this._dismissedSignal;
-                    var newDismissedSignal = this._dismissedSignal = newSignal;
-                    dismissedSignal.complete({ result: dismissalResult });
-                    return newDismissedSignal;
-                },
-
-                // Calls into arbitrary app code
-                _cancelDismissalPromise: function ContentDialog_cancelDismissalPromise(newSignal) {
-                    var dismissedSignal = this._dismissedSignal;
-                    var newDismissedSignal = this._dismissedSignal = newSignal;
-                    dismissedSignal.cancel();
-                    return newDismissedSignal;
-                },
-
-                // Calls into arbitrary app code
-                _fireEvent: function ContentDialog_fireEvent(eventName, options) {
-                    options = options || {};
-                    var detail = options.detail || null;
-                    var cancelable = !!options.cancelable;
-
-                    var eventObject = _Global.document.createEvent("CustomEvent");
-                    eventObject.initCustomEvent(eventName, true, cancelable, detail);
-                    return this._dom.root.dispatchEvent(eventObject);
-                },
-
-                // Calls into arbitrary app code
-                _fireBeforeShow: function ContentDialog_fireBeforeShow() {
-                    return this._fireEvent(EventNames.beforeShow, {
-                        cancelable: true
-                    });
-                },
-
-                // Calls into arbitrary app code
-                _fireBeforeHide: function ContentDialog_fireBeforeHide(dismissalResult) {
-                    return this._fireEvent(EventNames.beforeHide, {
-                        detail: { result: dismissalResult },
-                        cancelable: true
-                    });
-                },
-
-                // Calls into arbitrary app code
-                _fireAfterHide: function ContentDialog_fireAfterHide(dismissalResult) {
-                    this._fireEvent(EventNames.afterHide, {
-                        detail: { result: dismissalResult }
-                    });
-                },
-
-                _playEntranceAnimation: function ContentDialog_playEntranceAnimation() {
-                    return cancelablePromise(_Animations.fadeIn(this._dom.root));
-                },
-
-                _playExitAnimation: function ContentDialog_playExitAnimation() {
-                    return cancelablePromise(_Animations.fadeOut(this._dom.root));
-                },
-
-                _addExternalListeners: function ContentDialog_addExternalListeners() {
-                    _ElementUtilities._inputPaneListener.addEventListener(this._dom.root, "showing", this._onInputPaneShownBound);
-                    _ElementUtilities._inputPaneListener.addEventListener(this._dom.root, "hiding", this._onInputPaneHiddenBound);
-                },
-
-                _removeExternalListeners: function ContentDialog_removeExternalListeners() {
-                    _ElementUtilities._inputPaneListener.removeEventListener(this._dom.root, "showing", this._onInputPaneShownBound);
-                    _ElementUtilities._inputPaneListener.removeEventListener(this._dom.root, "hiding", this._onInputPaneHiddenBound);
-                },
-                
-                _shouldResizeForInputPane: function ContentDialog_shouldResizeForInputPane() {
-                    if (this._rendered.resizedForInputPane) {
-                        // Dialog has already resized for the input pane so it should continue adjusting
-                        // its size as the input pane occluded rect changes.
-                        return true;
-                    } else {
-                        // Dialog is at its default size. It should maintain its size as long as the
-                        // input pane doesn't occlude it. This makes it so the dialog visual doesn't
-                        // jump unnecessarily when the input pane shows if it won't occlude the dialog.
-                        var dialogRect = this._dom.dialog.getBoundingClientRect();
-                        var willInputPaneOccludeDialog =
-                            _KeyboardInfo._KeyboardInfo._visibleDocTop > dialogRect.top ||
-                            _KeyboardInfo._KeyboardInfo._visibleDocBottom < dialogRect.bottom;
-                        
-                        return willInputPaneOccludeDialog;
-                    }
-                },
-                
-                // This function assumes it's in an environment that supports -ms-device-fixed.
-                _renderForInputPane: function ContentDialog_renderForInputPane() {
-                    var rendered = this._rendered;
-                    
-                    if (!rendered.registeredForResize) {
-                        _ElementUtilities._resizeNotifier.subscribe(this._dom.root, this._onUpdateInputPaneRenderingBound);
-                        rendered.registeredForResize = true;
-                    }
-                    
-                    if (this._shouldResizeForInputPane()) {
-                        // Lay the dialog out using its normal rules but restrict it to the *visible document*
-                        // rather than the *visual viewport*.
-                        // Essentially, the dialog should be in the center of the part of the app that the user
-                        // can see regardless of the state of the input pane.
-                        
-                        var top = _KeyboardInfo._KeyboardInfo._visibleDocTop + "px";
-                        var bottom = _KeyboardInfo._KeyboardInfo._visibleDocBottomOffset + "px";
-                        
-                        if (rendered.top !== top) {
-                            this._dom.root.style.top = top;
-                            rendered.top = top;
-                        }
-                        
-                        if (rendered.bottom !== bottom) {
-                            this._dom.root.style.bottom = bottom;
-                            rendered.bottom = bottom;
-                        }
-                        
-                        if (!rendered.resizedForInputPane) {
-                            // Put title into scroller so there's more screen real estate for the content
-                            this._dom.scroller.insertBefore(this._dom.title, this._dom.content);
-                            this._dom.root.style.height = "auto"; // Height will be determined by setting top & bottom
-                            // Ensure activeElement is scrolled into view
-                            var activeElement = _Global.document.activeElement;
-                            if (activeElement && this._dom.scroller.contains(activeElement)) {
-                                activeElement.scrollIntoView();
-                            }
-                            rendered.resizedForInputPane = true;
-                        }
-                    }
-                },
-
-                _clearInputPaneRendering: function ContentDialog_clearInputPaneRendering() {
-                    var rendered = this._rendered;
-                    
-                    if (rendered.registeredForResize) {
-                        _ElementUtilities._resizeNotifier.unsubscribe(this._dom.root, this._onUpdateInputPaneRenderingBound);
-                        rendered.registeredForResize = false;
-                    }
-                    
-                    if (rendered.top !== "") {
-                        this._dom.root.style.top = "";
-                        rendered.top = "";
-                    }
-                    
-                    if (rendered.bottom !== "") {
-                        this._dom.root.style.bottom = "";
-                        rendered.bottom = "";
-                    }
-                    
-                    if (rendered.resizedForInputPane) {
-                        // Make sure the title isn't in the scroller
-                        this._dom.dialog.insertBefore(this._dom.title, this._dom.scroller);
-                        this._dom.root.style.height = "";
-                        rendered.resizedForInputPane = false;
-                    }
-                }
-            }, {
-                /// <field locid="WinJS.UI.ContentDialog.DismissalResult" helpKeyword="WinJS.UI.ContentDialog.DismissalResult">
-                /// Specifies the result of dismissing the ContentDialog.
-                /// </field>
-                DismissalResult: DismissalResult,
-
-                _ClassNames: ClassNames
-            });
-            _Base.Class.mix(ContentDialog, _Events.createEventProperties(
-                "beforeshow",
-                "aftershow",
-                "beforehide",
-                "afterhide"
-            ));
-            _Base.Class.mix(ContentDialog, _Control.DOMEventMixin);
-            return ContentDialog;
-        })
-    });
-});
-
-
-define('require-style!less/styles-splitview',[],function(){});
-
-define('require-style!less/colors-splitview',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <reference path="../../../../../typings/require.d.ts" />
-define('WinJS/Controls/SplitView/_SplitView',["require", "exports", '../../Animations', '../../Core/_Base', '../../Core/_BaseUtils', '../../Utilities/_Control', '../../Utilities/_Dispose', '../../Utilities/_ElementUtilities', '../../Core/_ErrorFromName', '../../Core/_Events', '../../Core/_Global', '../../_LightDismissService', '../../Utilities/_OpenCloseMachine'], function (require, exports, Animations, _Base, _BaseUtils, _Control, _Dispose, _ElementUtilities, _ErrorFromName, _Events, _Global, _LightDismissService, _OpenCloseMachine) {
-    require(["require-style!less/styles-splitview"]);
-    require(["require-style!less/colors-splitview"]);
-    "use strict";
-    var transformNames = _BaseUtils._browserStyleEquivalents["transform"];
-    var Strings = {
-        get duplicateConstruction() {
-            return "Invalid argument: Controls may only be instantiated one time for each DOM element";
-        }
-    };
-    var ClassNames = {
-        splitView: "win-splitview",
-        pane: "win-splitview-pane",
-        content: "win-splitview-content",
-        // closed/opened
-        paneClosed: "win-splitview-pane-closed",
-        paneOpened: "win-splitview-pane-opened",
-        _panePlaceholder: "win-splitview-paneplaceholder",
-        _paneOutline: "win-splitview-paneoutline",
-        _tabStop: "win-splitview-tabstop",
-        _paneWrapper: "win-splitview-panewrapper",
-        _contentWrapper: "win-splitview-contentwrapper",
-        _animating: "win-splitview-animating",
-        // placement
-        _placementLeft: "win-splitview-placementleft",
-        _placementRight: "win-splitview-placementright",
-        _placementTop: "win-splitview-placementtop",
-        _placementBottom: "win-splitview-placementbottom",
-        // closed display mode
-        _closedDisplayNone: "win-splitview-closeddisplaynone",
-        _closedDisplayInline: "win-splitview-closeddisplayinline",
-        // opened display mode
-        _openedDisplayInline: "win-splitview-openeddisplayinline",
-        _openedDisplayOverlay: "win-splitview-openeddisplayoverlay"
-    };
-    var EventNames = {
-        beforeOpen: "beforeopen",
-        afterOpen: "afteropen",
-        beforeClose: "beforeclose",
-        afterClose: "afterclose"
-    };
-    var Dimension = {
-        width: "width",
-        height: "height"
-    };
-    var ClosedDisplayMode = {
-        /// <field locid="WinJS.UI.SplitView.ClosedDisplayMode.none" helpKeyword="WinJS.UI.SplitView.ClosedDisplayMode.none">
-        /// When the pane is closed, it is not visible and doesn't take up any space.
-        /// </field>
-        none: "none",
-        /// <field locid="WinJS.UI.SplitView.ClosedDisplayMode.inline" helpKeyword="WinJS.UI.SplitView.ClosedDisplayMode.inline">
-        /// When the pane is closed, it occupies space leaving less room for the SplitView's content.
-        /// </field>
-        inline: "inline"
-    };
-    var OpenedDisplayMode = {
-        /// <field locid="WinJS.UI.SplitView.OpenedDisplayMode.inline" helpKeyword="WinJS.UI.SplitView.OpenedDisplayMode.inline">
-        /// When the pane is open, it occupies space leaving less room for the SplitView's content.
-        /// </field>
-        inline: "inline",
-        /// <field locid="WinJS.UI.SplitView.OpenedDisplayMode.overlay" helpKeyword="WinJS.UI.SplitView.OpenedDisplayMode.overlay">
-        /// When the pane is open, it doesn't take up any space and it is light dismissable.
-        /// </field>
-        overlay: "overlay"
-    };
-    var PanePlacement = {
-        /// <field locid="WinJS.UI.SplitView.PanePlacement.left" helpKeyword="WinJS.UI.SplitView.PanePlacement.left">
-        /// Pane is positioned left of the SplitView's content.
-        /// </field>
-        left: "left",
-        /// <field locid="WinJS.UI.SplitView.PanePlacement.right" helpKeyword="WinJS.UI.SplitView.PanePlacement.right">
-        /// Pane is positioned right of the SplitView's content.
-        /// </field>
-        right: "right",
-        /// <field locid="WinJS.UI.SplitView.PanePlacement.top" helpKeyword="WinJS.UI.SplitView.PanePlacement.top">
-        /// Pane is positioned above the SplitView's content.
-        /// </field>
-        top: "top",
-        /// <field locid="WinJS.UI.SplitView.PanePlacement.bottom" helpKeyword="WinJS.UI.SplitView.PanePlacement.bottom">
-        /// Pane is positioned below the SplitView's content.
-        /// </field>
-        bottom: "bottom"
-    };
-    var closedDisplayModeClassMap = {};
-    closedDisplayModeClassMap[ClosedDisplayMode.none] = ClassNames._closedDisplayNone;
-    closedDisplayModeClassMap[ClosedDisplayMode.inline] = ClassNames._closedDisplayInline;
-    var openedDisplayModeClassMap = {};
-    openedDisplayModeClassMap[OpenedDisplayMode.overlay] = ClassNames._openedDisplayOverlay;
-    openedDisplayModeClassMap[OpenedDisplayMode.inline] = ClassNames._openedDisplayInline;
-    var panePlacementClassMap = {};
-    panePlacementClassMap[PanePlacement.left] = ClassNames._placementLeft;
-    panePlacementClassMap[PanePlacement.right] = ClassNames._placementRight;
-    panePlacementClassMap[PanePlacement.top] = ClassNames._placementTop;
-    panePlacementClassMap[PanePlacement.bottom] = ClassNames._placementBottom;
-    // Versions of add/removeClass that are no ops when called with falsy class names.
-    function addClass(element, className) {
-        className && _ElementUtilities.addClass(element, className);
-    }
-    function removeClass(element, className) {
-        className && _ElementUtilities.removeClass(element, className);
-    }
-    function rectToThickness(rect, dimension) {
-        return (dimension === Dimension.width) ? {
-            content: rect.contentWidth,
-            total: rect.totalWidth
-        } : {
-            content: rect.contentHeight,
-            total: rect.totalHeight
-        };
-    }
-    /// <field>
-    /// <summary locid="WinJS.UI.SplitView">
-    /// Displays a SplitView which renders a collapsable pane next to arbitrary HTML content.
-    /// </summary>
-    /// </field>
-    /// <icon src="ui_winjs.ui.splitview.12x12.png" width="12" height="12" />
-    /// <icon src="ui_winjs.ui.splitview.16x16.png" width="16" height="16" />
-    /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.SplitView"></div>]]></htmlSnippet>
-    /// <event name="beforeopen" locid="WinJS.UI.SplitView_e:beforeopen">Raised just before opening the pane. Call preventDefault on this event to stop the pane from opening.</event>
-    /// <event name="afteropen" locid="WinJS.UI.SplitView_e:afteropen">Raised immediately after the pane is fully opened.</event>
-    /// <event name="beforeclose" locid="WinJS.UI.SplitView_e:beforeclose">Raised just before closing the pane. Call preventDefault on this event to stop the pane from closing.</event>
-    /// <event name="afterclose" locid="WinJS.UI.SplitView_e:afterclose">Raised immediately after the pane is fully closed.</event>
-    /// <part name="splitview" class="win-splitview" locid="WinJS.UI.SplitView_part:splitview">The entire SplitView control.</part>
-    /// <part name="splitview-pane" class="win-splitview-pane" locid="WinJS.UI.SplitView_part:splitview-pane">The element which hosts the SplitView's pane.</part>
-    /// <part name="splitview-content" class="win-splitview-content" locid="WinJS.UI.SplitView_part:splitview-content">The element which hosts the SplitView's content.</part>
-    /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-    /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-    var SplitView = (function () {
-        function SplitView(element, options) {
-            /// <signature helpKeyword="WinJS.UI.SplitView.SplitView">
-            /// <summary locid="WinJS.UI.SplitView.constructor">
-            /// Creates a new SplitView control.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" domElement="true" isOptional="true" locid="WinJS.UI.SplitView.constructor_p:element">
-            /// The DOM element that hosts the SplitView control.
-            /// </param>
-            /// <param name="options" type="Object" isOptional="true" locid="WinJS.UI.SplitView.constructor_p:options">
-            /// An object that contains one or more property/value pairs to apply to the new control.
-            /// Each property of the options object corresponds to one of the control's properties or events.
-            /// Event names must begin with "on". For example, to provide a handler for the beforeclose event,
-            /// add a property named "onbeforeclose" to the options object and set its value to the event handler.
-            /// </param>
-            /// <returns type="WinJS.UI.SplitView" locid="WinJS.UI.SplitView.constructor_returnValue">
-            /// The new SplitView.
-            /// </returns>
-            /// </signature>
-            var _this = this;
-            if (options === void 0) { options = {}; }
-            // State private to _updateDomImpl. No other method should make use of it.
-            //
-            // Nothing has been rendered yet so these are all initialized to undefined. Because
-            // they are undefined, the first time _updateDomImpl is called, they will all be
-            // rendered.
-            this._updateDomImpl_rendered = {
-                paneIsFirst: undefined,
-                isOpenedMode: undefined,
-                closedDisplayMode: undefined,
-                openedDisplayMode: undefined,
-                panePlacement: undefined,
-                panePlaceholderWidth: undefined,
-                panePlaceholderHeight: undefined,
-                isOverlayShown: undefined,
-                startPaneTabIndex: undefined,
-                endPaneTabIndex: undefined
-            };
-            // Check to make sure we weren't duplicated
-            if (element && element["winControl"]) {
-                throw new _ErrorFromName("WinJS.UI.SplitView.DuplicateConstruction", Strings.duplicateConstruction);
-            }
-            this._initializeDom(element || _Global.document.createElement("div"));
-            this._machine = new _OpenCloseMachine.OpenCloseMachine({
-                eventElement: this._dom.root,
-                onOpen: function () {
-                    _this._cachedHiddenPaneThickness = null;
-                    var hiddenPaneThickness = _this._getHiddenPaneThickness();
-                    _this._isOpenedMode = true;
-                    _this._updateDomImpl();
-                    _ElementUtilities.addClass(_this._dom.root, ClassNames._animating);
-                    return _this._playShowAnimation(hiddenPaneThickness).then(function () {
-                        _ElementUtilities.removeClass(_this._dom.root, ClassNames._animating);
-                    });
-                },
-                onClose: function () {
-                    _ElementUtilities.addClass(_this._dom.root, ClassNames._animating);
-                    return _this._playHideAnimation(_this._getHiddenPaneThickness()).then(function () {
-                        _ElementUtilities.removeClass(_this._dom.root, ClassNames._animating);
-                        _this._isOpenedMode = false;
-                        _this._updateDomImpl();
-                    });
-                },
-                onUpdateDom: function () {
-                    _this._updateDomImpl();
-                },
-                onUpdateDomWithIsOpened: function (isOpened) {
-                    _this._isOpenedMode = isOpened;
-                    _this._updateDomImpl();
-                }
-            });
-            // Initialize private state.
-            this._disposed = false;
-            this._dismissable = new _LightDismissService.LightDismissableElement({
-                element: this._dom.paneWrapper,
-                tabIndex: -1,
-                onLightDismiss: function () {
-                    _this.closePane();
-                },
-                onTakeFocus: function (useSetActive) {
-                    _this._dismissable.restoreFocus() || _ElementUtilities._tryFocusOnAnyElement(_this._dom.pane, useSetActive);
-                }
-            });
-            this._cachedHiddenPaneThickness = null;
-            // Initialize public properties.
-            this.paneOpened = false;
-            this.closedDisplayMode = ClosedDisplayMode.inline;
-            this.openedDisplayMode = OpenedDisplayMode.overlay;
-            this.panePlacement = PanePlacement.left;
-            _Control.setOptions(this, options);
-            // Exit the Init state.
-            _ElementUtilities._inDom(this._dom.root).then(function () {
-                _this._rtl = _ElementUtilities._getComputedStyle(_this._dom.root).direction === 'rtl';
-                _this._updateTabIndices();
-                _this._machine.exitInit();
-            });
-        }
-        Object.defineProperty(SplitView.prototype, "element", {
-            /// <field type="HTMLElement" domElement="true" readonly="true" hidden="true" locid="WinJS.UI.SplitView.element" helpKeyword="WinJS.UI.SplitView.element">
-            /// Gets the DOM element that hosts the SplitView control.
-            /// </field>
-            get: function () {
-                return this._dom.root;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(SplitView.prototype, "paneElement", {
-            /// <field type="HTMLElement" domElement="true" readonly="true" hidden="true" locid="WinJS.UI.SplitView.paneElement" helpKeyword="WinJS.UI.SplitView.paneElement">
-            /// Gets the DOM element that hosts the SplitView pane.
-            /// </field>
-            get: function () {
-                return this._dom.pane;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(SplitView.prototype, "contentElement", {
-            /// <field type="HTMLElement" domElement="true" readonly="true" hidden="true" locid="WinJS.UI.SplitView.contentElement" helpKeyword="WinJS.UI.SplitView.contentElement">
-            /// Gets the DOM element that hosts the SplitView's content.
-            /// </field>
-            get: function () {
-                return this._dom.content;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(SplitView.prototype, "closedDisplayMode", {
-            /// <field type="String" oamOptionsDatatype="WinJS.UI.SplitView.ClosedDisplayMode" locid="WinJS.UI.SplitView.closedDisplayMode" helpKeyword="WinJS.UI.SplitView.closedDisplayMode">
-            /// Gets or sets the display mode of the SplitView's pane when it is hidden.
-            /// </field>
-            get: function () {
-                return this._closedDisplayMode;
-            },
-            set: function (value) {
-                if (ClosedDisplayMode[value] && this._closedDisplayMode !== value) {
-                    this._closedDisplayMode = value;
-                    this._cachedHiddenPaneThickness = null;
-                    this._machine.updateDom();
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(SplitView.prototype, "openedDisplayMode", {
-            /// <field type="String" oamOptionsDatatype="WinJS.UI.SplitView.OpenedDisplayMode" locid="WinJS.UI.SplitView.openedDisplayMode" helpKeyword="WinJS.UI.SplitView.openedDisplayMode">
-            /// Gets or sets the display mode of the SplitView's pane when it is open.
-            /// </field>
-            get: function () {
-                return this._openedDisplayMode;
-            },
-            set: function (value) {
-                if (OpenedDisplayMode[value] && this._openedDisplayMode !== value) {
-                    this._openedDisplayMode = value;
-                    this._cachedHiddenPaneThickness = null;
-                    this._machine.updateDom();
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(SplitView.prototype, "panePlacement", {
-            /// <field type="String" oamOptionsDatatype="WinJS.UI.SplitView.PanePlacement" locid="WinJS.UI.SplitView.panePlacement" helpKeyword="WinJS.UI.SplitView.panePlacement">
-            /// Gets or sets the placement of the SplitView's pane.
-            /// </field>
-            get: function () {
-                return this._panePlacement;
-            },
-            set: function (value) {
-                if (PanePlacement[value] && this._panePlacement !== value) {
-                    this._panePlacement = value;
-                    this._cachedHiddenPaneThickness = null;
-                    this._machine.updateDom();
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(SplitView.prototype, "paneOpened", {
-            /// <field type="Boolean" hidden="true" locid="WinJS.UI.SplitView.paneOpened" helpKeyword="WinJS.UI.SplitView.paneOpened">
-            /// Gets or sets whether the SpitView's pane is currently opened.
-            /// </field>
-            get: function () {
-                return this._machine.opened;
-            },
-            set: function (value) {
-                this._machine.opened = value;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        SplitView.prototype.dispose = function () {
-            /// <signature helpKeyword="WinJS.UI.SplitView.dispose">
-            /// <summary locid="WinJS.UI.SplitView.dispose">
-            /// Disposes this control.
-            /// </summary>
-            /// </signature>
-            if (this._disposed) {
-                return;
-            }
-            this._disposed = true;
-            this._machine.dispose();
-            _LightDismissService.hidden(this._dismissable);
-            _Dispose._disposeElement(this._dom.pane);
-            _Dispose._disposeElement(this._dom.content);
-        };
-        SplitView.prototype.openPane = function () {
-            /// <signature helpKeyword="WinJS.UI.SplitView.openPane">
-            /// <summary locid="WinJS.UI.SplitView.openPane">
-            /// Opens the SplitView's pane.
-            /// </summary>
-            /// </signature>
-            this._machine.open();
-        };
-        SplitView.prototype.closePane = function () {
-            /// <signature helpKeyword="WinJS.UI.SplitView.closePane">
-            /// <summary locid="WinJS.UI.SplitView.closePane">
-            /// Closes the SplitView's pane.
-            /// </summary>
-            /// </signature>
-            this._machine.close();
-        };
-        SplitView.prototype._initializeDom = function (root) {
-            // The first child is the pane
-            var paneEl = root.firstElementChild || _Global.document.createElement("div");
-            _ElementUtilities.addClass(paneEl, ClassNames.pane);
-            if (!paneEl.hasAttribute("tabIndex")) {
-                paneEl.tabIndex = -1;
-            }
-            // All other children are members of the content
-            var contentEl = _Global.document.createElement("div");
-            _ElementUtilities.addClass(contentEl, ClassNames.content);
-            var child = paneEl.nextSibling;
-            while (child) {
-                var sibling = child.nextSibling;
-                contentEl.appendChild(child);
-                child = sibling;
-            }
-            var startPaneTabEl = _Global.document.createElement("div");
-            startPaneTabEl.className = ClassNames._tabStop;
-            _ElementUtilities._ensureId(startPaneTabEl);
-            var endPaneTabEl = _Global.document.createElement("div");
-            endPaneTabEl.className = ClassNames._tabStop;
-            _ElementUtilities._ensureId(endPaneTabEl);
-            // paneOutline's purpose is to render an outline around the pane in high contrast mode
-            var paneOutlineEl = _Global.document.createElement("div");
-            paneOutlineEl.className = ClassNames._paneOutline;
-            // paneWrapper's purpose is to clip the pane during the pane resize animation
-            var paneWrapperEl = _Global.document.createElement("div");
-            paneWrapperEl.className = ClassNames._paneWrapper;
-            paneWrapperEl.appendChild(startPaneTabEl);
-            paneWrapperEl.appendChild(paneEl);
-            paneWrapperEl.appendChild(paneOutlineEl);
-            paneWrapperEl.appendChild(endPaneTabEl);
-            var panePlaceholderEl = _Global.document.createElement("div");
-            panePlaceholderEl.className = ClassNames._panePlaceholder;
-            // contentWrapper is an extra element we need to allow heights to be specified as percentages (e.g. height: 100%)
-            // for elements within the content area. It works around this Chrome bug:
-            //   Issue 428049: 100% height doesn't work on child of a definite-flex-basis flex item (in vertical flex container)
-            //   https://code.google.com/p/chromium/issues/detail?id=428049
-            // The workaround is that putting a position: absolute element (_dom.content) within the flex item (_dom.contentWrapper)
-            // allows percentage heights to work within the absolutely positioned element (_dom.content).
-            var contentWrapperEl = _Global.document.createElement("div");
-            contentWrapperEl.className = ClassNames._contentWrapper;
-            contentWrapperEl.appendChild(contentEl);
-            root["winControl"] = this;
-            _ElementUtilities.addClass(root, ClassNames.splitView);
-            _ElementUtilities.addClass(root, "win-disposable");
-            this._dom = {
-                root: root,
-                pane: paneEl,
-                startPaneTab: startPaneTabEl,
-                endPaneTab: endPaneTabEl,
-                paneOutline: paneOutlineEl,
-                paneWrapper: paneWrapperEl,
-                panePlaceholder: panePlaceholderEl,
-                content: contentEl,
-                contentWrapper: contentWrapperEl
-            };
-            _ElementUtilities._addEventListener(paneEl, "keydown", this._onKeyDown.bind(this));
-            _ElementUtilities._addEventListener(startPaneTabEl, "focusin", this._onStartPaneTabFocusIn.bind(this));
-            _ElementUtilities._addEventListener(endPaneTabEl, "focusin", this._onEndPaneTabFocusIn.bind(this));
-        };
-        SplitView.prototype._onKeyDown = function (eventObject) {
-            if (eventObject.keyCode === _ElementUtilities.Key.tab) {
-                this._updateTabIndices();
-            }
-        };
-        SplitView.prototype._onStartPaneTabFocusIn = function (eventObject) {
-            _ElementUtilities._focusLastFocusableElement(this._dom.pane);
-        };
-        SplitView.prototype._onEndPaneTabFocusIn = function (eventObject) {
-            _ElementUtilities._focusFirstFocusableElement(this._dom.pane);
-        };
-        SplitView.prototype._measureElement = function (element) {
-            var style = _ElementUtilities._getComputedStyle(element);
-            var position = _ElementUtilities._getPositionRelativeTo(element, this._dom.root);
-            var marginLeft = parseInt(style.marginLeft, 10);
-            var marginTop = parseInt(style.marginTop, 10);
-            return {
-                left: position.left - marginLeft,
-                top: position.top - marginTop,
-                contentWidth: _ElementUtilities.getContentWidth(element),
-                contentHeight: _ElementUtilities.getContentHeight(element),
-                totalWidth: _ElementUtilities.getTotalWidth(element),
-                totalHeight: _ElementUtilities.getTotalHeight(element)
-            };
-        };
-        SplitView.prototype._setContentRect = function (contentRect) {
-            var contentWrapperStyle = this._dom.contentWrapper.style;
-            contentWrapperStyle.left = contentRect.left + "px";
-            contentWrapperStyle.top = contentRect.top + "px";
-            contentWrapperStyle.height = contentRect.contentHeight + "px";
-            contentWrapperStyle.width = contentRect.contentWidth + "px";
-        };
-        // Overridden by tests.
-        SplitView.prototype._prepareAnimation = function (paneRect, contentRect) {
-            var paneWrapperStyle = this._dom.paneWrapper.style;
-            paneWrapperStyle.position = "absolute";
-            paneWrapperStyle.left = paneRect.left + "px";
-            paneWrapperStyle.top = paneRect.top + "px";
-            paneWrapperStyle.height = paneRect.totalHeight + "px";
-            paneWrapperStyle.width = paneRect.totalWidth + "px";
-            var contentWrapperStyle = this._dom.contentWrapper.style;
-            contentWrapperStyle.position = "absolute";
-            this._setContentRect(contentRect);
-        };
-        // Overridden by tests.
-        SplitView.prototype._clearAnimation = function () {
-            var paneWrapperStyle = this._dom.paneWrapper.style;
-            paneWrapperStyle.position = "";
-            paneWrapperStyle.left = "";
-            paneWrapperStyle.top = "";
-            paneWrapperStyle.height = "";
-            paneWrapperStyle.width = "";
-            paneWrapperStyle[transformNames.scriptName] = "";
-            var contentWrapperStyle = this._dom.contentWrapper.style;
-            contentWrapperStyle.position = "";
-            contentWrapperStyle.left = "";
-            contentWrapperStyle.top = "";
-            contentWrapperStyle.height = "";
-            contentWrapperStyle.width = "";
-            contentWrapperStyle[transformNames.scriptName] = "";
-            var paneStyle = this._dom.pane.style;
-            paneStyle.height = "";
-            paneStyle.width = "";
-            paneStyle[transformNames.scriptName] = "";
-        };
-        SplitView.prototype._getHiddenContentRect = function (shownContentRect, hiddenPaneThickness, shownPaneThickness) {
-            if (this.openedDisplayMode === OpenedDisplayMode.overlay) {
-                return shownContentRect;
-            }
-            else {
-                var placementRight = this._rtl ? PanePlacement.left : PanePlacement.right;
-                var multiplier = this.panePlacement === placementRight || this.panePlacement === PanePlacement.bottom ? 0 : 1;
-                var paneDiff = {
-                    content: shownPaneThickness.content - hiddenPaneThickness.content,
-                    total: shownPaneThickness.total - hiddenPaneThickness.total
-                };
-                return this._horizontal ? {
-                    left: shownContentRect.left - multiplier * paneDiff.total,
-                    top: shownContentRect.top,
-                    contentWidth: shownContentRect.contentWidth + paneDiff.content,
-                    contentHeight: shownContentRect.contentHeight,
-                    totalWidth: shownContentRect.totalWidth + paneDiff.total,
-                    totalHeight: shownContentRect.totalHeight
-                } : {
-                    left: shownContentRect.left,
-                    top: shownContentRect.top - multiplier * paneDiff.total,
-                    contentWidth: shownContentRect.contentWidth,
-                    contentHeight: shownContentRect.contentHeight + paneDiff.content,
-                    totalWidth: shownContentRect.totalWidth,
-                    totalHeight: shownContentRect.totalHeight + paneDiff.total
-                };
-            }
-        };
-        Object.defineProperty(SplitView.prototype, "_horizontal", {
-            get: function () {
-                return this.panePlacement === PanePlacement.left || this.panePlacement === PanePlacement.right;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        SplitView.prototype._getHiddenPaneThickness = function () {
-            if (this._cachedHiddenPaneThickness === null) {
-                if (this._closedDisplayMode === ClosedDisplayMode.none) {
-                    this._cachedHiddenPaneThickness = { content: 0, total: 0 };
-                }
-                else {
-                    if (this._isOpenedMode) {
-                        _ElementUtilities.removeClass(this._dom.root, ClassNames.paneOpened);
-                        _ElementUtilities.addClass(this._dom.root, ClassNames.paneClosed);
-                    }
-                    var size = this._measureElement(this._dom.pane);
-                    this._cachedHiddenPaneThickness = rectToThickness(size, this._horizontal ? Dimension.width : Dimension.height);
-                    if (this._isOpenedMode) {
-                        _ElementUtilities.removeClass(this._dom.root, ClassNames.paneClosed);
-                        _ElementUtilities.addClass(this._dom.root, ClassNames.paneOpened);
-                    }
-                }
-            }
-            return this._cachedHiddenPaneThickness;
-        };
-        // Should be called while SplitView is rendered in its opened mode
-        // Overridden by tests.
-        SplitView.prototype._playShowAnimation = function (hiddenPaneThickness) {
-            var _this = this;
-            var dim = this._horizontal ? Dimension.width : Dimension.height;
-            var shownPaneRect = this._measureElement(this._dom.pane);
-            var shownContentRect = this._measureElement(this._dom.content);
-            var shownPaneThickness = rectToThickness(shownPaneRect, dim);
-            var hiddenContentRect = this._getHiddenContentRect(shownContentRect, hiddenPaneThickness, shownPaneThickness);
-            this._prepareAnimation(shownPaneRect, hiddenContentRect);
-            var playPaneAnimation = function () {
-                var placementRight = _this._rtl ? PanePlacement.left : PanePlacement.right;
-                // What percentage of the size change should be skipped? (e.g. let's do the first
-                // 30% of the size change instantly and then animate the other 70%)
-                var animationOffsetFactor = 0.3;
-                var from = hiddenPaneThickness.total + animationOffsetFactor * (shownPaneThickness.total - hiddenPaneThickness.total);
-                return Animations._resizeTransition(_this._dom.paneWrapper, _this._dom.pane, {
-                    from: from,
-                    to: shownPaneThickness.total,
-                    actualSize: shownPaneThickness.total,
-                    dimension: dim,
-                    anchorTrailingEdge: _this.panePlacement === placementRight || _this.panePlacement === PanePlacement.bottom
-                });
-            };
-            var playShowAnimation = function () {
-                if (_this.openedDisplayMode === OpenedDisplayMode.inline) {
-                    _this._setContentRect(shownContentRect);
-                }
-                return playPaneAnimation();
-            };
-            return playShowAnimation().then(function () {
-                _this._clearAnimation();
-            });
-        };
-        // Should be called while SplitView is rendered in its opened mode
-        // Overridden by tests.
-        SplitView.prototype._playHideAnimation = function (hiddenPaneThickness) {
-            var _this = this;
-            var dim = this._horizontal ? Dimension.width : Dimension.height;
-            var shownPaneRect = this._measureElement(this._dom.pane);
-            var shownContentRect = this._measureElement(this._dom.content);
-            var shownPaneThickness = rectToThickness(shownPaneRect, dim);
-            var hiddenContentRect = this._getHiddenContentRect(shownContentRect, hiddenPaneThickness, shownPaneThickness);
-            this._prepareAnimation(shownPaneRect, shownContentRect);
-            var playPaneAnimation = function () {
-                var placementRight = _this._rtl ? PanePlacement.left : PanePlacement.right;
-                // What percentage of the size change should be skipped? (e.g. let's do the first
-                // 30% of the size change instantly and then animate the other 70%)
-                var animationOffsetFactor = 0.3;
-                var from = shownPaneThickness.total - animationOffsetFactor * (shownPaneThickness.total - hiddenPaneThickness.total);
-                return Animations._resizeTransition(_this._dom.paneWrapper, _this._dom.pane, {
-                    from: from,
-                    to: hiddenPaneThickness.total,
-                    actualSize: shownPaneThickness.total,
-                    dimension: dim,
-                    anchorTrailingEdge: _this.panePlacement === placementRight || _this.panePlacement === PanePlacement.bottom
-                });
-            };
-            var playHideAnimation = function () {
-                if (_this.openedDisplayMode === OpenedDisplayMode.inline) {
-                    _this._setContentRect(hiddenContentRect);
-                }
-                return playPaneAnimation();
-            };
-            return playHideAnimation().then(function () {
-                _this._clearAnimation();
-            });
-        };
-        // _updateTabIndices and _updateTabIndicesImpl are used in tests
-        SplitView.prototype._updateTabIndices = function () {
-            if (!this._updateTabIndicesThrottled) {
-                this._updateTabIndicesThrottled = _BaseUtils._throttledFunction(100, this._updateTabIndicesImpl.bind(this));
-            }
-            this._updateTabIndicesThrottled();
-        };
-        SplitView.prototype._updateTabIndicesImpl = function () {
-            var tabIndex = _ElementUtilities._getHighAndLowTabIndices(this._dom.pane);
-            this._highestPaneTabIndex = tabIndex.highest;
-            this._lowestPaneTabIndex = tabIndex.lowest;
-            this._machine.updateDom();
-        };
-        SplitView.prototype._updateDomImpl = function () {
-            var rendered = this._updateDomImpl_rendered;
-            var paneShouldBeFirst = this.panePlacement === PanePlacement.left || this.panePlacement === PanePlacement.top;
-            if (paneShouldBeFirst !== rendered.paneIsFirst) {
-                // TODO: restore focus
-                if (paneShouldBeFirst) {
-                    this._dom.root.appendChild(this._dom.panePlaceholder);
-                    this._dom.root.appendChild(this._dom.paneWrapper);
-                    this._dom.root.appendChild(this._dom.contentWrapper);
-                }
-                else {
-                    this._dom.root.appendChild(this._dom.contentWrapper);
-                    this._dom.root.appendChild(this._dom.paneWrapper);
-                    this._dom.root.appendChild(this._dom.panePlaceholder);
-                }
-            }
-            rendered.paneIsFirst = paneShouldBeFirst;
-            if (rendered.isOpenedMode !== this._isOpenedMode) {
-                if (this._isOpenedMode) {
-                    _ElementUtilities.removeClass(this._dom.root, ClassNames.paneClosed);
-                    _ElementUtilities.addClass(this._dom.root, ClassNames.paneOpened);
-                }
-                else {
-                    _ElementUtilities.removeClass(this._dom.root, ClassNames.paneOpened);
-                    _ElementUtilities.addClass(this._dom.root, ClassNames.paneClosed);
-                }
-            }
-            rendered.isOpenedMode = this._isOpenedMode;
-            if (rendered.panePlacement !== this.panePlacement) {
-                removeClass(this._dom.root, panePlacementClassMap[rendered.panePlacement]);
-                addClass(this._dom.root, panePlacementClassMap[this.panePlacement]);
-                rendered.panePlacement = this.panePlacement;
-            }
-            if (rendered.closedDisplayMode !== this.closedDisplayMode) {
-                removeClass(this._dom.root, closedDisplayModeClassMap[rendered.closedDisplayMode]);
-                addClass(this._dom.root, closedDisplayModeClassMap[this.closedDisplayMode]);
-                rendered.closedDisplayMode = this.closedDisplayMode;
-            }
-            if (rendered.openedDisplayMode !== this.openedDisplayMode) {
-                removeClass(this._dom.root, openedDisplayModeClassMap[rendered.openedDisplayMode]);
-                addClass(this._dom.root, openedDisplayModeClassMap[this.openedDisplayMode]);
-                rendered.openedDisplayMode = this.openedDisplayMode;
-            }
-            var isOverlayShown = this._isOpenedMode && this.openedDisplayMode === OpenedDisplayMode.overlay;
-            var startPaneTabIndex = isOverlayShown ? this._lowestPaneTabIndex : -1;
-            var endPaneTabIndex = isOverlayShown ? this._highestPaneTabIndex : -1;
-            if (rendered.startPaneTabIndex !== startPaneTabIndex) {
-                this._dom.startPaneTab.tabIndex = startPaneTabIndex;
-                if (startPaneTabIndex === -1) {
-                    this._dom.startPaneTab.removeAttribute("x-ms-aria-flowfrom");
-                }
-                else {
-                    this._dom.startPaneTab.setAttribute("x-ms-aria-flowfrom", this._dom.endPaneTab.id);
-                }
-                rendered.startPaneTabIndex = startPaneTabIndex;
-            }
-            if (rendered.endPaneTabIndex !== endPaneTabIndex) {
-                this._dom.endPaneTab.tabIndex = endPaneTabIndex;
-                if (endPaneTabIndex === -1) {
-                    this._dom.endPaneTab.removeAttribute("aria-flowto");
-                }
-                else {
-                    this._dom.endPaneTab.setAttribute("aria-flowto", this._dom.startPaneTab.id);
-                }
-                rendered.endPaneTabIndex = endPaneTabIndex;
-            }
-            // panePlaceholder's purpose is to take up the amount of space occupied by the
-            // hidden pane while the pane is shown in overlay mode. Without this, the content
-            // would shift as the pane shows and hides in overlay mode.
-            var width, height;
-            if (isOverlayShown) {
-                var hiddenPaneThickness = this._getHiddenPaneThickness();
-                if (this._horizontal) {
-                    width = hiddenPaneThickness.total + "px";
-                    height = "";
-                }
-                else {
-                    width = "";
-                    height = hiddenPaneThickness.total + "px";
-                }
-            }
-            else {
-                width = "";
-                height = "";
-            }
-            if (rendered.panePlaceholderWidth !== width || rendered.panePlaceholderHeight !== height) {
-                var style = this._dom.panePlaceholder.style;
-                style.width = width;
-                style.height = height;
-                rendered.panePlaceholderWidth = width;
-                rendered.panePlaceholderHeight = height;
-            }
-            if (rendered.isOverlayShown !== isOverlayShown) {
-                if (isOverlayShown) {
-                    _LightDismissService.shown(this._dismissable);
-                }
-                else {
-                    _LightDismissService.hidden(this._dismissable);
-                }
-                rendered.isOverlayShown = isOverlayShown;
-            }
-        };
-        /// <field locid="WinJS.UI.SplitView.ClosedDisplayMode" helpKeyword="WinJS.UI.SplitView.ClosedDisplayMode">
-        /// Display options for a SplitView's pane when it is closed.
-        /// </field>
-        SplitView.ClosedDisplayMode = ClosedDisplayMode;
-        /// <field locid="WinJS.UI.SplitView.OpenedDisplayMode" helpKeyword="WinJS.UI.SplitView.OpenedDisplayMode">
-        /// Display options for a SplitView's pane when it is open.
-        /// </field>
-        SplitView.OpenedDisplayMode = OpenedDisplayMode;
-        /// <field locid="WinJS.UI.SplitView.PanePlacement" helpKeyword="WinJS.UI.SplitView.PanePlacement">
-        /// Placement options for a SplitView's pane.
-        /// </field>
-        SplitView.PanePlacement = PanePlacement;
-        SplitView.supportedForProcessing = true;
-        SplitView._ClassNames = ClassNames;
-        return SplitView;
-    })();
-    exports.SplitView = SplitView;
-    _Base.Class.mix(SplitView, _Events.createEventProperties(EventNames.beforeOpen, EventNames.afterOpen, EventNames.beforeClose, EventNames.afterClose));
-    _Base.Class.mix(SplitView, _Control.DOMEventMixin);
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <reference path="../../../../typings/require.d.ts" />
-define('WinJS/Controls/SplitView',["require", "exports", '../Core/_Base'], function (require, exports, _Base) {
-    var module = null;
-    _Base.Namespace.define("WinJS.UI", {
-        SplitView: {
-            get: function () {
-                if (!module) {
-                    require(["./SplitView/_SplitView"], function (m) {
-                        module = m;
-                    });
-                }
-                return module.SplitView;
-            }
-        }
-    });
-});
-
-
-define('require-style!less/styles-splitviewpanetoggle',[],function(){});
-
-define('require-style!less/colors-splitviewpanetoggle',[],function(){});
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <reference path="../../../../../typings/require.d.ts" />
-define('WinJS/Controls/SplitViewPaneToggle/_SplitViewPaneToggle',["require", "exports", '../../Core/_Base', '../../Utilities/_Control', '../../Utilities/_ElementUtilities', '../../Core/_ErrorFromName', '../../Core/_Events', '../../Core/_Global', '../../Utilities/_KeyboardBehavior', '../../Utilities/_Hoverable'], function (require, exports, _Base, _Control, _ElementUtilities, _ErrorFromName, _Events, _Global, _KeyboardBehavior, _Hoverable) {
-    _Hoverable.isHoverable; // Force dependency on the hoverable module
-    require(["require-style!less/styles-splitviewpanetoggle"]);
-    require(["require-style!less/colors-splitviewpanetoggle"]);
-    "use strict";
-    // This control has 2 modes depending on whether or not the app has provided a SplitView:
-    //   - SplitView not provided
-    //     SplitViewPaneToggle provides button visuals and fires the invoked event. The app
-    //     intends to do everything else:
-    //       - Handle the invoked event
-    //       - Handle the SplitView opening and closing
-    //       - Handle aria-expanded being mutated by UIA (i.e. screen readers)
-    //       - Keep the aria-controls attribute, aria-expanded attribute, and SplitView in sync
-    //   - SplitView is provided via splitView property
-    //     SplitViewPaneToggle keeps the SplitView, the aria-controls attribute, and the
-    //     aria-expands attribute in sync. In this use case, apps typically won't listen
-    //     to the invoked event (but it's still fired).
-    var ClassNames = {
-        splitViewPaneToggle: "win-splitviewpanetoggle"
-    };
-    var EventNames = {
-        // Fires when the user invokes the button with mouse/keyboard/touch. Does not
-        // fire if the SplitViewPaneToggle's state changes due to UIA (i.e. aria-expanded
-        // being set) or due to the SplitView pane opening/closing.
-        invoked: "invoked"
-    };
-    var Strings = {
-        get duplicateConstruction() {
-            return "Invalid argument: Controls may only be instantiated one time for each DOM element";
-        },
-        get badButtonElement() {
-            return "Invalid argument: The SplitViewPaneToggle's element must be a button element";
-        }
-    };
-    // The splitViewElement may not have a winControl associated with it yet in the case
-    // that the SplitViewPaneToggle was constructed before the SplitView. This may happen
-    // when WinJS.UI.processAll is used to construct the controls because the order of construction
-    // depends on the order in which the SplitView and SplitViewPaneToggle appear in the DOM.
-    function getSplitViewControl(splitViewElement) {
-        return (splitViewElement && splitViewElement["winControl"]);
-    }
-    function getPaneOpened(splitViewElement) {
-        var splitViewControl = getSplitViewControl(splitViewElement);
-        return splitViewControl ? splitViewControl.paneOpened : false;
-    }
-    /// <field>
-    /// <summary locid="WinJS.UI.SplitViewPaneToggle">
-    /// Displays a button which is used for opening and closing a SplitView's pane.
-    /// </summary>
-    /// </field>
-    /// <icon src="ui_winjs.ui.splitviewpanetoggle.12x12.png" width="12" height="12" />
-    /// <icon src="ui_winjs.ui.splitviewpanetoggle.16x16.png" width="16" height="16" />
-    /// <htmlSnippet><![CDATA[<button data-win-control="WinJS.UI.SplitViewPaneToggle"></button>]]></htmlSnippet>
-    /// <part name="splitviewpanetoggle" class="win-splitviewpanetoggle" locid="WinJS.UI.SplitViewPaneToggle_part:splitviewpanetoggle">The SplitViewPaneToggle control itself.</part>
-    /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-    /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-    var SplitViewPaneToggle = (function () {
-        function SplitViewPaneToggle(element, options) {
-            /// <signature helpKeyword="WinJS.UI.SplitViewPaneToggle.SplitViewPaneToggle">
-            /// <summary locid="WinJS.UI.SplitViewPaneToggle.constructor">
-            /// Creates a new SplitViewPaneToggle control.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" domElement="true" isOptional="true" locid="WinJS.UI.SplitViewPaneToggle.constructor_p:element">
-            /// The DOM element that hosts the SplitViewPaneToggle control.
-            /// </param>
-            /// <param name="options" type="Object" isOptional="true" locid="WinJS.UI.SplitViewPaneToggle.constructor_p:options">
-            /// An object that contains one or more property/value pairs to apply to the new control.
-            /// Each property of the options object corresponds to one of the control's properties or events.
-            /// Event names must begin with "on". For example, to provide a handler for the invoked event,
-            /// add a property named "oninvoked" to the options object and set its value to the event handler.
-            /// </param>
-            /// <returns type="WinJS.UI.SplitViewPaneToggle" locid="WinJS.UI.SplitViewPaneToggle.constructor_returnValue">
-            /// The new SplitViewPaneToggle.
-            /// </returns>
-            /// </signature>
-            if (options === void 0) { options = {}; }
-            // State private to _updateDom. No other method should make use of it.
-            //
-            // Nothing has been rendered yet so these are all initialized to undefined. Because
-            // they are undefined, the first time _updateDom is called, they will all be
-            // rendered.
-            this._updateDom_rendered = {
-                splitView: undefined
-            };
-            // Check to make sure we weren't duplicated
-            if (element && element["winControl"]) {
-                throw new _ErrorFromName("WinJS.UI.SplitViewPaneToggle.DuplicateConstruction", Strings.duplicateConstruction);
-            }
-            this._onPaneStateSettledBound = this._onPaneStateSettled.bind(this);
-            this._ariaExpandedMutationObserver = new _ElementUtilities._MutationObserver(this._onAriaExpandedPropertyChanged.bind(this));
-            this._initializeDom(element || _Global.document.createElement("button"));
-            // Private state
-            this._disposed = false;
-            // Default values
-            this.splitView = null;
-            _Control.setOptions(this, options);
-            this._initialized = true;
-            this._updateDom();
-        }
-        Object.defineProperty(SplitViewPaneToggle.prototype, "element", {
-            /// <field type="HTMLElement" domElement="true" readonly="true" hidden="true" locid="WinJS.UI.SplitViewPaneToggle.element" helpKeyword="WinJS.UI.SplitViewPaneToggle.element">
-            /// Gets the DOM element that hosts the SplitViewPaneToggle control.
-            /// </field>
-            get: function () {
-                return this._dom.root;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(SplitViewPaneToggle.prototype, "splitView", {
-            /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.SplitViewPaneToggle.splitView" helpKeyword="WinJS.UI.SplitViewPaneToggle.splitView">
-            /// Gets or sets the DOM element of the SplitView that is associated with the SplitViewPaneToggle control.
-            /// When the SplitViewPaneToggle is invoked, it'll toggle this SplitView's pane.
-            /// </field>
-            get: function () {
-                return this._splitView;
-            },
-            set: function (splitView) {
-                this._splitView = splitView;
-                if (splitView) {
-                    this._opened = getPaneOpened(splitView);
-                }
-                this._updateDom();
-            },
-            enumerable: true,
-            configurable: true
-        });
-        SplitViewPaneToggle.prototype.dispose = function () {
-            /// <signature helpKeyword="WinJS.UI.SplitViewPaneToggle.dispose">
-            /// <summary locid="WinJS.UI.SplitViewPaneToggle.dispose">
-            /// Disposes this control.
-            /// </summary>
-            /// </signature>
-            if (this._disposed) {
-                return;
-            }
-            this._disposed = true;
-            this._splitView && this._removeListeners(this._splitView);
-        };
-        SplitViewPaneToggle.prototype._initializeDom = function (root) {
-            if (root.tagName !== "BUTTON") {
-                throw new _ErrorFromName("WinJS.UI.SplitViewPaneToggle.BadButtonElement", Strings.badButtonElement);
-            }
-            root["winControl"] = this;
-            _ElementUtilities.addClass(root, ClassNames.splitViewPaneToggle);
-            _ElementUtilities.addClass(root, "win-disposable");
-            if (!root.hasAttribute("type")) {
-                root.type = "button";
-            }
-            new _KeyboardBehavior._WinKeyboard(root);
-            root.addEventListener("click", this._onClick.bind(this));
-            this._dom = {
-                root: root
-            };
-        };
-        SplitViewPaneToggle.prototype._updateDom = function () {
-            if (!this._initialized || this._disposed) {
-                return;
-            }
-            var rendered = this._updateDom_rendered;
-            if (this._splitView !== rendered.splitView) {
-                if (rendered.splitView) {
-                    this._dom.root.removeAttribute("aria-controls");
-                    this._removeListeners(rendered.splitView);
-                }
-                if (this._splitView) {
-                    _ElementUtilities._ensureId(this._splitView);
-                    this._dom.root.setAttribute("aria-controls", this._splitView.id);
-                    this._addListeners(this._splitView);
-                }
-                rendered.splitView = this._splitView;
-            }
-            // When no SplitView is provided, it's up to the app to manage aria-expanded.
-            if (this._splitView) {
-                // Always update aria-expanded and don't cache its most recently rendered value
-                // in _updateDom_rendered. The reason is that we're not the only ones that update
-                // aria-expanded. aria-expanded may be changed thru UIA APIs. Consequently, if we
-                // cached the last value we set in _updateDom_rendered, it may not reflect the current
-                // value in the DOM.
-                var expanded = this._opened ? "true" : "false";
-                _ElementUtilities._setAttribute(this._dom.root, "aria-expanded", expanded);
-                // The splitView element may not have a winControl associated with it yet in the case
-                // that the SplitViewPaneToggle was constructed before the SplitView. This may happen
-                // when WinJS.UI.processAll is used to construct the controls because the order of construction
-                // depends on the order in which the SplitView and SplitViewPaneToggle appear in the DOM.
-                var splitViewControl = getSplitViewControl(this._splitView);
-                if (splitViewControl) {
-                    splitViewControl.paneOpened = this._opened;
-                }
-            }
-        };
-        SplitViewPaneToggle.prototype._addListeners = function (splitViewElement) {
-            splitViewElement.addEventListener("_openCloseStateSettled", this._onPaneStateSettledBound);
-            this._ariaExpandedMutationObserver.observe(this._dom.root, {
-                attributes: true,
-                attributeFilter: ["aria-expanded"]
-            });
-        };
-        SplitViewPaneToggle.prototype._removeListeners = function (splitViewElement) {
-            splitViewElement.removeEventListener("_openCloseStateSettled", this._onPaneStateSettledBound);
-            this._ariaExpandedMutationObserver.disconnect();
-        };
-        SplitViewPaneToggle.prototype._fireEvent = function (eventName) {
-            var eventObject = _Global.document.createEvent("CustomEvent");
-            eventObject.initCustomEvent(eventName, true, false, null);
-            return this._dom.root.dispatchEvent(eventObject);
-        };
-        // Inputs that change the SplitViewPaneToggle's state
-        //
-        SplitViewPaneToggle.prototype._onPaneStateSettled = function (eventObject) {
-            if (eventObject.target === this._splitView) {
-                this._opened = getPaneOpened(this._splitView);
-                this._updateDom();
-            }
-        };
-        // Called by tests.
-        SplitViewPaneToggle.prototype._onAriaExpandedPropertyChanged = function (mutations) {
-            var ariaExpanded = this._dom.root.getAttribute("aria-expanded") === "true";
-            this._opened = ariaExpanded;
-            this._updateDom();
-        };
-        SplitViewPaneToggle.prototype._onClick = function (eventObject) {
-            this._invoked();
-        };
-        // Called by tests.
-        SplitViewPaneToggle.prototype._invoked = function () {
-            if (this._disposed) {
-                return;
-            }
-            if (this._splitView) {
-                this._opened = !this._opened;
-                this._updateDom();
-            }
-            this._fireEvent(EventNames.invoked);
-        };
-        SplitViewPaneToggle._ClassNames = ClassNames;
-        SplitViewPaneToggle.supportedForProcessing = true;
-        return SplitViewPaneToggle;
-    })();
-    exports.SplitViewPaneToggle = SplitViewPaneToggle;
-    _Base.Class.mix(SplitViewPaneToggle, _Events.createEventProperties(EventNames.invoked));
-    _Base.Class.mix(SplitViewPaneToggle, _Control.DOMEventMixin);
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <reference path="../../../../typings/require.d.ts" />
-define('WinJS/Controls/SplitViewPaneToggle',["require", "exports", '../Core/_Base'], function (require, exports, _Base) {
-    var module = null;
-    _Base.Namespace.define("WinJS.UI", {
-        SplitViewPaneToggle: {
-            get: function () {
-                if (!module) {
-                    require(["./SplitViewPaneToggle/_SplitViewPaneToggle"], function (m) {
-                        module = m;
-                    });
-                }
-                return module.SplitViewPaneToggle;
-            }
-        }
-    });
-});
-
-define('WinJS/Controls/AppBar/_Constants',["require", "exports", "../CommandingSurface/_Constants"], function (require, exports, _CommandingSurfaceConstants) {
-    // appbar class names
-    exports.ClassNames = {
-        controlCssClass: "win-appbar",
-        disposableCssClass: "win-disposable",
-        actionAreaCssClass: "win-appbar-actionarea",
-        overflowButtonCssClass: "win-appbar-overflowbutton",
-        spacerCssClass: "win-appbar-spacer",
-        ellipsisCssClass: "win-appbar-ellipsis",
-        overflowAreaCssClass: "win-appbar-overflowarea",
-        contentFlyoutCssClass: "win-appbar-contentflyout",
-        emptyappbarCssClass: "win-appbar-empty",
-        menuCssClass: "win-menu",
-        menuContainsToggleCommandClass: "win-menu-containstogglecommand",
-        openedClass: "win-appbar-opened",
-        closedClass: "win-appbar-closed",
-        noneClass: "win-appbar-closeddisplaynone",
-        minimalClass: "win-appbar-closeddisplayminimal",
-        compactClass: "win-appbar-closeddisplaycompact",
-        fullClass: "win-appbar-closeddisplayfull",
-        placementTopClass: "win-appbar-top",
-        placementBottomClass: "win-appbar-bottom",
-    };
-    exports.EventNames = {
-        // AppBar
-        beforeOpen: "beforeopen",
-        afterOpen: "afteropen",
-        beforeClose: "beforeclose",
-        afterClose: "afterclose",
-        // AppBarCommand
-        commandPropertyMutated: "_commandpropertymutated",
-    };
-    exports.controlMinWidth = _CommandingSurfaceConstants.controlMinWidth;
-    exports.defaultClosedDisplayMode = "compact";
-    exports.defaultOpened = false;
-    exports.defaultPlacement = "bottom";
-    // Constants for commands
-    exports.typeSeparator = "separator";
-    exports.typeContent = "content";
-    exports.typeButton = "button";
-    exports.typeToggle = "toggle";
-    exports.typeFlyout = "flyout";
-    exports.commandSelector = ".win-command";
-    exports.primaryCommandSection = "primary";
-    exports.secondaryCommandSection = "secondary";
-});
-
-
-define('require-style!less/styles-appbar',[],function(){});
-define('WinJS/Controls/AppBar/_AppBar',["require", "exports", "../../Core/_Base", "../AppBar/_Constants", "../CommandingSurface", "../../Utilities/_Control", "../../Utilities/_Dispose", "../../Utilities/_ElementUtilities", "../../Core/_ErrorFromName", '../../Core/_Events', "../../Core/_Global", '../../Utilities/_KeyboardInfo', '../../_LightDismissService', '../../Promise', "../../Core/_Resources", '../../Utilities/_OpenCloseMachine', "../../Core/_WriteProfilerMark"], function (require, exports, _Base, _Constants, _CommandingSurface, _Control, _Dispose, _ElementUtilities, _ErrorFromName, _Events, _Global, _KeyboardInfo, _LightDismissService, Promise, _Resources, _OpenCloseMachine, _WriteProfilerMark) {
-    require(["require-style!less/styles-appbar"]);
-    "use strict";
-    // Implementation Details:
-    //
-    // The WinJS AppBar is a specialized UI wrapper for the private _CommandingSurface UI component. // The AppBar relies on the _CommandingSurface for rendering 
-    // opened and closed states, knowing how to create the open and close animations, laying out commands, creating command hide/show animations and keyboard 
-    // navigation across commands. See the _CommandingSurface implementation details for more information on how that component operates.
-    //
-    // The responsibilities of the AppBar include:
-    //
-    //  - Hosting the _CommandingSurface
-    //      - From an end user perspective, there should be no visual distinction between where the AppBar ends and the _CommandingSurface begins.
-    //          - AppBar wants to rely on the _CommandingSurface to do as much of the rendering as possible.The AppBar relies on the _CommandingSurface to render its opened and 
-    //            closed states -- which defines the overall height of the AppBar and CommandingSurface elements. The AppBar has no policy or CSS styles regarding its own height 
-    //            and instead takes advantage of the default behavior of its DIV element which is to always grow or shrink to match the height of its content.
-    //      - From an end developer perspective, the _CommandingSurface should be abstracted as an implementation detail of the AppBar as much as possible.
-    //          - Developers should never have to interact with the CommandingSurface directly.The AppBar exposes the majority of _CommandingSurface functionality through its own APIs
-    //          - There are some  HTML elements inside of the _CommandingSurface's DOM that a developer might like to style. After the _CommandingSurface has been instantiated and
-    //            added to the AppBar DOM, the AppBar will inject its own "appbar" specific class-names onto these elements to make them more discoverable to developers.
-    //          - Example of developer styling guidelines https://msdn.microsoft.com/en-us/library/windows/apps/jj839733.aspx
-    //
-    //  - Light dismiss
-    //      - The AppBar is a light dismissable when opened.This means that the AppBar is closed thru a variety of cues such as tapping anywhere outside of it, pressing the escape 
-    //        key, and resizing the window.AppBar relies on the _LightDismissService component for most of this functionality.The only pieces the AppBar is responsible for are:
-    //          - Describing what happens when a light dismiss is triggered on the AppBar.
-    //          - Describing how the AppBar should take / restore focus when it becomes the topmost light dismissible in the light dismiss stack.
-    //      - Debugging Tip: Light dismiss can make debugging an opened AppBar tricky.A good idea is to temporarily suspend the light dismiss cue that triggers when clicking 
-    //        outside of the current window.This can be achieved by executing the following code in the JavaScript console window: "WinJS.UI._LightDismissService._setDebug(true)"
-    //
-    //  - Configuring a state machine for open / close state management:
-    //      - The AppBar and CommandingSurface share a private _OpenCloseMachine component to manage their states.The contract is:
-    //          - The AppBar Constructor is responsible for the instantiation and configuration of the _OpenCloseMachine.
-    //              - AppBar constructor configures the _OpenCloseMachine to always fire events on the AppBar element directly.
-    //              - AppBar constructor specifies the callbacks that the _OpenCloseMachine should use to setup and execute the _CommandingSurface open and close animations after
-    //                the _OpenCloseMachine determines a state transition has completed.
-    //              - AppBar constructor passes the _OpenCloseMachine as an argument to the _CommandingSurface constructor and doesn�t keep any references to it.
-    //          - _CommandingSurface is responsible for both, continued communication with, and final the cleanup of, the _OpenCloseMachine
-    //              - _CommandingSurface expects a reference to an _OpenCloseMachine in its constructor options.
-    //              - Only the _CommandingSurface holds onto a reference to the _OpenCloseMachine, no other object should communicate with the _OpenCloseMachine directly after 
-    //                initialization.
-    //              - _CommandingSurface is responsible for telling _OpenCloseMachine when a state change or re - render is requested.A simple example of this is  the 
-    //                _CommandingSurface.open() method.
-    //          - _OpenCloseMachine is responsible for everything else including:
-    //              - Ensuring that the animations callbacks get run at the appropriate times.
-    //              - Enforcing the rules of the current state and ensuring the right thing happens when an _OpenCloseMachine method is called.For example:
-    //                  - open is called while the control is already open
-    //                  - close is called while the control is in the middle of opening
-    //                  - dispose is called within a beforeopen event handler
-    //              - Firing all the beforeopen, afteropen, beforeclose, and afterclose events for the AppBar.
-    //
-    //  - Rendering with Update DOM.
-    //      - AppBar follows the Update DOM pattern for rendering.For more information about this pattern, see:     https://github.com/winjs/winjs/wiki/Update-DOM-Pattern
-    //      - Note that the AppBar reads from the DOM when it needs to determine its position relative to the top or bottom edge of the visible document and when measuring its 
-    //        closed height to help the _CommandingSurface generate accurate open / close animations.When possible, it caches this information and reads from the cache instead of 
-    //        the DOM. This minimizes the performance cost.
-    //      - Outside of updateDom, AppBar writes to the DOM in a couple of places:
-    //          - The initializeDom function runs during construction and creates the initial version of the AppBar's DOM
-    //          - Immediately before and after executing _CommandingSurface open and close animations, inside of the onOpen and onClose callbacks that the AppBar gives to the 
-    //            _OpenCloseMachine.There is a rendering bug in Edge when performing the _CommandingSurface's animation if a parent element is using CSS position: -ms-device-fixed; 
-    //            AppBar has to work around this by temporarily switching to CSS position: fixed; and converting its physical location into layout viewport coordinates for the 
-    //            duration of the Animation only.
-    //
-    //  - Overlaying App Content
-    //      - AppBar is an overlay and should occlude other app content in the body when opened or closed.However, AppBar should not occlude any other WinJS light dismissible 
-    //        control when it is closed.
-    //      - AppBar has a default starting z - index that was chosen to be very high but still slightly smaller than the starting z - index for light dismissible controls.
-    //      - The WinJS _LightDismissService dynamically manages the z - indices of active light dismissible controls in the light dismiss stack.AppBar is also an active light
-    //        dismissible when opened, and it is expected that the _LightDismissService will overwrite its z - index to an appropriate higher value while the AppBar is opened.
-    //        AppBar is subject to the same stacking context pitfalls as any other light dismissible: https://github.com/winjs/winjs/wiki/Dismissables-and-Stacking-Contexts and 
-    //        should always be defined as a direct child of the < body>
-    //
-    //  - Positioning itself along the top or bottom edge of the App.
-    //      - The AppBar always wants to stick to the top or bottom edge of the visual viewport in the users App.Which edge it chooses can be configured by the AppBar.placement 
-    //        property.
-    //      - In IE11, Edge, Win 8.1 apps and Win 10 apps, the AppBar uses CSS position: -ms - device - fixed; which will cause its top, left, bottom & right CSS properties be 
-    //        styled in relation to the visual viewport.
-    //      - In other browsers - ms - device - fixed positioning doesn't exist and the AppBar falls back to CSS position: fixed; which will cause its top, left, bottom & right 
-    //        CSS properties be styled in relation to the layout viewport.
-    //      - See http://quirksmode.org/mobile/viewports2.html for more details on the difference between layout viewport and visual viewport.
-    //      - Being able to position the AppBar relative to the visual viewport is particularly important in windows 8.1 apps and Windows 10 apps(as opposed to the web), because
-    //        the AppBar is also concerned with getting out of the way of the Windows IHM(virtual keyboard).When the IHM starts to show or hide, the AppBar reacts to a WinRT event, 
-    //        if the IHM would occlude the bottom edge of the visual viewport, and the AppBar.placement is set to "bottom", the AppBar will move itself to bottom align with the top 
-    //        edge of the IHM.
-    //      - Computing this is quite tricky as the IHM is a system pane and not actually in the DOM.AppBar uses the private _KeyboardInfo component to help calculate the top and 
-    //        bottom coordinates of the "visible document" which is essentially the top and bottom of the visual viewport minus any IHM occlusion.
-    //      - The AppBar is not optimized for scenarios involving optical zoom.How and where the AppBar is affected when an optical zoom(pinch zoom) occurs will vary based on the
-    //        type of positioning being used for the environment.
-    var keyboardInfo = _KeyboardInfo._KeyboardInfo;
-    var strings = {
-        get ariaLabel() {
-            return _Resources._getWinJSString("ui/appBarAriaLabel").value;
-        },
-        get overflowButtonAriaLabel() {
-            return _Resources._getWinJSString("ui/appBarOverflowButtonAriaLabel").value;
-        },
-        get mustContainCommands() {
-            return "The AppBar can only contain WinJS.UI.Command or WinJS.UI.AppBarCommand controls";
-        },
-        get duplicateConstruction() {
-            return "Invalid argument: Controls may only be instantiated one time for each DOM element";
-        }
-    };
-    var ClosedDisplayMode = {
-        /// <field locid="WinJS.UI.AppBar.ClosedDisplayMode.none" helpKeyword="WinJS.UI.AppBar.ClosedDisplayMode.none">
-        /// When the AppBar is closed, it is not visible and doesn't take up any space.
-        /// </field>
-        none: "none",
-        /// <field locid="WinJS.UI.AppBar.ClosedDisplayMode.minimal" helpKeyword="WinJS.UI.AppBar.ClosedDisplayMode.minimal">
-        /// When the AppBar is closed, its height is reduced to the minimal height required to display only its overflowbutton. All other content in the AppBar is not displayed.
-        /// </field>
-        minimal: "minimal",
-        /// <field locid="WinJS.UI.AppBar.ClosedDisplayMode.compact" helpKeyword="WinJS.UI.AppBar.ClosedDisplayMode.compact">
-        /// When the AppBar is closed, its height is reduced such that button commands are still visible, but their labels are hidden.
-        /// </field>
-        compact: "compact",
-        /// <field locid="WinJS.UI.AppBar.ClosedDisplayMode.full" helpKeyword="WinJS.UI.AppBar.ClosedDisplayMode.full">
-        /// When the AppBar is closed, its height is always sized to content.
-        /// </field>
-        full: "full",
-    };
-    var closedDisplayModeClassMap = {};
-    closedDisplayModeClassMap[ClosedDisplayMode.none] = _Constants.ClassNames.noneClass;
-    closedDisplayModeClassMap[ClosedDisplayMode.minimal] = _Constants.ClassNames.minimalClass;
-    closedDisplayModeClassMap[ClosedDisplayMode.compact] = _Constants.ClassNames.compactClass;
-    closedDisplayModeClassMap[ClosedDisplayMode.full] = _Constants.ClassNames.fullClass;
-    var Placement = {
-        /// <field locid="WinJS.UI.AppBar.Placement.top" helpKeyword="WinJS.UI.AppBar.Placement.top">
-        /// The AppBar appears at the top of the main view
-        /// </field>
-        top: "top",
-        /// <field locid="WinJS.UI.AppBar.Placement.bottom" helpKeyword="WinJS.UI.AppBar.Placement.bottom">
-        /// The AppBar appears at the bottom of the main view
-        /// </field>
-        bottom: "bottom",
-    };
-    var placementClassMap = {};
-    placementClassMap[Placement.top] = _Constants.ClassNames.placementTopClass;
-    placementClassMap[Placement.bottom] = _Constants.ClassNames.placementBottomClass;
-    // Versions of add/removeClass that are no ops when called with falsy class names.
-    function addClass(element, className) {
-        className && _ElementUtilities.addClass(element, className);
-    }
-    function removeClass(element, className) {
-        className && _ElementUtilities.removeClass(element, className);
-    }
-    /// <field>
-    /// <summary locid="WinJS.UI.AppBar">
-    /// Represents an appbar for displaying commands.
-    /// </summary>
-    /// </field>
-    /// <icon src="ui_winjs.ui.appbar.12x12.png" width="12" height="12" />
-    /// <icon src="ui_winjs.ui.appbar.16x16.png" width="16" height="16" />
-    /// <htmlSnippet supportsContent="true"><![CDATA[<div data-win-control="WinJS.UI.AppBar">
-    /// <button data-win-control="WinJS.UI.Command" data-win-options="{id:'',label:'example',icon:'back',type:'button',onclick:null,section:'primary'}"></button>
-    /// </div>]]></htmlSnippet>
-    /// <part name="appbar" class="win-appbar" locid="WinJS.UI.AppBar_part:appbar">The entire AppBar control.</part>
-    /// <part name="appbar-overflowbutton" class="win-appbar-overflowbutton" locid="WinJS.UI.AppBar_part:AppBar-overflowbutton">The appbar overflow button.</part>
-    /// <part name="appbar-overflowarea" class="win-appbar-overflowarea" locid="WinJS.UI.AppBar_part:AppBar-overflowarea">The container for appbar commands that overflow.</part>
-    /// <resource type="javascript" src="//WinJS.4.4/js/WinJS.js" shared="true" />
-    /// <resource type="css" src="//WinJS.4.4/css/ui-dark.css" shared="true" />
-    var AppBar = (function () {
-        function AppBar(element, options) {
-            /// <signature helpKeyword="WinJS.UI.AppBar.AppBar">
-            /// <summary locid="WinJS.UI.AppBar.constructor">
-            /// Creates a new AppBar control.
-            /// </summary>
-            /// <param name="element" type="HTMLElement" domElement="true" locid="WinJS.UI.AppBar.constructor_p:element">
-            /// The DOM element that will host the control.
-            /// </param>
-            /// <param name="options" type="Object" locid="WinJS.UI.AppBar.constructor_p:options">
-            /// The set of properties and values to apply to the new AppBar control.
-            /// </param>
-            /// <returns type="WinJS.UI.AppBar" locid="WinJS.UI.AppBar.constructor_returnValue">
-            /// The new AppBar control.
-            /// </returns>
-            /// </signature>
-            var _this = this;
-            if (options === void 0) { options = {}; }
-            // State private to the _updateDomImpl family of method. No other methods should make use of it.
-            //
-            // Nothing has been rendered yet so these are all initialized to undefined. Because
-            // they are undefined, the first time _updateDomImpl is called, they will all be
-            // rendered.
-            this._updateDomImpl_renderedState = {
-                isOpenedMode: undefined,
-                placement: undefined,
-                closedDisplayMode: undefined,
-                adjustedOffsets: { top: undefined, bottom: undefined },
-            };
-            this._writeProfilerMark("constructor,StartTM");
-            // Check to make sure we weren't duplicated
-            if (element && element["winControl"]) {
-                throw new _ErrorFromName("WinJS.UI.AppBar.DuplicateConstruction", strings.duplicateConstruction);
-            }
-            this._initializeDom(element || _Global.document.createElement("div"));
-            var stateMachine = new _OpenCloseMachine.OpenCloseMachine({
-                eventElement: this.element,
-                onOpen: function () {
-                    var openAnimation = _this._commandingSurface.createOpenAnimation(_this._getClosedHeight());
-                    // We're temporarily setting the AppBar's style from position=-ms-device-fixed to fixed to work around an animations bug in IE, 
-                    // where two AppBars will end up being rendered when animating instead of one.
-                    // We need to recalculate our offsets relative to the top and bottom of the visible document because position fixed elements use layout viewport coordinates 
-                    // while position -ms-device-fixed use visual viewport coordinates.This difference in coordinate systems is especially pronounced if the IHM has caused the visual viewport to resize.
-                    _this.element.style.position = "fixed";
-                    if (_this._placement === AppBar.Placement.top) {
-                        _this.element.style.top = _KeyboardInfo._KeyboardInfo._layoutViewportCoords.visibleDocTop + "px";
-                    }
-                    else {
-                        _this.element.style.bottom = _KeyboardInfo._KeyboardInfo._layoutViewportCoords.visibleDocBottom + "px";
-                    }
-                    _this._synchronousOpen();
-                    return openAnimation.execute().then(function () {
-                        _this.element.style.position = "";
-                        _this.element.style.top = _this._adjustedOffsets.top;
-                        _this.element.style.bottom = _this._adjustedOffsets.bottom;
-                    });
-                },
-                onClose: function () {
-                    var closeAnimation = _this._commandingSurface.createCloseAnimation(_this._getClosedHeight());
-                    // We're temporarily setting the AppBar's style from position=-ms-device-fixed to fixed to work around an animations bug in IE, 
-                    // where two AppBars will end up being rendered when animating instead of one.
-                    // We need to recalculate our offsets relative to the top and bottom of the visible document because position fixed elements use layout viewport coordinates 
-                    // while position -ms-device-fixed use visual viewport coordinates.This difference in coordinate systems is especially pronounced if the IHM has caused the visual viewport to resize.
-                    _this.element.style.position = "fixed";
-                    if (_this._placement === AppBar.Placement.top) {
-                        _this.element.style.top = _KeyboardInfo._KeyboardInfo._layoutViewportCoords.visibleDocTop + "px";
-                    }
-                    else {
-                        _this.element.style.bottom = _KeyboardInfo._KeyboardInfo._layoutViewportCoords.visibleDocBottom + "px";
-                    }
-                    return closeAnimation.execute().then(function () {
-                        _this._synchronousClose();
-                        _this.element.style.position = "";
-                        _this.element.style.top = _this._adjustedOffsets.top;
-                        _this.element.style.bottom = _this._adjustedOffsets.bottom;
-                    });
-                },
-                onUpdateDom: function () {
-                    _this._updateDomImpl();
-                },
-                onUpdateDomWithIsOpened: function (isOpened) {
-                    _this._isOpenedMode = isOpened;
-                    _this._updateDomImpl();
-                }
-            });
-            // Events
-            this._handleShowingKeyboardBound = this._handleShowingKeyboard.bind(this);
-            this._handleHidingKeyboardBound = this._handleHidingKeyboard.bind(this);
-            _ElementUtilities._inputPaneListener.addEventListener(this._dom.root, "showing", this._handleShowingKeyboardBound);
-            _ElementUtilities._inputPaneListener.addEventListener(this._dom.root, "hiding", this._handleHidingKeyboardBound);
-            // Initialize private state.
-            this._disposed = false;
-            this._cachedClosedHeight = null;
-            this._commandingSurface = new _CommandingSurface._CommandingSurface(this._dom.commandingSurfaceEl, { openCloseMachine: stateMachine });
-            addClass(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-actionarea"), _Constants.ClassNames.actionAreaCssClass);
-            addClass(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-overflowarea"), _Constants.ClassNames.overflowAreaCssClass);
-            addClass(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-overflowbutton"), _Constants.ClassNames.overflowButtonCssClass);
-            addClass(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-ellipsis"), _Constants.ClassNames.ellipsisCssClass);
-            this._isOpenedMode = _Constants.defaultOpened;
-            this._dismissable = new _LightDismissService.LightDismissableElement({
-                element: this._dom.root,
-                tabIndex: this._dom.root.hasAttribute("tabIndex") ? this._dom.root.tabIndex : -1,
-                onLightDismiss: function () {
-                    _this.close();
-                },
-                onTakeFocus: function (useSetActive) {
-                    _this._dismissable.restoreFocus() || _this._commandingSurface.takeFocus(useSetActive);
-                }
-            });
-            // Initialize public properties.
-            this.closedDisplayMode = _Constants.defaultClosedDisplayMode;
-            this.placement = _Constants.defaultPlacement;
-            this.opened = this._isOpenedMode;
-            _Control.setOptions(this, options);
-            // Exit the Init state.
-            _ElementUtilities._inDom(this.element).then(function () {
-                return _this._commandingSurface.initialized;
-            }).then(function () {
-                stateMachine.exitInit();
-                _this._writeProfilerMark("constructor,StopTM");
-            });
-        }
-        Object.defineProperty(AppBar.prototype, "element", {
-            /// <field type="HTMLElement" domElement="true" hidden="true" locid="WinJS.UI.AppBar.element" helpKeyword="WinJS.UI.AppBar.element">
-            /// Gets the DOM element that hosts the AppBar.
-            /// </field>
-            get: function () {
-                return this._dom.root;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(AppBar.prototype, "data", {
-            /// <field type="WinJS.Binding.List" locid="WinJS.UI.AppBar.data" helpKeyword="WinJS.UI.AppBar.data">
-            /// Gets or sets the Binding List of WinJS.UI.Command for the AppBar.
-            /// </field>
-            get: function () {
-                return this._commandingSurface.data;
-            },
-            set: function (value) {
-                this._commandingSurface.data = value;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(AppBar.prototype, "closedDisplayMode", {
-            /// <field type="String" locid="WinJS.UI.AppBar.closedDisplayMode" helpKeyword="WinJS.UI.AppBar.closedDisplayMode">
-            /// Gets or sets the closedDisplayMode for the AppBar. Values are "none", "minimal", "compact" and "full".
-            /// </field>
-            get: function () {
-                return this._commandingSurface.closedDisplayMode;
-            },
-            set: function (value) {
-                if (ClosedDisplayMode[value]) {
-                    this._commandingSurface.closedDisplayMode = value;
-                    this._cachedClosedHeight = null;
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(AppBar.prototype, "placement", {
-            /// <field type="Boolean" hidden="true" locid="WinJS.UI.AppBar.placement" helpKeyword="WinJS.UI.AppBar.placement">
-            /// Gets or sets a value that specifies whether the AppBar appears at the top or bottom of the main view.
-            /// </field>
-            get: function () {
-                return this._placement;
-            },
-            set: function (value) {
-                if (Placement[value] && this._placement !== value) {
-                    this._placement = value;
-                    switch (value) {
-                        case Placement.top:
-                            this._commandingSurface.overflowDirection = "bottom";
-                            break;
-                        case Placement.bottom:
-                            this._commandingSurface.overflowDirection = "top";
-                            break;
-                    }
-                    this._adjustedOffsets = this._computeAdjustedOffsets();
-                    this._commandingSurface.deferredDomUpate();
-                }
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(AppBar.prototype, "opened", {
-            /// <field type="Boolean" hidden="true" locid="WinJS.UI.AppBar.opened" helpKeyword="WinJS.UI.AppBar.opened">
-            /// Gets or sets whether the AppBar is currently opened.
-            /// </field>
-            get: function () {
-                return this._commandingSurface.opened;
-            },
-            set: function (value) {
-                this._commandingSurface.opened = value;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        AppBar.prototype.open = function () {
-            /// <signature helpKeyword="WinJS.UI.AppBar.open">
-            /// <summary locid="WinJS.UI.AppBar.open">
-            /// Opens the AppBar
-            /// </summary>
-            /// </signature>
-            this._commandingSurface.open();
-        };
-        AppBar.prototype.close = function () {
-            /// <signature helpKeyword="WinJS.UI.AppBar.close">
-            /// <summary locid="WinJS.UI.AppBar.close">
-            /// Closes the AppBar
-            /// </summary>
-            /// </signature>
-            this._commandingSurface.close();
-        };
-        AppBar.prototype.dispose = function () {
-            /// <signature helpKeyword="WinJS.UI.AppBar.dispose">
-            /// <summary locid="WinJS.UI.AppBar.dispose">
-            /// Disposes this AppBar.
-            /// </summary>
-            /// </signature>
-            if (this._disposed) {
-                return;
-            }
-            this._disposed = true;
-            _LightDismissService.hidden(this._dismissable);
-            // Disposing the _commandingSurface will trigger dispose on its OpenCloseMachine
-            // and synchronously complete any animations that might have been running.
-            this._commandingSurface.dispose();
-            _ElementUtilities._inputPaneListener.removeEventListener(this._dom.root, "showing", this._handleShowingKeyboardBound);
-            _ElementUtilities._inputPaneListener.removeEventListener(this._dom.root, "hiding", this._handleHidingKeyboardBound);
-            _Dispose.disposeSubTree(this.element);
-        };
-        AppBar.prototype.forceLayout = function () {
-            /// <signature helpKeyword="WinJS.UI.AppBar.forceLayout">
-            /// <summary locid="WinJS.UI.AppBar.forceLayout">
-            /// Forces the AppBar to update its layout. Use this function when the window did not change size, but the container of the AppBar changed size.
-            /// </summary>
-            /// </signature>
-            this._commandingSurface.forceLayout();
-        };
-        AppBar.prototype.getCommandById = function (id) {
-            /// <signature helpKeyword="WinJS.UI.AppBar.getCommandById">
-            /// <summary locid="WinJS.UI.AppBar.getCommandById">
-            /// Retrieves the command with the specified ID from this AppBar.
-            /// If more than one command is found, this method returns the first command found.
-            /// </summary>
-            /// <param name="id" type="String" locid="WinJS.UI.AppBar.getCommandById_p:id">Id of the command to return.</param>
-            /// <returns type="object" locid="WinJS.UI.AppBar.getCommandById_returnValue">
-            /// The command found, or null if no command is found.
-            /// </returns>
-            /// </signature>
-            return this._commandingSurface.getCommandById(id);
-        };
-        AppBar.prototype.showOnlyCommands = function (commands) {
-            /// <signature helpKeyword="WinJS.UI.AppBar.showOnlyCommands">
-            /// <summary locid="WinJS.UI.AppBar.showOnlyCommands">
-            /// Show the specified commands, hiding all of the others in the AppBar.
-            /// </summary>
-            /// <param name="commands" type="Array" locid="WinJS.UI.AppBar.showOnlyCommands_p:commands">
-            /// An array of the commands to show. The array elements may be Command objects, or the string identifiers (IDs) of commands.
-            /// </param>
-            /// </signature>
-            return this._commandingSurface.showOnlyCommands(commands);
-        };
-        AppBar.prototype._writeProfilerMark = function (text) {
-            _WriteProfilerMark("WinJS.UI.AppBar:" + this._id + ":" + text);
-        };
-        AppBar.prototype._initializeDom = function (root) {
-            this._writeProfilerMark("_intializeDom,info");
-            // Attaching JS control to DOM element
-            root["winControl"] = this;
-            this._id = root.id || _ElementUtilities._uniqueID(root);
-            _ElementUtilities.addClass(root, _Constants.ClassNames.controlCssClass);
-            _ElementUtilities.addClass(root, _Constants.ClassNames.disposableCssClass);
-            // Make sure we have an ARIA role
-            var role = root.getAttribute("role");
-            if (!role) {
-                root.setAttribute("role", "menubar");
-            }
-            var label = root.getAttribute("aria-label");
-            if (!label) {
-                root.setAttribute("aria-label", strings.ariaLabel);
-            }
-            // Create element for commandingSurface and reparent any declarative Commands.
-            // commandingSurface will parse child elements as AppBarCommands.
-            var commandingSurfaceEl = document.createElement("DIV");
-            _ElementUtilities._reparentChildren(root, commandingSurfaceEl);
-            root.appendChild(commandingSurfaceEl);
-            this._dom = {
-                root: root,
-                commandingSurfaceEl: commandingSurfaceEl,
-            };
-        };
-        AppBar.prototype._handleShowingKeyboard = function (event) {
-            // If the IHM resized the window, we can rely on -ms-device-fixed positioning to remain visible.
-            // If the IHM does not resize the window we will need to adjust our offsets to avoid being occluded
-            // The IHM does not cause a window resize to happen right away, set a timeout to check if the viewport
-            // has been resized after enough time has passed for both the IHM animation, and scroll-into-view, to
-            // complete.
-            var _this = this;
-            // If focus is in the AppBar, tell the platform we will move ourselves.
-            if (this._dom.root.contains(_Global.document.activeElement)) {
-                var inputPaneEvent = event.detail.originalEvent;
-                inputPaneEvent.ensuredFocusedElementInView = true;
-            }
-            var duration = keyboardInfo._animationShowLength + keyboardInfo._scrollTimeout;
-            // Returns a promise for unit tests to verify the correct behavior after the timeout.
-            return Promise.timeout(duration).then(function () {
-                if (_this._shouldAdjustForShowingKeyboard() && !_this._disposed) {
-                    _this._adjustedOffsets = _this._computeAdjustedOffsets();
-                    _this._commandingSurface.deferredDomUpate();
-                }
-            });
-        };
-        AppBar.prototype._shouldAdjustForShowingKeyboard = function () {
-            // Overwriteable for unit tests
-            // Determines if an AppBar needs to adjust its position to move in response to a shown IHM, or if it can
-            // just ride the bottom of the visual viewport to remain visible. The latter requires that the IHM has
-            // caused the viewport to resize.
-            return keyboardInfo._visible && !keyboardInfo._isResized;
-        };
-        AppBar.prototype._handleHidingKeyboard = function () {
-            var _this = this;
-            var duration = keyboardInfo._animationShowLength + keyboardInfo._scrollTimeout;
-            Promise.timeout(duration).then(function () {
-                // Make sure AppBar has the correct offsets since it could have been displaced by the IHM.
-                _this._adjustedOffsets = _this._computeAdjustedOffsets();
-                _this._commandingSurface.deferredDomUpate();
-            });
-        };
-        AppBar.prototype._computeAdjustedOffsets = function () {
-            // Position the AppBar element relative to the top or bottom edge of the visible
-            // document.
-            var offsets = { top: "", bottom: "" };
-            if (this._placement === Placement.bottom) {
-                // If the IHM is open, the bottom of the visual viewport may or may not be occluded
-                offsets.bottom = keyboardInfo._visibleDocBottomOffset + "px";
-            }
-            else if (this._placement === Placement.top) {
-                offsets.top = keyboardInfo._visibleDocTop + "px";
-            }
-            return offsets;
-        };
-        AppBar.prototype._synchronousOpen = function () {
-            this._isOpenedMode = true;
-            this._updateDomImpl();
-        };
-        AppBar.prototype._synchronousClose = function () {
-            this._isOpenedMode = false;
-            this._updateDomImpl();
-        };
-        AppBar.prototype._updateDomImpl = function () {
-            var rendered = this._updateDomImpl_renderedState;
-            if (rendered.isOpenedMode !== this._isOpenedMode) {
-                if (this._isOpenedMode) {
-                    this._updateDomImpl_renderOpened();
-                }
-                else {
-                    this._updateDomImpl_renderClosed();
-                }
-                rendered.isOpenedMode = this._isOpenedMode;
-            }
-            if (rendered.placement !== this.placement) {
-                removeClass(this._dom.root, placementClassMap[rendered.placement]);
-                addClass(this._dom.root, placementClassMap[this.placement]);
-                rendered.placement = this.placement;
-            }
-            if (rendered.closedDisplayMode !== this.closedDisplayMode) {
-                removeClass(this._dom.root, closedDisplayModeClassMap[rendered.closedDisplayMode]);
-                addClass(this._dom.root, closedDisplayModeClassMap[this.closedDisplayMode]);
-                rendered.closedDisplayMode = this.closedDisplayMode;
-            }
-            if (rendered.adjustedOffsets.top !== this._adjustedOffsets.top) {
-                this._dom.root.style.top = this._adjustedOffsets.top;
-                rendered.adjustedOffsets.top = this._adjustedOffsets.top;
-            }
-            if (rendered.adjustedOffsets.bottom !== this._adjustedOffsets.bottom) {
-                this._dom.root.style.bottom = this._adjustedOffsets.bottom;
-                rendered.adjustedOffsets.bottom = this._adjustedOffsets.bottom;
-            }
-            this._commandingSurface.updateDom();
-        };
-        AppBar.prototype._getClosedHeight = function () {
-            if (this._cachedClosedHeight === null) {
-                var wasOpen = this._isOpenedMode;
-                if (this._isOpenedMode) {
-                    this._synchronousClose();
-                }
-                this._cachedClosedHeight = this._commandingSurface.getBoundingRects().commandingSurface.height;
-                if (wasOpen) {
-                    this._synchronousOpen();
-                }
-            }
-            return this._cachedClosedHeight;
-        };
-        AppBar.prototype._updateDomImpl_renderOpened = function () {
-            addClass(this._dom.root, _Constants.ClassNames.openedClass);
-            removeClass(this._dom.root, _Constants.ClassNames.closedClass);
-            this._commandingSurface.synchronousOpen();
-            _LightDismissService.shown(this._dismissable); // Call at the start of the open animation
-        };
-        AppBar.prototype._updateDomImpl_renderClosed = function () {
-            addClass(this._dom.root, _Constants.ClassNames.closedClass);
-            removeClass(this._dom.root, _Constants.ClassNames.openedClass);
-            this._commandingSurface.synchronousClose();
-            _LightDismissService.hidden(this._dismissable); // Call after the close animation
-        };
-        /// <field locid="WinJS.UI.AppBar.ClosedDisplayMode" helpKeyword="WinJS.UI.AppBar.ClosedDisplayMode">
-        /// Display options for the AppBar when closed.
-        /// </field>
-        AppBar.ClosedDisplayMode = ClosedDisplayMode;
-        /// <field locid="WinJS.UI.AppBar.Placement" helpKeyword="WinJS.UI.AppBar.Placement">
-        /// Display options for AppBar placement in relation to the main view.
-        /// </field>
-        AppBar.Placement = Placement;
-        AppBar.supportedForProcessing = true;
-        return AppBar;
-    })();
-    exports.AppBar = AppBar;
-    _Base.Class.mix(AppBar, _Events.createEventProperties(_Constants.EventNames.beforeOpen, _Constants.EventNames.afterOpen, _Constants.EventNames.beforeClose, _Constants.EventNames.afterClose));
-    // addEventListener, removeEventListener, dispatchEvent
-    _Base.Class.mix(AppBar, _Control.DOMEventMixin);
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-/// <reference path="../../../../typings/require.d.ts" />
-define('WinJS/Controls/AppBar',["require", "exports", '../Core/_Base'], function (require, exports, _Base) {
-    var module = null;
-    _Base.Namespace.define("WinJS.UI", {
-        AppBar: {
-            get: function () {
-                if (!module) {
-                    require(["./AppBar/_AppBar"], function (m) {
-                        module = m;
-                    });
-                }
-                return module.AppBar;
-            }
-        }
-    });
-});
-
-// Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information.
-define('ui',[
-    'WinJS/Core/_WinJS',
-    'WinJS/VirtualizedDataSource',
-    'WinJS/Vui',
-    'WinJS/Controls/IntrinsicControls',
-    'WinJS/Controls/ListView',
-    'WinJS/Controls/FlipView',
-    'WinJS/Controls/ItemContainer',
-    'WinJS/Controls/Repeater',
-    'WinJS/Controls/DatePicker',
-    'WinJS/Controls/TimePicker',
-    'WinJS/Controls/BackButton',
-    'WinJS/Controls/Rating',
-    'WinJS/Controls/ToggleSwitch',
-    'WinJS/Controls/SemanticZoom',
-    'WinJS/Controls/Pivot',
-    'WinJS/Controls/Hub',
-    'WinJS/Controls/Flyout',
-    'WinJS/Controls/_LegacyAppBar',
-    'WinJS/Controls/Menu',
-    'WinJS/Controls/SearchBox',
-    'WinJS/Controls/SettingsFlyout',
-    'WinJS/Controls/NavBar',
-    'WinJS/Controls/Tooltip',
-    'WinJS/Controls/ViewBox',
-    'WinJS/Controls/ContentDialog',
-    'WinJS/Controls/SplitView',
-    'WinJS/Controls/SplitViewPaneToggle',
-    'WinJS/Controls/SplitView/Command',
-    'WinJS/Controls/ToolBar',
-    'WinJS/Controls/AppBar',
-    ], function (_WinJS) {
-    "use strict";
-
-    return _WinJS;
-});
-
-        require(['WinJS/Core/_WinJS', 'ui'], function (_WinJS) {
-            // WinJS always publishes itself to global
-            globalObject.WinJS = _WinJS;
-            if (typeof module !== 'undefined') {
-                // This is a CommonJS context so publish to exports
-                module.exports = _WinJS;
-            }
-        });
-        return globalObject.WinJS;
-    }));
-}());
-
diff --git a/node_modules/winjs/js/ui.min.js b/node_modules/winjs/js/ui.min.js
deleted file mode 100644
index 592fb23..0000000
--- a/node_modules/winjs/js/ui.min.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/*! Copyright (c) Microsoft Corporation.  All Rights Reserved. Licensed under the MIT License. See License.txt in the project root for license information. */
-!function(){var a="undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:{};!function(b){"function"==typeof define&&define.amd?define(["./base"],b):(a.msWriteProfilerMark&&msWriteProfilerMark("WinJS.4.4 4.4.2.winjs.2017.3.14 ui.js,StartTM"),b("object"==typeof exports&&"string"!=typeof exports.nodeName?require("./base"):a.WinJS),a.msWriteProfilerMark&&msWriteProfilerMark("WinJS.4.4 4.4.2.winjs.2017.3.14 ui.js,StopTM"))}(function(b){var c=b.Utilities._require,d=b.Utilities._define;d("WinJS/VirtualizedDataSource/_VirtualizedDataSourceImpl",["exports","../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Events","../Core/_Log","../Core/_Resources","../Core/_WriteProfilerMark","../Promise","../Scheduler","../_Signal","../Utilities/_UI"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){"use strict";c.Namespace._moduleDefine(a,"WinJS.UI",{VirtualizedDataSource:c.Namespace._lazy(function(){function a(a,c){function f(a){var b="WinJS.UI.VirtualizedDataSource:"+pd+":"+a+",StartTM";i(b),g.log&&g.log(b,"winjs vds","perf")}function u(a){var b="WinJS.UI.VirtualizedDataSource:"+pd+":"+a+",StopTM";i(b),g.log&&g.log(b,"winjs vds","perf")}function v(a){return"number"==typeof a&&a>=0}function w(a){return v(a)&&a===Math.floor(a)}function x(a){if(null===a)a=void 0;else if(void 0!==a&&!w(a))throw new e("WinJS.UI.ListDataSource.InvalidIndexReturned",s.invalidIndexReturned);return a}function y(a){if(null===a)a=void 0;else if(void 0!==a&&!w(a)&&a!==p.unknown)throw new e("WinJS.UI.ListDataSource.InvalidCountReturned",s.invalidCountReturned);return a}function z(){var a=(nc++).toString(),b={handle:a,item:null,itemNew:null,fetchListeners:null,cursorCount:0,bindingMap:null};return Nc[a]=b,b}function A(){return z()}function B(a,b){a.prev=b.prev,a.next=b,a.prev.next=a,b.prev=a}function C(a){a.lastInSequence&&(delete a.lastInSequence,a.prev.lastInSequence=!0),a.firstInSequence&&(delete a.firstInSequence,a.next.firstInSequence=!0),a.prev.next=a.next,a.next.prev=a.prev}function D(a){for(;!a.firstInSequence;)a=a.prev;return a}function E(a){for(;!a.lastInSequence;)a=a.next;return a}function F(a,b,c){return b.prev.next=c.next,c.next.prev=b.prev,b.prev=a.prev,c.next=a,b.prev.next=b,a.prev=c,!0}function G(a,b,c){return b.prev.next=c.next,c.next.prev=b.prev,b.prev=a,c.next=a.next,a.next=b,c.next.prev=c,!0}function H(a){delete a.lastInSequence,delete a.next.firstInSequence}function I(a){var b=a.next;a.lastInSequence=!0,b.firstInSequence=!0,b===Lc&&na(Lc,void 0)}function J(a,b,c,d){B(a,b);var e=a.prev;e.lastInSequence&&(c?delete e.lastInSequence:a.firstInSequence=!0,d?delete b.firstInSequence:a.lastInSequence=!0)}function K(a,b){a.key=b,Oc[a.key]=a}function L(a,b,c){+b===b&&(a.index=b,c[b]=a,Ac||(a.firstInSequence&&a.prev&&a.prev.index===b-1&&H(a.prev),a.lastInSequence&&a.next&&a.next.index===b+1&&H(a)))}function M(a,b){var c=b===Pc?A():z();return B(c,a),c}function N(a,b,c){var d=M(a,c);return d.firstInSequence=!0,d.lastInSequence=!0,L(d,b,c),d}function O(a,b){return N(a,b,Pc)}function P(a,b){var c=M(a,b);return delete a.firstInSequence,c.prev.index===c.index-1?delete c.prev.lastInSequence:c.firstInSequence=!0,L(c,a.index-1,b),c}function Q(a,b){var c=M(a.next,b);return delete a.lastInSequence,c.next.index===c.index+1?delete c.next.firstInSequence:c.lastInSequence=!0,L(c,a.index+1,b),c}function R(a,b,c,d){J(a,b,c,d),Oc[a.key]=a,void 0!==a.index&&(Pc[a.index]=a)}function S(a){C(a),a.key&&delete Oc[a.key],void 0!==a.index&&Pc[a.index]===a&&delete Pc[a.index];var b=a.bindingMap;for(var c in b){var d=b[c].handle;d&&Nc[d]===a&&delete Nc[d]}Nc[a.handle]===a&&delete Nc[a.handle]}function T(a){return!Nc[a.handle]}function U(a,b,c,d,e){var f=e?null:b[a-1];if(f&&(f.next!==d||d.firstInSequence))f=f.next;else if(f=b[a+1],!f){f=c.next;for(var g;;){if(f.firstInSequence&&(g=f),!(a>=f.index)||f===d)break;f=f.next}f!==d||d.firstInSequence||(f=g&&void 0===g.index?g:void 0)}return f}function V(a){return!a.item&&!a.itemNew&&a!==Lc}function W(a,b){Object.defineProperty(a,"handle",{value:b,writable:!1,enumerable:!1,configurable:!0})}function X(a,b,c){W(a,c),Object.defineProperty(a,"index",{get:function(){for(;b.slotMergedWith;)b=b.slotMergedWith;return b.index},enumerable:!1,configurable:!0})}function Y(a){if(void 0===a)return a;var b=JSON.stringify(a);if(void 0===b)throw new e("WinJS.UI.ListDataSource.ObjectIsNotValidJson",s.objectIsNotValidJson);return b}function Z(b){return a.itemSignature?a.itemSignature(b.data):Y(b.data)}function $(b){var c=b.itemNew;b.itemNew=null,c&&(c=Object.create(c),X(c,b,b.handle),a.compareByIdentity||(b.signature=Z(c))),b.item=c,delete b.indexRequested,delete b.keyRequested}function _(a){return a.bindingMap||a.cursorCount>0}function aa(a){return _(a)||a.fetchListeners||a.directFetchListeners}function ba(a){return aa(a)||!a.firstInSequence&&_(a.prev)||!a.lastInSequence&&_(a.next)||!id&&(!a.firstInSequence&&a.prev!==Kc&&!(a.prev.item||a.prev.itemNew))|(!a.lastInSequence&&a.next!==Lc&&!(a.next.item||a.next.itemNew))}function ca(a){I(a),S(a)}function da(){if(!vc){Rc&&!T(Rc)||(Rc=Lc.prev);for(var a=Rc.prev,b=Rc.next,c=0,d=function(a){a===Lc||ba(a)||(hc>=c?c++:ca(a))};a||b;){if(a){var e=a;a=e.prev,e!==Kc&&d(e)}if(b){var f=b;b=f.next,f!==Mc&&d(f)}}Qc=0}}function ea(a){aa(a)||(Qc++,vc||Uc||(Rc=a,Qc>hc&&!Sc&&(Sc=!0,k.schedule(function(){Sc=!1,da()},k.Priority.idle,null,"WinJS.UI.VirtualizedDataSource.releaseSlotIfUnrequested"))))}function fa(a){for(var b in lc)a(lc[b])}function ga(a,b){for(var c in a.bindingMap)b(a.bindingMap[c].bindingRecord,c)}function ha(a){return a.notificationsSent||(a.notificationsSent=!0,a.notificationHandler.beginNotifications&&a.notificationHandler.beginNotifications()),a.notificationHandler}function ia(){sc||yc||fa(function(a){a.notificationsSent&&(a.notificationsSent=!1,a.notificationHandler.endNotifications&&a.notificationHandler.endNotifications())})}function ja(a,b){var c=a.bindingMap;if(c){var d=c[b];if(d){var e=d.handle;if(e)return e}}return a.handle}function ka(a,b){return a&&a.handle!==b&&(a=Object.create(a),W(a,b)),a}function la(a){var b=Jc;Jc=a,fa(function(a){a.notificationHandler&&a.notificationHandler.countChanged&&ha(a).countChanged(Jc,b)})}function ma(a,b){ga(a,function(c,d){c.notificationHandler.indexChanged&&ha(c).indexChanged(ja(a,d),a.index,b)})}function na(a,b){var c=a.index;if(void 0!==c&&Pc[c]===a&&delete Pc[c],+b===b)L(a,b,Pc);else{if(+c!==c)return;delete a.index}ma(a,c)}function oa(a,b,c,d,e){var f={};if((d||!b.lastInSequence)&&(e||!c.firstInSequence))if(b===Kc)if(c===Lc)for(var g in lc)f[g]=lc[g];else for(var g in c.bindingMap)f[g]=lc[g];else if(c===Lc||c.bindingMap)for(var g in b.bindingMap)(c===Lc||c.bindingMap[g])&&(f[g]=lc[g]);for(var g in a.bindingMap)f[g]=lc[g];return f}function pa(a){var b,c=a.prev,d=a.next,e=oa(a,c,d);for(b in e){var f=e[b];f.notificationHandler&&ha(f).inserted(f.itemPromiseFromKnownSlot(a),c.lastInSequence||c===Kc?null:ja(c,b),d.firstInSequence||d===Lc?null:ja(d,b))}}function qa(a){var b=a.item;$(a),ga(a,function(c,d){var e=ja(a,d);ha(c).changed(ka(a.item,e),ka(b,e))})}function ra(a,b,c,d,e){var f,g=b.prev;if(b===a){if(!a.firstInSequence||!c)return;b=a.next}else if(g===a){if(!a.lastInSequence||!d)return;g=a.prev}if(!e){var h=oa(a,g,b,c,d);for(f in h){var i=h[f];ha(i).moved(i.itemPromiseFromKnownSlot(a),(g.lastInSequence||g===a.prev)&&!c||g===Kc?null:ja(g,f),(b.firstInSequence||b===a.next)&&!d||b===Lc?null:ja(b,f))}fa(function(b){b.adjustCurrentSlot(a)})}C(a),J(a,b,c,d)}function sa(a,b){Ba(a,!0),ga(a,function(c,d){ha(c).removed(ja(a,d),b)}),fa(function(b){b.adjustCurrentSlot(a)}),S(a)}function ta(a){for(;!a.firstInSequence;)a=a.prev;var b;do{b=a.lastInSequence;var c=a.next;sa(a,!0),a=c}while(!b)}function ua(a){var b;if(!a)return b;for(var c=0;!a.firstInSequence;)c++,a=a.prev;return"number"==typeof a.indexNew?a.indexNew+c:"number"==typeof a.index?a.index+c:b}function va(a,b){for(a=a.next;a;a=a.next)if(a.firstInSequence){var c=void 0!==a.indexNew?a.indexNew:a.index;void 0!==c&&(a.indexNew=c+b)}zc+=b,Ac=!0,Uc?wb():Cc++}function wa(a,b){if(a.firstInSequence){var c;if(0>b)c=a.indexNew,void 0!==c?delete a.indexNew:c=a.index,a.lastInSequence||(a=a.next,void 0!==c&&(a.indexNew=c));else if(!a.lastInSequence){var d=a.next;c=d.indexNew,void 0!==c?delete d.indexNew:c=d.index,void 0!==c&&(a.indexNew=c)}}va(a,b)}function xa(a,b){for(var c=Kc;c!==Lc;c=c.next){var d=c.indexNew;if(void 0!==d&&d>=a){va(c,b);break}}}function ya(){var a,b,c;for(a=Kc;;a=a.next){if(a.firstInSequence){if(b=a,void 0!==a.indexNew){if(c=a.indexNew,delete a.indexNew,isNaN(c))break}else c=a.index;a!==Kc&&a.prev.index===c-1&&H(a.prev)}if(a.lastInSequence)for(var d=c,e=b;e!==a.next;e=e.next)d!==e.index&&na(e,d),+d===d&&d++;if(a===Lc)break}for(;a!==Mc;a=a.next)void 0!==a.index&&a!==Lc&&na(a,void 0);Ac=!1,zc&&+Jc===Jc&&(pc?pc.reset():la(Jc+zc),zc=0)}function za(a,b,c,d,e){if(a.item)return new j(function(b){e?e(b,a.item):b(a.item)});var f={listBindingID:d,retained:!1};return a[b]||(a[b]={}),a[b][c]=f,f.promise=new j(function(a,b){f.complete=e?function(b){e(a,b)}:a,f.error=b},function(){for(;a.slotMergedWith;)a=a.slotMergedWith;var d=a[b];if(d){if(delete d[c],Object.keys(d).length>0)return;delete a[b]}ea(a)}),f.promise}function Aa(a,b){for(var c in b)b[c].complete(a)}function Ba(a,b){var c=a.fetchListeners,d=a.directFetchListeners;if(c||d){$(a);var e=a.item,f=function(a){b?Aa(e,a):Gc.push(function(){Aa(e,a)})};d&&(a.directFetchListeners=null,f(d)),c&&(a.fetchListeners=null,f(c)),ea(a)}}function Ca(){var a=Gc;Gc=[];for(var b=0,c=a.length;c>b;b++)a[b]()}function Da(a,b){var c=a.directFetchListeners;if(c){a.directFetchListeners=null;for(var d in c)c[d].error(b);ea(a)}}function Ea(a){return a.firstInSequence&&P(a,Pc),a.lastInSequence&&Q(a,Pc),a.itemNew&&$(a),ab(),a}function Fa(a){if(!a.firstInSequence){var b=a.prev;return b===Kc?null:Ea(b)}return Ea(P(a,Pc))}function Ga(a){if(!a.lastInSequence){var b=a.next;return b===Lc?null:Ea(b)}return Ea(Q(a,Pc))}function Ha(a){return a?za(a,"directFetchListeners",(oc++).toString()):j.wrap(null)}function Ia(a){if("string"!=typeof a||!a)throw new e("WinJS.UI.ListDataSource.KeyIsInvalid",s.keyIsInvalid)}function Ja(a){var b=O(Mc);return K(b,a),b.keyRequested=!0,b}function Ka(a,b){Ia(a);var c=Oc[a];return c||(c=Ja(a),c.hints=b),Ea(c)}function La(a){if("number"!=typeof a||0>a)throw new e("WinJS.UI.ListDataSource.IndexIsInvalid",s.indexIsInvalid);if(Lc.index<=a)return null;var b=Pc[a];if(!b){var c=U(a,Pc,Kc,Lc);if(!c)return null;c===Lc&&a>=Lc&&na(Lc,void 0),b=c.prev.index===a-1?Q(c.prev,Pc):c.index===a+1?P(c,Pc):O(c,a)}return b.item||(b.indexRequested=!0),Ea(b)}function Ma(a){var b=O(Mc);return b.description=a,Ea(b)}function Na(a){if(jc=a,ic!==jc){var c=function(){kc=!1,ic!==jc&&(ic=jc,qd.dispatchEvent(t,ic))};jc===o.failure?c():kc||(kc=!0,b.setTimeout(c,40))}}function Oa(a){var b=a.fetchID;return b&&Fc[b]}function Pa(a,b){a.fetchID=b}function Qa(){var a=Ec;return Ec++,Fc[a]=!0,a}function Ra(a,b,c){var d=Qa();Pa(a,d);for(var e=a;!e.firstInSequence&&b>0;)e=e.prev,b--,Pa(e,d);for(var f=a;!f.lastInSequence&&c>0;)f=f.next,c--,Pa(f,d);return d}function Sa(a){var b=a.items,c=a.offset,d=a.totalCount,e=a.absoluteIndex,f=a.atStart,g=a.atEnd;if(v(e)){if(v(d)){var h=b.length;e-c+h===d&&(g=!0)}c===e&&(f=!0)}f&&(b.unshift(Hc),a.offset++),g&&b.push(Ic)}function Ta(a,b,c){return delete Fc[c],b!==Cc||T(a)?(ab(),!1):!0}function Ua(a,b,c,d){var g=Cc;c.then(function(c){if(!c.items||!c.items.length)return j.wrapError(new e(q.doesNotExist));var h="itemsFetched id="+b+" count="+c.items.length;f(h),Ta(a,g,b)&&(+d===d&&(c.absoluteIndex=d),Sa(c),qb(a,c.items,c.offset,c.totalCount,c.absoluteIndex)),u(h)}).then(null,function(c){Ta(a,g,b)&&rb(a,c)})}function Va(a,b,c,d){var g=Cc;d.then(function(d){if(!d.items||!d.items.length)return j.wrapError(new e(q.doesNotExist));var h="itemsFetched id="+c+" count="+d.items.length;f(h),Ta(b,g,c)&&(d.absoluteIndex=a,Sa(d),sb(a,b,d.items,d.offset,d.totalCount,d.absoluteIndex)),u(h)}).then(null,function(){Ta(b,g,c)&&tb(a,b,g)})}function Wa(a,b){var c=Ra(a,0,b-1);jd?Ua(a,c,jd(c,b),0):Ua(a,c,id(c,0,0,b-1),0)}function Xa(a,b){var c=Ra(a,b-1,0);Ua(a,c,kd(c,b))}function Ya(a,b,c){var d=Ra(a,b,c);Ua(a,d,hd(d,a.key,b,c,a.hints))}function Za(a,b,c){var d=a.index;if(b>d&&(b=d),id){var e=Ra(a,b,c);Ua(a,e,id(e,d,b,c),d)}else if(a.key)Ya(a,b,c);else{var f,g,h=Kc,i=d+1;for(f=a.prev;f!==Kc;f=f.prev)if(void 0!==f.index&&f.key){g=d-f.index,i>g&&(i=g,h=f);break}for(f=a.next;f!==Lc;f=f.next)if(void 0!==f.index&&f.key){g=f.index-d,i>g&&(i=g,h=f);break}if(h===Kc){var e=Ra(a,0,d+1);Va(0,a,e,jd(e,d+1))}else{var j=Math.max(h.index-d,0),k=Math.max(d-h.index,0),e=Ra(h,j,k);Va(h.index,a,e,hd(e,h.key,j,k,a.hints))}}}function $a(a,b,c){var d=Ra(a,b,c);Ua(a,d,ld(d,a.description,b,c))}function _a(){if(!Uc){for(var a,b,c,d,e,f,g,h,i=!1,j=!1,k=Kc.next;k!==Mc;){var l=k.next;if(k!==Lc&&V(k)&&(j=!0,a?b++:(a=k,b=1),Oa(k)&&(i=!0),k.keyRequested&&!c&&(c=k,d=b-1),void 0===k.description||e||(e=k,f=b-1),k.indexRequested&&!g&&(g=k,h=b-1),k.lastInSequence||l===Mc||!V(l))){if(i)i=!1;else{if(qc=!1,!a.firstInSequence&&a.prev.key&&hd?Ya(a.prev,0,b):!k.lastInSequence&&l.key&&hd?Ya(l,b,0):a.prev!==Kc||a.firstInSequence||!jd&&!id?l===Lc&&!k.lastInSequence&&kd?Xa(k,b):c?Ya(c,d,b-1-d):e?$a(e,f,b-1-f):g?Za(g,h,b-1-h):"number"==typeof a.index?Za(a,b-1,0):ta(a):Wa(a,b),qc)return void ab();if(Uc)return}a=g=c=null}k=l}Na(j?o.waiting:o.ready)}}function ab(){Dc||(Dc=!0,k.schedule(function(){Dc=!1,_a(),ia()},k.Priority.max,null,"WinJS.UI.ListDataSource._fetch"))}function bb(b){var c=b.itemNew;if(!c)return!1;var d=b.item;for(var e in d)switch(e){case"data":break;default:if(d[e]!==c[e])return!0}return a.compareByIdentity?d.data!==c.data:b.signature!==Z(c)}function cb(a){aa(a)?bb(a)?qa(a):a.itemNew=null:a.item=null}function db(a){a.item?cb(a):Ba(a)}function eb(a,b){a.key||K(a,b.key),a.itemNew=b,db(a)}function fb(a,b,c){var d=b.bindingMap;if(d)for(var e in c)if(d[e]){var f=b.fetchListeners;for(var g in f){var h=f[g];h.listBindingID===e&&h.retained&&(delete f[g],h.complete(null))}var i=d[e].bindingRecord;ha(i).removed(ja(b,e),!0,ja(a,e)),b.bindingMap&&delete b.bindingMap[e]}}function gb(a,b){if(a.index!==b.index){var c=b.index;b.index=a.index,ma(b,c)}b.slotMergedWith=a;var d=b.bindingMap;for(var e in d){a.bindingMap||(a.bindingMap={});var f=d[e];f.handle||(f.handle=b.handle),Nc[f.handle]=a,a.bindingMap[e]=f}fa(function(c){c.adjustCurrentSlot(b,a)});var g=b.itemNew||b.item;if(g&&(g=Object.create(g),X(g,a,a.handle),eb(a,g)),a.item)b.directFetchListeners&&Gc.push(function(){Aa(a.item,b.directFetchListeners)}),b.fetchListeners&&Gc.push(function(){Aa(a.item,b.fetchListeners)});else{var h;for(h in b.directFetchListeners)a.directFetchListeners||(a.directFetchListeners={}),a.directFetchListeners[h]=b.directFetchListeners[h];for(h in b.fetchListeners)a.fetchListeners||(a.fetchListeners={}),a.fetchListeners[h]=b.fetchListeners[h]}a.itemNew&&Ba(a),b.handle=(nc++).toString(),I(b),S(b)}function hb(a,b,c){b&&b.key&&(c||(c=b.itemNew||b.item),delete b.key,delete Oc[c.key],b.itemNew=null,b.item=null),c&&eb(a,c),b&&gb(a,b)}function ib(a){if("object"!=typeof a)throw new e("WinJS.UI.ListDataSource.InvalidItemReturned",s.invalidItemReturned);if(a===Hc)return Kc;if(a===Ic)return Lc;if(a.key)return d.validation&&Ia(a.key),Oc[a.key];throw new e("WinJS.UI.ListDataSource.InvalidKeyReturned",s.invalidKeyReturned)}function jb(a,b){var c=ib(b);c===a&&(c=null),c&&fb(a,c,a.bindingMap),hb(a,c,b)}function kb(a,b,c,d){if(b&&a.key&&a.key!==b.key)return wb(),!1;var e=Pc[c];if(e)if(e===a)e=null;else{if(e.key&&(a.key||b&&e.key!==b.key))return wb(),!1;if(!a.key&&e.bindingMap)return!1}var f;if(b)if(f=Oc[b.key],f===a)f=null;else if(f&&f.bindingMap)return!1;return e?(fb(a,e,a.bindingMap),delete Pc[c],na(a,c),a.prev.index===c-1&&H(a.prev),a.next.index===c+1&&H(a),d.slotNext=e.slotNext,b||(b=e.itemNew||e.item,b&&(f=Oc[b.key]))):na(a,c),f&&e!==f&&fb(a,f,a.bindingMap),hb(a,f,b),e&&e!==f&&gb(a,e),!0}function lb(a,b,c){if(b.key&&a.key&&b.key!==a.key)return wb(),!1;for(var d in a.bindingMap)c[d]=!0;return fb(a,b,c),hb(a,b),!0}function mb(a,b){for(var c={};a;){var d=a.firstInSequence?null:a.prev;if(b.firstInSequence||b.prev!==Kc){if(b=b.firstInSequence?P(b,Pc):b.prev,!lb(b,a,c))return}else sa(a,!0);a=d}}function nb(a,b){for(var c={};a;){var d=a.lastInSequence?null:a.next;if(b.lastInSequence||b.next!==Lc){if(b=b.lastInSequence?Q(b,Pc):b.next,!lb(b,a,c))return}else sa(a,!0);a=d}}function ob(a){for(var b=0;b<a.length;b++){var c=a[b];mb(c.slotBeforeSequence,c.slotFirstInSequence),nb(c.slotAfterSequence,c.slotLastInSequence)}}function pb(a,b){function c(b){for(var c=Lc.prev;!(c.index<a)&&c!==b;){var e=c.prev;void 0!==c.index&&sa(c,!0),c=e}d=0}for(var d=0,e=Lc.prev;!(e.index<a)||d>0;){var f=e.prev;if(e===Kc){c(Kc);break}if(e.key){if(e.index>=a)return wb(),!1;if(!(e.index>=b))return hd?Ya(e,0,d):Za(e,0,d),!1;c(e)}else e.indexRequested||e.firstInSequence?c(f):d++;e=f}return!0}function qb(a,b,c,d,e){var g="WinJS.UI.ListDataSource.processResults";return f(g),e=x(e),d=y(d),vc?void u(g):(Ac&&ya(),!v(d)&&d!==p.unknown||d===Jc||Lc.firstInSequence?(qc=!0,function(){var f,g,h,i,j=b.length;if("number"!=typeof e)for(f=0;j>f;f++)if(h=ib(b[f]),h&&void 0!==h.index){e=h.index+c-f;break}"number"==typeof e&&b[j-1]===Ic?d=e-c+j-1:!v(d)||void 0!==e&&null!==e||(e=d-(j-1)+c),v(d)&&!pb(d,e-c)&&(d=void 0);var k=new Array(j);for(f=0;j>f;f++){var l=null;if(h=ib(b[f])){if(f>0&&!h.firstInSequence&&h.prev.key&&h.prev.key!==b[f-1].key||"number"==typeof e&&void 0!==h.index&&h.index!==e-c+f)return void wb();(h===Kc||h===Lc||h.bindingMap)&&(l=h)}if("number"==typeof e&&(h=Pc[e-c+f])){if(h.key&&h.key!==b[f].key)return void wb();!l&&h.bindingMap&&(l=h)}if(f===c){if(a.key&&a.key!==b[f].key||"number"==typeof a.index&&"number"==typeof e&&a.index!==e)return void wb();l||(l=a)}k[f]=l}for(f=0;j>f;f++)h=k[f],h&&void 0!==h.index&&h!==Kc&&h!==Lc&&jb(h,b[f]);var m,n,o=[],p=!0;for(f=0;j>f;f++)if(h=k[f],h&&h!==Lc){var q=f;if(void 0===h.index){var r={};kb(h,b[f],e-c+f,r);var s,t=h,u=h;for(g=f-1;!t.firstInSequence&&(s=b[g],s!==Hc);g--){var w=e-c+g;if(0>w)break;if(!kb(t.prev,s,w,r))break;t=t.prev,g>=0&&(k[g]=t)}for(g=f+1;!u.lastInSequence&&(s=b[g],s!==Ic&&g!==d||u.next===Lc)&&(u.next===Lc||kb(u.next,s,e-c+g,r))&&(u=u.next,j>g&&(k[g]=u),q=g,u!==Lc);g++);if(m=t.firstInSequence?null:t.prev,n=u.lastInSequence?null:u.next,m&&I(m),n&&I(u),"number"==typeof e){if(u===Lc)m&&G(Lc,D(m),m);else{var x=r.slotNext;x||(x=U(u.index,Pc,Kc,Lc,!0)),F(x,t,u)}t.prev.index===t.index-1&&H(t.prev),u.next.index===u.index+1&&H(u)}else p||(i=k[f-1],i&&(t.prev!==i&&(u===Lc?(m&&G(Lc,D(m),m),F(t,D(i),i)):G(i,t,u)),H(i)));if(p=!1,Tc)return;o.push({slotBeforeSequence:m,slotFirstInSequence:t,slotLastInSequence:u,slotAfterSequence:n})}f!==c||h===a||T(a)||(m=a.firstInSequence?null:a.prev,n=a.lastInSequence?null:a.next,fb(h,a,h.bindingMap),gb(h,a),o.push({slotBeforeSequence:m,slotFirstInSequence:h,slotLastInSequence:h,slotAfterSequence:n})),f=q}for(v(d)&&Lc.index!==d&&na(Lc,d),ob(o),f=0;j>f;f++)if(h=k[f]){for(g=f-1;g>=0;g--){var y=k[g+1];jb(k[g]=y.firstInSequence?P(k[g+1],Pc):y.prev,b[g])}for(g=f+1;j>g;g++)i=k[g-1],h=k[g],h?h.firstInSequence&&(h.prev!==i&&G(i,h,E(h)),H(i)):jb(k[g]=i.lastInSequence?Q(i,Pc):i.next,b[g]);break}delete a.description}(),Tc||(void 0!==d&&d!==Jc&&la(d),ab()),ia(),Ca(),void u(g)):(wb(),void u(g)))}function rb(a,b){switch(b.name){case q.noResponse:Na(o.failure),Da(a,b);break;case q.doesNotExist:a.indexRequested?pb(a.index):(a.keyRequested||a.description)&&ta(a),ia(),wb()}}function sb(a,b,c,d,f,g){g=x(g),f=y(f);var h=a-d,i=c.length;if(b.index>=h&&b.index<h+i)qb(b,c,b.index-h,f,b.index);else if(d===i-1&&a<b.index||v(f)&&f<=b.index)rb(b,new e(q.doesNotExist));else if(b.index<h){var j=Ra(b,0,h-b.index);Va(h,b,j,hd(j,c[0].key,h-b.index,0))}else{var k=h+i-1,j=Ra(b,b.index-k,0);Va(k,b,j,hd(j,c[i-1].key,0,b.index-k))}}function tb(a,b,c){switch(c.name){case q.doesNotExist:a===Kc.index?(pb(0),rb(b,c)):wb();break;default:rb(b,c)}}function ub(){for(var a=0;a<nd.length&&"beginRefresh"!==nd[a].kind;a++);for(var b=a;b<nd.length&&"beginRefresh"!==nd[b].kind;b++);if(b>a&&b+(b-a)<nd.length){for(var c=!0,d=b-a,e=0;d>e;e++)if(nd[a+e].kind!==nd[b+e].kind){c=!1;break}if(c&&g.log){g.log(s.refreshCycleIdentified,"winjs vds","error");for(var e=a;b>e;e++)g.log(""+(e-a)+": "+JSON.stringify(nd[e]),"winjs vds","error")}return c}}function vb(){return++md>h&&ub()?void Na(o.failure):(nd[++od%nd.length]={kind:"beginRefresh"},Zc={firstInSequence:!0,lastInSequence:!0,index:-1},$c={firstInSequence:!0,lastInSequence:!0},Zc.next=$c,$c.prev=Zc,Xc=!1,Yc=void 0,_c={},ad={},bd={},bd[-1]=Zc,void(cd={}))}function wb(){if(!Tc){if(Tc=!0,Na(o.waiting),xc)return xc=!1,void Zb();if(!vc){var a=++Cc;Uc=!0,Wc=0,k.schedule(function(){if(Cc===a){Tc=!1,vb();for(var b=Kc.next;b!==Mc;){var c=b.next;ba(b)||b===Lc||ca(b),b=c}Eb()}},k.Priority.high,null,"WinJS.VirtualizedDataSource.beginRefresh")}}}function xb(){return Vc=Vc||new l,wb(),Vc.promise}function yb(a,b){return delete Fc[b],a!==Cc?!1:(Wc--,!0)}function zb(a,b,c,d,g){var h=Cc;Wc++,d.then(function(b){if(!b.items||!b.items.length)return j.wrapError(new e(q.doesNotExist));var d="itemsFetched id="+c+" count="+b.items.length;f(d),yb(h,c)&&(Sa(b),Kb(a,b.items,b.offset,b.totalCount,"number"==typeof g?g:b.absoluteIndex)),u(d)}).then(null,function(d){yb(h,c)&&Lb(a,b,d)})}function Ab(a,b,c,d){if(hd)zb(a.key,!1,b,hd(b,a.key,c,d,a.hints));else{var e=10,f=a.index;bd[f]&&bd[f].firstInSequence?zb(a.key,!1,b,id(b,f-1,Math.min(c+e,f)-1,d+1+e),f-1):bd[f]&&bd[f].lastInSequence?zb(a.key,!1,b,id(b,f+1,Math.min(c+e,f)+1,d-1+e),f+1):zb(a.key,!1,b,id(b,f,Math.min(c+e,f),d+e),f)}}function Bb(a){jd?zb(null,!0,a,jd(a,1),0):id&&zb(null,!0,a,id(a,0,0,0),0)}function Cb(a){return Fc[_c[a]]}function Db(a,b){for(var c,d,e,f=3,g=Cc,h=0,i=a;i!==Mc;i=i.next){if(!c&&i.key&&!cd[i.key]&&!Cb(i.key)){var j=ad[i.key];(!j||j.firstInSequence||j.lastInSequence)&&(c=i,d=j,e=Qa())}if(c){var k=Cb(i.key);if(cd[i.key]||ad[i.key]||k||(i.key&&(_c[i.key]=e),h++),i.lastInSequence||i.next===Lc||k){if(Ab(c,e,!d||d.firstInSequence?f:0,h-1+f),!b)break;c=null,h=0}}else i.key&&V(i)&&!cd[i.key]&&(ad[i.key]||(e=Qa(),zb(i.key,!1,e,hd(e,i.key,1,1,i.hints))))}0!==Wc||Xc||Cc!==g||Bb(Qa())}function Eb(){var a=Cc;do dd=!1,ed=!0,Db(Kc.next,!0),ed=!1;while(0===Wc&&dd&&Cc===a&&Uc);0===Wc&&Cc===a&&Ub()}function Fb(a){var b=Cc;if(a){var c=Oc[a];c||(c=Kc.next);do fd=!1,gd=!0,Db(c,!1),gd=!1;while(fd&&Cc===b&&Uc)}ed?dd=!0:0===Wc&&Cc===b&&Eb()}function Gb(a){if("object"==typeof a&&a){if(a===Hc)return Zc;if(a===Ic)return $c;if(a.key)return ad[a.key];throw new e("WinJS.UI.ListDataSource.InvalidKeyReturned",s.invalidKeyReturned)}throw new e("WinJS.UI.ListDataSource.InvalidItemReturned",s.invalidItemReturned)}function Hb(a,b){for(;void 0===a.index;){if(L(a,b,bd),a.firstInSequence)return!0;a=a.prev,b--}return a.index!==b?(wb(),!1):!0}function Ib(a,b){a.key=b.key,ad[a.key]=a,a.item=b}function Jb(){for(var a=$c;!a.firstInSequence;)if(a=a.prev,a===Zc)return null;return a}function Kb(a,b,c,d,e){e=x(e),d=y(d);var f=!1;Xc=!0;var g=e-c,h=b[0];h.key===a&&(f=!0);var i=Gb(h);if(i){if(+g===g&&!Hb(i,g))return}else{if(bd[g])return void wb();var j;if(void 0!==e&&(j=bd[g-1])){if(!j.lastInSequence)return void wb();i=Q(j,bd)}else{var k=+g===g?U(g,bd,Zc,$c):Jb(Zc,$c);if(!k)return void wb();i=N(k,g,bd)}Ib(i,b[0])}for(var l=b.length,m=1;l>m;m++){h=b[m],h.key===a&&(f=!0);var n=Gb(h);if(n){if(void 0!==i.index&&!Hb(n,i.index+1))return;if(n!==i.next){if(!i.lastInSequence||!n.firstInSequence)return void wb();var o=E(n);if(o!==$c)G(i,n,o);else{var q=D(i);if(q===Zc)return void wb();F(n,q,i)}H(i)}else i.lastInSequence&&H(i)}else{if(!i.lastInSequence)return void wb();n=Q(i,bd),Ib(n,h)}i=n}if(f||(cd[a]=!0),!v(d)&&!$c.firstInSequence){var r=$c.prev.index;void 0!==r&&(d=r+1)}if(v(d)||d===p.unknown){if(v(Yc)){if(d!==Yc)return void wb()}else Yc=d;v(Yc)&&!bd[Yc]&&L($c,Yc,bd)}gd?fd=!0:Fb(a)}function Lb(a,b,c){switch(c.name){case q.noResponse:Na(o.failure);break;case q.doesNotExist:b?(L($c,0,bd),Yc=0,Ub()):(cd[a]=!0,gd?fd=!0:Fb(a))}}function Mb(a){return a===Zc?Kc:a===$c?Lc:Oc[a.key]}function Nb(a){return a===Kc?Zc:a===Lc?$c:ad[a.key]}function Ob(a){H(a),a.next.mergedForRefresh=!0}function Pb(a,b){K(b,a.key),b.itemNew=a.item}function Qb(a,b,c){var d=A();Pb(a,d),J(d,b,c,!c);var e=a.index;return+e!==e&&(e=c?d.prev.index+1:b.next.index-1),L(d,e,Pc),d}function Rb(a,b,c){a?(fb(a,b,a.bindingMap),hb(a,b,c.item)):(Pb(c,b),b.indexRequested&&db(b))}function Sb(a,b,c){return b.key?!1:(a?(c.mergeWithPrev=!b.firstInSequence,c.mergeWithNext=!b.lastInSequence):c.stationary=!0,Rb(a,b,c),!0)}function Tb(a){var b;if(a.indexRequested)b=a.index;else{var c=Nb(a);c&&(b=c.index)}return b}function Ub(){md=0,nd=new Array(100),od=-1,Ac=!0,_c={};var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s=[],t=[];for(o=0,h=Zc;h;h=h.next)h.sequenceNumber=o,h.firstInSequence&&(j=h),h.lastInSequence&&(t[o]={first:j,last:h,matchingItems:0},o++);for(Rc=null,Qc=0,c=Kc.next;c!==Mc;)h=ad[c.key],e=c.next,c!==Lc&&(ba(c)?c.key&&!h?sa(c,!1):0===Yc||c.indexRequested&&c.index>=Yc?sa(c,!0):c.item||c.keyRequested?c.itemNew=h.item:c.key&&(c.keyRequested||(delete Oc[c.key],delete c.key),c.itemNew=null):ca(c)),c=e;for(c=Kc.next;c!==Lc;)e=c.next,c.indexRequested&&(h=bd[c.index],h&&Rb(Mb(h),c,h)),c=e;var u,v,w,x,y,z=0,A=[];for(k=0,c=Kc;c!==Mc;c=c.next){if(c.firstInSequence)for(j=c,w=null,a=0;o>a;a++)A[a]=0;if(c.indexRequested&&(w=c),h=Nb(c),h&&A[h.sequenceNumber]++,c.lastInSequence){for(v=0,a=z;o>a;a++)v<A[a]&&(v=A[a],u=a);l={first:j,last:c,sequenceNew:v>0?t[u]:void 0,matchingItems:v},w&&(l.indexRequested=!0,l.stationarySlot=w),s[k]=l,c===Lc&&(x=k,y=l),k++,void 0!==t[u].first.index&&(z=u)}}s[0].sequenceNew!==t[0]&&(I(Kc),s[0].first=Kc.next,s.unshift({first:Kc,last:Kc,sequenceNew:t[0],matchingItems:1}),x++,k++);var B=!Lc.firstInSequence;for(y.sequenceNew!==t[o-1]&&(I(Lc.prev),y.last=Lc.prev,x++,s.splice(x,0,{first:Lc,last:Lc,sequenceNew:t[o-1],matchingItems:1}),k++,y=s[x]),a=0;k>a;a++)p=s[a].sequenceNew,p&&p.matchingItems<s[a].matchingItems&&(p.matchingItems=s[a].matchingItems,p.sequenceOld=s[a]);for(t[o-1].sequenceOld=y,y.stationarySlot=Lc,t[0].sequenceOld=s[0],s[0].stationarySlot=Kc,a=0;x>=a;a++)l=s[a],l.sequenceNew&&(n=l.sequenceNew.sequenceOld)===m&&m.last!==Lc?(Ob(n.last),n.last=l.last,delete s[a]):m=l;for(m=null,a=x;a>=0;a--)l=s[a],l&&(l.sequenceNew&&(n=l.sequenceNew.sequenceOld)===m&&l.last!==Lc?(Ob(l.last),n.first=l.first,delete s[a]):m=l);B&&delete Lc.mergedForRefresh;var C=[];for(a=x+1;k>a;a++)if(l=s[a],l&&(!l.sequenceNew||l.sequenceNew.sequenceOld!==l)){var D=!0,E=null,J=null,K=0;for(h=Nb(l.first),h&&(E=J=h,K=1),c=l.first;c!==l.last;c=c.next){var L=Nb(c.next);if(h&&L&&(h.lastInSequence||h.next!==L)){D=!1;break}h&&!E&&(E=J=h),L&&E&&(J=L,K++),h=L}if(D&&E&&void 0!==E.index){var M;E.firstInSequence||(f=Mb(E.prev),f&&(M=f.index));var N;if(J.lastInSequence||(g=Mb(J.next),g&&(N=g.index)),(!g||g.lastInSequence||g.mergedForRefresh)&&(void 0===M||void 0===N||N-M-1>=K)){for(l.locationJustDetermined=!0,h=E;h.locationJustDetermined=!0,h!==J;h=h.next);var j=Mb(E),O=Mb(J);C.push({slotBeforeSequence:j.firstInSequence?null:j.prev,slotFirstInSequence:j,slotLastInSequence:O,slotAfterSequence:O.lastInSequence?null:O.next})}}}for(a=0;k>a;a++)if(l=s[a],l&&!l.indexRequested&&!l.locationJustDetermined&&(!l.sequenceNew||l.sequenceNew.sequenceOld!==l)){l.sequenceNew=null,c=l.first;var P;do{if(P=c===l.last,e=c.next,c!==Kc&&c!==Lc&&c!==Mc&&!c.item&&!c.keyRequested)if(sa(c,!0),l.first===c){if(l.last===c){delete s[a];break}l.first=c.next}else l.last===c&&(l.last=c.prev);c=e}while(!P)}for(a=0;o>a;a++){for(p=t[a],h=p.first;!Mb(h)&&!h.lastInSequence;h=h.next);if(h.lastInSequence&&!Mb(h))p.firstInner=p.lastInner=null;else{for(p.firstInner=h,h=p.last;!Mb(h);h=h.prev);p.lastInner=h}}for(a=0;o>a;a++)if(p=t[a],p&&p.firstInner&&(l=p.sequenceOld)){var Q=0;for(c=l.first;!0&&(h=Nb(c),h&&h.sequenceNumber===p.firstInner.sequenceNumber&&(h.ordinal=Q),!c.lastInSequence);c=c.next,Q++);var R=[];for(h=p.firstInner;!0;h=h.next){if(Q=h.ordinal,void 0!==Q){for(var S=0,T=R.length-1;T>=S;){var U=Math.floor(.5*(S+T));R[U].ordinal<Q?S=U+1:T=U-1}R[S]=h,S>0&&(h.predecessor=R[S-1])}if(h===p.lastInner)break}var W=[],X=R.length;for(h=R[X-1],b=X;b--;)h.stationary=!0,W[b]=h,h=h.predecessor;l.stationarySlot=Mb(W[0]),h=W[0],c=Mb(h),d=c.prev;for(var Y=c.firstInSequence;!h.firstInSequence;)if(h=h.prev,i=Mb(h),!i||h.locationJustDetermined)for(;!Y&&d!==Kc&&(c=d,d=c.prev,Y=c.firstInSequence,!Sb(i,c,h)););for(b=0;X-1>b;b++){h=W[b],c=Mb(h);var i,Z=W[b+1],_=null,aa=Mb(Z);for(e=c.next,h=h.next;h!==Z&&!_&&c!==aa;h=h.next)if(i=Mb(h),!i||h.locationJustDetermined)for(;e!==aa;){if(e.mergedForRefresh){_=h.prev;break}if(c=e,e=c.next,Sb(i,c,h))break}if(_)for(d=aa.prev,h=Z.prev;h!==_&&aa!==c;h=h.prev)if(i=Mb(h),!i||h.locationJustDetermined)for(;d!==c&&(aa=d,d=aa.prev,!Sb(i,aa,h)););for(;e!==aa;)c=e,e=c.next,c!==Kc&&V(c)&&!c.keyRequested&&sa(c)}for(h=W[X-1],c=Mb(h),e=c.next,Y=c.lastInSequence;!h.lastInSequence;)if(h=h.next,i=Mb(h),!i||h.locationJustDetermined)for(;!Y&&e!==Lc&&(c=e,e=c.next,Y=c.lastInSequence,!Sb(i,c,h)););}for(a=0;o>a;a++)if(p=t[a],p.firstInner)for(d=null,h=p.firstInner;!0;h=h.next){if(c=Mb(h)){if(!h.stationary){var da,ea=!1,fa=!1;if(d)da=d.next,ea=!0;else{var ga;for(ga=p.firstInner;!ga.stationary&&ga!==p.lastInner;ga=ga.next);if(ga.stationary)da=Mb(ga),fa=!0;else if(q=h.index,0===q)da=Kc.next,ea=!0;else if(void 0===q)da=Mc;else{da=Kc.next;for(var ha=null;;){if(da.firstInSequence&&(ha=da),q<da.index&&ha||da===Lc)break;da=da.next}!da.firstInSequence&&ha&&(da=ha)}}c.mergedForRefresh&&(delete c.mergedForRefresh,c.lastInSequence||(c.next.mergedForRefresh=!0)),ea=ea||h.mergeWithPrev,fa=fa||h.mergeWithNext;var ja=h.locationJustDetermined;ra(c,da,ea,fa,ja),ja&&fa&&(da.mergedForRefresh=!0)}d=c}if(h===p.lastInner)break}for(a=0;o>a;a++)if(p=t[a],p.firstInner)for(d=null,h=p.firstInner;!0;h=h.next){if(c=Mb(h),!c){var ka;if(d)ka=d.next;else{var ma;for(ma=p.firstInner;!Mb(ma);ma=ma.next);ka=Mb(ma)}c=Qb(h,ka,!!d);var L=Nb(ka);ka.mergedForRefresh||L&&L.locationJustDetermined||($(c),pa(c))}if(d=c,h===p.lastInner)break}Pc=[];var oa=-1;for(c=Kc,r=0;c!==Mc;r++){var e=c.next;if(c.firstInSequence&&(j=c,r=0),void 0===oa){var qa=Tb(c);void 0!==qa&&(oa=qa-r)}if(void 0!==oa&&!c.lastInSequence){var ta=Tb(c.next);if(void 0!==ta&&ta!==oa+r+1){I(c);for(var ua=!0,va=c.next,wa=!1;!wa&&va!==Lc;){var xa=va.next;wa=va.lastInSequence,ra(va,xa,!ua,!1),ua=!1,va=xa}}}if(c.lastInSequence){q=oa;for(var ya=j;ya!==e;){var za=ya.next;if(q>=Yc&&ya!==Lc)sa(ya,!0);else{var Aa=Pc[q];q!==ya.index?(delete Pc[q],na(ya,q)):+q===q&&Pc[q]!==ya&&(Pc[q]=ya),ya.itemNew&&db(ya),Aa&&(ya.key?(fb(ya,Aa,ya.bindingMap),gb(ya,Aa),+q===q&&(Pc[q]=ya)):(fb(Aa,ya,Aa.bindingMap),gb(Aa,ya),+q===q&&(Pc[q]=Aa))),+q===q&&q++}ya=za}oa=void 0}c=e}var Ba,Da=-2;for(c=Kc,r=0;c!==Mc;r++){var e=c.next;if(c.firstInSequence&&(j=c,r=0),delete c.mergedForRefresh,c.lastInSequence)if(void 0===j.index){f=j.prev;var Ea;f&&(Ea=Nb(f))&&!Ea.lastInSequence&&(h=Nb(c))&&h.prev===Ea?(G(f,j,c),H(f)):c===Lc||Ba||F(Mc,j,c)}else{if(Da<c.index&&!Ba)Da=c.index;else{for(g=Kc.next;g.index<c.index;g=g.next);for(var va=j;va!==e;){var xa=va.next;h=Nb(va),ra(va,g,g.prev.index===va.index-1,g.index===va.index+1,h&&h.locationJustDetermined),va=xa}}f=j.prev,f&&f.index===j.index-1&&H(f)}c===Lc&&(Ba=!0),c=e}Ac=!1,ob(C),void 0!==Yc&&Yc!==Jc&&la(Yc),ia();var Fa=[];for(a=0;o>a;a++){p=t[a];var Ga=[];c=null,r=0;var Ha;for(h=p.first;!0&&(h===Zc?Ga.push(Hc):h===$c?Ga.push(Ic):(Ga.push(h.item),c||(c=Mb(h),Ha=r)),!h.lastInSequence);h=h.next,r++);c&&Fa.push({slot:c,results:Ga,offset:Ha})}for(vb(),Uc=!1,Ca(),a=0;a<Fa.length;a++){var Ia=Fa[a];qb(Ia.slot,Ia.results,Ia.offset,Jc,Ia.slot.index)}if(Vc){var Ja=Vc;Vc=null,Ja.complete()}ab()}function Vb(a,b,c,d,e,f,g){var h=uc.prev,i={prev:h,next:uc,applyEdit:a,editType:b,complete:c,error:d,keyUpdate:e};h.next=i,uc.prev=i,vc=!0,(Tc||Uc)&&(Cc++,Uc=!1,Tc=!0),uc.next===i&&Zb(),i.failed||(f(),i.undo=g),
-sc||$b()}function Wb(){tc=!1;var a=uc.next.next;uc.next=a,a.prev=uc}function Xb(){for(;uc.prev!==uc;){var a=uc.prev;a.error&&a.error(new e(r.canceled)),a.undo&&!Tc&&a.undo(),uc.prev=a.prev}uc.next=uc,sc=!1,$b()}function Yb(b){function c(){xc||(f?wc=!0:Zb())}function d(a){if(a){var d;if(g&&g.key!==a.key){var e=a.key;if(b.undo){if(d=g.slot){var h=d.key;h&&delete Oc[h],K(d,e),d.itemNew=a,d.item?(qa(d),ia()):Ba(d)}}else g.key=e}else b.editType===rd.change&&(d.itemNew=a,f||cb(d))}Wb(),b.complete&&b.complete(a),c()}function e(a){switch(a.Name){case r.noResponse:return Na(o.failure),xc=!0,void(tc=!1);case r.notPermitted:break;case r.noLongerMeaningful:wb()}b.failed=!0,Wb(),Xb(),b.error&&b.error(a),c()}if(!tc){var f=!0,g=b.keyUpdate;a.beginEdits&&!rc&&(rc=!0,a.beginEdits()),tc=!0,b.applyEdit().then(d,e),f=!1}}function Zb(){for(;uc.next!==uc;)if(wc=!1,Yb(uc.next),!wc)return;_b()}function $b(){ya(),ia(),Ca(),uc.next===uc&&_b()}function _b(){vc=!1,a.endEdits&&rc&&!sc&&(rc=!1,a.endEdits()),Tc?(Tc=!1,wb()):ab()}function ac(a){return Ia(a),Oc[a]||Ja(a)}function bc(a,b,c,d,e){var f=A();return J(f,c,d,e),a&&K(f,a),f.itemNew=b,wa(f,1),sc||yc||(f.firstInSequence||"number"!=typeof f.prev.index?f.lastInSequence||"number"!=typeof f.next.index||L(f,f.next.index-1,Pc):L(f,f.prev.index+1,Pc)),$(f),pa(f),f}function cc(a,b,c,d,e){var f={key:a};return new j(function(a,g){Vb(e,rd.insert,a,g,f,function(){if(c){var a={key:f.key,data:b};f.slot=bc(f.key,a,c,d,!d)}},function(){var a=f.slot;a&&(wa(a,-1),sa(a,!1))})})}function dc(a,b,c,d){return new j(function(e,f){var g,h,i,j;Vb(d,rd.move,e,f,null,function(){h=a.next,i=a.firstInSequence,j=a.lastInSequence;var d=a.prev;g="number"!=typeof a.index&&(i||!d.item)&&(j||!h.item),wa(a,-1),ra(a,b,c,!c),wa(a,1),g&&(I(d),i||mb(d,a),j||nb(h,a))},function(){g?wb():(wa(a,-1),ra(a,h,!i,!j),wa(a,1))})})}function ec(){function a(){yc||(ya(),ia(),Ca())}this.invalidateAll=function(){return 0===Jc?(this.reload(),j.wrap()):xb()},this.reload=function(){pc&&pc.cancel(),Vc&&Vc.cancel();for(var a=Kc.next;a!==Mc;a=a.next){var b=a.fetchListeners;for(var c in b)b[c].promise.cancel();var d=a.directFetchListeners;for(var c in d)d[c].promise.cancel()}fc(),fa(function(a){a.notificationHandler&&a.notificationHandler.reload()})},this.beginNotifications=function(){yc=!0},this.inserted=function(b,c,d,e){if(vc)wb();else{var f=b.key,g=Oc[c],h=Oc[d],i="string"==typeof c,j="string"==typeof d;if(i?h&&!h.firstInSequence&&(g=h.prev):j&&g&&!g.lastInSequence&&(h=g.next),(i||j)&&!g&&!h&&Kc.next===Lc)return void wb();if(Oc[f])return void wb();if(g&&h&&(g.next!==h||g.lastInSequence||h.firstInSequence))return void wb();if(g&&(g.keyRequested||g.indexRequested)||h&&(h.keyRequested||h.indexRequested))return void wb();if(g||h)bc(f,b,h?h:g.next,!!g,!!h);else if(Kc.next===Lc)bc(f,b,Kc.next,!0,!0);else{if(void 0===e)return void wb();xa(e,1)}a()}},this.changed=function(b){if(vc)wb();else{var c=b.key,d=Oc[c];d&&(d.keyRequested?wb():(d.itemNew=b,d.item&&(qa(d),a())))}},this.moved=function(b,c,d,e,f){if(vc)wb();else{var g=b.key,h=Oc[g],i=Oc[c],j=Oc[d];h&&h.keyRequested||i&&i.keyRequested||j&&j.keyRequested?wb():h?i&&j&&(i.next!==j||i.lastInSequence||j.firstInSequence)?wb():i||j?(wa(h,-1),ra(h,j?j:i.next,!!i,!!j),wa(h,1),a()):(wa(h,-1),sa(h,!1),void 0!==e&&(f>e&&f--,xa(f,1)),a()):i||j?(void 0!==e&&(xa(e,-1),f>e&&f--),this.inserted(b,c,d,f)):void 0!==e&&(xa(e,-1),f>e&&f--,xa(f,1),a())}},this.removed=function(b,c){if(vc)wb();else{var d;d="string"==typeof b?Oc[b]:Pc[c],d?d.keyRequested?wb():(wa(d,-1),sa(d,!1),a()):void 0!==c&&(xa(c,-1),a())}},this.endNotifications=function(){yc=!1,a()}}function fc(){Na(o.ready),pc=null,rc=!1,sc=!1,tc=!1,uc={},uc.next=uc,uc.prev=uc,vc=!1,xc=!1,zc=0,Ac=!1,Bc=0,Fc={},Gc=[],Jc=p.unknown,Kc={firstInSequence:!0,lastInSequence:!0,index:-1},Lc={firstInSequence:!0,lastInSequence:!0},Mc={firstInSequence:!0,lastInSequence:!0},Kc.next=Lc,Lc.prev=Kc,Lc.next=Mc,Mc.prev=Lc,Nc={},Oc={},Pc={},Pc[-1]=Kc,Qc=0,Rc=null,Sc=!1,Tc=!1,Uc=!1,Vc=null}var gc,hc,ic,jc,kc,lc,mc,nc,oc,pc,qc,rc,sc,tc,uc,vc,wc,xc,yc,zc,Ac,Bc,Cc,Dc,Ec,Fc,Gc,Hc,Ic,Jc,Kc,Lc,Mc,Nc,Oc,Pc,Qc,Rc,Sc,Tc,Uc,Vc,Wc,Xc,Yc,Zc,$c,_c,ad,bd,cd,dd,ed,fd,gd,hd,id,jd,kd,ld,md=0,nd=new Array(100),od=-1;a.itemsFromKey&&(hd=function(b,c,d,e,g){var h="fetchItemsFromKey id="+b+" key="+c+" countBefore="+d+" countAfter="+e;f(h),nd[++od%nd.length]={kind:"itemsFromKey",key:c,countBefore:d,countAfter:e};var i=a.itemsFromKey(c,d,e,g);return u(h),i}),a.itemsFromIndex&&(id=function(b,c,d,e){var g="fetchItemsFromIndex id="+b+" index="+c+" countBefore="+d+" countAfter="+e;f(g),nd[++od%nd.length]={kind:"itemsFromIndex",index:c,countBefore:d,countAfter:e};var h=a.itemsFromIndex(c,d,e);return u(g),h}),a.itemsFromStart&&(jd=function(b,c){var d="fetchItemsFromStart id="+b+" count="+c;f(d),nd[++od%nd.length]={kind:"itemsFromStart",count:c};var e=a.itemsFromStart(c);return u(d),e}),a.itemsFromEnd&&(kd=function(b,c){var d="fetchItemsFromEnd id="+b+" count="+c;f(d),nd[++od%nd.length]={kind:"itemsFromEnd",count:c};var e=a.itemsFromEnd(c);return u(d),e}),a.itemsFromDescription&&(ld=function(b,c,d,e){var g="fetchItemsFromDescription id="+b+" desc="+c+" countBefore="+d+" countAfter="+e;f(g),nd[++od%nd.length]={kind:"itemsFromDescription",description:c,countBefore:d,countAfter:e};var h=a.itemsFromDescription(c,d,e);return u(g),h});var pd=++n,qd=this,rd={insert:"insert",change:"change",move:"move",remove:"remove"};if(!a)throw new e("WinJS.UI.ListDataSource.ListDataAdapterIsInvalid",s.listDataAdapterIsInvalid);hc=a.compareByIdentity?0:200,c&&"number"==typeof c.cacheSize&&(hc=c.cacheSize),a.setNotificationHandler&&(gc=new ec,a.setNotificationHandler(gc)),ic=o.ready,kc=!1,lc={},mc=0,nc=1,oc=0,Cc=0,Dc=!1,Ec=1,Hc={},Ic={},fc(),this.createListBinding=function(a){function b(a){a&&a.cursorCount++}function c(a){a&&0===--a.cursorCount&&ea(a)}function d(a){b(a),c(m),m=a}function e(a,b){a===m&&(b||(b=!m||m.lastInSequence||m.next===Lc?null:m.next),d(b))}function f(a){var b=a.bindingMap,c=b[l].handle;delete a.bindingMap[l];var d=!0,e=!0;for(var f in b)if(d=!1,c&&b[f].handle===c){e=!1;break}c&&e&&delete Nc[c],d&&(a.bindingMap=null,ea(a))}function g(a,b){a.bindingMap||(a.bindingMap={});var c=a.bindingMap[l];if(c?c.count++:a.bindingMap[l]={bindingRecord:lc[l],count:1},a.fetchListeners){var d=a.fetchListeners[b];d&&(d.retained=!0)}}function h(a){var b=Nc[a];if(b){var c=b.bindingMap[l];if(0===--c.count){var d=b.fetchListeners;for(var e in d){var g=d[e];g.listBindingID===l&&(g.retained=!1)}f(b)}}}function i(b){var c=ja(b,l),d=(oc++).toString(),e=za(b,"fetchListeners",d,l,function(a,b){a(ka(b,c))});return X(e,b,c),a&&(e.retain=function(){return o._retainItem(b,d),e},e.release=function(){o._releaseItem(c)}),e}function k(b){var c;return!n&&b?c=i(b):(n?(c=new j(function(){}),c.cancel()):c=j.wrap(null),W(c,null),a&&(c.retain=function(){return c},c.release=function(){})),d(b),c}var l=(mc++).toString(),m=null,n=!1;lc[l]={notificationHandler:a,notificationsSent:!1,adjustCurrentSlot:e,itemPromiseFromKnownSlot:i};var o={_retainItem:function(a,b){g(a,b)},_releaseItem:function(a){h(a)},jumpToItem:function(a){return k(a?Nc[a.handle]:null)},current:function(){return k(m)},previous:function(){return k(m?Fa(m):null)},next:function(){return k(m?Ga(m):null)},releaseItem:function(a){this._releaseItem(a.handle)},release:function(){n=!0,c(m),m=null;for(var a=Kc.next;a!==Mc;){var b=a.next,d=a.fetchListeners;for(var e in d){var g=d[e];g.listBindingID===l&&(g.promise.cancel(),delete d[e])}a.bindingMap&&a.bindingMap[l]&&f(a),a=b}delete lc[l]}};return(jd||id)&&(o.first=function(){return k(Ga(Kc))}),kd&&(o.last=function(){return k(Fa(Lc))}),hd&&(o.fromKey=function(a,b){return k(Ka(a,b))}),(id||jd&&hd)&&(o.fromIndex=function(a){return k(La(a))}),ld&&(o.fromDescription=function(a){return k(Ma(a))}),o},this.invalidateAll=function(){return xb()};var sd=function(a,b){var c=new l;a.then(function(a){c.complete(a)},function(a){c.error(a)});var d=c.promise.then(null,function(c){return"WinJS.UI.VirtualizedDataSource.resetCount"===c.name?(pc=null,a=b.getCount()):j.wrapError(c)}),f=0,g={get:function(){return f++,new j(function(a,b){d.then(a,b)},function(){0===--f&&(c.promise.cancel(),a.cancel(),g===pc&&(pc=null))})},reset:function(){c.error(new e("WinJS.UI.VirtualizedDataSource.resetCount"))},cancel:function(){c.promise.cancel(),a.cancel(),g===pc&&(pc=null)}};return g};this.getCount=function(){if(a.getCount){var b=this;return j.wrap().then(function(){if(sc||vc)return Jc;var c;if(!pc){var d;c=a.getCount();var e;c.then(function(){pc===d&&(pc=null),e=!0},function(){pc===d&&(pc=null),e=!0}),zc=0,e||(d=pc=sd(c,b))}return pc?pc.get():c}).then(function(a){if(!w(a)&&void 0!==a)throw new e("WinJS.UI.ListDataSource.InvalidRequestedCountReturned",s.invalidRequestedCountReturned);return a!==Jc&&(Jc===p.unknown?Jc=a:(la(a),ia())),0===a&&(Kc.next!==Lc||Lc.next!==Mc?wb():Kc.lastInSequence&&(H(Kc),Lc.index=0)),a}).then(null,function(a){return a.name===m.CountError.noResponse?(Na(o.failure),Jc):j.wrapError(a)})}return j.wrap(Jc)},hd&&(this.itemFromKey=function(a,b){return Ha(Ka(a,b))}),(id||jd&&hd)&&(this.itemFromIndex=function(a){return Ha(La(a))}),ld&&(this.itemFromDescription=function(a){return Ha(Ma(a))}),this.beginEdits=function(){sc=!0},a.insertAtStart&&(this.insertAtStart=function(b,c){return cc(b,c,Kc.lastInSequence?null:Kc.next,!0,function(){return a.insertAtStart(b,c)})}),a.insertBefore&&(this.insertBefore=function(b,c,d){var e=ac(d);return cc(b,c,e,!1,function(){return a.insertBefore(b,c,d,ua(e))})}),a.insertAfter&&(this.insertAfter=function(b,c,d){var e=ac(d);return cc(b,c,e?e.next:null,!0,function(){return a.insertAfter(b,c,d,ua(e))})}),a.insertAtEnd&&(this.insertAtEnd=function(b,c){return cc(b,c,Lc.firstInSequence?null:Lc,!1,function(){return a.insertAtEnd(b,c)})}),a.change&&(this.change=function(b,c){var d=ac(b);return new j(function(e,f){var g;Vb(function(){return a.change(b,c,ua(d))},rd.change,e,f,null,function(){g=d.item,d.itemNew={key:b,data:c},g?qa(d):Ba(d)},function(){g?(d.itemNew=g,qa(d)):wb()})})}),a.moveToStart&&(this.moveToStart=function(b){var c=ac(b);return dc(c,Kc.next,!0,function(){return a.moveToStart(b,ua(c))})}),a.moveBefore&&(this.moveBefore=function(b,c){var d=ac(b),e=ac(c);return dc(d,e,!1,function(){return a.moveBefore(b,c,ua(d),ua(e))})}),a.moveAfter&&(this.moveAfter=function(b,c){var d=ac(b),e=ac(c);return dc(d,e.next,!0,function(){return a.moveAfter(b,c,ua(d),ua(e))})}),a.moveToEnd&&(this.moveToEnd=function(b){var c=ac(b);return dc(c,Lc,!1,function(){return a.moveToEnd(b,ua(c))})}),a.remove&&(this.remove=function(b){Ia(b);var c=Oc[b];return new j(function(d,e){var f,g,h;Vb(function(){return a.remove(b,ua(c))},rd.remove,d,e,null,function(){c&&(f=c.next,g=c.firstInSequence,h=c.lastInSequence,wa(c,-1),sa(c,!1))},function(){c&&(R(c,f,!g,!h),wa(c,1),pa(c))})})}),this.endEdits=function(){sc=!1,$b()}}var h=100,n=1,o=m.DataSourceStatus,p=m.CountResult,q=m.FetchError,r=m.EditError,s={get listDataAdapterIsInvalid(){return"Invalid argument: listDataAdapter must be an object or an array."},get indexIsInvalid(){return"Invalid argument: index must be a non-negative integer."},get keyIsInvalid(){return"Invalid argument: key must be a string."},get invalidItemReturned(){return"Error: data adapter returned item that is not an object."},get invalidKeyReturned(){return"Error: data adapter returned item with undefined or null key."},get invalidIndexReturned(){return"Error: data adapter should return undefined, null or a non-negative integer for the index."},get invalidCountReturned(){return"Error: data adapter should return undefined, null, CountResult.unknown, or a non-negative integer for the count."},get invalidRequestedCountReturned(){return"Error: data adapter should return CountResult.unknown, CountResult.failure, or a non-negative integer for the count."},get refreshCycleIdentified(){return"refresh cycle found, likely data inconsistency"}},t="statuschanged",u=c.Class.define(function(){},{_baseDataSourceConstructor:a,_isVirtualizedDataSource:!0},{supportedForProcessing:!1});return c.Class.mix(u,f.eventMixin),u})})}),d("WinJS/VirtualizedDataSource/_GroupDataSource",["exports","../Core/_Base","../Core/_ErrorFromName","../Promise","../Scheduler","../Utilities/_UI","./_VirtualizedDataSourceImpl"],function(a,b,c,d,e,f,g){"use strict";b.Namespace._moduleDefine(a,"WinJS.UI",{_GroupDataSource:b.Namespace._lazy(function(){function a(){return new c(f.FetchError.doesNotExist)}function h(a){return a&&a.firstReached&&a.lastReached}var i=101,j=b.Class.define(function(a){this._groupDataAdapter=a},{beginNotifications:function(){},inserted:function(a,b,c){this._groupDataAdapter._inserted(a,b,c)},changed:function(a,b){this._groupDataAdapter._changed(a,b)},moved:function(a,b,c){this._groupDataAdapter._moved(a,b,c)},removed:function(a,b){this._groupDataAdapter._removed(a,b)},countChanged:function(a,b){0===a&&0!==b&&this._groupDataAdapter.invalidateGroups()},indexChanged:function(a,b,c){this._groupDataAdapter._indexChanged(a,b,c)},endNotifications:function(){this._groupDataAdapter._endNotifications()},reload:function(){this._groupDataAdapter._reload()}},{supportedForProcessing:!1}),k=b.Class.define(function(a,b,c,d){this._listBinding=a.createListBinding(new j(this)),this._groupKey=b,this._groupData=c,this._initializeState(),this._batchSize=i,this._count=null,d&&("number"==typeof d.groupCountEstimate&&(this._count=d.groupCountEstimate<0?null:Math.max(d.groupCountEstimate,1)),"number"==typeof d.batchSize&&(this._batchSize=d.batchSize+1)),this._listBinding.last&&(this.itemsFromEnd=function(a){var b=this;return this._fetchItems(function(){return b._lastGroup},function(a){if(a)return!1;var c=b._count;return+c!==c?!0:c>0?!0:void 0},function(){b._fetchBatch(b._listBinding.last(),b._batchSize-1,0)},a-1,0)})},{setNotificationHandler:function(a){this._listDataNotificationHandler=a},compareByIdentity:!0,itemsFromKey:function(a,b,c,d){var e=this;return this._fetchItems(function(){return e._keyMap[a]},function(){var a=e._lastGroup;return a?+a.index!==a.index?!0:void 0:!0},function(){d=d||{};var a="string"==typeof d.groupMemberKey&&e._listBinding.fromKey?e._listBinding.fromKey(d.groupMemberKey):"number"==typeof d.groupMemberIndex&&e._listBinding.fromIndex?e._listBinding.fromIndex(d.groupMemberIndex):void 0!==d.groupMemberDescription&&e._listBinding.fromDescription?e._listBinding.fromDescription(d.groupMemberDescription):e._listBinding.first(),b=Math.floor(.5*(e._batchSize-1));e._fetchBatch(a,b,e._batchSize-1-b)},b,c)},itemsFromIndex:function(a,b,c){var d=this;return this._fetchItems(function(){return d._indexMap[a]},function(){var b=d._lastGroup;return b?+b.index!==b.index?!0:a<=b.index?!0:void 0:!0},function(){d._fetchNextIndex()},b,c)},getCount:function(){if(this._lastGroup&&"number"==typeof this._lastGroup.index)return d.wrap(this._count);var a=this,b=new d(function(b){var c={initialBatch:function(){a._fetchNextIndex()},getGroup:function(){return null},countBefore:0,countAfter:0,complete:function(c){c&&(a._count=0);var d=a._count;return"number"==typeof d?(b(d),!0):!1}};a._fetchQueue.push(c),a._itemBatch||a._continueFetch(c)});return"number"==typeof this._count?d.wrap(this._count):b},invalidateGroups:function(){this._beginRefresh(),this._initializeState()},_initializeState:function(){this._count=null,this._indexMax=null,this._keyMap={},this._indexMap={},this._lastGroup=null,this._handleMap={},this._fetchQueue=[],this._itemBatch=null,this._itemsToFetch=0,this._indicesChanged=!1},_releaseItem:function(a){delete this._handleMap[a.handle],this._listBinding.releaseItem(a)},_processBatch:function(){for(var a=null,b=null,c=null,d=0,f=!0,g=0;g<this._batchSize;g++){var h=this._itemBatch[g],i=h?this._groupKey(h):null;if(h&&(f=!1),b&&null!==i&&i===b.key)d++,b.lastItem===a?(b.lastItem.handle!==b.firstItem.handle&&this._releaseItem(b.lastItem),b.lastItem=h,this._handleMap[h.handle]=b,b.size++):b.firstItem===h&&(b.firstItem.handle!==b.lastItem.handle&&this._releaseItem(b.firstItem),b.firstItem=c,this._handleMap[c.handle]=b,b.size+=d);else{var j=null;if(b&&(b.lastReached=!0,"number"==typeof b.index&&(j=b.index+1)),h){var k=this._keyMap[i];if(k||(k={key:i,data:this._groupData(h),firstItem:h,lastItem:h,size:1},this._keyMap[k.key]=k,this._handleMap[h.handle]=k),g>0&&(k.firstReached=!0,b||(j=0)),"number"!=typeof k.index&&"number"==typeof j){for(var l=k;l;l=this._nextGroup(l))l.index=j,this._indexMap[j]=l,j++;this._indexMax=j,"number"==typeof this._count&&!this._lastGroup&&this._count<=this._indexMax&&(this._count=this._indexMax+1)}c=h,d=0,b=k}else b&&(this._lastGroup=b,"number"==typeof b.index&&(this._count=b.index+1),this._listDataNotificationHandler.invalidateAll(),b=null)}a=h}var m;for(m=this._fetchQueue[0];m&&m.complete(f);m=this._fetchQueue[0])this._fetchQueue.splice(0,1);if(m){var n=this;e.schedule(function(){n._continueFetch(m)},e.Priority.normal,null,"WinJS.UI._GroupDataSource._continueFetch")}else this._itemBatch=null},_processPromise:function(a,b){a.retain(),this._itemBatch[b]=a;var c=this;a.then(function(a){c._itemBatch[b]=a,0===--c._itemsToFetch&&c._processBatch()})},_fetchBatch:function(a,b){this._itemBatch=new Array(this._batchSize),this._itemsToFetch=this._batchSize,this._processPromise(a,b);var c;for(this._listBinding.jumpToItem(a),c=b-1;c>=0;c--)this._processPromise(this._listBinding.previous(),c);for(this._listBinding.jumpToItem(a),c=b+1;c<this._batchSize;c++)this._processPromise(this._listBinding.next(),c)},_fetchAdjacent:function(a,b){this._fetchBatch(this._listBinding.fromKey?this._listBinding.fromKey(a.key):this._listBinding.fromIndex(a.index),b?0:this._batchSize-1,b?this._batchSize-1:0)},_fetchNextIndex:function(){var a=this._indexMap[this._indexMax-1];a?this._fetchAdjacent(a.lastItem,!0):this._fetchBatch(this._listBinding.first(),1,this._batchSize-2)},_continueFetch:function(a){if(a.initialBatch)a.initialBatch(),a.initialBatch=null;else{var b=a.getGroup();if(b){var c,d;b.firstReached?b.lastReached?a.countBefore>0&&0!==b.index&&!h(c=this._previousGroup(b))?this._fetchAdjacent(c&&c.lastReached?c.firstItem:b.firstItem,!1):(d=this._nextGroup(b),this._fetchAdjacent(d&&d.firstReached?d.lastItem:b.lastItem,!0)):this._fetchAdjacent(b.lastItem,!0):this._fetchAdjacent(b.firstItem,!1)}else this._fetchNextIndex()}},_fetchComplete:function(a,b,c,d,e){if(h(a)){var g=this._previousGroup(a);if(d||h(g)||0===a.index||0===b){var i=this._nextGroup(a);if(d||h(i)||this._lastGroup===a||0===c){for(var j=0,k=a;b>j&&(g=this._previousGroup(k),h(g));)k=g,j++;for(var l=0,m=a;c>l&&(i=this._nextGroup(m),h(i));)m=i,l++;for(var n=j+1+l,o=new Array(n),p=0;n>p;p++){var q={key:k.key,data:k.data,firstItemKey:k.firstItem.key,groupSize:k.size},r=k.firstItem.index;"number"==typeof r&&(q.firstItemIndexHint=r),o[p]=q,k=this._nextGroup(k)}var s={items:o,offset:j};return s.totalCount="number"==typeof this._count?this._count:f.CountResult.unknown,"number"==typeof a.index&&(s.absoluteIndex=a.index),m===this._lastGroup&&(s.atEnd=!0),e(s),!0}}}return!1},_fetchItems:function(b,c,e,f,g){var h=this;return new d(function(d,i){function j(e){var j=b();return j?h._fetchComplete(j,f,g,l,d,i):l&&!c(e)?(i(a()),!0):m>2?(i(a()),!0):(e?m++:m=0,!1)}var k=b(),l=!k,m=0;if(!j()){var n={initialBatch:l?e:null,getGroup:b,countBefore:f,countAfter:g,complete:j};h._fetchQueue.push(n),h._itemBatch||h._continueFetch(n)}})},_previousGroup:function(a){return a&&a.firstReached?(this._listBinding.jumpToItem(a.firstItem),this._handleMap[this._listBinding.previous().handle]):null},_nextGroup:function(a){return a&&a.lastReached?(this._listBinding.jumpToItem(a.lastItem),this._handleMap[this._listBinding.next().handle]):null},_invalidateIndices:function(a){this._count=null,this._lastGroup=null,"number"==typeof a.index&&(this._indexMax=a.index>0?a.index:null);for(var b=a;b&&"number"==typeof b.index;b=this._nextGroup(b))delete this._indexMap[b.index],b.index=null},_releaseGroup:function(a){this._invalidateIndices(a),delete this._keyMap[a.key],this._lastGroup===a&&(this._lastGroup=null),a.firstItem!==a.lastItem&&this._releaseItem(a.firstItem),this._releaseItem(a.lastItem)},_beginRefresh:function(){if(this._fetchQueue=[],this._itemBatch){for(var a=0;a<this._batchSize;a++){var b=this._itemBatch[a];b&&(b.cancel&&b.cancel(),this._listBinding.releaseItem(b))}this._itemBatch=null}this._itemsToFetch=0,this._listDataNotificationHandler.invalidateAll()},_processInsertion:function(a,b,c){var d=this._handleMap[b],e=this._handleMap[c],f=null;d&&(d.lastReached&&b===d.lastItem.handle&&(f=this._groupKey(a))!==d.key?this._lastGroup===d&&(this._lastGroup=null,this._count=null):this._releaseGroup(d),this._beginRefresh()),e&&e!==d&&(this._invalidateIndices(e),e.firstReached&&c===e.firstItem.handle&&(null!==f?f:this._groupKey(a))!==e.key||this._releaseGroup(e),this._beginRefresh())},_processRemoval:function(a){var b=this._handleMap[a];if(!b||a!==b.firstItem.handle&&a!==b.lastItem.handle){if(this._itemBatch)for(var c=0;c<this._batchSize;c++){var d=this._itemBatch[c];if(d&&d.handle===a){this._beginRefresh();break}}}else this._releaseGroup(b),this._beginRefresh()},_inserted:function(a,b,c){var d=this;a.then(function(a){d._processInsertion(a,b,c)})},_changed:function(a,b){var c=this._handleMap[a.handle];if(c&&a.handle===c.firstItem.handle&&(this._releaseGroup(c),this._beginRefresh()),this._groupKey(a)!==this._groupKey(b)){this._listBinding.jumpToItem(a);var d=this._listBinding.previous().handle;this._listBinding.jumpToItem(a);var e=this._listBinding.next().handle;this._processRemoval(a.handle),this._processInsertion(a,d,e)}},_moved:function(a,b,c){this._processRemoval(a.handle);var d=this;a.then(function(a){d._processInsertion(a,b,c)})},_removed:function(a,b){b||this._processRemoval(a)},_indexChanged:function(a,b,c){"number"==typeof c&&(this._indicesChanged=!0)},_endNotifications:function(){if(this._indicesChanged){this._indicesChanged=!1;for(var a in this._keyMap){var b=this._keyMap[a];if(b.firstReached&&b.lastReached){var c=b.lastItem.index+1-b.firstItem.index;isNaN(c)||(b.size=c)}}this._beginRefresh()}},_reload:function(){this._initializeState(),this._listDataNotificationHandler.reload()}},{supportedForProcessing:!1});return b.Class.derive(g.VirtualizedDataSource,function(a,b,c,d){var e=new k(a,b,c,d);this._baseDataSourceConstructor(e),this.extensions={invalidateGroups:function(){e.invalidateGroups()}}},{},{supportedForProcessing:!1})})})}),d("WinJS/VirtualizedDataSource/_GroupedItemDataSource",["../Core/_Base","./_GroupDataSource"],function(a,b){"use strict";a.Namespace.define("WinJS.UI",{computeDataSourceGroups:function(a,c,d,e){function f(a){if(a){var b=Object.create(a);return b.groupKey=c(a),d&&(b.groupData=d(a)),b}return null}function g(a){var b=Object.create(a);return b.then=function(b,c,d){return a.then(function(a){return b(f(a))},c,d)},b}var h=Object.create(a);h.createListBinding=function(b){var c;b?(c=Object.create(b),c.inserted=function(a,c,d){return b.inserted(g(a),c,d)},c.changed=function(a,c){return b.changed(f(a),f(c))},c.moved=function(a,c,d){return b.moved(g(a),c,d)}):c=null;for(var d=a.createListBinding(c),e=Object.create(d),h=["first","last","fromDescription","jumpToItem","current"],i=0,j=h.length;j>i;i++)!function(a){d[a]&&(e[a]=function(){return g(d[a].apply(d,arguments))})}(h[i]);return d.fromKey&&(e.fromKey=function(a){return g(d.fromKey(a))}),d.fromIndex&&(e.fromIndex=function(a){return g(d.fromIndex(a))}),e.prev=function(){return g(d.prev())},e.next=function(){return g(d.next())},e};for(var i=["itemFromKey","itemFromIndex","itemFromDescription","insertAtStart","insertBefore","insertAfter","insertAtEnd","change","moveToStart","moveBefore","moveAfter","moveToEnd"],j=0,k=i.length;k>j;j++)!function(b){a[b]&&(h[b]=function(){return g(a[b].apply(a,arguments))})}(i[j]);["addEventListener","removeEventListener","dispatchEvent"].forEach(function(b){a[b]&&(h[b]=function(){return a[b].apply(a,arguments)})});var l=null;return Object.defineProperty(h,"groups",{get:function(){return l||(l=new b._GroupDataSource(a,c,d,e)),l},enumerable:!0,configurable:!0}),h}})}),d("WinJS/VirtualizedDataSource/_StorageDataSource",["exports","../Core/_WinRT","../Core/_Global","../Core/_Base","../Core/_ErrorFromName","../Core/_WriteProfilerMark","../Animations","../Promise","../Utilities/_UI","./_VirtualizedDataSourceImpl"],function(a,b,c,d,e,f,g,h,i,j){"use strict";d.Namespace._moduleDefine(a,"WinJS.UI",{StorageDataSource:d.Namespace._lazy(function(){var a=d.Class.define(function(a,c){f("WinJS.UI.StorageDataSource:constructor,StartTM");var d,e=b.Windows.Storage.FileProperties.ThumbnailMode.singleItem,g=256,h=b.Windows.Storage.FileProperties.ThumbnailOptions.useCurrentScale,i=!0;if("Pictures"===a?(e=b.Windows.Storage.FileProperties.ThumbnailMode.picturesView,d=b.Windows.Storage.KnownFolders.picturesLibrary,g=190):"Music"===a?(e=b.Windows.Storage.FileProperties.ThumbnailMode.musicView,d=b.Windows.Storage.KnownFolders.musicLibrary,g=256):"Documents"===a?(e=b.Windows.Storage.FileProperties.ThumbnailMode.documentsView,d=b.Windows.Storage.KnownFolders.documentsLibrary,g=40):"Videos"===a&&(e=b.Windows.Storage.FileProperties.ThumbnailMode.videosView,d=b.Windows.Storage.KnownFolders.videosLibrary,g=190),d){var j=new b.Windows.Storage.Search.QueryOptions;j.folderDepth=b.Windows.Storage.Search.FolderDepth.deep,j.indexerOption=b.Windows.Storage.Search.IndexerOption.useIndexerWhenAvailable,this._query=d.createFileQueryWithOptions(j)}else this._query=a;if(c){if("number"==typeof c.mode&&(e=c.mode),"number"==typeof c.requestedThumbnailSize)g=Math.max(1,Math.min(c.requestedThumbnailSize,1024));else switch(e){case b.Windows.Storage.FileProperties.ThumbnailMode.picturesView:case b.Windows.Storage.FileProperties.ThumbnailMode.videosView:g=190;break;case b.Windows.Storage.FileProperties.ThumbnailMode.documentsView:case b.Windows.Storage.FileProperties.ThumbnailMode.listView:g=40;break;case b.Windows.Storage.FileProperties.ThumbnailMode.musicView:case b.Windows.Storage.FileProperties.ThumbnailMode.singleItem:g=256}"number"==typeof c.thumbnailOptions&&(h=c.thumbnailOptions),"boolean"==typeof c.waitForFileLoad&&(i=!c.waitForFileLoad)}this._loader=new b.Windows.Storage.BulkAccess.FileInformationFactory(this._query,e,g,h,i),this.compareByIdentity=!1,this.firstDataRequest=!0,f("WinJS.UI.StorageDataSource:constructor,StopTM")},{setNotificationHandler:function(a){this._notificationHandler=a,this._query.addEventListener("contentschanged",function(){a.invalidateAll()}),this._query.addEventListener("optionschanged",function(){a.invalidateAll()})},itemsFromEnd:function(a){var b=this;return f("WinJS.UI.StorageDataSource:itemsFromEnd,info"),this.getCount().then(function(c){return 0===c?h.wrapError(new e(i.FetchError.doesNotExist)):b.itemsFromIndex(c-1,Math.min(c-1,a-1),1)})},itemsFromIndex:function(a,b,c){function d(a){k._notificationHandler.changed(k._item(a.target))}b+c>64&&(b=Math.min(b,32),c=64-(b+1));var g=a-b,j=b+1+c,k=this;k.firstDataRequest&&(k.firstDataRequest=!1,j=Math.max(j,32));var l="WinJS.UI.StorageDataSource:itemsFromIndex("+g+"-"+(g+j-1)+")";return f(l+",StartTM"),this._loader.getItemsAsync(g,j).then(function(c){var m=c.size;if(b>=m)return h.wrapError(new e(i.FetchError.doesNotExist));var n=new Array(m),o=new Array(m);c.getMany(0,o);for(var p=0;m>p;p++)n[p]=k._item(o[p]),o[p].addEventListener("propertiesupdated",d);var q={items:n,offset:b,absoluteIndex:a};return j>m&&(q.totalCount=g+m),f(l+",StopTM"),q})},itemsFromDescription:function(a,b,c){var d=this;return f("WinJS.UI.StorageDataSource:itemsFromDescription,info"),this._query.findStartIndexAsync(a).then(function(a){return d.itemsFromIndex(a,b,c)})},getCount:function(){return f("WinJS.UI.StorageDataSource:getCount,info"),this._query.getItemCountAsync()},itemSignature:function(a){return a.folderRelativeId},_item:function(a){return{key:a.path||a.folderRelativeId,data:a}}},{supportedForProcessing:!1});return d.Class.derive(j.VirtualizedDataSource,function(b,c){this._baseDataSourceConstructor(new a(b,c))},{},{loadThumbnail:function(a,d){var e,i,j=!1;return new h(function(k){var l=!!d,m=function(m){if(m){var n=c.URL.createObjectURL(m,{oneTimeOnly:!0});i=i?i.then(function(b){return a.loadImage(n,b)}):a.loadImage(n,d).then(function(b){return a.isOnScreen().then(function(a){var c;return a&&l?c=g.fadeIn(b).then(function(){return b}):(b.style.opacity=1,c=h.wrap(b)),c})}),m.type===b.Windows.Storage.FileProperties.ThumbnailType.icon||m.returnedSmallerCachedSize||(f("WinJS.UI.StorageDataSource:loadThumbnail complete,info"),a.data.removeEventListener("thumbnailupdated",e),j=!1,i=i.then(function(a){e=null,i=null,k(a)}))}};e=function(a){j&&m(a.target.thumbnail)},a.data.addEventListener("thumbnailupdated",e),j=!0,m(a.data.thumbnail)},function(){a.data.removeEventListener("thumbnailupdated",e),j=!1,e=null,i&&(i.cancel(),i=null)})},supportedForProcessing:!1})})})}),d("WinJS/VirtualizedDataSource",["./VirtualizedDataSource/_VirtualizedDataSourceImpl","./VirtualizedDataSource/_GroupDataSource","./VirtualizedDataSource/_GroupedItemDataSource","./VirtualizedDataSource/_StorageDataSource"],function(){}),d("WinJS/Vui",["require","exports","./Core/_Global","./Utilities/_ElementUtilities"],function(a,b,c,d){function e(a){if(!a.defaultPrevented){var b=a.target,c=f[b.tagName];if(c)switch(a.state){case j.active:b[g.vuiData]||d.hasClass(b,h.active)?(d.removeClass(b,h.disambiguation),c.reactivate(b,a.label)):(d.addClass(b,h.active),c.activate(b,a.label));break;case j.disambiguation:d.addClass(b,h.active),d.addClass(b,h.disambiguation),c.disambiguate(b,a.label);break;case j.inactive:d.removeClass(b,h.active),d.removeClass(b,h.disambiguation),c.deactivate(b)}}}var f,g={vuiData:"_winVuiData"},h={active:"win-vui-active",disambiguation:"win-vui-disambiguation"},i={ListeningModeStateChanged:"ListeningStateChanged"},j={active:"active",disambiguation:"disambiguation",inactive:"inactive"};!function(a){a.BUTTON={activate:function(a,b){var c={nodes:[],width:a.style.width,height:a.style.height},e=d._getComputedStyle(a);for(a.style.width=e.width,a.style.height=e.height;a.childNodes.length;)c.nodes.push(a.removeChild(a.childNodes[0]));a[g.vuiData]=c,a.textContent=b},disambiguate:function(a,b){a.textContent=b},reactivate:function(a,b){a.textContent=b},deactivate:function(a){a.innerHTML="";var b=a[g.vuiData];a.style.width=b.width,a.style.height=b.height,b.nodes.forEach(function(b){return a.appendChild(b)}),delete a[g.vuiData]}}}(f||(f={})),c.document&&c.document.addEventListener(i.ListeningModeStateChanged,e)}),d("WinJS/_Accents",["require","exports","./Core/_Global","./Core/_WinRT","./Core/_Base","./Core/_BaseUtils","./Utilities/_ElementUtilities"],function(a,b,c,d,e,f,g){function h(a,b){t.push({selector:a,props:b}),i()}function i(){0!==t.length&&-1===u&&(u=f._setImmediate(function(){u=-1,m();var a=s?o.lightThemeSelector:o.darkThemeSelector,b=o.hoverSelector+" "+a,d=c.document.createElement("style");d.id=o.accentStyleId,d.textContent=t.map(function(c){var d="  "+c.props.map(function(a){return a.name+": "+r[a.value]+";"}).join("\n  "),e=c.selector.split(",").map(function(a){return l(a)}),f=e.join(",\n"),g=f+" {\n"+d+"\n}",h=c.props.some(function(a){return 0!==a.value});if(h){var i="  "+c.props.map(function(a){return a.name+": "+r[a.value?a.value+3:a.value]+";"}).join("\n  "),j=[];e.forEach(function(c){if(-1!==c.indexOf(o.hoverSelector)&&-1===c.indexOf(b)){j.push(c.replace(o.hoverSelector,b));var d=c.replace(o.hoverSelector,"").trim();-1!==p.indexOf(d[0])&&j.push(c.replace(o.hoverSelector+" ",b))}else j.push(a+" "+c),-1!==p.indexOf(c[0])&&j.push(a+c);g+="\n"+j.join(",\n")+" {\n"+i+"\n}"})}return g}).join("\n"),c.document.head.appendChild(d)}))}function j(){var a=(d.Windows.UI.ViewManagement.UIColorType,q.getColorValue(d.Windows.UI.ViewManagement.UIColorType.accent)),b=k(a,1);r[0]!==b&&(r.length=0,r.push(b,k(a,s?.6:.4),k(a,s?.8:.6),k(a,s?.9:.7),k(a,s?.4:.6),k(a,s?.6:.8),k(a,s?.7:.9)),i())}function k(a,b){return"rgba("+a.r+","+a.g+","+a.b+","+b+")"}function l(a){return a.replace(/  /g," ").replace(/  /g," ").trim();
-}function m(){var a=c.document.head.querySelector("#"+o.accentStyleId);a&&a.parentNode.removeChild(a)}function n(){t.length=0,m()}var o={accentStyleId:"WinJSAccentsStyle",themeDetectionTag:"winjs-themedetection-tag",hoverSelector:"html.win-hoverable",lightThemeSelector:".win-ui-light",darkThemeSelector:".win-ui-dark"},p=[".","#",":"],q=null,r=[],s=!1,t=[],u=-1;!function(a){a[a.accent=0]="accent",a[a.listSelectRest=1]="listSelectRest",a[a.listSelectHover=2]="listSelectHover",a[a.listSelectPress=3]="listSelectPress",a[a._listSelectRestInverse=4]="_listSelectRestInverse",a[a._listSelectHoverInverse=5]="_listSelectHoverInverse",a[a._listSelectPressInverse=6]="_listSelectPressInverse"}(b.ColorTypes||(b.ColorTypes={}));var v=b.ColorTypes;b.createAccentRule=h;var w=c.document.createElement(o.themeDetectionTag);c.document.head.appendChild(w);var x=g._getComputedStyle(w);s="0"===x.opacity,w.parentElement.removeChild(w);try{q=new d.Windows.UI.ViewManagement.UISettings,q.addEventListener("colorvalueschanged",j),j()}catch(y){r.push("rgb(0, 120, 215)","rgba(0, 120, 215, "+(s?"0.6":"0.4")+")","rgba(0, 120, 215, "+(s?"0.8":"0.6")+")","rgba(0, 120, 215, "+(s?"0.9":"0.7")+")","rgba(0, 120, 215, "+(s?"0.4":"0.6")+")","rgba(0, 120, 215, "+(s?"0.6":"0.8")+")","rgba(0, 120, 215, "+(s?"0.7":"0.9")+")")}var z={ColorTypes:v,createAccentRule:h,_colors:r,_reset:n,_isDarkTheme:s};e.Namespace.define("WinJS.UI._Accents",z)}),d("require-style",{load:function(a){throw new Error("Dynamic load not allowed: "+a)}}),d("require-style!less/styles-intrinsic",[],function(){}),d("require-style!less/colors-intrinsic",[],function(){}),d("WinJS/Controls/IntrinsicControls",["../Utilities/_Hoverable","../_Accents","require-style!less/styles-intrinsic","require-style!less/colors-intrinsic"],function(a,b){"use strict";b.createAccentRule(".win-link,         .win-progress-bar,         .win-progress-ring,         .win-ring",[{name:"color",value:b.ColorTypes.accent}]),b.createAccentRule("::selection,         .win-button.win-button-primary,         .win-dropdown option:checked,         select[multiple].win-dropdown option:checked",[{name:"background-color",value:b.ColorTypes.accent}]),b.createAccentRule(".win-textbox:focus,         .win-textarea:focus,         .win-textbox:focus:hover,         .win-textarea:focus:hover",[{name:"border-color",value:b.ColorTypes.accent}]),b.createAccentRule(".win-textbox::-ms-clear:hover:not(:active),         .win-textbox::-ms-reveal:hover:not(:active)",[{name:"color",value:b.ColorTypes.accent}]),b.createAccentRule(".win-checkbox:checked::-ms-check,         .win-textbox::-ms-clear:active,         .win-textbox::-ms-reveal:active",[{name:"background-color",value:b.ColorTypes.accent}]),b.createAccentRule(".win-progress-bar::-webkit-progress-value,         .win-progress-ring::-webkit-progress-value,         .win-ring::-webkit-progress-value",[{name:"background-color",value:b.ColorTypes.accent}]),b.createAccentRule(".win-progress-bar:not(:indeterminate)::-moz-progress-bar,         .win-progress-ring:not(:indeterminate)::-moz-progress-bar,         .win-ring:not(:indeterminate)::-moz-progress-bar",[{name:"background-color",value:b.ColorTypes.accent}]),b.createAccentRule(".win-checkbox:indeterminate::-ms-check,         .win-checkbox:hover:indeterminate::-ms-check,         .win-radio:checked::-ms-check",[{name:"border-color",value:b.ColorTypes.accent}]),b.createAccentRule(".win-slider::-ms-thumb,         .win-slider::-ms-fill-lower",[{name:"background",value:b.ColorTypes.accent}]),b.createAccentRule(".win-slider::-webkit-slider-thumb",[{name:"background",value:b.ColorTypes.accent}]),b.createAccentRule(".win-slider::-moz-range-thumb",[{name:"background",value:b.ColorTypes.accent}])}),d("WinJS/Controls/ElementResizeInstrument/_ElementResizeInstrument",["require","exports","../../Core/_BaseUtils","../../Core/_Base","../../Core/_Global","../../Core/_Log","../../Core/_ErrorFromName","../../Core/_Events","../../Promise","../../Utilities/_ElementUtilities"],function(a,b,c,d,e,f,g,h,i,j){"use strict";var k="display: block;position:absolute;top: 0;left: 0;height: 100%;width: 100%;overflow: hidden;pointer-events: none;z-index: -1;",l="win-resizeinstrument",m="about:blank",n={resize:"resize",_ready:"_ready"},o="resize",p="msHighContrastAdjust"in document.documentElement.style,q=function(){function a(){var a=this;this._disposed=!1,this._elementLoaded=!1,this._running=!1,this._objectWindowResizeHandlerBound=this._objectWindowResizeHandler.bind(this);var b=e.document.createElement("OBJECT");b.setAttribute("style",k),p?b.style.visibility="hidden":b.data=m,b.type="text/html",b.winControl=this,j.addClass(b,l),j.addClass(b,"win-disposable"),this._element=b,this._elementLoadPromise=new i(function(c){b.onload=function(){a._disposed||(a._elementLoaded=!0,a._objWindow.addEventListener(o,a._objectWindowResizeHandlerBound),c())}})}return Object.defineProperty(a.prototype,"element",{get:function(){return this._element},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"_objWindow",{get:function(){return this._elementLoaded&&this._element.contentDocument&&this._element.contentDocument.defaultView||null},enumerable:!0,configurable:!0}),a.prototype.addedToDom=function(){var a=this;if(!this._disposed){var b=this.element;if(!e.document.body.contains(b))throw new g("WinJS.UI._ElementResizeInstrument","ElementResizeInstrument initialization failed");f.log&&"static"===j._getComputedStyle(b.parentElement).position&&f.log("_ElementResizeInstrument can only detect size changes that are made to it's nearest positioned ancestor. Its parent element is not currently positioned."),!this._elementLoaded&&p&&(b.data="about:blank"),this._elementLoadPromise.then(function(){a._running=!0,a.dispatchEvent(n._ready,null);var b=i.timeout(50),c=function(){a.removeEventListener(n.resize,c),b.cancel()};a.addEventListener(n.resize,c),b.then(function(){a._objectWindowResizeHandler()})})}},a.prototype.dispose=function(){this._disposed||(this._disposed=!0,this._elementLoadPromise.cancel(),this._objWindow&&this._objWindow.removeEventListener.call(this._objWindow,o,this._objectWindowResizeHandlerBound),this._running=!1)},a.prototype.addEventListener=function(a,b,c){},a.prototype.dispatchEvent=function(a,b){return!1},a.prototype.removeEventListener=function(a,b,c){},a.prototype._objectWindowResizeHandler=function(){var a=this;this._running&&this._batchResizeEvents(function(){a._fireResizeEvent()})},a.prototype._batchResizeEvents=function(a){this._pendingResizeAnimationFrameId&&c._cancelAnimationFrame(this._pendingResizeAnimationFrameId),this._pendingResizeAnimationFrameId=c._requestAnimationFrame(function(){a()})},a.prototype._fireResizeEvent=function(){this._disposed||this.dispatchEvent(n.resize,null)},a.EventNames=n,a}();b._ElementResizeInstrument=q,d.Class.mix(q,h.eventMixin)}),d("WinJS/Controls/ElementResizeInstrument",["require","exports"],function(a,b){function c(){return d||a(["./ElementResizeInstrument/_ElementResizeInstrument"],function(a){d=a}),d._ElementResizeInstrument}var d=null,e=Object.create({},{_ElementResizeInstrument:{get:function(){return c()}}});return e}),d("WinJS/Controls/ItemContainer/_Constants",["exports","../../Core/_Base"],function(a,b){"use strict";var c={};c._listViewClass="win-listview",c._viewportClass="win-viewport",c._rtlListViewClass="win-rtl",c._horizontalClass="win-horizontal",c._verticalClass="win-vertical",c._scrollableClass="win-surface",c._itemsContainerClass="win-itemscontainer",c._listHeaderContainerClass="win-headercontainer",c._listFooterContainerClass="win-footercontainer",c._padderClass="win-itemscontainer-padder",c._proxyClass="_win-proxy",c._itemClass="win-item",c._itemBoxClass="win-itembox",c._itemsBlockClass="win-itemsblock",c._containerClass="win-container",c._containerEvenClass="win-container-even",c._containerOddClass="win-container-odd",c._backdropClass="win-backdrop",c._footprintClass="win-footprint",c._groupsClass="win-groups",c._selectedClass="win-selected",c._selectionBorderClass="win-selectionborder",c._selectionBackgroundClass="win-selectionbackground",c._selectionCheckmarkClass="win-selectioncheckmark",c._selectionCheckmarkBackgroundClass="win-selectioncheckmarkbackground",c._pressedClass="win-pressed",c._headerClass="win-groupheader",c._headerContainerClass="win-groupheadercontainer",c._groupLeaderClass="win-groupleader",c._progressClass="win-progress",c._revealedClass="win-revealed",c._itemFocusClass="win-focused",c._itemFocusOutlineClass="win-focusedoutline",c._zoomingXClass="win-zooming-x",c._zoomingYClass="win-zooming-y",c._listLayoutClass="win-listlayout",c._gridLayoutClass="win-gridlayout",c._headerPositionTopClass="win-headerpositiontop",c._headerPositionLeftClass="win-headerpositionleft",c._structuralNodesClass="win-structuralnodes",c._singleItemsBlockClass="win-single-itemsblock",c._uniformGridLayoutClass="win-uniformgridlayout",c._uniformListLayoutClass="win-uniformlistlayout",c._cellSpanningGridLayoutClass="win-cellspanninggridlayout",c._laidOutClass="win-laidout",c._nonDraggableClass="win-nondraggable",c._nonSelectableClass="win-nonselectable",c._dragOverClass="win-dragover",c._dragSourceClass="win-dragsource",c._clipClass="win-clip",c._selectionModeClass="win-selectionmode",c._noCSSGrid="win-nocssgrid",c._hidingSelectionMode="win-hidingselectionmode",c._hidingSelectionModeAnimationTimeout=250,c._INVALID_INDEX=-1,c._UNINITIALIZED=-1,c._LEFT_MSPOINTER_BUTTON=0,c._RIGHT_MSPOINTER_BUTTON=2,c._TAP_END_THRESHOLD=10,c._DEFAULT_PAGES_TO_LOAD=5,c._DEFAULT_PAGE_LOAD_THRESHOLD=2,c._MIN_AUTOSCROLL_RATE=150,c._MAX_AUTOSCROLL_RATE=1500,c._AUTOSCROLL_THRESHOLD=100,c._AUTOSCROLL_DELAY=50,c._DEFERRED_ACTION=250,c._DEFERRED_SCROLL_END=250,c._SELECTION_CHECKMARK="",c._LISTVIEW_PROGRESS_DELAY=2e3;var d={uninitialized:0,low:1,medium:2,high:3},e={rebuild:0,remeasure:1,relayout:2,realize:3};c._ScrollToPriority=d,c._ViewChange=e,b.Namespace._moduleDefine(a,"WinJS.UI",c)}),d("WinJS/Controls/ItemContainer/_ItemEventsHandler",["exports","../../Core/_Global","../../Core/_WinRT","../../Core/_Base","../../Core/_BaseUtils","../../Core/_WriteProfilerMark","../../Animations","../../Animations/_TransitionAnimation","../../Promise","../../Utilities/_ElementUtilities","../../Utilities/_UI","./_Constants"],function(a,b,c,d,e,f,g,h,i,j,k,l){"use strict";var m=e._browserStyleEquivalents.transform;d.Namespace._moduleDefine(a,"WinJS.UI",{_ItemEventsHandler:d.Namespace._lazy(function(){function a(a,c){var d=b.document.createElement("div");return d.className=a,c||d.setAttribute("aria-hidden",!0),d}var g=j._MSPointerEvent.MSPOINTER_TYPE_TOUCH||"touch",h=d.Class.define(function(a){this._site=a,this._work=[],this._animations={}},{dispose:function(){this._disposed||(this._disposed=!0,j._removeEventListener(b,"pointerup",this._resetPointerDownStateBound),j._removeEventListener(b,"pointercancel",this._resetPointerDownStateBound))},onPointerDown:function(a){f("WinJS.UI._ItemEventsHandler:MSPointerDown,StartTM");var d,h,i=this._site,m=a.pointerType===g;if(i.pressedElement=a.target,c.Windows.UI.Input.PointerPoint){var n=this._getCurrentPoint(a),o=n.properties;m||o.isInverted||o.isEraser||o.isMiddleButtonPressed?d=h=!1:(h=o.isRightButtonPressed,d=!h&&o.isLeftButtonPressed)}else d=a.button===l._LEFT_MSPOINTER_BUTTON,h=a.button===l._RIGHT_MSPOINTER_BUTTON;this._DragStartBound=this._DragStartBound||this.onDragStart.bind(this),this._PointerEnterBound=this._PointerEnterBound||this.onPointerEnter.bind(this),this._PointerLeaveBound=this._PointerLeaveBound||this.onPointerLeave.bind(this);var p=this._isInteractive(a.target),q=i.indexForItemElement(a.target),r=i.indexForHeaderElement(a.target),s=!p&&q!==l._INVALID_INDEX;if((m||d)&&this._site.pressedEntity.index===l._INVALID_INDEX&&!p&&(r===l._INVALID_INDEX?this._site.pressedEntity={type:k.ObjectType.item,index:q}:this._site.pressedEntity={type:k.ObjectType.groupHeader,index:r},this._site.pressedEntity.index!==l._INVALID_INDEX)){this._site.pressedPosition=j._getCursorPos(a);var t=i.verifySelectionAllowed(this._site.pressedEntity);this._canSelect=t.canSelect,this._canTapSelect=t.canTapSelect,this._site.pressedEntity.type===k.ObjectType.item?(this._site.pressedItemBox=i.itemBoxAtIndex(this._site.pressedEntity.index),this._site.pressedContainer=i.containerAtIndex(this._site.pressedEntity.index),this._site.animatedElement=this._site.pressedContainer,this._site.pressedHeader=null,this._togglePressed(!0,a),this._site.pressedContainer.addEventListener("dragstart",this._DragStartBound),m||(j._addEventListener(this._site.pressedContainer,"pointerenter",this._PointerEnterBound,!1),j._addEventListener(this._site.pressedContainer,"pointerleave",this._PointerLeaveBound,!1))):(this._site.pressedHeader=this._site.headerFromElement(a.target),e.isPhone?(this._site.animatedElement=this._site.pressedHeader,this._togglePressed(!0,a)):(this._site.pressedItemBox=null,this._site.pressedContainer=null,this._site.animatedElement=null)),this._resetPointerDownStateBound||(this._resetPointerDownStateBound=this._resetPointerDownStateForPointerId.bind(this)),m||(j._addEventListener(b,"pointerup",this._resetPointerDownStateBound,!1),j._addEventListener(b,"pointercancel",this._resetPointerDownStateBound,!1)),this._pointerId=a.pointerId,this._pointerRightButton=h}if(s&&m)try{j._setPointerCapture(i.canvasProxy,a.pointerId)}catch(u){return void f("WinJS.UI._ItemEventsHandler:MSPointerDown,StopTM")}this._site.pressedEntity.type===k.ObjectType.item&&this._selectionAllowed()&&this._multiSelection()&&this._site.pressedEntity.index!==l._INVALID_INDEX&&i.selection._getFocused().index!==l._INVALID_INDEX&&i.selection._pivot===l._INVALID_INDEX&&(i.selection._pivot=i.selection._getFocused().index),f("WinJS.UI._ItemEventsHandler:MSPointerDown,StopTM")},onPointerEnter:function(a){this._site.pressedContainer&&this._pointerId===a.pointerId&&this._togglePressed(!0,a)},onPointerLeave:function(a){this._site.pressedContainer&&this._pointerId===a.pointerId&&this._togglePressed(!1,a)},onDragStart:function(){this._resetPressedContainer()},_resetPressedContainer:function(){(this._site.pressedContainer||this._site.pressedHeader)&&this._site.animatedElement&&(this._togglePressed(!1),this._site.pressedContainer&&(this._site.pressedContainer.style[m.scriptName]="",this._site.pressedContainer.removeEventListener("dragstart",this._DragStartBound),j._removeEventListener(this._site.pressedContainer,"pointerenter",this._PointerEnterBound,!1),j._removeEventListener(this._site.pressedContainer,"pointerleave",this._PointerLeaveBound,!1)))},onClick:function(a){if(!this._skipClick){var b={type:k.ObjectType.item,index:this._site.indexForItemElement(a.target)};if(b.index===l._INVALID_INDEX&&(b.index=this._site.indexForHeaderElement(a.target),b.index!==l._INVALID_INDEX&&(b.type=k.ObjectType.groupHeader)),b.index!==l._INVALID_INDEX&&(j.hasClass(a.target,this._site.accessibleItemClass)||j.hasClass(a.target,l._headerClass))){var c=this._site.verifySelectionAllowed(b);c.canTapSelect&&this.handleTap(b),this._site.fireInvokeEvent(b,a.target)}}},onPointerUp:function(a){f("WinJS.UI._ItemEventsHandler:MSPointerUp,StartTM");var b=this._site;this._skipClick=!0;var c=this;e._yieldForEvents(function(){c._skipClick=!1});try{j._releasePointerCapture(b.canvasProxy,a.pointerId)}catch(d){}var h=a.pointerType===g,i=this._releasedElement(a),m=b.indexForItemElement(i),n=i&&j.hasClass(i,l._headerContainerClass)?b.indexForHeaderElement(b.pressedHeader):b.indexForHeaderElement(i);if(this._pointerId===a.pointerId){var o;if(o=n===l._INVALID_INDEX?{type:k.ObjectType.item,index:m}:{type:k.ObjectType.groupHeader,index:n},this._resetPressedContainer(),this._site.pressedEntity.type===k.ObjectType.item&&o.type===k.ObjectType.item&&this._site.pressedContainer&&this._site.pressedEntity.index===o.index)if(a.shiftKey||(b.selection._pivot=l._INVALID_INDEX),a.shiftKey){if(this._selectionAllowed()&&this._multiSelection()&&b.selection._pivot!==l._INVALID_INDEX){var p=Math.min(this._site.pressedEntity.index,b.selection._pivot),q=Math.max(this._site.pressedEntity.index,b.selection._pivot),r=this._pointerRightButton||a.ctrlKey||b.tapBehavior===k.TapBehavior.toggleSelect;b.selectRange(p,q,r)}}else a.ctrlKey&&this.toggleSelectionIfAllowed(this._site.pressedEntity.index);if(this._site.pressedHeader||this._site.pressedContainer){var s=j._getCursorPos(a),t=Math.abs(s.left-this._site.pressedPosition.left)<=l._TAP_END_THRESHOLD&&Math.abs(s.top-this._site.pressedPosition.top)<=l._TAP_END_THRESHOLD;this._pointerRightButton||a.ctrlKey||a.shiftKey||!(h&&t||!h&&this._site.pressedEntity.index===o.index&&this._site.pressedEntity.type===o.type)||(o.type===k.ObjectType.groupHeader?(this._site.pressedHeader=b.headerAtIndex(o.index),this._site.pressedItemBox=null,this._site.pressedContainer=null):(this._site.pressedItemBox=b.itemBoxAtIndex(o.index),this._site.pressedContainer=b.containerAtIndex(o.index),this._site.pressedHeader=null),this._canTapSelect&&this.handleTap(this._site.pressedEntity),this._site.fireInvokeEvent(this._site.pressedEntity,this._site.pressedItemBox||this._site.pressedHeader))}this._site.pressedEntity.index!==l._INVALID_INDEX&&b.changeFocus(this._site.pressedEntity,!0,!1,!0),this.resetPointerDownState()}f("WinJS.UI._ItemEventsHandler:MSPointerUp,StopTM")},onPointerCancel:function(a){this._pointerId===a.pointerId&&(f("WinJS.UI._ItemEventsHandler:MSPointerCancel,info"),this.resetPointerDownState())},onLostPointerCapture:function(a){this._pointerId===a.pointerId&&(f("WinJS.UI._ItemEventsHandler:MSLostPointerCapture,info"),this.resetPointerDownState())},onContextMenu:function(a){this._shouldSuppressContextMenu(a.target)&&a.preventDefault()},onMSHoldVisual:function(a){this._shouldSuppressContextMenu(a.target)&&a.preventDefault()},onDataChanged:function(){this.resetPointerDownState()},toggleSelectionIfAllowed:function(a){this._selectionAllowed(a)&&this._toggleItemSelection(a)},handleTap:function(a){if(a.type!==k.ObjectType.groupHeader){var b=this._site,c=b.selection;this._selectionAllowed(a.index)&&this._selectOnTap()&&(b.tapBehavior===k.TapBehavior.toggleSelect?this._toggleItemSelection(a.index):b.selectionMode!==k.SelectionMode.multi&&c._isIncluded(a.index)||c.set(a.index))}},_toggleItemSelection:function(a){var b=this._site,c=b.selection,d=c._isIncluded(a);b.selectionMode===k.SelectionMode.single?d?c.clear():c.set(a):d?c.remove(a):c.add(a)},_getCurrentPoint:function(a){return c.Windows.UI.Input.PointerPoint.getCurrentPoint(a.pointerId)},_containedInElementWithClass:function(a,b){if(a.parentNode)for(var c=a.parentNode.querySelectorAll("."+b+", ."+b+" *"),d=0,e=c.length;e>d;d++)if(c[d]===a)return!0;return!1},_isSelected:function(a){return this._site.selection._isIncluded(a)},_isInteractive:function(a){return this._containedInElementWithClass(a,"win-interactive")},_shouldSuppressContextMenu:function(a){var b=this._site.containerFromElement(a);return this._selectionAllowed()&&b&&!this._isInteractive(a)},_togglePressed:function(a,b){var c=this._site.pressedEntity.type===k.ObjectType.groupHeader;!c&&j.hasClass(this._site.pressedItemBox,l._nonSelectableClass)||this._staticMode(c)||(a?j.addClass(this._site.animatedElement,l._pressedClass):j.removeClass(this._site.animatedElement,l._pressedClass))},_resetPointerDownStateForPointerId:function(a){this._pointerId===a.pointerId&&this.resetPointerDownState()},resetPointerDownState:function(){this._site.pressedElement=null,j._removeEventListener(b,"pointerup",this._resetPointerDownStateBound),j._removeEventListener(b,"pointercancel",this._resetPointerDownStateBound),this._resetPressedContainer(),this._site.pressedContainer=null,this._site.animatedElement=null,this._site.pressedHeader=null,this._site.pressedItemBox=null,this._site.pressedEntity={type:k.ObjectType.item,index:l._INVALID_INDEX},this._pointerId=null},_releasedElement:function(a){return b.document.elementFromPoint(a.clientX,a.clientY)},_applyUIInBatches:function(a){function b(){c._work.length>0?(c._flushUIBatches(),c._paintedThisFrame=e._requestAnimationFrame(b.bind(c))):c._paintedThisFrame=null}var c=this;this._work.push(a),this._paintedThisFrame||b()},_flushUIBatches:function(){if(this._work.length>0){var a=this._work;this._work=[];for(var b=0;b<a.length;b++)a[b]()}},_selectionAllowed:function(a){var b=void 0!==a?this._site.itemAtIndex(a):null,c=!(b&&j.hasClass(b,l._nonSelectableClass));return c&&this._site.selectionMode!==k.SelectionMode.none},_multiSelection:function(){return this._site.selectionMode===k.SelectionMode.multi},_selectOnTap:function(){return this._site.tapBehavior===k.TapBehavior.toggleSelect||this._site.tapBehavior===k.TapBehavior.directSelect},_staticMode:function(a){return a?this._site.headerTapBehavior===k.GroupHeaderTapBehavior.none:this._site.tapBehavior===k.TapBehavior.none&&this._site.selectionMode===k.SelectionMode.none}},{setAriaSelected:function(a,b){var c="true"===a.getAttribute("aria-selected");b!==c&&a.setAttribute("aria-selected",b)},renderSelection:function(b,c,d,e,f){if(!h._selectionTemplate){h._selectionTemplate=[],h._selectionTemplate.push(a(l._selectionBackgroundClass)),h._selectionTemplate.push(a(l._selectionBorderClass)),h._selectionTemplate.push(a(l._selectionCheckmarkBackgroundClass));var g=a(l._selectionCheckmarkClass);g.textContent=l._SELECTION_CHECKMARK,h._selectionTemplate.push(g)}if(d!==j._isSelectionRendered(b)){if(d){b.insertBefore(h._selectionTemplate[0].cloneNode(!0),b.firstElementChild);for(var i=1,k=h._selectionTemplate.length;k>i;i++)b.appendChild(h._selectionTemplate[i].cloneNode(!0))}else for(var m=b.querySelectorAll(j._selectionPartsSelector),i=0,k=m.length;k>i;i++)b.removeChild(m[i]);j[d?"addClass":"removeClass"](b,l._selectedClass),f&&j[d?"addClass":"removeClass"](f,l._selectedClass)}e&&h.setAriaSelected(c,d)}});return h})})}),d("WinJS/Controls/ListView/_SelectionManager",["exports","../../Core/_Global","../../Core/_Base","../../Promise","../../_Signal","../../Utilities/_UI","../ItemContainer/_Constants"],function(a,b,c,d,e,f,g){"use strict";c.Namespace._moduleDefine(a,"WinJS.UI",{_ItemSet:c.Namespace._lazy(function(){var b=c.Class.define(function(a,b,c){this._listView=a,this._ranges=b,this._itemsCount=c});return b.prototype={getRanges:function(){for(var a=[],b=0,c=this._ranges.length;c>b;b++){var d=this._ranges[b];a.push({firstIndex:d.firstIndex,lastIndex:d.lastIndex,firstKey:d.firstKey,lastKey:d.lastKey})}return a},getItems:function(){return a.getItemsFromRanges(this._listView._itemsManager.dataSource,this._ranges)},isEverything:function(){return this.count()===this._itemsCount},count:function(){for(var a=0,b=0,c=this._ranges.length;c>b;b++){var d=this._ranges[b];a+=d.lastIndex-d.firstIndex+1}return a},getIndices:function(){for(var a=[],b=0,c=this._ranges.length;c>b;b++)for(var d=this._ranges[b],e=d.firstIndex;e<=d.lastIndex;e++)a.push(e);return a}},b}),getItemsFromRanges:function(a,b){function c(){for(var a=[],c=0,e=b.length;e>c;c++)for(var f=b[c],g=f.firstIndex;g<=f.lastIndex;g++)a.push(g);return d.wrap(a)}var e=a.createListBinding(),f=[];return c().then(function(a){for(var b=0;b<a.length;b++)f.push(e.fromIndex(a[b]));return d.join(f).then(function(a){return e.release(),a})})},_Selection:c.Namespace._lazy(function(){function b(a){return a&&0===a.firstIndex&&a.lastIndex===Number.MAX_VALUE}return c.Class.derive(a._ItemSet,function(a,b){this._listView=a,this._itemsCount=-1,this._ranges=[],b&&this.set(b)},{clear:function(){return this._releaseRanges(this._ranges),this._ranges=[],d.wrap()},set:function(a){if(b(a))return this.selectAll();this._releaseRanges(this._ranges),this._ranges=[];var c=this;return this._execute("_set",a).then(function(){return c._ranges.sort(function(a,b){return a.firstIndex-b.firstIndex}),c._ensureKeys()}).then(function(){return c._ensureCount()})},add:function(a){if(b(a))return this.selectAll();var c=this;return this._execute("_add",a).then(function(){return c._ensureKeys()}).then(function(){return c._ensureCount()})},remove:function(a){var b=this;return this._execute("_remove",a).then(function(){return b._ensureKeys()})},selectAll:function(){var a=this;return a._ensureCount().then(function(){if(a._itemsCount){var b={firstIndex:0,lastIndex:a._itemsCount-1};return a._retainRange(b),a._releaseRanges(a._ranges),a._ranges=[b],a._ensureKeys()}})},_execute:function(a,b){function c(a,b,c){var d={};return d["first"+a]=b,d["last"+a]=c,d}function e(b){var c=f._getListBinding(),e=d.join([c.fromKey(b.firstKey),c.fromKey(b.lastKey)]).then(function(c){return c[0]&&c[1]&&(b.firstIndex=c[0].index,b.lastIndex=c[1].index,f[a](b)),b});i.push(e)}for(var f=this,g=!!f._getListBinding().fromKey,h=Array.isArray(b)?b:[b],i=[d.wrap()],j=0,k=h.length;k>j;j++){var l=h[j];"number"==typeof l?this[a](c("Index",l,l)):l&&(g&&void 0!==l.key?e(c("Key",l.key,l.key)):g&&void 0!==l.firstKey&&void 0!==l.lastKey?e(c("Key",l.firstKey,l.lastKey)):void 0!==l.index&&"number"==typeof l.index?this[a](c("Index",l.index,l.index)):void 0!==l.firstIndex&&void 0!==l.lastIndex&&"number"==typeof l.firstIndex&&"number"==typeof l.lastIndex&&this[a](c("Index",l.firstIndex,l.lastIndex)))}return d.join(i)},_set:function(a){this._retainRange(a),this._ranges.push(a)},_add:function(a){for(var b,c,d,e=this,f=null,g=function(a,b){b.lastIndex>a.lastIndex&&(a.lastIndex=b.lastIndex,a.lastKey=b.lastKey,a.lastPromise&&a.lastPromise.release(),a.lastPromise=e._getListBinding().fromIndex(a.lastIndex).retain())},h=0,i=this._ranges.length;i>h;h++){if(b=this._ranges[h],a.firstIndex<b.firstIndex){d=f&&a.firstIndex<f.lastIndex+1,d?(c=h-1,g(f,a)):(this._insertRange(h,a),c=h);break}if(a.firstIndex===b.firstIndex){g(b,a),c=h;break}f=b}if(void 0===c){var j=this._ranges.length?this._ranges[this._ranges.length-1]:null,k=j&&a.firstIndex<j.lastIndex+1;k?g(j,a):(this._retainRange(a),this._ranges.push(a))}else{for(f=null,h=c+1,i=this._ranges.length;i>h;h++){if(b=this._ranges[h],a.lastIndex<b.firstIndex){d=f&&f.lastIndex>a.lastIndex,d&&g(this._ranges[c],f),this._removeRanges(c+1,h-c-1);break}if(a.lastIndex===b.firstIndex){g(this._ranges[c],b),this._removeRanges(c+1,h-c);break}f=b}h>=i&&(g(this._ranges[c],this._ranges[i-1]),this._removeRanges(c+1,i-c-1))}},_remove:function(a){function b(a){return c._getListBinding().fromIndex(a).retain()}for(var c=this,d=[],e=0,f=this._ranges.length;f>e;e++){var g=this._ranges[e];g.lastIndex<a.firstIndex||g.firstIndex>a.lastIndex?d.push(g):g.firstIndex<a.firstIndex&&g.lastIndex>=a.firstIndex&&g.lastIndex<=a.lastIndex?(d.push({firstIndex:g.firstIndex,firstKey:g.firstKey,firstPromise:g.firstPromise,lastIndex:a.firstIndex-1,lastPromise:b(a.firstIndex-1)}),g.lastPromise.release()):g.lastIndex>a.lastIndex&&g.firstIndex>=a.firstIndex&&g.firstIndex<=a.lastIndex?(d.push({firstIndex:a.lastIndex+1,firstPromise:b(a.lastIndex+1),lastIndex:g.lastIndex,lastKey:g.lastKey,lastPromise:g.lastPromise}),g.firstPromise.release()):g.firstIndex<a.firstIndex&&g.lastIndex>a.lastIndex?(d.push({firstIndex:g.firstIndex,firstKey:g.firstKey,firstPromise:g.firstPromise,lastIndex:a.firstIndex-1,lastPromise:b(a.firstIndex-1)}),d.push({firstIndex:a.lastIndex+1,firstPromise:b(a.lastIndex+1),lastIndex:g.lastIndex,lastKey:g.lastKey,lastPromise:g.lastPromise})):(g.firstPromise.release(),g.lastPromise.release())}this._ranges=d},_ensureKeys:function(){for(var a=[d.wrap()],b=this,c=function(a,b){var c=a+"Key";if(b[c])return d.wrap();var e=b[a+"Promise"];return e.then(function(a){a&&(b[c]=a.key)}),e},e=0,f=this._ranges.length;f>e;e++){var g=this._ranges[e];a.push(c("first",g)),a.push(c("last",g))}return d.join(a).then(function(){b._ranges=b._ranges.filter(function(a){return a.firstKey&&a.lastKey})}),d.join(a)},_mergeRanges:function(a,b){a.lastIndex=b.lastIndex,a.lastKey=b.lastKey},_isIncluded:function(a){if(this.isEverything())return!0;for(var b=0,c=this._ranges.length;c>b;b++){var d=this._ranges[b];if(d.firstIndex<=a&&a<=d.lastIndex)return!0}return!1},_ensureCount:function(){var a=this;return this._listView._itemsCount().then(function(b){a._itemsCount=b})},_insertRange:function(a,b){this._retainRange(b),this._ranges.splice(a,0,b)},_removeRanges:function(a,b){for(var c=0;b>c;c++)this._releaseRange(this._ranges[a+c]);this._ranges.splice(a,b)},_retainRange:function(a){a.firstPromise||(a.firstPromise=this._getListBinding().fromIndex(a.firstIndex).retain()),a.lastPromise||(a.lastPromise=this._getListBinding().fromIndex(a.lastIndex).retain())},_retainRanges:function(){for(var a=0,b=this._ranges.length;b>a;a++)this._retainRange(this._ranges[a])},_releaseRange:function(a){a.firstPromise.release(),a.lastPromise.release()},_releaseRanges:function(a){for(var b=0,c=a.length;c>b;++b)this._releaseRange(a[b])},_getListBinding:function(){return this._listView._itemsManager._listBinding}},{supportedForProcessing:!1})}),_SelectionManager:c.Namespace._lazy(function(){var c=function(b){this._listView=b,this._selected=new a._Selection(this._listView),this._pivot=g._INVALID_INDEX,this._focused={type:f.ObjectType.item,index:0},this._pendingChange=d.wrap()};return c.prototype={count:function(){return this._selected.count()},getIndices:function(){return this._selected.getIndices()},getItems:function(){return this._selected.getItems()},getRanges:function(){return this._selected.getRanges()},isEverything:function(){return this._selected.isEverything()},set:function(b){var c=this,f=new e;return this._synchronize(f).then(function(){var e=new a._Selection(c._listView);return e.set(b).then(function(){c._set(e),f.complete()},function(a){return e.clear(),f.complete(),d.wrapError(a)})})},clear:function(){var b=this,c=new e;return this._synchronize(c).then(function(){var e=new a._Selection(b._listView);return e.clear().then(function(){b._set(e),c.complete()},function(a){return e.clear(),c.complete(),d.wrapError(a)})})},add:function(a){var b=this,c=new e;return this._synchronize(c).then(function(){var e=b._cloneSelection();return e.add(a).then(function(){b._set(e),c.complete()},function(a){return e.clear(),c.complete(),d.wrapError(a)})})},remove:function(a){var b=this,c=new e;return this._synchronize(c).then(function(){var e=b._cloneSelection();return e.remove(a).then(function(){b._set(e),c.complete()},function(a){return e.clear(),c.complete(),d.wrapError(a)})})},selectAll:function(){var b=this,c=new e;return this._synchronize(c).then(function(){var e=new a._Selection(b._listView);return e.selectAll().then(function(){b._set(e),c.complete()},function(a){return e.clear(),c.complete(),d.wrapError(a)})})},_synchronize:function(a){var b=this;return this._listView._versionManager.unlocked.then(function(){var c=b._pendingChange;return b._pendingChange=d.join([c,a.promise]).then(function(){}),c})},_reset:function(){this._pivot=g._INVALID_INDEX,this._setFocused({type:f.ObjectType.item,index:0},this._keyboardFocused()),this._pendingChange.cancel(),this._pendingChange=d.wrap(),this._selected.clear(),this._selected=new a._Selection(this._listView)},_dispose:function(){this._selected.clear(),this._selected=null,this._listView=null},_set:function(a){var b=this;return this._fireSelectionChanging(a).then(function(c){return c?(b._selected.clear(),b._selected=a,b._listView._updateSelection(),b._fireSelectionChanged()):a.clear(),c})},_fireSelectionChanging:function(a){var c=b.document.createEvent("CustomEvent"),e=d.wrap();c.initCustomEvent("selectionchanging",!0,!0,{newSelection:a,preventTapBehavior:function(){},setPromise:function(a){e=a}});var f=this._listView._element.dispatchEvent(c);return e.then(function(){return f})},_fireSelectionChanged:function(){var a=b.document.createEvent("CustomEvent");a.initCustomEvent("selectionchanged",!0,!1,null),this._listView._element.dispatchEvent(a)},_getFocused:function(){return{type:this._focused.type,index:this._focused.index}},_setFocused:function(a,b){this._focused={type:a.type,index:a.index},this._focusedByKeyboard=b},_keyboardFocused:function(){return this._focusedByKeyboard},_updateCount:function(a){this._selected._itemsCount=a},_isIncluded:function(a){return this._selected._isIncluded(a)},_cloneSelection:function(){var b=new a._Selection(this._listView);
-return b._ranges=this._selected.getRanges(),b._itemsCount=this._selected._itemsCount,b._retainRanges(),b}},c.supportedForProcessing=!1,c})})}),d("WinJS/Controls/ListView/_BrowseMode",["exports","../../Core/_Global","../../Core/_Base","../../Core/_BaseUtils","../../Animations","../../Promise","../../Utilities/_ElementUtilities","../../Utilities/_UI","../ItemContainer/_Constants","../ItemContainer/_ItemEventsHandler","./_SelectionManager"],function(a,b,c,d,e,f,g,h,i,j,k){"use strict";var l=d._browserStyleEquivalents.transform.scriptName;c.Namespace._moduleDefine(a,"WinJS.UI",{_SelectionMode:c.Namespace._lazy(function(){function a(a,b,c){return Math.max(a,Math.min(b,c))}function e(a,c,d){var e=b.document.createEvent("CustomEvent");return e.initCustomEvent("keyboardnavigating",!0,!0,{oldFocus:c.index,oldFocusType:c.type,newFocus:d.index,newFocusType:d.type}),a.dispatchEvent(e)}var m=c.Class.define(function(a){this.inboundFocusHandled=!1,this._pressedContainer=null,this._pressedItemBox=null,this._pressedHeader=null,this._pressedEntity={type:h.ObjectType.item,index:i._INVALID_INDEX},this._pressedPosition=null,this.initialize(a)},{_dispose:function(){this._itemEventsHandler&&this._itemEventsHandler.dispose(),this._setNewFocusItemOffsetPromise&&this._setNewFocusItemOffsetPromise.cancel()},initialize:function(a){function b(b,c){var d=function(c){return a._view.getAdjacent(c,b)};return d.clampToBounds=c,d}this.site=a,this._keyboardNavigationHandlers={},this._keyboardAcceleratorHandlers={};var c=this.site,d=this;this._itemEventsHandler=new j._ItemEventsHandler(Object.create({containerFromElement:function(a){return c._view.items.containerFrom(a)},indexForItemElement:function(a){return c._view.items.index(a)},indexForHeaderElement:function(a){return c._groups.index(a)},itemBoxAtIndex:function(a){return c._view.items.itemBoxAt(a)},itemAtIndex:function(a){return c._view.items.itemAt(a)},headerAtIndex:function(a){return c._groups.group(a).header},headerFromElement:function(a){return c._groups.headerFrom(a)},containerAtIndex:function(a){return c._view.items.containerAt(a)},isZombie:function(){return c._isZombie()},getItemPosition:function(a){return c._getItemPosition(a)},rtl:function(){return c._rtl()},fireInvokeEvent:function(a,b){return d._fireInvokeEvent(a,b)},verifySelectionAllowed:function(a){return d._verifySelectionAllowed(a)},changeFocus:function(a,b,d,e,f){return c._changeFocus(a,b,d,e,f)},selectRange:function(a,b,c){return d._selectRange(a,b,c)}},{pressedEntity:{enumerable:!0,get:function(){return d._pressedEntity},set:function(a){d._pressedEntity=a}},pressedContainerScaleTransform:{enumerable:!0,get:function(){return d._pressedContainerScaleTransform},set:function(a){d._pressedContainerScaleTransform=a}},pressedContainer:{enumerable:!0,get:function(){return d._pressedContainer},set:function(a){d._pressedContainer=a}},pressedItemBox:{enumerable:!0,get:function(){return d._pressedItemBox},set:function(a){d._pressedItemBox=a}},pressedHeader:{enumerable:!0,get:function(){return d._pressedHeader},set:function(a){return d._pressedHeader=a}},pressedPosition:{enumerable:!0,get:function(){return d._pressedPosition},set:function(a){d._pressedPosition=a}},pressedElement:{enumerable:!0,set:function(a){d._pressedElement=a}},eventHandlerRoot:{enumerable:!0,get:function(){return c._viewport}},selectionMode:{enumerable:!0,get:function(){return c._selectionMode}},accessibleItemClass:{enumerable:!0,get:function(){return i._itemClass}},canvasProxy:{enumerable:!0,get:function(){return c._canvasProxy}},tapBehavior:{enumerable:!0,get:function(){return c._tap}},headerTapBehavior:{enumerable:!0,get:function(){return c._groupHeaderTap}},draggable:{enumerable:!0,get:function(){return c.itemsDraggable||c.itemsReorderable}},selection:{enumerable:!0,get:function(){return c._selection}},customFootprintParent:{enumerable:!0,get:function(){return null}}}));var e=g.Key;this._keyboardNavigationHandlers[e.upArrow]=b(e.upArrow),this._keyboardNavigationHandlers[e.downArrow]=b(e.downArrow),this._keyboardNavigationHandlers[e.leftArrow]=b(e.leftArrow),this._keyboardNavigationHandlers[e.rightArrow]=b(e.rightArrow),this._keyboardNavigationHandlers[e.pageUp]=b(e.pageUp,!0),this._keyboardNavigationHandlers[e.pageDown]=b(e.pageDown,!0),this._keyboardNavigationHandlers[e.home]=function(a){return!d.site._header||a.type!==h.ObjectType.groupHeader&&a.type!==h.ObjectType.footer?f.wrap({type:a.type!==h.ObjectType.footer?a.type:h.ObjectType.groupHeader,index:0}):f.wrap({type:h.ObjectType.header,index:0})},this._keyboardNavigationHandlers[e.end]=function(a){if(!d.site._footer||a.type!==h.ObjectType.groupHeader&&a.type!==h.ObjectType.header){if(a.type===h.ObjectType.groupHeader||a.type===h.ObjectType.header)return f.wrap({type:h.ObjectType.groupHeader,index:c._groups.length()-1});var b=d.site._view.lastItemIndex();return b>=0?f.wrap({type:a.type,index:b}):f.cancel}return f.wrap({type:h.ObjectType.footer,index:0})},this._keyboardAcceleratorHandlers[e.a]=function(){d.site._multiSelection()&&d._selectAll()}},staticMode:function(){return this.site._tap===h.TapBehavior.none&&this.site._selectionMode===h.SelectionMode.none},itemUnrealized:function(a,b){if(this._pressedEntity.type!==h.ObjectType.groupHeader&&(this._pressedEntity.index===a&&this._resetPointerDownState(),this._itemBeingDragged(a)))for(var c=this._draggedItemBoxes.length-1;c>=0;c--)this._draggedItemBoxes[c]===b&&(g.removeClass(b,i._dragSourceClass),this._draggedItemBoxes.splice(c,1))},_fireInvokeEvent:function(a,c){function d(d,f){var g=d.createListBinding(),h=g.fromIndex(a.index),i=f?"groupheaderinvoked":"iteminvoked";h.done(function(){g.release()});var j=b.document.createEvent("CustomEvent");j.initCustomEvent(i,!0,!0,f?{groupHeaderPromise:h,groupHeaderIndex:a.index}:{itemPromise:h,itemIndex:a.index}),c.dispatchEvent(j)&&e.site._defaultInvoke(a)}if(c){var e=this;a.type===h.ObjectType.groupHeader?this.site._groupHeaderTap===h.GroupHeaderTapBehavior.invoke&&a.index!==i._INVALID_INDEX&&d(this.site.groupDataSource,!0):this.site._tap===h.TapBehavior.none||a.index===i._INVALID_INDEX||this.site._isInSelectionMode()||d(this.site.itemDataSource,!1)}},_verifySelectionAllowed:function(a){if(a.type===h.ObjectType.groupHeader)return{canSelect:!1,canTapSelect:!1};var c=a.index,d=this.site,e=this.site._view.items.itemAt(c);if(!d._selectionAllowed()||!d._selectOnTap()||e&&g.hasClass(e,i._nonSelectableClass))return{canSelect:!1,canTapSelect:!1};var j=d._selection._isIncluded(c),k=!d._multiSelection(),l=d._selection._cloneSelection();j?k?l.clear():l.remove(c):k?l.set(c):l.add(c);var m,n=b.document.createEvent("CustomEvent"),o=f.wrap(),p=!1,q=!1;n.initCustomEvent("selectionchanging",!0,!0,{newSelection:l,preventTapBehavior:function(){q=!0},setPromise:function(a){o=a}});var r=d._element.dispatchEvent(n);o.then(function(){p=!0,m=l._isIncluded(c),l.clear()});var s=r&&p&&(j||m);return{canSelect:s,canTapSelect:s&&!q}},_containedInElementWithClass:function(a,b){if(a.parentNode)for(var c=a.parentNode.querySelectorAll("."+b+", ."+b+" *"),d=0,e=c.length;e>d;d++)if(c[d]===a)return!0;return!1},_isDraggable:function(a){return!this._containedInElementWithClass(a,i._nonDraggableClass)},_isInteractive:function(a){return this._containedInElementWithClass(a,"win-interactive")},_resetPointerDownState:function(){this._itemEventsHandler.resetPointerDownState()},onPointerDown:function(a){this._itemEventsHandler.onPointerDown(a)},onclick:function(a){this._itemEventsHandler.onClick(a)},onPointerUp:function(a){this._itemEventsHandler.onPointerUp(a)},onPointerCancel:function(a){this._itemEventsHandler.onPointerCancel(a)},onLostPointerCapture:function(a){this._itemEventsHandler.onLostPointerCapture(a)},onContextMenu:function(a){this._itemEventsHandler.onContextMenu(a)},onMSHoldVisual:function(a){this._itemEventsHandler.onMSHoldVisual(a)},onDataChanged:function(a){this._itemEventsHandler.onDataChanged(a)},_removeTransform:function(a,b){b&&-1!==a.style[l].indexOf(b)&&(a.style[l]=a.style[l].replace(b,""))},_selectAll:function(){var a=[];this.site._view.items.each(function(b,c){c&&g.hasClass(c,i._nonSelectableClass)&&a.push(b)}),this.site._selection.selectAll(),a.length>0&&this.site._selection.remove(a)},_selectRange:function(a,b,c){for(var d=[],e=-1,f=a;b>=f;f++){var h=this.site._view.items.itemAt(f);h&&g.hasClass(h,i._nonSelectableClass)?-1!==e&&(d.push({firstIndex:e,lastIndex:f-1}),e=-1):-1===e&&(e=f)}-1!==e&&d.push({firstIndex:e,lastIndex:b}),d.length>0&&this.site._selection[c?"add":"set"](d)},onDragStart:function(a){if(this._pressedEntity={type:h.ObjectType.item,index:this.site._view.items.index(a.target)},this.site._selection._pivot=i._INVALID_INDEX,this._pressedEntity.index===i._INVALID_INDEX||!this.site.itemsDraggable&&!this.site.itemsReorderable||this.site._view.animating||!this._isDraggable(a.target)||this._pressedElement&&this._isInteractive(this._pressedElement))a.preventDefault();else{this._dragging=!0,this._dragDataTransfer=a.dataTransfer,this._pressedPosition=g._getCursorPos(a),this._dragInfo=null,this._lastEnteredElement=a.target,this.site._selection._isIncluded(this._pressedEntity.index)?this._dragInfo=this.site.selection:(this._draggingUnselectedItem=!0,this._dragInfo=new k._Selection(this.site,[{firstIndex:this._pressedEntity.index,lastIndex:this._pressedEntity.index}]));var c=this.site.itemsReorderable,e=b.document.createEvent("CustomEvent");if(e.initCustomEvent("itemdragstart",!0,!1,{dataTransfer:a.dataTransfer,dragInfo:this._dragInfo}),a.dataTransfer.setData("text",""),a.dataTransfer.setDragImage){var f=this.site._view.items.itemDataAt(this._pressedEntity.index);if(f&&f.container){var j=f.container.getBoundingClientRect();a.dataTransfer.setDragImage(f.container,a.clientX-j.left,a.clientY-j.top)}}this.site.element.dispatchEvent(e),this.site.itemsDraggable&&!this.site.itemsReorderable&&(this._firedDragEnter||this._fireDragEnterEvent(a.dataTransfer)&&(c=!0,this._dragUnderstood=!0)),c&&(this._addedDragOverClass=!0,g.addClass(this.site._element,i._dragOverClass)),this._draggedItemBoxes=[];var l=this,m=a.target;m.addEventListener("dragend",function n(a){m.removeEventListener("dragend",n),l.onDragEnd(a)}),d._yieldForDomModification(function(){if(l._dragging)for(var a=l._dragInfo.getIndices(),b=0,c=a.length;c>b;b++){var d=l.site._view.items.itemDataAt(a[b]);d&&d.itemBox&&l._addDragSourceClass(d.itemBox)}})}},onDragEnter:function(a){var c=this._dragUnderstood;this._lastEnteredElement=a.target,this._exitEventTimer&&(b.clearTimeout(this._exitEventTimer),this._exitEventTimer=0),this._firedDragEnter||this._fireDragEnterEvent(a.dataTransfer)&&(c=!0),(c||this._dragging&&this.site.itemsReorderable)&&(a.preventDefault(),this._dragUnderstood=!0,this._addedDragOverClass||(this._addedDragOverClass=!0,g.addClass(this.site._element,i._dragOverClass))),this._pointerLeftRegion=!1},onDragLeave:function(a){a.target===this._lastEnteredElement&&(this._pointerLeftRegion=!0,this._handleExitEvent())},fireDragUpdateEvent:function(){var a=b.document.createEvent("CustomEvent");a.initCustomEvent("itemdragchanged",!0,!1,{dataTransfer:this._dragDataTransfer,dragInfo:this._dragInfo}),this.site.element.dispatchEvent(a)},_fireDragEnterEvent:function(a){var c=b.document.createEvent("CustomEvent");c.initCustomEvent("itemdragenter",!0,!0,{dataTransfer:a});var d=!this.site.element.dispatchEvent(c);return this._firedDragEnter=!0,d},_fireDragBetweenEvent:function(a,c,d){var e=b.document.createEvent("CustomEvent");return e.initCustomEvent("itemdragbetween",!0,!0,{index:a,insertAfterIndex:c,dataTransfer:d}),this.site.element.dispatchEvent(e)},_fireDropEvent:function(a,c,d){var e=b.document.createEvent("CustomEvent");return e.initCustomEvent("itemdragdrop",!0,!0,{index:a,insertAfterIndex:c,dataTransfer:d}),this.site.element.dispatchEvent(e)},_handleExitEvent:function(){this._exitEventTimer&&(b.clearTimeout(this._exitEventTimer),this._exitEventTimer=0);var a=this;this._exitEventTimer=b.setTimeout(function(){if(!a.site._disposed&&a._pointerLeftRegion){if(a.site._layout.dragLeave&&a.site._layout.dragLeave(),a._pointerLeftRegion=!1,a._dragUnderstood=!1,a._lastEnteredElement=null,a._lastInsertPoint=null,a._dragBetweenDisabled=!1,a._firedDragEnter){var c=b.document.createEvent("CustomEvent");c.initCustomEvent("itemdragleave",!0,!1,{}),a.site.element.dispatchEvent(c),a._firedDragEnter=!1}a._addedDragOverClass&&(a._addedDragOverClass=!1,g.removeClass(a.site._element,i._dragOverClass)),a._exitEventTimer=0,a._stopAutoScroll()}},40)},_getEventPositionInElementSpace:function(a,b){var c={left:0,top:0};try{c=a.getBoundingClientRect()}catch(d){}var e=g._getComputedStyle(a,null),f=parseInt(e.paddingLeft),h=parseInt(e.paddingTop),i=parseInt(e.borderLeftWidth),j=parseInt(e.borderTopWidth),k=b.clientX,l=b.clientY,m={x:+k===k?k-c.left-f-i:0,y:+l===l?l-c.top-h-j:0};return this.site._rtl()&&(m.x=c.right-c.left-m.x),m},_getPositionInCanvasSpace:function(a){var b=this.site._horizontal()?this.site.scrollPosition:0,c=this.site._horizontal()?0:this.site.scrollPosition,d=this._getEventPositionInElementSpace(this.site.element,a);return{x:d.x+b,y:d.y+c}},_itemBeingDragged:function(a){return this._dragging?this._draggingUnselectedItem&&this._dragInfo._isIncluded(a)||!this._draggingUnselectedItem&&this.site._isSelected(a):!1},_addDragSourceClass:function(a){this._draggedItemBoxes.push(a),g.addClass(a,i._dragSourceClass),a.parentNode&&g.addClass(a.parentNode,i._footprintClass)},renderDragSourceOnRealizedItem:function(a,b){this._itemBeingDragged(a)&&this._addDragSourceClass(b)},onDragOver:function(b){if(this._dragUnderstood){this._pointerLeftRegion=!1,b.preventDefault();var c=this._getPositionInCanvasSpace(b),d=this._getEventPositionInElementSpace(this.site.element,b);if(this._checkAutoScroll(d.x,d.y),this.site._layout.hitTest)if(this._autoScrollFrame)this._lastInsertPoint&&(this.site._layout.dragLeave(),this._lastInsertPoint=null);else{var e=this.site._view.hitTest(c.x,c.y);e.insertAfterIndex=a(-1,this.site._cachedCount-1,e.insertAfterIndex),this._lastInsertPoint&&this._lastInsertPoint.insertAfterIndex===e.insertAfterIndex&&this._lastInsertPoint.index===e.index||(this._dragBetweenDisabled=!this._fireDragBetweenEvent(e.index,e.insertAfterIndex,b.dataTransfer),this._dragBetweenDisabled?this.site._layout.dragLeave():this.site._layout.dragOver(c.x,c.y,this._dragInfo)),this._lastInsertPoint=e}}},_clearDragProperties:function(){if(this._addedDragOverClass&&(this._addedDragOverClass=!1,g.removeClass(this.site._element,i._dragOverClass)),this._draggedItemBoxes){for(var a=0,b=this._draggedItemBoxes.length;b>a;a++)g.removeClass(this._draggedItemBoxes[a],i._dragSourceClass),this._draggedItemBoxes[a].parentNode&&g.removeClass(this._draggedItemBoxes[a].parentNode,i._footprintClass);this._draggedItemBoxes=[]}this.site._layout.dragLeave(),this._dragging=!1,this._dragInfo=null,this._draggingUnselectedItem=!1,this._dragDataTransfer=null,this._lastInsertPoint=null,this._resetPointerDownState(),this._lastEnteredElement=null,this._dragBetweenDisabled=!1,this._firedDragEnter=!1,this._dragUnderstood=!1,this._stopAutoScroll()},onDragEnd:function(){var a=b.document.createEvent("CustomEvent");a.initCustomEvent("itemdragend",!0,!1,{}),this.site.element.dispatchEvent(a),this._clearDragProperties()},_findFirstAvailableInsertPoint:function(a,b,c){for(var d=a.getIndices(),e=-1,f=this.site._cachedCount,g=d.length,h=-1,i=b,j=0;g>j;j++)if(d[j]===i){e=j,h=j;break}for(;e>=0&&i>=0;)c?(i++,g>e&&d[e+1]===i&&f>i?e++:i>=f?(c=!1,i=b,e=h):e=-1):(i--,e>0&&d[e-1]===i?e--:e=-1);return i},_reorderItems:function(a,b,c,d,e){var f=this.site,g=function(a){c?f._selection.remove({key:a[0].key}):f._selection.set({firstKey:a[0].key,lastKey:a[a.length-1].key}),e&&f.ensureVisible(f._selection._getFocused())};b.getItems().then(function(b){var c=f.itemDataSource;if(-1===a){c.beginEdits();for(var e=b.length-1;e>=0;e--)c.moveToStart(b[e].key);c.endEdits(),g(b)}else{var h=c.createListBinding();h.fromIndex(a).then(function(a){if(h.release(),c.beginEdits(),d)for(var e=0,f=b.length;f>e;e++)c.moveBefore(b[e].key,a.key);else for(var e=b.length-1;e>=0;e--)c.moveAfter(b[e].key,a.key);c.endEdits(),g(b)})}})},onDrop:function(b){if(this._draggedItemBoxes)for(var c=0,d=this._draggedItemBoxes.length;d>c;c++)this._draggedItemBoxes[c].parentNode&&g.removeClass(this._draggedItemBoxes[c].parentNode,i._footprintClass);if(!this._dragBetweenDisabled){var e=this._getPositionInCanvasSpace(b),f=this.site._view.hitTest(e.x,e.y),h=a(-1,this.site._cachedCount-1,f.insertAfterIndex),j=!0;if(this._lastInsertPoint&&this._lastInsertPoint.insertAfterIndex===h&&this._lastInsertPoint.index===f.index||(j=this._fireDragBetweenEvent(f.index,h,b.dataTransfer)),j&&(this._lastInsertPoint=null,this.site._layout.dragLeave(),this._fireDropEvent(f.index,h,b.dataTransfer)&&this._dragging&&this.site.itemsReorderable)){if(this._dragInfo.isEverything()||this.site._groupsEnabled())return;h=this._findFirstAvailableInsertPoint(this._dragInfo,h,!1),this._reorderItems(h,this._dragInfo,this._draggingUnselectedItem)}}this._clearDragProperties(),b.preventDefault()},_checkAutoScroll:function(a,c){var e=this.site._getViewportLength(),f=this.site._horizontal(),h=f?a:c,j=this.site._viewport[f?"scrollWidth":"scrollHeight"],k=Math.floor(this.site.scrollPosition),l=0;if(h<i._AUTOSCROLL_THRESHOLD?l=h-i._AUTOSCROLL_THRESHOLD:h>e-i._AUTOSCROLL_THRESHOLD&&(l=h-(e-i._AUTOSCROLL_THRESHOLD)),l=Math.round(l/i._AUTOSCROLL_THRESHOLD*(i._MAX_AUTOSCROLL_RATE-i._MIN_AUTOSCROLL_RATE)),(0===k&&0>l||k>=j-e&&l>0)&&(l=0),0===l)this._autoScrollDelay&&(b.clearTimeout(this._autoScrollDelay),this._autoScrollDelay=0);else if(!this._autoScrollDelay&&!this._autoScrollFrame){var m=this;this._autoScrollDelay=b.setTimeout(function(){if(m._autoScrollRate){m._lastDragTimeout=d._now();var a=function(){if(!m._autoScrollRate&&m._autoScrollFrame||m.site._disposed)m._stopAutoScroll();else{var b=d._now(),c=m._autoScrollRate*((b-m._lastDragTimeout)/1e3);c=0>c?Math.min(-1,c):Math.max(1,c);var e={};e[m.site._scrollProperty]=m.site._viewportScrollPosition+c,g.setScrollPosition(m.site._viewport,e),m._lastDragTimeout=b,m._autoScrollFrame=d._requestAnimationFrame(a)}};m._autoScrollFrame=d._requestAnimationFrame(a)}},i._AUTOSCROLL_DELAY)}this._autoScrollRate=l},_stopAutoScroll:function(){this._autoScrollDelay&&(b.clearTimeout(this._autoScrollDelay),this._autoScrollDelay=0),this._autoScrollRate=0,this._autoScrollFrame=0},onKeyDown:function(a){function b(a,b,g){function k(j){var k=!0,m=!1;if(g?a.index=Math.max(0,Math.min(j,a.index)):(a.index<0||a.index>j)&&(m=!0),!m&&(l.index!==a.index||l.type!==a.type)){var o=e(d._element,l,a);o&&(k=!1,c._setNewFocusItemOffsetPromise&&c._setNewFocusItemOffsetPromise.cancel(),d._batchViewUpdates(i._ViewChange.realize,i._ScrollToPriority.high,function(){return c._setNewFocusItemOffsetPromise=d._getItemOffset(l,!0).then(function(e){e=d._convertFromCanvasCoordinates(e);var g=e.end<=d.scrollPosition||e.begin>=d.scrollPosition+d._getViewportLength()-1;return c._setNewFocusItemOffsetPromise=d._getItemOffset(a).then(function(e){c._setNewFocusItemOffsetPromise=null;var h={position:d.scrollPosition,direction:"right"};return g&&(d._selection._setFocused(a,!0),e=d._convertFromCanvasCoordinates(e),a.index>l.index?(h.direction="right",h.position=e.end-d._getViewportLength()):(h.direction="left",h.position=e.begin)),d._changeFocus(a,b,n,g,!0),g?h:f.cancel},function(c){return d._changeFocus(a,b,n,!0,!0),f.wrapError(c)}),c._setNewFocusItemOffsetPromise},function(c){return d._changeFocus(a,b,n,!0,!0),f.wrapError(c)}),c._setNewFocusItemOffsetPromise},!0))}return k&&(d._selection._setFocused(l,!0),d.ensureVisible(l)),m?{type:h.ObjectType.item,index:i._INVALID_INDEX}:a}return a.type===h.ObjectType.item?f.wrap(j.lastItemIndex()).then(k):a.type===h.ObjectType.groupHeader?f.wrap(d._groups.length()-1).then(k):f.wrap(0).then(k)}var c=this,d=this.site,j=d._view,l=d._selection._getFocused(),m=!0,n=a.ctrlKey,o=g.Key,p=a.keyCode,q=d._rtl();if(!this._isInteractive(a.target)){if(a.ctrlKey&&!a.altKey&&!a.shiftKey&&this._keyboardAcceleratorHandlers[p]&&this._keyboardAcceleratorHandlers[p](),d.itemsReorderable&&!a.ctrlKey&&a.altKey&&a.shiftKey&&l.type===h.ObjectType.item&&(p===o.leftArrow||p===o.rightArrow||p===o.upArrow||p===o.downArrow)){var r=d._selection,s=l.index,t=!1,u=!0;if(!r.isEverything()){if(!r._isIncluded(s)){var v=d._view.items.itemAt(s);v&&g.hasClass(v,i._nonDraggableClass)?u=!1:(t=!0,r=new k._Selection(this.site,[{firstIndex:s,lastIndex:s}]))}if(u){var w=s;p===o.rightArrow?w+=q?-1:1:p===o.leftArrow?w+=q?1:-1:p===o.upArrow?w--:w++;var x=w>s,y=x;x&&w>=this.site._cachedCount&&(y=!1,w=this.site._cachedCount-1),w=this._findFirstAvailableInsertPoint(r,w,y),w=Math.min(Math.max(-1,w),this.site._cachedCount-1);var z=w-(x||-1===w?0:1),A=w,B=this.site._groupsEnabled();if(B){var C=this.site._groups,D=w>-1?C.groupFromItem(w):0;x?C.group(D).startIndex===w&&z--:D<C.length()-1&&w===C.group(D+1).startIndex-1&&z++}if(this._fireDragBetweenEvent(A,z,null)&&this._fireDropEvent(A,z,null)){if(B)return;this._reorderItems(w,r,t,!x,!0)}}}}else if(a.altKey)m=!1;else if(this._keyboardNavigationHandlers[p])this._keyboardNavigationHandlers[p](l).then(function(e){if(e.index!==l.index||e.type!==l.type){var f=c._keyboardNavigationHandlers[p].clampToBounds;e.type!==h.ObjectType.groupHeader&&a.shiftKey&&d._selectionAllowed()&&d._multiSelection()?(d._selection._pivot===i._INVALID_INDEX&&(d._selection._pivot=l.index),b(e,!0,f).then(function(b){if(b.index!==i._INVALID_INDEX){var e=Math.min(b.index,d._selection._pivot),f=Math.max(b.index,d._selection._pivot),g=a.ctrlKey||d._tap===h.TapBehavior.toggleSelect;c._selectRange(e,f,g)}})):(d._selection._pivot=i._INVALID_INDEX,b(e,!1,f))}else m=!1});else if(a.ctrlKey||p!==o.enter)l.type!==h.ObjectType.groupHeader&&(a.ctrlKey&&p===o.enter||p===o.space)?(this._itemEventsHandler.toggleSelectionIfAllowed(l.index),d._changeFocus(l,!0,n,!1,!0)):p===o.escape&&d._selection.count()>0?(d._selection._pivot=i._INVALID_INDEX,d._selection.clear()):m=!1;else{var E=l.type===h.ObjectType.groupHeader?d._groups.group(l.index).header:d._view.items.itemBoxAt(l.index);if(E){l.type===h.ObjectType.groupHeader?(this._pressedHeader=E,this._pressedItemBox=null,this._pressedContainer=null):(this._pressedItemBox=E,this._pressedContainer=d._view.items.containerAt(l.index),this._pressedHeader=null);var F=this._verifySelectionAllowed(l);F.canTapSelect&&this._itemEventsHandler.handleTap(l),this._fireInvokeEvent(l,E)}}this._keyDownHandled=m,m&&(a.stopPropagation(),a.preventDefault())}p===o.tab&&(this.site._keyboardFocusInbound=!0)},onKeyUp:function(a){this._keyDownHandled&&(a.stopPropagation(),a.preventDefault())},onTabEntered:function(a){if(0!==this.site._groups.length()||this.site._hasHeaderOrFooter){var b=this.site,c=b._selection._getFocused(),d=a.detail,f=!b._hasKeyboardFocus||a.target===b._viewport;if(f)if(this.inboundFocusHandled=!0,c.index=c.index===i._INVALID_INDEX?0:c.index,d||!this.site._supportsGroupHeaderKeyboarding&&!this.site._hasHeaderOrFooter){var g={type:h.ObjectType.item};c.type===h.ObjectType.groupHeader?(g.index=b._groupFocusCache.getIndexForGroup(c.index),e(b._element,c,g)?b._changeFocus(g,!0,!1,!1,!0):b._changeFocus(c,!0,!1,!1,!0)):(g.index=c.type!==h.ObjectType.item?b._groupFocusCache.getLastFocusedItemIndex():c.index,b._changeFocus(g,!0,!1,!1,!0)),a.preventDefault()}else{var g={type:h.ObjectType.groupHeader};this.site._hasHeaderOrFooter?this.site._lastFocusedElementInGroupTrack.type===h.ObjectType.groupHeader&&this.site._supportsGroupHeaderKeyboarding?(g.index=b._groups.groupFromItem(c.index),e(b._element,c,g)?b._changeFocus(g,!0,!1,!1,!0):b._changeFocus(c,!0,!1,!1,!0)):(g.type=this.site._lastFocusedElementInGroupTrack.type,g.index=0,b._changeFocus(g,!0,!1,!1,!0)):c.type!==h.ObjectType.groupHeader&&this.site._supportsGroupHeaderKeyboarding?(g.index=b._groups.groupFromItem(c.index),e(b._element,c,g)?b._changeFocus(g,!0,!1,!1,!0):b._changeFocus(c,!0,!1,!1,!0)):(g.index=c.index,b._changeFocus(g,!0,!1,!1,!0)),a.preventDefault()}}},onTabExiting:function(a){if(this.site._hasHeaderOrFooter||this.site._supportsGroupHeaderKeyboarding&&0!==this.site._groups.length()){var b=this.site,c=b._selection._getFocused(),d=a.detail;if(d){var f=null;if(c.type===h.ObjectType.item){var g=this.site._lastFocusedElementInGroupTrack.type;if(g!==h.ObjectType.header&&g!==h.ObjectType.footer&&this.site._supportsGroupHeaderKeyboarding)var f={type:h.ObjectType.groupHeader,index:b._groups.groupFromItem(c.index)};else var f={type:g===h.ObjectType.item?h.ObjectType.header:g,index:0}}f&&e(b._element,c,f)&&(b._changeFocus(f,!0,!1,!1,!0),a.preventDefault())}else if(!d&&c.type!==h.ObjectType.item){var i=0;i=c.type===h.ObjectType.groupHeader?b._groupFocusCache.getIndexForGroup(c.index):c.type===h.ObjectType.header?0:b._view.lastItemIndex();var f={type:h.ObjectType.item,index:i};e(b._element,c,f)&&(b._changeFocus(f,!0,!1,!1,!0),a.preventDefault())}}}});return m})})}),d("WinJS/Controls/ListView/_ErrorMessages",["exports","../../Core/_Base","../../Core/_Resources"],function(a,b,c){"use strict";b.Namespace._moduleDefine(a,null,{modeIsInvalid:{get:function(){return"Invalid argument: mode must be one of following values: 'none', 'single' or 'multi'."}},loadingBehaviorIsDeprecated:{get:function(){return"Invalid configuration: loadingBehavior is deprecated. The control will default this property to 'randomAccess'. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior."}},pagesToLoadIsDeprecated:{get:function(){return"Invalid configuration: pagesToLoad is deprecated. The control will not use this property. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior."}},pagesToLoadThresholdIsDeprecated:{get:function(){return"Invalid configuration: pagesToLoadThreshold is deprecated.  The control will not use this property. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior."}},automaticallyLoadPagesIsDeprecated:{get:function(){return"Invalid configuration: automaticallyLoadPages is deprecated. The control will default this property to false. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior."}},invalidTemplate:{get:function(){return"Invalid template: Templates must be created before being passed to the ListView, and must contain a valid tree of elements."}},loadMorePagesIsDeprecated:{get:function(){return"loadMorePages is deprecated. Invoking this function will not have any effect. Please refer to the 'ListView loading behaviors' SDK Sample for guidance on how to implement incremental load behavior."}},disableBackdropIsDeprecated:{get:function(){return"Invalid configuration: disableBackdrop is deprecated. Style: .win-listview .win-container.win-backdrop { background-color:transparent; } instead."}},backdropColorIsDeprecated:{get:function(){return"Invalid configuration: backdropColor is deprecated. Style: .win-listview .win-container.win-backdrop { rgba(155,155,155,0.23); } instead."}},itemInfoIsDeprecated:{get:function(){return"GridLayout.itemInfo may be altered or unavailable in future versions. Instead, use CellSpanningLayout."}},groupInfoIsDeprecated:{get:function(){return"GridLayout.groupInfo may be altered or unavailable in future versions. Instead, use CellSpanningLayout."}},resetItemIsDeprecated:{get:function(){return"resetItem may be altered or unavailable in future versions. Instead, mark the element as disposable using WinJS.Utilities.markDisposable."}},resetGroupHeaderIsDeprecated:{get:function(){return"resetGroupHeader may be altered or unavailable in future versions. Instead, mark the header element as disposable using WinJS.Utilities.markDisposable."}},maxRowsIsDeprecated:{get:function(){return"GridLayout.maxRows may be altered or unavailable in future versions. Instead, use the maximumRowsOrColumns property."}},swipeOrientationDeprecated:{get:function(){return"Invalid configuration: swipeOrientation is deprecated. The control will default this property to 'none'"}},swipeBehaviorDeprecated:{get:function(){return"Invalid configuration: swipeBehavior is deprecated. The control will default this property to 'none'"}}})}),d("WinJS/Controls/ListView/_GroupFocusCache",["exports","../../Core/_Base"],function(a,b){"use strict";b.Namespace._moduleDefine(a,"WinJS.UI",{_GroupFocusCache:b.Namespace._lazy(function(){return b.Class.define(function(a){this._listView=a,this.clear()},{updateCache:function(a,b,c){this._lastFocusedItemKey=b,this._lastFocusedItemIndex=c,c=""+c,this._itemToIndex[b]=c,this._groupToItem[a]=b},deleteItem:function(a){if(a===this._lastFocusedItemKey&&(this._lastFocusedItemKey=null,this._lastFocusedItemIndex=0),this._itemToIndex[a])for(var b=this,c=Object.keys(this._groupToItem),d=0,e=c.length;e>d;d++){var f=c[d];if(b._groupToItem[f]===a){b.deleteGroup(f);break}}},deleteGroup:function(a){var b=this._groupToItem[a];b&&delete this._itemToIndex[b],delete this._groupToItem[a]},updateItemIndex:function(a,b){a===this._lastFocusedItemKey&&(this._lastFocusedItemIndex=b),this._itemToIndex[a]&&(this._itemToIndex[a]=""+b)},getIndexForGroup:function(a){var b=this._listView._groups.group(a).key,c=this._groupToItem[b];return c&&this._itemToIndex[c]?+this._itemToIndex[c]:this._listView._groups.fromKey(b).group.startIndex},clear:function(){this._groupToItem={},this._itemToIndex={},this._lastFocusedItemIndex=0,this._lastFocusedItemKey=null},getLastFocusedItemIndex:function(){return this._lastFocusedItemIndex}})}),_UnsupportedGroupFocusCache:b.Namespace._lazy(function(){return b.Class.define(null,{updateCache:function(a,b,c){this._lastFocusedItemKey=b,this._lastFocusedItemIndex=c},deleteItem:function(a){a===this._lastFocusedItemKey&&(this._lastFocusedItemKey=null,this._lastFocusedItemIndex=0)},deleteGroup:function(){},updateItemIndex:function(a,b){a===this._lastFocusedItemKey&&(this._lastFocusedItemIndex=b)},getIndexForGroup:function(){return 0},clear:function(){this._lastFocusedItemIndex=0,this._lastFocusedItemKey=null},getLastFocusedItemIndex:function(){return this._lastFocusedItemIndex}})})})}),d("WinJS/Controls/ListView/_GroupsContainer",["exports","../../Core/_Base","../../Promise","../../Utilities/_Dispose","../../Utilities/_ElementUtilities","../../Utilities/_ItemsManager","../../Utilities/_UI","../ItemContainer/_Constants"],function(a,b,c,d,e,f,g,h){"use strict";b.Namespace._moduleDefine(a,"WinJS.UI",{_GroupsContainerBase:b.Namespace._lazy(function(){return b.Class.define(function(){},{index:function(a){var b=this.headerFrom(a);if(b)for(var c=0,d=this.groups.length;d>c;c++)if(b===this.groups[c].header)return c;return h._INVALID_INDEX},headerFrom:function(a){for(;a&&!e.hasClass(a,h._headerClass);)a=a.parentNode;return a},requestHeader:function(a){this._waitingHeaderRequests=this._waitingHeaderRequests||{},this._waitingHeaderRequests[a]||(this._waitingHeaderRequests[a]=[]);var b=this;return new c(function(c){var d=b.groups[a];d&&d.header?c(d.header):b._waitingHeaderRequests[a].push(c)})},notify:function(a,b){if(this._waitingHeaderRequests&&this._waitingHeaderRequests[a]){for(var c=this._waitingHeaderRequests[a],d=0,e=c.length;e>d;d++)c[d](b);this._waitingHeaderRequests[a]=[]}},groupFromImpl:function(a,b,c){if(a>b)return null;var d=a+Math.floor((b-a)/2),e=this.groups[d];return c(e,d)?this.groupFromImpl(a,d-1,c):b>d&&!c(this.groups[d+1],d+1)?this.groupFromImpl(d+1,b,c):d},groupFrom:function(a){if(this.groups.length>0){var b=this.groups.length-1,c=this.groups[b];return a(c,b)?this.groupFromImpl(0,this.groups.length-1,a):b}return null},groupFromItem:function(a){return this.groupFrom(function(b){return a<b.startIndex})},groupFromOffset:function(a){return this.groupFrom(function(b){return a<b.offset})},group:function(a){return this.groups[a]},length:function(){return this.groups.length},cleanUp:function(){if(this.listBinding){for(var a=0,b=this.groups.length;b>a;a++){
-var c=this.groups[a];c.userData&&this.listBinding.releaseItem(c.userData)}this.listBinding.release()}},_dispose:function(){this.cleanUp()},synchronizeGroups:function(){var a=this;return this.pendingChanges=[],this.ignoreChanges=!0,this.groupDataSource.invalidateAll().then(function(){return c.join(a.pendingChanges)}).then(function(){return a._listView._ifZombieDispose()?c.cancel:void 0}).then(function(){a.ignoreChanges=!1},function(b){return a.ignoreChanges=!1,c.wrapError(b)})},fromKey:function(a){for(var b=0,c=this.groups.length;c>b;b++){var d=this.groups[b];if(d.key===a)return{group:d,index:b}}return null},fromHandle:function(a){for(var b=0,c=this.groups.length;c>b;b++){var d=this.groups[b];if(d.handle===a)return{group:d,index:b}}return null}})}),_UnvirtualizedGroupsContainer:b.Namespace._lazy(function(){return b.Class.derive(a._GroupsContainerBase,function(a,b){this._listView=a,this.groupDataSource=b,this.groups=[],this.pendingChanges=[],this.dirty=!0;var c=this,f={beginNotifications:function(){c._listView._versionManager.beginNotifications()},endNotifications:function(){c._listView._versionManager.endNotifications(),c._listView._ifZombieDispose()||!c.ignoreChanges&&c._listView._groupsChanged&&c._listView._scheduleUpdate()},indexChanged:function(){c._listView._versionManager.receivedNotification(),c._listView._ifZombieDispose()||this.scheduleUpdate()},itemAvailable:function(){},countChanged:function(a){c._listView._versionManager.receivedNotification(),c._listView._writeProfilerMark("groupCountChanged("+a+"),info"),c._listView._ifZombieDispose()||this.scheduleUpdate()},changed:function(a){if(c._listView._versionManager.receivedNotification(),!c._listView._ifZombieDispose()){var b=c.fromKey(a.key);b&&(c._listView._writeProfilerMark("groupChanged("+b.index+"),info"),b.group.userData=a,b.group.startIndex=a.firstItemIndexHint,this.markToRemove(b.group)),this.scheduleUpdate()}},removed:function(a){if(c._listView._versionManager.receivedNotification(),c._listView._groupRemoved(a),!c._listView._ifZombieDispose()){var b=c.fromHandle(a);if(b){c._listView._writeProfilerMark("groupRemoved("+b.index+"),info"),c.groups.splice(b.index,1);var d=c.groups.indexOf(b.group,b.index);d>-1&&c.groups.splice(d,1),this.markToRemove(b.group)}this.scheduleUpdate()}},inserted:function(a,b,d){if(c._listView._versionManager.receivedNotification(),!c._listView._ifZombieDispose()){c._listView._writeProfilerMark("groupInserted,info");var e=this;a.retain().then(function(f){var g;if(g=b||d||c.groups.length?e.findIndex(b,d):0,-1!==g){var h={key:f.key,startIndex:f.firstItemIndexHint,userData:f,handle:a.handle};c.groups.splice(g,0,h)}e.scheduleUpdate()}),c.pendingChanges.push(a)}},moved:function(a,b,d){if(c._listView._versionManager.receivedNotification(),!c._listView._ifZombieDispose()){c._listView._writeProfilerMark("groupMoved,info");var e=this;a.then(function(f){var g=e.findIndex(b,d),h=c.fromKey(f.key);if(h)c.groups.splice(h.index,1),-1!==g&&(h.index<g&&g--,h.group.key=f.key,h.group.userData=f,h.group.startIndex=f.firstItemIndexHint,c.groups.splice(g,0,h.group));else if(-1!==g){var i={key:f.key,startIndex:f.firstItemIndexHint,userData:f,handle:a.handle};c.groups.splice(g,0,i),a.retain()}e.scheduleUpdate()}),c.pendingChanges.push(a)}},reload:function(){c._listView._versionManager.receivedNotification(),c._listView._ifZombieDispose()||c._listView._processReload()},markToRemove:function(a){if(a.header){var b=a.header;a.header=null,a.left=-1,a.width=-1,a.decorator=null,a.tabIndex=-1,b.tabIndex=-1,c._listView._groupsToRemove[e._uniqueID(b)]={group:a,header:b}}},scheduleUpdate:function(){c.dirty=!0,c.ignoreChanges||(c._listView._groupsChanged=!0)},findIndex:function(a,b){var d,e=-1;return a&&(d=c.fromHandle(a),d&&(e=d.index+1)),-1===e&&b&&(d=c.fromHandle(b),d&&(e=d.index)),e},removeElements:function(a){if(a.header){var b=a.header.parentNode;b&&(d.disposeSubTree(a.header),b.removeChild(a.header)),a.header=null,a.left=-1,a.width=-1}}};this.listBinding=this.groupDataSource.createListBinding(f)},{initialize:function(){this.initializePromise&&this.initializePromise.cancel(),this._listView._writeProfilerMark("GroupsContainer_initialize,StartTM");var a=this;return this.initializePromise=this.groupDataSource.getCount().then(function(b){for(var d=[],e=0;b>e;e++)d.push(a.listBinding.fromIndex(e).retain());return c.join(d)}).then(function(b){a.groups=[];for(var c=0,d=b.length;d>c;c++){var e=b[c];a.groups.push({key:e.key,startIndex:e.firstItemIndexHint,handle:e.handle,userData:e})}a._listView._writeProfilerMark("GroupsContainer_initialize groups("+b.length+"),info"),a._listView._writeProfilerMark("GroupsContainer_initialize,StopTM")},function(b){return a._listView._writeProfilerMark("GroupsContainer_initialize,StopTM"),c.wrapError(b)}),this.initializePromise},renderGroup:function(a){if(this._listView.groupHeaderTemplate){var b=this.groups[a];return c.wrap(this._listView._groupHeaderRenderer(c.wrap(b.userData))).then(f._normalizeRendererReturn)}return c.wrap(null)},setDomElement:function(a,b){this.groups[a].header=b,this.notify(a,b)},removeElements:function(){for(var a=this._listView._groupsToRemove||{},b=Object.keys(a),c=!1,e=this._listView._selection._getFocused(),f=0,h=b.length;h>f;f++){var i=a[b[f]],j=i.header,k=i.group;if(c||e.type!==g.ObjectType.groupHeader||k.userData.index!==e.index||(this._listView._unsetFocusOnItem(),c=!0),j){var l=j.parentNode;l&&(d._disposeElement(j),l.removeChild(j))}}c&&this._listView._setFocusOnItem(e),this._listView._groupsToRemove={}},resetGroups:function(){for(var a=this.groups.slice(0),b=0,c=a.length;c>b;b++){var d=a[b];this.listBinding&&d.userData&&this.listBinding.releaseItem(d.userData)}this.groups.length=0,this.dirty=!0}})}),_NoGroups:b.Namespace._lazy(function(){return b.Class.derive(a._GroupsContainerBase,function(a){this._listView=a,this.groups=[{startIndex:0}],this.dirty=!0},{synchronizeGroups:function(){return c.wrap()},addItem:function(){return c.wrap(this.groups[0])},resetGroups:function(){this.groups=[{startIndex:0}],delete this.pinnedItem,delete this.pinnedOffset,this.dirty=!0},renderGroup:function(){return c.wrap(null)},ensureFirstGroup:function(){return c.wrap(this.groups[0])},groupOf:function(){return c.wrap(this.groups[0])},removeElements:function(){}})})})}),d("WinJS/Controls/ListView/_Helpers",["exports","../../Core/_Base","../ItemContainer/_Constants"],function(a,b,c){"use strict";function d(a){return Array.prototype.slice.call(a)}function e(a,b){if("string"==typeof a)return e([a],b);var c=new Array(Math.floor(b/a.length)+1).join(a.join(""));return c+=a.slice(0,b%a.length).join("")}function f(a,b){var d,f=c._containerEvenClass,g=c._containerOddClass,h=b%2===0?[f,g]:[g,f],i=["<div class='win-container "+h[0]+" win-backdrop'></div>","<div class='win-container "+h[1]+" win-backdrop'></div>"];return d=e(i,a)}b.Namespace._moduleDefine(a,"WinJS.UI",{_nodeListToArray:d,_repeat:e,_stripedContainers:f})}),d("WinJS/Controls/ListView/_ItemsContainer",["exports","../../Core/_Base","../../Promise","../../Utilities/_ElementUtilities","../ItemContainer/_Constants"],function(a,b,c,d,e){"use strict";b.Namespace._moduleDefine(a,"WinJS.UI",{_ItemsContainer:b.Namespace._lazy(function(){var a=function(a){this.site=a,this._itemData={},this.waitingItemRequests={}};return a.prototype={requestItem:function(a){this.waitingItemRequests[a]||(this.waitingItemRequests[a]=[]);var b=this,d=new c(function(c){var d=b._itemData[a];d&&!d.detached&&d.element?c(d.element):b.waitingItemRequests[a].push(c)});return d},removeItem:function(a){delete this._itemData[a]},removeItems:function(){this._itemData={},this.waitingItemRequests={}},setItemAt:function(a,b){this._itemData[a]=b,b.detached||this.notify(a,b)},notify:function(a,b){if(this.waitingItemRequests[a]){for(var c=this.waitingItemRequests[a],d=0;d<c.length;d++)c[d](b.element);this.waitingItemRequests[a]=[]}},elementAvailable:function(a){var b=this._itemData[a];b.detached=!1,this.notify(a,b)},itemAt:function(a){var b=this._itemData[a];return b?b.element:null},itemDataAt:function(a){return this._itemData[a]},containerAt:function(a){var b=this._itemData[a];return b?b.container:null},itemBoxAt:function(a){var b=this._itemData[a];return b?b.itemBox:null},itemBoxFrom:function(a){for(;a&&!d.hasClass(a,e._itemBoxClass);)a=a.parentNode;return a},containerFrom:function(a){for(;a&&!d.hasClass(a,e._containerClass);)a=a.parentNode;return a},index:function(a){var b=this.containerFrom(a);if(b)for(var c in this._itemData)if(this._itemData[c].container===b)return parseInt(c,10);return e._INVALID_INDEX},each:function(a){for(var b in this._itemData)if(this._itemData.hasOwnProperty(b)){var c=this._itemData[b];a(parseInt(b,10),c.element,c)}},eachIndex:function(a){for(var b in this._itemData)if(a(parseInt(b,10)))break},count:function(){return Object.keys(this._itemData).length}},a})})}),d("WinJS/Controls/ListView/_Layouts",["exports","../../Core/_Global","../../Core/_Base","../../Core/_BaseUtils","../../Core/_ErrorFromName","../../Core/_Resources","../../Core/_WriteProfilerMark","../../Animations/_TransitionAnimation","../../Promise","../../Scheduler","../../_Signal","../../Utilities/_Dispose","../../Utilities/_ElementUtilities","../../Utilities/_SafeHtml","../../Utilities/_UI","../ItemContainer/_Constants","./_ErrorMessages"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){"use strict";function r(a){return"_win-dynamic-"+a+"-"+L++}function s(){var a,b,c,d=K.sheet.cssRules,e=M.length;for(a=0;e>a;a++)for(c="."+M[a]+" ",b=d.length-1;b>=0;b--)-1!==d[b].selectorText.indexOf(c)&&K.sheet.deleteRule(b);M=[]}function t(a,b,c,d){s();var e="."+p._listViewClass+" ."+a+" "+c+" { "+d+"}",f="_addDynamicCssRule:"+a+",info";b?b._writeProfilerMark(f):g("WinJS.UI.ListView:Layout"+f),K.sheet.insertRule(e,0)}function u(a){M.push(a)}function v(a,b,c){return Math.max(a,Math.min(b,c))}function w(a,b){return m.convertToPixels(a,m._getComputedStyle(a,null)[b])}function x(a,b){return w(b,"margin"+a)+w(b,"border"+a+"Width")+w(b,"padding"+a)}function y(a){return x("Top",a)+x("Bottom",a)}function z(a){return x("Left",a)+x("Right",a)}function A(a,b){if(a.items)for(var c=0,d=a.items.length;d>c;c++)b(a.items[c],c);else for(var e=0,f=0;e<a.itemsBlocks.length;e++)for(var g=a.itemsBlocks[e],c=0,d=g.items.length;d>c;c++)b(g.items[c],f++)}function B(a,b){if(0>b)return null;if(a.items)return b<a.items.length?a.items[b]:null;var c=a.itemsBlocks[0].items.length,d=Math.floor(b/c),e=b%c;return d<a.itemsBlocks.length&&e<a.itemsBlocks[d].items.length?a.itemsBlocks[d].items[e]:null}function C(a,b){for(var c,d=0,e=b.length;e>d;d++)if(b[d].itemsContainer.element===a){c=b[d].itemsContainer;break}return c}function D(a){var b,c;return a.itemsBlocks?(b=a.itemsBlocks.length,c=b>0?a.itemsBlocks[0].items.length*(b-1)+a.itemsBlocks[b-1].items.length:0):c=a.items.length,c}function E(a){if(!S){var c=b.document.createElement("div");c.style.width="500px",c.style.visibility="hidden";var d=b.document.createElement("div");d.style.cssText+="width: 500px; height: 200px; display: -webkit-flex; display: flex",n.setInnerHTMLUnsafe(d,"<div style='height: 100%; display: -webkit-flex; display: flex; flex-flow: column wrap; align-content: flex-start; -webkit-flex-flow: column wrap; -webkit-align-content: flex-start'><div style='width: 100px; height: 100px'></div><div style='width: 100px; height: 100px'></div><div style='width: 100px; height: 100px'></div></div>"),c.appendChild(d),a.viewport.insertBefore(c,a.viewport.firstChild);var e=c.offsetWidth>0,f=200;e&&(S={supportsCSSGrid:!!("-ms-grid-row"in b.document.documentElement.style),nestedFlexTooLarge:d.firstElementChild.offsetWidth>f,nestedFlexTooSmall:d.firstElementChild.offsetWidth<f}),a.readyToMeasure(),a.viewport.removeChild(c)}return S}function F(a){return i.is(a)?{realizedRangeComplete:a,layoutComplete:a}:"object"==typeof a&&a&&a.layoutComplete?a:{realizedRangeComplete:i.wrap(),layoutComplete:i.wrap()}}function G(a){return{left:w(a,"marginLeft"),right:w(a,"marginRight"),top:w(a,"marginTop"),bottom:w(a,"marginBottom")}}var H=m.Key,I=m._uniqueID,J={get itemInfoIsInvalid(){return"Invalid argument: An itemInfo function must be provided which returns an object with numeric width and height properties."},get groupInfoResultIsInvalid(){return"Invalid result: groupInfo result for cell spanning groups must include the following numeric properties: cellWidth and cellHeight."}},K=b.document.createElement("style");b.document.head.appendChild(K);var L=0,M=[],N=d._browserStyleEquivalents,O=N.transform,P=d._browserStyleEquivalents.transition.scriptName,Q=O.cssName+" cubic-bezier(0.1, 0.9, 0.2, 1) 167ms",R=12,S=null;c.Namespace._moduleDefine(a,"WinJS.UI",{Layout:c.Class.define(function(){}),_LayoutCommon:c.Namespace._lazy(function(){return c.Class.derive(a.Layout,null,{groupHeaderPosition:{enumerable:!0,get:function(){return this._groupHeaderPosition},set:function(a){this._groupHeaderPosition=a,this._invalidateLayout()}},initialize:function(a,b){a._writeProfilerMark("Layout:initialize,info"),this._inListMode||m.addClass(a.surface,p._gridLayoutClass),this._backdropColorClassName&&m.addClass(a.surface,this._backdropColorClassName),this._disableBackdropClassName&&m.addClass(a.surface,this._disableBackdropClassName),this._groups=[],this._groupMap={},this._oldGroupHeaderPosition=null,this._usingStructuralNodes=!1,this._site=a,this._groupsEnabled=b,this._resetAnimationCaches(!0)},orientation:{enumerable:!0,get:function(){return this._orientation},set:function(a){this._orientation=a,this._horizontal="horizontal"===a,this._invalidateLayout()}},uninitialize:function(){function a(a){var b,c=a.length;for(b=0;c>b;b++)a[b].cleanUp(!0)}var b="Layout:uninitialize,info";this._elementsToMeasure={},this._site?(this._site._writeProfilerMark(b),m.removeClass(this._site.surface,p._gridLayoutClass),m.removeClass(this._site.surface,p._headerPositionTopClass),m.removeClass(this._site.surface,p._headerPositionLeftClass),m.removeClass(this._site.surface,p._structuralNodesClass),m.removeClass(this._site.surface,p._singleItemsBlockClass),m.removeClass(this._site.surface,p._noCSSGrid),this._site.surface.style.cssText="",this._groups&&(a(this._groups),this._groups=null,this._groupMap=null),this._layoutPromise&&(this._layoutPromise.cancel(),this._layoutPromise=null),this._resetMeasurements(),this._oldGroupHeaderPosition=null,this._usingStructuralNodes=!1,this._envInfo=null,this._backdropColorClassName&&(m.removeClass(this._site.surface,this._backdropColorClassName),u(this._backdropColorClassName),this._backdropColorClassName=null),this._disableBackdropClassName&&(m.removeClass(this._site.surface,this._disableBackdropClassName),u(this._disableBackdropClassName),this._disableBackdropClassName=null),this._site=null,this._groupsEnabled=null,this._animationsRunning&&this._animationsRunning.cancel(),this._animatingItemsBlocks={}):g("WinJS.UI.ListView:"+b)},numberOfItemsPerItemsBlock:{get:function(){function b(){var a,b=c._site.groupCount;for(a=0;b>a;a++)if(c._isCellSpanning(a))return!1;return!0}var c=this;return c._measureItem(0).then(function(){return c._sizes.viewportContentSize!==c._getViewportCrossSize()&&c._viewportSizeChanged(c._getViewportCrossSize()),b()?c._envInfo.nestedFlexTooLarge||c._envInfo.nestedFlexTooSmall?(c._usingStructuralNodes=!0,Number.MAX_VALUE):(c._usingStructuralNodes=a._LayoutCommon._barsPerItemsBlock>0,a._LayoutCommon._barsPerItemsBlock*c._itemsPerBar):(c._usingStructuralNodes=!1,null)})}},layout:function(a,b,c,d){function e(a){function b(a){if(l._usingStructuralNodes){var b=[];return a.itemsBlocks.forEach(function(a){b=b.concat(a.items.slice(0))}),b}return a.items.slice(0)}return{element:a.element,items:b(a)}}function f(){function c(a,b){var c=a.enableCellSpanning?T.CellSpanningGroup:T.UniformGroup;return new c(l,b)}var d,f=l._groups.length>0?l._getRealizationRange():null,g=[],h=[],j={},k={},m=0,n=a.length;for(d=0;n>d;d++){var o=null,p=l._getGroupInfo(d),q=l._site.groupFromIndex(d).key,r=l._groupMap[q],s=r instanceof T.CellSpanningGroup,t=p.enableCellSpanning;if(r)if(s!==t)j[q]=!0;else{var u=Math.max(0,b.firstIndex-r.startIndex),v=l._rangeForGroup(r,f);v&&u<=v.lastIndex&&(o={firstIndex:Math.max(u,v.firstIndex),lastIndex:v.lastIndex})}var w,x=c(p,a[d].itemsContainer.element);w=x.prepareLayoutWithCopyOfTree?x.prepareLayoutWithCopyOfTree(e(a[d].itemsContainer),o,r,{groupInfo:p,startIndex:m}):x.prepareLayout(D(a[d].itemsContainer),o,r,{groupInfo:p,startIndex:m}),h.push(w),m+=x.count,g.push(x),k[q]=x}return i.join(h).then(function(){for(var a=0,b=0,c=g.length;c>b;b++){var d=g[b];d.offset=a,a+=l._getGroupSize(d)}Object.keys(l._groupMap).forEach(function(a){var b=!j[a];l._groupMap[a].cleanUp(b)}),l._groups=g,l._groupMap=k})}function g(a,c,d){var e,f=l._groups[a],g=Math.max(0,b.firstIndex-f.startIndex),h=l._rangeForGroup(f,c);return d?void f.layoutRealizedRange(g,h):(h||(e=f.startIndex+f.count-1<c.firstIndex),f.layoutUnrealizedRange(g,h,e))}function h(){if(0!==l._groups.length){var c,d=l._getRealizationRange(),e=a.length,f=n.groupIndexFromItemIndex(b.firstIndex);for(c=f;e>c;c++)g(c,d,!0),l._layoutGroup(c)}}function j(){if(0===l._groups.length)return i.wrap();var a=l._getRealizationRange(),c=n.groupIndexFromItemIndex(a.firstIndex-1),d=n.groupIndexFromItemIndex(a.lastIndex+1),e=n.groupIndexFromItemIndex(b.firstIndex),f=[],h=l._groups.length,j=!1,k=c,m=Math.max(e,d);for(m=Math.max(k+1,m);!j;)j=!0,k>=e&&(f.push(g(k,a,!1)),j=!1,k--),h>m&&(f.push(g(m,a,!1)),j=!1,m++);return i.join(f)}var k,l=this,n=l._site,o="Layout.layout",q=o+":realizedRange";return l._site._writeProfilerMark(o+",StartTM"),l._site._writeProfilerMark(q+",StartTM"),k=l._measureItem(0).then(function(){return m[l._usingStructuralNodes?"addClass":"removeClass"](l._site.surface,p._structuralNodesClass),m[l._envInfo.nestedFlexTooLarge||l._envInfo.nestedFlexTooSmall?"addClass":"removeClass"](l._site.surface,p._singleItemsBlockClass),l._sizes.viewportContentSize!==l._getViewportCrossSize()&&l._viewportSizeChanged(l._getViewportCrossSize()),l._cacheRemovedElements(c,l._cachedItemRecords,l._cachedInsertedItemRecords,l._cachedRemovedItems,!1),l._cacheRemovedElements(d,l._cachedHeaderRecords,l._cachedInsertedHeaderRecords,l._cachedRemovedHeaders,!0),f()}).then(function(){l._syncDomWithGroupHeaderPosition(a);var b=0;if(l._groups.length>0){var e=l._groups[l._groups.length-1];b=e.offset+l._getGroupSize(e)}l._horizontal?(l._groupsEnabled&&l._groupHeaderPosition===U.left?n.surface.style.cssText+=";height:"+l._sizes.surfaceContentSize+"px;-ms-grid-columns: ("+l._sizes.headerContainerWidth+"px auto)["+a.length+"]":n.surface.style.height=l._sizes.surfaceContentSize+"px",(l._envInfo.nestedFlexTooLarge||l._envInfo.nestedFlexTooSmall)&&(n.surface.style.width=b+"px")):(l._groupsEnabled&&l._groupHeaderPosition===U.top?n.surface.style.cssText+=";width:"+l._sizes.surfaceContentSize+"px;-ms-grid-rows: ("+l._sizes.headerContainerHeight+"px auto)["+a.length+"]":n.surface.style.width=l._sizes.surfaceContentSize+"px",(l._envInfo.nestedFlexTooLarge||l._envInfo.nestedFlexTooSmall)&&(n.surface.style.height=b+"px")),h(),l._layoutAnimations(c,d),l._site._writeProfilerMark(q+":complete,info"),l._site._writeProfilerMark(q+",StopTM")},function(a){return l._site._writeProfilerMark(q+":canceled,info"),l._site._writeProfilerMark(q+",StopTM"),i.wrapError(a)}),l._layoutPromise=k.then(function(){return j().then(function(){l._site._writeProfilerMark(o+":complete,info"),l._site._writeProfilerMark(o+",StopTM")},function(a){return l._site._writeProfilerMark(o+":canceled,info"),l._site._writeProfilerMark(o+",StopTM"),i.wrapError(a)})}),{realizedRangeComplete:k,layoutComplete:l._layoutPromise}},itemsFromRange:function(a,b){return this._rangeContainsItems(a,b)?{firstIndex:this._firstItemFromRange(a),lastIndex:this._lastItemFromRange(b)}:{firstIndex:0,lastIndex:-1}},getAdjacent:function(b,c){function d(){var a={type:b.type,index:b.index-g.startIndex},c=g.getAdjacent(a,h);if("boundary"===c){var d=e._groups[f-1],i=e._groups[f+1],j=e._groups.length-1;if(h===H.leftArrow){if(0===f)return b;if(d instanceof T.UniformGroup&&g instanceof T.UniformGroup){var k=e._indexToCoordinate(a.index),l=e._horizontal?k.row:k.column,m=Math.floor((d.count-1)/e._itemsPerBar),n=m*e._itemsPerBar;return{type:o.ObjectType.item,index:d.startIndex+Math.min(d.count-1,n+l)}}return{type:o.ObjectType.item,index:g.startIndex-1}}if(h===H.rightArrow){if(f===j)return b;if(g instanceof T.UniformGroup&&i instanceof T.UniformGroup){var k=e._indexToCoordinate(a.index),l=e._horizontal?k.row:k.column;return{type:o.ObjectType.item,index:i.startIndex+Math.min(i.count-1,l)}}return{type:o.ObjectType.item,index:i.startIndex}}return b}return c.index+=g.startIndex,c}var e=this,f=e._site.groupIndexFromItemIndex(b.index),g=e._groups[f],h=e._adjustedKeyForOrientationAndBars(e._adjustedKeyForRTL(c),g instanceof T.CellSpanningGroup);if(b.type||(b.type=o.ObjectType.item),b.type===o.ObjectType.item||c!==H.pageUp&&c!==H.pageDown){if(b.type===o.ObjectType.header&&h===H.rightArrow)return{type:e._groupsEnabled?o.ObjectType.groupHeader:o.ObjectType.footer,index:0};if(b.type===o.ObjectType.footer&&h===H.leftArrow)return{type:e._groupsEnabled?o.ObjectType.groupHeader:o.ObjectType.header,index:0};if(b.type===o.ObjectType.groupHeader){if(h===H.leftArrow){var i=b.index-1;return i=e._site.header?i:Math.max(0,i),{type:i>-1?o.ObjectType.groupHeader:o.ObjectType.header,index:i>-1?i:0}}if(h===H.rightArrow){var i=b.index+1;return i=e._site.header?i:Math.min(e._groups.length-1,b.index+1),{type:i>=e._groups.length?o.ObjectType.header:o.ObjectType.groupHeader,index:i>=e._groups.length?0:i}}return b}}else{var j=0;j=b.type===o.ObjectType.groupHeader?e._groups[b.index].startIndex:b.type===o.ObjectType.header?0:e._groups[e._groups.length-1].count-1,b={type:o.ObjectType.item,index:j}}switch(e._adjustedKeyForRTL(c)){case H.upArrow:case H.leftArrow:case H.downArrow:case H.rightArrow:return d();default:return a._LayoutCommon.prototype._getAdjacentForPageKeys.call(e,b,c)}},hitTest:function(a,b){var c,d=this._sizes;a-=d.layoutOriginX,b-=d.layoutOriginY;var e=this._groupFromOffset(this._horizontal?a:b),f=this._groups[e];return this._horizontal?a-=f.offset:b-=f.offset,this._groupsEnabled&&(this._groupHeaderPosition===U.left?a-=d.headerContainerWidth:b-=d.headerContainerHeight),c=f.hitTest(a,b),c.index+=f.startIndex,c.insertAfterIndex+=f.startIndex,c},setupAnimations:function(){if(0===this._groups.length)return void this._resetAnimationCaches();if(!Object.keys(this._cachedItemRecords).length){this._site._writeProfilerMark("Animation:setupAnimations,StartTM");for(var a=this._getRealizationRange(),b=this._site.tree,c=0,d="horizontal"===this.orientation,e=0,f=b.length;f>e;e++){var g=b[e],h=!1,i=this._groups[e],j=i instanceof T.CellSpanningGroup,k=i?i.offset:0;if(A(g.itemsContainer,function(b,d){if(a.firstIndex<=c&&a.lastIndex>=c&&(h=!0,!this._cachedItemRecords[c])){var f=this._getItemPositionForAnimations(c,e,d),g=f.row,i=f.column,k=f.left,l=f.top;this._cachedItemRecords[c]={oldRow:g,oldColumn:i,oldLeft:k,oldTop:l,width:f.width,height:f.height,element:b,inCellSpanningGroup:j}}c++}.bind(this)),h){var l=e;if(!this._cachedHeaderRecords[l]){var m=this._getHeaderPositionForAnimations(l);this._cachedHeaderRecords[l]={oldLeft:m.left,oldTop:m.top,width:m.width,height:m.height,element:g.header}}this._cachedGroupRecords[I(g.itemsContainer.element)]||(this._cachedGroupRecords[I(g.itemsContainer.element)]={oldLeft:d?k:0,left:d?k:0,oldTop:d?0:k,top:d?0:k,element:g.itemsContainer.element})}}this._site._writeProfilerMark("Animation:setupAnimations,StopTM")}},_layoutAnimations:function(a,b){if(Object.keys(this._cachedItemRecords).length||Object.keys(this._cachedGroupRecords).length||Object.keys(this._cachedHeaderRecords).length){this._site._writeProfilerMark("Animation:layoutAnimation,StartTM"),this._updateAnimationCache(a,b);for(var c=this._getRealizationRange(),d=this._site.tree,e=0,f="horizontal"===this.orientation,g=0,h=d.length;h>g;g++){var i=d[g],j=this._groups[g],k=j instanceof T.CellSpanningGroup,l=j?j.offset:0,n=0,o=0,q=this._cachedGroupRecords[I(i.itemsContainer.element)];q&&(f?n=q.oldLeft-l:o=q.oldTop-l),A(i.itemsContainer,function(a,b){if(c.firstIndex<=e&&c.lastIndex>=e){var d=this._cachedItemRecords[e];if(d){var f=this._getItemPositionForAnimations(e,g,b),h=f.row,i=f.column,j=f.left,l=f.top;if(d.inCellSpanningGroup=d.inCellSpanningGroup||k,d.oldRow!==h||d.oldColumn!==i||d.oldTop!==l||d.oldLeft!==j){d.row=h,d.column=i,d.left=j,d.top=l;var q=d.oldLeft-d.left-n,r=d.oldTop-d.top-o;if(q=(this._site.rtl?-1:1)*q,d.xOffset=q,d.yOffset=r,0!==q||0!==r){var s=d.element;d.needsToResetTransform=!0,s.style[P]="",s.style[O.scriptName]="translate("+q+"px,"+r+"px)"}var t=a.parentNode;m.hasClass(t,p._itemsBlockClass)&&(this._animatingItemsBlocks[I(t)]=t)}}else this._cachedInsertedItemRecords[e]=a,a.style[P]="",a.style.opacity=0}e++}.bind(this));var r=g,s=this._cachedHeaderRecords[r];if(s){var t=this._getHeaderPositionForAnimations(r);if(s.height=t.height,s.width=t.width,s.oldLeft!==t.left||s.oldTop!==t.top){s.left=t.left,s.top=t.top;var u=s.oldLeft-s.left,v=s.oldTop-s.top;if(u=(this._site.rtl?-1:1)*u,0!==u||0!==v){s.needsToResetTransform=!0;var w=s.element;w.style[P]="",w.style[O.scriptName]="translate("+u+"px,"+v+"px)"}}}if(q&&(f&&q.left!==l||!f&&q.top!==l)){var x=q.element;if(0===n&&0===o)q.needsToResetTransform&&(q.needsToResetTransform=!1,x.style[O.scriptName]="");else{var y=(this._site.rtl?-1:1)*n,z=o;q.needsToResetTransform=!0,x.style[P]="",x.style[O.scriptName]="translate("+y+"px, "+z+"px)"}}}if(this._inListMode||1===this._itemsPerBar)for(var B=Object.keys(this._animatingItemsBlocks),C=0,D=B.length;D>C;C++)this._animatingItemsBlocks[B[C]].style.overflow="visible";this._site._writeProfilerMark("Animation:layoutAnimation,StopTM")}},executeAnimations:function(){function b(){if(e(),H)f();else{if(ba._itemsPerBar>1)for(var a=ba._itemsPerBar*ba._sizes.containerCrossSize+ba._getHeaderSizeContentAdjustment()+ba._sizes.containerMargins[U?"top":v.rtl?"right":"left"]+(U?ba._sizes.layoutOriginY:ba._sizes.layoutOriginX),b=0,c=y.length;c>b;b++){var d=y[b];d[V]>d[W]?(N=Math.max(N,d[X]+d[U?"height":"width"]),R=Math.max(R,a-d[Y]),J=!0,T.push(d)):d[V]<d[W]&&(Q=Math.max(Q,a-d[X]),S=Math.max(S,d[Y]+d[U?"height":"width"]),T.push(d),J=!0)}v.rtl&&!U&&(N*=-1,R*=-1,Q*=-1,S*=-1),J?j(ba._itemsPerBar):q()}}function c(b){F=i.join(G),F.done(function(){G=[],t&&(a.Layout._debugAnimations?d._requestAnimationFrame(function(){b()}):b())})}function e(){if(x.length){v._writeProfilerMark("Animation:setupRemoveAnimation,StartTM"),B+=60,E+=60;var a=120;u&&(a*=10),G.push(h.executeTransition(x,[{property:"opacity",delay:A,duration:a,timing:"linear",to:0,skipStylesReset:!0}])),v._writeProfilerMark("Animation:setupRemoveAnimation,StopTM")}}function f(){v._writeProfilerMark("Animation:cellSpanningFadeOutMove,StartTM");for(var a=[],b=0,d=y.length;d>b;b++){var e=y[b],f=e.element;a.push(f)}for(var b=0,d=z.length;d>b;b++){var e=z[b],f=e.element;a.push(f)}var i=120;u&&(i*=10),G.push(h.executeTransition(a,{property:"opacity",delay:A,duration:i,timing:"linear",to:0})),c(g),v._writeProfilerMark("Animation:cellSpanningFadeOutMove,StopTM")}function g(){v._writeProfilerMark("Animation:cellSpanningFadeInMove,StartTM"),E=0;for(var a=[],b=0,c=y.length;c>b;b++){var d=y[b],e=d.element;e.style[O.scriptName]="",a.push(e)}for(var b=0,c=z.length;c>b;b++){var d=z[b],e=d.element;e.style[O.scriptName]="",a.push(e)}var f=120;u&&(f*=10),G.push(h.executeTransition(a,{property:"opacity",delay:E,duration:f,timing:"linear",to:1})),v._writeProfilerMark("Animation:cellSpanningFadeInMove,StopTM"),r()}function j(a){v._writeProfilerMark("Animation:setupReflowAnimation,StartTM");for(var b={},d=0,e=T.length;e>d;d++){var f=T[d],g=f.xOffset,i=f.yOffset;f[V]>f[W]?U?i-=N:g-=N:f[V]<f[W]&&(U?i+=Q:g+=Q);var j=f.element;K=Math.min(K,U?g:i),L=Math.max(L,U?g:i);var k=j.parentNode;m.hasClass(k,"win-itemscontainer")||(k=k.parentNode);var l=b[I(k)];if(!l){var n=D(C(k,v.tree));b[I(k)]=l=Math.ceil(n/a)-1}T[d][U?"column":"row"]===l&&(M[I(k)]=k);var q=80;u&&(q*=10),G.push(h.executeTransition(j,{property:O.cssName,delay:B,duration:q,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:"translate("+g+"px,"+i+"px)"}))}for(var r=Object.keys(M),d=0,e=r.length;e>d;d++){var s=M[r[d]];v.rtl&&U?(s.style.paddingLeft=-1*K+"px",s.style.marginLeft=K+"px"):(s.style[U?"paddingRight":"paddingBottom"]=L+"px",s.style[U?"marginRight":"marginBottom"]="-"+L+"px")}for(var t=Object.keys(Z),d=0,e=t.length;e>d;d++)Z[t[d]].classList.add(p._clipClass);c(o),v._writeProfilerMark("Animation:setupReflowAnimation,StopTM")}function n(){for(var a=Object.keys(M),b=0,c=a.length;c>b;b++){var d=M[a[b]];v.rtl&&U?(d.style.paddingLeft="",d.style.marginLeft=""):(d.style[U?"paddingRight":"paddingBottom"]="",d.style[U?"marginRight":"marginBottom"]="")}M={};for(var e=Object.keys(Z),b=0,c=e.length;c>b;b++){var f=Z[e[b]];f.style.overflow="",f.classList.remove(p._clipClass)}}function o(){v._writeProfilerMark("Animation:prepareReflowedItems,StartTM");for(var b=0,c=T.length;c>b;b++){var e=T[b],f=0,g=0;e[V]>e[W]?U?g=R:f=R:e[V]<e[W]&&(U?g=-1*S:f=-1*S),e.element.style[P]="",e.element.style[O.scriptName]="translate("+f+"px,"+g+"px)"}v._writeProfilerMark("Animation:prepareReflowedItems,StopTM"),a.Layout._debugAnimations?d._requestAnimationFrame(function(){q(!0)}):q(!0)}function q(a){var b=200;if(a&&(b=150,B=0,E=0),u&&(b*=10),y.length>0||z.length>0){v._writeProfilerMark("Animation:setupMoveAnimation,StartTM");for(var c=[],d=0,e=z.length;e>d;d++){var f=z[d].element;c.push(f)}for(var d=0,e=y.length;e>d;d++){var f=y[d].element;c.push(f)}G.push(h.executeTransition(c,{property:O.cssName,delay:B,duration:b,timing:"cubic-bezier(0.1, 0.9, 0.2, 1)",to:""})),E+=80,v._writeProfilerMark("Animation:setupMoveAnimation,StopTM")}r()}function r(){if(w.length>0){v._writeProfilerMark("Animation:setupInsertAnimation,StartTM");var a=120;u&&(a*=10),G.push(h.executeTransition(w,[{property:"opacity",delay:E,duration:a,timing:"linear",to:1}])),v._writeProfilerMark("Animation:setupInsertAnimation,StopTM")}c(s)}function s(){v._writeProfilerMark("Animation:cleanupAnimations,StartTM"),n();for(var a=0,b=x.length;b>a;a++){var c=x[a];c.parentNode&&(l._disposeElement(c),c.parentNode.removeChild(c))}v._writeProfilerMark("Animation:cleanupAnimations,StopTM"),ba._animationsRunning=null,t.complete()}var t=new k;if(this._filterInsertedElements(),this._filterMovedElements(),this._filterRemovedElements(),0===this._insertedElements.length&&0===this._removedElements.length&&0===this._itemMoveRecords.length&&0===this._moveRecords.length)return this._resetAnimationCaches(!0),t.complete(),t.promise;this._animationsRunning=t.promise;for(var u=a.Layout._debugAnimations||a.Layout._slowAnimations,v=this._site,w=this._insertedElements,x=this._removedElements,y=this._itemMoveRecords,z=this._moveRecords,A=0,B=0,E=0,F=null,G=[],H=!1,J=!1,K=0,L=0,M={},N=0,Q=0,R=0,S=0,T=[],U="horizontal"===this.orientation,V=U?"oldColumn":"oldRow",W=U?"column":"row",X=U?"oldTop":"oldLeft",Y=U?"top":"left",Z=this._animatingItemsBlocks,$=0,_=y.length;_>$;$++){var aa=y[$];if(aa.inCellSpanningGroup){H=!0;break}}var ba=this;return a.Layout._debugAnimations?d._requestAnimationFrame(function(){b()}):b(),this._resetAnimationCaches(!0),t.promise.then(null,function(){n();for(var a=0,b=z.length;b>a;a++){var c=z[a].element;c.style[O.scriptName]="",c.style.opacity=1}for(var a=0,b=y.length;b>a;a++){var c=y[a].element;c.style[O.scriptName]="",c.style.opacity=1}for(var a=0,b=w.length;b>a;a++)w[a].style.opacity=1;for(var a=0,b=x.length;b>a;a++){var c=x[a];c.parentNode&&(l._disposeElement(c),c.parentNode.removeChild(c))}this._animationsRunning=null,t=null,F&&F.cancel()}.bind(this)),t.promise},dragOver:function(a,b,c){var d=this.hitTest(a,b),e=this._groups?this._site.groupIndexFromItemIndex(d.index):0,f=this._site.tree[e].itemsContainer,g=D(f),h=this._groups?this._groups[e].startIndex:0,i=this._getVisibleRange();d.index-=h,d.insertAfterIndex-=h,i.firstIndex=Math.max(i.firstIndex-h-1,0),
-i.lastIndex=Math.min(i.lastIndex-h+1,g);var j=Math.max(Math.min(g-1,d.insertAfterIndex),-1),k=Math.min(j+1,g);if(c){for(var l=j;l>=i.firstIndex;l--){if(!c._isIncluded(l+h)){j=l;break}l===i.firstIndex&&(j=-1)}for(var l=k;l<i.lastIndex;l++){if(!c._isIncluded(l+h)){k=l;break}l===i.lastIndex-1&&(k=g)}}var m=B(f,k),n=B(f,j);if(this._animatedDragItems)for(var l=0,o=this._animatedDragItems.length;o>l;l++){var p=this._animatedDragItems[l];p&&(p.style[P]=this._site.animationsDisabled?"":Q,p.style[O.scriptName]="")}this._animatedDragItems=[];var q="horizontal"===this.orientation,r=this._inListMode||1===this._itemsPerBar;this._groups&&this._groups[e]instanceof T.CellSpanningGroup&&(r=1===this._groups[e]._slotsPerColumn);var s=0,t=0;!q&&!r||q&&r?s=this._site.rtl?-R:R:t=R,m&&(m.style[P]=this._site.animationsDisabled?"":Q,m.style[O.scriptName]="translate("+s+"px, "+t+"px)",this._animatedDragItems.push(m)),n&&(n.style[P]=this._site.animationsDisabled?"":Q,n.style[O.scriptName]="translate("+-s+"px, -"+t+"px)",this._animatedDragItems.push(n))},dragLeave:function(){if(this._animatedDragItems)for(var a=0,b=this._animatedDragItems.length;b>a;a++)this._animatedDragItems[a].style[P]=this._site.animationsDisabled?"":Q,this._animatedDragItems[a].style[O.scriptName]="";this._animatedDragItems=[]},_setMaxRowsOrColumns:function(a){a===this._maxRowsOrColumns||this._inListMode||(this._sizes&&this._sizes.containerSizeLoaded&&(this._itemsPerBar=Math.floor(this._sizes.maxItemsContainerContentSize/this._sizes.containerCrossSize),a&&(this._itemsPerBar=Math.min(this._itemsPerBar,a)),this._itemsPerBar=Math.max(1,this._itemsPerBar)),this._maxRowsOrColumns=a,this._invalidateLayout())},_getItemPosition:function(a){if(this._groupsEnabled){var b=Math.min(this._groups.length-1,this._site.groupIndexFromItemIndex(a)),c=this._groups[b],d=a-c.startIndex;return this._getItemPositionForAnimations(a,b,d)}return this._getItemPositionForAnimations(a,0,a)},_getRealizationRange:function(){var a=this._site.realizedRange;return{firstIndex:this._firstItemFromRange(a.firstPixel),lastIndex:this._lastItemFromRange(a.lastPixel)}},_getVisibleRange:function(){var a=this._site.visibleRange;return{firstIndex:this._firstItemFromRange(a.firstPixel),lastIndex:this._lastItemFromRange(a.lastPixel)}},_resetAnimationCaches:function(a){if(!a){this._resetStylesForRecords(this._cachedGroupRecords),this._resetStylesForRecords(this._cachedItemRecords),this._resetStylesForRecords(this._cachedHeaderRecords),this._resetStylesForInsertedRecords(this._cachedInsertedItemRecords),this._resetStylesForInsertedRecords(this._cachedInsertedHeaderRecords),this._resetStylesForRemovedRecords(this._cachedRemovedItems),this._resetStylesForRemovedRecords(this._cachedRemovedHeaders);for(var b=Object.keys(this._animatingItemsBlocks),c=0,d=b.length;d>c;c++){var e=this._animatingItemsBlocks[b[c]];e.style.overflow="",e.classList.remove(p._clipClass)}}this._cachedGroupRecords={},this._cachedItemRecords={},this._cachedHeaderRecords={},this._cachedInsertedItemRecords={},this._cachedInsertedHeaderRecords={},this._cachedRemovedItems=[],this._cachedRemovedHeaders=[],this._animatingItemsBlocks={}},_cacheRemovedElements:function(a,b,c,d,e){var f="left";this._site.rtl&&(f="right");var g,h;e?(g=this._sizes.headerContainerOuterX,h=this._sizes.headerContainerOuterY):(g=this._sizes.containerMargins[f],h=this._sizes.containerMargins.top);for(var i=0,j=a.length;j>i;i++){var k=a[i];if(-1===k.newIndex){var l=k.element,m=b[k.oldIndex];m&&(m.element=l,delete b[k.oldIndex],l.style.position="absolute",l.style[P]="",l.style.top=m.oldTop-h+"px",l.style[f]=m.oldLeft-g+"px",l.style.width=m.width+"px",l.style.height=m.height+"px",l.style[O.scriptName]="",this._site.surface.appendChild(l),d.push(m)),c[k.oldIndex]&&delete c[k.oldIndex]}}},_cacheInsertedElements:function(a,b,c){for(var d={},e=0,f=a.length;f>e;e++){var g=a[e],h=b[g.oldIndex];if(h&&delete b[g.oldIndex],h||-1===g.oldIndex||g.moved){var i=c[g.newIndex];i&&delete c[g.newIndex];var j=g.element;d[g.newIndex]=j,j.style[P]="",j.style[O.scriptName]="",j.style.opacity=0}}for(var k=Object.keys(b),e=0,f=k.length;f>e;e++)d[k[e]]=b[k[e]];return d},_resetStylesForRecords:function(a){for(var b=Object.keys(a),c=0,d=b.length;d>c;c++){var e=a[b[c]];e.needsToResetTransform&&(e.element.style[O.scriptName]="",e.needsToResetTransform=!1)}},_resetStylesForInsertedRecords:function(a){for(var b=Object.keys(a),c=0,d=b.length;d>c;c++){var e=a[b[c]];e.style.opacity=1}},_resetStylesForRemovedRecords:function(a){for(var b=0,c=a.length;c>b;b++){var d=a[b].element;d.parentNode&&(l._disposeElement(d),d.parentNode.removeChild(d))}},_updateAnimationCache:function(a,b){function c(a,b){for(var c={},e=0,f=a.length;f>e;e++){var g=a[e],h=b[g.oldIndex];h&&(c[g.newIndex]=h,h.element=g.element,delete b[g.oldIndex])}for(var i=Object.keys(b),e=0,f=i.length;f>e;e++){var j=i[e],k=b[j];k.element&&!d[I(k.element)]||(c[j]=k)}return c}this._resetStylesForRecords(this._cachedItemRecords),this._resetStylesForRecords(this._cachedHeaderRecords),this._resetStylesForInsertedRecords(this._cachedInsertedItemRecords),this._resetStylesForInsertedRecords(this._cachedInsertedHeaderRecords);for(var d={},e=this._getRealizationRange(),f=this._site.tree,g=0,h=0,i=f.length;i>g;g++)A(f[g].itemsContainer,function(a){e.firstIndex<=h&&e.lastIndex>=h&&(d[I(a)]=!0),h++});this._cachedItemRecords=c(a,this._cachedItemRecords),this._cachedHeaderRecords=c(b,this._cachedHeaderRecords),this._cachedInsertedItemRecords=this._cacheInsertedElements(a,this._cachedInsertedItemRecords,this._cachedItemRecords),this._cachedInsertedHeaderRecords=this._cacheInsertedElements(b,this._cachedInsertedHeaderRecords,this._cachedHeaderRecords)},_filterRemovedElements:function(){function a(a,g){for(var h=0,i=a.length;i>h;h++){var j=a[h],k=j.element;j[c]+j[d]-1<e||j[c]>f||!b._site.viewport.contains(k)?k.parentNode&&(l._disposeElement(k),k.parentNode.removeChild(k)):g.push(k)}}if(this._removedElements=[],this._site.animationsDisabled)return this._resetStylesForRemovedRecords(this._cachedRemovedItems),void this._resetStylesForRemovedRecords(this._cachedRemovedHeaders);var b=this,c="horizontal"===this.orientation?"oldLeft":"oldTop",d="horizontal"===this.orientation?"width":"height",e=this._site.scrollbarPos,f=e+this._site.viewportSize[d]-1;a(this._cachedRemovedItems,this._removedElements),a(this._cachedRemovedHeaders,this._removedElements)},_filterInsertedElements:function(){function a(a,d){for(var e=Object.keys(a),f=0,g=e.length;g>f;f++){var h=e[f],i=a[h];h<c.firstIndex||h>c.lastIndex||b._site.viewport.contains(i.element)?i.style.opacity=1:d.push(i)}}if(this._insertedElements=[],this._site.animationsDisabled)return this._resetStylesForInsertedRecords(this._cachedInsertedItemRecords),void this._resetStylesForInsertedRecords(this._cachedInsertedHeaderRecords);var b=this,c=this._getVisibleRange();a(this._cachedInsertedItemRecords,this._insertedElements),a(this._cachedInsertedHeaderRecords,this._insertedElements)},_filterMovedElements:function(){var a=this,b="horizontal"===this.orientation?"oldLeft":"oldTop",c="horizontal"===this.orientation?"left":"top",d="horizontal"===this.orientation?"width":"height",e=this._getRealizationRange(),f=this._site.scrollbarPos,g=f+this._site.viewportSize[d]-1;if(this._itemMoveRecords=[],this._moveRecords=[],!this._site.animationsDisabled)for(var h=this._site.tree,i=0,j=0,k=h.length;k>j;j++){var l=h[j],m=!1;A(l.itemsContainer,function(){if(e.firstIndex<=i&&e.lastIndex>=i){var h=this._cachedItemRecords[i];if(h){var j=(h[b]+h[d]-1>=f&&h[b]<=g||h[c]+h[d]-1>=f&&h[c]<=g)&&a._site.viewport.contains(h.element);j&&(m=!0,h.needsToResetTransform&&(this._itemMoveRecords.push(h),delete this._cachedItemRecords[i]))}}i++}.bind(this));var n=j,o=this._cachedHeaderRecords[n];o&&m&&o.needsToResetTransform&&(this._moveRecords.push(o),delete this._cachedHeaderRecords[n]);var p=this._cachedGroupRecords[I(l.itemsContainer.element)];p&&m&&p.needsToResetTransform&&(this._moveRecords.push(p),delete this._cachedGroupRecords[I(l.itemsContainer.element)])}this._resetStylesForRecords(this._cachedGroupRecords),this._resetStylesForRecords(this._cachedItemRecords),this._resetStylesForRecords(this._cachedHeaderRecords)},_getItemPositionForAnimations:function(a,b,c){var d=this._groups[b],e=d.getItemPositionForAnimations(c),f=this._groups[b]?this._groups[b].offset:0,g=this._groupsEnabled&&this._groupHeaderPosition===U.left?this._sizes.headerContainerWidth:0,h=this._groupsEnabled&&this._groupHeaderPosition===U.top?this._sizes.headerContainerHeight:0;return e.left+=this._sizes.layoutOriginX+g+this._sizes.itemsContainerOuterX,e.top+=this._sizes.layoutOriginY+h+this._sizes.itemsContainerOuterY,e[this._horizontal?"left":"top"]+=f,e},_getHeaderPositionForAnimations:function(a){var b;if(this._groupsEnabled){var c=this._sizes.headerContainerWidth-this._sizes.headerContainerOuterWidth,d=this._sizes.headerContainerHeight-this._sizes.headerContainerOuterHeight;this._groupHeaderPosition!==U.left||this._horizontal?this._groupHeaderPosition===U.top&&this._horizontal&&(c=this._groups[a].getItemsContainerSize()-this._sizes.headerContainerOuterWidth):d=this._groups[a].getItemsContainerSize()-this._sizes.headerContainerOuterHeight;var e=this._horizontal?this._groups[a].offset:0,f=this._horizontal?0:this._groups[a].offset;b={top:this._sizes.layoutOriginY+f+this._sizes.headerContainerOuterY,left:this._sizes.layoutOriginX+e+this._sizes.headerContainerOuterX,height:d,width:c}}else b={top:0,left:0,height:0,width:0};return b},_rangeContainsItems:function(a,b){if(0===this._groups.length)return!1;var c=this._groups[this._groups.length-1],d=this._sizes.layoutOrigin+c.offset+this._getGroupSize(c)-1;return b>=0&&d>=a},_itemFromOffset:function(a,b){function c(a){if(!b.wholeItem){var c=e._horizontal?e._site.rtl?"right":"left":"top",d=e._horizontal?e._site.rtl?"left":"right":"bottom";return b.last?a-e._sizes.containerMargins[c]:a+e._sizes.containerMargins[d]}return a}function d(a){return b.last?a-e._getHeaderSizeGroupAdjustment()-e._sizes.itemsContainerOuterStart:a}var e=this;if(0===this._groups.length)return 0;b=b||{},a-=this._sizes.layoutOrigin,a=c(a);var f=this._groupFromOffset(d(a)),g=this._groups[f];return a-=g.offset,a-=this._getHeaderSizeGroupAdjustment(),g.startIndex+g.itemFromOffset(a,b)},_firstItemFromRange:function(a,b){return b=b||{},b.last=0,this._itemFromOffset(a,b)},_lastItemFromRange:function(a,b){return b=b||{},b.last=1,this._itemFromOffset(a,b)},_adjustedKeyForRTL:function(a){return this._site.rtl&&(a===H.leftArrow?a=H.rightArrow:a===H.rightArrow&&(a=H.leftArrow)),a},_adjustedKeyForOrientationAndBars:function(a,b){var c=a;if(b)return a;if(!this._horizontal)switch(c){case H.leftArrow:c=H.upArrow;break;case H.rightArrow:c=H.downArrow;break;case H.upArrow:c=H.leftArrow;break;case H.downArrow:c=H.rightArrow}return 1===this._itemsPerBar&&(c===H.upArrow?c=H.leftArrow:c===H.downArrow&&(c=H.rightArrow)),c},_getAdjacentForPageKeys:function(a,b){var c,d=this._sizes.containerMargins,e="horizontal"===this.orientation?d.left+d.right:d.top+d.bottom,f=this._site.viewportSize["horizontal"===this.orientation?"width":"height"],g=this._site.scrollbarPos,h=g+f-1-d["horizontal"===this.orientation?"right":"bottom"],i=this._firstItemFromRange(g,{wholeItem:!0}),j=this._lastItemFromRange(h,{wholeItem:!1}),k=this._getItemPosition(a.index),l=!1;if((a.index<i||a.index>j)&&(l=!0,g="horizontal"===this.orientation?k.left-e:k.top-e,h=g+f-1,i=this._firstItemFromRange(g,{wholeItem:!0}),j=this._lastItemFromRange(h,{wholeItem:!1})),b===H.pageUp){if(!l&&i!==a.index)return{type:o.ObjectType.item,index:i};var m;m="horizontal"===this.orientation?k.left+k.width+e+d.left:k.top+k.height+e+d.bottom;var n=this._firstItemFromRange(m-f,{wholeItem:!0});c=a.index===n?Math.max(0,a.index-this._itemsPerBar):n}else{if(!l&&j!==a.index)return{type:o.ObjectType.item,index:j};var p;p="horizontal"===this.orientation?k.left-e-d.right:k.top-e-d.bottom;var q=Math.max(0,this._lastItemFromRange(p+f-1,{wholeItem:!0}));c=a.index===q?a.index+this._itemsPerBar:q}return{type:o.ObjectType.item,index:c}},_isCellSpanning:function(a){var b=this._site.groupFromIndex(a),c=this._groupInfo;return c?!!("function"==typeof c?c(b):c).enableCellSpanning:!1},_getGroupInfo:function(a){var b=this._site.groupFromIndex(a),c=this._groupInfo,d=this._sizes.containerMargins,f={enableCellSpanning:!1};if(c="function"==typeof c?c(b):c){if(c.enableCellSpanning&&(+c.cellWidth!==c.cellWidth||+c.cellHeight!==c.cellHeight))throw new e("WinJS.UI.GridLayout.GroupInfoResultIsInvalid",J.groupInfoResultIsInvalid);f={enableCellSpanning:!!c.enableCellSpanning,cellWidth:c.cellWidth+d.left+d.right,cellHeight:c.cellHeight+d.top+d.bottom}}return f},_getItemInfo:function(a){var b;if(this._itemInfo&&"function"==typeof this._itemInfo)b=this._itemInfo(a);else{if(!this._useDefaultItemInfo)throw new e("WinJS.UI.GridLayout.ItemInfoIsInvalid",J.itemInfoIsInvalid);b=this._defaultItemInfo(a)}return i.as(b).then(function(a){if(!a||+a.width!==a.width||+a.height!==a.height)throw new e("WinJS.UI.GridLayout.ItemInfoIsInvalid",J.itemInfoIsInvalid);return a})},_defaultItemInfo:function(a){var b=this;return this._site.renderItem(this._site.itemFromIndex(a)).then(function(c){return b._elementsToMeasure[a]={element:c},b._measureElements()}).then(function(){var c=b._elementsToMeasure[a],d={width:c.width,height:c.height};return delete b._elementsToMeasure[a],d},function(c){return delete b._elementsToMeasure[a],i.wrapError(c)})},_getGroupSize:function(a){var b=0;return this._groupsEnabled&&(this._horizontal&&this._groupHeaderPosition===U.top?b=this._sizes.headerContainerMinWidth:this._horizontal||this._groupHeaderPosition!==U.left||(b=this._sizes.headerContainerMinHeight)),Math.max(b,a.getItemsContainerSize()+this._getHeaderSizeGroupAdjustment())},_groupFromOffset:function(a){return a<this._groups[0].offset?0:this._groupFrom(function(b){return a<b.offset})},_groupFromImpl:function(a,b,c){if(a>b)return null;var d=a+Math.floor((b-a)/2),e=this._groups[d];return c(e,d)?this._groupFromImpl(a,d-1,c):b>d&&!c(this._groups[d+1],d+1)?this._groupFromImpl(d+1,b,c):d},_groupFrom:function(a){if(this._groups.length>0){var b=this._groups.length-1,c=this._groups[b];return a(c,b)?this._groupFromImpl(0,this._groups.length-1,a):b}return null},_invalidateLayout:function(){this._site&&this._site.invalidateLayout()},_resetMeasurements:function(){this._measuringPromise&&(this._measuringPromise.cancel(),this._measuringPromise=null),this._containerSizeClassName&&(m.removeClass(this._site.surface,this._containerSizeClassName),u(this._containerSizeClassName),this._containerSizeClassName=null),this._sizes=null,this._resetAnimationCaches()},_measureElements:function(){if(!this._measuringElements){var a=this;a._measuringElements=j.schedulePromiseHigh(null,"WinJS.UI.GridLayout._measuringElements").then(function(){a._site._writeProfilerMark("_measureElements,StartTM");var c=a._createMeasuringSurface(),d=b.document.createElement("div"),e=a._site,f=a._measuringElements,g=a._elementsToMeasure,h=!1;d.className=p._itemsContainerClass+" "+p._laidOutClass,d.style.cssText+=";display: -ms-grid;-ms-grid-column: 1;-ms-grid-row: 1";var i,j,k=Object.keys(g);for(j=0,i=k.length;i>j;j++){var l=g[k[j]].element;l.style["-ms-grid-column"]=j+1,l.style["-ms-grid-row"]=j+1,d.appendChild(l)}for(c.appendChild(d),e.viewport.insertBefore(c,e.viewport.firstChild),f.then(null,function(){h=!0}),j=0,i=k.length;i>j&&!h;j++){var n=g[k[j]],o=n.element.querySelector("."+p._itemClass);n.width=m.getTotalWidth(o),n.height=m.getTotalHeight(o)}c.parentNode&&c.parentNode.removeChild(c),f===a._measuringElements&&(a._measuringElements=null),e._writeProfilerMark("_measureElements,StopTM")},function(b){return a._measuringElements=null,i.wrapError(b)})}return this._measuringElements},_ensureEnvInfo:function(){return this._envInfo||(this._envInfo=E(this._site),this._envInfo&&!this._envInfo.supportsCSSGrid&&m.addClass(this._site.surface,p._noCSSGrid)),!!this._envInfo},_createMeasuringSurface:function(){var a=b.document.createElement("div");return a.style.cssText="visibility: hidden;-ms-grid-columns: auto;-ms-grid-rows: auto;-ms-flex-align: start;-webkit-align-items: flex-start;align-items: flex-start",a.className=p._scrollableClass+" "+(this._inListMode?p._listLayoutClass:p._gridLayoutClass),this._envInfo.supportsCSSGrid||m.addClass(a,p._noCSSGrid),this._groupsEnabled&&(this._groupHeaderPosition===U.top?m.addClass(a,p._headerPositionTopClass):m.addClass(a,p._headerPositionLeftClass)),a},_measureItem:function(a){function c(a,e){var e,h=!!e,j={},k=f.rtl?"right":"left";return f.itemCount.then(function(b){return!b||d._groupsEnabled&&!f.groupCount?i.cancel:(e=e||f.itemFromIndex(a),j.container=f.renderItem(e),d._groupsEnabled&&(j.headerContainer=f.renderHeader(d._site.groupFromIndex(f.groupIndexFromItemIndex(a)))),i.join(j))}).then(function(j){function l(){var a=d._horizontal,b=d._groupsEnabled,c=!1;g.then(null,function(){c=!0});var e=G(C),h=f.rtl?f.viewport.offsetWidth-(C.offsetLeft+C.offsetWidth):C.offsetLeft,i=C.offsetTop,l={viewportContentSize:0,surfaceContentSize:0,maxItemsContainerContentSize:0,surfaceOuterHeight:y(o),surfaceOuterWidth:z(o),layoutOriginX:h-e[k],layoutOriginY:i-e.top,itemsContainerOuterHeight:y(q),itemsContainerOuterWidth:z(q),itemsContainerOuterX:x(f.rtl?"Right":"Left",q),itemsContainerOuterY:x("Top",q),itemsContainerMargins:G(q),itemBoxOuterHeight:y(s),itemBoxOuterWidth:z(s),containerOuterHeight:y(j.container),containerOuterWidth:z(j.container),emptyContainerContentHeight:m.getContentHeight(r),emptyContainerContentWidth:m.getContentWidth(r),containerMargins:G(j.container),containerWidth:0,containerHeight:0,containerSizeLoaded:!1};f.header&&(l[a?"layoutOriginX":"layoutOriginY"]+=m[a?"getTotalWidth":"getTotalHeight"](f.header)),b&&(l.headerContainerOuterX=x(f.rtl?"Right":"Left",j.headerContainer),l.headerContainerOuterY=x("Top",j.headerContainer),l.headerContainerOuterWidth=z(j.headerContainer),l.headerContainerOuterHeight=y(j.headerContainer),l.headerContainerWidth=m.getTotalWidth(j.headerContainer),l.headerContainerHeight=m.getTotalHeight(j.headerContainer),l.headerContainerMinWidth=w(j.headerContainer,"minWidth")+l.headerContainerOuterWidth,l.headerContainerMinHeight=w(j.headerContainer,"minHeight")+l.headerContainerOuterHeight);var n={sizes:l,viewportContentWidth:m.getContentWidth(f.viewport),viewportContentHeight:m.getContentHeight(f.viewport),containerContentWidth:m.getContentWidth(j.container),containerContentHeight:m.getContentHeight(j.container),containerWidth:m.getTotalWidth(j.container),containerHeight:m.getTotalHeight(j.container)};return n.viewportCrossSize=n[a?"viewportContentHeight":"viewportContentWidth"],f.readyToMeasure(),c?null:n}function n(){o.parentNode&&o.parentNode.removeChild(o)}var o=d._createMeasuringSurface(),q=b.document.createElement("div"),r=b.document.createElement("div"),s=j.container.querySelector("."+p._itemBoxClass),t=f.groupIndexFromItemIndex(a);r.className=p._containerClass,q.className=p._itemsContainerClass+" "+p._laidOutClass;var u=1,v=1,A=2,B=2,C=q,D=!1;d._inListMode&&d._groupsEnabled&&(d._horizontal&&d._groupHeaderPosition===U.top?(u=2,B=1,A=1,C=j.headerContainer,D=!0):d._horizontal||d._groupHeaderPosition!==U.left||(v=2,B=1,A=1,C=j.headerContainer,D=!0)),q.style.cssText+=";display: "+(d._inListMode?(d._horizontal?"flex":"block")+"; overflow: hidden":"inline-block")+";vertical-align:top;-ms-grid-column: "+v+";-ms-grid-row: "+u,d._inListMode||(j.container.style.display="inline-block"),d._groupsEnabled&&(j.headerContainer.style.cssText+=";display: inline-block;-ms-grid-column: "+B+";-ms-grid-row: "+A,m.addClass(j.headerContainer,p._laidOutClass+" "+p._groupLeaderClass),(d._groupHeaderPosition===U.top&&d._horizontal||d._groupHeaderPosition===U.left&&!d._horizontal)&&m.addClass(q,p._groupLeaderClass)),D&&o.appendChild(j.headerContainer),q.appendChild(j.container),q.appendChild(r),o.appendChild(q),!D&&d._groupsEnabled&&o.appendChild(j.headerContainer),f.viewport.insertBefore(o,f.viewport.firstChild);var E=l();if(!E)return n(),i.cancel;if(d._horizontal&&0===E.viewportContentHeight||!d._horizontal&&0===E.viewportContentWidth)return n(),i.cancel;if(!(h||d._isCellSpanning(t)||0!==E.containerContentWidth&&0!==E.containerContentHeight))return n(),e.then(function(){return c(a,e)});var F=d._sizes=E.sizes;if(Object.defineProperties(F,{surfaceOuterCrossSize:{get:function(){return d._horizontal?F.surfaceOuterHeight:F.surfaceOuterWidth},enumerable:!0},layoutOrigin:{get:function(){return d._horizontal?F.layoutOriginX:F.layoutOriginY},enumerable:!0},itemsContainerOuterSize:{get:function(){return d._horizontal?F.itemsContainerOuterWidth:F.itemsContainerOuterHeight},enumerable:!0},itemsContainerOuterCrossSize:{get:function(){return d._horizontal?F.itemsContainerOuterHeight:F.itemsContainerOuterWidth},enumerable:!0},itemsContainerOuterStart:{get:function(){return d._horizontal?F.itemsContainerOuterX:F.itemsContainerOuterY},enumerable:!0},itemsContainerOuterCrossStart:{get:function(){return d._horizontal?F.itemsContainerOuterY:F.itemsContainerOuterX},enumerable:!0},containerCrossSize:{get:function(){return d._horizontal?F.containerHeight:F.containerWidth},enumerable:!0},containerSize:{get:function(){return d._horizontal?F.containerWidth:F.containerHeight},enumerable:!0}}),!d._isCellSpanning(t)){if(d._inListMode){var H=E.viewportCrossSize-F.surfaceOuterCrossSize-d._getHeaderSizeContentAdjustment()-F.itemsContainerOuterCrossSize;d._horizontal?(F.containerHeight=H,F.containerWidth=E.containerWidth):(F.containerHeight=E.containerHeight,F.containerWidth=H)}else F.containerWidth=E.containerWidth,F.containerHeight=E.containerHeight;F.containerSizeLoaded=!0}d._createContainerStyleRule(),d._viewportSizeChanged(E.viewportCrossSize),n()})}var d=this,e="Layout:measureItem",f=d._site,g=d._measuringPromise;if(!g){f._writeProfilerMark(e+",StartTM");var h=new k;d._measuringPromise=g=h.promise.then(function(){return d._ensureEnvInfo()?c(a):i.cancel}).then(function(){f._writeProfilerMark(e+":complete,info"),f._writeProfilerMark(e+",StopTM")},function(a){return d._measuringPromise=null,f._writeProfilerMark(e+":canceled,info"),f._writeProfilerMark(e+",StopTM"),i.wrapError(a)}),h.complete()}return g},_getHeaderSizeGroupAdjustment:function(){if(this._groupsEnabled){if(this._horizontal&&this._groupHeaderPosition===U.left)return this._sizes.headerContainerWidth;if(!this._horizontal&&this._groupHeaderPosition===U.top)return this._sizes.headerContainerHeight}return 0},_getHeaderSizeContentAdjustment:function(){if(this._groupsEnabled){if(this._horizontal&&this._groupHeaderPosition===U.top)return this._sizes.headerContainerHeight;if(!this._horizontal&&this._groupHeaderPosition===U.left)return this._sizes.headerContainerWidth}return 0},_getViewportCrossSize:function(){return this._site.viewportSize[this._horizontal?"height":"width"]},_viewportSizeChanged:function(a){var b=this._sizes;b.viewportContentSize=a,b.surfaceContentSize=a-b.surfaceOuterCrossSize,b.maxItemsContainerContentSize=b.surfaceContentSize-b.itemsContainerOuterCrossSize-this._getHeaderSizeContentAdjustment(),b.containerSizeLoaded&&!this._inListMode?(this._itemsPerBar=Math.floor(b.maxItemsContainerContentSize/b.containerCrossSize),this.maximumRowsOrColumns&&(this._itemsPerBar=Math.min(this._itemsPerBar,this.maximumRowsOrColumns)),this._itemsPerBar=Math.max(1,this._itemsPerBar)):(this._inListMode&&(b[this._horizontal?"containerHeight":"containerWidth"]=b.maxItemsContainerContentSize),this._itemsPerBar=1),this._resetAnimationCaches()},_createContainerStyleRule:function(){var a=this._sizes;if(!this._containerSizeClassName&&a.containerSizeLoaded&&(0===a.emptyContainerContentHeight||0===a.emptyContainerContentWidth)){var b=a.containerWidth-a.containerOuterWidth+"px",c=a.containerHeight-a.containerOuterHeight+"px";this._inListMode&&(this._horizontal?c="calc(100% - "+(a.containerMargins.top+a.containerMargins.bottom)+"px)":b="auto"),this._containerSizeClassName||(this._containerSizeClassName=r("containersize"),m.addClass(this._site.surface,this._containerSizeClassName));var d="."+p._containerClass,e="width:"+b+";height:"+c+";";t(this._containerSizeClassName,this._site,d,e)}},_ensureContainerSize:function(a){var b=this._sizes;if(b.containerSizeLoaded||this._ensuringContainerSize)return this._ensuringContainerSize?this._ensuringContainerSize:i.wrap();var c;if(this._itemInfo&&"function"==typeof this._itemInfo||!this._useDefaultItemInfo)c=this._getItemInfo();else{var d=b.containerMargins;c=i.wrap({width:a.groupInfo.cellWidth-d.left-d.right,height:a.groupInfo.cellHeight-d.top-d.bottom})}var e=this;return this._ensuringContainerSize=c.then(function(a){b.containerSizeLoaded=!0,b.containerWidth=a.width+b.itemBoxOuterWidth+b.containerOuterWidth,b.containerHeight=a.height+b.itemBoxOuterHeight+b.containerOuterHeight,e._inListMode?e._itemsPerBar=1:(e._itemsPerBar=Math.floor(b.maxItemsContainerContentSize/b.containerCrossSize),e.maximumRowsOrColumns&&(e._itemsPerBar=Math.min(e._itemsPerBar,e.maximumRowsOrColumns)),e._itemsPerBar=Math.max(1,e._itemsPerBar)),e._createContainerStyleRule()}),c.done(function(){e._ensuringContainerSize=null},function(){e._ensuringContainerSize=null}),c},_indexToCoordinate:function(a,b){b=b||this._itemsPerBar;var c=Math.floor(a/b);return this._horizontal?{column:c,row:a-c*b}:{row:c,column:a-c*b}},_rangeForGroup:function(a,b){var c=a.startIndex,d=c+a.count-1;return!b||b.firstIndex>d||b.lastIndex<c?null:{firstIndex:Math.max(0,b.firstIndex-c),lastIndex:Math.min(a.count-1,b.lastIndex-c)}},_syncDomWithGroupHeaderPosition:function(a){if(this._groupsEnabled&&this._oldGroupHeaderPosition!==this._groupHeaderPosition){var b,c=a.length;if(this._oldGroupHeaderPosition===U.top)if(m.removeClass(this._site.surface,p._headerPositionTopClass),this._horizontal)for(b=0;c>b;b++)a[b].header.style.maxWidth="",m.removeClass(a[b].itemsContainer.element,p._groupLeaderClass);else this._site.surface.style.msGridRows="";else if(this._oldGroupHeaderPosition===U.left){if(m.removeClass(this._site.surface,p._headerPositionLeftClass),!this._horizontal)for(b=0;c>b;b++)a[b].header.style.maxHeight="",m.removeClass(a[b].itemsContainer.element,p._groupLeaderClass);this._site.surface.style.msGridColumns=""}if(this._groupHeaderPosition===U.top){if(m.addClass(this._site.surface,p._headerPositionTopClass),this._horizontal)for(b=0;c>b;b++)m.addClass(a[b].itemsContainer.element,p._groupLeaderClass)}else if(m.addClass(this._site.surface,p._headerPositionLeftClass),!this._horizontal)for(b=0;c>b;b++)m.addClass(a[b].itemsContainer.element,p._groupLeaderClass);this._oldGroupHeaderPosition=this._groupHeaderPosition}},_layoutGroup:function(a){var b=this._groups[a],c=this._site.tree[a],d=c.header,e=c.itemsContainer.element,f=this._sizes,g=b.getItemsContainerCrossSize();if(this._groupsEnabled){if(this._horizontal)if(this._groupHeaderPosition===U.top){var h=f.headerContainerMinWidth-f.headerContainerOuterWidth,i=b.getItemsContainerSize()-f.headerContainerOuterWidth;d.style.maxWidth=Math.max(h,i)+"px",this._envInfo.supportsCSSGrid?(d.style.msGridColumn=a+1,e.style.msGridColumn=a+1):(d.style.height=f.headerContainerHeight-f.headerContainerOuterHeight+"px",e.style.height=g-f.itemsContainerOuterHeight+"px",e.style.marginBottom=f.itemsContainerMargins.bottom+(f.maxItemsContainerContentSize-g+f.itemsContainerOuterHeight)+"px"),m.addClass(e,p._groupLeaderClass)}else this._envInfo.supportsCSSGrid?(d.style.msGridColumn=2*a+1,e.style.msGridColumn=2*a+2):(d.style.width=f.headerContainerWidth-f.headerContainerOuterWidth+"px",d.style.height=g-f.headerContainerOuterHeight+"px",e.style.height=g-f.itemsContainerOuterHeight+"px");else if(this._groupHeaderPosition===U.left){var j=f.headerContainerMinHeight-f.headerContainerOuterHeight,k=b.getItemsContainerSize()-f.headerContainerOuterHeight;d.style.maxHeight=Math.max(j,k)+"px",this._envInfo.supportsCSSGrid?(d.style.msGridRow=a+1,e.style.msGridRow=a+1):(d.style.width=f.headerContainerWidth-f.headerContainerOuterWidth+"px",e.style.width=g-f.itemsContainerOuterWidth+"px",e.style["margin"+(this._site.rtl?"Left":"Right")]=f.itemsContainerMargins[this._site.rtl?"left":"right"]+(f.maxItemsContainerContentSize-g+f.itemsContainerOuterWidth)+"px"),m.addClass(e,p._groupLeaderClass)}else d.style.msGridRow=2*a+1,this._inListMode?d.style.height=f.headerContainerHeight-f.headerContainerOuterHeight+"px":this._envInfo.supportsCSSGrid?e.style.msGridRow=2*a+2:(d.style.height=f.headerContainerHeight-f.headerContainerOuterHeight+"px",d.style.width=g-f.headerContainerOuterWidth+"px",e.style.width=g-f.itemsContainerOuterWidth+"px");m.addClass(d,p._laidOutClass+" "+p._groupLeaderClass)}m.addClass(e,p._laidOutClass)}},{_barsPerItemsBlock:4})}),_LegacyLayout:c.Namespace._lazy(function(){return c.Class.derive(a._LayoutCommon,null,{disableBackdrop:{get:function(){return this._backdropDisabled||!1},set:function(a){if(m._deprecated(q.disableBackdropIsDeprecated),a=!!a,this._backdropDisabled!==a&&(this._backdropDisabled=a,this._disableBackdropClassName&&(u(this._disableBackdropClassName),this._site&&m.removeClass(this._site.surface,this._disableBackdropClassName),this._disableBackdropClassName=null),this._disableBackdropClassName=r("disablebackdrop"),this._site&&m.addClass(this._site.surface,this._disableBackdropClassName),a)){var b=".win-container.win-backdrop",c="background-color:transparent;";t(this._disableBackdropClassName,this._site,b,c)}}},backdropColor:{get:function(){return this._backdropColor||"rgba(155,155,155,0.23)"},set:function(a){if(m._deprecated(q.backdropColorIsDeprecated),a&&this._backdropColor!==a){this._backdropColor=a,this._backdropColorClassName&&(u(this._backdropColorClassName),this._site&&m.removeClass(this._site.surface,this._backdropColorClassName),this._backdropColorClassName=null),this._backdropColorClassName=r("backdropcolor"),this._site&&m.addClass(this._site.surface,this._backdropColorClassName);var b=".win-container.win-backdrop",c="background-color:"+a+";";t(this._backdropColorClassName,this._site,b,c)}}}})}),GridLayout:c.Namespace._lazy(function(){return c.Class.derive(a._LegacyLayout,function(a){a=a||{},this.itemInfo=a.itemInfo,this.groupInfo=a.groupInfo,this._maxRowsOrColumns=0,this._useDefaultItemInfo=!0,this._elementsToMeasure={},this._groupHeaderPosition=a.groupHeaderPosition||U.top,this.orientation=a.orientation||"horizontal",a.maxRows&&(this.maxRows=+a.maxRows),a.maximumRowsOrColumns&&(this.maximumRowsOrColumns=+a.maximumRowsOrColumns)},{maximumRowsOrColumns:{get:function(){return this._maxRowsOrColumns},set:function(a){this._setMaxRowsOrColumns(a)}},maxRows:{get:function(){return this.maximumRowsOrColumns},set:function(a){m._deprecated(q.maxRowsIsDeprecated),this.maximumRowsOrColumns=a}},itemInfo:{enumerable:!0,get:function(){return this._itemInfo},set:function(a){a&&m._deprecated(q.itemInfoIsDeprecated),this._itemInfo=a,this._invalidateLayout()}},groupInfo:{enumerable:!0,get:function(){return this._groupInfo},set:function(a){a&&m._deprecated(q.groupInfoIsDeprecated),this._groupInfo=a,this._invalidateLayout()}}})})});var T=c.Namespace.defineWithParent(null,null,{UniformGroupBase:c.Namespace._lazy(function(){return c.Class.define(null,{cleanUp:function(){},itemFromOffset:function(a,b){b=b||{};var c=this._layout._sizes;a-=c.itemsContainerOuterStart,b.wholeItem&&(a+=(b.last?-1:1)*(c.containerSize-1));var d=this.count-1,e=Math.floor(d/this._layout._itemsPerBar),f=v(0,e,Math.floor(a/c.containerSize)),g=(f+b.last)*this._layout._itemsPerBar-b.last;return v(0,this.count-1,g)},hitTest:function(a,b){var c=this._layout._horizontal,d=this._layout._itemsPerBar,e=this._layout._inListMode||1===d,f=c?a:b,g=c?b:a,h=this._layout._sizes;f-=h.itemsContainerOuterStart,g-=h.itemsContainerOuterCrossStart;var i,j=Math.floor(f/h.containerSize),k=v(0,d-1,Math.floor(g/h.containerCrossSize)),l=Math.max(-1,j*d+k);if(i=!c&&e||c&&!e?(b-h.containerHeight/2)/h.containerHeight:(a-h.containerWidth/2)/h.containerWidth,e)return i=Math.floor(i),
-{index:l,insertAfterIndex:i>=0&&l>=0?i:-1};i=v(-1,d-1,i);var m;return m=0>i?j*d-1:j*d+Math.floor(i),{index:v(-1,this.count-1,l),insertAfterIndex:v(-1,this.count-1,m)}},getAdjacent:function(a,b){var c,d=a.index,e=Math.floor(d/this._layout._itemsPerBar),f=d%this._layout._itemsPerBar;switch(b){case H.upArrow:c=0===f?"boundary":d-1;break;case H.downArrow:var g=d===this.count-1,h=this._layout._itemsPerBar>1&&f===this._layout._itemsPerBar-1;c=g||h?"boundary":d+1;break;case H.leftArrow:c=0===e&&this._layout._itemsPerBar>1?"boundary":d-this._layout._itemsPerBar;break;case H.rightArrow:var i=this.count-1,j=Math.floor(i/this._layout._itemsPerBar);c=e===j?"boundary":Math.min(d+this._layout._itemsPerBar,this.count-1)}return"boundary"===c?c:{type:o.ObjectType.item,index:c}},getItemsContainerSize:function(){var a=this._layout._sizes,b=Math.ceil(this.count/this._layout._itemsPerBar);return b*a.containerSize+a.itemsContainerOuterSize},getItemsContainerCrossSize:function(){var a=this._layout._sizes;return this._layout._itemsPerBar*a.containerCrossSize+a.itemsContainerOuterCrossSize},getItemPositionForAnimations:function(a){var b=this._layout._sizes,c=this._layout._site.rtl?"right":"left",d=this._layout._sizes.containerMargins,e=this._layout._indexToCoordinate(a),f={row:e.row,column:e.column,top:d.top+e.row*b.containerHeight,left:d[c]+e.column*b.containerWidth,height:b.containerHeight-b.containerMargins.top-b.containerMargins.bottom,width:b.containerWidth-b.containerMargins.left-b.containerMargins.right};return f}})}),UniformGroup:c.Namespace._lazy(function(){return c.Class.derive(T.UniformGroupBase,function(a,b){this._layout=a,this._itemsContainer=b,m.addClass(this._itemsContainer,a._inListMode?p._uniformListLayoutClass:p._uniformGridLayoutClass)},{cleanUp:function(a){a||(m.removeClass(this._itemsContainer,p._uniformGridLayoutClass),m.removeClass(this._itemsContainer,p._uniformListLayoutClass),this._itemsContainer.style.height=this._itemsContainer.style.width=""),this._itemsContainer=null,this._layout=null,this.groupInfo=null,this.startIndex=null,this.offset=null,this.count=null},prepareLayout:function(a,b,c,d){return this.groupInfo=d.groupInfo,this.startIndex=d.startIndex,this.count=a,this._layout._ensureContainerSize(this)},layoutRealizedRange:function(){var a=this._layout._sizes;this._itemsContainer.style[this._layout._horizontal?"width":"height"]=this.getItemsContainerSize()-a.itemsContainerOuterSize+"px",this._itemsContainer.style[this._layout._horizontal?"height":"width"]=this._layout._inListMode?a.maxItemsContainerContentSize+"px":this._layout._itemsPerBar*a.containerCrossSize+"px"},layoutUnrealizedRange:function(){return i.wrap()}})}),UniformFlowGroup:c.Namespace._lazy(function(){return c.Class.derive(T.UniformGroupBase,function(a,b){this._layout=a,this._itemsContainer=b.element,m.addClass(this._itemsContainer,a._inListMode?p._uniformListLayoutClass:p._uniformGridLayoutClass)},{cleanUp:function(a){a||(m.removeClass(this._itemsContainer,p._uniformListLayoutClass),m.removeClass(this._itemsContainer,p._uniformGridLayoutClass),this._itemsContainer.style.height="")},layout:function(){this._layout._site._writeProfilerMark("Layout:_UniformFlowGroup:setItemsContainerHeight,info"),this._itemsContainer.style.height=this.count*this._layout._sizes.containerHeight+"px"}})}),CellSpanningGroup:c.Namespace._lazy(function(){return c.Class.define(function(a,b){this._layout=a,this._itemsContainer=b,m.addClass(this._itemsContainer,p._cellSpanningGridLayoutClass),this.resetMap()},{cleanUp:function(a){a||(this._cleanContainers(),m.removeClass(this._itemsContainer,p._cellSpanningGridLayoutClass),this._itemsContainer.style.cssText=""),this._itemsContainer=null,this._layoutPromise&&(this._layoutPromise.cancel(),this._layoutPromise=null),this.resetMap(),this._slotsPerColumn=null,this._offScreenSlotsPerColumn=null,this._items=null,this._layout=null,this._containersToHide=null,this.groupInfo=null,this.startIndex=null,this.offset=null,this.count=null},prepareLayoutWithCopyOfTree:function(a,b,c,d){var e,f=this;if(this._containersToHide={},b)for(e=b.firstIndex;e<=b.lastIndex;e++)this._containersToHide[I(c._items[e])]=c._items[e];this.groupInfo=d.groupInfo,this.startIndex=d.startIndex,this.count=a.items.length,this._items=a.items,this._slotsPerColumn=Math.floor(this._layout._sizes.maxItemsContainerContentSize/this.groupInfo.cellHeight),this._layout.maximumRowsOrColumns&&(this._slotsPerColumn=Math.min(this._slotsPerColumn,this._layout.maximumRowsOrColumns)),this._slotsPerColumn=Math.max(this._slotsPerColumn,1),this.resetMap();var g=new Array(this.count);for(e=0;e<this.count;e++)g[e]=this._layout._getItemInfo(this.startIndex+e);return i.join(g).then(function(a){a.forEach(function(a,b){f.addItemToMap(b,a)})})},layoutRealizedRange:function(a,b){if(b){var c,d=Math.max(a,b.firstIndex);for(c=d;c<=b.lastIndex;c++)this._layoutItem(c),delete this._containersToHide[I(this._items[c])]}Object.keys(this._containersToHide).forEach(function(a){m.removeClass(this._containersToHide[a],p._laidOutClass)}.bind(this)),this._containersToHide={},this._itemsContainer.style.cssText+=";width:"+(this.getItemsContainerSize()-this._layout._sizes.itemsContainerOuterSize)+"px;height:"+this._layout._sizes.maxItemsContainerContentSize+"px;-ms-grid-columns: ("+this.groupInfo.cellWidth+"px)["+this.getColumnCount()+"];-ms-grid-rows: ("+this.groupInfo.cellHeight+"px)["+(this._slotsPerColumn+this._offScreenSlotsPerColumn)+"]"},layoutUnrealizedRange:function(a,b,c){var d,e=this;return e._layoutPromise=new i(function(f){function g(){d=null,f()}function h(a){return j.schedule(a,j.Priority.normal,null,"WinJS.UI.GridLayout.CellSpanningGroup.LayoutUnrealizedRange")}if(b){var i=!1,k=b.firstIndex-1,l=Math.max(a,b.lastIndex+1);l=Math.max(k+1,l),d=h(function n(b){for(;!i;){if(b.shouldYield)return void b.setWork(n);i=!0,k>=a&&(e._layoutItem(k),k--,i=!1),l<e.count&&(e._layoutItem(l),l++,i=!1)}g()})}else if(c){var m=e.count-1;d=h(function o(b){for(;m>=a;m--){if(b.shouldYield)return void b.setWork(o);e._layoutItem(m)}g()})}else{var m=a;d=h(function p(a){for(;m<e.count;m++){if(a.shouldYield)return void a.setWork(p);e._layoutItem(m)}g()})}},function(){d&&d.cancel(),d=null}),e._layoutPromise},itemFromOffset:function(a,b){b=b||{};var c=this._layout._sizes,d=c.containerMargins;a-=c.itemsContainerOuterX,a-=(b.last?1:-1)*d[b.last?"left":"right"];var e=this.indexFromOffset(a,b.wholeItem,b.last).item;return v(0,this.count-1,e)},getAdjacent:function(a,b){var c,d;c=d=a.index;var e,f,g;g=this.lastAdjacent===c?this.lastInMapIndex:this.findItem(c);do{var h=Math.floor(g/this._slotsPerColumn),i=g-h*this._slotsPerColumn,j=Math.floor((this.occupancyMap.length-1)/this._slotsPerColumn);switch(b){case H.upArrow:if(!(i>0))return{type:o.ObjectType.item,index:d};g--;break;case H.downArrow:if(!(i+1<this._slotsPerColumn))return{type:o.ObjectType.item,index:d};g++;break;case H.leftArrow:g=h>0?g-this._slotsPerColumn:-1;break;case H.rightArrow:g=j>h?g+this._slotsPerColumn:this.occupancyMap.length}f=g>=0&&g<this.occupancyMap.length,f&&(e=this.occupancyMap[g]?this.occupancyMap[g].index:void 0)}while(f&&(c===e||void 0===e));return this.lastAdjacent=e,this.lastInMapIndex=g,f?{type:o.ObjectType.item,index:e}:"boundary"},hitTest:function(a,b){var c=this._layout._sizes,d=0;if(a-=c.itemsContainerOuterX,b-=c.itemsContainerOuterY,this.occupancyMap.length>0){for(var e=this.indexFromOffset(a,!1,0),f=Math.min(this._slotsPerColumn-1,Math.floor(b/this.groupInfo.cellHeight)),g=e.index,h=g;f-- >0;)g++,this.occupancyMap[g]&&(h=g);this.occupancyMap[h]||h--,d=this.occupancyMap[h].index}var i=this.getItemSize(d),j=i.column*this.groupInfo.cellWidth,k=i.row*this.groupInfo.cellHeight,l=1===this._slotsPerColumn,m=d;return(l&&a<j+i.contentWidth/2||!l&&b<k+i.contentHeight/2)&&m--,{type:o.ObjectType.item,index:v(0,this.count-1,d),insertAfterIndex:v(-1,this.count-1,m)}},getItemsContainerSize:function(){var a=this._layout._sizes;return this.getColumnCount()*this.groupInfo.cellWidth+a.itemsContainerOuterSize},getItemsContainerCrossSize:function(){var a=this._layout._sizes;return a.maxItemsContainerContentSize+a.itemsContainerOuterCrossSize},getItemPositionForAnimations:function(a){var b=this._layout._site.rtl?"right":"left",c=this._layout._sizes.containerMargins,d=this.getItemSize(a),e=this.groupInfo,f={row:d.row,column:d.column,top:c.top+d.row*e.cellHeight,left:c[b]+d.column*e.cellWidth,height:d.contentHeight,width:d.contentWidth};return f},_layoutItem:function(a){var b=this.getItemSize(a);return this._items[a].style.cssText+=";-ms-grid-row:"+(b.row+1)+";-ms-grid-column:"+(b.column+1)+";-ms-grid-row-span:"+b.rows+";-ms-grid-column-span:"+b.columns+";height:"+b.contentHeight+"px;width:"+b.contentWidth+"px",m.addClass(this._items[a],p._laidOutClass),this._items[a]},_cleanContainers:function(){var a,b=this._items,c=b.length;for(a=0;c>a;a++)b[a].style.cssText="",m.removeClass(b[a],p._laidOutClass)},getColumnCount:function(){return Math.ceil(this.occupancyMap.length/this._slotsPerColumn)},getOccupancyMapItemCount:function(){var a=-1;return this.occupancyMap.forEach(function(b){b.index>a&&(a=b.index)}),a+1},coordinateToIndex:function(a,b){return a*this._slotsPerColumn+b},markSlotAsFull:function(a,b){for(var c=this._layout._indexToCoordinate(a,this._slotsPerColumn),d=c.row+b.rows,e=c.row;d>e&&e<this._slotsPerColumn;e++)for(var f=c.column,g=c.column+b.columns;g>f;f++)this.occupancyMap[this.coordinateToIndex(f,e)]=b;this._offScreenSlotsPerColumn=Math.max(this._offScreenSlotsPerColumn,d-this._slotsPerColumn)},isSlotEmpty:function(a,b,c){for(var d=b,e=b+a.rows;e>d;d++)for(var f=c,g=c+a.columns;g>f;f++)if(d>=this._slotsPerColumn||void 0!==this.occupancyMap[this.coordinateToIndex(f,d)])return!1;return!0},findEmptySlot:function(a,b,c){var d=this._layout._indexToCoordinate(a,this._slotsPerColumn),e=d.row,f=Math.floor((this.occupancyMap.length-1)/this._slotsPerColumn);if(c){for(var g=d.column+1;f>=g;g++)if(this.isSlotEmpty(b,0,g))return this.coordinateToIndex(g,0)}else for(var g=d.column;f>=g;g++){for(var h=e;h<this._slotsPerColumn;h++)if(this.isSlotEmpty(b,h,g))return this.coordinateToIndex(g,h);e=0}return(f+1)*this._slotsPerColumn},findItem:function(a){for(var b=a,c=this.occupancyMap.length;c>b;b++){var d=this.occupancyMap[b];if(d&&d.index===a)return b}return b},getItemSize:function(a){var b=this.findItem(a),c=this.occupancyMap[b],d=this._layout._indexToCoordinate(b,this._slotsPerColumn);return a===c.index?{row:d.row,column:d.column,contentWidth:c.contentWidth,contentHeight:c.contentHeight,columns:c.columns,rows:c.rows}:null},resetMap:function(){this.occupancyMap=[],this.lastAdded=0,this._offScreenSlotsPerColumn=0},addItemToMap:function(a,b){function c(a,b){var c=d.findEmptySlot(d.lastAdded,a,b);d.lastAdded=c,d.markSlotAsFull(c,a)}var d=this,e=d.groupInfo,f=d._layout._sizes.containerMargins,g={index:a,contentWidth:b.width,contentHeight:b.height,columns:Math.max(1,Math.ceil((b.width+f.left+f.right)/e.cellWidth)),rows:Math.max(1,Math.ceil((b.height+f.top+f.bottom)/e.cellHeight))};c(g,b.newColumn)},indexFromOffset:function(a,b,c){var d=0,e=0,f=this.groupInfo,g=0;if(this.occupancyMap.length>0){if(e=this.getOccupancyMapItemCount()-1,d=Math.ceil((this.occupancyMap.length-1)/this._slotsPerColumn)*f.cellWidth,d>a){for(var h=this._slotsPerColumn,g=(Math.max(0,Math.floor(a/f.cellWidth))+c)*this._slotsPerColumn-c;!this.occupancyMap[g]&&h-- >0;)g+=c>0?-1:1;return{index:g,item:this.occupancyMap[g].index}}g=this.occupancyMap.length-1}return{index:g,item:e+(Math.max(0,Math.floor((a-d)/f.cellWidth))+c)*this._slotsPerColumn-c}}})})});c.Namespace._moduleDefine(a,"WinJS.UI",{ListLayout:c.Namespace._lazy(function(){return c.Class.derive(a._LegacyLayout,function(a){a=a||{},this._itemInfo={},this._groupInfo={},this._groupHeaderPosition=a.groupHeaderPosition||U.top,this._inListMode=!0,this.orientation=a.orientation||"vertical"},{initialize:function(b,c){m.addClass(b.surface,p._listLayoutClass),a._LegacyLayout.prototype.initialize.call(this,b,c)},uninitialize:function(){this._site&&m.removeClass(this._site.surface,p._listLayoutClass),a._LegacyLayout.prototype.uninitialize.call(this)},layout:function(b,c,d,e){return this._groupsEnabled||this._horizontal?a._LegacyLayout.prototype.layout.call(this,b,c,d,e):this._layoutNonGroupedVerticalList(b,c,d,e)},_layoutNonGroupedVerticalList:function(a,b,c,d){var e=this,f="Layout:_layoutNonGroupedVerticalList";return e._site._writeProfilerMark(f+",StartTM"),this._layoutPromise=e._measureItem(0).then(function(){m[e._usingStructuralNodes?"addClass":"removeClass"](e._site.surface,p._structuralNodesClass),m[e._envInfo.nestedFlexTooLarge||e._envInfo.nestedFlexTooSmall?"addClass":"removeClass"](e._site.surface,p._singleItemsBlockClass),e._sizes.viewportContentSize!==e._getViewportCrossSize()&&e._viewportSizeChanged(e._getViewportCrossSize()),e._cacheRemovedElements(c,e._cachedItemRecords,e._cachedInsertedItemRecords,e._cachedRemovedItems,!1),e._cacheRemovedElements(d,e._cachedHeaderRecords,e._cachedInsertedHeaderRecords,e._cachedRemovedHeaders,!0);var b=a[0].itemsContainer,g=new T.UniformFlowGroup(e,b);e._groups=[g],g.groupInfo={enableCellSpanning:!1},g.startIndex=0,g.count=D(b),g.offset=0,g.layout(),e._site._writeProfilerMark(f+":setSurfaceWidth,info"),e._site.surface.style.width=e._sizes.surfaceContentSize+"px",e._layoutAnimations(c,d),e._site._writeProfilerMark(f+":complete,info"),e._site._writeProfilerMark(f+",StopTM")},function(a){return e._site._writeProfilerMark(f+":canceled,info"),e._site._writeProfilerMark(f+",StopTM"),i.wrapError(a)}),{realizedRangeComplete:this._layoutPromise,layoutComplete:this._layoutPromise}},numberOfItemsPerItemsBlock:{get:function(){var b=this;return this._measureItem(0).then(function(){return b._envInfo.nestedFlexTooLarge||b._envInfo.nestedFlexTooSmall?(b._usingStructuralNodes=!0,Number.MAX_VALUE):(b._usingStructuralNodes=a.ListLayout._numberOfItemsPerItemsBlock>0,a.ListLayout._numberOfItemsPerItemsBlock)})}}},{_numberOfItemsPerItemsBlock:10})}),CellSpanningLayout:c.Namespace._lazy(function(){return c.Class.derive(a._LayoutCommon,function(a){a=a||{},this._itemInfo=a.itemInfo,this._groupInfo=a.groupInfo,this._groupHeaderPosition=a.groupHeaderPosition||U.top,this._horizontal=!0,this._cellSpanning=!0},{maximumRowsOrColumns:{get:function(){return this._maxRowsOrColumns},set:function(a){this._setMaxRowsOrColumns(a)}},itemInfo:{enumerable:!0,get:function(){return this._itemInfo},set:function(a){this._itemInfo=a,this._invalidateLayout()}},groupInfo:{enumerable:!0,get:function(){return this._groupInfo},set:function(a){this._groupInfo=a,this._invalidateLayout()}},orientation:{enumerable:!0,get:function(){return"horizontal"}}})}),_LayoutWrapper:c.Namespace._lazy(function(){return c.Class.define(function(a){this.defaultAnimations=!0,this.initialize=function(b,c){a.initialize(b,c)},this.hitTest=function(b,c){return a.hitTest(b,c)},a.uninitialize&&(this.uninitialize=function(){a.uninitialize()}),"numberOfItemsPerItemsBlock"in a&&Object.defineProperty(this,"numberOfItemsPerItemsBlock",{get:function(){return a.numberOfItemsPerItemsBlock}}),a._getItemPosition&&(this._getItemPosition=function(b){return a._getItemPosition(b)}),a.itemsFromRange&&(this.itemsFromRange=function(b,c){return a.itemsFromRange(b,c)}),a.getAdjacent&&(this.getAdjacent=function(b,c){return a.getAdjacent(b,c)}),a.dragOver&&(this.dragOver=function(b,c,d){return a.dragOver(b,c,d)}),a.dragLeave&&(this.dragLeave=function(){return a.dragLeave()});var b={enumerable:!0,get:function(){return"vertical"}};if(void 0!==a.orientation&&(b.get=function(){return a.orientation},b.set=function(b){a.orientation=b}),Object.defineProperty(this,"orientation",b),(a.setupAnimations||a.executeAnimations)&&(this.defaultAnimations=!1,this.setupAnimations=function(){return a.setupAnimations()},this.executeAnimations=function(){return a.executeAnimations()}),a.layout)if(this.defaultAnimations){var c=this;this.layout=function(b,d,e,f){var g,h=F(a.layout(b,d,[],[]));return h.realizedRangeComplete.then(function(){g=!0}),g&&c._layoutAnimations(e,f),h}}else this.layout=function(b,c,d,e){return F(a.layout(b,c,d,e))}},{uninitialize:function(){},numberOfItemsPerItemsBlock:{get:function(){}},layout:function(a,b,c,d){return this.defaultAnimations&&this._layoutAnimations(c,d),F()},itemsFromRange:function(){return{firstIndex:0,lastIndex:Number.MAX_VALUE}},getAdjacent:function(a,b){switch(b){case H.pageUp:case H.upArrow:case H.leftArrow:return{type:a.type,index:a.index-1};case H.downArrow:case H.rightArrow:case H.pageDown:return{type:a.type,index:a.index+1}}},dragOver:function(){},dragLeave:function(){},setupAnimations:function(){},executeAnimations:function(){},_getItemPosition:function(){},_layoutAnimations:function(){}})})});var U={left:"left",top:"top"};c.Namespace._moduleDefine(a,"WinJS.UI",{HeaderPosition:U,_getMargins:G})}),d("WinJS/Controls/ListView/_VirtualizeContentsView",["exports","../../Core/_Global","../../Core/_Base","../../Core/_BaseUtils","../../Promise","../../_Signal","../../Scheduler","../../Utilities/_Dispose","../../Utilities/_ElementUtilities","../../Utilities/_SafeHtml","../../Utilities/_UI","../ItemContainer/_Constants","../ItemContainer/_ItemEventsHandler","./_Helpers","./_ItemsContainer"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){"use strict";function p(a,b){i._setAttribute(a,"aria-flowto",b.id),i._setAttribute(b,"x-ms-aria-flowfrom",a.id)}c.Namespace._moduleDefine(a,"WinJS.UI",{_VirtualizeContentsView:c.Namespace._lazy(function(){function a(b){for(var c,d=b.job._workItems;d.length&&!b.shouldYield;)(c=d.shift())();b.setWork(a),d.length||b.job.pause()}function q(b,c){var d=g.schedule(a,b,null,c);return d._workItems=[],d.addWork=function(a,b){b?this._workItems.unshift(a):this._workItems.push(a),this.resume()},d.clearWork=function(){this._workItems.length=0},d.dispose=function(){this.cancel(),this._workItems.length=0},d}function r(a){return a._zooming||a._pinching}function s(a,b){return a._isZombie()?e.wrap():r(a)?(+b!==b&&(b=v._waitForSeZoTimeoutDuration),e.timeout(v._waitForSeZoIntervalDuration).then(function(){return b-=v._waitForSeZoIntervalDuration,0>=b?!0:s(a,b)})):e.wrap()}function t(a){if("number"==typeof a){var b=a;a=function(){return{position:b,direction:"right"}}}return a}function u(){}var v=c.Class.define(function(a){this._listView=a,this._forceRelayout=!1,this.maxLeadingPages=d._isiOS?v._iOSMaxLeadingPages:v._defaultPagesToPrefetch,this.maxTrailingPages=d._isiOS?v._iOSMaxTrailingPages:v._defaultPagesToPrefetch,this.items=new o._ItemsContainer(a),this.firstIndexDisplayed=-1,this.lastIndexDisplayed=-1,this.begin=0,this.end=0,this._realizePass=1,this._firstLayoutPass=!0,this._runningAnimations=null,this._renderCompletePromise=e.wrap(),this._state=new w(this),this._createLayoutSignal(),this._createTreeBuildingSignal(),this._layoutWork=null,this._onscreenJob=q(g.Priority.aboveNormal,"on-screen items"),this._frontOffscreenJob=q(g.Priority.normal,"front off-screen items"),this._backOffscreenJob=q(g.Priority.belowNormal,"back off-screen items"),this._scrollbarPos=0,this._direction="right",this._scrollToFunctor=t(0)},{_dispose:function(){this.cleanUp(),this.items=null,this._renderCompletePromise&&this._renderCompletePromise.cancel(),this._renderCompletePromise=null,this._onscreenJob.dispose(),this._frontOffscreenJob.dispose(),this._backOffscreenJob.dispose()},_createItem:function(a,b,c,d){this._listView._writeProfilerMark("createItem("+a+") "+this._getBoundingRectString(a)+",info");var f=this;f._listView._itemsManager._itemFromItemPromiseThrottled(b).done(function(b){b?c(a,b,f._listView._itemsManager._recordFromElement(b)):d(a)},function(b){return d(a),e.wrapError(b)})},_addItem:function(a,b,c,d){if(this._realizePass===d){var e=this._listView._itemsManager._recordFromElement(c);delete this._pendingItemPromises[e.itemPromise.handle],this.items.setItemAt(b,{itemBox:null,container:null,element:c,detached:!0,itemsManagerRecord:e})}},lastItemIndex:function(){return this.containers?this.containers.length-1:-1},_setSkipRealizationForChange:function(a){a?this._realizationLevel!==v._realizationLevel.realize&&(this._realizationLevel=v._realizationLevel.skip):this._realizationLevel=v._realizationLevel.realize},_realizeItems:function(a,b,c,d,h,j,k,n,o,p){function q(a,b){C.push(e._cancelBlocker(b.renderComplete)),u(a)}function r(a,b){function c(a,b){a.updatedDraggableAttribute||!G._listView.itemsDraggable&&!G._listView.itemsReorderable||a.itemsManagerRecord.renderComplete.done(function(){G._realizePass===h&&(i.hasClass(b,l._nonDraggableClass)||(a.itemBox.draggable=!0),a.updatedDraggableAttribute=!0)})}if(G._listView._writeProfilerMark("_realizeItems_appendedItemsToDom,StartTM"),!G._listView._isZombie()){var d,e=0,f=-1,g=-1;for(d=a;b>=d;d++){var j=G.items.itemDataAt(d);if(j){var n=j.element,o=j.itemBox;o||(o=G._listView._itemBoxTemplate.cloneNode(!0),j.itemBox=o,o.appendChild(n),i.addClass(n,l._itemClass),G._listView._setupAriaSelectionObserver(n),G._listView._isSelected(d)&&m._ItemEventsHandler.renderSelection(o,n,!0,!0),G._listView._currentMode().renderDragSourceOnRealizedItem(d,o)),c(j,n);var p=G.getContainer(d);o.parentNode!==p&&(j.container=p,G._appendAndRestoreFocus(p,o),e++,0>f&&(f=d),g=d,G._listView._isSelected(d)&&i.addClass(p,l._selectedClass),i.removeClass(p,l._backdropClass),G.items.elementAvailable(d))}}G._listView._writeProfilerMark("_realizeItems_appendedItemsToDom,StopTM"),e>0&&(G._listView._writeProfilerMark("_realizeItems_appendedItemsToDom:"+e+" ("+f+"-"+g+"),info"),G._reportElementsLevel(k))}}function s(a,b,c,d){function e(a,b){var c=G.items.itemDataAt(a);if(c){var d=c.itemBox;return d&&d.parentNode?b?(i.addClass(d.parentNode,l._backdropClass),d.parentNode.removeChild(d),!0):!1:!0}return!0}if(!p){for(var f=!1;a>=c;)f=e(a,f),a--;for(f=!1;d>=b;)f=e(b,f),b++}}function t(a,b,c,d,f){function g(a){var b=G.items.itemDataAt(a);if(b){var d=b.itemsManagerRecord;d.readyComplete||G._realizePass!==h||c.addWork(function(){G._listView._isZombie()||d.pendingReady&&G._realizePass===h&&(G._listView._writeProfilerMark("pendingReady("+a+"),info"),d.pendingReady())},f)}}for(var i=[],j=a;b>=j;j++){var k=G.items.itemDataAt(j);k&&i.push(k.itemsManagerRecord.itemPromise)}e.join(i).then(function(){if("right"===d)for(var c=a;b>=c;c++)g(c);else for(var c=b;c>=a;c--)g(c)})}function u(a){if(G._realizePass===h){if(a>=n&&o>=a){if(0===--z){if(r(n,o),s(n,o,b,c),G._firstLayoutPass){t(n,o,G._frontOffscreenJob,"right"===k?"left":"right",!0);var d=g.schedulePromiseHigh(null,"WinJS.UI.ListView.entranceAnimation").then(function(){if(!G._listView._isZombie()){G._listView._writeProfilerMark("entranceAnimation,StartTM");var a=G._listView._animateListEntrance(!G._firstEntranceAnimated);return G._firstEntranceAnimated=!0,a}});G._runningAnimations=e.join([G._runningAnimations,d]),G._runningAnimations.done(function(){G._listView._writeProfilerMark("entranceAnimation,StopTM"),G._realizePass===h&&(G._runningAnimations=null,D.complete())}),G._firstLayoutPass=!1,G._listView._isCurrentZoomView&&g.requestDrain(G._onscreenJob.priority)}else t(n,o,G._frontOffscreenJob,k),D.complete();G._updateHeaders(G._listView._canvas,n,o+1).done(function(){E.complete()})}}else n>a?(--B,B%y===0&&r(b,n-1),B||(G._updateHeaders(G._listView._canvas,b,n).done(function(){"right"!==k&&F.complete()}),t(b,n-1,"right"!==k?G._frontOffscreenJob:G._backOffscreenJob,"left"))):a>o&&(--A,A%y===0&&r(o+1,c-1),A||(G._updateHeaders(G._listView._canvas,o+1,c).then(function(){"right"===k&&F.complete()}),t(o+1,c-1,"right"===k?G._frontOffscreenJob:G._backOffscreenJob,"right")));x--,0===x&&(G._renderCompletePromise=e.join(C).then(null,function(a){var b=Array.isArray(a)&&a.some(function(a){return a&&!(a instanceof Error&&"Canceled"===a.name)});return b?e.wrapError(a):void 0}),(G._headerRenderPromises||e.wrap()).done(function(){g.schedule(function(){G._listView._isZombie()?L.cancel():L.complete()},Math.min(G._onscreenJob.priority,G._backOffscreenJob.priority),null,"WinJS.UI.ListView._allItemsRealized")}))}}function v(b,c,d){if(G._realizePass===h){var c=d.element;G._addItem(a,b,c,h),q(b,d)}}var w="_realizeItems("+b+"-"+(c-1)+") visible("+n+"-"+o+")";this._listView._writeProfilerMark(w+",StartTM"),k=k||"right";var x=c-b,y=o-n+1,z=y,A=c-o-1,B=n-b,C=[],D=new f,E=new f,F=new f,G=this;if(x>0){var H=0,I=0,J=0;G.firstIndexDisplayed=n,G.lastIndexDisplayed=o;var K=G._listView._isCurrentZoomView;G._highPriorityRealize&&(G._firstLayoutPass||G._hasAnimationInViewportPending)?(G._highPriorityRealize=!1,G._onscreenJob.priority=g.Priority.high,G._frontOffscreenJob.priority=g.Priority.normal,G._backOffscreenJob.priority=g.Priority.belowNormal):G._highPriorityRealize?(G._highPriorityRealize=!1,G._onscreenJob.priority=g.Priority.high,G._frontOffscreenJob.priority=g.Priority.high-1,G._backOffscreenJob.priority=g.Priority.high-1):K?(G._onscreenJob.priority=g.Priority.aboveNormal,G._frontOffscreenJob.priority=g.Priority.normal,G._backOffscreenJob.priority=g.Priority.belowNormal):(G._onscreenJob.priority=g.Priority.belowNormal,G._frontOffscreenJob.priority=g.Priority.idle,G._backOffscreenJob.priority=g.Priority.idle);var L=new f,M=G._listView._versionManager.cancelOnNotification(L.promise),N=function(a,b){b.startStage1&&b.stage0.then(function(){G._realizePass===h&&b.startStage1&&a.addWork(b.startStage1)})},O=function(a,b){var c=G.items.itemDataAt(b);if(!c){var d=G._listView._itemsManager._itemPromiseAtIndex(b);G._pendingItemPromises[d.handle]=d,delete G._previousRealizationPendingItemPromises[d.handle],a.addWork(function(){if(!G._listView._isZombie()&&(H++,G._createItem(b,d,v,u),!G._listView._isZombie()&&G._realizePass===h&&d.handle)){var c=G._listView._itemsManager._recordFromHandle(d.handle);N(a,c)}})}},P=function(a,b,c){for(var d=b;c>=d;d++)O(a,d)},Q=function(a,b,c){for(var d=c;d>=b;d--)O(a,d)},R=function(a,b,c){for(var d=b;c>=d;d++){var e=G.items.itemDataAt(d);if(e){var f=e.itemsManagerRecord;q(d,f),I++,N(a,f)}}};this._previousRealizationPendingItemPromises=this._pendingItemPromises||{},this._pendingItemPromises={};var S;"left"===k?(Q(G._onscreenJob,n,o),Q(G._frontOffscreenJob,b,n-1),S=b>n-1):(P(G._onscreenJob,n,o),P(G._frontOffscreenJob,o+1,c-1),S=o+1>c-1);for(var T=0,U=Object.keys(this._previousRealizationPendingItemPromises),V=U.length;V>T;T++){var W=U[T];G._listView._itemsManager.releaseItemPromise(this._previousRealizationPendingItemPromises[W])}this._previousRealizationPendingItemPromises={},R(G._onscreenJob,n,o),"left"===k?R(G._frontOffscreenJob,b,n-1):R(G._frontOffscreenJob,o+1,c-1);var X=z===o-n+1;return G._firstLayoutPass?G._listView._canvas.style.opacity=0:X?G._listView._showProgressBar(G._listView._element,"50%","50%"):G._listView._hideProgressBar(),G._frontOffscreenJob.pause(),G._backOffscreenJob.pause(),E.promise.done(function(){G._frontOffscreenJob.resume(),S&&F.complete()},function(){L.cancel()}),F.promise.done(function(){G._listView._writeProfilerMark("frontItemsRealized,info"),"left"===k?(P(G._backOffscreenJob,o+1,c-1),R(G._backOffscreenJob,o+1,c-1)):(Q(G._backOffscreenJob,b,n-1),R(G._backOffscreenJob,b,n-1)),G._backOffscreenJob.resume()}),L.promise.done(function(){G._listView._versionManager.clearCancelOnNotification(M),G._listView._writeProfilerMark(w+" complete(created:"+H+" updated:"+I+"),info")},function(a){return G._listView._versionManager.clearCancelOnNotification(M),G._onscreenJob.clearWork(),G._frontOffscreenJob.clearWork(),G._backOffscreenJob.clearWork(),D.cancel(),E.cancel(),G._listView._writeProfilerMark(w+" canceled(created:"+H+" updated:"+I+" clean:"+J+"),info"),e.wrapError(a)}),G._listView._writeProfilerMark(w+",StopTM"),{viewportItemsRealized:E.promise,allItemsRealized:L.promise,loadingCompleted:e.join([L.promise,D.promise]).then(function(){for(var a=[],d=b;c>d;d++){var f=G.items.itemDataAt(d);f&&a.push(f.itemsManagerRecord.itemReadyPromise)}return e._cancelBlocker(e.join(a))})}}return G._listView._writeProfilerMark(w+",StopTM"),{viewportItemsRealized:e.wrap(),allItemsRealized:e.wrap(),loadingCompleted:e.wrap()}},_setAnimationInViewportState:function(a){if(this._hasAnimationInViewportPending=!1,a&&a.length>0)for(var b=this._listView._getViewportLength(),c=this._listView._layout.itemsFromRange(this._scrollbarPos,this._scrollbarPos+b-1),d=0,e=a.length;e>d;d++){var f=a[d];if(f.newIndex>=c.firstIndex&&f.newIndex<=c.lastIndex&&f.newIndex!==f.oldIndex){this._hasAnimationInViewportPending=!0;break}}},_addHeader:function(a,b){var c=this;return this._listView._groups.renderGroup(b).then(function(a){if(a){a.element.tabIndex=0;var d=c._getHeaderContainer(b);a.element.parentNode!==d&&(d.appendChild(a.element),i.addClass(a.element,l._headerClass)),c._listView._groups.setDomElement(b,a.element)}})},_updateHeaders:function(a,b,c){function d(b){var c=g._listView._groups.group(b);if(c&&!c.header){var d=c.headerPromise;return d||(d=c.headerPromise=g._addHeader(a,b),d.done(function(){c.headerPromise=null},function(){c.headerPromise=null})),d}return e.wrap()}function f(){g._headerRenderPromises=null}var g=this;this._listView._groups.removeElements();var h=this._listView._groups.groupFromItem(b),i=h,j=this._listView._groups.groupFromItem(c-1),k=[];if(null!==i)for(;j>=i;i++)k.push(d(i));return this._headerRenderPromises=e.join(k,this._headerRenderPromises).then(f,f),this._headerRenderPromises||e.wrap()},_unrealizeItem:function(a){var b,c=this._listView;this._listView._writeProfilerMark("_unrealizeItem("+a+"),info");var d=c._selection._getFocused();d.type===k.ObjectType.item&&d.index===a&&(c._unsetFocusOnItem(),b=!0);var e=this.items.itemDataAt(a),f=e.element,g=e.itemBox;g&&g.parentNode&&(i.removeClass(g.parentNode,l._selectedClass),i.removeClass(g.parentNode,l._footprintClass),i.addClass(g.parentNode,l._backdropClass),g.parentNode.removeChild(g)),e.container=null,c._currentMode().itemUnrealized&&c._currentMode().itemUnrealized(a,g),this.items.removeItem(a),e.removed||c._itemsManager.releaseItem(f),h._disposeElement(f),b&&c._setFocusOnItem(c._selection._getFocused())},_unrealizeGroup:function(a){var b,c=a.header,d=this._listView._selection._getFocused();d.type===k.ObjectType.groupHeader&&this._listView._groups.group(d.index)===a&&(this._listView._unsetFocusOnItem(),b=!0),c.parentNode&&c.parentNode.removeChild(c),h._disposeElement(c),a.header=null,a.left=-1,a.top=-1,b&&this._listView._setFocusOnItem(this._listView._selection._getFocused())},_unrealizeItems:function(a){var b=this,c=0;this.items.eachIndex(function(d){return d<b.begin||d>=b.end?(b._unrealizeItem(d),a&&++c>=a):void 0});var d=this._listView._groups,e=d.groupFromItem(this.begin);if(null!==e)for(var f=d.groupFromItem(this.end-1),g=0,h=d.length();h>g;g++){var i=d.group(g);(e>g||g>f)&&i.header&&this._unrealizeGroup(i)}},_unrealizeExcessiveItems:function(){var a=this.items.count(),b=this.end-this.begin,c=b+this._listView._maxDeferredItemCleanup;this._listView._writeProfilerMark("_unrealizeExcessiveItems realized("+a+") approved("+c+"),info"),a>c&&this._unrealizeItems(a-c)},_lazilyUnrealizeItems:function(){this._listView._writeProfilerMark("_lazilyUnrealizeItems,StartTM");var a=this;return s(this._listView).then(function(){function b(){a._listView._writeProfilerMark("_lazilyUnrealizeItems,StopTM")}if(a._listView._isZombie())return void b();var c=[];a.items.eachIndex(function(b){(b<a.begin||b>=a.end)&&c.push(b)}),a._listView._writeProfilerMark("_lazilyUnrealizeItems itemsToUnrealize("+c.length+"),info");var d=[],f=a._listView._groups,h=f.groupFromItem(a.begin);if(null!==h)for(var i=f.groupFromItem(a.end-1),j=0,k=f.length();k>j;j++){var l=f.group(j);(h>j||j>i)&&l.header&&d.push(l)}if(c.length||d.length){var m,n=new e(function(b){function e(f){if(!a._listView._isZombie()){for(var g=-1,h=-1,i=0,j=r(a._listView);c.length&&!j&&!f.shouldYield;){var k=c.shift();a._unrealizeItem(k),i++,0>g&&(g=k),h=k}for(a._listView._writeProfilerMark("unrealizeWorker removeItems:"+i+" ("+g+"-"+h+"),info");d.length&&!j&&!f.shouldYield;)a._unrealizeGroup(d.shift());c.length||d.length?j?f.setPromise(s(a._listView).then(function(){return e;
-})):f.setWork(e):b()}}m=g.schedule(e,g.Priority.belowNormal,null,"WinJS.UI.ListView._lazilyUnrealizeItems")});return n.then(b,function(b){return m.cancel(),a._listView._writeProfilerMark("_lazilyUnrealizeItems canceled,info"),a._listView._writeProfilerMark("_lazilyUnrealizeItems,StopTM"),e.wrapError(b)})}return b(),e.wrap()})},_getBoundingRectString:function(a){var b;if(a>=0&&a<this.containers.length){var c=this._listView._layout._getItemPosition(a);c&&(b="["+c.left+"; "+c.top+"; "+c.width+"; "+c.height+" ]")}return b||""},_clearDeferTimeout:function(){this.deferTimeout&&(this.deferTimeout.cancel(),this.deferTimeout=null),-1!==this.deferredActionCancelToken&&(this._listView._versionManager.clearCancelOnNotification(this.deferredActionCancelToken),this.deferredActionCancelToken=-1)},_setupAria:function(a){function b(){d._listView._writeProfilerMark("aria work,StopTM")}function c(a){var b=d._listView._groups,c=b.group(a+1);return c?Math.min(c.startIndex-1,d.end-1):d.end-1}if(!this._listView._isZombie()){var d=this;return this._listView._createAriaMarkers(),this._listView._itemsCount().then(function(f){if(!(f>0&&-1!==d.firstIndexDisplayed&&-1!==d.lastIndexDisplayed))return e.wrap();d._listView._writeProfilerMark("aria work,StartTM");var h,j,k,l,m,n,o=d._listView._ariaStartMarker,q=d._listView._ariaEndMarker,t=d.begin,u=d.items.itemAt(d.begin);return u?(i._ensureId(u),d._listView._groupsEnabled()?(j=d._listView._groups,k=l=j.groupFromItem(d.begin),m=j.group(l),n=c(l),i._ensureId(m.header),i._setAttribute(m.header,"role",d._listView._headerRole),i._setAttribute(m.header,"x-ms-aria-flowfrom",o.id),p(m.header,u),i._setAttribute(m.header,"tabindex",d._listView._tabIndex)):i._setAttribute(u,"x-ms-aria-flowfrom",o.id),new e(function(e){var o=a;h=g.schedule(function v(a){if(d._listView._isZombie())return void b();for(;t<d.end;t++){if(!o&&r(d._listView))return void a.setPromise(s(d._listView).then(function(a){return o=a,v}));if(a.shouldYield)return void a.setWork(v);u=d.items.itemAt(t);var g=d.items.itemAt(t+1);if(g&&i._ensureId(g),i._setAttribute(u,"role",d._listView._itemRole),i._setAttribute(u,"aria-setsize",f),i._setAttribute(u,"aria-posinset",t+1),i._setAttribute(u,"tabindex",d._listView._tabIndex),d._listView._groupsEnabled())if(t!==n&&g)p(u,g);else{var h=j.group(l+1);h&&h.header&&g?(i._setAttribute(h.header,"tabindex",d._listView._tabIndex),i._setAttribute(h.header,"role",d._listView._headerRole),i._ensureId(h.header),p(u,h.header),p(h.header,g)):i._setAttribute(u,"aria-flowto",q.id),l++,m=h,n=c(l)}else g?p(u,g):i._setAttribute(u,"aria-flowto",q.id);if(!g)break}d._listView._fireAccessibilityAnnotationCompleteEvent(d.begin,t,k,l-1),b(),e()},g.Priority.belowNormal,null,"WinJS.UI.ListView._setupAria")},function(){h.cancel(),b()})):void b()})}},_setupDeferredActions:function(){function a(){b._listView._isZombie()||(b.deferTimeout=null,b._listView._versionManager.clearCancelOnNotification(b.deferredActionCancelToken),b.deferredActionCancelToken=-1)}this._listView._writeProfilerMark("_setupDeferredActions,StartTM");var b=this;this._clearDeferTimeout(),this.deferTimeout=this._lazilyRemoveRedundantItemsBlocks().then(function(){return e.timeout(l._DEFERRED_ACTION)}).then(function(){return s(b._listView)}).then(function(a){return b._setupAria(a)}).then(a,function(b){return a(),e.wrapError(b)}),this.deferredActionCancelToken=this._listView._versionManager.cancelOnNotification(this.deferTimeout),this._listView._writeProfilerMark("_setupDeferredActions,StopTM")},_updateAriaMarkers:function(a,b,c){function d(){return f.items.itemAt(b)}function e(){for(var a=c;a>=b;a--)if(f.items.itemAt(a))return f.items.itemAt(a);return null}var f=this;if(!this._listView._isZombie()){this._listView._createAriaMarkers();var g,h,j=this._listView._ariaStartMarker,k=this._listView._ariaEndMarker;if(-1!==b&&-1!==c&&c>=b&&(g=d(),h=e()),!a&&g&&h){if(i._ensureId(g),i._ensureId(h),this._listView._groupsEnabled()){var l=this._listView._groups,m=l.group(l.groupFromItem(b));m.header&&(i._ensureId(m.header),b===m.startIndex?i._setAttribute(j,"aria-flowto",m.header.id):i._setAttribute(j,"aria-flowto",g.id))}else i._setAttribute(j,"aria-flowto",g.id);i._setAttribute(k,"x-ms-aria-flowfrom",h.id)}else p(j,k),this._listView._fireAccessibilityAnnotationCompleteEvent(-1,-1)}},updateAriaForAnnouncement:function(a,b){if(a!==this._listView.header&&a!==this._listView.footer){var c=-1,d=k.ObjectType.item;i.hasClass(a,l._headerClass)?(c=this._listView._groups.index(a),d=k.ObjectType.groupHeader,i._setAttribute(a,"role",this._listView._headerRole),i._setAttribute(a,"tabindex",this._listView._tabIndex)):(c=this.items.index(a),i._setAttribute(a,"aria-setsize",b),i._setAttribute(a,"aria-posinset",c+1),i._setAttribute(a,"role",this._listView._itemRole),i._setAttribute(a,"tabindex",this._listView._tabIndex)),d===k.ObjectType.groupHeader?this._listView._fireAccessibilityAnnotationCompleteEvent(-1,-1,c,c):this._listView._fireAccessibilityAnnotationCompleteEvent(c,c,-1,-1)}},_reportElementsLevel:function(a){function b(a,b){for(var c=0,e=a;b>=e;e++){var f=d.itemDataAt(e);f&&f.container&&c++}return c}var c,d=this.items;c="right"===a?Math.floor(100*b(this.firstIndexDisplayed,this.end-1)/(this.end-this.firstIndexDisplayed)):Math.floor(100*b(this.begin,this.lastIndexDisplayed)/(this.lastIndexDisplayed-this.begin+1)),this._listView._writeProfilerMark("elementsLevel level("+c+"),info")},_createHeaderContainer:function(a){return this._createSurfaceChild(l._headerContainerClass,a)},_createItemsContainer:function(a){var c=this._createSurfaceChild(l._itemsContainerClass,a),d=b.document.createElement("div");return d.className=l._padderClass,c.appendChild(d),c},_ensureContainerInDOM:function(a){var b=this.containers[a];return b&&!this._listView._canvas.contains(b)?(this._forceItemsBlocksInDOM(a,a+1),!0):!1},_ensureItemsBlocksInDOM:function(a,b){if(this._expandedRange){var c=this._expandedRange.first.index,d=this._expandedRange.last.index+1;c>=a&&b>c?b=Math.max(b,d):d>a&&b>=d&&(a=Math.min(a,c))}this._forceItemsBlocksInDOM(a,b)},_removeRedundantItemsBlocks:function(){-1!==this.begin&&-1!==this.end&&this._forceItemsBlocksInDOM(this.begin,this.end)},_lazilyRemoveRedundantItemsBlocks:function(){this._listView._writeProfilerMark("_lazilyRemoveRedundantItemsBlocks,StartTM");var a=this;return s(this._listView).then(function(){function b(){a._listView._writeProfilerMark("_lazilyRemoveRedundantItemsBlocks,StopTM")}if(a._listView._isZombie())return void b();if(a._expandedRange&&-1!==a.begin&&-1!==a.end&&(a._expandedRange.first.index<a.begin||a._expandedRange.last.index+1>a.end)){var c,d=new e(function(b){function d(c){if(!a._listView._isZombie()){for(var e=r(a._listView);a._expandedRange.first.index<a.begin&&!e&&!c.shouldYield;){var f=Math.min(a.begin,a._expandedRange.first.index+a._blockSize*v._blocksToRelease);a._forceItemsBlocksInDOM(f,a.end)}for(;a._expandedRange.last.index+1>a.end&&!e&&!c.shouldYield;){var g=Math.max(a.end,a._expandedRange.last.index-a._blockSize*v._blocksToRelease);a._forceItemsBlocksInDOM(a.begin,g)}a._expandedRange.first.index<a.begin||a._expandedRange.last.index+1>a.end?e?c.setPromise(s(a._listView).then(function(){return d})):c.setWork(d):b()}}c=g.schedule(d,g.Priority.belowNormal,null,"WinJS.UI.ListView._lazilyRemoveRedundantItemsBlocks")});return d.then(b,function(b){return c.cancel(),a._listView._writeProfilerMark("_lazilyRemoveRedundantItemsBlocks canceled,info"),a._listView._writeProfilerMark("_lazilyRemoveRedundantItemsBlocks,StopTM"),e.wrapError(b)})}return b(),e.wrap()})},_forceItemsBlocksInDOM:function(a,b){function c(a,b){var c=a.element.firstElementChild;c.style[q]=b}function d(a){for(var b=0;b<n.tree.length;b++)for(var c=n.tree[b].itemsContainer,d=0,e=c.itemsBlocks.length;e>d;d++)if(a(c,c.itemsBlocks[d]))return}function e(a){n._listView._writeProfilerMark("_itemsBlockExtent,StartTM"),n._listView._itemsBlockExtent=i[n._listView._horizontal()?"getTotalWidth":"getTotalHeight"](a.element),n._listView._writeProfilerMark("_itemsBlockExtent("+n._listView._itemsBlockExtent+"),info"),n._listView._writeProfilerMark("_itemsBlockExtent,StopTM")}function f(){return-1===n._listView._itemsBlockExtent&&d(function(a,b){return b.items.length===n._blockSize&&b.element.parentNode===a.element?(e(b),!0):!1}),-1===n._listView._itemsBlockExtent&&d(function(a,b){return b.items.length===n._blockSize?(a.element.appendChild(b.element),e(b),a.element.removeChild(b.element),!0):!1}),n._listView._itemsBlockExtent}function g(a,b,c){function d(b){var c=a.itemsBlocks[b];c&&c.element.parentNode===a.element&&(a.element.removeChild(c.element),p++)}if(Array.isArray(b))b.forEach(d);else for(var e=b;c>e;e++)d(e)}function h(a,b,c){for(var d=a.element.firstElementChild,e=d,f=b;c>f;f++){var g=a.itemsBlocks[f];g&&(g.element.parentNode!==a.element&&(a.element.insertBefore(g.element,e.nextElementSibling),o++),e=g.element)}}function j(a){if(a<n.tree.length){n._listView._writeProfilerMark("collapseGroup("+a+"),info");var b=n.tree[a].itemsContainer;g(b,0,b.itemsBlocks.length),c(b,"")}}function k(a){if(a<n.tree.length){n._listView._writeProfilerMark("expandGroup("+a+"),info");var b=n.tree[a].itemsContainer;h(b,0,b.itemsBlocks.length),c(b,"")}}function l(a,b){function c(a,b){for(var c=[],d=a;b>=d;d++)c.push(d);return c}var d=b[0],e=b[1],f=a[0],g=a[1];return f>e||d>g?c(f,g):d>f&&g>e?c(f,d-1).concat(c(e+1,g)):d>f?c(f,d-1):g>e?c(e+1,g):null}if(this._blockSize){var m="_forceItemsBlocksInDOM begin("+a+") end("+b+"),";this._listView._writeProfilerMark(m+"StartTM");var n=this,o=0,p=0,q="padding"+(this._listView._horizontal()?"Left":"Top"),r=this._listView._groups.groupFromItem(a),s=this._listView._groups.groupFromItem(b-1),t=this._listView._groups.group(r),u=n.tree[r].itemsContainer,v=Math.floor((a-t.startIndex)/this._blockSize),w=this._listView._groups.group(s),x=n.tree[s].itemsContainer,y=Math.floor((b-1-w.startIndex)/this._blockSize);v&&-1===n._listView._itemsBlockExtent&&d(function(a,b){return b.items.length===n._blockSize&&b.element.parentNode===a.element?(e(b),!0):!1});var z=this._expandedRange?l([this._expandedRange.first.groupIndex,this._expandedRange.last.groupIndex],[r,s]):null;if(z&&z.forEach(j),this._expandedRange&&this._expandedRange.first.groupKey===t.key){var A=l([this._expandedRange.first.block,Number.MAX_VALUE],[v,Number.MAX_VALUE]);A&&g(u,A)}else this._expandedRange&&r>=this._expandedRange.first.groupIndex&&r<=this._expandedRange.last.groupIndex&&g(u,0,v);if(r!==s?(h(u,v,u.itemsBlocks.length),h(x,0,y+1)):h(u,v,y+1),this._expandedRange&&this._expandedRange.last.groupKey===w.key){var A=l([0,this._expandedRange.last.block],[0,y]);A&&g(x,A)}else this._expandedRange&&s>=this._expandedRange.first.groupIndex&&s<=this._expandedRange.last.groupIndex&&g(x,y+1,x.itemsBlocks.length);c(u,v?v*f()+"px":""),r!==s&&c(x,"");for(var B=r+1;s>B;B++)k(B);this._expandedRange={first:{index:a,groupIndex:r,groupKey:t.key,block:v},last:{index:b-1,groupIndex:s,groupKey:w.key,block:y}},this._listView._writeProfilerMark("_forceItemsBlocksInDOM groups("+r+"-"+s+") blocks("+v+"-"+y+") added("+o+") removed("+p+"),info"),this._listView._writeProfilerMark(m+"StopTM")}},_realizePageImpl:function(){var a=this,b="realizePage(scrollPosition:"+this._scrollbarPos+" forceLayout:"+this._forceRelayout+")";return this._listView._writeProfilerMark(b+",StartTM"),this._listView._versionManager.locked?(this._listView._versionManager.unlocked.done(function(){a._listView._isZombie()||a._listView._batchViewUpdates(l._ViewChange.realize,l._ScrollToPriority.low,a._listView.scrollPosition)}),this._listView._writeProfilerMark(b+",StopTM"),e.cancel):new e(function(c){function d(){c(),k.complete()}function g(){a._listView._hideProgressBar(),a._state.setLoadingState(a._listView._LoadingState.viewPortLoaded),a._executeAnimations&&a._setState(F,k.promise)}function h(b){a._updateAriaMarkers(0===b,a.firstIndexDisplayed,a.lastIndexDisplayed),a._state.setLoadingState&&a._state.setLoadingState(a._listView._LoadingState.itemsLoaded)}function j(b){a._listView._clearInsertedItems(),a._listView._groups.removeElements(),g(),h(b),d()}var k=new f;a._state.setLoadingState(a._listView._LoadingState.itemsLoading),a._firstLayoutPass&&a._listView._showProgressBar(a._listView._element,"50%","50%");var l=a.containers.length;if(l){var m,n,o=a.maxLeadingPages,p=a.maxTrailingPages,q=a._listView._getViewportLength();if(a._listView._zooming)m=n=0;else if(v._disableCustomPagesPrefetch)m=n=v._defaultPagesToPrefetch;else{m="left"===a._direction?o:p;var r=Math.max(0,m-a._scrollbarPos/q);n=Math.min(o,r+("right"===a._direction?o:p))}var s=Math.max(0,a._scrollbarPos-m*q),t=a._scrollbarPos+(1+n)*q,u=a._listView._layout.itemsFromRange(s,t-1);if((u.firstIndex<0||u.firstIndex>=l)&&(u.lastIndex<0||u.lastIndex>=l))a.begin=-1,a.end=-1,a.firstIndexDisplayed=-1,a.lastIndexDisplayed=-1,j(l);else{var w=i._clamp(u.firstIndex,0,l-1),x=i._clamp(u.lastIndex+1,0,l),y=a._listView._layout.itemsFromRange(a._scrollbarPos,a._scrollbarPos+q-1),z=i._clamp(y.firstIndex,0,l-1),A=i._clamp(y.lastIndex,0,l-1);if(a._realizationLevel!==v._realizationLevel.skip||a.lastRealizePass||z!==a.firstIndexDisplayed||A!==a.lastIndexDisplayed)if((a._forceRelayout||w!==a.begin||x!==a.end||z!==a.firstIndexDisplayed||A!==a.lastIndexDisplayed)&&x>w&&t>s){a._listView._writeProfilerMark("realizePage currentInView("+z+"-"+A+") previousInView("+a.firstIndexDisplayed+"-"+a.lastIndexDisplayed+") change("+(z-a.firstIndexDisplayed)+"),info"),a._cancelRealize();var B=a._realizePass;a.begin=w,a.end=x,a.firstIndexDisplayed=z,a.lastIndexDisplayed=A,a.deletesWithoutRealize=0,a._ensureItemsBlocksInDOM(a.begin,a.end);var C=a._realizeItems(a._listView._itemCanvas,a.begin,a.end,l,B,a._scrollbarPos,a._direction,z,A,a._forceRelayout);a._forceRelayout=!1;var D=C.viewportItemsRealized.then(function(){return g(),C.allItemsRealized}).then(function(){return a._realizePass===B?a._updateHeaders(a._listView._canvas,a.begin,a.end).then(function(){h(l)}):void 0}).then(function(){return C.loadingCompleted}).then(function(){a._unrealizeExcessiveItems(),a.lastRealizePass=null,d()},function(b){return a._realizePass===B&&(a.lastRealizePass=null,a.begin=-1,a.end=-1),e.wrapError(b)});a.lastRealizePass=e.join([C.viewportItemsRealized,C.allItemsRealized,C.loadingCompleted,D]),a._unrealizeExcessiveItems()}else a.lastRealizePass?a.lastRealizePass.then(d):j(l);else a.begin=w,a.end=w+Object.keys(a.items._itemData).length,a._updateHeaders(a._listView._canvas,a.begin,a.end).done(function(){a.lastRealizePass=null,j(l)})}}else a.begin=-1,a.end=-1,a.firstIndexDisplayed=-1,a.lastIndexDisplayed=-1,j(l);a._reportElementsLevel(a._direction),a._listView._writeProfilerMark(b+",StopTM")})},realizePage:function(a,b,c,d){this._scrollToFunctor=t(a),this._forceRelayout=this._forceRelayout||b,this._scrollEndPromise=c,this._listView._writeProfilerMark(this._state.name+"_realizePage,info"),this._state.realizePage(d||A)},onScroll:function(a,b){this.realizePage(a,!1,b,C)},reload:function(a,b){this._listView._isZombie()||(this._scrollToFunctor=t(a),this._forceRelayout=!0,this._highPriorityRealize=!!b,this.stopWork(!0),this._listView._writeProfilerMark(this._state.name+"_rebuildTree,info"),this._state.rebuildTree())},refresh:function(a){this._listView._isZombie()||(this._scrollToFunctor=t(a),this._forceRelayout=!0,this._highPriorityRealize=!0,this.stopWork(),this._listView._writeProfilerMark(this._state.name+"_relayout,info"),this._state.relayout())},waitForValidScrollPosition:function(a){var b=this,c=this._listView._viewport[this._listView._scrollLength]-this._listView._getViewportLength();return a>c?b._listView._itemsCount().then(function(c){return b.containers.length<c?e._cancelBlocker(b._creatingContainersWork&&b._creatingContainersWork.promise).then(function(){return b._getLayoutCompleted()}).then(function(){return a}):a}):e.wrap(a)},waitForEntityPosition:function(a){var b=this;return a.type===k.ObjectType.header||a.type===k.ObjectType.footer?e.wrap():(this._listView._writeProfilerMark(this._state.name+"_waitForEntityPosition("+a.type+": "+a.index+"),info"),e._cancelBlocker(this._state.waitForEntityPosition(a).then(function(){return a.type!==k.ObjectType.groupHeader&&a.index>=b.containers.length||a.type===k.ObjectType.groupHeader&&b._listView._groups.group(a.index).startIndex>=b.containers.length?b._creatingContainersWork&&b._creatingContainersWork.promise:void 0}).then(function(){return b._getLayoutCompleted()})))},stopWork:function(a){this._listView._writeProfilerMark(this._state.name+"_stop,info"),this._state.stop(a),this._layoutWork&&this._layoutWork.cancel(),a&&this._creatingContainersWork&&this._creatingContainersWork.cancel(),a&&(this._state=new w(this))},_cancelRealize:function(){this._listView._writeProfilerMark("_cancelRealize,StartTM"),(this.lastRealizePass||this.deferTimeout)&&(this._forceRelayout=!0),this._clearDeferTimeout(),this._realizePass++,this._headerRenderPromises&&(this._headerRenderPromises.cancel(),this._headerRenderPromises=null);var a=this.lastRealizePass;a&&(this.lastRealizePass=null,this.begin=-1,this.end=-1,a.cancel()),this._listView._writeProfilerMark("_cancelRealize,StopTM")},resetItems:function(a){if(!this._listView._isZombie()){this.firstIndexDisplayed=-1,this.lastIndexDisplayed=-1,this._runningAnimations=null,this._executeAnimations=!1;var b=this._listView;this._firstLayoutPass=!0,b._unsetFocusOnItem(),b._currentMode().onDataChanged&&b._currentMode().onDataChanged(),this.items.each(function(c,d){a&&d.parentNode&&d.parentNode.parentNode&&d.parentNode.parentNode.removeChild(d.parentNode),b._itemsManager.releaseItem(d),h._disposeElement(d)}),this.items.removeItems(),this._deferredReparenting=[],a&&b._groups.removeElements(),b._clearInsertedItems()}},reset:function(){if(this.stopWork(!0),this._state=new w(this),this.resetItems(),!this._listView._isZombie()){var a=this._listView;a._groups.resetGroups(),a._resetCanvas(),this.tree=null,this.keyToGroupIndex=null,this.containers=null,this._expandedRange=null}},cleanUp:function(){this.stopWork(!0),this._runningAnimations&&this._runningAnimations.cancel();var a=this._listView._itemsManager;this.items.each(function(b,c){a.releaseItem(c),h._disposeElement(c)}),this._listView._unsetFocusOnItem(),this.items.removeItems(),this._deferredReparenting=[],this._listView._groups.resetGroups(),this._listView._resetCanvas(),this.tree=null,this.keyToGroupIndex=null,this.containers=null,this._expandedRange=null,this.destroyed=!0},getContainer:function(a){return this.containers[a]},_getHeaderContainer:function(a){return this.tree[a].header},_getGroups:function(a){if(this._listView._groupDataSource){var b=this._listView._groups.groups,c=[];if(a)for(var d=0,e=b.length;e>d;d++){var f=b[d],g=e>d+1?b[d+1].startIndex:a;c.push({key:f.key,size:g-f.startIndex})}return c}return[{key:"-1",size:a}]},_createChunk:function(a,b,c){function d(a,b){var d=a.element.children,e=d.length,g=Math.min(b-a.items.length,c);j.insertAdjacentHTMLUnsafe(a.element,"beforeend",n._repeat("<div class='win-container win-backdrop'></div>",g));for(var h=0;g>h;h++){var i=d[e+h];a.items.push(i),f.containers.push(i)}}function e(a){var b={header:f._listView._groupDataSource?f._createHeaderContainer():null,itemsContainer:{element:f._createItemsContainer(),items:[]}};f.tree.push(b),f.keyToGroupIndex[a.key]=f.tree.length-1,d(b.itemsContainer,a.size)}var f=this;if(this._listView._writeProfilerMark("createChunk,StartTM"),this.tree.length&&this.tree.length<=a.length){var g=this.tree[this.tree.length-1],h=a[this.tree.length-1].size;if(g.itemsContainer.items.length<h)return d(g.itemsContainer,h),void this._listView._writeProfilerMark("createChunk,StopTM")}this.tree.length<a.length&&e(a[this.tree.length]),this._listView._writeProfilerMark("createChunk,StopTM")},_createChunkWithBlocks:function(a,c,d,e){function f(a,c){var f,g=a.itemsBlocks.length?a.itemsBlocks[a.itemsBlocks.length-1]:null;if(c=Math.min(c,e),g&&g.items.length<d){var i=Math.min(c,d-g.items.length),k=g.items.length,f=(a.itemsBlocks.length-1)*d+k,l=n._stripedContainers(i,f);j.insertAdjacentHTMLUnsafe(g.element,"beforeend",l),w=g.element.children;for(var m=0;i>m;m++){var o=w[k+m];g.items.push(o),h.containers.push(o)}c-=i}f=a.itemsBlocks.length*d;var p=Math.floor(c/d),q="",r=f,s=f+d;if(p>0){var t=["<div class='win-itemsblock'>"+n._stripedContainers(d,r)+"</div>","<div class='win-itemsblock'>"+n._stripedContainers(d,s)+"</div>"];q=n._repeat(t,p),f+=p*d}var u=c%d;u>0&&(q+="<div class='win-itemsblock'>"+n._stripedContainers(u,f)+"</div>",f+=u,p++);var v=b.document.createElement("div");j.setInnerHTMLUnsafe(v,q);for(var w=v.children,x=0;p>x;x++){var y=w[x],z={element:y,items:n._nodeListToArray(y.children)};a.itemsBlocks.push(z);for(var A=0;A<z.items.length;A++)h.containers.push(z.items[A])}}function g(a){var b={header:h._listView._groupDataSource?h._createHeaderContainer():null,itemsContainer:{element:h._createItemsContainer(),itemsBlocks:[]}};h.tree.push(b),h.keyToGroupIndex[a.key]=h.tree.length-1,f(b.itemsContainer,a.size)}var h=this;if(this._listView._writeProfilerMark("createChunk,StartTM"),this.tree.length&&this.tree.length<=a.length){var i=this.tree[this.tree.length-1].itemsContainer,k=a[this.tree.length-1].size,l=0;if(i.itemsBlocks.length&&(l=(i.itemsBlocks.length-1)*d+i.itemsBlocks[i.itemsBlocks.length-1].items.length),k>l)return f(i,k-l),void this._listView._writeProfilerMark("createChunk,StopTM")}this.tree.length<a.length&&g(a[this.tree.length]),this._listView._writeProfilerMark("createChunk,StopTM")},_generateCreateContainersWorker:function(){var a=this,b=0,c=!1;return function e(f){a._listView._versionManager.locked?f.setPromise(a._listView._versionManager.unlocked.then(function(){return e})):a._listView._itemsCount().then(function(g){var h=!c&&r(a._listView);if(h)f.setPromise(s(a._listView).then(function(a){return c=a,e}));else{if(a._listView._isZombie())return;c=!1;var i=d._now()+v._createContainersJobTimeslice,j=a._getGroups(g),k=a.containers.length,l=a.end===a.containers.length,m=v._chunkSize;do a._blockSize?a._createChunkWithBlocks(j,g,a._blockSize,m):a._createChunk(j,g,m),b++;while(a.containers.length<g&&d._now()<i);a._listView._writeProfilerMark("createContainers yields containers("+a.containers.length+"),info"),a._listView._affectedRange.add({start:k,end:a.containers.length},g),l?(a.stopWork(),a._listView._writeProfilerMark(a._state.name+"_relayout,info"),a._state.relayout()):(a._listView._writeProfilerMark(a._state.name+"_layoutNewContainers,info"),a._state.layoutNewContainers()),a.containers.length<g?f.setWork(e):(a._listView._writeProfilerMark("createContainers completed steps("+b+"),info"),a._creatingContainersWork.complete())}})}},_scheduleLazyTreeCreation:function(){return g.schedule(this._generateCreateContainersWorker(),g.Priority.idle,this,"WinJS.UI.ListView.LazyTreeCreation")},_createContainers:function(){this.tree=null,this.keyToGroupIndex=null,this.containers=null,this._expandedRange=null;var a,b=this;return this._listView._itemsCount().then(function(c){return 0===c&&b._listView._hideProgressBar(),a=c,b._listView._writeProfilerMark("createContainers("+a+"),StartTM"),b._listView._groupDataSource?b._listView._groups.initialize():void 0}).then(function(){return b._listView._writeProfilerMark("numberOfItemsPerItemsBlock,StartTM"),a&&b._listView._groups.length()?b._listView._layout.numberOfItemsPerItemsBlock:null}).then(function(c){b._listView._writeProfilerMark("numberOfItemsPerItemsBlock("+c+"),info"),b._listView._writeProfilerMark("numberOfItemsPerItemsBlock,StopTM"),b._listView._resetCanvas(),b.tree=[],b.keyToGroupIndex={},b.containers=[],b._blockSize=c;var e,f=b._getGroups(a),g=d._now()+v._maxTimePerCreateContainers,h=Math.min(v._startupChunkSize,v._chunkSize);do e=c?b._createChunkWithBlocks(f,a,c,h):b._createChunk(f,a,h);while(d._now()<g&&b.containers.length<a&&!e);if(b._listView._writeProfilerMark("createContainers created("+b.containers.length+"),info"),b._listView._affectedRange.add({start:0,end:b.containers.length},a),b.containers.length<a){var i=b._scheduleLazyTreeCreation();b._creatingContainersWork.promise.done(null,function(){i.cancel()})}else b._listView._writeProfilerMark("createContainers completed synchronously,info"),b._creatingContainersWork.complete();b._listView._writeProfilerMark("createContainers("+a+"),StopTM")})},_updateItemsBlocks:function(a){function c(){var a=b.document.createElement("div");return a.className=l._itemsBlockClass,a}function d(b,d){function g(){b.itemsBlocks=null,b.items=[];for(var a=0;k>a;a++){var c=e.containers[d+a];b.element.appendChild(c),b.items.push(c)}}function h(){b.itemsBlocks=[{element:j.length?j.shift():c(),items:[]}];for(var f=b.itemsBlocks[0],g=0;k>g;g++){if(f.items.length===a){var h=j.length?j.shift():c();b.itemsBlocks.push({element:h,items:[]}),f=b.itemsBlocks[b.itemsBlocks.length-1]}var i=e.containers[d+g];f.element.appendChild(i),f.items.push(i)}b.items=null}var i,j=[],k=0,l=b.itemsBlocks;if(l)for(i=0;i<l.length;i++)k+=l[i].items.length,j.push(l[i].element);else k=b.items.length;for(f?h():g(),i=0;i<j.length;i++){var m=j[i];m.parentNode===b.element&&b.element.removeChild(m)}return k}for(var e=this,f=!!a,g=0,h=0;g<this.tree.length;g++)h+=d(this.tree[g].itemsContainer,h);e._blockSize=a},_layoutItems:function(){var a=this;return this._listView._itemsCount().then(function(){return e.as(a._listView._layout.numberOfItemsPerItemsBlock).then(function(b){a._listView._writeProfilerMark("numberOfItemsPerItemsBlock("+b+"),info"),b!==a._blockSize&&(a._updateItemsBlocks(b),a._listView._itemsBlockExtent=-1);var c,d=a._listView._affectedRange.get();return d&&(c={firstIndex:Math.max(d.start-1,0),lastIndex:Math.min(a.containers.length-1,d.end)},c.firstIndex<a.containers.length||0===a.containers.length)?a._listView._layout.layout(a.tree,c,a._modifiedElements||[],a._modifiedGroups||[]):(a._listView._affectedRange.clear(),{realizedRangeComplete:e.wrap(),layoutComplete:e.wrap()})})})},updateTree:function(a,b,c){return this._listView._writeProfilerMark(this._state.name+"_updateTree,info"),this._state.updateTree(a,b,c)},_updateTreeImpl:function(a,c,d,e){function f(a){for(var b=0,c=a.length;c>b;b++){var d=a[b];d.parentNode.removeChild(d)}}if(this._executeAnimations=!0,this._modifiedElements=d,!d.handled){d.handled=!0,this._listView._writeProfilerMark("_updateTreeImpl,StartTM");var g,h=this;e||this._unrealizeItems();for(var g=0,j=d.length;j>g;g++)d[g]._itemBox&&d[g]._itemBox.parentNode&&i.removeClass(d[g]._itemBox.parentNode,l._selectedClass);this.items.each(function(a,b,c){c.container&&i.removeClass(c.container,l._selectedClass),c.container&&i.addClass(c.container,l._backdropClass)});var k=this._listView._updateContainers(this._getGroups(a),a,c,d);f(k.removedHeaders),f(k.removedItemsContainers);for(var g=0,j=d.length;j>g;g++){var n=d[g];if(-1!==n.newIndex){if(n.element=this.getContainer(n.newIndex),!n.element)throw"Container missing after updateContainers."}else i.removeClass(n.element,l._backdropClass)}var o=b.document.activeElement;this._listView._canvas.contains(o)&&(this._requireFocusRestore=o),this._deferredReparenting=[],this.items.each(function(a,b,c){var d=h.getContainer(a),e=c.itemBox;e&&d&&(c.container=d,e.parentNode!==d&&(a>=h.firstIndexDisplayed&&a<=h.lastIndexDisplayed?h._appendAndRestoreFocus(d,e):h._deferredReparenting.push({itemBox:e,container:d})),i.removeClass(d,l._backdropClass),i[h._listView.selection._isIncluded(a)?"addClass":"removeClass"](d,l._selectedClass),!h._listView.selection._isIncluded(a)&&i.hasClass(e,l._selectedClass)&&m._ItemEventsHandler.renderSelection(e,c.element,!1,!0))}),this._listView._writeProfilerMark("_updateTreeImpl,StopTM")}},_completeUpdateTree:function(){if(this._deferredReparenting){var a=this._deferredReparenting.length;if(a>0){var b="_completeReparenting("+a+")";this._listView._writeProfilerMark(b+",StartTM");for(var c,d=0;a>d;d++)c=this._deferredReparenting[d],this._appendAndRestoreFocus(c.container,c.itemBox);this._deferredReparenting=[],this._listView._writeProfilerMark(b+",StopTM")}}this._requireFocusRestore=null},_appendAndRestoreFocus:function(a,c){if(c.parentNode!==a){var d;if(this._requireFocusRestore&&(d=b.document.activeElement),this._requireFocusRestore&&this._requireFocusRestore===d&&(a.contains(d)||c.contains(d))&&(this._listView._unsetFocusOnItem(),d=b.document.activeElement),i.empty(a),a.appendChild(c),this._requireFocusRestore&&d===this._listView._keyboardEventsHelper){var e=this._listView._selection._getFocused();e.type===k.ObjectType.item&&this.items.itemBoxAt(e.index)===c&&(i._setActive(this._requireFocusRestore),this._requireFocusRestore=null)}}},_startAnimations:function(){this._listView._writeProfilerMark("startAnimations,StartTM");var a=this;this._hasAnimationInViewportPending=!1;var b=e.as(this._listView._layout.executeAnimations()).then(function(){a._listView._writeProfilerMark("startAnimations,StopTM")});return b},_setState:function(a,b){if(!this._listView._isZombie()){var c=this._state.name;this._state=new a(this,b),this._listView._writeProfilerMark(this._state.name+"_enter from("+c+"),info"),this._state.enter()}},getAdjacent:function(a,b){var c=this;return this.waitForEntityPosition(a).then(function(){return c._listView._layout.getAdjacent(a,b)})},hitTest:function(a,b){if(this._realizedRangeLaidOut)return{index:-1,insertAfterIndex:-1};var c=this._listView._layout.hitTest(a,b);return c.index=i._clamp(c.index,-1,this._listView._cachedCount-1,0),c.insertAfterIndex=i._clamp(c.insertAfterIndex,-1,this._listView._cachedCount-1,0),c},_createTreeBuildingSignal:function(){if(!this._creatingContainersWork){this._creatingContainersWork=new f;var a=this;this._creatingContainersWork.promise.done(function(){a._creatingContainersWork=null},function(){a._creatingContainersWork=null})}},_createLayoutSignal:function(){var a=this;this._layoutCompleted||(this._layoutCompleted=new f,this._layoutCompleted.promise.done(function(){a._layoutCompleted=null},function(){a._layoutCompleted=null})),this._realizedRangeLaidOut||(this._realizedRangeLaidOut=new f,this._realizedRangeLaidOut.promise.done(function(){a._realizedRangeLaidOut=null},function(){a._realizedRangeLaidOut=null}))},_getLayoutCompleted:function(){return this._layoutCompleted?e._cancelBlocker(this._layoutCompleted.promise):e.wrap()},_createSurfaceChild:function(a,c){var d=b.document.createElement("div");return d.className=a,this._listView._canvas.insertBefore(d,c?c.nextElementSibling:null),d},_executeScrollToFunctor:function(){var a=this;return e.as(this._scrollToFunctor?this._scrollToFunctor():null).then(function(b){a._scrollToFunctor=null,b=b||{},+b.position===b.position&&(a._scrollbarPos=b.position),a._direction=b.direction||"right"})}},{_defaultPagesToPrefetch:2,_iOSMaxLeadingPages:6,_iOSMaxTrailingPages:2,_disableCustomPagesPrefetch:!1,_waitForSeZoIntervalDuration:100,_waitForSeZoTimeoutDuration:500,_chunkSize:500,_startupChunkSize:100,_maxTimePerCreateContainers:5,_createContainersJobTimeslice:15,_blocksToRelease:10,_realizationLevel:{skip:"skip",realize:"realize",normal:"normal"}}),w=c.Class.define(function(a){this.view=a,this.view._createTreeBuildingSignal(),this.view._createLayoutSignal()},{name:"CreatedState",enter:function(){this.view._createTreeBuildingSignal(),this.view._createLayoutSignal()},stop:u,realizePage:u,rebuildTree:function(){this.view._setState(x)},relayout:function(){this.view._setState(x)},layoutNewContainers:u,waitForEntityPosition:function(){return this.view._setState(x),this.view._getLayoutCompleted()},updateTree:u}),x=c.Class.define(function(a){this.view=a},{name:"BuildingState",enter:function(){this.canceling=!1,this.view._createTreeBuildingSignal(),this.view._createLayoutSignal();var a=this,b=new f;this.promise=b.promise.then(function(){return a.view._createContainers()}).then(function(){a.view._setState(y)},function(b){return a.canceling||(a.view._setState(w),a.view._listView._raiseViewComplete()),e.wrapError(b)}),b.complete()},stop:function(){this.canceling=!0,this.promise.cancel(),this.view._setState(w);
-},realizePage:u,rebuildTree:function(){this.canceling=!0,this.promise.cancel(),this.enter()},relayout:u,layoutNewContainers:u,waitForEntityPosition:function(){return this.view._getLayoutCompleted()},updateTree:u}),y=c.Class.define(function(a,b){this.view=a,this.nextStateType=b||A},{name:"LayingoutState",enter:function(){var a=this;this.canceling=!1,this.view._createLayoutSignal(),this.view._listView._writeProfilerMark(this.name+"_enter_layoutItems,StartTM");var b=new f;this.promise=b.promise.then(function(){return a.view._layoutItems()}).then(function(b){return a.view._layoutWork=b.layoutComplete,b.realizedRangeComplete}).then(function(){a.view._listView._writeProfilerMark(a.name+"_enter_layoutItems,StopTM"),a.view._listView._clearInsertedItems(),a.view._setAnimationInViewportState(a.view._modifiedElements),a.view._modifiedElements=[],a.view._modifiedGroups=[],a.view._realizedRangeLaidOut.complete(),a.view._layoutWork.then(function(){a.view._listView._writeProfilerMark(a.name+"_enter_layoutCompleted,info"),a.view._listView._affectedRange.clear(),a.view._layoutCompleted.complete()}),a.canceling||a.view._setState(a.nextStateType)},function(b){return a.view._listView._writeProfilerMark(a.name+"_enter_layoutCanceled,info"),a.canceling||(a.view.firstIndexDisplayed=a.view.lastIndexDisplayed=-1,a.view._updateAriaMarkers(!0,a.view.firstIndexDisplayed,a.view.lastIndexDisplayed),a.view._setState(G)),e.wrapError(b)}),b.complete(),this.canceling&&this.promise.cancel()},cancelLayout:function(a){this.view._listView._writeProfilerMark(this.name+"_cancelLayout,info"),this.canceling=!0,this.promise&&this.promise.cancel(),a&&this.view._setState(z)},stop:function(){this.cancelLayout(!0)},realizePage:u,rebuildTree:function(){this.cancelLayout(!1),this.view._setState(x)},relayout:function(){this.cancelLayout(!1),this.enter()},layoutNewContainers:function(){this.relayout()},waitForEntityPosition:function(){return this.view._getLayoutCompleted()},updateTree:function(a,b,c){return this.view._updateTreeImpl(a,b,c)}}),z=c.Class.define(function(a){this.view=a},{name:"LayoutCanceledState",enter:u,stop:u,realizePage:function(){this.relayout()},rebuildTree:function(){this.view._setState(x)},relayout:function(){this.view._setState(y)},layoutNewContainers:function(){this.relayout()},waitForEntityPosition:function(){return this.view._getLayoutCompleted()},updateTree:function(a,b,c){return this.view._updateTreeImpl(a,b,c)}}),A=c.Class.define(function(a){this.view=a,this.nextState=E,this.relayoutNewContainers=!0},{name:"RealizingState",enter:function(){var a=this,b=new f;this.promise=b.promise.then(function(){return a.view._executeScrollToFunctor()}).then(function(){return a.relayoutNewContainers=!1,e._cancelBlocker(a.view._realizePageImpl())}).then(function(){a.view._state===a&&(a.view._completeUpdateTree(),a.view._listView._writeProfilerMark("RealizingState_to_UnrealizingState"),a.view._setState(a.nextState))},function(b){return a.view._state!==a||a.canceling||(a.view._listView._writeProfilerMark("RealizingState_to_CanceledState"),a.view._setState(B)),e.wrapError(b)}),b.complete()},stop:function(){this.canceling=!0,this.promise.cancel(),this.view._cancelRealize(),this.view._setState(B)},realizePage:function(){this.canceling=!0,this.promise.cancel(),this.enter()},rebuildTree:function(){this.stop(),this.view._setState(x)},relayout:function(){this.stop(),this.view._setState(y)},layoutNewContainers:function(){this.relayoutNewContainers?this.relayout():(this.view._createLayoutSignal(),this.view._relayoutInComplete=!0)},waitForEntityPosition:function(){return this.view._getLayoutCompleted()},updateTree:function(a,b,c){return this.view._updateTreeImpl(a,b,c)},setLoadingState:function(a){this.view._listView._setViewState(a)}}),B=c.Class.define(function(a){this.view=a},{name:"CanceledState",enter:u,stop:function(){this.view._cancelRealize()},realizePage:function(a){this.stop(),this.view._setState(a)},rebuildTree:function(){this.stop(),this.view._setState(x)},relayout:function(a){this.stop(),this.view._setState(y,a)},layoutNewContainers:function(){this.relayout(B)},waitForEntityPosition:function(){return this.view._getLayoutCompleted()},updateTree:function(a,b,c){return this.view._updateTreeImpl(a,b,c)}}),C=c.Class.derive(A,function(a){this.view=a,this.nextState=D,this.relayoutNewContainers=!0},{name:"ScrollingState",setLoadingState:function(){}}),D=c.Class.derive(B,function(a){this.view=a},{name:"ScrollingPausedState",enter:function(){var a=this;this.promise=e._cancelBlocker(this.view._scrollEndPromise).then(function(){a.view._setState(E)})},stop:function(){this.promise.cancel(),this.view._cancelRealize()}}),E=c.Class.define(function(a){this.view=a},{name:"UnrealizingState",enter:function(){var a=this;this.promise=this.view._lazilyUnrealizeItems().then(function(){return a.view._listView._writeProfilerMark("_renderCompletePromise wait starts,info"),a.view._renderCompletePromise}).then(function(){a.view._setState(G)})},stop:function(){this.view._cancelRealize(),this.promise.cancel(),this.view._setState(B)},realizePage:function(a){this.promise.cancel(),this.view._setState(a)},rebuildTree:function(){this.view._setState(x)},relayout:function(){this.view._setState(y)},layoutNewContainers:function(){this.view._createLayoutSignal(),this.view._relayoutInComplete=!0},waitForEntityPosition:function(){return this.view._getLayoutCompleted()},updateTree:function(a,b,c){return this.view._updateTreeImpl(a,b,c)}}),F=c.Class.define(function(a,b){this.view=a,this.realizePromise=b,this.realizeId=1},{name:"RealizingAnimatingState",enter:function(){var a=this;this.animating=!0,this.animatePromise=this.view._startAnimations(),this.animateSignal=new f,this.view._executeAnimations=!1,this.animatePromise.done(function(){a.animating=!1,a.modifiedElements?(a.view._updateTreeImpl(a.count,a.delta,a.modifiedElements),a.modifiedElements=null,a.view._setState(B)):a.animateSignal.complete()},function(b){return a.animating=!1,e.wrapError(b)}),this._waitForRealize()},_waitForRealize:function(){var a=this;this.realizing=!0,this.realizePromise.done(function(){a.realizing=!1});var b=++this.realizeId;e.join([this.realizePromise,this.animateSignal.promise]).done(function(){b===a.realizeId&&(a.view._completeUpdateTree(),a.view._listView._writeProfilerMark("RealizingAnimatingState_to_UnrealizingState"),a.view._setState(E))})},stop:function(a){this.realizePromise.cancel(),this.view._cancelRealize(),a&&(this.animatePromise.cancel(),this.view._setState(B))},realizePage:function(){if(!this.modifiedElements){var a=this;this.realizePromise=this.view._executeScrollToFunctor().then(function(){return e._cancelBlocker(a.view._realizePageImpl())}),this._waitForRealize()}},rebuildTree:function(){this.stop(!0),this.view._setState(x)},relayout:function(){this.stop(!0),this.modifiedElements&&(this.view._updateTreeImpl(this.count,this.delta,this.modifiedElements),this.modifiedElements=null),this.view._setState(y)},layoutNewContainers:function(){this.view._createLayoutSignal(),this.view._relayoutInComplete=!0},waitForEntityPosition:function(){return this.view._getLayoutCompleted()},updateTree:function(a,b,c){if(this.animating){var d=this.modifiedElements;return this.count=a,this.delta=b,this.modifiedElements=c,d?e.cancel:this.animatePromise}return this.view._updateTreeImpl(a,b,c)},setLoadingState:function(a){this.view._listView._setViewState(a)}}),G=c.Class.derive(B,function(a){this.view=a},{name:"CompletedState",enter:function(){this._stopped=!1,this.view._setupDeferredActions(),this.view._realizationLevel=v._realizationLevel.normal,this.view._listView._raiseViewComplete(),this.view._state===this&&this.view._relayoutInComplete&&!this._stopped&&this.view._setState(H)},stop:function(){this._stopped=!0,B.prototype.stop.call(this)},layoutNewContainers:function(){this.view._createLayoutSignal(),this.view._setState(H)},updateTree:function(a,b,c){return this.view._updateTreeImpl(a,b,c,!0)}}),H=c.Class.derive(B,function(a){this.view=a},{name:"LayingoutNewContainersState",enter:function(){var a=this;this.promise=e.join([this.view.deferTimeout,this.view._layoutWork]),this.promise.then(function(){a.view._relayoutInComplete=!1,a.relayout(B)})},stop:function(){this.promise.cancel(),this.view._cancelRealize()},realizePage:function(a){this.stop(),this.view._setState(y,a)},layoutNewContainers:function(){this.view._createLayoutSignal()}});return v})})}),d("require-style!less/styles-listview",[],function(){}),d("require-style!less/colors-listview",[],function(){}),d("WinJS/Controls/ListView",["../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Events","../Core/_Log","../Core/_Resources","../Core/_WriteProfilerMark","../_Accents","../Animations","../Animations/_TransitionAnimation","../BindingList","../Promise","../Scheduler","../_Signal","../Utilities/_Control","../Utilities/_Dispose","../Utilities/_ElementUtilities","../Utilities/_Hoverable","../Utilities/_ItemsManager","../Utilities/_SafeHtml","../Utilities/_TabContainer","../Utilities/_UI","../Utilities/_VersionManager","./ElementResizeInstrument","./ItemContainer/_Constants","./ItemContainer/_ItemEventsHandler","./ListView/_BrowseMode","./ListView/_ErrorMessages","./ListView/_GroupFocusCache","./ListView/_GroupsContainer","./ListView/_Helpers","./ListView/_ItemsContainer","./ListView/_Layouts","./ListView/_SelectionManager","./ListView/_VirtualizeContentsView","require-style!less/styles-listview","require-style!less/colors-listview"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J){"use strict";function K(){var a=Q;Q=[],a=a.filter(function(a){return a._isZombie()?(a._dispose(),!1):!0}),Q=Q.concat(a)}function L(a){Q.push(a),N&&N.cancel(),N=m.timeout(P).then(K)}function M(a){return a.offsetParent?a.offsetParent.offsetWidth-a.offsetLeft-a.offsetWidth:0}i.createAccentRule(".win-listview:not(.win-selectionstylefilled) .win-selectioncheckmarkbackground,         .win-itemcontainer:not(.win-selectionstylefilled) .win-selectioncheckmarkbackground",[{name:"border-color",value:i.ColorTypes.accent},{name:"background-color",value:i.ColorTypes.accent}]),i.createAccentRule(".win-listview:not(.win-selectionstylefilled) .win-container.win-selected .win-selectionborder,         .win-itemcontainer:not(.win-selectionstylefilled).win-container.win-selected .win-selectionborder",[{name:"border-color",value:i.ColorTypes.accent}]),i.createAccentRule(".win-listview.win-selectionstylefilled .win-selected .win-selectionbackground,         .win-itemcontainer.win-selectionstylefilled.win-selected .win-selectionbackground",[{name:"background-color",value:i.ColorTypes.accent}]);var N,O=c._browserStyleEquivalents.transform,P=1e3,Q=[],R=r._uniqueID,S={get notCompatibleWithSemanticZoom(){return"ListView can only be used with SemanticZoom if randomAccess loading behavior is specified."},get listViewInvalidItem(){return"Item must provide index, key or description of corresponding item."},get listViewViewportAriaLabel(){return g._getWinJSString("ui/listViewViewportAriaLabel").value}},T=c.requireSupportedForProcessing,U={entrance:"entrance",contentTransition:"contentTransition"};b.Namespace.define("WinJS.UI",{ListViewAnimationType:U,ListView:b.Namespace._lazy(function(){var g=b.Class.define(function(){this.clear()},{add:function(a,b){if(a._lastKnownSizeOfData=b,this._range){this._range.start=Math.min(this._range.start,a.start);var c=this._range._lastKnownSizeOfData-this._range.end,d=a._lastKnownSizeOfData-a.end,e=Math.min(c,d);this._range._lastKnownSizeOfData=a._lastKnownSizeOfData,this._range.end=this._range._lastKnownSizeOfData-e}else this._range=a},addAll:function(){this.add({start:0,end:Number.MAX_VALUE},Number.MAX_VALUE)},clear:function(){this._range=null},get:function(){return this._range}}),i=b.Class.define(function(a){this._listView=a},{getPanAxis:function(){return this._listView._getPanAxis()},configureForZoom:function(a,b,c,d){this._listView._configureForZoom(a,b,c,d)},setCurrentItem:function(a,b){this._listView._setCurrentItem(a,b)},getCurrentItem:function(){return this._listView._getCurrentItem()},beginZoom:function(){return this._listView._beginZoom()},positionItem:function(a,b){return this._listView._positionItem(a,b)},endZoom:function(a){this._listView._endZoom(a)},pinching:{get:function(){return this._listView._pinching},set:function(a){this._listView._pinching=a}}}),s=b.Class.define(function(b,c){if(b=b||a.document.createElement("div"),this._id=b.id||"",this._writeProfilerMark("constructor,StartTM"),c=c||{},b.winControl=this,r.addClass(b,"win-disposable"),this._affectedRange=new g,this._mutationObserver=new r._MutationObserver(this._itemPropertyChange.bind(this)),this._versionManager=null,this._insertedItems={},this._element=b,this._startProperty=null,this._scrollProperty=null,this._scrollLength=null,this._scrolling=!1,this._zooming=!1,this._pinching=!1,this._itemsManager=null,this._canvas=null,this._cachedCount=z._UNINITIALIZED,this._loadingState=this._LoadingState.complete,this._firstTimeDisplayed=!0,this._currentScrollPosition=0,this._lastScrollPosition=0,this._notificationHandlers=[],this._itemsBlockExtent=-1,this._lastFocusedElementInGroupTrack={type:w.ObjectType.item,index:-1},this._headerFooterVisibilityStatus={headerVisible:!1,footerVisible:!1},this._viewportWidth=z._UNINITIALIZED,this._viewportHeight=z._UNINITIALIZED,this._manipulationState=r._MSManipulationEvent.MS_MANIPULATION_STATE_STOPPED,this._maxDeferredItemCleanup=Number.MAX_VALUE,this._groupsToRemove={},this._setupInternalTree(),this._isCurrentZoomView=!0,this._dragSource=!1,this._reorderable=!1,this._groupFocusCache=new D._UnsupportedGroupFocusCache,this._viewChange=z._ViewChange.rebuild,this._scrollToFunctor=null,this._setScrollbarPosition=!1,this._view=new J._VirtualizeContentsView(this),this._selection=new I._SelectionManager(this),this._createTemplates(),this._groupHeaderRenderer=t._trivialHtmlRenderer,this._itemRenderer=t._trivialHtmlRenderer,this._groupHeaderRelease=null,this._itemRelease=null,c.itemDataSource)this._dataSource=c.itemDataSource;else{var d=new l.List;this._dataSource=d.dataSource}this._selectionMode=w.SelectionMode.multi,this._tap=w.TapBehavior.invokeOnly,this._groupHeaderTap=w.GroupHeaderTapBehavior.invoke,this._mode=new B._SelectionMode(this),this._groups=new E._NoGroups(this),this._updateItemsAriaRoles(),this._updateGroupHeadersAriaRoles(),this._element.setAttribute("aria-multiselectable",this._multiSelection()),this._element.tabIndex=-1,this._tabManager.tabIndex=this._tabIndex,"absolute"!==this._element.style.position&&"relative"!==this._element.style.position&&(this._element.style.position="relative"),this._updateItemsManager(),c.layout||this._updateLayout(new H.GridLayout),this._attachEvents(),this._runningInit=!0,p.setOptions(this,c),this._runningInit=!1,this._batchViewUpdates(z._ViewChange.rebuild,z._ScrollToPriority.medium,0),this._writeProfilerMark("constructor,StopTM")},{element:{get:function(){return this._element}},layout:{get:function(){return this._layoutImpl},set:function(a){this._updateLayout(a),this._runningInit||(this._view.reset(),this._updateItemsManager(),this._batchViewUpdates(z._ViewChange.rebuild,z._ScrollToPriority.medium,0,!0))}},maxLeadingPages:{get:function(){return this._view.maxLeadingPages},set:function(a){this._view.maxLeadingPages=Math.max(0,Math.floor(a))}},maxTrailingPages:{get:function(){return this._view.maxTrailingPages},set:function(a){this._view.maxTrailingPages=Math.max(0,Math.floor(a))}},pagesToLoad:{get:function(){return 2*J._VirtualizeContentsView._defaultPagesToPrefetch+1},set:function(){r._deprecated(C.pagesToLoadIsDeprecated)}},pagesToLoadThreshold:{get:function(){return 0},set:function(){r._deprecated(C.pagesToLoadThresholdIsDeprecated)}},groupDataSource:{get:function(){return this._groupDataSource},set:function(a){function b(a){a.detail===w.DataSourceStatus.failure&&(c.itemDataSource=null,c.groupDataSource=null)}this._writeProfilerMark("set_groupDataSource,info");var c=this;this._groupDataSource&&this._groupDataSource.removeEventListener&&this._groupDataSource.removeEventListener("statuschanged",b,!1),this._groupDataSource=a,this._groupFocusCache=a&&this._supportsGroupHeaderKeyboarding?new D._GroupFocusCache(this):new D._UnsupportedGroupFocusCache,this._groupDataSource&&this._groupDataSource.addEventListener&&this._groupDataSource.addEventListener("statuschanged",b,!1),this._createGroupsContainer(),this._runningInit?(this._updateGroupWork(),this._resetLayout()):(this._view.reset(),this._pendingLayoutReset=!0,this._pendingGroupWork=!0,this._batchViewUpdates(z._ViewChange.rebuild,z._ScrollToPriority.medium,0,!0))}},_updateGroupWork:function(){this._pendingGroupWork=!1,this._groupDataSource?r.addClass(this._element,z._groupsClass):r.removeClass(this._element,z._groupsClass),this._resetLayout()},automaticallyLoadPages:{get:function(){return!1},set:function(){r._deprecated(C.automaticallyLoadPagesIsDeprecated)}},loadingBehavior:{get:function(){return"randomAccess"},set:function(){r._deprecated(C.loadingBehaviorIsDeprecated)}},selectionMode:{get:function(){return this._selectionMode},set:function(a){if("string"==typeof a&&a.match(/^(none|single|multi)$/)){if(c.isPhone&&a===w.SelectionMode.single)return;return this._selectionMode=a,this._element.setAttribute("aria-multiselectable",this._multiSelection()),this._updateItemsAriaRoles(),void this._configureSelectionMode()}throw new d("WinJS.UI.ListView.ModeIsInvalid",C.modeIsInvalid)}},tapBehavior:{get:function(){return this._tap},set:function(a){c.isPhone&&a===w.TapBehavior.directSelect||(this._tap=a,this._updateItemsAriaRoles(),this._configureSelectionMode())}},groupHeaderTapBehavior:{get:function(){return this._groupHeaderTap},set:function(a){this._groupHeaderTap=a,this._updateGroupHeadersAriaRoles()}},swipeBehavior:{get:function(){return"none"},set:function(a){r._deprecated(C.swipeBehaviorDeprecated)}},itemDataSource:{get:function(){return this._itemsManager.dataSource},set:function(a){this._writeProfilerMark("set_itemDataSource,info"),this._dataSource=a||(new l.List).dataSource,this._groupFocusCache.clear(),this._runningInit||(this._selection._reset(),this._cancelAsyncViewWork(!0),this._updateItemsManager(),this._pendingLayoutReset=!0,this._batchViewUpdates(z._ViewChange.rebuild,z._ScrollToPriority.medium,0,!0))}},itemTemplate:{get:function(){return this._itemRenderer},set:function(a){this._setRenderer(a,!1),this._runningInit||(this._cancelAsyncViewWork(!0),this._updateItemsManager(),this._pendingLayoutReset=!0,this._batchViewUpdates(z._ViewChange.rebuild,z._ScrollToPriority.medium,0,!0))}},resetItem:{get:function(){return this._itemRelease},set:function(a){r._deprecated(C.resetItemIsDeprecated),this._itemRelease=a}},groupHeaderTemplate:{get:function(){return this._groupHeaderRenderer},set:function(a){this._setRenderer(a,!0),this._runningInit||(this._cancelAsyncViewWork(!0),this._pendingLayoutReset=!0,this._batchViewUpdates(z._ViewChange.rebuild,z._ScrollToPriority.medium,0,!0))}},resetGroupHeader:{get:function(){return this._groupHeaderRelease},set:function(a){r._deprecated(C.resetGroupHeaderIsDeprecated),this._groupHeaderRelease=a}},header:{get:function(){return this._header},set:function(a){r.empty(this._headerContainer),this._header=a,a&&(this._header.tabIndex=this._tabIndex,this._headerContainer.appendChild(a));var b=this._selection._getFocused();if(b.type===w.ObjectType.header){var c=b;a||(c={type:w.ObjectType.item,index:0}),this._hasKeyboardFocus?this._changeFocus(c,!0,!1,!0):this._changeFocusPassively(c)}this.recalculateItemPosition(),this._raiseHeaderFooterVisibilityEvent()}},footer:{get:function(){return this._footer},set:function(a){r.empty(this._footerContainer),this._footer=a,a&&(this._footer.tabIndex=this._tabIndex,this._footerContainer.appendChild(a));var b=this._selection._getFocused();if(b.type===w.ObjectType.footer){var c=b;a||(c={type:w.ObjectType.item,index:0}),this._hasKeyboardFocus?this._changeFocus(c,!0,!1,!0):this._changeFocusPassively(c)}this.recalculateItemPosition(),this._raiseHeaderFooterVisibilityEvent()}},loadingState:{get:function(){return this._loadingState}},selection:{get:function(){return this._selection}},indexOfFirstVisible:{get:function(){return this._view.firstIndexDisplayed},set:function(a){if(!(0>a)){this._writeProfilerMark("set_indexOfFirstVisible("+a+"),info"),this._raiseViewLoading(!0);var b=this;this._batchViewUpdates(z._ViewChange.realize,z._ScrollToPriority.high,function(){var c;return b._entityInRange({type:w.ObjectType.item,index:a}).then(function(a){return a.inRange?b._getItemOffset({type:w.ObjectType.item,index:a.index}).then(function(a){return c=a,b._ensureFirstColumnRange(w.ObjectType.item)}).then(function(){return c=b._correctRangeInFirstColumn(c,w.ObjectType.item),c=b._convertFromCanvasCoordinates(c),b._view.waitForValidScrollPosition(c.begin)}).then(function(a){var c=a<b._lastScrollPosition?"left":"right",d=b._viewport[b._scrollLength]-b._getViewportLength();return a=r._clamp(a,0,d),{position:a,direction:c}}):{position:0,direction:"left"}})},!0)}}},indexOfLastVisible:{get:function(){return this._view.lastIndexDisplayed}},currentItem:{get:function(){var a=this._selection._getFocused(),b={index:a.index,type:a.type,key:null,hasFocus:!!this._hasKeyboardFocus,showFocus:!1};if(a.type===w.ObjectType.groupHeader){var c=this._groups.group(a.index);c&&(b.key=c.key,b.showFocus=!(!c.header||!r.hasClass(c.header,z._itemFocusClass)))}else if(a.type===w.ObjectType.item){var d=this._view.items.itemAt(a.index);if(d){var e=this._itemsManager._recordFromElement(d);b.key=e.item&&e.item.key,b.showFocus=!!d.parentNode.querySelector("."+z._itemFocusOutlineClass)}}return b},set:function(a){function b(b,d,e){var f=!!a.showFocus&&c._hasKeyboardFocus;c._unsetFocusOnItem(d),c._selection._setFocused(e,f),c._hasKeyboardFocus?(c._keyboardFocusInbound=f,c._setFocusOnItem(e)):c._tabManager.childFocus=d?b:null,e.type!==w.ObjectType.groupHeader&&(c._updateFocusCache(e.index),c._updater&&(c._updater.newSelectionPivot=e.index,c._updater.oldSelectionPivot=-1),c._selection._pivot=e.index)}this._hasKeyboardFocus=a.hasFocus||this._hasKeyboardFocus,a.type||(a.type=w.ObjectType.item);var c=this;if(a.key&&(a.type===w.ObjectType.item&&this._dataSource.itemFromKey||a.type===w.ObjectType.groupHeader&&this._groupDataSource&&this._groupDataSource.itemFromKey)){this.oldCurrentItemKeyFetch&&this.oldCurrentItemKeyFetch.cancel();var d=a.type===w.ObjectType.groupHeader?this._groupDataSource:this._dataSource;this.oldCurrentItemKeyFetch=d.itemFromKey(a.key).then(function(d){if(c.oldCurrentItemKeyFetch=null,d){var e=a.type===w.ObjectType.groupHeader?c._groups.group(d.index).header:c._view.items.itemAt(d.index);b(e,!!e,{type:a.type,index:d.index})}})}else{var e;if(a.type===w.ObjectType.header||a.type===w.ObjectType.footer)e=a.type===w.ObjectType.header?this._header:this._footer,b(e,!!e,{type:a.type,index:a.index});else if(void 0!==a.index){if(a.type===w.ObjectType.groupHeader){var f=c._groups.group(a.index);e=f&&f.header}else e=c._view.items.itemAt(a.index);b(e,!!e,{type:a.type,index:a.index})}}}},zoomableView:{get:function(){return this._zoomableView||(this._zoomableView=new i(this)),this._zoomableView}},itemsDraggable:{get:function(){return this._dragSource},set:function(a){c.isPhone||this._dragSource!==a&&(this._dragSource=a,this._setDraggable())}},itemsReorderable:{get:function(){return this._reorderable},set:function(a){c.isPhone||this._reorderable!==a&&(this._reorderable=a,this._setDraggable())}},maxDeferredItemCleanup:{get:function(){return this._maxDeferredItemCleanup},set:function(a){this._maxDeferredItemCleanup=Math.max(0,+a||0)}},dispose:function(){this._dispose()},elementFromIndex:function(a){return this._view.items.itemAt(a)},indexOfElement:function(a){return this._view.items.index(a)},ensureVisible:function(a){var b=w.ObjectType.item,c=a;if(+a!==a&&(b=a.type,c=a.index),this._writeProfilerMark("ensureVisible("+b+": "+c+"),info"),!(0>c)){this._raiseViewLoading(!0);var d=this;this._batchViewUpdates(z._ViewChange.realize,z._ScrollToPriority.high,function(){var a;return d._entityInRange({type:b,index:c}).then(function(c){return c.inRange?d._getItemOffset({type:b,index:c.index}).then(function(c){return a=c,d._ensureFirstColumnRange(b)}).then(function(){a=d._correctRangeInFirstColumn(a,b);var e=d._getViewportLength(),f=d._viewportScrollPosition,g=f+e,h=d._viewportScrollPosition,i=a.end-a.begin;a=d._convertFromCanvasCoordinates(a);var j=!1;if(b===w.ObjectType.groupHeader&&f<=a.begin){var k=d._groups.group(c.index).header;if(k){var l,m=H._getMargins(k);if(d._horizontalLayout){var n=d._rtl(),o=n?M(k)-m.right:k.offsetLeft-m.left;l=o+k.offsetWidth+(n?m.left:m.right)}else l=k.offsetTop+k.offsetHeight+m.top;j=g>=l}}j||(i>=g-f?h=a.begin:a.begin<f?h=a.begin:a.end>g&&(h=a.end-e));var p=h<d._lastScrollPosition?"left":"right",q=d._viewport[d._scrollLength]-e;return h=r._clamp(h,0,q),{position:h,direction:p}}):{position:0,direction:"left"}})},!0)}},loadMorePages:function(){r._deprecated(C.loadMorePagesIsDeprecated)},recalculateItemPosition:function(){this._writeProfilerMark("recalculateItemPosition,info"),this._forceLayoutImpl(z._ViewChange.relayout)},forceLayout:function(){this._writeProfilerMark("forceLayout,info"),this._forceLayoutImpl(z._ViewChange.remeasure)},_entityInRange:function(a){if(a.type===w.ObjectType.item)return this._itemsCount().then(function(b){var c=r._clamp(a.index,0,b-1);return{inRange:c>=0&&b>c,index:c}});if(a.type===w.ObjectType.groupHeader){var b=r._clamp(a.index,0,this._groups.length()-1);return m.wrap({inRange:b>=0&&b<this._groups.length(),index:b})}return m.wrap({inRange:!0,index:0})},_forceLayoutImpl:function(a){var b=this;this._versionManager&&this._versionManager.unlocked.then(function(){b._writeProfilerMark("_forceLayoutImpl viewChange("+a+"),info"),b._cancelAsyncViewWork(),b._pendingLayoutReset=!0,b._resizeViewport(),b._batchViewUpdates(a,z._ScrollToPriority.low,function(){return{position:b._lastScrollPosition,direction:"right"}},!0,!0)})},_configureSelectionMode:function(){var b=z._selectionModeClass,c=z._hidingSelectionMode;if(this._isInSelectionMode())r.addClass(this._canvas,b),r.removeClass(this._canvas,c);else{if(r.hasClass(this._canvas,b)){var d=this;a.setTimeout(function(){a.setTimeout(function(){r.removeClass(d._canvas,c)},z._hidingSelectionModeAnimationTimeout)},50),r.addClass(this._canvas,c)}r.removeClass(this._canvas,b)}},_lastScrollPosition:{get:function(){return this._lastScrollPositionValue},set:function(a){if(0===a)this._lastDirection="right",this._direction="right",this._lastScrollPositionValue=0;else{var b=a<this._lastScrollPositionValue?"left":"right";this._direction=this._scrollDirection(a),this._lastDirection=b,this._lastScrollPositionValue=a}}},_hasHeaderOrFooter:{get:function(){return!(!this._header&&!this._footer)}},_getHeaderOrFooterFromElement:function(a){return this._header&&this._header.contains(a)?this._header:this._footer&&this._footer.contains(a)?this._footer:null},_supportsGroupHeaderKeyboarding:{get:function(){return this._groupDataSource}},_viewportScrollPosition:{get:function(){return this._currentScrollPosition=r.getScrollPosition(this._viewport)[this._scrollProperty],this._currentScrollPosition},set:function(a){var b={};b[this._scrollProperty]=a,r.setScrollPosition(this._viewport,b),this._currentScrollPosition=a}},_canvasStart:{get:function(){return this._canvasStartValue||0},set:function(a){var b=this._horizontal()?this._rtl()?-a:a:0,c=this._horizontal()?0:a;0!==a?this._canvas.style[O.scriptName]="translate( "+b+"px, "+c+"px)":this._canvas.style[O.scriptName]="",this._canvasStartValue=a}},scrollPosition:{get:function(){return this._viewportScrollPosition},set:function(a){var b=this;this._batchViewUpdates(z._ViewChange.realize,z._ScrollToPriority.high,function(){return b._view.waitForValidScrollPosition(a).then(function(){var c=b._viewport[b._scrollLength]-b._getViewportLength();a=r._clamp(a,0,c);var d=a<b._lastScrollPosition?"left":"right";return{position:a,direction:d}})},!0)}},_setRenderer:function(a,b){var e;if(a){if("function"==typeof a)e=a;else if("object"==typeof a){if(c.validation&&!a.renderItem)throw new d("WinJS.UI.ListView.invalidTemplate",C.invalidTemplate);e=a.renderItem}}else{if(c.validation)throw new d("WinJS.UI.ListView.invalidTemplate",C.invalidTemplate);e=t.trivialHtmlRenderer}e&&(b?this._groupHeaderRenderer=e:this._itemRenderer=e)},_renderWithoutReuse:function(a,b){b&&q._disposeElement(b);var c=this._itemRenderer(a);if(c.then)return c.then(function(a){return a.tabIndex=0,a});var d=c.element||c;return d.tabIndex=0,c},_isInsertedItem:function(a){return!!this._insertedItems[a.handle]},_clearInsertedItems:function(){for(var a=Object.keys(this._insertedItems),b=0,c=a.length;c>b;b++)this._insertedItems[a[b]].release();this._insertedItems={},this._modifiedElements=[],this._countDifference=0},_cancelAsyncViewWork:function(a){this._view.stopWork(a)},_updateView:function(){function a(){c._itemsBlockExtent=-1,c._firstItemRange=null,c._firstHeaderRange=null,c._itemMargins=null,c._headerMargins=null,c._canvasMargins=null,c._cachedRTL=null,c._rtl()}function b(){c._scrollToPriority=z._ScrollToPriority.uninitialized;var a=c._setScrollbarPosition;c._setScrollbarPosition=!1;var b="number"==typeof c._scrollToFunctor?{position:c._scrollToFunctor}:c._scrollToFunctor();return m.as(b).then(function(b){return b=b||{},a&&+b.position===b.position&&(c._lastScrollPosition=b.position,c._viewportScrollPosition=b.position),b},function(b){return c._setScrollbarPosition|=a,m.wrapError(b)})}if(!this._isZombie()){var c=this,d=this._viewChange;this._viewChange=z._ViewChange.realize,d===z._ViewChange.rebuild?(this._pendingGroupWork&&this._updateGroupWork(),this._pendingLayoutReset&&this._resetLayout(),a(),this._firstTimeDisplayed||this._view.reset(),this._view.reload(b,!0),this._setFocusOnItem(this._selection._getFocused()),this._headerFooterVisibilityStatus={headerVisible:!1,footerVisible:!1}):d===z._ViewChange.remeasure?(this._view.resetItems(!0),this._resetLayout(),a(),this._view.refresh(b),this._setFocusOnItem(this._selection._getFocused()),this._headerFooterVisibilityStatus={headerVisible:!1,footerVisible:!1}):d===z._ViewChange.relayout?(this._pendingLayoutReset&&(this._resetLayout(),a()),this._view.refresh(b)):(this._view.onScroll(b),this._raiseHeaderFooterVisibilityEvent())}},_batchViewUpdates:function(a,b,c,d,e){if(this._viewChange=Math.min(this._viewChange,a),(null===this._scrollToFunctor||b>=this._scrollToPriority)&&(this._scrollToPriority=b,this._scrollToFunctor=c),this._setScrollbarPosition|=!!d,!this._batchingViewUpdates){this._raiseViewLoading();var f=this;this._batchingViewUpdatesSignal=new o,this._batchingViewUpdates=m.any([this._batchingViewUpdatesSignal.promise,n.schedulePromiseHigh(null,"WinJS.UI.ListView._updateView")]).then(function(){return f._isZombie()?void 0:f._viewChange!==z._ViewChange.rebuild||f._firstTimeDisplayed||0===Object.keys(f._view.items._itemData).length||e?void 0:f._fadeOutViewport()}).then(function(){f._batchingViewUpdates=null,f._batchingViewUpdatesSignal=null,f._updateView(),f._firstTimeDisplayed=!1},function(){f._batchingViewUpdates=null,f._batchingViewUpdatesSignal=null})}return this._batchingViewUpdatesSignal},_resetCanvas:function(){if(!this._disposed){var b=a.document.createElement("div");b.className=this._canvas.className,this._viewport.replaceChild(b,this._canvas),this._canvas=b,this._groupsToRemove={},this._canvas.appendChild(this._canvasProxy)}},_setupInternalTree:function(){r.addClass(this._element,z._listViewClass),r[this._rtl()?"addClass":"removeClass"](this._element,z._rtlListViewClass),this._element.innerHTML='<div tabIndex="-1" role="group" class="'+z._viewportClass+" "+z._horizontalClass+'"><div></div><div class="'+z._scrollableClass+'"><div class="'+z._proxyClass+'"></div></div><div></div><div></div></div><div aria-hidden="true" style="position:absolute;left:50%;top:50%;width:0px;height:0px;" tabindex="-1"></div>',
-this._viewport=this._element.firstElementChild,this._headerContainer=this._viewport.firstElementChild,r.addClass(this._headerContainer,z._listHeaderContainerClass),this._canvas=this._headerContainer.nextElementSibling,this._footerContainer=this._canvas.nextElementSibling,r.addClass(this._footerContainer,z._listFooterContainerClass),this._canvasProxy=this._canvas.firstElementChild,this._deleteWrapper=this._canvas.nextElementSibling,this._keyboardEventsHelper=this._viewport.nextElementSibling,this._tabIndex=r.getTabIndex(this._element),this._tabIndex<0&&(this._tabIndex=0),this._tabManager=new v.TabContainer(this._viewport),this._tabManager.tabIndex=this._tabIndex,this._progressBar=a.document.createElement("progress"),r.addClass(this._progressBar,z._progressClass),r.addClass(this._progressBar,"win-progress-ring"),this._progressBar.style.position="absolute",this._progressBar.max=100},_unsetFocusOnItem:function(b){this._tabManager.childFocus&&this._clearFocusRectangle(this._tabManager.childFocus),this._isZombie()||(b||(this._tabManager.childFocus&&(this._tabManager.childFocus=null),this._keyboardEventsHelper._shouldHaveFocus=!1,a.document.activeElement!==this._viewport&&this._hasKeyboardFocus&&(this._keyboardEventsHelper._shouldHaveFocus=!0,r._setActive(this._keyboardEventsHelper))),this._itemFocused=!1)},_setFocusOnItem:function(a){if(this._writeProfilerMark("_setFocusOnItem,info"),this._focusRequest&&this._focusRequest.cancel(),!this._isZombie()){var b=this,c=function(c){b._isZombie()||(b._tabManager.childFocus!==c&&(b._tabManager.childFocus=c),b._focusRequest=null,b._hasKeyboardFocus&&!b._itemFocused&&(b._selection._keyboardFocused()&&b._drawFocusRectangle(c),a.type!==w.ObjectType.groupHeader&&a.type!==w.ObjectType.item||b._view.updateAriaForAnnouncement(c,a.type===w.ObjectType.groupHeader?b._groups.length():b._cachedCount),b._itemFocused=!0,r._setActive(c)))};a.type===w.ObjectType.item?this._focusRequest=this._view.items.requestItem(a.index):a.type===w.ObjectType.groupHeader?this._focusRequest=this._groups.requestHeader(a.index):this._focusRequest=m.wrap(a.type===w.ObjectType.header?this._header:this._footer),this._focusRequest.then(c)}},_attachEvents:function(){function a(a,b,c){return{name:b?a:a.toLowerCase(),handler:function(b){d["_on"+a](b)},capture:c}}function b(a,b,c){return{capture:c,name:b?a:a.toLowerCase(),handler:function(b){var c=d._mode,e="on"+a;!d._disposed&&c[e]&&c[e](b)}}}function c(a,b){return{handler:function(b){d["_on"+a](b)},filter:b}}var d=this,e=[c("PropertyChange",["dir","style","tabindex"])];this._cachedStyleDir=this._element.style.direction,e.forEach(function(a){new r._MutationObserver(a.handler).observe(d._element,{attributes:!0,attributeFilter:a.filter})});var f=[b("PointerDown"),b("click",!1),b("PointerUp"),b("LostPointerCapture"),b("MSHoldVisual",!0),b("PointerCancel"),b("DragStart"),b("DragOver"),b("DragEnter"),b("DragLeave"),b("Drop"),b("ContextMenu")];f.forEach(function(a){r._addEventListener(d._viewport,a.name,a.handler,!!a.capture)});var g=[a("FocusIn",!1,!1),a("FocusOut",!1,!1),b("KeyDown"),b("KeyUp")];g.forEach(function(a){r._addEventListener(d._element,a.name,a.handler,!!a.capture)}),this._onElementResizeBound=this._onElementResize.bind(this),r._resizeNotifier.subscribe(this._element,this._onElementResizeBound),this._elementResizeInstrument=new y._ElementResizeInstrument,this._element.appendChild(this._elementResizeInstrument.element),this._elementResizeInstrument.addEventListener("resize",this._onElementResizeBound),r._inDom(this.element).then(function(){d._disposed||d._elementResizeInstrument.addedToDom()});var h=[a("MSManipulationStateChanged",!0),a("Scroll")];h.forEach(function(a){d._viewport.addEventListener(a.name,a.handler,!1)}),this._viewport.addEventListener("onTabEnter",this._onTabEnter.bind(this)),this._viewport.addEventListener("onTabExit",this._onTabExit.bind(this)),this._viewport.addEventListener("onTabEntered",function(a){d._mode.onTabEntered(a)}),this._viewport.addEventListener("onTabExiting",function(a){d._mode.onTabExiting(a)})},_updateItemsManager:function(){function a(a){a.detail===w.DataSourceStatus.failure&&(b.itemDataSource=null,b.groupDataSource=null)}var b=this,c={beginNotifications:function(){},changed:function(a,c){if(!b._ifZombieDispose()){b._createUpdater();var d=b._updater.elements[R(c)];if(d){var e=b.selection._isIncluded(d.index);if(e&&(b._updater.updateDrag=!0),c!==a){if(b._tabManager.childFocus!==c&&b._updater.newFocusedItem!==c||(b._updater.newFocusedItem=a,b._tabManager.childFocus=null),d.itemBox){r.addClass(a,z._itemClass),b._setupAriaSelectionObserver(a);var f=c.nextElementSibling;d.itemBox.removeChild(c),d.itemBox.insertBefore(a,f)}b._setAriaSelected(a,e),b._view.items.setItemAt(d.newIndex,{element:a,itemBox:d.itemBox,container:d.container,itemsManagerRecord:d.itemsManagerRecord}),delete b._updater.elements[R(c)],q._disposeElement(c),b._updater.elements[R(a)]={item:a,container:d.container,itemBox:d.itemBox,index:d.index,newIndex:d.newIndex,itemsManagerRecord:d.itemsManagerRecord}}else d.itemBox&&d.container&&(A._ItemEventsHandler.renderSelection(d.itemBox,a,e,!0),r[e?"addClass":"removeClass"](d.container,z._selectedClass));b._updater.changed=!0}for(var g=0,h=b._notificationHandlers.length;h>g;g++)b._notificationHandlers[g].changed(a,c);b._writeProfilerMark("changed,info")}},removed:function(a,c,d){function e(a){b._updater.updateDrag=!0,b._currentMode()._dragging&&b._currentMode()._draggingUnselectedItem&&b._currentMode()._dragInfo._isIncluded(a)&&(b._updater.newDragInfo=new I._Selection(b,[]));var c=b._updater.selectionFirst[a],d=b._updater.selectionLast[a],e=c||d;e&&(delete b._updater.selectionFirst[e.oldFirstIndex],delete b._updater.selectionLast[e.oldLastIndex],b._updater.selectionChanged=!0)}if(!b._ifZombieDispose()){b._createUpdater();var f=b._insertedItems[d];f&&delete b._insertedItems[d];var g;if(a){var h=b._updater.elements[R(a)],i=b._itemsManager.itemObject(a);if(i&&b._groupFocusCache.deleteItem(i.key),h){if(g=h.index,h.itemBox){var j=h.itemBox,k=z._containerOddClass,l=z._containerEvenClass,m=r.hasClass(j.parentElement,l)?l:k;b._updater.removed.push({index:g,itemBox:j,containerStripe:m})}b._updater.deletesCount++;var n=b._view.items.itemDataAt(g);n.removed=!0,delete b._updater.elements[R(a)]}else g=i&&i.index;b._updater.oldFocus.type!==w.ObjectType.groupHeader&&b._updater.oldFocus.index===g&&(b._updater.newFocus.index=g,b._updater.focusedItemRemoved=!0),e(g)}else g=b._updater.selectionHandles[d],g===+g&&e(g);b._writeProfilerMark("removed("+g+"),info"),b._updater.changed=!0}},updateAffectedRange:function(a){b._itemsCount().then(function(c){var d=b._view.containers?b._view.containers.length:0;a.start=Math.min(a.start,d),b._affectedRange.add(a,c)}),b._createUpdater(),b._updater.changed=!0},indexChanged:function(a,c,d){if(!b._ifZombieDispose()){if(b._createUpdater(),a){var e=b._itemsManager.itemObject(a);e&&b._groupFocusCache.updateItemIndex(e.key,c);var f=b._updater.elements[R(a)];f&&(f.newIndex=c,b._updater.changed=!0),b._updater.itemsMoved=!0}b._currentMode()._dragging&&b._currentMode()._draggingUnselectedItem&&b._currentMode()._dragInfo._isIncluded(d)&&(b._updater.newDragInfo=new I._Selection(b,[{firstIndex:c,lastIndex:c}]),b._updater.updateDrag=!0),b._updater.oldFocus.type!==w.ObjectType.groupHeader&&b._updater.oldFocus.index===d&&(b._updater.newFocus.index=c,b._updater.changed=!0),b._updater.oldSelectionPivot===d&&(b._updater.newSelectionPivot=c,b._updater.changed=!0);var g=b._updater.selectionFirst[d];g&&(g.newFirstIndex=c,b._updater.changed=!0,b._updater.selectionChanged=!0,b._updater.updateDrag=!0),g=b._updater.selectionLast[d],g&&(g.newLastIndex=c,b._updater.changed=!0,b._updater.selectionChanged=!0,b._updater.updateDrag=!0)}},endNotifications:function(){b._update()},inserted:function(a){b._ifZombieDispose()||(b._writeProfilerMark("inserted,info"),b._createUpdater(),b._updater.changed=!0,a.retain(),b._updater.insertsCount++,b._insertedItems[a.handle]=a)},moved:function(a,c,d,e){if(!b._ifZombieDispose()){if(b._createUpdater(),b._updater.movesCount++,a){b._updater.itemsMoved=!0;var f=b._updater.elements[R(a)];f&&(f.moved=!0)}var g=b._updater.selectionHandles[e.handle];if(g===+g){b._updater.updateDrag=!0,b._updater.selectionChanged=!0,b._updater.changed=!0;var h=b._updater.selectionFirst[g],i=b._updater.selectionLast[g],j=h||i;j&&j.oldFirstIndex!==j.oldLastIndex&&(delete b._updater.selectionFirst[j.oldFirstIndex],delete b._updater.selectionLast[j.oldLastIndex])}b._writeProfilerMark("moved("+g+"),info")}},countChanged:function(a,c){b._ifZombieDispose()||(b._writeProfilerMark("countChanged("+a+"),info"),b._cachedCount=a,b._createUpdater(),b._view.lastIndexDisplayed+1===c&&(b._updater.changed=!0),b._updater.countDifference+=a-c)},reload:function(){b._ifZombieDispose()||(b._writeProfilerMark("reload,info"),b._processReload())}};this._versionManager&&this._versionManager._dispose(),this._versionManager=new x._VersionManager,this._updater=null;var d=this._selection.getRanges();this._selection._selected.clear(),this._itemsManager&&(this._itemsManager.dataSource&&this._itemsManager.dataSource.removeEventListener&&this._itemsManager.dataSource.removeEventListener("statuschanged",a,!1),this._clearInsertedItems(),this._itemsManager.release()),this._itemsCountPromise&&(this._itemsCountPromise.cancel(),this._itemsCountPromise=null),this._cachedCount=z._UNINITIALIZED,this._itemsManager=t._createItemsManager(this._dataSource,this._renderWithoutReuse.bind(this),c,{ownerElement:this._element,versionManager:this._versionManager,indexInView:function(a){return a>=b.indexOfFirstVisible&&a<=b.indexOfLastVisible},viewCallsReady:!0,profilerId:this._id}),this._dataSource.addEventListener&&this._dataSource.addEventListener("statuschanged",a,!1),this._selection._selected.set(d)},_processReload:function(){this._affectedRange.addAll(),this._cancelAsyncViewWork(!0),this._currentMode()._dragging&&this._currentMode()._clearDragProperties(),this._groupFocusCache.clear(),this._selection._reset(),this._updateItemsManager(),this._pendingLayoutReset=!0,this._batchViewUpdates(z._ViewChange.rebuild,z._ScrollToPriority.low,this.scrollPosition)},_createUpdater:function(){if(!this._updater){this.itemDataSource._isVirtualizedDataSource&&this._affectedRange.addAll(),this._versionManager.beginUpdating(),this._cancelAsyncViewWork();var a={changed:!1,elements:{},selectionFirst:{},selectionLast:{},selectionHandles:{},oldSelectionPivot:{type:w.ObjectType.item,index:z._INVALID_INDEX},newSelectionPivot:{type:w.ObjectType.item,index:z._INVALID_INDEX},removed:[],selectionChanged:!1,oldFocus:{type:w.ObjectType.item,index:z._INVALID_INDEX},newFocus:{type:w.ObjectType.item,index:z._INVALID_INDEX},hadKeyboardFocus:this._hasKeyboardFocus,itemsMoved:!1,lastVisible:this.indexOfLastVisible,updateDrag:!1,movesCount:0,insertsCount:0,deletesCount:0,countDifference:0};this._view.items.each(function(b,c,d){a.elements[R(c)]={item:c,container:d.container,itemBox:d.itemBox,index:b,newIndex:b,itemsManagerRecord:d.itemsManagerRecord,detached:d.detached}});for(var b=this._selection._selected._ranges,c=0,d=b.length;d>c;c++){var e=b[c],f={newFirstIndex:b[c].firstIndex,oldFirstIndex:b[c].firstIndex,newLastIndex:b[c].lastIndex,oldLastIndex:b[c].lastIndex};a.selectionFirst[f.oldFirstIndex]=f,a.selectionLast[f.oldLastIndex]=f,a.selectionHandles[e.firstPromise.handle]=f.oldFirstIndex,a.selectionHandles[e.lastPromise.handle]=f.oldLastIndex}a.oldSelectionPivot=this._selection._pivot,a.newSelectionPivot=a.oldSelectionPivot,a.oldFocus=this._selection._getFocused(),a.newFocus=this._selection._getFocused(),this._updater=a}},_synchronize:function(){var a=this._updater;if(this._updater=null,this._groupsChanged=!1,this._countDifference=this._countDifference||0,a&&a.changed){a.itemsMoved&&this._layout.itemsMoved&&this._layout.itemsMoved(),a.removed.length&&this._layout.itemsRemoved&&this._layout.itemsRemoved(a.removed.map(function(a){return a.itemBox})),(a.itemsMoved||a.removed.length||Object.keys(this._insertedItems).length)&&this._layout.setupAnimations&&this._layout.setupAnimations(),this._currentMode().onDataChanged&&this._currentMode().onDataChanged();var b=[];for(var c in a.selectionFirst)if(a.selectionFirst.hasOwnProperty(c)){var d=a.selectionFirst[c];a.selectionChanged=a.selectionChanged||d.newLastIndex-d.newFirstIndex!==d.oldLastIndex-d.oldFirstIndex,d.newFirstIndex<=d.newLastIndex&&b.push({firstIndex:d.newFirstIndex,lastIndex:d.newLastIndex})}if(a.selectionChanged){var e=new I._Selection(this,b);this._selection._fireSelectionChanging(e),this._selection._selected.set(b),this._selection._fireSelectionChanged(),e.clear()}else this._selection._selected.set(b);this._selection._updateCount(this._cachedCount),a.newSelectionPivot=Math.min(this._cachedCount-1,a.newSelectionPivot),this._selection._pivot=a.newSelectionPivot>=0?a.newSelectionPivot:z._INVALID_INDEX,a.newFocus.type!==w.ObjectType.groupHeader&&(a.newFocus.index=Math.max(0,Math.min(this._cachedCount-1,a.newFocus.index))),this._selection._setFocused(a.newFocus,this._selection._keyboardFocused());var f=this._modifiedElements||[],g={};for(this._modifiedElements=[],this._countDifference+=a.countDifference,c=0;c<f.length;c++){var h=f[c];-1===h.newIndex?this._modifiedElements.push(h):g[h.newIndex]=h}for(c=0;c<a.removed.length;c++){var i=a.removed[c],h=g[i.index];h?delete g[i.index]:h={oldIndex:i.index},h.newIndex=-1,h._removalHandled||(h._itemBox=i.itemBox,h._containerStripe=i.containerStripe),this._modifiedElements.push(h)}var j=Object.keys(this._insertedItems);for(c=0;c<j.length;c++)this._modifiedElements.push({oldIndex:-1,newIndex:this._insertedItems[j[c]].index});this._writeProfilerMark("_synchronize:update_modifiedElements,StartTM");var k={};for(c in a.elements)if(a.elements.hasOwnProperty(c)){var l=a.elements[c];k[l.newIndex]={element:l.item,container:l.container,itemBox:l.itemBox,itemsManagerRecord:l.itemsManagerRecord,detached:l.detached};var h=g[l.index];h?(delete g[l.index],h.newIndex=l.newIndex):h={oldIndex:l.index,newIndex:l.newIndex},h.moved=l.moved,this._modifiedElements.push(h)}this._writeProfilerMark("_synchronize:update_modifiedElements,StopTM");var m=Object.keys(g);for(c=0;c<m.length;c++){var n=m[c],h=g[n];-1!==h.oldIndex&&this._modifiedElements.push(h)}this._view.items._itemData=k,a.updateDrag&&this._currentMode()._dragging&&(this._currentMode()._draggingUnselectedItem?a.newDragInfo&&(this._currentMode()._dragInfo=a.newDragInfo):this._currentMode()._dragInfo=this._selection,this._currentMode().fireDragUpdateEvent()),a.focusedItemRemoved||this._focusRequest&&a.oldFocus.index!==a.newFocus.index||a.oldFocus.type!==a.newFocus.type?(this._itemFocused=!1,this._setFocusOnItem(this._selection._getFocused())):a.newFocusedItem&&(this._hasKeyboardFocus=a.hadKeyboardFocus,this._itemFocused=!1,this._setFocusOnItem(this._selection._getFocused()));var o=this;return this._groups.synchronizeGroups().then(function(){return a.newFocus.type===w.ObjectType.groupHeader&&(a.newFocus.index=Math.min(o._groups.length()-1,a.newFocus.index),a.newFocus.index<0&&(a.newFocus={type:w.ObjectType.item,index:0}),o._selection._setFocused(a.newFocus,o._selection._keyboardFocused())),o._versionManager.endUpdating(),a.deletesCount>0&&o._updateDeleteWrapperSize(),o._view.updateTree(o._cachedCount,o._countDifference,o._modifiedElements)}).then(function(){return o._lastScrollPosition})}this._countDifference+=a?a.countDifference:0;var o=this;return this._groups.synchronizeGroups().then(function(){return a&&o._versionManager.endUpdating(),o._view.updateTree(o._cachedCount,o._countDifference,o._modifiedElements)}).then(function(){return o.scrollPosition})},_updateDeleteWrapperSize:function(a){var b=this._horizontal()?"width":"height";this._deleteWrapper.style["min-"+b]=(a?0:this.scrollPosition+this._getViewportSize()[b])+"px"},_verifyRealizationNeededForChange:function(){var a=!1,b=(this._view.lastIndexDisplayed||0)-(this._view.firstIndexDisplayed||0),c=this._updater&&0===this._updater.movesCount&&0===this._updater.insertsCount&&this._updater.deletesCount>0&&this._updater.deletesCount===Math.abs(this._updater.countDifference);if(c&&this._updater.elements)for(var d=Object.keys(this._updater.elements),e=0,f=d.length;f>e;e++){var g=this._updater.elements[d[e]],h=g.index-g.newIndex;if(0>h||h>this._updater.deletesCount){c=!1;break}}this._view.deletesWithoutRealize=this._view.deletesWithoutRealize||0,c&&this._view.lastIndexDisplayed<this._view.end-b&&this._updater.deletesCount+this._view.deletesWithoutRealize<b?(a=!0,this._view.deletesWithoutRealize+=Math.abs(this._updater.countDifference),this._writeProfilerMark("skipping realization on delete,info")):this._view.deletesWithoutRealize=0,this._view._setSkipRealizationForChange(a)},_update:function(){if(this._writeProfilerMark("update,StartTM"),!this._ifZombieDispose()){this._updateJob=null;var a=this;this._versionManager.noOutstandingNotifications&&(this._updater||this._groupsChanged?(this._cancelAsyncViewWork(),this._verifyRealizationNeededForChange(),this._synchronize().then(function(b){a._writeProfilerMark("update,StopTM"),a._batchViewUpdates(z._ViewChange.relayout,z._ScrollToPriority.low,b).complete()})):this._batchViewUpdates(z._ViewChange.relayout,z._ScrollToPriority.low,this._lastScrollPosition).complete())}},_scheduleUpdate:function(){if(!this._updateJob){var a=this;this._updateJob=n.schedulePromiseHigh(null,"WinJS.UI.ListView._update").then(function(){a._updateJob&&a._update()}),this._raiseViewLoading()}},_createGroupsContainer:function(){this._groups&&this._groups.cleanUp(),this._groupDataSource?this._groups=new E._UnvirtualizedGroupsContainer(this,this._groupDataSource):this._groups=new E._NoGroups(this)},_createLayoutSite:function(){var b=this;return Object.create({invalidateLayout:function(){b._pendingLayoutReset=!0;var a="horizontal"===b._layout.orientation!==b._horizontalLayout;b._affectedRange.addAll(),b._batchViewUpdates(z._ViewChange.rebuild,z._ScrollToPriority.low,a?0:b.scrollPosition,!1,!0)},itemFromIndex:function(a){return b._itemsManager._itemPromiseAtIndex(a)},groupFromIndex:function(a){return b._groupsEnabled()?a<b._groups.length()?b._groups.group(a).userData:null:{key:"-1"}},groupIndexFromItemIndex:function(a){return a=Math.max(0,a),b._groups.groupFromItem(a)},renderItem:function(c){return m._cancelBlocker(b._itemsManager._itemFromItemPromise(c)).then(function(c){if(c){var d=b._itemsManager._recordFromElement(c);d.pendingReady&&d.pendingReady(),c=c.cloneNode(!0),r.addClass(c,z._itemClass);var e=a.document.createElement("div");r.addClass(e,z._itemBoxClass),e.appendChild(c);var f=a.document.createElement("div");return r.addClass(f,z._containerClass),f.appendChild(e),f}return m.cancel})},renderHeader:function(c){var d=t._normalizeRendererReturn(b.groupHeaderTemplate(m.wrap(c)));return d.then(function(b){r.addClass(b.element,z._headerClass);var c=a.document.createElement("div");return r.addClass(c,z._headerContainerClass),c.appendChild(b.element),c})},readyToMeasure:function(){b._getViewportLength(),b._getCanvasMargins()},_isZombie:function(){return b._isZombie()},_writeProfilerMark:function(a){b._writeProfilerMark(a)}},{_itemsManager:{enumerable:!0,get:function(){return b._itemsManager}},rtl:{enumerable:!0,get:function(){return b._rtl()}},surface:{enumerable:!0,get:function(){return b._canvas}},viewport:{enumerable:!0,get:function(){return b._viewport}},scrollbarPos:{enumerable:!0,get:function(){return b.scrollPosition}},viewportSize:{enumerable:!0,get:function(){return b._getViewportSize()}},loadingBehavior:{enumerable:!0,get:function(){return b.loadingBehavior}},animationsDisabled:{enumerable:!0,get:function(){return b._animationsDisabled()}},tree:{enumerable:!0,get:function(){return b._view.tree}},realizedRange:{enumerable:!0,get:function(){return{firstPixel:Math.max(0,b.scrollPosition-2*b._getViewportLength()),lastPixel:b.scrollPosition+3*b._getViewportLength()-1}}},visibleRange:{enumerable:!0,get:function(){return{firstPixel:b.scrollPosition,lastPixel:b.scrollPosition+b._getViewportLength()-1}}},itemCount:{enumerable:!0,get:function(){return b._itemsCount()}},groupCount:{enumerable:!0,get:function(){return b._groups.length()}},header:{enumerable:!0,get:function(){return b.header}},footer:{enumerable:!0,get:function(){return b.footer}}})},_initializeLayout:function(){this._affectedRange.addAll();var a=this._createLayoutSite();return this._layout.initialize(a,this._groupsEnabled()),"horizontal"===this._layout.orientation},_resetLayoutOrientation:function(a){this._horizontalLayout?(this._startProperty="left",this._scrollProperty="scrollLeft",this._scrollLength="scrollWidth",this._deleteWrapper.style.minHeight="",r.addClass(this._viewport,z._horizontalClass),r.removeClass(this._viewport,z._verticalClass),a&&(this._viewport.scrollTop=0)):(this._startProperty="top",this._scrollProperty="scrollTop",this._scrollLength="scrollHeight",this._deleteWrapper.style.minWidth="",r.addClass(this._viewport,z._verticalClass),r.removeClass(this._viewport,z._horizontalClass),a&&r.setScrollPosition(this._viewport,{scrollLeft:0}))},_resetLayout:function(){this._pendingLayoutReset=!1,this._affectedRange.addAll(),this._layout&&(this._layout.uninitialize(),this._horizontalLayout=this._initializeLayout(),this._resetLayoutOrientation())},_updateLayout:function(a){var b=!1;this._layout&&(this._cancelAsyncViewWork(!0),this._layout.uninitialize(),b=!0);var c;if(a&&"function"==typeof a.type){var d=T(a.type);c=new d(a)}else c=a&&a.initialize?a:new H.GridLayout(a);b&&this._resetCanvas(),this._layoutImpl=c,this._layout=new H._LayoutWrapper(c),b&&this._unsetFocusOnItem(),this._setFocusOnItem({type:w.ObjectType.item,index:0}),this._selection._setFocused({type:w.ObjectType.item,index:0}),this._lastFocusedElementInGroupTrack={type:w.ObjectType.item,index:-1},this._headerContainer.style.opacity=0,this._footerContainer.style.opacity=0,this._horizontalLayout=this._initializeLayout(),this._resetLayoutOrientation(b),b&&(this._canvas.style.width=this._canvas.style.height="")},_currentMode:function(){return this._mode},_setDraggable:function(){var a=this.itemsDraggable||this.itemsReorderable;this._view.items.each(function(b,c,d){d.itemBox&&(d.itemBox.draggable=a&&!r.hasClass(c,z._nonDraggableClass))})},_resizeViewport:function(){this._viewportWidth=z._UNINITIALIZED,this._viewportHeight=z._UNINITIALIZED},_onElementResize:function(){this._writeProfilerMark("_onElementResize,info"),n.schedule(function(){if(!this._isZombie()&&this._viewportWidth!==z._UNINITIALIZED&&this._viewportHeight!==z._UNINITIALIZED){var a=this._element.offsetWidth,b=this._element.offsetHeight;if(this._previousWidth!==a||this._previousHeight!==b){this._writeProfilerMark("resize ("+this._previousWidth+"x"+this._previousHeight+") => ("+a+"x"+b+"),info"),this._previousWidth=a,this._previousHeight=b,this._resizeViewport();var c=this;this._affectedRange.addAll(),this._batchViewUpdates(z._ViewChange.relayout,z._ScrollToPriority.low,function(){return{position:c.scrollPosition,direction:"right"}})}}},n.Priority.max,this,"WinJS.UI.ListView._onElementResize")},_onFocusIn:function(a){function b(a){c._changeFocus(c._selection._getFocused(),!0,!1,!1,a)}this._hasKeyboardFocus=!0;var c=this;if(a.target===this._keyboardEventsHelper)!this._keyboardEventsHelper._shouldHaveFocus&&this._keyboardFocusInbound?b(!0):this._keyboardEventsHelper._shouldHaveFocus=!1;else if(a.target===this._element)b();else{if(this._mode.inboundFocusHandled)return void(this._mode.inboundFocusHandled=!1);var d=this._view.items,e={},f=this._getHeaderOrFooterFromElement(a.target),g=null;if(f?(e.index=0,e.type=f===this._header?w.ObjectType.header:w.ObjectType.footer,this._lastFocusedElementInGroupTrack=e):(f=this._groups.headerFrom(a.target),f?(e.type=w.ObjectType.groupHeader,e.index=this._groups.index(f),this._lastFocusedElementInGroupTrack=e):(e.index=d.index(a.target),e.type=w.ObjectType.item,f=d.itemBoxAt(e.index),g=d.itemAt(e.index))),e.index!==z._INVALID_INDEX&&((this._keyboardFocusInbound||this._selection._keyboardFocused())&&(e.type===w.ObjectType.groupHeader&&a.target===f||e.type===w.ObjectType.item&&a.target.parentNode===f)&&this._drawFocusRectangle(f),this._tabManager.childFocus!==f&&this._tabManager.childFocus!==g&&(this._selection._setFocused(e,this._keyboardFocusInbound||this._selection._keyboardFocused()),this._keyboardFocusInbound=!1,e.type===w.ObjectType.item&&(f=d.itemAt(e.index)),this._tabManager.childFocus=f,c._updater))){var h=c._updater.elements[R(f)],i=e.index;h&&h.newIndex&&(i=h.newIndex),c._updater.oldFocus={type:e.type,index:i},c._updater.newFocus={type:e.type,index:i}}}},_onFocusOut:function(a){if(!this._disposed){this._hasKeyboardFocus=!1,this._itemFocused=!1;var b=this._view.items.itemBoxFrom(a.target)||this._groups.headerFrom(a.target);b&&this._clearFocusRectangle(b)}},_onMSManipulationStateChanged:function(a){function b(){c._manipulationEndSignal=null}var c=this;this._manipulationState=a.currentState,c._writeProfilerMark("_onMSManipulationStateChanged state("+a.currentState+"),info"),this._manipulationState===r._MSManipulationEvent.MS_MANIPULATION_STATE_STOPPED||this._manipulationEndSignal||(this._manipulationEndSignal=new o,this._manipulationEndSignal.promise.done(b,b)),this._manipulationState===r._MSManipulationEvent.MS_MANIPULATION_STATE_STOPPED&&this._manipulationEndSignal.complete()},_pendingScroll:!1,_onScroll:function(){this._zooming||this._pendingScroll||this._checkScroller()},_checkScroller:function(){if(!this._isZombie()){var a=this._viewportScrollPosition;if(a!==this._lastScrollPosition){this._pendingScroll=c._requestAnimationFrame(this._checkScroller.bind(this)),a=Math.max(0,a);var b=this._scrollDirection(a);this._lastScrollPosition=a,this._raiseViewLoading(!0),this._raiseHeaderFooterVisibilityEvent();var d=this;this._view.onScroll(function(){return{position:d._lastScrollPosition,direction:b}},this._manipulationEndSignal?this._manipulationEndSignal.promise:m.timeout(z._DEFERRED_SCROLL_END))}else this._pendingScroll=null}},_scrollDirection:function(a){var b=a<this._lastScrollPosition?"left":"right";return b===this._lastDirection?b:this._direction},_onTabEnter:function(){this._keyboardFocusInbound=!0},_onTabExit:function(){this._keyboardFocusInbound=!1},_onPropertyChange:function(a){var b=this;a.forEach(function(a){var c=!1;if("dir"===a.attributeName?c=!0:"style"===a.attributeName&&(c=b._cachedStyleDir!==a.target.style.direction),c&&(b._cachedStyleDir=a.target.style.direction,b._cachedRTL=null,r[b._rtl()?"addClass":"removeClass"](b._element,z._rtlListViewClass),b._lastScrollPosition=0,b._viewportScrollPosition=0,b.forceLayout()),"tabIndex"===a.attributeName){var d=b._element.tabIndex;d>=0&&(b._view.items.each(function(a,b){b.tabIndex=d}),b._header&&(b._header.tabIndex=d),b._footer&&(b._footer.tabIndex=d),b._tabIndex=d,b._tabManager.tabIndex=d,b._element.tabIndex=-1)}})},_getCanvasMargins:function(){return this._canvasMargins||(this._canvasMargins=H._getMargins(this._canvas)),this._canvasMargins},_convertCoordinatesByCanvasMargins:function(a,b){function c(c,d){void 0!==a[c]&&(a[c]=b(a[c],d))}var d;return this._horizontal()?(d=this._getCanvasMargins()[this._rtl()?"right":"left"],c("left",d)):(d=this._getCanvasMargins().top,c("top",d)),c("begin",d),c("end",d),a},_convertFromCanvasCoordinates:function(a){return this._convertCoordinatesByCanvasMargins(a,function(a,b){return a+b})},_convertToCanvasCoordinates:function(a){return this._convertCoordinatesByCanvasMargins(a,function(a,b){return a-b})},_getViewportSize:function(){return this._viewportWidth!==z._UNINITIALIZED&&this._viewportHeight!==z._UNINITIALIZED||(this._viewportWidth=Math.max(0,r.getContentWidth(this._element)),this._viewportHeight=Math.max(0,r.getContentHeight(this._element)),this._writeProfilerMark("viewportSizeDetected width:"+this._viewportWidth+" height:"+this._viewportHeight),this._previousWidth=this._element.offsetWidth,this._previousHeight=this._element.offsetHeight),{width:this._viewportWidth,height:this._viewportHeight}},_itemsCount:function(){function a(){b._itemsCountPromise=null}var b=this;if(this._cachedCount!==z._UNINITIALIZED)return m.wrap(this._cachedCount);var c;return this._itemsCountPromise?c=this._itemsCountPromise:(c=this._itemsCountPromise=this._itemsManager.dataSource.getCount().then(function(a){return a===w.CountResult.unknown&&(a=0),b._cachedCount=a,b._selection._updateCount(b._cachedCount),a},function(){return m.cancel}),this._itemsCountPromise.then(a,a)),c},_isSelected:function(a){return this._selection._isIncluded(a)},_LoadingState:{itemsLoading:"itemsLoading",viewPortLoaded:"viewPortLoaded",itemsLoaded:"itemsLoaded",complete:"complete"},_raiseViewLoading:function(a){this._loadingState!==this._LoadingState.itemsLoading&&(this._scrolling=!!a),this._setViewState(this._LoadingState.itemsLoading)},_raiseViewComplete:function(){this._disposed||this._view.animating||this._setViewState(this._LoadingState.complete)},_raiseHeaderFooterVisibilityEvent:function(){var b=this,c=function(a){if(!a)return!1;var c=b._lastScrollPosition,d=a[b._horizontal()?"offsetLeft":"offsetTop"],e=a[b._horizontal()?"offsetWidth":"offsetHeight"];return d+e>c&&d<c+b._getViewportLength()},d=function(c,d){var e=a.document.createEvent("CustomEvent");e.initCustomEvent(c,!0,!0,{visible:d}),b._element.dispatchEvent(e)},e=!!this._header&&c(this._headerContainer),f=!!this._footer&&c(this._footerContainer);this._headerFooterVisibilityStatus.headerVisible!==e&&(this._headerFooterVisibilityStatus.headerVisible=e,d("headervisibilitychanged",e)),this._headerFooterVisibilityStatus.footerVisible!==f&&(this._headerFooterVisibilityStatus.footerVisible=f,d("footervisibilitychanged",f))},_setViewState:function(b){if(b!==this._loadingState){var c={scrolling:!1};switch(b){case this._LoadingState.viewPortLoaded:this._scheduledForDispose||(L(this),this._scheduledForDispose=!0),this._setViewState(this._LoadingState.itemsLoading);break;case this._LoadingState.itemsLoaded:c={scrolling:this._scrolling},this._setViewState(this._LoadingState.viewPortLoaded);break;case this._LoadingState.complete:this._setViewState(this._LoadingState.itemsLoaded),this._updateDeleteWrapperSize(!0)}this._writeProfilerMark("loadingStateChanged:"+b+",info"),this._loadingState=b;var d=a.document.createEvent("CustomEvent");d.initCustomEvent("loadingstatechanged",!0,!1,c),this._element.dispatchEvent(d)}},_createTemplates:function(){function b(b,c){var d=a.document.createElement("div");return d.className=b,c||d.setAttribute("aria-hidden",!0),d}this._itemBoxTemplate=b(z._itemBoxClass,!0)},_updateSelection:function(){var a=this._selection.getIndices(),b=this._selection.isEverything(),c={};if(!b)for(var d=0,e=a.length;e>d;d++){var f=a[d];c[f]=!0}this._view.items.each(function(a,d,e){if(e.itemBox){var f=b||!!c[a];A._ItemEventsHandler.renderSelection(e.itemBox,d,f,!0),e.container&&r[f?"addClass":"removeClass"](e.container,z._selectedClass)}})},_getViewportLength:function(){return this._getViewportSize()[this._horizontal()?"width":"height"]},_horizontal:function(){return this._horizontalLayout},_rtl:function(){return"boolean"!=typeof this._cachedRTL&&(this._cachedRTL="rtl"===r._getComputedStyle(this._element,null).direction),this._cachedRTL},_showProgressBar:function(a,b,c){var d=this._progressBar,e=d.style;if(!d.parentNode){this._fadingProgressBar=!1,this._progressIndicatorDelayTimer&&this._progressIndicatorDelayTimer.cancel();var f=this;this._progressIndicatorDelayTimer=m.timeout(z._LISTVIEW_PROGRESS_DELAY).then(function(){f._isZombie()||(a.appendChild(d),j.fadeIn(d),f._progressIndicatorDelayTimer=null)})}e[this._rtl()?"right":"left"]=b,e.top=c},_hideProgressBar:function(){this._progressIndicatorDelayTimer&&(this._progressIndicatorDelayTimer.cancel(),this._progressIndicatorDelayTimer=null);var a=this._progressBar;if(a.parentNode&&!this._fadingProgressBar){this._fadingProgressBar=!0;var b=this;j.fadeOut(a).then(function(){a.parentNode&&a.parentNode.removeChild(a),b._fadingProgressBar=!1;
-})}},_getPanAxis:function(){return this._horizontal()?"horizontal":"vertical"},_configureForZoom:function(a,b,e){if(c.validation&&(!this._view.realizePage||"number"!=typeof this._view.begin))throw new d("WinJS.UI.ListView.NotCompatibleWithSemanticZoom",S.notCompatibleWithSemanticZoom);this._isZoomedOut=a,this._disableEntranceAnimation=!b,this._isCurrentZoomView=b,this._triggerZoom=e},_setCurrentItem:function(a,b){this._rtl()&&(a=this._viewportWidth-a),this._horizontal()?a+=this.scrollPosition:b+=this.scrollPosition;var c=this._view.hitTest(a,b),d={type:c.type?c.type:w.ObjectType.item,index:c.index};d.index>=0&&(this._hasKeyboardFocus?this._changeFocus(d,!0,!1,!0):this._changeFocusPassively(d))},_getCurrentItem:function(){var a=this._selection._getFocused();a.type===w.ObjectType.groupHeader?a={type:w.ObjectType.item,index:this._groups.group(a.index).startIndex}:a.type!==w.ObjectType.item&&(a={type:w.ObjectType.item,index:a.type===w.ObjectType.header?0:this._cachedCount}),"number"!=typeof a.index&&(this._setCurrentItem(.5*this._viewportWidth,.5*this._viewportHeight),a=this._selection._getFocused());var b=this,c=this._getItemOffsetPosition(a.index).then(function(a){var c=b._canvasStart;return a[b._startProperty]+=c,a});return m.join({item:this._dataSource.itemFromIndex(a.index),position:c})},_animateItemsForPhoneZoom:function(){function a(a,b,c){return function(d){return(b[d]-a)*c}}function b(){for(var a=0,b=c.length;b>a;a++)c[a].style[O.scriptName]=""}for(var c=[],d=[],e=[],f=Number.MAX_VALUE,g=this,h=this._view.firstIndexDisplayed,i=Math.min(this._cachedCount,this._view.lastIndexDisplayed+1);i>h;h++)e.push(this._view.waitForEntityPosition({type:w.ObjectType.item,index:h}).then(function(){c.push(g._view.items.containerAt(h));var a=0;if(g.layout._getItemPosition){var b=g.layout._getItemPosition(h);b.row&&(a=b.row)}d.push(a),f=Math.min(a,f)}));return m.join(e).then(function(){return(0===c.length?m.wrap():k.executeTransition(c,{property:O.cssName,delay:a(f,d,30),duration:100,timing:"ease-in-out",from:g._isCurrentZoomView?"rotateX(0deg)":"rotateX(-90deg)",to:g._isCurrentZoomView?"rotateX(90deg)":"rotateX(0deg)"})).then(b,b)}).then(b,b)},_beginZoom:function(){this._zooming=!0;var a=null;if(c.isPhone){if(this._isZoomedOut)if(this._zoomAnimationPromise&&this._zoomAnimationPromise.cancel(),this._isCurrentZoomView){var b=this,d=function(){b._zoomAnimationPromise=null};this._zoomAnimationPromise=a=this._animateItemsForPhoneZoom().then(d,d)}else this._zoomAnimationPromise=new o,a=this._zoomAnimationPromise.promise}else{var e=this._horizontal(),f=-this.scrollPosition;r.addClass(this._viewport,e?z._zoomingXClass:z._zoomingYClass),this._canvasStart=f,r.addClass(this._viewport,e?z._zoomingYClass:z._zoomingXClass)}return a},_positionItem:function(a,b){function e(a){return f._getItemOffsetPosition(a).then(function(d){var e,g=f._horizontal(),h=f._viewport[g?"scrollWidth":"scrollHeight"],i=g?f._viewportWidth:f._viewportHeight,j=g?"headerContainerWidth":"headerContainerHeight",k=f.layout._sizes,l=0;k&&k[j]&&(l=k[j]);var m=c.isPhone?l:b[f._startProperty],n=i-(g?d.width:d.height);m=Math.max(0,Math.min(n,m)),e=d[f._startProperty]-m;var o=Math.max(0,Math.min(h-i,e)),p=o-e;e=o;var q={type:w.ObjectType.item,index:a};if(f._hasKeyboardFocus?f._changeFocus(q,!0):f._changeFocusPassively(q),f._raiseViewLoading(!0),c.isPhone)f._viewportScrollPosition=e;else{var r=-e;f._canvasStart=r}if(f._view.realizePage(e,!0),c.isPhone&&f._isZoomedOut){var s=function(){f._zoomAnimationPromise&&f._zoomAnimationPromise.complete&&f._zoomAnimationPromise.complete(),f._zoomAnimationPromise=null};f._animateItemsForPhoneZoom().then(s,s)}return g?{x:p,y:0}:{x:0,y:p}})}var f=this,g=0;if(a&&(g=this._isZoomedOut?a.groupIndexHint:a.firstItemIndexHint),"number"==typeof g)return e(g);var h,i=this._isZoomedOut?a.groupKey:a.firstItemKey;if("string"==typeof i&&this._dataSource.itemFromKey)h=this._dataSource.itemFromKey(i,this._isZoomedOut?{groupMemberKey:a.key,groupMemberIndex:a.index}:null);else{var j=this._isZoomedOut?a.groupDescription:a.firstItemDescription;if(c.validation&&void 0===j)throw new d("WinJS.UI.ListView.InvalidItem",S.listViewInvalidItem);h=this._dataSource.itemFromDescription(j)}return h.then(function(a){return e(a.index)})},_endZoom:function(a){if(!this._isZombie()){if(!c.isPhone){var b=this._canvasStart;r.removeClass(this._viewport,z._zoomingYClass),r.removeClass(this._viewport,z._zoomingXClass),this._canvasStart=0,this._viewportScrollPosition=-b}this._disableEntranceAnimation=!a,this._isCurrentZoomView=a,this._zooming=!1,this._view.realizePage(this.scrollPosition,!1)}},_getItemOffsetPosition:function(a){var b=this;return this._getItemOffset({type:w.ObjectType.item,index:a}).then(function(a){return b._ensureFirstColumnRange(w.ObjectType.item).then(function(){return a=b._correctRangeInFirstColumn(a,w.ObjectType.item),a=b._convertFromCanvasCoordinates(a),b._horizontal()?(a.left=a.begin,a.width=a.end-a.begin,a.height=a.totalHeight):(a.top=a.begin,a.height=a.end-a.begin,a.width=a.totalWidth),a})})},_groupRemoved:function(a){this._groupFocusCache.deleteGroup(a)},_updateFocusCache:function(a){this._updateFocusCacheItemRequest&&this._updateFocusCacheItemRequest.cancel();var b=this;this._updateFocusCacheItemRequest=this._view.items.requestItem(a).then(function(){b._updateFocusCacheItemRequest=null;var c=b._view.items.itemDataAt(a),d=b._groups.groupFromItem(a),e=b._groups.group(d).key;c.itemsManagerRecord.item&&b._groupFocusCache.updateCache(e,c.itemsManagerRecord.item.key,a)})},_changeFocus:function(a,b,c,d,e){if(!this._isZombie()){var f;if(a.type===w.ObjectType.item)f=this._view.items.itemAt(a.index),!b&&f&&r.hasClass(f,z._nonSelectableClass)&&(b=!0),this._updateFocusCache(a.index);else if(a.type===w.ObjectType.groupHeader){this._lastFocusedElementInGroupTrack=a;var g=this._groups.group(a.index);f=g&&g.header}else this._lastFocusedElementInGroupTrack=a,f=a.type===w.ObjectType.footer?this._footer:this._header;this._unsetFocusOnItem(!!f),this._hasKeyboardFocus=!0,this._selection._setFocused(a,e),d||this.ensureVisible(a),!b&&this._selectFocused(c)&&this._selection.set(a.index),this._setFocusOnItem(a)}},_changeFocusPassively:function(a){var b;switch(a.type){case w.ObjectType.item:b=this._view.items.itemAt(a.index),this._updateFocusCache(a.index);break;case w.ObjectType.groupHeader:this._lastFocusedElementInGroupTrack=a;var c=this._groups.group(a.index);b=c&&c.header;break;case w.ObjectType.header:this._lastFocusedElementInGroupTrack=a,b=this._header;break;case w.ObjectType.footer:this._lastFocusedElementInGroupTrack=a,b=this._footer}this._unsetFocusOnItem(!!b),this._selection._setFocused(a),this._setFocusOnItem(a)},_drawFocusRectangle:function(b){if(b!==this._header&&b!==this._footer)if(r.hasClass(b,z._headerClass))r.addClass(b,z._itemFocusClass);else{var c=this._view.items.itemBoxFrom(b);if(c.querySelector("."+z._itemFocusOutlineClass))return;r.addClass(c,z._itemFocusClass);var d=a.document.createElement("div");d.className=z._itemFocusOutlineClass,c.appendChild(d)}},_clearFocusRectangle:function(a){if(a&&!this._isZombie()&&a!==this._header&&a!==this._footer){var b=this._view.items.itemBoxFrom(a);if(b){r.removeClass(b,z._itemFocusClass);var c=b.querySelector("."+z._itemFocusOutlineClass);c&&c.parentNode.removeChild(c)}else{var d=this._groups.headerFrom(a);d&&r.removeClass(d,z._itemFocusClass)}}},_defaultInvoke:function(a){(this._isZoomedOut||c.isPhone&&this._triggerZoom&&a.type===w.ObjectType.groupHeader)&&(this._changeFocusPassively(a),this._triggerZoom())},_selectionAllowed:function(a){var b=void 0!==a?this.elementFromIndex(a):null,c=!(b&&r.hasClass(b,z._nonSelectableClass));return c&&this._selectionMode!==w.SelectionMode.none},_multiSelection:function(){return this._selectionMode===w.SelectionMode.multi},_isInSelectionMode:function(){return this.tapBehavior===w.TapBehavior.toggleSelect&&this.selectionMode===w.SelectionMode.multi},_selectOnTap:function(){return this._tap===w.TapBehavior.toggleSelect||this._tap===w.TapBehavior.directSelect},_selectFocused:function(a){return this._tap===w.TapBehavior.directSelect&&this._selectionMode===w.SelectionMode.multi&&!a},_dispose:function(){if(!this._disposed){this._disposed=!0;var a=function(a){a&&(a.textContent="")};r._resizeNotifier.unsubscribe(this._element,this._onElementResizeBound),this._elementResizeInstrument.dispose(),this._batchingViewUpdates&&this._batchingViewUpdates.cancel(),this._view&&this._view._dispose&&this._view._dispose(),this._mode&&this._mode._dispose&&this._mode._dispose(),this._groups&&this._groups._dispose&&this._groups._dispose(),this._selection&&this._selection._dispose&&this._selection._dispose(),this._layout&&this._layout.uninitialize&&this._layout.uninitialize(),this._itemsCountPromise&&this._itemsCountPromise.cancel(),this._versionManager&&this._versionManager._dispose(),this._clearInsertedItems(),this._itemsManager&&this._itemsManager.release(),this._zoomAnimationPromise&&this._zoomAnimationPromise.cancel(),a(this._viewport),a(this._canvas),a(this._canvasProxy),this._versionManager=null,this._view=null,this._mode=null,this._element=null,this._viewport=null,this._itemsManager=null,this._canvas=null,this._canvasProxy=null,this._itemsCountPromise=null,this._scrollToFunctor=null;var b=Q.indexOf(this);b>=0&&Q.splice(b,1)}},_isZombie:function(){return this._disposed||!(this.element.firstElementChild&&a.document.body.contains(this.element))},_ifZombieDispose:function(){var a=this._isZombie();return a&&!this._disposed&&L(this),a},_animationsDisabled:function(){return 0===this._viewportWidth||0===this._viewportHeight?!0:!k.isAnimationEnabled()},_fadeOutViewport:function(){var a=this;return new m(function(b){if(a._animationsDisabled())return void b();if(!a._fadingViewportOut){a._waitingEntranceAnimationPromise&&(a._waitingEntranceAnimationPromise.cancel(),a._waitingEntranceAnimationPromise=null);var c=a._fireAnimationEvent(U.contentTransition);a._firedAnimationEvent=!0,c.prevented?(a._disableEntranceAnimation=!0,a._viewport.style.opacity=1,b()):(a._fadingViewportOut=!0,a._viewport.style.overflow="hidden",j.fadeOut(a._viewport).then(function(){a._isZombie()||(a._fadingViewportOut=!1,a._viewport.style.opacity=1,b())}))}})},_animateListEntrance:function(a){function b(){e._canvas.style.opacity=1,e._headerContainer.style.opacity=1,e._footerContainer.style.opacity=1,e._viewport.style.overflow="",e._raiseHeaderFooterVisibilityEvent()}var d={prevented:!1,animationPromise:m.wrap()},e=this;return this._raiseHeaderFooterVisibilityEvent(),this._disableEntranceAnimation||this._animationsDisabled()?(b(),this._waitingEntranceAnimationPromise&&(this._waitingEntranceAnimationPromise.cancel(),this._waitingEntranceAnimationPromise=null),m.wrap()):(this._firedAnimationEvent?this._firedAnimationEvent=!1:d=this._fireAnimationEvent(U.entrance),d.prevented||c.isPhone?(b(),m.wrap()):(this._waitingEntranceAnimationPromise&&this._waitingEntranceAnimationPromise.cancel(),this._canvas.style.opacity=0,this._viewport.style.overflow="hidden",this._headerContainer.style.opacity=1,this._footerContainer.style.opacity=1,this._waitingEntranceAnimationPromise=d.animationPromise.then(function(){return e._isZombie()?void 0:(e._canvas.style.opacity=1,j.enterContent(e._viewport).then(function(){e._isZombie()||(e._waitingEntranceAnimationPromise=null,e._viewport.style.overflow="")}))}),this._waitingEntranceAnimationPromise))},_fireAnimationEvent:function(b){var c=a.document.createEvent("CustomEvent"),d=m.wrap();c.initCustomEvent("contentanimating",!0,!0,{type:b}),b===U.entrance&&(c.detail.setPromise=function(a){d=a});var e=!this._element.dispatchEvent(c);return{prevented:e,animationPromise:d}},_createAriaMarkers:function(){this._viewport.getAttribute("aria-label")||this._viewport.setAttribute("aria-label",S.listViewViewportAriaLabel),this._ariaStartMarker||(this._ariaStartMarker=a.document.createElement("div"),this._ariaStartMarker.id=R(this._ariaStartMarker),this._viewport.insertBefore(this._ariaStartMarker,this._viewport.firstElementChild)),this._ariaEndMarker||(this._ariaEndMarker=a.document.createElement("div"),this._ariaEndMarker.id=R(this._ariaEndMarker),this._viewport.appendChild(this._ariaEndMarker))},_updateItemsAriaRoles:function(){var a,b,c=this,d=this._element.getAttribute("role");this._currentMode().staticMode()?(a="list",b="listitem"):(a="listbox",b="option"),d===a&&this._itemRole===b||(this._element.setAttribute("role",a),this._itemRole=b,this._view.items.each(function(a,b){b.setAttribute("role",c._itemRole)}))},_updateGroupHeadersAriaRoles:function(){var a=this.groupHeaderTapBehavior===w.GroupHeaderTapBehavior.none?"separator":"link";if(this._headerRole!==a){this._headerRole=a;for(var b=0,c=this._groups.length();c>b;b++){var d=this._groups.group(b).header;d&&d.setAttribute("role",this._headerRole)}}},_setAriaSelected:function(a,b){var c="true"===a.getAttribute("aria-selected");b!==c&&a.setAttribute("aria-selected",b)},_setupAriaSelectionObserver:function(a){a._mutationObserver||(this._mutationObserver.observe(a,{attributes:!0,attributeFilter:["aria-selected"]}),a._mutationObserver=!0)},_itemPropertyChange:function(a){function b(a){a.forEach(function(a){a.item.setAttribute("aria-selected",!a.selected)})}if(!this._isZombie()){for(var c=this,d=c._selectionMode===w.SelectionMode.single,e=[],f=[],g=0,h=a.length;h>g;g++){var i=a[g].target,j=c._view.items.itemBoxFrom(i),k="true"===i.getAttribute("aria-selected");if(j&&k!==r._isSelectionRendered(j)){var l=c._view.items.index(j),m={index:l,item:i,selected:k};(c._selectionAllowed(l)?e:f).push(m)}}if(e.length>0){var n=new o;c.selection._synchronize(n).then(function(){var a=c.selection._cloneSelection();return e.forEach(function(b){b.selected?a[d?"set":"add"](b.index):a.remove(b.index)}),c.selection._set(a)}).then(function(a){c._isZombie()||a||b(e),n.complete()})}b(f)}},_groupsEnabled:function(){return!!this._groups.groupDataSource},_getItemPosition:function(a,b){var c=this;return this._view.waitForEntityPosition(a).then(function(){var d,e=c._zooming&&0!==c._canvasStart;switch(a.type){case w.ObjectType.item:d=c._view.getContainer(a.index);break;case w.ObjectType.groupHeader:d=c._view._getHeaderContainer(a.index);break;case w.ObjectType.header:e=!0,d=c._headerContainer;break;case w.ObjectType.footer:e=!0,d=c._footerContainer}if(d){c._writeProfilerMark("WinJS.UI.ListView:getItemPosition,info");var f,g;c._view._expandedRange?(f=c._view._expandedRange.first.index,g=c._view._expandedRange.last.index):b=!1,a.type===w.ObjectType.item?(b=!!b,b&=c._view._ensureContainerInDOM(a.index)):b=!1;var h=c._getItemMargins(a.type),i={left:c._rtl()?M(d)-h.right:d.offsetLeft-h.left,top:d.offsetTop-h.top,totalWidth:r.getTotalWidth(d),totalHeight:r.getTotalHeight(d),contentWidth:r.getContentWidth(d),contentHeight:r.getContentHeight(d)};return b&&c._view._forceItemsBlocksInDOM(f,g+1),e?i:c._convertToCanvasCoordinates(i)}return m.cancel})},_getItemOffset:function(a,b){var c=this;return this._getItemPosition(a,b).then(function(b){var d=c._getItemMargins(a.type);if(c._horizontal()){var e=c._rtl();b.begin=b.left-d[e?"left":"right"],b.end=b.left+b.totalWidth+d[e?"right":"left"]}else b.begin=b.top-d.bottom,b.end=b.top+b.totalHeight+d.top;return b})},_getItemMargins:function(b){b=b||w.ObjectType.item;var c=this,d=function(b){var d,e=c._canvas.querySelector("."+b);e||(e=a.document.createElement("div"),r.addClass(e,b),c._viewport.appendChild(e),d=!0);var f=H._getMargins(e);return d&&c._viewport.removeChild(e),f};return b===w.ObjectType.item?this._itemMargins?this._itemMargins:this._itemMargins=d(z._containerClass):b===w.ObjectType.groupHeader?this._headerMargins?this._headerMargins:this._headerMargins=d(z._headerContainerClass):(this._headerFooterMargins||(this._headerFooterMargins={headerMargins:d(z._listHeaderContainerClass),footerMargins:d(z._listFooterContainerClass)}),this._headerFooterMargins[b===w.ObjectType.header?"headerMargins":"footerMargins"])},_fireAccessibilityAnnotationCompleteEvent:function(b,c,d,e){var f={firstIndex:b,lastIndex:c,firstHeaderIndex:+d||-1,lastHeaderIndex:+e||-1},g=a.document.createEvent("CustomEvent");g.initCustomEvent("accessibilityannotationcomplete",!0,!1,f),this._element.dispatchEvent(g)},_ensureFirstColumnRange:function(a){if(a===w.ObjectType.header||a===w.ObjectType.footer)return m.wrap();var b=a===w.ObjectType.item?"_firstItemRange":"_firstHeaderRange";if(this[b])return m.wrap();var c=this;return this._getItemOffset({type:a,index:0},!0).then(function(a){c[b]=a})},_correctRangeInFirstColumn:function(a,b){if(b===w.ObjectType.header||b===w.ObjectType.footer)return a;var c=b===w.ObjectType.groupHeader?this._firstHeaderRange:this._firstItemRange;return c.begin===a.begin&&(this._horizontal()?a.begin=-this._getCanvasMargins()[this._rtl()?"right":"left"]:a.begin=-this._getCanvasMargins().top),a},_updateContainers:function(b,c,d,e){function f(){var b=a.document.createElement("div");return b.className=z._containerClass,b}function g(b,c,d){c+d>m&&(d=m-c);var e,f=b.itemsContainer,g=f.itemsBlocks,h=n._view._blockSize,i=g.length?g[g.length-1]:null,j=g.length?(g.length-1)*h+i.items.length:0,k=d-j;if(k>0){var l,o=k;if(i&&i.items.length<h){var p=Math.min(o,h-i.items.length);l=i.items.length;var q=F._stripedContainers(p,j);u.insertAdjacentHTMLUnsafe(i.element,"beforeend",q),e=i.element.children;for(var r=0;p>r;r++)i.items.push(e[l+r]);o-=p}j=g.length*h;var s=Math.floor(o/h),t="",v=j,y=j+h;if(s>0){var z=["<div class='win-itemsblock'>"+F._stripedContainers(h,v)+"</div>","<div class='win-itemsblock'>"+F._stripedContainers(h,y)+"</div>"];t=F._repeat(z,s),j+=s*h}var A=o%h;A>0&&(t+="<div class='win-itemsblock'>"+F._stripedContainers(A,j)+"</div>",j+=A,s++);var B=a.document.createElement("div");u.setInnerHTMLUnsafe(B,t);for(var e=B.children,r=0;s>r;r++){var C=e[r],D={element:C,items:F._nodeListToArray(C.children)};g.push(D)}}else if(0>k)for(var E=k;0>E;E++){var G=i.items.pop();!n._view._requireFocusRestore&&G.contains(a.document.activeElement)&&(n._view._requireFocusRestore=a.document.activeElement,n._unsetFocusOnItem()),i.element.removeChild(G),x.push(G),i.items.length||(f.element===i.element.parentNode&&f.element.removeChild(i.element),g.pop(),i=g[g.length-1])}for(var r=0,H=g.length;H>r;r++)for(var C=g[r],E=0;E<C.items.length;E++)w.push(C.items[E])}function h(a,b,c){for(var d=e.filter(function(a){return-1===a.oldIndex&&a.newIndex>=b&&a.newIndex<b+c}).sort(function(a,b){return a.newIndex-b.newIndex}),g=a.itemsContainer,h=0,i=d.length;i>h;h++){var j=d[h],k=j.newIndex-b,l=f(),m=k<g.items.length?g.items[k]:null;g.items.splice(k,0,l),g.element.insertBefore(l,m)}}function i(a,b,c){b+c>m&&(c=m-b);var d=a.itemsContainer,e=c-d.items.length;if(e>0){var f=d.element.children,g=f.length;u.insertAdjacentHTMLUnsafe(d.element,"beforeend",F._repeat("<div class='win-container win-backdrop'></div>",e));for(var h=0;e>h;h++){var i=f[g+h];d.items.push(i)}}for(var h=e;0>h;h++){var i=d.items.pop();d.element.removeChild(i),x.push(i)}for(var h=0,j=d.items.length;j>h;h++)w.push(d.items[h])}function j(a,b){var c=n._view._createHeaderContainer(J),d={header:c,itemsContainer:{element:n._view._createItemsContainer(c)}};return d.itemsContainer[n._view._blockSize?"itemsBlocks":"items"]=[],n._view._blockSize?g(d,b,a.size):i(d,b,a.size),d}function k(a,b,d,f){for(var g,h,i=d+f-1,j=0,k=e.length;k>j;j++){var l=e[j];l.newIndex>=d&&l.newIndex<=i&&-1!==l.oldIndex&&(g!==+g||l.newIndex<g)&&(g=l.newIndex,h=l.newIndex-l.oldIndex)}if(g===+g){var m=0;for(j=0,k=e.length;k>j;j++){var l=e[j];l.newIndex>=d&&l.newIndex<g&&-1===l.oldIndex&&m++}var o=0,p=g-h;for(j=0,k=e.length;k>j;j++){var l=e[j];l.oldIndex>=b&&l.oldIndex<p&&-1===l.newIndex&&o++}h+=o,h-=m,h-=d-b;var q=a.itemsContainer;if(h>0){var r=q.element.children;u.insertAdjacentHTMLUnsafe(q.element,"afterBegin",F._repeat("<div class='win-container win-backdrop'></div>",h));for(var s=0;h>s;s++){var t=r[s];q.items.splice(s,0,t)}}for(var s=h;0>s;s++){var t=q.items.shift();q.element.removeChild(t)}h&&n._affectedRange.add({start:d,end:d+f},c)}}function l(a){for(var b=0,c=0,d=n._view.tree.length;d>c;c++){var e=n._view.tree[c],f=e.itemsContainer.items.length,g=b+f-1;if(a>=b&&g>=a)return{group:c,item:a-b};b+=f}}var m,n=this,o=this._view.containers.length+d,p=c>o;if(p){for(var q=0,s=0;s<e.length;s++)-1===e[s].oldIndex&&q++;m=this._view.containers.length+q}else m=c;var t=[],v={},w=[],x=[],y=[],A=0;if(!n._view._blockSize)for(var s=0,B=this._view.tree.length;B>s;s++)y.push(A),A+=this._view.tree[s].itemsContainer.items.length;if(!n._view._blockSize)for(var C=e.filter(function(a){return-1===a.newIndex&&!a._removalHandled}).sort(function(a,b){return b.oldIndex-a.oldIndex}),s=0,B=C.length;B>s;s++){var D=C[s];D._removalHandled=!0;var E=D._itemBox;D._itemBox=null;var G=l(D.oldIndex),H=this._view.tree[G.group],I=H.itemsContainer.items[G.item];I.parentNode.removeChild(I),r.hasClass(E,z._selectedClass)&&r.addClass(I,z._selectedClass),H.itemsContainer.items.splice(G.item,1),D.element=I}this._view._modifiedGroups=[];var J=this._canvasProxy;A=0;for(var s=0,B=b.length;B>s&&(!this._groupsEnabled()||m>A);s++){var K=b[s],L=this._view.keyToGroupIndex[K.key],M=this._view.tree[L];if(M)n._view._blockSize?g(M,A,K.size):(k(M,y[L],A,K.size),h(M,A,K.size),i(M,A,K.size)),t.push(M),v[K.key]=t.length-1,delete this._view.keyToGroupIndex[K.key],J=M.itemsContainer.element,this._view._modifiedGroups.push({oldIndex:L,newIndex:t.length-1,element:M.header});else{var N=j(K,A);t.push(N),v[K.key]=t.length-1,this._view._modifiedGroups.push({oldIndex:-1,newIndex:t.length-1,element:N.header}),J=N.itemsContainer.element}A+=K.size}for(var O=[],P=[],Q=this._view.keyToGroupIndex?Object.keys(this._view.keyToGroupIndex):[],s=0,B=Q.length;B>s;s++){var G=this._view.keyToGroupIndex[Q[s]],R=this._view.tree[G];if(P.push(R.header),O.push(R.itemsContainer.element),this._view._blockSize)for(var S=0;S<R.itemsContainer.itemsBlocks.length;S++)for(var T=R.itemsContainer.itemsBlocks[S],U=0;U<T.items.length;U++)x.push(T.items[U]);else for(var U=0;U<R.itemsContainer.items.length;U++)x.push(R.itemsContainer.items[U]);this._view._modifiedGroups.push({oldIndex:G,newIndex:-1,element:R.header})}for(var s=0,B=e.length;B>s;s++)if(-1===e[s].newIndex&&!e[s]._removalHandled){e[s]._removalHandled=!0;var E=e[s]._itemBox;e[s]._itemBox=null;var I;x.length?(I=x.pop(),r.empty(I)):I=f(),r.hasClass(E,z._selectedClass)&&r.addClass(I,z._selectedClass),e._containerStripe===z._containerEvenClass?(r.addClass(I,z._containerEvenClass),r.removeClass(I,z._containerOddClass)):(r.addClass(I,z._containerOddClass),r.removeClass(I,z._containerEvenClass)),I.appendChild(E),e[s].element=I}return this._view.tree=t,this._view.keyToGroupIndex=v,this._view.containers=w,{removedHeaders:P,removedItemsContainers:O}},_writeProfilerMark:function(a){var b="WinJS.UI.ListView:"+this._id+":"+a;h(b),f.log&&f.log(b,null,"listviewprofiler")}},{triggerDispose:function(){K()}});return b.Class.mix(s,e.createEventProperties("iteminvoked","groupheaderinvoked","selectionchanging","selectionchanged","loadingstatechanged","keyboardnavigating","contentanimating","itemdragstart","itemdragenter","itemdragend","itemdragbetween","itemdragleave","itemdragchanged","itemdragdrop","headervisibilitychanged","footervisibilitychanged","accessibilityannotationcomplete")),b.Class.mix(s,p.DOMEventMixin),s})})}),d("WinJS/Controls/FlipView/_Constants",[],function(){"use strict";var a={};return a.datasourceCountChangedEvent="datasourcecountchanged",a.pageVisibilityChangedEvent="pagevisibilitychanged",a.pageSelectedEvent="pageselected",a.pageCompletedEvent="pagecompleted",a}),d("WinJS/Controls/FlipView/_PageManager",["exports","../../Core/_Global","../../Core/_Base","../../Core/_BaseUtils","../../Core/_ErrorFromName","../../Core/_Log","../../Core/_Resources","../../Core/_WriteProfilerMark","../../Animations","../../Promise","../../_Signal","../../Scheduler","../../Utilities/_Dispose","../../Utilities/_ElementUtilities","../../Utilities/_TabContainer","./_Constants"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){"use strict";c.Namespace._moduleDefine(a,"WinJS.UI",{_FlipPageManager:c.Namespace._lazy(function(){function a(a){var b=a.winControl;return!(!b||!b._isFlipView)}function g(a){a.forEach(function(a){var b=a.target;b.winControl&&b.tabIndex>=0&&(b.winControl._pageManager._updateTabIndex(b.tabIndex),b.tabIndex=-1);var c=b.winControl;if(c&&c._isFlipView){var d=!1;"dir"===a.attributeName?d=!0:"style"===a.attributeName&&(d=c._cachedStyleDir!==b.style.direction),d&&(c._cachedStyleDir=b.style.direction,c._pageManager._rtl="rtl"===n._getComputedStyle(c._pageManager._flipperDiv,null).direction,c._pageManager.resized())}})}var q=n._uniqueID,r=d._browserStyleEquivalents,s=50,t=250,u={get badCurrentPage(){return"Invalid argument: currentPage must be a number greater than or equal to zero and be within the bounds of the datasource"}},v=c.Class.define(function(a,b,c,e,f,h,i){this._visibleElements=[],this._flipperDiv=a,this._panningDiv=b,this._panningDivContainer=c,this._buttonVisibilityHandler=i,this._currentPage=null,this._rtl="rtl"===n._getComputedStyle(this._flipperDiv,null).direction,this._itemsManager=e,this._itemSpacing=f,this._tabIndex=n.getTabIndex(a),this._tabIndex<0&&(this._tabIndex=0),b.tabIndex=-1,a.tabIndex=-1,this._tabManager=new o.TabContainer(this._panningDivContainer),this._tabManager.tabIndex=this._tabIndex,this._lastSelectedPage=null,this._lastSelectedElement=null,this._bufferSize=v.flipPageBufferCount,this._cachedSize=-1,this._environmentSupportsTouch=h;var j=this;this._panningDiv.addEventListener("keydown",function(a){j._blockTabs&&a.keyCode===n.Key.tab&&(a.stopImmediatePropagation(),a.preventDefault())},!0),n._addEventListener(this._flipperDiv,"focusin",function(a){a.target===j._flipperDiv&&j._currentPage.element&&n._setActive(j._currentPage.element)},!1),new n._MutationObserver(g).observe(this._flipperDiv,{attributes:!0,attributeFilter:["dir","style","tabindex"]}),this._cachedStyleDir=this._flipperDiv.style.direction,this._handleManipulationStateChangedBound=this._handleManipulationStateChanged.bind(this),this._environmentSupportsTouch&&this._panningDivContainer.addEventListener(d._browserEventEquivalents.manipulationStateChanged,this._handleManipulationStateChangedBound,!0)},{initialize:function(a,c){var d=null;if(this._panningDivContainerOffsetWidth=this._panningDivContainer.offsetWidth,this._panningDivContainerOffsetHeight=this._panningDivContainer.offsetHeight,this._isHorizontal=c,!this._currentPage){this._bufferAriaStartMarker=b.document.createElement("div"),this._bufferAriaStartMarker.id=q(this._bufferAriaStartMarker),this._panningDiv.appendChild(this._bufferAriaStartMarker),this._currentPage=this._createFlipPage(null,this),d=this._currentPage,this._panningDiv.appendChild(d.pageRoot);for(var e=2*this._bufferSize,f=0;e>f;f++)d=this._createFlipPage(d,this),this._panningDiv.appendChild(d.pageRoot);this._bufferAriaEndMarker=b.document.createElement("div"),this._bufferAriaEndMarker.id=q(this._bufferAriaEndMarker),this._panningDiv.appendChild(this._bufferAriaEndMarker)}this._prevMarker=this._currentPage.prev.prev,this._itemsManager&&this.setNewItemsManager(this._itemsManager,a)},dispose:function(){var a=this._currentPage,b=a;do m._disposeElement(b.element),b=b.next;while(b!==a)},setOrientation:function(a){if(this._notificationsEndedSignal){var b=this;return void this._notificationsEndedSignal.promise.done(function(){b._notificationsEndedSignal=null,b.setOrientation(a)})}if(a!==this._isHorizontal){this._isOrientationChanging=!0,this._isHorizontal?n.setScrollPosition(this._panningDivContainer,{scrollLeft:this._getItemStart(this._currentPage),scrollTop:0}):n.setScrollPosition(this._panningDivContainer,{scrollLeft:0,scrollTop:this._getItemStart(this._currentPage)}),this._isHorizontal=a;var c=this._panningDivContainer.style;c.overflowX="hidden",c.overflowY="hidden";var b=this;d._requestAnimationFrame(function(){b._isOrientationChanging=!1,b._forEachPage(function(a){var b=a.pageRoot.style;b.left="0px",b.top="0px"}),c.overflowX=b._isHorizontal&&b._environmentSupportsTouch?"scroll":"hidden",c.overflowY=b._isHorizontal||!b._environmentSupportsTouch?"hidden":"scroll",b._ensureCentered()})}},resetState:function(a){if(this._writeProfilerMark("WinJS.UI.FlipView:resetState,info"),0!==a){var b=this.jumpToIndex(a,!0);if(!b&&d.validation)throw new e("WinJS.UI.FlipView.BadCurrentPage",u.badCurrentPage);return b}m.disposeSubTree(this._flipperDiv),this._resetBuffer(null,!0);var c=this,f=j.wrap(!0);return this._itemsManager&&(f=c._itemsManager._firstItem().then(function(a){return c._currentPage.setElement(a),c._fetchPreviousItems(!0).then(function(){return c._fetchNextItems()}).then(function(){c._setButtonStates()})})),f.then(function(){c._tabManager.childFocus=c._currentPage.element,c._ensureCentered(),c._itemSettledOn()})},setNewItemsManager:function(a,b){this._itemsManager=a;var c=this;return this.resetState(b).then(function(){0!==b&&(c._tabManager.childFocus=c._currentPage.element,c._ensureCentered(),c._itemSettledOn())})},currentIndex:function(){if(!this._itemsManager)return 0;var a=0,b=this._navigationAnimationRecord?this._navigationAnimationRecord.newCurrentElement:this._currentPage.element;return b&&(a=this._getElementIndex(b)),a},resetScrollPos:function(){this._ensureCentered()},scrollPosChanged:function(){if(this._hasFocus&&(this._hadFocus=!0),this._itemsManager&&this._currentPage.element&&!this._isOrientationChanging){var a=this._getViewportStart(),b=this._lastScrollPos>a?this._getTailOfBuffer():this._getHeadOfBuffer();if(a!==this._lastScrollPos){for(var c=!1;this._currentPage.element&&this._currentPage.prev&&this._currentPage.prev.element&&a<=this._getItemStart(this._currentPage.prev);)this._currentPage=this._currentPage.prev,this._fetchOnePrevious(b.prev),b=b.prev,c=!0;for(;this._currentPage.element&&this._currentPage.next&&this._currentPage.next.element&&a>=this._getItemStart(this._currentPage.next);)this._currentPage=this._currentPage.next,this._fetchOneNext(b.next),b=b.next,c=!0;this._setButtonStates(),this._checkElementVisibility(!1),this._blockTabs=!0,this._lastScrollPos=a,this._currentPage.element&&(this._tabManager.childFocus=this._currentPage.element),c&&this._ensureCentered(!0),!this._manipulationState&&this._viewportOnItemStart()&&(this._currentPage.element.setAttribute("aria-setsize",this._cachedSize),this._currentPage.element.setAttribute("aria-posinset",this.currentIndex()+1),this._timeoutPageSelection())}}},itemRetrieved:function(a,b){var c=this;if(this._forEachPage(function(d){return d.element===b?(d===c._currentPage||d===c._currentPage.next?c._changeFlipPage(d,b,a):d.setElement(a,!0),!0):void 0}),this._navigationAnimationRecord&&this._navigationAnimationRecord.elementContainers)for(var d=this._navigationAnimationRecord.elementContainers,e=0,f=d.length;f>e;e++)d[e].element===b&&(c._changeFlipPage(d[e],b,a),d[e].element=a);this._checkElementVisibility(!1)},resized:function(){this._panningDivContainerOffsetWidth=this._panningDivContainer.offsetWidth,this._panningDivContainerOffsetHeight=this._panningDivContainer.offsetHeight;var a=this;this._forEachPage(function(b){b.pageRoot.style.width=a._panningDivContainerOffsetWidth+"px",b.pageRoot.style.height=a._panningDivContainerOffsetHeight+"px"}),this._ensureCentered(),this._writeProfilerMark("WinJS.UI.FlipView:resize,StopTM")},jumpToIndex:function(a,b){if(!b){if(!this._itemsManager||!this._currentPage.element||0>a)return j.wrap(!1);var c=this._getElementIndex(this._currentPage.element),d=Math.abs(a-c);if(0===d)return j.wrap(!1)}var e=j.wrap(!0),f=this;return e=e.then(function(){var c=f._itemsManager._itemPromiseAtIndex(a);return j.join({element:f._itemsManager._itemFromItemPromise(c),item:c}).then(function(a){var c=a.element;return f._resetBuffer(c,b),c?(f._currentPage.setElement(c),f._fetchNextItems().then(function(){return f._fetchPreviousItems(!0)}).then(function(){return!0})):!1})}),e=e.then(function(a){return f._setButtonStates(),a})},startAnimatedNavigation:function(a,b,c){
-if(this._writeProfilerMark("WinJS.UI.FlipView:startAnimatedNavigation,info"),this._currentPage.element){var d=this._currentPage,e=a?this._currentPage.next:this._currentPage.prev;if(e.element){this._hasFocus&&n._setActive(this._panningDiv),this._navigationAnimationRecord={},this._navigationAnimationRecord.goForward=a,this._navigationAnimationRecord.cancelAnimationCallback=b,this._navigationAnimationRecord.completionCallback=c,this._navigationAnimationRecord.oldCurrentPage=d,this._navigationAnimationRecord.newCurrentPage=e;var f=d.element,g=e.element;this._navigationAnimationRecord.newCurrentElement=g,d.setElement(null,!0),d.elementUniqueID=q(f),e.setElement(null,!0),e.elementUniqueID=q(g);var h=this._createDiscardablePage(f),i=this._createDiscardablePage(g);return h.pageRoot.itemIndex=this._getElementIndex(f),i.pageRoot.itemIndex=h.pageRoot.itemIndex+(a?1:-1),h.pageRoot.style.position="absolute",i.pageRoot.style.position="absolute",h.pageRoot.style.zIndex=1,i.pageRoot.style.zIndex=2,this._setItemStart(h,0),this._setItemStart(i,0),this._blockTabs=!0,this._visibleElements.push(g),this._announceElementVisible(g),this._navigationAnimationRecord.elementContainers=[h,i],{outgoing:h,incoming:i}}}return null},endAnimatedNavigation:function(a,b,c){if(this._writeProfilerMark("WinJS.UI.FlipView:endAnimatedNavigation,info"),this._navigationAnimationRecord&&this._navigationAnimationRecord.oldCurrentPage&&this._navigationAnimationRecord.newCurrentPage){var d=this._restoreAnimatedElement(this._navigationAnimationRecord.oldCurrentPage,b);this._restoreAnimatedElement(this._navigationAnimationRecord.newCurrentPage,c),d||this._setViewportStart(this._getItemStart(a?this._currentPage.next:this._currentPage.prev)),this._navigationAnimationRecord=null,this._itemSettledOn()}},startAnimatedJump:function(a,b,c){if(this._writeProfilerMark("WinJS.UI.FlipView:startAnimatedJump,info"),this._hasFocus&&(this._hadFocus=!0),this._currentPage.element){var d=this._currentPage.element,e=this._getElementIndex(d),f=this;return f.jumpToIndex(a).then(function(g){if(!g)return null;if(f._navigationAnimationRecord={},f._navigationAnimationRecord.cancelAnimationCallback=b,f._navigationAnimationRecord.completionCallback=c,f._navigationAnimationRecord.oldCurrentPage=null,f._forEachPage(function(a){return a.element===d?(f._navigationAnimationRecord.oldCurrentPage=a,!0):void 0}),f._navigationAnimationRecord.newCurrentPage=f._currentPage,f._navigationAnimationRecord.newCurrentPage===f._navigationAnimationRecord.oldCurrentPage)return null;var h=f._currentPage.element;f._navigationAnimationRecord.newCurrentElement=h,f._currentPage.setElement(null,!0),f._currentPage.elementUniqueID=q(h),f._navigationAnimationRecord.oldCurrentPage&&f._navigationAnimationRecord.oldCurrentPage.setElement(null,!0);var i=f._createDiscardablePage(d),j=f._createDiscardablePage(h);return i.pageRoot.itemIndex=e,j.pageRoot.itemIndex=a,i.pageRoot.style.position="absolute",j.pageRoot.style.position="absolute",i.pageRoot.style.zIndex=1,j.pageRoot.style.zIndex=2,f._setItemStart(i,0),f._setItemStart(j,f._itemSize(f._currentPage)),f._visibleElements.push(h),f._announceElementVisible(h),f._navigationAnimationRecord.elementContainers=[i,j],f._blockTabs=!0,{oldPage:i,newPage:j}})}return j.wrap(null)},simulateMouseWheelScroll:function(a){if(!this._environmentSupportsTouch&&!this._waitingForMouseScroll){var c;c="number"==typeof a.deltaY?(a.deltaX||a.deltaY)>0:a.wheelDelta<0;var d=c?this._currentPage.next:this._currentPage.prev;if(d.element){var e={contentX:0,contentY:0,viewportX:0,viewportY:0};e[this._isHorizontal?"contentX":"contentY"]=this._getItemStart(d),n._zoomTo(this._panningDivContainer,e),this._waitingForMouseScroll=!0,b.setTimeout(function(){this._waitingForMouseScroll=!1}.bind(this),n._zoomToDuration+100)}}},endAnimatedJump:function(a,b){this._writeProfilerMark("WinJS.UI.FlipView:endAnimatedJump,info"),this._navigationAnimationRecord.oldCurrentPage?this._navigationAnimationRecord.oldCurrentPage.setElement(a.element,!0):a.element.parentNode&&a.element.parentNode.removeChild(a.element),this._navigationAnimationRecord.newCurrentPage.setElement(b.element,!0),this._navigationAnimationRecord=null,this._ensureCentered(),this._itemSettledOn()},inserted:function(a,b,c,d){this._writeProfilerMark("WinJS.UI.FlipView:inserted,info");var e=this._prevMarker,f=!1,g=!1;if(d&&(this._createAnimationRecord(q(a),null),this._getAnimationRecord(a).inserted=!0),b){do{if(e===this._currentPage&&(f=!0),e.elementUniqueID===q(b)){g=!0;var h,i=e,j=a,k=q(a);if(f)for(;i.next!==this._prevMarker;)h=i.next.element,k=i.next.elementUniqueID,i.next.setElement(j,!0),!j&&k&&(i.next.elementUniqueID=k),j=h,i=i.next;else for(e.elementUniqueID===e.next.elementUniqueID&&e.elementUniqueID&&(i=e.next);i.next!==this._prevMarker;)h=i.element,k=i.elementUniqueID,i.setElement(j,!0),!j&&k&&(i.elementUniqueID=k),j=h,i=i.prev;if(j){var l=!1;this._forEachPage(function(a){return q(j)===a.elementUniqueID?(l=!0,!0):void 0}),l||this._releaseElementIfNotAnimated(j)}break}e=e.next}while(e!==this._prevMarker)}else if(c){for(;e.next!==this._prevMarker&&e.elementUniqueID!==q(c);)e===this._currentPage&&(f=!0),e=e.next;e.elementUniqueID===q(c)&&e!==this._prevMarker?(e.prev.setElement(a),g=!0):this._releaseElementIfNotAnimated(a)}else this._currentPage.setElement(a);this._getAnimationRecord(a).successfullyMoved=g,this._setButtonStates()},changed:function(a,b){this._writeProfilerMark("WinJS.UI.FlipView:changed,info");var c=this;if(this._forEachPage(function(d){if(d.elementUniqueID===q(b)){var e=c._animationRecords[d.elementUniqueID];return e.changed=!0,e.oldElement=b,e.newElement=a,d.element=a,d.elementUniqueID=q(a),c._animationRecords[q(a)]=e,!0}}),this._navigationAnimationRecord&&this._navigationAnimationRecord.elementContainers){for(var d=0,e=this._navigationAnimationRecord.elementContainers.length;e>d;d++){var f=this._navigationAnimationRecord.elementContainers[d];f&&f.elementUniqueID===q(b)&&(f.element=a,f.elementUniqueID=q(a))}var g=this._navigationAnimationRecord.newCurrentElement;g&&q(g)===q(b)&&(this._navigationAnimationRecord.newCurrentElement=a)}},moved:function(a,b,c){this._writeProfilerMark("WinJS.UI.FlipView:moved,info");var d=this._getAnimationRecord(a);d||(d=this._createAnimationRecord(q(a))),d.moved=!0,this.removed(a,!1,!1),b||c?this.inserted(a,b,c,!1):d.successfullyMoved=!1},removed:function(a,b,c){this._writeProfilerMark("WinJS.UI.FlipView:removed,info");var d=this,e=this._prevMarker,f=j.wrap();if(b){var g=!1;return this._forEachPage(function(b){(b.elementUniqueID===q(a)||g)&&(b.setElement(null,!0),g=!0)}),void this._setButtonStates()}if(c){var h=this._getAnimationRecord(a);h&&(h.removed=!0)}if(this._currentPage.elementUniqueID===q(a))this._currentPage.next.elementUniqueID?(this._shiftLeft(this._currentPage),this._ensureCentered()):this._currentPage.prev.elementUniqueID?this._shiftRight(this._currentPage):this._currentPage.setElement(null,!0);else if(e.elementUniqueID===q(a))e.next.element?f=this._itemsManager._previousItem(e.next.element).then(function(b){return b===a&&(b=d._itemsManager._previousItem(b)),b}).then(function(a){e.setElement(a,!0)}):e.setElement(null,!0);else if(e.prev.elementUniqueID===q(a))e.prev.prev&&e.prev.prev.element?f=this._itemsManager._nextItem(e.prev.prev.element).then(function(b){return b===a&&(b=d._itemsManager._nextItem(b)),b}).then(function(a){e.prev.setElement(a,!0)}):e.prev.setElement(null,!0);else{for(var i=this._currentPage.prev,k=!1;i!==e&&!k;)i.elementUniqueID===q(a)&&(this._shiftRight(i),k=!0),i=i.prev;for(i=this._currentPage.next;i!==e&&!k;)i.elementUniqueID===q(a)&&(this._shiftLeft(i),k=!0),i=i.next}return f.then(function(){d._setButtonStates()})},reload:function(){this._writeProfilerMark("WinJS.UI.FlipView:reload,info"),this.resetState(0)},getItemSpacing:function(){return this._itemSpacing},setItemSpacing:function(a){this._itemSpacing=a,this._ensureCentered()},notificationsStarted:function(){this._writeProfilerMark("WinJS.UI.FlipView:changeNotifications,StartTM"),this._logBuffer(),this._notificationsStarted=this._notificationsStarted||0,this._notificationsStarted++,this._notificationsEndedSignal=new k,this._temporaryKeys=[],this._animationRecords={};var a=this;this._forEachPage(function(b){a._createAnimationRecord(b.elementUniqueID,b)}),this._animationRecords.currentPage=this._currentPage.element,this._animationRecords.nextPage=this._currentPage.next.element},notificationsEnded:function(){var a=this;this._endNotificationsWork&&this._endNotificationsWork.cancel(),this._endNotificationsWork=this._ensureBufferConsistency().then(function(){function b(b){var c=null;return a._forEachPage(function(a){return a.element===b?(c=a,!0):void 0}),c}function c(b,c){a._writeProfilerMark("WinJS.UI.FlipView:_animateOldViewportItemRemoved,info");var d=a._createDiscardablePage(c);a._setItemStart(d,b.originalLocation),f.push(a._deleteFlipPage(d))}function d(c,d){a._writeProfilerMark("WinJS.UI.FlipView:_animateOldViewportItemMoved,info");var e,g=c.originalLocation;if(c.successfullyMoved)e=b(d),g=c.newLocation;else{e=a._createDiscardablePage(d);var h=a._getElementIndex(d),i=a._currentPage.element?a._getElementIndex(a._currentPage.element):0;g+=i>h?-100*a._bufferSize:100*a._bufferSize}e&&(a._setItemStart(e,c.originalLocation),f.push(a._moveFlipPage(e,function(){a._setItemStart(e,g)})))}function e(){return 0===f.length&&f.push(j.wrap()),j.join(f)}var f=[];a._forEachPage(function(b){var c=a._getAnimationRecord(b.element);c&&(c.changed&&(c.oldElement.removedFromChange=!0,f.push(a._changeFlipPage(b,c.oldElement,c.newElement))),c.newLocation=b.location,a._setItemStart(b,c.originalLocation),c.inserted&&(b.elementRoot.style.opacity=0))});var g=a._animationRecords.currentPage,h=a._getAnimationRecord(g),i=a._animationRecords.nextPage,k=a._getAnimationRecord(i);h&&h.changed&&(g=h.newElement),k&&k.changed&&(i=k.newElement),g===a._currentPage.element&&i===a._currentPage.next.element||(h&&h.removed&&c(h,g),k&&k.removed&&c(k,i)),a._blockTabs=!0,e().then(function(){f=[],h&&h.moved&&d(h,g),k&&k.moved&&d(k,i);var b=a._getAnimationRecord(a._currentPage.element),c=a._getAnimationRecord(a._currentPage.next.element);a._forEachPage(function(d){var e=a._getAnimationRecord(d.element);e&&(e.inserted?e!==b&&e!==c&&(d.elementRoot.style.opacity=1):e.originalLocation!==e.newLocation&&(e!==h&&e!==k||e===h&&!h.moved||e===k&&!k.moved)&&f.push(a._moveFlipPage(d,function(){a._setItemStart(d,e.newLocation)})))}),e().then(function(){f=[],b&&b.inserted&&f.push(a._insertFlipPage(a._currentPage)),c&&c.inserted&&f.push(a._insertFlipPage(a._currentPage.next)),e().then(function(){a._checkElementVisibility(!1),a._itemSettledOn(),a._setListEnds(),a._notificationsStarted--,0===a._notificationsStarted&&a._notificationsEndedSignal.complete(),a._writeProfilerMark("WinJS.UI.FlipView:changeNotifications,StopTM"),a._logBuffer(),a._endNotificationsWork=null})})})})},disableTouchFeatures:function(){this._environmentSupportsTouch=!1;var a=this._panningDivContainer.style;this._panningDivContainer.removeEventListener(d._browserEventEquivalents.manipulationStateChanged,this._handleManipulationStateChangedBound,!0),a.overflowX="hidden",a.overflowY="hidden";var b=["scroll-snap-type","scroll-snap-points-x","scroll-snap-points-y","scroll-limit-x-min","scroll-limit-x-max","scroll-limit-y-min","scroll-limit-y-max"];b.forEach(function(b){var c=r[b];c&&(a[c.scriptName]="")})},_hasFocus:{get:function(){return this._flipperDiv.contains(b.document.activeElement)}},_timeoutPageSelection:function(){var a=this;this._lastTimeoutRequest&&this._lastTimeoutRequest.cancel(),this._lastTimeoutRequest=j.timeout(t).then(function(){a._itemSettledOn()})},_updateTabIndex:function(a){this._forEachPage(function(b){b.element&&(b.element.tabIndex=a)}),this._tabIndex=a,this._tabManager.tabIndex=a},_releaseElementIfNotAnimated:function(a){var b=this._getAnimationRecord(a);b&&(b.changed||b.inserted||b.moved||b.removed)||this._itemsManager.releaseItem(a)},_getAnimationRecord:function(a){return a?this._animationRecords[q(a)]:null},_createAnimationRecord:function(a,b){if(a){var c=this._animationRecords[a]={removed:!1,changed:!1,inserted:!1};return b&&(c.originalLocation=b.location),c}},_writeProfilerMark:function(a){h(a),this._flipperDiv.winControl.constructor._enabledDebug&&f.log&&f.log(a,null,"flipviewdebug")},_getElementIndex:function(a){var b=0;try{b=this._itemsManager.itemObject(a).index}catch(c){}return b},_resetBuffer:function(a,b){this._writeProfilerMark("WinJS.UI.FlipView:_resetBuffer,info");var c=this._currentPage,d=c;do d.element&&d.element===a||b?d.setElement(null,!0):d.setElement(null),d=d.next;while(d!==c)},_getHeadOfBuffer:function(){return this._prevMarker.prev},_getTailOfBuffer:function(){return this._prevMarker},_insertNewFlipPage:function(a){this._writeProfilerMark("WinJS.UI.FlipView:_insertNewFlipPage,info");var b=this._createFlipPage(a,this);return this._panningDiv.appendChild(b.pageRoot),b},_fetchNextItems:function(){this._writeProfilerMark("WinJS.UI.FlipView:_fetchNextItems,info");for(var a=j.wrap(this._currentPage),b=this,c=0;c<this._bufferSize;c++)a=a.then(function(a){return a.next===b._prevMarker&&b._insertNewFlipPage(a),a.element?b._itemsManager._nextItem(a.element).then(function(b){return a.next.setElement(b),a.next}):(a.next.setElement(null),a.next)});return a},_fetchOneNext:function(a){this._writeProfilerMark("WinJS.UI.FlipView:_fetchOneNext,info");var b=a.prev.element;if(this._prevMarker===a&&(this._prevMarker=this._prevMarker.next),!b)return void a.setElement(null);var c=this;return this._itemsManager._nextItem(b).then(function(b){a.setElement(b),c._movePageAhead(a.prev,a)})},_fetchPreviousItems:function(a){this._writeProfilerMark("WinJS.UI.FlipView:_fetchPreviousItems,info");for(var b=this,c=j.wrap(this._currentPage),d=0;d<this._bufferSize;d++)c=c.then(function(a){return a.element?b._itemsManager._previousItem(a.element).then(function(b){return a.prev.setElement(b),a.prev}):(a.prev.setElement(null),a.prev)});return c.then(function(c){a&&(b._prevMarker=c)})},_fetchOnePrevious:function(a){this._writeProfilerMark("WinJS.UI.FlipView:_fetchOnePrevious,info");var b=a.next.element;if(this._prevMarker===a.next&&(this._prevMarker=this._prevMarker.prev),!b)return a.setElement(null),j.wrap();var c=this;return this._itemsManager._previousItem(b).then(function(b){a.setElement(b),c._movePageBehind(a.next,a)})},_setButtonStates:function(){this._currentPage.prev.element?this._buttonVisibilityHandler.showPreviousButton():this._buttonVisibilityHandler.hidePreviousButton(),this._currentPage.next.element?this._buttonVisibilityHandler.showNextButton():this._buttonVisibilityHandler.hideNextButton()},_ensureCentered:function(a){this._writeProfilerMark("WinJS.UI.FlipView:_ensureCentered,info"),this._setItemStart(this._currentPage,s*this._viewportSize());for(var b=this._currentPage;b!==this._prevMarker;)this._movePageBehind(b,b.prev),b=b.prev;for(b=this._currentPage;b.next!==this._prevMarker;)this._movePageAhead(b,b.next),b=b.next;var c=!1;this._lastScrollPos&&!a&&(this._setListEnds(),c=!0),this._lastScrollPos=this._getItemStart(this._currentPage),this._setViewportStart(this._lastScrollPos),this._checkElementVisibility(!0),this._setupSnapPoints(),c||this._setListEnds()},_ensureBufferConsistency:function(){var a=this,b=this._currentPage.element;if(!b)return j.wrap();var c=!1,d={},e={};this._forEachPage(function(a){if(a&&a.elementUniqueID){if(d[a.elementUniqueID])return c=!0,!0;if(d[a.elementUniqueID]=!0,a.location>0){if(e[a.location])return c=!0,!0;e[a.location]=!0}}});var f=Object.keys(this._animationRecords);return f.forEach(function(b){var d=a._animationRecords[b];d&&(d.changed||d.inserted||d.moved||d.removed)&&(c=!0)}),c?(this._resetBuffer(null,!0),this._currentPage.setElement(b),this._fetchNextItems().then(function(){return a._fetchPreviousItems(!0)}).then(function(){a._ensureCentered()})):j.wrap()},_shiftLeft:function(a){this._writeProfilerMark("WinJS.UI.FlipView:_shiftLeft,info");for(var b=a,c=null;b!==this._prevMarker&&b.next!==this._prevMarker;)c=b.next.element,!c&&b.next.elementUniqueID&&(b.elementUniqueID=b.next.elementUniqueID),b.next.setElement(null,!0),b.setElement(c,!0),b=b.next;if(b!==this._prevMarker&&b.prev.element){var d=this;return this._itemsManager._nextItem(b.prev.element).then(function(a){b.setElement(a),d._createAnimationRecord(b.elementUniqueID,b)})}},_logBuffer:function(){if(this._flipperDiv.winControl.constructor._enabledDebug){f.log&&f.log(this._currentPage.next.next.next.elementUniqueID+"	@:"+this._currentPage.next.next.next.location+(this._currentPage.next.next.next.element?"	"+this._currentPage.next.next.next.element.textContent:""),null,"flipviewdebug"),f.log&&f.log(this._currentPage.next.next.next.next.elementUniqueID+"	@:"+this._currentPage.next.next.next.next.location+(this._currentPage.next.next.next.next.element?"	"+this._currentPage.next.next.next.next.element.textContent:""),null,"flipviewdebug"),f.log&&f.log("> "+this._currentPage.elementUniqueID+"	@:"+this._currentPage.location+(this._currentPage.element?"	"+this._currentPage.element.textContent:""),null,"flipviewdebug"),f.log&&f.log(this._currentPage.next.elementUniqueID+"	@:"+this._currentPage.next.location+(this._currentPage.next.element?"	"+this._currentPage.next.element.textContent:""),null,"flipviewdebug"),f.log&&f.log(this._currentPage.next.next.elementUniqueID+"	@:"+this._currentPage.next.next.location+(this._currentPage.next.next.element?"	"+this._currentPage.next.next.element.textContent:""),null,"flipviewdebug");var a=Object.keys(this._itemsManager._elementMap),b=[];this._forEachPage(function(a){a&&a.elementUniqueID&&b.push(a.elementUniqueID)}),f.log&&f.log("itemsmanager  = ["+a.join(" ")+"] flipview ["+b.join(" ")+"]",null,"flipviewdebug")}},_shiftRight:function(a){this._writeProfilerMark("WinJS.UI.FlipView:_shiftRight,info");for(var b=a,c=null;b!==this._prevMarker;)c=b.prev.element,!c&&b.prev.elementUniqueID&&(b.elementUniqueID=b.prev.elementUniqueID),b.prev.setElement(null,!0),b.setElement(c,!0),b=b.prev;if(b.next.element){var d=this;return this._itemsManager._previousItem(b.next.element).then(function(a){b.setElement(a),d._createAnimationRecord(b.elementUniqueID,b)})}},_checkElementVisibility:function(a){var b,c;if(a){var d=this._currentPage.element;for(b=0,c=this._visibleElements.length;c>b;b++)this._visibleElements[b]!==d&&this._announceElementInvisible(this._visibleElements[b]);this._visibleElements=[],d&&(this._visibleElements.push(d),this._announceElementVisible(d))}else{for(b=0,c=this._visibleElements.length;c>b;b++)this._visibleElements[b].parentNode&&!this._visibleElements[b].removedFromChange||this._announceElementInvisible(this._visibleElements[b]);this._visibleElements=[];var e=this;this._forEachPage(function(a){var b=a.element;b&&(e._itemInView(a)?(e._visibleElements.push(b),e._announceElementVisible(b)):e._announceElementInvisible(b))})}},_announceElementVisible:function(a){if(a&&!a.visible){a.visible=!0;var c=b.document.createEvent("CustomEvent");this._writeProfilerMark("WinJS.UI.FlipView:pageVisibilityChangedEvent(visible:true),info"),c.initCustomEvent(p.pageVisibilityChangedEvent,!0,!1,{source:this._flipperDiv,visible:!0}),a.dispatchEvent(c)}},_announceElementInvisible:function(a){if(a&&a.visible){a.visible=!1;var c=!1;a.parentNode||(c=!0,this._panningDivContainer.appendChild(a));var d=b.document.createEvent("CustomEvent");this._writeProfilerMark("WinJS.UI.FlipView:pageVisibilityChangedEvent(visible:false),info"),d.initCustomEvent(p.pageVisibilityChangedEvent,!0,!1,{source:this._flipperDiv,visible:!1}),a.dispatchEvent(d),c&&this._panningDivContainer.removeChild(a)}},_createDiscardablePage:function(a){var b=this._createPageContainer(),c={pageRoot:b.root,elementRoot:b.elementContainer,discardable:!0,element:a,elementUniqueID:q(a),discard:function(){c.pageRoot.parentNode&&c.pageRoot.parentNode.removeChild(c.pageRoot),c.element.parentNode&&c.element.parentNode.removeChild(c.element)}};return c.pageRoot.style.top="0px",c.elementRoot.appendChild(a),this._panningDiv.appendChild(c.pageRoot),c},_createPageContainer:function(){var a=this._panningDivContainerOffsetWidth,c=this._panningDivContainerOffsetHeight,d=b.document.createElement("div"),e=d.style,f=b.document.createElement("div");return f.className="win-item",e.position="absolute",e.overflow="hidden",e.width=a+"px",e.height=c+"px",d.appendChild(f),{root:d,elementContainer:f}},_createFlipPage:function(b,c){var d={};d.element=null,d.elementUniqueID=null,b?(d.prev=b,d.next=b.next,d.next.prev=d,b.next=d):(d.next=d,d.prev=d);var e=this._createPageContainer();return d.elementRoot=e.elementContainer,d.elementRoot.style.msOverflowStyle="auto",d.pageRoot=e.root,d.setElement=function(b,e){if(void 0===b&&(b=null),b===d.element)return void(b||(d.elementUniqueID=null));if(d.element&&(e||(c._itemsManager.releaseItem(d.element),m._disposeElement(d.element))),d.element=b,d.elementUniqueID=b?q(b):null,n.empty(d.elementRoot),d.element){if(d===c._currentPage&&(c._tabManager.childFocus=b),!a(d.element)){d.element.tabIndex=c._tabIndex,d.element.setAttribute("role","option"),d.element.setAttribute("aria-selected",!1),d.element.id||(d.element.id=q(d.element));var f=function(a,b,c){a.setAttribute(c,b.id)},g=!d.next.element||d===c._prevMarker.prev;g&&(f(d.element,c._bufferAriaEndMarker,"aria-flowto"),f(c._bufferAriaEndMarker,d.element,"x-ms-aria-flowfrom")),d!==c._prevMarker&&d.prev.element&&(f(d.prev.element,d.element,"aria-flowto"),f(d.element,d.prev.element,"x-ms-aria-flowfrom")),d.next!==c._prevMarker&&d.next.element&&(f(d.element,d.next.element,"aria-flowto"),f(d.next.element,d.element,"x-ms-aria-flowfrom")),d.prev.element||f(d.element,c._bufferAriaStartMarker,"x-ms-aria-flowfrom")}d.elementRoot.appendChild(d.element)}},d},_itemInView:function(a){return this._itemEnd(a)>this._getViewportStart()&&this._getItemStart(a)<this._viewportEnd()},_getViewportStart:function(){return this._panningDivContainer.parentNode?this._isHorizontal?n.getScrollPosition(this._panningDivContainer).scrollLeft:n.getScrollPosition(this._panningDivContainer).scrollTop:void 0},_setViewportStart:function(a){this._panningDivContainer.parentNode&&(this._isHorizontal?n.setScrollPosition(this._panningDivContainer,{scrollLeft:a}):n.setScrollPosition(this._panningDivContainer,{scrollTop:a}))},_viewportEnd:function(){var a=this._panningDivContainer;return this._isHorizontal?this._rtl?this._getViewportStart()+this._panningDivContainerOffsetWidth:n.getScrollPosition(a).scrollLeft+this._panningDivContainerOffsetWidth:a.scrollTop+this._panningDivContainerOffsetHeight},_viewportSize:function(){return this._isHorizontal?this._panningDivContainerOffsetWidth:this._panningDivContainerOffsetHeight},_getItemStart:function(a){return a.location},_setItemStart:function(a,b){void 0!==b&&(this._isHorizontal?a.pageRoot.style.left=(this._rtl?-b:b)+"px":a.pageRoot.style.top=b+"px",a.location=b)},_itemEnd:function(a){return(this._isHorizontal?a.location+this._panningDivContainerOffsetWidth:a.location+this._panningDivContainerOffsetHeight)+this._itemSpacing},_itemSize:function(){return this._isHorizontal?this._panningDivContainerOffsetWidth:this._panningDivContainerOffsetHeight},_movePageAhead:function(a,b){var c=this._itemSize(a)+this._itemSpacing;this._setItemStart(b,this._getItemStart(a)+c)},_movePageBehind:function(a,b){var c=this._itemSize(a)+this._itemSpacing;this._setItemStart(b,this._getItemStart(a)-c)},_setupSnapPoints:function(){if(this._environmentSupportsTouch){var a=this._panningDivContainer.style;a[r["scroll-snap-type"].scriptName]="mandatory";var b=this._viewportSize(),c=b+this._itemSpacing,d="scroll-snap-points",e=0,f=this._getItemStart(this._currentPage);e=f%(b+this._itemSpacing),a[r[this._isHorizontal?d+"-x":d+"-y"].scriptName]="snapInterval("+e+"px, "+c+"px)"}},_setListEnds:function(){if(this._environmentSupportsTouch&&this._currentPage.element){for(var a=this._panningDivContainer.style,b=0,c=0,d=this._getTailOfBuffer(),e=this._getHeadOfBuffer(),f=r["scroll-limit-"+(this._isHorizontal?"x-min":"y-min")].scriptName,g=r["scroll-limit-"+(this._isHorizontal?"x-max":"y-max")].scriptName;!e.element&&(e=e.prev,e!==this._prevMarker.prev););for(;!d.element&&(d=d.next,d!==this._prevMarker););c=this._getItemStart(e),b=this._getItemStart(d),a[f]=b+"px",a[g]=c+"px"}},_viewportOnItemStart:function(){return this._getItemStart(this._currentPage)===this._getViewportStart()},_restoreAnimatedElement:function(a,b){var c=!0;return a.elementUniqueID!==q(b.element)||a.element?this._forEachPage(function(a){a.elementUniqueID!==b.elementUniqueID||a.element||(a.setElement(b.element,!0),c=!1)}):(a.setElement(b.element,!0),c=!1),c},_itemSettledOn:function(){this._lastTimeoutRequest&&(this._lastTimeoutRequest.cancel(),this._lastTimeoutRequest=null);var c=this;d._setImmediate(function(){c._viewportOnItemStart()&&(c._blockTabs=!1,c._currentPage.element&&c._lastSelectedElement!==c._currentPage.element&&(c._lastSelectedPage&&c._lastSelectedPage.element&&!a(c._lastSelectedPage.element)&&c._lastSelectedPage.element.setAttribute("aria-selected",!1),c._lastSelectedPage=c._currentPage,c._lastSelectedElement=c._currentPage.element,a(c._currentPage.element)||c._currentPage.element.setAttribute("aria-selected",!0),l.schedule(function(){if(c._currentPage.element){(c._hasFocus||c._hadFocus)&&(c._hadFocus=!1,n._setActive(c._currentPage.element),c._tabManager.childFocus=c._currentPage.element);var a=b.document.createEvent("CustomEvent");a.initCustomEvent(p.pageSelectedEvent,!0,!1,{source:c._flipperDiv}),c._writeProfilerMark("WinJS.UI.FlipView:pageSelectedEvent,info"),c._currentPage.element.dispatchEvent(a);var d=c._currentPage.element;if(d){var e=c._itemsManager._recordFromElement(d,!0);e&&e.renderComplete.then(function(){d===c._currentPage.element&&(c._currentPage.element.setAttribute("aria-setsize",c._cachedSize),c._currentPage.element.setAttribute("aria-posinset",c.currentIndex()+1),c._bufferAriaStartMarker.setAttribute("aria-flowto",c._currentPage.element.id),a=b.document.createEvent("CustomEvent"),a.initCustomEvent(p.pageCompletedEvent,!0,!1,{source:c._flipperDiv}),c._writeProfilerMark("WinJS.UI.FlipView:pageCompletedEvent,info"),c._currentPage.element.dispatchEvent(a))})}}},l.Priority.normal,null,"WinJS.UI.FlipView._dispatchPageSelectedEvent")))})},_forEachPage:function(a){var b=this._prevMarker;do{if(a(b))break;b=b.next}while(b!==this._prevMarker)},_changeFlipPage:function(a,b,c){this._writeProfilerMark("WinJS.UI.FlipView:_changeFlipPage,info"),a.element=null,a.setElement?a.setElement(c,!0):(b.parentNode.removeChild(b),a.elementRoot.appendChild(c));var d=b.style;return d.position="absolute",d.left="0px",d.top="0px",d.opacity=1,a.pageRoot.appendChild(b),b.style.left=Math.max(0,(a.pageRoot.offsetWidth-b.offsetWidth)/2)+"px",b.style.top=Math.max(0,(a.pageRoot.offsetHeight-b.offsetHeight)/2)+"px",i.fadeOut(b).then(function(){b.parentNode&&b.parentNode.removeChild(b)})},_deleteFlipPage:function(a){h("WinJS.UI.FlipView:_deleteFlipPage,info"),a.elementRoot.style.opacity=0;var b=i.createDeleteFromListAnimation([a.elementRoot]),c=this;return b.execute().then(function(){a.discardable&&(a.discard(),c._itemsManager.releaseItem(a.element))})},_insertFlipPage:function(a){h("WinJS.UI.FlipView:_insertFlipPage,info"),a.elementRoot.style.opacity=1;var b=i.createAddToListAnimation([a.elementRoot]);return b.execute().then(function(){a.discardable&&a.discard()})},_moveFlipPage:function(a,b){h("WinJS.UI.FlipView:_moveFlipPage,info");var c=i.createRepositionAnimation(a.pageRoot);b();var d=this;return c.execute().then(function(){if(a.discardable){a.discard();var b=d._getAnimationRecord(a.element);b&&!b.successfullyMoved&&d._itemsManager.releaseItem(a.element)}})},_handleManipulationStateChanged:function(a){this._manipulationState=a.currentState,0===a.currentState&&a.target===this._panningDivContainer&&(this._itemSettledOn(),this._ensureCentered())}},{supportedForProcessing:!1});return v.flipPageBufferCount=2,v})})}),d("require-style!less/styles-flipview",[],function(){}),d("require-style!less/colors-flipview",[],function(){}),d("WinJS/Controls/FlipView",["../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Events","../Core/_Resources","../Core/_WriteProfilerMark","../Animations","../Animations/_TransitionAnimation","../BindingList","../Promise","../Scheduler","../Utilities/_Control","../Utilities/_Dispose","../Utilities/_ElementUtilities","../Utilities/_Hoverable","../Utilities/_ItemsManager","../Utilities/_UI","./ElementResizeInstrument","./FlipView/_Constants","./FlipView/_PageManager","require-style!less/styles-flipview","require-style!less/colors-flipview"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u){"use strict";b.Namespace.define("WinJS.UI",{FlipView:b.Namespace._lazy(function(){function p(a){var b=a[0].target.winControl;b&&b instanceof L&&a.some(function(a){return"dir"===a.attributeName?!0:"style"===a.attributeName?b._cachedStyleDir!==a.target.style.direction:!1})&&(b._cachedStyleDir=b._flipviewDiv.style.direction,b._rtl="rtl"===o._getComputedStyle(b._flipviewDiv,null).direction,b._setupOrientation())}var v="win-navbutton",w="win-flipview",x="win-navleft",y="win-navright",z="win-navtop",A="win-navbottom",B="Previous",C="Next",D=3e3,E=500,F="&#57570;",G="&#57571;",H="&#57572;",I="&#57573;",J=40,K={get badAxis(){return"Invalid argument: orientation must be a string, either 'horizontal' or 'vertical'"},get badCurrentPage(){return"Invalid argument: currentPage must be a number greater than or equal to zero and be within the bounds of the datasource"},get noitemsManagerForCount(){return"Invalid operation: can't get count if no dataSource has been set"},get badItemSpacingAmount(){return"Invalid argument: itemSpacing must be a number greater than or equal to zero"},get navigationDuringStateChange(){return"Error: After changing itemDataSource or itemTemplate, any navigation in the FlipView control should be delayed until the pageselected event is fired."},get panningContainerAriaLabel(){return f._getWinJSString("ui/flipViewPanningContainerAriaLabel").value}},L=b.Class.define(function(b,c){g("WinJS.UI.FlipView:constructor,StartTM"),this._disposed=!1,b=b||a.document.createElement("div");var d=!0,e=null,f=q._trivialHtmlRenderer,h=0,i=0;if(c){if(c.orientation&&"string"==typeof c.orientation)switch(c.orientation.toLowerCase()){case"horizontal":d=!0;break;case"vertical":d=!1}c.currentPage&&(h=c.currentPage>>0,h=0>h?0:h),c.itemDataSource&&(e=c.itemDataSource),c.itemTemplate&&(f=this._getItemRenderer(c.itemTemplate)),c.itemSpacing&&(i=c.itemSpacing>>0,i=0>i?0:i)}if(!e){var k=new j.List;e=k.dataSource}o.empty(b),this._flipviewDiv=b,b.winControl=this,m._setOptions(this,c,!0),this._initializeFlipView(b,d,e,f,h,i),o.addClass(b,"win-disposable"),this._avoidTrappingTime=0,this._windowWheelHandlerBound=this._windowWheelHandler.bind(this),o._globalListener.addEventListener(b,"wheel",this._windowWheelHandlerBound),o._globalListener.addEventListener(b,"mousewheel",this._windowWheelHandlerBound),g("WinJS.UI.FlipView:constructor,StopTM")},{dispose:function(){g("WinJS.UI.FlipView:dispose,StopTM"),this._disposed||(o._globalListener.removeEventListener(this._flipviewDiv,"wheel",this._windowWheelHandlerBound),o._globalListener.removeEventListener(this._flipviewDiv,"mousewheel",this._windowWheelHandlerBound),o._resizeNotifier.unsubscribe(this._flipviewDiv,this._resizeHandlerBound),this._elementResizeInstrument.dispose(),this._disposed=!0,this._pageManager.dispose(),this._itemsManager.release(),this.itemDataSource=null)},next:function(){g("WinJS.UI.FlipView:next,info");var a=this._nextAnimation?null:this._cancelDefaultAnimation;return this._navigate(!0,a)},previous:function(){g("WinJS.UI.FlipView:prev,info");var a=this._prevAnimation?null:this._cancelDefaultAnimation;return this._navigate(!1,a)},element:{get:function(){return this._flipviewDiv}},currentPage:{get:function(){return this._getCurrentIndex()},set:function(a){
-if(g("WinJS.UI.FlipView:set_currentPage,info"),this._pageManager._notificationsEndedSignal){var b=this;return void this._pageManager._notificationsEndedSignal.promise.done(function(){b._pageManager._notificationsEndedSignal=null,b.currentPage=a})}if(!this._animating||this._cancelAnimation())if(a>>=0,a=0>a?0:a,this._refreshTimer)this._indexAfterRefresh=a;else{this._pageManager._cachedSize>0?a=Math.min(this._pageManager._cachedSize-1,a):0===this._pageManager._cachedSize&&(a=0);var b=this;if(this._jumpingToIndex===a)return;var c=function(){b._jumpingToIndex=null};this._jumpingToIndex=a;var d=this._jumpAnimation?this._jumpAnimation:this._defaultAnimation.bind(this),e=this._jumpAnimation?null:this._cancelDefaultAnimation,f=function(){b._completeJump()};this._pageManager.startAnimatedJump(a,e,f).then(function(a){if(a){b._animationsStarted();var e=a.oldPage.pageRoot,h=a.newPage.pageRoot;b._contentDiv.appendChild(e),b._contentDiv.appendChild(h),b._completeJumpPending=!0,d(e,h).then(function(){b._completeJumpPending&&(f(),g("WinJS.UI.FlipView:set_currentPage.animationComplete,info"))}).done(c,c)}else c()},c)}}},orientation:{get:function(){return this._axisAsString()},set:function(a){g("WinJS.UI.FlipView:set_orientation,info");var b="horizontal"===a;b!==this._isHorizontal&&(this._isHorizontal=b,this._setupOrientation(),this._pageManager.setOrientation(this._isHorizontal))}},itemDataSource:{get:function(){return this._dataSource},set:function(a){g("WinJS.UI.FlipView:set_itemDataSource,info"),this._dataSourceAfterRefresh=a||(new j.List).dataSource,this._refresh()}},itemTemplate:{get:function(){return this._itemRenderer},set:function(a){g("WinJS.UI.FlipView:set_itemTemplate,info"),this._itemRendererAfterRefresh=this._getItemRenderer(a),this._refresh()}},itemSpacing:{get:function(){return this._pageManager.getItemSpacing()},set:function(a){g("WinJS.UI.FlipView:set_itemSpacing,info"),a>>=0,a=0>a?0:a,this._pageManager.setItemSpacing(a)}},count:function(){g("WinJS.UI.FlipView:count,info");var a=this;return new k(function(b,c){a._itemsManager?a._pageManager._cachedSize===r.CountResult.unknown||a._pageManager._cachedSize>=0?b(a._pageManager._cachedSize):a._dataSource.getCount().then(function(c){a._pageManager._cachedSize=c,b(c)}):c(L.noitemsManagerForCount)})},setCustomAnimations:function(a){g("WinJS.UI.FlipView:setCustomAnimations,info"),void 0!==a.next&&(this._nextAnimation=a.next),void 0!==a.previous&&(this._prevAnimation=a.previous),void 0!==a.jump&&(this._jumpAnimation=a.jump)},forceLayout:function(){g("WinJS.UI.FlipView:forceLayout,info"),this._pageManager.resized()},_initializeFlipView:function(b,d,e,f,g,h){function i(a){a.setAttribute("aria-hidden",!0),a.style.visibility="hidden",a.style.opacity=0,a.tabIndex=-1,a.style.zIndex=1e3}function j(a){if(a.pointerType!==D){if(m._touchInteraction=!1,a.screenX===m._lastMouseX&&a.screenY===m._lastMouseY)return;m._lastMouseX=a.screenX,m._lastMouseY=a.screenY,m._mouseInViewport=!0,m._fadeInButton("prev"),m._fadeInButton("next"),m._fadeOutButtons()}}function k(a){a.pointerType===D?(m._mouseInViewport=!1,m._touchInteraction=!0,m._fadeOutButtons(!0)):(m._touchInteraction=!1,m._isInteractive(a.target)||0!==(4&a.buttons)&&(a.stopPropagation(),a.preventDefault()))}function l(a){a.pointerType!==D&&(m._touchInteraction=!1)}var m=this,n=!1;this._flipviewDiv=b,o.addClass(this._flipviewDiv,w),this._contentDiv=a.document.createElement("div"),this._panningDivContainer=a.document.createElement("div"),this._panningDivContainer.className="win-surface",this._panningDiv=a.document.createElement("div"),this._prevButton=a.document.createElement("button"),this._nextButton=a.document.createElement("button"),this._isHorizontal=d,this._dataSource=e,this._itemRenderer=f,this._itemsManager=null,this._pageManager=null;for(var t=["scroll-limit-x-max","scroll-limit-x-min","scroll-limit-y-max","scroll-limit-y-min","scroll-snap-type","scroll-snap-x","scroll-snap-y","overflow-style"],v=!0,x=c._browserStyleEquivalents,y=0,z=t.length;z>y;y++)v=v&&!!x[t[y]];v=v&&!!c._browserEventEquivalents.manipulationStateChanged,v=v&&o._supportsSnapPoints,this._environmentSupportsTouch=v;var A=this._flipviewDiv.getAttribute("aria-label");A||this._flipviewDiv.setAttribute("aria-label",""),this._flipviewDiv.setAttribute("role","listbox"),this._flipviewDiv.style.overflow||(this._flipviewDiv.style.overflow="hidden"),this._contentDiv.style.position="relative",this._contentDiv.style.zIndex=0,this._contentDiv.style.width="100%",this._contentDiv.style.height="100%",this._panningDiv.style.position="relative",this._panningDivContainer.style.position="relative",this._panningDivContainer.style.width="100%",this._panningDivContainer.style.height="100%",this._panningDivContainer.setAttribute("role","group"),this._panningDivContainer.setAttribute("aria-label",K.panningContainerAriaLabel),this._contentDiv.appendChild(this._panningDivContainer),this._flipviewDiv.appendChild(this._contentDiv),this._panningDiv.style.width="100%",this._panningDiv.style.height="100%",this._setupOrientation(),i(this._prevButton),i(this._nextButton),this._prevButton.setAttribute("aria-label",B),this._nextButton.setAttribute("aria-label",C),this._prevButton.setAttribute("type","button"),this._nextButton.setAttribute("type","button"),this._panningDivContainer.appendChild(this._panningDiv),this._contentDiv.appendChild(this._prevButton),this._contentDiv.appendChild(this._nextButton),this._itemsManagerCallback={inserted:function(a,b,c){m._itemsManager._itemFromPromise(a).then(function(a){var d=m._itemsManager._elementFromHandle(b),e=m._itemsManager._elementFromHandle(c);m._pageManager.inserted(a,d,e,!0)})},countChanged:function(a,b){m._pageManager._cachedSize=a,b!==r.CountResult.unknown&&m._fireDatasourceCountChangedEvent()},changed:function(a,b){m._pageManager.changed(a,b)},moved:function(a,b,c,d){var e=function(a){m._pageManager.moved(a,b,c)};a?e(a):m._itemsManager._itemFromPromise(d).then(e)},removed:function(a,b){a&&m._pageManager.removed(a,b,!0)},knownUpdatesComplete:function(){},beginNotifications:function(){m._cancelAnimation(),m._pageManager.notificationsStarted()},endNotifications:function(){m._pageManager.notificationsEnded()},itemAvailable:function(a,b){m._pageManager.itemRetrieved(a,b)},reload:function(){m._pageManager.reload()}},this._dataSource&&(this._itemsManager=q._createItemsManager(this._dataSource,this._itemRenderer,this._itemsManagerCallback,{ownerElement:this._flipviewDiv})),this._pageManager=new u._FlipPageManager(this._flipviewDiv,this._panningDiv,this._panningDivContainer,this._itemsManager,h,this._environmentSupportsTouch,{hidePreviousButton:function(){m._hasPrevContent=!1,m._fadeOutButton("prev"),m._prevButton.setAttribute("aria-hidden",!0)},showPreviousButton:function(){m._hasPrevContent=!0,m._fadeInButton("prev"),m._prevButton.setAttribute("aria-hidden",!1)},hideNextButton:function(){m._hasNextContent=!1,m._fadeOutButton("next"),m._nextButton.setAttribute("aria-hidden",!0)},showNextButton:function(){m._hasNextContent=!0,m._fadeInButton("next"),m._nextButton.setAttribute("aria-hidden",!1)}}),this._pageManager.initialize(g,this._isHorizontal),this._dataSource.getCount().then(function(a){m._pageManager._cachedSize=a}),this._prevButton.addEventListener("click",function(){m.previous()},!1),this._nextButton.addEventListener("click",function(){m.next()},!1),new o._MutationObserver(p).observe(this._flipviewDiv,{attributes:!0,attributeFilter:["dir","style"]}),this._cachedStyleDir=this._flipviewDiv.style.direction,this._contentDiv.addEventListener("mouseleave",function(){m._mouseInViewport=!1},!1);var D=o._MSPointerEvent.MSPOINTER_TYPE_TOUCH||"touch";this._environmentSupportsTouch&&(o._addEventListener(this._contentDiv,"pointerdown",k,!1),o._addEventListener(this._contentDiv,"pointermove",j,!1),o._addEventListener(this._contentDiv,"pointerup",l,!1)),this._panningDivContainer.addEventListener("scroll",function(){m._scrollPosChanged()},!1),this._panningDiv.addEventListener("blur",function(){m._touchInteraction||m._fadeOutButtons()},!0),this._resizeHandlerBound=this._resizeHandler.bind(this),this._elementResizeInstrument=new s._ElementResizeInstrument,this._flipviewDiv.appendChild(this._elementResizeInstrument.element),this._elementResizeInstrument.addEventListener("resize",this._resizeHandlerBound),o._resizeNotifier.subscribe(this._flipviewDiv,this._resizeHandlerBound);var E=a.document.body.contains(this._flipviewDiv);E&&this._elementResizeInstrument.addedToDom(),o._addInsertedNotifier(this._flipviewDiv);var F=!0;this._flipviewDiv.addEventListener("WinJSNodeInserted",function(a){F?(F=!1,E||(m._elementResizeInstrument.addedToDom(),m._pageManager.resized())):m._pageManager.resized()},!1),this._flipviewDiv.addEventListener("keydown",function(a){if(!m._disposed){var b=!0;if(!m._isInteractive(a.target)){var c=o.Key,d=!1;if(m._isHorizontal)switch(a.keyCode){case c.leftArrow:!m._rtl&&m.currentPage>0?(m.previous(),d=!0):m._rtl&&m.currentPage<m._pageManager._cachedSize-1&&(m.next(),d=!0);break;case c.pageUp:m.currentPage>0&&(m.previous(),d=!0);break;case c.rightArrow:!m._rtl&&m.currentPage<m._pageManager._cachedSize-1?(m.next(),d=!0):m._rtl&&m.currentPage>0&&(m.previous(),d=!0);break;case c.pageDown:m.currentPage<m._pageManager._cachedSize-1&&(m.next(),d=!0);break;case c.upArrow:case c.downArrow:d=!0,b=!1}else switch(a.keyCode){case c.upArrow:case c.pageUp:m.currentPage>0&&(m.previous(),d=!0);break;case c.downArrow:case c.pageDown:m.currentPage<m._pageManager._cachedSize-1&&(m.next(),d=!0);break;case c.space:d=!0}switch(a.keyCode){case c.home:m.currentPage=0,d=!0;break;case c.end:m._pageManager._cachedSize>0&&(m.currentPage=m._pageManager._cachedSize-1),d=!0}if(d)return a.preventDefault(),b&&a.stopPropagation(),!0}}},!1),n=!0},_windowWheelHandler:function(a){if(!this._disposed){a=a.detail.originalEvent;var b=a.target&&(this._flipviewDiv.contains(a.target)||this._flipviewDiv===a.target),d=this,e=c._now(),f=this._avoidTrappingTime>e;b&&!f||(this._avoidTrappingTime=e+E),b&&f?(this._panningDivContainer.style.overflowX="hidden",this._panningDivContainer.style.overflowY="hidden",c._yieldForDomModification(function(){d._pageManager._ensureCentered(),d._isHorizontal?(d._panningDivContainer.style.overflowX=d._environmentSupportsTouch?"scroll":"hidden",d._panningDivContainer.style.overflowY="hidden"):(d._panningDivContainer.style.overflowY=d._environmentSupportsTouch?"scroll":"hidden",d._panningDivContainer.style.overflowX="hidden")})):b&&this._pageManager.simulateMouseWheelScroll(a)}},_isInteractive:function(a){if(a.parentNode)for(var b=a.parentNode.querySelectorAll(".win-interactive, .win-interactive *"),c=0,d=b.length;d>c;c++)if(b[c]===a)return!0;return!1},_resizeHandler:function(){g("WinJS.UI.FlipView:resize,StartTM"),this._pageManager.resized()},_refreshHandler:function(){var a=this._dataSourceAfterRefresh||this._dataSource,b=this._itemRendererAfterRefresh||this._itemRenderer,c=this._indexAfterRefresh||0;this._setDatasource(a,b,c),this._dataSourceAfterRefresh=null,this._itemRendererAfterRefresh=null,this._indexAfterRefresh=0,this._refreshTimer=!1},_refresh:function(){if(!this._refreshTimer){var a=this;this._refreshTimer=!0,l.schedule(function(){a._refreshTimer&&!a._disposed&&a._refreshHandler()},l.Priority.high,null,"WinJS.UI.FlipView._refreshHandler")}},_getItemRenderer:function(b){var c=null;if("function"==typeof b){var d=new k(function(){}),e=b(d);c=e.element?"object"==typeof e.element&&"function"==typeof e.element.then?function(c){var d=a.document.createElement("div");return d.className="win-template",n.markDisposable(d),{element:d,renderComplete:b(c).element.then(function(a){d.appendChild(a)})}}:b:function(c){var d=a.document.createElement("div");return d.className="win-template",n.markDisposable(d),{element:d,renderComplete:c.then(function(){return k.as(b(c)).then(function(a){d.appendChild(a)})})}}}else"object"==typeof b&&(c=b.renderItem);return c},_navigate:function(a,b){if(c.validation&&this._refreshTimer)throw new d("WinJS.UI.FlipView.NavigationDuringStateChange",K.navigationDuringStateChange);if(this._animating||(this._animatingForward=a),this._goForward=a,this._animating&&!this._cancelAnimation())return!1;var e=this,f=a?this._nextAnimation:this._prevAnimation,g=f?f:this._defaultAnimation.bind(this),h=function(a){e._completeNavigation(a)},i=this._pageManager.startAnimatedNavigation(a,b,h);if(i){this._animationsStarted();var j=i.outgoing.pageRoot,k=i.incoming.pageRoot;return this._contentDiv.appendChild(j),this._contentDiv.appendChild(k),this._completeNavigationPending=!0,g(j,k).then(function(){e._completeNavigationPending&&h(e._goForward)}).done(),!0}return!1},_cancelDefaultAnimation:function(a,b){a.style.opacity=0,b.style.animationName="",b.style.opacity=1},_cancelAnimation:function(){if(this._pageManager._navigationAnimationRecord&&this._pageManager._navigationAnimationRecord.completionCallback){var a=this._pageManager._navigationAnimationRecord.cancelAnimationCallback;if(a&&(a=a.bind(this)),this._pageManager._navigationAnimationRecord&&this._pageManager._navigationAnimationRecord.elementContainers){var b=this._pageManager._navigationAnimationRecord.elementContainers[0],c=this._pageManager._navigationAnimationRecord.elementContainers[1],d=b.pageRoot,e=c.pageRoot;return a&&a(d,e),this._pageManager._navigationAnimationRecord.completionCallback(this._animatingForward),!0}}return!1},_completeNavigation:function(a){if(!this._disposed){if(this._pageManager._resizing=!1,this._pageManager._navigationAnimationRecord&&this._pageManager._navigationAnimationRecord.elementContainers){var b=this._pageManager._navigationAnimationRecord.elementContainers[0],c=this._pageManager._navigationAnimationRecord.elementContainers[1],d=b.pageRoot,e=c.pageRoot;d.parentNode&&d.parentNode.removeChild(d),e.parentNode&&e.parentNode.removeChild(e),this._pageManager.endAnimatedNavigation(a,b,c),this._fadeOutButtons(),this._scrollPosChanged(),this._pageManager._ensureCentered(!0),this._animationsFinished()}this._completeNavigationPending=!1}},_completeJump:function(){if(!this._disposed){if(this._pageManager._resizing=!1,this._pageManager._navigationAnimationRecord&&this._pageManager._navigationAnimationRecord.elementContainers){var a=this._pageManager._navigationAnimationRecord.elementContainers[0],b=this._pageManager._navigationAnimationRecord.elementContainers[1],c=a.pageRoot,d=b.pageRoot;c.parentNode&&c.parentNode.removeChild(c),d.parentNode&&d.parentNode.removeChild(d),this._pageManager.endAnimatedJump(a,b),this._animationsFinished()}this._completeJumpPending=!1}},_setCurrentIndex:function(a){return this._pageManager.jumpToIndex(a)},_getCurrentIndex:function(){return this._pageManager.currentIndex()},_setDatasource:function(a,b,c){this._animating&&this._cancelAnimation();var d=0;void 0!==c&&(d=c),this._dataSource=a,this._itemRenderer=b;var e=this._itemsManager;this._itemsManager=q._createItemsManager(this._dataSource,this._itemRenderer,this._itemsManagerCallback,{ownerElement:this._flipviewDiv}),this._dataSource=this._itemsManager.dataSource;var f=this;this._dataSource.getCount().then(function(a){f._pageManager._cachedSize=a}),this._pageManager.setNewItemsManager(this._itemsManager,d),e&&e.release()},_fireDatasourceCountChangedEvent:function(){var b=this;l.schedule(function(){var c=a.document.createEvent("Event");c.initEvent(L.datasourceCountChangedEvent,!0,!0),g("WinJS.UI.FlipView:dataSourceCountChangedEvent,info"),b._flipviewDiv.dispatchEvent(c)},l.Priority.normal,null,"WinJS.UI.FlipView._dispatchDataSourceCountChangedEvent")},_scrollPosChanged:function(){this._disposed||this._pageManager.scrollPosChanged()},_axisAsString:function(){return this._isHorizontal?"horizontal":"vertical"},_setupOrientation:function(){if(this._isHorizontal){this._panningDivContainer.style.overflowX=this._environmentSupportsTouch?"scroll":"hidden",this._panningDivContainer.style.overflowY="hidden";var a="rtl"===o._getComputedStyle(this._flipviewDiv,null).direction;this._rtl=a,a?(this._prevButton.className=v+" "+y,this._nextButton.className=v+" "+x):(this._prevButton.className=v+" "+x,this._nextButton.className=v+" "+y),this._prevButton.innerHTML=a?G:F,this._nextButton.innerHTML=a?F:G}else this._panningDivContainer.style.overflowY=this._environmentSupportsTouch?"scroll":"hidden",this._panningDivContainer.style.overflowX="hidden",this._prevButton.className=v+" "+z,this._nextButton.className=v+" "+A,this._prevButton.innerHTML=H,this._nextButton.innerHTML=I;this._panningDivContainer.style.msOverflowStyle="none"},_fadeInButton:function(a,b){(this._mouseInViewport||b||!this._environmentSupportsTouch)&&("next"===a&&this._hasNextContent?(this._nextButtonAnimation&&(this._nextButtonAnimation.cancel(),this._nextButtonAnimation=null),this._nextButton.style.visibility="visible",this._nextButtonAnimation=this._fadeInFromCurrentValue(this._nextButton)):"prev"===a&&this._hasPrevContent&&(this._prevButtonAnimation&&(this._prevButtonAnimation.cancel(),this._prevButtonAnimation=null),this._prevButton.style.visibility="visible",this._prevButtonAnimation=this._fadeInFromCurrentValue(this._prevButton)))},_fadeOutButton:function(a){var b=this;return"next"===a?(this._nextButtonAnimation&&(this._nextButtonAnimation.cancel(),this._nextButtonAnimation=null),this._nextButtonAnimation=h.fadeOut(this._nextButton).then(function(){b._nextButton.style.visibility="hidden"}),this._nextButtonAnimation):(this._prevButtonAnimation&&(this._prevButtonAnimation.cancel(),this._prevButtonAnimation=null),this._prevButtonAnimation=h.fadeOut(this._prevButton).then(function(){b._prevButton.style.visibility="hidden"}),this._prevButtonAnimation)},_fadeOutButtons:function(a){if(this._environmentSupportsTouch){this._buttonFadePromise&&(this._buttonFadePromise.cancel(),this._buttonFadePromise=null);var b=this;this._buttonFadePromise=(a?k.wrap():k.timeout(i._animationTimeAdjustment(D))).then(function(){b._fadeOutButton("prev"),b._fadeOutButton("next"),b._buttonFadePromise=null})}},_animationsStarted:function(){this._animating=!0},_animationsFinished:function(){this._animating=!1},_defaultAnimation:function(a,b){var c={};b.style.left="0px",b.style.top="0px",b.style.opacity=0;var d=a.itemIndex>b.itemIndex?-J:J;c.left=(this._isHorizontal?this._rtl?-d:d:0)+"px",c.top=(this._isHorizontal?0:d)+"px";var e=h.fadeOut(a),f=h.enterContent(b,[c],{mechanism:"transition"});return k.join([e,f])},_fadeInFromCurrentValue:function(a){return i.executeTransition(a,{property:"opacity",delay:0,duration:167,timing:"linear",to:1})}},t);return b.Class.mix(L,e.createEventProperties(L.datasourceCountChangedEvent,L.pageVisibilityChangedEvent,L.pageSelectedEvent,L.pageCompletedEvent)),b.Class.mix(L,m.DOMEventMixin),L})})}),d("WinJS/Controls/ItemContainer",["exports","../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Events","../Core/_Log","../Core/_Resources","../Core/_WriteProfilerMark","../Promise","../Scheduler","../Utilities/_Control","../Utilities/_Dispose","../Utilities/_ElementUtilities","../Utilities/_Hoverable","../Utilities/_KeyboardBehavior","../Utilities/_UI","./ItemContainer/_Constants","./ItemContainer/_ItemEventsHandler"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){"use strict";var t=f._createEventProperty,u={invoked:"invoked",selectionchanging:"selectionchanging",selectionchanged:"selectionchanged"};c.Namespace._moduleDefine(a,"WinJS.UI",{ItemContainer:c.Namespace._lazy(function(){var f={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get swipeOrientationDeprecated(){return"Invalid configuration: swipeOrientation is deprecated. The control will default this property to 'none'"},get swipeBehaviorDeprecated(){return"Invalid configuration: swipeBehavior is deprecated. The control will default this property to 'none'"}},h=c.Class.define(function(c,d){function g(a,b,c){return{name:b?a:a.toLowerCase(),handler:function(b){i["_on"+a](b)},capture:c}}if(c=c||b.document.createElement("DIV"),this._id=c.id||n._uniqueID(c),this._writeProfilerMark("constructor,StartTM"),d=d||{},c.winControl)throw new e("WinJS.UI.ItemContainer.DuplicateConstruction",f.duplicateConstruction);c.winControl=this,this._element=c,n.addClass(c,"win-disposable"),this._selectionMode=q.SelectionMode.single,this._draggable=!1,this._pressedEntity={type:q.ObjectType.item,index:r._INVALID_INDEX},this.tapBehavior=q.TapBehavior.invokeOnly,n.addClass(this.element,h._ClassName.itemContainer+" "+r._containerClass),this._setupInternalTree(),this._selection=new a._SingleItemSelectionManager(c,this._itemBox),this._setTabIndex(),l.setOptions(this,d),this._mutationObserver=new n._MutationObserver(this._itemPropertyChange.bind(this)),this._mutationObserver.observe(c,{attributes:!0,attributeFilter:["aria-selected"]}),this._setAriaRole();var i=this;this.selectionDisabled||k.schedule(function(){i._setDirectionClass()},k.Priority.normal,null,"WinJS.UI.ItemContainer_async_initialize"),this._itemEventsHandler=new s._ItemEventsHandler(Object.create({containerFromElement:function(){return i.element},indexForItemElement:function(){return 1},indexForHeaderElement:function(){return r._INVALID_INDEX},itemBoxAtIndex:function(){return i._itemBox},itemAtIndex:function(){return i.element},headerAtIndex:function(){return null},containerAtIndex:function(){return i.element},isZombie:function(){return this._disposed},getItemPosition:function(){return i._getItemPosition()},rtl:function(){return i._rtl()},fireInvokeEvent:function(){i._fireInvokeEvent()},verifySelectionAllowed:function(){return i._verifySelectionAllowed()},changeFocus:function(){},selectRange:function(a,b){return i._selection.set({firstIndex:a,lastIndex:b})}},{pressedEntity:{get:function(){return i._pressedEntity},set:function(a){i._pressedEntity=a}},pressedElement:{enumerable:!0,set:function(a){i._pressedElement=a}},eventHandlerRoot:{enumerable:!0,get:function(){return i.element}},selectionMode:{enumerable:!0,get:function(){return i._selectionMode}},accessibleItemClass:{enumerable:!0,get:function(){return r._containerClass}},canvasProxy:{enumerable:!0,get:function(){return i._captureProxy}},tapBehavior:{enumerable:!0,get:function(){return i._tapBehavior}},draggable:{enumerable:!0,get:function(){return i._draggable}},selection:{enumerable:!0,get:function(){return i._selection}},customFootprintParent:{enumerable:!0,get:function(){return null}},skipPreventDefaultOnPointerDown:{enumerable:!0,get:function(){return!0}}}));var j=[g("PointerDown"),g("Click"),g("PointerUp"),g("PointerCancel"),g("LostPointerCapture"),g("ContextMenu"),g("MSHoldVisual",!0),g("FocusIn"),g("FocusOut"),g("DragStart"),g("DragEnd"),g("KeyDown")];j.forEach(function(a){n._addEventListener(i.element,a.name,a.handler,!!a.capture)}),this._writeProfilerMark("constructor,StopTM")},{element:{get:function(){return this._element}},draggable:{get:function(){return this._draggable},set:function(a){d.isPhone||this._draggable!==a&&(this._draggable=a,this._updateDraggableAttribute())}},selected:{get:function(){return this._selection.selected},set:function(a){this._selection.selected!==a&&(this._selection.selected=a)}},swipeOrientation:{get:function(){return"none"},set:function(a){n._deprecated(f.swipeOrientationDeprecated)}},tapBehavior:{get:function(){return this._tapBehavior},set:function(a){d.isPhone&&a===q.TapBehavior.directSelect||(this._tapBehavior=a,this._setAriaRole())}},swipeBehavior:{get:function(){return"none"},set:function(a){n._deprecated(f.swipeBehaviorDeprecated)}},selectionDisabled:{get:function(){return this._selectionMode===q.SelectionMode.none},set:function(a){a?this._selectionMode=q.SelectionMode.none:(this._setDirectionClass(),this._selectionMode=q.SelectionMode.single),this._setAriaRole()}},oninvoked:t(u.invoked),onselectionchanging:t(u.selectionchanging),onselectionchanged:t(u.selectionchanged),forceLayout:function(){this._forceLayout()},dispose:function(){this._disposed||(this._disposed=!0,this._itemEventsHandler.dispose(),m.disposeSubTree(this.element))},_onMSManipulationStateChanged:function(a){this._itemEventsHandler.onMSManipulationStateChanged(a)},_onPointerDown:function(a){this._itemEventsHandler.onPointerDown(a)},_onClick:function(a){this._itemEventsHandler.onClick(a)},_onPointerUp:function(a){n.hasClass(this._itemBox,r._itemFocusClass)&&this._onFocusOut(a),this._itemEventsHandler.onPointerUp(a)},_onPointerCancel:function(a){this._itemEventsHandler.onPointerCancel(a)},_onLostPointerCapture:function(a){this._itemEventsHandler.onLostPointerCapture(a)},_onContextMenu:function(a){this._itemEventsHandler.onContextMenu(a)},_onMSHoldVisual:function(a){this._itemEventsHandler.onMSHoldVisual(a)},_onFocusIn:function(){if(!this._itemBox.querySelector("."+r._itemFocusOutlineClass)&&p._keyboardSeenLast){n.addClass(this._itemBox,r._itemFocusClass);var a=b.document.createElement("div");a.className=r._itemFocusOutlineClass,this._itemBox.appendChild(a)}},_onFocusOut:function(){n.removeClass(this._itemBox,r._itemFocusClass);var a=this._itemBox.querySelector("."+r._itemFocusOutlineClass);a&&a.parentNode.removeChild(a)},_onDragStart:function(a){if(this._pressedElement&&this._itemEventsHandler._isInteractive(this._pressedElement))a.preventDefault();else{this._dragging=!0;var b=this;if(a.dataTransfer.setData("text",""),a.dataTransfer.setDragImage){var c=this.element.getBoundingClientRect();a.dataTransfer.setDragImage(this.element,a.clientX-c.left,a.clientY-c.top)}d._yieldForDomModification(function(){b._dragging&&n.addClass(b._itemBox,r._dragSourceClass)})}},_onDragEnd:function(){this._dragging=!1,n.removeClass(this._itemBox,r._dragSourceClass),this._itemEventsHandler.resetPointerDownState()},_onKeyDown:function(a){if(!this._itemEventsHandler._isInteractive(a.target)){var b=n.Key,c=a.keyCode,d=!1;if(a.ctrlKey||c!==b.enter)a.ctrlKey&&c===b.enter||c===b.space?this.selectionDisabled||(this.selected=!this.selected,d=n._setActive(this.element)):c===b.escape&&this.selected&&(this.selected=!1,d=!0);else{var e=this._verifySelectionAllowed();e.canTapSelect&&(this.selected=!this.selected),this._fireInvokeEvent(),d=!0}d&&(a.stopPropagation(),a.preventDefault())}},_setTabIndex:function(){var a=this.element.getAttribute("tabindex");a||this.element.setAttribute("tabindex","0")},_rtl:function(){return"boolean"!=typeof this._cachedRTL&&(this._cachedRTL="rtl"===n._getComputedStyle(this.element,null).direction),this._cachedRTL},_setDirectionClass:function(){n[this._rtl()?"addClass":"removeClass"](this.element,r._rtlListViewClass)},_forceLayout:function(){this._cachedRTL="rtl"===n._getComputedStyle(this.element,null).direction,this._setDirectionClass()},_getItemPosition:function(){var a=this.element;return a?j.wrap({left:this._rtl()?a.offsetParent.offsetWidth-a.offsetLeft-a.offsetWidth:a.offsetLeft,top:a.offsetTop,totalWidth:n.getTotalWidth(a),totalHeight:n.getTotalHeight(a),contentWidth:n.getContentWidth(a),contentHeight:n.getContentHeight(a)}):j.cancel},_itemPropertyChange:function(a){if(!this._disposed){var b=a[0].target,c="true"===b.getAttribute("aria-selected");c!==n._isSelectionRendered(this._itemBox)&&(this.selectionDisabled?n._setAttribute(b,"aria-selected",!c):(this.selected=c,c!==this.selected&&n._setAttribute(b,"aria-selected",!c)))}},_updateDraggableAttribute:function(){this._itemBox.setAttribute("draggable",this._draggable)},_verifySelectionAllowed:function(){if(this._selectionMode!==q.SelectionMode.none&&this._tapBehavior===q.TapBehavior.toggleSelect){var a=this._selection.fireSelectionChanging();return{canSelect:a,canTapSelect:a&&this._tapBehavior===q.TapBehavior.toggleSelect}}return{canSelect:!1,canTapSelect:!1}},_setupInternalTree:function(){var a=b.document.createElement("div");a.className=r._itemClass,this._captureProxy=b.document.createElement("div"),this._itemBox=b.document.createElement("div"),this._itemBox.className=r._itemBoxClass;for(var c=this.element.firstChild;c;){var d=c.nextSibling;a.appendChild(c),c=d}this.element.appendChild(this._itemBox),this._itemBox.appendChild(a),this.element.appendChild(this._captureProxy)},_fireInvokeEvent:function(){if(this.tapBehavior!==q.TapBehavior.none){var a=b.document.createEvent("CustomEvent");a.initCustomEvent(u.invoked,!0,!1,{}),this.element.dispatchEvent(a)}},_setAriaRole:function(){if(!this.element.getAttribute("role")||this._usingDefaultItemRole){this._usingDefaultItemRole=!0;var a;a=this.tapBehavior===q.TapBehavior.none&&this.selectionDisabled?"listitem":"option",n._setAttribute(this.element,"role",a)}},_writeProfilerMark:function(a){var b="WinJS.UI.ItemContainer:"+this._id+":"+a;i(b),g.log&&g.log(b,null,"itemcontainerprofiler")}},{_ClassName:{itemContainer:"win-itemcontainer",vertical:"win-vertical",horizontal:"win-horizontal"}});return c.Class.mix(h,l.DOMEventMixin),h}),_SingleItemSelectionManager:c.Namespace._lazy(function(){return c.Class.define(function(a,b){this._selected=!1,this._element=a,this._itemBox=b},{selected:{get:function(){return this._selected},set:function(a){a=!!a,this._selected!==a&&this.fireSelectionChanging()&&(this._selected=a,s._ItemEventsHandler.renderSelection(this._itemBox,this._element,a,!0,this._element),this.fireSelectionChanged())}},count:function(){return this._selected?1:0},getIndices:function(){},getItems:function(){},getRanges:function(){},isEverything:function(){return!1},set:function(){this.selected=!0},clear:function(){this.selected=!1},add:function(){this.selected=!0},remove:function(){this.selected=!1},selectAll:function(){},fireSelectionChanging:function(){var a=b.document.createEvent("CustomEvent");return a.initCustomEvent(u.selectionchanging,!0,!0,{}),this._element.dispatchEvent(a)},fireSelectionChanged:function(){var a=b.document.createEvent("CustomEvent");a.initCustomEvent(u.selectionchanged,!0,!1,{}),this._element.dispatchEvent(a)},_isIncluded:function(){return this._selected},_getFocused:function(){return{type:q.ObjectType.item,index:r._INVALID_INDEX}}})})})}),d("WinJS/Controls/Repeater",["exports","../Core/_Global","../Core/_Base","../Core/_ErrorFromName","../Core/_Events","../Core/_Resources","../Core/_WriteProfilerMark","../BindingList","../BindingTemplate","../Promise","../Utilities/_Control","../Utilities/_Dispose","../Utilities/_ElementUtilities","../Utilities/_Hoverable"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){"use strict";c.Namespace._moduleDefine(a,"WinJS.UI",{Repeater:c.Namespace._lazy(function(){function a(a){var c=b.document.createElement("div");return c.textContent=JSON.stringify(a),c}var f="itemsloaded",n="itemchanging",o="itemchanged",p="iteminserting",q="iteminserted",r="itemmoving",s="itemmoved",t="itemremoving",u="itemremoved",v="itemsreloading",w="itemsreloaded",x=e._createEventProperty,y={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get asynchronousRender(){return"Top level items must render synchronously"},get repeaterReentrancy(){return"Cannot modify Repeater data until Repeater has commited previous modification."}},z=c.Class.define(function(a,c){if(a&&a.winControl)throw new d("WinJS.UI.Repeater.DuplicateConstruction",y.duplicateConstruction);this._element=a||b.document.createElement("div"),this._id=this._element.id||m._uniqueID(this._element),this._writeProfilerMark("constructor,StartTM"),c=c||{},m.addClass(this._element,"win-repeater win-disposable"),this._render=null,this._modifying=!1,this._disposed=!1,this._element.winControl=this,this._dataListeners={itemchanged:this._dataItemChangedHandler.bind(this),iteminserted:this._dataItemInsertedHandler.bind(this),itemmoved:this._dataItemMovedHandler.bind(this),itemremoved:this._dataItemRemovedHandler.bind(this),reload:this._dataReloadHandler.bind(this)};var e=this._extractInlineTemplate();this._initializing=!0,this.template=c.template||e,this.data=c.data,this._initializing=!1,k._setOptions(this,c,!0),this._repeatedDOM=[],this._renderAllItems(),this.dispatchEvent(f,{}),this._writeProfilerMark("constructor,StopTM")},{element:{get:function(){return this._element;
-}},data:{get:function(){return this._data},set:function(a){this._writeProfilerMark("data.set,StartTM"),this._data&&this._removeDataListeners(),this._data=a||new h.List,this._addDataListeners(),this._initializing||(this._reloadRepeater(!0),this.dispatchEvent(f,{})),this._writeProfilerMark("data.set,StopTM")}},template:{get:function(){return this._template},set:function(b){this._writeProfilerMark("template.set,StartTM"),this._template=b||a,this._render=m._syncRenderer(this._template,this.element.tagName),this._initializing||(this._reloadRepeater(!0),this.dispatchEvent(f,{})),this._writeProfilerMark("template.set,StopTM")}},length:{get:function(){return this._repeatedDOM.length}},elementFromIndex:function(a){return this._repeatedDOM[a]},dispose:function(){if(!this._disposed){this._disposed=!0,this._removeDataListeners(),this._data=null,this._template=null;for(var a=0,b=this._repeatedDOM.length;b>a;a++)l._disposeElement(this._repeatedDOM[a])}},onitemsloaded:x(f),onitemchanging:x(n),onitemchanged:x(o),oniteminserting:x(p),oniteminserted:x(q),onitemmoving:x(r),onitemmoved:x(s),onitemremoving:x(t),onitemremoved:x(u),onitemsreloading:x(v),onitemsreloaded:x(w),_extractInlineTemplate:function(){if(this._element.firstElementChild){for(var a=b.document.createElement(this._element.tagName);this._element.firstElementChild;)a.appendChild(this._element.firstElementChild);return new i.Template(a,{extractChild:!0})}},_renderAllItems:function(){for(var a=b.document.createDocumentFragment(),c=0,e=this._data.length;e>c;c++){var f=this._render(this._data.getAt(c));if(!f)throw new d("WinJS.UI.Repeater.AsynchronousRender",y.asynchronousRender);a.appendChild(f),this._repeatedDOM.push(f)}this._element.appendChild(a)},_reloadRepeater:function(a){this._unloadRepeatedDOM(a),this._repeatedDOM=[],this._renderAllItems()},_unloadRepeatedDOM:function(a){for(var b=0,c=this._repeatedDOM.length;c>b;b++){var d=this._repeatedDOM[b];a&&l._disposeElement(d),d.parentElement===this._element&&this._element.removeChild(d)}},_addDataListeners:function(){Object.keys(this._dataListeners).forEach(function(a){this._data.addEventListener(a,this._dataListeners[a],!1)}.bind(this))},_beginModification:function(){if(this._modifying)throw new d("WinJS.UI.Repeater.RepeaterModificationReentrancy",y.repeaterReentrancy);this._modifying=!0},_endModification:function(){this._modifying=!1},_removeDataListeners:function(){Object.keys(this._dataListeners).forEach(function(a){this._data.removeEventListener(a,this._dataListeners[a],!1)}.bind(this))},_dataItemChangedHandler:function(a){this._beginModification();var b,c=this._element,e=a.detail.index,f=this._render(a.detail.newValue);if(!f)throw new d("WinJS.UI.Repeater.AsynchronousRender",y.asynchronousRender);this._repeatedDOM[e]&&(a.detail.oldElement=this._repeatedDOM[e]),a.detail.newElement=f,a.detail.setPromise=function(a){b=a},this._writeProfilerMark(n+",info"),this.dispatchEvent(n,a.detail);var g=null;e<this._repeatedDOM.length?(g=this._repeatedDOM[e],c.replaceChild(f,g),this._repeatedDOM[e]=f):(c.appendChild(f),this._repeatedDOM.push(f)),this._endModification(),this._writeProfilerMark(o+",info"),this.dispatchEvent(o,a.detail),g&&j.as(b).done(function(){l._disposeElement(g)}.bind(this))},_dataItemInsertedHandler:function(a){this._beginModification();var b=a.detail.index,c=this._render(a.detail.value);if(!c)throw new d("WinJS.UI.Repeater.AsynchronousRender",y.asynchronousRender);var e=this._element;if(a.detail.affectedElement=c,this._writeProfilerMark(p+",info"),this.dispatchEvent(p,a.detail),b<this._repeatedDOM.length){var f=this._repeatedDOM[b];e.insertBefore(c,f)}else e.appendChild(c);this._repeatedDOM.splice(b,0,c),this._endModification(),this._writeProfilerMark(q+",info"),this.dispatchEvent(q,a.detail)},_dataItemMovedHandler:function(a){this._beginModification();var b=this._repeatedDOM[a.detail.oldIndex];if(a.detail.affectedElement=b,this._writeProfilerMark(r+",info"),this.dispatchEvent(r,a.detail),this._repeatedDOM.splice(a.detail.oldIndex,1)[0],b.parentNode.removeChild(b),a.detail.newIndex<this._data.length-1){var c=this._repeatedDOM[a.detail.newIndex];this._element.insertBefore(b,c),this._repeatedDOM.splice(a.detail.newIndex,0,b)}else this._repeatedDOM.push(b),this._element.appendChild(b);this._endModification(),this._writeProfilerMark(s+",info"),this.dispatchEvent(s,a.detail)},_dataItemRemovedHandler:function(a){this._beginModification();var b,c=this._repeatedDOM[a.detail.index],d={affectedElement:c,index:a.detail.index,item:a.detail.item};d.setPromise=function(a){b=a},this._writeProfilerMark(t+",info"),this.dispatchEvent(t,d),c.parentNode.removeChild(c),this._repeatedDOM.splice(a.detail.index,1),this._endModification(),this._writeProfilerMark(u+",info"),this.dispatchEvent(u,d),j.as(b).done(function(){l._disposeElement(c)}.bind(this))},_dataReloadHandler:function(){this._beginModification();var a,b=this._repeatedDOM.slice(0),c={affectedElements:b};c.setPromise=function(b){a=b},this._writeProfilerMark(v+",info"),this.dispatchEvent(v,c),this._reloadRepeater(!1);var d=this._repeatedDOM.slice(0);this._endModification(),this._writeProfilerMark(w+",info"),this.dispatchEvent(w,{affectedElements:d}),j.as(a).done(function(){for(var a=0,c=b.length;c>a;a++)l._disposeElement(b[a])}.bind(this))},_writeProfilerMark:function(a){g("WinJS.UI.Repeater:"+this._id+":"+a)}},{isDeclarativeControlContainer:!0});return c.Class.mix(z,k.DOMEventMixin),z})})}),d("require-style!less/styles-datetimepicker",[],function(){}),d("WinJS/Controls/DatePicker",["../Core/_Global","../Core/_WinRT","../Core/_Base","../Core/_BaseUtils","../Core/_Events","../Core/_Resources","../Utilities/_Control","../Utilities/_ElementUtilities","../Utilities/_Hoverable","../Utilities/_Select","require-style!less/styles-datetimepicker"],function(a,b,c,d,e,f,g,h,i,j){"use strict";c.Namespace.define("WinJS.UI",{DatePicker:c.Namespace._lazy(function(){function d(a,c,d){var e=b.Windows.Globalization.DateTimeFormatting;a=a?a:d;var f=new e.DateTimeFormatter(a);return c?new e.DateTimeFormatter(a,f.languages,f.geographicRegion,c,f.clock):f}function i(a,b,c){var e=t[a];e||(e=t[a]={});var f=e[b];f||(f=e[b]={});var g=f[c];return g||(g=f[c]={},g.formatter=d(a,b,c),g.years={}),g}function k(a,b,c,d,e,f){var g=i(a,b,c),h=g.years[f.year+"-"+f.era];return h||(h=g.formatter.format(f.getDateTime()),g.years[f.year+"-"+f.era]=h),h}function l(a,b,c,d){var e=i(a,b,c);return e.formatter.format(d.getDateTime())}function m(a,b,c,d){var e=i(a,b,c);return e.formatter.format(d.getDateTime())}function n(a){var c=b.Windows.Globalization,d=new c.Calendar;return a?new c.Calendar(d.languages,a,d.getClock()):d}function o(a,b){var c=0;if(a.era===b.era)c=b.year-a.year;else for(;a.era!==b.era||a.year!==b.year;)c++,a.addYears(1);return c}var p="day",q="{month.full}",r="year.full",s={get ariaLabel(){return f._getWinJSString("ui/datePicker").value},get selectDay(){return f._getWinJSString("ui/selectDay").value},get selectMonth(){return f._getWinJSString("ui/selectMonth").value},get selectYear(){return f._getWinJSString("ui/selectYear").value}},t={},u=c.Class.define(function(b,c){this._currentDate=new Date,this._minYear=this._currentDate.getFullYear()-100,this._maxYear=this._currentDate.getFullYear()+100,this._datePatterns={date:null,month:null,year:null},b=b||a.document.createElement("div"),h.addClass(b,"win-disposable"),b.winControl=this;var d=b.getAttribute("aria-label");d||b.setAttribute("aria-label",s.ariaLabel),this._init(b),g.setOptions(this,c)},{_information:null,_currentDate:null,_calendar:null,_disabled:!1,_dateElement:null,_dateControl:null,_monthElement:null,_monthControl:null,_minYear:null,_maxYear:null,_yearElement:null,_yearControl:null,_datePatterns:{date:null,month:null,year:null},_addAccessibilityAttributes:function(){this._domElement.setAttribute("role","group"),this._dateElement.setAttribute("aria-label",s.selectDay),this._monthElement.setAttribute("aria-label",s.selectMonth),this._yearElement.setAttribute("aria-label",s.selectYear)},_addControlsInOrder:function(){var a=this._domElement,b=this,c=0;b._information.order.forEach(function(d){switch(d){case"month":a.appendChild(b._monthElement),h.addClass(b._monthElement,"win-order"+c++);break;case"date":a.appendChild(b._dateElement),h.addClass(b._dateElement,"win-order"+c++);break;case"year":a.appendChild(b._yearElement),h.addClass(b._yearElement,"win-order"+c++)}})},_createControlElements:function(){this._monthElement=a.document.createElement("select"),this._monthElement.className="win-datepicker-month win-dropdown",this._dateElement=a.document.createElement("select"),this._dateElement.className="win-datepicker-date win-dropdown",this._yearElement=a.document.createElement("select"),this._yearElement.className="win-datepicker-year win-dropdown"},_createControls:function(){var a=this._information,b=a.getIndex(this.current);a.forceLanguage&&(this._domElement.setAttribute("lang",a.forceLanguage),this._domElement.setAttribute("dir",a.isRTL?"rtl":"ltr")),this._yearControl=new j._Select(this._yearElement,{dataSource:this._information.years,disabled:this.disabled,index:b.year}),this._monthControl=new j._Select(this._monthElement,{dataSource:this._information.months(b.year),disabled:this.disabled,index:b.month}),this._dateControl=new j._Select(this._dateElement,{dataSource:this._information.dates(b.year,b.month),disabled:this.disabled,index:b.date}),this._wireupEvents()},dispose:function(){},calendar:{get:function(){return this._calendar},set:function(a){this._calendar=a,this._setElement(this._domElement)}},current:{get:function(){var a=this._currentDate,b=a.getFullYear();return new Date(Math.max(Math.min(this.maxYear,b),this.minYear),a.getMonth(),a.getDate(),12,0,0,0)},set:function(a){var b;if("string"==typeof a?(b=new Date(Date.parse(a)),b.setHours(12,0,0,0)):b=a,b){var c=this._currentDate;c!==b&&(this._currentDate=b,this._updateDisplay())}}},disabled:{get:function(){return this._disabled},set:function(a){this._disabled!==a&&(this._disabled=a,this._yearControl&&(this._monthControl.setDisabled(a),this._dateControl.setDisabled(a),this._yearControl.setDisabled(a)))}},datePattern:{get:function(){return this._datePatterns.date},set:function(a){this._datePatterns.date!==a&&(this._datePatterns.date=a,this._init())}},element:{get:function(){return this._domElement}},_setElement:function(a){this._domElement=this._domElement||a,this._domElement&&(h.empty(this._domElement),h.addClass(this._domElement,"win-datepicker"),this._updateInformation(),this._createControlElements(),this._addControlsInOrder(),this._createControls(),this._addAccessibilityAttributes())},minYear:{get:function(){return this._information.getDate({year:0,month:0,date:0}).getFullYear()},set:function(a){this._minYear!==a&&(this._minYear=a,a>this._maxYear&&(this._maxYear=a),this._updateInformation(),this._yearControl&&(this._yearControl.dataSource=this._information.years),this._updateDisplay())}},maxYear:{get:function(){var a={year:this._information.years.getLength()-1};return a.month=this._information.months(a.year).getLength()-1,a.date=this._information.dates(a.year,a.month).getLength()-1,this._information.getDate(a).getFullYear()},set:function(a){this._maxYear!==a&&(this._maxYear=a,a<this._minYear&&(this._minYear=a),this._updateInformation(),this._yearControl&&(this._yearControl.dataSource=this._information.years),this._updateDisplay())}},monthPattern:{get:function(){return this._datePatterns.month},set:function(a){this._datePatterns.month!==a&&(this._datePatterns.month=a,this._init())}},_updateInformation:function(){var a=new Date(this._minYear,0,1,12,0,0),b=new Date(this._maxYear,11,31,12,0,0);a.setFullYear(this._minYear),b.setFullYear(this._maxYear),this._information=u.getInformation(a,b,this._calendar,this._datePatterns)},_init:function(a){this._setElement(a)},_updateDisplay:function(){if(this._domElement&&this._yearControl){var a=this._information.getIndex(this.current);this._yearControl.index=a.year,this._monthControl.dataSource=this._information.months(a.year),this._monthControl.index=a.month,this._dateControl.dataSource=this._information.dates(a.year,a.month),this._dateControl.index=a.date}},_wireupEvents:function(){function a(){b._currentDate=b._information.getDate({year:b._yearControl.index,month:b._monthControl.index,date:b._dateControl.index},b._currentDate);var a=b._information.getIndex(b._currentDate);b._monthControl.dataSource=b._information.months(a.year),b._monthControl.index=a.month,b._dateControl.dataSource=b._information.dates(a.year,a.month),b._dateControl.index=a.date}var b=this;this._dateElement.addEventListener("change",a,!1),this._monthElement.addEventListener("change",a,!1),this._yearElement.addEventListener("change",a,!1)},yearPattern:{get:function(){return this._datePatterns.year},set:function(a){this._datePatterns.year!==a&&(this._datePatterns.year=a,this._init())}}},{_getInformationWinRT:function(a,b,c,d){function e(a){return new Date(Math.min(new Date(Math.max(j,a)),s))}d=d||{date:p,month:q,year:r};var f=n(c),g=n(c),h=n(c);f.setToMin();var j=f.getDateTime();f.setToMax();var s=f.getDateTime();f.hour=12,a=e(a),b=e(b),f.setDateTime(b);var t={year:f.year,era:f.era};f.setDateTime(a);var u=0;u=o(f,t)+1;var v=i("day month.full year",c).formatter,w=v.patterns[0],x=8207===w.charCodeAt(0),y=["date","month","year"],z={month:w.indexOf("{month"),date:w.indexOf("{day"),year:w.indexOf("{year")};y.sort(function(a,b){return z[a]<z[b]?-1:z[a]>z[b]?1:0});var A=function(){return{getLength:function(){return u},getValue:function(b){return f.setDateTime(a),f.addYears(b),k(d.year,c,r,d,y,f)}}}(),B=function(b){return g.setDateTime(a),g.addYears(b),{getLength:function(){return g.numberOfMonthsInThisYear},getValue:function(a){return g.month=g.firstMonthInThisYear,g.addMonths(a),l(d.month,c,q,g)}}},C=function(b,e){return h.setDateTime(a),h.addYears(b),h.month=h.firstMonthInThisYear,h.addMonths(e),h.day=h.firstDayInThisMonth,{getLength:function(){return h.numberOfDaysInThisMonth},getValue:function(a){return h.day=h.firstDayInThisMonth,h.addDays(a),m(d.date,c,p,h)}}};return{isRTL:x,forceLanguage:v.resolvedLanguage,order:y,getDate:function(b,c){var d;c&&(f.setDateTime(c),d={year:f.year,month:f.month,day:f.day});var e=f;e.setDateTime(a),e.addYears(b.year);var g;e.firstMonthInThisYear>e.lastMonthInThisYear?(g=b.month+e.firstMonthInThisYear>e.numberOfMonthsInThisYear?b.month+e.firstMonthInThisYear-e.numberOfMonthsInThisYear:b.month+e.firstMonthInThisYear,d&&d.year!==e.year&&(g=Math.max(Math.min(d.month,e.numberOfMonthsInThisYear),1))):g=d&&d.year!==e.year?Math.max(Math.min(d.month,e.firstMonthInThisYear+e.numberOfMonthsInThisYear-1),e.firstMonthInThisYear):Math.max(Math.min(b.month+e.firstMonthInThisYear,e.firstMonthInThisYear+e.numberOfMonthsInThisYear-1),e.firstMonthInThisYear),e.month=g;var h=Math.max(Math.min(b.date+e.firstDayInThisMonth,e.firstDayInThisMonth+e.numberOfDaysInThisMonth-1),e.firstDayInThisMonth);return!d||d.year===e.year&&d.month===e.month||(h=Math.max(Math.min(d.day,e.firstDayInThisMonth+e.numberOfDaysInThisMonth-1),e.firstDayInThisMonth)),e.day=e.firstDayInThisMonth,e.addDays(h-e.firstDayInThisMonth),e.getDateTime()},getIndex:function(b){var c=e(b);f.setDateTime(c);var d={year:f.year,era:f.era},g=0;f.setDateTime(a),f.month=1,g=o(f,d),f.setDateTime(c);var h=f.month-f.firstMonthInThisYear;0>h&&(h=f.month-f.firstMonthInThisYear+f.numberOfMonthsInThisYear);var i=f.day-f.firstDayInThisMonth,j={year:g,month:h,date:i};return j},years:A,months:B,dates:C}},_getInformationJS:function(a,b){var c=a.getFullYear(),d=b.getFullYear(),e={getLength:function(){return Math.max(0,d-c+1)},getValue:function(a){return c+a}},f=["January","February","March","April","May","June","July","August","September","October","November","December"],g=function(){return{getLength:function(){return f.length},getValue:function(a){return f[a]},getMonthNumber:function(a){return Math.min(a,f.length-1)}}},h=function(a,b){var c=new Date,d=e.getValue(a),f=b+1;c.setFullYear(d,f,0);var g=c.getDate();return{getLength:function(){return g},getValue:function(a){return""+(a+1)},getDateNumber:function(a){return Math.min(a+1,g)}}};return{order:["month","date","year"],getDate:function(a){return new Date(e.getValue(a.year),g(a.year).getMonthNumber(a.month),h(a.year,a.month).getDateNumber(a.date),12,0)},getIndex:function(a){var b=0,d=a.getFullYear();b=c>d?0:d>this.maxYear?e.getLength()-1:a.getFullYear()-c;var f=Math.min(a.getMonth(),g(b).getLength()),i=Math.min(a.getDate()-1,h(b,f).getLength());return{year:b,month:f,date:i}},years:e,months:g,dates:h}}});return b.Windows.Globalization.Calendar&&b.Windows.Globalization.DateTimeFormatting?u.getInformation=u._getInformationWinRT:u.getInformation=u._getInformationJS,c.Class.mix(u,e.createEventProperties("change")),c.Class.mix(u,g.DOMEventMixin),u})})}),d("WinJS/Controls/TimePicker",["../Core/_Global","../Core/_WinRT","../Core/_Base","../Core/_BaseUtils","../Core/_Events","../Core/_Resources","../Utilities/_Control","../Utilities/_ElementUtilities","../Utilities/_Hoverable","../Utilities/_Select","require-style!less/styles-datetimepicker"],function(a,b,c,d,e,f,g,h,i,j){"use strict";c.Namespace.define("WinJS.UI",{TimePicker:c.Namespace._lazy(function(){var d="{minute.integer(2)}",i="{hour.integer(1)}",k="{period.abbreviated(2)}",l={get ariaLabel(){return f._getWinJSString("ui/timePicker").value},get selectHour(){return f._getWinJSString("ui/selectHour").value},get selectMinute(){return f._getWinJSString("ui/selectMinute").value},get selectAMPM(){return f._getWinJSString("ui/selectAMPM").value}},m=function(a,b){return a.getHours()===b.getHours()&&a.getMinutes()===b.getMinutes()},n=c.Class.define(function(b,c){this._currentTime=n._sentinelDate(),b=b||a.document.createElement("div"),h.addClass(b,"win-disposable"),b.winControl=this;var d=b.getAttribute("aria-label");d||b.setAttribute("aria-label",l.ariaLabel),this._timePatterns={minute:null,hour:null,period:null},this._init(b),g.setOptions(this,c)},{_currentTime:null,_clock:null,_disabled:!1,_hourElement:null,_hourControl:null,_minuteElement:null,_minuteControl:null,_ampmElement:null,_ampmControl:null,_minuteIncrement:1,_timePatterns:{minute:null,hour:null,period:null},_information:null,_addAccessibilityAttributes:function(){this._domElement.setAttribute("role","group"),this._hourElement.setAttribute("aria-label",l.selectHour),this._minuteElement.setAttribute("aria-label",l.selectMinute),this._ampmElement&&this._ampmElement.setAttribute("aria-label",l.selectAMPM)},_addControlsInOrder:function(a){var b=this;a.order.forEach(function(a,c){switch(a){case"hour":b._domElement.appendChild(b._hourElement),h.addClass(b._hourElement,"win-order"+c);break;case"minute":b._domElement.appendChild(b._minuteElement),h.addClass(b._minuteElement,"win-order"+c);break;case"period":b._ampmElement&&(b._domElement.appendChild(b._ampmElement),h.addClass(b._ampmElement,"win-order"+c))}})},dispose:function(){},clock:{get:function(){return this._clock},set:function(a){this._clock!==a&&(this._clock=a,this._init())}},current:{get:function(){var a=this._currentTime;if(a){var b=n._sentinelDate();return b.setHours(a.getHours()),b.setMinutes(this._getMinutesIndex(a)*this.minuteIncrement),b.setSeconds(0),b.setMilliseconds(0),b}return a},set:function(a){var b;"string"==typeof a?(b=n._sentinelDate(),b.setTime(Date.parse(b.toDateString()+" "+a))):(b=n._sentinelDate(),b.setHours(a.getHours()),b.setMinutes(a.getMinutes()));var c=this._currentTime;m(c,b)||(this._currentTime=b,this._updateDisplay())}},disabled:{get:function(){return this._disabled},set:function(a){this._disabled!==a&&(this._disabled=a,this._hourControl&&(this._hourControl.setDisabled(a),this._minuteControl.setDisabled(a)),this._ampmControl&&this._ampmControl.setDisabled(a))}},element:{get:function(){return this._domElement}},_init:function(a){this._setElement(a),this._updateDisplay()},hourPattern:{get:function(){return this._timePatterns.hour.pattern},set:function(a){this._timePatterns.hour!==a&&(this._timePatterns.hour=a,this._init())}},_getHoursAmpm:function(a){var b=a.getHours();return this._ampmElement?0===b?{hours:12,ampm:0}:12>b?{hours:b,ampm:0}:{hours:b-12,ampm:1}:{hours:b}},_getHoursIndex:function(a){return this._ampmElement&&12===a?0:a},_getMinutesIndex:function(a){return parseInt(a.getMinutes()/this.minuteIncrement)},minuteIncrement:{get:function(){return Math.max(1,Math.abs(0|this._minuteIncrement)%60)},set:function(a){this._minuteIncrement!==a&&(this._minuteIncrement=a,this._init())}},minutePattern:{get:function(){return this._timePatterns.minute.pattern},set:function(a){this._timePatterns.minute!==a&&(this._timePatterns.minute=a,this._init())}},periodPattern:{get:function(){return this._timePatterns.period.pattern},set:function(a){this._timePatterns.period!==a&&(this._timePatterns.period=a,this._init())}},_setElement:function(b){if(this._domElement=this._domElement||b,this._domElement){var c=n.getInformation(this.clock,this.minuteIncrement,this._timePatterns);this._information=c,c.forceLanguage&&(this._domElement.setAttribute("lang",c.forceLanguage),this._domElement.setAttribute("dir",c.isRTL?"rtl":"ltr")),h.empty(this._domElement),h.addClass(this._domElement,"win-timepicker"),this._hourElement=a.document.createElement("select"),h.addClass(this._hourElement,"win-timepicker-hour win-dropdown"),this._minuteElement=a.document.createElement("select"),h.addClass(this._minuteElement,"win-timepicker-minute win-dropdown"),this._ampmElement=null,"12HourClock"===c.clock&&(this._ampmElement=a.document.createElement("select"),h.addClass(this._ampmElement,"win-timepicker-period win-dropdown")),this._addControlsInOrder(c);var d=this._getHoursAmpm(this.current);this._hourControl=new j._Select(this._hourElement,{dataSource:this._getInfoHours(),disabled:this.disabled,index:this._getHoursIndex(d.hours)}),this._minuteControl=new j._Select(this._minuteElement,{dataSource:c.minutes,disabled:this.disabled,index:this._getMinutesIndex(this.current)}),this._ampmControl=null,this._ampmElement&&(this._ampmControl=new j._Select(this._ampmElement,{dataSource:c.periods,disabled:this.disabled,index:d.ampm})),this._wireupEvents(),this._updateValues(),this._addAccessibilityAttributes()}},_getInfoHours:function(){return this._information.hours},_updateLayout:function(){this._domElement&&this._updateValues()},_updateValues:function(){if(this._hourControl){var a=this._getHoursAmpm(this.current);this._ampmControl&&(this._ampmControl.index=a.ampm),this._hourControl.index=this._getHoursIndex(a.hours),this._minuteControl.index=this._getMinutesIndex(this.current)}},_updateDisplay:function(){var a=this._getHoursAmpm(this.current);this._ampmControl&&(this._ampmControl.index=a.ampm),this._hourControl&&(this._hourControl.index=this._getHoursIndex(a.hours),this._minuteControl.index=this._getMinutesIndex(this.current))},_wireupEvents:function(){var a=this,b=function(){var b=a._hourControl.index;return a._ampmElement&&1===a._ampmControl.index&&12!==b&&(b+=12),b},c=function(){var c=b();a._currentTime.setHours(c),a._currentTime.setMinutes(a._minuteControl.index*a.minuteIncrement)};this._hourElement.addEventListener("change",c,!1),this._minuteElement.addEventListener("change",c,!1),this._ampmElement&&this._ampmElement.addEventListener("change",c,!1)}},{_sentinelDate:function(){var a=new Date;return new Date(2011,6,15,a.getHours(),a.getMinutes())},_getInformationWinRT:function(a,c,e){var f=function(c,d){var e=b.Windows.Globalization.DateTimeFormatting;c=c?c:d;var f=new e.DateTimeFormatter(c);return a&&(f=e.DateTimeFormatter(c,f.languages,f.geographicRegion,f.calendar,a)),f},g=b.Windows.Globalization,h=new g.Calendar;a&&(h=new g.Calendar(h.languages,h.getCalendarSystem(),a)),h.setDateTime(n._sentinelDate());var j=h.getClock(),l=24;l=h.numberOfHoursInThisPeriod;var m=function(){var a=f(e.period,k);return{getLength:function(){return 2},getValue:function(b){var c=n._sentinelDate();if(0===b){c.setHours(1);var d=a.format(c);return d}if(1===b){c.setHours(13);var e=a.format(c);return e}return null}}}(),o=function(){var a=f(e.minute,d),b=n._sentinelDate();return{getLength:function(){return 60/c},getValue:function(d){var e=d*c;return b.setMinutes(e),a.format(b)}}}(),p=function(){var a=f(e.hour,i),b=n._sentinelDate();return{getLength:function(){return l},getValue:function(c){return b.setHours(c),a.format(b)}}}(),q=f("hour minute"),r=q.patterns[0],s=["hour","minute"],t={period:r.indexOf("{period"),hour:r.indexOf("{hour"),minute:r.indexOf("{minute")};t.period>-1&&s.push("period");var u=b.Windows.Globalization.DateTimeFormatting.DateTimeFormatter,v=new u("month.full",b.Windows.Globalization.ApplicationLanguages.languages,"ZZ","GregorianCalendar","24HourClock"),w=v.patterns[0],x=8207===w.charCodeAt(0);if(x){var y=t.hour;t.hour=t.minute,t.minute=y}return s.sort(function(a,b){return t[a]<t[b]?-1:t[a]>t[b]?1:0}),{minutes:o,hours:p,clock:j,periods:m,order:s,forceLanguage:q.resolvedLanguage,isRTL:x}},_getInformationJS:function(a,b){var c=[12,1,2,3,4,5,6,7,8,9,10,11],d={};d.getLength=function(){return 60/b},d.getValue=function(a){var c=a*b;return 10>c?"0"+c.toString():c.toString()};var e=["hour","minute","period"];return"24HourClock"===a&&(c=["00","01","02","03","04","05","06","07","08","09",10,11,12,13,14,15,16,17,18,19,20,21,22,23],e=["hour","minute"]),{minutes:d,hours:c,clock:a||"12HourClock",periods:["AM","PM"],order:e}}});return b.Windows.Globalization.DateTimeFormatting&&b.Windows.Globalization.Calendar&&b.Windows.Globalization.ApplicationLanguages?n.getInformation=n._getInformationWinRT:n.getInformation=n._getInformationJS,c.Class.mix(n,e.createEventProperties("change")),c.Class.mix(n,g.DOMEventMixin),n})})}),d("require-style!less/styles-backbutton",[],function(){}),d("require-style!less/colors-backbutton",[],function(){}),d("WinJS/Controls/BackButton",["exports","../Core/_Global","../Core/_Base","../Core/_ErrorFromName","../Core/_Resources","../Navigation","../Utilities/_Control","../Utilities/_ElementUtilities","../Utilities/_Hoverable","require-style!less/styles-backbutton","require-style!less/colors-backbutton"],function(a,b,c,d,e,f,g,h,i){"use strict";var j=h.Key,k="win-navigation-backbutton",l="win-back",m=3,n=function(){function a(){b.addEventListener("keyup",d,!1),h._addEventListener(b,"pointerup",e,!1)}function c(){b.removeEventListener("keyup",d,!1),h._removeEventListener(b,"pointerup",e,!1)}function d(a){(a.keyCode===j.leftArrow&&a.altKey&&!a.shiftKey&&!a.ctrlKey||a.keyCode===j.browserBack)&&(f.back(),a.preventDefault())}function e(a){a.button===m&&f.back()}var g=0;return{addRef:function(){0===g&&a(),g++},release:function(){g>0&&(g--,0===g&&c())},getCount:function(){return g}}}();c.Namespace._moduleDefine(a,"WinJS.UI",{BackButton:c.Namespace._lazy(function(){var a={get ariaLabel(){return e._getWinJSString("ui/backbuttonarialabel").value},get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get badButtonElement(){return"Invalid argument: For a button, toggle, or flyout command, the element must be null or a button element"}},i=c.Class.define(function(c,e){if(c&&c.winControl)throw new d("WinJS.UI.BackButton.DuplicateConstruction",a.duplicateConstruction);this._element=c||b.document.createElement("button"),e=e||{},this._initializeButton(),this._disposed=!1,this._element.winControl=this,g.setOptions(this,e),this._buttonClickHandler=this._handleBackButtonClick.bind(this),this._element.addEventListener("click",this._buttonClickHandler,!1),this._navigatedHandler=this._handleNavigatedEvent.bind(this),f.addEventListener("navigated",this._navigatedHandler,!1),n.addRef()},{element:{get:function(){return this._element}},dispose:function(){this._disposed||(this._disposed=!0,f.removeEventListener("navigated",this._navigatedHandler,!1),n.release())},refresh:function(){f.canGoBack?this._element.disabled=!1:this._element.disabled=!0},_initializeButton:function(){if("BUTTON"!==this._element.tagName)throw new d("WinJS.UI.BackButton.BadButtonElement",a.badButtonElement);h.addClass(this._element,k),h.addClass(this._element,"win-disposable"),this._element.innerHTML='<span class="'+l+'"></span>',this.refresh(),this._element.setAttribute("aria-label",a.ariaLabel),this._element.setAttribute("title",a.ariaLabel),this._element.setAttribute("type","button")},_handleNavigatedEvent:function(){this.refresh()},_handleBackButtonClick:function(){f.back()}});return i._getReferenceCount=function(){return n.getCount()},c.Class.mix(i,g.DOMEventMixin),i})})}),d("require-style!less/styles-tooltip",[],function(){}),d("require-style!less/colors-tooltip",[],function(){}),d("WinJS/Controls/Tooltip",["exports","../Core/_Global","../Core/_WinRT","../Core/_Base","../Core/_BaseUtils","../Core/_Events","../Animations","../Animations/_TransitionAnimation","../Utilities/_Control","../Utilities/_Dispose","../Utilities/_ElementUtilities","../Utilities/_Hoverable","require-style!less/styles-tooltip","require-style!less/colors-tooltip"],function(a,b,c,d,e,f,g,h,i,j,k,l){"use strict";d.Namespace._moduleDefine(a,"WinJS.UI",{Tooltip:d.Namespace._lazy(function(){function a(a,b){return"pointerdown"===a?b===G:a in H}function l(a,b){return"pointerdown"===a?b!==G:a in J}var m=0,n=k.Key,o="top",p=h._animationTimeAdjustment(400),q=h._animationTimeAdjustment(1200),r=h._animationTimeAdjustment(400),s=h._animationTimeAdjustment(5e3),t=h._animationTimeAdjustment(0),u=h._animationTimeAdjustment(600),v=h._animationTimeAdjustment(400),w=h._animationTimeAdjustment(600),x=h._animationTimeAdjustment(200),y=h._animationTimeAdjustment(3e5),z=12,A=20,B=45,C=20,D=12,E=1,F=k._MSPointerEvent.MSPOINTER_TYPE_MOUSE||"mouse",G=k._MSPointerEvent.MSPOINTER_TYPE_TOUCH||"touch",H={keyup:"",pointerover:"",pointerdown:""},I={pointermove:""},J={pointerdown:"",keydown:"",focusout:"",pointerout:"",pointercancel:"",pointerup:""},K={pointerover:"",pointerout:""},L="win-tooltip",M="win-tooltip-phantom",N=r,O=2*N,P=2.5*N,Q=s,R=!1,S=!1,T=f._createEventProperty;return d.Class.define(function(a,d){a=a||b.document.createElement("div");var e=k.data(a).tooltip;if(e)return e;if(!S&&c.Windows.UI.ViewManagement.UISettings){var f=new c.Windows.UI.ViewManagement.UISettings;N=h._animationTimeAdjustment(f.mouseHoverTime),O=2*N,P=2.5*N,Q=h._animationTimeAdjustment(1e3*f.messageDuration);var g=f.handPreference;R=g===c.Windows.UI.ViewManagement.HandPreference.leftHanded}S=!0,this._disposed=!1,this._placement=o,this._infotip=!1,this._innerHTML=null,this._contentElement=null,this._extraClass=null,this._lastContentType="html",this._anchorElement=a,this._domElement=null,this._phantomDiv=null,this._triggerByOpen=!1,this._eventListenerRemoveStack=[],this._lastKeyOrBlurEvent=null,this._currentKeyOrBlurEvent=null,a.winControl=this,k.addClass(a,"win-disposable"),a.title&&(this._innerHTML=this._anchorElement.title,this._anchorElement.removeAttribute("title")),i.setOptions(this,d),this._events(),k.data(a).tooltip=this},{innerHTML:{get:function(){return this._innerHTML},set:function(a){if(this._innerHTML=a,this._domElement){if(!this._innerHTML||""===this._innerHTML)return void this._onDismiss();this._domElement.innerHTML=a,this._position()}this._lastContentType="html"}},element:{get:function(){return this._anchorElement}},contentElement:{get:function(){return this._contentElement},set:function(a){if(this._contentElement=a,this._domElement){if(!this._contentElement)return void this._onDismiss();this._domElement.innerHTML="",this._domElement.appendChild(this._contentElement),this._position()}this._lastContentType="element"}},placement:{get:function(){return this._placement},set:function(a){"top"!==a&&"bottom"!==a&&"left"!==a&&"right"!==a&&(a=o),this._placement=a,this._domElement&&this._position()}},infotip:{get:function(){return this._infotip},set:function(a){this._infotip=!!a}},extraClass:{get:function(){return this._extraClass},set:function(a){this._extraClass=a}},onbeforeopen:T("beforeopen"),onopened:T("opened"),onbeforeclose:T("beforeclose"),onclosed:T("closed"),dispose:function(){if(!this._disposed){
-this._disposed=!0,j.disposeSubTree(this.element);for(var a=0,b=this._eventListenerRemoveStack.length;b>a;a++)this._eventListenerRemoveStack[a]();this._onDismiss();var c=k.data(this._anchorElement);c&&delete c.tooltip}},addEventListener:function(a,b,c){if(this._anchorElement){this._anchorElement.addEventListener(a,b,c);var d=this;this._eventListenerRemoveStack.push(function(){d._anchorElement.removeEventListener(a,b,c)})}},removeEventListener:function(a,b,c){this._anchorElement&&this._anchorElement.removeEventListener(a,b,c)},open:function(a){switch(this._triggerByOpen=!0,"touch"!==a&&"mouseover"!==a&&"mousedown"!==a&&"keyboard"!==a&&(a="default"),a){case"touch":this._onInvoke("touch","never");break;case"mouseover":this._onInvoke("mouse","auto");break;case"keyboard":this._onInvoke("keyboard","auto");break;case"mousedown":case"default":this._onInvoke("nodelay","never")}},close:function(){this._onDismiss()},_cleanUpDOM:function(){this._domElement&&(j.disposeSubTree(this._domElement),b.document.body.removeChild(this._domElement),this._domElement=null,b.document.body.removeChild(this._phantomDiv),this._phantomDiv=null)},_createTooltipDOM:function(){this._cleanUpDOM(),this._domElement=b.document.createElement("div");var a=k._uniqueID(this._domElement);this._domElement.setAttribute("id",a);var c=k._getComputedStyle(this._anchorElement,null),d=this._domElement.style;d.direction=c.direction,d.writingMode=c["writing-mode"],this._domElement.setAttribute("tabindex",-1),this._domElement.setAttribute("role","tooltip"),this._anchorElement.setAttribute("aria-describedby",a),"element"===this._lastContentType?this._domElement.appendChild(this._contentElement):this._domElement.innerHTML=this._innerHTML,b.document.body.appendChild(this._domElement),k.addClass(this._domElement,L),this._extraClass&&k.addClass(this._domElement,this._extraClass),this._phantomDiv=b.document.createElement("div"),this._phantomDiv.setAttribute("tabindex",-1),b.document.body.appendChild(this._phantomDiv),k.addClass(this._phantomDiv,M);var e=k._getComputedStyle(this._domElement,null).zIndex+1;this._phantomDiv.style.zIndex=e},_raiseEvent:function(a,c){if(this._anchorElement){var d=b.document.createEvent("CustomEvent");d.initCustomEvent(a,!1,!1,c),this._anchorElement.dispatchEvent(d)}},_captureLastKeyBlurOrPointerOverEvent:function(a){switch(this._lastKeyOrBlurEvent=this._currentKeyOrBlurEvent,a.type){case"keyup":a.keyCode===n.shift?this._currentKeyOrBlurEvent=null:this._currentKeyOrBlurEvent="keyboard";break;case"focusout":this._currentKeyOrBlurEvent=null}},_registerEventToListener:function(a,b){var c=this,d=function(a){c._captureLastKeyBlurOrPointerOverEvent(a),c._handleEvent(a)};k._addEventListener(a,b,d,!1),this._eventListenerRemoveStack.push(function(){k._removeEventListener(a,b,d,!1)})},_events:function(){for(var a in H)this._registerEventToListener(this._anchorElement,a);for(var a in I)this._registerEventToListener(this._anchorElement,a);for(a in J)this._registerEventToListener(this._anchorElement,a);this._registerEventToListener(this._anchorElement,"contextmenu"),this._registerEventToListener(this._anchorElement,"MSHoldVisual")},_handleEvent:function(b){var c=b._normalizedType||b.type;if(!this._triggerByOpen){if(c in K&&k.eventWithinElement(this._anchorElement,b))return;if(a(c,b.pointerType))if(b.pointerType===G)this._isShown||(this._showTrigger="touch"),this._onInvoke("touch","never",b);else{if(this._skipMouseOver&&b.pointerType===F&&"pointerover"===c)return void(this._skipMouseOver=!1);var d="key"===c.substring(0,3)?"keyboard":"mouse";this._isShown||(this._showTrigger=d),this._onInvoke(d,"auto",b)}else if(c in I)this._contactPoint={x:b.clientX,y:b.clientY};else if(l(c,b.pointerType)){var f;if(b.pointerType===G){if("pointerup"===c){this._skipMouseOver=!0;var g=this;e._yieldForEvents(function(){g._skipMouseOver=!1})}f="touch"}else f="key"===c.substring(0,3)?"keyboard":"mouse";if("focusout"!==c&&f!==this._showTrigger)return;this._onDismiss()}else"contextmenu"!==c&&"MSHoldVisual"!==c||b.preventDefault()}},_onShowAnimationEnd:function(){if(!this._shouldDismiss&&!this._disposed&&(this._raiseEvent("opened"),this._domElement&&"never"!==this._hideDelay)){var a=this,b=this._infotip?Math.min(3*Q,y):Q;this._hideDelayTimer=this._setTimeout(function(){a._onDismiss()},b)}},_onHideAnimationEnd:function(){b.document.body.removeEventListener("DOMNodeRemoved",this._removeTooltip,!1),this._cleanUpDOM(),this._anchorElement&&this._anchorElement.removeAttribute("aria-describedby"),m=(new Date).getTime(),this._triggerByOpen=!1,this._disposed||this._raiseEvent("closed")},_decideOnDelay:function(a){var b;if(this._useAnimation=!0,"nodelay"===a)b=0,this._useAnimation=!1;else{var c=(new Date).getTime();x>=c-m?(b="touch"===a?this._infotip?v:t:this._infotip?w:u,this._useAnimation=!1):b="touch"===a?this._infotip?q:p:this._infotip?P:O}return b},_getAnchorPositionFromElementWindowCoord:function(){var a=this._anchorElement.getBoundingClientRect();return{x:a.left,y:a.top,width:a.width,height:a.height}},_getAnchorPositionFromPointerWindowCoord:function(a){return{x:a.x,y:a.y,width:1,height:1}},_canPositionOnSide:function(a,b,c,d){var e=0,f=0;switch(a){case"top":e=d.width+this._offset,f=c.y;break;case"bottom":e=d.width+this._offset,f=b.height-c.y-c.height;break;case"left":e=c.x,f=d.height+this._offset;break;case"right":e=b.width-c.x-c.width,f=d.height+this._offset}return e>=d.width+this._offset&&f>=d.height+this._offset},_positionOnSide:function(a,b,c,d){var e=0,f=0;switch(a){case"top":case"bottom":e=c.x+c.width/2-d.width/2,e=Math.min(Math.max(e,0),b.width-d.width-E),f="top"===a?c.y-d.height-this._offset:c.y+c.height+this._offset;break;case"left":case"right":f=c.y+c.height/2-d.height/2,f=Math.min(Math.max(f,0),b.height-d.height-E),e="left"===a?c.x-d.width-this._offset:c.x+c.width+this._offset}this._domElement.style.left=e+"px",this._domElement.style.top=f+"px",this._phantomDiv.style.left=e+"px",this._phantomDiv.style.top=f+"px",this._phantomDiv.style.width=d.width+"px",this._phantomDiv.style.height=d.height+"px"},_position:function(a){var c={width:0,height:0},d={x:0,y:0,width:0,height:0},e={width:0,height:0};c.width=b.document.documentElement.clientWidth,c.height=b.document.documentElement.clientHeight,"tb-rl"===k._getComputedStyle(b.document.body,null)["writing-mode"]&&(c.width=b.document.documentElement.clientHeight,c.height=b.document.documentElement.clientWidth),d=!this._contactPoint||"touch"!==a&&"mouse"!==a?this._getAnchorPositionFromElementWindowCoord():this._getAnchorPositionFromPointerWindowCoord(this._contactPoint),e.width=this._domElement.offsetWidth,e.height=this._domElement.offsetHeight;var f={top:["top","bottom","left","right"],bottom:["bottom","top","left","right"],left:["left","right","top","bottom"],right:["right","left","top","bottom"]};R&&(f.top[2]="right",f.top[3]="left",f.bottom[2]="right",f.bottom[3]="left");for(var g=f[this._placement],h=g.length,i=0;h>i;i++)if(i===h-1||this._canPositionOnSide(g[i],c,d,e)){this._positionOnSide(g[i],c,d,e);break}return g[i]},_showTooltip:function(a){if(!this._shouldDismiss&&(this._isShown=!0,this._raiseEvent("beforeopen"),b.document.body.contains(this._anchorElement)&&!this._shouldDismiss)){if("element"===this._lastContentType){if(!this._contentElement)return void(this._isShown=!1)}else if(!this._innerHTML||""===this._innerHTML)return void(this._isShown=!1);var c=this;this._removeTooltip=function(a){for(var d=c._anchorElement;d;){if(a.target===d){b.document.body.removeEventListener("DOMNodeRemoved",c._removeTooltip,!1),c._cleanUpDOM();break}d=d.parentNode}},b.document.body.addEventListener("DOMNodeRemoved",this._removeTooltip,!1),this._createTooltipDOM(),this._position(a),this._useAnimation?g.fadeIn(this._domElement).then(this._onShowAnimationEnd.bind(this)):this._onShowAnimationEnd()}},_onInvoke:function(a,b,c){if(this._shouldDismiss=!1,!this._isShown&&(!c||"keyup"!==c.type||"keyboard"!==this._lastKeyOrBlurEvent&&(this._lastKeyOrBlurEvent||c.keyCode===n.tab))){this._hideDelay=b,this._contactPoint=null,c?(this._contactPoint={x:c.clientX,y:c.clientY},"touch"===a?this._offset=B:"keyboard"===a?this._offset=z:this._offset=A):"touch"===a?this._offset=C:this._offset=D,this._clearTimeout(this._delayTimer),this._clearTimeout(this._hideDelayTimer);var d=this._decideOnDelay(a);if(d>0){var e=this;this._delayTimer=this._setTimeout(function(){e._showTooltip(a)},d)}else this._showTooltip(a)}},_onDismiss:function(){this._shouldDismiss=!0,this._isShown&&(this._isShown=!1,this._showTrigger="mouse",this._domElement?(this._raiseEvent("beforeclose"),this._useAnimation?g.fadeOut(this._domElement).then(this._onHideAnimationEnd.bind(this)):this._onHideAnimationEnd()):(this._raiseEvent("beforeclose"),this._raiseEvent("closed")))},_setTimeout:function(a,c){return b.setTimeout(a,c)},_clearTimeout:function(a){b.clearTimeout(a)}},{_DELAY_INITIAL_TOUCH_SHORT:{get:function(){return p}},_DELAY_INITIAL_TOUCH_LONG:{get:function(){return q}},_DEFAULT_MOUSE_HOVER_TIME:{get:function(){return r}},_DEFAULT_MESSAGE_DURATION:{get:function(){return s}},_DELAY_RESHOW_NONINFOTIP_TOUCH:{get:function(){return t}},_DELAY_RESHOW_NONINFOTIP_NONTOUCH:{get:function(){return u}},_DELAY_RESHOW_INFOTIP_TOUCH:{get:function(){return v}},_DELAY_RESHOW_INFOTIP_NONTOUCH:{get:function(){return w}},_RESHOW_THRESHOLD:{get:function(){return x}},_HIDE_DELAY_MAX:{get:function(){return y}}})})})}),d("require-style!less/styles-rating",[],function(){}),d("require-style!less/colors-rating",[],function(){}),d("WinJS/Controls/Rating",["../Core/_Global","../Core/_Base","../Core/_ErrorFromName","../Core/_Events","../Core/_Resources","../_Accents","../Utilities/_Control","../Utilities/_ElementUtilities","../Utilities/_Hoverable","../Utilities/_SafeHtml","./Tooltip","require-style!less/styles-rating","require-style!less/colors-rating"],function(a,b,c,d,e,f,g,h,i,j,k){"use strict";f.createAccentRule(".win-rating .win-star.win-user.win-full, .win-rating .win-star.win-user.win-full.win-disabled",[{name:"color",value:f.ColorTypes.accent}]),b.Namespace.define("WinJS.UI",{Rating:b.Namespace._lazy(function(){var f=d._createEventProperty,i={get averageRating(){return e._getWinJSString("ui/averageRating").value},get clearYourRating(){return e._getWinJSString("ui/clearYourRating").value},get tentativeRating(){return e._getWinJSString("ui/tentativeRating").value},get tooltipStringsIsInvalid(){return"Invalid argument: tooltipStrings must be null or an array of strings."},get unrated(){return e._getWinJSString("ui/unrated").value},get userRating(){return e._getWinJSString("ui/userRating").value}},l=5,m=!1,n="cancel",o="change",p="previewchange",q=0,r=h._MSPointerEvent.MSPOINTER_TYPE_TOUCH||"touch",s=h._MSPointerEvent.MSPOINTER_TYPE_PEN||"pen",t=h._MSPointerEvent.MSPOINTER_TYPE_MOUSE||"mouse",u="padding-left: 0px; padding-right: 0px; border-left: 0px; border-right: 0px; -ms-flex: none; -webkit-flex: none; flex: none; display: none",v="win-rating",w="win-star win-empty",x="win-star win-average win-empty",y="win-star win-average win-full",z="win-star win-user win-empty",A="win-star win-user win-full",B="win-star win-tentative win-empty",C="win-star win-tentative win-full",D="win-disabled",E="win-average",F="win-user";return b.Class.define(function(b,c){this._disposed=!1,b=b||a.document.createElement("div"),c=c||{},this._element=b,h.addClass(this._element,"win-disposable"),this._userRating=0,this._averageRating=0,this._disabled=m,this._enableClear=!0,this._tooltipStrings=[],this._controlUpdateNeeded=!1,this._setControlSize(c.maxRating),c.tooltipStrings||this._updateTooltips(null),g.setOptions(this,c),this._controlUpdateNeeded=!0,this._forceLayout(),h._addInsertedNotifier(this._element),b.winControl=this,this._events()},{maxRating:{get:function(){return this._maxRating},set:function(a){this._setControlSize(a),this._forceLayout()}},userRating:{get:function(){return this._userRating},set:function(a){this._userRating=Math.max(0,Math.min(Number(a)>>0,this._maxRating)),this._updateControl()}},averageRating:{get:function(){return this._averageRating},set:function(a){this._averageRating=Number(a)<1?0:Math.min(Number(a)||0,this._maxRating),this._averageRatingElement&&this._ensureAverageMSStarRating(),this._updateControl()}},disabled:{get:function(){return this._disabled},set:function(a){this._disabled=!!a,this._disabled&&this._clearTooltips(),this._updateTabIndex(),this._updateControl()}},enableClear:{get:function(){return this._enableClear},set:function(a){this._enableClear=!!a,this._setAriaValueMin(),this._updateControl()}},tooltipStrings:{get:function(){return this._tooltipStrings},set:function(a){if("object"!=typeof a)throw new c("WinJS.UI.Rating.TooltipStringsIsInvalid",i.tooltipStringsIsInvalid);this._updateTooltips(a),this._updateAccessibilityRestState()}},element:{get:function(){return this._element}},oncancel:f(n),onchange:f(o),onpreviewchange:f(p),dispose:function(){if(!this._disposed){this._disposed=!0;for(var a=0;a<this._toolTips.length;a++)this._toolTips[a].dispose();this._toolTips=null}},addEventListener:function(a,b,c){this._element.addEventListener(a,b,c)},removeEventListener:function(a,b,c){return this._element.removeEventListener(a,b,c)},_forceLayout:function(){if(this._controlUpdateNeeded){var a=!1;this._updateControl=function(){a=!0},this.userRating=this._userRating,this.averageRating=this._averageRating,this._lastEventWasChange=!1,this._lastEventWasCancel=!1,this._tentativeRating=-1,this._captured=!1,this._pointerDownFocus=!1,this._elements=[],this._toolTips=[],this._clearElement=null,this._averageRatingElement=null,this._elementWidth=null,this._elementPadding=null,this._elementBorder=null,this._floatingValue=0,this._createControl(),this._setAccessibilityProperties(),delete this._updateControl,a&&this._updateControl()}},_hideAverageRating:function(){this._averageRatingHidden||(this._averageRatingHidden=!0,this._averageRatingElement.style.cssText=u)},_createControl:function(){h.addClass(this._element,v);var a="";this._averageRatingHidden=!0;for(var b=0;b<=this._maxRating;b++)a=b===this._maxRating?a+"<div class='"+y+"' style='"+u+"'></div>":a+"<div class='"+z+"'></div>";j.setInnerHTMLUnsafe(this._element,a);for(var c=this._element.firstElementChild,b=0;c;)this._elements[b]=c,b<this._maxRating&&(h.data(c).msStarRating=b+1),c=c.nextElementSibling,b++;this._averageRatingElement=this._elements[this._maxRating],this._ensureAverageMSStarRating(),this._updateTabIndex()},_setAriaValueMin:function(){this._element.setAttribute("aria-valuemin",this._enableClear?0:1)},_setAccessibilityProperties:function(){this._element.setAttribute("role","slider"),this._element.setAttribute("aria-valuemax",this._maxRating),this._setAriaValueMin(),this._updateAccessibilityRestState()},_getText:function(b){var c=this._tooltipStrings[b];if(c){var d=a.document.createElement("div");return d.innerHTML=c,d.textContent}return b===this._maxRating?i.clearYourRating:b+1},_updateAccessibilityRestState:function(){var a=this._element;this._ariaValueNowMutationObserver&&this._ariaValueNowMutationObserver.disconnect(),a.setAttribute("aria-readOnly",this._disabled),0!==this._userRating?(a.setAttribute("aria-valuenow",this._userRating),a.setAttribute("aria-label",i.userRating),a.setAttribute("aria-valuetext",this._getText(this._userRating-1))):0!==this._averageRating?(a.setAttribute("aria-valuenow",this._averageRating),a.setAttribute("aria-label",i.averageRating),a.setAttribute("aria-valuetext",this._averageRating)):(a.setAttribute("aria-valuenow",i.unrated),a.setAttribute("aria-label",i.userRating),a.setAttribute("aria-valuetext",i.unrated)),this._ariaValueNowMutationObserver&&this._ariaValueNowMutationObserver.observe(this._element,{attributes:!0,attributeFilter:["aria-valuenow"]})},_updateAccessibilityHoverState:function(){var a=this._element;this._ariaValueNowMutationObserver&&this._ariaValueNowMutationObserver.disconnect(),a.setAttribute("aria-readOnly",this._disabled),this._tentativeRating>0?(a.setAttribute("aria-label",i.tentativeRating),a.setAttribute("aria-valuenow",this._tentativeRating),a.setAttribute("aria-valuetext",this._getText(this._tentativeRating-1))):0===this._tentativeRating?(a.setAttribute("aria-valuenow",i.unrated),a.setAttribute("aria-label",i.tentativeRating),a.setAttribute("aria-valuetext",this._getText(this._maxRating))):(a.setAttribute("aria-valuenow",i.unrated),a.setAttribute("aria-label",i.tentativeRating),a.setAttribute("aria-valuetext",i.unrated)),this._ariaValueNowMutationObserver&&this._ariaValueNowMutationObserver.observe(this._element,{attributes:!0,attributeFilter:["aria-valuenow"]})},_ensureTooltips:function(){if(!this.disabled&&0===this._toolTips.length)for(var a=0;a<this._maxRating;a++)this._toolTips[a]=new k.Tooltip(this._elements[a])},_decrementRating:function(){this._closeTooltip();var a=!0;this._tentativeRating<=0?a=!1:(this._tentativeRating>0?this._tentativeRating--:-1===this._tentativeRating&&(0!==this._userRating&&this._userRating>0?this._tentativeRating=this._userRating-1:this._tentativeRating=0),0!==this._tentativeRating||this._enableClear||(this._tentativeRating=1,a=!1)),this._showTentativeRating(a,"keyboard")},_events:function(){function a(a){return{name:a,lowerCaseName:a.toLowerCase(),handler:function(b){var d=c["_on"+a];d&&d.apply(c,[b])}}}var b,c=this,d=[a("KeyDown"),a("FocusOut"),a("FocusIn"),a("PointerCancel"),a("PointerDown"),a("PointerMove"),a("PointerOver"),a("PointerUp"),a("PointerOut")],e=[a("WinJSNodeInserted")];for(b=0;b<d.length;++b)h._addEventListener(this._element,d[b].lowerCaseName,d[b].handler,!1);for(b=0;b<e.length;++b)this._element.addEventListener(e[b].name,e[b].handler,!1);this._ariaValueNowMutationObserver=new h._MutationObserver(this._ariaValueNowChanged.bind(this)),this._ariaValueNowMutationObserver.observe(this._element,{attributes:!0,attributeFilter:["aria-valuenow"]})},_onWinJSNodeInserted:function(){this._recalculateStarProperties(),this._updateControl()},_recalculateStarProperties:function(){var a=0;1===this._averageRating&&(a=1);var b=h._getComputedStyle(this._elements[a]);this._elementWidth=b.width,"rtl"===h._getComputedStyle(this._element).direction?(this._elementPadding=b.paddingRight,this._elementBorder=b.borderRight):(this._elementPadding=b.paddingLeft,this._elementBorder=b.borderLeft)},_hideAverageStar:function(){0!==this._averageRating&&this._resetAverageStar(!1)},_incrementRating:function(){this._closeTooltip();var a=!0;(this._tentativeRating<0||this._tentativeRating>=this._maxRating)&&(a=!1),-1!==this._tentativeRating?this._tentativeRating<this._maxRating&&this._tentativeRating++:0!==this._userRating?this._userRating<this._maxRating?this._tentativeRating=this._userRating+1:this._tentativeRating=this._maxRating:this._tentativeRating=1,this._showTentativeRating(a,"keyboard")},_ariaValueNowChanged:function(){if(!this._disabled){var a=this._element.getAttributeNode("aria-valuenow");if(null!==a){var b=Number(a.nodeValue);this.userRating!==b&&(this.userRating=b,this._tentativeRating=this._userRating,this._raiseEvent(o,this._userRating))}}},_onPointerCancel:function(){this._showCurrentRating(),this._lastEventWasChange||this._raiseEvent(n,null),this._captured=!1},_onPointerDown:function(a){a.pointerType===t&&a.button!==q||this._captured||(this._pointerDownAt={x:a.clientX,y:a.clientY},this._pointerDownFocus=!0,this._disabled||(h._setPointerCapture(this._element,a.pointerId),this._captured=!0,a.pointerType===r?(this._tentativeRating=h.data(a.target).msStarRating||0,this._setStarClasses(C,this._tentativeRating,B),this._hideAverageStar(),this._updateAccessibilityHoverState(),this._openTooltip("touch"),this._raiseEvent(p,this._tentativeRating)):this._openTooltip("mousedown")))},_onCapturedPointerMove:function(a,b){var c,d=this._pointerDownAt||{x:a.clientX,y:a.clientY},e=h._elementsFromPoint(a.clientX,d.y);if(e)for(var f=0,g=e.length;g>f;f++){var i=e[f];if("tooltip"===i.getAttribute("role"))return;if(h.hasClass(i,"win-star")){c=i;break}}var j;if(c&&c.parentElement===this._element)j=h.data(c).msStarRating||0;else{var k=0,l=this.maxRating;"rtl"===h._getComputedStyle(this._element).direction&&(k=l,l=0),j=a.clientX<d.x?k:l}var m=!1,n=Math.min(Math.ceil(j),this._maxRating);0!==n||this._enableClear||(n=1),n!==this._tentativeRating&&(this._closeTooltip(),m=!0),this._tentativeRating=n,this._showTentativeRating(m,b),a.preventDefault()},_onPointerMove:function(a){this._captured&&(a.pointerType===r?this._onCapturedPointerMove(a,"touch"):this._onCapturedPointerMove(a,"mousedown"))},_onPointerOver:function(a){this._disabled||a.pointerType!==s&&a.pointerType!==t||this._onCapturedPointerMove(a,"mouseover")},_onPointerUp:function(a){this._captured&&(h._releasePointerCapture(this._element,a.pointerId),this._captured=!1,this._onUserRatingChanged()),this._pointerDownAt=null},_onFocusOut:function(){this._captured||(this._onUserRatingChanged(),this._lastEventWasChange||this._lastEventWasCancel||this._raiseEvent(n,null))},_onFocusIn:function(){if(!this._pointerDownFocus){if(!this._disabled){if(0===this._userRating)for(var a=0;a<this._maxRating;a++)this._elements[a].className=B;this._hideAverageStar()}0!==this._userRating?this._raiseEvent(p,this._userRating):this._raiseEvent(p,0),this._tentativeRating=this._userRating}this._pointerDownFocus=!1},_onKeyDown:function(a){var b=h.Key,c=a.keyCode,d=h._getComputedStyle(this._element).direction,e=!0;switch(c){case b.enter:this._onUserRatingChanged();break;case b.tab:this._onUserRatingChanged(),e=!1;break;case b.escape:this._showCurrentRating(),this._lastEventWasChange||this._raiseEvent(n,null);break;case b.leftArrow:"rtl"===d&&this._tentativeRating<this.maxRating?this._incrementRating():"rtl"!==d&&this._tentativeRating>0?this._decrementRating():e=!1;break;case b.upArrow:this._tentativeRating<this.maxRating?this._incrementRating():e=!1;break;case b.rightArrow:"rtl"===d&&this._tentativeRating>0?this._decrementRating():"rtl"!==d&&this._tentativeRating<this.maxRating?this._incrementRating():e=!1;break;case b.downArrow:this._tentativeRating>0?this._decrementRating():e=!1;break;default:var f=0;if(c>=b.num0&&c<=b.num9?f=b.num0:c>=b.numPad0&&c<=b.numPad9&&(f=b.numPad0),f>0){var g=!1,i=Math.min(c-f,this._maxRating);0!==i||this._enableClear||(i=1),i!==this._tentativeRating&&(this._closeTooltip(),g=!0),this._tentativeRating=i,this._showTentativeRating(g,"keyboard")}else e=!1}e&&(a.stopPropagation(),a.preventDefault())},_onPointerOut:function(a){this._captured||h.eventWithinElement(this._element,a)||(this._showCurrentRating(),this._lastEventWasChange||this._raiseEvent(n,null))},_onUserRatingChanged:function(){this._disabled||(this._closeTooltip(),this._userRating===this._tentativeRating||this._lastEventWasCancel||this._lastEventWasChange?this._updateControl():(this.userRating=this._tentativeRating,this._raiseEvent(o,this._userRating)))},_raiseEvent:function(b,c){if(!this._disabled&&(this._lastEventWasChange=b===o,this._lastEventWasCancel=b===n,a.document.createEvent)){var d=a.document.createEvent("CustomEvent");d.initCustomEvent(b,!1,!1,{tentativeRating:c}),this._element.dispatchEvent(d)}},_resetNextElement:function(a){if(null!==this._averageRatingElement.nextSibling){h._setFlexStyle(this._averageRatingElement.nextSibling,{grow:1,shrink:1});var b=this._averageRatingElement.nextSibling.style,c=h._getComputedStyle(this._element).direction;a&&(c="rtl"===c?"ltr":"rtl"),"rtl"===c?(b.paddingRight=this._elementPadding,b.borderRight=this._elementBorder,b.direction="rtl"):(b.paddingLeft=this._elementPadding,b.borderLeft=this._elementBorder,b.direction="ltr"),b.backgroundPosition="left",b.backgroundSize="100% 100%",b.width=this._resizeStringValue(this._elementWidth,1,b.width)}},_resetAverageStar:function(a){this._resetNextElement(a),this._hideAverageRating()},_resizeStringValue:function(a,b,c){var d=parseFloat(a);if(isNaN(d))return null!==c?c:a;var e=a.substring(d.toString(10).length);return d*=b,d+e},_setControlSize:function(a){var b=(Number(a)||l)>>0;this._maxRating=b>0?b:l},_updateTooltips:function(a){var b,c=0;if(null!==a)for(c=a.length<=this._maxRating+1?a.length:this._maxRating+1,b=0;c>b;b++)this._tooltipStrings[b]=a[b];else{for(b=0;b<this._maxRating;b++)this._tooltipStrings[b]=b+1;this._tooltipStrings[this._maxRating]=i.clearYourRating}},_updateTabIndex:function(){this._element.tabIndex=this._disabled?"-1":"0"},_setStarClasses:function(a,b,c){for(var d=0;d<this._maxRating;d++)b>d?this._elements[d].className=a:this._elements[d].className=c},_updateAverageStar:function(){var a=this._averageRatingElement.style,b=this._averageRatingElement.nextSibling.style;"rtl"===h._getComputedStyle(this._element).direction?(a.backgroundPosition="right",a.paddingRight=this._elementPadding,a.borderRight=this._elementBorder,b.paddingRight="0px",b.borderRight="0px",b.direction="ltr"):(a.backgroundPosition="left",b.backgroundPosition="right",a.paddingLeft=this._elementPadding,a.borderLeft=this._elementBorder,b.paddingLeft="0px",b.borderLeft="0px",b.direction="rtl"),h._setFlexStyle(this._averageRatingElement,{grow:this._floatingValue,shrink:this._floatingValue}),a.width=this._resizeStringValue(this._elementWidth,this._floatingValue,a.width),a.backgroundSize=100/this._floatingValue+"% 100%",a.display=h._getComputedStyle(this._averageRatingElement.nextSibling).display,this._averageRatingHidden=!1,h._setFlexStyle(this._averageRatingElement.nextSibling,{grow:1-this._floatingValue,shrink:1-this._floatingValue}),b.width=this._resizeStringValue(this._elementWidth,1-this._floatingValue,b.width),b.backgroundSize=100/(1-this._floatingValue)+"% 100%"},_showCurrentRating:function(){this._closeTooltip(),this._tentativeRating=-1,this._disabled||this._updateControl(),this._updateAccessibilityRestState()},_showTentativeRating:function(a,b){!this._disabled&&this._tentativeRating>=0&&(this._setStarClasses(C,this._tentativeRating,B),this._hideAverageStar()),this._updateAccessibilityHoverState(),a&&(this._openTooltip(b),this._raiseEvent(p,this._tentativeRating))},_openTooltip:function(b){if(!this.disabled)if(this._ensureTooltips(),this._tentativeRating>0)this._toolTips[this._tentativeRating-1].innerHTML=this._tooltipStrings[this._tentativeRating-1],this._toolTips[this._tentativeRating-1].open(b);else if(0===this._tentativeRating){this._clearElement=a.document.createElement("div");var c=this._elements[0].offsetWidth+parseInt(this._elementPadding,10);"ltr"===h._getComputedStyle(this._element).direction&&(c*=-1),this._clearElement.style.cssText="visiblity:hidden; position:absolute; width:0px; height:100%; left:"+c+"px; top:0px;",this._elements[0].appendChild(this._clearElement),this._toolTips[this._maxRating]=new k.Tooltip(this._clearElement),this._toolTips[this._maxRating].innerHTML=this._tooltipStrings[this._maxRating],this._toolTips[this._maxRating].open(b)}},_closeTooltip:function(){0!==this._toolTips.length&&(this._tentativeRating>0?this._toolTips[this._tentativeRating-1].close():0===this._tentativeRating&&null!==this._clearElement&&(this._toolTips[this._maxRating].close(),this._elements[0].removeChild(this._clearElement),this._clearElement=null))},_clearTooltips:function(){if(this._toolTips&&0!==this._toolTips.length)for(var a=0;a<this._maxRating;a++)this._toolTips[a].innerHTML=null},_appendClass:function(a){for(var b=0;b<=this._maxRating;b++)h.addClass(this._elements[b],a)},_setClasses:function(a,b,c){for(var d=0;d<this._maxRating;d++)b>d?this._elements[d].className=a:this._elements[d].className=c},_ensureAverageMSStarRating:function(){h.data(this._averageRatingElement).msStarRating=Math.ceil(this._averageRating)},_updateControl:function(){if(this._controlUpdateNeeded){if(0!==this._averageRating&&0===this._userRating&&this._averageRating>=1&&this._averageRating<=this._maxRating){this._setClasses(y,this._averageRating-1,x),this._averageRatingElement.className=y;for(var a=0;a<this._maxRating;a++)if(a<this._averageRating&&a+1>=this._averageRating){this._resetNextElement(!1),this._element.insertBefore(this._averageRatingElement,this._elements[a]),this._floatingValue=this._averageRating-a;var b=h._getComputedStyle(this._elements[a]);this._elementWidth=b.width,"rtl"===h._getComputedStyle(this._element).direction?(this._elementPadding=b.paddingRight,this._elementBorder=b.borderRight):(this._elementPadding=b.paddingLeft,this._elementBorder=b.borderLeft),this._updateAverageStar()}}0!==this._userRating&&this._userRating>=1&&this._userRating<=this._maxRating&&(this._setClasses(A,this._userRating,z),this._resetAverageStar(!1)),0===this._userRating&&0===this._averageRating&&(this._setClasses(w,this._maxRating),this._resetAverageStar(!1)),this.disabled&&this._appendClass(D),0!==this._averageRating&&0===this._userRating?this._appendClass(E):this._appendClass(F),this._updateAccessibilityRestState()}}})})})}),d("require-style!less/styles-toggleswitch",[],function(){}),d("require-style!less/colors-toggleswitch",[],function(){}),d("WinJS/Controls/ToggleSwitch",["../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_Events","../Core/_Resources","../_Accents","../Utilities/_Control","../Utilities/_ElementUtilities","require-style!less/styles-toggleswitch","require-style!less/colors-toggleswitch"],function(a,b,c,d,e,f,g,h){"use strict";f.createAccentRule(".win-toggleswitch-on .win-toggleswitch-track",[{name:"background-color",value:f.ColorTypes.accent}]),f.createAccentRule("html.win-hoverable .win-toggleswitch-on:not(.win-toggleswitch-disabled):not(.win-toggleswitch-pressed) .win-toggleswitch-clickregion:hover .win-toggleswitch-track",[{name:"background-color",value:f.ColorTypes.listSelectPress}]),b.Namespace.define("WinJS.UI",{ToggleSwitch:b.Namespace._lazy(function(){var c="win-toggleswitch",f="win-toggleswitch-header",i="win-toggleswitch-clickregion",j="win-toggleswitch-track",k="win-toggleswitch-thumb",l="win-toggleswitch-values",m="win-toggleswitch-value",n="win-toggleswitch-value-on",o="win-toggleswitch-value-off",p="win-toggleswitch-description",q="win-toggleswitch-on",r="win-toggleswitch-off",s="win-toggleswitch-disabled",t="win-toggleswitch-enabled",u="win-toggleswitch-dragging",v="win-toggleswitch-pressed",w={get on(){return e._getWinJSString("ui/on").value},get off(){return e._getWinJSString("ui/off").value}},x=b.Class.define(function(b,d){b=b||a.document.createElement("div"),this._domElement=b,h.addClass(this._domElement,c),this._domElement.innerHTML=['<div class="'+f+'"></div>','<div class="'+i+'">','   <div class="'+j+'">','       <div class="'+k+'"></div>',"   </div>",'   <div class="'+l+'">','      <div class="'+m+" "+n+'"></div>','      <div class="'+m+" "+o+'"></div>',"   </div>","</div>",'<div class="'+p+'"></div>'].join("\n"),this._headerElement=this._domElement.firstElementChild,this._clickElement=this._headerElement.nextElementSibling,this._trackElement=this._clickElement.firstElementChild,this._thumbElement=this._trackElement.firstElementChild,this._labelsElement=this._trackElement.nextElementSibling,this._labelOnElement=this._labelsElement.firstElementChild,this._labelOffElement=this._labelOnElement.nextElementSibling,this._descriptionElement=this._clickElement.nextElementSibling,this._headerElement.setAttribute("aria-hidden",!0),this._labelsElement.setAttribute("aria-hidden",!0),this._headerElement.setAttribute("id",h._uniqueID(this._headerElement)),this._domElement.setAttribute("aria-labelledby",this._headerElement.id),this._domElement.setAttribute("role","checkbox"),this._domElement.winControl=this,h.addClass(this._domElement,"win-disposable"),this._domElement.addEventListener("keydown",this._keyDownHandler.bind(this)),h._addEventListener(this._clickElement,"pointerdown",this._pointerDownHandler.bind(this)),h._addEventListener(this._clickElement,"pointercancel",this._pointerCancelHandler.bind(this)),this._boundPointerMove=this._pointerMoveHandler.bind(this),this._boundPointerUp=this._pointerUpHandler.bind(this),this._mutationObserver=new h._MutationObserver(this._ariaChangedHandler.bind(this)),this._mutationObserver.observe(this._domElement,{attributes:!0,attributeFilter:["aria-checked"]
-}),this._dragX=0,this._dragging=!1,this.checked=!1,this.disabled=!1,this.labelOn=w.on,this.labelOff=w.off,g.setOptions(this,d)},{element:{get:function(){return this._domElement}},checked:{get:function(){return this._checked},set:function(a){a=!!a,a!==this.checked&&(this._checked=a,this._domElement.setAttribute("aria-checked",a),a?(h.addClass(this._domElement,q),h.removeClass(this._domElement,r)):(h.addClass(this._domElement,r),h.removeClass(this._domElement,q)),this.dispatchEvent("change"))}},disabled:{get:function(){return this._disabled},set:function(a){a=!!a,a!==this._disabled&&(a?(h.addClass(this._domElement,s),h.removeClass(this._domElement,t)):(h.removeClass(this._domElement,s),h.addClass(this._domElement,t)),this._disabled=a,this._domElement.setAttribute("aria-disabled",a),this._domElement.setAttribute("tabIndex",a?-1:0))}},labelOn:{get:function(){return this._labelOnElement.innerHTML},set:function(a){this._labelOnElement.innerHTML=a}},labelOff:{get:function(){return this._labelOffElement.innerHTML},set:function(a){this._labelOffElement.innerHTML=a}},title:{get:function(){return this._headerElement.innerHTML},set:function(a){this._headerElement.innerHTML=a}},onchange:d._createEventProperty("change"),dispose:function(){this._disposed||(this._disposed=!0)},_ariaChangedHandler:function(){var a=this._domElement.getAttribute("aria-checked");a="true"===a,this.checked=a},_keyDownHandler:function(a){this.disabled||(a.keyCode===h.Key.space&&(a.preventDefault(),this.checked=!this.checked),a.keyCode!==h.Key.rightArrow&&a.keyCode!==h.Key.upArrow||(a.preventDefault(),this.checked=!0),a.keyCode!==h.Key.leftArrow&&a.keyCode!==h.Key.downArrow||(a.preventDefault(),this.checked=!1))},_pointerDownHandler:function(a){this.disabled||this._mousedown||(a.preventDefault(),this._mousedown=!0,this._dragXStart=a.pageX-this._trackElement.getBoundingClientRect().left,this._dragX=this._dragXStart,this._dragging=!1,h.addClass(this._domElement,v),h._globalListener.addEventListener(this._domElement,"pointermove",this._boundPointerMove,!0),h._globalListener.addEventListener(this._domElement,"pointerup",this._boundPointerUp,!0),a.pointerType===h._MSPointerEvent.MSPOINTER_TYPE_TOUCH&&h._setPointerCapture(this._domElement,a.pointerId))},_pointerCancelHandler:function(a){this._resetPressedState(),a.pointerType===h._MSPointerEvent.MSPOINTER_TYPE_TOUCH&&h._releasePointerCapture(this._domElement,a.pointerId)},_pointerUpHandler:function(a){if(!this.disabled&&this._mousedown){a=a.detail.originalEvent,a.preventDefault();var b=this._trackElement.getBoundingClientRect(),c=this._thumbElement.getBoundingClientRect(),d="rtl"===h._getComputedStyle(this._domElement).direction;if(this._dragging){var e=b.width-c.width;this.checked=d?this._dragX<e/2:this._dragX>=e/2,this._dragging=!1,h.removeClass(this._domElement,u)}else this.checked=!this.checked;this._resetPressedState()}},_pointerMoveHandler:function(a){if(!this.disabled&&this._mousedown){a=a.detail.originalEvent,a.preventDefault();var b=this._trackElement.getBoundingClientRect(),c=a.pageX-b.left;if(!(c>b.width)){var d=this._thumbElement.getBoundingClientRect(),e=b.width-d.width-6;this._dragX=Math.min(e,c-d.width/2),this._dragX=Math.max(2,this._dragX),!this._dragging&&Math.abs(c-this._dragXStart)>3&&(this._dragging=!0,h.addClass(this._domElement,u)),this._thumbElement.style.left=this._dragX+"px"}}},_resetPressedState:function(){this._mousedown=!1,this._thumbElement.style.left="",h.removeClass(this._domElement,v),h._globalListener.removeEventListener(this._domElement,"pointermove",this._boundPointerMove,!0),h._globalListener.removeEventListener(this._domElement,"pointerup",this._boundPointerUp,!0)}});return b.Class.mix(x,g.DOMEventMixin),x})})}),d("require-style!less/styles-semanticzoom",[],function(){}),d("require-style!less/colors-semanticzoom",[],function(){}),d("WinJS/Controls/SemanticZoom",["../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Events","../Core/_Resources","../Core/_WriteProfilerMark","../Animations","../Animations/_TransitionAnimation","../ControlProcessor","../Promise","../Utilities/_Control","../Utilities/_Dispose","../Utilities/_ElementUtilities","../Utilities/_ElementListUtilities","../Utilities/_Hoverable","./ElementResizeInstrument","require-style!less/styles-semanticzoom","require-style!less/colors-semanticzoom"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){"use strict";b.Namespace.define("WinJS.UI",{SemanticZoom:b.Namespace._lazy(function(){function f(a){return a}function r(a,b,c){return a+" "+i._animationTimeAdjustment(b)+"s "+c+" "+i._libraryDelay+"ms"}function s(){return r(X.cssName,Q,"ease-in-out")+", "+r("opacity",O,"ease-in-out")}function t(){return r(X.cssName,R,"ease-in-out")+", "+r("opacity",P,"ease-in-out")}function u(){return r(X.cssName,U,W)}function v(){return r(X.cssName,V,W)}function w(a,b){return n.convertToPixels(a,b)}function x(a,b){i.isAnimationEnabled()&&(a.style[X.scriptName]="scale("+b+")")}function y(a){var b=a[0].target&&a[0].target.winControl;b&&b instanceof ha&&b._onPropertyChanged()}var z=c._browserStyleEquivalents,A={get invalidZoomFactor(){return"Invalid zoomFactor"}},B="win-semanticzoom-button",C="win-semanticzoom-button-location",D=3e3,E=8,F="win-semanticzoom",G="win-semanticzoom-zoomedinview",H="win-semanticzoom-zoomedoutview",I="zoomchanged",J=1.05,K=.65,L=.8,M=.2,N=4096,O=.333,P=.333,Q=.333,R=.333,S=1e3*O,T=50,U=.333,V=.333,W="cubic-bezier(0.1,0.9,0.2,1)",X=z.transform,Y=z.transition.scriptName,Z=2,$=.2,_=.45,aa=1e3,ba=50,ca={none:0,zoomedIn:1,zoomedOut:2},da=n._MSPointerEvent.MSPOINTER_TYPE_TOUCH||"touch",ea=n._MSPointerEvent.MSPOINTER_TYPE_PEN||"pen",fa=n._MSPointerEvent.MSPOINTER_TYPE_MOUSE||"mouse",ga={x:0,y:0},ha=b.Class.define(function(b,e){this._disposed=!1;var f=this,g=c.isPhone;this._element=b,this._element.winControl=this,n.addClass(this._element,"win-disposable"),n.addClass(this._element,F),this._element.setAttribute("role","ms-semanticzoomcontainer");var h=this._element.getAttribute("aria-label");if(h||this._element.setAttribute("aria-label",""),e=e||{},this._zoomedOut=!!e.zoomedOut||!!e.initiallyZoomedOut||!1,this._enableButton=!g,g||void 0===e.enableButton||(this._enableButton=!!e.enableButton),this._element.setAttribute("aria-checked",this._zoomedOut.toString()),this._zoomFactor=n._clamp(e.zoomFactor,M,L,K),this.zoomedInItem=e.zoomedInItem,this.zoomedOutItem=e.zoomedOutItem,c.validation&&e._zoomFactor&&e._zoomFactor!==this._zoomFactor)throw new d("WinJS.UI.SemanticZoom.InvalidZoomFactor",A.invalidZoomFactor);this._locked=!!e.locked,this._zoomInProgress=!1,this._isBouncingIn=!1,this._isBouncing=!1,this._zooming=!1,this._aligning=!1,this._gesturing=!1,this._gestureEnding=!1,this._buttonShown=!1,this._shouldFakeTouchCancel="TouchEvent"in a,this._initialize(),this._configure(),this._onResizeBound=this._onResize.bind(this),this._elementResizeInstrument=new q._ElementResizeInstrument,this._element.appendChild(this._elementResizeInstrument.element),this._elementResizeInstrument.addEventListener("resize",this._onResizeBound),n._resizeNotifier.subscribe(this._element,this._onResizeBound);var i=a.document.body.contains(this._element);i&&this._elementResizeInstrument.addedToDom(),n._addInsertedNotifier(this._element);var j=!0;this._element.addEventListener("WinJSNodeInserted",function(a){j?(j=!1,i||(f._elementResizeInstrument.addedToDom(),f._onResizeBound())):f._onResizeBound()},!1),new n._MutationObserver(y).observe(this._element,{attributes:!0,attributeFilter:["aria-checked"]}),g||(this._element.addEventListener("wheel",this._onWheel.bind(this),!0),this._element.addEventListener("mousewheel",this._onMouseWheel.bind(this),!0),this._element.addEventListener("keydown",this._onKeyDown.bind(this),!0),n._addEventListener(this._element,"pointerdown",this._onPointerDown.bind(this),!0),n._addEventListener(this._element,"pointermove",this._onPointerMove.bind(this),!0),n._addEventListener(this._element,"pointerout",this._onPointerOut.bind(this),!0),n._addEventListener(this._element,"pointercancel",this._onPointerCancel.bind(this),!0),n._addEventListener(this._element,"pointerup",this._onPointerUp.bind(this),!1),this._hiddenElement.addEventListener("gotpointercapture",this._onGotPointerCapture.bind(this),!1),this._hiddenElement.addEventListener("lostpointercapture",this._onLostPointerCapture.bind(this),!1),this._element.addEventListener("click",this._onClick.bind(this),!0),this._canvasIn.addEventListener(c._browserEventEquivalents.transitionEnd,this._onCanvasTransitionEnd.bind(this),!1),this._canvasOut.addEventListener(c._browserEventEquivalents.transitionEnd,this._onCanvasTransitionEnd.bind(this),!1),this._element.addEventListener("MSContentZoom",this._onMSContentZoom.bind(this),!0),this._resetPointerRecords()),this._onResizeImpl(),l._setOptions(this,e,!0),f._setVisibility()},{element:{get:function(){return this._element}},enableButton:{get:function(){return this._enableButton},set:function(a){var b=!!a;this._enableButton===b||c.isPhone||(this._enableButton=b,b?this._createSemanticZoomButton():this._removeSemanticZoomButton())}},zoomedOut:{get:function(){return this._zoomedOut},set:function(a){this._zoom(!!a,{x:.5*this._sezoClientWidth,y:.5*this._sezoClientHeight},!1,!1,this._zoomedOut&&c.isPhone)}},zoomFactor:{get:function(){return this._zoomFactor},set:function(a){var b=this._zoomFactor,c=n._clamp(a,M,L,K);b!==c&&(this._zoomFactor=c,this.forceLayout())}},locked:{get:function(){return this._locked},set:function(a){this._locked=!!a,a?this._hideSemanticZoomButton():this._displayButton()}},zoomedInItem:{get:function(){return this._zoomedInItem},set:function(a){this._zoomedInItem=a||f}},zoomedOutItem:{get:function(){return this._zoomedOutItem},set:function(a){this._zoomedOutItem=a||f}},dispose:function(){this._disposed||(this._disposed=!0,this._elementResizeInstrument.dispose(),n._resizeNotifier.unsubscribe(this._element,this._onResizeBound),m._disposeElement(this._elementIn),m._disposeElement(this._elementOut),this._clearTimeout(this._completeZoomTimer),this._clearTimeout(this._TTFFTimer))},forceLayout:function(){this._onResizeImpl()},_initialize:function(){var b=o.children(this._element);this._elementIn=b[0],this._elementOut=b[1],this._elementIn.style.height=this._elementOut.style.height=this._element.offsetHeight+"px",j.processAll(this._elementIn),j.processAll(this._elementOut),this._viewIn=this._elementIn.winControl.zoomableView,this._viewOut=this._elementOut.winControl.zoomableView,this._element.removeChild(this._elementOut),this._element.removeChild(this._elementIn),this._element.innerHTML="",this._cropViewport=a.document.createElement("div"),this._element.appendChild(this._cropViewport),this._viewportIn=a.document.createElement("div"),this._opticalViewportIn=a.document.createElement("div"),this._viewportOut=a.document.createElement("div"),this._opticalViewportOut=a.document.createElement("div"),this._opticalViewportIn.appendChild(this._viewportIn),this._opticalViewportOut.appendChild(this._viewportOut),this._cropViewport.appendChild(this._opticalViewportIn),this._cropViewport.appendChild(this._opticalViewportOut),this._canvasIn=a.document.createElement("div"),this._canvasOut=a.document.createElement("div"),this._viewportIn.appendChild(this._canvasIn),this._viewportOut.appendChild(this._canvasOut),this._canvasIn.appendChild(this._elementIn),this._canvasOut.appendChild(this._elementOut),this._enableButton&&this._createSemanticZoomButton(),this._hiddenElement=a.document.createElement("div"),this._hiddenElement.tabIndex=-1,this._hiddenElement.visibility="hidden",this._hiddenElement.setAttribute("aria-hidden","true"),this._element.appendChild(this._hiddenElement),n.addClass(this._elementIn,G),n.addClass(this._elementOut,H),this._setLayout(this._element,"relative","hidden"),this._setLayout(this._cropViewport,"absolute","hidden"),this._setLayout(this._opticalViewportIn,"absolute","auto"),this._setLayout(this._opticalViewportOut,"absolute","auto"),this._setLayout(this._viewportIn,"absolute","hidden"),this._setLayout(this._viewportOut,"absolute","hidden"),this._setLayout(this._canvasIn,"absolute","hidden"),this._setLayout(this._canvasOut,"absolute","hidden"),this._setupOpticalViewport(this._opticalViewportIn),this._setupOpticalViewport(this._opticalViewportOut),this._viewportIn.style["-ms-overflow-style"]="-ms-autohiding-scrollbar",this._viewportOut.style["-ms-overflow-style"]="-ms-autohiding-scrollbar",this._elementIn.style.position="absolute",this._elementOut.style.position="absolute"},_createSemanticZoomButton:function(){this._sezoButton=a.document.createElement("button"),this._sezoButton.setAttribute("type","button"),this._sezoButton.className=B+" "+C+" win-button",this._sezoButton.tabIndex=-1,this._sezoButton.style.visibility="hidden",this._sezoButton.setAttribute("aria-hidden",!0),this._element.appendChild(this._sezoButton),this._sezoButton.addEventListener("click",this._onSeZoButtonZoomOutClick.bind(this),!1),this._element.addEventListener("scroll",this._onSeZoChildrenScroll.bind(this),!0),n._addEventListener(this._element,"pointermove",this._onPenHover.bind(this),!1)},_removeSemanticZoomButton:function(){this._sezoButton&&(this._element.removeChild(this._sezoButton),this._sezoButton=null)},_configure:function(){var a=this._viewIn.getPanAxis(),b=this._viewOut.getPanAxis(),d=c.isPhone;if(this._pansHorizontallyIn="horizontal"===a||"both"===a,this._pansVerticallyIn="vertical"===a||"both"===a,this._pansHorizontallyOut="horizontal"===b||"both"===b,this._pansVerticallyOut="vertical"===b||"both"===b,!this._zoomInProgress){var e=1/this._zoomFactor-1,f=J-1;this._setLayout(this._elementIn,"absolute","visible"),this._setLayout(this._elementOut,"absolute","visible"),this._viewIn.configureForZoom(!1,!this._zoomedOut,this._zoomFromCurrent.bind(this,!0),e),this._viewOut.configureForZoom(!0,this._zoomedOut,this._zoomFromCurrent.bind(this,!1),f),this._pinching=!1,this._pinchGesture=0,this._canvasLeftIn=0,this._canvasTopIn=0,this._canvasLeftOut=0,this._canvasTopOut=0,d||(this._zoomedOut?x(this._canvasIn,this._zoomFactor):x(this._canvasOut,1/this._zoomFactor));var g=this._opticalViewportIn.style,h=this._opticalViewportOut.style,j=this._canvasIn.style,k=this._canvasOut.style;j.opacity=this._zoomedOut&&!d?0:1,k.opacity=this._zoomedOut?1:0,d&&(j.zIndex=1,k.zIndex=2),i.isAnimationEnabled()&&!d&&(g[z["transition-property"].scriptName]=X.cssName,g[z["transition-duration"].scriptName]="0s",g[z["transition-timing-function"].scriptName]="linear",h[z["transition-property"].scriptName]=X.cssName,h[z["transition-duration"].scriptName]="0s",h[z["transition-timing-function"].scriptName]="linear")}},_onPropertyChanged:function(){var a=this._element.getAttribute("aria-checked"),b="true"===a;this._zoomedOut!==b&&(this.zoomedOut=b)},_onResizeImpl:function(){this._resizing=this._resizing||0,this._resizing++;try{var a=function(a,b,c,d,e){var f=a.style;f.left=b+"px",f.top=c+"px",f.width=d+"px",f.height=e+"px"},b=n._getComputedStyle(this._element,null),c=parseFloat(b.width),d=parseFloat(b.height),e=w(this._element,b.paddingLeft),f=w(this._element,b.paddingRight),g=w(this._element,b.paddingTop),h=w(this._element,b.paddingBottom),i=c-e-f,j=d-g-h,k=1/this._zoomFactor;if(this._viewportWidth===i&&this._viewportHeight===j)return;this._sezoClientHeight=d,this._sezoClientWidth=c,this._viewportWidth=i,this._viewportHeight=j,this._configure();var l=2*k-1,m=Math.min(N,(this._pansHorizontallyIn?l:1)*i),o=Math.min(N,(this._pansVerticallyIn?l:1)*j);this._canvasLeftIn=.5*(m-i),this._canvasTopIn=.5*(o-j),a(this._cropViewport,e,g,i,j),a(this._viewportIn,0,0,i,j),a(this._opticalViewportIn,0,0,i,j),a(this._canvasIn,-this._canvasLeftIn,-this._canvasTopIn,m,o),a(this._elementIn,this._canvasLeftIn,this._canvasTopIn,i,j);var p=2*J-1,q=(this._pansHorizontallyOut?p:1)*i,r=(this._pansVerticallyOut?p:1)*j;this._canvasLeftOut=.5*(q-i),this._canvasTopOut=.5*(r-j),a(this._viewportOut,0,0,i,j),a(this._opticalViewportOut,0,0,i,j),a(this._canvasOut,-this._canvasLeftOut,-this._canvasTopOut,q,r),a(this._elementOut,this._canvasLeftOut,this._canvasTopOut,i,j)}finally{this._resizing--}},_onResize:function(){this._resizing||this._onResizeImpl()},_onMouseMove:function(a){return this._zooming||!this._lastMouseX&&!this._lastMouseY||a.screenX===this._lastMouseX&&a.screenY===this._lastMouseY?(this._lastMouseX=a.screenX,void(this._lastMouseY=a.screenY)):void(Math.abs(a.screenX-this._lastMouseX)<=E&&Math.abs(a.screenY-this._lastMouseY)<=E||(this._lastMouseX=a.screenX,this._lastMouseY=a.screenY,this._displayButton()))},_displayButton:function(){if(p.isHoverable){a.clearTimeout(this._dismissButtonTimer),this._showSemanticZoomButton();var b=this;this._dismissButtonTimer=a.setTimeout(function(){b._hideSemanticZoomButton()},i._animationTimeAdjustment(D))}},_showSemanticZoomButton:function(){this._disposed||this._buttonShown||!this._sezoButton||this._zoomedOut||this._locked||(h.fadeIn(this._sezoButton),this._sezoButton.style.visibility="visible",this._buttonShown=!0)},_hideSemanticZoomButton:function(a){if(!this._disposed&&this._buttonShown&&this._sezoButton){if(a)this._sezoButton.style.visibility="hidden";else{var b=this;h.fadeOut(this._sezoButton).then(function(){b._sezoButton.style.visibility="hidden"})}this._buttonShown=!1}},_onSeZoChildrenScroll:function(a){a.target!==this.element&&this._hideSemanticZoomButton(!0)},_onWheel:function(a){a.ctrlKey&&(this._zoom(a.deltaY>0,this._getPointerLocation(a)),a.stopPropagation(),a.preventDefault())},_onMouseWheel:function(a){a.ctrlKey&&(this._zoom(a.wheelDelta<0,this._getPointerLocation(a)),a.stopPropagation(),a.preventDefault())},_onPenHover:function(a){a.pointerType===ea&&0===a.buttons&&this._displayButton()},_onSeZoButtonZoomOutClick:function(){this._hideSemanticZoomButton(),this._zoom(!0,{x:.5*this._sezoClientWidth,y:.5*this._sezoClientHeight},!1)},_onKeyDown:function(a){var b=!1;if(a.ctrlKey){var c=n.Key;switch(a.keyCode){case c.add:case c.equal:case 61:this._zoom(!1),b=!0;break;case c.subtract:case c.dash:case 173:this._zoom(!0),b=!0}}b&&(a.stopPropagation(),a.preventDefault())},_createPointerRecord:function(a,b){var c=this._getPointerLocation(a),d={};return d.startX=d.currentX=c.x,d.startY=d.currentY=c.y,d.fireCancelOnPinch=b,this._pointerRecords[a.pointerId]=d,this._pointerCount=Object.keys(this._pointerRecords).length,d},_deletePointerRecord:function(a){var b=this._pointerRecords[a];return delete this._pointerRecords[a],this._pointerCount=Object.keys(this._pointerRecords).length,2!==this._pointerCount&&(this._pinching=!1),b},_fakeCancelOnPointer:function(b){var c=a.document.createEvent("UIEvent");c.initUIEvent("touchcancel",!0,!0,a,0),c.touches=b.touches,c.targetTouches=b.targetTouches,c.changedTouches=[b._currentTouch],c._fakedBySemanticZoom=!0,b.target.dispatchEvent(c)},_handlePointerDown:function(a){this._createPointerRecord(a,!1);for(var b=Object.keys(this._pointerRecords),c=0,d=b.length;d>c;c++)try{n._setPointerCapture(this._hiddenElement,b[c]||0)}catch(e){return void this._resetPointerRecords()}a.stopImmediatePropagation(),a.preventDefault()},_handleFirstPointerDown:function(a){this._resetPointerRecords(),this._createPointerRecord(a,this._shouldFakeTouchCancel),this._startedZoomedOut=this._zoomedOut},_onClick:function(a){a.target!==this._element&&this._isBouncing&&a.stopImmediatePropagation()},_onPointerDown:function(a){a.pointerType===da&&(0===this._pointerCount?this._handleFirstPointerDown(a):this._handlePointerDown(a))},_onPointerMove:function(a){function b(a,b,c,d){return Math.sqrt((c-a)*(c-a)+(d-b)*(d-b))}function c(a,b){return{x:.5*(a.currentX+b.currentX)|0,y:.5*(a.currentY+b.currentY)|0}}if(a.pointerType===fa||a.pointerType===ea)return void this._onMouseMove(a);if(a.pointerType===da){var d=this._pointerRecords[a.pointerId],e=this._getPointerLocation(a);if(d){if(d.currentX=e.x,d.currentY=e.y,2===this._pointerCount){this._pinching=!0;var f=Object.keys(this._pointerRecords),h=this._pointerRecords[f[0]],i=this._pointerRecords[f[1]];this._currentMidPoint=c(h,i);var j=b(h.currentX,h.currentY,i.currentX,i.currentY),k=this,l=function(a){var b=a?ca.zoomedOut:ca.zoomedIn,d=a?k._pinchedDirection===ca.zoomedIn&&!k._zoomingOut:k._pinchedDirection===ca.zoomedOut&&k._zoomingOut,e=a?!k._zoomedOut:k._zoomedOut;if(k._pinchedDirection===ca.none)e?(k._isBouncingIn=!1,k._zoom(a,c(h,i),!0),k._pinchedDirection=b):k._isBouncingIn||k._playBounce(!0,c(h,i));else if(d){var f=k._lastPinchDistance/k._lastPinchStartDistance,g=k._lastLastPinchDistance/k._lastPinchDistance;(a&&f>$||!a&&g>_)&&(k._zoom(a,c(h,i),!0),k._pinchedDirection=b)}};this._updatePinchDistanceRecords(j),this._pinchDistanceCount>=Z&&(this._zooming||this._isBouncing||(g("WinJS.UI.SemanticZoom:EndPinchDetection,info"),l(this._lastPinchDirection===ca.zoomedOut)))}else this._pointerCount>2&&this._resetPinchDistanceRecords();this._pointerCount>=2&&(d.fireCancelOnPinch&&(this._fakeCancelOnPointer(a,d),d.fireCancelOnPinch=!1),a.stopImmediatePropagation(),a.preventDefault()),2!==this._pointerCount&&this._isBouncingIn&&this._playBounce(!1)}}},_onPointerOut:function(a){a.pointerType===da&&a.target===this._element&&this._completePointerUp(a,!1)},_onPointerUp:function(a){this._releasePointerCapture(a),this._completePointerUp(a,!0),this._completeZoomingIfTimeout()},_onPointerCancel:function(a){a._fakedBySemanticZoom||(this._releasePointerCapture(a),this._completePointerUp(a,!1),this._completeZoomingIfTimeout())},_onGotPointerCapture:function(a){var b=this._pointerRecords[a.pointerId];b&&(b.dirty=!1)},_onLostPointerCapture:function(a){var b=this._pointerRecords[a.pointerId];if(b){b.dirty=!0;var c=this;k.timeout(ba).then(function(){b.dirty&&c._completePointerUp(a,!1)})}},_onMSContentZoom:function(a){var b=a.target;if(b===this._opticalViewportIn||b===this._opticalViewportOut){var c=b.msContentZoomFactor<.995,d=b.msContentZoomFactor>1.005;!c||this._zoomedOut||this._zoomingOut?d&&(this._zoomedOut||this._zoomingOut)&&(this.zoomedOut=!1):this.zoomedOut=!0}},_updatePinchDistanceRecords:function(a){function b(b){c._lastPinchDirection===b?c._pinchDistanceCount++:(c._pinchGesture++,c._pinchDistanceCount=0,c._lastPinchStartDistance=a),c._lastPinchDirection=b,c._lastPinchDistance=a,c._lastLastPinchDistance=c._lastPinchDistance}var c=this;-1===this._lastPinchDistance?(g("WinJS.UI.SemanticZoom:StartPinchDetection,info"),this._lastPinchDistance=a):this._lastPinchDistance!==a&&b(this._lastPinchDistance>a?ca.zoomedOut:ca.zoomedIn)},_zoomFromCurrent:function(a){this._zoom(a,null,!1,!0)},_zoom:function(a,b,d,e,f){if(g("WinJS.UI.SemanticZoom:StartZoom(zoomOut="+a+"),info"),this._clearTimeout(this._completeZoomTimer),this._clearTimeout(this._TTFFTimer),this._hideSemanticZoomButton(),this._resetPinchDistanceRecords(),!this._locked&&!this._gestureEnding)if(this._zoomInProgress){if(this._gesturing===!d)return;a!==this._zoomingOut&&this._startAnimations(a)}else if(a!==this._zoomedOut){this._zooming=!0,this._aligning=!0,this._gesturing=!!d,b&&(a?this._viewIn:this._viewOut).setCurrentItem(b.x,b.y),this._zoomInProgress=!0,(a?this._opticalViewportOut:this._opticalViewportIn).style.visibility="visible",a&&c.isPhone&&(this._canvasOut.style.opacity=1);var h=this._viewIn.beginZoom(),i=this._viewOut.beginZoom(),j=null;if((h||i)&&c.isPhone&&(j=k.join([h,i])),e&&!f){var l=this;(a?this._viewIn:this._viewOut).getCurrentItem().then(function(b){var c=b.position;l._prepareForZoom(a,{x:l._rtl()?l._sezoClientWidth-c.left-.5*c.width:c.left+.5*c.width,y:c.top+.5*c.height},k.wrap(b),j)})}else this._prepareForZoom(a,b||{},null,j,f)}},_prepareForZoom:function(a,b,c,d,e){function f(a,b){h._canvasIn.style[z["transform-origin"].scriptName]=h._canvasLeftIn+i-a.x+"px "+(h._canvasTopIn+j-a.y)+"px",h._canvasOut.style[z["transform-origin"].scriptName]=h._canvasLeftOut+i-b.x+"px "+(h._canvasTopOut+j-b.y)+"px"}g("WinJS.UI.SemanticZoom:prepareForZoom,StartTM");var h=this,i=b.x,j=b.y;"number"==typeof i&&this._pansHorizontallyIn&&this._pansHorizontallyOut||(i=.5*this._sezoClientWidth),"number"==typeof j&&this._pansVerticallyIn&&this._pansVerticallyOut||(j=.5*this._sezoClientHeight),f(ga,ga),e?this._aligning=!1:this._alignViewsPromise=this._alignViews(a,i,j,c).then(function(){h._aligning=!1,h._gestureEnding=!1,h._alignViewsPromise=null,h._zooming||h._gesturing||h._completeZoom()}),this._zoomingOut=a,n._getComputedStyle(this._canvasIn).opacity,n._getComputedStyle(this._canvasOut).opacity,g("WinJS.UI.SemanticZoom:prepareForZoom,StopTM"),this._startAnimations(a,d)},_alignViews:function(a,b,c,d){var e=1-this._zoomFactor,f=this._rtl(),g=e*(f?this._viewportWidth-b:b),h=e*c,i=this;if(a){var j=d||this._viewIn.getCurrentItem();if(j)return j.then(function(a){var b=a.position,c={left:b.left*i._zoomFactor+g,top:b.top*i._zoomFactor+h,width:b.width*i._zoomFactor,height:b.height*i._zoomFactor};return i._viewOut.positionItem(i._zoomedOutItem(a.item),c)})}else{var l=d||this._viewOut.getCurrentItem();if(l)return l.then(function(a){var b=a.position,c={left:(b.left-g)/i._zoomFactor,top:(b.top-h)/i._zoomFactor,width:b.width/i._zoomFactor,height:b.height/i._zoomFactor};return i._viewIn.positionItem(i._zoomedInItem(a.item),c)})}return new k(function(a){a({x:0,y:0})})},_startAnimations:function(a,b){this._zoomingOut=a;var d=c.isPhone;if(i.isAnimationEnabled()&&!d&&(g("WinJS.UI.SemanticZoom:ZoomAnimation,StartTM"),this._canvasIn.style[Y]=a?s():t(),this._canvasOut.style[Y]=a?t():s()),d||(x(this._canvasIn,a?this._zoomFactor:1),x(this._canvasOut,a?1:1/this._zoomFactor)),this._canvasIn.style.opacity=a&&!d?0:1,d&&!a||(this._canvasOut.style.opacity=a?1:0),i.isAnimationEnabled())if(b){var e=this,f=function(){e._canvasIn.style[X.scriptName]="",e._canvasOut.style[X.scriptName]="",e._onZoomAnimationComplete()};b.then(f,f)}else this.setTimeoutAfterTTFF(this._onZoomAnimationComplete.bind(this),i._animationTimeAdjustment(S));else this._zooming=!1,this._canvasIn.style[X.scriptName]="",this._canvasOut.style[X.scriptName]="",this._completeZoom()},_onBounceAnimationComplete:function(){this._isBouncingIn||this._disposed||this._completeZoom()},_onZoomAnimationComplete:function(){g("WinJS.UI.SemanticZoom:ZoomAnimation,StopTM"),this._disposed||(this._zooming=!1,this._aligning||this._gesturing||this._gestureEnding||this._completeZoom())},_onCanvasTransitionEnd:function(a){return this._disposed?void 0:a.target!==this._canvasOut&&a.target!==this._canvasIn||!this._isBouncing?void(a.target===this._canvasIn&&a.propertyName===X.cssName&&this._onZoomAnimationComplete()):void this._onBounceAnimationComplete()},_clearTimeout:function(b){b&&a.clearTimeout(b)},_completePointerUp:function(a,b){if(!this._disposed){var c=a.pointerId,d=this._pointerRecords[c];if(d&&(this._deletePointerRecord(c),this._isBouncingIn&&this._playBounce(!1),b&&this._pinchedDirection!==ca.none&&a.stopImmediatePropagation(),0===this._pointerCount)){if(1===this._pinchGesture&&!this._zooming&&this._lastPinchDirection!==ca.none&&this._pinchDistanceCount<Z)return this._zoom(this._lastPinchDirection===ca.zoomedOut,this._currentMidPoint,!1),this._pinchGesture=0,void this._attemptRecordReset();this._pinchedDirection!==ca.none&&(this._gesturing=!1,this._aligning||this._zooming||this._completeZoom()),this._pinchGesture=0,this._attemptRecordReset()}}},setTimeoutAfterTTFF:function(b,c){var d=this;d._TTFFTimer=a.setTimeout(function(){this._disposed||(d._TTFFTimer=a.setTimeout(b,c))},T)},_completeZoomingIfTimeout:function(){if(0===this._pointerCount){var b=this;(this._zoomInProgress||this._isBouncing)&&(b._completeZoomTimer=a.setTimeout(function(){b._completeZoom()},i._animationTimeAdjustment(aa)))}},_completeZoom:function(){if(!this._disposed){if(this._isBouncing)return this._zoomedOut?this._viewOut.endZoom(!0):this._viewIn.endZoom(!0),void(this._isBouncing=!1);if(this._zoomInProgress){g("WinJS.UI.SemanticZoom:CompleteZoom,info"),this._aligning=!1,this._alignViewsPromise&&this._alignViewsPromise.cancel(),this._clearTimeout(this._completeZoomTimer),this._clearTimeout(this._TTFFTimer),this._gestureEnding=!1,this[this._zoomingOut?"_opticalViewportOut":"_opticalViewportIn"].msContentZoomFactor=1,this._viewIn.endZoom(!this._zoomingOut),this._viewOut.endZoom(this._zoomingOut),this._canvasIn.style.opacity=this._zoomingOut&&!c.isPhone?0:1,this._canvasOut.style.opacity=this._zoomingOut?1:0,this._zoomInProgress=!1;var b=!1;if(this._zoomingOut!==this._zoomedOut&&(this._zoomedOut=!!this._zoomingOut,this._element.setAttribute("aria-checked",this._zoomedOut.toString()),b=!0),this._setVisibility(),b){var d=a.document.createEvent("CustomEvent");d.initCustomEvent(I,!0,!0,this._zoomedOut),this._element.dispatchEvent(d),this._isActive&&n._setActive(this._zoomedOut?this._elementOut:this._elementIn)}g("WinJS.UI.SemanticZoom:CompleteZoom_Custom,info")}}},_isActive:function(){var b=a.document.activeElement;return this._element===b||this._element.contains(b)},_setLayout:function(a,b,c){var d=a.style;d.position=b,d.overflow=c},_setupOpticalViewport:function(a){a.style["-ms-overflow-style"]="none",c.isPhone||(a.style["-ms-content-zooming"]="zoom",a.style["-ms-content-zoom-limit-min"]="99%",a.style["-ms-content-zoom-limit-max"]="101%",a.style["-ms-content-zoom-snap-points"]="snapList(100%)",a.style["-ms-content-zoom-snap-type"]="mandatory")},_setVisibility:function(){function a(a,b){a.style.visibility=b?"visible":"hidden"}a(this._opticalViewportIn,!this._zoomedOut||c.isPhone),a(this._opticalViewportOut,this._zoomedOut),this._opticalViewportIn.setAttribute("aria-hidden",!!this._zoomedOut),this._opticalViewportOut.setAttribute("aria-hidden",!this._zoomedOut)},_resetPointerRecords:function(){this._pinchedDirection=ca.none,this._pointerCount=0,this._pointerRecords={},this._resetPinchDistanceRecords()},_releasePointerCapture:function(a){var b=a.pointerId;try{n._releasePointerCapture(this._hiddenElement,b)}catch(c){}},_attemptRecordReset:function(){this._recordResetPromise&&this._recordResetPromise.cancel();var a=this;this._recordResetPromise=k.timeout(ba).then(function(){0===a._pointerCount&&(a._resetPointerRecords(),a._recordResetPromise=null)})},_resetPinchDistanceRecords:function(){this._lastPinchDirection=ca.none,this._lastPinchDistance=-1,this._lastLastPinchDistance=-1,this._pinchDistanceCount=0,this._currentMidPoint=null},_getPointerLocation:function(a){var b={left:0,top:0};try{b=this._element.getBoundingClientRect()}catch(c){}var d=n._getComputedStyle(this._element,null),e=w(this._element,d.paddingLeft),f=w(this._element,d.paddingTop),g=w(this._element,d.borderLeftWidth);return{x:+a.clientX===a.clientX?a.clientX-b.left-e-g:0,y:+a.clientY===a.clientY?a.clientY-b.top-f-f:0}},_playBounce:function(a,b){if(i.isAnimationEnabled()&&this._isBouncingIn!==a){this._clearTimeout(this._completeZoomTimer),this._clearTimeout(this._TTFFTimer),this._isBouncing=!0,this._isBouncingIn=a,a?this._bounceCenter=b:this._aligned=!0;var c=this._zoomedOut?this._canvasOut:this._canvasIn,d=this._zoomedOut?this._canvasLeftOut:this._canvasLeftIn,e=this._zoomedOut?this._canvasTopOut:this._canvasTopIn;c.style[z["transform-origin"].scriptName]=d+this._bounceCenter.x+"px "+(e+this._bounceCenter.y)+"px",c.style[Y]=a?u():v(),this._zoomedOut?this._viewOut.beginZoom():this._viewIn.beginZoom();var f=a?this._zoomedOut?2-J:J:1;x(c,f),this.setTimeoutAfterTTFF(this._onBounceAnimationComplete.bind(this),i._animationTimeAdjustment(S))}},_rtl:function(){return"rtl"===n._getComputedStyle(this._element,null).direction},_pinching:{set:function(a){this._viewIn.pinching=a,this._viewOut.pinching=a}}});return b.Class.mix(ha,e.createEventProperties("zoomchanged")),b.Class.mix(ha,l.DOMEventMixin),ha})})}),d("WinJS/Controls/Pivot/_Constants",["require","exports"],function(a,b){b._ClassNames={pivot:"win-pivot",pivotCustomHeaders:"win-pivot-customheaders",pivotLocked:"win-pivot-locked",pivotTitle:"win-pivot-title",pivotHeaderArea:"win-pivot-header-area",pivotHeaderLeftCustom:"win-pivot-header-leftcustom",pivotHeaderRightCustom:"win-pivot-header-rightcustom",pivotHeaderItems:"win-pivot-header-items",pivotHeaders:"win-pivot-headers",
-pivotHeader:"win-pivot-header",pivotHeaderSelected:"win-pivot-header-selected",pivotViewport:"win-pivot-viewport",pivotSurface:"win-pivot-surface",pivotNoSnap:"win-pivot-nosnap",pivotNavButton:"win-pivot-navbutton",pivotNavButtonPrev:"win-pivot-navbutton-prev",pivotNavButtonNext:"win-pivot-navbutton-next",pivotShowNavButtons:"win-pivot-shownavbuttons",pivotInputTypeMouse:"win-pivot-mouse",pivotInputTypeTouch:"win-pivot-touch",pivotDisableContentSwipeNavigation:"win-pivot-disablecontentswipenavigation"}}),d("WinJS/Controls/Pivot/_Item",["exports","../../Core/_Global","../../Core/_Base","../../Core/_BaseUtils","../../Core/_ErrorFromName","../../Core/_Resources","../../ControlProcessor","../../Promise","../../Scheduler","../../Utilities/_Control","../../Utilities/_Dispose","../../Utilities/_ElementUtilities","./_Constants"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){"use strict";c.Namespace._moduleDefine(a,"WinJS.UI",{PivotItem:c.Namespace._lazy(function(){var a={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"}},f=c.Class.define(function(c,d){if(c=c||b.document.createElement("DIV"),d=d||{},c.winControl)throw new e("WinJS.UI.PivotItem.DuplicateConstruction",a.duplicateConstruction);c.winControl=this,this._element=c,l.addClass(this.element,f._ClassName.pivotItem),l.addClass(this.element,"win-disposable"),this._element.setAttribute("role","tabpanel"),this._contentElement=b.document.createElement("DIV"),this._contentElement.className=f._ClassName.pivotItemContent,c.appendChild(this._contentElement);for(var h=this.element.firstChild;h!==this._contentElement;){var i=h.nextSibling;this._contentElement.appendChild(h),h=i}this._processors=[g.processAll],j.setOptions(this,d)},{element:{get:function(){return this._element}},contentElement:{get:function(){return this._contentElement}},header:{get:function(){return this._header},set:function(a){this._header=a,this._parentPivot&&this._parentPivot._headersState.handleHeaderChanged(this)}},_parentPivot:{get:function(){for(var a=this._element;a&&!l.hasClass(a,m._ClassNames.pivot);)a=a.parentNode;return a&&a.winControl}},_process:function(){var a=this;return this._processors&&this._processors.push(function(){return i.schedulePromiseAboveNormal()}),this._processed=(this._processors||[]).reduce(function(b,c){return b.then(function(){return c(a.contentElement)})},this._processed||h.as()),this._processors=null,this._processed},dispose:function(){this._disposed||(this._disposed=!0,this._processors=null,k.disposeSubTree(this.contentElement))}},{_ClassName:{pivotItem:"win-pivot-item",pivotItemContent:"win-pivot-item-content"},isDeclarativeControlContainer:d.markSupportedForProcessing(function(a,b){b!==g.processAll&&(a._processors=a._processors||[],a._processors.push(b),a._processed&&a._process())})});return f})})}),d("require-style!less/styles-pivot",[],function(){}),d("require-style!less/colors-pivot",[],function(){});var e=this.__extends||function(a,b){function c(){this.constructor=a}for(var d in b)b.hasOwnProperty(d)&&(a[d]=b[d]);c.prototype=b.prototype,a.prototype=new c};d("WinJS/Controls/Pivot/_Pivot",["require","exports","../../Core/_Global","../../Animations","../../BindingList","../../ControlProcessor","../../Promise","../../Scheduler","../../Core/_Base","../../Core/_BaseUtils","../../Utilities/_Control","../../Utilities/_Dispose","../ElementResizeInstrument","../../Utilities/_ElementUtilities","../../Core/_ErrorFromName","../../Core/_Events","../../Utilities/_Hoverable","../../Utilities/_KeyboardBehavior","../../Core/_Log","../../Core/_Resources","../../Animations/_TransitionAnimation","../../Core/_WriteProfilerMark","./_Constants"],function(a,b,c,d,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x){function y(a){var b=c.document.createTextNode("object"==typeof a.header?JSON.stringify(a.header):""+a.header);return b}r.isHoverable,a(["require-style!less/styles-pivot"]),a(["require-style!less/colors-pivot"]);var z={selectionChanged:"selectionchanged",itemAnimationStart:"itemanimationstart",itemAnimationEnd:"itemanimationend"},A={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get duplicateItem(){return u._getWinJSString("ui/duplicateItem").value},get invalidContent(){return"Invalid content: Pivot content must be made up of PivotItems."},get pivotAriaLabel(){return u._getWinJSString("ui/pivotAriaLabel").value},get pivotViewportAriaLabel(){return u._getWinJSString("ui/pivotViewportAriaLabel").value}},B=!!(o._supportsSnapPoints&&"inertiaDestinationX"in c.MSManipulationEvent.prototype),C=o._MSPointerEvent.MSPOINTER_TYPE_MOUSE||"mouse",D=o._MSPointerEvent.MSPOINTER_TYPE_TOUCH||"touch",E=o.Key,F=250,G=-1,H=function(){function a(a,b){var d=this;if(void 0===b&&(b={}),this._disposed=!1,this._firstLoad=!0,this._hidePivotItemAnimation=h.wrap(),this._loadPromise=h.wrap(),this._pendingRefresh=!1,this._selectedIndex=0,this._showPivotItemAnimation=h.wrap(),this._slideHeadersAnimation=h.wrap(),a=a||c.document.createElement("DIV"),a.winControl)throw new p("WinJS.UI.Pivot.DuplicateConstruction",A.duplicateConstruction);this._handleItemChanged=this._handleItemChanged.bind(this),this._handleItemInserted=this._handleItemInserted.bind(this),this._handleItemMoved=this._handleItemMoved.bind(this),this._handleItemRemoved=this._handleItemRemoved.bind(this),this._handleItemReload=this._handleItemReload.bind(this),this._resizeHandler=this._resizeHandler.bind(this),this._updatePointerType=this._updatePointerType.bind(this),this._id=a.id||o._uniqueID(a),this._writeProfilerMark("constructor,StartTM"),a.winControl=this,this._element=a,this._element.setAttribute("role","tablist"),this._element.getAttribute("aria-label")||this._element.setAttribute("aria-label",A.pivotAriaLabel),o.addClass(this.element,x._ClassNames.pivot),o.addClass(this.element,"win-disposable"),o._addEventListener(this.element,"pointerenter",this._updatePointerType),o._addEventListener(this.element,"pointerout",this._updatePointerType),this._titleElement=c.document.createElement("DIV"),this._titleElement.style.display="none",o.addClass(this._titleElement,x._ClassNames.pivotTitle),this._element.appendChild(this._titleElement),this._headerAreaElement=c.document.createElement("DIV"),o.addClass(this._headerAreaElement,x._ClassNames.pivotHeaderArea),this._element.appendChild(this._headerAreaElement),this._headerItemsElement=c.document.createElement("DIV"),o.addClass(this._headerItemsElement,x._ClassNames.pivotHeaderItems),this._headerAreaElement.appendChild(this._headerItemsElement),this._headerItemsElWidth=null,this._headersContainerElement=c.document.createElement("DIV"),this._headersContainerElement.tabIndex=0,o.addClass(this._headersContainerElement,x._ClassNames.pivotHeaders),this._headersContainerElement.addEventListener("keydown",this._headersKeyDown.bind(this)),o._addEventListener(this._headersContainerElement,"pointerenter",this._showNavButtons.bind(this)),o._addEventListener(this._headersContainerElement,"pointerout",this._hideNavButtons.bind(this)),this._headerItemsElement.appendChild(this._headersContainerElement),this._element.addEventListener("click",this._elementClickedHandler.bind(this)),this._winKeyboard=new s._WinKeyboard(this._headersContainerElement),this._customLeftHeader=c.document.createElement("DIV"),o.addClass(this._customLeftHeader,x._ClassNames.pivotHeaderLeftCustom),this._headerAreaElement.insertBefore(this._customLeftHeader,this._headerAreaElement.children[0]),this._customRightHeader=c.document.createElement("DIV"),o.addClass(this._customRightHeader,x._ClassNames.pivotHeaderRightCustom),this._headerAreaElement.appendChild(this._customRightHeader),this._viewportElement=c.document.createElement("DIV"),this._viewportElement.className=x._ClassNames.pivotViewport,this._element.appendChild(this._viewportElement),this._viewportElement.setAttribute("role","group"),this._viewportElement.setAttribute("aria-label",A.pivotViewportAriaLabel),this._elementResizeInstrument=new n._ElementResizeInstrument,this._element.appendChild(this._elementResizeInstrument.element),this._elementResizeInstrument.addEventListener("resize",this._resizeHandler),o._inDom(this._element).then(function(){d._disposed||d._elementResizeInstrument.addedToDom()}),o._resizeNotifier.subscribe(this.element,this._resizeHandler),this._viewportElWidth=null,this._surfaceElement=c.document.createElement("DIV"),this._surfaceElement.className=x._ClassNames.pivotSurface,this._viewportElement.appendChild(this._surfaceElement),this._headersState=new I(this),B?this._viewportElement.addEventListener("MSManipulationStateChanged",this._MSManipulationStateChangedHandler.bind(this)):(o.addClass(this.element,x._ClassNames.pivotNoSnap),o._addEventListener(this._element,"pointerdown",this._elementPointerDownHandler.bind(this)),o._addEventListener(this._element,"pointerup",this._elementPointerUpHandler.bind(this))),this._parse(),b=k._shallowCopy(b),b.items&&(this.items=b.items,delete b.items),l.setOptions(this,b),this._refresh(),this._writeProfilerMark("constructor,StopTM")}return Object.defineProperty(a.prototype,"element",{get:function(){return this._element},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"customLeftHeader",{get:function(){return this._customLeftHeader.firstElementChild},set:function(a){o.empty(this._customLeftHeader),a?(this._customLeftHeader.appendChild(a),o.addClass(this._element,x._ClassNames.pivotCustomHeaders)):this._customLeftHeader.children.length||this._customRightHeader.childNodes.length||o.removeClass(this._element,x._ClassNames.pivotCustomHeaders),this.forceLayout()},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"customRightHeader",{get:function(){return this._customRightHeader.firstElementChild},set:function(a){o.empty(this._customRightHeader),a?(this._customRightHeader.appendChild(a),o.addClass(this._element,x._ClassNames.pivotCustomHeaders)):this._customLeftHeader.children.length||this._customRightHeader.childNodes.length||o.removeClass(this._element,x._ClassNames.pivotCustomHeaders),this.forceLayout()},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"locked",{get:function(){return o.hasClass(this.element,x._ClassNames.pivotLocked)},set:function(a){o[a?"addClass":"removeClass"](this.element,x._ClassNames.pivotLocked),a&&this._hideNavButtons()},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"items",{get:function(){return this._pendingItems?this._pendingItems:this._items},set:function(a){this._pendingItems=a,this._refresh()},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"title",{get:function(){return this._titleElement.textContent},set:function(a){a?(this._titleElement.style.display="block",this._titleElement.textContent=a):(this._titleElement.style.display="none",this._titleElement.textContent="")},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"selectedIndex",{get:function(){return 0===this.items.length?-1:this._selectedIndex},set:function(a){a>=0&&a<this.items.length&&(this._pendingRefresh?this._selectedIndex=a:this._loadItem(a))},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"selectedItem",{get:function(){return this.items.getAt(this.selectedIndex)},set:function(a){var b=this.items.indexOf(a);-1!==b&&(this.selectedIndex=b)},enumerable:!0,configurable:!0}),a.prototype.dispose=function(){if(!this._disposed){this._disposed=!0,this._updateEvents(this._items,null),o._resizeNotifier.unsubscribe(this.element,this._resizeHandler),this._elementResizeInstrument.dispose(),this._headersState.exit(),m._disposeElement(this._headersContainerElement);for(var a=0,b=this.items.length;b>a;a++)this.items.getAt(a).dispose()}},a.prototype.forceLayout=function(){this._disposed||this._resizeHandler()},a.prototype._applyProperties=function(){function a(a){for(var b=0,c=a.items.length;c>b;b++){var d=a._items.getAt(b);if(d.element.parentNode===a._surfaceElement)throw new p("WinJS.UI.Pivot.DuplicateItem",A.duplicateItem);d.element.style.display="none",a._surfaceElement.appendChild(d.element)}}if(!this._disposed){if(this._pendingItems){for(this._updateEvents(this._items,this._pendingItems),this._items=this._pendingItems,this._pendingItems=null;this.element.firstElementChild!==this._titleElement;){var b=this.element.firstElementChild;b.parentNode.removeChild(b)}o.empty(this._surfaceElement)}a(this),this._rtl="rtl"===o._getComputedStyle(this._element,null).direction,this._headersState.refreshHeadersState(!0),this._pendingRefresh=!1,this._firstLoad=!0,this.selectedIndex=this._selectedIndex,this._firstLoad=!1,this._recenterViewport()}},a.prototype._parse=function(){for(var a=[],b=this.element.firstElementChild;b!==this._titleElement;){g.processAll(b);var c=b.winControl;if(!c)throw new p("WinJS.UI.Pivot.InvalidContent",A.invalidContent);a.push(c);var d=b.nextElementSibling;b=d}this.items=new f.List(a)},a.prototype._refresh=function(){this._pendingRefresh||(this._pendingRefresh=!0,i.schedule(this._applyProperties.bind(this),i.Priority.high))},a.prototype._resizeHandler=function(){if(!this._disposed&&!this._pendingRefresh){var a=this._getViewportWidth(),b=this._getHeaderItemsWidth();this._invalidateMeasures(),a!==this._getViewportWidth()||b!==this._getHeaderItemsWidth()?(t.log&&t.log("_resizeHandler, viewport from:"+a+" to: "+this._getViewportWidth()),t.log&&t.log("_resizeHandler, headers from:"+b+" to: "+this._getHeaderItemsWidth()),this._hidePivotItemAnimation&&this._hidePivotItemAnimation.cancel(),this._showPivotItemAnimation&&this._showPivotItemAnimation.cancel(),this._slideHeadersAnimation&&this._slideHeadersAnimation.cancel(),this._recenterViewport(),this._headersState.handleResize()):t.log&&t.log("_resizeHandler worthless resize")}},a.prototype._activateHeader=function(a){if(!this.locked){var b=this._items.indexOf(a._item);b!==this.selectedIndex?this._headersState.activateHeader(a):o._setActiveFirstFocusableElement(this.selectedItem.element)}},a.prototype._goNext=function(){this.selectedIndex<this._items.length-1?this.selectedIndex++:this.selectedIndex=0},a.prototype._goPrevious=function(){this._animateToPrevious=!0,this.selectedIndex>0?this.selectedIndex--:this.selectedIndex=this._items.length-1,this._animateToPrevious=!1},a.prototype._loadItem=function(a){var b=this;this._rtl="rtl"===o._getComputedStyle(this._element,null).direction,this._hidePivotItemAnimation.cancel(),this._showPivotItemAnimation.cancel(),this._slideHeadersAnimation.cancel();var c=this._animateToPrevious,d=this._items.getAt(a),e=this._firstLoad,f=this._loadPromise=this._loadPromise.then(function(){var g=b._items.getAt(b.selectedIndex);g&&b._hidePivotItem(g.element,c,e);var i=b._selectedIndex;b._selectedIndex=a;var j={index:a,direction:c?"backwards":"forward",item:d};return b._fireEvent(z.selectionChanged,!0,!1,j),b._headersState.handleNavigation(c,a,i),h.join([d._process(),b._hidePivotItemAnimation,h.timeout()]).then(function(){return b._disposed||b._loadPromise!==f?void 0:(b._recenterViewport(),b._showPivotItem(d.element,c,e).then(function(){b._disposed||b._loadPromise!==f||(b._loadPromise=h.wrap(),b._writeProfilerMark("itemAnimationStop,info"),b._fireEvent(z.itemAnimationEnd,!0,!1,null))}))})})},a.prototype._recenterViewport=function(){o.setScrollPosition(this._viewportElement,{scrollLeft:this._getViewportWidth()}),this.selectedItem&&(this.selectedItem.element.style[this._getDirectionAccessor()]=this._getViewportWidth()+"px")},a.prototype._fireEvent=function(a,b,d,e){var f=c.document.createEvent("CustomEvent");return f.initCustomEvent(a,!!b,!!d,e),this.element.dispatchEvent(f)},a.prototype._getDirectionAccessor=function(){return this._rtl?"right":"left"},a.prototype._getHeaderItemsWidth=function(){return this._headerItemsElWidth||(this._headerItemsElWidth=parseFloat(o._getComputedStyle(this._headerItemsElement).width)),this._headerItemsElWidth||G},a.prototype._getViewportWidth=function(){return this._viewportElWidth||(this._viewportElWidth=parseFloat(o._getComputedStyle(this._viewportElement).width),B&&(this._viewportElement.style[k._browserStyleEquivalents["scroll-snap-points-x"].scriptName]="snapInterval(0%, "+Math.ceil(this._viewportElWidth)+"px)")),this._viewportElWidth||G},a.prototype._invalidateMeasures=function(){this._viewportElWidth=this._headerItemsElWidth=null},a.prototype._updateEvents=function(a,b){a&&(a.removeEventListener("itemchanged",this._handleItemChanged),a.removeEventListener("iteminserted",this._handleItemInserted),a.removeEventListener("itemmoved",this._handleItemMoved),a.removeEventListener("itemremoved",this._handleItemRemoved),a.removeEventListener("reload",this._handleItemReload)),b&&(b.addEventListener("itemchanged",this._handleItemChanged),b.addEventListener("iteminserted",this._handleItemInserted),b.addEventListener("itemmoved",this._handleItemMoved),b.addEventListener("itemremoved",this._handleItemRemoved),b.addEventListener("reload",this._handleItemReload))},a.prototype._writeProfilerMark=function(a){var b="WinJS.UI.Pivot:"+this._id+":"+a;w(b),t.log&&t.log(b,null,"pivotprofiler")},a.prototype._handleItemChanged=function(a){if(!this._pendingItems){var b=a.detail.index,c=a.detail.newValue,d=a.detail.oldValue;if(c.element!==d.element){if(c.element.parentNode===this._surfaceElement)throw new p("WinJS.UI.Pivot.DuplicateItem",A.duplicateItem);c.element.style.display="none",this._surfaceElement.insertBefore(c.element,d.element),this._surfaceElement.removeChild(d.element),b===this.selectedIndex&&(this.selectedIndex=b)}this._headersState.render(),this._headersState.refreshHeadersState(!0)}},a.prototype._handleItemInserted=function(a){if(!this._pendingItems){var b=a.detail.index,c=a.detail.value;if(c.element.parentNode===this._surfaceElement)throw new p("WinJS.UI.Pivot.DuplicateItem",A.duplicateItem);c.element.style.display="none",b<this.items.length-1?this._surfaceElement.insertBefore(c.element,this.items.getAt(b+1).element):this._surfaceElement.appendChild(c.element),this._headersState.render(),this._headersState.refreshHeadersState(!0),b<=this.selectedIndex&&this._selectedIndex++,1===this._items.length&&(this.selectedIndex=0)}},a.prototype._handleItemMoved=function(a){if(!this._pendingItems){var b=a.detail.oldIndex,c=a.detail.newIndex,d=a.detail.value;c<this.items.length-1?this._surfaceElement.insertBefore(d.element,this.items.getAt(c+1).element):this._surfaceElement.appendChild(d.element),b<this.selectedIndex&&c>=this.selectedIndex?this._selectedIndex--:c>this.selectedIndex&&b<=this.selectedIndex?this._selectedIndex++:b===this.selectedIndex&&(this.selectedIndex=this.selectedIndex),this._headersState.render(),this._headersState.refreshHeadersState(!0)}},a.prototype._handleItemReload=function(){this.items=this.items},a.prototype._handleItemRemoved=function(a){if(!this._pendingItems){var b=a.detail.value,c=a.detail.index;this._surfaceElement.removeChild(b.element),c<this.selectedIndex?this._selectedIndex--:c===this._selectedIndex&&(this.selectedIndex=Math.min(this.items.length-1,this._selectedIndex)),this._headersState.render(),this._headersState.refreshHeadersState(!0)}},a.prototype._elementClickedHandler=function(a){if(this.locked||this._navigationHandled)return void(this._navigationHandled=!1);var b,c=a.target;if(o.hasClass(c,x._ClassNames.pivotHeader))b=c;else{var d=!1,e=o._elementsFromPoint(a.clientX,a.clientY);if(e&&e[0]===this._viewportElement)for(var f=0,g=e.length;g>f;f++)e[f]===c&&(d=!0),o.hasClass(e[f],x._ClassNames.pivotHeader)&&(b=e[f]);d||(b=null)}b&&this._activateHeader(b)},a.prototype._elementPointerDownHandler=function(a){if(!B){var b=a.target;this._elementPointerDownPoint={x:a.clientX,y:a.clientY,type:a.pointerType||"mouse",time:Date.now(),inHeaders:this._headersContainerElement.contains(b)}}},a.prototype._elementPointerUpHandler=function(a){if(!this._elementPointerDownPoint||this.locked)return void(this._elementPointerDownPoint=null);var b=a.target,c=32,d=.4,e=Math.abs(a.clientY-this._elementPointerDownPoint.y),f=a.clientX-this._elementPointerDownPoint.x,g=Math.abs(f*d),h=g>e&&Math.abs(f)>c&&(!o._supportsTouchDetection||this._elementPointerDownPoint.type===a.pointerType&&a.pointerType===D)&&(!this.element.classList.contains(x._ClassNames.pivotDisableContentSwipeNavigation)||this._elementPointerDownPoint.inHeaders&&this._headersContainerElement.contains(b));if(this._navigationHandled=!1,h){var i=Date.now()-this._elementPointerDownPoint.time;f*=Math.max(1,Math.pow(350/i,2)),f=this._rtl?-f:f;var j=this._getViewportWidth()/4;-j>f?(this._goNext(),this._navigationHandled=!0):f>j&&(this._goPrevious(),this._navigationHandled=!0)}if(!this._navigationHandled){for(;null!==b&&!o.hasClass(b,x._ClassNames.pivotHeader);)b=b.parentElement;null!==b&&(this._activateHeader(b),this._navigationHandled=!0)}this._elementPointerDownPoint=null},a.prototype._headersKeyDown=function(a){this.locked||(a.keyCode===E.leftArrow||a.keyCode===E.pageUp?(this._rtl?this._goNext():this._goPrevious(),a.preventDefault()):a.keyCode!==E.rightArrow&&a.keyCode!==E.pageDown||(this._rtl?this._goPrevious():this._goNext(),a.preventDefault()))},a.prototype._hideNavButtons=function(a){a&&this._headersContainerElement.contains(a.relatedTarget)||o.removeClass(this._headersContainerElement,x._ClassNames.pivotShowNavButtons)},a.prototype._hidePivotItem=function(a,b,c){return c||!v.isAnimationEnabled()?(a.style.display="none",this._hidePivotItemAnimation=h.wrap(),this._hidePivotItemAnimation):(this._hidePivotItemAnimation=v.executeTransition(a,{property:"opacity",delay:0,duration:67,timing:"linear",from:"",to:"0"}).then(function(){a.style.display="none"}),this._hidePivotItemAnimation)},a.prototype._MSManipulationStateChangedHandler=function(a){if(a.target===this._viewportElement&&a.currentState===o._MSManipulationEvent.MS_MANIPULATION_STATE_INERTIA){var b=a.inertiaDestinationX-this._getViewportWidth();b>0?this._goNext():0>b&&this._goPrevious()}},a.prototype._updatePointerType=function(a){this._pointerType!==(a.pointerType||C)&&(this._pointerType=a.pointerType||C,this._pointerType===D?(o.removeClass(this.element,x._ClassNames.pivotInputTypeMouse),o.addClass(this.element,x._ClassNames.pivotInputTypeTouch),this._hideNavButtons()):(o.removeClass(this.element,x._ClassNames.pivotInputTypeTouch),o.addClass(this.element,x._ClassNames.pivotInputTypeMouse)))},a.prototype._showNavButtons=function(a){this.locked||a&&a.pointerType===D||o.addClass(this._headersContainerElement,x._ClassNames.pivotShowNavButtons)},a.prototype._showPivotItem=function(a,b,c){function e(a){var b=a.getBoundingClientRect();return b.top<g.bottom&&b.bottom>g.top}if(this._writeProfilerMark("itemAnimationStart,info"),this._fireEvent(z.itemAnimationStart,!0,!1,null),a.style.display="",c||!v.isAnimationEnabled())return a.style.opacity="",this._showPivotItemAnimation=h.wrap(),this._showPivotItemAnimation;var f=this._rtl?!b:b,g=this._viewportElement.getBoundingClientRect(),i=a.querySelectorAll(".win-pivot-slide1"),j=a.querySelectorAll(".win-pivot-slide2"),l=a.querySelectorAll(".win-pivot-slide3");return i=Array.prototype.filter.call(i,e),j=Array.prototype.filter.call(j,e),l=Array.prototype.filter.call(l,e),this._showPivotItemAnimation=h.join([v.executeTransition(a,{property:"opacity",delay:0,duration:333,timing:"cubic-bezier(0.1,0.9,0.2,1)",from:"0",to:""}),v.executeTransition(a,{property:k._browserStyleEquivalents.transform.cssName,delay:0,duration:767,timing:"cubic-bezier(0.1,0.9,0.2,1)",from:"translateX("+(f?"-20px":"20px")+")",to:""}),d[f?"slideRightIn":"slideLeftIn"](null,i,j,l)]),this._showPivotItemAnimation},a.supportedForProcessing=!0,a._ClassNames=x._ClassNames,a._EventNames=z,a}();b.Pivot=H;var I=function(){function a(a){this.pivot=a}return a.prototype.exit=function(){},a.prototype.render=function(a){},a.prototype.activateHeader=function(a){},a.prototype.handleNavigation=function(a,b,c){},a.prototype.handleResize=function(){},a.prototype.handleHeaderChanged=function(a){},a.prototype.getCumulativeHeaderWidth=function(b){if(0===b)return 0;for(var c=this.pivot._headersContainerElement.children.length,d=0;b>d;d++){var e=this.renderHeader(d,!1);this.pivot._headersContainerElement.appendChild(e)}var f=0,g=this.pivot._rtl?this.pivot._headersContainerElement.lastElementChild:this.pivot._headersContainerElement.children[c],h=this.pivot._rtl?this.pivot._headersContainerElement.children[c]:this.pivot._headersContainerElement.lastElementChild;f=h.offsetLeft+h.offsetWidth-g.offsetLeft,f+=2*a.headerHorizontalMargin;for(var d=0;b>d;d++)this.pivot._headersContainerElement.removeChild(this.pivot._headersContainerElement.lastElementChild);return f},a.prototype.refreshHeadersState=function(a){a&&(this.cachedHeaderWidth=0);var b=this.cachedHeaderWidth||this.getCumulativeHeaderWidth(this.pivot.items.length);this.cachedHeaderWidth=b,b>this.pivot._getHeaderItemsWidth()&&!(this.pivot._headersState instanceof K)?(this.exit(),this.pivot._headersState=new K(this.pivot)):b<=this.pivot._getHeaderItemsWidth()&&!(this.pivot._headersState instanceof J)&&(this.exit(),this.pivot._headersState=new J(this.pivot))},a.prototype.renderHeader=function(b,d){function e(){f.pivot._disposed||f.pivot._headersContainerElement.contains(i)&&b!==f.pivot.selectedIndex&&"true"===i.getAttribute("aria-selected")&&(f.pivot.selectedIndex=b)}var f=this,g=o._syncRenderer(y),h=this.pivot.items.getAt(b),i=c.document.createElement("BUTTON");return i.tabIndex=-1,i.setAttribute("type","button"),i.style.marginLeft=i.style.marginRight=a.headerHorizontalMargin+"px",o.addClass(i,x._ClassNames.pivotHeader),i._item=h,i._pivotItemIndex=b,g(h,i),d&&(i.setAttribute("aria-selected",""+(b===this.pivot.selectedIndex)),i.setAttribute("role","tab"),new o._MutationObserver(e).observe(i,{attributes:!0,attributeFilter:["aria-selected"]})),i},a.prototype.updateHeader=function(a){var b=this.pivot.items.indexOf(a),c=this.pivot._headersContainerElement.children[b];c.innerHTML="";var d=o._syncRenderer(y);d(a,c)},a.prototype.setActiveHeader=function(a){var b=!1,d=this.pivot._headersContainerElement.querySelector("."+x._ClassNames.pivotHeaderSelected);d&&(d.classList.remove(x._ClassNames.pivotHeaderSelected),d.setAttribute("aria-selected","false"),b=this.pivot._headersContainerElement.contains(c.document.activeElement)),a.classList.add(x._ClassNames.pivotHeaderSelected),a.setAttribute("aria-selected","true"),b&&this.pivot._headersContainerElement.focus()},a.headersContainerLeadingMargin=12,a.headerHorizontalMargin=12,a}(),J=function(a){function b(b){if(a.call(this,b),this._firstRender=!0,this._transitionAnimation=h.wrap(),b._headersContainerElement.children.length&&v.isAnimationEnabled()){var c=b._headersContainerElement.querySelector("."+x._ClassNames.pivotHeaderSelected),d=0,e=0;b._rtl?(d=c.offsetLeft+c.offsetWidth+I.headerHorizontalMargin,e=b._getHeaderItemsWidth()-this.getCumulativeHeaderWidth(b.selectedIndex)-I.headersContainerLeadingMargin,e+=parseFloat(b._headersContainerElement.style.marginLeft)):(d=c.offsetLeft,d+=parseFloat(b._headersContainerElement.style.marginLeft),e=this.getCumulativeHeaderWidth(b.selectedIndex)+I.headersContainerLeadingMargin+I.headerHorizontalMargin);var f=d-e;this.render();for(var g=k._browserStyleEquivalents.transform.cssName,i="translateX("+f+"px)",j=0,l=b._headersContainerElement.children.length;l>j;j++)b._headersContainerElement.children[j].style[g]=i;this._transitionAnimation=v.executeTransition(b._headersContainerElement.querySelectorAll("."+x._ClassNames.pivotHeader),{property:g,delay:0,duration:F,timing:"ease-out",to:""})}else this.render()}return e(b,a),b.prototype.exit=function(){this._transitionAnimation.cancel()},b.prototype.render=function(){var a=this.pivot;if(!a._pendingRefresh&&a._items){if(m._disposeElement(a._headersContainerElement),o.empty(a._headersContainerElement),a._rtl?(a._headersContainerElement.style.marginLeft="0px",a._headersContainerElement.style.marginRight=I.headersContainerLeadingMargin+"px"):(a._headersContainerElement.style.marginLeft=I.headersContainerLeadingMargin+"px",a._headersContainerElement.style.marginRight="0px"),a._viewportElement.style.overflow=1===a.items.length?"hidden":"",a.items.length)for(var b=0;b<a.items.length;b++){var c=this.renderHeader(b,!0);a._headersContainerElement.appendChild(c),b===a.selectedIndex&&c.classList.add(x._ClassNames.pivotHeaderSelected)}this._firstRender=!1}},b.prototype.activateHeader=function(a){this.setActiveHeader(a),this.pivot._animateToPrevious=a._pivotItemIndex<this.pivot.selectedIndex,this.pivot.selectedIndex=a._pivotItemIndex,this.pivot._animateToPrevious=!1},b.prototype.handleNavigation=function(a,b,c){this._firstRender&&this.render(),this.setActiveHeader(this.pivot._headersContainerElement.children[b])},b.prototype.handleResize=function(){this.refreshHeadersState(!1)},b.prototype.handleHeaderChanged=function(a){this.updateHeader(a),this.refreshHeadersState(!0)},b}(I),K=function(a){function b(b){if(a.call(this,b),this._blocked=!1,this._firstRender=!0,this._transitionAnimation=h.wrap(),b._slideHeadersAnimation=h.wrap(),b._headersContainerElement.children.length&&v.isAnimationEnabled()){var c=this,d=function(){c._blocked=!1,c.render()};this._blocked=!0;var e=b._headersContainerElement.querySelector("."+x._ClassNames.pivotHeaderSelected),f=0,g=0;b._rtl?(f=b._getHeaderItemsWidth()-I.headersContainerLeadingMargin,g=e.offsetLeft,g+=I.headerHorizontalMargin,g+=e.offsetWidth,g+=parseFloat(b._headersContainerElement.style.marginLeft)):(f=I.headersContainerLeadingMargin,g=e.offsetLeft,g-=I.headerHorizontalMargin,g+=parseFloat(b._headersContainerElement.style.marginLeft));for(var i=f-g,j=0;j<b.selectedIndex;j++)b._headersContainerElement.appendChild(b._headersContainerElement.children[j].cloneNode(!0));var l=k._browserStyleEquivalents.transform.cssName;this._transitionAnimation=v.executeTransition(b._headersContainerElement.querySelectorAll("."+x._ClassNames.pivotHeader),{property:l,delay:0,duration:F,timing:"ease-out",to:"translateX("+i+"px)"}).then(d,d)}else this.render()}return e(b,a),b.prototype.exit=function(){this._transitionAnimation.cancel(),this.pivot._slideHeadersAnimation.cancel()},b.prototype.render=function(a){var b=this.pivot;if(!this._blocked&&!b._pendingRefresh&&b._items){var d=b._headersContainerElement.contains(c.document.activeElement);if(m._disposeElement(b._headersContainerElement),o.empty(b._headersContainerElement),1===b._items.length){var e=this.renderHeader(0,!0);e.classList.add(x._ClassNames.pivotHeaderSelected),b._headersContainerElement.appendChild(e),b._viewportElement.style.overflow="hidden",b._headersContainerElement.style.marginLeft="0px",b._headersContainerElement.style.marginRight="0px"}else if(b._items.length>1){var f=b._items.length+(a?2:1),g=.8*b._getHeaderItemsWidth(),h=b.selectedIndex-1;b._viewportElement.style.overflow&&(b._viewportElement.style.overflow="");for(var i=0;f>i;i++){-1===h?h=b._items.length-1:h===b._items.length&&(h=0);var e=this.renderHeader(h,!0);b._headersContainerElement.appendChild(e),e.offsetWidth>g&&(e.style.textOverflow="ellipsis",e.style.width=g+"px"),h===b.selectedIndex&&e.classList.add(x._ClassNames.pivotHeaderSelected),h++}if(!b._firstLoad&&!this._firstRender){var j,l;a?(j="",l="0"):(j="0",l="");var n=b._headersContainerElement.children[f-1];n.style.opacity=j;var p=.167;n.style[k._browserStyleEquivalents.transition.scriptName]="opacity "+v._animationTimeAdjustment(p)+"s",o._getComputedStyle(n).opacity,n.style.opacity=l}b._headersContainerElement.children[0].setAttribute("aria-hidden","true"),b._headersContainerElement.style.marginLeft="0px",b._headersContainerElement.style.marginRight="0px";var q=b._rtl?"marginRight":"marginLeft",r=b._headersContainerElement.children[0],s=o.getTotalWidth(r)-I.headersContainerLeadingMargin;if(r!==b._headersContainerElement.children[0])return;b._headersContainerElement.style[q]=-1*s+"px",b._prevButton=c.document.createElement("button"),b._prevButton.setAttribute("type","button"),o.addClass(b._prevButton,x._ClassNames.pivotNavButton),o.addClass(b._prevButton,x._ClassNames.pivotNavButtonPrev),
-b._prevButton.addEventListener("click",function(){b.locked||(b._rtl?b._goNext():b._goPrevious())}),b._headersContainerElement.appendChild(b._prevButton),b._prevButton.style.left=b._rtl?"0px":s+"px",b._nextButton=c.document.createElement("button"),b._nextButton.setAttribute("type","button"),o.addClass(b._nextButton,x._ClassNames.pivotNavButton),o.addClass(b._nextButton,x._ClassNames.pivotNavButtonNext),b._nextButton.addEventListener("click",function(){b.locked||(b._rtl?b._goPrevious():b._goNext())}),b._headersContainerElement.appendChild(b._nextButton),b._nextButton.style.right=b._rtl?s+"px":"0px"}b._headersContainerElement.children.length>1?1:0;d&&b._headersContainerElement.focus(),this._firstRender=!1}},b.prototype.activateHeader=function(a){a.previousSibling&&(this.pivot.selectedIndex=a._pivotItemIndex)},b.prototype.handleNavigation=function(a,b,c){function d(a){return j?a.offsetParent.offsetWidth-a.offsetLeft-a.offsetWidth:a.offsetLeft}function e(){g._disposed||(f.render(a),g._slideHeadersAnimation=h.wrap())}var f=this,g=this.pivot;if(this._blocked||0>b||g._firstLoad)return void this.render(a);var i;if(a?i=g._headersContainerElement.children[0]:(c>b&&(b+=g._items.length),i=g._headersContainerElement.children[1+b-c]),!i)return void this.render(a);o.removeClass(g._headersContainerElement.children[1],x._ClassNames.pivotHeaderSelected),o.addClass(i,x._ClassNames.pivotHeaderSelected);var j=g._rtl,l=d(g._headersContainerElement.children[1])-d(i);j&&(l*=-1);var m;m=v.isAnimationEnabled()?v.executeTransition(g._headersContainerElement.querySelectorAll("."+x._ClassNames.pivotHeader),{property:k._browserStyleEquivalents.transform.cssName,delay:0,duration:F,timing:"ease-out",to:"translateX("+l+"px)"}):h.wrap(),g._slideHeadersAnimation=m.then(e,e)},b.prototype.handleResize=function(){this.refreshHeadersState(!1)},b.prototype.handleHeaderChanged=function(a){this.render(),this.refreshHeadersState(!0)},b}(I);j.Class.mix(H,q.createEventProperties(z.itemAnimationEnd,z.itemAnimationStart,z.selectionChanged)),j.Class.mix(H,l.DOMEventMixin)}),d("WinJS/Controls/Pivot",["require","exports","../Core/_Base","./Pivot/_Item"],function(a,b,c,d){d.touch;var e=null;c.Namespace.define("WinJS.UI",{Pivot:{get:function(){return e||a(["./Pivot/_Pivot"],function(a){e=a}),e.Pivot}}})}),d("WinJS/Controls/Hub/_Section",["exports","../../Core/_Global","../../Core/_Base","../../Core/_BaseUtils","../../Core/_ErrorFromName","../../Core/_Resources","../../ControlProcessor","../../Promise","../../Utilities/_Control","../../Utilities/_Dispose","../../Utilities/_ElementUtilities","../../Utilities/_KeyboardBehavior"],function(a,b,c,d,e,f,g,h,i,j,k,l){"use strict";c.Namespace._moduleDefine(a,"WinJS.UI",{HubSection:c.Namespace._lazy(function(){var a={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get seeMore(){return f._getWinJSString("ui/seeMore").value}},m=c.Class.define(function(c,d){if(c=c||b.document.createElement("DIV"),d=d||{},c.winControl)throw new e("WinJS.UI.HubSection.DuplicateConstruction",a.duplicateConstruction);c.winControl=this,this._element=c,k.addClass(this.element,m._ClassName.hubSection),k.addClass(this.element,"win-disposable"),this._headerElement=b.document.createElement("DIV"),this._headerElement.className=m._ClassName.hubSectionHeader,this._headerElement.innerHTML='<button type="button" role="link" class="'+m._ClassName.hubSectionInteractive+" "+m._ClassName.hubSectionHeaderTabStop+'"><div class="'+m._ClassName.hubSectionHeaderWrapper+'" tabindex="-1"><h2 class="win-type-subheader '+m._ClassName.hubSectionHeaderContent+'"></h2><span class="'+m._ClassName.hubSectionHeaderChevron+' win-type-body">'+a.seeMore+"</span></div></button>",this._headerTabStopElement=this._headerElement.firstElementChild,this._headerWrapperElement=this._headerTabStopElement.firstElementChild,this._headerContentElement=this._headerWrapperElement.firstElementChild,this._headerChevronElement=this._headerWrapperElement.lastElementChild,c.appendChild(this._headerElement),this._winKeyboard=new l._WinKeyboard(this._headerElement),this._contentElement=b.document.createElement("DIV"),this._contentElement.className=m._ClassName.hubSectionContent,this._contentElement.style.visibility="hidden",c.appendChild(this._contentElement);for(var f=this.element.firstChild;f!==this._headerElement;){var h=f.nextSibling;this._contentElement.appendChild(f),f=h}this._processors=[g.processAll],i.setOptions(this,d)},{element:{get:function(){return this._element}},isHeaderStatic:{get:function(){return this._isHeaderStatic},set:function(a){this._isHeaderStatic=a,this._isHeaderStatic?(this._headerTabStopElement.setAttribute("role","heading"),k.removeClass(this._headerTabStopElement,m._ClassName.hubSectionInteractive)):(this._headerTabStopElement.setAttribute("role","link"),k.addClass(this._headerTabStopElement,m._ClassName.hubSectionInteractive))}},contentElement:{get:function(){return this._contentElement}},header:{get:function(){return this._header},set:function(a){this._header=a,this._renderHeader()}},_setHeaderTemplate:function(a){this._template=k._syncRenderer(a),this._renderHeader()},_renderHeader:function(){this._template&&(j._disposeElement(this._headerContentElement),k.empty(this._headerContentElement),this._template(this,this._headerContentElement))},_process:function(){var a=this;return this._processed=(this._processors||[]).reduce(function(b,c){return b.then(function(){return c(a.contentElement)})},this._processed||h.as()),this._processors=null,this._processed},dispose:function(){this._disposed||(this._disposed=!0,this._processors=null,j._disposeElement(this._headerContentElement),j.disposeSubTree(this.contentElement))}},{_ClassName:{hubSection:"win-hub-section",hubSectionHeader:"win-hub-section-header",hubSectionHeaderTabStop:"win-hub-section-header-tabstop",hubSectionHeaderWrapper:"win-hub-section-header-wrapper",hubSectionInteractive:"win-hub-section-header-interactive",hubSectionHeaderContent:"win-hub-section-header-content",hubSectionHeaderChevron:"win-hub-section-header-chevron",hubSectionContent:"win-hub-section-content"},isDeclarativeControlContainer:d.markSupportedForProcessing(function(a,b){b!==g.processAll&&(a._processors=a._processors||[],a._processors.push(b),a._processed&&a._process())})});return m})})}),d("require-style!less/styles-hub",[],function(){}),d("require-style!less/colors-hub",[],function(){}),d("WinJS/Controls/Hub",["../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Events","../Core/_Log","../Core/_Resources","../Core/_WriteProfilerMark","../_Accents","../Animations","../Animations/_TransitionAnimation","../BindingList","../ControlProcessor","../Promise","../_Signal","../Scheduler","../Utilities/_Control","../Utilities/_ElementUtilities","../Utilities/_Hoverable","../Utilities/_UI","./ElementResizeInstrument","./Hub/_Section","require-style!less/styles-hub","require-style!less/colors-hub"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v){"use strict";i.createAccentRule(".win-semanticzoom-zoomedoutview .win-hub-section-header-interactive .win-hub-section-header-content,             .win-hub-section-header-interactive .win-hub-section-header-chevron",[{name:"color",value:i.ColorTypes.accent}]),b.Namespace.define("WinJS.UI",{Hub:b.Namespace._lazy(function(){function i(b){var c=a.document.createTextNode("object"==typeof b.header?JSON.stringify(b.header):""+b.header);return c}var s=r.Key,w=e._createEventProperty,x={contentAnimating:"contentanimating",headerInvoked:"headerinvoked",loadingStateChanged:"loadingstatechanged"},y=500,z={scrollPos:"scrollTop",scrollSize:"scrollHeight",offsetPos:"offsetTop",offsetSize:"offsetHeight",oppositeOffsetSize:"offsetWidth",marginStart:"marginTop",marginEnd:"marginBottom",borderStart:"borderTopWidth",borderEnd:"borderBottomWidth",paddingStart:"paddingTop",paddingEnd:"paddingBottom"},A={scrollPos:"scrollLeft",scrollSize:"scrollWidth",offsetPos:"offsetLeft",offsetSize:"offsetWidth",oppositeOffsetSize:"offsetHeight",marginStart:"marginRight",marginEnd:"marginLeft",borderStart:"borderRightWidth",borderEnd:"borderLeftWidth",paddingStart:"paddingRight",paddingEnd:"paddingLeft"},B={scrollPos:"scrollLeft",scrollSize:"scrollWidth",offsetPos:"offsetLeft",offsetSize:"offsetWidth",oppositeOffsetSize:"offsetHeight",marginStart:"marginLeft",marginEnd:"marginRight",borderStart:"borderLeftWidth",borderEnd:"borderRightWidth",paddingStart:"paddingLeft",paddingEnd:"paddingRight"},C=b.Class.define(function(b,c){if(b=b||a.document.createElement("DIV"),c=c||{},b.winControl)throw new d("WinJS.UI.Hub.DuplicateConstruction",E.duplicateConstruction);this._id=b.id||r._uniqueID(b),this._writeProfilerMark("constructor,StartTM"),this._windowKeyDownHandlerBound=this._windowKeyDownHandler.bind(this),a.addEventListener("keydown",this._windowKeyDownHandlerBound),b.winControl=this,this._element=b,r.addClass(this.element,C._ClassName.hub),r.addClass(this.element,"win-disposable"),this._parse(),this._viewportElement=a.document.createElement("DIV"),this._viewportElement.className=C._ClassName.hubViewport,this._element.appendChild(this._viewportElement),this._viewportElement.setAttribute("role","group"),this._viewportElement.setAttribute("aria-label",E.hubViewportAriaLabel),this._surfaceElement=a.document.createElement("DIV"),this._surfaceElement.className=C._ClassName.hubSurface,this._viewportElement.appendChild(this._surfaceElement),this._visible=!1,this._viewportElement.style.opacity=0,c.orientation||(this._orientation=t.Orientation.horizontal,r.addClass(this.element,C._ClassName.hubHorizontal)),this._fireEntrance=!0,this._animateEntrance=!0,this._loadId=0,this.runningAnimations=new n.wrap,this._currentIndexForSezo=0,q.setOptions(this,c),r._addEventListener(this.element,"focusin",this._focusin.bind(this),!1),this.element.addEventListener("keydown",this._keyDownHandler.bind(this)),this.element.addEventListener("click",this._clickHandler.bind(this)),this._viewportElement.addEventListener("scroll",this._scrollHandler.bind(this)),this._resizeHandlerBound=this._resizeHandler.bind(this),this._elementResizeInstrument=new u._ElementResizeInstrument,this._element.appendChild(this._elementResizeInstrument.element),this._elementResizeInstrument.addEventListener("resize",this._resizeHandlerBound);var e=this;r._inDom(this.element).then(function(){e._disposed||e._elementResizeInstrument.addedToDom()}),r._resizeNotifier.subscribe(this.element,this._resizeHandlerBound),this._handleSectionChangedBind=this._handleSectionChanged.bind(this),this._handleSectionInsertedBind=this._handleSectionInserted.bind(this),this._handleSectionMovedBind=this._handleSectionMoved.bind(this),this._handleSectionRemovedBind=this._handleSectionRemoved.bind(this),this._handleSectionReloadBind=this._handleSectionReload.bind(this),this._refresh(),this._writeProfilerMark("constructor,StopTM")},{element:{get:function(){return this._element}},orientation:{get:function(){return this._orientation},set:function(a){if(a!==this._orientation){if(this._measured=!1,this._names){var b={};b[this._names.scrollPos]=0,r.setScrollPosition(this._viewportElement,b)}a===t.Orientation.vertical?(r.removeClass(this.element,C._ClassName.hubHorizontal),r.addClass(this.element,C._ClassName.hubVertical)):(a=t.Orientation.horizontal,r.removeClass(this.element,C._ClassName.hubVertical),r.addClass(this.element,C._ClassName.hubHorizontal)),this._orientation=a,p.schedule(this._updateSnapList.bind(this),p.Priority.idle)}}},sections:{get:function(){return this._pendingSections?this._pendingSections:this._sections},set:function(a){var b=!this._pendingSections;this._pendingSections=a,this._refresh(),b&&(this.scrollPosition=0)}},headerTemplate:{get:function(){return this._pendingHeaderTemplate?this._pendingHeaderTemplate:(this._headerTemplate||(this._headerTemplate=i),this._headerTemplate)},set:function(a){this._pendingHeaderTemplate=a||i,this._refresh()}},scrollPosition:{get:function(){return+this._pendingScrollLocation===this._pendingScrollLocation?this._pendingScrollLocation:(this._measure(),this._scrollPosition)},set:function(a){if(a=Math.max(0,a),this._pendingRefresh)this._pendingScrollLocation=a,this._pendingSectionOnScreen=null;else{this._measure();var b=Math.max(0,Math.min(this._scrollLength-this._viewportSize,a));this._scrollPosition=b;var c={};c[this._names.scrollPos]=b,r.setScrollPosition(this._viewportElement,c)}}},sectionOnScreen:{get:function(){if(+this._pendingSectionOnScreen===this._pendingSectionOnScreen)return this._pendingSectionOnScreen;this._measure();for(var a=0;a<this._sectionSizes.length;a++){var b=this._sectionSizes[a];if(b.offset+b.size-b.borderEnd-b.paddingEnd>this._scrollPosition+this._startSpacer+b.borderStart+b.paddingStart)return a}return-1},set:function(a){a=Math.max(0,a),this._pendingRefresh?(this._pendingSectionOnScreen=a,this._pendingScrollLocation=null):(this._measure(),a>=0&&a<this._sectionSizes.length&&this._scrollToSection(a))}},indexOfFirstVisible:{get:function(){this._measure();for(var a=0;a<this._sectionSizes.length;a++){var b=this._sectionSizes[a];if(b.offset+b.size-b.borderEnd-b.paddingEnd>this._scrollPosition)return a}return-1}},indexOfLastVisible:{get:function(){this._measure();for(var a=this._sectionSizes.length-1;a>=0;a--){var b=this._sectionSizes[a];if(b.offset+b.paddingStart+b.borderStart<this._scrollPosition+this._viewportSize)return a}return-1}},onheaderinvoked:w(x.headerInvoked),onloadingstatechanged:w(x.loadingStateChanged),oncontentanimating:w(x.contentAnimating),_refresh:function(){this._pendingRefresh||(this._loadId++,this._setState(C.LoadingState.loading),this._pendingRefresh=!0,p.schedule(this._refreshImpl.bind(this),p.Priority.high))},_refreshImpl:function(){if(!this._disposed){var a=n.wrap();if(this._pendingSections&&(this._animateEntrance=!0,this._fireEntrance=!this._visible,!this._fireEntrance&&(this._visible=!1,this._viewportElement.style.opacity=0,k.isAnimationEnabled()))){var b=this._fireEvent(C._EventName.contentAnimating,{type:C.AnimationType.contentTransition});b&&(this._viewportElement.style["-ms-overflow-style"]="none",a=j.fadeOut(this._viewportElement).then(function(){this._viewportElement.style["-ms-overflow-style"]=""}.bind(this))),this._animateEntrance=b}a.done(this._applyProperties.bind(this))}},_applyProperties:function(){if(!this._disposed){this._pendingRefresh=!1;var a=!1;this._pendingSections&&(a=!0,this._updateEvents(this._sections,this._pendingSections),this._sections&&this._sections.forEach(function(a){var b=a.element;b.parentElement.removeChild(b)}),this._sections=this._pendingSections,this._pendingSections=null),this._pendingHeaderTemplate&&(this._headerTemplate=this._pendingHeaderTemplate,this._pendingHeaderTemplate=null),this._assignHeaderTemplate(),a&&this._attachSections(),+this._pendingSectionOnScreen===this._pendingSectionOnScreen?this.sectionOnScreen=this._pendingSectionOnScreen:+this._pendingScrollLocation===this._pendingScrollLocation?this.scrollPosition=this._pendingScrollLocation:this.scrollPosition=0,this._pendingSectionOnScreen=null,this._pendingScrollLocation=null,this._setState(C.LoadingState.loading),this._loadSections()}},_handleSectionChanged:function(a){if(!this._pendingSections){var b=a.detail.newValue,c=a.detail.oldValue;if(b._setHeaderTemplate(this.headerTemplate),b.element!==c.element){if(b.element.parentNode===this._surfaceElement)throw new d("WinJS.UI.Hub.DuplicateSection",E.duplicateSection);this._surfaceElement.insertBefore(b.element,c.element),this._surfaceElement.removeChild(c.element),this._measured=!1,this._setState(C.LoadingState.loading),this._loadSections()}}},_handleSectionInserted:function(a){if(!this._pendingSections){var b=a.detail.index,c=a.detail.value;c._animation&&c._animation.cancel();var e,f=this._fireEvent(C._EventName.contentAnimating,{type:C.AnimationType.insert,index:b,section:c});if(f){for(var g=[],h=b+1;h<this.sections.length;h++)g.push(this.sections.getAt(h).element);e=new j._createUpdateListAnimation([c.element],[],g)}if(c.element.parentNode===this._surfaceElement)throw new d("WinJS.UI.Hub.DuplicateSection",E.duplicateSection);if(c._setHeaderTemplate(this.headerTemplate),b<this.sections.length-1?this._surfaceElement.insertBefore(c.element,this.sections.getAt(b+1).element):this._surfaceElement.appendChild(c.element),this._measured=!1,e){var i=e.execute();this.runningAnimations=n.join([this.runningAnimations,i])}this._setState(C.LoadingState.loading),this._loadSections()}},_handleSectionMoved:function(a){if(!this._pendingSections){var b=a.detail.newIndex,c=a.detail.value;b<this.sections.length-1?this._surfaceElement.insertBefore(c.element,this.sections.getAt(b+1).element):this._surfaceElement.appendChild(c.element),this._measured=!1,this._setState(C.LoadingState.loading),this._loadSections()}},_handleSectionRemoved:function(a){if(!this._pendingSections){var b=a.detail.value,c=a.detail.index,d=n.wrap(),e=this._fireEvent(C._EventName.contentAnimating,{type:C.AnimationType.remove,index:c,section:b});if(e){for(var f=[],g=c;g<this.sections.length;g++)f.push(this.sections.getAt(g).element);var h=new j._createUpdateListAnimation([],[b.element],f);this._measure();var i=b.element.offsetTop,k=b.element.offsetLeft;b.element.style.position="absolute",b.element.style.top=i,b.element.style.left=k,b.element.style.opacity=0,this._measured=!1,d=h.execute().then(function(){b.element.style.position="",b.element.style.top="",b.element.style.left="",b.element.style.opacity=1}.bind(this))}d.done(function(){this._disposed||(this._surfaceElement.removeChild(b.element),this._measured=!1)}.bind(this)),b._animation=d,this.runningAnimations=n.join([this.runningAnimations,d]),this._setState(C.LoadingState.loading),this._loadSections()}},_handleSectionReload:function(){this.sections=this.sections},_updateEvents:function(a,b){a&&(a.removeEventListener("itemchanged",this._handleSectionChangedBind),a.removeEventListener("iteminserted",this._handleSectionInsertedBind),a.removeEventListener("itemmoved",this._handleSectionMovedBind),a.removeEventListener("itemremoved",this._handleSectionRemovedBind),a.removeEventListener("reload",this._handleSectionReloadBind)),b&&(b.addEventListener("itemchanged",this._handleSectionChangedBind),b.addEventListener("iteminserted",this._handleSectionInsertedBind),b.addEventListener("itemmoved",this._handleSectionMovedBind),b.addEventListener("itemremoved",this._handleSectionRemovedBind),b.addEventListener("reload",this._handleSectionReloadBind))},_attachSections:function(){this._measured=!1;for(var a=0;a<this.sections.length;a++){var b=this._sections.getAt(a);if(b._animation&&b._animation.cancel(),b.element.parentNode===this._surfaceElement)throw new d("WinJS.UI.Hub.DuplicateSection",E.duplicateSection);this._surfaceElement.appendChild(b.element)}},_assignHeaderTemplate:function(){this._measured=!1;for(var a=0;a<this.sections.length;a++){var b=this._sections.getAt(a);b._setHeaderTemplate(this.headerTemplate)}},_loadSection:function(a){var b=this._sections.getAt(a);return b._process().then(function(){var a=b.contentElement.style;""!==a.visibility&&(a.visibility="")})},_loadSections:function(){function b(a){a.then(function(){p.schedule(c,p.Priority.idle)})}function c(){if(d===e._loadId&&!e._disposed)if(g.length){var a=g.shift(),c=e._loadSection(a);b(c)}else i.complete()}this._loadId++;var d=this._loadId,e=this,f=n.wrap(),g=[],h=n.wrap();if(this._showProgressPromise||(this._showProgressPromise=n.timeout(y).then(function(){this._disposed||(this._progressBar||(this._progressBar=a.document.createElement("progress"),r.addClass(this._progressBar,C._ClassName.hubProgress),this._progressBar.max=100),this._progressBar.parentNode||this.element.insertBefore(this._progressBar,this._viewportElement),this._showProgressPromise=null)}.bind(this),function(){this._showProgressPromise=null}.bind(this))),this.sections.length){var i=new o;h=i.promise;for(var l=[],m=Math.max(0,this.indexOfFirstVisible),q=Math.max(0,this.indexOfLastVisible),s=m;q>=s;s++)l.push(this._loadSection(s));for(m--,q++;m>=0||q<this.sections.length;)q<this.sections.length&&(g.push(q),q++),m>=0&&(g.push(m),m--);var t=n.join(l);t.done(function(){d!==this._loadId||e._disposed||(this._showProgressPromise&&this._showProgressPromise.cancel(),this._progressBar&&this._progressBar.parentNode&&this._progressBar.parentNode.removeChild(this._progressBar),p.schedule(function(){if(d===this._loadId&&!e._disposed&&!this._visible){if(this._visible=!0,this._viewportElement.style.opacity=1,this._animateEntrance&&k.isAnimationEnabled()){var b={type:C.AnimationType.entrance};this._fireEntrance&&!this._fireEvent(C._EventName.contentAnimating,b)||(this._viewportElement.style["-ms-overflow-style"]="none",f=j.enterContent(this._viewportElement).then(function(){this._viewportElement.style["-ms-overflow-style"]="",this._viewportElement.onmousewheel=function(){}}.bind(this)))}this._element===a.document.activeElement&&this._moveFocusIn(this.sectionOnScreen)}},p.Priority.high,this,"WinJS.UI.Hub.entranceAnimation"))}.bind(this)),b(t)}else this._showProgressPromise&&this._showProgressPromise.cancel(),this._progressBar&&this._progressBar.parentNode&&this._progressBar.parentNode.removeChild(this._progressBar);n.join([this.runningAnimations,f,h]).done(function(){d!==this._loadId||e._disposed||(this.runningAnimations=n.wrap(),this._measured&&this._scrollLength!==this._viewportElement[this._names.scrollSize]&&(this._measured=!1),this._setState(C.LoadingState.complete),p.schedule(this._updateSnapList.bind(this),p.Priority.idle))}.bind(this))},loadingState:{get:function(){return this._loadingState}},_setState:function(b){if(b!==this._loadingState){this._writeProfilerMark("loadingStateChanged:"+b+",info"),this._loadingState=b;var c=a.document.createEvent("CustomEvent");c.initCustomEvent(C._EventName.loadingStateChanged,!0,!1,{loadingState:b}),this._element.dispatchEvent(c)}},_parse:function(){for(var a=[],b=this.element.firstElementChild;b;){m.processAll(b);var c=b.winControl;if(!c)throw new d("WinJS.UI.Hub.InvalidContent",E.invalidContent);a.push(c);var e=b.nextElementSibling;b.parentElement.removeChild(b),b=e}this.sections=new l.List(a)},_fireEvent:function(b,c){var d=a.document.createEvent("CustomEvent");return d.initCustomEvent(b,!0,!0,c),this.element.dispatchEvent(d)},_findHeaderTabStop:function(a){if(a.parentNode&&r._matchesSelector(a,".win-hub-section-header-tabstop, .win-hub-section-header-tabstop *")){for(;!r.hasClass(a,"win-hub-section-header-tabstop");)a=a.parentElement;return a}return null},_isInteractive:function(b){for(;b&&b!==a.document.body;){if(r.hasClass(b,"win-interactive"))return!0;b=b.parentElement}return!1},_clickHandler:function(a){var b=this._findHeaderTabStop(a.target);if(b&&!this._isInteractive(a.target)){var c=b.parentElement.parentElement.winControl;if(!c.isHeaderStatic){var d=this.sections.indexOf(c);this._fireEvent(C._EventName.headerInvoked,{index:d,section:c})}}},_resizeHandler:function(){this._measured=!1,p.schedule(this._updateSnapList.bind(this),p.Priority.idle)},_scrollHandler:function(){this._measured=!1,this._pendingSections||(this._pendingScrollLocation=null,this._pendingSectionOnScreen=null,this._pendingScrollHandler||(this._pendingScrollHandler=c._requestAnimationFrame(function(){this._pendingScrollHandler=null,this._pendingSections||this.loadingState!==C.LoadingState.complete&&this._loadSections()}.bind(this))))},_measure:function(){if(!this._measured||0===this._scrollLength){this._writeProfilerMark("measure,StartTM"),this._measured=!0,this._rtl="rtl"===r._getComputedStyle(this._element,null).direction,this.orientation===t.Orientation.vertical?this._names=z:this._rtl?this._names=A:this._names=B,this._viewportSize=this._viewportElement[this._names.offsetSize],this._viewportOppositeSize=this._viewportElement[this._names.oppositeOffsetSize],this._scrollPosition=r.getScrollPosition(this._viewportElement)[this._names.scrollPos],this._scrollLength=this._viewportElement[this._names.scrollSize];var a=r._getComputedStyle(this._surfaceElement);this._startSpacer=parseFloat(a[this._names.marginStart])+parseFloat(a[this._names.borderStart])+parseFloat(a[this._names.paddingStart]),this._endSpacer=parseFloat(a[this._names.marginEnd])+parseFloat(a[this._names.borderEnd])+parseFloat(a[this._names.paddingEnd]),this._sectionSizes=[];for(var b=0;b<this.sections.length;b++){var c=this.sections.getAt(b),d=r._getComputedStyle(c.element);this._sectionSizes[b]={offset:c.element[this._names.offsetPos],size:c.element[this._names.offsetSize],marginStart:parseFloat(d[this._names.marginStart]),marginEnd:parseFloat(d[this._names.marginEnd]),borderStart:parseFloat(d[this._names.borderStart]),borderEnd:parseFloat(d[this._names.borderEnd]),paddingStart:parseFloat(d[this._names.paddingStart]),paddingEnd:parseFloat(d[this._names.paddingEnd])},this._rtl&&this.orientation===t.Orientation.horizontal&&(this._sectionSizes[b].offset=this._viewportSize-(this._sectionSizes[b].offset+this._sectionSizes[b].size))}this._writeProfilerMark("measure,StopTM")}},_updateSnapList:function(){this._writeProfilerMark("updateSnapList,StartTM"),this._measure();for(var a="snapList(",b=0;b<this._sectionSizes.length;b++){b>0&&(a+=",");var c=this._sectionSizes[b];a+=c.offset-c.marginStart-this._startSpacer+"px"}a+=")";var d="",e="";this.orientation===t.Orientation.vertical?d=a:e=a,this._lastSnapPointY!==d&&(this._lastSnapPointY=d,this._viewportElement.style["-ms-scroll-snap-points-y"]=d),this._lastSnapPointX!==e&&(this._lastSnapPointX=e,this._viewportElement.style["-ms-scroll-snap-points-x"]=e),this._writeProfilerMark("updateSnapList,StopTM")},_scrollToSection:function(a,b){this._measure();var c=this._sectionSizes[a],d=Math.min(this._scrollLength-this._viewportSize,c.offset-c.marginStart-this._startSpacer);this._scrollTo(d,b)},_ensureVisible:function(a,b){this._measure();var c=this._ensureVisibleMath(a,this._scrollPosition);this._scrollTo(c,b)},_ensureVisibleMath:function(a,b){this._measure();var c=this._sectionSizes[a],d=Math.min(this._scrollLength-this._viewportSize,c.offset-c.marginStart-this._startSpacer),e=Math.max(0,c.offset+c.size+c.marginEnd+this._endSpacer-this._viewportSize+1);return b>d?b=d:e>b&&(b=Math.min(d,e)),b},_scrollTo:function(a,b){if(this._scrollPosition=a,b)this.orientation===t.Orientation.vertical?r._zoomTo(this._viewportElement,{contentX:0,contentY:this._scrollPosition,viewportX:0,viewportY:0}):r._zoomTo(this._viewportElement,{contentX:this._scrollPosition,contentY:0,viewportX:0,viewportY:0});else{var c={};c[this._names.scrollPos]=this._scrollPosition,r.setScrollPosition(this._viewportElement,c)}},_windowKeyDownHandler:function(a){if(a.keyCode===s.tab){this._tabSeenLast=!0;var b=this;c._yieldForEvents(function(){b._tabSeenLast=!1})}},_focusin:function(a){if(this._tabSeenLast){var b=this._findHeaderTabStop(a.target);if(b&&!this._isInteractive(a.target)){var c=this.sections.indexOf(b.parentElement.parentElement.winControl);c>-1&&this._ensureVisible(c,!0)}}for(var d=a.target;d&&!r.hasClass(d,v.HubSection._ClassName.hubSection);)d=d.parentElement;if(d){var c=this.sections.indexOf(d.winControl);c>-1&&(this._currentIndexForSezo=c)}if(a.target===this.element){var e;+this._sectionToFocus===this._sectionToFocus&&this._sectionToFocus>=0&&this._sectionToFocus<this.sections.length?(e=this._sectionToFocus,this._sectionToFocus=null):e=this.sectionOnScreen,this._moveFocusIn(e)}},_moveFocusIn:function(a){if(a>=0){for(var b=a;b<this.sections.length;b++){var c=this.sections.getAt(b),d=r._trySetActive(c._headerTabStopElement,this._viewportElement);if(d)return;if(r._setActiveFirstFocusableElement(c.contentElement,this._viewportElement))return}for(var b=a-1;b>=0;b--){var c=this.sections.getAt(b);if(r._setActiveFirstFocusableElement(c.contentElement,this._viewportElement))return;var d=r._trySetActive(c._headerTabStopElement,this._viewportElement);if(d)return}}},_keyDownHandler:function(a){if(!this._isInteractive(a.target)&&!r._hasCursorKeysBehaviors(a.target)){var b=this._rtl?s.rightArrow:s.leftArrow,c=this._rtl?s.leftArrow:s.rightArrow;if(a.keyCode===s.upArrow||a.keyCode===s.downArrow||a.keyCode===s.leftArrow||a.keyCode===s.rightArrow||a.keyCode===s.pageUp||a.keyCode===s.pageDown){var d=this._findHeaderTabStop(a.target);if(d){var e,f=this.sections.indexOf(d.parentElement.parentElement.winControl),g=!1;if(a.keyCode===s.pageDown||this.orientation===t.Orientation.horizontal&&a.keyCode===c||this.orientation===t.Orientation.vertical&&a.keyCode===s.downArrow){for(var h=f+1;h<this.sections.length;h++)if(this._tryFocus(h)){e=h;break}}else if(a.keyCode===s.pageUp||this.orientation===t.Orientation.horizontal&&a.keyCode===b||this.orientation===t.Orientation.vertical&&a.keyCode===s.upArrow)for(var h=f-1;h>=0;h--)if(this._tryFocus(h)){e=h;break}a.keyCode!==s.upArrow&&a.keyCode!==s.downArrow&&a.keyCode!==s.leftArrow&&a.keyCode!==s.rightArrow||(g=!0),+e===e&&(g?this._ensureVisible(e,!0):this._scrollToSection(e,!0),a.preventDefault())}}else if(a.keyCode===s.home||a.keyCode===s.end){this._measure();var i=Math.max(0,this._scrollLength-this._viewportSize);this._scrollTo(a.keyCode===s.home?0:i,!0),a.preventDefault()}}},_tryFocus:function(b){var c=this.sections.getAt(b);return r._setActive(c._headerTabStopElement,this._viewportElement),a.document.activeElement===c._headerTabStopElement},zoomableView:{get:function(){return this._zoomableView||(this._zoomableView=new D(this)),this._zoomableView}},_getPanAxis:function(){return this.orientation===t.Orientation.horizontal?"horizontal":"vertical"},_configureForZoom:function(){},_setCurrentItem:function(a,b){var c;c=this.orientation===t.Orientation.horizontal?a:b,this._measure(),c+=this._scrollPosition,this._currentIndexForSezo=this._sectionSizes.length-1;for(var d=1;d<this._sectionSizes.length;d++){var e=this._sectionSizes[d];if(e.offset-e.marginStart>c){this._currentIndexForSezo=d-1;break}}},_getCurrentItem:function(){var a;if(this._sectionSizes.length>0){this._measure();var b=Math.max(0,Math.min(this._currentIndexForSezo,this._sectionSizes.length)),c=this._sectionSizes[b];a=this.orientation===t.Orientation.horizontal?{left:Math.max(0,c.offset-c.marginStart-this._scrollPosition),top:0,width:c.size,height:this._viewportOppositeSize}:{left:0,top:Math.max(0,c.offset-c.marginStart-this._scrollPosition),width:this._viewportOppositeSize,height:c.size};var d=this.sections.getAt(b);return n.wrap({item:{data:d,index:b,groupIndexHint:b},position:a})}},_beginZoom:function(){this._viewportElement.style["-ms-overflow-style"]="none"},_positionItem:function(a,b){if(a.index>=0&&a.index<this._sectionSizes.length){this._measure();var c,d=this._sectionSizes[a.index];c=this.orientation===t.Orientation.horizontal?b.left:b.top,this._sectionToFocus=a.index;var e=d.offset-c,e=this._ensureVisibleMath(a.index,e);this._scrollPosition=e;var f={};f[this._names.scrollPos]=this._scrollPosition,r.setScrollPosition(this._viewportElement,f)}},_endZoom:function(){this._viewportElement.style["-ms-overflow-style"]=""},_writeProfilerMark:function(a){var b="WinJS.UI.Hub:"+this._id+":"+a;h(b),f.log&&f.log(b,null,"hubprofiler")},dispose:function(){if(!this._disposed){this._disposed=!0,a.removeEventListener("keydown",this._windowKeyDownHandlerBound),r._resizeNotifier.unsubscribe(this.element,this._resizeHandlerBound),this._elementResizeInstrument.dispose(),this._updateEvents(this._sections);for(var b=0;b<this.sections.length;b++)this.sections.getAt(b).dispose()}},forceLayout:function(){this._resizeHandler()}},{AnimationType:{entrance:"entrance",contentTransition:"contentTransition",insert:"insert",remove:"remove"},LoadingState:{loading:"loading",complete:"complete"},_ClassName:{hub:"win-hub",hubSurface:"win-hub-surface",hubProgress:"win-hub-progress",hubViewport:"win-hub-viewport",hubVertical:"win-hub-vertical",hubHorizontal:"win-hub-horizontal"},_EventName:{contentAnimating:x.contentAnimating,headerInvoked:x.headerInvoked,loadingStateChanged:x.loadingStateChanged}});b.Class.mix(C,q.DOMEventMixin);
-var D=b.Class.define(function(a){this._hub=a},{getPanAxis:function(){return this._hub._getPanAxis()},configureForZoom:function(a,b,c,d){this._hub._configureForZoom(a,b,c,d)},setCurrentItem:function(a,b){this._hub._setCurrentItem(a,b)},getCurrentItem:function(){return this._hub._getCurrentItem()},beginZoom:function(){this._hub._beginZoom()},positionItem:function(a,b){return this._hub._positionItem(a,b)},endZoom:function(a){this._hub._endZoom(a)}}),E={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get duplicateSection(){return"Hub duplicate sections: Each HubSection must be unique"},get invalidContent(){return"Invalid content: Hub content must be made up of HubSections."},get hubViewportAriaLabel(){return g._getWinJSString("ui/hubViewportAriaLabel").value}};return C})})}),d("require-style!less/styles-lightdismissservice",[],function(){});var e=this.__extends||function(a,b){function c(){this.constructor=a}for(var d in b)b.hasOwnProperty(d)&&(a[d]=b[d]);c.prototype=b.prototype,a.prototype=new c};d("WinJS/_LightDismissService",["require","exports","./Application","./Core/_Base","./Core/_BaseUtils","./Utilities/_ElementUtilities","./Core/_Global","./Utilities/_KeyboardBehavior","./Core/_Log","./Core/_Resources"],function(a,b,c,d,f,g,h,i,j,k){a(["require-style!less/styles-lightdismissservice"]);var l=1e3,m={get closeOverlay(){return k._getWinJSString("ui/closeOverlay").value}};b._ClassNames={_clickEater:"win-clickeater"};b.LightDismissalReasons={tap:"tap",lostFocus:"lostFocus",escape:"escape",hardwareBackButton:"hardwareBackButton",windowResize:"windowResize",windowBlur:"windowBlur"},b.DismissalPolicies={light:function(a){switch(a.reason){case b.LightDismissalReasons.tap:case b.LightDismissalReasons.escape:return a.active?!0:(a.stopPropagation(),!1);case b.LightDismissalReasons.hardwareBackButton:return a.active?(a.preventDefault(),!0):(a.stopPropagation(),!1);case b.LightDismissalReasons.lostFocus:case b.LightDismissalReasons.windowResize:case b.LightDismissalReasons.windowBlur:return!0}},modal:function(a){switch(a.stopPropagation(),a.reason){case b.LightDismissalReasons.tap:case b.LightDismissalReasons.lostFocus:case b.LightDismissalReasons.windowResize:case b.LightDismissalReasons.windowBlur:return!1;case b.LightDismissalReasons.escape:return a.active;case b.LightDismissalReasons.hardwareBackButton:return a.preventDefault(),a.active}},sticky:function(a){return a.stopPropagation(),!1}};var n={keyDown:"keyDown",keyUp:"keyUp",keyPress:"keyPress"},o=function(){function a(a){this.element=a.element,this.element.tabIndex=a.tabIndex,this.onLightDismiss=a.onLightDismiss,a.onTakeFocus&&(this.onTakeFocus=a.onTakeFocus),a.onShouldLightDismiss&&(this.onShouldLightDismiss=a.onShouldLightDismiss),this._ldeOnKeyDownBound=this._ldeOnKeyDown.bind(this),this._ldeOnKeyUpBound=this._ldeOnKeyUp.bind(this),this._ldeOnKeyPressBound=this._ldeOnKeyPress.bind(this)}return a.prototype.restoreFocus=function(){var a=h.document.activeElement;if(a&&this.containsElement(a))return this._ldeCurrentFocus=a,!0;var b=!i._keyboardSeenLast;return this._ldeCurrentFocus&&this.containsElement(this._ldeCurrentFocus)&&g._tryFocusOnAnyElement(this._ldeCurrentFocus,b)},a.prototype._ldeOnKeyDown=function(a){this._ldeService.keyDown(this,a)},a.prototype._ldeOnKeyUp=function(a){this._ldeService.keyUp(this,a)},a.prototype._ldeOnKeyPress=function(a){this._ldeService.keyPress(this,a)},a.prototype.setZIndex=function(a){this.element.style.zIndex=a},a.prototype.getZIndexCount=function(){return 1},a.prototype.containsElement=function(a){return this.element.contains(a)},a.prototype.onTakeFocus=function(a){this.restoreFocus()||g._focusFirstFocusableElement(this.element,a)||g._tryFocusOnAnyElement(this.element,a)},a.prototype.onFocus=function(a){this._ldeCurrentFocus=a},a.prototype.onShow=function(a){this._ldeService=a,this.element.addEventListener("keydown",this._ldeOnKeyDownBound),this.element.addEventListener("keyup",this._ldeOnKeyUpBound),this.element.addEventListener("keypress",this._ldeOnKeyPressBound)},a.prototype.onHide=function(){this._ldeCurrentFocus=null,this._ldeService=null,this.element.removeEventListener("keydown",this._ldeOnKeyDownBound),this.element.removeEventListener("keyup",this._ldeOnKeyUpBound),this.element.removeEventListener("keypress",this._ldeOnKeyPressBound)},a.prototype.onKeyInStack=function(a){},a.prototype.onShouldLightDismiss=function(a){return!1},a.prototype.onLightDismiss=function(a){},a}(),p=function(a){function c(){a.apply(this,arguments)}return e(c,a),c.prototype.onKeyInStack=function(a){},c.prototype.onShouldLightDismiss=function(a){return b.DismissalPolicies.light(a)},c}(o);b.LightDismissableElement=p;var q=function(a){function c(){a.apply(this,arguments)}return e(c,a),c.prototype.onKeyInStack=function(a){a.stopPropagation()},c.prototype.onShouldLightDismiss=function(a){return b.DismissalPolicies.modal(a)},c}(o);b.ModalElement=q;var r=function(){function a(){}return a.prototype.setZIndex=function(a){},a.prototype.getZIndexCount=function(){return 1},a.prototype.containsElement=function(a){return h.document.body.contains(a)},a.prototype.onTakeFocus=function(a){this.currentFocus&&this.containsElement(this.currentFocus)&&g._tryFocusOnAnyElement(this.currentFocus,a)},a.prototype.onFocus=function(a){this.currentFocus=a},a.prototype.onShow=function(a){},a.prototype.onHide=function(){this.currentFocus=null},a.prototype.onKeyInStack=function(a){},a.prototype.onShouldLightDismiss=function(a){return!1},a.prototype.onLightDismiss=function(a){},a}(),s=function(){function a(){this._debug=!1,this._clients=[],this._notifying=!1,this._bodyClient=new r,this._updateDom_rendered={serviceActive:!1},this._clickEaterEl=this._createClickEater(),this._onBeforeRequestingFocusOnKeyboardInputBound=this._onBeforeRequestingFocusOnKeyboardInput.bind(this),this._onFocusInBound=this._onFocusIn.bind(this),this._onKeyDownBound=this._onKeyDown.bind(this),this._onWindowResizeBound=this._onWindowResize.bind(this),this._onClickEaterPointerUpBound=this._onClickEaterPointerUp.bind(this),this._onClickEaterPointerCancelBound=this._onClickEaterPointerCancel.bind(this),c.addEventListener("backclick",this._onBackClick.bind(this)),h.window.addEventListener("blur",this._onWindowBlur.bind(this)),this.shown(this._bodyClient)}return a.prototype.shown=function(a){var b=this._clients.indexOf(a);-1===b&&(this._clients.push(a),a.onShow(this),this._updateDom())},a.prototype.hidden=function(a){var b=this._clients.indexOf(a);-1!==b&&(this._clients.splice(b,1),a.setZIndex(""),a.onHide(),this._updateDom())},a.prototype.updated=function(a){this._updateDom()},a.prototype.keyDown=function(a,b){b.keyCode===g.Key.escape?this._escapePressed(b):this._dispatchKeyboardEvent(a,n.keyDown,b)},a.prototype.keyUp=function(a,b){this._dispatchKeyboardEvent(a,n.keyUp,b)},a.prototype.keyPress=function(a,b){this._dispatchKeyboardEvent(a,n.keyPress,b)},a.prototype.isShown=function(a){return-1!==this._clients.indexOf(a)},a.prototype.isTopmost=function(a){return a===this._clients[this._clients.length-1]},a.prototype._setDebug=function(a){this._debug=a},a.prototype._updateDom=function(a){a=a||{};var b=!!a.activeDismissableNeedsFocus,d=this._updateDom_rendered;if(!this._notifying){var e=this._clients.length>1;if(e!==d.serviceActive){if(e)c.addEventListener("beforerequestingfocusonkeyboardinput",this._onBeforeRequestingFocusOnKeyboardInputBound),g._addEventListener(h.document.documentElement,"focusin",this._onFocusInBound),h.document.documentElement.addEventListener("keydown",this._onKeyDownBound),h.window.addEventListener("resize",this._onWindowResizeBound),this._bodyClient.currentFocus=h.document.activeElement,h.document.body.appendChild(this._clickEaterEl);else{c.removeEventListener("beforerequestingfocusonkeyboardinput",this._onBeforeRequestingFocusOnKeyboardInputBound),g._removeEventListener(h.document.documentElement,"focusin",this._onFocusInBound),h.document.documentElement.removeEventListener("keydown",this._onKeyDownBound),h.window.removeEventListener("resize",this._onWindowResizeBound);var f=this._clickEaterEl.parentNode;f&&f.removeChild(this._clickEaterEl)}d.serviceActive=e}var j=0,k=l+1;this._clients.forEach(function(a,b){var c=parseInt(k.toString())+parseInt(j.toString());a.setZIndex(""+c),k=c,j=parseInt(a.getZIndexCount().toString())+1}),e&&(this._clickEaterEl.style.zIndex=""+(k-1));var m=this._clients.length>0?this._clients[this._clients.length-1]:null;if(this._activeDismissable!==m&&(this._activeDismissable=m,b=!0),b){var n=!i._keyboardSeenLast;this._activeDismissable&&this._activeDismissable.onTakeFocus(n)}}},a.prototype._dispatchKeyboardEvent=function(a,b,c){var d=this._clients.indexOf(a);if(-1!==d)for(var e={type:b,keyCode:c.keyCode,propagationStopped:!1,stopPropagation:function(){this.propagationStopped=!0,c.stopPropagation()}},f=this._clients.slice(0,d+1),g=f.length-1;g>=0&&!e.propagationStopped;g--)f[g].onKeyInStack(e)},a.prototype._dispatchLightDismiss=function(a,b,c){if(this._notifying)return void(j.log&&j.log('_LightDismissService ignored dismiss trigger to avoid re-entrancy: "'+a+'"',"winjs _LightDismissService","warning"));if(b=b||this._clients.slice(0),0!==b.length){this._notifying=!0;for(var d={reason:a,active:!1,_stop:!1,stopPropagation:function(){this._stop=!0},_doDefault:!0,preventDefault:function(){this._doDefault=!1}},e=b.length-1;e>=0&&!d._stop;e--)d.active=this._activeDismissable===b[e],b[e].onShouldLightDismiss(d)&&b[e].onLightDismiss(d);return this._notifying=!1,this._updateDom(c),d._doDefault}},a.prototype._onBeforeRequestingFocusOnKeyboardInput=function(a){return!0},a.prototype._clickEaterTapped=function(){this._dispatchLightDismiss(b.LightDismissalReasons.tap)},a.prototype._onFocusIn=function(a){for(var c=a.target,d=this._clients.length-1;d>=0&&!this._clients[d].containsElement(c);d--);-1!==d&&this._clients[d].onFocus(c),d+1<this._clients.length&&this._dispatchLightDismiss(b.LightDismissalReasons.lostFocus,this._clients.slice(d+1),{activeDismissableNeedsFocus:!0})},a.prototype._onKeyDown=function(a){a.keyCode===g.Key.escape&&this._escapePressed(a)},a.prototype._escapePressed=function(a){a.preventDefault(),a.stopPropagation(),this._dispatchLightDismiss(b.LightDismissalReasons.escape)},a.prototype._onBackClick=function(a){var c=this._dispatchLightDismiss(b.LightDismissalReasons.hardwareBackButton);return!c},a.prototype._onWindowResize=function(a){this._dispatchLightDismiss(b.LightDismissalReasons.windowResize)},a.prototype._onWindowBlur=function(a){if(!this._debug)if(h.document.hasFocus()){var c=h.document.activeElement;c&&"IFRAME"===c.tagName&&!c.msLightDismissBlur&&(c.addEventListener("blur",this._onWindowBlur.bind(this),!1),c.msLightDismissBlur=!0)}else this._dispatchLightDismiss(b.LightDismissalReasons.windowBlur)},a.prototype._createClickEater=function(){var a=h.document.createElement("section");return a.className=b._ClassNames._clickEater,g._addEventListener(a,"pointerdown",this._onClickEaterPointerDown.bind(this),!0),a.addEventListener("click",this._onClickEaterClick.bind(this),!0),a.setAttribute("role","menuitem"),a.setAttribute("aria-label",m.closeOverlay),a.setAttribute("unselectable","on"),a},a.prototype._onClickEaterPointerDown=function(a){a.stopPropagation(),a.preventDefault(),this._clickEaterPointerId=a.pointerId,this._registeredClickEaterCleanUp||(g._addEventListener(h.window,"pointerup",this._onClickEaterPointerUpBound),g._addEventListener(h.window,"pointercancel",this._onClickEaterPointerCancelBound),this._registeredClickEaterCleanUp=!0)},a.prototype._onClickEaterPointerUp=function(a){var b=this;if(a.stopPropagation(),a.preventDefault(),a.pointerId===this._clickEaterPointerId){this._resetClickEaterPointerState();var c=h.document.elementFromPoint(a.clientX,a.clientY);c===this._clickEaterEl&&(this._skipClickEaterClick=!0,f._yieldForEvents(function(){b._skipClickEaterClick=!1}),this._clickEaterTapped())}},a.prototype._onClickEaterClick=function(a){a.stopPropagation(),a.preventDefault(),this._skipClickEaterClick||this._clickEaterTapped()},a.prototype._onClickEaterPointerCancel=function(a){a.pointerId===this._clickEaterPointerId&&this._resetClickEaterPointerState()},a.prototype._resetClickEaterPointerState=function(){this._registeredClickEaterCleanUp&&(g._removeEventListener(h.window,"pointerup",this._onClickEaterPointerUpBound),g._removeEventListener(h.window,"pointercancel",this._onClickEaterPointerCancelBound)),this._clickEaterPointerId=null,this._registeredClickEaterCleanUp=!1},a}(),t=new s;b.shown=t.shown.bind(t),b.hidden=t.hidden.bind(t),b.updated=t.updated.bind(t),b.isShown=t.isShown.bind(t),b.isTopmost=t.isTopmost.bind(t),b.keyDown=t.keyDown.bind(t),b.keyUp=t.keyUp.bind(t),b.keyPress=t.keyPress.bind(t),b._clickEaterTapped=t._clickEaterTapped.bind(t),b._onBackClick=t._onBackClick.bind(t),b._setDebug=t._setDebug.bind(t),d.Namespace.define("WinJS.UI._LightDismissService",{shown:b.shown,hidden:b.hidden,updated:b.updated,isShown:b.isShown,isTopmost:b.isTopmost,keyDown:b.keyDown,keyUp:b.keyUp,keyPress:b.keyPress,_clickEaterTapped:b._clickEaterTapped,_onBackClick:b._onBackClick,_setDebug:b._setDebug,LightDismissableElement:p,DismissalPolicies:b.DismissalPolicies,LightDismissalReasons:b.LightDismissalReasons,_ClassNames:b._ClassNames,_service:t})}),d("WinJS/Controls/_LegacyAppBar/_Constants",["exports","../../Core/_Base"],function(a,b){"use strict";b.Namespace._moduleDefine(a,null,{appBarClass:"win-navbar",firstDivClass:"win-firstdiv",finalDivClass:"win-finaldiv",invokeButtonClass:"win-navbar-invokebutton",ellipsisClass:"win-navbar-ellipsis",primaryCommandsClass:"win-primarygroup",secondaryCommandsClass:"win-secondarygroup",commandLayoutClass:"win-commandlayout",menuLayoutClass:"win-menulayout",topClass:"win-top",bottomClass:"win-bottom",showingClass:"win-navbar-opening",shownClass:"win-navbar-opened",hidingClass:"win-navbar-closing",hiddenClass:"win-navbar-closed",compactClass:"win-navbar-compact",minimalClass:"win-navbar-minimal",menuContainerClass:"win-navbar-menu",appBarPlacementTop:"top",appBarPlacementBottom:"bottom",appBarLayoutCustom:"custom",appBarLayoutCommands:"commands",appBarLayoutMenu:"menu",appBarInvokeButtonWidth:32,typeSeparator:"separator",typeContent:"content",typeButton:"button",typeToggle:"toggle",typeFlyout:"flyout",appBarCommandClass:"win-command",appBarCommandGlobalClass:"win-global",appBarCommandSelectionClass:"win-selection",commandHiddenClass:"win-command-hidden",sectionSelection:"selection",sectionGlobal:"global",sectionPrimary:"primary",sectionSecondary:"secondary",menuCommandClass:"win-command",menuCommandButtonClass:"win-command-button",menuCommandToggleClass:"win-command-toggle",menuCommandFlyoutClass:"win-command-flyout",menuCommandFlyoutActivatedClass:"win-command-flyout-activated",menuCommandSeparatorClass:"win-command-separator",_menuCommandInvokedEvent:"_invoked",menuClass:"win-menu",menuContainsToggleCommandClass:"win-menu-containstogglecommand",menuContainsFlyoutCommandClass:"win-menu-containsflyoutcommand",menuMouseSpacingClass:"win-menu-mousespacing",menuTouchSpacingClass:"win-menu-touchspacing",menuCommandHoverDelay:400,overlayClass:"win-overlay",flyoutClass:"win-flyout",flyoutLightClass:"win-ui-light",settingsFlyoutClass:"win-settingsflyout",scrollsClass:"win-scrolls",pinToRightEdge:-1,pinToBottomEdge:-1,separatorWidth:34,buttonWidth:68,narrowClass:"win-narrow",wideClass:"win-wide",_visualViewportClass:"win-visualviewport-space",commandPropertyMutated:"_commandpropertymutated",commandVisibilityChanged:"commandvisibilitychanged"})}),d("WinJS/Utilities/_KeyboardInfo",["require","exports","../Core/_BaseCoreUtils","../Core/_Global","../Core/_WinRT"],function(a,b,c,d,e){"use strict";var f={visualViewportClass:"win-visualviewport-space",scrollTimeout:150};b._KeyboardInfo,b._KeyboardInfo={get _visible(){try{return e.Windows.UI.ViewManagement.InputPane&&e.Windows.UI.ViewManagement.InputPane.getForCurrentView().occludedRect.height>0}catch(a){return!1}},get _extraOccluded(){var a=0;return!b._KeyboardInfo._isResized&&e.Windows.UI.ViewManagement.InputPane&&(a=e.Windows.UI.ViewManagement.InputPane.getForCurrentView().occludedRect.height),a},get _isResized(){var a=d.document.documentElement.clientHeight/d.innerHeight,b=d.document.documentElement.clientWidth/d.innerWidth;return.99>b/a},get _visibleDocBottom(){return b._KeyboardInfo._visibleDocTop+b._KeyboardInfo._visibleDocHeight},get _visibleDocHeight(){return b._KeyboardInfo._visualViewportHeight-b._KeyboardInfo._extraOccluded},get _visibleDocTop(){return 0},get _visibleDocBottomOffset(){return b._KeyboardInfo._extraOccluded},get _visualViewportHeight(){var a=b._KeyboardInfo._visualViewportSpace;return a.height},get _visualViewportWidth(){var a=b._KeyboardInfo._visualViewportSpace;return a.width},get _visualViewportSpace(){var a=d.document.body.querySelector("."+f.visualViewportClass);return a||(a=d.document.createElement("DIV"),a.className=f.visualViewportClass,d.document.body.appendChild(a)),a.getBoundingClientRect()},get _animationShowLength(){if(c.hasWinRT){if(e.Windows.UI.Core.AnimationMetrics){for(var a=e.Windows.UI.Core.AnimationMetrics,b=new a.AnimationDescription(a.AnimationEffect.showPanel,a.AnimationEffectTarget.primary),d=b.animations,f=0,g=0;g<d.size;g++){var h=d[g];f=Math.max(f,h.delay+h.duration)}return f}var i=300,j=50;return j+i}return 0},get _scrollTimeout(){return f.scrollTimeout},get _layoutViewportCoords(){var a=d.window.pageYOffset-d.document.documentElement.scrollTop,b=d.document.documentElement.clientHeight-(a+this._visibleDocHeight);return{visibleDocTop:a,visibleDocBottom:b}}}}),d("require-style!less/styles-overlay",[],function(){}),d("require-style!less/colors-overlay",[],function(){}),d("WinJS/Controls/Flyout/_Overlay",["exports","../../Core/_Global","../../Core/_WinRT","../../Core/_Base","../../Core/_BaseUtils","../../Core/_ErrorFromName","../../Core/_Events","../../Core/_Resources","../../Core/_WriteProfilerMark","../../_Accents","../../Animations","../../Application","../../ControlProcessor","../../Promise","../../Scheduler","../../Utilities/_Control","../../Utilities/_ElementUtilities","../../Utilities/_KeyboardInfo","../_LegacyAppBar/_Constants","require-style!less/styles-overlay","require-style!less/colors-overlay"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s){"use strict";j.createAccentRule("button[aria-checked=true].win-command:before,         .win-menu-containsflyoutcommand button.win-command-flyout-activated:before",[{name:"background-color",value:j.ColorTypes.accent},{name:"border-color",value:j.ColorTypes.accent}]),j.createAccentRule(".win-flyout, .win-settingsflyout",[{name:"border-color",value:j.ColorTypes.accent}]),d.Namespace._moduleDefine(a,"WinJS.UI",{_Overlay:d.Namespace._lazy(function(){function a(a,c,d){var e=b.document.querySelectorAll("."+s.overlayClass);if(e)for(var f=e.length,g=0;f>g;g++){var h=e[g],i=h.winControl;if(!i._disposed&&i){var j=i[c](a);if(d&&j)return j}}}function e(a){if(!a)return[];"string"!=typeof a&&a&&a.length||(a=[a]);var c,d=[];for(c=0;c<a.length;c++)if(a[c])if("string"==typeof a[c]){var e=b.document.getElementById(a[c]);e&&d.push(e)}else a[c].element?d.push(a[c].element):d.push(a[c]);return d}var g=d.Class.define(function(){this._currentState=g.states.off,this._inputPaneShowing=this._inputPaneShowing.bind(this),this._inputPaneHiding=this._inputPaneHiding.bind(this),this._documentScroll=this._documentScroll.bind(this),this._windowResized=this._windowResized.bind(this)},{initialize:function(){this._toggleListeners(g.states.on)},reset:function(){this._toggleListeners(g.states.off),this._toggleListeners(g.states.on)},_inputPaneShowing:function(b){i(g.profilerString+"_showingKeyboard,StartTM"),a(b,"_showingKeyboard"),i(g.profilerString+"_showingKeyboard,StopTM")},_inputPaneHiding:function(b){i(g.profilerString+"_hidingKeyboard,StartTM"),a(b,"_hidingKeyboard"),i(g.profilerString+"_hidingKeyboard,StopTM")},_documentScroll:function(b){i(g.profilerString+"_checkScrollPosition,StartTM"),a(b,"_checkScrollPosition"),i(g.profilerString+"_checkScrollPosition,StopTM")},_windowResized:function(b){i(g.profilerString+"_baseResize,StartTM"),a(b,"_baseResize"),i(g.profilerString+"_baseResize,StopTM")},_toggleListeners:function(a){var d;if(this._currentState!==a){if(a===g.states.on?d="addEventListener":a===g.states.off&&(d="removeEventListener"),c.Windows.UI.ViewManagement.InputPane){var e=c.Windows.UI.ViewManagement.InputPane.getForCurrentView();e[d]("showing",this._inputPaneShowing,!1),e[d]("hiding",this._inputPaneHiding,!1),b.document[d]("scroll",this._documentScroll,!1)}b.addEventListener("resize",this._windowResized,!1),this._currentState=a}}},{profilerString:{get:function(){return"WinJS.UI._Overlay Global Listener:"}},states:{get:function(){return{off:0,on:1}}}}),j={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get mustContainCommands(){return"Invalid HTML: AppBars/Menus must contain only AppBarCommands/MenuCommands"},get closeOverlay(){return h._getWinJSString("ui/closeOverlay").value}},l=d.Class.define(function(a,b){this._baseOverlayConstructor(a,b)},{_baseOverlayConstructor:function(a,c){this._disposed=!1,a||(a=b.document.createElement("div"));var d=a.winControl;if(d)throw new f("WinJS.UI._Overlay.DuplicateConstruction",j.duplicateConstruction);this._element||(this._element=a),this._element.hasAttribute("tabIndex")||(this._element.tabIndex=-1),this._sticky=!1,this._doNext="",this._element.style.visibility="hidden",this._element.style.opacity=0,a.winControl=this,q.addClass(this._element,s.overlayClass),q.addClass(this._element,"win-disposable");var e=this._element.getAttribute("unselectable");null!==e&&void 0!==e||this._element.setAttribute("unselectable","on"),this._currentAnimateIn=this._baseAnimateIn,this._currentAnimateOut=this._baseAnimateOut,this._animationPromise=n.as(),this._queuedToShow=[],this._queuedToHide=[],this._queuedCommandAnimation=!1,c&&p.setOptions(this,c),l._globalEventListeners.initialize()},element:{get:function(){return this._element}},dispose:function(){this._disposed||(this._disposed=!0,this._dispose())},_dispose:function(){},_show:function(){this._baseShow()},_hide:function(){this._baseHide()},hidden:{get:function(){return"hidden"===this._element.style.visibility||"hiding"===this._element.winAnimating||"hide"===this._doNext},set:function(a){var b=this.hidden;!a&&b?this.show():a&&!b&&this.hide()}},addEventListener:function(a,b,c){return this._element.addEventListener(a,b,c)},removeEventListener:function(a,b,c){return this._element.removeEventListener(a,b,c)},_baseShow:function(){if(this._animating||this._needToHandleHidingKeyboard)return this._doNext="show",!1;if("visible"!==this._element.style.visibility){this._element.winAnimating="showing",this._element.style.display="",this._element.style.visibility="hidden",this._queuedCommandAnimation&&(this._showAndHideFast(this._queuedToShow,this._queuedToHide),this._queuedToShow=[],this._queuedToHide=[]),this._beforeShow(),this._sendEvent(l.beforeShow),this._ensurePosition();var a=this;return this._animationPromise=this._currentAnimateIn().then(function(){a._baseEndShow()},function(){a._baseEndShow()}),!0}return!1},_beforeShow:function(){},_ensurePosition:function(){},_baseEndShow:function(){this._disposed||(this._element.setAttribute("aria-hidden","false"),this._element.winAnimating="","show"===this._doNext&&(this._doNext=""),this._sendEvent(l.afterShow),this._writeProfilerMark("show,StopTM"),o.schedule(this._checkDoNext,o.Priority.normal,this,"WinJS.UI._Overlay._checkDoNext"))},_baseHide:function(){if(this._animating)return this._doNext="hide",!1;if(this._needToHandleHidingKeyboard&&(this._element.style.visibility=""),"hidden"!==this._element.style.visibility){if(this._element.winAnimating="hiding",this._element.setAttribute("aria-hidden","true"),this._sendEvent(l.beforeHide),""===this._element.style.visibility)this._element.style.opacity=0,this._baseEndHide();else{var a=this;this._animationPromise=this._currentAnimateOut().then(function(){a._baseEndHide()},function(){a._baseEndHide()})}return!0}return!1},_baseEndHide:function(){this._disposed||(this._beforeEndHide(),this._element.style.visibility="hidden",this._element.style.display="none",this._element.winAnimating="",this._queuedCommandAnimation&&(this._showAndHideFast(this._queuedToShow,this._queuedToHide),this._queuedToShow=[],this._queuedToHide=[]),"hide"===this._doNext&&(this._doNext=""),this._afterHide(),this._sendEvent(l.afterHide),this._writeProfilerMark("hide,StopTM"),o.schedule(this._checkDoNext,o.Priority.normal,this,"WinJS.UI._Overlay._checkDoNext"))},_beforeEndHide:function(){},_afterHide:function(){},_checkDoNext:function(){this._animating||this._needToHandleHidingKeyboard||this._disposed||("hide"===this._doNext?(this._hide(),this._doNext=""):this._queuedCommandAnimation?this._showAndHideQueue():"show"===this._doNext&&(this._show(),this._doNext=""))},_baseAnimateIn:function(){return this._element.style.opacity=0,this._element.style.visibility="visible",q._getComputedStyle(this._element,null).opacity,k.fadeIn(this._element)},_baseAnimateOut:function(){return this._element.style.opacity=1,q._getComputedStyle(this._element,null).opacity,k.fadeOut(this._element)},_animating:{get:function(){return!!this._element.winAnimating}},_sendEvent:function(a,c){if(!this._disposed){var d=b.document.createEvent("CustomEvent");d.initEvent(a,!0,!0,c||{}),this._element.dispatchEvent(d)}},_showCommands:function(a,b){var c=this._resolveCommands(a);this._showAndHideCommands(c.commands,[],b)},_hideCommands:function(a,b){var c=this._resolveCommands(a);this._showAndHideCommands([],c.commands,b)},_showOnlyCommands:function(a,b){var c=this._resolveCommands(a);this._showAndHideCommands(c.commands,c.others,b)},_showAndHideCommands:function(a,b,c){c||this.hidden&&!this._animating?(this._showAndHideFast(a,b),this._removeFromQueue(a,this._queuedToShow),this._removeFromQueue(b,this._queuedToHide)):(this._updateAnimateQueue(a,this._queuedToShow,this._queuedToHide),this._updateAnimateQueue(b,this._queuedToHide,this._queuedToShow))},_removeFromQueue:function(a,b){var c;for(c=0;c<a.length;c++){var d;for(d=0;d<b.length;d++)if(b[d]===a[c]){b.splice(d,1);break}}},_updateAnimateQueue:function(a,b,c){if(!this._disposed){var d;for(d=0;d<a.length;d++){var e;for(e=0;e<b.length&&b[e]!==a[d];e++);for(e===b.length&&(b[e]=a[d]),e=0;e<c.length;e++)if(c[e]===a[d]){c.splice(e,1);break}}this._queuedCommandAnimation||(this._animating||o.schedule(this._checkDoNext,o.Priority.normal,this,"WinJS.UI._Overlay._checkDoNext"),this._queuedCommandAnimation=!0)}},_showAndHideFast:function(a,b){var c,d;for(c=0;c<a.length;c++)d=a[c],d&&d.style&&(d.style.visibility="",d.style.display="");for(c=0;c<b.length;c++)d=b[c],d&&d.style&&(d.style.visibility="hidden",d.style.display="none");this._commandsUpdated()},_showAndHideQueue:function(){if(this._queuedCommandAnimation=!1,this.hidden)this._showAndHideFast(this._queuedToShow,this._queuedToHide),o.schedule(this._checkDoNext,o.Priority.normal,this,"WinJS.UI._Overlay._checkDoNext");else{var a,c=this._queuedToShow,d=this._queuedToHide,e=this._findSiblings(c.concat(d));for(a=0;a<c.length;a++)c[a]&&c[a].style&&b.document.body.contains(c[a])?"hidden"!==c[a].style.visibility&&"0"!==c[a].style.opacity&&(e.push(c[a]),c.splice(a,1),a--):(c.splice(a,1),a--);for(a=0;a<d.length;a++)d[a]&&d[a].style&&b.document.body.contains(d[a])&&"hidden"!==d[a].style.visibility&&"0"!==d[a].style.opacity||(d.splice(a,1),a--);var f=this._baseBeginAnimateCommands(c,d,e),g=this;f?f.done(function(){g._baseEndAnimateCommands(d)},function(){g._baseEndAnimateCommands(d)}):o.schedule(function(){g._baseEndAnimateCommands([])},o.Priority.normal,null,"WinJS.UI._Overlay._endAnimateCommandsWithoutAnimation")}this._queuedToShow=[],this._queuedToHide=[]},_baseBeginAnimateCommands:function(a,b,c){this._beginAnimateCommands(a,b,this._getVisibleCommands(c));var d=null,e=null;b.length>0&&(e=k.createDeleteFromListAnimation(b,0===a.length?c:void 0)),a.length>0&&(d=k.createAddToListAnimation(a,c));for(var f=0,g=b.length;g>f;f++){var h=b[f].getBoundingClientRect(),i=q._getComputedStyle(b[f]);b[f].style.top=h.top-parseFloat(i.marginTop)+"px",b[f].style.left=h.left-parseFloat(i.marginLeft)+"px",b[f].style.opacity=0,b[f].style.position="fixed"}this._element.winAnimating="rearranging";var j=null;for(e&&(j=e.execute()),f=0;f<a.length;f++)a[f].style.visibility="",a[f].style.display="",a[f].style.opacity=1;if(d){var l=d.execute();j=j?n.join([j,l]):l}return j},_beginAnimateCommands:function(){},_getVisibleCommands:function(a){var b,c=a,d=[];c||(c=this.element.querySelectorAll(".win-command"));for(var e=0,f=c.length;f>e;e++)b=c[e].winControl||c[e],b.hidden||d.push(b);return d},_baseEndAnimateCommands:function(a){if(!this._disposed){var b;for(b=0;b<a.length;b++)a[b].style.position="",a[b].style.top="",a[b].style.left="",a[b].getBoundingClientRect(),a[b].style.visibility="hidden",a[b].style.display="none",a[b].style.opacity=1;this._element.winAnimating="",this._endAnimateCommands(),this._checkDoNext()}},_endAnimateCommands:function(){},_resolveCommands:function(a){a=e(a);var b={};b.commands=[],b.others=[];var c,d,f=this.element.querySelectorAll(".win-command");for(c=0;c<f.length;c++){var g=!1;for(d=0;d<a.length;d++)if(a[d]===f[c]){b.commands.push(f[c]),a.splice(d,1),g=!0;break}g||b.others.push(f[c])}return b},_findSiblings:function(a){var b,c,d=[],e=this.element.querySelectorAll(".win-command");for(b=0;b<e.length;b++){var f=!1;for(c=0;c<a.length;c++)if(a[c]===e[b]){a.splice(c,1),f=!0;break}f||d.push(e[b])}return d},_baseResize:function(a){this._resize(a)},_hideOrDismiss:function(){var a=this._element;a&&q.hasClass(a,s.settingsFlyoutClass)?this._dismiss():a&&q.hasClass(a,s.appBarClass)?this.close():this.hide()},_resize:function(){},_commandsUpdated:function(){},_checkScrollPosition:function(){},_showingKeyboard:function(){},_hidingKeyboard:function(){},_verifyCommandsOnly:function(a,b){for(var c=a.children,d=new Array(c.length),e=0;e<c.length;e++){if(!q.hasClass(c[e],"win-command")&&c[e].getAttribute("data-win-control")!==b)throw new f("WinJS.UI._Overlay.MustContainCommands",j.mustContainCommands);m.processAll(c[e]),d[e]=c[e].winControl}return d},_focusOnLastFocusableElementOrThis:function(){this._focusOnLastFocusableElement()||l._trySetActive(this._element)},_focusOnLastFocusableElement:function(){if(this._element.firstElementChild){var a=this._element.firstElementChild.tabIndex,c=this._element.lastElementChild.tabIndex;this._element.firstElementChild.tabIndex=-1,this._element.lastElementChild.tabIndex=-1;var d=q._focusLastFocusableElement(this._element);return d&&l._trySelect(b.document.activeElement),this._element.firstElementChild.tabIndex=a,this._element.lastElementChild.tabIndex=c,d}return!1},_focusOnFirstFocusableElementOrThis:function(){this._focusOnFirstFocusableElement()||l._trySetActive(this._element)},_focusOnFirstFocusableElement:function(a,c){if(this._element.firstElementChild){var d=this._element.firstElementChild.tabIndex,e=this._element.lastElementChild.tabIndex;this._element.firstElementChild.tabIndex=-1,this._element.lastElementChild.tabIndex=-1;var f=q._focusFirstFocusableElement(this._element,a,c);return f&&l._trySelect(b.document.activeElement),this._element.firstElementChild.tabIndex=d,this._element.lastElementChild.tabIndex=e,f}return!1},_writeProfilerMark:function(a){i("WinJS.UI._Overlay:"+this._id+":"+a)}},{_isFlyoutVisible:function(){for(var a=b.document.querySelectorAll("."+s.flyoutClass),c=0;c<a.length;c++){var d=a[c].winControl;if(d&&!d.hidden)return!0}return!1},_trySetActive:function(a,c){return a&&b.document.body&&b.document.body.contains(a)&&q._setActive(a,c)?a===b.document.activeElement:!1},_trySelect:function(a){try{a&&a.select&&a.select()}catch(b){}},_sizeOfDocument:function(){return{width:b.document.documentElement.offsetWidth,height:b.document.documentElement.offsetHeight
-}},_getParentControlUsingClassName:function(a,c){for(;a&&a!==b.document.body;){if(q.hasClass(a,c))return a.winControl;a=a.parentNode}return null},_globalEventListeners:new g,_hideAppBars:function(a,b){var c=a.map(function(a){return a.close(),a._animationPromise});return n.join(c)},_showAppBars:function(a,b){var c=a.map(function(a){return a._show(),a._animationPromise});return n.join(c)},_keyboardInfo:r._KeyboardInfo,_scrollTimeout:r._KeyboardInfo._scrollTimeout,beforeShow:"beforeshow",beforeHide:"beforehide",afterShow:"aftershow",afterHide:"afterhide",commonstrings:{get cannotChangeCommandsWhenVisible(){return"Invalid argument: You must call hide() before changing {0} commands"},get cannotChangeHiddenProperty(){return"Unable to set hidden property while parent {0} is visible."}}});return d.Class.mix(l,p.DOMEventMixin),l})})}),d("WinJS/Controls/Flyout",["exports","../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Events","../Core/_Log","../Core/_Resources","../Core/_WriteProfilerMark","../Animations","../_Signal","../_LightDismissService","../Utilities/_Dispose","../Utilities/_ElementUtilities","../Utilities/_KeyboardBehavior","../Utilities/_Hoverable","./_LegacyAppBar/_Constants","./Flyout/_Overlay"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){"use strict";c.Namespace._moduleDefine(a,"WinJS.UI",{Flyout:c.Namespace._lazy(function(){function a(a,b){return n.convertToPixels(a,n._getComputedStyle(a,null)[b])}function p(b){return{marginTop:a(b,"marginTop"),marginBottom:a(b,"marginBottom"),marginLeft:a(b,"marginLeft"),marginRight:a(b,"marginRight"),totalWidth:n.getTotalWidth(b),totalHeight:n.getTotalHeight(b),contentWidth:n.getContentWidth(b),contentHeight:n.getContentHeight(b)}}var s=n.Key,t={get ariaLabel(){return h._getWinJSString("ui/flyoutAriaLabel").value},get noAnchor(){return"Invalid argument: Flyout anchor element not found in DOM."},get badPlacement(){return"Invalid argument: Flyout placement should be 'top' (default), 'bottom', 'left', 'right', 'auto', 'autohorizontal', or 'autovertical'."},get badAlignment(){return"Invalid argument: Flyout alignment should be 'center' (default), 'left', or 'right'."},get noCoordinates(){return"Invalid argument: Flyout coordinates must contain a valid x,y pair."}},u=f._createEventProperty,v=c.Class.define(function(a){this._onLightDismiss=a,this._currentlyFocusedClient=null,this._clients=[]},{shown:function(a){a._focusable=!0;var b=this._clients.indexOf(a);-1===b&&(this._clients.push(a),a.onShow(this),l.isShown(this)?(l.updated(this),this._activateTopFocusableClientIfNeeded()):l.shown(this))},hiding:function(a){var b=this._clients.indexOf(a);-1!==b&&(this._clients[b]._focusable=!1,this._activateTopFocusableClientIfNeeded())},hidden:function(a){var b=this._clients.indexOf(a);-1!==b&&(this._clients.splice(b,1),a.setZIndex(""),a.onHide(),0===this._clients.length?l.hidden(this):(l.updated(this),this._activateTopFocusableClientIfNeeded()))},keyDown:function(a,b){l.keyDown(this,b)},keyUp:function(a,b){l.keyUp(this,b)},keyPress:function(a,b){l.keyPress(this,b)},clients:{get:function(){return this._clients}},_clientForElement:function(a){for(var b=this._clients.length-1;b>=0;b--)if(this._clients[b].containsElement(a))return this._clients[b];return null},_focusableClientForElement:function(a){for(var b=this._clients.length-1;b>=0;b--)if(this._clients[b]._focusable&&this._clients[b].containsElement(a))return this._clients[b];return null},_getTopmostFocusableClient:function(){for(var a=this._clients.length-1;a>=0;a--){var b=this._clients[a];if(b&&b._focusable)return b}return null},_activateTopFocusableClientIfNeeded:function(){var a=this._getTopmostFocusableClient();if(a&&l.isTopmost(this)){var b=!o._keyboardSeenLast;a.onTakeFocus(b)}},setZIndex:function(a){this._clients.forEach(function(b,c){b.setZIndex(a+c)},this)},getZIndexCount:function(){return this._clients.length},containsElement:function(a){return!!this._clientForElement(a)},onTakeFocus:function(a){var c=this._focusableClientForElement(b.document.activeElement);!c&&-1!==this._clients.indexOf(this._currentlyFocusedClient)&&this._currentlyFocusedClient._focusable&&(c=this._currentlyFocusedClient),c||(c=this._getTopmostFocusableClient()),this._currentlyFocusedClient=c,c&&c.onTakeFocus(a)},onFocus:function(a){this._currentlyFocusedClient=this._clientForElement(a),this._currentlyFocusedClient&&this._currentlyFocusedClient.onFocus(a)},onShow:function(a){},onHide:function(){this._currentlyFocusedClient=null},onKeyInStack:function(a){var b=this._clients.indexOf(this._currentlyFocusedClient);if(-1!==b)for(var c=this._clients.slice(0,b+1),d=c.length-1;d>=0&&!a.propagationStopped;d--)c[d]._focusable&&c[d].onKeyInStack(a)},onShouldLightDismiss:function(a){return l.DismissalPolicies.light(a)},onLightDismiss:function(a){this._onLightDismiss(a)}}),w=c.Class.define(function(){var a=this;this._dismissableLayer=new v(function(b){b.reason===l.LightDismissalReasons.escape?a.collapseFlyout(a.getAt(a.length-1)):a.collapseAll()}),this._cascadingStack=[],this._handleKeyDownInCascade_bound=this._handleKeyDownInCascade.bind(this),this._inputType=null},{appendFlyout:function(a){if(g.log&&this.reentrancyLock&&g.log("_CascadeManager is attempting to append a Flyout through reentrancy.","winjs _CascadeManager","error"),this.indexOf(a)<0){var b=this.collapseAll;if(a._positionRequest instanceof y.AnchorPositioning){var c=this.indexOfElement(a._positionRequest.anchor);c>=0&&(b=function(){this.collapseFlyout(this.getAt(c+1))})}b.call(this),a.element.addEventListener("keydown",this._handleKeyDownInCascade_bound,!1),this._cascadingStack.push(a)}},collapseFlyout:function(a){if(!this.reentrancyLock&&a&&this.indexOf(a)>=0){this.reentrancyLock=!0;var b=new k;this.unlocked=b.promise;for(var c;this.length&&a!==c;)c=this._cascadingStack.pop(),c.element.removeEventListener("keydown",this._handleKeyDownInCascade_bound,!1),c._hide();0===this._cascadingStack.length&&(this._inputType=null),this.reentrancyLock=!1,this.unlocked=null,b.complete()}},flyoutShown:function(a){this._dismissableLayer.shown(a._dismissable)},flyoutHiding:function(a){this._dismissableLayer.hiding(a._dismissable)},flyoutHidden:function(a){this._dismissableLayer.hidden(a._dismissable)},collapseAll:function(){var a=this.getAt(0);a&&this.collapseFlyout(a)},indexOf:function(a){return this._cascadingStack.indexOf(a)},indexOfElement:function(a){for(var b=-1,c=0,d=this.length;d>c;c++){var e=this.getAt(c);if(e.element.contains(a)){b=c;break}}return b},length:{get:function(){return this._cascadingStack.length}},getAt:function(a){return this._cascadingStack[a]},handleFocusIntoFlyout:function(a){var b=this.indexOfElement(a.target);if(b>=0){var c=this.getAt(b+1);this.collapseFlyout(c)}},inputType:{get:function(){return this._inputType||(this._inputType=o._lastInputType),this._inputType}},dismissableLayer:{get:function(){return this._dismissableLayer}},_handleKeyDownInCascade:function(a){var b="rtl"===n._getComputedStyle(a.target).direction,c=b?s.rightArrow:s.leftArrow,d=a.target;if(a.keyCode===c){var e=this.indexOfElement(d);if(e>=1){var f=this.getAt(e);this.collapseFlyout(f),a.preventDefault()}}else a.keyCode!==s.alt&&a.keyCode!==s.F10||this.collapseAll()}}),x={top:{top:"50px",left:"0px",keyframe:"WinJS-showFlyoutTop"},bottom:{top:"-50px",left:"0px",keyframe:"WinJS-showFlyoutBottom"},left:{top:"0px",left:"50px",keyframe:"WinJS-showFlyoutLeft"},right:{top:"0px",left:"-50px",keyframe:"WinJS-showFlyoutRight"}},y={AnchorPositioning:c.Class.define(function(a,c,d){if("string"==typeof a?a=b.document.getElementById(a):a&&a.element&&(a=a.element),!a)throw new e("WinJS.UI.Flyout.NoAnchor",t.noAnchor);this.anchor=a,this.placement=c,this.alignment=d},{getTopLeft:function(a,b){function c(a){h(a)?(z=f(a)-y,u=r._Overlay._keyboardInfo._visibleDocTop,w=x.top):(z=g(a)-y,u=q.pinToBottomEdge,w=x.bottom),v=!0}function d(a,b){return(r._Overlay._keyboardInfo._visibleDocHeight-a.height)/2>=b.totalHeight}function f(a){return a.top-r._Overlay._keyboardInfo._visibleDocTop}function g(a){return r._Overlay._keyboardInfo._visibleDocBottom-a.bottom}function h(a){return f(a)>g(a)}function i(a,b){return u=a-b.totalHeight,w=x.top,u>=r._Overlay._keyboardInfo._visibleDocTop&&u+b.totalHeight<=r._Overlay._keyboardInfo._visibleDocBottom}function j(a,b){return u=a,w=x.bottom,u>=r._Overlay._keyboardInfo._visibleDocTop&&u+b.totalHeight<=r._Overlay._keyboardInfo._visibleDocBottom}function k(a,b){return s=a-b.totalWidth,w=x.left,s>=0&&s+b.totalWidth<=r._Overlay._keyboardInfo._visualViewportWidth}function l(a,b){return s=a,w=x.right,s>=0&&s+b.totalWidth<=r._Overlay._keyboardInfo._visualViewportWidth}function m(a,b){u=a.top+a.height/2-b.totalHeight/2,u<r._Overlay._keyboardInfo._visibleDocTop?u=r._Overlay._keyboardInfo._visibleDocTop:u+b.totalHeight>=r._Overlay._keyboardInfo._visibleDocBottom&&(u=q.pinToBottomEdge)}function n(a,b,c){if("center"===c)s=a.left+a.width/2-b.totalWidth/2;else if("left"===c)s=a.left;else{if("right"!==c)throw new e("WinJS.UI.Flyout.BadAlignment",t.badAlignment);s=a.right-b.totalWidth}0>s?s=0:s+b.totalWidth>=r._Overlay._keyboardInfo._visualViewportWidth&&(s=q.pinToRightEdge)}var o;try{o=this.anchor.getBoundingClientRect()}catch(p){throw new e("WinJS.UI.Flyout.NoAnchor",t.noAnchor)}var s,u,v,w,y=a.totalHeight-a.contentHeight,z=a.contentHeight,A=this.alignment;switch(this.placement){case"top":i(o.top,a)||(u=r._Overlay._keyboardInfo._visibleDocTop,v=!0,z=f(o)-y),n(o,a,A);break;case"bottom":j(o.bottom,a)||(u=q.pinToBottomEdge,v=!0,z=g(o)-y),n(o,a,A);break;case"left":k(o.left,a)||(s=0),m(o,a);break;case"right":l(o.right,a)||(s=q.pinToRightEdge),m(o,a);break;case"autovertical":i(o.top,a)||j(o.bottom,a)||c(o),n(o,a,A);break;case"autohorizontal":k(o.left,a)||l(o.right,a)||(s=q.pinToRightEdge),m(o,a);break;case"auto":d(o,a)?(i(o.top,a)||j(o.bottom,a),n(o,a,A)):k(o.left,a)||l(o.right,a)?m(o,a):(c(o),n(o,a,A));break;case"_cascade":j(o.top-a.marginTop,a)||i(o.bottom+a.marginBottom,a)||m(o,a);var B=3,C=o.right-a.marginLeft-B,D=o.left+a.marginRight+B;b?k(D,a)||l(C,a)||(s=0,w=x.left):l(C,a)||k(D,a)||(s=q.pinToRightEdge,w=x.right);break;default:throw new e("WinJS.UI.Flyout.BadPlacement",t.badPlacement)}return{left:s,top:u,animOffset:w,doesScroll:v,contentHeight:z,verticalMarginBorderPadding:y}}}),CoordinatePositioning:c.Class.define(function(a){if(a.clientX===+a.clientX&&a.clientY===+a.clientY){var b=a;a={x:b.clientX,y:b.clientY}}else if(a.x!==+a.x||a.y!==+a.y)throw new e("WinJS.UI.Flyout.NoCoordinates",t.noCoordinates);this.coordinates=a},{getTopLeft:function(a,b){var c=this.coordinates,d=a.totalWidth-a.marginLeft-a.marginRight,e=b?d:0,f=a.totalHeight-a.contentHeight,g=a.contentHeight,h=c.y-a.marginTop,i=c.x-a.marginLeft-e;return 0>h?h=0:h+a.totalHeight>r._Overlay._keyboardInfo._visibleDocBottom&&(h=q.pinToBottomEdge),0>i?i=0:i+a.totalWidth>r._Overlay._keyboardInfo._visualViewportWidth&&(i=q.pinToRightEdge),{left:i,top:h,verticalMarginBorderPadding:f,contentHeight:g,doesScroll:!1,animOffset:x.top}}})},z=c.Class.derive(r._Overlay,function(a,c){c=c||{},this._element=a||b.document.createElement("div"),this._id=this._element.id||n._uniqueID(this._element),this._writeProfilerMark("constructor,StartTM"),this._baseFlyoutConstructor(this._element,c);var d=this._element.getElementsByTagName("*"),e=this._addFirstDiv();e.tabIndex=n._getLowestTabIndexInList(d);var f=this._addFinalDiv();return f.tabIndex=n._getHighestTabIndexInList(d),this._element.addEventListener("keydown",this._handleKeyDown,!0),this._writeProfilerMark("constructor,StopTM"),this},{_lastMaxHeight:null,_baseFlyoutConstructor:function(a,b){this._placement="auto",this._alignment="center",this._baseOverlayConstructor(a,b),this._element.style.visibilty="hidden",this._element.style.display="none",n.addClass(this._element,q.flyoutClass);var c=this;this._dismissable=new l.LightDismissableElement({element:this._element,tabIndex:this._element.hasAttribute("tabIndex")?this._element.tabIndex:-1,onLightDismiss:function(){c.hide()},onTakeFocus:function(a){c._dismissable.restoreFocus()||(n.hasClass(c.element,q.menuClass)?r._Overlay._trySetActive(c._element):c._focusOnFirstFocusableElementOrThis())}});var d=this._element.getAttribute("role");null!==d&&""!==d&&void 0!==d||(n.hasClass(this._element,q.menuClass)?this._element.setAttribute("role","menu"):this._element.setAttribute("role","dialog"));var e=this._element.getAttribute("aria-label");null!==e&&""!==e&&void 0!==e||this._element.setAttribute("aria-label",t.ariaLabel),this._currentAnimateIn=this._flyoutAnimateIn,this._currentAnimateOut=this._flyoutAnimateOut,n._addEventListener(this.element,"focusin",this._handleFocusIn.bind(this),!1)},anchor:{get:function(){return this._anchor},set:function(a){this._anchor=a}},placement:{get:function(){return this._placement},set:function(a){if("top"!==a&&"bottom"!==a&&"left"!==a&&"right"!==a&&"auto"!==a&&"autohorizontal"!==a&&"autovertical"!==a)throw new e("WinJS.UI.Flyout.BadPlacement",t.badPlacement);this._placement=a}},alignment:{get:function(){return this._alignment},set:function(a){if("right"!==a&&"left"!==a&&"center"!==a)throw new e("WinJS.UI.Flyout.BadAlignment",t.badAlignment);this._alignment=a}},disabled:{get:function(){return!!this._element.disabled},set:function(a){a=!!a;var b=!!this._element.disabled;b!==a&&(this._element.disabled=a,!this.hidden&&this._element.disabled&&this.hide())}},onbeforeshow:u(r._Overlay.beforeShow),onaftershow:u(r._Overlay.afterShow),onbeforehide:u(r._Overlay.beforeHide),onafterhide:u(r._Overlay.afterHide),_dispose:function(){m.disposeSubTree(this.element),this._hide(),z._cascadeManager.flyoutHidden(this),this.anchor=null},show:function(a,b,c){this._writeProfilerMark("show,StartTM"),this._positionRequest=new y.AnchorPositioning(a||this._anchor,b||this._placement,c||this._alignment),this._show()},_show:function(){this._baseFlyoutShow()},showAt:function(a){this._writeProfilerMark("show,StartTM"),this._positionRequest=new y.CoordinatePositioning(a),this._show()},hide:function(){this._writeProfilerMark("hide,StartTM"),this._hide()},_hide:function(){z._cascadeManager.collapseFlyout(this),this._baseHide()&&z._cascadeManager.flyoutHiding(this)},_beforeEndHide:function(){z._cascadeManager.flyoutHidden(this)},_baseFlyoutShow:function(){if(!this.disabled&&!this._disposed)if(z._cascadeManager.appendFlyout(this),this._element.winAnimating)this._doNext="show";else if(z._cascadeManager.reentrancyLock){this._doNext="show";var a=this;z._cascadeManager.unlocked.then(function(){a._checkDoNext()})}else if(this._baseShow()){if(!n.hasClass(this.element,"win-menu")){var b=this._element.getElementsByTagName("*"),c=this.element.querySelectorAll(".win-first");this.element.children.length&&!n.hasClass(this.element.children[0],q.firstDivClass)&&(c&&c.length>0&&c.item(0).parentNode.removeChild(c.item(0)),c=this._addFirstDiv()),c.tabIndex=n._getLowestTabIndexInList(b);var d=this.element.querySelectorAll(".win-final");n.hasClass(this.element.children[this.element.children.length-1],q.finalDivClass)||(d&&d.length>0&&d.item(0).parentNode.removeChild(d.item(0)),d=this._addFinalDiv()),d.tabIndex=n._getHighestTabIndexInList(b)}z._cascadeManager.flyoutShown(this)}},_lightDismiss:function(){z._cascadeManager.collapseAll()},_ensurePosition:function(){this._keyboardMovedUs=!1,this._clearAdjustedStyles(),this._setAlignment();var a=p(this._element),b="rtl"===n._getComputedStyle(this._element).direction;this._currentPosition=this._positionRequest.getTopLeft(a,b),this._currentPosition.top<0?(this._element.style.bottom=r._Overlay._keyboardInfo._visibleDocBottomOffset+"px",this._element.style.top="auto"):(this._element.style.top=this._currentPosition.top+"px",this._element.style.bottom="auto"),this._currentPosition.left<0?(this._element.style.right="0px",this._element.style.left="auto"):(this._element.style.left=this._currentPosition.left+"px",this._element.style.right="auto"),this._currentPosition.doesScroll&&(n.addClass(this._element,q.scrollsClass),this._lastMaxHeight=this._element.style.maxHeight,this._element.style.maxHeight=this._currentPosition.contentHeight+"px"),r._Overlay._keyboardInfo._visible&&(this._checkKeyboardFit(),this._keyboardMovedUs&&this._adjustForKeyboard())},_clearAdjustedStyles:function(){this._element.style.top="0px",this._element.style.bottom="auto",this._element.style.left="0px",this._element.style.right="auto",n.removeClass(this._element,q.scrollsClass),null!==this._lastMaxHeight&&(this._element.style.maxHeight=this._lastMaxHeight,this._lastMaxHeight=null),n.removeClass(this._element,"win-rightalign"),n.removeClass(this._element,"win-leftalign")},_setAlignment:function(){switch(this._positionRequest.alignment){case"left":n.addClass(this._element,"win-leftalign");break;case"right":n.addClass(this._element,"win-rightalign")}},_showingKeyboard:function(a){if(!this.hidden&&(a.ensuredFocusedElementInView=!0,this._checkKeyboardFit(),this._keyboardMovedUs)){this._element.style.opacity=0;var c=this;b.setTimeout(function(){c._adjustForKeyboard(),c._baseAnimateIn()},r._Overlay._keyboardInfo._animationShowLength)}},_resize:function(){if((!this.hidden||this._animating)&&this._needToHandleHidingKeyboard){var a=this;d._setImmediate(function(){a.hidden&&!a._animating||a._ensurePosition()}),this._needToHandleHidingKeyboard=!1}},_checkKeyboardFit:function(){var a=!1,b=r._Overlay._keyboardInfo._visibleDocHeight,c=this._currentPosition.contentHeight+this._currentPosition.verticalMarginBorderPadding;c>b?(a=!0,this._currentPosition.top=q.pinToBottomEdge,this._currentPosition.contentHeight=b-this._currentPosition.verticalMarginBorderPadding,this._currentPosition.doesScroll=!0):this._currentPosition.top>=0&&this._currentPosition.top+c>r._Overlay._keyboardInfo._visibleDocBottom?(this._currentPosition.top=q.pinToBottomEdge,a=!0):this._currentPosition.top===q.pinToBottomEdge&&(a=!0),this._keyboardMovedUs=a},_adjustForKeyboard:function(){this._currentPosition.doesScroll&&(this._lastMaxHeight||(n.addClass(this._element,q.scrollsClass),this._lastMaxHeight=this._element.style.maxHeight),this._element.style.maxHeight=this._currentPosition.contentHeight+"px"),this._checkScrollPosition(!0)},_hidingKeyboard:function(){if(!this.hidden||this._animating)if(r._Overlay._keyboardInfo._isResized)this._needToHandleHidingKeyboard=!0;else{var a=this;d._setImmediate(function(){a.hidden&&!a._animating||a._ensurePosition()})}},_checkScrollPosition:function(a){this.hidden&&!a||"undefined"!=typeof this._currentPosition&&(this._currentPosition.top<0?(this._element.style.bottom=r._Overlay._keyboardInfo._visibleDocBottomOffset+"px",this._element.style.top="auto"):(this._element.style.top=this._currentPosition.top+"px",this._element.style.bottom="auto"))},_flyoutAnimateIn:function(){return this._keyboardMovedUs?this._baseAnimateIn():(this._element.style.opacity=1,this._element.style.visibility="visible",j.showPopup(this._element,"undefined"!=typeof this._currentPosition?this._currentPosition.animOffset:0))},_flyoutAnimateOut:function(){return this._keyboardMovedUs?this._baseAnimateOut():(this._element.style.opacity=0,j.hidePopup(this._element,"undefined"!=typeof this._currentPosition?this._currentPosition.animOffset:0))},_hideAllOtherFlyouts:function(a){for(var c=b.document.querySelectorAll("."+q.flyoutClass),d=0;d<c.length;d++){var e=c[d].winControl;e&&!e.hidden&&e!==a&&e.hide()}},_handleKeyDown:function(a){a.keyCode!==s.space&&a.keyCode!==s.enter||this!==b.document.activeElement?!a.shiftKey||a.keyCode!==s.tab||this!==b.document.activeElement||a.altKey||a.ctrlKey||a.metaKey||(a.preventDefault(),a.stopPropagation(),this.winControl._focusOnLastFocusableElementOrThis()):(a.preventDefault(),a.stopPropagation(),this.winControl.hide())},_handleFocusIn:function(a){this.element.contains(a.relatedTarget)||z._cascadeManager.handleFocusIntoFlyout(a)},_addFirstDiv:function(){var a=b.document.createElement("div");a.className=q.firstDivClass,a.style.display="inline",a.setAttribute("role","menuitem"),a.setAttribute("aria-hidden","true"),this._element.children[0]?this._element.insertBefore(a,this._element.children[0]):this._element.appendChild(a);var c=this;return n._addEventListener(a,"focusin",function(){c._focusOnLastFocusableElementOrThis()},!1),a},_addFinalDiv:function(){var a=b.document.createElement("div");a.className=q.finalDivClass,a.style.display="inline",a.setAttribute("role","menuitem"),a.setAttribute("aria-hidden","true"),this._element.appendChild(a);var c=this;return n._addEventListener(a,"focusin",function(){c._focusOnFirstFocusableElementOrThis()},!1),a},_writeProfilerMark:function(a){i("WinJS.UI.Flyout:"+this._id+":"+a)}},{_cascadeManager:new w});return z})})}),d("WinJS/Controls/CommandingSurface/_Constants",["require","exports"],function(a,b){b.ClassNames={controlCssClass:"win-commandingsurface",disposableCssClass:"win-disposable",tabStopClass:"win-commandingsurface-tabstop",contentClass:"win-commandingsurface-content",actionAreaCssClass:"win-commandingsurface-actionarea",actionAreaContainerCssClass:"win-commandingsurface-actionareacontainer",overflowButtonCssClass:"win-commandingsurface-overflowbutton",spacerCssClass:"win-commandingsurface-spacer",ellipsisCssClass:"win-commandingsurface-ellipsis",overflowAreaCssClass:"win-commandingsurface-overflowarea",overflowAreaContainerCssClass:"win-commandingsurface-overflowareacontainer",contentFlyoutCssClass:"win-commandingsurface-contentflyout",menuCssClass:"win-menu",menuContainsToggleCommandClass:"win-menu-containstogglecommand",insetOutlineClass:"win-commandingsurface-insetoutline",openingClass:"win-commandingsurface-opening",openedClass:"win-commandingsurface-opened",closingClass:"win-commandingsurface-closing",closedClass:"win-commandingsurface-closed",noneClass:"win-commandingsurface-closeddisplaynone",minimalClass:"win-commandingsurface-closeddisplayminimal",compactClass:"win-commandingsurface-closeddisplaycompact",fullClass:"win-commandingsurface-closeddisplayfull",overflowTopClass:"win-commandingsurface-overflowtop",overflowBottomClass:"win-commandingsurface-overflowbottom",commandHiddenClass:"win-commandingsurface-command-hidden",commandPrimaryOverflownPolicyClass:"win-commandingsurface-command-primary-overflown",commandSecondaryOverflownPolicyClass:"win-commandingsurface-command-secondary-overflown",commandSeparatorHiddenPolicyClass:"win-commandingsurface-command-separator-hidden"},b.EventNames={beforeOpen:"beforeopen",afterOpen:"afteropen",beforeClose:"beforeclose",afterClose:"afterclose",commandPropertyMutated:"_commandpropertymutated"},b.actionAreaCommandWidth=68,b.actionAreaSeparatorWidth=34,b.actionAreaOverflowButtonWidth=32,b.overflowCommandHeight=44,b.overflowSeparatorHeight=12,b.controlMinWidth=b.actionAreaOverflowButtonWidth,b.overflowAreaMaxWidth=480,b.heightOfMinimal=24,b.heightOfCompact=48,b.contentMenuCommandDefaultLabel="Custom content",b.defaultClosedDisplayMode="compact",b.defaultOpened=!1,b.defaultOverflowDirection="bottom",b.typeSeparator="separator",b.typeContent="content",b.typeButton="button",b.typeToggle="toggle",b.typeFlyout="flyout",b.commandSelector=".win-command",b.primaryCommandSection="primary",b.secondaryCommandSection="secondary"}),d("WinJS/Controls/ToolBar/_Constants",["require","exports","../CommandingSurface/_Constants"],function(a,b,c){b.ClassNames={controlCssClass:"win-toolbar",disposableCssClass:"win-disposable",actionAreaCssClass:"win-toolbar-actionarea",overflowButtonCssClass:"win-toolbar-overflowbutton",spacerCssClass:"win-toolbar-spacer",ellipsisCssClass:"win-toolbar-ellipsis",overflowAreaCssClass:"win-toolbar-overflowarea",contentFlyoutCssClass:"win-toolbar-contentflyout",emptytoolbarCssClass:"win-toolbar-empty",menuCssClass:"win-menu",menuContainsToggleCommandClass:"win-menu-containstogglecommand",openedClass:"win-toolbar-opened",closedClass:"win-toolbar-closed",compactClass:"win-toolbar-closeddisplaycompact",fullClass:"win-toolbar-closeddisplayfull",overflowTopClass:"win-toolbar-overflowtop",overflowBottomClass:"win-toolbar-overflowbottom",placeHolderCssClass:"win-toolbar-placeholder"},b.EventNames={beforeOpen:"beforeopen",afterOpen:"afteropen",beforeClose:"beforeclose",afterClose:"afterclose"},b.OverflowDirection={top:"top",bottom:"bottom"},b.overflowAreaMaxWidth=c.overflowAreaMaxWidth,b.controlMinWidth=c.controlMinWidth,b.defaultClosedDisplayMode="compact",b.defaultOpened=!1,b.typeSeparator="separator",b.typeContent="content",b.typeButton="button",b.typeToggle="toggle",b.typeFlyout="flyout",b.commandSelector=".win-command",b.primaryCommandSection="primary",b.secondaryCommandSection="secondary"}),d("WinJS/Controls/AppBar/_Icon",["exports","../../Core/_Base","../../Core/_Resources"],function(a,b,c){"use strict";var d=["previous","next","play","pause","edit","save","clear","delete","remove","add","cancel","accept","more","redo","undo","home","up","forward","right","back","left","favorite","camera","settings","video","sync","download","mail","find","help","upload","emoji","twopage","leavechat","mailforward","clock","send","crop","rotatecamera","people","closepane","openpane","world","flag","previewlink","globe","trim","attachcamera","zoomin","bookmarks","document","protecteddocument","page","bullets","comment","mail2","contactinfo","hangup","viewall","mappin","phone","videochat","switch","contact","rename","pin","musicinfo","go","keyboard","dockleft","dockright","dockbottom","remote","refresh","rotate","shuffle","list","shop","selectall","orientation","import","importall","browsephotos","webcam","pictures","savelocal","caption","stop","showresults","volume","repair","message","page2","calendarday","calendarweek","calendar","characters","mailreplyall","read","link","accounts","showbcc","hidebcc","cut","attach","paste","filter","copy","emoji2","important","mailreply","slideshow","sort","manage","allapps","disconnectdrive","mapdrive","newwindow","openwith","contactpresence","priority","uploadskydrive","gototoday","font","fontcolor","contact2","folder","audio","placeholder","view","setlockscreen","settile","cc","stopslideshow","permissions","highlight","disableupdates","unfavorite","unpin","openlocal","mute","italic","underline","bold","movetofolder","likedislike","dislike","like","alignright","aligncenter","alignleft","zoom","zoomout","openfile","otheruser","admin","street","map","clearselection","fontdecrease","fontincrease","fontsize","cellphone","print","share","reshare","tag","repeatone","repeatall","outlinestar","solidstar","calculator","directions","target","library","phonebook","memo","microphone","postupdate","backtowindow","fullscreen","newfolder","calendarreply","unsyncfolder","reporthacked","syncfolder","blockcontact","switchapps","addfriend","touchpointer","gotostart","zerobars","onebar","twobars","threebars","fourbars","scan","preview","hamburger"],e=d.reduce(function(a,b){return a[b]={get:function(){return c._getWinJSString("ui/appBarIcons/"+b).value}},a},{});b.Namespace._moduleDefine(a,"WinJS.UI.AppBarIcon",e)}),d("WinJS/Controls/AppBar/_Command",["exports","../../Core/_Global","../../Core/_WinRT","../../Core/_Base","../../Core/_BaseUtils","../../Core/_ErrorFromName","../../Core/_Events","../../Core/_Resources","../../Utilities/_Control","../../Utilities/_Dispose","../../Utilities/_ElementUtilities","../Flyout/_Overlay","../Tooltip","../_LegacyAppBar/_Constants","./_Icon"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){"use strict";d.Namespace._moduleDefine(a,"WinJS.UI",{AppBarCommand:d.Namespace._lazy(function(){function a(a){var c=this.winControl;if(c){if(c._type===n.typeToggle)c.selected=!c.selected;else if(c._type===n.typeFlyout&&c._flyout){var d=c._flyout;"string"==typeof d&&(d=b.document.getElementById(d)),d.show||(d=d.winControl),d&&d.show&&d.show(this,"autovertical")}c.onclick&&c.onclick(a)}}function l(a,b){var c=a[b],d=a.constructor.prototype,e=p(d,b)||{},f=e.get.bind(a)||function(){return c},g=e.set.bind(a)||function(a){c=a};Object.defineProperty(a,b,{get:function(){return f()},set:function(c){var d=f();g(c);var e=f();this._disposed||d===c||d===e||a._disposed||a._propertyMutations.dispatchEvent(n.commandPropertyMutated,{command:a,propertyName:b,oldValue:d,newValue:e})}})}function p(a,b){for(var c=null;a&&!c;)c=Object.getOwnPropertyDescriptor(a,b),a=Object.getPrototypeOf(a);return c}var q=d.Class.define(function(){this._observer=e._merge({},g.eventMixin)},{bind:function(a){this._observer.addEventListener(n.commandPropertyMutated,a)},unbind:function(a){this._observer.removeEventListener(n.commandPropertyMutated,a)},dispatchEvent:function(a,b){this._observer.dispatchEvent(a,b)}}),r={get ariaLabel(){return h._getWinJSString("ui/appBarCommandAriaLabel").value},get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get badClick(){return"Invalid argument: The onclick property for an {0} must be a function"},get badDivElement(){return"Invalid argument: For a content command, the element must be null or a div element"},get badHrElement(){return"Invalid argument: For a separator, the element must be null or an hr element"},get badButtonElement(){return"Invalid argument: For a button, toggle, or flyout command, the element must be null or a button element"},get badPriority(){return"Invalid argument: the priority of an {0} must be a non-negative integer"}},s=d.Class.define(function(b,c){if(b&&b.winControl)throw new f("WinJS.UI.AppBarCommand.DuplicateConstruction",r.duplicateConstruction);if(this._disposed=!1,c||(c={}),c.type||(this._type=n.typeButton),c.section=c.section||n.sectionPrimary,this._element=b,c.type===n.typeContent?this._createContent():c.type===n.typeSeparator?this._createSeparator():this._createButton(),k.addClass(this._element,"win-disposable"),this._element.winControl=this,k.addClass(this._element,n.appBarCommandClass),c.onclick&&(this.onclick=c.onclick),c.onclick=a,i.setOptions(this,c),this._type!==n.typeToggle||c.selected||(this.selected=!1),this._type!==n.typeSeparator){var d=this._element.getAttribute("role");null!==d&&""!==d&&void 0!==d||(d=this._type===n.typeToggle?"checkbox":this._type===n.typeContent?"group":"menuitem",this._element.setAttribute("role",d),this._type===n.typeFlyout&&this._element.setAttribute("aria-haspopup",!0));var e=this._element.getAttribute("aria-label");null!==e&&""!==e&&void 0!==e||this._element.setAttribute("aria-label",r.ariaLabel)}this._propertyMutations=new q;var g=this;t.forEach(function(a){l(g,a)})},{id:{get:function(){return this._element.id},set:function(a){a&&!this._element.id&&(this._element.id=a)}},type:{get:function(){return this._type},set:function(a){this._type||(a!==n.typeContent&&a!==n.typeFlyout&&a!==n.typeToggle&&a!==n.typeSeparator?this._type=n.typeButton:this._type=a)}},label:{get:function(){return this._label},set:function(a){this._label=a,this._labelSpan&&(this._labelSpan.textContent=this.label),!this.tooltip&&this._tooltipControl&&(this._tooltip=this.label,this._tooltipControl.innerHTML=this.label),this._element.setAttribute("aria-label",this.label)}},icon:{get:function(){return this._icon},set:function(a){this._icon=o[a]||a,this._imageSpan&&(this._icon&&1===this._icon.length?(this._imageSpan.textContent=this._icon,this._imageSpan.style.backgroundImage="",this._imageSpan.style.msHighContrastAdjust="",k.addClass(this._imageSpan,"win-commandglyph")):(this._imageSpan.textContent="",this._imageSpan.style.backgroundImage=this._icon,this._imageSpan.style.msHighContrastAdjust="none",k.removeClass(this._imageSpan,"win-commandglyph")))}},onclick:{get:function(){return this._onclick},set:function(a){if(a&&"function"!=typeof a)throw new f("WinJS.UI.AppBarCommand.BadClick",h._formatString(r.badClick,"AppBarCommand"));this._onclick=a}},priority:{get:function(){return this._priority},set:function(a){if(!(void 0===a||"number"==typeof a&&a>=0))throw new f("WinJS.UI.AppBarCommand.BadPriority",h._formatString(r.badPriority,"AppBarCommand"));this._priority=a}},flyout:{get:function(){var a=this._flyout;return"string"==typeof a&&(a=b.document.getElementById(a)),a&&!a.element&&a.winControl&&(a=a.winControl),
-a},set:function(a){var b=a;b&&"string"!=typeof b&&(b.element&&(b=b.element),b&&(b.id?b=b.id:(b.id=k._uniqueID(b),b=b.id))),"string"==typeof b&&this._element.setAttribute("aria-owns",b),this._flyout=a}},section:{get:function(){return this._section},set:function(a){this._section&&!c.Windows.ApplicationModel.DesignMode.designModeEnabled||this._setSection(a)}},tooltip:{get:function(){return this._tooltip},set:function(a){this._tooltip=a,this._tooltipControl&&(this._tooltipControl.innerHTML=this._tooltip)}},selected:{get:function(){return"true"===this._element.getAttribute("aria-checked")},set:function(a){this._element.setAttribute("aria-checked",a)}},element:{get:function(){return this._element}},disabled:{get:function(){return!!this._element.disabled},set:function(a){this._element.disabled=a}},hidden:{get:function(){return k.hasClass(this._element,n.commandHiddenClass)},set:function(a){if(a!==this.hidden){var b=this.hidden;a?k.addClass(this._element,n.commandHiddenClass):k.removeClass(this._element,n.commandHiddenClass),this._sendEvent(n.commandVisibilityChanged)||(b?k.addClass(this._element,n.commandHiddenClass):k.removeClass(this._element,n.commandHiddenClass))}}},firstElementFocus:{get:function(){return this._firstElementFocus||this._lastElementFocus||this._element},set:function(a){this._firstElementFocus=a===this.element?null:a,this._updateTabStop()}},lastElementFocus:{get:function(){return this._lastElementFocus||this._firstElementFocus||this._element},set:function(a){this._lastElementFocus=a===this.element?null:a,this._updateTabStop()}},dispose:function(){this._disposed||(this._disposed=!0,this._tooltipControl&&this._tooltipControl.dispose(),this._type===n.typeContent&&j.disposeSubTree(this.element))},addEventListener:function(a,b,c){return this._element.addEventListener(a,b,c)},removeEventListener:function(a,b,c){return this._element.removeEventListener(a,b,c)},extraClass:{get:function(){return this._extraClass},set:function(a){this._extraClass&&k.removeClass(this._element,this._extraClass),this._extraClass=a,k.addClass(this._element,this._extraClass)}},_createContent:function(){if(this._element){if("DIV"!==this._element.tagName)throw new f("WinJS.UI.AppBarCommand.BadDivElement",r.badDivElement)}else this._element=b.document.createElement("div");parseInt(this._element.getAttribute("tabIndex"),10)!==this._element.tabIndex&&(this._element.tabIndex=0)},_createSeparator:function(){if(this._element){if("HR"!==this._element.tagName)throw new f("WinJS.UI.AppBarCommand.BadHrElement",r.badHrElement)}else this._element=b.document.createElement("hr")},_createButton:function(){if(this._element){if("BUTTON"!==this._element.tagName)throw new f("WinJS.UI.AppBarCommand.BadButtonElement",r.badButtonElement);var a=this._element.getAttribute("type");null!==a&&""!==a&&void 0!==a||this._element.setAttribute("type","button"),this._element.innerHTML=""}else this._element=b.document.createElement("button");this._element.type="button",this._iconSpan=b.document.createElement("span"),this._iconSpan.setAttribute("aria-hidden","true"),this._iconSpan.className="win-commandicon",this._iconSpan.tabIndex=-1,this._element.appendChild(this._iconSpan),this._imageSpan=b.document.createElement("span"),this._imageSpan.setAttribute("aria-hidden","true"),this._imageSpan.className="win-commandimage",this._imageSpan.tabIndex=-1,this._iconSpan.appendChild(this._imageSpan),this._labelSpan=b.document.createElement("span"),this._labelSpan.setAttribute("aria-hidden","true"),this._labelSpan.className="win-label",this._labelSpan.tabIndex=-1,this._element.appendChild(this._labelSpan),this._tooltipControl=new m.Tooltip(this._element)},_setSection:function(a){a||(a=n.sectionPrimary),this._section&&(this._section===n.sectionGlobal?k.removeClass(this._element,n.appBarCommandGlobalClass):this.section===n.sectionSelection&&k.removeClass(this._element,n.appBarCommandSelectionClass)),this._section=a,a===n.sectionGlobal?k.addClass(this._element,n.appBarCommandGlobalClass):a===n.sectionSelection&&k.addClass(this._element,n.appBarCommandSelectionClass)},_updateTabStop:function(){this._firstElementFocus||this._lastElementFocus?this.element.tabIndex=-1:this.element.tabIndex=0},_isFocusable:function(){return!this.hidden&&this._type!==n.typeSeparator&&!this.element.disabled&&(this.firstElementFocus.tabIndex>=0||this.lastElementFocus.tabIndex>=0)},_sendEvent:function(a,c){if(!this._disposed){var d=b.document.createEvent("CustomEvent");return d.initCustomEvent(a,!0,!0,c||{}),this._element.dispatchEvent(d)}}}),t=["label","disabled","flyout","extraClass","selected","onclick","hidden"];return s})}),d.Namespace._moduleDefine(a,"WinJS.UI",{Command:d.Namespace._lazy(function(){return a.AppBarCommand})})}),d("WinJS/Controls/Menu/_Command",["exports","../../Core/_Global","../../Core/_Base","../../Core/_ErrorFromName","../../Core/_Resources","../../Promise","../../Utilities/_Control","../../Utilities/_ElementUtilities","../_LegacyAppBar/_Constants","../Flyout/_Overlay","../Tooltip"],function(a,b,c,d,e,f,g,h,i,j,k){"use strict";c.Namespace._moduleDefine(a,"WinJS.UI",{MenuCommand:c.Namespace._lazy(function(){var a={get ariaLabel(){return e._getWinJSString("ui/menuCommandAriaLabel").value},get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get badClick(){return"Invalid argument: The onclick property for an {0} must be a function"},get badHrElement(){return"Invalid argument: For a separator, the element must be null or an hr element"},get badButtonElement(){return"Invalid argument: For a button, toggle, or flyout command, the element must be null or a button element"}},l=c.Class.define(function(b,c){if(b&&b.winControl)throw new d("WinJS.UI.MenuCommand.DuplicateConstruction",a.duplicateConstruction);if(this._disposed=!1,c||(c={}),c.type||(this._type=i.typeButton),this._element=b,c.type===i.typeSeparator?this._createSeparator():this._createButton(),h.addClass(this._element,"win-disposable"),this._element.winControl=this,h.addClass(this._element,i.menuCommandClass),c.selected||c.type!==i.typeToggle||(this.selected=!1),c.onclick&&(this.onclick=c.onclick),c.onclick=this._handleClick.bind(this),g.setOptions(this,c),this._type!==i.typeSeparator){var e=this._element.getAttribute("role");null!==e&&""!==e&&void 0!==e||(e="menuitem",this._type===i.typeToggle&&(e="checkbox"),this._element.setAttribute("role",e),this._type===i.typeFlyout&&this._element.setAttribute("aria-haspopup",!0));var f=this._element.getAttribute("aria-label");null!==f&&""!==f&&void 0!==f||this._element.setAttribute("aria-label",a.ariaLabel)}},{id:{get:function(){return this._element.id},set:function(a){this._element.id||(this._element.id=a)}},type:{get:function(){return this._type},set:function(a){this._type||(a!==i.typeButton&&a!==i.typeFlyout&&a!==i.typeToggle&&a!==i.typeSeparator&&(a=i.typeButton),this._type=a,a===i.typeButton?h.addClass(this.element,i.menuCommandButtonClass):a===i.typeFlyout?(h.addClass(this.element,i.menuCommandFlyoutClass),this.element.addEventListener("keydown",this._handleKeyDown.bind(this),!1)):a===i.typeSeparator?h.addClass(this.element,i.menuCommandSeparatorClass):a===i.typeToggle&&h.addClass(this.element,i.menuCommandToggleClass))}},label:{get:function(){return this._label},set:function(a){this._label=a||"",this._labelSpan&&(this._labelSpan.textContent=this.label),this._element.setAttribute("aria-label",this.label)}},onclick:{get:function(){return this._onclick},set:function(b){if(b&&"function"!=typeof b)throw new d("WinJS.UI.MenuCommand.BadClick",e._formatString(a.badClick,"MenuCommand"));this._onclick=b}},flyout:{get:function(){var a=this._flyout;return"string"==typeof a&&(a=b.document.getElementById(a)),a&&!a.element&&(a=a.winControl),a},set:function(a){var b=a;b&&"string"!=typeof b&&(b.element&&(b=b.element),b&&(b.id?b=b.id:(b.id=h._uniqueID(b),b=b.id))),"string"==typeof b&&this._element.setAttribute("aria-owns",b),this._flyout!==a&&l._deactivateFlyoutCommand(this),this._flyout=a}},tooltip:{get:function(){return this._tooltip},set:function(a){this._tooltip=a,this._tooltipControl&&(this._tooltipControl.innerHTML=this._tooltip)}},selected:{get:function(){return"true"===this._element.getAttribute("aria-checked")},set:function(a){this._element.setAttribute("aria-checked",!!a)}},element:{get:function(){return this._element}},disabled:{get:function(){return!!this._element.disabled},set:function(a){a=!!a,a&&this.type===i.typeFlyout&&l._deactivateFlyoutCommand(this),this._element.disabled=a}},hidden:{get:function(){return"hidden"===this._element.style.visibility},set:function(a){var b=j._Overlay._getParentControlUsingClassName(this._element,i.menuClass);if(b&&!b.hidden)throw new d("WinJS.UI.MenuCommand.CannotChangeHiddenProperty",e._formatString(j._Overlay.commonstrings.cannotChangeHiddenProperty,"Menu"));var c=this._element.style;a?(this.type===i.typeFlyout&&l._deactivateFlyoutCommand(this),c.visibility="hidden",c.display="none"):(c.visibility="",c.display="block")}},extraClass:{get:function(){return this._extraClass},set:function(a){this._extraClass&&h.removeClass(this._element,this._extraClass),this._extraClass=a,h.addClass(this._element,this._extraClass)}},dispose:function(){this._disposed||(this._disposed=!0,this._tooltipControl&&this._tooltipControl.dispose())},addEventListener:function(a,b,c){return this._element.addEventListener(a,b,c)},removeEventListener:function(a,b,c){return this._element.removeEventListener(a,b,c)},_createSeparator:function(){if(this._element){if("HR"!==this._element.tagName)throw new d("WinJS.UI.MenuCommand.BadHrElement",a.badHrElement)}else this._element=b.document.createElement("hr")},_createButton:function(){if(this._element){if("BUTTON"!==this._element.tagName)throw new d("WinJS.UI.MenuCommand.BadButtonElement",a.badButtonElement)}else this._element=b.document.createElement("button");this._element.innerHTML='<div class="win-menucommand-liner"><span class="win-toggleicon" aria-hidden="true"></span><span class="win-label" aria-hidden="true"></span><span class="win-flyouticon" aria-hidden="true"></span></div>',this._element.type="button",this._menuCommandLiner=this._element.firstElementChild,this._toggleSpan=this._menuCommandLiner.firstElementChild,this._labelSpan=this._toggleSpan.nextElementSibling,this._flyoutSpan=this._labelSpan.nextElementSibling,this._tooltipControl=new k.Tooltip(this._element)},_sendEvent:function(a,c){if(!this._disposed){var d=b.document.createEvent("CustomEvent");d.initCustomEvent(a,!0,!0,c||{}),this._element.dispatchEvent(d)}},_invoke:function(a){this.hidden||this.disabled||this._disposed||(this._type===i.typeToggle?this.selected=!this.selected:this._type===i.typeFlyout&&l._activateFlyoutCommand(this),a&&"click"===a.type&&this.onclick&&this.onclick(a),this._sendEvent(i._menuCommandInvokedEvent,{command:this}))},_handleClick:function(a){this._invoke(a)},_handleKeyDown:function(a){var b=h.Key,c="rtl"===h._getComputedStyle(this.element).direction,d=c?b.leftArrow:b.rightArrow;a.keyCode===d&&this.type===i.typeFlyout&&(this._invoke(a),a.preventDefault())}},{_activateFlyoutCommand:function(a){return new f(function(b,c){a=a.winControl||a;var d=a.flyout;d&&d.hidden&&d.show?(h.addClass(a.element,i.menuCommandFlyoutActivatedClass),d.element.setAttribute("aria-expanded","true"),d.addEventListener("beforehide",function e(){d.removeEventListener("beforehide",e,!1),h.removeClass(a.element,i.menuCommandFlyoutActivatedClass),d.element.removeAttribute("aria-expanded")},!1),d.addEventListener("aftershow",function f(){d.removeEventListener("aftershow",f,!1),b()},!1),d.show(a,"_cascade")):c()})},_deactivateFlyoutCommand:function(a){return new f(function(b){a=a.winControl||a,h.removeClass(a.element,i.menuCommandFlyoutActivatedClass);var c=a.flyout;c&&!c.hidden&&c.hide?(c.addEventListener("afterhide",function d(){c.removeEventListener("afterhide",d,!1),b()},!1),c.hide()):b()})}});return l})})});var e=this.__extends||function(a,b){function c(){this.constructor=a}for(var d in b)b.hasOwnProperty(d)&&(a[d]=b[d]);c.prototype=b.prototype,a.prototype=new c};return d("WinJS/Controls/CommandingSurface/_MenuCommand",["require","exports","../Menu/_Command"],function(a,b,c){var d=function(a){function b(b,c){c&&c.beforeInvoke&&(this._beforeInvoke=c.beforeInvoke),a.call(this,b,c)}return e(b,a),b.prototype._invoke=function(b){this._beforeInvoke&&this._beforeInvoke(b),a.prototype._invoke.call(this,b)},b}(c.MenuCommand);b._MenuCommand=d}),d("WinJS/Utilities/_OpenCloseMachine",["require","exports","../Core/_Global","../Promise","../_Signal"],function(a,b,c,d,e){"use strict";function f(a){return d._cancelBlocker(a,function(){a.cancel()})}function g(){}function h(a,b){a._interruptibleWorkPromises=a._interruptibleWorkPromises||[];var c=new e;a._interruptibleWorkPromises.push(b(c.promise)),c.complete()}function i(){(this._interruptibleWorkPromises||[]).forEach(function(a){a.cancel()})}var j={beforeOpen:"beforeopen",afterOpen:"afteropen",beforeClose:"beforeclose",afterClose:"afterclose",_openCloseStateSettled:"_openCloseStateSettled"},k=function(){function a(a){this._control=a,this._initializedSignal=new e,this._disposed=!1,this._setState(l.Init)}return a.prototype.exitInit=function(){this._initializedSignal.complete()},a.prototype.updateDom=function(){this._state.updateDom()},a.prototype.open=function(){this._state.open()},a.prototype.close=function(){this._state.close()},Object.defineProperty(a.prototype,"opened",{get:function(){return this._state.opened},set:function(a){a?this.open():this.close()},enumerable:!0,configurable:!0}),a.prototype.dispose=function(){this._setState(l.Disposed),this._disposed=!0,this._control=null},a.prototype._setState=function(a,b){this._disposed||(this._state&&this._state.exit(),this._state=new a,this._state.machine=this,this._state.enter(b))},a.prototype._fireEvent=function(a,b){b=b||{};var d=b.detail||null,e=!!b.cancelable,f=c.document.createEvent("CustomEvent");return f.initCustomEvent(a,!0,e,d),this._control.eventElement.dispatchEvent(f)},a.prototype._fireBeforeOpen=function(){return this._fireEvent(j.beforeOpen,{cancelable:!0})},a.prototype._fireBeforeClose=function(){return this._fireEvent(j.beforeClose,{cancelable:!0})},a}();b.OpenCloseMachine=k;var l;!function(a){function b(){this.machine._control.onUpdateDom()}var c=function(){function a(){this.name="Init",this.exit=i,this.updateDom=g}return a.prototype.enter=function(){var a=this;h(this,function(b){return b.then(function(){return a.machine._initializedSignal.promise}).then(function(){a.machine._control.onUpdateDomWithIsOpened(a._opened),a.machine._setState(a._opened?l:d)})})},Object.defineProperty(a.prototype,"opened",{get:function(){return this._opened},enumerable:!0,configurable:!0}),a.prototype.open=function(){this._opened=!0},a.prototype.close=function(){this._opened=!1},a}();a.Init=c;var d=function(){function a(){this.name="Closed",this.exit=g,this.opened=!1,this.close=g,this.updateDom=b}return a.prototype.enter=function(a){a=a||{},a.openIsPending&&this.open(),this.machine._fireEvent(j._openCloseStateSettled)},a.prototype.open=function(){this.machine._setState(e)},a}(),e=function(){function a(){this.name="BeforeOpen",this.exit=i,this.opened=!1,this.open=g,this.close=g,this.updateDom=b}return a.prototype.enter=function(){var a=this;h(this,function(b){return b.then(function(){return a.machine._fireBeforeOpen()}).then(function(b){b?a.machine._setState(k):a.machine._setState(d)})})},a}(),k=function(){function a(){this.name="Opening",this.exit=i,this.updateDom=g}return a.prototype.enter=function(){var a=this;h(this,function(b){return b.then(function(){return a._closeIsPending=!1,f(a.machine._control.onOpen())}).then(function(){a.machine._fireEvent(j.afterOpen)}).then(function(){a.machine._control.onUpdateDom(),a.machine._setState(l,{closeIsPending:a._closeIsPending})})})},Object.defineProperty(a.prototype,"opened",{get:function(){return!this._closeIsPending},enumerable:!0,configurable:!0}),a.prototype.open=function(){this._closeIsPending=!1},a.prototype.close=function(){this._closeIsPending=!0},a}(),l=function(){function a(){this.name="Opened",this.exit=g,this.opened=!0,this.open=g,this.updateDom=b}return a.prototype.enter=function(a){a=a||{},a.closeIsPending&&this.close(),this.machine._fireEvent(j._openCloseStateSettled)},a.prototype.close=function(){this.machine._setState(m)},a}(),m=function(){function a(){this.name="BeforeClose",this.exit=i,this.opened=!0,this.open=g,this.close=g,this.updateDom=b}return a.prototype.enter=function(){var a=this;h(this,function(b){return b.then(function(){return a.machine._fireBeforeClose()}).then(function(b){b?a.machine._setState(n):a.machine._setState(l)})})},a}(),n=function(){function a(){this.name="Closing",this.exit=i,this.updateDom=g}return a.prototype.enter=function(){var a=this;h(this,function(b){return b.then(function(){return a._openIsPending=!1,f(a.machine._control.onClose())}).then(function(){a.machine._fireEvent(j.afterClose)}).then(function(){a.machine._control.onUpdateDom(),a.machine._setState(d,{openIsPending:a._openIsPending})})})},Object.defineProperty(a.prototype,"opened",{get:function(){return this._openIsPending},enumerable:!0,configurable:!0}),a.prototype.open=function(){this._openIsPending=!0},a.prototype.close=function(){this._openIsPending=!1},a}(),o=function(){function a(){this.name="Disposed",this.enter=g,this.exit=g,this.opened=!1,this.open=g,this.close=g,this.updateDom=g}return a}();a.Disposed=o}(l||(l={}))}),d("require-style!less/styles-commandingsurface",[],function(){}),d("require-style!less/colors-commandingsurface",[],function(){}),d("WinJS/Controls/CommandingSurface/_CommandingSurface",["require","exports","../../Animations","../../Core/_Base","../../Core/_BaseUtils","../../BindingList","../../ControlProcessor","../CommandingSurface/_Constants","../AppBar/_Command","../CommandingSurface/_MenuCommand","../../Utilities/_Control","../../Utilities/_Dispose","../../Utilities/_ElementUtilities","../../Core/_ErrorFromName","../../Core/_Events","../../Controls/Flyout","../../Core/_Global","../../Utilities/_Hoverable","../../Utilities/_KeyboardBehavior","../../Core/_Log","../../Promise","../../Core/_Resources","../../Scheduler","../../Utilities/_OpenCloseMachine","../../_Signal","../../Core/_WriteProfilerMark"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z){function A(a,b){b&&m.addClass(a,b)}function B(a,b){b&&m.removeClass(a,b)}function C(a,b){return a.filter(function(a){return b.indexOf(a)<0})}function D(a,b){return a.filter(function(a){return-1!==b.indexOf(a)})}a(["require-style!less/styles-commandingsurface"]),a(["require-style!less/colors-commandingsurface"]);var E={get overflowButtonAriaLabel(){return v._getWinJSString("ui/commandingSurfaceOverflowButtonAriaLabel").value},get badData(){return"Invalid argument: The data property must an instance of a WinJS.Binding.List"},get mustContainCommands(){return"The commandingSurface can only contain WinJS.UI.Command or WinJS.UI.AppBarCommand controls"},get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"}},F={bottom:"bottom",top:"top"},G={};G[F.top]=h.ClassNames.overflowTopClass,G[F.bottom]=h.ClassNames.overflowBottomClass;var H={none:"none",minimal:"minimal",compact:"compact",full:"full"},I={};I[H.none]=h.ClassNames.noneClass,I[H.minimal]=h.ClassNames.minimalClass,I[H.compact]=h.ClassNames.compactClass,I[H.full]=h.ClassNames.fullClass;var J=function(){function a(a,b){var c=this;if(void 0===b&&(b={}),this._hoverable=r.isHoverable,this._dataChangedEvents=["itemchanged","iteminserted","itemmoved","itemremoved","reload"],this._updateDomImpl=function(){var a={closedDisplayMode:void 0,isOpenedMode:void 0,overflowDirection:void 0,overflowAlignmentOffset:void 0},b=function(){var b=a,d=c._dom;if(b.isOpenedMode!==c._isOpenedMode&&(c._isOpenedMode?(B(d.root,h.ClassNames.closedClass),A(d.root,h.ClassNames.openedClass),d.overflowButton.setAttribute("aria-expanded","true"),d.firstTabStop.tabIndex=0,d.finalTabStop.tabIndex=0,d.firstTabStop.setAttribute("x-ms-aria-flowfrom",d.finalTabStop.id),d.finalTabStop.setAttribute("aria-flowto",d.firstTabStop.id)):(B(d.root,h.ClassNames.openedClass),A(d.root,h.ClassNames.closedClass),d.overflowButton.setAttribute("aria-expanded","false"),d.firstTabStop.tabIndex=-1,d.finalTabStop.tabIndex=-1,d.firstTabStop.removeAttribute("x-ms-aria-flowfrom"),d.finalTabStop.removeAttribute("aria-flowto")),b.isOpenedMode=c._isOpenedMode),b.closedDisplayMode!==c.closedDisplayMode&&(B(d.root,I[b.closedDisplayMode]),A(d.root,I[c.closedDisplayMode]),b.closedDisplayMode=c.closedDisplayMode),b.overflowDirection!==c.overflowDirection&&(B(d.root,G[b.overflowDirection]),A(d.root,G[c.overflowDirection]),b.overflowDirection=c.overflowDirection),c._overflowAlignmentOffset!==b.overflowAlignmentOffset){var e=c._rtl?"left":"right",f=c._overflowAlignmentOffset+"px";d.overflowAreaContainer.style[e]=f}},d={newDataStage:3,measuringStage:2,layoutStage:1,idle:0},e=d.idle,f=function(){c._writeProfilerMark("_updateDomImpl_updateCommands,info");for(var a=e;a!==d.idle;){var b=a,f=!1;switch(a){case d.newDataStage:a=d.measuringStage,f=c._processNewData();break;case d.measuringStage:a=d.layoutStage,f=c._measure();break;case d.layoutStage:a=d.idle,f=c._layoutCommands()}if(!f){a=b;break}}e=a,a===d.idle?c._layoutCompleteCallback&&c._layoutCompleteCallback():c._minimalLayout()};return{get renderedState(){return{get closedDisplayMode(){return a.closedDisplayMode},get isOpenedMode(){return a.isOpenedMode},get overflowDirection(){return a.overflowDirection},get overflowAlignmentOffset(){return a.overflowAlignmentOffset}}},update:function(){b(),f()},dataDirty:function(){e=Math.max(d.newDataStage,e)},measurementsDirty:function(){e=Math.max(d.measuringStage,e)},layoutDirty:function(){e=Math.max(d.layoutStage,e)},get _currentLayoutStage(){return e}}}(),this._writeProfilerMark("constructor,StartTM"),a){if(a.winControl)throw new n("WinJS.UI._CommandingSurface.DuplicateConstruction",E.duplicateConstruction);b.data||(b=e._shallowCopy(b),b.data=b.data||this._getDataFromDOMElements(a))}this._initializeDom(a||q.document.createElement("div")),this._machine=b.openCloseMachine||new x.OpenCloseMachine({eventElement:this._dom.root,onOpen:function(){return c.synchronousOpen(),u.wrap()},onClose:function(){return c.synchronousClose(),u.wrap()},onUpdateDom:function(){c._updateDomImpl.update()},onUpdateDomWithIsOpened:function(a){a?c.synchronousOpen():c.synchronousClose()}}),this._disposed=!1,this._primaryCommands=[],this._secondaryCommands=[],this._refreshBound=this._refresh.bind(this),this._resizeHandlerBound=this._resizeHandler.bind(this),this._winKeyboard=new s._WinKeyboard(this._dom.root),this._refreshPending=!1,this._rtl=!1,this._initializedSignal=new y,this._isOpenedMode=h.defaultOpened,this._menuCommandProjections=[],this.overflowDirection=h.defaultOverflowDirection,this.closedDisplayMode=h.defaultClosedDisplayMode,this.opened=this._isOpenedMode,k.setOptions(this,b),m._resizeNotifier.subscribe(this._dom.root,this._resizeHandlerBound),this._dom.root.addEventListener("keydown",this._keyDownHandler.bind(this)),m._addEventListener(this._dom.firstTabStop,"focusin",function(){c._focusLastFocusableElementOrThis(!1)}),m._addEventListener(this._dom.finalTabStop,"focusin",function(){c._focusFirstFocusableElementOrThis(!1)}),m._inDom(this._dom.root).then(function(){c._rtl="rtl"===m._getComputedStyle(c._dom.root).direction,b.openCloseMachine||c._machine.exitInit(),c._initializedSignal.complete(),c._writeProfilerMark("constructor,StopTM")})}return Object.defineProperty(a.prototype,"element",{get:function(){return this._dom.root},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"data",{get:function(){return this._data},set:function(a){if(this._writeProfilerMark("set_data,info"),a!==this.data){if(!(a instanceof f.List))throw new n("WinJS.UI._CommandingSurface.BadData",E.badData);this._data&&this._removeDataListeners(),this._data=a,this._addDataListeners(),this._dataUpdated()}},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"closedDisplayMode",{get:function(){return this._closedDisplayMode},set:function(a){this._writeProfilerMark("set_closedDisplayMode,info");var b=a!==this._closedDisplayMode;H[a]&&b&&(this._updateDomImpl.layoutDirty(),this._closedDisplayMode=a,this._machine.updateDom())},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"overflowDirection",{get:function(){return this._overflowDirection},set:function(a){var b=a!==this._overflowDirection;F[a]&&b&&(this._overflowDirection=a,this._machine.updateDom())},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"opened",{get:function(){return this._machine.opened},set:function(a){this._machine.opened=a},enumerable:!0,configurable:!0}),a.prototype.open=function(){this._machine.open()},a.prototype.close=function(){this._machine.close()},a.prototype.dispose=function(){this._disposed||(this._disposed=!0,this._machine.dispose(),m._resizeNotifier.unsubscribe(this._dom.root,this._resizeHandlerBound),this._contentFlyout&&(this._contentFlyout.dispose(),this._contentFlyout.element.parentNode.removeChild(this._contentFlyout.element)),l.disposeSubTree(this._dom.root))},a.prototype.forceLayout=function(){this._updateDomImpl.measurementsDirty(),this._machine.updateDom()},a.prototype.getBoundingRects=function(){return{commandingSurface:this._dom.root.getBoundingClientRect(),overflowArea:this._dom.overflowArea.getBoundingClientRect()}},a.prototype.getCommandById=function(a){if(this._data)for(var b=0,c=this._data.length;c>b;b++){var d=this._data.getAt(b);if(d.id===a)return d}return null},a.prototype.showOnlyCommands=function(a){if(this._data){for(var b=0,c=this._data.length;c>b;b++)this._data.getAt(b).hidden=!0;for(var b=0,c=a.length;c>b;b++){var d="string"==typeof a[b]?this.getCommandById(a[b]):a[b];d&&(d.hidden=!1)}}},a.prototype.takeFocus=function(a){this._focusFirstFocusableElementOrThis(a)},a.prototype._focusFirstFocusableElementOrThis=function(a){m._focusFirstFocusableElement(this._dom.content,a)||m._tryFocusOnAnyElement(this.element,a)},a.prototype._focusLastFocusableElementOrThis=function(a){m._focusLastFocusableElement(this._dom.content,a)||m._tryFocusOnAnyElement(this.element,a)},a.prototype.deferredDomUpate=function(){this._machine.updateDom()},a.prototype.createOpenAnimation=function(a){t.log&&this._updateDomImpl.renderedState.isOpenedMode&&t.log("The CommandingSurface should only attempt to create an open animation when it's not already opened");var b=this;return{execute:function(){m.addClass(b.element,h.ClassNames.openingClass);var d=b.getBoundingRects();return b._dom.overflowAreaContainer.style.width=d.overflowArea.width+"px",b._dom.overflowAreaContainer.style.height=d.overflowArea.height+"px",c._commandingSurfaceOpenAnimation({actionAreaClipper:b._dom.actionAreaContainer,actionArea:b._dom.actionArea,overflowAreaClipper:b._dom.overflowAreaContainer,overflowArea:b._dom.overflowArea,oldHeight:a,newHeight:d.commandingSurface.height,overflowAreaHeight:d.overflowArea.height,menuPositionedAbove:b.overflowDirection===F.top}).then(function(){m.removeClass(b.element,h.ClassNames.openingClass),b._clearAnimation()})}}},a.prototype.createCloseAnimation=function(a){t.log&&!this._updateDomImpl.renderedState.isOpenedMode&&t.log("The CommandingSurface should only attempt to create an closed animation when it's not already closed");var b=this.getBoundingRects().commandingSurface.height,d=this._dom.overflowArea.offsetHeight,e=(this._dom.overflowArea.offsetTop,this);return{execute:function(){return m.addClass(e.element,h.ClassNames.closingClass),c._commandingSurfaceCloseAnimation({actionAreaClipper:e._dom.actionAreaContainer,actionArea:e._dom.actionArea,overflowAreaClipper:e._dom.overflowAreaContainer,overflowArea:e._dom.overflowArea,oldHeight:b,newHeight:a,overflowAreaHeight:d,menuPositionedAbove:e.overflowDirection===F.top}).then(function(){m.removeClass(e.element,h.ClassNames.closingClass),e._clearAnimation()})}}},Object.defineProperty(a.prototype,"initialized",{get:function(){return this._initializedSignal.promise},enumerable:!0,configurable:!0}),a.prototype._writeProfilerMark=function(a){z("WinJS.UI._CommandingSurface:"+this._id+":"+a)},a.prototype._initializeDom=function(a){var b=this;this._writeProfilerMark("_intializeDom,info"),a.winControl=this,this._id=a.id||m._uniqueID(a),a.hasAttribute("tabIndex")||(a.tabIndex=-1),m.addClass(a,h.ClassNames.controlCssClass),m.addClass(a,h.ClassNames.disposableCssClass);var c=q.document.createElement("div");m.addClass(c,h.ClassNames.contentClass),a.appendChild(c);var d=q.document.createElement("div");m.addClass(d,h.ClassNames.actionAreaCssClass);var e=document.createElement("div");m.addClass(e,h.ClassNames.insetOutlineClass);var f=q.document.createElement("div");m.addClass(f,h.ClassNames.actionAreaContainerCssClass),f.appendChild(d),f.appendChild(e),c.appendChild(f);var g=q.document.createElement("div");m.addClass(g,h.ClassNames.spacerCssClass),g.tabIndex=-1,d.appendChild(g);var i=q.document.createElement("button");i.tabIndex=0,i.innerHTML="<span class='"+h.ClassNames.ellipsisCssClass+"'></span>",i.setAttribute("aria-label",E.overflowButtonAriaLabel),m.addClass(i,h.ClassNames.overflowButtonCssClass),d.appendChild(i),i.addEventListener("click",function(){b.opened=!b.opened});var j=q.document.createElement("div");m.addClass(j,h.ClassNames.overflowAreaCssClass),m.addClass(j,h.ClassNames.menuCssClass);var k=q.document.createElement("DIV");m.addClass(k,h.ClassNames.insetOutlineClass);var l=q.document.createElement("div");m.addClass(l,h.ClassNames.overflowAreaContainerCssClass),l.appendChild(j),l.appendChild(k),c.appendChild(l);var n=q.document.createElement("div");m.addClass(n,h.ClassNames.spacerCssClass),n.tabIndex=-1,j.appendChild(n);var o=q.document.createElement("div");m.addClass(o,h.ClassNames.tabStopClass),m._ensureId(o),a.insertBefore(o,a.children[0]);var p=q.document.createElement("div");m.addClass(p,h.ClassNames.tabStopClass),m._ensureId(p),a.appendChild(p),this._dom={root:a,content:c,actionArea:d,actionAreaContainer:f,actionAreaSpacer:g,overflowButton:i,overflowArea:j,overflowAreaContainer:l,overflowAreaSpacer:n,firstTabStop:o,finalTabStop:p}},a.prototype._getFocusableElementsInfo=function(){var a=this,b={elements:[],focusedIndex:-1},c=Array.prototype.slice.call(this._dom.actionArea.children);return this._updateDomImpl.renderedState.isOpenedMode&&(c=c.concat(Array.prototype.slice.call(this._dom.overflowArea.children))),c.forEach(function(c){a._isElementFocusable(c)&&(b.elements.push(c),c.contains(q.document.activeElement)&&(b.focusedIndex=b.elements.length-1))}),b},a.prototype._dataUpdated=function(){var a=this;this._primaryCommands=[],this._secondaryCommands=[],this.data.length>0&&this.data.forEach(function(b){"secondary"===b.section?a._secondaryCommands.push(b):a._primaryCommands.push(b)}),this._updateDomImpl.dataDirty(),this._machine.updateDom()},a.prototype._refresh=function(){var a=this;this._refreshPending||(this._refreshPending=!0,this._batchDataUpdates(function(){a._refreshPending&&!a._disposed&&(a._refreshPending=!1,a._dataUpdated())}))},a.prototype._batchDataUpdates=function(a){w.schedule(function(){a()},w.Priority.high,null,"WinJS.UI._CommandingSurface._refresh")},a.prototype._addDataListeners=function(){var a=this;this._dataChangedEvents.forEach(function(b){a._data.addEventListener(b,a._refreshBound,!1)})},a.prototype._removeDataListeners=function(){var a=this;this._dataChangedEvents.forEach(function(b){a._data.removeEventListener(b,a._refreshBound,!1)})},a.prototype._isElementFocusable=function(a){var b=!1;if(a){var c=a.winControl;b=c?!this._hasAnyHiddenClasses(c)&&c.type!==h.typeSeparator&&!c.hidden&&!c.disabled&&(!c.firstElementFocus||c.firstElementFocus.tabIndex>=0||c.lastElementFocus.tabIndex>=0):"none"!==a.style.display&&"hidden"!==m._getComputedStyle(a).visibility&&a.tabIndex>=0}return b},a.prototype._clearHiddenPolicyClasses=function(a){
-m.removeClass(a.element,h.ClassNames.commandPrimaryOverflownPolicyClass),m.removeClass(a.element,h.ClassNames.commandSecondaryOverflownPolicyClass),m.removeClass(a.element,h.ClassNames.commandSeparatorHiddenPolicyClass)},a.prototype._hasHiddenPolicyClasses=function(a){return m.hasClass(a.element,h.ClassNames.commandPrimaryOverflownPolicyClass)||m.hasClass(a.element,h.ClassNames.commandSecondaryOverflownPolicyClass)||m.hasClass(a.element,h.ClassNames.commandSeparatorHiddenPolicyClass)},a.prototype._hasAnyHiddenClasses=function(a){return m.hasClass(a.element,h.ClassNames.commandHiddenClass)||this._hasHiddenPolicyClasses(a)},a.prototype._isCommandInActionArea=function(a){return a&&a.winControl&&a.parentElement===this._dom.actionArea},a.prototype._getLastElementFocus=function(a){return this._isCommandInActionArea(a)?a.winControl.lastElementFocus:a},a.prototype._getFirstElementFocus=function(a){return this._isCommandInActionArea(a)?a.winControl.firstElementFocus:a},a.prototype._keyDownHandler=function(a){if(!a.altKey){if(m._matchesSelector(a.target,".win-interactive, .win-interactive *"))return;var b,c=m.Key,d=this._getFocusableElementsInfo();if(d.elements.length)switch(a.keyCode){case this._rtl?c.rightArrow:c.leftArrow:case c.upArrow:var e=Math.max(0,d.focusedIndex-1);b=this._getLastElementFocus(d.elements[e%d.elements.length]);break;case this._rtl?c.leftArrow:c.rightArrow:case c.downArrow:var e=Math.min(d.focusedIndex+1,d.elements.length-1);b=this._getFirstElementFocus(d.elements[e]);break;case c.home:var e=0;b=this._getFirstElementFocus(d.elements[e]);break;case c.end:var e=d.elements.length-1;b=this._getLastElementFocus(d.elements[e])}b&&b!==q.document.activeElement&&(b.focus(),a.preventDefault())}},a.prototype._getDataFromDOMElements=function(a){this._writeProfilerMark("_getDataFromDOMElements,info"),g.processAll(a,!0);for(var b,c=[],d=a.children.length,e=0;d>e;e++){if(b=a.children[e],!(b.winControl&&b.winControl instanceof i.AppBarCommand))throw new n("WinJS.UI._CommandingSurface.MustContainCommands",E.mustContainCommands);c.push(b.winControl)}return new f.List(c)},a.prototype._canMeasure=function(){return(this._updateDomImpl.renderedState.isOpenedMode||this._updateDomImpl.renderedState.closedDisplayMode===H.compact||this._updateDomImpl.renderedState.closedDisplayMode===H.full)&&q.document.body.contains(this._dom.root)&&this._dom.actionArea.offsetWidth>0},a.prototype._resizeHandler=function(){if(this._canMeasure()){var a=m._getPreciseContentWidth(this._dom.actionArea);this._cachedMeasurements&&this._cachedMeasurements.actionAreaContentBoxWidth!==a&&(this._cachedMeasurements.actionAreaContentBoxWidth=a,this._updateDomImpl.layoutDirty(),this._machine.updateDom())}else this._updateDomImpl.measurementsDirty()},a.prototype.synchronousOpen=function(){this._overflowAlignmentOffset=0,this._isOpenedMode=!0,this._updateDomImpl.update(),this._overflowAlignmentOffset=this._computeAdjustedOverflowAreaOffset(),this._updateDomImpl.update()},a.prototype._computeAdjustedOverflowAreaOffset=function(){t.log&&(!this._updateDomImpl.renderedState.isOpenedMode&&t.log("The CommandingSurface should only attempt to compute adjusted overflowArea offset  when it has been rendered opened"),0!==this._updateDomImpl.renderedState.overflowAlignmentOffset&&t.log("The CommandingSurface should only attempt to compute adjusted overflowArea offset  when it has been rendered with an overflowAlignementOffset of 0"));var a=(this._dom.overflowArea,this.getBoundingRects()),b=0;if(this._rtl){var c=window.innerWidth,d=a.overflowArea.right;b=Math.min(c-d,0)}else{var e=a.overflowArea.left;b=Math.min(0,e)}return b},a.prototype.synchronousClose=function(){this._isOpenedMode=!1,this._updateDomImpl.update()},a.prototype.updateDom=function(){this._updateDomImpl.update()},a.prototype._getDataChangeInfo=function(){var a=this,b=[],c=[],d=[],e=[],f=[],g=[],i=[],j=[],k=[],l=[];return Array.prototype.forEach.call(this._dom.actionArea.querySelectorAll(h.commandSelector),function(b){a._hasAnyHiddenClasses(b.winControl)||e.push(b),f.push(b)}),this.data.forEach(function(b){var c=b.hidden,d=c&&!m.hasClass(b.element,h.ClassNames.commandHiddenClass),e=!c&&m.hasClass(b.element,h.ClassNames.commandHiddenClass),f=m.hasClass(b.element,h.ClassNames.commandPrimaryOverflownPolicyClass);a._hasAnyHiddenClasses(b.element.winControl)||g.push(b.element),f?j.push(b.element):d?k.push(b.element):e&&l.push(b.element),i.push(b.element)}),c=C(f,i),d=D(e,g),b=C(i,f),{nextElements:i,prevElements:f,added:b,deleted:c,unchanged:d,hiding:k,showing:l,overflown:j}},a.prototype._processNewData=function(){var a=this;this._writeProfilerMark("_processNewData,info");var b=this._getDataChangeInfo(),d=c._createUpdateListAnimation(b.added.concat(b.showing).concat(b.overflown),b.deleted.concat(b.hiding),b.unchanged);return b.deleted.forEach(function(b){var c=b.winControl;c&&c._propertyMutations&&c._propertyMutations.unbind(a._refreshBound)}),b.added.forEach(function(b){var c=b.winControl;c&&c._propertyMutations&&c._propertyMutations.bind(a._refreshBound)}),b.prevElements.forEach(function(a){a.parentElement&&a.parentElement.removeChild(a)}),b.nextElements.forEach(function(b){a._dom.actionArea.appendChild(b)}),b.hiding.forEach(function(a){m.addClass(a,h.ClassNames.commandHiddenClass)}),b.showing.forEach(function(a){m.removeClass(a,h.ClassNames.commandHiddenClass)}),this._dom.actionArea.appendChild(this._dom.overflowButton),d.execute(),!0},a.prototype._measure=function(){var a=this;if(this._writeProfilerMark("_measure,info"),this._canMeasure()){var b=this._dom.overflowButton.style.display;this._dom.overflowButton.style.display="";var c=m._getPreciseTotalWidth(this._dom.overflowButton);this._dom.overflowButton.style.display=b;var d=m._getPreciseContentWidth(this._dom.actionArea),e=0,f=0,g={};return this._primaryCommands.forEach(function(b){var c=b.element.style.display;b.element.style.display="inline-block",b.type===h.typeContent?g[a._commandUniqueId(b)]=m._getPreciseTotalWidth(b.element):b.type===h.typeSeparator?e||(e=m._getPreciseTotalWidth(b.element)):f||(f=m._getPreciseTotalWidth(b.element)),b.element.style.display=c}),this._cachedMeasurements={contentCommandWidths:g,separatorWidth:e,standardCommandWidth:f,overflowButtonWidth:c,actionAreaContentBoxWidth:d},!0}return!1},a.prototype._layoutCommands=function(){var a=this;this._writeProfilerMark("_layoutCommands,StartTM");var b=[],c=[],d=[],e=[];this.data.forEach(function(d){a._clearHiddenPolicyClasses(d),d.hidden||(d.section===h.secondaryCommandSection?b.push(d):c.push(d))});var f=b.length>0,g=this._getVisiblePrimaryCommandsLocation(c,f);d=g.commandsForActionArea,e=g.commandsForOverflowArea,e.forEach(function(a){return m.addClass(a.element,h.ClassNames.commandPrimaryOverflownPolicyClass)}),b.forEach(function(a){return m.addClass(a.element,h.ClassNames.commandSecondaryOverflownPolicyClass)}),this._hideSeparatorsIfNeeded(d),m.empty(this._dom.overflowArea),this._menuCommandProjections.map(function(a){a.dispose()});var i=function(a){return a.type===h.typeContent},k=e.some(i)||b.some(i);k&&!this._contentFlyout&&(this._contentFlyoutInterior=q.document.createElement("div"),m.addClass(this._contentFlyoutInterior,h.ClassNames.contentFlyoutCssClass),this._contentFlyout=new p.Flyout,this._contentFlyout.element.appendChild(this._contentFlyoutInterior),q.document.body.appendChild(this._contentFlyout.element),this._contentFlyout.onbeforeshow=function(){m.empty(a._contentFlyoutInterior),m._reparentChildren(a._chosenCommand.element,a._contentFlyoutInterior)},this._contentFlyout.onafterhide=function(){m._reparentChildren(a._contentFlyoutInterior,a._chosenCommand.element)});var l=!1,n=[];if(e.forEach(function(b){b.type===h.typeToggle&&(l=!0),n.push(a._projectAsMenuCommand(b))}),e.length>0&&b.length>0){var o=new j._MenuCommand(null,{type:h.typeSeparator});n.push(o)}b.forEach(function(b){b.type===h.typeToggle&&(l=!0),n.push(a._projectAsMenuCommand(b))}),this._hideSeparatorsIfNeeded(n),n.forEach(function(b){a._dom.overflowArea.appendChild(b.element)}),this._menuCommandProjections=n,m[l?"addClass":"removeClass"](this._dom.overflowArea,h.ClassNames.menuContainsToggleCommandClass),n.length>0&&this._dom.overflowArea.appendChild(this._dom.overflowAreaSpacer);var r=this._needsOverflowButton(d.length>0,n.length>0);return this._dom.overflowButton.style.display=r?"":"none",this._writeProfilerMark("_layoutCommands,StopTM"),!0},a.prototype._getVisiblePrimaryCommandsInfo=function(a){for(var b=0,c=[],d=0,e=0,f=a.length-1;f>=0;f--){var g=a[f];d=void 0===g.priority?e--:g.priority,b=this._getCommandWidth(g),c.unshift({command:g,width:b,priority:d})}return c},a.prototype._getVisiblePrimaryCommandsLocation=function(a,b){for(var c=[],d=[],e=this._getVisiblePrimaryCommandsInfo(a),f=e.slice(0).sort(function(a,b){return a.priority-b.priority}),g=Number.MAX_VALUE,h=this._cachedMeasurements.actionAreaContentBoxWidth,i=this._needsOverflowButton(a.length>0,b),j=0,k=f.length;k>j;j++){h-=f[j].width;var l=i||j!==k-1?this._cachedMeasurements.overflowButtonWidth:0;if(l>h){g=f[j].priority-1;break}}return e.forEach(function(a){a.priority<=g?c.push(a.command):d.push(a.command)}),{commandsForActionArea:c,commandsForOverflowArea:d}},a.prototype._needsOverflowButton=function(a,b){return b?!0:!(!this._hasExpandableActionArea()||!a)},a.prototype._minimalLayout=function(){if(this.closedDisplayMode===H.minimal){var a=function(a){return!a.hidden},b=this.data.some(a);this._dom.overflowButton.style.display=b?"":"none"}},a.prototype._commandUniqueId=function(a){return m._uniqueID(a.element)},a.prototype._getCommandWidth=function(a){return a.type===h.typeContent?this._cachedMeasurements.contentCommandWidths[this._commandUniqueId(a)]:a.type===h.typeSeparator?this._cachedMeasurements.separatorWidth:this._cachedMeasurements.standardCommandWidth},a.prototype._projectAsMenuCommand=function(a){var b=this,c=new j._MenuCommand(null,{label:a.label,type:(a.type===h.typeContent?h.typeFlyout:a.type)||h.typeButton,disabled:a.disabled,flyout:a.flyout,tooltip:a.tooltip,beforeInvoke:function(){b._chosenCommand=c._originalICommand,b._chosenCommand.type===h.typeToggle&&(b._chosenCommand.selected=!b._chosenCommand.selected)}});return a.selected&&(c.selected=!0),a.extraClass&&(c.extraClass=a.extraClass),a.type===h.typeContent?(c.label||(c.label=h.contentMenuCommandDefaultLabel),c.flyout=this._contentFlyout):c.onclick=a.onclick,c._originalICommand=a,c},a.prototype._hideSeparatorsIfNeeded=function(a){var b,c=h.typeSeparator,d=a.length;a.forEach(function(a){a.type===h.typeSeparator&&c===h.typeSeparator&&m.addClass(a.element,h.ClassNames.commandSeparatorHiddenPolicyClass),c=a.type});for(var e=d-1;e>=0&&(b=a[e],b.type===h.typeSeparator);e--)m.addClass(b.element,h.ClassNames.commandSeparatorHiddenPolicyClass)},a.prototype._hasExpandableActionArea=function(){switch(this.closedDisplayMode){case H.none:case H.minimal:case H.compact:return!0;case H.full:default:return!1}},a.prototype._clearAnimation=function(){var a=e._browserStyleEquivalents.transform.scriptName;this._dom.actionAreaContainer.style[a]="",this._dom.actionArea.style[a]="",this._dom.overflowAreaContainer.style[a]="",this._dom.overflowArea.style[a]=""},a.ClosedDisplayMode=H,a.OverflowDirection=F,a.supportedForProcessing=!0,a}();b._CommandingSurface=J,d.Class.mix(J,o.createEventProperties(h.EventNames.beforeOpen,h.EventNames.afterOpen,h.EventNames.beforeClose,h.EventNames.afterClose)),d.Class.mix(J,k.DOMEventMixin)}),d("WinJS/Controls/CommandingSurface",["require","exports"],function(a,b){function c(){return d||a(["./CommandingSurface/_CommandingSurface"],function(a){d=a}),d._CommandingSurface}var d=null,e=Object.create({},{_CommandingSurface:{get:function(){return c()}}});return e}),d("require-style!less/styles-toolbar",[],function(){}),d("WinJS/Controls/ToolBar/_ToolBar",["require","exports","../../Core/_Base","../ToolBar/_Constants","../CommandingSurface","../../Utilities/_Control","../../Utilities/_Dispose","../../Utilities/_ElementUtilities","../../Core/_ErrorFromName","../../Core/_Events","../../Core/_Global","../../_LightDismissService","../../Core/_Resources","../../Utilities/_OpenCloseMachine","../../Core/_WriteProfilerMark"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){function p(a,b){b&&h.addClass(a,b)}function q(a,b){b&&h.removeClass(a,b)}a(["require-style!less/styles-toolbar"]);var r={get ariaLabel(){return m._getWinJSString("ui/toolbarAriaLabel").value},get overflowButtonAriaLabel(){return m._getWinJSString("ui/toolbarOverflowButtonAriaLabel").value},get mustContainCommands(){return"The toolbar can only contain WinJS.UI.Command or WinJS.UI.AppBarCommand controls"},get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"}},s={compact:"compact",full:"full"},t={};t[s.compact]=d.ClassNames.compactClass,t[s.full]=d.ClassNames.fullClass;var u=function(){function a(a,b){var c=this;if(void 0===b&&(b={}),this._updateDomImpl_renderedState={isOpenedMode:void 0,closedDisplayMode:void 0,prevInlineWidth:void 0},this._writeProfilerMark("constructor,StartTM"),a&&a.winControl)throw new i("WinJS.UI.ToolBar.DuplicateConstruction",r.duplicateConstruction);this._initializeDom(a||k.document.createElement("div"));var g=new n.OpenCloseMachine({eventElement:this.element,onOpen:function(){var a=c._commandingSurface.createOpenAnimation(c._getClosedHeight());return c._synchronousOpen(),a.execute()},onClose:function(){var a=c._commandingSurface.createCloseAnimation(c._getClosedHeight());return a.execute().then(function(){c._synchronousClose()})},onUpdateDom:function(){c._updateDomImpl()},onUpdateDomWithIsOpened:function(a){c._isOpenedMode=a,c._updateDomImpl()}});this._handleShowingKeyboardBound=this._handleShowingKeyboard.bind(this),h._inputPaneListener.addEventListener(this._dom.root,"showing",this._handleShowingKeyboardBound),this._disposed=!1,this._cachedClosedHeight=null,this._commandingSurface=new e._CommandingSurface(this._dom.commandingSurfaceEl,{openCloseMachine:g}),p(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-actionarea"),d.ClassNames.actionAreaCssClass),p(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-overflowarea"),d.ClassNames.overflowAreaCssClass),p(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-overflowbutton"),d.ClassNames.overflowButtonCssClass),p(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-ellipsis"),d.ClassNames.ellipsisCssClass),this._isOpenedMode=d.defaultOpened,this._dismissable=new l.LightDismissableElement({element:this._dom.root,tabIndex:this._dom.root.hasAttribute("tabIndex")?this._dom.root.tabIndex:-1,onLightDismiss:function(){c.close()},onTakeFocus:function(a){c._dismissable.restoreFocus()||c._commandingSurface.takeFocus(a)}}),this.closedDisplayMode=d.defaultClosedDisplayMode,this.opened=this._isOpenedMode,f.setOptions(this,b),h._inDom(this.element).then(function(){return c._commandingSurface.initialized}).then(function(){g.exitInit(),c._writeProfilerMark("constructor,StopTM")})}return Object.defineProperty(a.prototype,"element",{get:function(){return this._dom.root},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"data",{get:function(){return this._commandingSurface.data},set:function(a){this._commandingSurface.data=a},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"closedDisplayMode",{get:function(){return this._commandingSurface.closedDisplayMode},set:function(a){s[a]&&(this._commandingSurface.closedDisplayMode=a,this._cachedClosedHeight=null)},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"opened",{get:function(){return this._commandingSurface.opened},set:function(a){this._commandingSurface.opened=a},enumerable:!0,configurable:!0}),a.prototype.open=function(){this._commandingSurface.open()},a.prototype.close=function(){this._commandingSurface.close()},a.prototype.dispose=function(){this._disposed||(this._disposed=!0,l.hidden(this._dismissable),this._commandingSurface.dispose(),this._synchronousClose(),h._inputPaneListener.removeEventListener(this._dom.root,"showing",this._handleShowingKeyboardBound),g.disposeSubTree(this.element))},a.prototype.forceLayout=function(){this._commandingSurface.forceLayout()},a.prototype.getCommandById=function(a){return this._commandingSurface.getCommandById(a)},a.prototype.showOnlyCommands=function(a){return this._commandingSurface.showOnlyCommands(a)},a.prototype._writeProfilerMark=function(a){o("WinJS.UI.ToolBar:"+this._id+":"+a)},a.prototype._initializeDom=function(a){this._writeProfilerMark("_intializeDom,info"),a.winControl=this,this._id=a.id||h._uniqueID(a),h.addClass(a,d.ClassNames.controlCssClass),h.addClass(a,d.ClassNames.disposableCssClass);var b=a.getAttribute("role");b||a.setAttribute("role","menubar");var c=a.getAttribute("aria-label");c||a.setAttribute("aria-label",r.ariaLabel);var e=document.createElement("DIV");h._reparentChildren(a,e),a.appendChild(e);var f=k.document.createElement("DIV");h.addClass(f,d.ClassNames.placeHolderCssClass),g.markDisposable(f,this.dispose.bind(this)),this._dom={root:a,commandingSurfaceEl:e,placeHolder:f}},a.prototype._handleShowingKeyboard=function(a){this.close()},a.prototype._synchronousOpen=function(){this._isOpenedMode=!0,this._updateDomImpl()},a.prototype._synchronousClose=function(){this._isOpenedMode=!1,this._updateDomImpl()},a.prototype._updateDomImpl=function(){var a=this._updateDomImpl_renderedState;a.isOpenedMode!==this._isOpenedMode&&(this._isOpenedMode?this._updateDomImpl_renderOpened():this._updateDomImpl_renderClosed(),a.isOpenedMode=this._isOpenedMode),a.closedDisplayMode!==this.closedDisplayMode&&(q(this._dom.root,t[a.closedDisplayMode]),p(this._dom.root,t[this.closedDisplayMode]),a.closedDisplayMode=this.closedDisplayMode),this._commandingSurface.updateDom()},a.prototype._getClosedHeight=function(){if(null===this._cachedClosedHeight){var a=this._isOpenedMode;this._isOpenedMode&&this._synchronousClose(),this._cachedClosedHeight=this._commandingSurface.getBoundingRects().commandingSurface.height,a&&this._synchronousOpen()}return this._cachedClosedHeight},a.prototype._updateDomImpl_renderOpened=function(){var a=this;this._updateDomImpl_renderedState.prevInlineWidth=this._dom.root.style.width;var b=this._dom.root.getBoundingClientRect(),c=h._getPreciseContentWidth(this._dom.root),e=h._getPreciseContentHeight(this._dom.root),f=h._getComputedStyle(this._dom.root),g=h._convertToPrecisePixels(f.paddingTop),i=h._convertToPrecisePixels(f.borderTopWidth),j=h._getPreciseMargins(this._dom.root),m=b.top+i+g,n=m+e,o=this._dom.placeHolder,p=o.style;p.width=b.width+"px",p.height=b.height+"px",p.marginTop=j.top+"px",p.marginRight=j.right+"px",p.marginBottom=j.bottom+"px",p.marginLeft=j.left+"px",h._maintainFocus(function(){a._dom.root.parentElement.insertBefore(o,a._dom.root),k.document.body.appendChild(a._dom.root),a._dom.root.style.width=c+"px",a._dom.root.style.left=b.left-j.left+"px";var e=0,f=k.innerHeight,g=m-e,i=f-n;g>i?(a._commandingSurface.overflowDirection=d.OverflowDirection.top,a._dom.root.style.bottom=f-b.bottom-j.bottom+"px"):(a._commandingSurface.overflowDirection=d.OverflowDirection.bottom,a._dom.root.style.top=e+b.top-j.top+"px"),h.addClass(a._dom.root,d.ClassNames.openedClass),h.removeClass(a._dom.root,d.ClassNames.closedClass)}),this._commandingSurface.synchronousOpen(),l.shown(this._dismissable)},a.prototype._updateDomImpl_renderClosed=function(){var a=this;h._maintainFocus(function(){if(a._dom.placeHolder.parentElement){var b=a._dom.placeHolder;b.parentElement.insertBefore(a._dom.root,b),b.parentElement.removeChild(b)}a._dom.root.style.top="",a._dom.root.style.right="",a._dom.root.style.bottom="",a._dom.root.style.left="",a._dom.root.style.width=a._updateDomImpl_renderedState.prevInlineWidth,h.addClass(a._dom.root,d.ClassNames.closedClass),h.removeClass(a._dom.root,d.ClassNames.openedClass)}),this._commandingSurface.synchronousClose(),l.hidden(this._dismissable)},a.ClosedDisplayMode=s,a.supportedForProcessing=!0,a}();b.ToolBar=u,c.Class.mix(u,j.createEventProperties(d.EventNames.beforeOpen,d.EventNames.afterOpen,d.EventNames.beforeClose,d.EventNames.afterClose)),c.Class.mix(u,f.DOMEventMixin)}),d("WinJS/Controls/ToolBar",["require","exports","../Core/_Base"],function(a,b,c){var d=null;c.Namespace.define("WinJS.UI",{ToolBar:{get:function(){return d||a(["./ToolBar/_ToolBar"],function(a){d=a}),d.ToolBar}}})}),d("WinJS/Controls/_LegacyAppBar/_Layouts",["exports","../../Animations/_TransitionAnimation","../../BindingList","../../Core/_BaseUtils","../../Core/_Global","../../Core/_Base","../../Core/_ErrorFromName","../../Core/_Resources","../../Core/_WriteProfilerMark","../../Controls/ToolBar","../../Controls/ToolBar/_Constants","../../Promise","../../Scheduler","../../Utilities/_Control","../../Utilities/_Dispose","../../Utilities/_ElementUtilities","../AppBar/_Command","./_Constants"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){"use strict";f.Namespace._moduleDefine(a,"WinJS.UI",{_AppBarBaseLayout:f.Namespace._lazy(function(){var a=r.appBarLayoutCustom,b={get nullCommand(){return"Invalid argument: command must not be null"}},c=f.Class.define(function(a,b){this._disposed=!1,b=b||{},n.setOptions(this,b),a&&this.connect(a)},{className:{get:function(){return this._className}},type:{get:function(){return this._type||a}},commandsInOrder:{get:function(){var a=this.appBarEl.querySelectorAll("."+r.appBarCommandClass);return Array.prototype.map.call(a,function(a){return a.winControl})}},connect:function(a){this.className&&p.addClass(a,this.className),this.appBarEl=a},disconnect:function(){this.className&&p.removeClass(this.appBarEl,this.className),this.appBarEl=null,this.dispose()},layout:function(a){for(var b=a.length,c=0;b>c;c++){var d=this.sanitizeCommand(a[c]);this.appBarEl.appendChild(d._element)}},showCommands:function(a){this.appBarEl.winControl._showCommands(a)},showOnlyCommands:function(a){this.appBarEl.winControl._showOnlyCommands(a)},hideCommands:function(a){this.appBarEl.winControl._hideCommands(a)},sanitizeCommand:function(a){if(!a)throw new g("WinJS.UI.AppBar.NullCommand",b.nullCommand);return a=a.winControl||a,a._element||(a=new q.AppBarCommand(null,a)),a._element.parentElement&&a._element.parentElement.removeChild(a._element),a},dispose:function(){this._disposed=!0},disposeChildren:function(){var a=this.appBarEl.querySelectorAll("."+r.firstDivClass);a=a.length>=1?a[0]:null;var b=this.appBarEl.querySelectorAll("."+r.finalDivClass);b=b.length>=1?b[0]:null;for(var c=this.appBarEl.children,d=c.length,e=0;d>e;e++){var f=c[e];f!==a&&f!==b&&o.disposeSubTree(f)}},handleKeyDown:function(){},commandsUpdated:function(){},beginAnimateCommands:function(){},endAnimateCommands:function(){},scale:function(){},resize:function(){},positionChanging:function(a,b){return l.wrap()},setFocusOnShow:function(){this.appBarEl.winControl._setFocusToAppBar()}});return c})}),f.Namespace._moduleDefine(a,"WinJS.UI",{_AppBarCommandsLayout:f.Namespace._lazy(function(){var b=r.commandLayoutClass,c=r.appBarLayoutCommands,d=f.Class.derive(a._AppBarBaseLayout,function(d){a._AppBarBaseLayout.call(this,d,{_className:b,_type:c}),this._commandLayoutsInit(d)},{commandsInOrder:{get:function(){return this._originalCommands.filter(function(a){return this.appBarEl.contains(a.element)},this)}},layout:function(a){p.empty(this._primaryCommands),p.empty(this._secondaryCommands),this._originalCommands=[];for(var b=0,c=a.length;c>b;b++){var d=this.sanitizeCommand(a[b]);this._originalCommands.push(d),"primary"===d.section||"global"===d.section?this._primaryCommands.appendChild(d._element):this._secondaryCommands.appendChild(d._element)}this.appBarEl.appendChild(this._secondaryCommands),this.appBarEl.appendChild(this._primaryCommands),this._needToMeasureNewCommands=!0,m.schedule(function(){this._needToMeasureNewCommands&&!this._disposed&&this.scale()}.bind(this),m.Priority.idle,this,"WinJS._commandLayoutsMixin._scaleNewCommands")},disposeChildren:function(){o.disposeSubTree(this._primaryCommands),o.disposeSubTree(this._secondaryCommands)},handleKeyDown:function(a){var b=p.Key;if(!p._matchesSelector(a.target,".win-interactive, .win-interactive *")){var c="rtl"===p._getComputedStyle(this.appBarEl).direction,d=c?b.rightArrow:b.leftArrow,f=c?b.leftArrow:b.rightArrow;if(a.keyCode===d||a.keyCode===f||a.keyCode===b.home||a.keyCode===b.end){var g,h=this._primaryCommands.contains(e.document.activeElement),i=this._getFocusableCommandsInLogicalOrder(h);if(i.length)switch(a.keyCode){case d:var j=Math.max(-1,i.focusedIndex-1)+i.length;g=i[j%i.length].winControl.lastElementFocus;break;case f:var j=i.focusedIndex+1+i.length;g=i[j%i.length].winControl.firstElementFocus;break;case b.home:var j=0;g=i[j].winControl.firstElementFocus;break;case b.end:var j=i.length-1;g=i[j].winControl.lastElementFocus}g&&g!==e.document.activeElement&&(g.focus(),a.preventDefault())}}},commandsUpdated:function(a){var b=a?a:this.commandsInOrder.filter(function(a){return!a.hidden});this._fullSizeWidthOfLastKnownVisibleCommands=this._getWidthOfFullSizeCommands(b)},beginAnimateCommands:function(a,b,c){this._scaleAfterAnimations=!1;var d=this._getWidthOfFullSizeCommands(a)-this._getWidthOfFullSizeCommands(b);if(d>0){var e=c.concat(a);this.commandsUpdated(e),this.scale()}else 0>d&&(this._scaleAfterAnimations=!0)},endAnimateCommands:function(){this._scaleAfterAnimations&&(this.commandsUpdated(),this.scale())},resize:function(){this._disposed||(this._appBarTotalKnownWidth=null,this.appBarEl.winControl.opened&&this.scale())},disconnect:function(){a._AppBarBaseLayout.prototype.disconnect.call(this)},_getWidthOfFullSizeCommands:function(a){this._needToMeasureNewCommands&&this._measureContentCommands();var b=0,c=0,d=0;if(!a)return this._fullSizeWidthOfLastKnownVisibleCommands;for(var e,f=0,g=a.length;g>f;f++)e=a[f].winControl||a[f],e._type===r.typeSeparator?c++:e._type!==r.typeContent?d++:b+=e._fullSizeWidth;return b+=c*r.separatorWidth+d*r.buttonWidth},_getFocusableCommandsInLogicalOrder:function(){var a=this._secondaryCommands.children,b=this._primaryCommands.children,c=-1,d=function(a){for(var b=[],d=0,f=a.length;f>d;d++){var g=a[d];if(p.hasClass(g,r.appBarCommandClass)&&g.winControl){var h=g.contains(e.document.activeElement);(g.winControl._isFocusable()||h)&&(b.push(g),h&&(c=b.length-1))}}return b},f=Array.prototype.slice.call(a).concat(Array.prototype.slice.call(b)),g=d(f);return g.focusedIndex=c,g},_commandLayoutsInit:function(){this._primaryCommands=e.document.createElement("DIV"),this._secondaryCommands=e.document.createElement("DIV"),p.addClass(this._primaryCommands,r.primaryCommandsClass),p.addClass(this._secondaryCommands,r.secondaryCommandsClass)},_scaleHelper:function(){var a="minimal"===this.appBarEl.winControl.closedDisplayMode?r.appBarInvokeButtonWidth:0;return e.document.documentElement.clientWidth-a},_measureContentCommands:function(){if(e.document.body.contains(this.appBarEl)){this._needToMeasureNewCommands=!1;var a=p.hasClass(this.appBarEl,"win-navbar-closed");p.removeClass(this.appBarEl,"win-navbar-closed");var b=this.appBarEl.style.display;this.appBarEl.style.display="";for(var c,d,f=this.appBarEl.querySelectorAll("div."+r.appBarCommandClass),g=0,h=f.length;h>g;g++)d=f[g],d.winControl&&d.winControl._type===r.typeContent&&(c=d.style.display,d.style.display="",d.winControl._fullSizeWidth=p.getTotalWidth(d)||0,d.style.display=c);this.appBarEl.style.display=b,a&&p.addClass(this.appBarEl,"win-navbar-closed"),this.commandsUpdated()}}});return d})}),f.Namespace._moduleDefine(a,"WinJS.UI",{_AppBarMenuLayout:f.Namespace._lazy(function(){function g(a,c){var f=c.duration*b._animationFactor,g=d._browserStyleEquivalents.transition.scriptName;a.style[g]=f+"ms "+t.cssName+" "+c.timing,a.style[t.scriptName]=c.to;var h;return new l(function(b){var c=function(b){b.target===a&&b.propertyName===t.cssName&&h()},i=!1;h=function(){i||(e.clearTimeout(j),a.removeEventListener(d._browserEventEquivalents.transitionEnd,c),a.style[g]="",i=!0),b()};var j=e.setTimeout(function(){j=e.setTimeout(h,f)},50);a.addEventListener(d._browserEventEquivalents.transitionEnd,c)},function(){h()})}function h(a,b,c){var d=c.anchorTrailingEdge?c.to.total-c.from.total:c.from.total-c.to.total,e="width"===c.dimension?"translateX":"translateY",f=c.dimension,h=c.duration||367,i=c.timing||"cubic-bezier(0.1, 0.9, 0.2, 1)";a.style[f]=c.to.total+"px",a.style[t.scriptName]=e+"("+d+"px)",b.style[f]=c.to.content+"px",b.style[t.scriptName]=e+"("+-d+"px)",p._getComputedStyle(a).opacity,p._getComputedStyle(b).opacity;var j={duration:h,timing:i,to:""};return l.join([g(a,j),g(b,j)])}function m(a,b,c){var e=c.anchorTrailingEdge?c.from.total-c.to.total:c.to.total-c.from.total,f="width"===c.dimension?"translateX":"translateY",h=c.duration||367,i=c.timing||"cubic-bezier(0.1, 0.9, 0.2, 1)";a.style[t.scriptName]="",b.style[t.scriptName]="",p._getComputedStyle(a).opacity,p._getComputedStyle(b).opacity;var j={duration:h,timing:i},k=d._merge(j,{to:f+"("+e+"px)"}),m=d._merge(j,{to:f+"("+-e+"px)"});return l.join([g(a,k),g(b,m)])}function n(a,b,c){return c.to.total>c.from.total?h(a,b,c):c.to.total<c.from.total?m(a,b,c):l.as()}var q=r.menuLayoutClass,s=r.appBarLayoutMenu,t=d._browserStyleEquivalents.transform,u=f.Class.derive(a._AppBarBaseLayout,function(b){a._AppBarBaseLayout.call(this,b,{_className:q,_type:s}),this._tranformNames=d._browserStyleEquivalents.transform,this._animationCompleteBound=this._animationComplete.bind(this),this._positionToolBarBound=this._positionToolBar.bind(this)},{commandsInOrder:{get:function(){return this._originalCommands}},layout:function(a){this._writeProfilerMark("layout,info"),a=a||[],this._originalCommands=[];var b=this;a.forEach(function(a){b._originalCommands.push(b.sanitizeCommand(a))}),this._displayedCommands=this._originalCommands.slice(0),this._menu?p.empty(this._menu):(this._menu=e.document.createElement("div"),p.addClass(this._menu,r.menuContainerClass)),this.appBarEl.appendChild(this._menu),this._toolbarEl=e.document.createElement("div"),this._menu.appendChild(this._toolbarEl),this._createToolBar(a)},showCommands:function(a){var b=this._getCommandsElements(a),c=[],d=[],e=this;this._originalCommands.forEach(function(a){(b.indexOf(a.element)>=0||e._displayedCommands.indexOf(a)>=0)&&(d.push(a),c.push(a))}),this._displayedCommands=d,this._updateData(c)},showOnlyCommands:function(a){this._displayedCommands=[],this.showCommands(a)},hideCommands:function(a){var b=this._getCommandsElements(a),c=[],d=[],e=this;this._originalCommands.forEach(function(a){-1===b.indexOf(a.element)&&e._displayedCommands.indexOf(a)>=0&&(d.push(a),c.push(a))}),this._displayedCommands=d,this._updateData(c)},connect:function(b){this._writeProfilerMark("connect,info"),a._AppBarBaseLayout.prototype.connect.call(this,b),this._id=p._uniqueID(b)},resize:function(){this._writeProfilerMark("resize,info"),this._initialized&&(this._forceLayoutPending=!0)},positionChanging:function(a,b){return this._writeProfilerMark("positionChanging from:"+a+" to: "+b+",info"),this._animationPromise=this._animationPromise||l.wrap(),this._animating&&this._animationPromise.cancel(),this._animating=!0,"shown"===b||"shown"!==a&&"compact"===b?(this._positionToolBar(),this._animationPromise=this._animateToolBarEntrance()):"minimal"===a||"compact"===a||"hidden"===a?this._animationPromise=l.wrap():this._animationPromise=this._animateToolBarExit(),this._animationPromise.then(this._animationCompleteBound,this._animationCompleteBound),this._animationPromise},disposeChildren:function(){this._writeProfilerMark("disposeChildren,info"),this._toolbar&&o.disposeSubTree(this._toolbarEl),this._originalCommands=[],this._displayedCommands=[]},setFocusOnShow:function(){this.appBarEl.winControl._setFocusToAppBar(!0,this._menu)},_updateData:function(a){var b=p.hasClass(this.appBarEl,"win-navbar-closed"),d=p.hasClass(this.appBarEl,"win-navbar-opened");p.removeClass(this.appBarEl,"win-navbar-closed");var e=this.appBarEl.style.display;this.appBarEl.style.display="",
-this._toolbar.data=new c.List(a),b&&this._positionToolBar(),this.appBarEl.style.display=e,b&&p.addClass(this.appBarEl,"win-navbar-closed"),d&&(this._positionToolBar(),this._animateToolBarEntrance())},_getCommandsElements:function(a){if(!a)return[];"string"!=typeof a&&a&&a.length||(a=[a]);for(var b=[],c=0,d=a.length;d>c;c++)if(a[c])if("string"==typeof a[c]){var f=e.document.getElementById(a[c]);if(f)b.push(f);else for(var g=0,h=this._originalCommands.length;h>g;g++){var f=this._originalCommands[g].element;f.id===a[c]&&b.push(f)}}else a[c].element?b.push(a[c].element):b.push(a[c]);return b},_animationComplete:function(){this._disposed||(this._animating=!1)},_createToolBar:function(a){this._writeProfilerMark("_createToolBar,info");var b=p.hasClass(this.appBarEl,"win-navbar-closed");p.removeClass(this.appBarEl,"win-navbar-closed");var d=this.appBarEl.style.display;this.appBarEl.style.display="",this._toolbar=new j.ToolBar(this._toolbarEl,{data:new c.List(this._originalCommands),shownDisplayMode:"full"});var e=this;this._appbarInvokeButton=this.appBarEl.querySelector("."+r.invokeButtonClass),this._overflowButton=this._toolbarEl.querySelector("."+k.overflowButtonCssClass),this._overflowButton.addEventListener("click",function(){e._appbarInvokeButton.click()}),this._positionToolBar(),this.appBarEl.style.display=d,b&&p.addClass(this.appBarEl,"win-navbar-closed")},_positionToolBar:function(){this._disposed||(this._writeProfilerMark("_positionToolBar,info"),this._initialized=!0)},_animateToolBarEntrance:function(){this._writeProfilerMark("_animateToolBarEntrance,info"),this._forceLayoutPending&&(this._forceLayoutPending=!1,this._toolbar.forceLayout(),this._positionToolBar());var a=this._isMinimal()?0:this.appBarEl.offsetHeight;if(this._isBottom()){var b=this._menu.offsetHeight-a;return this._executeTranslate(this._menu,"translateY("+-b+"px)")}return n(this._menu,this._toolbarEl,{from:{content:a,total:a},to:{content:this._menu.offsetHeight,total:this._menu.offsetHeight},dimension:"height",duration:400,timing:"ease-in"})},_animateToolBarExit:function(){this._writeProfilerMark("_animateToolBarExit,info");var a=this._isMinimal()?0:this.appBarEl.offsetHeight;return this._isBottom()?this._executeTranslate(this._menu,"none"):n(this._menu,this._toolbarEl,{from:{content:this._menu.offsetHeight,total:this._menu.offsetHeight},to:{content:a,total:a},dimension:"height",duration:400,timing:"ease-in"})},_executeTranslate:function(a,c){return b.executeTransition(a,{property:this._tranformNames.cssName,delay:0,duration:400,timing:"ease-in",to:c})},_isMinimal:function(){return"minimal"===this.appBarEl.winControl.closedDisplayMode},_isBottom:function(){return"bottom"===this.appBarEl.winControl.placement},_writeProfilerMark:function(a){i("WinJS.UI._AppBarMenuLayout:"+this._id+":"+a)}});return u})})}),d("WinJS/Controls/_LegacyAppBar",["exports","../Core/_Global","../Core/_WinRT","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Events","../Core/_Resources","../Core/_WriteProfilerMark","../Animations","../Promise","../Scheduler","../_LightDismissService","../Utilities/_Control","../Utilities/_Dispose","../Utilities/_ElementUtilities","../Utilities/_Hoverable","../Utilities/_KeyboardBehavior","./_LegacyAppBar/_Constants","./_LegacyAppBar/_Layouts","./AppBar/_Command","./AppBar/_Icon","./Flyout/_Overlay","../Application"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x){"use strict";d.Namespace._moduleDefine(a,"WinJS.UI",{_LegacyAppBar:d.Namespace._lazy(function(){function a(a){var c=b.document.querySelectorAll("."+s.appBarClass);if(c)for(var d=c.length,e=0;d>e;e++){var f=c[e],g=f.winControl;g&&!f.disabled&&g._manipulationChanged(a)}}var q={beforeOpen:"beforeopen",afterOpen:"afteropen",beforeClose:"beforeclose",afterClose:"afterclose"},u=g._createEventProperty,v={none:0,hidden:0,minimal:25,compact:48},x={none:"hidden",hidden:"hidden",minimal:"minimal",shown:"shown",compact:"compact"},y={none:"none",minimal:"minimal",compact:"compact"},z="shown",A="hidden",B=!1,C={get ariaLabel(){return h._getWinJSString("ui/appBarAriaLabel").value},get requiresCommands(){return"Invalid argument: commands must not be empty"},get cannotChangePlacementWhenVisible(){return"Invalid argument: The placement property cannot be set when the AppBar is visible, call hide() first"},get cannotChangeLayoutWhenVisible(){return"Invalid argument: The layout property cannot be set when the AppBar is visible, call hide() first"}},D=d.Class.derive(w._Overlay,function(c,d){this._initializing=!0,d=d||{},this._element=c||b.document.createElement("div"),this._id=this._element.id||p._uniqueID(this._element),this._writeProfilerMark("constructor,StartTM"),p.addClass(this._element,s.appBarClass);var e=this;this._dismissable=new m.LightDismissableElement({element:this._element,tabIndex:this._element.hasAttribute("tabIndex")?this._element.tabIndex:-1,onLightDismiss:function(){e.close()},onTakeFocus:function(a){e._dismissable.restoreFocus()||e._layoutImpl.setFocusOnShow()}});var f=this._element.getAttribute("role");f||this._element.setAttribute("role","menubar");var g=this._element.getAttribute("aria-label");g||this._element.setAttribute("aria-label",C.ariaLabel),this._baseOverlayConstructor(this._element),this._lastPositionVisited=x.none,p.addClass(this._element,s.hiddenClass),this._invokeButton=b.document.createElement("button"),this._invokeButton.tabIndex=0,this._invokeButton.setAttribute("type","button"),this._invokeButton.innerHTML="<span class='"+s.ellipsisClass+"'></span>",p.addClass(this._invokeButton,s.invokeButtonClass),this._element.appendChild(this._invokeButton),this._invokeButton.addEventListener("click",function(){e.opened?e._hide():e._show()},!1),this._layout=s.appBarLayoutCustom,delete d._layout,this.placement=d.placement||s.appBarPlacementBottom,this.closedDisplayMode=d.closedDisplayMode||y.compact,n.setOptions(this,d);var h=this._commandsUpdated.bind(this);return this._element.addEventListener(s.commandVisibilityChanged,function(a){e._disposed||(e.opened&&a.preventDefault(),h())}),this._initializing=!1,this._setFocusToAppBarBound=this._setFocusToAppBar.bind(this),this._element.addEventListener("keydown",this._handleKeyDown.bind(this),!1),B||(b.document.addEventListener("MSManipulationStateChanged",a,!1),B=!0),this.closedDisplayMode===y.none&&this.layout===s.appBarLayoutCommands&&(this._element.style.display="none"),this._winKeyboard=new r._WinKeyboard(this._element),this._writeProfilerMark("constructor,StopTM"),this},{placement:{get:function(){return this._placement},set:function(a){var b=!1;if(c.Windows.ApplicationModel.DesignMode.designModeEnabled&&(this._hide(),b=!0),this.opened)throw new f("WinJS.UI._LegacyAppBar.CannotChangePlacementWhenVisible",C.cannotChangePlacementWhenVisible);this._placement=a===s.appBarPlacementTop?s.appBarPlacementTop:s.appBarPlacementBottom,this._placement===s.appBarPlacementTop?(p.addClass(this._element,s.topClass),p.removeClass(this._element,s.bottomClass)):this._placement===s.appBarPlacementBottom&&(p.removeClass(this._element,s.topClass),p.addClass(this._element,s.bottomClass)),this._ensurePosition(),b&&this._show()}},_layout:{get:function(){return this._layoutImpl.type},set:function(a){a!==s.appBarLayoutCommands&&a!==s.appBarLayoutCustom&&a!==s.appBarLayoutMenu;var b=!1;if(c.Windows.ApplicationModel.DesignMode.designModeEnabled&&(this._hide(),b=!0),this.opened)throw new f("WinJS.UI._LegacyAppBar.CannotChangeLayoutWhenVisible",C.cannotChangeLayoutWhenVisible);var d;this._initializing||(d=this._layoutImpl.commandsInOrder,this._layoutImpl.disconnect()),a===s.appBarLayoutCommands?this._layoutImpl=new t._AppBarCommandsLayout:a===s.appBarLayoutMenu?this._layoutImpl=new t._AppBarMenuLayout:this._layoutImpl=new t._AppBarBaseLayout,this._layoutImpl.connect(this._element),d&&d.length&&this._layoutCommands(d),b&&this._show()},configurable:!0},commands:{set:function(a){if(this.opened)throw new f("WinJS.UI._LegacyAppBar.CannotChangeCommandsWhenVisible",h._formatString(w._Overlay.commonstrings.cannotChangeCommandsWhenVisible,"_LegacyAppBar"));this._initializing||this._disposeChildren(),this._layoutCommands(a)}},_layoutCommands:function(a){p.empty(this._element),this._element.appendChild(this._invokeButton),Array.isArray(a)||(a=[a]),this._layoutImpl.layout(a)},closedDisplayMode:{get:function(){return this._closedDisplayMode},set:function(a){var b=this._closedDisplayMode;if(b!==a){var c=p.hasClass(this._element,s.hiddenClass)||p.hasClass(this._element,s.hidingClass);a===y.none?(this._closedDisplayMode=y.none,c&&b||(p.removeClass(this._element,s.minimalClass),p.removeClass(this._element,s.compactClass))):a===y.minimal?(this._closedDisplayMode=y.minimal,c&&b&&b!==y.none||(p.addClass(this._element,s.minimalClass),p.removeClass(this._element,s.compactClass))):(this._closedDisplayMode=y.compact,p.addClass(this._element,s.compactClass),p.removeClass(this._element,s.minimalClass)),this._layoutImpl.resize(),c&&this._changeVisiblePosition(x[this._closedDisplayMode])}}},opened:{get:function(){return!p.hasClass(this._element,s.hiddenClass)&&!p.hasClass(this._element,s.hidingClass)&&this._doNext!==x.minimal&&this._doNext!==x.compact&&this._doNext!==x.none},set:function(a){var b=this.opened;a&&!b?this._show():!a&&b&&this._hide()}},onbeforeopen:u(q.beforeOpen),onafteropen:u(q.afterOpen),onbeforeclose:u(q.beforeClose),onafterclose:u(q.afterClose),getCommandById:function(a){var b=this._layoutImpl.commandsInOrder.filter(function(b){return b.id===a||b.element.id===a});return 1===b.length?b[0]:0===b.length?null:b},showCommands:function(a){if(!a)throw new f("WinJS.UI._LegacyAppBar.RequiresCommands",C.requiresCommands);this._layoutImpl.showCommands(a)},hideCommands:function(a){if(!a)throw new f("WinJS.UI._LegacyAppBar.RequiresCommands",C.requiresCommands);this._layoutImpl.hideCommands(a)},showOnlyCommands:function(a){if(!a)throw new f("WinJS.UI._LegacyAppBar.RequiresCommands",C.requiresCommands);this._layoutImpl.showOnlyCommands(a)},open:function(){this._writeProfilerMark("show,StartTM"),this._show()},_show:function(){var a=x.shown,b=null;this.disabled||!p.hasClass(this._element,s.hiddenClass)&&!p.hasClass(this._element,s.hidingClass)||(b=z),this._changeVisiblePosition(a,b),b&&(this._updateFirstAndFinalDiv(),m.shown(this._dismissable))},close:function(){this._writeProfilerMark("hide,StartTM"),this._hide()},_hide:function(a){var a=a||x[this.closedDisplayMode],b=null;p.hasClass(this._element,s.hiddenClass)||p.hasClass(this._element,s.hidingClass)||(b=A),this._changeVisiblePosition(a,b)},_dispose:function(){o.disposeSubTree(this.element),m.hidden(this._dismissable),this._layoutImpl.dispose(),this.disabled=!0,this.close()},_disposeChildren:function(){this._layoutImpl.disposeChildren()},_handleKeyDown:function(a){this._invokeButton.contains(b.document.activeElement)||this._layoutImpl.handleKeyDown(a)},_visiblePixels:{get:function(){return{hidden:v.hidden,minimal:v.minimal,compact:Math.max(this._heightWithoutLabels||0,v.compact),shown:this._element.offsetHeight}}},_visiblePosition:{get:function(){return this._animating&&x[this._element.winAnimating]?this._element.winAnimating:this._lastPositionVisited}},_visible:{get:function(){return this._visiblePosition!==x.none}},_changeVisiblePosition:function(a,b){if(this._visiblePosition===a&&!this._keyboardObscured||this.disabled&&a!==x.disabled)this._afterPositionChange(null);else if(this._animating||this._needToHandleShowingKeyboard||this._needToHandleHidingKeyboard)this._doNext=a,this._afterPositionChange(null);else{this._element.winAnimating=a;var c=!this._initializing,d=this._lastPositionVisited;this._element.style.display="";var e=a===x.hidden;this._keyboardObscured&&(e?c=!1:d=x.hidden,this._keyboardObscured=!1),b===z?this._beforeShow():b===A&&this._beforeHide(),this._ensurePosition(),this._element.style.opacity=1,this._element.style.visibility="visible",this._animationPromise=c?this._animatePositionChange(d,a):k.wrap(),this._animationPromise.then(function(){this._afterPositionChange(a,b)}.bind(this),function(){this._afterPositionChange(a,b)}.bind(this))}},_afterPositionChange:function(a,b){if(!this._disposed){if(a){a===x.minimal&&(p.addClass(this._element,s.minimalClass),p.removeClass(this._element,s.compactClass)),a===x.hidden&&this.closedDisplayMode===y.none&&(p.removeClass(this._element,s.minimalClass),p.removeClass(this._element,s.compactClass)),this._element.winAnimating="",this._lastPositionVisited=a,this._doNext===this._lastPositionVisited&&(this._doNext=""),b===A&&m.hidden(this._dismissable),a===x.hidden&&(this._element.style.visibility="hidden",this._element.style.display="none");var c=e._browserStyleEquivalents.transform.scriptName;this._element.style[c]="",b===z?this._afterShow():b===A&&this._afterHide(),l.schedule(this._checkDoNext,l.Priority.normal,this,"WinJS.UI._LegacyAppBar._checkDoNext")}this._afterPositionChangeCallBack()}},_afterPositionChangeCallBack:function(){},_beforeShow:function(){this._queuedCommandAnimation&&(this._showAndHideFast(this._queuedToShow,this._queuedToHide),this._queuedToShow=[],this._queuedToHide=[]),this._layoutImpl.scale(),this.closedDisplayMode===y.compact&&(this._heightWithoutLabels=this._element.offsetHeight),p.removeClass(this._element,s.hiddenClass),p.addClass(this._element,s.showingClass),this._sendEvent(q.beforeOpen)},_afterShow:function(){p.removeClass(this._element,s.showingClass),p.addClass(this._element,s.shownClass),this._sendEvent(q.afterOpen),this._writeProfilerMark("show,StopTM")},_beforeHide:function(){p.removeClass(this._element,s.shownClass),p.addClass(this._element,s.hidingClass),this._sendEvent(q.beforeClose)},_afterHide:function(){this._queuedCommandAnimation&&(this._showAndHideFast(this._queuedToShow,this._queuedToHide),this._queuedToShow=[],this._queuedToHide=[]),p.removeClass(this._element,s.hidingClass),p.addClass(this._element,s.hiddenClass),this._sendEvent(q.afterClose),this._writeProfilerMark("hide,StopTM")},_animatePositionChange:function(a,b){var c,d=this._layoutImpl.positionChanging(a,b),e=this._visiblePixels[a],f=this._visiblePixels[b],g=Math.abs(f-e),h=this._placement===s.appBarPlacementTop?-g:g;if(this._placement===s.appBarPlacementTop&&(a===x.shown&&b===x.compact||a===x.compact&&b===x.shown)&&(h=0),f>e){var i={top:h+"px",left:"0px"};c=j.showEdgeUI(this._element,i,{mechanism:"transition"})}else{var l={top:h+"px",left:"0px"};c=j.hideEdgeUI(this._element,l,{mechanism:"transition"})}return k.join([d,c])},_checkDoNext:function(){this._animating||this._needToHandleShowingKeyboard||this._needToHandleHidingKeyboard||this._disposed||(this._doNext===x.disabled||this._doNext===x.hidden||this._doNext===x.minimal||this._doNext===x.compact?(this._hide(this._doNext),this._doNext=""):this._queuedCommandAnimation?this._showAndHideQueue():this._doNext===x.shown&&(this._show(),this._doNext=""))},_setFocusToAppBar:function(a,b){this._focusOnFirstFocusableElement(a,b)||w._Overlay._trySetActive(this._element,b)},_commandsUpdated:function(){this._initializing||(this._layoutImpl.commandsUpdated(),this._layoutImpl.scale())},_beginAnimateCommands:function(a,b,c){this._layoutImpl.beginAnimateCommands(a,b,c)},_endAnimateCommands:function(){this._layoutImpl.endAnimateCommands(),this._endAnimateCommandsCallBack()},_endAnimateCommandsCallBack:function(){},_getTopOfVisualViewport:function(){return w._Overlay._keyboardInfo._visibleDocTop},_getAdjustedBottom:function(){return w._Overlay._keyboardInfo._visibleDocBottomOffset},_showingKeyboard:function(a){if(this._keyboardObscured=!1,this._needToHandleHidingKeyboard=!1,!w._Overlay._keyboardInfo._visible||!this._alreadyInPlace()){this._needToHandleShowingKeyboard=!0,this.opened&&this._element.contains(b.document.activeElement)&&(a.ensuredFocusedElementInView=!0),this._visible&&this._placement!==s.appBarPlacementTop&&w._Overlay._isFlyoutVisible()?this._keyboardObscured=!0:this._scrollHappened=!1;var c=this;b.setTimeout(function(a){c._checkKeyboardTimer(a)},w._Overlay._keyboardInfo._animationShowLength+w._Overlay._scrollTimeout)}},_hidingKeyboard:function(){this._keyboardObscured=!1,this._needToHandleShowingKeyboard=!1,this._needToHandleHidingKeyboard=!0,w._Overlay._keyboardInfo._isResized||((this._visible||this._animating)&&(this._checkScrollPosition(),this._element.style.display=""),this._needToHandleHidingKeyboard=!1)},_resize:function(a){this._needToHandleShowingKeyboard?this._visible&&(this._placement===s.appBarPlacementTop||this._keyboardObscured||(this._element.style.display="none")):this._needToHandleHidingKeyboard&&(this._needToHandleHidingKeyboard=!1,(this._visible||this._animating)&&(this._checkScrollPosition(),this._element.style.display="")),this._initializing||this._layoutImpl.resize(a)},_checkKeyboardTimer:function(){this._scrollHappened||this._mayEdgeBackIn()},_manipulationChanged:function(a){0===a.currentState&&this._scrollHappened&&this._mayEdgeBackIn()},_mayEdgeBackIn:function(){if(this._needToHandleShowingKeyboard)if(this._needToHandleShowingKeyboard=!1,this._keyboardObscured||this._placement===s.appBarPlacementTop&&0===w._Overlay._keyboardInfo._visibleDocTop)this._checkDoNext();else{var a=this._visiblePosition;this._lastPositionVisited=x.hidden,this._changeVisiblePosition(a,!1)}this._scrollHappened=!1},_ensurePosition:function(){var a=this._computePositionOffset();this._element.style.bottom=a.bottom,this._element.style.top=a.top},_computePositionOffset:function(){var a={};return this._placement===s.appBarPlacementBottom?(a.bottom=this._getAdjustedBottom()+"px",a.top=""):this._placement===s.appBarPlacementTop&&(a.bottom="",a.top=this._getTopOfVisualViewport()+"px"),a},_checkScrollPosition:function(){return this._needToHandleShowingKeyboard?void(this._scrollHappened=!0):void((this._visible||this._animating)&&(this._ensurePosition(),this._checkDoNext()))},_alreadyInPlace:function(){var a=this._computePositionOffset();return a.top===this._element.style.top&&a.bottom===this._element.style.bottom},_updateFirstAndFinalDiv:function(){var a=this._element.querySelectorAll("."+s.firstDivClass);a=a.length>=1?a[0]:null;var c=this._element.querySelectorAll("."+s.finalDivClass);c=c.length>=1?c[0]:null,a&&this._element.children[0]!==a&&(a.parentNode.removeChild(a),a=null),c&&this._element.children[this._element.children.length-1]!==c&&(c.parentNode.removeChild(c),c=null),a||(a=b.document.createElement("div"),a.style.display="inline",a.className=s.firstDivClass,a.tabIndex=-1,a.setAttribute("aria-hidden","true"),p._addEventListener(a,"focusin",this._focusOnLastFocusableElementOrThis.bind(this),!1),this._element.children[0]?this._element.insertBefore(a,this._element.children[0]):this._element.appendChild(a)),c||(c=b.document.createElement("div"),c.style.display="inline",c.className=s.finalDivClass,c.tabIndex=-1,c.setAttribute("aria-hidden","true"),p._addEventListener(c,"focusin",this._focusOnFirstFocusableElementOrThis.bind(this),!1),this._element.appendChild(c)),this._element.children[this._element.children.length-2]!==this._invokeButton&&this._element.insertBefore(this._invokeButton,c);var d=this._element.getElementsByTagName("*"),e=p._getHighestTabIndexInList(d);this._invokeButton.tabIndex=e,a&&(a.tabIndex=p._getLowestTabIndexInList(d)),c&&(c.tabIndex=e)},_writeProfilerMark:function(a){i("WinJS.UI._LegacyAppBar:"+this._id+":"+a)}},{_Events:q});return D})})}),d("WinJS/Controls/Menu",["exports","../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Resources","../Core/_WriteProfilerMark","../Promise","../Utilities/_ElementUtilities","../Utilities/_Hoverable","../Utilities/_KeyboardBehavior","./_LegacyAppBar/_Constants","./Flyout","./Flyout/_Overlay","./Menu/_Command"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){"use strict";c.Namespace._moduleDefine(a,"WinJS.UI",{Menu:c.Namespace._lazy(function(){function a(a){var b=a.element||a;return i._matchesSelector(b,"."+l.menuClass+" ."+l.menuCommandClass)}var j=i.Key,p={get ariaLabel(){return f._getWinJSString("ui/menuAriaLabel").value},get requiresCommands(){return"Invalid argument: commands must not be empty"},get nullCommand(){return"Invalid argument: command must not be null"}},q=c.Class.derive(m.Flyout,function(a,c){c=c||{},this._element=a||b.document.createElement("div"),this._id=this._element.id||i._uniqueID(this._element),this._writeProfilerMark("constructor,StartTM"),!c.commands&&this._element&&(c=d._shallowCopy(c),c.commands=this._verifyCommandsOnly(this._element,"WinJS.UI.MenuCommand"));var e="menu",f=null;this._element&&(e=this._element.getAttribute("role")||e,f=this._element.getAttribute("aria-label")||f),this._baseFlyoutConstructor(this._element,c),this._element.setAttribute("role",e),this._element.setAttribute("aria-label",f),this._element.addEventListener("keydown",this._handleKeyDown.bind(this),!0),this._element.addEventListener(l._menuCommandInvokedEvent,this._handleCommandInvoked.bind(this),!1),this._element.addEventListener("mouseover",this._handleMouseOver.bind(this),!1),this._element.addEventListener("mouseout",this._handleMouseOut.bind(this),!1),i.addClass(this._element,l.menuClass),this._winKeyboard=new k._WinKeyboard(this._element),this.hide(),this._writeProfilerMark("constructor,StopTM")},{commands:{set:function(a){if(!this.hidden)throw new e("WinJS.UI.Menu.CannotChangeCommandsWhenVisible",f._formatString(n._Overlay.commonstrings.cannotChangeCommandsWhenVisible,"Menu"));i.empty(this._element),Array.isArray(a)||(a=[a]);for(var b=a.length,c=0;b>c;c++)this._addCommand(a[c])}},getCommandById:function(a){for(var b=this.element.querySelectorAll("#"+a),c=[],d=0,e=b.length;e>d;d++)b[d].winControl&&c.push(b[d].winControl);return 1===c.length?c[0]:0===c.length?null:c},showCommands:function(a){if(!a)throw new e("WinJS.UI.Menu.RequiresCommands",p.requiresCommands);this._showCommands(a,!0)},hideCommands:function(a){if(!a)throw new e("WinJS.UI.Menu.RequiresCommands",p.requiresCommands);this._hideCommands(a,!0)},showOnlyCommands:function(a){if(!a)throw new e("WinJS.UI.Menu.RequiresCommands",p.requiresCommands);this._showOnlyCommands(a,!0)},_hide:function(){this._hoverPromise&&this._hoverPromise.cancel(),m.Flyout.prototype._hide.call(this)},_afterHide:function(){i.removeClass(this.element,l.menuMouseSpacingClass),i.removeClass(this.element,l.menuTouchSpacingClass)},_beforeShow:function(){i.hasClass(this.element,l.menuMouseSpacingClass)||i.hasClass(this.element,l.menuTouchSpacingClass)||i.addClass(this.element,m.Flyout._cascadeManager.inputType===k._InputTypes.mouse||m.Flyout._cascadeManager.inputType===k._InputTypes.keyboard?l.menuMouseSpacingClass:l.menuTouchSpacingClass),this._checkMenuCommands()},_addCommand:function(a){if(!a)throw new e("WinJS.UI.Menu.NullCommand",p.nullCommand);a._element||(a=new o.MenuCommand(null,a)),a._element.parentElement&&a._element.parentElement.removeChild(a._element),this._element.appendChild(a._element)},_dispose:function(){this._hoverPromise&&this._hoverPromise.cancel(),m.Flyout.prototype._dispose.call(this)},_commandsUpdated:function(){this.hidden||this._checkMenuCommands()},_checkMenuCommands:function(){var a=this._element.querySelectorAll(".win-command"),b=!1,c=!1;if(a)for(var d=0,e=a.length;e>d;d++){var f=a[d].winControl;f&&!f.hidden&&(b||f.type!==l.typeToggle||(b=!0),c||f.type!==l.typeFlyout||(c=!0))}i[b?"addClass":"removeClass"](this._element,l.menuContainsToggleCommandClass),i[c?"addClass":"removeClass"](this._element,l.menuContainsFlyoutCommandClass)},_handleKeyDown:function(a){a.keyCode===j.upArrow?(q._focusOnPreviousElement(this.element),a.preventDefault()):a.keyCode===j.downArrow?(q._focusOnNextElement(this.element),a.preventDefault()):a.keyCode!==j.space&&a.keyCode!==j.enter||this.element!==b.document.activeElement?a.keyCode===j.tab&&a.preventDefault():(a.preventDefault(),this.hide())},_handleFocusIn:function(b){var c=b.target;if(a(c)){var d=c.winControl;if(i.hasClass(d.element,l.menuCommandFlyoutActivatedClass))d.flyout.element.focus();else{var e=this.element.querySelector("."+l.menuCommandFlyoutActivatedClass);e&&o.MenuCommand._deactivateFlyoutCommand(e)}}else c===this.element&&m.Flyout.prototype._handleFocusIn.call(this,b)},_handleCommandInvoked:function(a){this._hoverPromise&&this._hoverPromise.cancel();var b=a.detail.command;b._type!==l.typeFlyout&&b._type!==l.typeSeparator&&this._lightDismiss()},_hoverPromise:null,_handleMouseOver:function(b){var c=b.target;if(a(c)){var d=c.winControl,e=this;c.focus&&(c.focus(),i.removeClass(c,"win-keyboard"),d.type===l.typeFlyout&&d.flyout&&d.flyout.hidden&&(this._hoverPromise=this._hoverPromise||h.timeout(l.menuCommandHoverDelay).then(function(){e.hidden||e._disposed||d._invoke(b),e._hoverPromise=null},function(){e._hoverPromise=null})))}},_handleMouseOut:function(c){var d=c.target;a(d)&&!d.contains(c.relatedTarget)&&(d===b.document.activeElement&&this.element.focus(),this._hoverPromise&&this._hoverPromise.cancel())},_writeProfilerMark:function(a){g("WinJS.UI.Menu:"+this._id+":"+a)}});return q._focusOnNextElement=function(a){var c=b.document.activeElement;do c=c===a?c.firstElementChild:c.nextElementSibling,c?c.focus():c=a;while(c!==b.document.activeElement)},q._focusOnPreviousElement=function(a){var c=b.document.activeElement;do c=c===a?c.lastElementChild:c.previousElementSibling,c?c.focus():c=a;while(c!==b.document.activeElement)},q})})}),d("WinJS/Controls/AutoSuggestBox/_SearchSuggestionManagerShim",["exports","../../_Signal","../../Core/_Base","../../Core/_BaseUtils","../../Core/_Events","../../BindingList"],function(a,b,c,d,e,f){"use strict";var g={reset:0,itemInserted:1,itemRemoved:2,itemChanged:3},h={Query:0,Result:1,Separator:2},i=c.Class.derive(Array,function(){},{reset:function(){this.length=0,this.dispatchEvent("vectorchanged",{collectionChange:g.reset,index:0})},insert:function(a,b){this.splice(a,0,b),this.dispatchEvent("vectorchanged",{collectionChange:g.itemInserted,index:a})},remove:function(a){this.splice(a,1),this.dispatchEvent("vectorchanged",{collectionChange:g.itemRemoved,index:a})}});c.Class.mix(i,e.eventMixin);var j=c.Class.define(function(){this._data=[]},{size:{get:function(){return this._data.length}},appendQuerySuggestion:function(a){this._data.push({kind:h.Query,text:a})},appendQuerySuggestions:function(a){a.forEach(this.appendQuerySuggestion.bind(this))},appendResultSuggestion:function(a,b,c,d,e){this._data.push({kind:h.Result,text:a,detailText:b,tag:c,imageUrl:d,imageAlternateText:e,image:null})},appendSearchSeparator:function(a){this._data.push({kind:h.Separator,text:a})}}),k=c.Class.define(function(a,b,c){this._queryText=a,this._language=b,this._linguisticDetails=c,this._searchSuggestionCollection=new j},{language:{get:function(){return this._language}},linguisticDetails:{get:function(){return this._linguisticDetails}},queryText:{get:function(){return this._queryText}},searchSuggestionCollection:{get:function(){return this._searchSuggestionCollection}},getDeferral:function(){return this._deferralSignal||(this._deferralSignal=new b)},_deferralSignal:null}),l=c.Class.define(function(){this._updateVector=this._updateVector.bind(this),this._suggestionVector=new i,this._query="",this._history={"":[]},this._dataSource=[],this.searchHistoryContext="",this.searchHistoryEnabled=!0},{addToHistory:function(a){if(a&&a.trim()){for(var b=this._history[this.searchHistoryContext],c=-1,d=0,e=b.length;e>d;d++){var f=b[d];if(f.text.toLowerCase()===a.toLowerCase()){c=d;break}}c>=0&&b.splice(c,1),b.splice(0,0,{text:a,kind:h.Query}),this._updateVector()}},clearHistory:function(){this._history[this.searchHistoryContext]=[],this._updateVector()},setLocalContentSuggestionSettings:function(a){},setQuery:function(a){function b(a){c._dataSource=a,c._updateVector()}var c=this;this._query=a;var d=new k(a);this.dispatchEvent("suggestionsrequested",{request:d}),d._deferralSignal?d._deferralSignal.promise.then(b.bind(this,d.searchSuggestionCollection._data)):b(d.searchSuggestionCollection._data)},searchHistoryContext:{get:function(){return""+this._searchHistoryContext},set:function(a){a=""+a,this._history[a]||(this._history[a]=[]),this._searchHistoryContext=a}},searchHistoryEnabled:{get:function(){return this._searchHistoryEnabled},set:function(a){this._searchHistoryEnabled=a}},suggestions:{get:function(){return this._suggestionVector}},_updateVector:function(){for(this.suggestions.insert(this.suggestions.length,{text:"",kind:h.Query});this.suggestions.length>1;)this.suggestions.remove(0);var a=0,b={};if(this.searchHistoryEnabled){var c=this._query.toLowerCase();this._history[this.searchHistoryContext].forEach(function(d){var e=d.text.toLowerCase();0===e.indexOf(c)&&(this.suggestions.insert(a,d),b[e]=!0,a++)},this)}this._dataSource.forEach(function(c){c.kind===h.Query?b[c.text.toLowerCase()]||(this.suggestions.insert(a,c),a++):(this.suggestions.insert(a,c),a++)},this),this.suggestions.remove(this.suggestions.length-1)}});c.Class.mix(l,e.eventMixin),c.Namespace._moduleDefine(a,null,{_CollectionChange:g,_SearchSuggestionKind:h,_SearchSuggestionManagerShim:l})}),d("require-style!less/styles-autosuggestbox",[],function(){}),d("require-style!less/colors-autosuggestbox",[],function(){}),d("WinJS/Controls/AutoSuggestBox",["exports","../Core/_Global","../Core/_WinRT","../Core/_Base","../Core/_ErrorFromName","../Core/_Events","../Core/_Resources","../Utilities/_Control","../Utilities/_ElementListUtilities","../Utilities/_ElementUtilities","../Utilities/_Hoverable","../_Accents","../Animations","../BindingList","../Promise","./Repeater","./AutoSuggestBox/_SearchSuggestionManagerShim","require-style!less/styles-autosuggestbox","require-style!less/colors-autosuggestbox"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){"use strict";l.createAccentRule("html.win-hoverable .win-autosuggestbox .win-autosuggestbox-suggestion-selected:hover",[{name:"background-color",value:l.ColorTypes.listSelectHover}]),l.createAccentRule(".win-autosuggestbox .win-autosuggestbox-suggestion-selected",[{name:"background-color",value:l.ColorTypes.listSelectRest}]),l.createAccentRule(".win-autosuggestbox .win-autosuggestbox-suggestion-selected.win-autosuggestbox-suggestion-selected:hover:active",[{name:"background-color",value:l.ColorTypes.listSelectPress}]);var r={asb:"win-autosuggestbox",asbDisabled:"win-autosuggestbox-disabled",asbFlyout:"win-autosuggestbox-flyout",asbFlyoutAbove:"win-autosuggestbox-flyout-above",asbBoxFlyoutHighlightText:"win-autosuggestbox-flyout-highlighttext",asbHitHighlightSpan:"win-autosuggestbox-hithighlight-span",asbInput:"win-autosuggestbox-input",asbInputFocus:"win-autosuggestbox-input-focus",asbSuggestionQuery:"win-autosuggestbox-suggestion-query",asbSuggestionResult:"win-autosuggestbox-suggestion-result",asbSuggestionResultText:"win-autosuggestbox-suggestion-result-text",asbSuggestionResultDetailedText:"win-autosuggestbox-suggestion-result-detailed-text",asbSuggestionSelected:"win-autosuggestbox-suggestion-selected",asbSuggestionSeparator:"win-autosuggestbox-suggestion-separator"};d.Namespace._moduleDefine(a,"WinJS.UI",{AutoSuggestBox:d.Namespace._lazy(function(){function a(a,c,d,e){function f(a,c,d){var e=b.document.createElement("span");return e.textContent=c,e.setAttribute("aria-hidden","true"),e.classList.add(r.asbHitHighlightSpan),a.insertBefore(e,d),e}if(d){i.query("."+r.asbHitHighlightSpan,a).forEach(function(a){a.parentNode.removeChild(a)});var g=a.firstChild,h=c.hits;!h&&e&&c.kind!==q._SearchSuggestionKind.Separator&&(h=e.find(d));for(var k=x._sortAndMergeHits(h),l=0,m=0;m<k.length;m++){var n=k[m];f(a,d.substring(l,n.startPosition),g),l=n.startPosition+n.length;var o=f(a,d.substring(n.startPosition,l),g);j.addClass(o,r.asbBoxFlyoutHighlightText)}l<d.length&&f(a,d.substring(l),g)}}function k(a){var b={ctrlKey:1,altKey:2,shiftKey:4},c=0;return a.ctrlKey&&(c|=b.ctrlKey),a.altKey&&(c|=b.altKey),a.shiftKey&&(c|=b.shiftKey),c}function l(c,d){function e(a){c._internalFocusMove=!0,c._inputElement.focus(),c._processSuggestionChosen(d,a)}var f=b.document.createElement("div"),h=new b.Image;h.style.opacity=0;var i=function(a){function b(){
-h.removeEventListener("load",b,!1),m.fadeIn(h)}h.addEventListener("load",b,!1),h.src=a};null!==d.image?d.image.openReadAsync().then(function(a){null!==a&&i(b.URL.createObjectURL(a,{oneTimeOnly:!0}))}):null!==d.imageUrl&&i(d.imageUrl),h.setAttribute("aria-hidden","true"),f.appendChild(h);var k=b.document.createElement("div");j.addClass(k,r.asbSuggestionResultText),a(k,d,d.text),k.title=d.text,k.setAttribute("aria-hidden","true"),f.appendChild(k);var l=b.document.createElement("br");k.appendChild(l);var n=b.document.createElement("span");j.addClass(n,r.asbSuggestionResultDetailedText),a(n,d,d.detailText),n.title=d.detailText,n.setAttribute("aria-hidden","true"),k.appendChild(n),j.addClass(f,r.asbSuggestionResult),j._addEventListener(f,"click",function(a){c._isFlyoutPointerDown||e(a)}),j._addEventListener(f,"pointerup",e),f.setAttribute("role","option");var o=g._formatString(w.ariaLabelResult,d.text,d.detailText);return f.setAttribute("aria-label",o),f}function s(c,d){function e(a){c._internalFocusMove=!0,c._inputElement.focus(),c._processSuggestionChosen(d,a)}var f=b.document.createElement("div");a(f,d,d.text),f.title=d.text,f.classList.add(r.asbSuggestionQuery),j._addEventListener(f,"click",function(a){c._isFlyoutPointerDown||e(a)}),j._addEventListener(f,"pointerup",e);var h=g._formatString(w.ariaLabelQuery,d.text);return f.setAttribute("role","option"),f.setAttribute("aria-label",h),f}function t(a){var c=b.document.createElement("div");if(a.text.length>0){var d=b.document.createElement("div");d.textContent=a.text,d.title=a.text,d.setAttribute("aria-hidden","true"),c.appendChild(d)}c.insertAdjacentHTML("beforeend","<hr/>"),j.addClass(c,r.asbSuggestionSeparator),c.setAttribute("role","separator");var e=g._formatString(w.ariaLabelSeparator,a.text);return c.setAttribute("aria-label",e),c}var u=j.Key,v={querychanged:"querychanged",querysubmitted:"querysubmitted",resultsuggestionchosen:"resultsuggestionchosen",suggestionsrequested:"suggestionsrequested"},w={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get invalidSuggestionKind(){return"Error: Invalid suggestion kind."},get ariaLabel(){return g._getWinJSString("ui/autoSuggestBoxAriaLabel").value},get ariaLabelInputNoPlaceHolder(){return g._getWinJSString("ui/autoSuggestBoxAriaLabelInputNoPlaceHolder").value},get ariaLabelInputPlaceHolder(){return g._getWinJSString("ui/autoSuggestBoxAriaLabelInputPlaceHolder").value},get ariaLabelQuery(){return g._getWinJSString("ui/autoSuggestBoxAriaLabelQuery").value},get ariaLabelResult(){return g._getWinJSString("ui/autoSuggestBoxAriaLabelResult").value},get ariaLabelSeparator(){return g._getWinJSString("ui/autoSuggestBoxAriaLabelSeparator").value}},x=d.Class.define(function(a,c){if(a=a||b.document.createElement("div"),c=c||{},a.winControl)throw new e("WinJS.UI.AutoSuggestBox.DuplicateConstruction",w.duplicateConstruction);this._suggestionsChangedHandler=this._suggestionsChangedHandler.bind(this),this._suggestionsRequestedHandler=this._suggestionsRequestedHandler.bind(this),this._element=a,a.winControl=this,a.classList.add(r.asb),a.classList.add("win-disposable"),this._setupDOM(),this._setupSSM(),this._chooseSuggestionOnEnter=!1,this._currentFocusedIndex=-1,this._currentSelectedIndex=-1,this._flyoutOpenPromise=o.wrap(),this._lastKeyPressLanguage="",this._prevLinguisticDetails=this._getLinguisticDetails(),this._prevQueryText="",h.setOptions(this,c),this._hideFlyout()},{onresultsuggestionchosen:f._createEventProperty(v.resultsuggestionchosen),onquerychanged:f._createEventProperty(v.querychanged),onquerysubmitted:f._createEventProperty(v.querysubmitted),onsuggestionsrequested:f._createEventProperty(v.suggestionsrequested),element:{get:function(){return this._element}},chooseSuggestionOnEnter:{get:function(){return this._chooseSuggestionOnEnter},set:function(a){this._chooseSuggestionOnEnter=!!a}},disabled:{get:function(){return this._inputElement.disabled},set:function(a){this._inputElement.disabled!==!!a&&(a?this._disableControl():this._enableControl())}},placeholderText:{get:function(){return this._inputElement.placeholder},set:function(a){this._inputElement.placeholder=a,this._updateInputElementAriaLabel()}},queryText:{get:function(){return this._inputElement.value},set:function(a){this._inputElement.value="",this._inputElement.value=a}},searchHistoryDisabled:{get:function(){return!this._suggestionManager.searchHistoryEnabled},set:function(a){this._suggestionManager.searchHistoryEnabled=!a}},searchHistoryContext:{get:function(){return this._suggestionManager.searchHistoryContext},set:function(a){this._suggestionManager.searchHistoryContext=a}},dispose:function(){this._disposed||(this._flyoutOpenPromise.cancel(),this._suggestions.removeEventListener("vectorchanged",this._suggestionsChangedHandler),this._suggestionManager.removeEventListener("suggestionsrequested",this._suggestionsRequestedHandler),this._suggestionManager=null,this._suggestions=null,this._hitFinder=null,this._disposed=!0)},setLocalContentSuggestionSettings:function(a){this._suggestionManager.setLocalContentSuggestionSettings(a)},_setupDOM:function(){function a(a){return f._renderSuggestion(a)}var c=this._flyoutPointerReleasedHandler.bind(this),d=this._inputOrImeChangeHandler.bind(this);this._element.getAttribute("aria-label")||this._element.setAttribute("aria-label",w.ariaLabel),this._element.setAttribute("role","group"),this._inputElement=b.document.createElement("input"),this._inputElement.autocorrect="off",this._inputElement.type="search",this._inputElement.classList.add(r.asbInput),this._inputElement.classList.add("win-textbox"),this._inputElement.setAttribute("role","textbox"),this._inputElement.addEventListener("keydown",this._keyDownHandler.bind(this)),this._inputElement.addEventListener("keypress",this._keyPressHandler.bind(this)),this._inputElement.addEventListener("keyup",this._keyUpHandler.bind(this)),this._inputElement.addEventListener("focus",this._inputFocusHandler.bind(this)),this._inputElement.addEventListener("blur",this._inputBlurHandler.bind(this)),this._inputElement.addEventListener("input",d),this._inputElement.addEventListener("compositionstart",d),this._inputElement.addEventListener("compositionupdate",d),this._inputElement.addEventListener("compositionend",d),j._addEventListener(this._inputElement,"pointerdown",this._inputPointerDownHandler.bind(this)),this._updateInputElementAriaLabel(),this._element.appendChild(this._inputElement);var e=this._tryGetInputContext();e&&(e.addEventListener("MSCandidateWindowShow",this._msCandidateWindowShowHandler.bind(this)),e.addEventListener("MSCandidateWindowHide",this._msCandidateWindowHideHandler.bind(this))),this._flyoutElement=b.document.createElement("div"),this._flyoutElement.classList.add(r.asbFlyout),this._flyoutElement.addEventListener("blur",this._flyoutBlurHandler.bind(this)),j._addEventListener(this._flyoutElement,"pointerup",c),j._addEventListener(this._flyoutElement,"pointercancel",c),j._addEventListener(this._flyoutElement,"pointerout",c),j._addEventListener(this._flyoutElement,"pointerdown",this._flyoutPointerDownHandler.bind(this)),this._element.appendChild(this._flyoutElement);var f=this;this._suggestionsData=new n.List,this._repeaterElement=b.document.createElement("div"),this._repeater=new p.Repeater(this._repeaterElement,{data:this._suggestionsData,template:a}),j._ensureId(this._repeaterElement),this._repeaterElement.setAttribute("role","listbox"),this._repeaterElement.setAttribute("aria-live","polite"),this._flyoutElement.appendChild(this._repeaterElement)},_setupSSM:function(){this._suggestionManager=new q._SearchSuggestionManagerShim,this._suggestions=this._suggestionManager.suggestions,this._suggestions.addEventListener("vectorchanged",this._suggestionsChangedHandler),this._suggestionManager.addEventListener("suggestionsrequested",this._suggestionsRequestedHandler)},_hideFlyout:function(){this._isFlyoutShown()&&(this._flyoutElement.style.display="none")},_showFlyout:function(){var a=this._prevNumSuggestions||0;if(this._prevNumSuggestions=this._suggestionsData.length,(!this._isFlyoutShown()||a!==this._suggestionsData.length)&&0!==this._suggestionsData.length){this._flyoutElement.style.display="block";var c=this._inputElement.getBoundingClientRect(),d=this._flyoutElement.getBoundingClientRect(),e=b.document.documentElement.clientWidth,f=c.top,g=b.document.documentElement.clientHeight-c.bottom;this._flyoutBelowInput=g>=f,this._flyoutBelowInput?(this._flyoutElement.classList.remove(r.asbFlyoutAbove),this._flyoutElement.scrollTop=0):(this._flyoutElement.classList.add(r.asbFlyoutAbove),this._flyoutElement.scrollTop=this._flyoutElement.scrollHeight-this._flyoutElement.clientHeight),this._addFlyoutIMEPaddingIfRequired();var h;h="rtl"===j._getComputedStyle(this._flyoutElement).direction?c.right-d.width>=0||c.left+d.width>e:c.left+d.width>e&&c.right-d.width>=0,h?this._flyoutElement.style.left=c.width-d.width-this._element.clientLeft+"px":this._flyoutElement.style.left="-"+this._element.clientLeft+"px",this._flyoutElement.style.touchAction=this._flyoutElement.scrollHeight>d.height?"pan-y":"none",this._flyoutOpenPromise.cancel();var i=this._flyoutBelowInput?"WinJS-flyoutBelowASB-showPopup":"WinJS-flyoutAboveASB-showPopup";this._flyoutOpenPromise=m.showPopup(this._flyoutElement,{top:"0px",left:"0px",keyframe:i})}},_addFlyoutIMEPaddingIfRequired:function(){var a=this._tryGetInputContext();if(a&&this._isFlyoutShown()&&this._flyoutBelowInput){var b=this._flyoutElement.getBoundingClientRect(),c=a.getCandidateWindowClientRect(),d=this._inputElement.getBoundingClientRect(),e=d.bottom,f=d.bottom+b.height;if(!(c.top>f||c.bottom<e)){var g=m.createRepositionAnimation(this._flyoutElement);c.width<.45*d.width?this._flyoutElement.style.marginLeft=c.width+"px":this._flyoutElement.style.marginTop=c.bottom-c.top+4+"px",g.execute()}}},_findNextSuggestionElementIndex:function(a){for(var b=0>a?0:a+1,c=b;c<this._suggestionsData.length;c++)if(this._repeater.elementFromIndex(c)&&this._isSuggestionSelectable(this._suggestionsData.getAt(c)))return c;return-1},_findPreviousSuggestionElementIndex:function(a){for(var b=a>=this._suggestionsData.length?this._suggestionsData.length-1:a-1,c=b;c>=0;c--)if(this._repeater.elementFromIndex(c)&&this._isSuggestionSelectable(this._suggestionsData.getAt(c)))return c;return-1},_isFlyoutShown:function(){return"none"!==this._flyoutElement.style.display},_isSuggestionSelectable:function(a){return a.kind===q._SearchSuggestionKind.Query||a.kind===q._SearchSuggestionKind.Result},_processSuggestionChosen:function(a,b){this.queryText=a.text,a.kind===q._SearchSuggestionKind.Query?this._submitQuery(a.text,!1,b):a.kind===q._SearchSuggestionKind.Result&&this._fireEvent(v.resultsuggestionchosen,{tag:a.tag,keyModifiers:k(b),storageFile:null}),this._hideFlyout()},_selectSuggestionAtIndex:function(a){function b(a){var b=c._flyoutElement.getBoundingClientRect().bottom-c._flyoutElement.getBoundingClientRect().top;if(a.offsetTop+a.offsetHeight>c._flyoutElement.scrollTop+b){var d=a.offsetTop+a.offsetHeight-(c._flyoutElement.scrollTop+b);j._zoomTo(c._flyoutElement,{contentX:0,contentY:c._flyoutElement.scrollTop+d,viewportX:0,viewportY:0})}else a.offsetTop<c._flyoutElement.scrollTop&&j._zoomTo(c._flyoutElement,{contentX:0,contentY:a.offsetTop,viewportX:0,viewportY:0})}for(var c=this,d=null,e=0;e<this._suggestionsData.length;e++)d=this._repeater.elementFromIndex(e),e!==a?(d.classList.remove(r.asbSuggestionSelected),d.setAttribute("aria-selected","false")):(d.classList.add(r.asbSuggestionSelected),b(d),d.setAttribute("aria-selected","true"));this._currentSelectedIndex=a,d?this._inputElement.setAttribute("aria-activedescendant",this._repeaterElement.id+a):this._inputElement.hasAttribute("aria-activedescendant")&&this._inputElement.removeAttribute("aria-activedescendant")},_updateFakeFocus:function(){var a;a=this._isFlyoutShown()&&this._chooseSuggestionOnEnter?this._findNextSuggestionElementIndex(-1):-1,this._selectSuggestionAtIndex(a)},_updateQueryTextWithSuggestionText:function(a){a>=0&&a<this._suggestionsData.length&&(this.queryText=this._suggestionsData.getAt(a).text)},_disableControl:function(){this._isFlyoutShown()&&this._hideFlyout(),this._element.disabled=!0,this._element.classList.add(r.asbDisabled),this._inputElement.disabled=!0},_enableControl:function(){this._element.disabled=!1,this._element.classList.remove(r.asbDisabled),this._inputElement.disabled=!1,b.document.activeElement===this._element&&j._setActive(this._inputElement)},_fireEvent:function(a,c){var d=b.document.createEvent("CustomEvent");return d.initCustomEvent(a,!0,!0,c),this._element.dispatchEvent(d)},_getLinguisticDetails:function(a,b){function d(a,b,d,e,f){for(var g=null,h=[],i=0;i<a.length;i++)h[i]=e+a[i]+f;if(c.Windows.ApplicationModel.Search.SearchQueryLinguisticDetails)try{g=new c.Windows.ApplicationModel.Search.SearchQueryLinguisticDetails(h,b,d)}catch(j){}return g||(g={queryTextAlternatives:h,queryTextCompositionStart:b,queryTextCompositionLength:d}),g}var e=null;if(this._inputElement.value===this._prevQueryText&&a&&this._prevLinguisticDetails&&b)e=this._prevLinguisticDetails;else{var f=[],g=0,h=0,i="",j="";if(b){var k=this._tryGetInputContext();k&&k.getCompositionAlternatives&&(f=k.getCompositionAlternatives(),g=k.compositionStartOffset,h=k.compositionEndOffset-k.compositionStartOffset,this._inputElement.value!==this._prevQueryText||0===this._prevCompositionLength||h>0?(i=this._inputElement.value.substring(0,g),j=this._inputElement.value.substring(g+h)):(i=this._inputElement.value.substring(0,this._prevCompositionStart),j=this._inputElement.value.substring(this._prevCompositionStart+this._prevCompositionLength)))}e=d(f,g,h,i,j)}return e},_isElementInSearchControl:function(a){return this.element.contains(a)||this.element===a},_renderSuggestion:function(a){var b=null;if(!a)return b;if(a.kind===q._SearchSuggestionKind.Query)b=s(this,a);else if(a.kind===q._SearchSuggestionKind.Separator)b=t(a);else{if(a.kind!==q._SearchSuggestionKind.Result)throw new e("WinJS.UI.AutoSuggestBox.invalidSuggestionKind",w.invalidSuggestionKind);b=l(this,a)}return b},_shouldIgnoreInput:function(){var a=this._isProcessingDownKey||this._isProcessingUpKey||this._isProcessingTabKey||this._isProcessingEnterKey;return a||this._isFlyoutPointerDown},_submitQuery:function(a,b,d){this._disposed||(c.Windows.Globalization.Language&&(this._lastKeyPressLanguage=c.Windows.Globalization.Language.currentInputMethodLanguageTag),this._fireEvent(v.querysubmitted,{language:this._lastKeyPressLanguage,linguisticDetails:this._getLinguisticDetails(!0,b),queryText:a,keyModifiers:k(d)}),this._suggestionManager&&this._suggestionManager.addToHistory(this._inputElement.value,this._lastKeyPressLanguage))},_tryGetInputContext:function(){if(this._inputElement.msGetInputContext)try{return this._inputElement.msGetInputContext()}catch(a){return null}return null},_updateInputElementAriaLabel:function(){this._inputElement.setAttribute("aria-label",this._inputElement.placeholder?g._formatString(w.ariaLabelInputPlaceHolder,this._inputElement.placeholder):w.ariaLabelInputNoPlaceHolder)},_flyoutBlurHandler:function(a){this._isElementInSearchControl(b.document.activeElement)?this._internalFocusMove=!0:(this._element.classList.remove(r.asbInputFocus),this._hideFlyout())},_flyoutPointerDownHandler:function(a){function b(){if(d)for(var a=0;a<c._suggestionsData.length;a++)if(c._repeater.elementFromIndex(a)===d)return a;return-1}var c=this,d=a.target;for(this._isFlyoutPointerDown=!0;d&&d.parentNode!==this._repeaterElement;)d=d.parentNode;var e=b();e>=0&&e<this._suggestionsData.length&&this._currentFocusedIndex!==e&&this._isSuggestionSelectable(this._suggestionsData.getAt(e))&&(this._currentFocusedIndex=e,this._selectSuggestionAtIndex(e),this._updateQueryTextWithSuggestionText(this._currentFocusedIndex)),a.preventDefault()},_flyoutPointerReleasedHandler:function(){if(this._isFlyoutPointerDown=!1,this._reflowImeOnPointerRelease){this._reflowImeOnPointerRelease=!1;var a=m.createRepositionAnimation(this._flyoutElement);this._flyoutElement.style.marginTop="",this._flyoutElement.style.marginLeft="",a.execute()}},_inputBlurHandler:function(a){this._isElementInSearchControl(b.document.activeElement)||(this._element.classList.remove(r.asbInputFocus),this._hideFlyout()),this.queryText=this._prevQueryText,this._isProcessingDownKey=!1,this._isProcessingUpKey=!1,this._isProcessingTabKey=!1,this._isProcessingEnterKey=!1},_inputFocusHandler:function(a){this._inputElement.value!==this._prevQueryText&&c.Windows.Data.Text.SemanticTextQuery&&(""!==this._inputElement.value?this._hitFinder=new c.Windows.Data.Text.SemanticTextQuery(this._inputElement.value,this._inputElement.lang):this._hitFinder=null),a.target!==this._inputElement||this._internalFocusMove||(this._showFlyout(),-1!==this._currentFocusedIndex?this._selectSuggestionAtIndex(this._currentFocusedIndex):this._updateFakeFocus(),this._suggestionManager.setQuery(this._inputElement.value,this._lastKeyPressLanguage,this._getLinguisticDetails(!0,!0))),this._internalFocusMove=!1,this._element.classList.add(r.asbInputFocus)},_inputOrImeChangeHandler:function(){function a(a){var c=!1;return b._prevLinguisticDetails.queryTextCompositionStart===a.queryTextCompositionStart&&b._prevLinguisticDetails.queryTextCompositionLength===a.queryTextCompositionLength&&b._prevLinguisticDetails.queryTextAlternatives.length===a.queryTextAlternatives.length||(c=!0),b._prevLinguisticDetails=a,c}var b=this;if(!this._shouldIgnoreInput()){var d=this._getLinguisticDetails(!1,!0),a=a(d);if((this._inputElement.value!==this._prevQueryText||0===this._prevCompositionLength||d.queryTextCompositionLength>0)&&(this._prevCompositionStart=d.queryTextCompositionStart,this._prevCompositionLength=d.queryTextCompositionLength),this._prevQueryText===this._inputElement.value&&!a)return;this._prevQueryText=this._inputElement.value,c.Windows.Globalization.Language&&(this._lastKeyPressLanguage=c.Windows.Globalization.Language.currentInputMethodLanguageTag),c.Windows.Data.Text.SemanticTextQuery&&(""!==this._inputElement.value?this._hitFinder=new c.Windows.Data.Text.SemanticTextQuery(this._inputElement.value,this._lastKeyPressLanguage):this._hitFinder=null),this._fireEvent(v.querychanged,{language:this._lastKeyPressLanguage,queryText:this._inputElement.value,linguisticDetails:d}),this._suggestionManager.setQuery(this._inputElement.value,this._lastKeyPressLanguage,d)}},_inputPointerDownHandler:function(){b.document.activeElement===this._inputElement&&-1!==this._currentSelectedIndex&&(this._currentFocusedIndex=-1,this._selectSuggestionAtIndex(this._currentFocusedIndex))},_keyDownHandler:function(a){function b(b){c._currentFocusedIndex=b,c._selectSuggestionAtIndex(b),a.preventDefault(),a.stopPropagation()}var c=this;if(this._lastKeyPressLanguage=a.locale,a.keyCode===u.tab?this._isProcessingTabKey=!0:a.keyCode===u.upArrow?this._isProcessingUpKey=!0:a.keyCode===u.downArrow?this._isProcessingDownKey=!0:a.keyCode===u.enter&&"ko"===a.locale&&(this._isProcessingEnterKey=!0),a.keyCode!==u.IME)if(a.keyCode===u.tab){var d=!0;a.shiftKey?-1!==this._currentFocusedIndex&&(b(-1),d=!1):-1===this._currentFocusedIndex&&(this._currentFocusedIndex=this._flyoutBelowInput?this._findNextSuggestionElementIndex(this._currentFocusedIndex):this._findPreviousSuggestionElementIndex(this._suggestionsData.length),-1!==this._currentFocusedIndex&&(b(this._currentFocusedIndex),this._updateQueryTextWithSuggestionText(this._currentFocusedIndex),d=!1)),d&&this._hideFlyout()}else if(a.keyCode===u.escape)-1!==this._currentFocusedIndex?(this.queryText=this._prevQueryText,b(-1)):""!==this.queryText&&(this.queryText="",this._inputOrImeChangeHandler(null),a.preventDefault(),a.stopPropagation());else if(this._flyoutBelowInput&&a.keyCode===u.upArrow||!this._flyoutBelowInput&&a.keyCode===u.downArrow){var e;-1!==this._currentSelectedIndex?(e=this._findPreviousSuggestionElementIndex(this._currentSelectedIndex),-1===e&&(this.queryText=this._prevQueryText)):e=this._findPreviousSuggestionElementIndex(this._suggestionsData.length),b(e),this._updateQueryTextWithSuggestionText(this._currentFocusedIndex)}else if(this._flyoutBelowInput&&a.keyCode===u.downArrow||!this._flyoutBelowInput&&a.keyCode===u.upArrow){var f=this._findNextSuggestionElementIndex(this._currentSelectedIndex);-1!==this._currentSelectedIndex&&-1===f&&(this.queryText=this._prevQueryText),b(f),this._updateQueryTextWithSuggestionText(this._currentFocusedIndex)}else a.keyCode===u.enter&&(-1===this._currentSelectedIndex?this._submitQuery(this._inputElement.value,!0,a):this._processSuggestionChosen(this._suggestionsData.getAt(this._currentSelectedIndex),a),this._hideFlyout())},_keyUpHandler:function(a){a.keyCode===u.tab?this._isProcessingTabKey=!1:a.keyCode===u.upArrow?this._isProcessingUpKey=!1:a.keyCode===u.downArrow?this._isProcessingDownKey=!1:a.keyCode===u.enter&&(this._isProcessingEnterKey=!1)},_keyPressHandler:function(a){this._lastKeyPressLanguage=a.locale},_msCandidateWindowHideHandler:function(){if(this._isFlyoutPointerDown)this._reflowImeOnPointerRelease=!0;else{var a=m.createRepositionAnimation(this._flyoutElement);this._flyoutElement.style.marginTop="",this._flyoutElement.style.marginLeft="",a.execute()}},_msCandidateWindowShowHandler:function(){this._addFlyoutIMEPaddingIfRequired(),this._reflowImeOnPointerRelease=!1},_suggestionsChangedHandler:function(c){var d=c.collectionChange||c.detail.collectionChange,e=+c.index===c.index?c.index:c.detail.index,f=q._CollectionChange;if(d===f.reset)this._isFlyoutShown()&&this._hideFlyout(),this._suggestionsData.splice(0,this._suggestionsData.length);else if(d===f.itemInserted){var g=this._suggestions[e];this._suggestionsData.splice(e,0,g),this._showFlyout()}else if(d===f.itemRemoved)1===this._suggestionsData.length&&(j._setActive(this._inputElement),this._hideFlyout()),this._suggestionsData.splice(e,1);else if(d===f.itemChanged){var g=this._suggestions[e];if(g!==this._suggestionsData.getAt(e))this._suggestionsData.setAt(e,g);else{var h=this._repeater.elementFromIndex(e);if(j.hasClass(h,r.asbSuggestionQuery))a(h,g,g.text);else{var i=h.querySelector("."+r.asbSuggestionResultText);if(i){a(i,g,g.text);var k=h.querySelector("."+r.asbSuggestionResultDetailedText);k&&a(k,g,g.detailText)}}}}b.document.activeElement===this._inputElement&&this._updateFakeFocus()},_suggestionsRequestedHandler:function(a){c.Windows.Globalization.Language&&(this._lastKeyPressLanguage=c.Windows.Globalization.Language.currentInputMethodLanguageTag);var b,d=a.request||a.detail.request;this._fireEvent(v.suggestionsrequested,{setPromise:function(a){b=d.getDeferral(),a.then(function(){b.complete()})},searchSuggestionCollection:d.searchSuggestionCollection,language:this._lastKeyPressLanguage,linguisticDetails:this._getLinguisticDetails(!0,!0),queryText:this._inputElement.value})}},{createResultSuggestionImage:function(a){return c.Windows.Foundation.Uri&&c.Windows.Storage.Streams.RandomAccessStreamReference?c.Windows.Storage.Streams.RandomAccessStreamReference.createFromUri(new c.Windows.Foundation.Uri(a)):a},_EventNames:v,_sortAndMergeHits:function(a){function b(a,b){var c=0;return a.startPosition<b.startPosition?c=-1:a.startPosition>b.startPosition&&(c=1),c}function c(a,b,c){if(0===c)a.push(b);else{var d=a[a.length-1],e=d.startPosition+d.length;if(b.startPosition<=e){var f=b.startPosition+b.length;f>e&&(d.length=f-d.startPosition)}else a.push(b)}return a}var d=[];if(a){for(var e=new Array(a.length),f=0;f<a.length;f++)e.push({startPosition:a[f].startPosition,length:a[f].length});e.sort(b),e.reduce(c,d)}return d}});return d.Class.mix(x,h.DOMEventMixin),x})}),a.ClassNames=r}),d("require-style!less/styles-searchbox",[],function(){}),d("require-style!less/colors-searchbox",[],function(){}),d("WinJS/Controls/SearchBox",["../Core/_Global","../Core/_WinRT","../Core/_Base","../Core/_ErrorFromName","../Core/_Events","../Core/_Resources","./AutoSuggestBox","../_Accents","../Utilities/_Control","../Utilities/_ElementUtilities","./AutoSuggestBox/_SearchSuggestionManagerShim","../Application","require-style!less/styles-searchbox","require-style!less/colors-searchbox"],function(a,b,c,d,e,f,g,h,i,j,k,l){"use strict";h.createAccentRule("html.win-hoverable .win-searchbox-button:not(.win-searchbox-button-disabled):hover",[{name:"color",value:h.ColorTypes.accent}]),h.createAccentRule(".win-searchbox-button.win-searchbox-button:not(.win-searchbox-button-disabled):hover:active",[{name:"background-color",value:h.ColorTypes.accent}]),c.Namespace.define("WinJS.UI",{SearchBox:c.Namespace._lazy(function(){var d={searchBox:"win-searchbox",searchBoxDisabled:"win-searchbox-disabled",searchBoxInput:"win-searchbox-input",searchBoxInputFocus:"win-searchbox-input-focus",searchBoxButton:"win-searchbox-button",searchBoxFlyout:"win-searchbox-flyout",searchBoxFlyoutHighlightText:"win-searchbox-flyout-highlighttext",searchBoxHitHighlightSpan:"win-searchbox-hithighlight-span",searchBoxSuggestionResult:"win-searchbox-suggestion-result",searchBoxSuggestionResultText:"win-searchbox-suggestion-result-text",searchBoxSuggestionResultDetailedText:"win-searchbox-suggestion-result-detailed-text",searchBoxSuggestionSelected:"win-searchbox-suggestion-selected",searchBoxSuggestionQuery:"win-searchbox-suggestion-query",searchBoxSuggestionSeparator:"win-searchbox-suggestion-separator",searchBoxButtonInputFocus:"win-searchbox-button-input-focus",searchBoxButtonDisabled:"win-searchbox-button-disabled"},e={receivingfocusonkeyboardinput:"receivingfocusonkeyboardinput"},h={get invalidSearchBoxSuggestionKind(){return"Error: Invalid search suggestion kind."},get ariaLabel(){return f._getWinJSString("ui/searchBoxAriaLabel").value},get ariaLabelInputNoPlaceHolder(){return f._getWinJSString("ui/searchBoxAriaLabelInputNoPlaceHolder").value},get ariaLabelInputPlaceHolder(){return f._getWinJSString("ui/searchBoxAriaLabelInputPlaceHolder").value},get searchBoxDeprecated(){return"SearchBox is deprecated and may not be available in future releases. Instead use AutoSuggestBox."}},m=c.Class.derive(g.AutoSuggestBox,function(b,c){j._deprecated(h.searchBoxDeprecated),this._requestingFocusOnKeyboardInputHandlerBind=this._requestingFocusOnKeyboardInputHandler.bind(this),this._buttonElement=a.document.createElement("div"),this._focusOnKeyboardInput=!1,g.AutoSuggestBox.call(this,b,c),this.element.classList.add(d.searchBox),this._flyoutElement.classList.add(d.searchBoxFlyout),this._inputElement.classList.add(d.searchBoxInput),this._inputElement.addEventListener("blur",this._searchboxInputBlurHandler.bind(this)),this._inputElement.addEventListener("focus",this._searchboxInputFocusHandler.bind(this)),this._buttonElement.tabIndex=-1,this._buttonElement.classList.add(d.searchBoxButton),this._buttonElement.addEventListener("click",this._buttonClickHandler.bind(this)),j._addEventListener(this._buttonElement,"pointerdown",this._buttonPointerDownHandler.bind(this)),this.element.appendChild(this._buttonElement)},{focusOnKeyboardInput:{get:function(){return this._focusOnKeyboardInput},set:function(a){this._focusOnKeyboardInput&&!a?l._applicationListener.removeEventListener(this.element,"requestingfocusonkeyboardinput",this._requestingFocusOnKeyboardInputHandlerBind):!this._focusOnKeyboardInput&&a&&l._applicationListener.addEventListener(this.element,"requestingfocusonkeyboardinput",this._requestingFocusOnKeyboardInputHandlerBind),this._focusOnKeyboardInput=!!a}},dispose:function(){this._disposed||(g.AutoSuggestBox.prototype.dispose.call(this),this._focusOnKeyboardInput&&l._applicationListener.removeEventListener(this.element,"requestingfocusonkeyboardinput",this._requestingFocusOnKeyboardInputHandlerBind))},_disableControl:function(){g.AutoSuggestBox.prototype._disableControl.call(this),this._buttonElement.disabled=!0,this._buttonElement.classList.add(d.searchBoxButtonDisabled),this.element.classList.add(d.searchBoxDisabled)},_enableControl:function(){g.AutoSuggestBox.prototype._enableControl.call(this),this._buttonElement.disabled=!1,this._buttonElement.classList.remove(d.searchBoxButtonDisabled),this.element.classList.remove(d.searchBoxDisabled)},_renderSuggestion:function(a){var b=g.AutoSuggestBox.prototype._renderSuggestion.call(this,a);if(a.kind===k._SearchSuggestionKind.Query)b.classList.add(d.searchBoxSuggestionQuery);else if(a.kind===k._SearchSuggestionKind.Separator)b.classList.add(d.searchBoxSuggestionSeparator);else{b.classList.add(d.searchBoxSuggestionResult);var c=b.querySelector("."+g.ClassNames.asbSuggestionResultText);c.classList.add(d.searchBoxSuggestionResultText);var e=b.querySelector("."+g.ClassNames.asbSuggestionResultDetailedText);e.classList.add(d.searchBoxSuggestionResultDetailedText);for(var f=b.querySelectorAll("."+g.ClassNames.asbHitHighlightSpan),h=0,i=f.length;i>h;h++)f[h].classList.add(d.searchBoxHitHighlightSpan);for(var j=b.querySelectorAll("."+g.ClassNames.asbBoxFlyoutHighlightText),h=0,i=j.length;i>h;h++)j[h].classList.add(d.searchBoxFlyoutHighlightText)}return b},_selectSuggestionAtIndex:function(a){g.AutoSuggestBox.prototype._selectSuggestionAtIndex.call(this,a);var b=this.element.querySelector("."+d.searchBoxSuggestionSelected);b&&b.classList.remove(d.searchBoxSuggestionSelected);var c=this.element.querySelector("."+g.ClassNames.asbSuggestionSelected);c&&c.classList.add(d.searchBoxSuggestionSelected)},_shouldIgnoreInput:function(){var a=g.AutoSuggestBox.prototype._shouldIgnoreInput(),b=j._matchesSelector(this._buttonElement,":active");return a||b},_updateInputElementAriaLabel:function(){this._inputElement.setAttribute("aria-label",this._inputElement.placeholder?f._formatString(h.ariaLabelInputPlaceHolder,this._inputElement.placeholder):h.ariaLabelInputNoPlaceHolder)},_buttonPointerDownHandler:function(a){this._inputElement.focus(),a.preventDefault()},_buttonClickHandler:function(a){this._inputElement.focus(),this._submitQuery(this._inputElement.value,!0,a),this._hideFlyout()},_searchboxInputBlurHandler:function(){j.removeClass(this.element,d.searchBoxInputFocus),j.removeClass(this._buttonElement,d.searchBoxButtonInputFocus)},_searchboxInputFocusHandler:function(){j.addClass(this.element,d.searchBoxInputFocus),j.addClass(this._buttonElement,d.searchBoxButtonInputFocus)},_requestingFocusOnKeyboardInputHandler:function(){if(this._fireEvent(e.receivingfocusonkeyboardinput,null),a.document.activeElement!==this._inputElement)try{this._inputElement.focus()}catch(b){}}},{createResultSuggestionImage:function(a){return j._deprecated(h.searchBoxDeprecated),b.Windows.Foundation.Uri&&b.Windows.Storage.Streams.RandomAccessStreamReference?b.Windows.Storage.Streams.RandomAccessStreamReference.createFromUri(new b.Windows.Foundation.Uri(a)):a},_getKeyModifiers:function(a){var b={ctrlKey:1,altKey:2,shiftKey:4},c=0;return a.ctrlKey&&(c|=b.ctrlKey),a.altKey&&(c|=b.altKey),a.shiftKey&&(c|=b.shiftKey),c},_isTypeToSearchKey:function(a){return!(a.shiftKey||a.ctrlKey||a.altKey)}});return c.Class.mix(m,i.DOMEventMixin),m})})}),d("WinJS/Controls/SettingsFlyout",["../Core/_Global","../Core/_WinRT","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Events","../Core/_Resources","../Core/_WriteProfilerMark","../Animations","../Pages","../Promise","../_LightDismissService","../Utilities/_Dispose","../Utilities/_ElementUtilities","../Utilities/_ElementListUtilities","../Utilities/_Hoverable","./_LegacyAppBar/_Constants","./Flyout/_Overlay"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){"use strict";c.Namespace.define("WinJS.UI",{SettingsFlyout:c.Namespace._lazy(function(){function d(){if(b.Windows.UI.ApplicationSettings.SettingsEdgeLocation){var a=b.Windows.UI.ApplicationSettings;return a.SettingsPane.edge===a.SettingsEdgeLocation.left}return!1}function p(a,b){for(var c,d,e=a.querySelectorAll("."+q.settingsFlyoutClass),f=0;f<e.length;f++)if(d=e[f].winControl){if(d.settingsCommandId===b){c=d;break}e[f].id===b&&(c=c||d)}return c}var s,t=n.Key,u=f._createEventProperty,v="narrow",w="wide",x=c.Class.derive(r._Overlay,function(b,c){
-n._deprecated(z.settingsFlyoutIsDeprecated),this._element=b||a.document.createElement("div"),this._id=this._element.id||n._uniqueID(this._element),this._writeProfilerMark("constructor,StartTM"),this._baseOverlayConstructor(this._element,c),this._addFirstDiv(),this._addFinalDiv(),this._element.addEventListener("keydown",this._handleKeyDown,!0),this._element.style.visibilty="hidden",this._element.style.display="none",n.addClass(this._element,q.settingsFlyoutClass);var d=this;this._dismissable=new l.LightDismissableElement({element:this._element,tabIndex:this._element.hasAttribute("tabIndex")?this._element.tabIndex:-1,onLightDismiss:function(){d.hide()},onTakeFocus:function(a){if(!d._dismissable.restoreFocus()){var b=d.element.querySelector("."+q.firstDivClass);b&&(b.msSettingsFlyoutFocusOut||(n._addEventListener(b,"focusout",function(){s=1},!1),b.msSettingsFlyoutFocusOut=!0),s=0,n._tryFocus(b,a))}}}),o.query("div.win-content",this._element).forEach(function(a){n._matchesSelector(a,".win-ui-dark, .win-ui-dark *")||n.addClass(a,q.flyoutLightClass)});var e=this._element.getAttribute("role");null!==e&&""!==e&&void 0!==e||this._element.setAttribute("role","dialog");var f=this._element.getAttribute("aria-label");null!==f&&""!==f&&void 0!==f||this._element.setAttribute("aria-label",z.ariaLabel),this._currentAnimateIn=this._animateSlideIn,this._currentAnimateOut=this._animateSlideOut,this._writeProfilerMark("constructor,StopTM")},{width:{get:function(){return this._width},set:function(a){n._deprecated(z.widthDeprecationMessage),a!==this._width&&(this._width===v?n.removeClass(this._element,q.narrowClass):this._width===w&&n.removeClass(this._element,q.wideClass),this._width=a,this._width===v?n.addClass(this._element,q.narrowClass):this._width===w&&n.addClass(this._element,q.wideClass))}},settingsCommandId:{get:function(){return this._settingsCommandId},set:function(a){this._settingsCommandId=a}},disabled:{get:function(){return!!this._element.disabled},set:function(a){a=!!a;var b=!!this._element.disabled;b!==a&&(this._element.disabled=a,!this.hidden&&this._element.disabled&&this._dismiss())}},onbeforeshow:u(r._Overlay.beforeShow),onaftershow:u(r._Overlay.afterShow),onbeforehide:u(r._Overlay.beforeHide),onafterhide:u(r._Overlay.afterHide),show:function(){this.disabled||(this._writeProfilerMark("show,StartTM"),this._show())},_dispose:function(){l.hidden(this._dismissable),m.disposeSubTree(this.element),this._dismiss()},_show:function(){if(this._baseShow()){if(!n.hasClass(this.element.children[0],q.firstDivClass)){var a=this.element.querySelectorAll("."+q.firstDivClass);a&&a.length>0&&a.item(0).parentNode.removeChild(a.item(0)),this._addFirstDiv()}if(!n.hasClass(this.element.children[this.element.children.length-1],q.finalDivClass)){var b=this.element.querySelectorAll("."+q.finalDivClass);b&&b.length>0&&b.item(0).parentNode.removeChild(b.item(0)),this._addFinalDiv()}this._setBackButtonsAriaLabel(),l.shown(this._dismissable)}},_setBackButtonsAriaLabel:function(){for(var a,b=this.element.querySelectorAll(".win-backbutton"),c=0;c<b.length;c++)a=b[c].getAttribute("aria-label"),null!==a&&""!==a&&void 0!==a||b[c].setAttribute("aria-label",z.backbuttonAriaLabel)},hide:function(){this._writeProfilerMark("hide,StartTM"),this._hide()},_hide:function(){this._baseHide()},_beforeEndHide:function(){l.hidden(this._dismissable)},_animateSlideIn:function(){var a=d(),b=a?"-100px":"100px";o.query("div.win-content",this._element).forEach(function(a){i.enterPage(a,{left:b})});var c,e=this._element.offsetWidth;return a?(c={top:"0px",left:"-"+e+"px"},this._element.style.right="auto",this._element.style.left="0px"):(c={top:"0px",left:e+"px"},this._element.style.right="0px",this._element.style.left="auto"),this._element.style.opacity=1,this._element.style.visibility="visible",i.showPanel(this._element,c)},_animateSlideOut:function(){var a,b=this._element.offsetWidth;return d()?(a={top:"0px",left:b+"px"},this._element.style.right="auto",this._element.style.left="-"+b+"px"):(a={top:"0px",left:"-"+b+"px"},this._element.style.right="-"+b+"px",this._element.style.left="auto"),i.showPanel(this._element,a)},_fragmentDiv:{get:function(){return this._fragDiv},set:function(a){this._fragDiv=a}},_unloadPage:function(b){var c=b.currentTarget.winControl;c.removeEventListener(r._Overlay.afterHide,this._unloadPage,!1),k.as().then(function(){c._fragmentDiv&&(a.document.body.removeChild(c._fragmentDiv),c._fragmentDiv=null)})},_dismiss:function(){this.addEventListener(r._Overlay.afterHide,this._unloadPage,!1),this._hide()},_handleKeyDown:function(b){if(b.keyCode!==t.space&&b.keyCode!==t.enter||this.children[0]!==a.document.activeElement){if(b.shiftKey&&b.keyCode===t.tab&&this.children[0]===a.document.activeElement){b.preventDefault(),b.stopPropagation();for(var c=this.getElementsByTagName("*"),d=c.length-2;d>=0&&(c[d].focus(),c[d]!==a.document.activeElement);d--);}}else b.preventDefault(),b.stopPropagation(),this.winControl._dismiss()},_focusOnLastFocusableElementFromParent:function(){var b=a.document.activeElement;if(s&&b&&n.hasClass(b,q.firstDivClass)){var c=this.parentElement.getElementsByTagName("*");if(!(c.length<=2)){var d,e=c[c.length-1].tabIndex;if(e){for(d=c.length-2;d>0;d--)if(c[d].tabIndex===e){c[d].focus();break}}else for(d=c.length-2;d>0&&("DIV"===c[d].tagName&&null===c[d].getAttribute("tabIndex")||(c[d].focus(),c[d]!==a.document.activeElement));d--);}}},_focusOnFirstFocusableElementFromParent:function(){var b=a.document.activeElement;if(b&&n.hasClass(b,q.finalDivClass)){var c=this.parentElement.getElementsByTagName("*");if(!(c.length<=2)){var d,e=c[0].tabIndex;if(e){for(d=1;d<c.length-1;d++)if(c[d].tabIndex===e){c[d].focus();break}}else for(d=1;d<c.length-1&&("DIV"===c[d].tagName&&null===c[d].getAttribute("tabIndex")||(c[d].focus(),c[d]!==a.document.activeElement));d++);}}},_addFirstDiv:function(){for(var b=this._element.getElementsByTagName("*"),c=0,d=0;d<b.length;d++)0<b[d].tabIndex&&(0===c||b[d].tabIndex<c)&&(c=b[d].tabIndex);var e=a.document.createElement("div");e.className=q.firstDivClass,e.style.display="inline",e.setAttribute("role","menuitem"),e.setAttribute("aria-hidden","true"),e.tabIndex=c,n._addEventListener(e,"focusin",this._focusOnLastFocusableElementFromParent,!1),this._element.children[0]?this._element.insertBefore(e,this._element.children[0]):this._element.appendChild(e)},_addFinalDiv:function(){for(var b=this._element.getElementsByTagName("*"),c=0,d=0;d<b.length;d++)b[d].tabIndex>c&&(c=b[d].tabIndex);var e=a.document.createElement("div");e.className=q.finalDivClass,e.style.display="inline",e.setAttribute("role","menuitem"),e.setAttribute("aria-hidden","true"),e.tabIndex=c,n._addEventListener(e,"focusin",this._focusOnFirstFocusableElementFromParent,!1),this._element.appendChild(e)},_writeProfilerMark:function(a){h("WinJS.UI.SettingsFlyout:"+this._id+":"+a)}});x.show=function(){b.Windows.UI.ApplicationSettings.SettingsPane&&b.Windows.UI.ApplicationSettings.SettingsPane.show();for(var c=a.document.querySelectorAll('div[data-win-control="WinJS.UI.SettingsFlyout"]'),d=c.length,e=0;d>e;e++){var f=c[e].winControl;f&&f._dismiss()}};var y={event:void 0};x.populateSettings=function(a){if(y.event=a.detail,y.event.applicationcommands){var c=b.Windows.UI.ApplicationSettings;Object.keys(y.event.applicationcommands).forEach(function(a){var b=y.event.applicationcommands[a];b.title||(b.title=a);var d=new c.SettingsCommand(a,b.title,x._onSettingsCommand);y.event.e.request.applicationCommands.append(d)})}},x._onSettingsCommand=function(a){var b=a.id;y.event.applicationcommands&&y.event.applicationcommands[b]&&x.showSettings(b,y.event.applicationcommands[b].href)},x.showSettings=function(b,c){var d=p(a.document,b);if(d)d.show();else{if(!c)throw new e("WinJS.UI.SettingsFlyout.BadReference",z.badReference);var f=a.document.createElement("div");f=a.document.body.appendChild(f),j.render(c,f).then(function(){d=p(f,b),d?(d._fragmentDiv=f,d.show()):a.document.body.removeChild(f)})}};var z={get ariaLabel(){return g._getWinJSString("ui/settingsFlyoutAriaLabel").value},get badReference(){return"Invalid argument: Invalid href to settings flyout fragment"},get backbuttonAriaLabel(){return g._getWinJSString("ui/backbuttonarialabel").value},get widthDeprecationMessage(){return"SettingsFlyout.width may be altered or unavailable in future versions. Instead, style the CSS width property on elements with the .win-settingsflyout class."},get settingsFlyoutIsDeprecated(){return"SettingsFlyout is deprecated and may not be available in future releases. Instead, put settings on their own page within the app."}};return x})})}),d("require-style!less/styles-splitviewcommand",[],function(){}),d("require-style!less/colors-splitviewcommand",[],function(){}),d("WinJS/Controls/SplitView/Command",["exports","../../Core/_Global","../../Core/_Base","../../Core/_ErrorFromName","../../Core/_Events","../../ControlProcessor","../../Utilities/_Control","../../Utilities/_ElementUtilities","../../Utilities/_KeyboardBehavior","../AppBar/_Icon","require-style!less/styles-splitviewcommand","require-style!less/colors-splitviewcommand"],function(a,b,c,d,e,f,g,h,i,j){"use strict";c.Namespace._moduleDefine(a,"WinJS.UI",{_WinPressed:c.Namespace._lazy(function(){var a=c.Class.define(function(a){this._element=a,h._addEventListener(this._element,"pointerdown",this._MSPointerDownButtonHandler.bind(this))},{_MSPointerDownButtonHandler:function(c){this._pointerUpBound||(this._pointerUpBound=this._MSPointerUpHandler.bind(this),this._pointerCancelBound=this._MSPointerCancelHandler.bind(this),this._pointerOverBound=this._MSPointerOverHandler.bind(this),this._pointerOutBound=this._MSPointerOutHandler.bind(this)),c.isPrimary&&(this._pointerId&&this._resetPointer(),h._matchesSelector(c.target,".win-interactive, .win-interactive *")||(this._pointerId=c.pointerId,h._addEventListener(b,"pointerup",this._pointerUpBound,!0),h._addEventListener(b,"pointercancel",this._pointerCancelBound),!0,h._addEventListener(this._element,"pointerover",this._pointerOverBound,!0),h._addEventListener(this._element,"pointerout",this._pointerOutBound,!0),h.addClass(this._element,a.winPressed)))},_MSPointerOverHandler:function(b){this._pointerId===b.pointerId&&h.addClass(this._element,a.winPressed)},_MSPointerOutHandler:function(b){this._pointerId===b.pointerId&&h.removeClass(this._element,a.winPressed)},_MSPointerCancelHandler:function(a){this._pointerId===a.pointerId&&this._resetPointer()},_MSPointerUpHandler:function(a){this._pointerId===a.pointerId&&this._resetPointer()},_resetPointer:function(){this._pointerId=null,h._removeEventListener(b,"pointerup",this._pointerUpBound,!0),h._removeEventListener(b,"pointercancel",this._pointerCancelBound,!0),h._removeEventListener(this._element,"pointerover",this._pointerOverBound,!0),h._removeEventListener(this._element,"pointerout",this._pointerOutBound,!0),h.removeClass(this._element,a.winPressed)},dispose:function(){this._disposed||(this._disposed=!0,this._resetPointer())}},{winPressed:"win-pressed"});return a}),SplitViewCommand:c.Namespace._lazy(function(){var k=h.Key,l={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"}},m={command:"win-splitviewcommand",commandButton:"win-splitviewcommand-button",commandButtonContent:"win-splitviewcommand-button-content",commandSplitButton:"win-splitviewcommand-splitbutton",commandSplitButtonOpened:"win-splitviewcommand-splitbutton-opened",commandIcon:"win-splitviewcommand-icon",commandLabel:"win-splitviewcommand-label"},n={invoked:"invoked",_splitToggle:"_splittoggle"},o=e._createEventProperty,p=c.Class.define(function(a,c){if(a=a||b.document.createElement("DIV"),c=c||{},a.winControl)throw new d("WinJS.UI.SplitViewCommand.DuplicateConstruction",l.duplicateConstruction);this._winKeyboard=new i._WinKeyboard(a),this._baseConstructor(a,c)},{_baseConstructor:function(a,b,c){this._classNames=c||m,a.winControl=this,this._element=a,h.addClass(this.element,this._classNames.command),h.addClass(this.element,"win-disposable"),this._tooltip=null,this._splitOpened=!1,this._buildDom(),a.addEventListener("keydown",this._keydownHandler.bind(this)),g.setOptions(this,b)},element:{get:function(){return this._element}},label:{get:function(){return this._label},set:function(a){this._label=a,this._labelEl.textContent=a}},tooltip:{get:function(){return this._tooltip},set:function(a){this._tooltip=a,this._tooltip||""===this._tooltip?this._element.setAttribute("title",this._tooltip):this._element.removeAttribute("title")}},icon:{get:function(){return this._icon},set:function(a){this._icon=j[a]||a,this._icon&&1===this._icon.length?(this._imageSpan.textContent=this._icon,this._imageSpan.style.backgroundImage="",this._imageSpan.style.msHighContrastAdjust="",this._imageSpan.style.display=""):this._icon&&this._icon.length>1?(this._imageSpan.textContent="",this._imageSpan.style.backgroundImage=this._icon,this._imageSpan.style.msHighContrastAdjust="none",this._imageSpan.style.display=""):(this._imageSpan.textContent="",this._imageSpan.style.backgroundImage="",this._imageSpan.style.msHighContrastAdjust="",this._imageSpan.style.display="none")}},oninvoked:o(n.invoked),_toggleSplit:function(){this._splitOpened=!this._splitOpened,this._splitOpened?(h.addClass(this._splitButtonEl,this._classNames.commandSplitButtonOpened),this._splitButtonEl.setAttribute("aria-expanded","true")):(h.removeClass(this._splitButtonEl,this._classNames.commandSplitButtonOpened),this._splitButtonEl.setAttribute("aria-expanded","false")),this._fireEvent(p._EventName._splitToggle)},_rtl:{get:function(){return"rtl"===h._getComputedStyle(this.element).direction}},_keydownHandler:function(a){if(!h._matchesSelector(a.target,".win-interactive, .win-interactive *")){var b=this._rtl?k.rightArrow:k.leftArrow,c=this._rtl?k.leftArrow:k.rightArrow;a.altKey||a.keyCode!==b&&a.keyCode!==k.home&&a.keyCode!==k.end||a.target!==this._splitButtonEl?a.altKey||a.keyCode!==c||!this.splitButton||a.target!==this._buttonEl&&!this._buttonEl.contains(a.target)?a.keyCode!==k.space&&a.keyCode!==k.enter||a.target!==this._buttonEl&&!this._buttonEl.contains(a.target)?a.keyCode!==k.space&&a.keyCode!==k.enter||a.target!==this._splitButtonEl||this._toggleSplit():this._invoke():(h._setActive(this._splitButtonEl),a.keyCode===c&&a.stopPropagation(),a.preventDefault()):(h._setActive(this._buttonEl),a.keyCode===b&&a.stopPropagation(),a.preventDefault())}},_getFocusInto:function(a){var b=this._rtl?k.rightArrow:k.leftArrow;return a===b&&this.splitButton?this._splitButtonEl:this._buttonEl},_buildDom:function(){var b='<div tabindex="0" role="button" class="'+this._classNames.commandButton+'"><div class="'+this._classNames.commandButtonContent+'"><div class="'+this._classNames.commandIcon+'"></div><div class="'+this._classNames.commandLabel+'"></div></div></div><div tabindex="-1" aria-expanded="false" class="'+this._classNames.commandSplitButton+'"></div>';this.element.insertAdjacentHTML("afterBegin",b),this._buttonEl=this.element.firstElementChild,this._buttonPressedBehavior=new a._WinPressed(this._buttonEl),this._contentEl=this._buttonEl.firstElementChild,this._imageSpan=this._contentEl.firstElementChild,this._imageSpan.style.display="none",this._labelEl=this._imageSpan.nextElementSibling,this._splitButtonEl=this._buttonEl.nextElementSibling,this._splitButtonPressedBehavior=new a._WinPressed(this._splitButtonEl),this._splitButtonEl.style.display="none",h._ensureId(this._buttonEl),this._splitButtonEl.setAttribute("aria-labelledby",this._buttonEl.id),this._buttonEl.addEventListener("click",this._handleButtonClick.bind(this));var c=new h._MutationObserver(this._splitButtonAriaExpandedPropertyChangeHandler.bind(this));c.observe(this._splitButtonEl,{attributes:!0,attributeFilter:["aria-expanded"]}),this._splitButtonEl.addEventListener("click",this._handleSplitButtonClick.bind(this));for(var d=this._splitButtonEl.nextSibling;d;)this._buttonEl.insertBefore(d,this._contentEl),"#text"!==d.nodeName&&f.processAll(d),d=this._splitButtonEl.nextSibling},_handleButtonClick:function(a){var b=a.target;h._matchesSelector(b,".win-interactive, .win-interactive *")||this._invoke()},_splitButtonAriaExpandedPropertyChangeHandler:function(){"true"===this._splitButtonEl.getAttribute("aria-expanded")!==this._splitOpened&&this._toggleSplit()},_handleSplitButtonClick:function(){this._toggleSplit()},_invoke:function(){this._fireEvent(p._EventName.invoked)},_fireEvent:function(a,c){var d=b.document.createEvent("CustomEvent");d.initCustomEvent(a,!0,!1,c),this.element.dispatchEvent(d)},dispose:function(){this._disposed||(this._disposed=!0,this._buttonPressedBehavior.dispose(),this._splitButtonPressedBehavior.dispose())}},{_ClassName:m,_EventName:n});return c.Class.mix(p,g.DOMEventMixin),p})})}),d("WinJS/Controls/NavBar/_Command",["exports","../../Core/_Global","../../Core/_Base","../../Core/_ErrorFromName","../../Navigation","../../Utilities/_ElementUtilities","../SplitView/Command"],function(a,b,c,d,e,f,g){"use strict";c.Namespace._moduleDefine(a,"WinJS.UI",{NavBarCommand:c.Namespace._lazy(function(){var a={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get navBarCommandDeprecated(){return"NavBarCommand is deprecated and may not be available in future releases. If you were using a NavBarCommand inside of a SplitView, use SplitViewCommand instead."}},h={command:"win-navbarcommand",commandButton:"win-navbarcommand-button",commandButtonContent:"win-navbarcommand-button-content",commandSplitButton:"win-navbarcommand-splitbutton",commandSplitButtonOpened:"win-navbarcommand-splitbutton-opened",commandIcon:"win-navbarcommand-icon",commandLabel:"win-navbarcommand-label"},i=g.SplitViewCommand.prototype,j=c.Class.derive(g.SplitViewCommand,function(c,e){if(f._deprecated(a.navBarCommandDeprecated),c=c||b.document.createElement("DIV"),e=e||{},c.winControl)throw new d("WinJS.UI.NavBarCommand.DuplicateConstruction",a.duplicateConstruction);this._baseConstructor(c,e,h)},{element:{get:function(){return Object.getOwnPropertyDescriptor(i,"element").get.call(this)}},label:{get:function(){return Object.getOwnPropertyDescriptor(i,"label").get.call(this)},set:function(a){return Object.getOwnPropertyDescriptor(i,"label").set.call(this,a)}},tooltip:{get:function(){return Object.getOwnPropertyDescriptor(i,"tooltip").get.call(this)},set:function(a){return Object.getOwnPropertyDescriptor(i,"tooltip").set.call(this,a)}},icon:{get:function(){return Object.getOwnPropertyDescriptor(i,"icon").get.call(this)},set:function(a){return Object.getOwnPropertyDescriptor(i,"icon").set.call(this,a)}},location:{get:function(){return this._location},set:function(a){this._location=a}},oninvoked:{get:function(){},enumerable:!1},state:{get:function(){return this._state},set:function(a){this._state=a}},splitButton:{get:function(){return this._split},set:function(a){this._split=a,this._split?this._splitButtonEl.style.display="":this._splitButtonEl.style.display="none"}},splitOpened:{get:function(){return this._splitOpened},set:function(a){this._splitOpened!==!!a&&this._toggleSplit()}},dispose:function(){i.dispose.call(this)},_invoke:function(){this.location&&e.navigate(this.location,this.state),this._fireEvent(j._EventName._invoked)}},{_ClassName:h,_EventName:{_invoked:"_invoked",_splitToggle:"_splittoggle"}});return j})})}),d("WinJS/Controls/NavBar/_Container",["exports","../../Core/_Global","../../Core/_Base","../../Core/_BaseUtils","../../Core/_ErrorFromName","../../Core/_Events","../../Core/_Log","../../Core/_Resources","../../Core/_WriteProfilerMark","../../Animations","../../Animations/_TransitionAnimation","../../BindingList","../../ControlProcessor","../../Navigation","../../Promise","../../Scheduler","../../Utilities/_Control","../../Utilities/_ElementUtilities","../../Utilities/_KeyboardBehavior","../../Utilities/_UI","../_LegacyAppBar/_Constants","../Repeater","./_Command"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w){"use strict";function x(){return null===b.document.activeElement||b.document.activeElement===b.document.body}c.Namespace._moduleDefine(a,"WinJS.UI",{NavBarContainer:c.Namespace._lazy(function(){var a=r.Key,y=3e3,z=r._MSPointerEvent.MSPOINTER_TYPE_TOUCH||"touch",A=0,B=f._createEventProperty,C={invoked:"invoked",splittoggle:"splittoggle"},D={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get navBarContainerViewportAriaLabel(){return h._getWinJSString("ui/navBarContainerViewportAriaLabel").value},get navBarContainerIsDeprecated(){return"NavBarContainer is deprecated and may not be available in future releases. Instead, use a WinJS SplitView to display navigation targets within the app."}},E=c.Class.define(function(a,c){if(r._deprecated(D.navBarContainerIsDeprecated),a=a||b.document.createElement("DIV"),this._id=a.id||r._uniqueID(a),this._writeProfilerMark("constructor,StartTM"),c=c||{},a.winControl)throw new e("WinJS.UI.NavBarContainer.DuplicateConstruction",D.duplicateConstruction);a.winControl=this,this._element=a,r.addClass(this.element,E._ClassName.navbarcontainer),r.addClass(this.element,"win-disposable"),a.getAttribute("tabIndex")||(a.tabIndex=-1),this._focusCurrentItemPassivelyBound=this._focusCurrentItemPassively.bind(this),this._closeSplitAndResetBound=this._closeSplitAndReset.bind(this),this._currentManipulationState=A,this._panningDisabled=!r._supportsSnapPoints,this._fixedSize=!1,this._maxRows=1,this._sizes={},this._setupTree(),this._duringConstructor=!0,this._dataChangingBound=this._dataChanging.bind(this),this._dataChangedBound=this._dataChanged.bind(this),n.addEventListener("navigated",this._closeSplitAndResetBound),this.layout=c.layout||t.Orientation.horizontal,c.maxRows&&(this.maxRows=c.maxRows),c.template&&(this.template=c.template),c.data&&(this.data=c.data),c.fixedSize&&(this.fixedSize=c.fixedSize),q._setOptions(this,c,!0),this._duringConstructor=!1,c.currentIndex&&(this.currentIndex=c.currentIndex),this._updatePageUI(),p.schedule(function(){this._updateAppBarReference()},p.Priority.normal,this,"WinJS.UI.NavBarContainer_async_initialize"),this._writeProfilerMark("constructor,StopTM")},{element:{get:function(){return this._element}},template:{get:function(){return this._template},set:function(a){if(this._template=a,this._repeater){var c=this.element.contains(b.document.activeElement);this._duringConstructor||this._closeSplitIfOpen(),this._repeater.template=this._repeater.template,this._duringConstructor||(this._measured=!1,this._sizes.itemMeasured=!1,this._reset(),c&&this._keyboardBehavior._focus(0))}}},_render:function(a){var c=b.document.createElement("div"),d=this._template;d&&(d.render?d.render(a,c):d.winControl&&d.winControl.render?d.winControl.render(a,c):c.appendChild(d(a)));var e=new w.NavBarCommand(c,a);return e._element},data:{get:function(){return this._repeater&&this._repeater.data},set:function(a){a||(a=new l.List),this._duringConstructor||this._closeSplitIfOpen(),this._removeDataChangingEvents(),this._removeDataChangedEvents();var c=this.element.contains(b.document.activeElement);this._repeater||(this._surfaceEl.innerHTML="",this._repeater=new v.Repeater(this._surfaceEl,{template:this._render.bind(this)})),this._addDataChangingEvents(a),this._repeater.data=a,this._addDataChangedEvents(a),this._duringConstructor||(this._measured=!1,this._sizes.itemMeasured=!1,this._reset(),c&&this._keyboardBehavior._focus(0))}},maxRows:{get:function(){return this._maxRows},set:function(a){a=+a===a?a:1,this._maxRows=Math.max(1,a),this._duringConstructor||(this._closeSplitIfOpen(),this._measured=!1,this._reset())}},layout:{get:function(){return this._layout},set:function(a){a===t.Orientation.vertical?(this._layout=t.Orientation.vertical,r.removeClass(this.element,E._ClassName.horizontal),r.addClass(this.element,E._ClassName.vertical)):(this._layout=t.Orientation.horizontal,r.removeClass(this.element,E._ClassName.vertical),r.addClass(this.element,E._ClassName.horizontal)),this._viewportEl.style.msScrollSnapType="",this._zooming=!1,this._duringConstructor||(this._measured=!1,this._sizes.itemMeasured=!1,this._ensureVisible(this._keyboardBehavior.currentIndex,!0),this._updatePageUI(),this._closeSplitIfOpen())}},currentIndex:{get:function(){return this._keyboardBehavior.currentIndex},set:function(a){if(a===+a){var c=this.element.contains(b.document.activeElement);this._keyboardBehavior.currentIndex=a,this._ensureVisible(this._keyboardBehavior.currentIndex,!0),c&&this._keyboardBehavior._focus()}}},fixedSize:{get:function(){return this._fixedSize},set:function(a){this._fixedSize=!!a,this._duringConstructor||(this._closeSplitIfOpen(),this._measured?this._surfaceEl.children.length>0&&this._updateGridStyles():this._measure())}},oninvoked:B(C.invoked),onsplittoggle:B(C.splittoggle),forceLayout:function(){this._resizeHandler(),this._measured&&(this._scrollPosition=r.getScrollPosition(this._viewportEl)[this.layout===t.Orientation.horizontal?"scrollLeft":"scrollTop"]),this._duringForceLayout=!0,this._ensureVisible(this._keyboardBehavior.currentIndex,!0),this._updatePageUI(),this._duringForceLayout=!1},_updateAppBarReference:function(){if(!this._appBarEl||!this._appBarEl.contains(this.element)){this._appBarEl&&(this._appBarEl.removeEventListener("beforeopen",this._closeSplitAndResetBound),this._appBarEl.removeEventListener("beforeopen",this._resizeImplBound),this._appBarEl.removeEventListener("afteropen",this._focusCurrentItemPassivelyBound));for(var a=this.element.parentNode;a&&!r.hasClass(a,u.appBarClass);)a=a.parentNode;this._appBarEl=a,this._appBarEl&&(this._appBarEl.addEventListener("beforeopen",this._closeSplitAndResetBound),this._appBarEl.addEventListener("afteropen",this._focusCurrentItemPassivelyBound))}},_closeSplitAndReset:function(){this._closeSplitIfOpen(),this._reset()},_dataChanging:function(a){this._elementHadFocus=b.document.activeElement,this._currentSplitNavItem&&this._currentSplitNavItem.splitOpened&&("itemremoved"===a.type?this._surfaceEl.children[a.detail.index].winControl===this._currentSplitNavItem&&this._closeSplitIfOpen():"itemchanged"===a.type?this._surfaceEl.children[a.detail.index].winControl===this._currentSplitNavItem&&this._closeSplitIfOpen():"itemmoved"===a.type?this._surfaceEl.children[a.detail.oldIndex].winControl===this._currentSplitNavItem&&this._closeSplitIfOpen():"reload"===a.type&&this._closeSplitIfOpen())},_dataChanged:function(a){this._measured=!1,"itemremoved"===a.type?a.detail.index<this._keyboardBehavior.currentIndex?this._keyboardBehavior.currentIndex--:a.detail.index===this._keyboardBehavior.currentIndex&&(this._keyboardBehavior.currentIndex=this._keyboardBehavior.currentIndex,x()&&this._elementHadFocus&&this._keyboardBehavior._focus()):"itemchanged"===a.type?a.detail.index===this._keyboardBehavior.currentIndex&&x()&&this._elementHadFocus&&this._keyboardBehavior._focus():"iteminserted"===a.type?a.detail.index<=this._keyboardBehavior.currentIndex&&this._keyboardBehavior.currentIndex++:"itemmoved"===a.type?a.detail.oldIndex===this._keyboardBehavior.currentIndex&&(this._keyboardBehavior.currentIndex=a.detail.newIndex,x()&&this._elementHadFocus&&this._keyboardBehavior._focus()):"reload"===a.type&&(this._keyboardBehavior.currentIndex=0,x()&&this._elementHadFocus&&this._keyboardBehavior._focus()),this._ensureVisible(this._keyboardBehavior.currentIndex,!0),this._updatePageUI()},_focusCurrentItemPassively:function(){this.element.contains(b.document.activeElement)&&this._keyboardBehavior._focus()},_reset:function(){this._keyboardBehavior.currentIndex=0,this.element.contains(b.document.activeElement)&&this._keyboardBehavior._focus(0),this._viewportEl.style.msScrollSnapType="",this._zooming=!1,this._ensureVisible(0,!0),this._updatePageUI()},_removeDataChangedEvents:function(){this._repeater&&(this._repeater.data.removeEventListener("itemchanged",this._dataChangedBound),this._repeater.data.removeEventListener("iteminserted",this._dataChangedBound),this._repeater.data.removeEventListener("itemmoved",this._dataChangedBound),this._repeater.data.removeEventListener("itemremoved",this._dataChangedBound),this._repeater.data.removeEventListener("reload",this._dataChangedBound))},_addDataChangedEvents:function(){this._repeater&&(this._repeater.data.addEventListener("itemchanged",this._dataChangedBound),this._repeater.data.addEventListener("iteminserted",this._dataChangedBound),this._repeater.data.addEventListener("itemmoved",this._dataChangedBound),this._repeater.data.addEventListener("itemremoved",this._dataChangedBound),this._repeater.data.addEventListener("reload",this._dataChangedBound))},_removeDataChangingEvents:function(){this._repeater&&(this._repeater.data.removeEventListener("itemchanged",this._dataChangingBound),this._repeater.data.removeEventListener("iteminserted",this._dataChangingBound),this._repeater.data.removeEventListener("itemmoved",this._dataChangingBound),this._repeater.data.removeEventListener("itemremoved",this._dataChangingBound),this._repeater.data.removeEventListener("reload",this._dataChangingBound))},_addDataChangingEvents:function(a){a.addEventListener("itemchanged",this._dataChangingBound),a.addEventListener("iteminserted",this._dataChangingBound),a.addEventListener("itemmoved",this._dataChangingBound),a.addEventListener("itemremoved",this._dataChangingBound),a.addEventListener("reload",this._dataChangingBound)},_mouseleave:function(){this._mouseInViewport&&(this._mouseInViewport=!1,this._updateArrows())},_MSPointerDown:function(a){a.pointerType===z&&this._mouseInViewport&&(this._mouseInViewport=!1,this._updateArrows())},_MSPointerMove:function(a){a.pointerType!==z&&(this._mouseInViewport||(this._mouseInViewport=!0,this._updateArrows()))},_setupTree:function(){this._animateNextPreviousButtons=o.wrap(),this._element.addEventListener("mouseleave",this._mouseleave.bind(this)),r._addEventListener(this._element,"pointerdown",this._MSPointerDown.bind(this)),r._addEventListener(this._element,"pointermove",this._MSPointerMove.bind(this)),r._addEventListener(this._element,"focusin",this._focusHandler.bind(this),!1),this._pageindicatorsEl=b.document.createElement("div"),r.addClass(this._pageindicatorsEl,E._ClassName.pageindicators),this._element.appendChild(this._pageindicatorsEl),this._ariaStartMarker=b.document.createElement("div"),this._element.appendChild(this._ariaStartMarker),this._viewportEl=b.document.createElement("div"),r.addClass(this._viewportEl,E._ClassName.viewport),this._element.appendChild(this._viewportEl),this._viewportEl.setAttribute("role","group"),this._viewportEl.setAttribute("aria-label",D.navBarContainerViewportAriaLabel),this._boundResizeHandler=this._resizeHandler.bind(this),r._resizeNotifier.subscribe(this._element,this._boundResizeHandler),this._viewportEl.addEventListener("mselementresize",this._resizeHandler.bind(this)),this._viewportEl.addEventListener("scroll",this._scrollHandler.bind(this)),this._viewportEl.addEventListener("MSManipulationStateChanged",this._MSManipulationStateChangedHandler.bind(this)),this._ariaEndMarker=b.document.createElement("div"),this._element.appendChild(this._ariaEndMarker),this._surfaceEl=b.document.createElement("div"),r.addClass(this._surfaceEl,E._ClassName.surface),this._viewportEl.appendChild(this._surfaceEl),this._surfaceEl.addEventListener(w.NavBarCommand._EventName._invoked,this._navbarCommandInvokedHandler.bind(this)),this._surfaceEl.addEventListener(w.NavBarCommand._EventName._splitToggle,this._navbarCommandSplitToggleHandler.bind(this)),r._addEventListener(this._surfaceEl,"focusin",this._itemsFocusHandler.bind(this),!1),this._surfaceEl.addEventListener("keydown",this._keyDownHandler.bind(this));for(var a=this.element.firstElementChild;a!==this._pageindicatorsEl;)this._surfaceEl.appendChild(a),m.process(a),a=this.element.firstElementChild;this._leftArrowEl=b.document.createElement("div"),r.addClass(this._leftArrowEl,E._ClassName.navleftarrow),r.addClass(this._leftArrowEl,E._ClassName.navarrow),
-this._element.appendChild(this._leftArrowEl),this._leftArrowEl.addEventListener("click",this._goLeft.bind(this)),this._leftArrowEl.style.opacity=0,this._leftArrowEl.style.visibility="hidden",this._leftArrowFadeOut=o.wrap(),this._rightArrowEl=b.document.createElement("div"),r.addClass(this._rightArrowEl,E._ClassName.navrightarrow),r.addClass(this._rightArrowEl,E._ClassName.navarrow),this._element.appendChild(this._rightArrowEl),this._rightArrowEl.addEventListener("click",this._goRight.bind(this)),this._rightArrowEl.style.opacity=0,this._rightArrowEl.style.visibility="hidden",this._rightArrowFadeOut=o.wrap(),this._keyboardBehavior=new s._KeyboardBehavior(this._surfaceEl,{scroller:this._viewportEl}),this._winKeyboard=new s._WinKeyboard(this._surfaceEl)},_goRight:function(){this._sizes.rtl?this._goPrev():this._goNext()},_goLeft:function(){this._sizes.rtl?this._goNext():this._goPrev()},_goNext:function(){this._measure();var a=this._sizes.rowsPerPage*this._sizes.columnsPerPage,b=Math.min(Math.floor(this._keyboardBehavior.currentIndex/a)+1,this._sizes.pages-1);this._keyboardBehavior.currentIndex=Math.min(a*b,this._surfaceEl.children.length),this._keyboardBehavior._focus()},_goPrev:function(){this._measure();var a=this._sizes.rowsPerPage*this._sizes.columnsPerPage,b=Math.max(0,Math.floor(this._keyboardBehavior.currentIndex/a)-1);this._keyboardBehavior.currentIndex=Math.max(a*b,0),this._keyboardBehavior._focus()},_currentPage:{get:function(){return this.layout===t.Orientation.horizontal&&(this._measure(),this._sizes.viewportOffsetWidth>0)?Math.min(this._sizes.pages-1,Math.round(this._scrollPosition/this._sizes.viewportOffsetWidth)):0}},_resizeHandler:function(){if(!this._disposed&&this._measured){var a=this.layout===t.Orientation.horizontal?this._sizes.viewportOffsetWidth!==parseFloat(r._getComputedStyle(this._viewportEl).width):this._sizes.viewportOffsetHeight!==parseFloat(r._getComputedStyle(this._viewportEl).height);a&&(this._measured=!1,this._pendingResize||(this._pendingResize=!0,this._resizeImplBound=this._resizeImplBound||this._resizeImpl.bind(this),this._updateAppBarReference(),this._appBarEl&&this._appBarEl.winControl&&!this._appBarEl.winControl.opened?(p.schedule(this._resizeImplBound,p.Priority.idle,null,"WinJS.UI.NavBarContainer._resizeImpl"),this._appBarEl.addEventListener("beforeopen",this._resizeImplBound)):this._resizeImpl()))}},_resizeImpl:function(){!this._disposed&&this._pendingResize&&(this._pendingResize=!1,this._appBarEl&&this._appBarEl.removeEventListener("beforeopen",this._resizeImplBound),this._keyboardBehavior.currentIndex=0,this.element.contains(b.document.activeElement)&&this._keyboardBehavior._focus(this._keyboardBehavior.currentIndex),this._closeSplitIfOpen(),this._ensureVisible(this._keyboardBehavior.currentIndex,!0),this._updatePageUI())},_keyDownHandler:function(c){var d=c.keyCode;if(!c.altKey&&(d===a.pageUp||d===a.pageDown)){var e=c.target;if(r._matchesSelector(e,".win-interactive, .win-interactive *"))return;var f=this._keyboardBehavior.currentIndex;this._measure();var g=this._sizes,h=Math.floor(f/(g.columnsPerPage*g.rowsPerPage)),i=null;if(d===a.pageUp){if(this.layout===t.Orientation.horizontal){var j=h*g.columnsPerPage*g.rowsPerPage;f===j&&this._surfaceEl.children[f].winControl._buttonEl===b.document.activeElement?f-=g.columnsPerPage*g.rowsPerPage:f=j}else{var k=this._surfaceEl.children[f],l=k.offsetTop,m=l+k.offsetHeight,n=this._zooming?this._zoomPosition:this._scrollPosition;if(l>=n&&m<n+g.viewportOffsetHeight)for(;f>0&&this._surfaceEl.children[f-1].offsetTop>n;)f--;if(this._keyboardBehavior.currentIndex===f){var o=m-g.viewportOffsetHeight;for(f=Math.max(0,f-1);f>0&&this._surfaceEl.children[f-1].offsetTop>o;)f--;i=f>0?this._surfaceEl.children[f].offsetTop-this._sizes.itemMarginTop:0}}f=Math.max(f,0),this._keyboardBehavior.currentIndex=f;var p=this._surfaceEl.children[f].winControl._buttonEl;null!==i&&this._scrollTo(i),r._setActive(p,this._viewportEl)}else{if(this.layout===t.Orientation.horizontal){var q=(h+1)*g.columnsPerPage*g.rowsPerPage-1;f===q?f+=g.columnsPerPage*g.rowsPerPage:f=q}else{var k=this._surfaceEl.children[this._keyboardBehavior.currentIndex],l=k.offsetTop,m=l+k.offsetHeight,n=this._zooming?this._zoomPosition:this._scrollPosition;if(l>=n&&m<n+g.viewportOffsetHeight)for(;f<this._surfaceEl.children.length-1&&this._surfaceEl.children[f+1].offsetTop+this._surfaceEl.children[f+1].offsetHeight<n+g.viewportOffsetHeight;)f++;if(f===this._keyboardBehavior.currentIndex){var s=l+g.viewportOffsetHeight;for(f=Math.min(this._surfaceEl.children.length-1,f+1);f<this._surfaceEl.children.length-1&&this._surfaceEl.children[f+1].offsetTop+this._surfaceEl.children[f+1].offsetHeight<s;)f++;i=f<this._surfaceEl.children.length-1?this._surfaceEl.children[f+1].offsetTop-this._sizes.viewportOffsetHeight:this._scrollLength-this._sizes.viewportOffsetHeight}}f=Math.min(f,this._surfaceEl.children.length-1),this._keyboardBehavior.currentIndex=f;var p=this._surfaceEl.children[f].winControl._buttonEl;null!==i&&this._scrollTo(i);try{r._setActive(p,this._viewportEl)}catch(u){}}}},_focusHandler:function(a){var b=a.target;this._surfaceEl.contains(b)||(this._skipEnsureVisible=!0,this._keyboardBehavior._focus(this._keyboardBehavior.currentIndex))},_itemsFocusHandler:function(a){var b=a.target;if(b!==this._surfaceEl){for(;b.parentNode!==this._surfaceEl;)b=b.parentNode;for(var c=-1;b;)c++,b=b.previousSibling;this._skipEnsureVisible?this._skipEnsureVisible=!1:this._ensureVisible(c)}},_ensureVisible:function(a,b){if(this._measure(),this.layout===t.Orientation.horizontal){var c=Math.floor(a/(this._sizes.rowsPerPage*this._sizes.columnsPerPage));this._scrollTo(c*this._sizes.viewportOffsetWidth,b)}else{var d,e=this._surfaceEl.children[a];d=a>0?e.offsetTop-this._sizes.itemMarginTop:0;var f;f=a<this._surfaceEl.children.length-1?this._surfaceEl.children[a+1].offsetTop-this._sizes.viewportOffsetHeight:this._scrollLength-this._sizes.viewportOffsetHeight;var g=this._zooming?this._zoomPosition:this._scrollPosition;g=Math.max(g,f),g=Math.min(g,d),this._scrollTo(g,b)}},_scrollTo:function(a,b){if(this._measure(),a=this.layout===t.Orientation.horizontal?Math.max(0,Math.min(this._scrollLength-this._sizes.viewportOffsetWidth,a)):Math.max(0,Math.min(this._scrollLength-this._sizes.viewportOffsetHeight,a)),b){if(Math.abs(this._scrollPosition-a)>1){this._zooming=!1,this._scrollPosition=a,this._updatePageUI(),this._duringForceLayout||this._closeSplitIfOpen();var c={};c[this.layout===t.Orientation.horizontal?"scrollLeft":"scrollTop"]=a,r.setScrollPosition(this._viewportEl,c)}}else(!this._zooming&&Math.abs(this._scrollPosition-a)>1||this._zooming&&Math.abs(this._zoomPosition-a)>1)&&(this._zoomPosition=a,this._zooming=!0,this.layout===t.Orientation.horizontal?(this._viewportEl.style.msScrollSnapType="none",r._zoomTo(this._viewportEl,{contentX:a,contentY:0,viewportX:0,viewportY:0})):r._zoomTo(this._viewportEl,{contentX:0,contentY:a,viewportX:0,viewportY:0}),this._closeSplitIfOpen())},_MSManipulationStateChangedHandler:function(a){this._currentManipulationState=a.currentState,a.currentState===a.MS_MANIPULATION_STATE_ACTIVE&&(this._viewportEl.style.msScrollSnapType="",this._zooming=!1),b.clearTimeout(this._manipulationStateTimeoutId),a.currentState===a.MS_MANIPULATION_STATE_STOPPED&&(this._manipulationStateTimeoutId=b.setTimeout(function(){this._viewportEl.style.msScrollSnapType="",this._zooming=!1,this._updateCurrentIndexIfPageChanged()}.bind(this),100))},_scrollHandler:function(){if(!this._disposed&&(this._measured=!1,!this._checkingScroll)){var a=this;this._checkingScroll=d._requestAnimationFrame(function(){if(!a._disposed){a._checkingScroll=null;var b=r.getScrollPosition(a._viewportEl)[a.layout===t.Orientation.horizontal?"scrollLeft":"scrollTop"];b!==a._scrollPosition&&(a._scrollPosition=b,a._closeSplitIfOpen()),a._updatePageUI(),a._zooming||a._currentManipulationState!==A||a._updateCurrentIndexIfPageChanged()}})}},_updateCurrentIndexIfPageChanged:function(){if(this.layout===t.Orientation.horizontal){this._measure();var a=this._currentPage,c=a*this._sizes.rowsPerPage*this._sizes.columnsPerPage,d=(a+1)*this._sizes.rowsPerPage*this._sizes.columnsPerPage-1;(this._keyboardBehavior.currentIndex<c||this._keyboardBehavior.currentIndex>d)&&(this._keyboardBehavior.currentIndex=c,this.element.contains(b.document.activeElement)&&this._keyboardBehavior._focus(this._keyboardBehavior.currentIndex))}},_measure:function(){if(!this._measured){this._resizeImpl(),this._writeProfilerMark("measure,StartTM");var a=this._sizes;a.rtl="rtl"===r._getComputedStyle(this._element).direction;var b=this._surfaceEl.children.length;if(b>0){if(!this._sizes.itemMeasured){this._writeProfilerMark("measureItem,StartTM");var c=this._surfaceEl.firstElementChild;c.style.margin="",c.style.width="";var d=r._getComputedStyle(c);a.itemOffsetWidth=parseFloat(r._getComputedStyle(c).width),0===c.offsetWidth&&(a.itemOffsetWidth=0),a.itemMarginLeft=parseFloat(d.marginLeft),a.itemMarginRight=parseFloat(d.marginRight),a.itemWidth=a.itemOffsetWidth+a.itemMarginLeft+a.itemMarginRight,a.itemOffsetHeight=parseFloat(r._getComputedStyle(c).height),0===c.offsetHeight&&(a.itemOffsetHeight=0),a.itemMarginTop=parseFloat(d.marginTop),a.itemMarginBottom=parseFloat(d.marginBottom),a.itemHeight=a.itemOffsetHeight+a.itemMarginTop+a.itemMarginBottom,a.itemOffsetWidth>0&&a.itemOffsetHeight>0&&(a.itemMeasured=!0),this._writeProfilerMark("measureItem,StopTM")}if(a.viewportOffsetWidth=parseFloat(r._getComputedStyle(this._viewportEl).width),0===this._viewportEl.offsetWidth&&(a.viewportOffsetWidth=0),a.viewportOffsetHeight=parseFloat(r._getComputedStyle(this._viewportEl).height),0===this._viewportEl.offsetHeight&&(a.viewportOffsetHeight=0),0===a.viewportOffsetWidth||0===a.itemOffsetHeight?this._measured=!1:this._measured=!0,this.layout===t.Orientation.horizontal){this._scrollPosition=r.getScrollPosition(this._viewportEl).scrollLeft,a.leadingEdge=this._leftArrowEl.offsetWidth+parseInt(r._getComputedStyle(this._leftArrowEl).marginLeft)+parseInt(r._getComputedStyle(this._leftArrowEl).marginRight);var e=a.viewportOffsetWidth-2*a.leadingEdge;a.maxColumns=a.itemWidth?Math.max(1,Math.floor(e/a.itemWidth)):1,a.rowsPerPage=Math.min(this.maxRows,Math.ceil(b/a.maxColumns)),a.columnsPerPage=Math.min(a.maxColumns,b),a.pages=Math.ceil(b/(a.columnsPerPage*a.rowsPerPage)),a.trailingEdge=a.leadingEdge,a.extraSpace=e-a.columnsPerPage*a.itemWidth,this._scrollLength=a.viewportOffsetWidth*a.pages,this._keyboardBehavior.fixedSize=a.rowsPerPage,this._keyboardBehavior.fixedDirection=s._KeyboardBehavior.FixedDirection.height,this._surfaceEl.style.height=a.itemHeight*a.rowsPerPage+"px",this._surfaceEl.style.width=this._scrollLength+"px"}else this._scrollPosition=this._viewportEl.scrollTop,a.leadingEdge=0,a.rowsPerPage=b,a.columnsPerPage=1,a.pages=1,a.trailingEdge=0,this._scrollLength=this._viewportEl.scrollHeight,this._keyboardBehavior.fixedSize=a.columnsPerPage,this._keyboardBehavior.fixedDirection=s._KeyboardBehavior.FixedDirection.width,this._surfaceEl.style.height="",this._surfaceEl.style.width="";this._updateGridStyles()}else a.pages=1,this._hasPreviousContent=!1,this._hasNextContent=!1,this._surfaceEl.style.height="",this._surfaceEl.style.width="";this._writeProfilerMark("measure,StopTM")}},_updateGridStyles:function(){for(var a=this._sizes,b=this._surfaceEl.children.length,c=0;b>c;c++){var d,e,f=this._surfaceEl.children[c],g="";if(this.layout===t.Orientation.horizontal){var h=Math.floor(c/a.rowsPerPage),i=h%a.columnsPerPage===0,j=h%a.columnsPerPage===a.columnsPerPage-1,k=a.trailingEdge;if(this.fixedSize)k+=a.extraSpace;else{var l=a.extraSpace-(a.maxColumns-a.columnsPerPage)*a.itemWidth;g=a.itemOffsetWidth+l/a.maxColumns+"px"}var m,n;a.rtl?(m=i?a.leadingEdge:0,n=j?k:0):(m=j?k:0,n=i?a.leadingEdge:0),d=m+a.itemMarginRight+"px",e=n+a.itemMarginLeft+"px"}else d="",e="";f.style.marginRight!==d&&(f.style.marginRight=d),f.style.marginLeft!==e&&(f.style.marginLeft=e),f.style.width!==g&&(f.style.width=g)}},_updatePageUI:function(){this._measure();var a=this._currentPage;this._hasPreviousContent=0!==a,this._hasNextContent=a<this._sizes.pages-1,this._updateArrows(),this._indicatorCount!==this._sizes.pages&&(this._indicatorCount=this._sizes.pages,this._pageindicatorsEl.innerHTML=new Array(this._sizes.pages+1).join('<span class="'+E._ClassName.indicator+'"></span>'));for(var b=0;b<this._pageindicatorsEl.children.length;b++)b===a?r.addClass(this._pageindicatorsEl.children[b],E._ClassName.currentindicator):r.removeClass(this._pageindicatorsEl.children[b],E._ClassName.currentindicator);if(this._sizes.pages>1?(this._viewportEl.style.overflowX=this._panningDisabled?"hidden":"",this._pageindicatorsEl.style.visibility=""):(this._viewportEl.style.overflowX="hidden",this._pageindicatorsEl.style.visibility="hidden"),this._sizes.pages<=1||this._layout!==t.Orientation.horizontal)this._ariaStartMarker.removeAttribute("aria-flowto"),this._ariaEndMarker.removeAttribute("x-ms-aria-flowfrom");else{var c=a*this._sizes.rowsPerPage*this._sizes.columnsPerPage,d=this._surfaceEl.children[c].winControl._buttonEl;r._ensureId(d),this._ariaStartMarker.setAttribute("aria-flowto",d.id);var e=Math.min(this._surfaceEl.children.length-1,(a+1)*this._sizes.rowsPerPage*this._sizes.columnsPerPage-1),f=this._surfaceEl.children[e].winControl._buttonEl;r._ensureId(f),this._ariaEndMarker.setAttribute("x-ms-aria-flowfrom",f.id)}},_closeSplitIfOpen:function(){this._currentSplitNavItem&&(this._currentSplitNavItem.splitOpened&&this._currentSplitNavItem._toggleSplit(),this._currentSplitNavItem=null)},_updateArrows:function(){var a=this._sizes.rtl?this._hasNextContent:this._hasPreviousContent,b=this._sizes.rtl?this._hasPreviousContent:this._hasNextContent,c=this;(this._mouseInViewport||this._panningDisabled)&&a?(this._leftArrowWaitingToFadeOut&&this._leftArrowWaitingToFadeOut.cancel(),this._leftArrowWaitingToFadeOut=null,this._leftArrowFadeOut&&this._leftArrowFadeOut.cancel(),this._leftArrowFadeOut=null,this._leftArrowEl.style.visibility="",this._leftArrowFadeIn=this._leftArrowFadeIn||j.fadeIn(this._leftArrowEl)):(a?this._leftArrowWaitingToFadeOut=this._leftArrowWaitingToFadeOut||o.timeout(k._animationTimeAdjustment(y)):(this._leftArrowWaitingToFadeOut&&this._leftArrowWaitingToFadeOut.cancel(),this._leftArrowWaitingToFadeOut=o.wrap()),this._leftArrowWaitingToFadeOut.then(function(){this._leftArrowFadeIn&&this._leftArrowFadeIn.cancel(),this._leftArrowFadeIn=null,this._leftArrowFadeOut=this._leftArrowFadeOut||j.fadeOut(this._leftArrowEl).then(function(){c._leftArrowEl.style.visibility="hidden"})}.bind(this))),(this._mouseInViewport||this._panningDisabled)&&b?(this._rightArrowWaitingToFadeOut&&this._rightArrowWaitingToFadeOut.cancel(),this._rightArrowWaitingToFadeOut=null,this._rightArrowFadeOut&&this._rightArrowFadeOut.cancel(),this._rightArrowFadeOut=null,this._rightArrowEl.style.visibility="",this._rightArrowFadeIn=this._rightArrowFadeIn||j.fadeIn(this._rightArrowEl)):(b?this._rightArrowWaitingToFadeOut=this._rightArrowWaitingToFadeOut||o.timeout(k._animationTimeAdjustment(y)):(this._rightArrowWaitingToFadeOut&&this._rightArrowWaitingToFadeOut.cancel(),this._rightArrowWaitingToFadeOut=o.wrap()),this._rightArrowWaitingToFadeOut.then(function(){this._rightArrowFadeIn&&this._rightArrowFadeIn.cancel(),this._rightArrowFadeIn=null,this._rightArrowFadeOut=this._rightArrowFadeOut||j.fadeOut(this._rightArrowEl).then(function(){c._rightArrowEl.style.visibility="hidden"})}.bind(this)))},_navbarCommandInvokedHandler:function(a){for(var b=a.target,c=-1;b;)c++,b=b.previousSibling;this._fireEvent(E._EventName.invoked,{index:c,navbarCommand:a.target.winControl,data:this._repeater?this._repeater.data.getAt(c):null})},_navbarCommandSplitToggleHandler:function(a){for(var b=a.target,c=-1;b;)c++,b=b.previousSibling;var d=a.target.winControl;this._closeSplitIfOpen(),d.splitOpened&&(this._currentSplitNavItem=d),this._fireEvent(E._EventName.splitToggle,{opened:d.splitOpened,index:c,navbarCommand:d,data:this._repeater?this._repeater.data.getAt(c):null})},_fireEvent:function(a,c){var d=b.document.createEvent("CustomEvent");d.initCustomEvent(a,!0,!1,c),this.element.dispatchEvent(d)},_writeProfilerMark:function(a){var b="WinJS.UI.NavBarContainer:"+this._id+":"+a;i(b),g.log&&g.log(b,null,"navbarcontainerprofiler")},dispose:function(){this._disposed||(this._disposed=!0,this._appBarEl&&(this._appBarEl.removeEventListener("beforeopen",this._closeSplitAndResetBound),this._appBarEl.removeEventListener("beforeopen",this._resizeImplBound)),n.removeEventListener("navigated",this._closeSplitAndResetBound),this._leftArrowWaitingToFadeOut&&this._leftArrowWaitingToFadeOut.cancel(),this._leftArrowFadeOut&&this._leftArrowFadeOut.cancel(),this._leftArrowFadeIn&&this._leftArrowFadeIn.cancel(),this._rightArrowWaitingToFadeOut&&this._rightArrowWaitingToFadeOut.cancel(),this._rightArrowFadeOut&&this._rightArrowFadeOut.cancel(),this._rightArrowFadeIn&&this._rightArrowFadeIn.cancel(),r._resizeNotifier.unsubscribe(this._element,this._boundResizeHandler),this._removeDataChangingEvents(),this._removeDataChangedEvents())}},{_ClassName:{navbarcontainer:"win-navbarcontainer",pageindicators:"win-navbarcontainer-pageindicator-box",indicator:"win-navbarcontainer-pageindicator",currentindicator:"win-navbarcontainer-pageindicator-current",vertical:"win-navbarcontainer-vertical",horizontal:"win-navbarcontainer-horizontal",viewport:"win-navbarcontainer-viewport",surface:"win-navbarcontainer-surface",navarrow:"win-navbarcontainer-navarrow",navleftarrow:"win-navbarcontainer-navleft",navrightarrow:"win-navbarcontainer-navright"},_EventName:{invoked:C.invoked,splitToggle:C.splittoggle}});return c.Class.mix(E,q.DOMEventMixin),E})})}),d("require-style!less/styles-navbar",[],function(){}),d("require-style!less/colors-navbar",[],function(){}),d("WinJS/Controls/NavBar",["../Core/_Global","../Core/_WinRT","../Core/_Base","../Core/_BaseUtils","../Core/_Events","../Core/_WriteProfilerMark","../Promise","../Scheduler","../Utilities/_ElementUtilities","../Utilities/_Hoverable","../_Accents","./_LegacyAppBar","./NavBar/_Command","./NavBar/_Container","require-style!less/styles-navbar","require-style!less/colors-navbar"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){"use strict";k.createAccentRule("html.win-hoverable .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover",[{name:"background-color",value:k.ColorTypes.listSelectHover}]),k.createAccentRule("html.win-hoverable .win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened:hover.win-pressed",[{name:"background-color",value:k.ColorTypes.listSelectPress}]),k.createAccentRule(".win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened",[{name:"background-color",value:k.ColorTypes.listSelectRest}]),k.createAccentRule(".win-navbarcommand-splitbutton.win-navbarcommand-splitbutton-opened.win-pressed",[{name:"background-color",value:k.ColorTypes.listSelectPress}]);var o="custom";c.Namespace.define("WinJS.UI",{NavBar:c.Namespace._lazy(function(){var j="childrenprocessed",k=e._createEventProperty,m=c.Class.derive(l._LegacyAppBar,function(a,c){i._deprecated(n.navBarIsDeprecated),c=c||{},c=d._shallowCopy(c),c.placement=c.placement||"top",c.layout=o,c.closedDisplayMode=c.closedDisplayMode||"minimal",l._LegacyAppBar.call(this,a,c),this._element.addEventListener("beforeopen",this._handleBeforeShow.bind(this)),i.addClass(this.element,m._ClassName.navbar),b.Windows.ApplicationModel.DesignMode.designModeEnabled?this._processChildren():h.schedule(this._processChildren.bind(this),h.Priority.idle,null,"WinJS.UI.NavBar.processChildren")},{closedDisplayMode:{get:function(){return this._closedDisplayMode},set:function(a){var b="none"===a?"none":"minimal";Object.getOwnPropertyDescriptor(l._LegacyAppBar.prototype,"closedDisplayMode").set.call(this,b),this._closedDisplayMode=b}},onchildrenprocessed:k(j),_processChildren:function(){if(!this._processed){this._processed=!0,this._writeProfilerMark("processChildren,StartTM");var a=this,b=g.as();return this._processors&&this._processors.forEach(function(c){for(var d=0,e=a.element.children.length;e>d;d++)!function(a){b=b.then(function(){c(a)})}(a.element.children[d])}),b.then(function(){a._writeProfilerMark("processChildren,StopTM"),a._fireEvent(m._EventName.childrenProcessed)},function(){a._writeProfilerMark("processChildren,StopTM"),a._fireEvent(m._EventName.childrenProcessed)})}return g.wrap()},_show:function(){if(!this.disabled){var a=this;this._processChildren().then(function(){l._LegacyAppBar.prototype._show.call(a)})}},_handleBeforeShow:function(){if(!this._disposed)for(var a=this.element.querySelectorAll(".win-navbarcontainer"),b=0;b<a.length;b++)a[b].winControl.forceLayout()},_fireEvent:function(b,c){var d=a.document.createEvent("CustomEvent");d.initCustomEvent(b,!0,!1,c||{}),this.element.dispatchEvent(d)},_writeProfilerMark:function(a){f("WinJS.UI.NavBar:"+this._id+":"+a)}},{_ClassName:{navbar:"win-navbar"},_EventName:{childrenProcessed:j},isDeclarativeControlContainer:d.markSupportedForProcessing(function(a,b){if(a._processed)for(var c=0,d=a.element.children.length;d>c;c++)b(a.element.children[c]);else a._processors=a._processors||[],a._processors.push(b)})}),n={get navBarIsDeprecated(){return"NavBar is deprecated and may not be available in future releases. Instead, use a WinJS SplitView to display navigation targets within the app."}};return m})})}),d("require-style!less/styles-viewbox",[],function(){}),d("WinJS/Controls/ViewBox",["../Core/_Global","../Core/_Base","../Core/_BaseUtils","../Core/_ErrorFromName","../Core/_Resources","../Scheduler","../Utilities/_Control","../Utilities/_Dispose","../Utilities/_ElementUtilities","../Utilities/_Hoverable","./ElementResizeInstrument","require-style!less/styles-viewbox"],function(a,b,c,d,e,f,g,h,i,j,k){"use strict";b.Namespace.define("WinJS.UI",{ViewBox:b.Namespace._lazy(function(){var e={get invalidViewBoxChildren(){return"ViewBox expects to be provided with only one child element"}},j=b.Class.define(function(b){this._disposed=!1,this._element=b||a.document.createElement("div");var c=this.element;c.winControl=this,i.addClass(c,"win-disposable"),i.addClass(c,"win-viewbox"),this._handleResizeBound=this._handleResize.bind(this),i._resizeNotifier.subscribe(c,this._handleResizeBound),this._elementResizeInstrument=new k._ElementResizeInstrument,c.appendChild(this._elementResizeInstrument.element),this._elementResizeInstrument.addEventListener("resize",this._handleResizeBound);var d=this;i._inDom(c).then(function(){d._disposed||d._elementResizeInstrument.addedToDom()}),this.forceLayout()},{_sizer:null,_element:null,element:{get:function(){return this._element}},_rtl:{get:function(){return"rtl"===i._getComputedStyle(this.element).direction}},_initialize:function(){var a=this.element,b=Array.prototype.slice.call(a.children);-1===b.indexOf(this._elementResizeInstrument.element)&&a.appendChild(this._elementResizeInstrument.element);var g=this;if(-1===b.indexOf(this._sizer)){var h=b.filter(function(a){return a!==g._elementResizeInstrument.element});if(c.validation&&1!==h.length)throw new d("WinJS.UI.ViewBox.InvalidChildren",e.invalidViewBoxChildren);this._sizer&&(this._sizer.onresize=null);var i=h[0];if(this._sizer=i,0===a.clientWidth&&0===a.clientHeight){var g=this;f.schedule(function(){g._updateLayout()},f.Priority.normal,null,"WinJS.UI.ViewBox._updateLayout")}}},_updateLayout:function(){var a=this._sizer;if(a){var b=this.element,d=a.clientWidth,e=a.clientHeight,f=b.clientWidth,g=b.clientHeight,h=f/d,i=g/e,j=Math.min(h,i),k=Math.abs(f-d*j)/2,l=Math.abs(g-e*j)/2,m=this._rtl;this._sizer.style[c._browserStyleEquivalents.transform.scriptName]="translate("+(m?"-":"")+k+"px,"+l+"px) scale("+j+")",this._sizer.style[c._browserStyleEquivalents["transform-origin"].scriptName]=m?"top right":"top left"}this._layoutCompleteCallback()},_handleResize:function(){if(!this._resizing){this._resizing=this._resizing||0,this._resizing++;try{this._updateLayout()}finally{this._resizing--}}},_layoutCompleteCallback:function(){},dispose:function(){this._disposed||(this.element&&i._resizeNotifier.unsubscribe(this.element,this._handleResizeBound),this._elementResizeInstrument.dispose(),this._disposed=!0,h.disposeSubTree(this._element))},forceLayout:function(){this._initialize(),this._updateLayout()}});return b.Class.mix(j,g.DOMEventMixin),j})})}),d("require-style!less/styles-contentdialog",[],function(){}),d("require-style!less/colors-contentdialog",[],function(){}),d("WinJS/Controls/ContentDialog",["../Application","../Utilities/_Dispose","../_Accents","../Promise","../_Signal","../_LightDismissService","../Core/_BaseUtils","../Core/_Global","../Core/_WinRT","../Core/_Base","../Core/_Events","../Core/_ErrorFromName","../Core/_Resources","../Utilities/_Control","../Utilities/_ElementUtilities","../Utilities/_KeyboardInfo","../Utilities/_Hoverable","../Animations","require-style!less/styles-contentdialog","require-style!less/colors-contentdialog"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r){"use strict";c.createAccentRule(".win-contentdialog-dialog",[{name:"outline-color",value:c.ColorTypes.accent}]),j.Namespace.define("WinJS.UI",{ContentDialog:j.Namespace._lazy(function(){function a(a){if("undefined"==typeof u){var b=h.document.createElement("div");b.style.position="-ms-device-fixed",u="-ms-device-fixed"===o._getComputedStyle(b).position}return u}function c(a){return d._cancelBlocker(a,function(){a.cancel()})}function i(a){a.ensuredFocusedElementInView=!0,this.dialog._renderForInputPane(a.occludedRect.height)}function m(){this.dialog._clearInputPaneRendering()}function q(){}function s(a,b){a._interruptibleWorkPromises=a._interruptibleWorkPromises||[];var c=new e;a._interruptibleWorkPromises.push(b(a,c.promise)),c.complete()}function t(){(this._interruptibleWorkPromises||[]).forEach(function(a){a.cancel()})}var u,v={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get controlDisposed(){return"Cannot interact with the control after it has been disposed"},get contentDialogAlreadyShowing(){return"Cannot show a ContentDialog if there is already a ContentDialog that is showing"}},w={none:"none",primary:"primary",secondary:"secondary"},x={contentDialog:"win-contentdialog",backgroundOverlay:"win-contentdialog-backgroundoverlay",dialog:"win-contentdialog-dialog",title:"win-contentdialog-title",content:"win-contentdialog-content",commands:"win-contentdialog-commands",primaryCommand:"win-contentdialog-primarycommand",secondaryCommand:"win-contentdialog-secondarycommand",_verticalAlignment:"win-contentdialog-verticalalignment",_scroller:"win-contentdialog-scroller",_column0or1:"win-contentdialog-column0or1",_visible:"win-contentdialog-visible",_tabStop:"win-contentdialog-tabstop",_commandSpacer:"win-contentdialog-commandspacer",_deviceFixedSupported:"win-contentdialog-devicefixedsupported"},y={beforeShow:"beforeshow",afterShow:"aftershow",beforeHide:"beforehide",afterHide:"afterhide"},z={Init:j.Class.define(null,{name:"Init",hidden:!0,enter:function(){var a=this.dialog;a._dismissable=new f.ModalElement({element:a._dom.root,tabIndex:a._dom.root.hasAttribute("tabIndex")?a._dom.root.tabIndex:-1,onLightDismiss:function(){a.hide(w.none)},onTakeFocus:function(b){a._dismissable.restoreFocus()||o._tryFocusOnAnyElement(a._dom.dialog,b)}}),this.dialog._dismissedSignal=null,this.dialog._setState(z.Hidden,!1)},exit:q,show:function(){throw"It's illegal to call show on the Init state"},hide:q,onCommandClicked:q,onInputPaneShown:q,onInputPaneHidden:q}),Hidden:j.Class.define(null,{name:"Hidden",hidden:!0,enter:function(a){a&&this.show()},exit:q,show:function(){var a=this.dialog._dismissedSignal=new e;return this.dialog._setState(z.BeforeShow),a.promise},hide:q,onCommandClicked:q,onInputPaneShown:q,onInputPaneHidden:q}),BeforeShow:j.Class.define(null,{name:"BeforeShow",hidden:!0,enter:function(){s(this,function(a,b){return b.then(function(){return a.dialog._fireBeforeShow()}).then(function(b){return b||a.dialog._cancelDismissalPromise(null),b}).then(function(b){b?a.dialog._setState(z.Showing):a.dialog._setState(z.Hidden,!1)})})},exit:t,show:function(){return d.wrapError(new l("WinJS.UI.ContentDialog.ContentDialogAlreadyShowing",v.contentDialogAlreadyShowing))},hide:q,onCommandClicked:q,onInputPaneShown:q,onInputPaneHidden:q}),Showing:j.Class.define(null,{name:"Showing",hidden:{get:function(){return!!this._pendingHide}},enter:function(){s(this,function(a,b){return b.then(function(){return a._pendingHide=null,o.addClass(a.dialog._dom.root,x._visible),a.dialog._addExternalListeners(),p._KeyboardInfo._visible&&a.dialog._renderForInputPane(),f.shown(a.dialog._dismissable),a.dialog._playEntranceAnimation()}).then(function(){a.dialog._fireEvent(y.afterShow)}).then(function(){a.dialog._setState(z.Shown,a._pendingHide)})})},exit:t,show:function(){if(this._pendingHide){var a=this._pendingHide.dismissalResult;return this._pendingHide=null,this.dialog._resetDismissalPromise(a,new e).promise}return d.wrapError(new l("WinJS.UI.ContentDialog.ContentDialogAlreadyShowing",v.contentDialogAlreadyShowing))},hide:function(a){this._pendingHide={dismissalResult:a}},onCommandClicked:q,onInputPaneShown:i,onInputPaneHidden:m}),Shown:j.Class.define(null,{name:"Shown",hidden:!1,enter:function(a){a&&this.hide(a.dismissalResult)},exit:q,show:function(){return d.wrapError(new l("WinJS.UI.ContentDialog.ContentDialogAlreadyShowing",v.contentDialogAlreadyShowing))},hide:function(a){this.dialog._setState(z.BeforeHide,a)},onCommandClicked:function(a){this.hide(a)},onInputPaneShown:i,onInputPaneHidden:m}),BeforeHide:j.Class.define(null,{name:"BeforeHide",hidden:!1,enter:function(a){s(this,function(b,c){return c.then(function(){return b.dialog._fireBeforeHide(a)}).then(function(c){c?b.dialog._setState(z.Hiding,a):b.dialog._setState(z.Shown,null)})})},exit:t,show:function(){return d.wrapError(new l("WinJS.UI.ContentDialog.ContentDialogAlreadyShowing",v.contentDialogAlreadyShowing))},hide:q,onCommandClicked:q,onInputPaneShown:i,onInputPaneHidden:m}),Hiding:j.Class.define(null,{name:"Hiding",hidden:{get:function(){return!this._showIsPending}},enter:function(a){s(this,function(b,c){return c.then(function(){b._showIsPending=!1,b.dialog._resetDismissalPromise(a,null)}).then(function(){return b.dialog._playExitAnimation()}).then(function(){b.dialog._removeExternalListeners(),f.hidden(b.dialog._dismissable),o.removeClass(b.dialog._dom.root,x._visible),b.dialog._clearInputPaneRendering(),b.dialog._fireAfterHide(a)}).then(function(){b.dialog._setState(z.Hidden,b._showIsPending)})})},exit:t,show:function(){return this._showIsPending?d.wrapError(new l("WinJS.UI.ContentDialog.ContentDialogAlreadyShowing",v.contentDialogAlreadyShowing)):(this._showIsPending=!0,this.dialog._dismissedSignal=new e,this.dialog._dismissedSignal.promise)},hide:function(a){this._showIsPending&&(this._showIsPending=!1,this.dialog._resetDismissalPromise(a,null))},onCommandClicked:q,onInputPaneShown:q,onInputPaneHidden:q}),Disposed:j.Class.define(null,{name:"Disposed",hidden:!0,enter:function(){f.hidden(this.dialog._dismissable),this.dialog._removeExternalListeners(),this.dialog._dismissedSignal&&this.dialog._dismissedSignal.error(new l("WinJS.UI.ContentDialog.ControlDisposed",v.controlDisposed))},exit:q,show:function(){return d.wrapError(new l("WinJS.UI.ContentDialog.ControlDisposed",v.controlDisposed))},hide:q,onCommandClicked:q,onInputPaneShown:q,onInputPaneHidden:q})},A=j.Class.define(function(a,b){if(a&&a.winControl)throw new l("WinJS.UI.ContentDialog.DuplicateConstruction",v.duplicateConstruction);b=b||{},this._onInputPaneShownBound=this._onInputPaneShown.bind(this),this._onInputPaneHiddenBound=this._onInputPaneHidden.bind(this),this._onUpdateInputPaneRenderingBound=this._onUpdateInputPaneRendering.bind(this),this._disposed=!1,this._currentFocus=null,this._rendered={registeredForResize:!1,resizedForInputPane:!1,top:"",bottom:""},this._initializeDom(a||h.document.createElement("div")),
-this._setState(z.Init),this.title="",this.primaryCommandText="",this.primaryCommandDisabled=!1,this.secondaryCommandText="",this.secondaryCommandDisabled=!1,n.setOptions(this,b)},{element:{get:function(){return this._dom.root}},title:{get:function(){return this._title},set:function(a){a=a||"",this._title!==a&&(this._title=a,this._dom.title.textContent=a,this._dom.title.style.display=a?"":"none")}},primaryCommandText:{get:function(){return this._primaryCommandText},set:function(a){a=a||"",this._primaryCommandText!==a&&(this._primaryCommandText=a,this._dom.commands[0].textContent=a,this._updateCommandsUI())}},secondaryCommandText:{get:function(){return this._secondaryCommandText},set:function(a){a=a||"",this._secondaryCommandText!==a&&(this._secondaryCommandText=a,this._dom.commands[1].textContent=a,this._updateCommandsUI())}},primaryCommandDisabled:{get:function(){return this._primaryCommandDisabled},set:function(a){a=!!a,this._primaryCommandDisabled!==a&&(this._primaryCommandDisabled=a,this._dom.commands[0].disabled=a)}},secondaryCommandDisabled:{get:function(){return this._secondaryCommandDisabled},set:function(a){a=!!a,this._secondaryCommandDisabled!==a&&(this._secondaryCommandDisabled=a,this._dom.commands[1].disabled=a)}},hidden:{get:function(){return this._state.hidden},set:function(a){if(!a&&this._state.hidden){var b=function(){};this.show().done(b,b)}else a&&!this._state.hidden&&this.hide(w.none)}},dispose:function(){this._disposed||(this._setState(z.Disposed),this._disposed=!0,o._resizeNotifier.unsubscribe(this._dom.root,this._onUpdateInputPaneRenderingBound),b._disposeElement(this._dom.content))},show:function(){return this._state.show()},hide:function(a){this._state.hide(void 0===a?w.none:a)},_initializeDom:function(b){var c=h.document.createElement("div");c.className=x.content,o._reparentChildren(b,c),b.winControl=this,o.addClass(b,x.contentDialog),o.addClass(b,x._verticalAlignment),o.addClass(b,"win-disposable"),b.innerHTML='<div class="'+x.backgroundOverlay+'"></div><div class="'+x._tabStop+'"></div><div tabindex="-1" role="dialog" class="'+x.dialog+'"><h2 class="'+x.title+'" role="heading"></h2><div class="'+x._scroller+'"></div><div class="'+x.commands+'"><button type="button" class="'+x._commandSpacer+' win-button"></button><button type="button" class="'+x.primaryCommand+' win-button"></button><button type="button" class="'+x.secondaryCommand+' win-button"></button></div></div><div class="'+x._tabStop+'"></div><div class="'+x._column0or1+'"></div>';var d={};d.root=b,d.backgroundOverlay=d.root.firstElementChild,d.startBodyTab=d.backgroundOverlay.nextElementSibling,d.dialog=d.startBodyTab.nextElementSibling,d.title=d.dialog.firstElementChild,d.scroller=d.title.nextElementSibling,d.commandContainer=d.scroller.nextElementSibling,d.commandSpacer=d.commandContainer.firstElementChild,d.commands=[],d.commands.push(d.commandSpacer.nextElementSibling),d.commands.push(d.commands[0].nextElementSibling),d.endBodyTab=d.dialog.nextElementSibling,d.content=c,this._dom=d,d.scroller.appendChild(d.content),o._ensureId(d.title),o._ensureId(d.startBodyTab),o._ensureId(d.endBodyTab),d.dialog.setAttribute("aria-labelledby",d.title.id),d.startBodyTab.setAttribute("x-ms-aria-flowfrom",d.endBodyTab.id),d.endBodyTab.setAttribute("aria-flowto",d.startBodyTab.id),this._updateTabIndices(),d.root.addEventListener("keydown",this._onKeyDownEnteringElement.bind(this),!0),o._addEventListener(d.root,"pointerdown",this._onPointerDown.bind(this)),o._addEventListener(d.root,"pointerup",this._onPointerUp.bind(this)),d.root.addEventListener("click",this._onClick.bind(this)),o._addEventListener(d.startBodyTab,"focusin",this._onStartBodyTabFocusIn.bind(this)),o._addEventListener(d.endBodyTab,"focusin",this._onEndBodyTabFocusIn.bind(this)),d.commands[0].addEventListener("click",this._onCommandClicked.bind(this,w.primary)),d.commands[1].addEventListener("click",this._onCommandClicked.bind(this,w.secondary)),a()&&o.addClass(d.root,x._deviceFixedSupported)},_updateCommandsUI:function(){this._dom.commands[0].style.display=this.primaryCommandText?"":"none",this._dom.commands[1].style.display=this.secondaryCommandText?"":"none",this._dom.commandSpacer.style.display=this.primaryCommandText&&!this.secondaryCommandText||!this.primaryCommandText&&this.secondaryCommandText?"":"none"},_updateTabIndices:function(){this._updateTabIndicesThrottled||(this._updateTabIndicesThrottled=g._throttledFunction(100,this._updateTabIndicesImpl.bind(this))),this._updateTabIndicesThrottled()},_updateTabIndicesImpl:function(){var a=o._getHighAndLowTabIndices(this._dom.content);this._dom.startBodyTab.tabIndex=a.lowest,this._dom.commands[0].tabIndex=a.highest,this._dom.commands[1].tabIndex=a.highest,this._dom.endBodyTab.tabIndex=a.highest},_elementInDialog:function(a){return this._dom.dialog.contains(a)||a===this._dom.startBodyTab||a===this._dom.endBodyTab},_onCommandClicked:function(a){this._state.onCommandClicked(a)},_onPointerDown:function(a){a.stopPropagation(),this._elementInDialog(a.target)||a.preventDefault()},_onPointerUp:function(a){a.stopPropagation(),this._elementInDialog(a.target)||a.preventDefault()},_onClick:function(a){a.stopPropagation(),this._elementInDialog(a.target)||a.preventDefault()},_onKeyDownEnteringElement:function(a){a.keyCode===o.Key.tab&&this._updateTabIndices()},_onStartBodyTabFocusIn:function(){o._focusLastFocusableElement(this._dom.dialog)},_onEndBodyTabFocusIn:function(){o._focusFirstFocusableElement(this._dom.dialog)},_onInputPaneShown:function(a){this._state.onInputPaneShown(a.detail.originalEvent)},_onInputPaneHidden:function(){this._state.onInputPaneHidden()},_onUpdateInputPaneRendering:function(){this._renderForInputPane()},_setState:function(a,b){this._disposed||(this._state&&this._state.exit(),this._state=new a,this._state.dialog=this,this._state.enter(b))},_resetDismissalPromise:function(a,b){var c=this._dismissedSignal,d=this._dismissedSignal=b;return c.complete({result:a}),d},_cancelDismissalPromise:function(a){var b=this._dismissedSignal,c=this._dismissedSignal=a;return b.cancel(),c},_fireEvent:function(a,b){b=b||{};var c=b.detail||null,d=!!b.cancelable,e=h.document.createEvent("CustomEvent");return e.initCustomEvent(a,!0,d,c),this._dom.root.dispatchEvent(e)},_fireBeforeShow:function(){return this._fireEvent(y.beforeShow,{cancelable:!0})},_fireBeforeHide:function(a){return this._fireEvent(y.beforeHide,{detail:{result:a},cancelable:!0})},_fireAfterHide:function(a){this._fireEvent(y.afterHide,{detail:{result:a}})},_playEntranceAnimation:function(){return c(r.fadeIn(this._dom.root))},_playExitAnimation:function(){return c(r.fadeOut(this._dom.root))},_addExternalListeners:function(){o._inputPaneListener.addEventListener(this._dom.root,"showing",this._onInputPaneShownBound),o._inputPaneListener.addEventListener(this._dom.root,"hiding",this._onInputPaneHiddenBound)},_removeExternalListeners:function(){o._inputPaneListener.removeEventListener(this._dom.root,"showing",this._onInputPaneShownBound),o._inputPaneListener.removeEventListener(this._dom.root,"hiding",this._onInputPaneHiddenBound)},_shouldResizeForInputPane:function(){if(this._rendered.resizedForInputPane)return!0;var a=this._dom.dialog.getBoundingClientRect(),b=p._KeyboardInfo._visibleDocTop>a.top||p._KeyboardInfo._visibleDocBottom<a.bottom;return b},_renderForInputPane:function(){var a=this._rendered;if(a.registeredForResize||(o._resizeNotifier.subscribe(this._dom.root,this._onUpdateInputPaneRenderingBound),a.registeredForResize=!0),this._shouldResizeForInputPane()){var b=p._KeyboardInfo._visibleDocTop+"px",c=p._KeyboardInfo._visibleDocBottomOffset+"px";if(a.top!==b&&(this._dom.root.style.top=b,a.top=b),a.bottom!==c&&(this._dom.root.style.bottom=c,a.bottom=c),!a.resizedForInputPane){this._dom.scroller.insertBefore(this._dom.title,this._dom.content),this._dom.root.style.height="auto";var d=h.document.activeElement;d&&this._dom.scroller.contains(d)&&d.scrollIntoView(),a.resizedForInputPane=!0}}},_clearInputPaneRendering:function(){var a=this._rendered;a.registeredForResize&&(o._resizeNotifier.unsubscribe(this._dom.root,this._onUpdateInputPaneRenderingBound),a.registeredForResize=!1),""!==a.top&&(this._dom.root.style.top="",a.top=""),""!==a.bottom&&(this._dom.root.style.bottom="",a.bottom=""),a.resizedForInputPane&&(this._dom.dialog.insertBefore(this._dom.title,this._dom.scroller),this._dom.root.style.height="",a.resizedForInputPane=!1)}},{DismissalResult:w,_ClassNames:x});return j.Class.mix(A,k.createEventProperties("beforeshow","aftershow","beforehide","afterhide")),j.Class.mix(A,n.DOMEventMixin),A})})}),d("require-style!less/styles-splitview",[],function(){}),d("require-style!less/colors-splitview",[],function(){}),d("WinJS/Controls/SplitView/_SplitView",["require","exports","../../Animations","../../Core/_Base","../../Core/_BaseUtils","../../Utilities/_Control","../../Utilities/_Dispose","../../Utilities/_ElementUtilities","../../Core/_ErrorFromName","../../Core/_Events","../../Core/_Global","../../_LightDismissService","../../Utilities/_OpenCloseMachine"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(a,b){b&&h.addClass(a,b)}function o(a,b){b&&h.removeClass(a,b)}function p(a,b){return b===u.width?{content:a.contentWidth,total:a.totalWidth}:{content:a.contentHeight,total:a.totalHeight}}a(["require-style!less/styles-splitview"]),a(["require-style!less/colors-splitview"]);var q=e._browserStyleEquivalents.transform,r={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"}},s={splitView:"win-splitview",pane:"win-splitview-pane",content:"win-splitview-content",paneClosed:"win-splitview-pane-closed",paneOpened:"win-splitview-pane-opened",_panePlaceholder:"win-splitview-paneplaceholder",_paneOutline:"win-splitview-paneoutline",_tabStop:"win-splitview-tabstop",_paneWrapper:"win-splitview-panewrapper",_contentWrapper:"win-splitview-contentwrapper",_animating:"win-splitview-animating",_placementLeft:"win-splitview-placementleft",_placementRight:"win-splitview-placementright",_placementTop:"win-splitview-placementtop",_placementBottom:"win-splitview-placementbottom",_closedDisplayNone:"win-splitview-closeddisplaynone",_closedDisplayInline:"win-splitview-closeddisplayinline",_openedDisplayInline:"win-splitview-openeddisplayinline",_openedDisplayOverlay:"win-splitview-openeddisplayoverlay"},t={beforeOpen:"beforeopen",afterOpen:"afteropen",beforeClose:"beforeclose",afterClose:"afterclose"},u={width:"width",height:"height"},v={none:"none",inline:"inline"},w={inline:"inline",overlay:"overlay"},x={left:"left",right:"right",top:"top",bottom:"bottom"},y={};y[v.none]=s._closedDisplayNone,y[v.inline]=s._closedDisplayInline;var z={};z[w.overlay]=s._openedDisplayOverlay,z[w.inline]=s._openedDisplayInline;var A={};A[x.left]=s._placementLeft,A[x.right]=s._placementRight,A[x.top]=s._placementTop,A[x.bottom]=s._placementBottom;var B=function(){function a(a,b){var c=this;if(void 0===b&&(b={}),this._updateDomImpl_rendered={paneIsFirst:void 0,isOpenedMode:void 0,closedDisplayMode:void 0,openedDisplayMode:void 0,panePlacement:void 0,panePlaceholderWidth:void 0,panePlaceholderHeight:void 0,isOverlayShown:void 0,startPaneTabIndex:void 0,endPaneTabIndex:void 0},a&&a.winControl)throw new i("WinJS.UI.SplitView.DuplicateConstruction",r.duplicateConstruction);this._initializeDom(a||k.document.createElement("div")),this._machine=new m.OpenCloseMachine({eventElement:this._dom.root,onOpen:function(){c._cachedHiddenPaneThickness=null;var a=c._getHiddenPaneThickness();return c._isOpenedMode=!0,c._updateDomImpl(),h.addClass(c._dom.root,s._animating),c._playShowAnimation(a).then(function(){h.removeClass(c._dom.root,s._animating)})},onClose:function(){return h.addClass(c._dom.root,s._animating),c._playHideAnimation(c._getHiddenPaneThickness()).then(function(){h.removeClass(c._dom.root,s._animating),c._isOpenedMode=!1,c._updateDomImpl()})},onUpdateDom:function(){c._updateDomImpl()},onUpdateDomWithIsOpened:function(a){c._isOpenedMode=a,c._updateDomImpl()}}),this._disposed=!1,this._dismissable=new l.LightDismissableElement({element:this._dom.paneWrapper,tabIndex:-1,onLightDismiss:function(){c.closePane()},onTakeFocus:function(a){c._dismissable.restoreFocus()||h._tryFocusOnAnyElement(c._dom.pane,a)}}),this._cachedHiddenPaneThickness=null,this.paneOpened=!1,this.closedDisplayMode=v.inline,this.openedDisplayMode=w.overlay,this.panePlacement=x.left,f.setOptions(this,b),h._inDom(this._dom.root).then(function(){c._rtl="rtl"===h._getComputedStyle(c._dom.root).direction,c._updateTabIndices(),c._machine.exitInit()})}return Object.defineProperty(a.prototype,"element",{get:function(){return this._dom.root},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"paneElement",{get:function(){return this._dom.pane},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"contentElement",{get:function(){return this._dom.content},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"closedDisplayMode",{get:function(){return this._closedDisplayMode},set:function(a){v[a]&&this._closedDisplayMode!==a&&(this._closedDisplayMode=a,this._cachedHiddenPaneThickness=null,this._machine.updateDom())},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"openedDisplayMode",{get:function(){return this._openedDisplayMode},set:function(a){w[a]&&this._openedDisplayMode!==a&&(this._openedDisplayMode=a,this._cachedHiddenPaneThickness=null,this._machine.updateDom())},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"panePlacement",{get:function(){return this._panePlacement},set:function(a){x[a]&&this._panePlacement!==a&&(this._panePlacement=a,this._cachedHiddenPaneThickness=null,this._machine.updateDom())},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"paneOpened",{get:function(){return this._machine.opened},set:function(a){this._machine.opened=a},enumerable:!0,configurable:!0}),a.prototype.dispose=function(){this._disposed||(this._disposed=!0,this._machine.dispose(),l.hidden(this._dismissable),g._disposeElement(this._dom.pane),g._disposeElement(this._dom.content))},a.prototype.openPane=function(){this._machine.open()},a.prototype.closePane=function(){this._machine.close()},a.prototype._initializeDom=function(a){var b=a.firstElementChild||k.document.createElement("div");h.addClass(b,s.pane),b.hasAttribute("tabIndex")||(b.tabIndex=-1);var c=k.document.createElement("div");h.addClass(c,s.content);for(var d=b.nextSibling;d;){var e=d.nextSibling;c.appendChild(d),d=e}var f=k.document.createElement("div");f.className=s._tabStop,h._ensureId(f);var g=k.document.createElement("div");g.className=s._tabStop,h._ensureId(g);var i=k.document.createElement("div");i.className=s._paneOutline;var j=k.document.createElement("div");j.className=s._paneWrapper,j.appendChild(f),j.appendChild(b),j.appendChild(i),j.appendChild(g);var l=k.document.createElement("div");l.className=s._panePlaceholder;var m=k.document.createElement("div");m.className=s._contentWrapper,m.appendChild(c),a.winControl=this,h.addClass(a,s.splitView),h.addClass(a,"win-disposable"),this._dom={root:a,pane:b,startPaneTab:f,endPaneTab:g,paneOutline:i,paneWrapper:j,panePlaceholder:l,content:c,contentWrapper:m},h._addEventListener(b,"keydown",this._onKeyDown.bind(this)),h._addEventListener(f,"focusin",this._onStartPaneTabFocusIn.bind(this)),h._addEventListener(g,"focusin",this._onEndPaneTabFocusIn.bind(this))},a.prototype._onKeyDown=function(a){a.keyCode===h.Key.tab&&this._updateTabIndices()},a.prototype._onStartPaneTabFocusIn=function(a){h._focusLastFocusableElement(this._dom.pane)},a.prototype._onEndPaneTabFocusIn=function(a){h._focusFirstFocusableElement(this._dom.pane)},a.prototype._measureElement=function(a){var b=h._getComputedStyle(a),c=h._getPositionRelativeTo(a,this._dom.root),d=parseInt(b.marginLeft,10),e=parseInt(b.marginTop,10);return{left:c.left-d,top:c.top-e,contentWidth:h.getContentWidth(a),contentHeight:h.getContentHeight(a),totalWidth:h.getTotalWidth(a),totalHeight:h.getTotalHeight(a)}},a.prototype._setContentRect=function(a){var b=this._dom.contentWrapper.style;b.left=a.left+"px",b.top=a.top+"px",b.height=a.contentHeight+"px",b.width=a.contentWidth+"px"},a.prototype._prepareAnimation=function(a,b){var c=this._dom.paneWrapper.style;c.position="absolute",c.left=a.left+"px",c.top=a.top+"px",c.height=a.totalHeight+"px",c.width=a.totalWidth+"px";var d=this._dom.contentWrapper.style;d.position="absolute",this._setContentRect(b)},a.prototype._clearAnimation=function(){var a=this._dom.paneWrapper.style;a.position="",a.left="",a.top="",a.height="",a.width="",a[q.scriptName]="";var b=this._dom.contentWrapper.style;b.position="",b.left="",b.top="",b.height="",b.width="",b[q.scriptName]="";var c=this._dom.pane.style;c.height="",c.width="",c[q.scriptName]=""},a.prototype._getHiddenContentRect=function(a,b,c){if(this.openedDisplayMode===w.overlay)return a;var d=this._rtl?x.left:x.right,e=this.panePlacement===d||this.panePlacement===x.bottom?0:1,f={content:c.content-b.content,total:c.total-b.total};return this._horizontal?{left:a.left-e*f.total,top:a.top,contentWidth:a.contentWidth+f.content,contentHeight:a.contentHeight,totalWidth:a.totalWidth+f.total,totalHeight:a.totalHeight}:{left:a.left,top:a.top-e*f.total,contentWidth:a.contentWidth,contentHeight:a.contentHeight+f.content,totalWidth:a.totalWidth,totalHeight:a.totalHeight+f.total}},Object.defineProperty(a.prototype,"_horizontal",{get:function(){return this.panePlacement===x.left||this.panePlacement===x.right},enumerable:!0,configurable:!0}),a.prototype._getHiddenPaneThickness=function(){if(null===this._cachedHiddenPaneThickness)if(this._closedDisplayMode===v.none)this._cachedHiddenPaneThickness={content:0,total:0};else{this._isOpenedMode&&(h.removeClass(this._dom.root,s.paneOpened),h.addClass(this._dom.root,s.paneClosed));var a=this._measureElement(this._dom.pane);this._cachedHiddenPaneThickness=p(a,this._horizontal?u.width:u.height),this._isOpenedMode&&(h.removeClass(this._dom.root,s.paneClosed),h.addClass(this._dom.root,s.paneOpened))}return this._cachedHiddenPaneThickness},a.prototype._playShowAnimation=function(a){var b=this,d=this._horizontal?u.width:u.height,e=this._measureElement(this._dom.pane),f=this._measureElement(this._dom.content),g=p(e,d),h=this._getHiddenContentRect(f,a,g);this._prepareAnimation(e,h);var i=function(){var e=b._rtl?x.left:x.right,f=.3,h=a.total+f*(g.total-a.total);return c._resizeTransition(b._dom.paneWrapper,b._dom.pane,{from:h,to:g.total,actualSize:g.total,dimension:d,anchorTrailingEdge:b.panePlacement===e||b.panePlacement===x.bottom})},j=function(){return b.openedDisplayMode===w.inline&&b._setContentRect(f),i()};return j().then(function(){b._clearAnimation()})},a.prototype._playHideAnimation=function(a){var b=this,d=this._horizontal?u.width:u.height,e=this._measureElement(this._dom.pane),f=this._measureElement(this._dom.content),g=p(e,d),h=this._getHiddenContentRect(f,a,g);this._prepareAnimation(e,f);var i=function(){var e=b._rtl?x.left:x.right,f=.3,h=g.total-f*(g.total-a.total);return c._resizeTransition(b._dom.paneWrapper,b._dom.pane,{from:h,to:a.total,actualSize:g.total,dimension:d,anchorTrailingEdge:b.panePlacement===e||b.panePlacement===x.bottom})},j=function(){return b.openedDisplayMode===w.inline&&b._setContentRect(h),i()};return j().then(function(){b._clearAnimation()})},a.prototype._updateTabIndices=function(){this._updateTabIndicesThrottled||(this._updateTabIndicesThrottled=e._throttledFunction(100,this._updateTabIndicesImpl.bind(this))),this._updateTabIndicesThrottled()},a.prototype._updateTabIndicesImpl=function(){var a=h._getHighAndLowTabIndices(this._dom.pane);this._highestPaneTabIndex=a.highest,this._lowestPaneTabIndex=a.lowest,this._machine.updateDom()},a.prototype._updateDomImpl=function(){var a=this._updateDomImpl_rendered,b=this.panePlacement===x.left||this.panePlacement===x.top;b!==a.paneIsFirst&&(b?(this._dom.root.appendChild(this._dom.panePlaceholder),this._dom.root.appendChild(this._dom.paneWrapper),this._dom.root.appendChild(this._dom.contentWrapper)):(this._dom.root.appendChild(this._dom.contentWrapper),this._dom.root.appendChild(this._dom.paneWrapper),this._dom.root.appendChild(this._dom.panePlaceholder))),a.paneIsFirst=b,a.isOpenedMode!==this._isOpenedMode&&(this._isOpenedMode?(h.removeClass(this._dom.root,s.paneClosed),h.addClass(this._dom.root,s.paneOpened)):(h.removeClass(this._dom.root,s.paneOpened),h.addClass(this._dom.root,s.paneClosed))),a.isOpenedMode=this._isOpenedMode,a.panePlacement!==this.panePlacement&&(o(this._dom.root,A[a.panePlacement]),n(this._dom.root,A[this.panePlacement]),a.panePlacement=this.panePlacement),a.closedDisplayMode!==this.closedDisplayMode&&(o(this._dom.root,y[a.closedDisplayMode]),n(this._dom.root,y[this.closedDisplayMode]),a.closedDisplayMode=this.closedDisplayMode),a.openedDisplayMode!==this.openedDisplayMode&&(o(this._dom.root,z[a.openedDisplayMode]),n(this._dom.root,z[this.openedDisplayMode]),a.openedDisplayMode=this.openedDisplayMode);var c=this._isOpenedMode&&this.openedDisplayMode===w.overlay,d=c?this._lowestPaneTabIndex:-1,e=c?this._highestPaneTabIndex:-1;a.startPaneTabIndex!==d&&(this._dom.startPaneTab.tabIndex=d,-1===d?this._dom.startPaneTab.removeAttribute("x-ms-aria-flowfrom"):this._dom.startPaneTab.setAttribute("x-ms-aria-flowfrom",this._dom.endPaneTab.id),a.startPaneTabIndex=d),a.endPaneTabIndex!==e&&(this._dom.endPaneTab.tabIndex=e,-1===e?this._dom.endPaneTab.removeAttribute("aria-flowto"):this._dom.endPaneTab.setAttribute("aria-flowto",this._dom.startPaneTab.id),a.endPaneTabIndex=e);var f,g;if(c){var i=this._getHiddenPaneThickness();this._horizontal?(f=i.total+"px",g=""):(f="",g=i.total+"px")}else f="",g="";if(a.panePlaceholderWidth!==f||a.panePlaceholderHeight!==g){var j=this._dom.panePlaceholder.style;j.width=f,j.height=g,a.panePlaceholderWidth=f,a.panePlaceholderHeight=g}a.isOverlayShown!==c&&(c?l.shown(this._dismissable):l.hidden(this._dismissable),a.isOverlayShown=c)},a.ClosedDisplayMode=v,a.OpenedDisplayMode=w,a.PanePlacement=x,a.supportedForProcessing=!0,a._ClassNames=s,a}();b.SplitView=B,d.Class.mix(B,j.createEventProperties(t.beforeOpen,t.afterOpen,t.beforeClose,t.afterClose)),d.Class.mix(B,f.DOMEventMixin)}),d("WinJS/Controls/SplitView",["require","exports","../Core/_Base"],function(a,b,c){var d=null;c.Namespace.define("WinJS.UI",{SplitView:{get:function(){return d||a(["./SplitView/_SplitView"],function(a){d=a}),d.SplitView}}})}),d("require-style!less/styles-splitviewpanetoggle",[],function(){}),d("require-style!less/colors-splitviewpanetoggle",[],function(){}),d("WinJS/Controls/SplitViewPaneToggle/_SplitViewPaneToggle",["require","exports","../../Core/_Base","../../Utilities/_Control","../../Utilities/_ElementUtilities","../../Core/_ErrorFromName","../../Core/_Events","../../Core/_Global","../../Utilities/_KeyboardBehavior","../../Utilities/_Hoverable"],function(a,b,c,d,e,f,g,h,i,j){function k(a){return a&&a.winControl}function l(a){var b=k(a);return b?b.paneOpened:!1}j.isHoverable,a(["require-style!less/styles-splitviewpanetoggle"]),a(["require-style!less/colors-splitviewpanetoggle"]);var m={splitViewPaneToggle:"win-splitviewpanetoggle"},n={invoked:"invoked"},o={get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"},get badButtonElement(){return"Invalid argument: The SplitViewPaneToggle's element must be a button element"}},p=function(){function a(a,b){if(void 0===b&&(b={}),this._updateDom_rendered={splitView:void 0},a&&a.winControl)throw new f("WinJS.UI.SplitViewPaneToggle.DuplicateConstruction",o.duplicateConstruction);this._onPaneStateSettledBound=this._onPaneStateSettled.bind(this),this._ariaExpandedMutationObserver=new e._MutationObserver(this._onAriaExpandedPropertyChanged.bind(this)),this._initializeDom(a||h.document.createElement("button")),this._disposed=!1,this.splitView=null,d.setOptions(this,b),this._initialized=!0,this._updateDom()}return Object.defineProperty(a.prototype,"element",{get:function(){return this._dom.root},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"splitView",{get:function(){return this._splitView},set:function(a){this._splitView=a,a&&(this._opened=l(a)),this._updateDom()},enumerable:!0,configurable:!0}),a.prototype.dispose=function(){this._disposed||(this._disposed=!0,this._splitView&&this._removeListeners(this._splitView))},a.prototype._initializeDom=function(a){if("BUTTON"!==a.tagName)throw new f("WinJS.UI.SplitViewPaneToggle.BadButtonElement",o.badButtonElement);a.winControl=this,e.addClass(a,m.splitViewPaneToggle),e.addClass(a,"win-disposable"),a.hasAttribute("type")||(a.type="button"),new i._WinKeyboard(a),a.addEventListener("click",this._onClick.bind(this)),this._dom={root:a}},a.prototype._updateDom=function(){if(this._initialized&&!this._disposed){var a=this._updateDom_rendered;if(this._splitView!==a.splitView&&(a.splitView&&(this._dom.root.removeAttribute("aria-controls"),this._removeListeners(a.splitView)),this._splitView&&(e._ensureId(this._splitView),this._dom.root.setAttribute("aria-controls",this._splitView.id),this._addListeners(this._splitView)),a.splitView=this._splitView),this._splitView){var b=this._opened?"true":"false";e._setAttribute(this._dom.root,"aria-expanded",b);var c=k(this._splitView);c&&(c.paneOpened=this._opened)}}},a.prototype._addListeners=function(a){a.addEventListener("_openCloseStateSettled",this._onPaneStateSettledBound),this._ariaExpandedMutationObserver.observe(this._dom.root,{attributes:!0,attributeFilter:["aria-expanded"]})},a.prototype._removeListeners=function(a){a.removeEventListener("_openCloseStateSettled",this._onPaneStateSettledBound),this._ariaExpandedMutationObserver.disconnect()},a.prototype._fireEvent=function(a){var b=h.document.createEvent("CustomEvent");return b.initCustomEvent(a,!0,!1,null),this._dom.root.dispatchEvent(b)},a.prototype._onPaneStateSettled=function(a){a.target===this._splitView&&(this._opened=l(this._splitView),this._updateDom())},a.prototype._onAriaExpandedPropertyChanged=function(a){var b="true"===this._dom.root.getAttribute("aria-expanded");this._opened=b,this._updateDom()},a.prototype._onClick=function(a){this._invoked()},a.prototype._invoked=function(){this._disposed||(this._splitView&&(this._opened=!this._opened,this._updateDom()),this._fireEvent(n.invoked))},a._ClassNames=m,a.supportedForProcessing=!0,a}();b.SplitViewPaneToggle=p,c.Class.mix(p,g.createEventProperties(n.invoked)),c.Class.mix(p,d.DOMEventMixin)}),d("WinJS/Controls/SplitViewPaneToggle",["require","exports","../Core/_Base"],function(a,b,c){var d=null;c.Namespace.define("WinJS.UI",{SplitViewPaneToggle:{get:function(){return d||a(["./SplitViewPaneToggle/_SplitViewPaneToggle"],function(a){d=a}),d.SplitViewPaneToggle}}})}),d("WinJS/Controls/AppBar/_Constants",["require","exports","../CommandingSurface/_Constants"],function(a,b,c){b.ClassNames={controlCssClass:"win-appbar",disposableCssClass:"win-disposable",actionAreaCssClass:"win-appbar-actionarea",overflowButtonCssClass:"win-appbar-overflowbutton",spacerCssClass:"win-appbar-spacer",ellipsisCssClass:"win-appbar-ellipsis",overflowAreaCssClass:"win-appbar-overflowarea",contentFlyoutCssClass:"win-appbar-contentflyout",emptyappbarCssClass:"win-appbar-empty",menuCssClass:"win-menu",menuContainsToggleCommandClass:"win-menu-containstogglecommand",openedClass:"win-appbar-opened",closedClass:"win-appbar-closed",noneClass:"win-appbar-closeddisplaynone",minimalClass:"win-appbar-closeddisplayminimal",compactClass:"win-appbar-closeddisplaycompact",fullClass:"win-appbar-closeddisplayfull",placementTopClass:"win-appbar-top",placementBottomClass:"win-appbar-bottom"},b.EventNames={beforeOpen:"beforeopen",afterOpen:"afteropen",beforeClose:"beforeclose",afterClose:"afterclose",commandPropertyMutated:"_commandpropertymutated"},b.controlMinWidth=c.controlMinWidth,b.defaultClosedDisplayMode="compact",b.defaultOpened=!1,b.defaultPlacement="bottom",b.typeSeparator="separator",b.typeContent="content",b.typeButton="button",b.typeToggle="toggle",b.typeFlyout="flyout",b.commandSelector=".win-command",b.primaryCommandSection="primary",b.secondaryCommandSection="secondary"}),d("require-style!less/styles-appbar",[],function(){}),d("WinJS/Controls/AppBar/_AppBar",["require","exports","../../Core/_Base","../AppBar/_Constants","../CommandingSurface","../../Utilities/_Control","../../Utilities/_Dispose","../../Utilities/_ElementUtilities","../../Core/_ErrorFromName","../../Core/_Events","../../Core/_Global","../../Utilities/_KeyboardInfo","../../_LightDismissService","../../Promise","../../Core/_Resources","../../Utilities/_OpenCloseMachine","../../Core/_WriteProfilerMark"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){function r(a,b){b&&h.addClass(a,b)}function s(a,b){b&&h.removeClass(a,b)}a(["require-style!less/styles-appbar"]);var t=l._KeyboardInfo,u={get ariaLabel(){return o._getWinJSString("ui/appBarAriaLabel").value},get overflowButtonAriaLabel(){return o._getWinJSString("ui/appBarOverflowButtonAriaLabel").value},get mustContainCommands(){return"The AppBar can only contain WinJS.UI.Command or WinJS.UI.AppBarCommand controls"},get duplicateConstruction(){return"Invalid argument: Controls may only be instantiated one time for each DOM element"}},v={none:"none",minimal:"minimal",compact:"compact",full:"full"},w={};w[v.none]=d.ClassNames.noneClass,w[v.minimal]=d.ClassNames.minimalClass,w[v.compact]=d.ClassNames.compactClass,w[v.full]=d.ClassNames.fullClass;var x={top:"top",bottom:"bottom"},y={};y[x.top]=d.ClassNames.placementTopClass,y[x.bottom]=d.ClassNames.placementBottomClass;var z=function(){function a(b,c){var g=this;if(void 0===c&&(c={}),this._updateDomImpl_renderedState={isOpenedMode:void 0,placement:void 0,closedDisplayMode:void 0,adjustedOffsets:{top:void 0,bottom:void 0}},this._writeProfilerMark("constructor,StartTM"),b&&b.winControl)throw new i("WinJS.UI.AppBar.DuplicateConstruction",u.duplicateConstruction);this._initializeDom(b||k.document.createElement("div"));var j=new p.OpenCloseMachine({eventElement:this.element,onOpen:function(){var b=g._commandingSurface.createOpenAnimation(g._getClosedHeight());return g.element.style.position="fixed",g._placement===a.Placement.top?g.element.style.top=l._KeyboardInfo._layoutViewportCoords.visibleDocTop+"px":g.element.style.bottom=l._KeyboardInfo._layoutViewportCoords.visibleDocBottom+"px",g._synchronousOpen(),b.execute().then(function(){g.element.style.position="",g.element.style.top=g._adjustedOffsets.top,g.element.style.bottom=g._adjustedOffsets.bottom})},onClose:function(){var b=g._commandingSurface.createCloseAnimation(g._getClosedHeight());return g.element.style.position="fixed",g._placement===a.Placement.top?g.element.style.top=l._KeyboardInfo._layoutViewportCoords.visibleDocTop+"px":g.element.style.bottom=l._KeyboardInfo._layoutViewportCoords.visibleDocBottom+"px",b.execute().then(function(){g._synchronousClose(),g.element.style.position="",g.element.style.top=g._adjustedOffsets.top,g.element.style.bottom=g._adjustedOffsets.bottom})},onUpdateDom:function(){g._updateDomImpl()},onUpdateDomWithIsOpened:function(a){g._isOpenedMode=a,g._updateDomImpl()}});this._handleShowingKeyboardBound=this._handleShowingKeyboard.bind(this),this._handleHidingKeyboardBound=this._handleHidingKeyboard.bind(this),h._inputPaneListener.addEventListener(this._dom.root,"showing",this._handleShowingKeyboardBound),h._inputPaneListener.addEventListener(this._dom.root,"hiding",this._handleHidingKeyboardBound),this._disposed=!1,this._cachedClosedHeight=null,this._commandingSurface=new e._CommandingSurface(this._dom.commandingSurfaceEl,{openCloseMachine:j}),r(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-actionarea"),d.ClassNames.actionAreaCssClass),r(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-overflowarea"),d.ClassNames.overflowAreaCssClass),r(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-overflowbutton"),d.ClassNames.overflowButtonCssClass),
-r(this._dom.commandingSurfaceEl.querySelector(".win-commandingsurface-ellipsis"),d.ClassNames.ellipsisCssClass),this._isOpenedMode=d.defaultOpened,this._dismissable=new m.LightDismissableElement({element:this._dom.root,tabIndex:this._dom.root.hasAttribute("tabIndex")?this._dom.root.tabIndex:-1,onLightDismiss:function(){g.close()},onTakeFocus:function(a){g._dismissable.restoreFocus()||g._commandingSurface.takeFocus(a)}}),this.closedDisplayMode=d.defaultClosedDisplayMode,this.placement=d.defaultPlacement,this.opened=this._isOpenedMode,f.setOptions(this,c),h._inDom(this.element).then(function(){return g._commandingSurface.initialized}).then(function(){j.exitInit(),g._writeProfilerMark("constructor,StopTM")})}return Object.defineProperty(a.prototype,"element",{get:function(){return this._dom.root},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"data",{get:function(){return this._commandingSurface.data},set:function(a){this._commandingSurface.data=a},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"closedDisplayMode",{get:function(){return this._commandingSurface.closedDisplayMode},set:function(a){v[a]&&(this._commandingSurface.closedDisplayMode=a,this._cachedClosedHeight=null)},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"placement",{get:function(){return this._placement},set:function(a){if(x[a]&&this._placement!==a){switch(this._placement=a,a){case x.top:this._commandingSurface.overflowDirection="bottom";break;case x.bottom:this._commandingSurface.overflowDirection="top"}this._adjustedOffsets=this._computeAdjustedOffsets(),this._commandingSurface.deferredDomUpate()}},enumerable:!0,configurable:!0}),Object.defineProperty(a.prototype,"opened",{get:function(){return this._commandingSurface.opened},set:function(a){this._commandingSurface.opened=a},enumerable:!0,configurable:!0}),a.prototype.open=function(){this._commandingSurface.open()},a.prototype.close=function(){this._commandingSurface.close()},a.prototype.dispose=function(){this._disposed||(this._disposed=!0,m.hidden(this._dismissable),this._commandingSurface.dispose(),h._inputPaneListener.removeEventListener(this._dom.root,"showing",this._handleShowingKeyboardBound),h._inputPaneListener.removeEventListener(this._dom.root,"hiding",this._handleHidingKeyboardBound),g.disposeSubTree(this.element))},a.prototype.forceLayout=function(){this._commandingSurface.forceLayout()},a.prototype.getCommandById=function(a){return this._commandingSurface.getCommandById(a)},a.prototype.showOnlyCommands=function(a){return this._commandingSurface.showOnlyCommands(a)},a.prototype._writeProfilerMark=function(a){q("WinJS.UI.AppBar:"+this._id+":"+a)},a.prototype._initializeDom=function(a){this._writeProfilerMark("_intializeDom,info"),a.winControl=this,this._id=a.id||h._uniqueID(a),h.addClass(a,d.ClassNames.controlCssClass),h.addClass(a,d.ClassNames.disposableCssClass);var b=a.getAttribute("role");b||a.setAttribute("role","menubar");var c=a.getAttribute("aria-label");c||a.setAttribute("aria-label",u.ariaLabel);var e=document.createElement("DIV");h._reparentChildren(a,e),a.appendChild(e),this._dom={root:a,commandingSurfaceEl:e}},a.prototype._handleShowingKeyboard=function(a){var b=this;if(this._dom.root.contains(k.document.activeElement)){var c=a.detail.originalEvent;c.ensuredFocusedElementInView=!0}var d=t._animationShowLength+t._scrollTimeout;return n.timeout(d).then(function(){b._shouldAdjustForShowingKeyboard()&&!b._disposed&&(b._adjustedOffsets=b._computeAdjustedOffsets(),b._commandingSurface.deferredDomUpate())})},a.prototype._shouldAdjustForShowingKeyboard=function(){return t._visible&&!t._isResized},a.prototype._handleHidingKeyboard=function(){var a=this,b=t._animationShowLength+t._scrollTimeout;n.timeout(b).then(function(){a._adjustedOffsets=a._computeAdjustedOffsets(),a._commandingSurface.deferredDomUpate()})},a.prototype._computeAdjustedOffsets=function(){var a={top:"",bottom:""};return this._placement===x.bottom?a.bottom=t._visibleDocBottomOffset+"px":this._placement===x.top&&(a.top=t._visibleDocTop+"px"),a},a.prototype._synchronousOpen=function(){this._isOpenedMode=!0,this._updateDomImpl()},a.prototype._synchronousClose=function(){this._isOpenedMode=!1,this._updateDomImpl()},a.prototype._updateDomImpl=function(){var a=this._updateDomImpl_renderedState;a.isOpenedMode!==this._isOpenedMode&&(this._isOpenedMode?this._updateDomImpl_renderOpened():this._updateDomImpl_renderClosed(),a.isOpenedMode=this._isOpenedMode),a.placement!==this.placement&&(s(this._dom.root,y[a.placement]),r(this._dom.root,y[this.placement]),a.placement=this.placement),a.closedDisplayMode!==this.closedDisplayMode&&(s(this._dom.root,w[a.closedDisplayMode]),r(this._dom.root,w[this.closedDisplayMode]),a.closedDisplayMode=this.closedDisplayMode),a.adjustedOffsets.top!==this._adjustedOffsets.top&&(this._dom.root.style.top=this._adjustedOffsets.top,a.adjustedOffsets.top=this._adjustedOffsets.top),a.adjustedOffsets.bottom!==this._adjustedOffsets.bottom&&(this._dom.root.style.bottom=this._adjustedOffsets.bottom,a.adjustedOffsets.bottom=this._adjustedOffsets.bottom),this._commandingSurface.updateDom()},a.prototype._getClosedHeight=function(){if(null===this._cachedClosedHeight){var a=this._isOpenedMode;this._isOpenedMode&&this._synchronousClose(),this._cachedClosedHeight=this._commandingSurface.getBoundingRects().commandingSurface.height,a&&this._synchronousOpen()}return this._cachedClosedHeight},a.prototype._updateDomImpl_renderOpened=function(){r(this._dom.root,d.ClassNames.openedClass),s(this._dom.root,d.ClassNames.closedClass),this._commandingSurface.synchronousOpen(),m.shown(this._dismissable)},a.prototype._updateDomImpl_renderClosed=function(){r(this._dom.root,d.ClassNames.closedClass),s(this._dom.root,d.ClassNames.openedClass),this._commandingSurface.synchronousClose(),m.hidden(this._dismissable)},a.ClosedDisplayMode=v,a.Placement=x,a.supportedForProcessing=!0,a}();b.AppBar=z,c.Class.mix(z,j.createEventProperties(d.EventNames.beforeOpen,d.EventNames.afterOpen,d.EventNames.beforeClose,d.EventNames.afterClose)),c.Class.mix(z,f.DOMEventMixin)}),d("WinJS/Controls/AppBar",["require","exports","../Core/_Base"],function(a,b,c){var d=null;c.Namespace.define("WinJS.UI",{AppBar:{get:function(){return d||a(["./AppBar/_AppBar"],function(a){d=a}),d.AppBar}}})}),d("ui",["WinJS/Core/_WinJS","WinJS/VirtualizedDataSource","WinJS/Vui","WinJS/Controls/IntrinsicControls","WinJS/Controls/ListView","WinJS/Controls/FlipView","WinJS/Controls/ItemContainer","WinJS/Controls/Repeater","WinJS/Controls/DatePicker","WinJS/Controls/TimePicker","WinJS/Controls/BackButton","WinJS/Controls/Rating","WinJS/Controls/ToggleSwitch","WinJS/Controls/SemanticZoom","WinJS/Controls/Pivot","WinJS/Controls/Hub","WinJS/Controls/Flyout","WinJS/Controls/_LegacyAppBar","WinJS/Controls/Menu","WinJS/Controls/SearchBox","WinJS/Controls/SettingsFlyout","WinJS/Controls/NavBar","WinJS/Controls/Tooltip","WinJS/Controls/ViewBox","WinJS/Controls/ContentDialog","WinJS/Controls/SplitView","WinJS/Controls/SplitViewPaneToggle","WinJS/Controls/SplitView/Command","WinJS/Controls/ToolBar","WinJS/Controls/AppBar"],function(a){"use strict";return a}),c(["WinJS/Core/_WinJS","ui"],function(b){a.WinJS=b,"undefined"!=typeof module&&(module.exports=b)}),a.WinJS})}();
-//# sourceMappingURL=ui.min.js.map
\ No newline at end of file
diff --git a/node_modules/winjs/js/ui.min.js.map b/node_modules/winjs/js/ui.min.js.map
deleted file mode 100644
index c2a555c..0000000
--- a/node_modules/winjs/js/ui.min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["ui.js"],"names":["globalObject","window","self","global","factory","define","amd","msWriteProfilerMark","exports","nodeName","require","WinJS","Utilities","_require","_define","_Global","_Base","_BaseUtils","_ErrorFromName","_Events","_Log","_Resources","_WriteProfilerMark","Promise","Scheduler","_Signal","_UI","Namespace","_moduleDefine","VirtualizedDataSource","_lazy","_baseDataSourceConstructor","listDataAdapter","options","profilerMarkStart","text","message","dataSourceID","log","profilerMarkEnd","isNonNegativeNumber","n","isNonNegativeInteger","Math","floor","validateIndexReturned","index","undefined","strings","invalidIndexReturned","validateCountReturned","count","CountResult","unknown","invalidCountReturned","createSlot","handle","nextHandle","toString","slotNew","item","itemNew","fetchListeners","cursorCount","bindingMap","handleMap","createPrimarySlot","insertSlot","slot","slotNext","prev","next","removeSlot","lastInSequence","firstInSequence","sequenceStart","sequenceEnd","moveSequenceBefore","slotFirst","slotLast","moveSequenceAfter","slotPrev","mergeSequences","splitSequence","slotListEnd","changeSlotIndex","insertAndMergeSlot","mergeWithPrev","mergeWithNext","setSlotKey","key","keyMap","setSlotIndex","indexMapForSlot","indexUpdateDeferred","createAndAddSlot","indexMap","createSlotSequence","createPrimarySlotSequence","addSlotBefore","addSlotAfter","reinsertSlot","removeSlotPermanently","listBindingID","slotPermanentlyRemoved","successorFromIndex","listStart","listEnd","skipPreviousIndex","lastSequenceStart","isPlaceholder","defineHandleProperty","Object","defineProperty","value","writable","enumerable","configurable","defineCommonItemProperties","get","slotMergedWith","validateData","data","dataValidated","JSON","stringify","objectIsNotValidJson","itemSignature","prepareSlotItem","create","compareByIdentity","signature","indexRequested","keyRequested","slotRetained","slotRequested","directFetchListeners","slotLive","itemsFromIndex","slotsStart","deleteUnnecessarySlot","reduceReleasedSlotCount","editsQueued","lastSlotReleased","releasedSlotsFound","considerDeletingSlot","slotToDelete","cacheSize","slotPrevToDelete","slotNextToDelete","slotsEnd","releasedSlots","releaseSlotIfUnrequested","refreshInProgress","reduceReleasedSlotCountPosted","schedule","Priority","idle","forEachBindingRecord","callback","forEachBindingRecordOfSlot","bindingRecord","handlerToNotify","notificationsSent","notificationHandler","beginNotifications","finishNotifications","editsInProgress","dataNotificationsInProgress","endNotifications","handleForBinding","slotBinding","itemForBinding","changeCount","oldCount","knownCount","countChanged","sendIndexChangedNotifications","indexOld","indexChanged","insertionNotificationRecipients","bindingMapRecipients","sendInsertedNotification","inserted","itemPromiseFromKnownSlot","changeSlot","itemOld","changed","moveSlot","slotMoveBefore","skipNotifications","slotMoveAfter","moved","adjustCurrentSlot","deleteSlot","mirage","completeFetchPromises","removed","deleteMirageSequence","last","adjustedIndex","undefinedIndex","delta","indexNew","updateNewIndicesAfterSlot","indexDelta","countDelta","beginRefresh","currentRefreshID","updateNewIndices","updateNewIndicesFromIndex","updateIndices","slotFirstInSequence","isNaN","slotUpdate","getCountPromise","reset","createFetchPromise","listenersProperty","listenerID","onComplete","complete","listener","retained","promise","error","keys","length","completePromises","listeners","completeSynchronously","completeOrQueuePromises","fetchCompleteCallbacks","push","callFetchCompleteCallbacks","callbacks","i","len","returnDirectFetchError","requestSlot","postFetch","requestSlotBefore","requestSlotAfter","itemDirectlyFromSlot","nextListenerID","wrap","validateKey","keyIsInvalid","createSlotForKey","slotFromKey","hints","slotFromIndex","indexIsInvalid","slotFromDescription","description","setStatus","statusNew","statusPending","status","dispatch","statusChangePosted","that","dispatchEvent","statusChangedEvent","DataSourceStatus","failure","setTimeout","slotFetchInProgress","fetchID","fetchesInProgress","setFetchID","newFetchID","nextFetchID","setFetchIDs","countBefore","countAfter","slotBefore","slotAfter","addMarkers","fetchResult","items","offset","totalCount","absoluteIndex","atStart","atEnd","itemsLength","unshift","startMarker","endMarker","resultsValid","refreshID","fetchItems","promiseItems","then","wrapError","FetchError","doesNotExist","perfID","processResults","processErrorResult","fetchItemsForIndex","processResultsForIndex","processErrorResultForIndex","fetchItemsFromStart","itemsFromStart","fetchItemsFromEnd","itemsFromEnd","fetchItemsFromKey","itemsFromKey","fetchItemsFromIndex","slotSearch","slotClosest","closestDelta","fetchBefore","max","fetchAfter","fetchItemsFromDescription","itemsFromDescription","fetchItemsForAllSlots","slotFirstPlaceholder","placeholderCount","slotRequestedByKey","requestedKeyOffset","slotRequestedByDescription","requestedDescriptionOffset","slotRequestedByIndex","requestedIndexOffset","fetchInProgress","resultsProcessed","waiting","ready","fetchesPosted","itemChanged","property","changeSlotIfNecessary","updateSlotItem","updateSlot","sendMirageNotifications","slotToDiscard","listBindingIDsToDelete","mergeSlots","mergeSlotsAndItem","slotFromResult","result","invalidItemReturned","validation","invalidKeyReturned","matchSlot","slotExisting","promoteSlot","insertionPoint","slotWithIndex","slotWithKey","mergeAdjacentSlot","mergeSlotsBefore","mergeSlotsAfter","mergeSequencePairs","sequencePairsToMerge","sequencePairToMerge","slotBeforeSequence","slotAfterSequence","slotLastInSequence","removeMirageIndices","countMax","indexFirstKnown","removePlaceholdersAfterSlot","slotRemoveAfter","slot2","slotPrev2","placeholdersAtEnd","results","perfId","j","resultsCount","offsetMap","Array","slotBestMatch","firstSequence","iLast","index2","slotInsertBefore","refreshRequested","name","noResponse","indexFirst","indexLast","identifyRefreshCycle","start","refreshHistory","kind","end","match","refreshCycleIdentified","resetRefreshState","beginRefreshCount","MAX_BEGINREFRESH_COUNT","refreshHistoryPos","refreshStart","refreshEnd","refreshItemsFetched","refreshCount","keyFetchIDs","refreshKeyMap","refreshIndexMap","deletedKeys","waitForRefresh","applyNextEdit","refreshFetchesInProgress","startRefreshFetches","high","requestRefresh","refreshSignal","resultsValidForRefresh","fetchItemsForRefresh","fromStart","processRefreshResults","processRefreshErrorResult","refreshRange","searchDelta","min","refreshFirstItem","keyFetchInProgress","refreshRanges","allRanges","slotFetchFirst","slotRefreshFirst","refreshFetchExtra","fetchCount","slotRefresh","keyAlreadyFetched","synchronousProgress","reentrantContinue","concludeRefresh","continueRefresh","slotContinue","synchronousRefresh","reentrantRefresh","slotRefreshFromResult","processRefreshSlotIndex","expectedIndex","setRefreshSlotResult","lastRefreshInsertionPoint","keyPresent","slotSuccessor","slotFromSlotRefresh","slotRefreshFromSlot","mergeSequencesForRefresh","mergedForRefresh","copyRefreshSlotData","addNewSlotFromRefresh","insertAfter","matchSlotForRefresh","updateSlotForRefresh","stationary","indexForRefresh","sequenceCountOld","sequenceOld","sequenceOldPrev","sequenceOldBestMatch","sequenceCountNew","sequenceNew","sequencesOld","sequencesNew","sequenceNumber","first","matchingItems","bestMatch","bestMatchCount","slotIndexRequested","sequenceIndexEnd","sequenceOldEnd","previousBestMatch","newSequenceCounts","stationarySlot","listEndObserved","splice","orderPreserved","slotRefreshLast","sequenceLength","slotRefreshNext","indexBefore","indexAfter","locationJustDetermined","sequenceEndReached","firstInner","lastInner","ordinal","piles","searchFirst","searchLast","searchMidpoint","predecessor","stationaryItems","stationaryItemCount","sequenceBoundaryReached","slotRefreshStop","slotRefreshMergePoint","slotStop","slotRefreshStationary","slotRefreshOld","indexNewNext","slotMove","slotMoveNext","slotUpdateNext","listEndReached","indexMax","slotRefreshBefore","fetchResults","slotOffset","signal","queueEdit","applyEdit","editType","keyUpdate","updateSlots","undo","editQueueTail","editQueue","edit","failed","completeEdits","dequeueEdit","firstEditInProgress","editNext","discardEditQueue","editLast","EditError","canceled","attemptEdit","continueEdits","reentrant","synchronousEdit","onEditComplete","keyNew","keyOld","EditType","change","onEditError","Name","notPermitted","noLongerMeaningful","beginEdits","beginEditsCalled","concludeEdits","endEdits","getSlotForEdit","insertNewSlot","insertItem","append","insert","moveItem","mergeAdjacent","move","ListDataNotificationHandler","completeNotification","this","invalidateAll","reload","cancel","resetState","newItem","previousKey","nextKey","havePreviousKey","haveNextKey","oldIndex","newIndex","nextTempKey","listDataNotificationHandler","nextListBindingID","uniqueID","remove","listDataAdapterIsInvalid","setNotificationHandler","createListBinding","retainSlotForCursor","releaseSlotForCursor","moveCursor","slotCurrent","releaseSlotFromListBinding","bindingHandle","releaseBindingMap","releaseHandle","listBindingID2","retainItem","releaseItem","itemPromise","retain","listBinding","_retainItem","release","_releaseItem","itemPromiseFromSlot","released","jumpToItem","current","previous","fromKey","fromIndex","fromDescription","countedCancelation","incomingPromise","dataSource","v","e","resultPromise","getCount","currentGetCountPromise","c","requestPromise","relatedGetCountPromise","synchronous","invalidRequestedCountReturned","CountError","itemFromKey","itemFromIndex","itemFromDescription","insertAtStart","insertBefore","insertAtEnd","newData","moveToStart","moveBefore","moveAfter","moveToEnd","VDS","Class","_isVirtualizedDataSource","supportedForProcessing","mix","eventMixin","_GroupDataSource","errorDoesNotExist","groupReady","group","firstReached","lastReached","batchSizeDefault","ListNotificationHandler","groupDataAdapter","_groupDataAdapter","previousHandle","_inserted","oldItem","_changed","_moved","_removed","newCount","invalidateGroups","_indexChanged","_endNotifications","_reload","GroupDataAdapter","listDataSource","groupKey","groupData","_listBinding","_groupKey","_groupData","_initializeState","_batchSize","_count","groupCountEstimate","batchSize","_fetchItems","_lastGroup","_fetchBatch","_listDataNotificationHandler","_keyMap","lastGroup","groupMemberKey","groupMemberIndex","groupMemberDescription","_indexMap","_fetchNextIndex","countPromise","fetch","initialBatch","getGroup","_fetchQueue","_itemBatch","_continueFetch","_beginRefresh","_indexMax","_handleMap","_itemsToFetch","_indicesChanged","_processBatch","previousItem","previousGroup","firstItemInGroup","itemsSinceStart","lastItem","firstItem","size","group2","_nextGroup","normal","_processPromise","batchIndex","_fetchAdjacent","after","groupHighestIndex","groupPrev","groupNext","_previousGroup","_fetchComplete","firstRequest","countAvailableBefore","groupFirst","countAvailableAfter","groupLast","firstItemKey","groupSize","firstItemIndex","firstItemIndexHint","mayExist","fetchInitialBatch","fetchComplete","failureCount","_invalidateIndices","_releaseGroup","_processInsertion","_processRemoval","newSize","derive","extensions","computeDataSourceGroups","createGroupedItem","groupedItem","createGroupedItemPromise","groupedItemPromise","onError","onCancel","groupedItemDataSource","groupedNotificationHandler","groupedItemListBinding","listBindingMethods","listBindingMethod","apply","arguments","listDataSourceMethods","listDataSourceMethod","forEach","methodName","groupDataSource","_WinRT","Animations","StorageDataSource","StorageDataAdapter","query","library","mode","Windows","Storage","FileProperties","ThumbnailMode","singleItem","flags","ThumbnailOptions","useCurrentScale","delayLoad","picturesView","KnownFolders","picturesLibrary","musicView","musicLibrary","documentsView","documentsLibrary","videosView","videosLibrary","queryOptions","Search","QueryOptions","folderDepth","FolderDepth","deep","indexerOption","IndexerOption","useIndexerWhenAvailable","_query","createFileQueryWithOptions","requestedThumbnailSize","listView","thumbnailOptions","waitForFileLoad","_loader","BulkAccess","FileInformationFactory","firstDataRequest","_notificationHandler","addEventListener","ev","_item","target","getItemsAsync","itemsVector","vectorSize","localItemsVector","getMany","findStartIndexAsync","getItemCountAsync","folderRelativeId","path","loadThumbnail","image","thumbnailUpdateHandler","thumbnailPromise","shouldRespondToThumbnailUpdate","tagSupplied","processThumbnail","thumbnail","url","URL","createObjectURL","oneTimeOnly","loadImage","isOnScreen","visible","imagePromise","fadeIn","style","opacity","type","ThumbnailType","icon","returnedSmallerCachedSize","removeEventListener","_ElementUtilities","_handleListeningModeStateChanged","defaultPrevented","transitionHandler","Handlers","tagName","state","ListeningModeStates","active","Properties","vuiData","hasClass","ClassNames","removeClass","disambiguation","reactivate","label","addClass","activate","disambiguate","inactive","deactivate","EventNames","ListeningModeStateChanged","BUTTON","element","nodes","width","height","cs","_getComputedStyle","childNodes","removeChild","textContent","innerHTML","node","appendChild","document","createAccentRule","selector","props","rules","scheduleWriteRules","writeRulesTOHandle","_setImmediate","cleanup","inverseThemeSelector","isDarkTheme","Constants","lightThemeSelector","darkThemeSelector","inverseThemeHoverSelector","hoverSelector","createElement","id","accentStyleId","map","rule","body","prop","colors","join","selectorSplit","split","str","sanitizeSpaces","css","isThemedColor","some","inverseBody","themedSelectors","sel","indexOf","replace","selWithoutHover","trim","CSSSelectorTokens","head","handleColorsChanged","uiColor","UI","ViewManagement","UIColorType","UISettings","getColorValue","accent","colorToString","color","alpha","r","g","b","querySelector","parentNode","_reset","themeDetectionTag","ColorTypes","tag","parentElement","toPublish","_colors","_isDarkTheme","load","Error","_Hoverable","_Accents","styleText","className","objData","eventNames","resize","_ready","contentWindowResizeEvent","isMS","documentElement","_ElementResizeInstrument","_this","_disposed","_elementLoaded","_running","_objectWindowResizeHandlerBound","_objectWindowResizeHandler","bind","objEl","setAttribute","visibility","_element","_elementLoadPromise","onload","_objWindow","prototype","contentDocument","defaultView","addedToDom","contains","position","initialResizeTimeout","timeout","handleInitialResize","dispose","call","useCapture","eventProperties","_batchResizeEvents","_fireResizeEvent","handleResizeFn","_pendingResizeAnimationFrameId","_cancelAnimationFrame","_requestAnimationFrame","getModule","module","m","publicMembers","members","_listViewClass","_viewportClass","_rtlListViewClass","_horizontalClass","_verticalClass","_scrollableClass","_itemsContainerClass","_listHeaderContainerClass","_listFooterContainerClass","_padderClass","_proxyClass","_itemClass","_itemBoxClass","_itemsBlockClass","_containerClass","_containerEvenClass","_containerOddClass","_backdropClass","_footprintClass","_groupsClass","_selectedClass","_selectionBorderClass","_selectionBackgroundClass","_selectionCheckmarkClass","_selectionCheckmarkBackgroundClass","_pressedClass","_headerClass","_headerContainerClass","_groupLeaderClass","_progressClass","_revealedClass","_itemFocusClass","_itemFocusOutlineClass","_zoomingXClass","_zoomingYClass","_listLayoutClass","_gridLayoutClass","_headerPositionTopClass","_headerPositionLeftClass","_structuralNodesClass","_singleItemsBlockClass","_uniformGridLayoutClass","_uniformListLayoutClass","_cellSpanningGridLayoutClass","_laidOutClass","_nonDraggableClass","_nonSelectableClass","_dragOverClass","_dragSourceClass","_clipClass","_selectionModeClass","_noCSSGrid","_hidingSelectionMode","_hidingSelectionModeAnimationTimeout","_INVALID_INDEX","_UNINITIALIZED","_LEFT_MSPOINTER_BUTTON","_RIGHT_MSPOINTER_BUTTON","_TAP_END_THRESHOLD","_DEFAULT_PAGES_TO_LOAD","_DEFAULT_PAGE_LOAD_THRESHOLD","_MIN_AUTOSCROLL_RATE","_MAX_AUTOSCROLL_RATE","_AUTOSCROLL_THRESHOLD","_AUTOSCROLL_DELAY","_DEFERRED_ACTION","_DEFERRED_SCROLL_END","_SELECTION_CHECKMARK","_LISTVIEW_PROGRESS_DELAY","ScrollToPriority","uninitialized","low","medium","ViewChange","rebuild","remeasure","relayout","realize","_ScrollToPriority","_ViewChange","_TransitionAnimation","_Constants","transformNames","_browserStyleEquivalents","_ItemEventsHandler","createNodeWithClass","skipAriaHidden","PT_TOUCH","_MSPointerEvent","MSPOINTER_TYPE_TOUCH","ItemEventsHandler","site","_site","_work","_animations","_removeEventListener","_resetPointerDownStateBound","onPointerDown","eventObject","leftButton","rightButton","touchInput","pointerType","pressedElement","Input","PointerPoint","currentPoint","_getCurrentPoint","pointProps","properties","isInverted","isEraser","isMiddleButtonPressed","isRightButtonPressed","isLeftButtonPressed","button","_DragStartBound","onDragStart","_PointerEnterBound","onPointerEnter","_PointerLeaveBound","onPointerLeave","isInteractive","_isInteractive","currentPressedIndex","indexForItemElement","currentPressedHeaderIndex","indexForHeaderElement","mustSetCapture","pressedEntity","ObjectType","groupHeader","pressedPosition","_getCursorPos","allowed","verifySelectionAllowed","_canSelect","canSelect","_canTapSelect","canTapSelect","pressedItemBox","itemBoxAtIndex","pressedContainer","containerAtIndex","animatedElement","pressedHeader","_togglePressed","_addEventListener","headerFromElement","isPhone","_resetPointerDownStateForPointerId","_pointerId","pointerId","_pointerRightButton","_setPointerCapture","canvasProxy","_selectionAllowed","_multiSelection","selection","_getFocused","_pivot","_resetPressedContainer","scriptName","onClick","_skipClick","entity","accessibleItemClass","handleTap","fireInvokeEvent","onPointerUp","_yieldForEvents","_releasePointerCapture","releasedElement","_releasedElement","releasedIndex","releasedHeaderIndex","releasedEntity","shiftKey","firstIndex","lastIndex","additive","ctrlKey","tapBehavior","TapBehavior","toggleSelect","selectRange","toggleSelectionIfAllowed","upPosition","isTap","abs","left","top","headerAtIndex","changeFocus","resetPointerDownState","onPointerCancel","onLostPointerCapture","onContextMenu","_shouldSuppressContextMenu","preventDefault","onMSHoldVisual","onDataChanged","itemIndex","_toggleItemSelection","_selectOnTap","selectionMode","SelectionMode","multi","_isIncluded","set","selected","single","clear","add","getCurrentPoint","_containedInElementWithClass","matches","querySelectorAll","_isSelected","containerElement","containerFromElement","isHeader","_staticMode","elementFromPoint","clientX","clientY","_applyUIInBatches","work","applyUI","_flushUIBatches","_paintedThisFrame","workItems","itemAtIndex","itemSelectable","none","directSelect","headerTapBehavior","GroupHeaderTapBehavior","setAriaSelected","itemElement","isSelected","ariaSelected","getAttribute","renderSelection","itemBox","aria","container","_selectionTemplate","checkmark","_isSelectionRendered","cloneNode","firstElementChild","_selectionPartsSelector","_ItemSet","ranges","_listView","_ranges","_itemsCount","getRanges","range","firstKey","lastKey","getItems","getItemsFromRanges","_itemsManager","isEverything","getIndices","indices","promises","_Selection","isEverythingRange","Number","MAX_VALUE","indexesAndRanges","_releaseRanges","selectAll","_execute","sort","right","_ensureKeys","_ensureCount","_retainRange","operation","toRange","retVal","handleKeys","binding","_getListBinding","keysSupported","array","isArray","_set","_add","newRange","merge","lastPromise","_insertRange","mergeWithLast","_removeRanges","_remove","toRemove","retainPromise","firstPromise","ensureKey","which","keyProperty","filter","_mergeRanges","source","howMany","_releaseRange","_retainRanges","_SelectionManager","_selected","_focused","_pendingChange","_synchronize","newSelection","_cloneSelection","_versionManager","unlocked","currentPendingChange","_setFocused","_keyboardFocused","_dispose","_fireSelectionChanging","approved","_updateSelection","_fireSelectionChanged","createEvent","newSelectionUpdated","initCustomEvent","preventTapBehavior","setPromise","keyboardFocused","_focusedByKeyboard","_updateCount","transformName","_SelectionMode","clampToRange","x","dispatchKeyboardNavigating","oldEntity","newEntity","navigationEvent","oldFocus","oldFocusType","newFocus","newFocusType","modeSite","inboundFocusHandled","_pressedContainer","_pressedItemBox","_pressedHeader","_pressedEntity","_pressedPosition","initialize","_itemEventsHandler","_setNewFocusItemOffsetPromise","createArrowHandler","direction","clampToBounds","handler","_view","getAdjacent","_keyboardNavigationHandlers","_keyboardAcceleratorHandlers","containerFrom","_groups","itemBoxAt","itemAt","header","headerFrom","containerAt","isZombie","_isZombie","getItemPosition","_getItemPosition","rtl","_rtl","_fireInvokeEvent","_verifySelectionAllowed","skipSelection","ctrlKeyDown","skipEnsureVisible","_changeFocus","_selectRange","pressedContainerScaleTransform","_pressedContainerScaleTransform","_pressedElement","eventHandlerRoot","_viewport","_selectionMode","_canvasProxy","_tap","_groupHeaderTap","draggable","itemsDraggable","itemsReorderable","_selection","customFootprintParent","Key","upArrow","downArrow","leftArrow","rightArrow","pageUp","pageDown","home","_header","footer","_footer","lastItemIndex","a","_selectAll","staticMode","itemUnrealized","_resetPointerDownState","_itemBeingDragged","_draggedItemBoxes","fireInvokeEventImpl","eventName","done","groupHeaderPromise","groupHeaderIndex","_defaultInvoke","invoke","_isInSelectionMode","itemDataSource","included","completed","preventTap","defaultBehavior","_isDraggable","onclick","_removeTransform","transform","unselectableRealizedItems","each","currentStartRange","animating","_dragging","_dragDataTransfer","dataTransfer","_dragInfo","_lastEnteredElement","_draggingUnselectedItem","dropTarget","event","dragInfo","setData","setDragImage","pressedItemData","itemDataAt","rect","getBoundingClientRect","_firedDragEnter","_fireDragEnterEvent","_dragUnderstood","_addedDragOverClass","sourceElement","itemDragEnd","onDragEnd","_yieldForDomModification","indicesSelected","itemData","_addDragSourceClass","onDragEnter","eventHandled","_exitEventTimer","clearTimeout","_pointerLeftRegion","onDragLeave","_handleExitEvent","fireDragUpdateEvent","_fireDragBetweenEvent","insertAfterIndex","_fireDropEvent","_layout","dragLeave","_lastInsertPoint","_dragBetweenDisabled","_stopAutoScroll","_getEventPositionInElementSpace","elementRect","err","computedStyle","paddingLeft","parseInt","paddingTop","borderLeft","borderTop","y","_getPositionInCanvasSpace","scrollLeft","_horizontal","scrollPosition","scrollTop","renderDragSourceOnRealizedItem","onDragOver","cursorPositionInCanvas","cursorPositionInRoot","_checkAutoScroll","hitTest","_autoScrollFrame","insertPoint","_cachedCount","dragOver","_clearDragProperties","_findFirstAvailableInsertPoint","selectedItems","startIndex","searchForwards","dropIndexInSelection","selectionCount","startIndexInSelection","dropIndex","_reorderItems","reorderedItems","reorderingUnselectedItem","useMoveBefore","ensureVisibleAtEnd","updateSelection","ensureVisible","ds","onDrop","cursorPosition","dropLocation","allowDrop","_groupsEnabled","viewportSize","_getViewportLength","horizontal","cursorPositionInViewport","canvasSize","travelRate","round","_autoScrollDelay","_autoScrollRate","_lastDragTimeout","_now","nextFrame","currentTime","newScrollPos","_scrollProperty","_viewportScrollPosition","setScrollPosition","onKeyDown","setNewFocus","setNewFocusImpl","maxIndex","moveView","invalidIndex","_batchViewUpdates","_getItemOffset","_convertFromCanvasCoordinates","oldItemOffscreen","begin","view","handled","keyCode","altKey","focusedIndex","movingUnselectedItem","processReorder","movingAhead","searchForward","reportedInsertAfterIndex","reportedIndex","groupsEnabled","groups","groupIndex","groupFromItem","enter","space","escape","_keyDownHandled","stopPropagation","tab","_keyboardFocusInbound","onKeyUp","onTabEntered","_hasHeaderOrFooter","focused","forward","detail","inboundFocus","_hasKeyboardFocus","_supportsGroupHeaderKeyboarding","_groupFocusCache","getIndexForGroup","getLastFocusedItemIndex","_lastFocusedElementInGroupTrack","onTabExiting","lastType","targetIndex","modeIsInvalid","loadingBehaviorIsDeprecated","pagesToLoadIsDeprecated","pagesToLoadThresholdIsDeprecated","automaticallyLoadPagesIsDeprecated","invalidTemplate","loadMorePagesIsDeprecated","disableBackdropIsDeprecated","backdropColorIsDeprecated","itemInfoIsDeprecated","groupInfoIsDeprecated","resetItemIsDeprecated","resetGroupHeaderIsDeprecated","maxRowsIsDeprecated","swipeOrientationDeprecated","swipeBehaviorDeprecated","_GroupFocusCache","updateCache","itemKey","_lastFocusedItemKey","_lastFocusedItemIndex","_itemToIndex","_groupToItem","deleteItem","deleteGroup","updateItemIndex","_UnsupportedGroupFocusCache","_Dispose","_ItemsManager","_GroupsContainerBase","requestHeader","_waitingHeaderRequests","notify","requests","groupFromImpl","fromGroup","toGroup","comp","center","centerGroup","groupFrom","lastGroupIndex","groupFromOffset","cleanUp","userData","synchronizeGroups","pendingChanges","ignoreChanges","_ifZombieDispose","fromHandle","_UnvirtualizedGroupsContainer","dirty","_groupsChanged","_scheduleUpdate","receivedNotification","scheduleUpdate","itemAvailable","_writeProfilerMark","groupEntry","markToRemove","itemHandle","_groupRemoved","findIndex","newGroup","_processReload","decorator","tabIndex","_groupsToRemove","_uniqueID","removeElements","disposeSubTree","initializePromise","renderGroup","groupHeaderTemplate","_groupHeaderRenderer","_normalizeRendererReturn","setDomElement","headerElement","elements","focusedItemPurged","_unsetFocusOnItem","_disposeElement","_setFocusOnItem","resetGroups","slice","_NoGroups","addItem","pinnedItem","pinnedOffset","ensureFirstGroup","groupOf","nodeListToArray","nodeList","repeat","stripedContainers","nextItemIndex","containersMarkup","evenStripe","oddStripe","stripes","pairOfContainers","_nodeListToArray","_repeat","_stripedContainers","_ItemsContainer","_itemData","waitingItemRequests","requestItem","detached","removeItem","removeItems","setItemAt","elementAvailable","itemBoxFrom","hasOwnProperty","eachIndex","_SafeHtml","_ErrorMessages","uniqueCssClassName","prefix","nextCssClassId","flushDynamicCssRules","ruleSuffix","layoutStyleElem","sheet","cssRules","classCount","staleClassNames","selectorText","deleteRule","addDynamicCssRule","uniqueToken","insertRule","deleteDynamicCssRule","getDimension","convertToPixels","getOuter","side","getOuterHeight","getOuterWidth","forEachContainer","itemsContainer","itemsBlocks","block","containerFromIndex","blockSize","blockIndex","getItemsContainerTree","tree","itemsContainerTree","treeLength","getItemsContainerLength","blocksCount","itemsCount","getEnvironmentSupportInformation","environmentDetails","surface","flexRoot","cssText","setInnerHTMLUnsafe","viewport","firstChild","canMeasure","offsetWidth","expectedWidth","supportsCSSGrid","nestedFlexTooLarge","nestedFlexTooSmall","readyToMeasure","normalizeLayoutPromises","is","realizedRangeComplete","layoutComplete","getMargins","bottom","itemInfoIsInvalid","groupInfoResultIsInvalid","browserStyleEquivalents","transitionScriptName","dragBetweenTransition","cssName","dragBetweenDistance","Layout","_LayoutCommon","groupHeaderPosition","_groupHeaderPosition","_invalidateLayout","_inListMode","_backdropColorClassName","_disableBackdropClassName","_groupMap","_oldGroupHeaderPosition","_usingStructuralNodes","_resetAnimationCaches","orientation","_orientation","uninitialize","cleanGroups","_elementsToMeasure","_layoutPromise","_resetMeasurements","_envInfo","_animationsRunning","_animatingItemsBlocks","numberOfItemsPerItemsBlock","allGroupsAreUniform","groupCount","_isCellSpanning","_measureItem","_sizes","viewportContentSize","_getViewportCrossSize","_viewportSizeChanged","_barsPerItemsBlock","_itemsPerBar","layout","changedRange","modifiedItems","modifiedGroups","copyItemsContainerTree","copyItems","itemsBlock","concat","updateGroups","createGroup","groupInfo","GroupType","enableCellSpanning","Groups","CellSpanningGroup","UniformGroup","oldRealizedItemRange","_getRealizationRange","newGroups","prepared","cleanUpDom","newGroupMap","currentIndex","oldChangedRealizedRangeInGroup","_getGroupInfo","groupFromIndex","oldGroup","wasCellSpanning","isCellSpanning","firstChangedIndexInGroup","oldRealizedItemRangeInGroup","_rangeForGroup","prepareLayoutPromise","prepareLayoutWithCopyOfTree","prepareLayout","currentOffset","_getGroupSize","deletedKey","skipDomCleanUp","layoutGroupContent","realizedItemRange","doRealizedRange","beforeRealizedRange","realizedItemRangeInGroup","layoutRealizedRange","layoutUnrealizedRange","firstChangedGroup","groupIndexFromItemIndex","_layoutGroup","lastGroupBefore","firstGroupAfter","layoutPromises","stop","before","realizedRangePromise","layoutPerfId","realizedRangePerfId","_cacheRemovedElements","_cachedItemRecords","_cachedInsertedItemRecords","_cachedRemovedItems","_cachedHeaderRecords","_cachedInsertedHeaderRecords","_cachedRemovedHeaders","_syncDomWithGroupHeaderPosition","surfaceLength","HeaderPosition","surfaceContentSize","headerContainerWidth","headerContainerHeight","_layoutAnimations","itemsFromRange","firstPixel","lastPixel","_rangeContainsItems","_firstItemFromRange","_lastItemFromRange","currentItem","pressedKey","handleArrowKeys","currentItemInGroup","adjustedKey","prevGroup","nextGroup","coordinates","_indexToCoordinate","currentSlot","row","column","indexOfLastBar","startOfLastBar","_adjustedKeyForOrientationAndBars","_adjustedKeyForRTL","desiredIndex","_getAdjacentForPageKeys","sizes","layoutOriginX","layoutOriginY","_groupFromOffset","setupAnimations","realizationRange","groupBundle","groupHasAtleastOneItemRealized","groupIsCellSpanning","groupOffset","itemPosition","_getItemPositionForAnimations","oldRow","oldColumn","oldLeft","oldTop","inCellSpanningGroup","headerPosition","_getHeaderPositionForAnimations","_cachedGroupRecords","_updateAnimationCache","groupMovementX","groupMovementY","cachedGroupRecord","cachedItemRecord","xOffset","yOffset","needsToResetTransform","cachedHeader","headerContainer","groupOffsetX","groupOffsetY","itemsBlockKeys","blockKeys","overflow","executeAnimations","startAnimations","removePhase","hasMultisizeMove","cellSpanningFadeOutMove","maxDistance","containerCrossSize","_getHeaderSizeContentAdjustment","containerMargins","itemMoveRecords","oldReflowLayoutProperty","reflowLayoutProperty","upOutDist","oldReflowLayoutPosition","upInDist","reflowLayoutPosition","hasReflow","reflowItemRecords","downOutDist","downInDist","reflowPhase","directMovePhase","waitForNextPhase","nextPhaseCallback","currentAnimationPromise","pendingTransitionPromises","animationSignal","_debugAnimations","removedElements","moveDelay","addDelay","removeDuration","slowAnimations","executeTransition","delay","removeDelay","duration","timing","to","skipStylesReset","moveElements","moveRecords","fadeOutDuration","cellSpanningFadeInMove","fadeInDuration","addPhase","itemsPerBar","itemContainersLastBarIndices","reflowItemRecord","minOffset","maxOffset","lastBarIndex","ceil","itemContainersToExpand","reflowDuration","itemContainerKeys","itemContainer","marginLeft","animatingItemsBlocks","classList","afterReflowPhase","cleanupItemsContainers","fastMode","insertedElements","addDuration","completePhase","_filterInsertedElements","_filterMovedElements","_filterRemovedElements","_insertedElements","_removedElements","_itemMoveRecords","_moveRecords","_slowAnimations","indicesAffected","groupAffected","indexOffset","visibleRange","_getVisibleRange","elementBefore","elementAfter","_animatedDragItems","animationsDisabled","inListMode","_slotsPerColumn","horizontalTransform","verticalTransform","_setMaxRowsOrColumns","_maxRowsOrColumns","containerSizeLoaded","maxItemsContainerContentSize","itemOfGroupIndex","realizedRange","skipReset","_resetStylesForRecords","_resetStylesForInsertedRecords","_resetStylesForRemovedRecords","modifiedElements","cachedRecords","cachedInsertedRecords","areHeaders","leftStr","outerX","outerY","headerContainerOuterX","headerContainerOuterY","modifiedElementLookup","_cacheInsertedElements","newCachedInsertedRecords","wasInserted","cachedRecord","modifiedElement","recordsHash","recordKeys","record","insertedRecords","insertedRecordKeys","insertedElement","updateIndicies","updatedCachedRecords","cachedRecordKeys","existingContainers","filterRemovedElements","removedRecordArray","removedElementsArray","removedItem","oldLeftStr","widthStr","visibleFirstPixel","visibleLastPixel","scrollbarPos","filterInsertedElements","insertedElementsArray","insertedRecord","groupHasItemToAnimate","shouldAnimate","cachedHeaderRecord","getItemPositionForAnimations","headerWidth","headerHeight","itemsContainerOuterX","itemsContainerOuterY","headerContainerOuterWidth","headerContainerOuterHeight","getItemsContainerSize","offsetX","offsetY","lastPixelOfLayout","layoutOrigin","_itemFromOffset","assignItemMargins","wholeItem","marginPropLast","marginPropFirst","assignGroupMarginsAndHeaders","_getHeaderSizeGroupAdjustment","itemsContainerOuterStart","itemFromOffset","cellSpanningGroup","newKey","marginSum","viewportLength","currentItemPosition","offscreen","firstIndexOnPrevPage","lastIndexOnNextPage","_groupInfo","margins","adjustedInfo","cellWidth","cellHeight","_getItemInfo","_itemInfo","_useDefaultItemInfo","_defaultItemInfo","as","renderItem","_measureElements","entry","headerContainerMinSize","headerContainerMinWidth","headerContainerMinHeight","_groupFrom","_groupFromImpl","invalidateLayout","_measuringPromise","_containerSizeClassName","_measuringElements","schedulePromiseHigh","_createMeasuringSurface","measuringElements","elementsToMeasure","stopMeasuring","getTotalWidth","getTotalHeight","_ensureEnvInfo","measureItemImpl","secondTry","elementPromises","itemCount","renderHeader","readMeasurementsFromDOM","measuringPromise","firstElementOnSurfaceMargins","firstElementOnSurface","firstElementOnSurfaceOffsetX","offsetLeft","firstElementOnSurfaceOffsetY","offsetTop","surfaceOuterHeight","surfaceOuterWidth","itemsContainerOuterHeight","itemsContainerOuterWidth","itemsContainerMargins","itemBoxOuterHeight","itemBoxOuterWidth","containerOuterHeight","containerOuterWidth","emptyContainerContentHeight","getContentHeight","emptyContainer","emptyContainerContentWidth","getContentWidth","containerWidth","containerHeight","measurements","viewportContentWidth","viewportContentHeight","containerContentWidth","containerContentHeight","viewportCrossSize","itemsContainerRow","itemsContainerColumn","headerContainerRow","headerContainerColumn","addHeaderFirst","display","defineProperties","surfaceOuterCrossSize","itemsContainerOuterSize","itemsContainerOuterCrossSize","itemsContainerOuterCrossStart","containerSize","itemsContainerContentSize","_createContainerStyleRule","promiseStoredSignal","maximumRowsOrColumns","ruleSelector","ruleBody","_ensureContainerSize","_ensuringContainerSize","itemSize","bar","maxWidth","msGridRows","maxHeight","msGridColumns","groupCrossSize","getItemsContainerCrossSize","headerContainerMinContentWidth","itemsContainerContentWidth","msGridColumn","marginBottom","headerContainerMinContentHeight","itemsContainerContentHeight","msGridRow","_LegacyLayout","disableBackdrop","_backdropDisabled","_deprecated","backdropColor","_backdropColor","GridLayout","itemInfo","maxRows","defineWithParent","UniformGroupBase","lastIndexOfGroup","lastBar","useListSemantics","directionalLocation","crossLocation","insertAfterSlot","slotInBar","currentBar","isLastIndexOfGroup","inLastSlot","barCount","_itemsContainer","oldChangedRealizedRange","oldState","updatedProperties","UniformFlowGroup","resetMap","_cleanContainers","_offScreenSlotsPerColumn","_items","_containersToHide","itemInfoPromises","itemInfos","addItemToMap","firstChangedIndex","firstChangedRealizedIndex","_layoutItem","getColumnCount","layoutJob","completeLayout","fn","unrealizedRangeWork","info","shouldYield","setWork","beforeRealizedRangeWork","afterRealizedRangeWork","indexFromOffset","originalIndex","inMap","inMapIndex","lastAdjacent","lastInMapIndex","findItem","lastColumn","occupancyMap","counter","curr","lastValidIndex","getItemSize","itemLeft","itemTop","contentWidth","contentHeight","rows","columns","getOccupancyMapItemCount","coordinateToIndex","markSlotAsFull","itemEntry","toRow","toColumn","isSlotEmpty","findEmptySlot","newColumn","startRow","coords","lastAdded","mapEntry","adjustedOffset","measuredWidth","ListLayout","_layoutNonGroupedVerticalList","_numberOfItemsPerItemsBlock","CellSpanningLayout","_cellSpanning","_LayoutWrapper","defaultAnimations","propertyDefinition","_getMargins","_Helpers","setFlow","from","_setAttribute","_VirtualizeContentsView","cooperativeQueueWorker","job","_workItems","shift","pause","scheduleQueueJob","priority","addWork","resume","clearWork","shouldWaitForSeZo","_zooming","_pinching","waitForSeZo","_waitForSeZoTimeoutDuration","_waitForSeZoIntervalDuration","makeFunctor","scrollToFunctor","pos","nop","_forceRelayout","maxLeadingPages","_isiOS","_iOSMaxLeadingPages","_defaultPagesToPrefetch","maxTrailingPages","_iOSMaxTrailingPages","firstIndexDisplayed","lastIndexDisplayed","_realizePass","_firstLayoutPass","_runningAnimations","_renderCompletePromise","_state","CreatedState","_createLayoutSignal","_createTreeBuildingSignal","_layoutWork","_onscreenJob","aboveNormal","_frontOffscreenJob","_backOffscreenJob","belowNormal","_scrollbarPos","_direction","_scrollToFunctor","_createItem","available","unavailable","_getBoundingRectString","_itemFromItemPromiseThrottled","_recordFromElement","_addItem","fragment","currentPass","_pendingItemPromises","itemsManagerRecord","containers","_setSkipRealizationForChange","skip","_realizationLevel","_realizeItems","firstInView","lastInView","ignoreGaps","itemIsReady","renderCompletePromises","_cancelBlocker","renderComplete","delivered","appendItemsToDom","endIndex","updateDraggable","updatedDraggableAttribute","appendItemsCount","_itemBoxTemplate","_setupAriaSelectionObserver","_currentMode","getContainer","_appendAndRestoreFocus","_reportElementsLevel","removeGaps","testGap","foundMissing","scheduleReadySignal","dir","readyComplete","pendingReady","inViewCounter","entranceAnimation","_animateListEntrance","_firstEntranceAnimated","entranceAnimationSignal","_isCurrentZoomView","requestDrain","_updateHeaders","_canvas","viewportItemsRealized","leftOffscreenCount","inView","frontItemsRealized","rightOffscreenCount","_headerRenderPromises","workCompleteSignal","newItemIsReady","createCount","updateCount","cleanCount","isCurrentZoomView","_highPriorityRealize","_hasAnimationInViewportPending","cancelToken","cancelOnNotification","queueStage1AfterStage0","startStage1","stage0","queueWork","_itemPromiseAtIndex","_previousRealizationPendingItemPromises","_recordFromHandle","queueRight","queueLeft","handleExistingRange","emptyFront","handles","releaseItemPromise","showProgress","_showProgressBar","_hideProgressBar","clearCancelOnNotification","allItemsRealized","loadingCompleted","itemReadyPromise","_setAnimationInViewportState","_addHeader","placeholder","_getHeaderContainer","updateGroup","headerPromise","groupStart","groupEnd","realizationPromises","_unrealizeItem","_unrealizeGroup","_unrealizeItems","removedCount","beginGroup","endGroup","_unrealizeExcessiveItems","realized","needed","_maxDeferredItemCleanup","_lazilyUnrealizeItems","itemsToUnrealize","groupsToUnrealize","unrealizeWorker","removeCount","zooming","itemPos","_clearDeferTimeout","deferTimeout","deferredActionCancelToken","_setupAria","timedOut","calcLastRealizedIndexInGroup","_createAriaMarkers","startGroup","currentGroup","lastRealizedIndexInGroup","_ariaStartMarker","_ariaEndMarker","_ensureId","_headerRole","_tabIndex","completeJobPromise","skipWait","ariaWorker","jobInfo","nextItem","_itemRole","_fireAccessibilityAnnotationCompleteEvent","_setupDeferredActions","_lazilyRemoveRedundantItemsBlocks","_updateAriaMarkers","listViewIsEmpty","getFirstVisibleItem","getLastVisibleItem","firstVisibleItem","lastVisibleItem","firstVisibleGroup","updateAriaForAnnouncement","elementsCount","level","_createHeaderContainer","_createSurfaceChild","_createItemsContainer","padder","_ensureContainerInDOM","_forceItemsBlocksInDOM","_ensureItemsBlocksInDOM","_expandedRange","oldBegin","oldEnd","_removeRedundantItemsBlocks","blocksCleanupWorker","_blockSize","_blocksToRelease","setPadder","padding","paddingProperty","forEachBlock","measureItemsBlock","_itemsBlockExtent","getItemsBlockExtent","removeBlocks","addBlocks","nextElementSibling","added","collapseGroup","expandGroup","removedFromRange","oldRange","expand","newL","newR","oldL","oldR","firstGroupIndex","firstGroup","firstItemsContainer","firstBlock","lastItemsContainer","lastBlock","groupsToCollapse","blocksToRemove","_realizePageImpl","locked","renderingCompleteSignal","viewPortPageRealized","setLoadingState","_LoadingState","viewPortLoaded","_executeAnimations","_setState","RealizingAnimatingState","pageRealized","itemsLoaded","finish","_clearInsertedItems","itemsLoading","pagesBefore","pagesAfter","pagesToPrefetch","pagesToRetain","_disableCustomPagesPrefetch","pagesShortBehind","beginningOffset","endingOffset","_clamp","lastRealizePass","_cancelRealize","deletesWithoutRealize","realizeWork","_itemCanvas","realizePassWork","realizePage","forceRelayout","scrollEndPromise","StateType","_scrollEndPromise","RealizingState","onScroll","ScrollingState","highPriority","stopWork","rebuildTree","refresh","waitForValidScrollPosition","newPosition","currentMaxScroll","_scrollLength","_creatingContainersWork","_getLayoutCompleted","waitForEntityPosition","stopTreeCreation","resetItems","unparent","_deferredReparenting","_resetCanvas","keyToGroupIndex","itemsManager","destroyed","_getGroups","_groupDataSource","groupsContainer","nextStartIndex","_createChunk","chunkSize","addToGroup","children","oldSize","toAdd","insertAdjacentHTMLUnsafe","finalSize","_createChunkWithBlocks","indexOfNextGroupItem","lastExistingBlock","emptySpotsToFill","sizeOfOldLastBlock","child","newBlocksCount","markup","firstBlockFirstItemIndex","secondBlockFirstItemIndex","pairOfItemBlocks","sizeOfNewLastBlock","blocksTemp","blockNode","lastContainer","currentSize","_generateCreateContainersWorker","_createContainersJobTimeslice","startLength","realizedToEnd","_chunkSize","_affectedRange","layoutNewContainers","_scheduleLazyTreeCreation","_createContainers","_maxTimePerCreateContainers","_startupChunkSize","jobNode","_updateItemsBlocks","createNewBlock","rebuildItemsContainer","rebuildItemsContainerWithBlocks","blockElements","currentBlock","nextBlock","blocks","usingStructuralNodes","_layoutItems","affectedRange","_modifiedElements","_modifiedGroups","updateTree","_updateTreeImpl","skipUnrealizeItems","_itemBox","removedGroups","_updateContainers","removedHeaders","removedItemsContainers","activeElement","_requireFocusRestore","_completeUpdateTree","deferredCount","deferredItem","empty","_keyboardEventsHelper","_setActive","_startAnimations","animationPromise","NewStateType","arg","prevStateName","currentFocus","_realizedRangeLaidOut","_layoutCompleted","_executeScrollToFunctor","scroll","BuildingState","canceling","LayingoutState","_raiseViewComplete","NextStateType","nextStateType","CompletedState","cancelLayout","switchState","LayoutCanceledState","nextState","UnrealizingState","relayoutNewContainers","CanceledState","_relayoutInComplete","_setViewState","ScrollingPausedState","realizePromise","realizeId","animatePromise","animateSignal","_waitForRealize","realizing","currentRealizeId","previousModifiedElements","_stopped","LayingoutNewContainersState","BindingList","_Control","_TabContainer","_VersionManager","_BrowseMode","_GroupsContainer","_Layouts","disposeControls","temp","controlsToDispose","scheduleForDispose","lv","disposeControlTimeout","DISPOSE_TIMEOUT","getOffsetRight","offsetParent","notCompatibleWithSemanticZoom","listViewInvalidItem","listViewViewportAriaLabel","_getWinJSString","requireSupportedForProcessing","ListViewAnimationType","entrance","contentTransition","ListView","AffectedRange","_lastKnownSizeOfData","_range","previousUnmodifiedItemsFromEnd","newUnmodifiedItemsFromEnd","finalUnmodifiedItemsFromEnd","addAll","ZoomableView","getPanAxis","_getPanAxis","configureForZoom","isZoomedOut","isCurrentView","triggerZoom","prefetchedPages","_configureForZoom","setCurrentItem","_setCurrentItem","getCurrentItem","_getCurrentItem","beginZoom","_beginZoom","positionItem","_positionItem","endZoom","_endZoom","pinching","_id","winControl","_mutationObserver","_MutationObserver","_itemPropertyChange","_insertedItems","_startProperty","_scrolling","_loadingState","_firstTimeDisplayed","_currentScrollPosition","_lastScrollPosition","_notificationHandlers","_headerFooterVisibilityStatus","headerVisible","footerVisible","_viewportWidth","_viewportHeight","_manipulationState","_MSManipulationEvent","MS_MANIPULATION_STATE_STOPPED","_setupInternalTree","_dragSource","_reorderable","_viewChange","_setScrollbarPosition","_createTemplates","_trivialHtmlRenderer","_itemRenderer","_groupHeaderRelease","_itemRelease","_dataSource","list","List","invokeOnly","_mode","_updateItemsAriaRoles","_updateGroupHeadersAriaRoles","_tabManager","_updateItemsManager","_updateLayout","_attachEvents","_runningInit","setOptions","_layoutImpl","layoutObject","pagesToLoad","pagesToLoadThreshold","newValue","groupStatusChanged","_createGroupsContainer","_updateGroupWork","_resetLayout","_pendingLayoutReset","_pendingGroupWork","automaticallyLoadPages","loadingBehavior","newMode","_configureSelectionMode","tap","groupHeaderTapBehavior","swipeBehavior","_cancelAsyncViewWork","itemTemplate","newRenderer","_setRenderer","resetItem","resetGroupHeader","newHeader","_headerContainer","targetEntity","_changeFocusPassively","recalculateItemPosition","_raiseHeaderFooterVisibilityEvent","newFooter","_footerContainer","loadingState","indexOfFirstVisible","_raiseViewLoading","_entityInRange","validated","inRange","_ensureFirstColumnRange","_correctRangeInFirstColumn","indexOfLastVisible","hasFocus","showFocus","setItemFocused","isInTree","drawKeyboardFocus","childFocus","_updateFocusCache","_updater","newSelectionPivot","oldSelectionPivot","oldCurrentItemKeyFetch","zoomableView","_zoomableView","_setDraggable","maxDeferredItemCleanup","elementFromIndex","indexOfElement","entityWidth","headerEnd","_horizontalLayout","headerStart","offsetHeight","loadMorePages","_forceLayoutImpl","forceLayout","viewChange","_resizeViewport","selectionModeClass","hidingSelectionModeClass","_lastScrollPositionValue","_lastDirection","currentDirection","_scrollDirection","_getHeaderOrFooterFromElement","getScrollPosition","_canvasStart","_canvasStartValue","transformX","transformY","isGroupHeaderRenderer","renderer","trivialHtmlRenderer","_renderWithoutReuse","oldElement","templateResult","_isInsertedItem","_countDifference","_updateView","resetCache","_firstItemRange","_firstHeaderRange","_itemMargins","_headerMargins","_canvasMargins","_cachedRTL","functorWrapper","_scrollToPriority","setScrollbarPosition","scrollToPriority","positionFunctor","skipFadeout","_batchingViewUpdates","_batchingViewUpdatesSignal","any","_fadeOutViewport","newCanvas","replaceChild","_deleteWrapper","getTabIndex","TabContainer","_progressBar","newFocusExists","_clearFocusRectangle","_shouldHaveFocus","_itemFocused","_focusRequest","setFocusOnItemImpl","_drawFocusRectangle","listViewHandler","caseSensitive","capture","toLowerCase","modeHandler","currentMode","observerHandler","handlerName","attributesFilter","listOfChanges","elementObservers","_cachedStyleDir","elementObserver","observe","attributes","attributeFilter","events","eventHandler","elementEvents","_onElementResizeBound","_onElementResize","_resizeNotifier","subscribe","_elementResizeInstrument","_inDom","viewportEvents","viewportEvent","_onTabEnter","_onTabExit","statusChanged","_createUpdater","elementInfo","updateDrag","newFocusedItem","_setAriaSelected","removeFromSelection","newDragInfo","firstRange","selectionFirst","lastRange","selectionLast","oldFirstIndex","oldLastIndex","selectionChanged","insertedItem","itemObject","containerStripe","deletesCount","focusedItemRemoved","selectionHandles","updateAffectedRange","newerRange","containerCount","itemsMoved","newFirstIndex","newLastIndex","_update","insertsCount","movesCount","countDifference","_itemsCountPromise","_createItemsManager","ownerElement","versionManager","indexInView","viewCallsReady","profilerId","beginUpdating","updater","hadKeyboardFocus","lastVisible","itemsRemoved","newSelectionItems","previousModifiedElementsHash","_removalHandled","_containerStripe","insertedKeys","newItems","previousIndices","endUpdating","_updateDeleteWrapperSize","sizeProperty","_getViewportSize","_verifyRealizationNeededForChange","skipRealization","totalInViewport","deletesOnly","elementsKeys","_updateJob","noOutstandingNotifications","_createLayoutSite","orientationChanged","_itemFromItemPromise","rendered","headerRecord","_getCanvasMargins","_animationsDisabled","_initializeLayout","layoutSite","_resetLayoutOrientation","resetScrollPosition","minHeight","minWidth","hadPreviousLayout","layoutImpl","LayoutCtor","dragEnabled","newWidth","newHeight","_previousWidth","_previousHeight","_onFocusIn","moveFocusToItem","winItem","focusIndex","_onFocusOut","_onMSManipulationStateChanged","_manipulationEndSignal","currentState","_pendingScroll","_onScroll","_checkScroller","currentScrollPosition","_onPropertyChange","dirChanged","attributeName","newTabIndex","_convertCoordinatesByCanvasMargins","conversionCallback","fix","field","coordinate","canvasMargin","_convertToCanvasCoordinates","scrolling","elementInViewport","elementPosition","elementLength","raiseVisibilityEvent","visibilityEvent","headerInView","footerInView","_scheduledForDispose","selectionMap","parent","progressBar","progressStyle","_fadingProgressBar","_progressIndicatorDelayTimer","fadeOut","_isZoomedOut","_disableEntranceAnimation","_triggerZoom","promisePosition","_getItemOffsetPosition","posCanvas","scrollOffset","_animateItemsForPhoneZoom","rowStaggerDelay","minRow","delayBetweenRows","clearTransform","containersOnScreen","itemRows","itemRow","zoomPromise","_zoomAnimationPromise","animationComplete","positionItemAtIndex","headerSizeProp","layoutSizes","headerSize","startMax","adjustedScrollPosition","scrollAdjustment","groupIndexHint","groupDescription","firstItemDescription","totalHeight","totalWidth","_updateFocusCacheItemRequest","targetItem","_selectFocused","outline","unsubscribe","zombie","isAnimationEnabled","_fadingViewportOut","_waitingEntranceAnimationPromise","eventDetails","_fireAnimationEvent","_firedAnimationEvent","prevented","firstTime","resetViewOpacity","enterContent","animationEvent","delayPromise","expectedListRole","expectedItemRole","listRole","headerRole","revertAriaSelected","singleSelection","changedItems","unselectableItems","preserveItemsBlocks","alreadyCorrectedForCanvasMargins","itemsBlockFrom","itemsBlockTo","_getItemMargins","calculateMargins","_headerFooterMargins","headerMargins","footerMargins","firstHeaderIndex","lastHeaderIndex","propName","containersDelta","createContainer","updateExistingGroupWithBlocks","groupNode","maxContainers","pop","removedContainers","newContainers","addInserted","updateExistingGroup","addNewGroup","prevElement","oldFirstItemIndex","currentFirstItemIndex","firstShifted","currentLast","addedBeforeShift","removedBeforeShift","oldFirstShifted","flatIndexToGroupIndex","containerCountAfterEdits","asyncContainerCreationInProgress","countInsertedInRealizedRange","newTree","newKeyToGroupIndex","oldFirstItem","existingGroupIndex","existingGroup","triggerDispose","createEventProperties","DOMEventMixin","datasourceCountChangedEvent","pageVisibilityChangedEvent","pageSelectedEvent","pageCompletedEvent","_FlipPageManager","isFlipper","control","_isFlipView","flipperPropertyChanged","_pageManager","_updateTabIndex","_flipperDiv","resized","styleEquivalents","leftBufferAmount","itemSelectedEventDelay","badCurrentPage","flipperDiv","panningDiv","panningDivContainer","itemSpacing","environmentSupportsTouch","buttonVisibilityHandler","_visibleElements","_panningDiv","_panningDivContainer","_buttonVisibilityHandler","_currentPage","_itemSpacing","_lastSelectedPage","_lastSelectedElement","_bufferSize","flipPageBufferCount","_cachedSize","_environmentSupportsTouch","_blockTabs","stopImmediatePropagation","_handleManipulationStateChangedBound","_handleManipulationStateChanged","_browserEventEquivalents","initialIndex","isHorizontal","currPage","_panningDivContainerOffsetWidth","_panningDivContainerOffsetHeight","_isHorizontal","_bufferAriaStartMarker","_createFlipPage","pageRoot","pagesToInit","_bufferAriaEndMarker","_prevMarker","setNewItemsManager","curPage","tmpPage","setOrientation","_notificationsEndedSignal","_isOrientationChanging","_getItemStart","containerStyle","overflowX","overflowY","_forEachPage","currStyle","_ensureCentered","indexValid","jumpToIndex","_resetBuffer","_firstItem","setElement","_fetchPreviousItems","_fetchNextItems","_setButtonStates","_itemSettledOn","manager","_navigationAnimationRecord","newCurrentElement","_getElementIndex","resetScrollPos","scrollPosChanged","_hasFocus","_hadFocus","newPos","_getViewportStart","bufferEnd","_lastScrollPos","_getTailOfBuffer","_getHeadOfBuffer","movedPages","_fetchOnePrevious","_fetchOneNext","_checkElementVisibility","_viewportOnItemStart","_timeoutPageSelection","itemRetrieved","real","_changeFlipPage","elementContainers","animatingElements","forceJump","currIndex","distance","tail","elementAtIndex","startAnimatedNavigation","goForward","cancelAnimationCallback","completionCallback","outgoingPage","incomingPage","oldCurrentPage","newCurrentPage","outgoingElement","incomingElement","elementUniqueID","outgoingFlipPage","_createDiscardablePage","incomingFlipPage","zIndex","_setItemStart","_announceElementVisible","outgoing","incoming","endAnimatedNavigation","outgoingRemoved","_restoreAnimatedElement","_setViewportStart","startAnimatedJump","newElement","oldFlipPage","newFlipPage","_itemSize","oldPage","newPage","simulateMouseWheelScroll","_waitingForMouseScroll","wheelingForward","deltaY","deltaX","wheelDelta","targetPage","zoomToContent","contentX","contentY","viewportX","viewportY","_zoomTo","_zoomToDuration","endAnimatedJump","oldCurr","newCurr","animateInsertion","passedCurrent","elementSuccessfullyPlaced","_createAnimationRecord","_getAnimationRecord","pageShifted","lastElementMoved","lastElementMovedUniqueID","reused","_releaseElementIfNotAnimated","successfullyMoved","newVal","_animationRecords","page","animateRemoval","prevMarker","clearNext","_shiftLeft","_shiftRight","_previousItem","_nextItem","getItemSpacing","setItemSpacing","notificationsStarted","_logBuffer","_notificationsStarted","_temporaryKeys","currentPage","nextPage","notificationsEnded","_endNotificationsWork","_ensureBufferConsistency","flipPageFromElement","flipPage","animateOldViewportItemRemoved","removedPage","originalLocation","animationPromises","_deleteFlipPage","animateOldViewportItemMoved","movedPage","newLocation","indexMovedTo","newCurrentIndex","_moveFlipPage","joinAnimationPromises","removedFromChange","location","elementRoot","oldCurrent","oldCurrentRecord","oldNext","oldNextRecord","newCurrRecord","newNextRecord","_insertFlipPage","_setListEnds","disableTouchFeatures","panningContainerStyle","panningContainerPropertiesToClear","propertyName","platformPropertyName","_lastTimeoutRequest","animatedRecord","constructor","_enabledDebug","elementToSave","skipReleases","_insertNewFlipPage","_movePageAhead","setPrevMarker","nextElement","_movePageBehind","showPreviousButton","hidePreviousButton","showNextButton","hideNextButton","delayBoundariesSet","_viewportSize","boundariesSet","_setupSnapPoints","currentElement","refreshBuffer","seenUniqueIDs","seenLocations","animationKeys","startingPoint","nextEl","_elementMap","bufferKeys","prevEl","viewWasReset","_announceElementInvisible","_itemInView","addedToDomForEvent","content","pageDivs","_createPageContainer","root","elementContainer","discardable","discard","parentDiv","pageStyle","flexBox","pageContainer","isReplacement","setFlowAttribute","isEnd","_itemEnd","_viewportEnd","referencePage","pageToPlace","snapInterval","startSnap","currPos","startScroll","endScroll","startNonEmptyPage","endNonEmptyPage","startBoundaryStyle","endBoundaryStyle","discardablePage","originalElement","animation","createDeleteFromListAnimation","execute","createAddToListAnimation","createRepositionAnimation","animationRecord","_PageManager","FlipView","flipViewPropertyChanged","_flipviewDiv","_setupOrientation","navButtonClass","flipViewClass","navButtonLeftClass","navButtonRightClass","navButtonTopClass","navButtonBottomClass","previousButtonLabel","nextButtonLabel","buttonFadeDelay","avoidTrapDelay","leftArrowGlyph","rightArrowGlyph","topArrowGlyph","bottomArrowGlyph","animationMoveDelta","badAxis","noitemsManagerForCount","badItemSpacingAmount","navigationDuringStateChange","panningContainerAriaLabel","itemRenderer","_getItemRenderer","_setOptions","_initializeFlipView","_avoidTrappingTime","_windowWheelHandlerBound","_windowWheelHandler","_globalListener","_resizeHandlerBound","_nextAnimation","_cancelDefaultAnimation","_navigate","_prevAnimation","_getCurrentIndex","_animating","_cancelAnimation","_refreshTimer","_indexAfterRefresh","_jumpingToIndex","clearJumpToIndex","jumpAnimation","_jumpAnimation","_defaultAnimation","_completeJump","_animationsStarted","currElement","newCurrElement","_contentDiv","_completeJumpPending","_axisAsString","_dataSourceAfterRefresh","_refresh","_itemRendererAfterRefresh","spacing","setCustomAnimations","animations","jump","setUpButton","handleShowButtons","_touchInteraction","screenX","_lastMouseX","screenY","_lastMouseY","_mouseInViewport","_fadeInButton","_fadeOutButtons","handlePointerDown","buttons","handlePointerUp","flipViewInitialized","_prevButton","_nextButton","stylesRequiredForFullFeatureMode","allFeaturesSupported","_supportsSnapPoints","accName","_itemsManagerCallback","_itemFromPromise","_elementFromHandle","_fireDatasourceCountChangedEvent","elementReady","knownUpdatesComplete","_hasPrevContent","_fadeOutButton","_hasNextContent","_scrollPosChanged","_resizeHandler","initiallyParented","_addInsertedNotifier","initialTrigger","cancelBubbleIfHandled","originalEvent","wheelWithinFlipper","now","withinAvoidTime","_refreshHandler","_setDatasource","itemTemplateResult","markDisposable","_animatingForward","_goForward","customAnimation","_completeNavigation","_completeNavigationPending","animationName","cancelCallback","_resizing","_animationsFinished","_setCurrentIndex","template","oldItemsManager","initEvent","forceShow","_nextButtonAnimation","_fadeInFromCurrentValue","_prevButtonAnimation","immediately","_buttonFadePromise","_animationTimeAdjustment","incomingPageMove","pageDirection","fadeOutPromise","enterContentPromise","mechanism","shown","_KeyboardBehavior","_createEventProperty","invoked","selectionchanging","selectionchanged","ItemContainer","duplicateConstruction","_draggable","_ClassName","_SingleItemSelectionManager","_setTabIndex","_setAriaRole","selectionDisabled","_setDirectionClass","_captureProxy","_tapBehavior","skipPreventDefaultOnPointerDown","_updateDraggableAttribute","swipeOrientation","oninvoked","onselectionchanging","onselectionchanged","_forceLayout","onMSManipulationStateChanged","_onPointerDown","_onClick","_onPointerUp","_onPointerCancel","_onLostPointerCapture","_onContextMenu","_onMSHoldVisual","_keyboardSeenLast","_onDragStart","_onDragEnd","_onKeyDown","currentTabIndex","fireSelectionChanging","sibling","nextSibling","_usingDefaultItemRole","defaultItemRole","vertical","fireSelectionChanged","BindingTemplate","Repeater","stringifyItem","dataItem","ITEMSLOADED","ITEMCHANGING","ITEMCHANGED","ITEMINSERTING","ITEMINSERTED","ITEMMOVING","ITEMMOVED","ITEMREMOVING","ITEMREMOVED","ITEMSRELOADING","ITEMSRELOADED","asynchronousRender","repeaterReentrancy","_render","_modifying","_dataListeners","itemchanged","_dataItemChangedHandler","iteminserted","_dataItemInsertedHandler","itemmoved","_dataItemMovedHandler","itemremoved","_dataItemRemovedHandler","_dataReloadHandler","inlineTemplate","_extractInlineTemplate","_initializing","_repeatedDOM","_renderAllItems","_data","_removeDataListeners","_addDataListeners","_reloadRepeater","_template","_syncRenderer","onitemsloaded","onitemchanging","onitemchanged","oniteminserting","oniteminserted","onitemmoving","onitemmoved","onitemremoving","onitemremoved","onitemsreloading","onitemsreloaded","templateElement","Template","extractChild","createDocumentFragment","renderedItem","getAt","shouldDisposeElements","_unloadRepeatedDOM","_beginModification","_endModification","eventInfo","affectedElement","movingItem","eventDetail","shallowCopyBefore","affectedElements","shallowCopyAfter","isDeclarativeControlContainer","_Select","DatePicker","newFormatter","pattern","calendar","defaultPattern","dtf","Globalization","DateTimeFormatting","DateTimeFormatter","languages","geographicRegion","clock","formatCacheLookup","pat","yearFormatCache","cal","def","formatter","years","formatYear","datePatterns","order","cache","year","era","format","getDateTime","formatMonth","formatDay","newCal","glob","Calendar","getClock","yearDiff","yearCount","addYears","DEFAULT_DAY_PATTERN","DEFAULT_MONTH_PATTERN","DEFAULT_YEAR_PATTERN","ariaLabel","selectDay","selectMonth","selectYear","_currentDate","Date","_minYear","getFullYear","_maxYear","_datePatterns","date","month","_init","_information","_calendar","_disabled","_dateElement","_dateControl","_monthElement","_monthControl","_yearElement","_yearControl","_addAccessibilityAttributes","_domElement","_addControlsInOrder","orderIndex","s","_createControlElements","_createControls","getIndex","forceLanguage","isRTL","disabled","months","dates","_wireupEvents","_setElement","d","maxYear","minYear","getMonth","getDate","newDate","parse","setHours","oldDate","_updateDisplay","setDisabled","datePattern","_updateInformation","getLength","monthPattern","setFullYear","getInformation","yearPattern","_getInformationWinRT","startDate","endDate","clamp","minDateTime","maxDateTime","tempCal","monthCal","dayCal","setToMin","setToMax","hour","setDateTime","yearLen","dateformat","localdatepattern","patterns","charCodeAt","indexes","yearSource","getValue","monthSource","yearIndex","numberOfMonthsInThisYear","firstMonthInThisYear","addMonths","dateSource","monthIndex","day","firstDayInThisMonth","numberOfDaysInThisMonth","addDays","resolvedLanguage","lastDate","lastCal","guessMonth","lastMonthInThisYear","guessDay","curDate","cur","dateIndex","_getInformationJS","getMonthNumber","maxValue","getDateNumber","TimePicker","DEFAULT_MINUTE_PATTERN","DEFAULT_HOUR_PATTERN","DEFAULT_PERIOD_PATTERN","selectHour","selectMinute","selectAMPM","areTimesEqual","date1","date2","getHours","getMinutes","_currentTime","_sentinelDate","_timePatterns","minute","period","_clock","_hourElement","_hourControl","_minuteElement","_minuteControl","_ampmElement","_ampmControl","_minuteIncrement","time","setMinutes","_getMinutesIndex","minuteIncrement","setSeconds","setMilliseconds","newTime","setTime","toDateString","oldTime","hourPattern","_getHoursAmpm","hours24","hours","ampm","_getHoursIndex","minutePattern","periodPattern","hoursAmpm","_getInfoHours","minutes","periods","_updateValues","fixupHour","timePatterns","getCalendarSystem","computedClock","numberOfHours","numberOfHoursInThisPeriod","periodFormatter","am","pm","minuteFormatter","hourFormatter","hourMinuteFormatter","ApplicationLanguages","Navigation","navigationBackButtonClass","glyphClass","MOUSE_BACK_BUTTON","singleton","hookUpBackButtonGlobalEventHandlers","backButtonGlobalKeyUpHandler","backButtonGlobalMSPointerUpHandler","unHookBackButtonGlobalEventHandlers","browserBack","back","backButtonReferenceCount","addRef","BackButton","badButtonElement","_initializeButton","_buttonClickHandler","_handleBackButtonClick","_navigatedHandler","_handleNavigatedEvent","canGoBack","_getReferenceCount","Tooltip","isInvokeEvent","eventType","EVENTS_INVOKE","isDismissEvent","EVENTS_DISMISS","lastCloseTime","DEFAULT_PLACEMENT","DELAY_INITIAL_TOUCH_SHORT","DELAY_INITIAL_TOUCH_LONG","DEFAULT_MOUSE_HOVER_TIME","DEFAULT_MESSAGE_DURATION","DELAY_RESHOW_NONINFOTIP_TOUCH","DELAY_RESHOW_NONINFOTIP_NONTOUCH","DELAY_RESHOW_INFOTIP_TOUCH","DELAY_RESHOW_INFOTIP_NONTOUCH","RESHOW_THRESHOLD","HIDE_DELAY_MAX","OFFSET_KEYBOARD","OFFSET_MOUSE","OFFSET_TOUCH","OFFSET_PROGRAMMATIC_TOUCH","OFFSET_PROGRAMMATIC_NONTOUCH","SAFETY_NET_GAP","PT_MOUSE","MSPOINTER_TYPE_MOUSE","keyup","pointerover","pointerdown","EVENTS_UPDATE","pointermove","keydown","focusout","pointerout","pointercancel","pointerup","EVENTS_BY_CHILD","msTooltip","msTooltipPhantom","mouseHoverTime","nonInfoTooltipNonTouchShowDelay","infoTooltipNonTouchShowDelay","messageDuration","isLeftHanded","hasInitWinRTSettings","anchorElement","tooltip","uiSettings","handedness","handPreference","HandPreference","leftHanded","_placement","_infotip","_innerHTML","_contentElement","_extraClass","_lastContentType","_anchorElement","_phantomDiv","_triggerByOpen","_eventListenerRemoveStack","_lastKeyOrBlurEvent","_currentKeyOrBlurEvent","title","removeAttribute","_events","_onDismiss","_position","contentElement","placement","infotip","extraClass","onbeforeopen","onopened","onbeforeclose","onclosed","eventCallBack","open","_onInvoke","close","_cleanUpDOM","_createTooltipDOM","elemStyle","writingMode","_raiseEvent","customEvent","_captureLastKeyBlurOrPointerOverEvent","_registerEventToListener","_handleEvent","_normalizedType","eventWithinElement","_isShown","_showTrigger","_skipMouseOver","substring","_contactPoint","eventTrigger","_onShowAnimationEnd","_shouldDismiss","_hideDelay","_hideDelayTimer","_setTimeout","_onHideAnimationEnd","_removeTooltip","getTime","_decideOnDelay","_useAnimation","curTime","_getAnchorPositionFromElementWindowCoord","_getAnchorPositionFromPointerWindowCoord","contactPoint","_canPositionOnSide","anchor","tip","availWidth","availHeight","_offset","_positionOnSide","contactType","clientWidth","clientHeight","fallback_order","_showTooltip","hide","_clearTimeout","_delayTimer","_DELAY_INITIAL_TOUCH_SHORT","_DELAY_INITIAL_TOUCH_LONG","_DEFAULT_MOUSE_HOVER_TIME","_DEFAULT_MESSAGE_DURATION","_DELAY_RESHOW_NONINFOTIP_TOUCH","_DELAY_RESHOW_NONINFOTIP_NONTOUCH","_DELAY_RESHOW_INFOTIP_TOUCH","_DELAY_RESHOW_INFOTIP_NONTOUCH","_RESHOW_THRESHOLD","_HIDE_DELAY_MAX","Rating","averageRating","clearYourRating","tentativeRating","tooltipStringsIsInvalid","unrated","userRating","DEFAULT_MAX_RATING","DEFAULT_DISABLED","CANCEL","CHANGE","PREVIEW_CHANGE","MOUSE_LBUTTON","PT_PEN","MSPOINTER_TYPE_PEN","hiddenAverageRatingCss","msRating","msRatingEmpty","msRatingAverageEmpty","msRatingAverageFull","msRatingUserEmpty","msRatingUserFull","msRatingTentativeEmpty","msRatingTentativeFull","msRatingDisabled","msAverage","msUser","_userRating","_averageRating","_enableClear","_tooltipStrings","_controlUpdateNeeded","_setControlSize","maxRating","tooltipStrings","_updateTooltips","_maxRating","_updateControl","_averageRatingElement","_ensureAverageMSStarRating","_clearTooltips","enableClear","_setAriaValueMin","_updateAccessibilityRestState","oncancel","onchange","onpreviewchange","_toolTips","updateNeeded","_lastEventWasChange","_lastEventWasCancel","_tentativeRating","_captured","_pointerDownFocus","_elements","_clearElement","_elementWidth","_elementPadding","_elementBorder","_floatingValue","_createControl","_setAccessibilityProperties","_hideAverageRating","_averageRatingHidden","html","oneStar","msStarRating","_getText","number","string","tempDiv","_ariaValueNowMutationObserver","disconnect","_updateAccessibilityHoverState","_ensureTooltips","_decrementRating","_closeTooltip","firePreviewChange","_showTentativeRating","ratingHandler","lowerCaseName","eventsRegisteredInLowerCase","_ariaValueNowChanged","_onWinJSNodeInserted","_recalculateStarProperties","paddingRight","borderRight","_hideAverageStar","_resetAverageStar","_incrementRating","attrNode","getAttributeNode","nodeValue","_showCurrentRating","_pointerDownAt","_setStarClasses","_openTooltip","_onCapturedPointerMove","tooltipType","star","pointerAt","hit","_elementsFromPoint","starNum","newTentativeRating","_onPointerMove","_onPointerOver","_onUserRatingChanged","rtlString","num0","num9","numPad0","numPad9","_onPointerOut","_resetNextElement","prevState","_setFlexStyle","grow","shrink","backgroundPosition","backgroundSize","_resizeStringValue","factor","curString","parseFloat","unit","classNameBeforeThreshold","threshold","classNameAfterThreshold","_updateAverageStar","nextStyle","_appendClass","classNameToBeAdded","_setClasses","elementStyle","listSelectPress","ToggleSwitch","classContainer","classHeader","classClick","classTrack","classThumb","classValues","classValue","classValueOn","classValueOff","classDescription","classOn","classOff","classDisabled","classEnabled","classDragging","classPressed","on","off","Toggle","_headerElement","_clickElement","_trackElement","_thumbElement","_labelsElement","_labelOnElement","_labelOffElement","_descriptionElement","_keyDownHandler","_pointerDownHandler","_pointerCancelHandler","_boundPointerMove","_pointerMoveHandler","_boundPointerUp","_pointerUpHandler","_ariaChangedHandler","_dragX","checked","labelOn","labelOff","_checked","_mousedown","_dragXStart","pageX","_resetPressedState","trackRect","thumbRect","maxX","localMouseX","ControlProcessor","_ElementListUtilities","SemanticZoom","identity","buildTransition","_libraryDelay","outgoingElementTransition","outgoingScaleTransitionDuration","outgoingOpacityTransitionDuration","incomingElementTransition","incomingScaleTransitionDuration","incomingOpacityTransitionDuration","bounceInTransition","bounceInDuration","easeOutBezier","bounceBackTransition","bounceBackDuration","scaleElement","scale","onSemanticZoomPropertyChanged","_onPropertyChanged","invalidZoomFactor","sezoButtonClass","sezoButtonLocationClass","sezoButtonShowDuration","sezoButtonMouseMoveThreshold","semanticZoomClass","zoomedInElementClass","zoomedOutElementClass","zoomChangedEvent","bounceFactor","defaultZoomFactor","maxZoomFactor","minZoomFactor","canvasSizeMax","zoomAnimationDuration","zoomAnimationTTFFBuffer","pinchDistanceCount","zoomOutGestureDistanceChangeFactor","zoomInGestureDistanceChangeFactor","zoomAnimationTimeout","eventTimeoutDelay","PinchDirection","zoomedIn","zoomedOut","origin","_zoomedOut","initiallyZoomedOut","_enableButton","enableButton","_zoomFactor","zoomFactor","zoomedInItem","zoomedOutItem","_locked","_zoomInProgress","_isBouncingIn","_isBouncing","_aligning","_gesturing","_gestureEnding","_buttonShown","_shouldFakeTouchCancel","_initialize","_configure","_onResizeBound","_onResize","_onWheel","_onMouseWheel","_hiddenElement","_onGotPointerCapture","_canvasIn","_onCanvasTransitionEnd","_canvasOut","_onMSContentZoom","_resetPointerRecords","_onResizeImpl","_setVisibility","_createSemanticZoomButton","_removeSemanticZoomButton","_zoom","_sezoClientWidth","_sezoClientHeight","oldValue","_hideSemanticZoomButton","_displayButton","_zoomedInItem","_zoomedOutItem","_elementIn","_elementOut","_completeZoomTimer","_TTFFTimer","processAll","_viewIn","_viewOut","_cropViewport","_viewportIn","_opticalViewportIn","_viewportOut","_opticalViewportOut","_setLayout","_setupOpticalViewport","_sezoButton","_onSeZoButtonZoomOutClick","_onSeZoChildrenScroll","_onPenHover","axisIn","axisOut","_pansHorizontallyIn","_pansVerticallyIn","_pansHorizontallyOut","_pansVerticallyOut","pagesToPrefetchIn","pagesToPrefetchOut","_zoomFromCurrent","_pinchGesture","_canvasLeftIn","_canvasTopIn","_canvasLeftOut","_canvasTopOut","styleViewportIn","styleViewportOut","styleCanvasIn","styleCanvasOut","positionElement","sezoComputedStyle","computedWidth","computedHeight","sezoPaddingLeft","sezoPaddingRight","sezoPaddingTop","sezoPaddingBottom","viewportWidth","viewportHeight","scaleFactor","multiplierIn","canvasInWidth","canvasInHeight","multiplierOut","canvasOutWidth","canvasOutHeight","_onMouseMove","isHoverable","_dismissButtonTimer","_showSemanticZoomButton","_getPointerLocation","equal","subtract","dash","_createPointerRecord","fireCancelOnPinch","newRecord","startX","currentX","startY","currentY","_pointerRecords","_pointerCount","_deletePointerRecord","_fakeCancelOnPointer","touchEvent","initUIEvent","touches","targetTouches","changedTouches","_currentTouch","_fakedBySemanticZoom","_handlePointerDown","contactKeys","_handleFirstPointerDown","_startedZoomedOut","endX","endY","sqrt","midpoint","point1","point2","pointerRecord","_currentMidPoint","contactDistance","processPinchGesture","zoomingOut","pinchDirection","gestureReversed","_pinchedDirection","_zoomingOut","canZoomInGesturedDirection","_playBounce","deltaFromStart","_lastPinchDistance","_lastPinchStartDistance","deltaFromLast","_lastLastPinchDistance","_updatePinchDistanceRecords","_pinchDistanceCount","_lastPinchDirection","_resetPinchDistanceRecords","_completePointerUp","_completeZoomingIfTimeout","msContentZoomFactor","zoomingIn","updatePinchDirection","zoomOut","zoomCenter","gesture","centerOnCurrent","skipAlignment","promiseIn","promiseOut","beginZoomPromises","_prepareForZoom","completedCurrentItem","customViewAnimationPromise","setZoomCenters","adjustmentIn","adjustmentOut","centerX","centerY","_alignViewsPromise","_alignViews","_completeZoom","multiplier","positionIn","positionOut","item2","_onZoomAnimationComplete","setTimeoutAfterTTFF","_onBounceAnimationComplete","timer","_attemptRecordReset","zoomChanged","_isActive","setVisibility","isVisible","_recordResetPromise","sezoBox","sezoBorderLeft","beginBounce","_bounceCenter","_aligned","targetElement","adjustmentX","adjustmentY","_ClassNames","pivot","pivotCustomHeaders","pivotLocked","pivotTitle","pivotHeaderArea","pivotHeaderLeftCustom","pivotHeaderRightCustom","pivotHeaderItems","pivotHeaders","pivotHeader","pivotHeaderSelected","pivotViewport","pivotSurface","pivotNoSnap","pivotNavButton","pivotNavButtonPrev","pivotNavButtonNext","pivotShowNavButtons","pivotInputTypeMouse","pivotInputTypeTouch","pivotDisableContentSwipeNavigation","PivotItem","pivotItem","pivotItemContent","elementToMove","_processors","_parentPivot","_headersState","handleHeaderChanged","el","_process","schedulePromiseAboveNormal","_processed","reduce","processor","markSupportedForProcessing","__extends","__","p","pivotDefaultHeaderTemplate","createTextNode","_EventNames","itemAnimationStart","itemAnimationEnd","duplicateItem","invalidContent","pivotAriaLabel","pivotViewportAriaLabel","supportsSnap","Keys","_headerSlideAnimationDuration","_invalidMeasurement","Pivot","_firstLoad","_hidePivotItemAnimation","_loadPromise","_pendingRefresh","_selectedIndex","_showPivotItemAnimation","_slideHeadersAnimation","_handleItemChanged","_handleItemInserted","_handleItemMoved","_handleItemRemoved","_handleItemReload","_updatePointerType","_titleElement","_headerAreaElement","_headerItemsElement","_headerItemsElWidth","_headersContainerElement","_headersKeyDown","_showNavButtons","_hideNavButtons","_elementClickedHandler","_winKeyboard","_WinKeyboard","_customLeftHeader","_customRightHeader","_viewportElement","_viewportElWidth","_surfaceElement","HeaderStateBase","_MSManipulationStateChangedHandler","_elementPointerDownHandler","_elementPointerUpHandler","_parse","_shallowCopy","_pendingItems","_loadItem","selectedIndex","_updateEvents","exit","_applyProperties","attachItems","refreshHeadersState","_recenterViewport","pivotItems","pivotItemEl","nextItemEl","oldViewportWidth","_getViewportWidth","oldHeaderItemsWidth","_getHeaderItemsWidth","_invalidateMeasures","handleResize","_activateHeader","activateHeader","_setActiveFirstFocusableElement","selectedItem","_goNext","_goPrevious","_animateToPrevious","goPrev","skipAnimation","thisLoadPromise","_hidePivotItem","selectionChangedDetail","_fireEvent","handleNavigation","_showPivotItem","_getDirectionAccessor","canBubble","cancelable","oldItems","render","_navigationHandled","src","hitSrcElement","hitTargets","_elementPointerDownPoint","inHeaders","filterDistance","dyDxThresholdRatio","dy","dx","thresholdY","doSwipeDetection","_supportsTouchDetection","dt","pow","vwDiv4","relatedTarget","goPrevious","MS_MANIPULATION_STATE_INERTIA","_pointerType","filterOnScreen","elementBoundingClientRect","viewportBoundingClientRect","negativeTransform","slideGroup1Els","slideGroup2Els","slideGroup3Els","getCumulativeHeaderWidth","originalLength","leftElement","lastElementChild","rightElement","headerHorizontalMargin","invalidateCache","cachedHeaderWidth","HeaderStateOverflow","HeaderStateStatic","ariaSelectedMutated","headerContainerEl","marginRight","updateHeader","setActiveHeader","newSelectedHeader","focusWasInHeaders","currentSelectedHeader","focus","headersContainerLeadingMargin","_super","_firstRender","_transitionAnimation","selectedHeader","transformProperty","transformValue","l","_blocked","restoreFocus","numberOfHeadersToRender","maxHeaderWidth","indexToRender","textOverflow","lastHeader","lastHeaderFadeInDuration","leadingMargin","firstHeader","leadingSpace","previousSibling","headerCleanup","targetHeader","endPosition","headerAnimation","_Item","HubSection","seeMore","hubSection","hubSectionHeader","hubSectionInteractive","hubSectionHeaderTabStop","hubSectionHeaderWrapper","hubSectionHeaderContent","hubSectionHeaderChevron","_headerTabStopElement","_headerWrapperElement","_headerContentElement","_headerChevronElement","hubSectionContent","isHeaderStatic","_isHeaderStatic","_renderHeader","_setHeaderTemplate","section","_Section","Hub","hubDefaultHeaderTemplate","contentAnimating","headerInvoked","loadingStateChanged","progressDelay","verticalNames","scrollPos","scrollSize","offsetPos","offsetSize","oppositeOffsetSize","marginStart","marginEnd","borderStart","borderEnd","paddingStart","paddingEnd","rtlHorizontalNames","ltrHorizontalNames","_windowKeyDownHandlerBound","_windowKeyDownHandler","hub","hubViewport","hubViewportAriaLabel","hubSurface","_visible","Orientation","hubHorizontal","_fireEntrance","_animateEntrance","_loadId","runningAnimations","_currentIndexForSezo","_focusin","_clickHandler","_scrollHandler","_handleSectionChangedBind","_handleSectionChanged","_handleSectionInsertedBind","_handleSectionInserted","_handleSectionMovedBind","_handleSectionMoved","_handleSectionRemovedBind","_handleSectionRemoved","_handleSectionReloadBind","_handleSectionReload","_measured","_names","hubVertical","_updateSnapList","sections","_pendingSections","_sections","headerTemplate","_pendingHeaderTemplate","_headerTemplate","_pendingScrollLocation","_measure","_scrollPosition","_pendingSectionOnScreen","targetScrollPos","sectionOnScreen","_sectionSizes","sectionSize","_startSpacer","_scrollToSection","onheaderinvoked","onloadingstatechanged","oncontentanimating","LoadingState","loading","_refreshImpl","fadeOutAnimation","animateTransition","_EventName","AnimationType","needsToLoadSections","_assignHeaderTemplate","_attachSections","_loadSections","newSection","oldSection","duplicateSection","_animation","_createUpdateListAnimation","insertAnimation","oldSections","newSections","_loadSection","loadNextSectionAfterPromise","loadNextSection","loadId","sectionIndicesToLoad","loadedPromise","allSectionsLoadedSignal","onScreenItemsAnimatedPromise","allSectionsLoadedPromise","_showProgressPromise","hubProgress","synchronousProcessPromises","onScreenSectionsLoadedPromise","onmousewheel","_moveFocusIn","hubSections","hubSectionEl","nextSectionEl","_findHeaderTabStop","_matchesSelector","headerTabStopElement","sectionIndex","_pendingScrollHandler","_viewportOppositeSize","surfaceElementComputedStyle","_endSpacer","computedSectionStyle","snapList","snapListY","snapListX","_lastSnapPointY","_lastSnapPointX","withAnimation","scrollPositionToShowStartMargin","_scrollTo","_ensureVisible","_ensureVisibleMath","scrollPositionToShowEndMargin","_tabSeenLast","sectionElement","indexToFocus","_sectionToFocus","focusAttempt","_trySetActive","_hasCursorKeysBehaviors","leftKey","rightKey","targetSectionIndex","currentSection","useEnsureVisible","_tryFocus","maxScrollPos","targetSection","offsetFromViewport","targetScrollPosition","_hub","Application","baseZIndex","Strings","closeOverlay","_clickEater","LightDismissalReasons","lostFocus","hardwareBackButton","windowResize","windowBlur","DismissalPolicies","light","reason","modal","sticky","KeyboardInfoType","keyDown","keyUp","keyPress","AbstractDismissableElement","args","onLightDismiss","onTakeFocus","onShouldLightDismiss","_ldeOnKeyDownBound","_ldeOnKeyDown","_ldeOnKeyUpBound","_ldeOnKeyUp","_ldeOnKeyPressBound","_ldeOnKeyPress","containsElement","_ldeCurrentFocus","useSetActive","_tryFocusOnAnyElement","_ldeService","setZIndex","getZIndexCount","_focusFirstFocusableElement","onFocus","onShow","service","onHide","onKeyInStack","LightDismissableElement","ModalElement","LightDismissableBody","LightDismissService","_debug","_clients","_notifying","_bodyClient","_updateDom_rendered","serviceActive","_clickEaterEl","_createClickEater","_onBeforeRequestingFocusOnKeyboardInputBound","_onBeforeRequestingFocusOnKeyboardInput","_onFocusInBound","_onKeyDownBound","_onWindowResizeBound","_onWindowResize","_onClickEaterPointerUpBound","_onClickEaterPointerUp","_onClickEaterPointerCancelBound","_onClickEaterPointerCancel","_onBackClick","_onWindowBlur","client","_updateDom","hidden","updated","_escapePressed","_dispatchKeyboardEvent","isShown","isTopmost","_setDebug","debug","activeDismissableNeedsFocus","zIndexGap","lastUsedZIndex","currentZIndex","activeDismissable","_activeDismissable","keyboardInfoType","propagationStopped","clients","_dispatchLightDismiss","lightDismissInfo","_stop","_doDefault","_clickEaterTapped","doDefault","clickEater","_onClickEaterPointerDown","_onClickEaterClick","_clickEaterPointerId","_registeredClickEaterCleanUp","_resetClickEaterPointerState","_skipClickEaterClick","_service","appBarClass","firstDivClass","finalDivClass","invokeButtonClass","ellipsisClass","primaryCommandsClass","secondaryCommandsClass","commandLayoutClass","menuLayoutClass","topClass","bottomClass","showingClass","shownClass","hidingClass","hiddenClass","compactClass","minimalClass","menuContainerClass","appBarPlacementTop","appBarPlacementBottom","appBarLayoutCustom","appBarLayoutCommands","appBarLayoutMenu","appBarInvokeButtonWidth","typeSeparator","typeContent","typeButton","typeToggle","typeFlyout","appBarCommandClass","appBarCommandGlobalClass","appBarCommandSelectionClass","commandHiddenClass","sectionSelection","sectionGlobal","sectionPrimary","sectionSecondary","menuCommandClass","menuCommandButtonClass","menuCommandToggleClass","menuCommandFlyoutClass","menuCommandFlyoutActivatedClass","menuCommandSeparatorClass","_menuCommandInvokedEvent","menuClass","menuContainsToggleCommandClass","menuContainsFlyoutCommandClass","menuMouseSpacingClass","menuTouchSpacingClass","menuCommandHoverDelay","overlayClass","flyoutClass","flyoutLightClass","settingsFlyoutClass","scrollsClass","pinToRightEdge","pinToBottomEdge","separatorWidth","buttonWidth","narrowClass","wideClass","_visualViewportClass","commandPropertyMutated","commandVisibilityChanged","_BaseCoreUtils","visualViewportClass","scrollTimeout","_KeyboardInfo","InputPane","getForCurrentView","occludedRect","_extraOccluded","occluded","_isResized","heightRatio","innerHeight","widthRatio","innerWidth","_visibleDocBottom","_visibleDocTop","_visibleDocHeight","_visualViewportHeight","_visibleDocBottomOffset","boundingRect","_visualViewportSpace","_visualViewportWidth","visualViewportSpace","_animationShowLength","hasWinRT","Core","AnimationMetrics","animationDescription","AnimationDescription","AnimationEffect","showPanel","AnimationEffectTarget","primary","animationDuration","animationDelay","_scrollTimeout","_layoutViewportCoords","topOffset","pageYOffset","bottomOffset","visibleDocTop","visibleDocBottom","_Overlay","_allOverlaysCallback","nameOfFunctionCall","stopImmediatePropagationWhenHandled","overlay","_resolveElements","realElements","getElementById","_GlobalListener","_currentState","states","_inputPaneShowing","_inputPaneHiding","_documentScroll","_windowResized","_toggleListeners","profilerString","newState","listenerOperation","inputPane","mustContainCommands","_baseOverlayConstructor","hasAttribute","_sticky","_doNext","unselectable","_currentAnimateIn","_baseAnimateIn","_currentAnimateOut","_baseAnimateOut","_animationPromise","_queuedToShow","_queuedToHide","_queuedCommandAnimation","_globalEventListeners","_show","_baseShow","_hide","_baseHide","winAnimating","currentlyHidden","show","_needToHandleHidingKeyboard","_showAndHideFast","_beforeShow","_sendEvent","beforeShow","_ensurePosition","_baseEndShow","afterShow","_checkDoNext","beforeHide","_baseEndHide","_beforeEndHide","_afterHide","afterHide","_showAndHideQueue","_showCommands","commands","immediate","showHide","_resolveCommands","_showAndHideCommands","_hideCommands","_showOnlyCommands","others","showCommands","hideCommands","_removeFromQueue","_updateAnimateQueue","queue","countQ","addCommands","toQueue","fromQueue","command","_commandsUpdated","siblings","_findSiblings","commandsAnimationPromise","_baseBeginAnimateCommands","_baseEndAnimateCommands","_beginAnimateCommands","_getVisibleCommands","showAnimated","hideAnimated","rectangle","marginTop","newPromise","commandSubSet","visibleCommands","_endAnimateCommands","countAll","countIn","allCommands","found","_baseResize","_resize","_hideOrDismiss","_dismiss","_checkScrollPosition","_showingKeyboard","_hidingKeyboard","_verifyCommandsOnly","_focusOnLastFocusableElementOrThis","_focusOnLastFocusableElement","oldFirstTabIndex","oldLastTabIndex","tabResult","_focusLastFocusableElement","_trySelect","_focusOnFirstFocusableElementOrThis","_focusOnFirstFocusableElement","scroller","_isFlyoutVisible","flyouts","flyoutControl","select","_sizeOfDocument","_getParentControlUsingClassName","_hideAppBars","bars","keyboardInvoked","allBarsAnimationPromises","_showAppBars","_keyboardInfo","commonstrings","cannotChangeCommandsWhenVisible","cannotChangeHiddenProperty","_LightDismissService","Flyout","measureElement","noAnchor","badPlacement","badAlignment","noCoordinates","_LightDismissableLayer","_onLightDismiss","_currentlyFocusedClient","_focusable","_activateTopFocusableClientIfNeeded","hiding","_clientForElement","_focusableClientForElement","_getTopmostFocusableClient","topClient","_CascadeManager","_dismissableLayer","collapseFlyout","collapseAll","_cascadingStack","_handleKeyDownInCascade_bound","_handleKeyDownInCascade","_inputType","appendFlyout","flyoutToAdd","reentrancyLock","collapseFn","_positionRequest","PositionRequests","AnchorPositioning","indexOfParentFlyout","flyout","subFlyout","flyoutShown","_dismissable","flyoutHiding","flyoutHidden","headFlyout","indexOfAssociatedFlyout","currentFlyout","handleFocusIntoFlyout","inputType","_lastInputType","dismissableLayer","alt","F10","AnimationOffsets","keyframe","alignment","getTopLeft","flyoutMeasurements","isRtl","configureVerticalWithScroll","anchorBorderBox","topHasMoreRoom","nextContentHeight","spaceAbove","verticalMarginBorderPadding","nextTop","nextAnimOffset","spaceBelow","doesScroll","fitsVerticallyWithCenteredAnchor","fitTop","bottomConstraint","fitBottom","topConstraint","fitLeft","leftConstraint","nextLeft","fitRight","rightConstraint","centerVertically","alignHorizontally","currentAlignment","horizontalOverlap","beginRight","beginLeft","animOffset","CoordinatePositioning","currentCoordinates","widthOfBorderBox","adjustForRTL","_baseFlyoutConstructor","_elms","getElementsByTagName","firstDiv","_addFirstDiv","_getLowestTabIndexInList","finalDiv","_addFinalDiv","_getHighestTabIndexInList","_handleKeyDown","_lastMaxHeight","_alignment","visibilty","role","_flyoutAnimateIn","_flyoutAnimateOut","_handleFocusIn","_anchor","onbeforeshow","onaftershow","onbeforehide","onafterhide","_cascadeManager","_baseFlyoutShow","showAt","_lightDismiss","_keyboardMovedUs","_clearAdjustedStyles","_setAlignment","_currentPosition","_checkKeyboardFit","_adjustForKeyboard","ensuredFocusedElementInView","keyboardMovedUs","adjustedMarginBoxHeight","showing","showPopup","hidePopup","_hideAllOtherFlyouts","thisFlyout","metaKey","controlCssClass","disposableCssClass","tabStopClass","contentClass","actionAreaCssClass","actionAreaContainerCssClass","overflowButtonCssClass","spacerCssClass","ellipsisCssClass","overflowAreaCssClass","overflowAreaContainerCssClass","contentFlyoutCssClass","menuCssClass","insetOutlineClass","openingClass","openedClass","closingClass","closedClass","noneClass","fullClass","overflowTopClass","overflowBottomClass","commandPrimaryOverflownPolicyClass","commandSecondaryOverflownPolicyClass","commandSeparatorHiddenPolicyClass","beforeOpen","afterOpen","beforeClose","afterClose","actionAreaCommandWidth","actionAreaSeparatorWidth","actionAreaOverflowButtonWidth","overflowCommandHeight","overflowSeparatorHeight","controlMinWidth","overflowAreaMaxWidth","heightOfMinimal","heightOfCompact","contentMenuCommandDefaultLabel","defaultClosedDisplayMode","defaultOpened","defaultOverflowDirection","commandSelector","primaryCommandSection","secondaryCommandSection","_CommandingSurfaceConstants","emptytoolbarCssClass","placeHolderCssClass","OverflowDirection","glyphs","icons","fixedIcons","_Icon","AppBarCommand","_handleClick","_type","_flyout","makeObservable","_value","proto","originalDesc","getPropertyDescriptor","getter","setter","_propertyMutations","obj","desc","getOwnPropertyDescriptor","getPrototypeOf","PropertyMutations","_observer","_merge","unbind","badClick","badDivElement","badHrElement","badPriority","_createContent","_createSeparator","_createButton","ObservablePropertyWhiteList","_label","_labelSpan","_tooltipControl","_tooltip","_icon","_imageSpan","backgroundImage","msHighContrastAdjust","_onclick","_formatString","_priority","_section","ApplicationModel","DesignMode","designModeEnabled","_setSection","wasHidden","firstElementFocus","_firstElementFocus","_lastElementFocus","_updateTabStop","lastElementFocus","_iconSpan","_isFocusable","Command","MenuCommand","_deactivateFlyoutCommand","menuControl","_menuCommandLiner","_toggleSpan","_flyoutSpan","_invoke","_activateFlyoutCommand","menuCommand","_MenuCommandBase","_MenuCommand","beforeInvoke","_beforeInvoke","cancelablePromise","_","interruptible","object","workFn","workStoredSignal","cancelInterruptibles","workPromise","_openCloseStateSettled","OpenCloseMachine","_control","_initializedSignal","States","Init","exitInit","updateDom","opened","Disposed","NewState","arg0","machine","eventElement","_fireBeforeOpen","_fireBeforeClose","updateDomImpl","onUpdateDom","onUpdateDomWithIsOpened","_opened","Opened","Closed","openIsPending","BeforeOpen","shouldOpen","Opening","_closeIsPending","onOpen","closeIsPending","BeforeClose","shouldClose","Closing","_openIsPending","onClose","_Command","_CommandingSurfaceMenuCommand","_Flyout","_OpenCloseMachine","diffElements","lhs","rhs","commandElement","intersectElements","arr1","arr2","overflowButtonAriaLabel","badData","overflowDirectionClassMap","ClosedDisplayMode","minimal","compact","full","closedDisplayModeClassMap","_CommandingSurface","_hoverable","_dataChangedEvents","_updateDomImpl","_renderedState","closedDisplayMode","isOpenedMode","overflowDirection","overflowAlignmentOffset","_renderDisplayMode","dom","_dom","_isOpenedMode","overflowButton","firstTabStop","finalTabStop","_overflowAlignmentOffset","offsetProperty","offsetTextValue","overflowAreaContainer","CommandLayoutPipeline","newDataStage","measuringStage","layoutStage","_currentLayoutStage","_updateCommands","currentStage","prevStage","okToProceed","_processNewData","_layoutCommands","_layoutCompleteCallback","_minimalLayout","renderedState","update","dataDirty","measurementsDirty","layoutDirty","_getDataFromDOMElements","_initializeDom","_machine","openCloseMachine","synchronousOpen","synchronousClose","isOpened","_primaryCommands","_secondaryCommands","_refreshBound","_refreshPending","_menuCommandProjections","_focusLastFocusableElementOrThis","_focusFirstFocusableElementOrThis","_dataUpdated","_closedDisplayMode","isChangingState","_overflowDirection","_contentFlyout","getBoundingRects","commandingSurface","overflowArea","getCommandById","showOnlyCommands","takeFocus","deferredDomUpate","createOpenAnimation","closedHeight","boundingRects","_commandingSurfaceOpenAnimation","actionAreaClipper","actionAreaContainer","actionArea","overflowAreaClipper","oldHeight","overflowAreaHeight","menuPositionedAbove","_clearAnimation","createCloseAnimation","openedHeight","overflowAreaOpenedHeight","_commandingSurfaceCloseAnimation","actionAreaInsetOutline","actionAreaSpacer","overflowInsetOutline","overflowAreaSpacer","_getFocusableElementsInfo","focusableCommandsInfo","elementsInReach","_isElementFocusable","_batchDataUpdates","updateFn","focusable","_hasAnyHiddenClasses","_clearHiddenPolicyClasses","_hasHiddenPolicyClasses","_isCommandInActionArea","_getLastElementFocus","_getFirstElementFocus","targetCommand","focusableElementsInfo","childrenLength","_canMeasure","currentActionAreaWidth","_getPreciseContentWidth","_cachedMeasurements","actionAreaContentBoxWidth","_computeAdjustedOverflowAreaOffset","boundingClientRects","viewportRight","rightOffsetFromViewport","leftOffsetFromViewport","_getDataChangeInfo","deleted","unchanged","prevVisible","prevElements","nextVisible","nextElements","nextOverflown","nextHiding","nextShowing","overflown","changeInfo","updateCommandAnimation","deletedElement","addedElement","originalDisplayStyle","overflowButtonWidth","_getPreciseTotalWidth","standardCommandWidth","contentCommandWidths","_commandUniqueId","visibleSecondaryCommands","visiblePrimaryCommands","visiblePrimaryCommandsForActionArea","visiblePrimaryCommandsForOverflowArea","hasVisibleSecondaryCommand","primaryCommandsLocation","_getVisiblePrimaryCommandsLocation","commandsForActionArea","commandsForOverflowArea","_hideSeparatorsIfNeeded","isCustomContent","hasCustomContent","_contentFlyoutInterior","_reparentChildren","_chosenCommand","hasToggleCommands","menuCommandProjections","_projectAsMenuCommand","separator","needsOverflowButton","_needsOverflowButton","_getVisiblePrimaryCommandsInfo","visibleCommandsInfo","currentAssignedPriority","_getCommandWidth","isThereAVisibleSecondaryCommand","sortedCommandsInfo","commandInfo1","commandInfo2","maxPriority","currentAvailableWidth","overflowButtonAlreadyNeeded","additionalSpaceNeeded","commandInfo","hasVisibleCommandsInActionArea","hasVisibleCommandsInOverflowArea","_hasExpandableActionArea","isCommandVisible","hasVisibleCommand","originalCommand","prevType","commandsLength","transformScriptName","ToolBar","_updateDomImpl_renderedState","prevInlineWidth","stateMachine","openAnimation","_commandingSurface","_getClosedHeight","_synchronousOpen","closeAnimation","_synchronousClose","_handleShowingKeyboardBound","_handleShowingKeyboard","_inputPaneListener","_cachedClosedHeight","commandingSurfaceEl","initialized","placeHolder","_updateDomImpl_renderOpened","_updateDomImpl_renderClosed","wasOpen","closedBorderBox","closedContentWidth","closedContentHeight","_getPreciseContentHeight","closedStyle","closedPaddingTop","_convertToPrecisePixels","closedBorderTop","borderTopWidth","closedMargins","_getPreciseMargins","closedContentBoxTop","closedContentBoxBottom","placeHolderStyle","_maintainFocus","topOfViewport","bottomOfViewport","distanceFromTop","distanceFromBottom","_ToolBarConstants","_AppBarBaseLayout","baseType","nullCommand","appBarEl","connect","_className","commandsInOrder","commandElements","sanitizeCommand","disposeChildren","appBarFirstDiv","appBarFinalDiv","handleKeyDown","commandsUpdated","beginAnimateCommands","endAnimateCommands","positionChanging","fromPosition","toPosition","setFocusOnShow","_setFocusToAppBar","_AppBarCommandsLayout","layoutClassName","layoutType","_commandLayoutsInit","_originalCommands","_needToMeasureNewCommands","globalCommandHasFocus","focusableCommands","_getFocusableCommandsInLogicalOrder","newSetOfVisibleCommands","_fullSizeWidthOfLastKnownVisibleCommands","_getWidthOfFullSizeCommands","otherVisibleCommands","_scaleAfterAnimations","changeInWidth","visibleCommandsAfterAnimations","_appBarTotalKnownWidth","_measureContentCommands","accumulatedWidth","separatorsCount","buttonsCount","_fullSizeWidth","secondaryCommands","primaryCommands","getFocusableCommandsHelper","commandsInReach","containsFocus","_scaleHelper","extraPadding","hadHiddenClass","prevAppBarDisplay","prevCommandDisplay","contentElements","_AppBarMenuLayout","transformWithTransition","transition","_animationFactor","transitionProperty","onTransitionEnd","didFinish","timeoutId","growTransition","elementClipper","diff","anchorTrailingEdge","total","translate","dimension","shrinkTransition","clipperTransition","elementTransition","resizeTransition","_tranformNames","_animationCompleteBound","_animationComplete","_positionToolBarBound","_positionToolBar","_displayedCommands","_menu","_toolbarEl","_createToolBar","_getCommandsElements","newDisplayedCommands","_updateData","_initialized","_forceLayoutPending","_animateToolBarEntrance","_animateToolBarExit","_toolbar","hadShownClass","len2","shownDisplayMode","_appbarInvokeButton","_overflowButton","click","heightVisible","_isMinimal","_isBottom","_executeTranslate","_LegacyAppBar","_allManipulationChanged","appbar","_manipulationChanged","EVENTS","knownVisibleHeights","displayModeVisiblePositions","closedDisplayModes","appbarShownState","appbarHiddenState","globalEventsInitialized","requiresCommands","cannotChangePlacementWhenVisible","cannotChangeLayoutWhenVisible","_lastPositionVisited","_invokeButton","commandsUpdatedBound","_setFocusToAppBarBound","wasShown","_disposeChildren","changeVisiblePosition","_changeVisiblePosition","currentlyOpen","onafteropen","onafterclose","_updateFirstAndFinalDiv","_visiblePixels","_heightWithoutLabels","_visiblePosition","_keyboardObscured","_afterPositionChange","_needToHandleShowingKeyboard","performAnimation","hidingCompletely","_beforeHide","_animatePositionChange","_afterShow","_afterPositionChangeCallBack","appBarElementAnimationPromise","layoutElementsAnimationPromise","beginningVisiblePixelHeight","endingVisiblePixelHeight","fromOffset","showEdgeUI","toOffset","hideEdgeUI","_endAnimateCommandsCallBack","_getTopOfVisualViewport","_getAdjustedBottom","_alreadyInPlace","_scrollHappened","_checkKeyboardTimer","_mayEdgeBackIn","offSet","_computePositionOffset","positionOffSet","elms","highestTabIndex","Menu","isCommandInMenu","_handleCommandInvoked","_handleMouseOver","_handleMouseOut","_addCommand","newCommands","_hoverPromise","_InputTypes","mouse","keyboard","_checkMenuCommands","menuCommands","hasFlyoutCommands","_focusOnPreviousElement","_focusOnNextElement","activatedSiblingCommand","menu","_currentElement","previousElementSibling","CollectionChange","itemInserted","itemRemoved","SearchSuggestionKind","Query","Result","Separator","SuggestionVectorShim","collectionChange","SearchSuggestionCollectionShim","appendQuerySuggestion","appendQuerySuggestions","suggestions","appendResultSuggestion","detailText","imageUrl","imageAlternateText","appendSearchSeparator","SuggestionsRequestedEventArgShim","queryText","language","linguisticDetails","_queryText","_language","_linguisticDetails","_searchSuggestionCollection","searchSuggestionCollection","getDeferral","_deferralSignal","SearchSuggestionManagerShim","_updateVector","_suggestionVector","_history","","searchHistoryContext","searchHistoryEnabled","addToHistory","history","dupeIndex","clearHistory","setLocalContentSuggestionSettings","settings","setQuery","arr","request","_searchHistoryContext","_searchHistoryEnabled","q","_CollectionChange","_SearchSuggestionKind","_SearchSuggestionManagerShim","_SuggestionManagerShim","listSelectHover","listSelectRest","asb","asbDisabled","asbFlyout","asbFlyoutAbove","asbBoxFlyoutHighlightText","asbHitHighlightSpan","asbInput","asbInputFocus","asbSuggestionQuery","asbSuggestionResult","asbSuggestionResultText","asbSuggestionResultDetailedText","asbSuggestionSelected","asbSuggestionSeparator","AutoSuggestBox","addHitHighlightedText","hitFinder","addNewSpan","spanElement","childElement","hitsProvided","hits","find","_sortAndMergeHits","lastPosition","startPosition","spanHitHighlightedText","getKeyModifiers","VirtualKeys","keyModifiers","resultSuggestionRenderer","handleInvoke","_internalFocusMove","_inputElement","_processSuggestionChosen","Image","openReadAsync","streamWithContentType","divElement","brElement","divDetailElement","_isFlyoutPointerDown","ariaLabelResult","querySuggestionRenderer","ariaLabelQuery","separatorSuggestionRenderer","textElement","insertAdjacentHTML","ariaLabelSeparator","querychanged","querysubmitted","resultsuggestionchosen","suggestionsrequested","invalidSuggestionKind","ariaLabelInputNoPlaceHolder","ariaLabelInputPlaceHolder","_suggestionsChangedHandler","_suggestionsRequestedHandler","_setupDOM","_setupSSM","_chooseSuggestionOnEnter","_currentFocusedIndex","_currentSelectedIndex","_flyoutOpenPromise","_lastKeyPressLanguage","_prevLinguisticDetails","_getLinguisticDetails","_prevQueryText","_hideFlyout","onresultsuggestionchosen","onquerychanged","onquerysubmitted","onsuggestionsrequested","chooseSuggestionOnEnter","_disableControl","_enableControl","placeholderText","_updateInputElementAriaLabel","searchHistoryDisabled","_suggestionManager","_suggestions","_hitFinder","repeaterTemplate","suggestion","_renderSuggestion","flyoutPointerReleasedHandler","_flyoutPointerReleasedHandler","inputOrImeChangeHandler","_inputOrImeChangeHandler","autocorrect","_keyPressHandler","_keyUpHandler","_inputFocusHandler","_inputBlurHandler","_inputPointerDownHandler","context","_tryGetInputContext","_msCandidateWindowShowHandler","_msCandidateWindowHideHandler","_flyoutElement","_flyoutBlurHandler","_flyoutPointerDownHandler","_suggestionsData","_repeaterElement","_repeater","_isFlyoutShown","_showFlyout","prevNumSuggestions","_prevNumSuggestions","inputRect","flyoutRect","documentClientWidth","_flyoutBelowInput","scrollHeight","_addFlyoutIMEPaddingIfRequired","alignRight","clientLeft","touchAction","animationKeyframe","imeRect","getCandidateWindowClientRect","flyoutTop","flyoutBottom","_findNextSuggestionElementIndex","curIndex","_isSuggestionSelectable","_findPreviousSuggestionElementIndex","_submitQuery","storageFile","_selectSuggestionAtIndex","indexToSelect","scrollToView","popupHeight","scrollDifference","curElement","_updateFakeFocus","firstElementIndex","_updateQueryTextWithSuggestionText","suggestionIndex","useCache","createFilled","createQueryLinguisticDetails","compositionAlternatives","compositionStartOffset","compositionLength","queryTextPrefix","queryTextSuffix","fullCompositionAlternatives","SearchQueryLinguisticDetails","queryTextAlternatives","queryTextCompositionStart","queryTextCompositionLength","getCompositionAlternatives","compositionEndOffset","_prevCompositionLength","_prevCompositionStart","_isElementInSearchControl","_shouldIgnoreInput","processingIMEFocusLossKey","_isProcessingDownKey","_isProcessingUpKey","_isProcessingTabKey","_isProcessingEnterKey","fillLinguisticDetails","Language","currentInputMethodLanguageTag","msGetInputContext","findSuggestionElementIndex","srcElement","_reflowImeOnPointerRelease","Data","Text","SemanticTextQuery","lang","hasLinguisticDetailsChanged","newLinguisticDetails","setSelection","locale","IME","closeFlyout","prevIndex","nextIndex","changeIndex","ChangeEnum","setAt","existingElement","resultSuggestionDiv","resultSuggestionDetailDiv","deferral","createResultSuggestionImage","Foundation","Uri","Streams","RandomAccessStreamReference","createFromUri","hitStartPositionAscendingSorter","firstHit","secondHit","returnValue","hitIntersectionReducer","reducedHits","nextHit","curHit","curHitEndPosition","nextHitEndPosition","SearchBox","ClassName","searchBox","searchBoxDisabled","searchBoxInput","searchBoxInputFocus","searchBoxButton","searchBoxFlyout","searchBoxFlyoutHighlightText","searchBoxHitHighlightSpan","searchBoxSuggestionResult","searchBoxSuggestionResultText","searchBoxSuggestionResultDetailedText","searchBoxSuggestionSelected","searchBoxSuggestionQuery","searchBoxSuggestionSeparator","searchBoxButtonInputFocus","searchBoxButtonDisabled","EventName","receivingfocusonkeyboardinput","invalidSearchBoxSuggestionKind","searchBoxDeprecated","_requestingFocusOnKeyboardInputHandlerBind","_requestingFocusOnKeyboardInputHandler","_buttonElement","_focusOnKeyboardInput","_searchboxInputBlurHandler","_searchboxInputFocusHandler","_buttonPointerDownHandler","focusOnKeyboardInput","_applicationListener","resultText","resultDetailText","spans","highlightTexts","currentSelected","newSelected","shouldIgnore","isButtonDown","_getKeyModifiers","_isTypeToSearchKey","Pages","SettingsFlyout","_shouldAnimateFromLeft","ApplicationSettings","SettingsEdgeLocation","appSettings","SettingsPane","edge","_getChildSettingsControl","retValue","settingElements","settingsCommandId","settingsPageIsFocusedOnce","settingsNarrow","settingsWide","settingsFlyoutIsDeprecated","msSettingsFlyoutFocusOut","_animateSlideIn","_animateSlideOut","_width","widthDeprecationMessage","_settingsCommandId","_setBackButtonsAriaLabel","backbuttons","backbuttonAriaLabel","animateFromLeft","enterPage","where","_fragmentDiv","_fragDiv","_unloadPage","settingsControl","currentTarget","_focusOnLastFocusableElementFromParent","_highestTabIndex","_focusOnFirstFocusableElementFromParent","_lowestTabIndex","_minTab","_maxTab","settingsFlyout","_settingsEvent","populateSettings","applicationcommands","setting","SettingsCommand","_onSettingsCommand","applicationCommands","showSettings","href","badReference","_WinPressed","WinPressed","_MSPointerDownButtonHandler","_pointerUpBound","_MSPointerUpHandler","_pointerCancelBound","_MSPointerCancelHandler","_pointerOverBound","_MSPointerOverHandler","_pointerOutBound","_MSPointerOutHandler","isPrimary","_resetPointer","winPressed","SplitViewCommand","commandButton","commandButtonContent","commandSplitButton","commandSplitButtonOpened","commandIcon","commandLabel","_splitToggle","_baseConstructor","classNames","_classNames","_splitOpened","_buildDom","_keydownHandler","_labelEl","_toggleSplit","_splitButtonEl","rightStr","splitButton","_buttonEl","_getFocusInto","_buttonPressedBehavior","_contentEl","_splitButtonPressedBehavior","_handleButtonClick","mutationObserver","_splitButtonAriaExpandedPropertyChangeHandler","_handleSplitButtonClick","tempEl","NavBarCommand","navBarCommandDeprecated","superClass","_location","_split","splitOpened","navigate","_invoked","nobodyHasFocus","NavBarContainer","splittoggle","navBarContainerViewportAriaLabel","navBarContainerIsDeprecated","navbarcontainer","_focusCurrentItemPassivelyBound","_focusCurrentItemPassively","_closeSplitAndResetBound","_closeSplitAndReset","_currentManipulationState","_panningDisabled","_fixedSize","_maxRows","_setupTree","_duringConstructor","_dataChangingBound","_dataChanging","_dataChangedBound","_dataChanged","fixedSize","_updatePageUI","_updateAppBarReference","hadFocus","_closeSplitIfOpen","itemMeasured","_keyboardBehavior","_focus","navbarCommandEl","navbarCommand","_removeDataChangingEvents","_removeDataChangedEvents","_surfaceEl","_addDataChangingEvents","_addDataChangedEvents","_viewportEl","msScrollSnapType","_updateGridStyles","onsplittoggle","_duringForceLayout","_appBarEl","_resizeImplBound","_elementHadFocus","_currentSplitNavItem","bindingList","_mouseleave","_updateArrows","_MSPointerDown","_MSPointerMove","_animateNextPreviousButtons","_focusHandler","_pageindicatorsEl","pageindicators","_boundResizeHandler","_navbarCommandInvokedHandler","_navbarCommandSplitToggleHandler","_itemsFocusHandler","process","_leftArrowEl","navleftarrow","navarrow","_goLeft","_leftArrowFadeOut","_rightArrowEl","navrightarrow","_goRight","_rightArrowFadeOut","_goPrev","itemsPerPage","rowsPerPage","columnsPerPage","pages","viewportOffsetWidth","viewportResized","viewportOffsetHeight","_pendingResize","_resizeImpl","scrollPositionTarget","indexOfFirstItemOnPage","_zoomPosition","scrollPositionForOnePageAboveItem","itemMarginTop","indexOfLastItemOnPage","scrollPositionForOnePageBelowItem","_skipEnsureVisible","withoutAnimation","maxScrollPosition","minScrollPosition","newScrollPosition","MS_MANIPULATION_STATE_ACTIVE","_manipulationStateTimeoutId","_updateCurrentIndexIfPageChanged","_checkingScroll","firstIndexOnPage","lastIndexOnPage","elementToMeasure","margin","elementComputedStyle","itemOffsetWidth","itemMarginLeft","itemMarginRight","itemWidth","itemOffsetHeight","itemMarginBottom","itemHeight","leadingEdge","usableSpace","maxColumns","trailingEdge","extraSpace","fixedDirection","FixedDirection","_hasPreviousContent","itemEl","isFirstColumnOnPage","isLastColumnOnPage","extraTrailingMargin","spaceToDistribute","extraMarginRight","extraMarginLeft","_indicatorCount","indicator","currentindicator","firstIndexOnCurrentPage","lastIndexOnCurrentPage","hasLeftContent","hasRightContent","_leftArrowWaitingToFadeOut","_leftArrowFadeIn","_rightArrowWaitingToFadeOut","_rightArrowFadeIn","splitToggle","_Container","customLayout","NavBar","childrenProcessedEventName","navBarIsDeprecated","_handleBeforeShow","navbar","_processChildren","onchildrenprocessed","processed","childrenProcessed","navbarcontainerEls","ViewBox","invalidViewBoxChildren","box","_handleResizeBound","_handleResize","_sizer","sizers","onresize","sizer","w","h","bw","bh","wRatio","hRatio","mRatio","transX","transY","_Animations","ContentDialog","supportsMsDevicedFixed","dialogRoot","_supportsMsDeviceFixedCached","onInputPaneShown","dialog","_renderForInputPane","onInputPaneHidden","_clearInputPaneRendering","_interruptibleWorkPromises","controlDisposed","contentDialogAlreadyShowing","DismissalResult","secondary","contentDialog","backgroundOverlay","primaryCommand","secondaryCommand","_verticalAlignment","_scroller","_column0or1","_tabStop","_commandSpacer","_deviceFixedSupported","_dismissedSignal","Hidden","onCommandClicked","showIsPending","dismissedSignal","BeforeShow","_fireBeforeShow","shouldShow","_cancelDismissalPromise","Showing","_pendingHide","_addExternalListeners","_playEntranceAnimation","Shown","dismissalResult","_resetDismissalPromise","pendingHide","BeforeHide","_fireBeforeHide","shouldHide","Hiding","_showIsPending","_playExitAnimation","_removeExternalListeners","_fireAfterHide","_onInputPaneShownBound","_onInputPaneShown","_onInputPaneHiddenBound","_onInputPaneHidden","_onUpdateInputPaneRenderingBound","_onUpdateInputPaneRendering","_currentFocus","_rendered","registeredForResize","resizedForInputPane","primaryCommandText","primaryCommandDisabled","secondaryCommandText","secondaryCommandDisabled","_title","_primaryCommandText","_updateCommandsUI","_secondaryCommandText","_primaryCommandDisabled","_secondaryCommandDisabled","contentEl","startBodyTab","commandContainer","commandSpacer","endBodyTab","_updateTabIndices","_onKeyDownEnteringElement","_onStartBodyTabFocusIn","_onEndBodyTabFocusIn","_onCommandClicked","_updateTabIndicesThrottled","_throttledFunction","_updateTabIndicesImpl","_getHighAndLowTabIndices","lowest","highest","_elementInDialog","newSignal","newDismissedSignal","_shouldResizeForInputPane","dialogRect","willInputPaneOccludeDialog","scrollIntoView","rectToThickness","Dimension","splitView","pane","paneClosed","paneOpened","_panePlaceholder","_paneOutline","_paneWrapper","_contentWrapper","_placementLeft","_placementRight","_placementTop","_placementBottom","_closedDisplayNone","_closedDisplayInline","_openedDisplayInline","_openedDisplayOverlay","inline","OpenedDisplayMode","PanePlacement","openedDisplayModeClassMap","panePlacementClassMap","SplitView","_updateDomImpl_rendered","paneIsFirst","openedDisplayMode","panePlacement","panePlaceholderWidth","panePlaceholderHeight","isOverlayShown","startPaneTabIndex","endPaneTabIndex","_cachedHiddenPaneThickness","hiddenPaneThickness","_getHiddenPaneThickness","_playShowAnimation","_playHideAnimation","paneWrapper","closePane","_openedDisplayMode","_panePlacement","openPane","paneEl","startPaneTabEl","endPaneTabEl","paneOutlineEl","paneWrapperEl","panePlaceholderEl","contentWrapperEl","startPaneTab","endPaneTab","paneOutline","panePlaceholder","contentWrapper","_onStartPaneTabFocusIn","_onEndPaneTabFocusIn","_measureElement","_getPositionRelativeTo","_setContentRect","contentRect","contentWrapperStyle","_prepareAnimation","paneRect","paneWrapperStyle","paneStyle","_getHiddenContentRect","shownContentRect","shownPaneThickness","placementRight","paneDiff","dim","shownPaneRect","hiddenContentRect","playPaneAnimation","animationOffsetFactor","_resizeTransition","actualSize","playShowAnimation","playHideAnimation","_highestPaneTabIndex","_lowestPaneTabIndex","paneShouldBeFirst","getSplitViewControl","splitViewElement","getPaneOpened","splitViewControl","splitViewPaneToggle","SplitViewPaneToggle","_onPaneStateSettledBound","_onPaneStateSettled","_ariaExpandedMutationObserver","_onAriaExpandedPropertyChanged","_splitView","_removeListeners","_addListeners","expanded","mutations","ariaExpanded","emptyappbarCssClass","placementTopClass","placementBottomClass","defaultPlacement","keyboardInfo","Placement","placementClassMap","AppBar","adjustedOffsets","_adjustedOffsets","_handleHidingKeyboardBound","_handleHidingKeyboard","_computeAdjustedOffsets","inputPaneEvent","_shouldAdjustForShowingKeyboard","offsets","_WinJS"],"mappings":"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,cACbC,WAAY,cAEhBxrK,EAAQ4sK,mBACJ9jI,IAAK,MACLmkB,OAAQ,UAEZjtD,EAAQ+rK,qBAAuBU,EAA4BV,qBAC3D/rK,EAAQ8rK,gBAAkBW,EAA4BX,gBACtD9rK,EAAQmsK,yBAA2B,UACnCnsK,EAAQosK,eAAgB,EAExBpsK,EAAQ20J,cAAgB,YACxB30J,EAAQ40J,YAAc,UACtB50J,EAAQ60J,WAAa,SACrB70J,EAAQ80J,WAAa,SACrB90J,EAAQ+0J,WAAa,SACrB/0J,EAAQssK,gBAAkB,eAC1BtsK,EAAQusK,sBAAwB,UAChCvsK,EAAQwsK,wBAA0B,cAMtC3sK,EAAO,+BACF,UACA,mBACA,yBACG,SAAwBG,EAASQ,EAAOK,GAC5C,YAEA,IAAIgsK,IAAU,WACE,OACA,OACA,QACA,OACA,OACA,QACA,SACA,SACA,MACA,SACA,SACA,OACA,OACA,OACA,OACA,KACA,UACA,QACA,OACA,OACA,WACA,SACA,WACA,QACA,OACA,WACA,OACA,OACA,OACA,SACA,QACA,UACA,YACA,cACA,QACA,OACA,OACA,eACA,SACA,YACA,WACA,QACA,OACA,cACA,QACA,OACA,eACA,SACA,YACA,WACA,oBACA,OACA,UACA,UACA,QACA,cACA,SACA,UACA,SACA,QACA,YACA,SACA,UACA,SACA,MACA,YACA,KACA,WACA,WACA,YACA,aACA,SACA,UACA,SACA,UACA,OACA,OACA,YACA,cACA,SACA,YACA,eACA,SACA,WACA,YACA,UACA,OACA,cACA,SACA,SACA,UACA,QACA,cACA,eACA,WACA,aACA,eACA,OACA,OACA,WACA,UACA,UACA,MACA,SACA,QACA,SACA,OACA,SACA,YACA,YACA,YACA,OACA,SACA,UACA,kBACA,WACA,YACA,WACA,kBACA,WACA,iBACA,YACA,OACA,YACA,WACA,SACA,QACA,cACA,OACA,gBACA,UACA,KACA,gBACA,cACA,YACA,iBACA,aACA,QACA,YACA,OACA,SACA,YACA,OACA,eACA,cACA,UACA,OACA,aACA,cACA,YACA,OACA,UA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","file":"ui.min.js"}
\ No newline at end of file
diff --git a/node_modules/winjs/package.json b/node_modules/winjs/package.json
deleted file mode 100644
index 8b61ec2..0000000
--- a/node_modules/winjs/package.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
-  "_args": [
-    [
-      "winjs@4.4.3",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "winjs@4.4.3",
-  "_id": "winjs@4.4.3",
-  "_inBundle": false,
-  "_integrity": "sha1-CFoQUBj/4W+Xl79pvZwf1tQoreM=",
-  "_location": "/winjs",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "winjs@4.4.3",
-    "name": "winjs",
-    "escapedName": "winjs",
-    "rawSpec": "4.4.3",
-    "saveSpec": null,
-    "fetchSpec": "4.4.3"
-  },
-  "_requiredBy": [
-    "/"
-  ],
-  "_resolved": "https://registry.npmjs.org/winjs/-/winjs-4.4.3.tgz",
-  "_spec": "4.4.3",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Microsoft Corporation and other contributors",
-    "url": "https://github.com/winjs/winjs/graphs/contributors"
-  },
-  "bugs": {
-    "url": "https://github.com/winjs/winjs/issues"
-  },
-  "description": "WinJS is a set of JavaScript toolkits that allow developers to build applications using HTML/JS/CSS technology.",
-  "devDependencies": {
-    "bowser": "~1.0.0",
-    "chalk": "~0.5.1",
-    "fs-extra": "^0.10.0",
-    "glob": "^4.0.5",
-    "grunt": "~0.4.5",
-    "grunt-contrib-clean": "~0.6.0",
-    "grunt-contrib-compress": "^0.13.0",
-    "grunt-contrib-concat": "~0.5.0",
-    "grunt-contrib-connect": "^0.8.0",
-    "grunt-contrib-copy": "~0.5.0",
-    "grunt-contrib-cssmin": "^0.12.3",
-    "grunt-contrib-jshint": "~0.10.0",
-    "grunt-contrib-less": "~0.11.4",
-    "grunt-contrib-requirejs": "^0.4.4",
-    "grunt-contrib-uglify": "^0.5.1",
-    "grunt-git": "^0.3.5",
-    "grunt-github-releaser": "^0.1.17",
-    "grunt-jscs": "^1.8.0",
-    "grunt-nuget": "^0.1.4",
-    "grunt-replace": "~0.7.8",
-    "grunt-saucelabs": "git+https://github.com/xirzec/grunt-saucelabs.git#debug",
-    "grunt-shell": "~0.7.0",
-    "grunt-ts": "~3.0.0",
-    "http-post": "~0.1.1",
-    "less": "^1.7.4",
-    "load-grunt-tasks": "^0.6.0",
-    "minimist": "0.2.0",
-    "qunitjs": "~1.14.0",
-    "seed-random": "^2.2.0",
-    "text-table": "~0.2.0",
-    "typescript": "1.4.1",
-    "websocket": "^1.0.8"
-  },
-  "homepage": "http://try.buildwinjs.com/",
-  "licenses": [
-    {
-      "type": "MIT",
-      "url": "https://github.com/winjs/winjs/blob/master/License.txt"
-    }
-  ],
-  "main": "js/ui.js",
-  "name": "winjs",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/winjs/winjs.git"
-  },
-  "title": "Windows Library for JavaScript (WinJS)",
-  "version": "4.4.3"
-}
diff --git a/node_modules/wrappy/LICENSE b/node_modules/wrappy/LICENSE
deleted file mode 100644
index 19129e3..0000000
--- a/node_modules/wrappy/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/node_modules/wrappy/README.md b/node_modules/wrappy/README.md
deleted file mode 100644
index 98eab25..0000000
--- a/node_modules/wrappy/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# wrappy
-
-Callback wrapping utility
-
-## USAGE
-
-```javascript
-var wrappy = require("wrappy")
-
-// var wrapper = wrappy(wrapperFunction)
-
-// make sure a cb is called only once
-// See also: http://npm.im/once for this specific use case
-var once = wrappy(function (cb) {
-  var called = false
-  return function () {
-    if (called) return
-    called = true
-    return cb.apply(this, arguments)
-  }
-})
-
-function printBoo () {
-  console.log('boo')
-}
-// has some rando property
-printBoo.iAmBooPrinter = true
-
-var onlyPrintOnce = once(printBoo)
-
-onlyPrintOnce() // prints 'boo'
-onlyPrintOnce() // does nothing
-
-// random property is retained!
-assert.equal(onlyPrintOnce.iAmBooPrinter, true)
-```
diff --git a/node_modules/wrappy/package.json b/node_modules/wrappy/package.json
deleted file mode 100644
index cae28ea..0000000
--- a/node_modules/wrappy/package.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
-  "_args": [
-    [
-      "wrappy@1.0.2",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "wrappy@1.0.2",
-  "_id": "wrappy@1.0.2",
-  "_inBundle": false,
-  "_integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-  "_location": "/wrappy",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "wrappy@1.0.2",
-    "name": "wrappy",
-    "escapedName": "wrappy",
-    "rawSpec": "1.0.2",
-    "saveSpec": null,
-    "fetchSpec": "1.0.2"
-  },
-  "_requiredBy": [
-    "/inflight",
-    "/once"
-  ],
-  "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-  "_spec": "1.0.2",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Isaac Z. Schlueter",
-    "email": "i@izs.me",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/npm/wrappy/issues"
-  },
-  "dependencies": {},
-  "description": "Callback wrapping utility",
-  "devDependencies": {
-    "tap": "^2.3.1"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "files": [
-    "wrappy.js"
-  ],
-  "homepage": "https://github.com/npm/wrappy",
-  "license": "ISC",
-  "main": "wrappy.js",
-  "name": "wrappy",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/wrappy.git"
-  },
-  "scripts": {
-    "test": "tap --coverage test/*.js"
-  },
-  "version": "1.0.2"
-}
diff --git a/node_modules/wrappy/wrappy.js b/node_modules/wrappy/wrappy.js
deleted file mode 100644
index bb7e7d6..0000000
--- a/node_modules/wrappy/wrappy.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// Returns a wrapper function that returns a wrapped callback
-// The wrapper function should do some stuff, and return a
-// presumably different callback function.
-// This makes sure that own properties are retained, so that
-// decorations and such are not lost along the way.
-module.exports = wrappy
-function wrappy (fn, cb) {
-  if (fn && cb) return wrappy(fn)(cb)
-
-  if (typeof fn !== 'function')
-    throw new TypeError('need wrapper function')
-
-  Object.keys(fn).forEach(function (k) {
-    wrapper[k] = fn[k]
-  })
-
-  return wrapper
-
-  function wrapper() {
-    var args = new Array(arguments.length)
-    for (var i = 0; i < args.length; i++) {
-      args[i] = arguments[i]
-    }
-    var ret = fn.apply(this, args)
-    var cb = args[args.length-1]
-    if (typeof ret === 'function' && ret !== cb) {
-      Object.keys(cb).forEach(function (k) {
-        ret[k] = cb[k]
-      })
-    }
-    return ret
-  }
-}
diff --git a/node_modules/xmlbuilder/.npmignore b/node_modules/xmlbuilder/.npmignore
deleted file mode 100644
index b6ad1f6..0000000
--- a/node_modules/xmlbuilder/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-.travis.yml
-src
-test
-perf
-coverage
diff --git a/node_modules/xmlbuilder/LICENSE b/node_modules/xmlbuilder/LICENSE
deleted file mode 100644
index e7cbac9..0000000
--- a/node_modules/xmlbuilder/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2013 Ozgur Ozcitak
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/node_modules/xmlbuilder/README.md b/node_modules/xmlbuilder/README.md
deleted file mode 100644
index 13a5b12..0000000
--- a/node_modules/xmlbuilder/README.md
+++ /dev/null
@@ -1,86 +0,0 @@
-# xmlbuilder-js
-
-An XML builder for [node.js](https://nodejs.org/) similar to 
-[java-xmlbuilder](https://github.com/jmurty/java-xmlbuilder).
-
-[![License](http://img.shields.io/npm/l/xmlbuilder.svg?style=flat-square)](http://opensource.org/licenses/MIT)
-[![NPM Version](http://img.shields.io/npm/v/xmlbuilder.svg?style=flat-square)](https://npmjs.com/package/xmlbuilder)
-[![NPM Downloads](https://img.shields.io/npm/dm/xmlbuilder.svg?style=flat-square)](https://npmjs.com/package/xmlbuilder)
-
-[![Build Status](http://img.shields.io/travis/oozcitak/xmlbuilder-js.svg?style=flat-square)](http://travis-ci.org/oozcitak/xmlbuilder-js)
-[![Dependency Status](http://img.shields.io/david/oozcitak/xmlbuilder-js.svg?style=flat-square)](https://david-dm.org/oozcitak/xmlbuilder-js)
-[![Dev Dependency Status](http://img.shields.io/david/dev/oozcitak/xmlbuilder-js.svg?style=flat-square)](https://david-dm.org/oozcitak/xmlbuilder-js)
-[![Code Coverage](https://img.shields.io/coveralls/oozcitak/xmlbuilder-js.svg?style=flat-square)](https://coveralls.io/github/oozcitak/xmlbuilder-js)
-
-### Installation:
-
-``` sh
-npm install xmlbuilder
-```
-
-### Usage:
-
-``` js
-var builder = require('xmlbuilder');
-var xml = builder.create('root')
-  .ele('xmlbuilder')
-    .ele('repo', {'type': 'git'}, 'git://github.com/oozcitak/xmlbuilder-js.git')
-  .end({ pretty: true});
-    
-console.log(xml);
-```
-
-will result in:
-
-``` xml
-<?xml version="1.0"?>
-<root>
-  <xmlbuilder>
-    <repo type="git">git://github.com/oozcitak/xmlbuilder-js.git</repo>
-  </xmlbuilder>
-</root>
-```
-
-It is also possible to convert objects into nodes:
-
-``` js
-builder.create({
-  root: {
-    xmlbuilder: {
-      repo: {
-        '@type': 'git', // attributes start with @
-        '#text': 'git://github.com/oozcitak/xmlbuilder-js.git' // text node
-      }
-    }
-  }
-});
-```
-
-If you need to do some processing:
-
-``` js
-var root = builder.create('squares');
-root.com('f(x) = x^2');
-for(var i = 1; i <= 5; i++)
-{
-  var item = root.ele('data');
-  item.att('x', i);
-  item.att('y', i * i);
-}
-```
-
-This will result in:
-
-``` xml
-<?xml version="1.0"?>
-<squares>
-  <!-- f(x) = x^2 -->
-  <data x="1" y="1"/>
-  <data x="2" y="4"/>
-  <data x="3" y="9"/>
-  <data x="4" y="16"/>
-  <data x="5" y="25"/>
-</squares>
-```
-
-See the [wiki](https://github.com/oozcitak/xmlbuilder-js/wiki) for details.
diff --git a/node_modules/xmlbuilder/lib/XMLAttribute.js b/node_modules/xmlbuilder/lib/XMLAttribute.js
deleted file mode 100644
index 247c9d1..0000000
--- a/node_modules/xmlbuilder/lib/XMLAttribute.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLAttribute, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLAttribute = (function() {
-    function XMLAttribute(parent, name, value) {
-      this.stringify = parent.stringify;
-      if (name == null) {
-        throw new Error("Missing attribute name of element " + parent.name);
-      }
-      if (value == null) {
-        throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name);
-      }
-      this.name = this.stringify.attName(name);
-      this.value = this.stringify.attValue(value);
-    }
-
-    XMLAttribute.prototype.clone = function() {
-      return create(XMLAttribute.prototype, this);
-    };
-
-    XMLAttribute.prototype.toString = function(options, level) {
-      return ' ' + this.name + '="' + this.value + '"';
-    };
-
-    return XMLAttribute;
-
-  })();
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLBuilder.js b/node_modules/xmlbuilder/lib/XMLBuilder.js
deleted file mode 100644
index 4282833..0000000
--- a/node_modules/xmlbuilder/lib/XMLBuilder.js
+++ /dev/null
@@ -1,69 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLBuilder, XMLDeclaration, XMLDocType, XMLElement, XMLStringifier;
-
-  XMLStringifier = require('./XMLStringifier');
-
-  XMLDeclaration = require('./XMLDeclaration');
-
-  XMLDocType = require('./XMLDocType');
-
-  XMLElement = require('./XMLElement');
-
-  module.exports = XMLBuilder = (function() {
-    function XMLBuilder(name, options) {
-      var root, temp;
-      if (name == null) {
-        throw new Error("Root element needs a name");
-      }
-      if (options == null) {
-        options = {};
-      }
-      this.options = options;
-      this.stringify = new XMLStringifier(options);
-      temp = new XMLElement(this, 'doc');
-      root = temp.element(name);
-      root.isRoot = true;
-      root.documentObject = this;
-      this.rootObject = root;
-      if (!options.headless) {
-        root.declaration(options);
-        if ((options.pubID != null) || (options.sysID != null)) {
-          root.doctype(options);
-        }
-      }
-    }
-
-    XMLBuilder.prototype.root = function() {
-      return this.rootObject;
-    };
-
-    XMLBuilder.prototype.end = function(options) {
-      return this.toString(options);
-    };
-
-    XMLBuilder.prototype.toString = function(options) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      r = '';
-      if (this.xmldec != null) {
-        r += this.xmldec.toString(options);
-      }
-      if (this.doctype != null) {
-        r += this.doctype.toString(options);
-      }
-      r += this.rootObject.toString(options);
-      if (pretty && r.slice(-newline.length) === newline) {
-        r = r.slice(0, -newline.length);
-      }
-      return r;
-    };
-
-    return XMLBuilder;
-
-  })();
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLCData.js b/node_modules/xmlbuilder/lib/XMLCData.js
deleted file mode 100644
index 00002f1..0000000
--- a/node_modules/xmlbuilder/lib/XMLCData.js
+++ /dev/null
@@ -1,49 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLCData, XMLNode, create,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLCData = (function(superClass) {
-    extend(XMLCData, superClass);
-
-    function XMLCData(parent, text) {
-      XMLCData.__super__.constructor.call(this, parent);
-      if (text == null) {
-        throw new Error("Missing CDATA text");
-      }
-      this.text = this.stringify.cdata(text);
-    }
-
-    XMLCData.prototype.clone = function() {
-      return create(XMLCData.prototype, this);
-    };
-
-    XMLCData.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<![CDATA[' + this.text + ']]>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLCData;
-
-  })(XMLNode);
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLComment.js b/node_modules/xmlbuilder/lib/XMLComment.js
deleted file mode 100644
index ca23e95..0000000
--- a/node_modules/xmlbuilder/lib/XMLComment.js
+++ /dev/null
@@ -1,49 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLComment, XMLNode, create,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLComment = (function(superClass) {
-    extend(XMLComment, superClass);
-
-    function XMLComment(parent, text) {
-      XMLComment.__super__.constructor.call(this, parent);
-      if (text == null) {
-        throw new Error("Missing comment text");
-      }
-      this.text = this.stringify.comment(text);
-    }
-
-    XMLComment.prototype.clone = function() {
-      return create(XMLComment.prototype, this);
-    };
-
-    XMLComment.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!-- ' + this.text + ' -->';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLComment;
-
-  })(XMLNode);
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLDTDAttList.js b/node_modules/xmlbuilder/lib/XMLDTDAttList.js
deleted file mode 100644
index 62e6d8a..0000000
--- a/node_modules/xmlbuilder/lib/XMLDTDAttList.js
+++ /dev/null
@@ -1,68 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDTDAttList, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLDTDAttList = (function() {
-    function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {
-      this.stringify = parent.stringify;
-      if (elementName == null) {
-        throw new Error("Missing DTD element name");
-      }
-      if (attributeName == null) {
-        throw new Error("Missing DTD attribute name");
-      }
-      if (!attributeType) {
-        throw new Error("Missing DTD attribute type");
-      }
-      if (!defaultValueType) {
-        throw new Error("Missing DTD attribute default");
-      }
-      if (defaultValueType.indexOf('#') !== 0) {
-        defaultValueType = '#' + defaultValueType;
-      }
-      if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {
-        throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT");
-      }
-      if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {
-        throw new Error("Default value only applies to #FIXED or #DEFAULT");
-      }
-      this.elementName = this.stringify.eleName(elementName);
-      this.attributeName = this.stringify.attName(attributeName);
-      this.attributeType = this.stringify.dtdAttType(attributeType);
-      this.defaultValue = this.stringify.dtdAttDefault(defaultValue);
-      this.defaultValueType = defaultValueType;
-    }
-
-    XMLDTDAttList.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!ATTLIST ' + this.elementName + ' ' + this.attributeName + ' ' + this.attributeType;
-      if (this.defaultValueType !== '#DEFAULT') {
-        r += ' ' + this.defaultValueType;
-      }
-      if (this.defaultValue) {
-        r += ' "' + this.defaultValue + '"';
-      }
-      r += '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDTDAttList;
-
-  })();
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLDTDElement.js b/node_modules/xmlbuilder/lib/XMLDTDElement.js
deleted file mode 100644
index 2d155e2..0000000
--- a/node_modules/xmlbuilder/lib/XMLDTDElement.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDTDElement, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLDTDElement = (function() {
-    function XMLDTDElement(parent, name, value) {
-      this.stringify = parent.stringify;
-      if (name == null) {
-        throw new Error("Missing DTD element name");
-      }
-      if (!value) {
-        value = '(#PCDATA)';
-      }
-      if (Array.isArray(value)) {
-        value = '(' + value.join(',') + ')';
-      }
-      this.name = this.stringify.eleName(name);
-      this.value = this.stringify.dtdElementValue(value);
-    }
-
-    XMLDTDElement.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!ELEMENT ' + this.name + ' ' + this.value + '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDTDElement;
-
-  })();
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLDTDEntity.js b/node_modules/xmlbuilder/lib/XMLDTDEntity.js
deleted file mode 100644
index 3201d19..0000000
--- a/node_modules/xmlbuilder/lib/XMLDTDEntity.js
+++ /dev/null
@@ -1,84 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDTDEntity, create, isObject;
-
-  create = require('lodash/object/create');
-
-  isObject = require('lodash/lang/isObject');
-
-  module.exports = XMLDTDEntity = (function() {
-    function XMLDTDEntity(parent, pe, name, value) {
-      this.stringify = parent.stringify;
-      if (name == null) {
-        throw new Error("Missing entity name");
-      }
-      if (value == null) {
-        throw new Error("Missing entity value");
-      }
-      this.pe = !!pe;
-      this.name = this.stringify.eleName(name);
-      if (!isObject(value)) {
-        this.value = this.stringify.dtdEntityValue(value);
-      } else {
-        if (!value.pubID && !value.sysID) {
-          throw new Error("Public and/or system identifiers are required for an external entity");
-        }
-        if (value.pubID && !value.sysID) {
-          throw new Error("System identifier is required for a public external entity");
-        }
-        if (value.pubID != null) {
-          this.pubID = this.stringify.dtdPubID(value.pubID);
-        }
-        if (value.sysID != null) {
-          this.sysID = this.stringify.dtdSysID(value.sysID);
-        }
-        if (value.nData != null) {
-          this.nData = this.stringify.dtdNData(value.nData);
-        }
-        if (this.pe && this.nData) {
-          throw new Error("Notation declaration is not allowed in a parameter entity");
-        }
-      }
-    }
-
-    XMLDTDEntity.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!ENTITY';
-      if (this.pe) {
-        r += ' %';
-      }
-      r += ' ' + this.name;
-      if (this.value) {
-        r += ' "' + this.value + '"';
-      } else {
-        if (this.pubID && this.sysID) {
-          r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
-        } else if (this.sysID) {
-          r += ' SYSTEM "' + this.sysID + '"';
-        }
-        if (this.nData) {
-          r += ' NDATA ' + this.nData;
-        }
-      }
-      r += '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDTDEntity;
-
-  })();
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLDTDNotation.js b/node_modules/xmlbuilder/lib/XMLDTDNotation.js
deleted file mode 100644
index cfbccf4..0000000
--- a/node_modules/xmlbuilder/lib/XMLDTDNotation.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDTDNotation, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLDTDNotation = (function() {
-    function XMLDTDNotation(parent, name, value) {
-      this.stringify = parent.stringify;
-      if (name == null) {
-        throw new Error("Missing notation name");
-      }
-      if (!value.pubID && !value.sysID) {
-        throw new Error("Public or system identifiers are required for an external entity");
-      }
-      this.name = this.stringify.eleName(name);
-      if (value.pubID != null) {
-        this.pubID = this.stringify.dtdPubID(value.pubID);
-      }
-      if (value.sysID != null) {
-        this.sysID = this.stringify.dtdSysID(value.sysID);
-      }
-    }
-
-    XMLDTDNotation.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!NOTATION ' + this.name;
-      if (this.pubID && this.sysID) {
-        r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
-      } else if (this.pubID) {
-        r += ' PUBLIC "' + this.pubID + '"';
-      } else if (this.sysID) {
-        r += ' SYSTEM "' + this.sysID + '"';
-      }
-      r += '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDTDNotation;
-
-  })();
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLDeclaration.js b/node_modules/xmlbuilder/lib/XMLDeclaration.js
deleted file mode 100644
index b2d8435..0000000
--- a/node_modules/xmlbuilder/lib/XMLDeclaration.js
+++ /dev/null
@@ -1,65 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLDeclaration, XMLNode, create, isObject,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  isObject = require('lodash/lang/isObject');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLDeclaration = (function(superClass) {
-    extend(XMLDeclaration, superClass);
-
-    function XMLDeclaration(parent, version, encoding, standalone) {
-      var ref;
-      XMLDeclaration.__super__.constructor.call(this, parent);
-      if (isObject(version)) {
-        ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone;
-      }
-      if (!version) {
-        version = '1.0';
-      }
-      this.version = this.stringify.xmlVersion(version);
-      if (encoding != null) {
-        this.encoding = this.stringify.xmlEncoding(encoding);
-      }
-      if (standalone != null) {
-        this.standalone = this.stringify.xmlStandalone(standalone);
-      }
-    }
-
-    XMLDeclaration.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<?xml';
-      r += ' version="' + this.version + '"';
-      if (this.encoding != null) {
-        r += ' encoding="' + this.encoding + '"';
-      }
-      if (this.standalone != null) {
-        r += ' standalone="' + this.standalone + '"';
-      }
-      r += '?>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLDeclaration;
-
-  })(XMLNode);
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLDocType.js b/node_modules/xmlbuilder/lib/XMLDocType.js
deleted file mode 100644
index eec6f36..0000000
--- a/node_modules/xmlbuilder/lib/XMLDocType.js
+++ /dev/null
@@ -1,188 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLProcessingInstruction, create, isObject;
-
-  create = require('lodash/object/create');
-
-  isObject = require('lodash/lang/isObject');
-
-  XMLCData = require('./XMLCData');
-
-  XMLComment = require('./XMLComment');
-
-  XMLDTDAttList = require('./XMLDTDAttList');
-
-  XMLDTDEntity = require('./XMLDTDEntity');
-
-  XMLDTDElement = require('./XMLDTDElement');
-
-  XMLDTDNotation = require('./XMLDTDNotation');
-
-  XMLProcessingInstruction = require('./XMLProcessingInstruction');
-
-  module.exports = XMLDocType = (function() {
-    function XMLDocType(parent, pubID, sysID) {
-      var ref, ref1;
-      this.documentObject = parent;
-      this.stringify = this.documentObject.stringify;
-      this.children = [];
-      if (isObject(pubID)) {
-        ref = pubID, pubID = ref.pubID, sysID = ref.sysID;
-      }
-      if (sysID == null) {
-        ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1];
-      }
-      if (pubID != null) {
-        this.pubID = this.stringify.dtdPubID(pubID);
-      }
-      if (sysID != null) {
-        this.sysID = this.stringify.dtdSysID(sysID);
-      }
-    }
-
-    XMLDocType.prototype.element = function(name, value) {
-      var child;
-      child = new XMLDTDElement(this, name, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
-      var child;
-      child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.entity = function(name, value) {
-      var child;
-      child = new XMLDTDEntity(this, false, name, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.pEntity = function(name, value) {
-      var child;
-      child = new XMLDTDEntity(this, true, name, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.notation = function(name, value) {
-      var child;
-      child = new XMLDTDNotation(this, name, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.cdata = function(value) {
-      var child;
-      child = new XMLCData(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.comment = function(value) {
-      var child;
-      child = new XMLComment(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.instruction = function(target, value) {
-      var child;
-      child = new XMLProcessingInstruction(this, target, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLDocType.prototype.root = function() {
-      return this.documentObject.root();
-    };
-
-    XMLDocType.prototype.document = function() {
-      return this.documentObject;
-    };
-
-    XMLDocType.prototype.toString = function(options, level) {
-      var child, i, indent, len, newline, offset, pretty, r, ref, ref1, ref2, ref3, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<!DOCTYPE ' + this.root().name;
-      if (this.pubID && this.sysID) {
-        r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
-      } else if (this.sysID) {
-        r += ' SYSTEM "' + this.sysID + '"';
-      }
-      if (this.children.length > 0) {
-        r += ' [';
-        if (pretty) {
-          r += newline;
-        }
-        ref3 = this.children;
-        for (i = 0, len = ref3.length; i < len; i++) {
-          child = ref3[i];
-          r += child.toString(options, level + 1);
-        }
-        r += ']';
-      }
-      r += '>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    XMLDocType.prototype.ele = function(name, value) {
-      return this.element(name, value);
-    };
-
-    XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
-      return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);
-    };
-
-    XMLDocType.prototype.ent = function(name, value) {
-      return this.entity(name, value);
-    };
-
-    XMLDocType.prototype.pent = function(name, value) {
-      return this.pEntity(name, value);
-    };
-
-    XMLDocType.prototype.not = function(name, value) {
-      return this.notation(name, value);
-    };
-
-    XMLDocType.prototype.dat = function(value) {
-      return this.cdata(value);
-    };
-
-    XMLDocType.prototype.com = function(value) {
-      return this.comment(value);
-    };
-
-    XMLDocType.prototype.ins = function(target, value) {
-      return this.instruction(target, value);
-    };
-
-    XMLDocType.prototype.up = function() {
-      return this.root();
-    };
-
-    XMLDocType.prototype.doc = function() {
-      return this.document();
-    };
-
-    return XMLDocType;
-
-  })();
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLElement.js b/node_modules/xmlbuilder/lib/XMLElement.js
deleted file mode 100644
index d5814c8..0000000
--- a/node_modules/xmlbuilder/lib/XMLElement.js
+++ /dev/null
@@ -1,212 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLAttribute, XMLElement, XMLNode, XMLProcessingInstruction, create, every, isFunction, isObject,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  isObject = require('lodash/lang/isObject');
-
-  isFunction = require('lodash/lang/isFunction');
-
-  every = require('lodash/collection/every');
-
-  XMLNode = require('./XMLNode');
-
-  XMLAttribute = require('./XMLAttribute');
-
-  XMLProcessingInstruction = require('./XMLProcessingInstruction');
-
-  module.exports = XMLElement = (function(superClass) {
-    extend(XMLElement, superClass);
-
-    function XMLElement(parent, name, attributes) {
-      XMLElement.__super__.constructor.call(this, parent);
-      if (name == null) {
-        throw new Error("Missing element name");
-      }
-      this.name = this.stringify.eleName(name);
-      this.children = [];
-      this.instructions = [];
-      this.attributes = {};
-      if (attributes != null) {
-        this.attribute(attributes);
-      }
-    }
-
-    XMLElement.prototype.clone = function() {
-      var att, attName, clonedSelf, i, len, pi, ref, ref1;
-      clonedSelf = create(XMLElement.prototype, this);
-      if (clonedSelf.isRoot) {
-        clonedSelf.documentObject = null;
-      }
-      clonedSelf.attributes = {};
-      ref = this.attributes;
-      for (attName in ref) {
-        if (!hasProp.call(ref, attName)) continue;
-        att = ref[attName];
-        clonedSelf.attributes[attName] = att.clone();
-      }
-      clonedSelf.instructions = [];
-      ref1 = this.instructions;
-      for (i = 0, len = ref1.length; i < len; i++) {
-        pi = ref1[i];
-        clonedSelf.instructions.push(pi.clone());
-      }
-      clonedSelf.children = [];
-      this.children.forEach(function(child) {
-        var clonedChild;
-        clonedChild = child.clone();
-        clonedChild.parent = clonedSelf;
-        return clonedSelf.children.push(clonedChild);
-      });
-      return clonedSelf;
-    };
-
-    XMLElement.prototype.attribute = function(name, value) {
-      var attName, attValue;
-      if (name != null) {
-        name = name.valueOf();
-      }
-      if (isObject(name)) {
-        for (attName in name) {
-          if (!hasProp.call(name, attName)) continue;
-          attValue = name[attName];
-          this.attribute(attName, attValue);
-        }
-      } else {
-        if (isFunction(value)) {
-          value = value.apply();
-        }
-        if (!this.options.skipNullAttributes || (value != null)) {
-          this.attributes[name] = new XMLAttribute(this, name, value);
-        }
-      }
-      return this;
-    };
-
-    XMLElement.prototype.removeAttribute = function(name) {
-      var attName, i, len;
-      if (name == null) {
-        throw new Error("Missing attribute name");
-      }
-      name = name.valueOf();
-      if (Array.isArray(name)) {
-        for (i = 0, len = name.length; i < len; i++) {
-          attName = name[i];
-          delete this.attributes[attName];
-        }
-      } else {
-        delete this.attributes[name];
-      }
-      return this;
-    };
-
-    XMLElement.prototype.instruction = function(target, value) {
-      var i, insTarget, insValue, instruction, len;
-      if (target != null) {
-        target = target.valueOf();
-      }
-      if (value != null) {
-        value = value.valueOf();
-      }
-      if (Array.isArray(target)) {
-        for (i = 0, len = target.length; i < len; i++) {
-          insTarget = target[i];
-          this.instruction(insTarget);
-        }
-      } else if (isObject(target)) {
-        for (insTarget in target) {
-          if (!hasProp.call(target, insTarget)) continue;
-          insValue = target[insTarget];
-          this.instruction(insTarget, insValue);
-        }
-      } else {
-        if (isFunction(value)) {
-          value = value.apply();
-        }
-        instruction = new XMLProcessingInstruction(this, target, value);
-        this.instructions.push(instruction);
-      }
-      return this;
-    };
-
-    XMLElement.prototype.toString = function(options, level) {
-      var att, child, i, indent, instruction, j, len, len1, name, newline, offset, pretty, r, ref, ref1, ref2, ref3, ref4, ref5, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      ref3 = this.instructions;
-      for (i = 0, len = ref3.length; i < len; i++) {
-        instruction = ref3[i];
-        r += instruction.toString(options, level);
-      }
-      if (pretty) {
-        r += space;
-      }
-      r += '<' + this.name;
-      ref4 = this.attributes;
-      for (name in ref4) {
-        if (!hasProp.call(ref4, name)) continue;
-        att = ref4[name];
-        r += att.toString(options);
-      }
-      if (this.children.length === 0 || every(this.children, function(e) {
-        return e.value === '';
-      })) {
-        r += '/>';
-        if (pretty) {
-          r += newline;
-        }
-      } else if (pretty && this.children.length === 1 && (this.children[0].value != null)) {
-        r += '>';
-        r += this.children[0].value;
-        r += '</' + this.name + '>';
-        r += newline;
-      } else {
-        r += '>';
-        if (pretty) {
-          r += newline;
-        }
-        ref5 = this.children;
-        for (j = 0, len1 = ref5.length; j < len1; j++) {
-          child = ref5[j];
-          r += child.toString(options, level + 1);
-        }
-        if (pretty) {
-          r += space;
-        }
-        r += '</' + this.name + '>';
-        if (pretty) {
-          r += newline;
-        }
-      }
-      return r;
-    };
-
-    XMLElement.prototype.att = function(name, value) {
-      return this.attribute(name, value);
-    };
-
-    XMLElement.prototype.ins = function(target, value) {
-      return this.instruction(target, value);
-    };
-
-    XMLElement.prototype.a = function(name, value) {
-      return this.attribute(name, value);
-    };
-
-    XMLElement.prototype.i = function(target, value) {
-      return this.instruction(target, value);
-    };
-
-    return XMLElement;
-
-  })(XMLNode);
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLNode.js b/node_modules/xmlbuilder/lib/XMLNode.js
deleted file mode 100644
index 592545a..0000000
--- a/node_modules/xmlbuilder/lib/XMLNode.js
+++ /dev/null
@@ -1,331 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLRaw, XMLText, isEmpty, isFunction, isObject,
-    hasProp = {}.hasOwnProperty;
-
-  isObject = require('lodash/lang/isObject');
-
-  isFunction = require('lodash/lang/isFunction');
-
-  isEmpty = require('lodash/lang/isEmpty');
-
-  XMLElement = null;
-
-  XMLCData = null;
-
-  XMLComment = null;
-
-  XMLDeclaration = null;
-
-  XMLDocType = null;
-
-  XMLRaw = null;
-
-  XMLText = null;
-
-  module.exports = XMLNode = (function() {
-    function XMLNode(parent) {
-      this.parent = parent;
-      this.options = this.parent.options;
-      this.stringify = this.parent.stringify;
-      if (XMLElement === null) {
-        XMLElement = require('./XMLElement');
-        XMLCData = require('./XMLCData');
-        XMLComment = require('./XMLComment');
-        XMLDeclaration = require('./XMLDeclaration');
-        XMLDocType = require('./XMLDocType');
-        XMLRaw = require('./XMLRaw');
-        XMLText = require('./XMLText');
-      }
-    }
-
-    XMLNode.prototype.element = function(name, attributes, text) {
-      var childNode, item, j, k, key, lastChild, len, len1, ref, val;
-      lastChild = null;
-      if (attributes == null) {
-        attributes = {};
-      }
-      attributes = attributes.valueOf();
-      if (!isObject(attributes)) {
-        ref = [attributes, text], text = ref[0], attributes = ref[1];
-      }
-      if (name != null) {
-        name = name.valueOf();
-      }
-      if (Array.isArray(name)) {
-        for (j = 0, len = name.length; j < len; j++) {
-          item = name[j];
-          lastChild = this.element(item);
-        }
-      } else if (isFunction(name)) {
-        lastChild = this.element(name.apply());
-      } else if (isObject(name)) {
-        for (key in name) {
-          if (!hasProp.call(name, key)) continue;
-          val = name[key];
-          if (isFunction(val)) {
-            val = val.apply();
-          }
-          if ((isObject(val)) && (isEmpty(val))) {
-            val = null;
-          }
-          if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {
-            lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);
-          } else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && key.indexOf(this.stringify.convertPIKey) === 0) {
-            lastChild = this.instruction(key.substr(this.stringify.convertPIKey.length), val);
-          } else if (Array.isArray(val)) {
-            for (k = 0, len1 = val.length; k < len1; k++) {
-              item = val[k];
-              childNode = {};
-              childNode[key] = item;
-              lastChild = this.element(childNode);
-            }
-          } else if (isObject(val)) {
-            lastChild = this.element(key);
-            lastChild.element(val);
-          } else {
-            lastChild = this.element(key, val);
-          }
-        }
-      } else {
-        if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {
-          lastChild = this.text(text);
-        } else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {
-          lastChild = this.cdata(text);
-        } else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {
-          lastChild = this.comment(text);
-        } else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {
-          lastChild = this.raw(text);
-        } else {
-          lastChild = this.node(name, attributes, text);
-        }
-      }
-      if (lastChild == null) {
-        throw new Error("Could not create any elements with: " + name);
-      }
-      return lastChild;
-    };
-
-    XMLNode.prototype.insertBefore = function(name, attributes, text) {
-      var child, i, removed;
-      if (this.isRoot) {
-        throw new Error("Cannot insert elements at root level");
-      }
-      i = this.parent.children.indexOf(this);
-      removed = this.parent.children.splice(i);
-      child = this.parent.element(name, attributes, text);
-      Array.prototype.push.apply(this.parent.children, removed);
-      return child;
-    };
-
-    XMLNode.prototype.insertAfter = function(name, attributes, text) {
-      var child, i, removed;
-      if (this.isRoot) {
-        throw new Error("Cannot insert elements at root level");
-      }
-      i = this.parent.children.indexOf(this);
-      removed = this.parent.children.splice(i + 1);
-      child = this.parent.element(name, attributes, text);
-      Array.prototype.push.apply(this.parent.children, removed);
-      return child;
-    };
-
-    XMLNode.prototype.remove = function() {
-      var i, ref;
-      if (this.isRoot) {
-        throw new Error("Cannot remove the root element");
-      }
-      i = this.parent.children.indexOf(this);
-      [].splice.apply(this.parent.children, [i, i - i + 1].concat(ref = [])), ref;
-      return this.parent;
-    };
-
-    XMLNode.prototype.node = function(name, attributes, text) {
-      var child, ref;
-      if (name != null) {
-        name = name.valueOf();
-      }
-      if (attributes == null) {
-        attributes = {};
-      }
-      attributes = attributes.valueOf();
-      if (!isObject(attributes)) {
-        ref = [attributes, text], text = ref[0], attributes = ref[1];
-      }
-      child = new XMLElement(this, name, attributes);
-      if (text != null) {
-        child.text(text);
-      }
-      this.children.push(child);
-      return child;
-    };
-
-    XMLNode.prototype.text = function(value) {
-      var child;
-      child = new XMLText(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLNode.prototype.cdata = function(value) {
-      var child;
-      child = new XMLCData(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLNode.prototype.comment = function(value) {
-      var child;
-      child = new XMLComment(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLNode.prototype.raw = function(value) {
-      var child;
-      child = new XMLRaw(this, value);
-      this.children.push(child);
-      return this;
-    };
-
-    XMLNode.prototype.declaration = function(version, encoding, standalone) {
-      var doc, xmldec;
-      doc = this.document();
-      xmldec = new XMLDeclaration(doc, version, encoding, standalone);
-      doc.xmldec = xmldec;
-      return doc.root();
-    };
-
-    XMLNode.prototype.doctype = function(pubID, sysID) {
-      var doc, doctype;
-      doc = this.document();
-      doctype = new XMLDocType(doc, pubID, sysID);
-      doc.doctype = doctype;
-      return doctype;
-    };
-
-    XMLNode.prototype.up = function() {
-      if (this.isRoot) {
-        throw new Error("The root node has no parent. Use doc() if you need to get the document object.");
-      }
-      return this.parent;
-    };
-
-    XMLNode.prototype.root = function() {
-      var child;
-      if (this.isRoot) {
-        return this;
-      }
-      child = this.parent;
-      while (!child.isRoot) {
-        child = child.parent;
-      }
-      return child;
-    };
-
-    XMLNode.prototype.document = function() {
-      return this.root().documentObject;
-    };
-
-    XMLNode.prototype.end = function(options) {
-      return this.document().toString(options);
-    };
-
-    XMLNode.prototype.prev = function() {
-      var i;
-      if (this.isRoot) {
-        throw new Error("Root node has no siblings");
-      }
-      i = this.parent.children.indexOf(this);
-      if (i < 1) {
-        throw new Error("Already at the first node");
-      }
-      return this.parent.children[i - 1];
-    };
-
-    XMLNode.prototype.next = function() {
-      var i;
-      if (this.isRoot) {
-        throw new Error("Root node has no siblings");
-      }
-      i = this.parent.children.indexOf(this);
-      if (i === -1 || i === this.parent.children.length - 1) {
-        throw new Error("Already at the last node");
-      }
-      return this.parent.children[i + 1];
-    };
-
-    XMLNode.prototype.importXMLBuilder = function(xmlbuilder) {
-      var clonedRoot;
-      clonedRoot = xmlbuilder.root().clone();
-      clonedRoot.parent = this;
-      clonedRoot.isRoot = false;
-      this.children.push(clonedRoot);
-      return this;
-    };
-
-    XMLNode.prototype.ele = function(name, attributes, text) {
-      return this.element(name, attributes, text);
-    };
-
-    XMLNode.prototype.nod = function(name, attributes, text) {
-      return this.node(name, attributes, text);
-    };
-
-    XMLNode.prototype.txt = function(value) {
-      return this.text(value);
-    };
-
-    XMLNode.prototype.dat = function(value) {
-      return this.cdata(value);
-    };
-
-    XMLNode.prototype.com = function(value) {
-      return this.comment(value);
-    };
-
-    XMLNode.prototype.doc = function() {
-      return this.document();
-    };
-
-    XMLNode.prototype.dec = function(version, encoding, standalone) {
-      return this.declaration(version, encoding, standalone);
-    };
-
-    XMLNode.prototype.dtd = function(pubID, sysID) {
-      return this.doctype(pubID, sysID);
-    };
-
-    XMLNode.prototype.e = function(name, attributes, text) {
-      return this.element(name, attributes, text);
-    };
-
-    XMLNode.prototype.n = function(name, attributes, text) {
-      return this.node(name, attributes, text);
-    };
-
-    XMLNode.prototype.t = function(value) {
-      return this.text(value);
-    };
-
-    XMLNode.prototype.d = function(value) {
-      return this.cdata(value);
-    };
-
-    XMLNode.prototype.c = function(value) {
-      return this.comment(value);
-    };
-
-    XMLNode.prototype.r = function(value) {
-      return this.raw(value);
-    };
-
-    XMLNode.prototype.u = function() {
-      return this.up();
-    };
-
-    return XMLNode;
-
-  })();
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLProcessingInstruction.js b/node_modules/xmlbuilder/lib/XMLProcessingInstruction.js
deleted file mode 100644
index f5d8c6c..0000000
--- a/node_modules/xmlbuilder/lib/XMLProcessingInstruction.js
+++ /dev/null
@@ -1,51 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLProcessingInstruction, create;
-
-  create = require('lodash/object/create');
-
-  module.exports = XMLProcessingInstruction = (function() {
-    function XMLProcessingInstruction(parent, target, value) {
-      this.stringify = parent.stringify;
-      if (target == null) {
-        throw new Error("Missing instruction target");
-      }
-      this.target = this.stringify.insTarget(target);
-      if (value) {
-        this.value = this.stringify.insValue(value);
-      }
-    }
-
-    XMLProcessingInstruction.prototype.clone = function() {
-      return create(XMLProcessingInstruction.prototype, this);
-    };
-
-    XMLProcessingInstruction.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += '<?';
-      r += this.target;
-      if (this.value) {
-        r += ' ' + this.value;
-      }
-      r += '?>';
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLProcessingInstruction;
-
-  })();
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLRaw.js b/node_modules/xmlbuilder/lib/XMLRaw.js
deleted file mode 100644
index 499d0e2..0000000
--- a/node_modules/xmlbuilder/lib/XMLRaw.js
+++ /dev/null
@@ -1,49 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLNode, XMLRaw, create,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLRaw = (function(superClass) {
-    extend(XMLRaw, superClass);
-
-    function XMLRaw(parent, text) {
-      XMLRaw.__super__.constructor.call(this, parent);
-      if (text == null) {
-        throw new Error("Missing raw text");
-      }
-      this.value = this.stringify.raw(text);
-    }
-
-    XMLRaw.prototype.clone = function() {
-      return create(XMLRaw.prototype, this);
-    };
-
-    XMLRaw.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += this.value;
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLRaw;
-
-  })(XMLNode);
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLStringifier.js b/node_modules/xmlbuilder/lib/XMLStringifier.js
deleted file mode 100644
index f0ab1fc..0000000
--- a/node_modules/xmlbuilder/lib/XMLStringifier.js
+++ /dev/null
@@ -1,165 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLStringifier,
-    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
-    hasProp = {}.hasOwnProperty;
-
-  module.exports = XMLStringifier = (function() {
-    function XMLStringifier(options) {
-      this.assertLegalChar = bind(this.assertLegalChar, this);
-      var key, ref, value;
-      this.allowSurrogateChars = options != null ? options.allowSurrogateChars : void 0;
-      ref = (options != null ? options.stringify : void 0) || {};
-      for (key in ref) {
-        if (!hasProp.call(ref, key)) continue;
-        value = ref[key];
-        this[key] = value;
-      }
-    }
-
-    XMLStringifier.prototype.eleName = function(val) {
-      val = '' + val || '';
-      return this.assertLegalChar(val);
-    };
-
-    XMLStringifier.prototype.eleText = function(val) {
-      val = '' + val || '';
-      return this.assertLegalChar(this.elEscape(val));
-    };
-
-    XMLStringifier.prototype.cdata = function(val) {
-      val = '' + val || '';
-      if (val.match(/]]>/)) {
-        throw new Error("Invalid CDATA text: " + val);
-      }
-      return this.assertLegalChar(val);
-    };
-
-    XMLStringifier.prototype.comment = function(val) {
-      val = '' + val || '';
-      if (val.match(/--/)) {
-        throw new Error("Comment text cannot contain double-hypen: " + val);
-      }
-      return this.assertLegalChar(val);
-    };
-
-    XMLStringifier.prototype.raw = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.attName = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.attValue = function(val) {
-      val = '' + val || '';
-      return this.attEscape(val);
-    };
-
-    XMLStringifier.prototype.insTarget = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.insValue = function(val) {
-      val = '' + val || '';
-      if (val.match(/\?>/)) {
-        throw new Error("Invalid processing instruction value: " + val);
-      }
-      return val;
-    };
-
-    XMLStringifier.prototype.xmlVersion = function(val) {
-      val = '' + val || '';
-      if (!val.match(/1\.[0-9]+/)) {
-        throw new Error("Invalid version number: " + val);
-      }
-      return val;
-    };
-
-    XMLStringifier.prototype.xmlEncoding = function(val) {
-      val = '' + val || '';
-      if (!val.match(/^[A-Za-z](?:[A-Za-z0-9._-]|-)*$/)) {
-        throw new Error("Invalid encoding: " + val);
-      }
-      return val;
-    };
-
-    XMLStringifier.prototype.xmlStandalone = function(val) {
-      if (val) {
-        return "yes";
-      } else {
-        return "no";
-      }
-    };
-
-    XMLStringifier.prototype.dtdPubID = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdSysID = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdElementValue = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdAttType = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdAttDefault = function(val) {
-      if (val != null) {
-        return '' + val || '';
-      } else {
-        return val;
-      }
-    };
-
-    XMLStringifier.prototype.dtdEntityValue = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.dtdNData = function(val) {
-      return '' + val || '';
-    };
-
-    XMLStringifier.prototype.convertAttKey = '@';
-
-    XMLStringifier.prototype.convertPIKey = '?';
-
-    XMLStringifier.prototype.convertTextKey = '#text';
-
-    XMLStringifier.prototype.convertCDataKey = '#cdata';
-
-    XMLStringifier.prototype.convertCommentKey = '#comment';
-
-    XMLStringifier.prototype.convertRawKey = '#raw';
-
-    XMLStringifier.prototype.assertLegalChar = function(str) {
-      var chars, chr;
-      if (this.allowSurrogateChars) {
-        chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uFFFE-\uFFFF]/;
-      } else {
-        chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE-\uFFFF]/;
-      }
-      chr = str.match(chars);
-      if (chr) {
-        throw new Error("Invalid character (" + chr + ") in string: " + str + " at index " + chr.index);
-      }
-      return str;
-    };
-
-    XMLStringifier.prototype.elEscape = function(str) {
-      return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\r/g, '&#xD;');
-    };
-
-    XMLStringifier.prototype.attEscape = function(str) {
-      return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
-    };
-
-    return XMLStringifier;
-
-  })();
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/XMLText.js b/node_modules/xmlbuilder/lib/XMLText.js
deleted file mode 100644
index 15973b1..0000000
--- a/node_modules/xmlbuilder/lib/XMLText.js
+++ /dev/null
@@ -1,49 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLNode, XMLText, create,
-    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
-    hasProp = {}.hasOwnProperty;
-
-  create = require('lodash/object/create');
-
-  XMLNode = require('./XMLNode');
-
-  module.exports = XMLText = (function(superClass) {
-    extend(XMLText, superClass);
-
-    function XMLText(parent, text) {
-      XMLText.__super__.constructor.call(this, parent);
-      if (text == null) {
-        throw new Error("Missing element text");
-      }
-      this.value = this.stringify.eleText(text);
-    }
-
-    XMLText.prototype.clone = function() {
-      return create(XMLText.prototype, this);
-    };
-
-    XMLText.prototype.toString = function(options, level) {
-      var indent, newline, offset, pretty, r, ref, ref1, ref2, space;
-      pretty = (options != null ? options.pretty : void 0) || false;
-      indent = (ref = options != null ? options.indent : void 0) != null ? ref : '  ';
-      offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0;
-      newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n';
-      level || (level = 0);
-      space = new Array(level + offset + 1).join(indent);
-      r = '';
-      if (pretty) {
-        r += space;
-      }
-      r += this.value;
-      if (pretty) {
-        r += newline;
-      }
-      return r;
-    };
-
-    return XMLText;
-
-  })(XMLNode);
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/lib/index.js b/node_modules/xmlbuilder/lib/index.js
deleted file mode 100644
index d345101..0000000
--- a/node_modules/xmlbuilder/lib/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// Generated by CoffeeScript 1.9.1
-(function() {
-  var XMLBuilder, assign;
-
-  assign = require('lodash/object/assign');
-
-  XMLBuilder = require('./XMLBuilder');
-
-  module.exports.create = function(name, xmldec, doctype, options) {
-    options = assign({}, xmldec, doctype, options);
-    return new XMLBuilder(name, options).root();
-  };
-
-}).call(this);
diff --git a/node_modules/xmlbuilder/package.json b/node_modules/xmlbuilder/package.json
deleted file mode 100644
index d5286c1..0000000
--- a/node_modules/xmlbuilder/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "_args": [
-    [
-      "xmlbuilder@4.0.0",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "xmlbuilder@4.0.0",
-  "_id": "xmlbuilder@4.0.0",
-  "_inBundle": false,
-  "_integrity": "sha1-mLj2UcowqmJANvEn0RzGbce5B6M=",
-  "_location": "/xmlbuilder",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "xmlbuilder@4.0.0",
-    "name": "xmlbuilder",
-    "escapedName": "xmlbuilder",
-    "rawSpec": "4.0.0",
-    "saveSpec": null,
-    "fetchSpec": "4.0.0"
-  },
-  "_requiredBy": [
-    "/plist"
-  ],
-  "_resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.0.0.tgz",
-  "_spec": "4.0.0",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "Ozgur Ozcitak",
-    "email": "oozcitak@gmail.com"
-  },
-  "bugs": {
-    "url": "http://github.com/oozcitak/xmlbuilder-js/issues"
-  },
-  "contributors": [],
-  "dependencies": {
-    "lodash": "^3.5.0"
-  },
-  "description": "An XML builder for node.js",
-  "devDependencies": {
-    "coffee-coverage": "*",
-    "coffee-script": "*",
-    "coveralls": "*",
-    "istanbul": "*",
-    "mocha": "*"
-  },
-  "engines": {
-    "node": ">=0.8.0"
-  },
-  "homepage": "http://github.com/oozcitak/xmlbuilder-js",
-  "keywords": [
-    "xml",
-    "xmlbuilder"
-  ],
-  "license": "MIT",
-  "main": "./lib/index",
-  "name": "xmlbuilder",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/oozcitak/xmlbuilder-js.git"
-  },
-  "scripts": {
-    "postpublish": "rm -rf lib",
-    "prepublish": "coffee -co lib src",
-    "test": "mocha && istanbul report text lcov"
-  },
-  "version": "4.0.0"
-}
diff --git a/node_modules/xmldom/.npmignore b/node_modules/xmldom/.npmignore
deleted file mode 100644
index b094a44..0000000
--- a/node_modules/xmldom/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-test
-t
-travis.yml
-.project
-changelog
diff --git a/node_modules/xmldom/.travis.yml b/node_modules/xmldom/.travis.yml
deleted file mode 100644
index b95408e..0000000
--- a/node_modules/xmldom/.travis.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-language: node_js
-
-node_js:
-  - '0.10'
-
-branches:
-  only:
-    - master
-    - proof
-    - travis-ci
-
-# Not using `npm install --dev` because it is recursive. It will pull in the all
-# development dependencies for CoffeeScript. Way too much spew in the Travis CI
-# build output.
-
-before_install:
-  - npm install
-  - npm install istanbul coveralls
-
-env:
-  global:
-  - secure: "BxUHTsa1WVANLQoimilbZwa1MCWSdM9hOmPWBE/rsYb7uT/iiqkRXXwnWhKtN5CLvTvIQbiAzq4iyPID0S8UHrnxClYQrOuA6QkrtwgIEuDAmijao/bgxobPOremvkwXcpMGIwzYKyYQQtSEaEIQbqf6gSSKW9dBh/GZ/vfTsqo="
diff --git a/node_modules/xmldom/LICENSE b/node_modules/xmldom/LICENSE
deleted file mode 100644
index 68a9b5e..0000000
--- a/node_modules/xmldom/LICENSE
+++ /dev/null
@@ -1,8 +0,0 @@
-You can choose any one of those:
-
-The MIT License (MIT):
-
-link:http://opensource.org/licenses/MIT
-
-LGPL:
-http://www.gnu.org/licenses/lgpl.html
diff --git a/node_modules/xmldom/__package__.js b/node_modules/xmldom/__package__.js
deleted file mode 100644
index b4cad28..0000000
--- a/node_modules/xmldom/__package__.js
+++ /dev/null
@@ -1,4 +0,0 @@
-this.addScript('dom.js',['DOMImplementation','XMLSerializer']);
-this.addScript('dom-parser.js',['DOMHandler','DOMParser'],
-		['DOMImplementation','XMLReader']);
-this.addScript('sax.js','XMLReader');
\ No newline at end of file
diff --git a/node_modules/xmldom/changelog b/node_modules/xmldom/changelog
deleted file mode 100644
index ab815bb..0000000
--- a/node_modules/xmldom/changelog
+++ /dev/null
@@ -1,14 +0,0 @@
-### Version 0.1.16
-
-Sat May  4 14:58:03 UTC 2013
-
- * Correctly handle multibyte Unicode greater than two byts. #57. #56.
- * Initial unit testing and test coverage. #53. #46. #19.
- * Create Bower `component.json` #52.
-
-### Version 0.1.8
-
- * Add: some test case from node-o3-xml(excludes xpath support)
- * Fix: remove existed attribute before setting  (bug introduced in v0.1.5)
- * Fix: index direct access for childNodes and any NodeList collection(not w3c standard)
- * Fix: remove last child bug
diff --git a/node_modules/xmldom/component.json b/node_modules/xmldom/component.json
deleted file mode 100644
index 93b4d57..0000000
--- a/node_modules/xmldom/component.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "name": "xmldom",
-  "version": "0.1.15",
-  "main": "dom-parser.js",
-  "ignore": [
-    "**/.*",
-    "node_modules",
-    "components"
-  ]
-}
diff --git a/node_modules/xmldom/dom-parser.js b/node_modules/xmldom/dom-parser.js
deleted file mode 100644
index 41d5226..0000000
--- a/node_modules/xmldom/dom-parser.js
+++ /dev/null
@@ -1,251 +0,0 @@
-function DOMParser(options){
-	this.options = options ||{locator:{}};
-	
-}
-DOMParser.prototype.parseFromString = function(source,mimeType){
-	var options = this.options;
-	var sax =  new XMLReader();
-	var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
-	var errorHandler = options.errorHandler;
-	var locator = options.locator;
-	var defaultNSMap = options.xmlns||{};
-	var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
-	if(locator){
-		domBuilder.setDocumentLocator(locator)
-	}
-	
-	sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
-	sax.domBuilder = options.domBuilder || domBuilder;
-	if(/\/x?html?$/.test(mimeType)){
-		entityMap.nbsp = '\xa0';
-		entityMap.copy = '\xa9';
-		defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
-	}
-	defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
-	if(source){
-		sax.parse(source,defaultNSMap,entityMap);
-	}else{
-		sax.errorHandler.error("invalid doc source");
-	}
-	return domBuilder.doc;
-}
-function buildErrorHandler(errorImpl,domBuilder,locator){
-	if(!errorImpl){
-		if(domBuilder instanceof DOMHandler){
-			return domBuilder;
-		}
-		errorImpl = domBuilder ;
-	}
-	var errorHandler = {}
-	var isCallback = errorImpl instanceof Function;
-	locator = locator||{}
-	function build(key){
-		var fn = errorImpl[key];
-		if(!fn && isCallback){
-			fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
-		}
-		errorHandler[key] = fn && function(msg){
-			fn('[xmldom '+key+']\t'+msg+_locator(locator));
-		}||function(){};
-	}
-	build('warning');
-	build('error');
-	build('fatalError');
-	return errorHandler;
-}
-
-//console.log('#\n\n\n\n\n\n\n####')
-/**
- * +ContentHandler+ErrorHandler
- * +LexicalHandler+EntityResolver2
- * -DeclHandler-DTDHandler 
- * 
- * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
- * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
- * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
- */
-function DOMHandler() {
-    this.cdata = false;
-}
-function position(locator,node){
-	node.lineNumber = locator.lineNumber;
-	node.columnNumber = locator.columnNumber;
-}
-/**
- * @see org.xml.sax.ContentHandler#startDocument
- * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
- */ 
-DOMHandler.prototype = {
-	startDocument : function() {
-    	this.doc = new DOMImplementation().createDocument(null, null, null);
-    	if (this.locator) {
-        	this.doc.documentURI = this.locator.systemId;
-    	}
-	},
-	startElement:function(namespaceURI, localName, qName, attrs) {
-		var doc = this.doc;
-	    var el = doc.createElementNS(namespaceURI, qName||localName);
-	    var len = attrs.length;
-	    appendElement(this, el);
-	    this.currentElement = el;
-	    
-		this.locator && position(this.locator,el)
-	    for (var i = 0 ; i < len; i++) {
-	        var namespaceURI = attrs.getURI(i);
-	        var value = attrs.getValue(i);
-	        var qName = attrs.getQName(i);
-			var attr = doc.createAttributeNS(namespaceURI, qName);
-			this.locator &&position(attrs.getLocator(i),attr);
-			attr.value = attr.nodeValue = value;
-			el.setAttributeNode(attr)
-	    }
-	},
-	endElement:function(namespaceURI, localName, qName) {
-		var current = this.currentElement
-		var tagName = current.tagName;
-		this.currentElement = current.parentNode;
-	},
-	startPrefixMapping:function(prefix, uri) {
-	},
-	endPrefixMapping:function(prefix) {
-	},
-	processingInstruction:function(target, data) {
-	    var ins = this.doc.createProcessingInstruction(target, data);
-	    this.locator && position(this.locator,ins)
-	    appendElement(this, ins);
-	},
-	ignorableWhitespace:function(ch, start, length) {
-	},
-	characters:function(chars, start, length) {
-		chars = _toString.apply(this,arguments)
-		//console.log(chars)
-		if(chars){
-			if (this.cdata) {
-				var charNode = this.doc.createCDATASection(chars);
-			} else {
-				var charNode = this.doc.createTextNode(chars);
-			}
-			if(this.currentElement){
-				this.currentElement.appendChild(charNode);
-			}else if(/^\s*$/.test(chars)){
-				this.doc.appendChild(charNode);
-				//process xml
-			}
-			this.locator && position(this.locator,charNode)
-		}
-	},
-	skippedEntity:function(name) {
-	},
-	endDocument:function() {
-		this.doc.normalize();
-	},
-	setDocumentLocator:function (locator) {
-	    if(this.locator = locator){// && !('lineNumber' in locator)){
-	    	locator.lineNumber = 0;
-	    }
-	},
-	//LexicalHandler
-	comment:function(chars, start, length) {
-		chars = _toString.apply(this,arguments)
-	    var comm = this.doc.createComment(chars);
-	    this.locator && position(this.locator,comm)
-	    appendElement(this, comm);
-	},
-	
-	startCDATA:function() {
-	    //used in characters() methods
-	    this.cdata = true;
-	},
-	endCDATA:function() {
-	    this.cdata = false;
-	},
-	
-	startDTD:function(name, publicId, systemId) {
-		var impl = this.doc.implementation;
-	    if (impl && impl.createDocumentType) {
-	        var dt = impl.createDocumentType(name, publicId, systemId);
-	        this.locator && position(this.locator,dt)
-	        appendElement(this, dt);
-	    }
-	},
-	/**
-	 * @see org.xml.sax.ErrorHandler
-	 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
-	 */
-	warning:function(error) {
-		console.warn('[xmldom warning]\t'+error,_locator(this.locator));
-	},
-	error:function(error) {
-		console.error('[xmldom error]\t'+error,_locator(this.locator));
-	},
-	fatalError:function(error) {
-		console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
-	    throw error;
-	}
-}
-function _locator(l){
-	if(l){
-		return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
-	}
-}
-function _toString(chars,start,length){
-	if(typeof chars == 'string'){
-		return chars.substr(start,length)
-	}else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
-		if(chars.length >= start+length || start){
-			return new java.lang.String(chars,start,length)+'';
-		}
-		return chars;
-	}
-}
-
-/*
- * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
- * used method of org.xml.sax.ext.LexicalHandler:
- *  #comment(chars, start, length)
- *  #startCDATA()
- *  #endCDATA()
- *  #startDTD(name, publicId, systemId)
- *
- *
- * IGNORED method of org.xml.sax.ext.LexicalHandler:
- *  #endDTD()
- *  #startEntity(name)
- *  #endEntity(name)
- *
- *
- * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
- * IGNORED method of org.xml.sax.ext.DeclHandler
- * 	#attributeDecl(eName, aName, type, mode, value)
- *  #elementDecl(name, model)
- *  #externalEntityDecl(name, publicId, systemId)
- *  #internalEntityDecl(name, value)
- * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
- * IGNORED method of org.xml.sax.EntityResolver2
- *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
- *  #resolveEntity(publicId, systemId)
- *  #getExternalSubset(name, baseURI)
- * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
- * IGNORED method of org.xml.sax.DTDHandler
- *  #notationDecl(name, publicId, systemId) {};
- *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
- */
-"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
-	DOMHandler.prototype[key] = function(){return null}
-})
-
-/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
-function appendElement (hander,node) {
-    if (!hander.currentElement) {
-        hander.doc.appendChild(node);
-    } else {
-        hander.currentElement.appendChild(node);
-    }
-}//appendChild and setAttributeNS are preformance key
-
-//if(typeof require == 'function'){
-	var XMLReader = require('./sax').XMLReader;
-	var DOMImplementation = exports.DOMImplementation = require('./dom').DOMImplementation;
-	exports.XMLSerializer = require('./dom').XMLSerializer ;
-	exports.DOMParser = DOMParser;
-//}
diff --git a/node_modules/xmldom/dom.js b/node_modules/xmldom/dom.js
deleted file mode 100644
index b290df0..0000000
--- a/node_modules/xmldom/dom.js
+++ /dev/null
@@ -1,1244 +0,0 @@
-/*
- * DOM Level 2
- * Object DOMException
- * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
- * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
- */
-
-function copy(src,dest){
-	for(var p in src){
-		dest[p] = src[p];
-	}
-}
-/**
-^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
-^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
- */
-function _extends(Class,Super){
-	var pt = Class.prototype;
-	if(Object.create){
-		var ppt = Object.create(Super.prototype)
-		pt.__proto__ = ppt;
-	}
-	if(!(pt instanceof Super)){
-		function t(){};
-		t.prototype = Super.prototype;
-		t = new t();
-		copy(pt,t);
-		Class.prototype = pt = t;
-	}
-	if(pt.constructor != Class){
-		if(typeof Class != 'function'){
-			console.error("unknow Class:"+Class)
-		}
-		pt.constructor = Class
-	}
-}
-var htmlns = 'http://www.w3.org/1999/xhtml' ;
-// Node Types
-var NodeType = {}
-var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
-var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
-var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
-var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
-var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
-var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
-var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
-var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
-var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
-var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
-var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
-var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
-
-// ExceptionCode
-var ExceptionCode = {}
-var ExceptionMessage = {};
-var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
-var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
-var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
-var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
-var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
-var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
-var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
-var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
-var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
-var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
-//level2
-var INVALID_STATE_ERR        	= ExceptionCode.INVALID_STATE_ERR        	= ((ExceptionMessage[11]="Invalid state"),11);
-var SYNTAX_ERR               	= ExceptionCode.SYNTAX_ERR               	= ((ExceptionMessage[12]="Syntax error"),12);
-var INVALID_MODIFICATION_ERR 	= ExceptionCode.INVALID_MODIFICATION_ERR 	= ((ExceptionMessage[13]="Invalid modification"),13);
-var NAMESPACE_ERR            	= ExceptionCode.NAMESPACE_ERR           	= ((ExceptionMessage[14]="Invalid namespace"),14);
-var INVALID_ACCESS_ERR       	= ExceptionCode.INVALID_ACCESS_ERR      	= ((ExceptionMessage[15]="Invalid access"),15);
-
-
-function DOMException(code, message) {
-	if(message instanceof Error){
-		var error = message;
-	}else{
-		error = this;
-		Error.call(this, ExceptionMessage[code]);
-		this.message = ExceptionMessage[code];
-		if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
-	}
-	error.code = code;
-	if(message) this.message = this.message + ": " + message;
-	return error;
-};
-DOMException.prototype = Error.prototype;
-copy(ExceptionCode,DOMException)
-/**
- * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
- * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
- * The items in the NodeList are accessible via an integral index, starting from 0.
- */
-function NodeList() {
-};
-NodeList.prototype = {
-	/**
-	 * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
-	 * @standard level1
-	 */
-	length:0, 
-	/**
-	 * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
-	 * @standard level1
-	 * @param index  unsigned long 
-	 *   Index into the collection.
-	 * @return Node
-	 * 	The node at the indexth position in the NodeList, or null if that is not a valid index. 
-	 */
-	item: function(index) {
-		return this[index] || null;
-	},
-	toString:function(isHTML,nodeFilter){
-		for(var buf = [], i = 0;i<this.length;i++){
-			serializeToString(this[i],buf,isHTML,nodeFilter);
-		}
-		return buf.join('');
-	}
-};
-function LiveNodeList(node,refresh){
-	this._node = node;
-	this._refresh = refresh
-	_updateLiveList(this);
-}
-function _updateLiveList(list){
-	var inc = list._node._inc || list._node.ownerDocument._inc;
-	if(list._inc != inc){
-		var ls = list._refresh(list._node);
-		//console.log(ls.length)
-		__set__(list,'length',ls.length);
-		copy(ls,list);
-		list._inc = inc;
-	}
-}
-LiveNodeList.prototype.item = function(i){
-	_updateLiveList(this);
-	return this[i];
-}
-
-_extends(LiveNodeList,NodeList);
-/**
- * 
- * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
- * NamedNodeMap objects in the DOM are live.
- * used for attributes or DocumentType entities 
- */
-function NamedNodeMap() {
-};
-
-function _findNodeIndex(list,node){
-	var i = list.length;
-	while(i--){
-		if(list[i] === node){return i}
-	}
-}
-
-function _addNamedNode(el,list,newAttr,oldAttr){
-	if(oldAttr){
-		list[_findNodeIndex(list,oldAttr)] = newAttr;
-	}else{
-		list[list.length++] = newAttr;
-	}
-	if(el){
-		newAttr.ownerElement = el;
-		var doc = el.ownerDocument;
-		if(doc){
-			oldAttr && _onRemoveAttribute(doc,el,oldAttr);
-			_onAddAttribute(doc,el,newAttr);
-		}
-	}
-}
-function _removeNamedNode(el,list,attr){
-	//console.log('remove attr:'+attr)
-	var i = _findNodeIndex(list,attr);
-	if(i>=0){
-		var lastIndex = list.length-1
-		while(i<lastIndex){
-			list[i] = list[++i]
-		}
-		list.length = lastIndex;
-		if(el){
-			var doc = el.ownerDocument;
-			if(doc){
-				_onRemoveAttribute(doc,el,attr);
-				attr.ownerElement = null;
-			}
-		}
-	}else{
-		throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
-	}
-}
-NamedNodeMap.prototype = {
-	length:0,
-	item:NodeList.prototype.item,
-	getNamedItem: function(key) {
-//		if(key.indexOf(':')>0 || key == 'xmlns'){
-//			return null;
-//		}
-		//console.log()
-		var i = this.length;
-		while(i--){
-			var attr = this[i];
-			//console.log(attr.nodeName,key)
-			if(attr.nodeName == key){
-				return attr;
-			}
-		}
-	},
-	setNamedItem: function(attr) {
-		var el = attr.ownerElement;
-		if(el && el!=this._ownerElement){
-			throw new DOMException(INUSE_ATTRIBUTE_ERR);
-		}
-		var oldAttr = this.getNamedItem(attr.nodeName);
-		_addNamedNode(this._ownerElement,this,attr,oldAttr);
-		return oldAttr;
-	},
-	/* returns Node */
-	setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
-		var el = attr.ownerElement, oldAttr;
-		if(el && el!=this._ownerElement){
-			throw new DOMException(INUSE_ATTRIBUTE_ERR);
-		}
-		oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
-		_addNamedNode(this._ownerElement,this,attr,oldAttr);
-		return oldAttr;
-	},
-
-	/* returns Node */
-	removeNamedItem: function(key) {
-		var attr = this.getNamedItem(key);
-		_removeNamedNode(this._ownerElement,this,attr);
-		return attr;
-		
-		
-	},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
-	
-	//for level2
-	removeNamedItemNS:function(namespaceURI,localName){
-		var attr = this.getNamedItemNS(namespaceURI,localName);
-		_removeNamedNode(this._ownerElement,this,attr);
-		return attr;
-	},
-	getNamedItemNS: function(namespaceURI, localName) {
-		var i = this.length;
-		while(i--){
-			var node = this[i];
-			if(node.localName == localName && node.namespaceURI == namespaceURI){
-				return node;
-			}
-		}
-		return null;
-	}
-};
-/**
- * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
- */
-function DOMImplementation(/* Object */ features) {
-	this._features = {};
-	if (features) {
-		for (var feature in features) {
-			 this._features = features[feature];
-		}
-	}
-};
-
-DOMImplementation.prototype = {
-	hasFeature: function(/* string */ feature, /* string */ version) {
-		var versions = this._features[feature.toLowerCase()];
-		if (versions && (!version || version in versions)) {
-			return true;
-		} else {
-			return false;
-		}
-	},
-	// Introduced in DOM Level 2:
-	createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
-		var doc = new Document();
-		doc.implementation = this;
-		doc.childNodes = new NodeList();
-		doc.doctype = doctype;
-		if(doctype){
-			doc.appendChild(doctype);
-		}
-		if(qualifiedName){
-			var root = doc.createElementNS(namespaceURI,qualifiedName);
-			doc.appendChild(root);
-		}
-		return doc;
-	},
-	// Introduced in DOM Level 2:
-	createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
-		var node = new DocumentType();
-		node.name = qualifiedName;
-		node.nodeName = qualifiedName;
-		node.publicId = publicId;
-		node.systemId = systemId;
-		// Introduced in DOM Level 2:
-		//readonly attribute DOMString        internalSubset;
-		
-		//TODO:..
-		//  readonly attribute NamedNodeMap     entities;
-		//  readonly attribute NamedNodeMap     notations;
-		return node;
-	}
-};
-
-
-/**
- * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
- */
-
-function Node() {
-};
-
-Node.prototype = {
-	firstChild : null,
-	lastChild : null,
-	previousSibling : null,
-	nextSibling : null,
-	attributes : null,
-	parentNode : null,
-	childNodes : null,
-	ownerDocument : null,
-	nodeValue : null,
-	namespaceURI : null,
-	prefix : null,
-	localName : null,
-	// Modified in DOM Level 2:
-	insertBefore:function(newChild, refChild){//raises 
-		return _insertBefore(this,newChild,refChild);
-	},
-	replaceChild:function(newChild, oldChild){//raises 
-		this.insertBefore(newChild,oldChild);
-		if(oldChild){
-			this.removeChild(oldChild);
-		}
-	},
-	removeChild:function(oldChild){
-		return _removeChild(this,oldChild);
-	},
-	appendChild:function(newChild){
-		return this.insertBefore(newChild,null);
-	},
-	hasChildNodes:function(){
-		return this.firstChild != null;
-	},
-	cloneNode:function(deep){
-		return cloneNode(this.ownerDocument||this,this,deep);
-	},
-	// Modified in DOM Level 2:
-	normalize:function(){
-		var child = this.firstChild;
-		while(child){
-			var next = child.nextSibling;
-			if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
-				this.removeChild(next);
-				child.appendData(next.data);
-			}else{
-				child.normalize();
-				child = next;
-			}
-		}
-	},
-  	// Introduced in DOM Level 2:
-	isSupported:function(feature, version){
-		return this.ownerDocument.implementation.hasFeature(feature,version);
-	},
-    // Introduced in DOM Level 2:
-    hasAttributes:function(){
-    	return this.attributes.length>0;
-    },
-    lookupPrefix:function(namespaceURI){
-    	var el = this;
-    	while(el){
-    		var map = el._nsMap;
-    		//console.dir(map)
-    		if(map){
-    			for(var n in map){
-    				if(map[n] == namespaceURI){
-    					return n;
-    				}
-    			}
-    		}
-    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
-    	}
-    	return null;
-    },
-    // Introduced in DOM Level 3:
-    lookupNamespaceURI:function(prefix){
-    	var el = this;
-    	while(el){
-    		var map = el._nsMap;
-    		//console.dir(map)
-    		if(map){
-    			if(prefix in map){
-    				return map[prefix] ;
-    			}
-    		}
-    		el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
-    	}
-    	return null;
-    },
-    // Introduced in DOM Level 3:
-    isDefaultNamespace:function(namespaceURI){
-    	var prefix = this.lookupPrefix(namespaceURI);
-    	return prefix == null;
-    }
-};
-
-
-function _xmlEncoder(c){
-	return c == '<' && '&lt;' ||
-         c == '>' && '&gt;' ||
-         c == '&' && '&amp;' ||
-         c == '"' && '&quot;' ||
-         '&#'+c.charCodeAt()+';'
-}
-
-
-copy(NodeType,Node);
-copy(NodeType,Node.prototype);
-
-/**
- * @param callback return true for continue,false for break
- * @return boolean true: break visit;
- */
-function _visitNode(node,callback){
-	if(callback(node)){
-		return true;
-	}
-	if(node = node.firstChild){
-		do{
-			if(_visitNode(node,callback)){return true}
-        }while(node=node.nextSibling)
-    }
-}
-
-
-
-function Document(){
-}
-function _onAddAttribute(doc,el,newAttr){
-	doc && doc._inc++;
-	var ns = newAttr.namespaceURI ;
-	if(ns == 'http://www.w3.org/2000/xmlns/'){
-		//update namespace
-		el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value
-	}
-}
-function _onRemoveAttribute(doc,el,newAttr,remove){
-	doc && doc._inc++;
-	var ns = newAttr.namespaceURI ;
-	if(ns == 'http://www.w3.org/2000/xmlns/'){
-		//update namespace
-		delete el._nsMap[newAttr.prefix?newAttr.localName:'']
-	}
-}
-function _onUpdateChild(doc,el,newChild){
-	if(doc && doc._inc){
-		doc._inc++;
-		//update childNodes
-		var cs = el.childNodes;
-		if(newChild){
-			cs[cs.length++] = newChild;
-		}else{
-			//console.log(1)
-			var child = el.firstChild;
-			var i = 0;
-			while(child){
-				cs[i++] = child;
-				child =child.nextSibling;
-			}
-			cs.length = i;
-		}
-	}
-}
-
-/**
- * attributes;
- * children;
- * 
- * writeable properties:
- * nodeValue,Attr:value,CharacterData:data
- * prefix
- */
-function _removeChild(parentNode,child){
-	var previous = child.previousSibling;
-	var next = child.nextSibling;
-	if(previous){
-		previous.nextSibling = next;
-	}else{
-		parentNode.firstChild = next
-	}
-	if(next){
-		next.previousSibling = previous;
-	}else{
-		parentNode.lastChild = previous;
-	}
-	_onUpdateChild(parentNode.ownerDocument,parentNode);
-	return child;
-}
-/**
- * preformance key(refChild == null)
- */
-function _insertBefore(parentNode,newChild,nextChild){
-	var cp = newChild.parentNode;
-	if(cp){
-		cp.removeChild(newChild);//remove and update
-	}
-	if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
-		var newFirst = newChild.firstChild;
-		if (newFirst == null) {
-			return newChild;
-		}
-		var newLast = newChild.lastChild;
-	}else{
-		newFirst = newLast = newChild;
-	}
-	var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
-
-	newFirst.previousSibling = pre;
-	newLast.nextSibling = nextChild;
-	
-	
-	if(pre){
-		pre.nextSibling = newFirst;
-	}else{
-		parentNode.firstChild = newFirst;
-	}
-	if(nextChild == null){
-		parentNode.lastChild = newLast;
-	}else{
-		nextChild.previousSibling = newLast;
-	}
-	do{
-		newFirst.parentNode = parentNode;
-	}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
-	_onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
-	//console.log(parentNode.lastChild.nextSibling == null)
-	if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
-		newChild.firstChild = newChild.lastChild = null;
-	}
-	return newChild;
-}
-function _appendSingleChild(parentNode,newChild){
-	var cp = newChild.parentNode;
-	if(cp){
-		var pre = parentNode.lastChild;
-		cp.removeChild(newChild);//remove and update
-		var pre = parentNode.lastChild;
-	}
-	var pre = parentNode.lastChild;
-	newChild.parentNode = parentNode;
-	newChild.previousSibling = pre;
-	newChild.nextSibling = null;
-	if(pre){
-		pre.nextSibling = newChild;
-	}else{
-		parentNode.firstChild = newChild;
-	}
-	parentNode.lastChild = newChild;
-	_onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
-	return newChild;
-	//console.log("__aa",parentNode.lastChild.nextSibling == null)
-}
-Document.prototype = {
-	//implementation : null,
-	nodeName :  '#document',
-	nodeType :  DOCUMENT_NODE,
-	doctype :  null,
-	documentElement :  null,
-	_inc : 1,
-	
-	insertBefore :  function(newChild, refChild){//raises 
-		if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
-			var child = newChild.firstChild;
-			while(child){
-				var next = child.nextSibling;
-				this.insertBefore(child,refChild);
-				child = next;
-			}
-			return newChild;
-		}
-		if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
-			this.documentElement = newChild;
-		}
-		
-		return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
-	},
-	removeChild :  function(oldChild){
-		if(this.documentElement == oldChild){
-			this.documentElement = null;
-		}
-		return _removeChild(this,oldChild);
-	},
-	// Introduced in DOM Level 2:
-	importNode : function(importedNode,deep){
-		return importNode(this,importedNode,deep);
-	},
-	// Introduced in DOM Level 2:
-	getElementById :	function(id){
-		var rtv = null;
-		_visitNode(this.documentElement,function(node){
-			if(node.nodeType == ELEMENT_NODE){
-				if(node.getAttribute('id') == id){
-					rtv = node;
-					return true;
-				}
-			}
-		})
-		return rtv;
-	},
-	
-	//document factory method:
-	createElement :	function(tagName){
-		var node = new Element();
-		node.ownerDocument = this;
-		node.nodeName = tagName;
-		node.tagName = tagName;
-		node.childNodes = new NodeList();
-		var attrs	= node.attributes = new NamedNodeMap();
-		attrs._ownerElement = node;
-		return node;
-	},
-	createDocumentFragment :	function(){
-		var node = new DocumentFragment();
-		node.ownerDocument = this;
-		node.childNodes = new NodeList();
-		return node;
-	},
-	createTextNode :	function(data){
-		var node = new Text();
-		node.ownerDocument = this;
-		node.appendData(data)
-		return node;
-	},
-	createComment :	function(data){
-		var node = new Comment();
-		node.ownerDocument = this;
-		node.appendData(data)
-		return node;
-	},
-	createCDATASection :	function(data){
-		var node = new CDATASection();
-		node.ownerDocument = this;
-		node.appendData(data)
-		return node;
-	},
-	createProcessingInstruction :	function(target,data){
-		var node = new ProcessingInstruction();
-		node.ownerDocument = this;
-		node.tagName = node.target = target;
-		node.nodeValue= node.data = data;
-		return node;
-	},
-	createAttribute :	function(name){
-		var node = new Attr();
-		node.ownerDocument	= this;
-		node.name = name;
-		node.nodeName	= name;
-		node.localName = name;
-		node.specified = true;
-		return node;
-	},
-	createEntityReference :	function(name){
-		var node = new EntityReference();
-		node.ownerDocument	= this;
-		node.nodeName	= name;
-		return node;
-	},
-	// Introduced in DOM Level 2:
-	createElementNS :	function(namespaceURI,qualifiedName){
-		var node = new Element();
-		var pl = qualifiedName.split(':');
-		var attrs	= node.attributes = new NamedNodeMap();
-		node.childNodes = new NodeList();
-		node.ownerDocument = this;
-		node.nodeName = qualifiedName;
-		node.tagName = qualifiedName;
-		node.namespaceURI = namespaceURI;
-		if(pl.length == 2){
-			node.prefix = pl[0];
-			node.localName = pl[1];
-		}else{
-			//el.prefix = null;
-			node.localName = qualifiedName;
-		}
-		attrs._ownerElement = node;
-		return node;
-	},
-	// Introduced in DOM Level 2:
-	createAttributeNS :	function(namespaceURI,qualifiedName){
-		var node = new Attr();
-		var pl = qualifiedName.split(':');
-		node.ownerDocument = this;
-		node.nodeName = qualifiedName;
-		node.name = qualifiedName;
-		node.namespaceURI = namespaceURI;
-		node.specified = true;
-		if(pl.length == 2){
-			node.prefix = pl[0];
-			node.localName = pl[1];
-		}else{
-			//el.prefix = null;
-			node.localName = qualifiedName;
-		}
-		return node;
-	}
-};
-_extends(Document,Node);
-
-
-function Element() {
-	this._nsMap = {};
-};
-Element.prototype = {
-	nodeType : ELEMENT_NODE,
-	hasAttribute : function(name){
-		return this.getAttributeNode(name)!=null;
-	},
-	getAttribute : function(name){
-		var attr = this.getAttributeNode(name);
-		return attr && attr.value || '';
-	},
-	getAttributeNode : function(name){
-		return this.attributes.getNamedItem(name);
-	},
-	setAttribute : function(name, value){
-		var attr = this.ownerDocument.createAttribute(name);
-		attr.value = attr.nodeValue = "" + value;
-		this.setAttributeNode(attr)
-	},
-	removeAttribute : function(name){
-		var attr = this.getAttributeNode(name)
-		attr && this.removeAttributeNode(attr);
-	},
-	
-	//four real opeartion method
-	appendChild:function(newChild){
-		if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
-			return this.insertBefore(newChild,null);
-		}else{
-			return _appendSingleChild(this,newChild);
-		}
-	},
-	setAttributeNode : function(newAttr){
-		return this.attributes.setNamedItem(newAttr);
-	},
-	setAttributeNodeNS : function(newAttr){
-		return this.attributes.setNamedItemNS(newAttr);
-	},
-	removeAttributeNode : function(oldAttr){
-		//console.log(this == oldAttr.ownerElement)
-		return this.attributes.removeNamedItem(oldAttr.nodeName);
-	},
-	//get real attribute name,and remove it by removeAttributeNode
-	removeAttributeNS : function(namespaceURI, localName){
-		var old = this.getAttributeNodeNS(namespaceURI, localName);
-		old && this.removeAttributeNode(old);
-	},
-	
-	hasAttributeNS : function(namespaceURI, localName){
-		return this.getAttributeNodeNS(namespaceURI, localName)!=null;
-	},
-	getAttributeNS : function(namespaceURI, localName){
-		var attr = this.getAttributeNodeNS(namespaceURI, localName);
-		return attr && attr.value || '';
-	},
-	setAttributeNS : function(namespaceURI, qualifiedName, value){
-		var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
-		attr.value = attr.nodeValue = "" + value;
-		this.setAttributeNode(attr)
-	},
-	getAttributeNodeNS : function(namespaceURI, localName){
-		return this.attributes.getNamedItemNS(namespaceURI, localName);
-	},
-	
-	getElementsByTagName : function(tagName){
-		return new LiveNodeList(this,function(base){
-			var ls = [];
-			_visitNode(base,function(node){
-				if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
-					ls.push(node);
-				}
-			});
-			return ls;
-		});
-	},
-	getElementsByTagNameNS : function(namespaceURI, localName){
-		return new LiveNodeList(this,function(base){
-			var ls = [];
-			_visitNode(base,function(node){
-				if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
-					ls.push(node);
-				}
-			});
-			return ls;
-			
-		});
-	}
-};
-Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
-Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
-
-
-_extends(Element,Node);
-function Attr() {
-};
-Attr.prototype.nodeType = ATTRIBUTE_NODE;
-_extends(Attr,Node);
-
-
-function CharacterData() {
-};
-CharacterData.prototype = {
-	data : '',
-	substringData : function(offset, count) {
-		return this.data.substring(offset, offset+count);
-	},
-	appendData: function(text) {
-		text = this.data+text;
-		this.nodeValue = this.data = text;
-		this.length = text.length;
-	},
-	insertData: function(offset,text) {
-		this.replaceData(offset,0,text);
-	
-	},
-	appendChild:function(newChild){
-		throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
-	},
-	deleteData: function(offset, count) {
-		this.replaceData(offset,count,"");
-	},
-	replaceData: function(offset, count, text) {
-		var start = this.data.substring(0,offset);
-		var end = this.data.substring(offset+count);
-		text = start + text + end;
-		this.nodeValue = this.data = text;
-		this.length = text.length;
-	}
-}
-_extends(CharacterData,Node);
-function Text() {
-};
-Text.prototype = {
-	nodeName : "#text",
-	nodeType : TEXT_NODE,
-	splitText : function(offset) {
-		var text = this.data;
-		var newText = text.substring(offset);
-		text = text.substring(0, offset);
-		this.data = this.nodeValue = text;
-		this.length = text.length;
-		var newNode = this.ownerDocument.createTextNode(newText);
-		if(this.parentNode){
-			this.parentNode.insertBefore(newNode, this.nextSibling);
-		}
-		return newNode;
-	}
-}
-_extends(Text,CharacterData);
-function Comment() {
-};
-Comment.prototype = {
-	nodeName : "#comment",
-	nodeType : COMMENT_NODE
-}
-_extends(Comment,CharacterData);
-
-function CDATASection() {
-};
-CDATASection.prototype = {
-	nodeName : "#cdata-section",
-	nodeType : CDATA_SECTION_NODE
-}
-_extends(CDATASection,CharacterData);
-
-
-function DocumentType() {
-};
-DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
-_extends(DocumentType,Node);
-
-function Notation() {
-};
-Notation.prototype.nodeType = NOTATION_NODE;
-_extends(Notation,Node);
-
-function Entity() {
-};
-Entity.prototype.nodeType = ENTITY_NODE;
-_extends(Entity,Node);
-
-function EntityReference() {
-};
-EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
-_extends(EntityReference,Node);
-
-function DocumentFragment() {
-};
-DocumentFragment.prototype.nodeName =	"#document-fragment";
-DocumentFragment.prototype.nodeType =	DOCUMENT_FRAGMENT_NODE;
-_extends(DocumentFragment,Node);
-
-
-function ProcessingInstruction() {
-}
-ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
-_extends(ProcessingInstruction,Node);
-function XMLSerializer(){}
-XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){
-	return nodeSerializeToString.call(node,isHtml,nodeFilter);
-}
-Node.prototype.toString = nodeSerializeToString;
-function nodeSerializeToString(isHtml,nodeFilter){
-	var buf = [];
-	var refNode = this.nodeType == 9?this.documentElement:this;
-	var prefix = refNode.prefix;
-	var uri = refNode.namespaceURI;
-	
-	if(uri && prefix == null){
-		//console.log(prefix)
-		var prefix = refNode.lookupPrefix(uri);
-		if(prefix == null){
-			//isHTML = true;
-			var visibleNamespaces=[
-			{namespace:uri,prefix:null}
-			//{namespace:uri,prefix:''}
-			]
-		}
-	}
-	serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
-	//console.log('###',this.nodeType,uri,prefix,buf.join(''))
-	return buf.join('');
-}
-function needNamespaceDefine(node,isHTML, visibleNamespaces) {
-	var prefix = node.prefix||'';
-	var uri = node.namespaceURI;
-	if (!prefix && !uri){
-		return false;
-	}
-	if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
-		|| uri == 'http://www.w3.org/2000/xmlns/'){
-		return false;
-	}
-	
-	var i = visibleNamespaces.length 
-	//console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
-	while (i--) {
-		var ns = visibleNamespaces[i];
-		// get namespace prefix
-		//console.log(node.nodeType,node.tagName,ns.prefix,prefix)
-		if (ns.prefix == prefix){
-			return ns.namespace != uri;
-		}
-	}
-	//console.log(isHTML,uri,prefix=='')
-	//if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
-	//	return false;
-	//}
-	//node.flag = '11111'
-	//console.error(3,true,node.flag,node.prefix,node.namespaceURI)
-	return true;
-}
-function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
-	if(nodeFilter){
-		node = nodeFilter(node);
-		if(node){
-			if(typeof node == 'string'){
-				buf.push(node);
-				return;
-			}
-		}else{
-			return;
-		}
-		//buf.sort.apply(attrs, attributeSorter);
-	}
-	switch(node.nodeType){
-	case ELEMENT_NODE:
-		if (!visibleNamespaces) visibleNamespaces = [];
-		var startVisibleNamespaces = visibleNamespaces.length;
-		var attrs = node.attributes;
-		var len = attrs.length;
-		var child = node.firstChild;
-		var nodeName = node.tagName;
-		
-		isHTML =  (htmlns === node.namespaceURI) ||isHTML 
-		buf.push('<',nodeName);
-		
-		
-		
-		for(var i=0;i<len;i++){
-			// add namespaces for attributes
-			var attr = attrs.item(i);
-			if (attr.prefix == 'xmlns') {
-				visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
-			}else if(attr.nodeName == 'xmlns'){
-				visibleNamespaces.push({ prefix: '', namespace: attr.value });
-			}
-		}
-		for(var i=0;i<len;i++){
-			var attr = attrs.item(i);
-			if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
-				var prefix = attr.prefix||'';
-				var uri = attr.namespaceURI;
-				var ns = prefix ? ' xmlns:' + prefix : " xmlns";
-				buf.push(ns, '="' , uri , '"');
-				visibleNamespaces.push({ prefix: prefix, namespace:uri });
-			}
-			serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
-		}
-		// add namespace for current node		
-		if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
-			var prefix = node.prefix||'';
-			var uri = node.namespaceURI;
-			var ns = prefix ? ' xmlns:' + prefix : " xmlns";
-			buf.push(ns, '="' , uri , '"');
-			visibleNamespaces.push({ prefix: prefix, namespace:uri });
-		}
-		
-		if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
-			buf.push('>');
-			//if is cdata child node
-			if(isHTML && /^script$/i.test(nodeName)){
-				while(child){
-					if(child.data){
-						buf.push(child.data);
-					}else{
-						serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
-					}
-					child = child.nextSibling;
-				}
-			}else
-			{
-				while(child){
-					serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
-					child = child.nextSibling;
-				}
-			}
-			buf.push('</',nodeName,'>');
-		}else{
-			buf.push('/>');
-		}
-		// remove added visible namespaces
-		//visibleNamespaces.length = startVisibleNamespaces;
-		return;
-	case DOCUMENT_NODE:
-	case DOCUMENT_FRAGMENT_NODE:
-		var child = node.firstChild;
-		while(child){
-			serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
-			child = child.nextSibling;
-		}
-		return;
-	case ATTRIBUTE_NODE:
-		return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
-	case TEXT_NODE:
-		return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
-	case CDATA_SECTION_NODE:
-		return buf.push( '<![CDATA[',node.data,']]>');
-	case COMMENT_NODE:
-		return buf.push( "<!--",node.data,"-->");
-	case DOCUMENT_TYPE_NODE:
-		var pubid = node.publicId;
-		var sysid = node.systemId;
-		buf.push('<!DOCTYPE ',node.name);
-		if(pubid){
-			buf.push(' PUBLIC "',pubid);
-			if (sysid && sysid!='.') {
-				buf.push( '" "',sysid);
-			}
-			buf.push('">');
-		}else if(sysid && sysid!='.'){
-			buf.push(' SYSTEM "',sysid,'">');
-		}else{
-			var sub = node.internalSubset;
-			if(sub){
-				buf.push(" [",sub,"]");
-			}
-			buf.push(">");
-		}
-		return;
-	case PROCESSING_INSTRUCTION_NODE:
-		return buf.push( "<?",node.target," ",node.data,"?>");
-	case ENTITY_REFERENCE_NODE:
-		return buf.push( '&',node.nodeName,';');
-	//case ENTITY_NODE:
-	//case NOTATION_NODE:
-	default:
-		buf.push('??',node.nodeName);
-	}
-}
-function importNode(doc,node,deep){
-	var node2;
-	switch (node.nodeType) {
-	case ELEMENT_NODE:
-		node2 = node.cloneNode(false);
-		node2.ownerDocument = doc;
-		//var attrs = node2.attributes;
-		//var len = attrs.length;
-		//for(var i=0;i<len;i++){
-			//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
-		//}
-	case DOCUMENT_FRAGMENT_NODE:
-		break;
-	case ATTRIBUTE_NODE:
-		deep = true;
-		break;
-	//case ENTITY_REFERENCE_NODE:
-	//case PROCESSING_INSTRUCTION_NODE:
-	////case TEXT_NODE:
-	//case CDATA_SECTION_NODE:
-	//case COMMENT_NODE:
-	//	deep = false;
-	//	break;
-	//case DOCUMENT_NODE:
-	//case DOCUMENT_TYPE_NODE:
-	//cannot be imported.
-	//case ENTITY_NODE:
-	//case NOTATION_NODE:
-	//can not hit in level3
-	//default:throw e;
-	}
-	if(!node2){
-		node2 = node.cloneNode(false);//false
-	}
-	node2.ownerDocument = doc;
-	node2.parentNode = null;
-	if(deep){
-		var child = node.firstChild;
-		while(child){
-			node2.appendChild(importNode(doc,child,deep));
-			child = child.nextSibling;
-		}
-	}
-	return node2;
-}
-//
-//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
-//					attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
-function cloneNode(doc,node,deep){
-	var node2 = new node.constructor();
-	for(var n in node){
-		var v = node[n];
-		if(typeof v != 'object' ){
-			if(v != node2[n]){
-				node2[n] = v;
-			}
-		}
-	}
-	if(node.childNodes){
-		node2.childNodes = new NodeList();
-	}
-	node2.ownerDocument = doc;
-	switch (node2.nodeType) {
-	case ELEMENT_NODE:
-		var attrs	= node.attributes;
-		var attrs2	= node2.attributes = new NamedNodeMap();
-		var len = attrs.length
-		attrs2._ownerElement = node2;
-		for(var i=0;i<len;i++){
-			node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
-		}
-		break;;
-	case ATTRIBUTE_NODE:
-		deep = true;
-	}
-	if(deep){
-		var child = node.firstChild;
-		while(child){
-			node2.appendChild(cloneNode(doc,child,deep));
-			child = child.nextSibling;
-		}
-	}
-	return node2;
-}
-
-function __set__(object,key,value){
-	object[key] = value
-}
-//do dynamic
-try{
-	if(Object.defineProperty){
-		Object.defineProperty(LiveNodeList.prototype,'length',{
-			get:function(){
-				_updateLiveList(this);
-				return this.$$length;
-			}
-		});
-		Object.defineProperty(Node.prototype,'textContent',{
-			get:function(){
-				return getTextContent(this);
-			},
-			set:function(data){
-				switch(this.nodeType){
-				case ELEMENT_NODE:
-				case DOCUMENT_FRAGMENT_NODE:
-					while(this.firstChild){
-						this.removeChild(this.firstChild);
-					}
-					if(data || String(data)){
-						this.appendChild(this.ownerDocument.createTextNode(data));
-					}
-					break;
-				default:
-					//TODO:
-					this.data = data;
-					this.value = data;
-					this.nodeValue = data;
-				}
-			}
-		})
-		
-		function getTextContent(node){
-			switch(node.nodeType){
-			case ELEMENT_NODE:
-			case DOCUMENT_FRAGMENT_NODE:
-				var buf = [];
-				node = node.firstChild;
-				while(node){
-					if(node.nodeType!==7 && node.nodeType !==8){
-						buf.push(getTextContent(node));
-					}
-					node = node.nextSibling;
-				}
-				return buf.join('');
-			default:
-				return node.nodeValue;
-			}
-		}
-		__set__ = function(object,key,value){
-			//console.log(value)
-			object['$$'+key] = value
-		}
-	}
-}catch(e){//ie8
-}
-
-//if(typeof require == 'function'){
-	exports.DOMImplementation = DOMImplementation;
-	exports.XMLSerializer = XMLSerializer;
-//}
diff --git a/node_modules/xmldom/package.json b/node_modules/xmldom/package.json
deleted file mode 100644
index 2be3ad4..0000000
--- a/node_modules/xmldom/package.json
+++ /dev/null
@@ -1,98 +0,0 @@
-{
-  "_args": [
-    [
-      "xmldom@0.1.27",
-      "C:\\Projects\\Cordova\\cordova-windows"
-    ]
-  ],
-  "_from": "xmldom@0.1.27",
-  "_id": "xmldom@0.1.27",
-  "_inBundle": false,
-  "_integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=",
-  "_location": "/xmldom",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "xmldom@0.1.27",
-    "name": "xmldom",
-    "escapedName": "xmldom",
-    "rawSpec": "0.1.27",
-    "saveSpec": null,
-    "fetchSpec": "0.1.27"
-  },
-  "_requiredBy": [
-    "/plist"
-  ],
-  "_resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz",
-  "_spec": "0.1.27",
-  "_where": "C:\\Projects\\Cordova\\cordova-windows",
-  "author": {
-    "name": "jindw",
-    "email": "jindw@xidea.org",
-    "url": "http://www.xidea.org"
-  },
-  "bugs": {
-    "url": "http://github.com/jindw/xmldom/issues",
-    "email": "jindw@xidea.org"
-  },
-  "contributors": [
-    {
-      "name": "Yaron Naveh",
-      "email": "yaronn01@gmail.com",
-      "url": "http://webservices20.blogspot.com/"
-    },
-    {
-      "name": "Harutyun Amirjanyan",
-      "email": "amirjanyan@gmail.com",
-      "url": "https://github.com/nightwing"
-    },
-    {
-      "name": "Alan Gutierrez",
-      "email": "alan@prettyrobots.com",
-      "url": "http://www.prettyrobots.com/"
-    }
-  ],
-  "dependencies": {},
-  "description": "A W3C Standard XML DOM(Level2 CORE) implementation and parser(DOMParser/XMLSerializer).",
-  "devDependencies": {
-    "proof": "0.0.28"
-  },
-  "engines": {
-    "node": ">=0.1"
-  },
-  "homepage": "https://github.com/jindw/xmldom",
-  "keywords": [
-    "w3c",
-    "dom",
-    "xml",
-    "parser",
-    "javascript",
-    "DOMParser",
-    "XMLSerializer"
-  ],
-  "licenses": [
-    {
-      "type": "LGPL",
-      "url": "http://www.gnu.org/licenses/lgpl.html",
-      "MIT": "http://opensource.org/licenses/MIT"
-    }
-  ],
-  "main": "./dom-parser.js",
-  "maintainers": [
-    {
-      "name": "jindw",
-      "email": "jindw@xidea.org",
-      "url": "http://www.xidea.org"
-    }
-  ],
-  "name": "xmldom",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/jindw/xmldom.git"
-  },
-  "scripts": {
-    "test": "proof platform win32 && proof test */*/*.t.js || t/test"
-  },
-  "version": "0.1.27"
-}
diff --git a/node_modules/xmldom/readme.md b/node_modules/xmldom/readme.md
deleted file mode 100644
index f832c44..0000000
--- a/node_modules/xmldom/readme.md
+++ /dev/null
@@ -1,219 +0,0 @@
-# XMLDOM [![Build Status](https://secure.travis-ci.org/bigeasy/xmldom.png?branch=master)](http://travis-ci.org/bigeasy/xmldom) [![Coverage Status](https://coveralls.io/repos/bigeasy/xmldom/badge.png?branch=master)](https://coveralls.io/r/bigeasy/xmldom) [![NPM version](https://badge.fury.io/js/xmldom.png)](http://badge.fury.io/js/xmldom)
-
-A JavaScript implementation of W3C DOM for Node.js, Rhino and the browser. Fully
-compatible with `W3C DOM level2`; and some compatible with `level3`. Supports
-`DOMParser` and `XMLSerializer` interface such as in browser.
-
-Install:
--------
->npm install xmldom
-
-Example:
-====
-```javascript
-var DOMParser = require('xmldom').DOMParser;
-var doc = new DOMParser().parseFromString(
-    '<xml xmlns="a" xmlns:c="./lite">\n'+
-        '\t<child>test</child>\n'+
-        '\t<child></child>\n'+
-        '\t<child/>\n'+
-    '</xml>'
-    ,'text/xml');
-doc.documentElement.setAttribute('x','y');
-doc.documentElement.setAttributeNS('./lite','c:x','y2');
-var nsAttr = doc.documentElement.getAttributeNS('./lite','x')
-console.info(nsAttr)
-console.info(doc)
-```
-API Reference
-=====
-
- * [DOMParser](https://developer.mozilla.org/en/DOMParser):
-
-	```javascript
-	parseFromString(xmlsource,mimeType)
-	```
-	* **options extension** _by xmldom_(not BOM standard!!)
-
-	```javascript
-	//added the options argument
-	new DOMParser(options)
-	
-	//errorHandler is supported
-	new DOMParser({
-		/**
-		 * locator is always need for error position info
-		 */
-		locator:{},
-		/**
-		 * you can override the errorHandler for xml parser
-		 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
-		 */
-		errorHandler:{warning:function(w){console.warn(w)},error:callback,fatalError:callback}
-		//only callback model
-		//errorHandler:function(level,msg){console.log(level,msg)}
-	})
-		
-	```
-
- * [XMLSerializer](https://developer.mozilla.org/en/XMLSerializer)
- 
-	```javascript
-	serializeToString(node)
-	```
-DOM level2 method and attribute:
-------
-
- * [Node](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247)
-	
-		attribute:
-			nodeValue|prefix
-		readonly attribute:
-			nodeName|nodeType|parentNode|childNodes|firstChild|lastChild|previousSibling|nextSibling|attributes|ownerDocument|namespaceURI|localName
-		method:	
-			insertBefore(newChild, refChild)
-			replaceChild(newChild, oldChild)
-			removeChild(oldChild)
-			appendChild(newChild)
-			hasChildNodes()
-			cloneNode(deep)
-			normalize()
-			isSupported(feature, version)
-			hasAttributes()
-
- * [DOMImplementation](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-102161490)
-		
-		method:
-			hasFeature(feature, version)
-			createDocumentType(qualifiedName, publicId, systemId)
-			createDocument(namespaceURI, qualifiedName, doctype)
-
- * [Document](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#i-Document) : Node
-		
-		readonly attribute:
-			doctype|implementation|documentElement
-		method:
-			createElement(tagName)
-			createDocumentFragment()
-			createTextNode(data)
-			createComment(data)
-			createCDATASection(data)
-			createProcessingInstruction(target, data)
-			createAttribute(name)
-			createEntityReference(name)
-			getElementsByTagName(tagname)
-			importNode(importedNode, deep)
-			createElementNS(namespaceURI, qualifiedName)
-			createAttributeNS(namespaceURI, qualifiedName)
-			getElementsByTagNameNS(namespaceURI, localName)
-			getElementById(elementId)
-
- * [DocumentFragment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-B63ED1A3) : Node
- * [Element](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-745549614) : Node
-		
-		readonly attribute:
-			tagName
-		method:
-			getAttribute(name)
-			setAttribute(name, value)
-			removeAttribute(name)
-			getAttributeNode(name)
-			setAttributeNode(newAttr)
-			removeAttributeNode(oldAttr)
-			getElementsByTagName(name)
-			getAttributeNS(namespaceURI, localName)
-			setAttributeNS(namespaceURI, qualifiedName, value)
-			removeAttributeNS(namespaceURI, localName)
-			getAttributeNodeNS(namespaceURI, localName)
-			setAttributeNodeNS(newAttr)
-			getElementsByTagNameNS(namespaceURI, localName)
-			hasAttribute(name)
-			hasAttributeNS(namespaceURI, localName)
-
- * [Attr](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-637646024) : Node
-	
-		attribute:
-			value
-		readonly attribute:
-			name|specified|ownerElement
-
- * [NodeList](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177)
-		
-		readonly attribute:
-			length
-		method:
-			item(index)
-	
- * [NamedNodeMap](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1780488922)
-
-		readonly attribute:
-			length
-		method:
-			getNamedItem(name)
-			setNamedItem(arg)
-			removeNamedItem(name)
-			item(index)
-			getNamedItemNS(namespaceURI, localName)
-			setNamedItemNS(arg)
-			removeNamedItemNS(namespaceURI, localName)
-		
- * [CharacterData](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-FF21A306) : Node
-	
-		method:
-			substringData(offset, count)
-			appendData(arg)
-			insertData(offset, arg)
-			deleteData(offset, count)
-			replaceData(offset, count, arg)
-		
- * [Text](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1312295772) : CharacterData
-	
-		method:
-			splitText(offset)
-			
- * [CDATASection](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-667469212)
- * [Comment](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1728279322) : CharacterData
-	
- * [DocumentType](http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-412266927)
-	
-		readonly attribute:
-			name|entities|notations|publicId|systemId|internalSubset
-			
- * Notation : Node
-	
-		readonly attribute:
-			publicId|systemId
-			
- * Entity : Node
-	
-		readonly attribute:
-			publicId|systemId|notationName
-			
- * EntityReference : Node 
- * ProcessingInstruction : Node 
-	
-		attribute:
-			data
-		readonly attribute:
-			target
-		
-DOM level 3 support:
------
-
- * [Node](http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-textContent)
-		
-		attribute:
-			textContent
-		method:
-			isDefaultNamespace(namespaceURI){
-			lookupNamespaceURI(prefix)
-
-DOM extension by xmldom
----
- * [Node] Source position extension; 
-		
-		attribute:
-			//Numbered starting from '1'
-			lineNumber
-			//Numbered starting from '1'
-			columnNumber
diff --git a/node_modules/xmldom/sax.js b/node_modules/xmldom/sax.js
deleted file mode 100644
index b33635f..0000000
--- a/node_modules/xmldom/sax.js
+++ /dev/null
@@ -1,633 +0,0 @@
-//[4]   	NameStartChar	   ::=   	":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
-//[4a]   	NameChar	   ::=   	NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
-//[5]   	Name	   ::=   	NameStartChar (NameChar)*
-var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF
-var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
-var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
-//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
-//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
-
-//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
-//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
-var S_TAG = 0;//tag name offerring
-var S_ATTR = 1;//attr name offerring 
-var S_ATTR_SPACE=2;//attr name end and space offer
-var S_EQ = 3;//=space?
-var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
-var S_ATTR_END = 5;//attr value end and no space(quot end)
-var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
-var S_TAG_CLOSE = 7;//closed el<el />
-
-function XMLReader(){
-	
-}
-
-XMLReader.prototype = {
-	parse:function(source,defaultNSMap,entityMap){
-		var domBuilder = this.domBuilder;
-		domBuilder.startDocument();
-		_copy(defaultNSMap ,defaultNSMap = {})
-		parse(source,defaultNSMap,entityMap,
-				domBuilder,this.errorHandler);
-		domBuilder.endDocument();
-	}
-}
-function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
-	function fixedFromCharCode(code) {
-		// String.prototype.fromCharCode does not supports
-		// > 2 bytes unicode chars directly
-		if (code > 0xffff) {
-			code -= 0x10000;
-			var surrogate1 = 0xd800 + (code >> 10)
-				, surrogate2 = 0xdc00 + (code & 0x3ff);
-
-			return String.fromCharCode(surrogate1, surrogate2);
-		} else {
-			return String.fromCharCode(code);
-		}
-	}
-	function entityReplacer(a){
-		var k = a.slice(1,-1);
-		if(k in entityMap){
-			return entityMap[k]; 
-		}else if(k.charAt(0) === '#'){
-			return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
-		}else{
-			errorHandler.error('entity not found:'+a);
-			return a;
-		}
-	}
-	function appendText(end){//has some bugs
-		if(end>start){
-			var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
-			locator&&position(start);
-			domBuilder.characters(xt,0,end-start);
-			start = end
-		}
-	}
-	function position(p,m){
-		while(p>=lineEnd && (m = linePattern.exec(source))){
-			lineStart = m.index;
-			lineEnd = lineStart + m[0].length;
-			locator.lineNumber++;
-			//console.log('line++:',locator,startPos,endPos)
-		}
-		locator.columnNumber = p-lineStart+1;
-	}
-	var lineStart = 0;
-	var lineEnd = 0;
-	var linePattern = /.*(?:\r\n?|\n)|.*$/g
-	var locator = domBuilder.locator;
-	
-	var parseStack = [{currentNSMap:defaultNSMapCopy}]
-	var closeMap = {};
-	var start = 0;
-	while(true){
-		try{
-			var tagStart = source.indexOf('<',start);
-			if(tagStart<0){
-				if(!source.substr(start).match(/^\s*$/)){
-					var doc = domBuilder.doc;
-	    			var text = doc.createTextNode(source.substr(start));
-	    			doc.appendChild(text);
-	    			domBuilder.currentElement = text;
-				}
-				return;
-			}
-			if(tagStart>start){
-				appendText(tagStart);
-			}
-			switch(source.charAt(tagStart+1)){
-			case '/':
-				var end = source.indexOf('>',tagStart+3);
-				var tagName = source.substring(tagStart+2,end);
-				var config = parseStack.pop();
-				if(end<0){
-					
-	        		tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
-	        		//console.error('#@@@@@@'+tagName)
-	        		errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
-	        		end = tagStart+1+tagName.length;
-	        	}else if(tagName.match(/\s</)){
-	        		tagName = tagName.replace(/[\s<].*/,'');
-	        		errorHandler.error("end tag name: "+tagName+' maybe not complete');
-	        		end = tagStart+1+tagName.length;
-				}
-				//console.error(parseStack.length,parseStack)
-				//console.error(config);
-				var localNSMap = config.localNSMap;
-				var endMatch = config.tagName == tagName;
-				var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()
-		        if(endIgnoreCaseMach){
-		        	domBuilder.endElement(config.uri,config.localName,tagName);
-					if(localNSMap){
-						for(var prefix in localNSMap){
-							domBuilder.endPrefixMapping(prefix) ;
-						}
-					}
-					if(!endMatch){
-		            	errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
-					}
-		        }else{
-		        	parseStack.push(config)
-		        }
-				
-				end++;
-				break;
-				// end elment
-			case '?':// <?...?>
-				locator&&position(tagStart);
-				end = parseInstruction(source,tagStart,domBuilder);
-				break;
-			case '!':// <!doctype,<![CDATA,<!--
-				locator&&position(tagStart);
-				end = parseDCC(source,tagStart,domBuilder,errorHandler);
-				break;
-			default:
-				locator&&position(tagStart);
-				var el = new ElementAttributes();
-				var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
-				//elStartEnd
-				var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
-				var len = el.length;
-				
-				
-				if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
-					el.closed = true;
-					if(!entityMap.nbsp){
-						errorHandler.warning('unclosed xml attribute');
-					}
-				}
-				if(locator && len){
-					var locator2 = copyLocator(locator,{});
-					//try{//attribute position fixed
-					for(var i = 0;i<len;i++){
-						var a = el[i];
-						position(a.offset);
-						a.locator = copyLocator(locator,{});
-					}
-					//}catch(e){console.error('@@@@@'+e)}
-					domBuilder.locator = locator2
-					if(appendElement(el,domBuilder,currentNSMap)){
-						parseStack.push(el)
-					}
-					domBuilder.locator = locator;
-				}else{
-					if(appendElement(el,domBuilder,currentNSMap)){
-						parseStack.push(el)
-					}
-				}
-				
-				
-				
-				if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
-					end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)
-				}else{
-					end++;
-				}
-			}
-		}catch(e){
-			errorHandler.error('element parse error: '+e)
-			//errorHandler.error('element parse error: '+e);
-			end = -1;
-			//throw e;
-		}
-		if(end>start){
-			start = end;
-		}else{
-			//TODO: 这里有可能sax回退,有位置错误风险
-			appendText(Math.max(tagStart,start)+1);
-		}
-	}
-}
-function copyLocator(f,t){
-	t.lineNumber = f.lineNumber;
-	t.columnNumber = f.columnNumber;
-	return t;
-}
-
-/**
- * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
- * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
- */
-function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
-	var attrName;
-	var value;
-	var p = ++start;
-	var s = S_TAG;//status
-	while(true){
-		var c = source.charAt(p);
-		switch(c){
-		case '=':
-			if(s === S_ATTR){//attrName
-				attrName = source.slice(start,p);
-				s = S_EQ;
-			}else if(s === S_ATTR_SPACE){
-				s = S_EQ;
-			}else{
-				//fatalError: equal must after attrName or space after attrName
-				throw new Error('attribute equal must after attrName');
-			}
-			break;
-		case '\'':
-		case '"':
-			if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
-				){//equal
-				if(s === S_ATTR){
-					errorHandler.warning('attribute value must after "="')
-					attrName = source.slice(start,p)
-				}
-				start = p+1;
-				p = source.indexOf(c,start)
-				if(p>0){
-					value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
-					el.add(attrName,value,start-1);
-					s = S_ATTR_END;
-				}else{
-					//fatalError: no end quot match
-					throw new Error('attribute value no end \''+c+'\' match');
-				}
-			}else if(s == S_ATTR_NOQUOT_VALUE){
-				value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
-				//console.log(attrName,value,start,p)
-				el.add(attrName,value,start);
-				//console.dir(el)
-				errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
-				start = p+1;
-				s = S_ATTR_END
-			}else{
-				//fatalError: no equal before
-				throw new Error('attribute value must after "="');
-			}
-			break;
-		case '/':
-			switch(s){
-			case S_TAG:
-				el.setTagName(source.slice(start,p));
-			case S_ATTR_END:
-			case S_TAG_SPACE:
-			case S_TAG_CLOSE:
-				s =S_TAG_CLOSE;
-				el.closed = true;
-			case S_ATTR_NOQUOT_VALUE:
-			case S_ATTR:
-			case S_ATTR_SPACE:
-				break;
-			//case S_EQ:
-			default:
-				throw new Error("attribute invalid close char('/')")
-			}
-			break;
-		case ''://end document
-			//throw new Error('unexpected end of input')
-			errorHandler.error('unexpected end of input');
-			if(s == S_TAG){
-				el.setTagName(source.slice(start,p));
-			}
-			return p;
-		case '>':
-			switch(s){
-			case S_TAG:
-				el.setTagName(source.slice(start,p));
-			case S_ATTR_END:
-			case S_TAG_SPACE:
-			case S_TAG_CLOSE:
-				break;//normal
-			case S_ATTR_NOQUOT_VALUE://Compatible state
-			case S_ATTR:
-				value = source.slice(start,p);
-				if(value.slice(-1) === '/'){
-					el.closed  = true;
-					value = value.slice(0,-1)
-				}
-			case S_ATTR_SPACE:
-				if(s === S_ATTR_SPACE){
-					value = attrName;
-				}
-				if(s == S_ATTR_NOQUOT_VALUE){
-					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
-					el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start)
-				}else{
-					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
-						errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
-					}
-					el.add(value,value,start)
-				}
-				break;
-			case S_EQ:
-				throw new Error('attribute value missed!!');
-			}
-//			console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
-			return p;
-		/*xml space '\x20' | #x9 | #xD | #xA; */
-		case '\u0080':
-			c = ' ';
-		default:
-			if(c<= ' '){//space
-				switch(s){
-				case S_TAG:
-					el.setTagName(source.slice(start,p));//tagName
-					s = S_TAG_SPACE;
-					break;
-				case S_ATTR:
-					attrName = source.slice(start,p)
-					s = S_ATTR_SPACE;
-					break;
-				case S_ATTR_NOQUOT_VALUE:
-					var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
-					errorHandler.warning('attribute "'+value+'" missed quot(")!!');
-					el.add(attrName,value,start)
-				case S_ATTR_END:
-					s = S_TAG_SPACE;
-					break;
-				//case S_TAG_SPACE:
-				//case S_EQ:
-				//case S_ATTR_SPACE:
-				//	void();break;
-				//case S_TAG_CLOSE:
-					//ignore warning
-				}
-			}else{//not space
-//S_TAG,	S_ATTR,	S_EQ,	S_ATTR_NOQUOT_VALUE
-//S_ATTR_SPACE,	S_ATTR_END,	S_TAG_SPACE, S_TAG_CLOSE
-				switch(s){
-				//case S_TAG:void();break;
-				//case S_ATTR:void();break;
-				//case S_ATTR_NOQUOT_VALUE:void();break;
-				case S_ATTR_SPACE:
-					var tagName =  el.tagName;
-					if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
-						errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!')
-					}
-					el.add(attrName,attrName,start);
-					start = p;
-					s = S_ATTR;
-					break;
-				case S_ATTR_END:
-					errorHandler.warning('attribute space is required"'+attrName+'"!!')
-				case S_TAG_SPACE:
-					s = S_ATTR;
-					start = p;
-					break;
-				case S_EQ:
-					s = S_ATTR_NOQUOT_VALUE;
-					start = p;
-					break;
-				case S_TAG_CLOSE:
-					throw new Error("elements closed character '/' and '>' must be connected to");
-				}
-			}
-		}//end outer switch
-		//console.log('p++',p)
-		p++;
-	}
-}
-/**
- * @return true if has new namespace define
- */
-function appendElement(el,domBuilder,currentNSMap){
-	var tagName = el.tagName;
-	var localNSMap = null;
-	//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
-	var i = el.length;
-	while(i--){
-		var a = el[i];
-		var qName = a.qName;
-		var value = a.value;
-		var nsp = qName.indexOf(':');
-		if(nsp>0){
-			var prefix = a.prefix = qName.slice(0,nsp);
-			var localName = qName.slice(nsp+1);
-			var nsPrefix = prefix === 'xmlns' && localName
-		}else{
-			localName = qName;
-			prefix = null
-			nsPrefix = qName === 'xmlns' && ''
-		}
-		//can not set prefix,because prefix !== ''
-		a.localName = localName ;
-		//prefix == null for no ns prefix attribute 
-		if(nsPrefix !== false){//hack!!
-			if(localNSMap == null){
-				localNSMap = {}
-				//console.log(currentNSMap,0)
-				_copy(currentNSMap,currentNSMap={})
-				//console.log(currentNSMap,1)
-			}
-			currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
-			a.uri = 'http://www.w3.org/2000/xmlns/'
-			domBuilder.startPrefixMapping(nsPrefix, value) 
-		}
-	}
-	var i = el.length;
-	while(i--){
-		a = el[i];
-		var prefix = a.prefix;
-		if(prefix){//no prefix attribute has no namespace
-			if(prefix === 'xml'){
-				a.uri = 'http://www.w3.org/XML/1998/namespace';
-			}if(prefix !== 'xmlns'){
-				a.uri = currentNSMap[prefix || '']
-				
-				//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
-			}
-		}
-	}
-	var nsp = tagName.indexOf(':');
-	if(nsp>0){
-		prefix = el.prefix = tagName.slice(0,nsp);
-		localName = el.localName = tagName.slice(nsp+1);
-	}else{
-		prefix = null;//important!!
-		localName = el.localName = tagName;
-	}
-	//no prefix element has default namespace
-	var ns = el.uri = currentNSMap[prefix || ''];
-	domBuilder.startElement(ns,localName,tagName,el);
-	//endPrefixMapping and startPrefixMapping have not any help for dom builder
-	//localNSMap = null
-	if(el.closed){
-		domBuilder.endElement(ns,localName,tagName);
-		if(localNSMap){
-			for(prefix in localNSMap){
-				domBuilder.endPrefixMapping(prefix) 
-			}
-		}
-	}else{
-		el.currentNSMap = currentNSMap;
-		el.localNSMap = localNSMap;
-		//parseStack.push(el);
-		return true;
-	}
-}
-function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
-	if(/^(?:script|textarea)$/i.test(tagName)){
-		var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
-		var text = source.substring(elStartEnd+1,elEndStart);
-		if(/[&<]/.test(text)){
-			if(/^script$/i.test(tagName)){
-				//if(!/\]\]>/.test(text)){
-					//lexHandler.startCDATA();
-					domBuilder.characters(text,0,text.length);
-					//lexHandler.endCDATA();
-					return elEndStart;
-				//}
-			}//}else{//text area
-				text = text.replace(/&#?\w+;/g,entityReplacer);
-				domBuilder.characters(text,0,text.length);
-				return elEndStart;
-			//}
-			
-		}
-	}
-	return elStartEnd+1;
-}
-function fixSelfClosed(source,elStartEnd,tagName,closeMap){
-	//if(tagName in closeMap){
-	var pos = closeMap[tagName];
-	if(pos == null){
-		//console.log(tagName)
-		pos =  source.lastIndexOf('</'+tagName+'>')
-		if(pos<elStartEnd){//忘记闭合
-			pos = source.lastIndexOf('</'+tagName)
-		}
-		closeMap[tagName] =pos
-	}
-	return pos<elStartEnd;
-	//} 
-}
-function _copy(source,target){
-	for(var n in source){target[n] = source[n]}
-}
-function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
-	var next= source.charAt(start+2)
-	switch(next){
-	case '-':
-		if(source.charAt(start + 3) === '-'){
-			var end = source.indexOf('-->',start+4);
-			//append comment source.substring(4,end)//<!--
-			if(end>start){
-				domBuilder.comment(source,start+4,end-start-4);
-				return end+3;
-			}else{
-				errorHandler.error("Unclosed comment");
-				return -1;
-			}
-		}else{
-			//error
-			return -1;
-		}
-	default:
-		if(source.substr(start+3,6) == 'CDATA['){
-			var end = source.indexOf(']]>',start+9);
-			domBuilder.startCDATA();
-			domBuilder.characters(source,start+9,end-start-9);
-			domBuilder.endCDATA() 
-			return end+3;
-		}
-		//<!DOCTYPE
-		//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
-		var matchs = split(source,start);
-		var len = matchs.length;
-		if(len>1 && /!doctype/i.test(matchs[0][0])){
-			var name = matchs[1][0];
-			var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0]
-			var sysid = len>4 && matchs[4][0];
-			var lastMatch = matchs[len-1]
-			domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
-					sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
-			domBuilder.endDTD();
-			
-			return lastMatch.index+lastMatch[0].length
-		}
-	}
-	return -1;
-}
-
-
-
-function parseInstruction(source,start,domBuilder){
-	var end = source.indexOf('?>',start);
-	if(end){
-		var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
-		if(match){
-			var len = match[0].length;
-			domBuilder.processingInstruction(match[1], match[2]) ;
-			return end+2;
-		}else{//error
-			return -1;
-		}
-	}
-	return -1;
-}
-
-/**
- * @param source
- */
-function ElementAttributes(source){
-	
-}
-ElementAttributes.prototype = {
-	setTagName:function(tagName){
-		if(!tagNamePattern.test(tagName)){
-			throw new Error('invalid tagName:'+tagName)
-		}
-		this.tagName = tagName
-	},
-	add:function(qName,value,offset){
-		if(!tagNamePattern.test(qName)){
-			throw new Error('invalid attribute:'+qName)
-		}
-		this[this.length++] = {qName:qName,value:value,offset:offset}
-	},
-	length:0,
-	getLocalName:function(i){return this[i].localName},
-	getLocator:function(i){return this[i].locator},
-	getQName:function(i){return this[i].qName},
-	getURI:function(i){return this[i].uri},
-	getValue:function(i){return this[i].value}
-//	,getIndex:function(uri, localName)){
-//		if(localName){
-//			
-//		}else{
-//			var qName = uri
-//		}
-//	},
-//	getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
-//	getType:function(uri,localName){}
-//	getType:function(i){},
-}
-
-
-
-
-function _set_proto_(thiz,parent){
-	thiz.__proto__ = parent;
-	return thiz;
-}
-if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
-	_set_proto_ = function(thiz,parent){
-		function p(){};
-		p.prototype = parent;
-		p = new p();
-		for(parent in thiz){
-			p[parent] = thiz[parent];
-		}
-		return p;
-	}
-}
-
-function split(source,start){
-	var match;
-	var buf = [];
-	var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
-	reg.lastIndex = start;
-	reg.exec(source);//skip <
-	while(match = reg.exec(source)){
-		buf.push(match);
-		if(match[1])return buf;
-	}
-}
-
-exports.XMLReader = XMLReader;
-
diff --git a/package.json b/package.json
index eb3c9aa..4279dc3 100644
--- a/package.json
+++ b/package.json
@@ -49,16 +49,6 @@
     "node": ">=6.0.0"
   },
   "engineStrict": true,
-  "bundledDependencies": [
-    "cordova-common",
-    "elementtree",
-    "node-uuid",
-    "nopt",
-    "q",
-    "semver",
-    "shelljs",
-    "winjs"
-  ],
   "author": "Apache Software Foundation",
   "license": "Apache-2.0"
 }